From 680364eae35d3850c5e4caa02793c71628d964bb Mon Sep 17 00:00:00 2001 From: Jimmy Liow Date: Thu, 13 Jun 2024 16:58:09 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=A2=9E=E5=8A=A0=E6=9D=83=E9=99=90?= =?UTF-8?q?=E8=A1=A8=E8=AE=BE=E8=AE=A1=EF=BC=8C=E5=A2=9E=E5=8A=A0=E7=A6=81?= =?UTF-8?q?=E7=94=A8=E3=80=81=E9=87=8D=E7=BD=AE=E5=AF=86=E7=A0=81=E6=93=8D?= =?UTF-8?q?=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/RBAC 权限.sql | 66 +++++++++++++++++++++++++++++++ doc/价格管理平台.bmpr | Bin 254976 -> 254976 bytes src/views/account/Management.jsx | 56 ++++++++++++++++++++------ 3 files changed, 111 insertions(+), 11 deletions(-) create mode 100644 doc/RBAC 权限.sql diff --git a/doc/RBAC 权限.sql b/doc/RBAC 权限.sql new file mode 100644 index 0000000..6e70db9 --- /dev/null +++ b/doc/RBAC 权限.sql @@ -0,0 +1,66 @@ +CREATE TABLE auth_role +( + [role_id] [int] IDENTITY(1,1) NOT NULL, + [role_name] [nvarchar](255) NOT NULL, + [created_on] [datetime] NOT NULL, + CONSTRAINT [PK_auth_role] PRIMARY KEY CLUSTERED +( + [role_id] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] + +ALTER TABLE auth_role ADD CONSTRAINT [DF_auth_role_created_on] DEFAULT (getdate()) FOR [created_on] + +CREATE TABLE auth_permission +( + [role_id] [int] NOT NULL, + [res_id] [int] NOT NULL +) ON [PRIMARY] + +CREATE TABLE auth_resource +( + [res_id] [int] IDENTITY(1,1) NOT NULL, + [res_name] [nvarchar](255) NOT NULL, + [res_pattern] [nvarchar](255) NOT NULL, + [res_category] [nvarchar](255) NOT NULL, + CONSTRAINT [PK_auth_resource] PRIMARY KEY CLUSTERED +( + [res_id] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] + +INSERT INTO [dbo].[auth_role] ([role_name]) +VALUES ('系统管理员') +INSERT INTO [dbo].[auth_role] ([role_name]) +VALUES ('国内供应商') +INSERT INTO [dbo].[auth_role] ([role_name]) +VALUES ('海外供应商') +INSERT INTO [dbo].[auth_role] ([role_name]) +VALUES ('客服组') +INSERT INTO [dbo].[auth_role] ([role_name]) +VALUES ('产品组') +INSERT INTO [dbo].[auth_role] ([role_name]) +VALUES ('技术研发部') + +INSERT INTO [dbo].[auth_resource] ([res_name] ,[res_pattern], [res_category]) +VALUES ('所有权限', '*', 'system') +INSERT INTO [dbo].[auth_resource] ([res_name] ,[res_pattern], [res_category]) +VALUES ('最新团计划', '/reservation/newest', 'oversea') +INSERT INTO [dbo].[auth_resource] ([res_name] ,[res_pattern], [res_category]) +VALUES ('账单', '/invoice', 'oversea') + +INSERT INTO [dbo].[auth_resource] ([res_name] ,[res_pattern], [res_category]) +VALUES ('账号权限管理', '/account/management', 'system') +INSERT INTO [dbo].[auth_resource] ([res_name] ,[res_pattern], [res_category]) +VALUES ('新增角色', '/account/new-role', 'system') + +INSERT INTO [dbo].[auth_permission] ([role_id] ,[res_id]) +VALUES (1, 1) +INSERT INTO [dbo].[auth_permission] ([role_id] ,[res_id]) +VALUES (6, 2) +INSERT INTO [dbo].[auth_permission] ([role_id] ,[res_id]) +VALUES (6, 3) +INSERT INTO [dbo].[auth_permission] ([role_id] ,[res_id]) +VALUES (6, 4) +INSERT INTO [dbo].[auth_permission] ([role_id] ,[res_id]) +VALUES (6, 5) diff --git a/doc/价格管理平台.bmpr b/doc/价格管理平台.bmpr index f82ae8076d9aab3c8dcfdcdd040fbe0d2877c22e..5bd9d48cd30da1a1b9adffdfa79859ecd09cd145 100644 GIT binary patch delta 6928 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 console.info('account:action.assignRole')}>{text} + + ) + } + + function roleRender(text) { + return ( + ) } function actionRender() { return ( - - + + ) } @@ -119,6 +124,7 @@ function Management() { console.log('onChange ', newValue); setPermissionValue(newValue); } + const [permissionValue, setPermissionValue] = useState(['0-0-0']) const [isAccountModalOpen, setAccountModalOpen] = useState(false) const [isRoleModalOpen, setRoleModalOpen] = useState(false) @@ -168,12 +174,12 @@ function Management() { const formValuesToSub = useFormStore((state) => state.formValuesToSub) - const [form] = Form.useForm() + const [editAccountForm, editRoleForm] = Form.useForm() const [fetchReservationList] = useReservationStore((state) => [state.fetchAllGuideList, state.fetchReservationList, state.reservationList, state.reservationPage, state.cityList, state.selectReservation, state.getCityListByReservationId]) - const { notification } = App.useApp() + const { notification, modal } = App.useApp() const handleAccountOk = () => { } @@ -202,6 +208,34 @@ function Management() { const onSearchClick = (current=1, status=null) => { } + const showDisableConfirm = () => { + modal.confirm({ + title: 'Do you want to disable this account?', + icon: , + content: 'Username: Ivy, Realname: 怡小芳', + onOk() { + console.log('OK') + }, + onCancel() { + console.log('Cancel') + }, + }) + } + + const showResetPasswordConfirm = () => { + modal.confirm({ + title: 'Do you want to reset password?', + icon: , + content: 'Username: Ivy, Realname: 怡小芳', + onOk() { + console.log('OK') + }, + onCancel() { + console.log('Cancel') + }, + }) + } + return ( <>