AddModal.vue 7.7 KB

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