Showing
13 changed files
with
320 additions
and
403 deletions
@@ -6,7 +6,7 @@ VITE_PUBLIC_PATH = / | @@ -6,7 +6,7 @@ VITE_PUBLIC_PATH = / | ||
6 | 6 | ||
7 | # Cross-domain proxy, you can configure multiple | 7 | # Cross-domain proxy, you can configure multiple |
8 | # Please note that no line breaks | 8 | # Please note that no line breaks |
9 | -VITE_PROXY = [["/api","http://192.168.10.129:8082/api"],["/upload","http://192.168.10.122:3300/upload"]] | 9 | +VITE_PROXY = [["/api","http://192.168.10.120:8082/api"],["/upload","http://192.168.10.120:3300/upload"]] |
10 | # VITE_PROXY=[["/api","https://vvbin.cn/test"]] | 10 | # VITE_PROXY=[["/api","https://vvbin.cn/test"]] |
11 | 11 | ||
12 | # Delete console | 12 | # Delete console |
@@ -3,11 +3,11 @@ | @@ -3,11 +3,11 @@ | ||
3 | <OrganizationIdTree class="w-1/4 xl:w-1/5" @select="handleSelect" /> | 3 | <OrganizationIdTree class="w-1/4 xl:w-1/5" @select="handleSelect" /> |
4 | <BasicTable @register="registerTable" :searchInfo="searchInfo" class="w-3/4 xl:w-4/5"> | 4 | <BasicTable @register="registerTable" :searchInfo="searchInfo" class="w-3/4 xl:w-4/5"> |
5 | <template #toolbar> | 5 | <template #toolbar> |
6 | - <a-button type="primary" @click="handleCreateOrEdit"> 新增联系人 </a-button> | 6 | + <a-button type="primary" @click="handleCreateOrEdit(null)"> 新增联系人 </a-button> |
7 | <a-button | 7 | <a-button |
8 | type="primary" | 8 | type="primary" |
9 | color="error" | 9 | color="error" |
10 | - @click="handleDeleteOrBatchDelete" | 10 | + @click="handleDeleteOrBatchDelete(null)" |
11 | :disabled="hasBatchDelete" | 11 | :disabled="hasBatchDelete" |
12 | > | 12 | > |
13 | 批量删除 | 13 | 批量删除 |
@@ -46,7 +46,6 @@ | @@ -46,7 +46,6 @@ | ||
46 | import { useDrawer } from '/@/components/Drawer'; | 46 | import { useDrawer } from '/@/components/Drawer'; |
47 | import ContactDrawer from './ContactDrawer.vue'; | 47 | import ContactDrawer from './ContactDrawer.vue'; |
48 | import OrganizationIdTree from '../../common/OrganizationIdTree.vue'; | 48 | import OrganizationIdTree from '../../common/OrganizationIdTree.vue'; |
49 | - import { Modal } from 'ant-design-vue'; | ||
50 | import { getAlarmContact, deleteAlarmContact } from '/@/api/alarm/contact/alarmContact'; | 49 | import { getAlarmContact, deleteAlarmContact } from '/@/api/alarm/contact/alarmContact'; |
51 | import { searchFormSchema, columns } from './config.data'; | 50 | import { searchFormSchema, columns } from './config.data'; |
52 | export default defineComponent({ | 51 | export default defineComponent({ |
@@ -121,15 +120,11 @@ | @@ -121,15 +120,11 @@ | ||
121 | } | 120 | } |
122 | } else { | 121 | } else { |
123 | try { | 122 | try { |
124 | - await Modal.confirm({ | ||
125 | - title: '警告', | ||
126 | - content: '是否删除勾选的信息?', | ||
127 | - }); | ||
128 | await deleteAlarmContact(selectedRowIds.value); | 123 | await deleteAlarmContact(selectedRowIds.value); |
129 | createMessage.success('批量删除联系人成功'); | 124 | createMessage.success('批量删除联系人成功'); |
130 | handleSuccess(); | 125 | handleSuccess(); |
131 | } catch (e) { | 126 | } catch (e) { |
132 | - createMessage.info('取消删除'); | 127 | + createMessage.info('删除失败'); |
133 | } | 128 | } |
134 | } | 129 | } |
135 | }; | 130 | }; |
src/views/device/DeviceDrawer.vue
deleted
100644 → 0
1 | -<template> | ||
2 | - <BasicDrawer | ||
3 | - v-bind="$attrs" | ||
4 | - @register="registerDrawer" | ||
5 | - showFooter | ||
6 | - :title="getTitle" | ||
7 | - width="500px" | ||
8 | - @ok="handleSubmit" | ||
9 | - > | ||
10 | - <BasicForm @register="registerForm"> | ||
11 | - <template #iconSelect> | ||
12 | - <Upload | ||
13 | - name="avatar" | ||
14 | - list-type="picture-card" | ||
15 | - class="avatar-uploader" | ||
16 | - :show-upload-list="false" | ||
17 | - :customRequest="customUpload" | ||
18 | - :before-upload="beforeUpload" | ||
19 | - > | ||
20 | - <img v-if="devicePic" :src="devicePic" alt="avatar" /> | ||
21 | - <div v-else> | ||
22 | - <loading-outlined v-if="loading" /> | ||
23 | - <plus-outlined v-else /> | ||
24 | - <div class="ant-upload-text">图片上传</div> | ||
25 | - </div> | ||
26 | - </Upload> | ||
27 | - </template> | ||
28 | - </BasicForm> | ||
29 | - </BasicDrawer> | ||
30 | -</template> | ||
31 | -<script lang="ts"> | ||
32 | - import { defineComponent, ref, computed, unref } from 'vue'; | ||
33 | - import { BasicForm, useForm } from '/@/components/Form'; | ||
34 | - import { formSchema } from './device.data'; | ||
35 | - import { BasicDrawer, useDrawerInner } from '/@/components/Drawer'; | ||
36 | - | ||
37 | - import { saveOrEditMessageConfig } from '/@/api/message/config'; | ||
38 | - import { useMessage } from '/@/hooks/web/useMessage'; | ||
39 | - import { upload } from '/@/api/oss/ossFileUploader'; | ||
40 | - import { message, Upload } from 'ant-design-vue'; | ||
41 | - import { FileItem } from '/@/components/Upload/src/typing'; | ||
42 | - import { LoadingOutlined, PlusOutlined } from '@ant-design/icons-vue'; | ||
43 | - | ||
44 | - export default defineComponent({ | ||
45 | - name: 'DeviceDrawer', | ||
46 | - components: { BasicDrawer, BasicForm, Upload, PlusOutlined, LoadingOutlined }, | ||
47 | - emits: ['success', 'register'], | ||
48 | - setup(_, { emit }) { | ||
49 | - const isUpdate = ref(true); | ||
50 | - | ||
51 | - const devicePic = ref(''); | ||
52 | - const [registerForm, { validate, setFieldsValue, resetFields }] = useForm({ | ||
53 | - labelWidth: 80, | ||
54 | - schemas: formSchema, | ||
55 | - showActionButtonGroup: false, | ||
56 | - }); | ||
57 | - | ||
58 | - const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => { | ||
59 | - await resetFields(); | ||
60 | - setDrawerProps({ confirmLoading: false }); | ||
61 | - isUpdate.value = !!data?.isUpdate; | ||
62 | - if (unref(isUpdate)) { | ||
63 | - const config = data.record.config; | ||
64 | - for (const key in config) { | ||
65 | - Reflect.set(data.record, key + '', config[key]); | ||
66 | - } | ||
67 | - await setFieldsValue({ | ||
68 | - ...data.record, | ||
69 | - }); | ||
70 | - } | ||
71 | - }); | ||
72 | - | ||
73 | - const getTitle = computed(() => (!unref(isUpdate) ? '新增设备' : '编辑设备')); | ||
74 | - | ||
75 | - async function handleSubmit() { | ||
76 | - try { | ||
77 | - const values = await validate(); | ||
78 | - const { createMessage } = useMessage(); | ||
79 | - setDrawerProps({ confirmLoading: true }); | ||
80 | - let config = {}; | ||
81 | - if (values.messageType === 'PHONE_MESSAGE') { | ||
82 | - config = { | ||
83 | - accessKeyId: values.accessKeyId, | ||
84 | - accessKeySecret: values.accessKeySecret, | ||
85 | - }; | ||
86 | - } else if (values.messageType === 'EMAIL_MESSAGE') { | ||
87 | - config = { | ||
88 | - host: values.host, | ||
89 | - port: values.port, | ||
90 | - username: values.username, | ||
91 | - password: values.password, | ||
92 | - }; | ||
93 | - } | ||
94 | - Reflect.set(values, 'config', config); | ||
95 | - let saveMessage = '添加成功'; | ||
96 | - let updateMessage = '修改成功'; | ||
97 | - await saveOrEditMessageConfig(values, unref(isUpdate)); | ||
98 | - closeDrawer(); | ||
99 | - emit('success'); | ||
100 | - createMessage.success(unref(isUpdate) ? updateMessage : saveMessage); | ||
101 | - } finally { | ||
102 | - setDrawerProps({ confirmLoading: false }); | ||
103 | - } | ||
104 | - } | ||
105 | - async function customUpload({ file }) { | ||
106 | - if (beforeUpload(file)) { | ||
107 | - const formData = new FormData(); | ||
108 | - formData.append('file', file); | ||
109 | - const response = await upload(formData); | ||
110 | - if (response.fileStaticUri) { | ||
111 | - devicePic.value = response.fileStaticUri; | ||
112 | - } | ||
113 | - } | ||
114 | - } | ||
115 | - | ||
116 | - const beforeUpload = (file: FileItem) => { | ||
117 | - const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png'; | ||
118 | - if (!isJpgOrPng) { | ||
119 | - message.error('只能上传图片文件!'); | ||
120 | - } | ||
121 | - const isLt2M = (file.size as number) / 1024 / 1024 < 2; | ||
122 | - if (!isLt2M) { | ||
123 | - message.error('图片大小不能超过2MB!'); | ||
124 | - } | ||
125 | - return isJpgOrPng && isLt2M; | ||
126 | - }; | ||
127 | - return { | ||
128 | - registerDrawer, | ||
129 | - registerForm, | ||
130 | - getTitle, | ||
131 | - handleSubmit, | ||
132 | - beforeUpload, | ||
133 | - customUpload, | ||
134 | - devicePic, | ||
135 | - }; | ||
136 | - }, | ||
137 | - }); | ||
138 | -</script> | ||
139 | -<style> | ||
140 | - .ant-upload-select-picture-card i { | ||
141 | - font-size: 32px; | ||
142 | - color: #999; | ||
143 | - } | ||
144 | -</style> |
@@ -3,14 +3,14 @@ | @@ -3,14 +3,14 @@ | ||
3 | v-bind="$attrs" | 3 | v-bind="$attrs" |
4 | width="55rem" | 4 | width="55rem" |
5 | @register="register" | 5 | @register="register" |
6 | - :title=getTitle | 6 | + :title="getTitle" |
7 | @visible-change="handleVisibleChange" | 7 | @visible-change="handleVisibleChange" |
8 | + @cancel="handleCancel" | ||
8 | > | 9 | > |
9 | <div class="step-form-form"> | 10 | <div class="step-form-form"> |
10 | <a-steps :current="current"> | 11 | <a-steps :current="current"> |
11 | <a-step title="填写设备信息" /> | 12 | <a-step title="填写设备信息" /> |
12 | - <a-step title="确认转账信息" /> | ||
13 | - <a-step title="完成" /> | 13 | + <a-step title="添加设备凭证" /> |
14 | </a-steps> | 14 | </a-steps> |
15 | </div> | 15 | </div> |
16 | <div class="mt-5"> | 16 | <div class="mt-5"> |
@@ -21,68 +21,35 @@ | @@ -21,68 +21,35 @@ | ||
21 | v-show="current === 1" | 21 | v-show="current === 1" |
22 | v-if="initStep2" | 22 | v-if="initStep2" |
23 | /> | 23 | /> |
24 | - <DeviceStep3 v-show="current === 2" @redo="handleRedo" v-if="initStep3" /> | ||
25 | </div> | 24 | </div> |
26 | </BasicModal> | 25 | </BasicModal> |
27 | </template> | 26 | </template> |
28 | <script lang="ts"> | 27 | <script lang="ts"> |
29 | -import {defineComponent, ref, nextTick, computed, unref, reactive, toRefs} from 'vue'; | 28 | + import { defineComponent, ref, nextTick, computed, unref, reactive, toRefs } from 'vue'; |
30 | import { BasicModal, useModalInner } from '/@/components/Modal'; | 29 | import { BasicModal, useModalInner } from '/@/components/Modal'; |
31 | - import { BasicForm, FormSchema, useForm } from '/@/components/Form'; | ||
32 | - import DeviceStep1 from "/@/views/device/step/DeviceStep1.vue"; | ||
33 | - import DeviceStep2 from "/@/views/device/step/DeviceStep2.vue"; | ||
34 | - import DeviceStep3 from "/@/views/device/step/DeviceStep3.vue"; | ||
35 | - import { Steps } from "ant-design-vue"; | ||
36 | - const schemas: FormSchema[] = [ | ||
37 | - { | ||
38 | - field: 'field1', | ||
39 | - component: 'Input', | ||
40 | - label: '字段1', | ||
41 | - colProps: { | ||
42 | - span: 24, | ||
43 | - }, | ||
44 | - defaultValue: '111', | ||
45 | - }, | ||
46 | - { | ||
47 | - field: 'field2', | ||
48 | - component: 'Input', | ||
49 | - label: '字段2', | ||
50 | - colProps: { | ||
51 | - span: 24, | ||
52 | - }, | ||
53 | - }, | ||
54 | - ]; | 30 | + import DeviceStep1 from '/@/views/device/step/DeviceStep1.vue'; |
31 | + import DeviceStep2 from '/@/views/device/step/DeviceStep2.vue'; | ||
32 | + import { Steps } from 'ant-design-vue'; | ||
55 | export default defineComponent({ | 33 | export default defineComponent({ |
56 | - name:'DeviceModal', | ||
57 | - components: { BasicModal, BasicForm, DeviceStep1, DeviceStep2, DeviceStep3, | 34 | + name: 'DeviceModal', |
35 | + components: { | ||
36 | + BasicModal, | ||
37 | + DeviceStep1, | ||
38 | + DeviceStep2, | ||
58 | [Steps.name]: Steps, | 39 | [Steps.name]: Steps, |
59 | - [Steps.Step.name]: Steps.Step, }, | 40 | + [Steps.Step.name]: Steps.Step, |
41 | + }, | ||
60 | props: { | 42 | props: { |
61 | userData: { type: Object }, | 43 | userData: { type: Object }, |
62 | }, | 44 | }, |
63 | setup(props) { | 45 | setup(props) { |
64 | const state = reactive({ | 46 | const state = reactive({ |
65 | initStep2: false, | 47 | initStep2: false, |
66 | - initStep3: false, | ||
67 | }); | 48 | }); |
68 | const current = ref(0); | 49 | const current = ref(0); |
69 | const isUpdate = ref(true); | 50 | const isUpdate = ref(true); |
70 | const modelRef = ref({}); | 51 | const modelRef = ref({}); |
71 | const getTitle = computed(() => (!unref(isUpdate) ? '新增设备' : '编辑设备')); | 52 | const getTitle = computed(() => (!unref(isUpdate) ? '新增设备' : '编辑设备')); |
72 | - const [ | ||
73 | - registerForm, | ||
74 | - { | ||
75 | - // setFieldsValue, | ||
76 | - // setProps | ||
77 | - }, | ||
78 | - ] = useForm({ | ||
79 | - labelWidth: 120, | ||
80 | - schemas, | ||
81 | - showActionButtonGroup: false, | ||
82 | - actionColOptions: { | ||
83 | - span: 24, | ||
84 | - }, | ||
85 | - }); | ||
86 | 53 | ||
87 | const [register] = useModalInner((data) => { | 54 | const [register] = useModalInner((data) => { |
88 | isUpdate.value = !!data?.isUpdate; | 55 | isUpdate.value = !!data?.isUpdate; |
@@ -99,15 +66,15 @@ import {defineComponent, ref, nextTick, computed, unref, reactive, toRefs} from | @@ -99,15 +66,15 @@ import {defineComponent, ref, nextTick, computed, unref, reactive, toRefs} from | ||
99 | } | 66 | } |
100 | function handleStep2Next(step2Values: any) { | 67 | function handleStep2Next(step2Values: any) { |
101 | current.value++; | 68 | current.value++; |
102 | - state.initStep3 = true; | ||
103 | console.log(step2Values); | 69 | console.log(step2Values); |
104 | } | 70 | } |
105 | function handleRedo() { | 71 | function handleRedo() { |
106 | current.value = 0; | 72 | current.value = 0; |
107 | - state.initSetp2 = false; | ||
108 | - state.initSetp3 = false; | 73 | + state.initStep2 = false; |
74 | + } | ||
75 | + function handleCancel() { | ||
76 | + console.log('关闭了弹框'); | ||
109 | } | 77 | } |
110 | - | ||
111 | 78 | ||
112 | function onDataReceive(data) { | 79 | function onDataReceive(data) { |
113 | console.log('Data Received', data); | 80 | console.log('Data Received', data); |
@@ -129,8 +96,19 @@ import {defineComponent, ref, nextTick, computed, unref, reactive, toRefs} from | @@ -129,8 +96,19 @@ import {defineComponent, ref, nextTick, computed, unref, reactive, toRefs} from | ||
129 | v && props.userData && nextTick(() => onDataReceive(props.userData)); | 96 | v && props.userData && nextTick(() => onDataReceive(props.userData)); |
130 | } | 97 | } |
131 | 98 | ||
132 | - return { register, schemas, registerForm, model: modelRef, getTitle,handleVisibleChange, | ||
133 | - current, ...toRefs(state), handleStepPrev, handleStep1Next, handleStep2Next, handleRedo}; | 99 | + return { |
100 | + register, | ||
101 | + model: modelRef, | ||
102 | + getTitle, | ||
103 | + handleVisibleChange, | ||
104 | + current, | ||
105 | + ...toRefs(state), | ||
106 | + handleStepPrev, | ||
107 | + handleStep1Next, | ||
108 | + handleStep2Next, | ||
109 | + handleCancel, | ||
110 | + handleRedo, | ||
111 | + }; | ||
134 | }, | 112 | }, |
135 | }); | 113 | }); |
136 | </script> | 114 | </script> |
1 | import { BasicColumn } from '/@/components/Table'; | 1 | import { BasicColumn } from '/@/components/Table'; |
2 | import { FormSchema } from '/@/components/Table'; | 2 | import { FormSchema } from '/@/components/Table'; |
3 | -import {findDictItemByCode} from "/@/api/system/dict"; | ||
4 | -import {DeviceTypeEnum,DeviceState} from "/@/api/device/model/deviceModel"; | 3 | +import { findDictItemByCode } from '/@/api/system/dict'; |
4 | +import { DeviceTypeEnum, DeviceState } from '/@/api/device/model/deviceModel'; | ||
5 | export const columns: BasicColumn[] = [ | 5 | export const columns: BasicColumn[] = [ |
6 | { | 6 | { |
7 | title: '设备名称', | 7 | title: '设备名称', |
@@ -12,7 +12,7 @@ export const columns: BasicColumn[] = [ | @@ -12,7 +12,7 @@ export const columns: BasicColumn[] = [ | ||
12 | title: '设备类型', | 12 | title: '设备类型', |
13 | dataIndex: 'deviceType', | 13 | dataIndex: 'deviceType', |
14 | width: 100, | 14 | width: 100, |
15 | - slots:{customRender:'deviceType'}, | 15 | + slots: { customRender: 'deviceType' }, |
16 | }, | 16 | }, |
17 | { | 17 | { |
18 | title: '设备配置', | 18 | title: '设备配置', |
@@ -29,7 +29,7 @@ export const columns: BasicColumn[] = [ | @@ -29,7 +29,7 @@ export const columns: BasicColumn[] = [ | ||
29 | { | 29 | { |
30 | title: '标签', | 30 | title: '标签', |
31 | dataIndex: 'label', | 31 | dataIndex: 'label', |
32 | - width: 180 | 32 | + width: 180, |
33 | }, | 33 | }, |
34 | { | 34 | { |
35 | title: '状态', | 35 | title: '状态', |
@@ -80,7 +80,6 @@ export const searchFormSchema: FormSchema[] = [ | @@ -80,7 +80,6 @@ export const searchFormSchema: FormSchema[] = [ | ||
80 | }, | 80 | }, |
81 | ]; | 81 | ]; |
82 | 82 | ||
83 | - | ||
84 | export const formSchema: FormSchema[] = [ | 83 | export const formSchema: FormSchema[] = [ |
85 | { | 84 | { |
86 | field: 'icon', | 85 | field: 'icon', |
@@ -92,10 +91,10 @@ export const formSchema: FormSchema[] = [ | @@ -92,10 +91,10 @@ export const formSchema: FormSchema[] = [ | ||
92 | field: 'name', | 91 | field: 'name', |
93 | label: '设备名称', | 92 | label: '设备名称', |
94 | required: true, | 93 | required: true, |
95 | - component:'Input', | ||
96 | - componentProps:{ | ||
97 | - maxLength:30 | ||
98 | - } | 94 | + component: 'Input', |
95 | + componentProps: { | ||
96 | + maxLength: 30, | ||
97 | + }, | ||
99 | }, | 98 | }, |
100 | { | 99 | { |
101 | field: 'deviceType', | 100 | field: 'deviceType', |
@@ -103,25 +102,25 @@ export const formSchema: FormSchema[] = [ | @@ -103,25 +102,25 @@ export const formSchema: FormSchema[] = [ | ||
103 | required: true, | 102 | required: true, |
104 | component: 'ApiSelect', | 103 | component: 'ApiSelect', |
105 | componentProps: { | 104 | componentProps: { |
106 | - api:findDictItemByCode, | ||
107 | - params:{ | ||
108 | - dictCode:"device_type" | 105 | + api: findDictItemByCode, |
106 | + params: { | ||
107 | + dictCode: 'device_type', | ||
109 | }, | 108 | }, |
110 | - labelField:'itemText', | ||
111 | - valueField:'itemValue', | 109 | + labelField: 'itemText', |
110 | + valueField: 'itemValue', | ||
112 | }, | 111 | }, |
113 | }, | 112 | }, |
114 | { | 113 | { |
115 | field: 'label', | 114 | field: 'label', |
116 | label: '设备标签', | 115 | label: '设备标签', |
117 | - component:'Input', | ||
118 | - componentProps:{ | ||
119 | - maxLength:255 | ||
120 | - } | 116 | + component: 'Input', |
117 | + componentProps: { | ||
118 | + maxLength: 255, | ||
119 | + }, | ||
121 | }, | 120 | }, |
122 | { | 121 | { |
123 | label: '备注', | 122 | label: '备注', |
124 | field: 'remark', | 123 | field: 'remark', |
125 | component: 'InputTextArea', | 124 | component: 'InputTextArea', |
126 | - } | 125 | + }, |
127 | ]; | 126 | ]; |
@@ -16,9 +16,9 @@ | @@ -16,9 +16,9 @@ | ||
16 | <template #deviceType="{ record }"> | 16 | <template #deviceType="{ record }"> |
17 | <Tag color="success" class="ml-2"> | 17 | <Tag color="success" class="ml-2"> |
18 | {{ | 18 | {{ |
19 | - record.deviceType == DeviceTypeEnum.GATEWAY | 19 | + record.deviceType === DeviceTypeEnum.GATEWAY |
20 | ? '网关设备' | 20 | ? '网关设备' |
21 | - : record.deviceType == DeviceTypeEnum.DIRECT_CONNECTION | 21 | + : record.deviceType === DeviceTypeEnum.DIRECT_CONNECTION |
22 | ? '直连设备' | 22 | ? '直连设备' |
23 | : '网关子设备' | 23 | : '网关子设备' |
24 | }} | 24 | }} |
@@ -65,7 +65,7 @@ | @@ -65,7 +65,7 @@ | ||
65 | /> | 65 | /> |
66 | </template> | 66 | </template> |
67 | </BasicTable> | 67 | </BasicTable> |
68 | - <ConfigDrawer @register="registerDrawer" @success="handleSuccess" /> | 68 | + <!-- <ConfigDrawer @register="registerDrawer" @success="handleSuccess" /> --> |
69 | <DeviceModal @register="registerModal" @success="handleSuccess" /> | 69 | <DeviceModal @register="registerModal" @success="handleSuccess" /> |
70 | </PageWrapper> | 70 | </PageWrapper> |
71 | </template> | 71 | </template> |
@@ -73,11 +73,10 @@ | @@ -73,11 +73,10 @@ | ||
73 | import { defineComponent, reactive } from 'vue'; | 73 | import { defineComponent, reactive } from 'vue'; |
74 | import { DeviceState, DeviceTypeEnum } from '/@/api/device/model/deviceModel'; | 74 | import { DeviceState, DeviceTypeEnum } from '/@/api/device/model/deviceModel'; |
75 | import { BasicTable, useTable, TableAction } from '/@/components/Table'; | 75 | import { BasicTable, useTable, TableAction } from '/@/components/Table'; |
76 | - import { useDrawer } from '/@/components/Drawer'; | ||
77 | - import ConfigDrawer from './DeviceDrawer.vue'; | 76 | + // import { useDrawer } from '/@/components/Drawer'; |
77 | + // import ConfigDrawer from './DeviceDrawer.vue'; | ||
78 | import { columns, searchFormSchema } from './device.data'; | 78 | import { columns, searchFormSchema } from './device.data'; |
79 | import { Tag } from 'ant-design-vue'; | 79 | import { Tag } from 'ant-design-vue'; |
80 | - import { CodeEditor } from '/@/components/CodeEditor'; | ||
81 | import { useMessage } from '/@/hooks/web/useMessage'; | 80 | import { useMessage } from '/@/hooks/web/useMessage'; |
82 | import { deleteDevice, devicePage } from '/@/api/device/deviceManager'; | 81 | import { deleteDevice, devicePage } from '/@/api/device/deviceManager'; |
83 | import { PageEnum } from '/@/enums/pageEnum'; | 82 | import { PageEnum } from '/@/enums/pageEnum'; |
@@ -91,16 +90,15 @@ | @@ -91,16 +90,15 @@ | ||
91 | name: 'DeviceManagement', | 90 | name: 'DeviceManagement', |
92 | components: { | 91 | components: { |
93 | BasicTable, | 92 | BasicTable, |
94 | - ConfigDrawer, | 93 | + // ConfigDrawer, |
95 | PageWrapper, | 94 | PageWrapper, |
96 | TableAction, | 95 | TableAction, |
97 | OrganizationIdTree, | 96 | OrganizationIdTree, |
98 | - CodeEditor, | ||
99 | Tag, | 97 | Tag, |
100 | DeviceModal, | 98 | DeviceModal, |
101 | }, | 99 | }, |
102 | setup() { | 100 | setup() { |
103 | - const [registerDrawer, { openDrawer }] = useDrawer(); | 101 | + // const [registerDrawer, { openDrawer }] = useDrawer(); |
104 | const { createMessage } = useMessage(); | 102 | const { createMessage } = useMessage(); |
105 | const go = useGo(); | 103 | const go = useGo(); |
106 | const searchInfo = reactive<Recordable>({}); | 104 | const searchInfo = reactive<Recordable>({}); |
@@ -128,18 +126,15 @@ | @@ -128,18 +126,15 @@ | ||
128 | }); | 126 | }); |
129 | 127 | ||
130 | function handleCreate() { | 128 | function handleCreate() { |
131 | - // openDrawer(true, { | ||
132 | - // isUpdate: false, | ||
133 | - // }); | ||
134 | openModal(true, { | 129 | openModal(true, { |
135 | isUpdate: false, | 130 | isUpdate: false, |
136 | }); | 131 | }); |
137 | } | 132 | } |
138 | 133 | ||
139 | function handleEdit(record: Recordable) { | 134 | function handleEdit(record: Recordable) { |
140 | - openDrawer(true, { | ||
141 | - record, | 135 | + openModal(true, { |
142 | isUpdate: true, | 136 | isUpdate: true, |
137 | + record, | ||
143 | }); | 138 | }); |
144 | } | 139 | } |
145 | 140 | ||
@@ -163,7 +158,7 @@ | @@ -163,7 +158,7 @@ | ||
163 | } | 158 | } |
164 | return { | 159 | return { |
165 | registerTable, | 160 | registerTable, |
166 | - registerDrawer, | 161 | + // registerDrawer, |
167 | handleCreate, | 162 | handleCreate, |
168 | handleEdit, | 163 | handleEdit, |
169 | handleDelete, | 164 | handleDelete, |
@@ -20,7 +20,7 @@ | @@ -20,7 +20,7 @@ | ||
20 | </Upload> | 20 | </Upload> |
21 | </template> | 21 | </template> |
22 | <template #devicePosition> | 22 | <template #devicePosition> |
23 | - <Input> | 23 | + <Input disabled v-model:value="positionState.address"> |
24 | <template #addonAfter> | 24 | <template #addonAfter> |
25 | <EnvironmentTwoTone @click="selectPosition" /> | 25 | <EnvironmentTwoTone @click="selectPosition" /> |
26 | </template> | 26 | </template> |
@@ -28,27 +28,34 @@ | @@ -28,27 +28,34 @@ | ||
28 | </template> | 28 | </template> |
29 | </BasicForm> | 29 | </BasicForm> |
30 | </div> | 30 | </div> |
31 | - <modal v-model:visible="visible" title="设备位置" @ok="handleOk"> | 31 | + <Modal v-model:visible="visible" title="设备位置" @ok="handleOk" width="800px"> |
32 | <div> | 32 | <div> |
33 | - <a-input-group> | ||
34 | - <a-row :gutter="8" class="flex"> | ||
35 | - <a-col :span="6" class="flex"> 经度<a-input /> </a-col> | ||
36 | - <a-col :span="6" class="flex"> 纬度<a-input /> </a-col> | 33 | + <a-form :label-col="labelCol"> |
34 | + <a-row :gutter="20"> | ||
35 | + <a-col :span="8"> | ||
36 | + <a-form-item label="经度"> | ||
37 | + <Input type="input" v-model:value="positionState.lng" disabled /> | ||
38 | + </a-form-item> | ||
39 | + </a-col> | ||
40 | + <a-col :span="8"> | ||
41 | + <a-form-item label="纬度"> | ||
42 | + <Input type="input" v-model:value="positionState.lat" disabled /> | ||
43 | + </a-form-item> | ||
44 | + </a-col> | ||
37 | </a-row> | 45 | </a-row> |
38 | - </a-input-group> | ||
39 | - <div ref="wrapRef" style="height: 300px; width: 90%" class=""> </div> | 46 | + </a-form> |
47 | + <div ref="wrapRef" style="height: 300px; width: 90%" class="ml-6"></div> | ||
40 | </div> | 48 | </div> |
41 | - </modal> | ||
42 | - > | 49 | + </Modal> |
43 | </div> | 50 | </div> |
44 | </template> | 51 | </template> |
45 | <script lang="ts"> | 52 | <script lang="ts"> |
46 | - import { defineComponent, ref, onMounted, nextTick, unref, getCurrentInstance } from 'vue'; | 53 | + import { defineComponent, ref, nextTick, unref, reactive } from 'vue'; |
47 | import { BasicForm, useForm } from '/@/components/Form'; | 54 | import { BasicForm, useForm } from '/@/components/Form'; |
48 | import { step1Schemas } from './data'; | 55 | import { step1Schemas } from './data'; |
49 | import { useScript } from '/@/hooks/web/useScript'; | 56 | import { useScript } from '/@/hooks/web/useScript'; |
50 | import { ScrollActionType } from '/@/components/Container/index'; | 57 | import { ScrollActionType } from '/@/components/Container/index'; |
51 | - import { Input, Divider, Upload, message, Modal, Col, Row } from 'ant-design-vue'; | 58 | + import { Input, Divider, Upload, message, Modal, Form, Row, Col } from 'ant-design-vue'; |
52 | import { EnvironmentTwoTone, LoadingOutlined, PlusOutlined } from '@ant-design/icons-vue'; | 59 | import { EnvironmentTwoTone, LoadingOutlined, PlusOutlined } from '@ant-design/icons-vue'; |
53 | import { upload } from '/@/api/oss/ossFileUploader'; | 60 | import { upload } from '/@/api/oss/ossFileUploader'; |
54 | import { FileItem } from '/@/components/Upload/src/typing'; | 61 | import { FileItem } from '/@/components/Upload/src/typing'; |
@@ -64,24 +71,19 @@ | @@ -64,24 +71,19 @@ | ||
64 | // LoadingOutlined, | 71 | // LoadingOutlined, |
65 | PlusOutlined, | 72 | PlusOutlined, |
66 | Modal, | 73 | Modal, |
67 | - [Col.name]: Col, | 74 | + [Form.name]: Form, |
75 | + [Form.Item.name]: Form.Item, | ||
68 | [Row.name]: Row, | 76 | [Row.name]: Row, |
69 | - }, | ||
70 | - props: { | ||
71 | - width: { | ||
72 | - type: String, | ||
73 | - default: '300px', | ||
74 | - }, | ||
75 | - height: { | ||
76 | - type: String, | ||
77 | - default: '300px', | ||
78 | - }, | 77 | + [Col.name]: Col, |
79 | }, | 78 | }, |
80 | emits: ['next'], | 79 | emits: ['next'], |
81 | setup(_, { emit }) { | 80 | setup(_, { emit }) { |
82 | - const { proxy } = getCurrentInstance(); | ||
83 | - console.log(proxy); | ||
84 | const devicePic = ref(''); | 81 | const devicePic = ref(''); |
82 | + const positionState = reactive({ | ||
83 | + lng: '', | ||
84 | + lat: '', | ||
85 | + address: '', | ||
86 | + }); | ||
85 | const [register, { validate }] = useForm({ | 87 | const [register, { validate }] = useForm({ |
86 | labelWidth: 100, | 88 | labelWidth: 100, |
87 | schemas: step1Schemas, | 89 | schemas: step1Schemas, |
@@ -97,10 +99,15 @@ | @@ -97,10 +99,15 @@ | ||
97 | 99 | ||
98 | async function customSubmitFunc() { | 100 | async function customSubmitFunc() { |
99 | try { | 101 | try { |
100 | - const values = await validate(); | 102 | + let values = await validate(); |
103 | + values = { devicePic: devicePic.value, ...positionState, ...values }; | ||
104 | + delete values.icon; | ||
105 | + delete values.devicePosition; | ||
101 | emit('next', values); | 106 | emit('next', values); |
107 | + // 获取输入的数据 | ||
102 | } catch (error) {} | 108 | } catch (error) {} |
103 | } | 109 | } |
110 | + // 图片上传 | ||
104 | async function customUpload({ file }) { | 111 | async function customUpload({ file }) { |
105 | if (beforeUpload(file)) { | 112 | if (beforeUpload(file)) { |
106 | const formData = new FormData(); | 113 | const formData = new FormData(); |
@@ -111,7 +118,6 @@ | @@ -111,7 +118,6 @@ | ||
111 | } | 118 | } |
112 | } | 119 | } |
113 | } | 120 | } |
114 | - | ||
115 | const beforeUpload = (file: FileItem) => { | 121 | const beforeUpload = (file: FileItem) => { |
116 | const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png'; | 122 | const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png'; |
117 | if (!isJpgOrPng) { | 123 | if (!isJpgOrPng) { |
@@ -123,12 +129,15 @@ | @@ -123,12 +129,15 @@ | ||
123 | } | 129 | } |
124 | return isJpgOrPng && isLt2M; | 130 | return isJpgOrPng && isLt2M; |
125 | }; | 131 | }; |
132 | + | ||
133 | + // 地图的弹框 | ||
126 | const visible = ref(false); | 134 | const visible = ref(false); |
127 | const selectPosition = () => { | 135 | const selectPosition = () => { |
128 | visible.value = true; | 136 | visible.value = true; |
129 | initMap(); | 137 | initMap(); |
130 | }; | 138 | }; |
131 | 139 | ||
140 | + // 地图 | ||
132 | const BAI_DU_MAP_URL = | 141 | const BAI_DU_MAP_URL = |
133 | 'https://api.map.baidu.com/getscript?v=3.0&ak=7uOPPyAHn2Y2ZryeQqHtcRqtIY374vKa'; | 142 | 'https://api.map.baidu.com/getscript?v=3.0&ak=7uOPPyAHn2Y2ZryeQqHtcRqtIY374vKa'; |
134 | const wrapRef = ref<HTMLDivElement | null>(null); | 143 | const wrapRef = ref<HTMLDivElement | null>(null); |
@@ -139,16 +148,31 @@ | @@ -139,16 +148,31 @@ | ||
139 | await nextTick(); | 148 | await nextTick(); |
140 | const wrapEl = unref(wrapRef); | 149 | const wrapEl = unref(wrapRef); |
141 | const BMap = (window as any).BMap; | 150 | const BMap = (window as any).BMap; |
142 | - console.log(wrapRef, '----------------------------'); | ||
143 | if (!wrapEl) return; | 151 | if (!wrapEl) return; |
144 | const map = new BMap.Map(wrapEl); | 152 | const map = new BMap.Map(wrapEl); |
145 | - const point = new BMap.Point(116.14282, 35.19515); | 153 | + map.addEventListener('click', () => { |
154 | + const { lat, lng } = map.he; | ||
155 | + positionState.lat = lat + ''; | ||
156 | + positionState.lng = lng + ''; | ||
157 | + let gc = new BMap.Geocoder(); | ||
158 | + let newPoint = new BMap.Point(lng, lat); | ||
159 | + gc.getLocation(newPoint, (rs) => { | ||
160 | + let addComp = rs.addressComponents; | ||
161 | + //获取详细的地址,精确到街道的名称 | ||
162 | + let addrname = addComp.city + addComp.district + addComp.street + addComp.streetNumber; | ||
163 | + positionState.address = addrname; | ||
164 | + }); | ||
165 | + }); | ||
166 | + const point = new BMap.Point(104.04813399999999, 30.54348986021446); | ||
146 | map.centerAndZoom(point, 15); | 167 | map.centerAndZoom(point, 15); |
147 | map.enableScrollWheelZoom(true); | 168 | map.enableScrollWheelZoom(true); |
148 | } | 169 | } |
149 | - const handleOk = () => {}; | ||
150 | - | 170 | + // 确定选择的位置 |
171 | + const handleOk = () => { | ||
172 | + visible.value = false; | ||
173 | + }; | ||
151 | return { | 174 | return { |
175 | + positionState, | ||
152 | register, | 176 | register, |
153 | beforeUpload, | 177 | beforeUpload, |
154 | customUpload, | 178 | customUpload, |
@@ -158,6 +182,7 @@ | @@ -158,6 +182,7 @@ | ||
158 | scrollRef, | 182 | scrollRef, |
159 | handleOk, | 183 | handleOk, |
160 | wrapRef, | 184 | wrapRef, |
185 | + labelCol: { style: { width: '40px' } }, | ||
161 | }; | 186 | }; |
162 | }, | 187 | }, |
163 | }); | 188 | }); |
1 | <template> | 1 | <template> |
2 | <div class="step2"> | 2 | <div class="step2"> |
3 | - <a-alert message="确认转账后,资金将直接打入对方账户,无法退回。" show-icon /> | ||
4 | - <a-descriptions :column="1" class="mt-5"> | ||
5 | - <a-descriptions-item label="付款账户"> ant-design@alipay.com </a-descriptions-item> | ||
6 | - <a-descriptions-item label="收款账户"> test@example.com </a-descriptions-item> | ||
7 | - <a-descriptions-item label="收款人姓名"> Vben </a-descriptions-item> | ||
8 | - <a-descriptions-item label="转账金额"> 500元 </a-descriptions-item> | ||
9 | - </a-descriptions> | ||
10 | - <a-divider /> | ||
11 | - <BasicForm @register="register" /> | 3 | + <div><input type="checkbox" v-model="isCreaentials" @click="checked" /> 添加凭证 </div> |
4 | + | ||
5 | + <a-form :label-col="labelCol" :wrapper-col="wrapperCol" v-if="isCreaentials"> | ||
6 | + <a-form-item label="凭据类型"> | ||
7 | + <a-select | ||
8 | + v-model:value="creaentialsType" | ||
9 | + style="width: 200px" | ||
10 | + @change="handleChange" | ||
11 | + placeholder="请选择凭据类型" | ||
12 | + :options="options" | ||
13 | + /> | ||
14 | + </a-form-item> | ||
15 | + <div v-if="creaentialsType === 'Access token'"> | ||
16 | + <a-form-item label="访问令牌"> | ||
17 | + <a-input type="input" style="width: 200px" v-model:value="token" /> | ||
18 | + </a-form-item> | ||
19 | + </div> | ||
20 | + <div v-else-if="creaentialsType === 'X.509'"> | ||
21 | + <a-form-item label="RSA公钥"> | ||
22 | + <a-input type="input" style="width: 200px" v-model:value="publicKey" /> | ||
23 | + </a-form-item> | ||
24 | + </div> | ||
25 | + <div v-else> | ||
26 | + <a-form-item label="客户端ID"> | ||
27 | + <a-input type="input" style="width: 200px" v-model:value="clientId" /> | ||
28 | + </a-form-item> | ||
29 | + <a-form-item label="用户名"> | ||
30 | + <a-input type="input" style="width: 200px" v-model:value="username" /> | ||
31 | + </a-form-item> | ||
32 | + <a-form-item label="密码"> | ||
33 | + <a-input type="password" style="width: 200px" v-model:value="password" /> | ||
34 | + </a-form-item> | ||
35 | + </div> | ||
36 | + </a-form> | ||
37 | + | ||
38 | + <div class="flex justify-start"> | ||
39 | + <a-button class="mr-5" @click="prevStep">上一步</a-button> | ||
40 | + </div> | ||
12 | </div> | 41 | </div> |
13 | </template> | 42 | </template> |
14 | <script lang="ts"> | 43 | <script lang="ts"> |
15 | - import { defineComponent } from 'vue'; | ||
16 | - import { BasicForm, useForm } from '/@/components/Form'; | ||
17 | - import { step2Schemas } from './data'; | ||
18 | - import { Alert, Divider, Descriptions } from 'ant-design-vue'; | 44 | + import { defineComponent, reactive, ref, toRefs } from 'vue'; |
19 | 45 | ||
46 | + import { Input, Form, Select, Button, SelectProps } from 'ant-design-vue'; | ||
20 | export default defineComponent({ | 47 | export default defineComponent({ |
21 | components: { | 48 | components: { |
22 | - BasicForm, | ||
23 | - [Alert.name]: Alert, | ||
24 | - [Divider.name]: Divider, | ||
25 | - [Descriptions.name]: Descriptions, | ||
26 | - [Descriptions.Item.name]: Descriptions.Item, | 49 | + [Form.name]: Form, |
50 | + [Form.Item.name]: Form.Item, | ||
51 | + [Input.name]: Input, | ||
52 | + [Select.name]: Select, | ||
53 | + [Button.name]: Button, | ||
27 | }, | 54 | }, |
28 | - emits: ['next', 'prev'], | 55 | + emits: ['prev'], |
29 | setup(_, { emit }) { | 56 | setup(_, { emit }) { |
30 | - const [register, { validate, setProps }] = useForm({ | ||
31 | - labelWidth: 80, | ||
32 | - schemas: step2Schemas, | ||
33 | - actionColOptions: { | ||
34 | - span: 14, | 57 | + const isCreaentials = ref(false); |
58 | + const creaentialsType = ref('Access token'); | ||
59 | + const creaentialsPassword = reactive({ | ||
60 | + token: '', | ||
61 | + publicKey: '', | ||
62 | + clientId: '', | ||
63 | + username: '', | ||
64 | + password: '', | ||
65 | + }); | ||
66 | + const options = ref<SelectProps['options']>([ | ||
67 | + { | ||
68 | + value: 'Access token', | ||
69 | + label: 'Access token', | ||
35 | }, | 70 | }, |
36 | - resetButtonOptions: { | ||
37 | - text: '上一步', | 71 | + |
72 | + { | ||
73 | + value: 'X.509', | ||
74 | + label: 'X.509', | ||
38 | }, | 75 | }, |
39 | - submitButtonOptions: { | ||
40 | - text: '提交', | 76 | + { |
77 | + value: 'MQTT Basic', | ||
78 | + label: 'MQTT Basic', | ||
41 | }, | 79 | }, |
42 | - resetFunc: customResetFunc, | ||
43 | - submitFunc: customSubmitFunc, | ||
44 | - }); | ||
45 | - | ||
46 | - async function customResetFunc() { | 80 | + ]); |
81 | + const checked = () => { | ||
82 | + isCreaentials.value = !isCreaentials.value; | ||
83 | + }; | ||
84 | + const prevStep = () => { | ||
47 | emit('prev'); | 85 | emit('prev'); |
48 | - } | ||
49 | - | ||
50 | - async function customSubmitFunc() { | ||
51 | - try { | ||
52 | - const values = await validate(); | ||
53 | - setProps({ | ||
54 | - submitButtonOptions: { | ||
55 | - loading: true, | ||
56 | - }, | ||
57 | - }); | ||
58 | - setTimeout(() => { | ||
59 | - setProps({ | ||
60 | - submitButtonOptions: { | ||
61 | - loading: false, | ||
62 | - }, | ||
63 | - }); | ||
64 | - emit('next', values); | ||
65 | - }, 1500); | ||
66 | - } catch (error) {} | ||
67 | - } | ||
68 | - | ||
69 | - return { register }; | 86 | + }; |
87 | + // 切换凭证类型时,重置字段 | ||
88 | + const handleChange = (value) => { | ||
89 | + if (value === 'Access token') { | ||
90 | + creaentialsPassword.token = ''; | ||
91 | + } else if (value === 'X.509') { | ||
92 | + creaentialsPassword.publicKey = ''; | ||
93 | + } else { | ||
94 | + creaentialsPassword.clientId = ''; | ||
95 | + creaentialsPassword.username = ''; | ||
96 | + creaentialsPassword.password = ''; | ||
97 | + } | ||
98 | + }; | ||
99 | + return { | ||
100 | + ...toRefs(creaentialsPassword), | ||
101 | + creaentialsType, | ||
102 | + isCreaentials, | ||
103 | + options, | ||
104 | + handleChange, | ||
105 | + prevStep, | ||
106 | + checked, | ||
107 | + labelCol: { style: { width: '150px' } }, | ||
108 | + wrapperCol: { span: 18 }, | ||
109 | + }; | ||
70 | }, | 110 | }, |
71 | }); | 111 | }); |
72 | </script> | 112 | </script> |
73 | <style lang="less" scoped> | 113 | <style lang="less" scoped> |
74 | .step2 { | 114 | .step2 { |
75 | - width: 450px; | 115 | + width: 500px; |
76 | margin: 0 auto; | 116 | margin: 0 auto; |
77 | } | 117 | } |
78 | </style> | 118 | </style> |
src/views/device/step/DeviceStep3.vue
deleted
100644 → 0
1 | -<template> | ||
2 | - <div class="step3"> | ||
3 | - <a-result status="success" title="操作成功" sub-title="预计两小时内到账"> | ||
4 | - <template #extra> | ||
5 | - <a-button type="primary" @click="redo"> 再转一笔 </a-button> | ||
6 | - <a-button> 查看账单 </a-button> | ||
7 | - </template> | ||
8 | - </a-result> | ||
9 | - <div class="desc-wrap"> | ||
10 | - <a-descriptions :column="1" class="mt-5"> | ||
11 | - <a-descriptions-item label="付款账户"> ant-design@alipay.com </a-descriptions-item> | ||
12 | - <a-descriptions-item label="收款账户"> test@example.com </a-descriptions-item> | ||
13 | - <a-descriptions-item label="收款人姓名"> Vben </a-descriptions-item> | ||
14 | - <a-descriptions-item label="转账金额"> 500元 </a-descriptions-item> | ||
15 | - </a-descriptions> | ||
16 | - </div> | ||
17 | - </div> | ||
18 | -</template> | ||
19 | -<script lang="ts"> | ||
20 | - import { defineComponent } from 'vue'; | ||
21 | - import { Result, Descriptions } from 'ant-design-vue'; | ||
22 | - export default defineComponent({ | ||
23 | - components: { | ||
24 | - [Result.name]: Result, | ||
25 | - [Descriptions.name]: Descriptions, | ||
26 | - [Descriptions.Item.name]: Descriptions.Item, | ||
27 | - }, | ||
28 | - emits: ['redo'], | ||
29 | - setup(_, { emit }) { | ||
30 | - return { | ||
31 | - redo: () => { | ||
32 | - emit('redo'); | ||
33 | - }, | ||
34 | - }; | ||
35 | - }, | ||
36 | - }); | ||
37 | -</script> | ||
38 | -<style lang="less" scoped> | ||
39 | - .step3 { | ||
40 | - width: 600px; | ||
41 | - margin: 0 auto; | ||
42 | - } | ||
43 | - | ||
44 | - .desc-wrap { | ||
45 | - padding: 24px 40px; | ||
46 | - margin-top: 24px; | ||
47 | - background-color: @background-color-light; | ||
48 | - } | ||
49 | -</style> |
src/views/device/step/StepIndexDemo.vue
renamed from
src/views/device/step/StepIndex.vue
@@ -20,7 +20,6 @@ | @@ -20,7 +20,6 @@ | ||
20 | v-show="current === 1" | 20 | v-show="current === 1" |
21 | v-if="initSetp2" | 21 | v-if="initSetp2" |
22 | /> | 22 | /> |
23 | - <Step3 v-show="current === 2" @redo="handleRedo" v-if="initSetp3" /> | ||
24 | </div> | 23 | </div> |
25 | </PageWrapper> | 24 | </PageWrapper> |
26 | </template> | 25 | </template> |
@@ -28,7 +27,6 @@ | @@ -28,7 +27,6 @@ | ||
28 | import { defineComponent, ref, reactive, toRefs } from 'vue'; | 27 | import { defineComponent, ref, reactive, toRefs } from 'vue'; |
29 | import Step1 from './DeviceStep1.vue'; | 28 | import Step1 from './DeviceStep1.vue'; |
30 | import Step2 from './DeviceStep2.vue'; | 29 | import Step2 from './DeviceStep2.vue'; |
31 | - import Step3 from './DeviceStep3.vue'; | ||
32 | import { PageWrapper } from '/@/components/Page'; | 30 | import { PageWrapper } from '/@/components/Page'; |
33 | import { Steps } from 'ant-design-vue'; | 31 | import { Steps } from 'ant-design-vue'; |
34 | 32 | ||
@@ -37,17 +35,16 @@ | @@ -37,17 +35,16 @@ | ||
37 | components: { | 35 | components: { |
38 | Step1, | 36 | Step1, |
39 | Step2, | 37 | Step2, |
40 | - Step3, | 38 | + |
41 | PageWrapper, | 39 | PageWrapper, |
42 | [Steps.name]: Steps, | 40 | [Steps.name]: Steps, |
43 | [Steps.Step.name]: Steps.Step, | 41 | [Steps.Step.name]: Steps.Step, |
44 | }, | 42 | }, |
45 | setup() { | 43 | setup() { |
46 | - const current = ref(0); | 44 | + const current = ref(1); |
47 | 45 | ||
48 | const state = reactive({ | 46 | const state = reactive({ |
49 | initSetp2: false, | 47 | initSetp2: false, |
50 | - initSetp3: false, | ||
51 | }); | 48 | }); |
52 | 49 | ||
53 | function handleStep1Next(step1Values: any) { | 50 | function handleStep1Next(step1Values: any) { |
@@ -62,14 +59,12 @@ | @@ -62,14 +59,12 @@ | ||
62 | 59 | ||
63 | function handleStep2Next(step2Values: any) { | 60 | function handleStep2Next(step2Values: any) { |
64 | current.value++; | 61 | current.value++; |
65 | - state.initSetp3 = true; | ||
66 | console.log(step2Values); | 62 | console.log(step2Values); |
67 | } | 63 | } |
68 | 64 | ||
69 | function handleRedo() { | 65 | function handleRedo() { |
70 | current.value = 0; | 66 | current.value = 0; |
71 | state.initSetp2 = false; | 67 | state.initSetp2 = false; |
72 | - state.initSetp3 = false; | ||
73 | } | 68 | } |
74 | 69 | ||
75 | return { | 70 | return { |
@@ -51,13 +51,3 @@ export const step1Schemas: FormSchema[] = [ | @@ -51,13 +51,3 @@ export const step1Schemas: FormSchema[] = [ | ||
51 | component: 'InputTextArea', | 51 | component: 'InputTextArea', |
52 | }, | 52 | }, |
53 | ]; | 53 | ]; |
54 | - | ||
55 | -export const step2Schemas: FormSchema[] = [ | ||
56 | - { | ||
57 | - field: 'pwd', | ||
58 | - component: 'InputPassword', | ||
59 | - label: '支付密码', | ||
60 | - required: true, | ||
61 | - defaultValue: '123456', | ||
62 | - }, | ||
63 | -]; |
@@ -10,10 +10,11 @@ | @@ -10,10 +10,11 @@ | ||
10 | <BasicForm @register="registerForm"> | 10 | <BasicForm @register="registerForm"> |
11 | <template #menu="{ model, field }"> | 11 | <template #menu="{ model, field }"> |
12 | <BasicTree | 12 | <BasicTree |
13 | + ref="tree" | ||
13 | v-model:value="model[field]" | 14 | v-model:value="model[field]" |
14 | :treeData="treeData" | 15 | :treeData="treeData" |
15 | :replaceFields="{ title: 'menuName' }" | 16 | :replaceFields="{ title: 'menuName' }" |
16 | - :checked-keys="roleMenus" | 17 | + :checkedKeys="roleMenus" |
17 | checkable | 18 | checkable |
18 | toolbar | 19 | toolbar |
19 | title="菜单分配" | 20 | title="菜单分配" |
@@ -23,11 +24,16 @@ | @@ -23,11 +24,16 @@ | ||
23 | </BasicForm> | 24 | </BasicForm> |
24 | </BasicDrawer> | 25 | </BasicDrawer> |
25 | </template> | 26 | </template> |
27 | + | ||
26 | <script lang="ts"> | 28 | <script lang="ts"> |
27 | - import { defineComponent, ref, computed, unref } from 'vue'; | 29 | + import { defineComponent, ref, computed, unref, getCurrentInstance } from 'vue'; |
30 | + | ||
28 | import { BasicForm, useForm } from '/@/components/Form/index'; | 31 | import { BasicForm, useForm } from '/@/components/Form/index'; |
32 | + | ||
29 | import { formSchema } from './role.data'; | 33 | import { formSchema } from './role.data'; |
34 | + | ||
30 | import { BasicDrawer, useDrawerInner } from '/@/components/Drawer'; | 35 | import { BasicDrawer, useDrawerInner } from '/@/components/Drawer'; |
36 | + | ||
31 | import { BasicTree, TreeItem } from '/@/components/Tree'; | 37 | import { BasicTree, TreeItem } from '/@/components/Tree'; |
32 | 38 | ||
33 | const { t } = useI18n(); //加载国际化 | 39 | const { t } = useI18n(); //加载国际化 |
@@ -35,68 +41,129 @@ | @@ -35,68 +41,129 @@ | ||
35 | // import { getMenuList } from '/@/api/demo/system'; | 41 | // import { getMenuList } from '/@/api/demo/system'; |
36 | 42 | ||
37 | // 加载菜单数据 | 43 | // 加载菜单数据 |
44 | + | ||
38 | import { getMenuList, getMenusIdsByRoleId } from '/@/api/sys/menu'; | 45 | import { getMenuList, getMenusIdsByRoleId } from '/@/api/sys/menu'; |
46 | + | ||
39 | import { useI18n } from '/@/hooks/web/useI18n'; | 47 | import { useI18n } from '/@/hooks/web/useI18n'; |
48 | + | ||
40 | import { RouteItem } from '/@/api/sys/model/menuModel'; | 49 | import { RouteItem } from '/@/api/sys/model/menuModel'; |
50 | + | ||
41 | import { saveOrUpdateRoleInfoWithMenu } from '/@/api/system/system'; | 51 | import { saveOrUpdateRoleInfoWithMenu } from '/@/api/system/system'; |
52 | + import { useChildrenIdsRemoveParentId } from '/@/hooks/web/useChildrenIdsRemoveParentId'; | ||
42 | export default defineComponent({ | 53 | export default defineComponent({ |
43 | name: 'RoleDrawer', | 54 | name: 'RoleDrawer', |
55 | + | ||
44 | components: { BasicDrawer, BasicForm, BasicTree }, | 56 | components: { BasicDrawer, BasicForm, BasicTree }, |
57 | + | ||
45 | emits: ['success', 'register'], | 58 | emits: ['success', 'register'], |
59 | + | ||
46 | setup(_, { emit }) { | 60 | setup(_, { emit }) { |
61 | + const { proxy } = getCurrentInstance(); | ||
62 | + | ||
47 | const isUpdate = ref<boolean>(true); | 63 | const isUpdate = ref<boolean>(true); |
64 | + | ||
48 | const treeData = ref<TreeItem[]>([]); | 65 | const treeData = ref<TreeItem[]>([]); |
66 | + | ||
49 | const roleMenus = ref<string[]>([]); | 67 | const roleMenus = ref<string[]>([]); |
68 | + | ||
50 | const allCheckedKeys = ref<string[]>(); | 69 | const allCheckedKeys = ref<string[]>(); |
70 | + | ||
51 | const roleHalfCheckedKeys = ref<string[]>([]); | 71 | const roleHalfCheckedKeys = ref<string[]>([]); |
72 | + | ||
52 | const roleId = ref<string>(''); | 73 | const roleId = ref<string>(''); |
74 | + | ||
53 | const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({ | 75 | const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({ |
54 | labelWidth: 90, | 76 | labelWidth: 90, |
77 | + | ||
55 | schemas: formSchema, | 78 | schemas: formSchema, |
79 | + | ||
56 | showActionButtonGroup: false, | 80 | showActionButtonGroup: false, |
57 | }); | 81 | }); |
58 | 82 | ||
59 | function processChildren(items: RouteItem[]) { | 83 | function processChildren(items: RouteItem[]) { |
60 | items.map((item) => { | 84 | items.map((item) => { |
61 | item.menuName = t(item.meta.title); | 85 | item.menuName = t(item.meta.title); |
86 | + | ||
62 | item.icon = item.meta.icon; | 87 | item.icon = item.meta.icon; |
88 | + | ||
63 | item.key = item.id; | 89 | item.key = item.id; |
90 | + | ||
64 | if (item.children) { | 91 | if (item.children) { |
65 | processChildren(item.children); | 92 | processChildren(item.children); |
66 | } | 93 | } |
67 | }); | 94 | }); |
68 | } | 95 | } |
69 | 96 | ||
97 | + /** | ||
98 | + | ||
99 | + * 根据角色id获取所有的菜单ids----里面包含父级id---会造成回显数据时 | ||
100 | + | ||
101 | + * 存在父级id则默认勾选所有子级id | ||
102 | + | ||
103 | + */ | ||
104 | + | ||
70 | const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => { | 105 | const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => { |
71 | resetFields(); | 106 | resetFields(); |
107 | + | ||
72 | roleId.value = ''; | 108 | roleId.value = ''; |
109 | + | ||
73 | setDrawerProps({ confirmLoading: false }); | 110 | setDrawerProps({ confirmLoading: false }); |
111 | + | ||
74 | // 需要在setFieldsValue之前先填充treeData,否则Tree组件可能会报key not exist警告 | 112 | // 需要在setFieldsValue之前先填充treeData,否则Tree组件可能会报key not exist警告 |
113 | + | ||
75 | if (unref(treeData).length === 0) { | 114 | if (unref(treeData).length === 0) { |
76 | // 获取全部的菜单 | 115 | // 获取全部的菜单 |
116 | + | ||
77 | const menuListModel = await getMenuList(); | 117 | const menuListModel = await getMenuList(); |
118 | + | ||
78 | processChildren(menuListModel); | 119 | processChildren(menuListModel); |
120 | + | ||
79 | let treeValues: TreeItem[] = []; | 121 | let treeValues: TreeItem[] = []; |
122 | + | ||
80 | menuListModel.map((item) => { | 123 | menuListModel.map((item) => { |
81 | const data = { | 124 | const data = { |
82 | menuName: t(item.meta.title), | 125 | menuName: t(item.meta.title), |
126 | + | ||
83 | icon: item.meta.icon, | 127 | icon: item.meta.icon, |
128 | + | ||
84 | key: item.id, | 129 | key: item.id, |
130 | + | ||
85 | children: item.children as any as TreeItem[], | 131 | children: item.children as any as TreeItem[], |
86 | }; | 132 | }; |
133 | + | ||
87 | treeValues.push(data); | 134 | treeValues.push(data); |
88 | }); | 135 | }); |
136 | + | ||
89 | treeData.value = treeValues; | 137 | treeData.value = treeValues; |
90 | } | 138 | } |
91 | - if (data.record) { | ||
92 | - // 通过角色id去获取角色对应的菜单的ids | ||
93 | - roleMenus.value = await getMenusIdsByRoleId(data.record.id); | ||
94 | - console.log(roleMenus.value, 'roleMenus.value'); | ||
95 | - // TODO: 角色回显问题:待解决 | ||
96 | - roleId.value = data.record.id; | ||
97 | - } | ||
98 | - isUpdate.value = !!data?.isUpdate; | 139 | + |
99 | if (unref(isUpdate)) { | 140 | if (unref(isUpdate)) { |
141 | + if (data.record) { | ||
142 | + // // 通过角色id去获取角色对应的菜单的ids | ||
143 | + | ||
144 | + roleMenus.value = await getMenusIdsByRoleId(data.record.id); | ||
145 | + | ||
146 | + console.log(roleMenus.value); | ||
147 | + | ||
148 | + console.log(treeData.value); | ||
149 | + | ||
150 | + treeData.value.map((m) => { | ||
151 | + roleMenus.value.map((m1) => { | ||
152 | + if (m.key === m1) { | ||
153 | + useChildrenIdsRemoveParentId(m1, roleMenus.value); | ||
154 | + } | ||
155 | + }); | ||
156 | + }); | ||
157 | + | ||
158 | + console.log(roleMenus.value); | ||
159 | + | ||
160 | + proxy.$refs.tree.setCheckedKeys(roleMenus.value); | ||
161 | + | ||
162 | + // console.log(roleMenus.value, 'roleMenus.value'); | ||
163 | + | ||
164 | + roleId.value = data.record.id; | ||
165 | + } | ||
166 | + | ||
100 | setFieldsValue({ | 167 | setFieldsValue({ |
101 | ...data.record, | 168 | ...data.record, |
102 | }); | 169 | }); |
@@ -108,38 +175,59 @@ | @@ -108,38 +175,59 @@ | ||
108 | async function handleSubmit() { | 175 | async function handleSubmit() { |
109 | try { | 176 | try { |
110 | const values = await validate(); | 177 | const values = await validate(); |
178 | + | ||
111 | setDrawerProps({ confirmLoading: true }); | 179 | setDrawerProps({ confirmLoading: true }); |
180 | + | ||
112 | const req = { | 181 | const req = { |
113 | id: roleId.value, | 182 | id: roleId.value, |
183 | + | ||
114 | name: values.name, | 184 | name: values.name, |
185 | + | ||
115 | remark: values.remark, | 186 | remark: values.remark, |
187 | + | ||
116 | status: values.status, | 188 | status: values.status, |
189 | + | ||
117 | menu: allCheckedKeys.value as string[], | 190 | menu: allCheckedKeys.value as string[], |
118 | }; | 191 | }; |
192 | + | ||
119 | saveOrUpdateRoleInfoWithMenu(req).then(() => { | 193 | saveOrUpdateRoleInfoWithMenu(req).then(() => { |
120 | closeDrawer(); | 194 | closeDrawer(); |
195 | + | ||
121 | emit('success'); | 196 | emit('success'); |
122 | }); | 197 | }); |
123 | } finally { | 198 | } finally { |
124 | setDrawerProps({ confirmLoading: false }); | 199 | setDrawerProps({ confirmLoading: false }); |
125 | } | 200 | } |
126 | } | 201 | } |
202 | + | ||
127 | // Tree check事件 | 203 | // Tree check事件 |
204 | + | ||
128 | const handleCheckClick = (checkedKeys: string[], { halfCheckedKeys }) => { | 205 | const handleCheckClick = (checkedKeys: string[], { halfCheckedKeys }) => { |
129 | allCheckedKeys.value = [...checkedKeys, ...halfCheckedKeys]; | 206 | allCheckedKeys.value = [...checkedKeys, ...halfCheckedKeys]; |
207 | + | ||
130 | // 父节点 | 208 | // 父节点 |
209 | + | ||
131 | roleHalfCheckedKeys.value = halfCheckedKeys; | 210 | roleHalfCheckedKeys.value = halfCheckedKeys; |
132 | }; | 211 | }; |
133 | 212 | ||
134 | return { | 213 | return { |
135 | allCheckedKeys, | 214 | allCheckedKeys, |
215 | + | ||
136 | registerDrawer, | 216 | registerDrawer, |
217 | + | ||
137 | registerForm, | 218 | registerForm, |
219 | + | ||
138 | getTitle, | 220 | getTitle, |
221 | + | ||
139 | handleSubmit, | 222 | handleSubmit, |
223 | + | ||
140 | treeData, | 224 | treeData, |
225 | + | ||
141 | roleMenus, | 226 | roleMenus, |
227 | + | ||
142 | handleCheckClick, | 228 | handleCheckClick, |
229 | + | ||
230 | + useChildrenIdsRemoveParentId, | ||
143 | }; | 231 | }; |
144 | }, | 232 | }, |
145 | }); | 233 | }); |