AddModal.vue 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  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. required: true,
  91. componentProps:{
  92. maxLength: 15,
  93. placeholder:t('common.inputText')+t('routes.product.minVersion')+t('routes.product.versionTips'),
  94. },
  95. rules: [
  96. {
  97. required: true,
  98. // @ts-ignore
  99. validator: async (rule, value) => {
  100. const regPos = /.*[\u4e00-\u9fa5]+.*$/; // 非中文
  101. if (!value) {
  102. return Promise.reject(t('common.inputText')+t('routes.product.minVersion'));
  103. }
  104. if (regPos.test(value)) {
  105. /* eslint-disable-next-line */
  106. return Promise.reject('不支持中文字符');
  107. }
  108. return Promise.resolve();
  109. },
  110. trigger: 'change',
  111. },
  112. ],
  113. colProps: {
  114. span: 24,
  115. },
  116. },
  117. {
  118. field: 'description',
  119. component: 'InputTextArea',
  120. required: true,
  121. label: t('routes.product.description'),
  122. colProps: {
  123. span: 24,
  124. },
  125. componentProps:{
  126. placeholder:t('common.inputText')+t('routes.product.description'),
  127. rows:4,
  128. maxLength: 200,
  129. },
  130. },
  131. {
  132. field: 'file',
  133. component: 'Upload',
  134. label: t('routes.product.file'),
  135. required: true,
  136. rules: [{ required: true, message: t('common.uploadMessge') }],
  137. // helpMessage: t('routes.corporation.uploadHelp'),
  138. itemProps: {
  139. validateTrigger: 'onBlur',
  140. },
  141. componentProps: {
  142. api: uploadApi,
  143. maxNumber: 1,
  144. maxSize: 1000,
  145. fileFlow:true,
  146. accept: ['zip'],
  147. afterFetch: function (data) {
  148. console.log('uploadApi',data)
  149. // Reflect.set(data, 'url', data.file);
  150. fileFlow.file = data.file
  151. return data;
  152. },
  153. },
  154. colProps: {
  155. span: 22,
  156. },
  157. },
  158. // {
  159. // field: 'orderSn',
  160. // component: 'Input',
  161. // label: t('routes.devices.orderSn'),
  162. // colProps: {
  163. // span: 24,
  164. // },
  165. // },
  166. // {
  167. // field: 'companyId',
  168. // component: 'ApiSelect',
  169. // label: t('routes.devices.companyId'),
  170. // itemProps: {
  171. // validateTrigger: 'blur',
  172. // },
  173. // componentProps: {
  174. // api: allCompanyApi,
  175. // numberToString: true,
  176. // labelField: 'name',
  177. // valueField: 'id',
  178. // immediate: true,
  179. // params: {
  180. // page: 1,
  181. // limit: 1000,
  182. // },
  183. // },
  184. // colProps: {
  185. // span: 24,
  186. // },
  187. // },
  188. ];
  189. const [registerForm, { validate, resetFields, setFieldsValue }] = useForm({
  190. labelWidth: 120,
  191. schemas,
  192. showActionButtonGroup: false,
  193. actionColOptions: {
  194. span: 24,
  195. },
  196. });
  197. onMounted(() => {});
  198. let addListFunc = () => {};
  199. const [register, { closeModal }] = useModalInner((data) => {
  200. data && onDataReceive(data);
  201. });
  202. function renderOwnTypeLabel(type: number): string {
  203. switch (type) {
  204. case 2:
  205. return t('routes.product.type.2');
  206. case 1:
  207. return t('routes.product.type.1');
  208. case 3:
  209. return t('routes.product.type.3');
  210. default:
  211. return '';
  212. }
  213. }
  214. function rendercameraTypeLabel(cameraType: number): string {
  215. switch (cameraType) {
  216. case 4:
  217. return t('routes.devices.cameraName.4');
  218. case 1:
  219. return t('routes.devices.cameraName.1');
  220. case 9:
  221. return t('routes.devices.cameraName.9');
  222. case 10:
  223. return t('routes.devices.cameraName.10');
  224. case 6:
  225. return t('routes.devices.cameraName.6');
  226. default:
  227. return '';
  228. }
  229. }
  230. function onDataReceive(data) {
  231. modelRef.value = data
  232. console.log('renderOwnTypeLabel',data)
  233. resetFields();
  234. setFieldsValue({
  235. type:renderOwnTypeLabel(Number(data)),
  236. });
  237. }
  238. const handleSubmit = async () => {
  239. try {
  240. const params = await validate();
  241. const apiData = {
  242. data:{
  243. ...params as any,
  244. type:modelRef.value,
  245. file:fileFlow.file,
  246. }
  247. }
  248. console.log('res', apiData);
  249. const res = await AddAndUpload(apiData);
  250. console.log('res', res);
  251. closeModal();
  252. resetFields();
  253. createMessage.success(t('common.optSuccess'));
  254. emit('update');
  255. } catch (error) {
  256. console.log('not passing', error);
  257. }
  258. };
  259. function handleVisibleChange(v) {
  260. v && props.userData && nextTick(() => onDataReceive(props.userData));
  261. }
  262. return {
  263. register,
  264. rendercameraTypeLabel,
  265. renderOwnTypeLabel,
  266. schemas,
  267. registerForm,
  268. model: modelRef,
  269. fileFlow,
  270. handleVisibleChange,
  271. handleSubmit,
  272. addListFunc,
  273. resetFields,
  274. t,
  275. };
  276. },
  277. });
  278. </script>