From 66330f49135cb071d4337020309169f4d6de89c7 Mon Sep 17 00:00:00 2001 From: callmeyan Date: Thu, 8 Aug 2024 17:47:46 +0800 Subject: [PATCH] feat: add permission --- src/i18n/translations/sc.json | 8 ++-- src/i18n/translations/tc.json | 6 ++- src/pages/auth/permission.tsx | 88 +++++++++++++++++++++++++++++++++++ src/routes/index.tsx | 5 ++ src/service/api/user.ts | 7 +++ src/types/auth.d.ts | 7 ++- 6 files changed, 115 insertions(+), 6 deletions(-) create mode 100644 src/pages/auth/permission.tsx diff --git a/src/i18n/translations/sc.json b/src/i18n/translations/sc.json index 032ca01..80e9d9d 100644 --- a/src/i18n/translations/sc.json +++ b/src/i18n/translations/sc.json @@ -14,6 +14,7 @@ "qr-code": "二维码", "query_bill": "查询账单失败:", "remove": "删除", + "save": "保存", "student_number": "学号" }, "bill": { @@ -64,9 +65,9 @@ "title_bill_type_confirm": "确认账单", "title_confirm_status": "确认状态", "title_create_at": "创建时间", - "title_delivered_at": "到账时间", + "title_delivered_at": "交付学院时间", "title_department": "学系", - "title_initiated_paid_at": "开始支付时间", + "title_initiated_paid_at": "渠道支付时间", "title_operate": "操作", "title_paid_at": "支付时间", "title_pay_amount": "应付金额", @@ -92,7 +93,8 @@ "menu": { "bill": "账单查询", "check": "对账", - "manual": "现场支付" + "manual": "现场支付", + "permission": "权限管理" } }, "login": { diff --git a/src/i18n/translations/tc.json b/src/i18n/translations/tc.json index f28990b..ededa81 100644 --- a/src/i18n/translations/tc.json +++ b/src/i18n/translations/tc.json @@ -14,6 +14,7 @@ "qr-code": "QRCode", "query_bill": "查詢帳單失敗:", "remove": "刪除", + "save": "儲存", "student_number": "學號" }, "bill": { @@ -66,7 +67,7 @@ "title_create_at": "創建時間", "title_delivered_at": "到帳時間", "title_department": "學系", - "title_initiated_paid_at": "開始支付時間", + "title_initiated_paid_at": "渠道支付時間", "title_operate": "操作", "title_paid_at": "付款時間", "title_pay_amount": "應付金額", @@ -92,7 +93,8 @@ "menu": { "bill": "帳單查詢", "check": "對帳", - "manual": "現場支付" + "manual": "現場支付", + "permission": "權限管理" } }, "login": { diff --git a/src/pages/auth/permission.tsx b/src/pages/auth/permission.tsx new file mode 100644 index 0000000..2fbc298 --- /dev/null +++ b/src/pages/auth/permission.tsx @@ -0,0 +1,88 @@ +import {Card} from "@/components/card"; +import {useSetState} from "ahooks"; +import {Button, Space, Spin, TagInput, Toast} from "@douyinfe/semi-ui"; +import {useTranslation} from "react-i18next"; +import {useEffect} from "react"; +import {getPermissionList, savePermissionList} from "@/service/api/user.ts"; + +const DEFAULT_ROLES = [ + 'root','ro','fo' +] + +const Permission = ()=>{ + const {t} = useTranslation() + const [state,setState] = useSetState<{ + list:PermissionUserList[]; + loading?:boolean; + }>({ + list:[] + }) + const onUsernameChange = (role_name:string,username_list: string[])=>{ + const index = state.list.findIndex(it=>it.role_name == role_name) + if(index != -1){ + state.list[index] = { + role_name,username_list + }; + setState({ + list:state.list + }) + } + } + const saveRoles = ()=>{ + setState({ + loading:true + }) + savePermissionList(state.list).then(()=>{ + Toast.success({content:`Save Success`,duration: 3,}) + }).catch(e=>{ + Toast.error({ + content:`Save Error:${e.message}`, + duration: 3, + }) + }).finally(()=>{ + setState({loading:false}) + }) + } + const loadAllPermission = ()=>{ + setState({ + loading:true + }) + getPermissionList().then(list=>{ + const roles:{ + [key:string]:string[] + } = {} + // array to object + list.forEach(it=>{ + roles[it.role_name] = it.username_list + }) + const permissionList:PermissionUserList[] = []; + DEFAULT_ROLES.forEach(role_name=>{ + permissionList.push({ + role_name,username_list: roles[role_name] + }) + }) + setState({list:permissionList}) + }).finally(()=>{ + setState({loading:false}) + }) + } + useEffect(loadAllPermission,[]) + + return ( + {state.list.map(it=>(
+
{it.role_name.toUpperCase()}
+ onUsernameChange(it.role_name,users)} + /> +
))} + + +
{state.message||''}
+
+
) +} +export default Permission \ No newline at end of file diff --git a/src/routes/index.tsx b/src/routes/index.tsx index b0e60cc..42c36be 100644 --- a/src/routes/index.tsx +++ b/src/routes/index.tsx @@ -21,6 +21,7 @@ import ManualIndex from "@/pages/manual/index.tsx"; import BillQuery from "@/pages/bill/query.tsx"; import BillReconciliation from "@/pages/bill/reconciliation.tsx"; import ExternalCreate from "@/pages/bill/external_create.tsx"; +import Permission from "@/pages/auth/permission.tsx"; const routes: RouteObject[] = [ @@ -76,6 +77,10 @@ const routes: RouteObject[] = [ path: 'reconciliation', element: }, + { + path: 'permission', + element: + }, ] }, ] diff --git a/src/service/api/user.ts b/src/service/api/user.ts index 6c4c714..c4b5765 100644 --- a/src/service/api/user.ts +++ b/src/service/api/user.ts @@ -11,4 +11,11 @@ export function getUserInfo() { */ export function auth(code:string,state:string){ return post('/auth', {code, state}) +} + +export function getPermissionList(){ + return get('/roles') +} +export function savePermissionList(roles:PermissionUserList[]){ + return post('/roles',{roles}) } \ No newline at end of file diff --git a/src/types/auth.d.ts b/src/types/auth.d.ts index f894438..9d298eb 100644 --- a/src/types/auth.d.ts +++ b/src/types/auth.d.ts @@ -31,4 +31,9 @@ declare type AuthContextType = { mockLogin: () => Promise; login: (code:string,state:string) => Promise; updateUser: (user:Partial) => Promise; -}; \ No newline at end of file +}; + +declare type PermissionUserList = { + role_name:string; + username_list: string[]; +} \ No newline at end of file