diff --git a/backend/dbhelper/role.py b/backend/dbhelper/role.py index 9af9309..4c9a4a0 100644 --- a/backend/dbhelper/role.py +++ b/backend/dbhelper/role.py @@ -13,7 +13,7 @@ async def get_role_menus(rid: int): """ select m.id, m.name, m.meta, m.path, m.type, m.component, m.pid, m.identifier FROM sys_menu as m, sys_role_menu WHERE m.id = sys_role_menu.mid - AND sys_role_menu.rid = (?) AND m.`status` = 1""", + AND sys_role_menu.rid = (?) AND sys_role_menu.`status` = 1""", [rid], ) diff --git a/backend/dbhelper/user.py b/backend/dbhelper/user.py index ea1da61..364861e 100644 --- a/backend/dbhelper/user.py +++ b/backend/dbhelper/user.py @@ -32,7 +32,20 @@ async def get_user_info(user: UserModel): [user.id], ) - return {**jsonable_encoder(user), "roles": sql_result} + # 当前激活角色的按钮权限列表 + perm_result = await db.execute_query_dict( + """ + select m.identifier from sys_role_menu as rm, sys_menu as m where rm.mid = m.id and rm.rid = (?) and + m.identifier not null and m.identifier != "" and rm.status != 9 + """, + [sql_result[0]["id"]], + ) + + return { + **jsonable_encoder(user), + "roles": sql_result, + "permissions": [i["identifier"] for i in perm_result], + } async def get_users(skip: int, limit: int, kwargs: dict = None): diff --git a/backend/mini.db-shm b/backend/mini.db-shm index 91a222d..763739d 100644 Binary files a/backend/mini.db-shm and b/backend/mini.db-shm differ diff --git a/backend/mini.db-wal b/backend/mini.db-wal index ba48e78..0c69346 100644 Binary files a/backend/mini.db-wal and b/backend/mini.db-wal differ diff --git a/backend/schemas/user.py b/backend/schemas/user.py index 427f509..d795419 100644 --- a/backend/schemas/user.py +++ b/backend/schemas/user.py @@ -41,6 +41,7 @@ class UserInfo(UserRead): """用户信息模型""" roles: list[UserHasRole] = Field(..., description="用户拥有角色") + permissions: list[str] = Field(..., description="角色拥有的按钮权限标识") class RoleActive(BaseModel): diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 525386a..4ac9273 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -10,6 +10,8 @@ "dependencies": { "ant-design-vue": "^3.2.12", "axios": "^0.27.2", + "moment": "^2.29.4", + "monent": "^0.0.2-security", "normalize.css": "^8.0.1", "pinia": "^2.0.21", "pinia-plugin-persistedstate": "^2.2.0", @@ -1131,6 +1133,19 @@ "node": ">=10" } }, + "node_modules/moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "engines": { + "node": "*" + } + }, + "node_modules/monent": { + "version": "0.0.2-security", + "resolved": "https://registry.npmjs.org/monent/-/monent-0.0.2-security.tgz", + "integrity": "sha512-qghr6SG18OAHdr2emuACuhMJWUi1Yax10+V0N1Fr3ISC921hOtw6g7fuDxdgJszzSGTMFyKiUgBRafpKRrsjkQ==" + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -2365,6 +2380,16 @@ "brace-expansion": "^2.0.1" } }, + "moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" + }, + "monent": { + "version": "0.0.2-security", + "resolved": "https://registry.npmjs.org/monent/-/monent-0.0.2-security.tgz", + "integrity": "sha512-qghr6SG18OAHdr2emuACuhMJWUi1Yax10+V0N1Fr3ISC921hOtw6g7fuDxdgJszzSGTMFyKiUgBRafpKRrsjkQ==" + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", diff --git a/frontend/package.json b/frontend/package.json index 5de3dab..8a842aa 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -9,6 +9,7 @@ "dependencies": { "ant-design-vue": "^3.2.12", "axios": "^0.27.2", + "moment": "^2.29.4", "normalize.css": "^8.0.1", "pinia": "^2.0.21", "pinia-plugin-persistedstate": "^2.2.0", diff --git a/frontend/src/main.js b/frontend/src/main.js index 03ac7bd..3a561f8 100644 --- a/frontend/src/main.js +++ b/frontend/src/main.js @@ -10,9 +10,10 @@ import "normalize.css"; import "@/assets/css/base.css"; import "ant-design-vue/dist/antd.css"; +import hasPermisson from "@/utils/directive"; const app = createApp(App); - +hasPermisson(app); app.use(store); userStore().loadRoleRouter(); diff --git a/frontend/src/service/user.js b/frontend/src/service/user.js index 73ae873..8fbe992 100644 --- a/frontend/src/service/user.js +++ b/frontend/src/service/user.js @@ -29,3 +29,10 @@ export function selectRole(rid) { method: "put", }); } + +// 获取用户列表 +export function getUsers() { + return request({ + url: "/user", + }); +} diff --git a/frontend/src/utils/directive.js b/frontend/src/utils/directive.js new file mode 100644 index 0000000..6872844 --- /dev/null +++ b/frontend/src/utils/directive.js @@ -0,0 +1,17 @@ +import { userStore } from "@/stores/user"; + +export default (app) => { + // 按钮权限 + app.directive("per", { + mounted(el, binding) { + console.log(el, binding.value); + if ( + // 是否存在 + userStore().userInfo.permissions.indexOf(binding.value) === -1 + ) { + // 删除元素 + el.parentNode && el.parentNode.removeChild(el); + } + }, + }); +}; diff --git a/frontend/src/utils/format.js b/frontend/src/utils/format.js new file mode 100644 index 0000000..1bf7283 --- /dev/null +++ b/frontend/src/utils/format.js @@ -0,0 +1,5 @@ +import moment from "moment"; + +export const formatTime = (value) => { + return moment(value).format("YYYY-MM-DD HH:mm:ss"); +}; diff --git a/frontend/src/utils/request.js b/frontend/src/utils/request.js index a633c95..fa79c12 100644 --- a/frontend/src/utils/request.js +++ b/frontend/src/utils/request.js @@ -20,7 +20,7 @@ export default (config) => { if (res.data.code !== 200) { message.error(res.data.msg); } - + console.log(res.data); return res.data; }, (err) => { diff --git a/frontend/src/views/main/system/user/conf.js b/frontend/src/views/main/system/user/conf.js new file mode 100644 index 0000000..390a3af --- /dev/null +++ b/frontend/src/views/main/system/user/conf.js @@ -0,0 +1,39 @@ +// 表格数据列 表头配置 +export const columns = [ + { + title: "序号", + dataIndex: "index", + key: "index", + align: "center", + customRender: ({ text, record, index }) => `${index + 1}`, + }, + { + title: "用户名", + dataIndex: "username", + key: "username", + }, + { + title: "昵称", + dataIndex: "nickname", + key: "nickname", + }, + { + title: "状态", + dataIndex: "status", + key: "status", + }, + { + title: "创建时间", + dataIndex: "created", + key: "created", + }, + { + title: "更新时间", + dataIndex: "modified", + key: "modified", + }, + { + title: "操作", + key: "action", + }, +]; diff --git a/frontend/src/views/main/system/user/user.vue b/frontend/src/views/main/system/user/user.vue index b1a7cde..4931c12 100644 --- a/frontend/src/views/main/system/user/user.vue +++ b/frontend/src/views/main/system/user/user.vue @@ -1,7 +1,122 @@ - + - +