diff --git a/docs/java/SysMenuServiceImpl.java b/docs/java/SysMenuServiceImpl.java deleted file mode 100644 index 4c63a211..00000000 --- a/docs/java/SysMenuServiceImpl.java +++ /dev/null @@ -1,34 +0,0 @@ - /** - * 查询系统菜单列表 - * - * @param menu 菜单信息 - * @return 菜单列表 - */ - @Override - public List selectMenuList(SysMenuBo menu, Long userId) { - List menuList; - // 管理员显示所有菜单信息 - if (LoginHelper.isSuperAdmin(userId)) { - menuList = baseMapper.selectVoList(new LambdaQueryWrapper() - .like(StringUtils.isNotBlank(menu.getMenuName()), SysMenu::getMenuName, menu.getMenuName()) - .eq(StringUtils.isNotBlank(menu.getVisible()), SysMenu::getVisible, menu.getVisible()) - .eq(StringUtils.isNotBlank(menu.getStatus()), SysMenu::getStatus, menu.getStatus()) - .eq(StringUtils.isNotBlank(menu.getMenuType()), SysMenu::getMenuType, menu.getMenuType()) - .eq(ObjectUtil.isNotNull(menu.getParentId()), SysMenu::getParentId, menu.getParentId()) - .orderByAsc(SysMenu::getParentId) - .orderByAsc(SysMenu::getOrderNum)); - } else { - QueryWrapper wrapper = Wrappers.query(); - wrapper.inSql("r.role_id", "select role_id from sys_user_role where user_id = " + userId) - .like(StringUtils.isNotBlank(menu.getMenuName()), "m.menu_name", menu.getMenuName()) - .eq(StringUtils.isNotBlank(menu.getVisible()), "m.visible", menu.getVisible()) - .eq(StringUtils.isNotBlank(menu.getStatus()), "m.status", menu.getStatus()) - .eq(StringUtils.isNotBlank(menu.getMenuType()), "m.menu_type", menu.getMenuType()) - .eq(ObjectUtil.isNotNull(menu.getParentId()), "m.parent_id", menu.getParentId()) - .orderByAsc("m.parent_id") - .orderByAsc("m.order_num"); - List list = baseMapper.selectMenuListByUserId(wrapper); - menuList = MapstructUtils.convert(list, SysMenuVo.class); - } - return menuList; - } diff --git a/docs/java/VelocityUtils.java b/docs/java/VelocityUtils.java index 2f020a30..a6f5ce9b 100644 --- a/docs/java/VelocityUtils.java +++ b/docs/java/VelocityUtils.java @@ -62,7 +62,7 @@ public class VelocityUtils { velocityContext.put("BusinessName", StringUtils.capitalize(genTable.getBusinessName())); velocityContext.put("businessName", genTable.getBusinessName()); velocityContext.put("business_name", StrUtil.toUnderlineCase(genTable.getBusinessName())); - velocityContext.put("business-name", StrUtil.toSymbolCase(genTable.getBusinessName(),'-')); + velocityContext.put("business__name", StrUtil.toSymbolCase(genTable.getBusinessName(), '-')); velocityContext.put("businessname", StrUtil.toSymbolCase(genTable.getBusinessName(), ' ')); velocityContext.put("basePackage", getPackagePrefix(packageName)); velocityContext.put("packageName", packageName); @@ -180,7 +180,7 @@ public class VelocityUtils { } else if (template.contains("soy.api.d.ts.vm")) { fileName = StringUtils.format("soybean/typings/api/{}.api.d.ts", moduleName); } else if (template.contains("soy.api.ts.vm")) { - fileName = StringUtils.format("soybean/api/{}/{}.ts", moduleName, StrUtil.toSymbolCase(businessName, '-')); + fileName = StringUtils.format("soybean/api/{}/{}.ts", moduleName, StrUtil.toSymbolCase(businessName, '-')); } else if (template.contains("soy.search.vue.vm")) { fileName = StringUtils.format("soybean/views/{}/{}/modules/{}-search.vue", moduleName, businessName, StrUtil.toSymbolCase(businessName, '-')); } else if (template.contains("soy.operate-drawer.vue.vm")) { diff --git a/docs/template/modules/soy.operate-drawer.vue.vm b/docs/template/modules/soy.operate-drawer.vue.vm index 8f6c869b..ca9c071b 100644 --- a/docs/template/modules/soy.operate-drawer.vue.vm +++ b/docs/template/modules/soy.operate-drawer.vue.vm @@ -1,9 +1,9 @@ @@ -169,7 +173,7 @@ async function handleExport() { :scroll-x="962" :loading="loading" remote - :row-key="row => row.id" + :row-key="row => row.#foreach($column in $columns)#if($column.isPk == '1')$column.javaField#end#end" :pagination="mobilePagination" class="sm:h-full" /> diff --git a/src/components/custom/dept-tree.vue b/src/components/custom/dept-tree.vue new file mode 100644 index 00000000..8d208430 --- /dev/null +++ b/src/components/custom/dept-tree.vue @@ -0,0 +1,144 @@ + + + + + diff --git a/src/components/custom/form-tip.vue b/src/components/custom/form-tip.vue index a94ea2be..41040d00 100644 --- a/src/components/custom/form-tip.vue +++ b/src/components/custom/form-tip.vue @@ -19,7 +19,7 @@ defineProps(); diff --git a/src/components/custom/menu-tree-select.vue b/src/components/custom/menu-tree-select.vue index 296d5713..99e72676 100644 --- a/src/components/custom/menu-tree-select.vue +++ b/src/components/custom/menu-tree-select.vue @@ -1,5 +1,5 @@ + + + + diff --git a/src/constants/business.ts b/src/constants/business.ts index 2e4b8e4f..a9718f3a 100644 --- a/src/constants/business.ts +++ b/src/constants/business.ts @@ -116,3 +116,15 @@ export const ossAccessPolicyRecord: Record = }; export const ossAccessPolicyOptions = transformRecordToOption(ossAccessPolicyRecord); + +/** data scope */ +export const dataScopeRecord: Record = { + '1': '全部数据权限', + '2': '自定数据权限', + '3': '本部门数据权限', + '4': '本部门及以下数据权限', + '5': '仅本人数据权限', + '6': '部门及以下或本人数据权限' +}; + +export const dataScopeOptions = transformRecordToOption(dataScopeRecord); diff --git a/src/locales/langs/en-us.ts b/src/locales/langs/en-us.ts index a689590c..413dccf4 100644 --- a/src/locales/langs/en-us.ts +++ b/src/locales/langs/en-us.ts @@ -188,7 +188,8 @@ const local: App.I18n.Schema = { 'system_oss-config': 'OSS Config', monitor_cache: 'Cache Monitor', monitor_online: 'Online User', - 'user-center': 'User Center' + 'user-center': 'User Center', + system_role: 'Role Management' }, page: { login: { diff --git a/src/locales/langs/zh-cn.ts b/src/locales/langs/zh-cn.ts index 1e7e0f13..19643cf2 100644 --- a/src/locales/langs/zh-cn.ts +++ b/src/locales/langs/zh-cn.ts @@ -188,7 +188,8 @@ const local: App.I18n.Schema = { 'system_oss-config': 'OSS配置', monitor_cache: '缓存监控', monitor_online: '在线用户', - 'user-center': '个人中心' + 'user-center': '个人中心', + system_role: '角色管理' }, page: { login: { diff --git a/src/router/elegant/imports.ts b/src/router/elegant/imports.ts index 15319570..763722ac 100644 --- a/src/router/elegant/imports.ts +++ b/src/router/elegant/imports.ts @@ -38,6 +38,7 @@ export const views: Record Promise import("@/views/system/oss-config/index.vue"), system_oss: () => import("@/views/system/oss/index.vue"), system_post: () => import("@/views/system/post/index.vue"), + system_role: () => import("@/views/system/role/index.vue"), system_tenant: () => import("@/views/system/tenant/index.vue"), system_user: () => import("@/views/system/user/index.vue"), tool_gen: () => import("@/views/tool/gen/index.vue"), diff --git a/src/router/elegant/routes.ts b/src/router/elegant/routes.ts index aae7747f..0009b4a3 100644 --- a/src/router/elegant/routes.ts +++ b/src/router/elegant/routes.ts @@ -250,6 +250,15 @@ export const generatedRoutes: GeneratedRoute[] = [ i18nKey: 'route.system_post' } }, + { + name: 'system_role', + path: '/system/role', + component: 'view.system_role', + meta: { + title: 'system_role', + i18nKey: 'route.system_role' + } + }, { name: 'system_tenant', path: '/system/tenant', diff --git a/src/router/elegant/transform.ts b/src/router/elegant/transform.ts index 73dc4976..9427af4d 100644 --- a/src/router/elegant/transform.ts +++ b/src/router/elegant/transform.ts @@ -187,6 +187,7 @@ const routeMap: RouteMap = { "system_oss": "/system/oss", "system_oss-config": "/system/oss-config", "system_post": "/system/post", + "system_role": "/system/role", "system_tenant": "/system/tenant", "system_user": "/system/user", "tool": "/tool", diff --git a/src/service/api/system/menu.ts b/src/service/api/system/menu.ts index 045b0f39..847f0725 100644 --- a/src/service/api/system/menu.ts +++ b/src/service/api/system/menu.ts @@ -34,3 +34,19 @@ export function fetchDeleteMenu(menuId: CommonType.IdType) { method: 'delete' }); } + +/** 获取菜单树 */ +export function fetchGetMenuTreeSelect() { + return request({ + url: 'system/menu/treeselect', + method: 'get' + }); +} + +/** 获取角色菜单权限 */ +export function fetchGetRoleMenuTreeSelect(roleId: CommonType.IdType) { + return request({ + url: `/system/menu/roleMenuTreeselect/${roleId}`, + method: 'get' + }); +} diff --git a/src/service/api/system/role.ts b/src/service/api/system/role.ts index ddd4350b..f1da7745 100644 --- a/src/service/api/system/role.ts +++ b/src/service/api/system/role.ts @@ -27,8 +27,17 @@ export function fetchUpdateRole(data: Api.System.RoleOperateParams) { }); } +/** 修改角色状态 */ +export function fetchUpdateRoleStatus(data: Api.System.RoleOperateParams) { + return request({ + url: '/system/role/changeStatus', + method: 'put', + data + }); +} + /** 批量删除角色信息 */ -export function fetchDeleteRole(roleIds: CommonType.IdType[]) { +export function fetchBatchDeleteRole(roleIds: CommonType.IdType[]) { return request({ url: `/system/role/${roleIds.join(',')}`, method: 'delete' @@ -43,3 +52,20 @@ export function fetchGetRoleSelect(roleIds?: CommonType.IdType[]) { params: { roleIds } }); } + +/** 获取对应角色部门树列表 */ +export function fetchGetRoleDeptTreeSelect(roleId: CommonType.IdType) { + return request({ + url: `/system/role/deptTree/${roleId}`, + method: 'get' + }); +} + +/** 获取对应角色用户列表 */ +export function fetchGetRoleUserList(params: Api.System.UserSearchParams) { + return request({ + url: `/system/role/authUser/allocatedList`, + method: 'get', + params + }); +} diff --git a/src/service/api/system/user.ts b/src/service/api/system/user.ts index d174aea1..f705dcd6 100644 --- a/src/service/api/system/user.ts +++ b/src/service/api/system/user.ts @@ -34,6 +34,15 @@ export function fetchUpdateUser(data: Api.System.UserOperateParams) { }); } +/** 修改用户状态 */ +export function fetchUpdateUserStatus(data: Api.System.UserOperateParams) { + return request({ + url: '/system/user/changeStatus', + method: 'put', + data + }); +} + /** 批量删除用户信息 */ export function fetchBatchDeleteUser(userIds: CommonType.IdType[]) { return request({ diff --git a/src/typings/api/system.api.d.ts b/src/typings/api/system.api.d.ts index f578179c..e61667b8 100644 --- a/src/typings/api/system.api.d.ts +++ b/src/typings/api/system.api.d.ts @@ -10,10 +10,13 @@ declare namespace Api { * backend api module: "system" */ namespace System { + /** data scope */ + type DataScope = '1' | '2' | '3' | '4' | '5' | '6'; + /** role */ type Role = Common.CommonRecord<{ /** 数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限) */ - dataScope: string; + dataScope: DataScope; /** 部门树选择项是否关联显示 */ deptCheckStrictly: boolean; /** 用户是否存在此角色标识 默认不存在 */ @@ -49,17 +52,29 @@ declare namespace Api { | 'roleName' | 'roleKey' | 'roleSort' - | 'dataScope' | 'menuCheckStrictly' | 'deptCheckStrictly' + | 'dataScope' | 'status' | 'remark' - > + > & { menuIds: CommonType.IdType[]; deptIds: CommonType.IdType[] } >; /** role list */ type RoleList = Common.PaginatingQueryRecord; + /** role menu tree select */ + type RoleMenuTreeSelect = Common.CommonRecord<{ + checkedKeys: CommonType.IdType[]; + menus: MenuList; + }>; + + /** role dept tree select */ + type RoleDeptTreeSelect = Common.CommonRecord<{ + checkedKeys: CommonType.IdType[]; + depts: Dept[]; + }>; + /** all role */ type AllRole = Pick; @@ -107,7 +122,9 @@ declare namespace Api { /** user search params */ type UserSearchParams = CommonType.RecordNullable< - Pick & Common.CommonSearchParams + Pick & { + roleId: CommonType.IdType; + } & Common.CommonSearchParams >; /** user operate params */ @@ -261,6 +278,8 @@ declare namespace Api { parentName: string; /** 子菜单 */ children: MenuList; + id?: CommonType.IdType; + label?: string; }>; /** menu list */ diff --git a/src/typings/components.d.ts b/src/typings/components.d.ts index 551e563e..17c56901 100644 --- a/src/typings/components.d.ts +++ b/src/typings/components.d.ts @@ -12,8 +12,10 @@ declare module 'vue' { BetterScroll: typeof import('./../components/custom/better-scroll.vue')['default'] BooleanTag: typeof import('./../components/custom/boolean-tag.vue')['default'] ButtonIcon: typeof import('./../components/custom/button-icon.vue')['default'] + copy: typeof import('./../components/custom/menu-tree-select copy.vue')['default'] CountTo: typeof import('./../components/custom/count-to.vue')['default'] DarkModeContainer: typeof import('./../components/common/dark-mode-container.vue')['default'] + DeptTree: typeof import('./../components/custom/dept-tree.vue')['default'] DictRadio: typeof import('./../components/custom/dict-radio.vue')['default'] DictSelect: typeof import('./../components/custom/dict-select.vue')['default'] DictTag: typeof import('./../components/custom/dict-tag.vue')['default'] @@ -39,6 +41,7 @@ declare module 'vue' { IconIcRoundUpload: typeof import('~icons/ic/round-upload')['default'] IconLocalBanner: typeof import('~icons/local/banner')['default'] 'IconMaterialSymbols:download2Rounded': typeof import('~icons/material-symbols/download2-rounded')['default'] + 'IconMaterialSymbols:syncOutline': typeof import('~icons/material-symbols/sync-outline')['default'] 'IconMaterialSymbols:upload2Rounded': typeof import('~icons/material-symbols/upload2-rounded')['default'] IconMdiArrowDownThin: typeof import('~icons/mdi/arrow-down-thin')['default'] IconMdiArrowUpThin: typeof import('~icons/mdi/arrow-up-thin')['default'] @@ -51,6 +54,7 @@ declare module 'vue' { LangSwitch: typeof import('./../components/common/lang-switch.vue')['default'] LookForward: typeof import('./../components/custom/look-forward.vue')['default'] MenuToggler: typeof import('./../components/common/menu-toggler.vue')['default'] + MenuTree: typeof import('./../components/custom/menu-tree.vue')['default'] MenuTreeSelect: typeof import('./../components/custom/menu-tree-select.vue')['default'] MonacoEditor: typeof import('./../components/common/monaco-editor.vue')['default'] NAlert: typeof import('naive-ui')['NAlert'] diff --git a/src/typings/elegant-router.d.ts b/src/typings/elegant-router.d.ts index 86a089db..d74f1839 100644 --- a/src/typings/elegant-router.d.ts +++ b/src/typings/elegant-router.d.ts @@ -41,6 +41,7 @@ declare module "@elegant-router/types" { "system_oss": "/system/oss"; "system_oss-config": "/system/oss-config"; "system_post": "/system/post"; + "system_role": "/system/role"; "system_tenant": "/system/tenant"; "system_user": "/system/user"; "tool": "/tool"; @@ -127,6 +128,7 @@ declare module "@elegant-router/types" { | "system_oss-config" | "system_oss" | "system_post" + | "system_role" | "system_tenant" | "system_user" | "tool_gen" diff --git a/src/views/_builtin/user-center/modules/user-avatar.vue b/src/views/_builtin/user-center/modules/user-avatar.vue index a51cadb4..45d03571 100644 --- a/src/views/_builtin/user-center/modules/user-avatar.vue +++ b/src/views/_builtin/user-center/modules/user-avatar.vue @@ -44,6 +44,7 @@ const options = reactive({ /** 编辑头像 */ function handleEdit() { + options.img = imageUrl.value; showDrawer(); } @@ -86,6 +87,7 @@ async function handleCrop() { if (!error) { window.$message?.success('头像更新成功!'); imageUrl.value = URL.createObjectURL(blob); + authStore.userInfo.user!.avatar = imageUrl.value; hideDrawer(); } }, 'image/png'); @@ -114,7 +116,7 @@ function handleClose() {
-
+
- user-avatar
选择图片 - - 确认裁剪 - + 确认裁剪
diff --git a/src/views/monitor/login-infor/index.vue b/src/views/monitor/login-infor/index.vue index 677a4251..e9954aa0 100644 --- a/src/views/monitor/login-infor/index.vue +++ b/src/views/monitor/login-infor/index.vue @@ -1,5 +1,4 @@ + + + + diff --git a/src/views/system/role/modules/role-auth-user-drawer.vue b/src/views/system/role/modules/role-auth-user-drawer.vue new file mode 100644 index 00000000..0bc27083 --- /dev/null +++ b/src/views/system/role/modules/role-auth-user-drawer.vue @@ -0,0 +1,206 @@ + + + + + diff --git a/src/views/system/role/modules/role-data-scope-drawer.vue b/src/views/system/role/modules/role-data-scope-drawer.vue new file mode 100644 index 00000000..4037107f --- /dev/null +++ b/src/views/system/role/modules/role-data-scope-drawer.vue @@ -0,0 +1,153 @@ + + + + + diff --git a/src/views/system/role/modules/role-operate-drawer.vue b/src/views/system/role/modules/role-operate-drawer.vue new file mode 100644 index 00000000..d0483af7 --- /dev/null +++ b/src/views/system/role/modules/role-operate-drawer.vue @@ -0,0 +1,197 @@ + + + + + diff --git a/src/views/system/role/modules/role-search.vue b/src/views/system/role/modules/role-search.vue new file mode 100644 index 00000000..7a51345b --- /dev/null +++ b/src/views/system/role/modules/role-search.vue @@ -0,0 +1,96 @@ + + + + + diff --git a/src/views/system/tenant/index.vue b/src/views/system/tenant/index.vue index c191c951..e9a68e44 100644 --- a/src/views/system/tenant/index.vue +++ b/src/views/system/tenant/index.vue @@ -1,6 +1,6 @@