From fbc63e4eadbcfeded16a30ef32ed4a83aea81336 Mon Sep 17 00:00:00 2001 From: dataeaseShu Date: Fri, 11 Jul 2025 18:32:44 +0800 Subject: [PATCH 1/8] feat(user): user manage --- frontend/src/assets/svg/gou_icon.svg | 11 + .../src/assets/svg/icon-filter_outlined.svg | 3 + frontend/src/assets/svg/icon_ban_filled.svg | 3 + .../assets/svg/icon_ccm-upload_outlined.svg | 4 + .../src/assets/svg/icon_info_colorful.svg | 12 + .../src/assets/svg/icon_member_filled.svg | 4 + .../src/assets/svg/icon_upload_outlined.svg | 3 + frontend/src/components/layout/LayoutDsl.vue | 1 + frontend/src/components/layout/MenuItem.vue | 2 + frontend/src/i18n/en.json | 28 + frontend/src/i18n/zh-CN.json | 30 +- frontend/src/router/index.ts | 8 +- frontend/src/style.less | 5 + frontend/src/views/system/user/User.vue | 510 ++++++++++++++++++ 14 files changed, 622 insertions(+), 2 deletions(-) create mode 100644 frontend/src/assets/svg/gou_icon.svg create mode 100644 frontend/src/assets/svg/icon-filter_outlined.svg create mode 100644 frontend/src/assets/svg/icon_ban_filled.svg create mode 100644 frontend/src/assets/svg/icon_ccm-upload_outlined.svg create mode 100644 frontend/src/assets/svg/icon_info_colorful.svg create mode 100644 frontend/src/assets/svg/icon_member_filled.svg create mode 100644 frontend/src/assets/svg/icon_upload_outlined.svg create mode 100644 frontend/src/views/system/user/User.vue diff --git a/frontend/src/assets/svg/gou_icon.svg b/frontend/src/assets/svg/gou_icon.svg new file mode 100644 index 00000000..ef54599e --- /dev/null +++ b/frontend/src/assets/svg/gou_icon.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/frontend/src/assets/svg/icon-filter_outlined.svg b/frontend/src/assets/svg/icon-filter_outlined.svg new file mode 100644 index 00000000..2cee5a99 --- /dev/null +++ b/frontend/src/assets/svg/icon-filter_outlined.svg @@ -0,0 +1,3 @@ + + + diff --git a/frontend/src/assets/svg/icon_ban_filled.svg b/frontend/src/assets/svg/icon_ban_filled.svg new file mode 100644 index 00000000..fa22f12a --- /dev/null +++ b/frontend/src/assets/svg/icon_ban_filled.svg @@ -0,0 +1,3 @@ + + + diff --git a/frontend/src/assets/svg/icon_ccm-upload_outlined.svg b/frontend/src/assets/svg/icon_ccm-upload_outlined.svg new file mode 100644 index 00000000..938f8ea2 --- /dev/null +++ b/frontend/src/assets/svg/icon_ccm-upload_outlined.svg @@ -0,0 +1,4 @@ + + + + diff --git a/frontend/src/assets/svg/icon_info_colorful.svg b/frontend/src/assets/svg/icon_info_colorful.svg new file mode 100644 index 00000000..633d6cc9 --- /dev/null +++ b/frontend/src/assets/svg/icon_info_colorful.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/frontend/src/assets/svg/icon_member_filled.svg b/frontend/src/assets/svg/icon_member_filled.svg new file mode 100644 index 00000000..fded3173 --- /dev/null +++ b/frontend/src/assets/svg/icon_member_filled.svg @@ -0,0 +1,4 @@ + + + + diff --git a/frontend/src/assets/svg/icon_upload_outlined.svg b/frontend/src/assets/svg/icon_upload_outlined.svg new file mode 100644 index 00000000..d38c9c33 --- /dev/null +++ b/frontend/src/assets/svg/icon_upload_outlined.svg @@ -0,0 +1,3 @@ + + + diff --git a/frontend/src/components/layout/LayoutDsl.vue b/frontend/src/components/layout/LayoutDsl.vue index 082ab5aa..387a9a8c 100644 --- a/frontend/src/components/layout/LayoutDsl.vue +++ b/frontend/src/components/layout/LayoutDsl.vue @@ -149,6 +149,7 @@ const toWorkspace = () => { flex: 1; padding: 8px 8px 8px 0; max-height: 100vh; + overflow-x: auto; .content { width: 100%; diff --git a/frontend/src/components/layout/MenuItem.vue b/frontend/src/components/layout/MenuItem.vue index ea938bc1..147520bf 100644 --- a/frontend/src/components/layout/MenuItem.vue +++ b/frontend/src/components/layout/MenuItem.vue @@ -4,10 +4,12 @@ import { ElMenuItem, ElSubMenu, ElIcon } from 'element-plus-secondary' import model from '@/assets/svg/icon_dataset_filled.svg' import ds from '@/assets/svg/ds.svg' +import user from '@/assets/svg/icon_member_filled.svg' const iconMap = { icon_ai: model, ds, + user, } as { [key: string]: any } const titleWithIcon = (props: any) => { diff --git a/frontend/src/i18n/en.json b/frontend/src/i18n/en.json index 5920e24b..582b6c32 100644 --- a/frontend/src/i18n/en.json +++ b/frontend/src/i18n/en.json @@ -195,6 +195,34 @@ "parameter_type": "Parameter type", "verification_successful": "Verification successful" }, + "user": { + "workspace": "Workspace", + "creation_time": "Creation time", + "user_source": "User source", + "phone_number": "Phone number", + "email": "Email", + "user_status": "User status", + "account": "Account", + "name": "Name", + "selected_2_items": "Selected {msg} items", + "name_account_email": "Search name, account, email", + "user_management": "User management", + "filter": "Filter", + "batch_import": "Batch import", + "add_users": "Add users", + "selected_2_users": "Do you want to delete the selected 2 users?", + "filter_conditions": "Filter conditions", + "enable": "Enable", + "disable": "Disable", + "local_creation": "Local creation", + "feishu": "Feishu", + "dingtalk": "DingTalk", + "wechat_for_business": "WeChat for business", + "1240_results": "{msg} results", + "clear_conditions": "Clear conditions", + "disabled": "Disabled", + "enabled": "Enabled" + }, "chat": { "chart_type": { "table": "Table", diff --git a/frontend/src/i18n/zh-CN.json b/frontend/src/i18n/zh-CN.json index c2d248ad..3680f0c5 100644 --- a/frontend/src/i18n/zh-CN.json +++ b/frontend/src/i18n/zh-CN.json @@ -198,6 +198,34 @@ "del_default_warn": "该模型为系统默认模型,请先设置其他模型为系统默认模型,再删除此模型。", "del_warn_tip": "是否删除模型: {msg}?" }, + "user": { + "workspace": "工作空间", + "creation_time": "创建时间", + "user_source": "用户来源", + "phone_number": "手机号", + "email": "邮箱", + "user_status": "用户状态", + "account": "账号", + "name": "姓名", + "selected_2_items": "已选 {msg} 条", + "name_account_email": "搜索姓名、账号、邮箱", + "user_management": "用户管理", + "filter": "筛选", + "batch_import": "批量导入", + "add_users": "添加用户", + "selected_2_users": "是否删除选中的 {msg} 个用户?", + "filter_conditions": "筛选条件", + "enable": "启用", + "disable": "禁用", + "local_creation": "本地创建", + "feishu": "飞书", + "dingtalk": "钉钉", + "wechat_for_business": "企业微信", + "1240_results": "{msg} 个结果 ", + "clear_conditions": "清空条件", + "disabled": "已禁用", + "enabled": "已启用" + }, "chat": { "chart_type": { "table": "明细表", @@ -234,4 +262,4 @@ "back_community": "还原至社区版", "confirm_tips": "确定还原至社区版?" } -} +} \ No newline at end of file diff --git a/frontend/src/router/index.ts b/frontend/src/router/index.ts index aa4f4c5f..d8d6de25 100644 --- a/frontend/src/router/index.ts +++ b/frontend/src/router/index.ts @@ -10,7 +10,7 @@ import DashboardEditor from '@/views/dashboard/editor/index.vue' import DashboardPreview from '@//views/dashboard/preview/SQPreviewSingle.vue' import Dashboard from '@/views/dashboard/index.vue' import Model from '@/views/system/model/Model.vue' -// import User from "@/views/system/user/index.vue"; +import User from '@/views/system/user/User.vue' import { watchRouter } from './watch' const router = createRouter({ history: createWebHashHistory(), @@ -126,6 +126,12 @@ const router = createRouter({ component: Model, meta: { title: 'AI Model Configuration', icon: 'icon_ai' }, }, + { + path: 'user', + name: 'user', + component: User, + meta: { title: '用户管理', icon: 'user' }, + }, ], }, ], diff --git a/frontend/src/style.less b/frontend/src/style.less index 436f7f21..7bdf444f 100644 --- a/frontend/src/style.less +++ b/frontend/src/style.less @@ -26,6 +26,7 @@ --shadow: 0 1px 3px rgba(0, 0, 0, 0.1); --ed-color-primary: #1cba90 !important; + --ed-border-radius-base: 6px !important; } a { @@ -149,3 +150,7 @@ body { align-items: center; justify-content: center; } + +.ed-input__prefix-inner .ed-icon { + color: #646a73; +} diff --git a/frontend/src/views/system/user/User.vue b/frontend/src/views/system/user/User.vue new file mode 100644 index 00000000..f90494b8 --- /dev/null +++ b/frontend/src/views/system/user/User.vue @@ -0,0 +1,510 @@ + + + + + From d685280269881b5dddec3a1f2fa41d11e06b5e25 Mon Sep 17 00:00:00 2001 From: dataeaseShu Date: Mon, 14 Jul 2025 18:26:33 +0800 Subject: [PATCH 2/8] feat(user): user manage --- frontend/package.json | 1 + frontend/src/api/user.ts | 16 + frontend/src/api/workspace.ts | 9 + .../src/assets/svg/icon_assigned_outlined.svg | 5 + .../src/assets/svg/icon_close_outlined.svg | 3 + frontend/src/assets/svg/icon_member.svg | 4 + .../src/assets/svg/icon_rename_outlined.svg | 4 + .../workspace/icon_custom-tools_colorful.png | Bin 0 -> 1584 bytes .../src/components/drawer-filter/index.ts | 3 + .../drawer-filter/src/DrawerEnumFilter.vue | 115 +++++ .../drawer-filter/src/DrawerFilter.vue | 91 ++++ frontend/src/components/drawer-main/index.ts | 3 + .../components/drawer-main/src/DrawerMain.vue | 163 ++++++ frontend/src/components/filter-text/index.ts | 91 ++++ .../components/filter-text/src/FilterText.vue | 206 ++++++++ frontend/src/components/layout/MenuItem.vue | 16 +- frontend/src/i18n/en.json | 51 +- frontend/src/i18n/zh-CN.json | 51 +- frontend/src/router/index.ts | 19 +- frontend/src/style.less | 22 + frontend/src/utils/propTypes.ts | 27 + frontend/src/views/ds/Card.vue | 7 +- frontend/src/views/ds/Datasource.vue | 2 +- frontend/src/views/system/user/User.vue | 368 +++++++++++--- frontend/src/views/system/user/UserImport.vue | 475 ++++++++++++++++++ .../src/views/system/workspace/ParamsForm.vue | 108 ++++ frontend/src/views/system/workspace/index.vue | 444 ++++++++++++++++ 27 files changed, 2221 insertions(+), 83 deletions(-) create mode 100644 frontend/src/api/user.ts create mode 100644 frontend/src/api/workspace.ts create mode 100644 frontend/src/assets/svg/icon_assigned_outlined.svg create mode 100644 frontend/src/assets/svg/icon_close_outlined.svg create mode 100644 frontend/src/assets/svg/icon_member.svg create mode 100644 frontend/src/assets/svg/icon_rename_outlined.svg create mode 100644 frontend/src/assets/workspace/icon_custom-tools_colorful.png create mode 100644 frontend/src/components/drawer-filter/index.ts create mode 100644 frontend/src/components/drawer-filter/src/DrawerEnumFilter.vue create mode 100644 frontend/src/components/drawer-filter/src/DrawerFilter.vue create mode 100644 frontend/src/components/drawer-main/index.ts create mode 100644 frontend/src/components/drawer-main/src/DrawerMain.vue create mode 100644 frontend/src/components/filter-text/index.ts create mode 100644 frontend/src/components/filter-text/src/FilterText.vue create mode 100644 frontend/src/utils/propTypes.ts create mode 100644 frontend/src/views/system/user/UserImport.vue create mode 100644 frontend/src/views/system/workspace/ParamsForm.vue create mode 100644 frontend/src/views/system/workspace/index.vue 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 0000000000000000000000000000000000000000..a7ceb24607c966d6e3fb73dcac9f01e01fb7831c GIT binary patch literal 1584 zcmV-02G9A4P)>XSVoyTI9ZRLY(o>qeuLq62=?T{?(@+3Jnj-nn}A! zDT9x!`uv|28IzAN^UlOJyC_b*R0lv2t_D6J+#^!py=;W=p5!*W%xm1#%LPhMi4U&% z{NbGIJ7DI8@U!(MyiOrYP%;P9v+w}2-FNLYX$7=R2T#|t@ELept_9EOFET8EohOID zlpR?$1t8BmWcGEMAu~=i1u)LuC#S*b1P;0jc*$WfV#l>3YI_kGW8^^G4SbK1NRWpd zN-{}a(MUO00cwIe6;*vW8yy*-rB|xe-ZnPuB7fH*I@?h_0~CR<$<3Kq)UcWUJuP&h z$49M?HEOSi+IlIlFhg^(DA@^WABAiLvwr^h!!&X5owV=(=Mx9t7D_onZ5h|?zzr>w zv@BF1Z|v*R1Z;HgG8}XA>26^it#o1e22I}nk*o&p?_Tt|R{D6KHa@s~lUD!T zASF;Dv|^D>(J-B`d5U z&RVBOIY|OR4znIO&_`B)*brR0Nivb9fZWt(6|e@GDYIe)Xa&uILp0RhOLj7Odr?Y| ztSAeVlG?07R?0M;1u)}dFCD9j@H%?RtRz#IR=~pMIz|7pHb(!MRt@(3t0#;Ub1!w&JIpl!;jnEKD0VK&U=ZfZ^}syb@fE z?;RZ`6TrMt2|oM8UeN&cYO4!3VrvD*E(-shT3@Cn5h&3q76UmR_3z$)Mpi+}yDnQ|^m|HQOe7Avyp&*Jq5-+xIM4&@YkZaly9+A6P|BlbXEs)|0f#5kT7FKfm zjhZZkjH*GHK4!^C$U+#cBSNX;D`6U2otIY#$y^dEmi9{N-;1p%S(FmvtYv!i7uk1* zjH*FcgHez)T2X?z4~q)0l7`0!JTzsA0(3Bw=+*OlIAf8s*s{6ox<41o6#$C4#nk$e zCU~xbVD2M7UoR_em_bv32!gX@!xJK5C9>2>QPzZSIK#V@GG?>#^?$;3~Z{xF zoqGo7=|xed@)2?jJF;e#fOho-)g*KFLDsUkJIT+mI?f2%rl}+!$h?-NfXJKvh>Q4O zJt{#HUdRR+Gq2~}7>W4&VQ8t&ln{bUk(@n)plBP2on+Wd^|0@ zDuLAIX*w;w@wHl42C7<-(XNt@{GFbyRixyvpw?E^!o1 iookaqk-_q|&;JkTiLwnrX!oc90000 +import { propTypes } from '@/utils/propTypes' +import { reactive } from 'vue' +import { useEmitt } from '@/utils/useEmitt' + +const props = defineProps({ + optionList: propTypes.arrayOf( + propTypes.shape({ + id: propTypes.string, + name: propTypes.string, + }) + ), + index: propTypes.number, + title: propTypes.string, +}) + +const state = reactive<{ activeStatus: any[]; optionList: any[] }>({ + activeStatus: [], + optionList: [], +}) + +const nodeChange = (id: string | number) => { + const len = state.activeStatus.indexOf(id) + if (len >= 0) { + state.activeStatus.splice(len, 1) + } else { + state.activeStatus.push(id) + } + emits('filter-change', state.activeStatus) +} + +const emits = defineEmits(['filter-change']) +const clear = (index: number) => { + if (index !== props.index) return + state.activeStatus = [] +} + +useEmitt({ + name: 'clear-drawer_main', + callback: clear, +}) + + + + + 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 @@ + + + + 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 @@ + + + + + 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 @@ + + + + + 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 @@ + + + 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 @@ + + + + + From e73ace139f94d0f4b72c44fb046c299aaea0f1ee Mon Sep 17 00:00:00 2001 From: dataeaseShu Date: Tue, 15 Jul 2025 16:55:34 +0800 Subject: [PATCH 3/8] feat(user): user manage --- frontend/src/api/user.ts | 11 + .../src/assets/workspace/avatar_personal.png | Bin 0 -> 1784 bytes frontend/src/i18n/en.json | 9 +- frontend/src/i18n/zh-CN.json | 9 +- frontend/src/views/system/user/User.vue | 187 ++-- .../workspace/AuthorizedWorkspaceDialog.vue | 212 +++++ frontend/src/views/system/workspace/index.vue | 833 +++++++++++++----- 7 files changed, 955 insertions(+), 306 deletions(-) create mode 100644 frontend/src/assets/workspace/avatar_personal.png create mode 100644 frontend/src/views/system/workspace/AuthorizedWorkspaceDialog.vue diff --git a/frontend/src/api/user.ts b/frontend/src/api/user.ts index 723010d3..ded09a9f 100644 --- a/frontend/src/api/user.ts +++ b/frontend/src/api/user.ts @@ -14,3 +14,14 @@ export const userImportApi = { request.get(`/user/clearErrorRecord/${key}`) }, } + +export const userApi = { + pager: (params: any, pageNumber: number, pageSize: number) => + request.get(`/user/pager/${pageNumber}/${pageSize}${params}`), + add: (data: any) => request.post('/user', data), + edit: (data: any) => request.put('/user', data), + clearErrorApi: (key: string) => request.get(`/user/clearErrorRecord/${key}`), + delete: (key: string) => request.delete(`/user/${key}`), + get: (key: string) => request.get(`/user/${key}`), + pwd: (data: any) => request.put('/user/pwd', data), +} diff --git a/frontend/src/assets/workspace/avatar_personal.png b/frontend/src/assets/workspace/avatar_personal.png new file mode 100644 index 0000000000000000000000000000000000000000..781f27b849a1909322f621d6161c09c6707dec29 GIT binary patch literal 1784 zcmb7F3p-oc8eT*dWu}BS8ZGBgDiw{RE-6Y{;!Z_c6*R8pxRkhzA}+lgbxD(&IaEvA znFeK~%Bi+4jVMCPs4_7sD(yrwX^N&9V}hiU**fzF&U&7;_S$Pb-+sUSz3;nL`LQ5x zJ)K=T002E-A5Q`RFa$LB(b9y*9AxMh&_g@JCp-&)9eX#snlHiPBebZNMesfX+Mb(8 zpcjoqTp$jB4#qZR%oYGNFZ+7ph-cN7=W*$VV&i_9IO-lUQ|n*VWxQd!7M7@Y39))5 zL%l)$y|vfz0(1!9-i{2`!1#cb7Q4o$kq; zEQ{>=6T@)v##3oJp2gZ7PJ;dk!8D{r85>=|nT*y+;{6g%4n@+wUE?fzowd1BuWHZF zmK*_~-w}?8%PuBOVz2#^x!(=-Fe`YK2A+D+p)jgTT}qXsRS zX{p&o*t?Vv6j?E>8YwXM0HCQ(8-H}qs{rX&0i4wjsYTBWVW1==`vP9~!-Ge@`Qjye zS*7$7=2YI9+*K(S{;Q(MP;IvYkNNjHJWl=~vy9<$6l<^T+ zEPsCYOJ?p0GwGZ)Bt!F#txPrfJ(Fo_qzzlik6XB%oh)6PwnNtqi zU5=`y=P0wA4X(fRx2-3U1OZks07@+|*RRy6I#oQu-C#@lVU822{iLAE6@X|hb!O9g zEBh$+whS)IJl}DAYu}tw!+dmHfb4)wfYCS?5-Qu8Dzc!)jQj*+qVvo!kaFn#&DP$B z5a=$7{CN!{Dn*?6U{cZ$wh3j1NgloB|l-Zw$dwGk#Y>u(Kf?e?*1)g=!G`YrSkp>KqDOvA`f`Vx&{ zjYI8=|8d?>j&(@8=Q}=LRK&1$gwiuxcm-Z1ueuZrh;E7j!a-D46so|C)-AH{OMUba z5gdv@Nxv~I6wR8Pq2Vs)m<>QzR6*Y*97ACHK~VGEP|uv@I< z>AdPJ8^}?*xM*Id@hWWLdv_}Hj|%qp+NE# zy|&VNX7}5x8}8woM}Y1#gO*Za9eX9TeW$tjzEB-<0A!#X4qV)ncL3ilzujxRQyl=j z1!fm9$nN$xuW2m_`H*Sd)R{4@?x%W)_07RQ6I!T(Y9;{9{*ZfJkcqJsXZpg>mp2~g zj{|V5vOfveP5j>F>BtydUYj9GsW*N*_-VmEc)SpjF~am}OWNd3_toEZPftCFR3hN- zTD#h%P$H#Tw3@)=__A#P@T1F#W25l3UpF_FqitXpVU*9=+2(^Zz5EzzWgD*ZO{G#Oz1Pq+YxccK8(G5H&iZUsj@p+x|NT^ z1JHeCS#5?}KA(Mvg*mg}~s07oodg!3<;R`5+tB=u~0)rN|`9?mP;W$!e&d zn4s#94M15gTVgC d|99Ii+ncV?{^D#(Y}ID0uUC*~+mYz=e*%IT3K9SS literal 0 HcmV?d00001 diff --git a/frontend/src/i18n/en.json b/frontend/src/i18n/en.json index a9cafb72..2ebe3367 100644 --- a/frontend/src/i18n/en.json +++ b/frontend/src/i18n/en.json @@ -263,12 +263,13 @@ "remove": "Remove", "selected_2_members": "Do you want to remove the selected {msg} members?", "removed_successfully": "Removed successfully", - "workspace:_de_workspace": "Do you want to delete the workspace: {msg}?", - "member:_feng_yibudao": "Do you want to remove the member: {msg}?", + "workspace_de_workspace": "Do you want to delete the workspace: {msg}?", + "member_feng_yibudao": "Do you want to remove the member: {msg}?", "select_member": "Select member", - "selected:_2_people": "Selected: {msg} people", + "selected_2_people": "Selected: {msg} people", "clear": "Clear", - "historical_dialogue": "No historical dialogue" + "historical_dialogue": "No historical dialogue", + "rename_a_workspace" : "Rename a workspace" }, "chat": { "chart_type": { diff --git a/frontend/src/i18n/zh-CN.json b/frontend/src/i18n/zh-CN.json index 986dada3..a08da126 100644 --- a/frontend/src/i18n/zh-CN.json +++ b/frontend/src/i18n/zh-CN.json @@ -266,12 +266,13 @@ "remove": "移除", "selected_2_members": "是否移除选中的 {msg} 个成员?", "removed_successfully": "移除成功", - "workspace:_de_workspace": "是否删除工作空间:{msg}?", - "member:_feng_yibudao": "是否移除成员:{msg}?", + "workspace_de_workspace": "是否删除工作空间:{msg}?", + "member_feng_yibudao": "是否移除成员:{msg}?", "select_member": "选择成员", - "selected:_2_people": "已选:{msg} 人", + "selected_2_people": "已选:{msg} 人", "clear": "清空", - "historical_dialogue": "暂无历史对话" + "historical_dialogue": "暂无历史对话", + "rename_a_workspace" : "重命名工作空间" }, "chat": { "chart_type": { diff --git a/frontend/src/views/system/user/User.vue b/frontend/src/views/system/user/User.vue index 9a6284d7..2f2387e3 100644 --- a/frontend/src/views/system/user/User.vue +++ b/frontend/src/views/system/user/User.vue @@ -8,6 +8,7 @@ style="width: 240px; margin-right: 12px" :placeholder="$t('user.name_account_email')" @keyup.enter="handleSearch" + @blur="handleSearch" > {{ $t('user.batch_import') }} - + @@ -63,9 +64,9 @@ - - - + + +