AddModal.vue 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. <template>
  2. <BasicModal
  3. v-bind="$attrs"
  4. @register="register"
  5. title="新增版本"
  6. @visible-change="handleVisibleChange"
  7. @cancel="resetFields"
  8. @ok="handleSubmit"
  9. >
  10. <div class="pt-2px pr-3px">
  11. <BasicForm @register="registerForm">
  12. <template #text="{ model, field }">
  13. {{ model[field] }}
  14. </template>
  15. </BasicForm>
  16. </div>
  17. </BasicModal>
  18. </template>
  19. <script lang="ts">
  20. import { defineComponent, ref, nextTick, onMounted, reactive } from 'vue';
  21. import { BasicModal, useModalInner } from '/@/components/Modal';
  22. import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
  23. import { useMessage } from '/@/hooks/web/useMessage';
  24. import { uploadApi, AddAndUpload } from '/@/api/product/index';
  25. import { useI18n } from '/@/hooks/web/useI18n';
  26. const { t } = useI18n();
  27. export default defineComponent({
  28. components: { BasicModal, BasicForm },
  29. props: {
  30. userData: { type: Object },
  31. },
  32. emits: ['update', 'register'],
  33. setup(props, { emit }) {
  34. const modelRef = ref({});
  35. const fileFlow = reactive({
  36. file:null
  37. })
  38. const { createMessage } = useMessage();
  39. const schemas: FormSchema[] = [
  40. {
  41. field: 'type',
  42. component: 'Input',
  43. label: t('routes.product.types'),
  44. slot: 'text',
  45. colProps: {
  46. span: 24,
  47. },
  48. // required: true,
  49. },
  50. {
  51. field: 'version',
  52. component: 'Input',
  53. label: t('routes.product.version'),
  54. required: true,
  55. colProps: {
  56. span: 24,
  57. },
  58. componentProps:{
  59. maxLength: 15,
  60. placeholder:t('common.inputText')+t('routes.product.versionPlaceholder'),
  61. },
  62. rules: [
  63. {
  64. required: true,
  65. // @ts-ignore
  66. validator: async (rule, value) => {
  67. if (!value) {
  68. return Promise.reject(t('common.inputText')+t('routes.product.version'));
  69. }
  70. if(/.*[\u4e00-\u9fa5]+.*$/.test(value)){
  71. /* eslint-disable-next-line */
  72. return Promise.reject('不支持中文字符');
  73. }
  74. return Promise.resolve();
  75. },
  76. trigger: 'change',
  77. },
  78. ],
  79. componentProps: {
  80. maxLength: 15,
  81. onChange: (data) => {
  82. console.log('data', data);
  83. },
  84. },
  85. },
  86. {
  87. field: 'minVersion',
  88. component: 'Input',
  89. label: t('routes.product.minVersion'),
  90. componentProps:{
  91. maxLength: 15,
  92. placeholder:t('common.inputText')+t('routes.product.minVersion')+t('routes.product.versionTips'),
  93. },
  94. rules: [
  95. {
  96. // required: true,
  97. // @ts-ignore
  98. validator: async (rule, value) => {
  99. const regPos = /.*[\u4e00-\u9fa5]+.*$/; // 非中文
  100. if (!value) {
  101. return Promise.reject(t('common.inputText')+t('routes.product.minVersion'));
  102. }
  103. if (regPos.test(value)) {
  104. /* eslint-disable-next-line */
  105. return Promise.reject('不支持中文字符');
  106. }
  107. return Promise.resolve();
  108. },
  109. trigger: 'change',
  110. },
  111. ],
  112. colProps: {
  113. span: 24,
  114. },
  115. },
  116. {
  117. field: 'description',
  118. component: 'InputTextArea',
  119. // required: true,
  120. label: t('routes.product.description'),
  121. colProps: {
  122. span: 24,
  123. },
  124. componentProps:{
  125. placeholder:t('common.inputText')+t('routes.product.description'),
  126. rows:4,
  127. maxLength: 200,
  128. },
  129. },
  130. {
  131. field: 'file',
  132. component: 'Upload',
  133. label: t('routes.product.file'),
  134. required: true,
  135. rules: [{ required: true, message: t('common.uploadMessge') }],
  136. // helpMessage: t('routes.corporation.uploadHelp'),
  137. itemProps: {
  138. validateTrigger: 'onBlur',
  139. },
  140. componentProps: {
  141. api: uploadApi,
  142. maxNumber: 1,
  143. maxSize: 1000,
  144. fileFlow:true,
  145. accept: ['zip'],
  146. afterFetch: function (data) {
  147. console.log('uploadApi',data)
  148. // Reflect.set(data, 'url', data.file);
  149. fileFlow.file = data.file
  150. return data;
  151. },
  152. },
  153. colProps: {
  154. span: 22,
  155. },
  156. },
  157. // {
  158. // field: 'orderSn',
  159. // component: 'Input',
  160. // label: t('routes.devices.orderSn'),
  161. // colProps: {
  162. // span: 24,
  163. // },
  164. // },
  165. // {
  166. // field: 'companyId',
  167. // component: 'ApiSelect',
  168. // label: t('routes.devices.companyId'),
  169. // itemProps: {
  170. // validateTrigger: 'blur',
  171. // },
  172. // componentProps: {
  173. // api: allCompanyApi,
  174. // numberToString: true,
  175. // labelField: 'name',
  176. // valueField: 'id',
  177. // immediate: true,
  178. // params: {
  179. // page: 1,
  180. // limit: 1000,
  181. // },
  182. // },
  183. // colProps: {
  184. // span: 24,
  185. // },
  186. // },
  187. ];
  188. const [registerForm, { validate, resetFields, setFieldsValue }] = useForm({
  189. labelWidth: 120,
  190. schemas,
  191. showActionButtonGroup: false,
  192. actionColOptions: {
  193. span: 24,
  194. },
  195. });
  196. onMounted(() => {});
  197. let addListFunc = () => {};
  198. const [register, { closeModal }] = useModalInner((data) => {
  199. data && onDataReceive(data);
  200. });
  201. function renderOwnTypeLabel(type: number): string {
  202. switch (type) {
  203. case 2:
  204. return t('routes.product.type.2');
  205. case 1:
  206. return t('routes.product.type.1');
  207. case 3:
  208. return t('routes.product.type.3');
  209. default:
  210. return '';
  211. }
  212. }
  213. function rendercameraTypeLabel(cameraType: number): string {
  214. switch (cameraType) {
  215. case 4:
  216. return t('routes.devices.cameraName.4');
  217. case 1:
  218. return t('routes.devices.cameraName.1');
  219. case 9:
  220. return t('routes.devices.cameraName.9');
  221. case 10:
  222. return t('routes.devices.cameraName.10');
  223. case 6:
  224. return t('routes.devices.cameraName.6');
  225. default:
  226. return '';
  227. }
  228. }
  229. function onDataReceive(data) {
  230. modelRef.value = data
  231. console.log('renderOwnTypeLabel',data)
  232. resetFields();
  233. setFieldsValue({
  234. type:renderOwnTypeLabel(Number(data)),
  235. });
  236. }
  237. const handleSubmit = async () => {
  238. try {
  239. const params = await validate();
  240. const apiData = {
  241. data:{
  242. ...params as any,
  243. type:modelRef.value,
  244. file:fileFlow.file,
  245. }
  246. }
  247. console.log('res', apiData);
  248. const res = await AddAndUpload(apiData);
  249. console.log('res', res);
  250. closeModal();
  251. resetFields();
  252. createMessage.success(t('common.optSuccess'));
  253. emit('update');
  254. } catch (error) {
  255. console.log('not passing', error);
  256. }
  257. };
  258. function handleVisibleChange(v) {
  259. v && props.userData && nextTick(() => onDataReceive(props.userData));
  260. }
  261. return {
  262. register,
  263. rendercameraTypeLabel,
  264. renderOwnTypeLabel,
  265. schemas,
  266. registerForm,
  267. model: modelRef,
  268. fileFlow,
  269. handleVisibleChange,
  270. handleSubmit,
  271. addListFunc,
  272. resetFields,
  273. t,
  274. };
  275. },
  276. });
  277. </script>