diff --git a/frontend/package.json b/frontend/package.json index 862fcda4..677c94c8 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -37,6 +37,7 @@ "vue-dompurify-html": "^5.3.0", "vue-i18n": "^9.14.4", "vue-router": "^4.5.0", + "vue-types": "^6.0.0", "web-storage-cache": "^1.1.1" }, "devDependencies": { diff --git a/frontend/src/api/user.ts b/frontend/src/api/user.ts new file mode 100644 index 00000000..723010d3 --- /dev/null +++ b/frontend/src/api/user.ts @@ -0,0 +1,16 @@ +import { request } from '@/utils/request' + +export const userImportApi = { + downExcelTemplateApi: () => request.post('/user/excelTemplate', {}, { responseType: 'blob' }), + importUserApi: (data: any) => + request.post('/user/batchImport', data, { + headers: { + 'Content-Type': 'multipart/form-data', + }, + }), + downErrorRecordApi: (key: string) => + request.get(`/user/errorRecord/${key}`, { responseType: 'blob' }), + clearErrorApi: (key: string) => { + request.get(`/user/clearErrorRecord/${key}`) + }, +} diff --git a/frontend/src/api/workspace.ts b/frontend/src/api/workspace.ts new file mode 100644 index 00000000..25b8d6e7 --- /dev/null +++ b/frontend/src/api/workspace.ts @@ -0,0 +1,9 @@ +import { request } from '@/utils/request' + +export const workspaceUserList = (params: any, pageNum: number, pageSize: number) => + request.get(`/system/workspace/uws/pager/${pageNum}/${pageSize}`, { params }) + +export const workspaceCreate = (data: any) => request.post('/system/workspace/uws', data) +export const workspaceDelete = (data: any) => request.delete('/system/workspace/uws', data) +export const workspaceList = () => request.get('/system/workspace') +export const workspaceDetail = (id: any) => request.get(`/system/workspace/${id}`) diff --git a/frontend/src/assets/svg/icon_assigned_outlined.svg b/frontend/src/assets/svg/icon_assigned_outlined.svg new file mode 100644 index 00000000..ca199a73 --- /dev/null +++ b/frontend/src/assets/svg/icon_assigned_outlined.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/frontend/src/assets/svg/icon_close_outlined.svg b/frontend/src/assets/svg/icon_close_outlined.svg new file mode 100644 index 00000000..124221e7 --- /dev/null +++ b/frontend/src/assets/svg/icon_close_outlined.svg @@ -0,0 +1,3 @@ + + + diff --git a/frontend/src/assets/svg/icon_member.svg b/frontend/src/assets/svg/icon_member.svg new file mode 100644 index 00000000..fe594998 --- /dev/null +++ b/frontend/src/assets/svg/icon_member.svg @@ -0,0 +1,4 @@ + + + + diff --git a/frontend/src/assets/svg/icon_rename_outlined.svg b/frontend/src/assets/svg/icon_rename_outlined.svg new file mode 100644 index 00000000..f0af70f4 --- /dev/null +++ b/frontend/src/assets/svg/icon_rename_outlined.svg @@ -0,0 +1,4 @@ + + + + diff --git a/frontend/src/assets/workspace/icon_custom-tools_colorful.png b/frontend/src/assets/workspace/icon_custom-tools_colorful.png new file mode 100644 index 00000000..a7ceb246 Binary files /dev/null and b/frontend/src/assets/workspace/icon_custom-tools_colorful.png differ diff --git a/frontend/src/components/drawer-filter/index.ts b/frontend/src/components/drawer-filter/index.ts new file mode 100644 index 00000000..481382e6 --- /dev/null +++ b/frontend/src/components/drawer-filter/index.ts @@ -0,0 +1,3 @@ +import DrawerFilter from './src/DrawerFilter.vue' + +export { DrawerFilter } diff --git a/frontend/src/components/drawer-filter/src/DrawerEnumFilter.vue b/frontend/src/components/drawer-filter/src/DrawerEnumFilter.vue new file mode 100644 index 00000000..e845545c --- /dev/null +++ b/frontend/src/components/drawer-filter/src/DrawerEnumFilter.vue @@ -0,0 +1,115 @@ + + + + + {{ title }} + + {{ ele.name }} + + + + + diff --git a/frontend/src/components/drawer-filter/src/DrawerFilter.vue b/frontend/src/components/drawer-filter/src/DrawerFilter.vue new file mode 100644 index 00000000..06724a97 --- /dev/null +++ b/frontend/src/components/drawer-filter/src/DrawerFilter.vue @@ -0,0 +1,91 @@ + + + + + {{ title }} + + + + + + + + diff --git a/frontend/src/components/drawer-main/index.ts b/frontend/src/components/drawer-main/index.ts new file mode 100644 index 00000000..f8c594cc --- /dev/null +++ b/frontend/src/components/drawer-main/index.ts @@ -0,0 +1,3 @@ +import DrawerMain from './src/DrawerMain.vue' + +export { DrawerMain } diff --git a/frontend/src/components/drawer-main/src/DrawerMain.vue b/frontend/src/components/drawer-main/src/DrawerMain.vue new file mode 100644 index 00000000..6f149b5b --- /dev/null +++ b/frontend/src/components/drawer-main/src/DrawerMain.vue @@ -0,0 +1,163 @@ + + + + + + filterChange(v, component.field, 'in')" + /> + filterChange(v, component.field, 'in')" + /> + + + + {{ t('common.reset') }} + {{ t('common.search') }} + + + + + diff --git a/frontend/src/components/filter-text/index.ts b/frontend/src/components/filter-text/index.ts new file mode 100644 index 00000000..343a0af8 --- /dev/null +++ b/frontend/src/components/filter-text/index.ts @@ -0,0 +1,91 @@ +import FilterText from './src/FilterText.vue' + +export { FilterText } + +const fieldText = (field: string, options: any[]) => { + for (let index = 0; index < options.length; index++) { + const element = options[index] + if (field === element.field) { + return element.title + } + } +} +const valueTextFormTree = (val: string, options: any[]) => { + let result = null + const stack = [...options] + while (stack.length) { + const item = stack.pop() + if (item.value === val) { + result = item.label + break + } + if (item.children?.length) { + item.children.forEach((kid: any) => stack.push(kid)) + } + } + return result || val +} +const timestampFormatDate = (value: string) => { + if (!value) { + return '-' + } + return new Date(value).toLocaleString() +} +const valueText = (field: string, val: string, options: any[]) => { + for (let index = 0; index < options.length; index++) { + const element = options[index] + if (field === element.field) { + let isTree = false + const selectOption = element.option + for (let i = 0; i < selectOption.length; i++) { + const item = selectOption[i] as any + if (item.children !== undefined) { + isTree = true + break + } + if (item.id === val || item.value === val) { + return item.name || item.label + } + } + if (element.type === 'time') { + return timestampFormatDate(val) + } + if (isTree) { + return valueTextFormTree(val, selectOption) + } + } + } + return val +} +export const convertFilterText = (conditions: any[], options: any[]) => { + console.log('conditions', conditions, options) + + const result: any[] = [] + conditions.forEach((condition) => { + const field = condition.field + const ope = condition.operator + const value = condition.value + const fieldName = fieldText(field, options) + const textOpe = ':' + let separator = ',' + if (ope === 'in') { + separator = '、' + } + if (ope === 'between') { + separator = '~' + } + let valText = value + + if (value) { + if (Array.isArray(value)) { + const valTextArray = value.map((val) => valueText(field, val, options)) + valText = valTextArray.join(separator) + } + if (valText?.length) { + const obj = fieldName + textOpe + valText + result.push(obj) + } + } + }) + return result +} diff --git a/frontend/src/components/filter-text/src/FilterText.vue b/frontend/src/components/filter-text/src/FilterText.vue new file mode 100644 index 00000000..71fb6329 --- /dev/null +++ b/frontend/src/components/filter-text/src/FilterText.vue @@ -0,0 +1,206 @@ + + + + + {{ total }} + {{ t('common.result_count') }} + + + + + + + + {{ ele }} + + + + + + + + + + {{ t('common.clear_filter') }} + + + + + + + + + {{ t('common.clear_filter') }} + + + + diff --git a/frontend/src/components/layout/MenuItem.vue b/frontend/src/components/layout/MenuItem.vue index 147520bf..c4665f06 100644 --- a/frontend/src/components/layout/MenuItem.vue +++ b/frontend/src/components/layout/MenuItem.vue @@ -1,15 +1,18 @@ + + + + + + + + + + {{ t('user.please_first') }} + {{ + t('user.download_the_template') + }} + {{ t('user.required_and_upload') }} + + + + + + + + {{ fileName }} + {{ fileName.split('.')[1] }} - {{ fileSize }} + + + + + + + + {{ $t('user.change_file') }} + + + + + + + + {{ t('user.upload_file') }} + + + + {{ defaultTip }} + + + + + + {{ t('common.cancel') }} + {{ t('user.import') }} + + + + + + diff --git a/frontend/src/views/system/workspace/ParamsForm.vue b/frontend/src/views/system/workspace/ParamsForm.vue new file mode 100644 index 00000000..f6edbc54 --- /dev/null +++ b/frontend/src/views/system/workspace/ParamsForm.vue @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + diff --git a/frontend/src/views/system/workspace/index.vue b/frontend/src/views/system/workspace/index.vue new file mode 100644 index 00000000..a725cde9 --- /dev/null +++ b/frontend/src/views/system/workspace/index.vue @@ -0,0 +1,444 @@ + + + + + + + {{ $t('user.workspace') }} + + + + + + + + + + + + + + + + + + + + + {{ ele.name }} + + + {{ $t('workspace.historical_dialogue') }} + + + + + + + {{ currentTable.name }} + + {{ $t('about.remark') }}: + {{ currentTable.custom_comment || '-' }} + + + + + + + + + + + + + + + + + + + {{ $t(`user.${scope.row.status ? 'enabled' : 'disabled'}`) }} + + + + + + + + + + {{ scope.row.custom_comment }} + + + + + + + + + + + + + + + + + {{ t('common.cancel') }} + {{ t('common.confirm') }} + + + + + + + {{ t('common.cancel') }} + {{ t('common.confirm') }} + + + + + +
+ + {{ ele }} + + + + +