SkuMessages.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. import { use } from '../../utils';
  2. import Cell from '../../cell';
  3. import CellGroup from '../../cell-group';
  4. import Field from '../../field';
  5. import { isEmail } from '../../utils/validate/email';
  6. import { isNumber } from '../../utils/validate/number';
  7. import SkuImgUploader from './SkuImgUploader';
  8. const [sfc, bem] = use('sku-messages');
  9. const PLACEHOLDER = {
  10. id_no: '输入身份证号码',
  11. text: '输入文本',
  12. tel: '输入数字',
  13. email: '输入邮箱',
  14. date: '点击选择日期',
  15. time: '点击选择时间',
  16. textarea: '点击填写段落文本',
  17. mobile: '输入手机号码'
  18. };
  19. export default sfc({
  20. props: {
  21. messages: Array,
  22. messageConfig: Object,
  23. goodsId: [Number, String]
  24. },
  25. data() {
  26. return {
  27. messageValues: this.resetMessageValues(this.messages)
  28. };
  29. },
  30. watch: {
  31. messages(val) {
  32. this.messageValues = this.resetMessageValues(val);
  33. }
  34. },
  35. methods: {
  36. resetMessageValues(messages) {
  37. return (messages || []).map(() => ({ value: '' }));
  38. },
  39. getType(message) {
  40. if (+message.multiple === 1) {
  41. return 'textarea';
  42. }
  43. if (message.type === 'id_no') {
  44. return 'text';
  45. }
  46. return message.datetime > 0 ? 'datetime-local' : message.type;
  47. },
  48. getMessages() {
  49. const messages = {};
  50. this.messageValues.forEach((item, index) => {
  51. let { value } = item;
  52. if (this.messages[index].datetime > 0) {
  53. value = value.replace(/T/g, ' ');
  54. }
  55. messages[`message_${index}`] = value;
  56. });
  57. return messages;
  58. },
  59. getCartMessages() {
  60. const messages = {};
  61. this.messageValues.forEach((item, index) => {
  62. let { value } = item;
  63. const message = this.messages[index];
  64. if (message.datetime > 0) {
  65. value = value.replace(/T/g, ' ');
  66. }
  67. messages[message.name] = value;
  68. });
  69. return messages;
  70. },
  71. getPlaceholder(message) {
  72. const type = +message.multiple === 1 ? 'textarea' : message.type;
  73. const map = this.messageConfig.placeholderMap || {};
  74. return map[type] || PLACEHOLDER[type];
  75. },
  76. validateMessages() {
  77. const values = this.messageValues;
  78. for (let i = 0; i < values.length; i++) {
  79. const { value } = values[i];
  80. const message = this.messages[i];
  81. if (value === '') {
  82. // 必填字段的校验
  83. if (String(message.required) === '1') { // eslint-disable-line
  84. const textType = message.type === 'image'
  85. ? '请上传'
  86. : '请填写';
  87. return textType + message.name;
  88. }
  89. } else {
  90. if (message.type === 'tel' && !isNumber(value)) {
  91. return '请填写正确的数字格式留言';
  92. }
  93. if (message.type === 'mobile' && !/^\d{6,20}$/.test(value)) {
  94. return '手机号长度为6-20位数字';
  95. }
  96. if (message.type === 'email' && !isEmail(value)) {
  97. return '请填写正确的邮箱';
  98. }
  99. if (message.type === 'id_no' && (value.length < 15 || value.length > 18)) {
  100. return '请填写正确的身份证号码';
  101. }
  102. }
  103. }
  104. }
  105. },
  106. render(h) {
  107. return (
  108. <CellGroup class={bem()}>
  109. {this.messages.map((message, index) => (message.type === 'image' ? (
  110. <Cell
  111. class={bem('image-cell')}
  112. label="仅限一张"
  113. title={message.name}
  114. key={`${this.goodsId}-${index}`}
  115. required={String(message.required) === '1'}
  116. >
  117. <SkuImgUploader
  118. vModel={this.messageValues[index].value}
  119. uploadImg={this.messageConfig.uploadImg}
  120. maxSize={this.messageConfig.uploadMaxSize}
  121. />
  122. </Cell>
  123. ) : (
  124. <Field
  125. vModel={this.messageValues[index].value}
  126. maxlength="200"
  127. label={message.name}
  128. key={`${this.goodsId}-${index}`}
  129. required={String(message.required) === '1'}
  130. placeholder={this.getPlaceholder(message)}
  131. type={this.getType(message)}
  132. />
  133. )))}
  134. </CellGroup>
  135. );
  136. }
  137. });