Commit 2ef6cb196f588d42ca07805468582ac9d63630a8
Merge branch 'dev-fix-ww' into 'main_dev'
fix: 修复teambation BUG See merge request yunteng/thingskit-front!554
Showing
16 changed files
with
102 additions
and
139 deletions
@@ -3,24 +3,32 @@ import { Rule } from '/@/components/Form'; | @@ -3,24 +3,32 @@ import { Rule } from '/@/components/Form'; | ||
3 | export { default as JSONEditor } from './index.vue'; | 3 | export { default as JSONEditor } from './index.vue'; |
4 | 4 | ||
5 | export const parseStringToJSON = <T = Recordable>(value: string) => { | 5 | export const parseStringToJSON = <T = Recordable>(value: string) => { |
6 | + let valid = false; | ||
6 | try { | 7 | try { |
7 | const json = JSON.parse(value) as T; | 8 | const json = JSON.parse(value) as T; |
8 | - return { json, valid: true }; | 9 | + typeof json === 'object' ? (valid = true) : (valid = false); |
10 | + return { json, valid }; | ||
9 | } catch (error) { | 11 | } catch (error) { |
10 | - return { json: null, valid: false }; | 12 | + return { json: null, valid }; |
11 | } | 13 | } |
12 | }; | 14 | }; |
13 | 15 | ||
14 | -export const JSONEditorValidator = (message = 'json格式校验失败'): Rule[] => { | 16 | +export const JSONEditorValidator = ( |
17 | + message = 'JSON格式校验失败', | ||
18 | + noEmpty = false, | ||
19 | + emptyMessage = 'JSON不能为空对象' | ||
20 | +): Rule[] => { | ||
15 | return [ | 21 | return [ |
16 | { | 22 | { |
17 | validateTrigger: 'blur', | 23 | validateTrigger: 'blur', |
18 | validator(_rule: Rule, value: any, _callback: Fn) { | 24 | validator(_rule: Rule, value: any, _callback: Fn) { |
19 | - const { valid } = parseStringToJSON(value); | 25 | + const { valid, json } = parseStringToJSON(value); |
20 | if (valid) { | 26 | if (valid) { |
27 | + if (noEmpty && json && !Object.keys(json).length) return Promise.reject(emptyMessage); | ||
21 | return Promise.resolve(); | 28 | return Promise.resolve(); |
29 | + } else { | ||
30 | + return Promise.reject(message); | ||
22 | } | 31 | } |
23 | - return Promise.reject(message); | ||
24 | }, | 32 | }, |
25 | }, | 33 | }, |
26 | ]; | 34 | ]; |
@@ -18,6 +18,7 @@ | @@ -18,6 +18,7 @@ | ||
18 | defineProps<{ | 18 | defineProps<{ |
19 | value?: string; | 19 | value?: string; |
20 | options?: JSONEditorOptions; | 20 | options?: JSONEditorOptions; |
21 | + height?: number; | ||
21 | }>(), | 22 | }>(), |
22 | { | 23 | { |
23 | options: () => | 24 | options: () => |
@@ -26,6 +27,7 @@ | @@ -26,6 +27,7 @@ | ||
26 | mainMenuBar: false, | 27 | mainMenuBar: false, |
27 | statusBar: false, | 28 | statusBar: false, |
28 | } as JSONEditorOptions), | 29 | } as JSONEditorOptions), |
30 | + height: 150, | ||
29 | } | 31 | } |
30 | ); | 32 | ); |
31 | 33 | ||
@@ -106,7 +108,7 @@ | @@ -106,7 +108,7 @@ | ||
106 | </script> | 108 | </script> |
107 | 109 | ||
108 | <template> | 110 | <template> |
109 | - <div class="p-2 bg-gray-200"> | 111 | + <div class="p-2 bg-gray-200" :style="{ height: `${height - 16}px` }"> |
110 | <div ref="jsonEditorElRef" class="jsoneditor"></div> | 112 | <div ref="jsonEditorElRef" class="jsoneditor"></div> |
111 | </div> | 113 | </div> |
112 | </template> | 114 | </template> |
1 | <script setup lang="ts"> | 1 | <script setup lang="ts"> |
2 | import { List, Card, Button, PaginationProps, Tooltip } from 'ant-design-vue'; | 2 | import { List, Card, Button, PaginationProps, Tooltip } from 'ant-design-vue'; |
3 | import { ReloadOutlined } from '@ant-design/icons-vue'; | 3 | import { ReloadOutlined } from '@ant-design/icons-vue'; |
4 | - import { onMounted, reactive, ref, unref } from 'vue'; | 4 | + import { computed, onMounted, reactive, ref, unref } from 'vue'; |
5 | import { OrganizationIdTree, useResetOrganizationTree } from '../common/organizationIdTree'; | 5 | import { OrganizationIdTree, useResetOrganizationTree } from '../common/organizationIdTree'; |
6 | import { | 6 | import { |
7 | bigScreenCancelPublish, | 7 | bigScreenCancelPublish, |
@@ -30,6 +30,8 @@ | @@ -30,6 +30,8 @@ | ||
30 | import { ViewTypeNameEnum } from '../common/ShareModal/config'; | 30 | import { ViewTypeNameEnum } from '../common/ShareModal/config'; |
31 | import { useCopyToClipboard } from '/@/hooks/web/useCopyToClipboard'; | 31 | import { useCopyToClipboard } from '/@/hooks/web/useCopyToClipboard'; |
32 | import { ViewType } from '../visual/board/config/panelDetail'; | 32 | import { ViewType } from '../visual/board/config/panelDetail'; |
33 | + import { useUserStore } from '/@/store/modules/user'; | ||
34 | + import { RoleEnum } from '/@/enums/roleEnum'; | ||
33 | 35 | ||
34 | const listColumn = ref(5); | 36 | const listColumn = ref(5); |
35 | 37 | ||
@@ -173,6 +175,11 @@ | @@ -173,6 +175,11 @@ | ||
173 | return `${origin}${largeDesignerPrefix}/#/share/preview/${record.id}/${record.publicId}`; | 175 | return `${origin}${largeDesignerPrefix}/#/share/preview/${record.id}/${record.publicId}`; |
174 | }; | 176 | }; |
175 | 177 | ||
178 | + const userStore = useUserStore(); | ||
179 | + const hasPublicInterfacePermission = computed(() => { | ||
180 | + return userStore.getUserInfo.roles![0] !== RoleEnum.CUSTOMER_USER; | ||
181 | + }); | ||
182 | + | ||
176 | const { clipboardRef, isSuccessRef } = useCopyToClipboard(); | 183 | const { clipboardRef, isSuccessRef } = useCopyToClipboard(); |
177 | const handleCreateShareUrl = (record: BigScreenCenterItemsModel) => { | 184 | const handleCreateShareUrl = (record: BigScreenCenterItemsModel) => { |
178 | clipboardRef.value = createShareUrl(record); | 185 | clipboardRef.value = createShareUrl(record); |
@@ -214,7 +221,7 @@ | @@ -214,7 +221,7 @@ | ||
214 | <Authority :value="ConfigurationPermission.CREATE"> | 221 | <Authority :value="ConfigurationPermission.CREATE"> |
215 | <Button type="primary" @click="handleCreateOrUpdate()">新增大屏</Button> | 222 | <Button type="primary" @click="handleCreateOrUpdate()">新增大屏</Button> |
216 | </Authority> | 223 | </Authority> |
217 | - <Authority :value="ConfigurationPermission.CREATE"> | 224 | + <Authority v-if="hasPublicInterfacePermission" :value="ConfigurationPermission.CREATE"> |
218 | <Button type="primary" @click="handleCreateOrUpdatePublicApi()">公共接口管理</Button> | 225 | <Button type="primary" @click="handleCreateOrUpdatePublicApi()">公共接口管理</Button> |
219 | </Authority> | 226 | </Authority> |
220 | <CardLayoutButton v-model:value="listColumn" @change="handleCardLayoutChange" /> | 227 | <CardLayoutButton v-model:value="listColumn" @change="handleCardLayoutChange" /> |
1 | -import { FormSchema } from '/@/components/Form'; | 1 | +import { FormSchema, useComponentRegister } from '/@/components/Form'; |
2 | import { findDictItemByCode } from '/@/api/system/dict'; | 2 | import { findDictItemByCode } from '/@/api/system/dict'; |
3 | import { deviceProfile, getGatewayDevice } from '/@/api/device/deviceManager'; | 3 | import { deviceProfile, getGatewayDevice } from '/@/api/device/deviceManager'; |
4 | import { TransportTypeEnum } from '../../profiles/components/TransportDescript/const'; | 4 | import { TransportTypeEnum } from '../../profiles/components/TransportDescript/const'; |
5 | +import { JSONEditorValidator } from '/@/components/CodeEditor/src/JSONEditor'; | ||
6 | +import { JSONEditor } from '/@/components/CodeEditor'; | ||
7 | +useComponentRegister('JSONEditor', JSONEditor); | ||
5 | 8 | ||
6 | export enum TypeEnum { | 9 | export enum TypeEnum { |
7 | IS_GATEWAY = 'GATEWAY', | 10 | IS_GATEWAY = 'GATEWAY', |
@@ -751,6 +754,7 @@ export const CommandSchemas = (transportType: TransportTypeEnum): FormSchema[] = | @@ -751,6 +754,7 @@ export const CommandSchemas = (transportType: TransportTypeEnum): FormSchema[] = | ||
751 | minRows: 6, | 754 | minRows: 6, |
752 | }, | 755 | }, |
753 | }, | 756 | }, |
757 | + colProps: { span: 20 }, | ||
754 | dynamicRules: () => { | 758 | dynamicRules: () => { |
755 | return [ | 759 | return [ |
756 | { | 760 | { |
@@ -770,11 +774,17 @@ export const CommandSchemas = (transportType: TransportTypeEnum): FormSchema[] = | @@ -770,11 +774,17 @@ export const CommandSchemas = (transportType: TransportTypeEnum): FormSchema[] = | ||
770 | { | 774 | { |
771 | field: 'commandValue', | 775 | field: 'commandValue', |
772 | label: '请输入命令内容', | 776 | label: '请输入命令内容', |
773 | - slot: 'commandSlot', | ||
774 | - component: 'InputTextArea', | ||
775 | - show: ({ model }) => { | 777 | + component: 'JSONEditor', |
778 | + colProps: { span: 20 }, | ||
779 | + changeEvent: 'update:value', | ||
780 | + valueField: 'value', | ||
781 | + rules: [...JSONEditorValidator()], | ||
782 | + ifShow: ({ model }) => { | ||
776 | return model['valueType'] === 'json'; | 783 | return model['valueType'] === 'json'; |
777 | }, | 784 | }, |
785 | + componentProps: { | ||
786 | + height: 250, | ||
787 | + }, | ||
778 | }, | 788 | }, |
779 | ]; | 789 | ]; |
780 | }; | 790 | }; |
1 | <template> | 1 | <template> |
2 | - <div style="background-color: #f0f2f5"> | 2 | + <div class="bg-neutral-100 dark:text-gray-300 dark:bg-dark-700"> |
3 | <BasicTable @register="registerTable"> | 3 | <BasicTable @register="registerTable"> |
4 | <template #action="{ record }"> | 4 | <template #action="{ record }"> |
5 | <TableAction | 5 | <TableAction |
1 | <template> | 1 | <template> |
2 | - <div style="background-color: #f0f2f5"> | 2 | + <div class="bg-neutral-100 dark:text-gray-300 dark:bg-dark-700"> |
3 | <BasicTable @register="registerTable"> | 3 | <BasicTable @register="registerTable"> |
4 | <template #tbDeviceName="{ record }"> | 4 | <template #tbDeviceName="{ record }"> |
5 | <div style="color: #619eff" class="cursor-pointer" @click="handleGetTbDeviceId(record)"> | 5 | <div style="color: #619eff" class="cursor-pointer" @click="handleGetTbDeviceId(record)"> |
1 | <template> | 1 | <template> |
2 | <div class="tabs-detail"> | 2 | <div class="tabs-detail"> |
3 | - <div class="mt-4"> | ||
4 | - <BasicForm @register="registerForm"> | ||
5 | - <template #commandSlot> | ||
6 | - <div class="flex"> | ||
7 | - <div ref="jsoneditorRef" style="height: 100%; width: 100%"></div> | ||
8 | - <a-button style="margin: -5px 0" type="text" @click="handlePremitter">格式化</a-button> | ||
9 | - <Tooltip title='{"method":"methodThingskit","params":{"pin":7,"value":1}}' class="ml-2"> | ||
10 | - <QuestionCircleOutlined style="font-size: 1rem" /> | ||
11 | - </Tooltip> | ||
12 | - </div> | ||
13 | - </template> | ||
14 | - </BasicForm> | ||
15 | - <Space class="w-full justify-end" justify="end"> | ||
16 | - <Button :disabled="disable" type="primary" @click="handleOk" class="mr-2">确定</Button> | 3 | + <div> |
4 | + <BasicForm @register="registerForm" /> | ||
5 | + <Space class="w-full justify-end py-2" justify="end"> | ||
6 | + <Button :loading="loading" type="primary" @click="handleOk" class="mr-2">确定</Button> | ||
17 | <Button type="default" @click="handleCancel" class="mr-2">重置</Button> | 7 | <Button type="default" @click="handleCancel" class="mr-2">重置</Button> |
18 | </Space> | 8 | </Space> |
19 | </div> | 9 | </div> |
20 | </div> | 10 | </div> |
21 | </template> | 11 | </template> |
22 | <script lang="ts"> | 12 | <script lang="ts"> |
23 | - import { defineComponent, ref, onMounted, unref, nextTick } from 'vue'; | 13 | + import { defineComponent, ref } from 'vue'; |
24 | import { BasicForm, useForm } from '/@/components/Form'; | 14 | import { BasicForm, useForm } from '/@/components/Form'; |
25 | import { CommandSchemas } from '../../config/data'; | 15 | import { CommandSchemas } from '../../config/data'; |
26 | import { commandIssuanceApi } from '/@/api/device/deviceManager'; | 16 | import { commandIssuanceApi } from '/@/api/device/deviceManager'; |
27 | import { useMessage } from '/@/hooks/web/useMessage'; | 17 | import { useMessage } from '/@/hooks/web/useMessage'; |
28 | import { Button } from '/@/components/Button'; | 18 | import { Button } from '/@/components/Button'; |
29 | - import jsoneditor from 'jsoneditor'; | ||
30 | - import 'jsoneditor/dist/jsoneditor.min.css'; | ||
31 | - import { QuestionCircleOutlined } from '@ant-design/icons-vue'; | ||
32 | - import { Space, Tooltip } from 'ant-design-vue'; | 19 | + import { Space } from 'ant-design-vue'; |
33 | import { DeviceRecord } from '/@/api/device/model/deviceModel'; | 20 | import { DeviceRecord } from '/@/api/device/model/deviceModel'; |
34 | import { TransportTypeEnum } from '../../../profiles/components/TransportDescript/const'; | 21 | import { TransportTypeEnum } from '../../../profiles/components/TransportDescript/const'; |
35 | - | ||
36 | - interface CommandParams { | ||
37 | - additionalInfo: Recordable; | ||
38 | - cmdType: string; | ||
39 | - method: string; | ||
40 | - params: string | Recordable; | ||
41 | - persistent: boolean; | ||
42 | - } | 22 | + import { parseStringToJSON } from '/@/components/CodeEditor/src/JSONEditor'; |
43 | 23 | ||
44 | export default defineComponent({ | 24 | export default defineComponent({ |
45 | - components: { BasicForm, Button, QuestionCircleOutlined, Tooltip, Space }, | 25 | + components: { BasicForm, Button, Space }, |
46 | props: { | 26 | props: { |
47 | deviceDetail: { | 27 | deviceDetail: { |
48 | type: Object as PropType<DeviceRecord>, | 28 | type: Object as PropType<DeviceRecord>, |
@@ -52,8 +32,7 @@ | @@ -52,8 +32,7 @@ | ||
52 | emits: ['register'], | 32 | emits: ['register'], |
53 | setup(props) { | 33 | setup(props) { |
54 | const { createMessage } = useMessage(); | 34 | const { createMessage } = useMessage(); |
55 | - const jsonData = ref<CommandParams>({} as unknown as CommandParams); | ||
56 | - const disable = ref(false); | 35 | + const loading = ref(false); |
57 | 36 | ||
58 | const [registerForm, { getFieldsValue, validate, resetFields }] = useForm({ | 37 | const [registerForm, { getFieldsValue, validate, resetFields }] = useForm({ |
59 | labelWidth: 120, | 38 | labelWidth: 120, |
@@ -63,78 +42,35 @@ | @@ -63,78 +42,35 @@ | ||
63 | labelAlign: 'right', | 42 | labelAlign: 'right', |
64 | showSubmitButton: false, | 43 | showSubmitButton: false, |
65 | showResetButton: false, | 44 | showResetButton: false, |
66 | - wrapperCol: { | ||
67 | - span: 12, | ||
68 | - }, | ||
69 | }); | 45 | }); |
70 | - // json 以及初始化JSON | ||
71 | - const jsoneditorRef = ref(); | ||
72 | - const jsonValue = ref({}); | ||
73 | - const jsonInstance = ref(); | ||
74 | - onMounted(() => { | ||
75 | - nextTick(() => { | ||
76 | - let options = { | ||
77 | - mode: 'code', | ||
78 | - mainMenuBar: false, | ||
79 | - statusBar: false, | ||
80 | - }; | ||
81 | - let editor = new jsoneditor(jsoneditorRef.value, options); | ||
82 | - editor.set(jsonValue.value); | ||
83 | - jsonInstance.value = editor; | ||
84 | - }); | ||
85 | - }); | ||
86 | - const handlePremitter = () => { | ||
87 | - const value = unref(jsonInstance).get(); | ||
88 | - if (!value) return; | ||
89 | - return unref(jsonInstance).set(value); | ||
90 | - }; | 46 | + |
91 | const handleCancel = () => { | 47 | const handleCancel = () => { |
92 | resetFields(); | 48 | resetFields(); |
93 | - unref(jsonInstance).set({}); | ||
94 | }; | 49 | }; |
50 | + | ||
95 | const handleOk = async () => { | 51 | const handleOk = async () => { |
96 | - disable.value = true; | 52 | + loading.value = true; |
97 | try { | 53 | try { |
98 | // 验证 | 54 | // 验证 |
99 | const valid = await validate(); | 55 | const valid = await validate(); |
100 | if (!valid) return; | 56 | if (!valid) return; |
101 | // 收集表单数据 | 57 | // 收集表单数据 |
102 | const field = getFieldsValue(); | 58 | const field = getFieldsValue(); |
103 | - let passStatus = false; | 59 | + let command = { |
60 | + persistent: true, | ||
61 | + method: 'methodThingskit', | ||
62 | + params: field.commandText, | ||
63 | + }; | ||
104 | if (field.valueType === 'json') { | 64 | if (field.valueType === 'json') { |
105 | - const getJson = unref(jsonInstance).get(); | ||
106 | - if (Object.prototype.isPrototypeOf(getJson) && Object.keys(getJson).length === 0) { | ||
107 | - createMessage.error('命令内容不能为空'); | ||
108 | - passStatus = true; | ||
109 | - } | ||
110 | - if (getJson === '') { | ||
111 | - passStatus = true; | ||
112 | - createMessage.error('命令内容不能为空'); | ||
113 | - } | ||
114 | - jsonData.value.params = getJson; | ||
115 | - } else { | ||
116 | - jsonData.value.params = field.commandText; | ||
117 | - if (!jsonData.value.params) { | ||
118 | - createMessage.error('命令内容不能为空'); | ||
119 | - passStatus = true; | ||
120 | - } | ||
121 | - if ( | ||
122 | - jsonData.value.params == '""' || | ||
123 | - jsonData.value.params == "''" || | ||
124 | - jsonData.value.params == '“”' | ||
125 | - ) { | ||
126 | - createMessage.error('命令内容不能为空'); | ||
127 | - passStatus = true; | ||
128 | - } | 65 | + const { json } = parseStringToJSON(field.commandValue); |
66 | + command.params = json; | ||
129 | } | 67 | } |
130 | - jsonData.value.persistent = true; | ||
131 | - jsonData.value.method = 'methodThingskit'; | ||
132 | - if (passStatus) return; | ||
133 | - commandIssuanceApi(field.commandType, props.deviceDetail.tbDeviceId, jsonData.value) | 68 | + |
69 | + commandIssuanceApi(field.commandType, props.deviceDetail.tbDeviceId, command) | ||
134 | .then((res) => { | 70 | .then((res) => { |
135 | if (!res) return; | 71 | if (!res) return; |
136 | createMessage.success('命令下发成功'); | 72 | createMessage.success('命令下发成功'); |
137 | - disable.value = true; | 73 | + loading.value = true; |
138 | // 请求 | 74 | // 请求 |
139 | handleCancel(); | 75 | handleCancel(); |
140 | }) | 76 | }) |
@@ -146,25 +82,20 @@ | @@ -146,25 +82,20 @@ | ||
146 | }) | 82 | }) |
147 | .finally(() => { | 83 | .finally(() => { |
148 | setTimeout(() => { | 84 | setTimeout(() => { |
149 | - disable.value = false; | 85 | + loading.value = false; |
150 | }, 300); | 86 | }, 300); |
151 | }); | 87 | }); |
152 | } catch (e) { | 88 | } catch (e) { |
89 | + throw e; | ||
153 | } finally { | 90 | } finally { |
154 | - //这里捕获json插件的错误 | ||
155 | - disable.value = false; | 91 | + loading.value = false; |
156 | } | 92 | } |
157 | }; | 93 | }; |
158 | return { | 94 | return { |
159 | registerForm, | 95 | registerForm, |
160 | handleCancel, | 96 | handleCancel, |
161 | handleOk, | 97 | handleOk, |
162 | - disable, | ||
163 | - jsonData, | ||
164 | - jsoneditorRef, | ||
165 | - jsonValue, | ||
166 | - jsonInstance, | ||
167 | - handlePremitter, | 98 | + loading, |
168 | }; | 99 | }; |
169 | }, | 100 | }, |
170 | }); | 101 | }); |
@@ -53,7 +53,7 @@ | @@ -53,7 +53,7 @@ | ||
53 | </script> | 53 | </script> |
54 | 54 | ||
55 | <template> | 55 | <template> |
56 | - <BasicTable class="event-manage-table" @register="register"> | 56 | + <BasicTable class="bg-neutral-100 dark:text-gray-300 dark:bg-dark-700" @register="register"> |
57 | <template #outputParams="{ record }"> | 57 | <template #outputParams="{ record }"> |
58 | <span class="cursor-pointer text-blue-500" @click="handleViewDetail(record)"> | 58 | <span class="cursor-pointer text-blue-500" @click="handleViewDetail(record)"> |
59 | <EyeOutlined class="svg:text-blue-500" /> | 59 | <EyeOutlined class="svg:text-blue-500" /> |
@@ -65,9 +65,3 @@ | @@ -65,9 +65,3 @@ | ||
65 | <Input.TextArea v-model:value="outputData" :autosize="true" /> | 65 | <Input.TextArea v-model:value="outputData" :autosize="true" /> |
66 | </BasicModal> | 66 | </BasicModal> |
67 | </template> | 67 | </template> |
68 | - | ||
69 | -<style lang="less" scoped> | ||
70 | - .event-manage-table { | ||
71 | - background-color: #f0f2f5; | ||
72 | - } | ||
73 | -</style> |
@@ -230,15 +230,16 @@ | @@ -230,15 +230,16 @@ | ||
230 | <template> | 230 | <template> |
231 | <PageWrapper | 231 | <PageWrapper |
232 | dense | 232 | dense |
233 | - content-class="flex flex-col bg-transparent p-4" | ||
234 | - :content-style="{ backgroundColor: '#F0F2F5' }" | 233 | + content-class="flex flex-col bg-transparent p-4 bg-neutral-100 dark:text-gray-300 dark:bg-dark-700" |
235 | > | 234 | > |
236 | - <section class="flex flex-col justify-between w-full bg-light-50 pt-3 mb-4"> | 235 | + <section |
236 | + class="flex flex-col justify-between w-full bg-light-50 pt-3 mb-4 dark:text-gray-300 dark:bg-dark-900" | ||
237 | + > | ||
237 | <div class="flex-auto"> | 238 | <div class="flex-auto"> |
238 | <BasicForm @register="registerForm" /> | 239 | <BasicForm @register="registerForm" /> |
239 | </div> | 240 | </div> |
240 | </section> | 241 | </section> |
241 | - <section class="bg-light-50"> | 242 | + <section class="bg-light-50 !dark:text-gray-300 !dark:bg-dark-900"> |
242 | <div | 243 | <div |
243 | v-show="mode === EnumTableCardMode.CARD" | 244 | v-show="mode === EnumTableCardMode.CARD" |
244 | class="flex h-70px items-center justify-end p-2" | 245 | class="flex h-70px items-center justify-end p-2" |
@@ -102,7 +102,9 @@ | @@ -102,7 +102,9 @@ | ||
102 | </script> | 102 | </script> |
103 | 103 | ||
104 | <template> | 104 | <template> |
105 | - <PageWrapper class="bg-gray-100 device-task-list-container"> | 105 | + <PageWrapper |
106 | + class="bg-neutral-100 dark:text-gray-300 dark:bg-dark-700 device-task-list-container" | ||
107 | + > | ||
106 | <section | 108 | <section |
107 | class="form-container bg-light-50 px-4 pt-4 mt-4 x dark:text-gray-300 dark:bg-dark-900" | 109 | class="form-container bg-light-50 px-4 pt-4 mt-4 x dark:text-gray-300 dark:bg-dark-900" |
108 | > | 110 | > |
1 | <template> | 1 | <template> |
2 | - <BasicTable class="command-record-table" @register="registerTable"> | 2 | + <BasicTable |
3 | + class="bg-neutral-100 dark:text-gray-300 dark:bg-dark-700 p-4" | ||
4 | + @register="registerTable" | ||
5 | + > | ||
3 | <template #toolbar> | 6 | <template #toolbar> |
4 | <Space> | 7 | <Space> |
5 | <Button type="primary" @click="openModal(true)">命令下发</Button> | 8 | <Button type="primary" @click="openModal(true)">命令下发</Button> |
@@ -21,11 +24,11 @@ | @@ -21,11 +24,11 @@ | ||
21 | 24 | ||
22 | <BasicModal | 25 | <BasicModal |
23 | @register="registerCommandIssuanceModal" | 26 | @register="registerCommandIssuanceModal" |
24 | - width="600px" | 27 | + width="700px" |
25 | title="命令下发" | 28 | title="命令下发" |
26 | :showOkBtn="false" | 29 | :showOkBtn="false" |
27 | cancelText="关闭" | 30 | cancelText="关闭" |
28 | - :footer="h('div')" | 31 | + :footer="null" |
29 | > | 32 | > |
30 | <CommandIssuance :deviceDetail="deviceDetail" /> | 33 | <CommandIssuance :deviceDetail="deviceDetail" /> |
31 | </BasicModal> | 34 | </BasicModal> |
@@ -91,10 +94,3 @@ | @@ -91,10 +94,3 @@ | ||
91 | commonModalInfo('响应内容', jsonParams); | 94 | commonModalInfo('响应内容', jsonParams); |
92 | }; | 95 | }; |
93 | </script> | 96 | </script> |
94 | - | ||
95 | -<style lang="less" scoped> | ||
96 | - .command-record-table { | ||
97 | - background-color: #f0f2f5; | ||
98 | - padding: 16px; | ||
99 | - } | ||
100 | -</style> |
@@ -151,7 +151,7 @@ | @@ -151,7 +151,7 @@ | ||
151 | </Tabs> | 151 | </Tabs> |
152 | <template #footer> | 152 | <template #footer> |
153 | <div | 153 | <div |
154 | - class="absolute right-0 bottom-0 w-full border-t bg-light-50 border-t-gray-100 py-2 px-4 text-right" | 154 | + class="absolute right-0 bottom-0 w-full border-t bg-light-50 dark:text-gray-300 dark:bg-dark-700 dark:border-t-gray-700 border-t-gray-100 py-2 px-4 text-right" |
155 | > | 155 | > |
156 | <Button class="mr-2" @click="closeDrawer">取消</Button> | 156 | <Button class="mr-2" @click="closeDrawer">取消</Button> |
157 | <Authority :value="OtaPermissionKey.UPDATE"> | 157 | <Authority :value="OtaPermissionKey.UPDATE"> |
@@ -193,7 +193,11 @@ | @@ -193,7 +193,11 @@ | ||
193 | const userStore = useUserStore(); | 193 | const userStore = useUserStore(); |
194 | 194 | ||
195 | const permissionStore = usePermissionStore(); | 195 | const permissionStore = usePermissionStore(); |
196 | - async function handleLoginCustomAdmin(record: { tbUser: string; id: string }) { | 196 | + async function handleLoginCustomAdmin(record: { |
197 | + tbUser: string; | ||
198 | + id: string; | ||
199 | + hasPassword: boolean; | ||
200 | + }) { | ||
197 | try { | 201 | try { |
198 | const { token, refreshToken } = await getUserToken(record.id); | 202 | const { token, refreshToken } = await getUserToken(record.id); |
199 | userStore.storeToken(token, refreshToken); | 203 | userStore.storeToken(token, refreshToken); |
@@ -208,7 +212,7 @@ | @@ -208,7 +212,7 @@ | ||
208 | }); | 212 | }); |
209 | router.addRoute(PAGE_NOT_FOUND_ROUTE as unknown as RouteRecordRaw); | 213 | router.addRoute(PAGE_NOT_FOUND_ROUTE as unknown as RouteRecordRaw); |
210 | permissionStore.setDynamicAddedRoute(true); | 214 | permissionStore.setDynamicAddedRoute(true); |
211 | - go(PageEnum.BASE_HOME); | 215 | + record.hasPassword ? go(PageEnum.BASE_HOME) : go(PageEnum.SYSTEM_PASSWORD); |
212 | } catch (error) { | 216 | } catch (error) { |
213 | } finally { | 217 | } finally { |
214 | } | 218 | } |
@@ -161,18 +161,21 @@ | @@ -161,18 +161,21 @@ | ||
161 | api: async () => { | 161 | api: async () => { |
162 | try { | 162 | try { |
163 | if (!organizationId) return []; | 163 | if (!organizationId) return []; |
164 | - return await getMeetTheConditionsDevice({ | 164 | + const result = await getMeetTheConditionsDevice({ |
165 | deviceProfileId, | 165 | deviceProfileId, |
166 | deviceType, | 166 | deviceType, |
167 | organizationId, | 167 | organizationId, |
168 | }); | 168 | }); |
169 | + return result.map((item) => ({ | ||
170 | + ...item, | ||
171 | + value: item.tbDeviceId, | ||
172 | + label: item.alias || item.name, | ||
173 | + })); | ||
169 | } catch (error) { | 174 | } catch (error) { |
170 | return []; | 175 | return []; |
171 | } | 176 | } |
172 | }, | 177 | }, |
173 | mode: props.multiple ? 'multiple' : 'combobox', | 178 | mode: props.multiple ? 'multiple' : 'combobox', |
174 | - labelField: 'name', | ||
175 | - valueField: 'tbDeviceId', | ||
176 | placeholder: '请选择设备', | 179 | placeholder: '请选择设备', |
177 | maxTagCount: 3, | 180 | maxTagCount: 3, |
178 | maxTagTextLength: 4, | 181 | maxTagTextLength: 4, |
@@ -118,7 +118,7 @@ | @@ -118,7 +118,7 @@ | ||
118 | <template> | 118 | <template> |
119 | <PageWrapper class="task-center-container"> | 119 | <PageWrapper class="task-center-container"> |
120 | <section | 120 | <section |
121 | - class="bg-light-50 flex p-4 justify-between items-center x dark:text-gray-300 dark:bg-dark-900" | 121 | + class="bg-light-50 flex p-4 justify-between items-center dark:text-gray-300 dark:bg-dark-900" |
122 | > | 122 | > |
123 | <div class="text-2xl">任务中心</div> | 123 | <div class="text-2xl">任务中心</div> |
124 | <Authority :value="PermissionEnum.CREATE"> | 124 | <Authority :value="PermissionEnum.CREATE"> |
@@ -333,7 +333,12 @@ | @@ -333,7 +333,12 @@ | ||
333 | <h3 class="w-24 flex-shrink-0 text-right pr-2 my-4">选择数据源</h3> | 333 | <h3 class="w-24 flex-shrink-0 text-right pr-2 my-4">选择数据源</h3> |
334 | 334 | ||
335 | <section ref="formListEl"> | 335 | <section ref="formListEl"> |
336 | - <div v-for="item in dataSource" :data-id="item.id" :key="item.id" class="flex bg-light-50"> | 336 | + <div |
337 | + v-for="item in dataSource" | ||
338 | + :data-id="item.id" | ||
339 | + :key="item.id" | ||
340 | + class="flex bg-neutral-100 dark:text-gray-300 dark:bg-dark-700" | ||
341 | + > | ||
337 | <div class="w-24 text-right flex justify-end" style="flex: 0 0 96px"> 选择设备 </div> | 342 | <div class="w-24 text-right flex justify-end" style="flex: 0 0 96px"> 选择设备 </div> |
338 | <div class="pl-2 flex-auto"> | 343 | <div class="pl-2 flex-auto"> |
339 | <component | 344 | <component |