Showing
9 changed files
with
99 additions
and
182 deletions
| 1 | -import BasicForm from './src/BasicForm.vue'; | |
| 1 | +export { default as BasicForm } from './src/BasicForm.vue'; | |
| 2 | 2 | |
| 3 | 3 | export * from './src/types/form'; |
| 4 | 4 | export * from './src/types/formItem'; |
| ... | ... | @@ -22,4 +22,4 @@ export { |
| 22 | 22 | } from '/@/components/Form/src/externalCompns/components/JEasyCron'; |
| 23 | 23 | // Jeecg自定义校验 |
| 24 | 24 | export { JCronValidator } from '/@/components/Form/src/externalCompns/components/JEasyCron'; |
| 25 | -export { BasicForm }; | |
| 25 | +// export { BasicForm }; | ... | ... |
| ... | ... | @@ -38,9 +38,6 @@ import ApiSearchSelect from './components/ApiSearchSelect.vue'; |
| 38 | 38 | import CustomMinMaxInput from './externalCompns/components/CustomMinMaxInput.vue'; |
| 39 | 39 | import StructForm from './externalCompns/components/StructForm/StructForm.vue'; |
| 40 | 40 | import ApiSelectScrollLoad from './components/ApiSelectScrollLoad.vue'; |
| 41 | -import TransferModal from './components/TransferModal.vue'; | |
| 42 | -import TransferTableModal from './components/TransferTableModal.vue'; | |
| 43 | -import ObjectModelValidateForm from './externalCompns/components/ObjectModelValidateForm/ObjectModelValidateForm.vue'; | |
| 44 | 41 | |
| 45 | 42 | const componentMap = new Map<ComponentType, Component>(); |
| 46 | 43 | |
| ... | ... | @@ -86,9 +83,6 @@ componentMap.set('ApiSearchSelect', ApiSearchSelect); |
| 86 | 83 | componentMap.set('CustomMinMaxInput', CustomMinMaxInput); |
| 87 | 84 | componentMap.set('StructForm', StructForm); |
| 88 | 85 | componentMap.set('ApiSelectScrollLoad', ApiSelectScrollLoad); |
| 89 | -componentMap.set('TransferModal', TransferModal); | |
| 90 | -componentMap.set('TransferTableModal', TransferTableModal); | |
| 91 | -componentMap.set('ObjectModelValidateForm', ObjectModelValidateForm); | |
| 92 | 86 | |
| 93 | 87 | export function add(compName: ComponentType, component: Component) { |
| 94 | 88 | componentMap.set(compName, component); | ... | ... |
| ... | ... | @@ -150,7 +150,7 @@ |
| 150 | 150 | |
| 151 | 151 | const getIsFixed = computed(() => { |
| 152 | 152 | /* eslint-disable-next-line */ |
| 153 | - mixSideHasChildren.value = unref(childrenMenus).length > 0;interfaceDisplay | |
| 153 | + mixSideHasChildren.value = unref(childrenMenus).length > 0; | |
| 154 | 154 | const isFixed = unref(getMixSideFixed) && unref(mixSideHasChildren); |
| 155 | 155 | if (isFixed) { |
| 156 | 156 | /* eslint-disable-next-line */ | ... | ... |
| ... | ... | @@ -120,7 +120,7 @@ export class VAxios { |
| 120 | 120 | if (userStore && userStore.jwtToken) { |
| 121 | 121 | try { |
| 122 | 122 | const res = jwt_decode(userStore.jwtToken) as JwtModel; |
| 123 | - const currentTime = new Date().getTime() / 1000; | |
| 123 | + const currentTime = (new Date().getTime() + (config.timeout || 0)) / 1000; | |
| 124 | 124 | if (currentTime >= res.exp && this.isNeedTokenURL(config.url)) { |
| 125 | 125 | await this.refreshTokenBeforeReq(userStore.doRefresh); |
| 126 | 126 | } | ... | ... |
| ... | ... | @@ -182,7 +182,7 @@ |
| 182 | 182 | </div> |
| 183 | 183 | </template> |
| 184 | 184 | <script lang="ts"> |
| 185 | - import { defineComponent, reactive, unref, nextTick, h, onUnmounted, ref } from 'vue'; | |
| 185 | + import { defineComponent, reactive, unref, h, onMounted } from 'vue'; | |
| 186 | 186 | import { |
| 187 | 187 | DeviceModel, |
| 188 | 188 | DeviceRecord, |
| ... | ... | @@ -216,7 +216,7 @@ |
| 216 | 216 | import { useCopyToClipboard } from '/@/hooks/web/useCopyToClipboard'; |
| 217 | 217 | import { QuestionCircleOutlined } from '@ant-design/icons-vue'; |
| 218 | 218 | import { Authority } from '/@/components/Authority'; |
| 219 | - import { useRouter } from 'vue-router'; | |
| 219 | + import { useRoute, useRouter } from 'vue-router'; | |
| 220 | 220 | import { useBatchOperation } from '/@/utils/useBatchOperation'; |
| 221 | 221 | |
| 222 | 222 | export default defineComponent({ |
| ... | ... | @@ -243,7 +243,7 @@ |
| 243 | 243 | const { createMessage } = useMessage(); |
| 244 | 244 | const go = useGo(); |
| 245 | 245 | const ROUTER = useRouter(); |
| 246 | - const immediateStatus = ref(false); | |
| 246 | + const ROUTE = useRoute(); | |
| 247 | 247 | const searchInfo = reactive<Recordable>({}); |
| 248 | 248 | const { organizationIdTreeRef, resetFn } = useResetOrganizationTree(searchInfo); |
| 249 | 249 | const [registerModal, { openModal }] = useModal(); |
| ... | ... | @@ -259,9 +259,7 @@ |
| 259 | 259 | reload, |
| 260 | 260 | setLoading, |
| 261 | 261 | setSelectedRowKeys, |
| 262 | - setTableData, | |
| 263 | 262 | getForm, |
| 264 | - setPagination, | |
| 265 | 263 | getSelectRowKeys, |
| 266 | 264 | getSelectRows, |
| 267 | 265 | getRowSelection, |
| ... | ... | @@ -269,17 +267,13 @@ |
| 269 | 267 | ] = useTable({ |
| 270 | 268 | title: '设备列表', |
| 271 | 269 | api: devicePage, |
| 272 | - immediate: immediateStatus.value, | |
| 273 | 270 | columns, |
| 274 | 271 | beforeFetch: (params) => { |
| 275 | 272 | const { deviceProfileId } = params; |
| 276 | 273 | const obj = { |
| 277 | 274 | ...params, |
| 278 | 275 | ...{ |
| 279 | - deviceProfileIds: | |
| 280 | - deviceProfileId === undefined || deviceProfileId === null || deviceProfileId == '' | |
| 281 | - ? null | |
| 282 | - : [deviceProfileId], | |
| 276 | + deviceProfileIds: deviceProfileId ? [deviceProfileId] : null, | |
| 283 | 277 | }, |
| 284 | 278 | }; |
| 285 | 279 | delete obj.deviceProfileId; |
| ... | ... | @@ -313,54 +307,6 @@ |
| 313 | 307 | |
| 314 | 308 | const { isExistOption } = useBatchOperation(getRowSelection, setSelectedRowKeys); |
| 315 | 309 | |
| 316 | - function getParams(keyword) { | |
| 317 | - const reg = new RegExp('(^|&)' + keyword + '=([^&]*)(&|$)', 'i'); | |
| 318 | - const r = window.location.search.substr(1).match(reg); | |
| 319 | - if (r != null) return unescape(r[2]); | |
| 320 | - return null; //注意此处参数是中文,解码使用的方法是unescape ,那么在传值的时候如果是中文,需要使用escape('曲浩')方法来编码。 | |
| 321 | - } | |
| 322 | - | |
| 323 | - const count = ref(0); | |
| 324 | - const onCloseVal = ref(0); | |
| 325 | - const deviceProfileId = ref(''); | |
| 326 | - count.value = Number(getParams('count')); | |
| 327 | - deviceProfileId.value = getParams('deviceProfileId') || ''; | |
| 328 | - const setRowClassName = async () => { | |
| 329 | - if (deviceProfileId.value !== undefined) { | |
| 330 | - const { items, total } = await devicePage({ | |
| 331 | - page: 1, | |
| 332 | - pageSize: count.value === 0 ? 10 : count.value, | |
| 333 | - deviceProfileIds: | |
| 334 | - deviceProfileId.value === undefined || | |
| 335 | - deviceProfileId.value === null || | |
| 336 | - deviceProfileId.value == '' | |
| 337 | - ? null | |
| 338 | - : [deviceProfileId.value], | |
| 339 | - }); | |
| 340 | - setPagination({ total }); | |
| 341 | - nextTick(() => { | |
| 342 | - setTableData(items); | |
| 343 | - const { setFieldsValue, resetFields } = getForm(); | |
| 344 | - setFieldsValue({ | |
| 345 | - deviceProfileId: deviceProfileId.value || null, | |
| 346 | - }); | |
| 347 | - if (onCloseVal.value == 1) { | |
| 348 | - resetFields(); | |
| 349 | - } | |
| 350 | - }); | |
| 351 | - } else { | |
| 352 | - setTimeout(() => { | |
| 353 | - reload(); | |
| 354 | - }, 80); | |
| 355 | - } | |
| 356 | - }; | |
| 357 | - setRowClassName(); | |
| 358 | - onUnmounted(() => { | |
| 359 | - deviceProfileId.value = ''; | |
| 360 | - count.value = 10; | |
| 361 | - onCloseVal.value = 1; | |
| 362 | - }); | |
| 363 | - | |
| 364 | 310 | const userInfo: any = getAuthCache(USER_INFO_KEY); |
| 365 | 311 | const role: string = userInfo.roles[0]; |
| 366 | 312 | |
| ... | ... | @@ -494,6 +440,11 @@ |
| 494 | 440 | reload(); |
| 495 | 441 | }; |
| 496 | 442 | |
| 443 | + onMounted(() => { | |
| 444 | + const queryParams = ROUTE.query as Record<'deviceProfileId', undefined | string>; | |
| 445 | + const { setFieldsValue } = getForm(); | |
| 446 | + setFieldsValue({ deviceProfileId: queryParams.deviceProfileId }); | |
| 447 | + }); | |
| 497 | 448 | return { |
| 498 | 449 | registerTable, |
| 499 | 450 | handleCreate, | ... | ... |
| ... | ... | @@ -50,6 +50,12 @@ |
| 50 | 50 | import { postAddConvertApi } from '/@/api/datamanager/dataManagerApi'; |
| 51 | 51 | import { useMessage } from '/@/hooks/web/useMessage'; |
| 52 | 52 | import { Button } from '/@/components/Button'; |
| 53 | + import { add } from '/@/components/Form/src/componentMap'; | |
| 54 | + import TransferModal from '/@/components/Form/src/components/TransferModal.vue'; | |
| 55 | + import TransferTableModal from '/@/components/Form/src/components/TransferTableModal.vue'; | |
| 56 | + | |
| 57 | + add('TransferModal', TransferModal); | |
| 58 | + add('TransferTableModal', TransferTableModal); | |
| 53 | 59 | |
| 54 | 60 | export default defineComponent({ |
| 55 | 61 | name: 'ConfigDrawer', | ... | ... |
| ... | ... | @@ -127,6 +127,10 @@ |
| 127 | 127 | import Action from './cpns/Action.vue'; |
| 128 | 128 | import { findOperation } from './config/formatData'; |
| 129 | 129 | import { formatToDateTime } from '/@/utils/dateUtil'; |
| 130 | + import ObjectModelValidateForm from '/@/components/Form/src/externalCompns/components/ObjectModelValidateForm/ObjectModelValidateForm.vue'; | |
| 131 | + import { add } from '/@/components/Form/src/componentMap'; | |
| 132 | + | |
| 133 | + add('ObjectModelValidateForm', ObjectModelValidateForm); | |
| 130 | 134 | |
| 131 | 135 | const emit = defineEmits(['register', 'success']); |
| 132 | 136 | const provideOrgid = ref(''); | ... | ... |
| ... | ... | @@ -2,6 +2,13 @@ import type { FormSchema } from '/@/components/Form/index'; |
| 2 | 2 | import { getAreaList } from '/@/api/oem/index'; |
| 3 | 3 | import { emailRule, phoneRule } from '/@/utils/rules'; |
| 4 | 4 | |
| 5 | +export enum Level { | |
| 6 | + PROVINCE = 'PROVINCE', | |
| 7 | + CITY = 'CITY', | |
| 8 | + COUNTY = 'COUNTY', | |
| 9 | + TOWN = 'TOWN', | |
| 10 | +} | |
| 11 | + | |
| 5 | 12 | export const schemas: FormSchema[] = [ |
| 6 | 13 | { |
| 7 | 14 | field: 'name', |
| ... | ... | @@ -201,150 +208,104 @@ export const provSchemas: FormSchema[] = [ |
| 201 | 208 | colProps: { |
| 202 | 209 | span: 6, |
| 203 | 210 | }, |
| 204 | - componentProps({ formModel, formActionType }) { | |
| 205 | - const { updateSchema } = formActionType; | |
| 211 | + componentProps({ formActionType }) { | |
| 212 | + const { setFieldsValue } = formActionType; | |
| 206 | 213 | return { |
| 207 | 214 | api: getAreaList, |
| 208 | 215 | labelField: 'name', |
| 209 | 216 | valueField: 'code', |
| 210 | 217 | placeholder: '省份', |
| 211 | - params: { parentId: 1 }, | |
| 212 | - async onChange(value) { | |
| 213 | - if (value === undefined) { | |
| 214 | - formModel.nameCity = undefined; // reset city value | |
| 215 | - formModel.nameCoun = undefined; | |
| 216 | - formModel.nameTown = undefined; | |
| 217 | - updateSchema([ | |
| 218 | - { | |
| 219 | - field: 'nameCity', | |
| 220 | - componentProps: { | |
| 221 | - options: [], | |
| 222 | - placeholder: '城市', | |
| 223 | - }, | |
| 224 | - }, | |
| 225 | - { | |
| 226 | - field: 'nameCoun', | |
| 227 | - componentProps: { | |
| 228 | - options: [], | |
| 229 | - placeholder: '区/县', | |
| 230 | - }, | |
| 231 | - }, | |
| 232 | - { | |
| 233 | - field: 'nameTown', | |
| 234 | - componentProps: { | |
| 235 | - options: [], | |
| 236 | - placeholder: '城镇/街道', | |
| 237 | - }, | |
| 238 | - }, | |
| 239 | - ]); | |
| 240 | - } else { | |
| 241 | - const nameCity = await getAreaList({ parentId: value }); | |
| 242 | - nameCity.forEach((item) => { | |
| 243 | - item.label = item.name; | |
| 244 | - item.value = item.code; | |
| 245 | - }); | |
| 246 | - formModel.nameCity = undefined; // reset city value | |
| 247 | - formModel.nameCoun = undefined; | |
| 248 | - formModel.nameTown = undefined; | |
| 249 | - updateSchema({ | |
| 250 | - field: 'nameCity', | |
| 251 | - componentProps: { | |
| 252 | - options: nameCity, | |
| 253 | - placeholder: '城市', | |
| 254 | - async onChange(value) { | |
| 255 | - if (value === undefined) { | |
| 256 | - formModel.nameCoun = undefined; // reset city value | |
| 257 | - formModel.nameTown = undefined; | |
| 258 | - updateSchema([ | |
| 259 | - { | |
| 260 | - field: 'nameCoun', | |
| 261 | - componentProps: { | |
| 262 | - options: [], | |
| 263 | - }, | |
| 264 | - }, | |
| 265 | - { | |
| 266 | - field: 'nameTown', | |
| 267 | - componentProps: { | |
| 268 | - options: [], | |
| 269 | - }, | |
| 270 | - }, | |
| 271 | - ]); | |
| 272 | - } else { | |
| 273 | - // 获取区数据 | |
| 274 | - const nameCoun = await getAreaList({ parentId: value }); | |
| 275 | - nameCoun.forEach((item) => { | |
| 276 | - item.label = item.name; | |
| 277 | - item.value = item.code; | |
| 278 | - }); | |
| 279 | - updateSchema({ | |
| 280 | - field: 'nameCoun', | |
| 281 | - componentProps: { | |
| 282 | - // 请选择区 | |
| 283 | - options: nameCoun, | |
| 284 | - async onChange(value) { | |
| 285 | - if (value === undefined) { | |
| 286 | - formModel.nameTown = undefined; | |
| 287 | - updateSchema({ | |
| 288 | - field: 'nameTown', | |
| 289 | - componentProps: { | |
| 290 | - placeholder: '城镇/街道', | |
| 291 | - options: [], | |
| 292 | - }, | |
| 293 | - }); | |
| 294 | - } else { | |
| 295 | - const nameTown = await getAreaList({ parentId: value }); | |
| 296 | - nameTown.forEach((item) => { | |
| 297 | - item.label = item.name; | |
| 298 | - item.value = item.code; | |
| 299 | - }); | |
| 300 | - updateSchema({ | |
| 301 | - field: 'nameTown', | |
| 302 | - componentProps: { | |
| 303 | - placeholder: '城镇/街道', | |
| 304 | - options: nameTown, | |
| 305 | - }, | |
| 306 | - }); | |
| 307 | - } | |
| 308 | - }, | |
| 309 | - }, | |
| 310 | - }); | |
| 311 | - } | |
| 312 | - }, | |
| 313 | - }, | |
| 314 | - }); | |
| 315 | - } | |
| 218 | + params: { parentId: 1, level: Level.PROVINCE }, | |
| 219 | + onChange: () => { | |
| 220 | + setFieldsValue({ nameCity: null, nameCoun: null, nameTown: null }); | |
| 316 | 221 | }, |
| 317 | 222 | }; |
| 318 | 223 | }, |
| 319 | 224 | }, |
| 320 | 225 | { |
| 321 | 226 | field: 'nameCity', |
| 322 | - component: 'Select', | |
| 227 | + component: 'ApiSelect', | |
| 323 | 228 | label: '', |
| 324 | 229 | colProps: { |
| 325 | 230 | span: 6, |
| 326 | 231 | }, |
| 232 | + componentProps: ({ formActionType, formModel }) => { | |
| 233 | + const nameProv = Reflect.get(formModel, 'nameProv'); | |
| 234 | + const { setFieldsValue } = formActionType; | |
| 235 | + return { | |
| 236 | + api: async (params: Recordable) => { | |
| 237 | + try { | |
| 238 | + if (!nameProv) return; | |
| 239 | + const result = await getAreaList(params); | |
| 240 | + return result; | |
| 241 | + } catch (error) { | |
| 242 | + return []; | |
| 243 | + } | |
| 244 | + }, | |
| 245 | + labelField: 'name', | |
| 246 | + valueField: 'code', | |
| 247 | + placeholder: '城市', | |
| 248 | + params: { parentId: nameProv, level: Level.CITY }, | |
| 249 | + onChange: () => { | |
| 250 | + setFieldsValue({ nameCoun: null, nameTown: null }); | |
| 251 | + }, | |
| 252 | + }; | |
| 253 | + }, | |
| 327 | 254 | }, |
| 328 | 255 | { |
| 329 | 256 | field: 'nameCoun', |
| 330 | - component: 'Select', | |
| 257 | + component: 'ApiSelect', | |
| 331 | 258 | label: '', |
| 332 | 259 | colProps: { |
| 333 | 260 | span: 6, |
| 334 | 261 | }, |
| 335 | - componentProps: { | |
| 336 | - placeholder: '区/县', | |
| 262 | + componentProps: ({ formActionType, formModel }) => { | |
| 263 | + const nameCity = Reflect.get(formModel, 'nameCity'); | |
| 264 | + const { setFieldsValue } = formActionType; | |
| 265 | + return { | |
| 266 | + api: async (params: Recordable) => { | |
| 267 | + try { | |
| 268 | + if (!nameCity) return; | |
| 269 | + const result = await getAreaList(params); | |
| 270 | + return result; | |
| 271 | + } catch (error) { | |
| 272 | + return []; | |
| 273 | + } | |
| 274 | + }, | |
| 275 | + labelField: 'name', | |
| 276 | + valueField: 'code', | |
| 277 | + placeholder: '区/县', | |
| 278 | + params: { parentId: nameCity, level: Level.COUNTY }, | |
| 279 | + onChange: () => { | |
| 280 | + setFieldsValue({ nameTown: null }); | |
| 281 | + }, | |
| 282 | + }; | |
| 337 | 283 | }, |
| 338 | 284 | }, |
| 339 | 285 | { |
| 340 | 286 | field: 'nameTown', |
| 341 | - component: 'Select', | |
| 287 | + component: 'ApiSelect', | |
| 342 | 288 | label: '', |
| 343 | 289 | colProps: { |
| 344 | 290 | span: 6, |
| 345 | 291 | }, |
| 346 | - componentProps: { | |
| 347 | - placeholder: '城镇/街道', | |
| 292 | + componentProps: ({ formModel }) => { | |
| 293 | + const nameCoun = Reflect.get(formModel, 'nameCoun'); | |
| 294 | + return { | |
| 295 | + api: async (params: Recordable) => { | |
| 296 | + try { | |
| 297 | + if (!nameCoun) return; | |
| 298 | + const result = await getAreaList(params); | |
| 299 | + return result; | |
| 300 | + } catch (error) { | |
| 301 | + return []; | |
| 302 | + } | |
| 303 | + }, | |
| 304 | + labelField: 'name', | |
| 305 | + valueField: 'code', | |
| 306 | + placeholder: '城镇/街道', | |
| 307 | + params: { parentId: nameCoun, level: Level.TOWN }, | |
| 308 | + }; | |
| 348 | 309 | }, |
| 349 | 310 | }, |
| 350 | 311 | ]; | ... | ... |
| ... | ... | @@ -66,6 +66,7 @@ export default ({ command, mode }: ConfigEnv): UserConfig => { |
| 66 | 66 | build: { |
| 67 | 67 | target: 'es2015', |
| 68 | 68 | outDir: OUTPUT_DIR, |
| 69 | + // minify: 'terser', // The minify mode is set to use terser to remove console | |
| 69 | 70 | terserOptions: { |
| 70 | 71 | compress: { |
| 71 | 72 | keep_infinity: true, | ... | ... |