From 8ae8a17bbb3abd483b3dd60bb2035aef203a183a Mon Sep 17 00:00:00 2001 From: "daniel.w" Date: Mon, 19 Aug 2024 09:39:05 +0800 Subject: [PATCH] feat: add role and update role --- .../permissionservice/permission_service.go | 21 ++- client/roleservice/role_service.go | 35 ++++- client/tokenservice/token_service.go | 11 ++ client/userroleservice/user_role_service.go | 97 ++++++++++++++ ...20240819013052_create_roles_table.down.sql | 1 + .../20240819013052_create_roles_table.up.sql | 12 ++ ...0819022436_create_user_role_table.down.sql | 1 + ...240819022436_create_user_role_table.up.sql | 12 ++ ...0248_create_role_permission_table.down.sql | 1 + ...090248_create_role_permission_table.up.sql | 10 ++ .../seeder/20230620025708_init_role.down.sql | 1 + .../seeder/20230620025708_init_role.up.sql | 3 + .../20240816014305_init_permission.up.sql | 0 generate/protobuf/permission.proto | 95 ++++++++++++- internal/entity/role.go | 17 +++ internal/entity/role_change_log.go | 25 ++++ internal/entity/user_role.go | 20 +++ .../list_permission_logic.go | 31 +++++ .../logic/roleservice/create_role_logic.go | 84 ++++++++++++ internal/logic/roleservice/get_role_logic.go | 43 ++++++ internal/logic/roleservice/ping_logic.go | 30 ----- .../logic/roleservice/update_role_logic.go | 75 +++++++++++ .../userroleservice/create_user_role_logic.go | 31 +++++ .../get_user_permission_logic.go | 31 +++++ .../userroleservice/get_user_role_logic.go | 30 +++++ .../userroleservice/update_user_role_logic.go | 31 +++++ internal/model/role_model.go | 84 ++++++++++++ internal/model/role_model_gen.go | 125 ++++++++++++++++++ internal/model/role_permission_model.go | 24 ++++ internal/model/role_permission_model_gen.go | 94 +++++++++++++ internal/model/user_role_model.go | 24 ++++ internal/model/user_role_model_gen.go | 111 ++++++++++++++++ .../permission_service_server.go | 8 +- .../server/roleservice/role_service_server.go | 19 ++- .../user_role_service_server.go | 47 +++++++ internal/svc/service_context.go | 10 +- 36 files changed, 1245 insertions(+), 49 deletions(-) create mode 100644 client/userroleservice/user_role_service.go create mode 100644 generate/database/mysql/20240819013052_create_roles_table.down.sql create mode 100644 generate/database/mysql/20240819013052_create_roles_table.up.sql create mode 100644 generate/database/mysql/20240819022436_create_user_role_table.down.sql create mode 100644 generate/database/mysql/20240819022436_create_user_role_table.up.sql create mode 100644 generate/database/mysql/20240819090248_create_role_permission_table.down.sql create mode 100644 generate/database/mysql/20240819090248_create_role_permission_table.up.sql create mode 100644 generate/database/seeder/20230620025708_init_role.down.sql create mode 100644 generate/database/seeder/20230620025708_init_role.up.sql rename generate/database/{mysql => }/seeder/20240816014305_init_permission.up.sql (100%) create mode 100644 internal/entity/role.go create mode 100644 internal/entity/role_change_log.go create mode 100644 internal/entity/user_role.go create mode 100644 internal/logic/permissionservice/list_permission_logic.go create mode 100644 internal/logic/roleservice/create_role_logic.go create mode 100644 internal/logic/roleservice/get_role_logic.go delete mode 100644 internal/logic/roleservice/ping_logic.go create mode 100644 internal/logic/roleservice/update_role_logic.go create mode 100644 internal/logic/userroleservice/create_user_role_logic.go create mode 100644 internal/logic/userroleservice/get_user_permission_logic.go create mode 100644 internal/logic/userroleservice/get_user_role_logic.go create mode 100644 internal/logic/userroleservice/update_user_role_logic.go create mode 100755 internal/model/role_model.go create mode 100755 internal/model/role_model_gen.go create mode 100755 internal/model/role_permission_model.go create mode 100755 internal/model/role_permission_model_gen.go create mode 100755 internal/model/user_role_model.go create mode 100755 internal/model/user_role_model_gen.go create mode 100644 internal/server/userroleservice/user_role_service_server.go diff --git a/client/permissionservice/permission_service.go b/client/permissionservice/permission_service.go index 223681e..0b63741 100644 --- a/client/permissionservice/permission_service.go +++ b/client/permissionservice/permission_service.go @@ -19,31 +19,42 @@ type ( CheckPermissionByRoleReq = permission.CheckPermissionByRoleReq CreateOneTimeTokenReq = permission.CreateOneTimeTokenReq CreateOneTimeTokenResp = permission.CreateOneTimeTokenResp + CreateRoleReq = permission.CreateRoleReq DoTokenByDeviceIDReq = permission.DoTokenByDeviceIDReq DoTokenByUIDReq = permission.DoTokenByUIDReq GetPermissionStatusByPathReq = permission.GetPermissionStatusByPathReq + GetRoleReq = permission.GetRoleReq + GetRoleResp = permission.GetRoleResp + GetUserRoleResp = permission.GetUserRoleResp ListPermissionResp = permission.ListPermissionResp ListPermissionStatusResp = permission.ListPermissionStatusResp MapPermissionStatusResp = permission.MapPermissionStatusResp NoneReq = permission.NoneReq OKResp = permission.OKResp + PageResponse = permission.PageResponse PermissionItem = permission.PermissionItem PermissionResp = permission.PermissionResp PermissionStatusItem = permission.PermissionStatusItem QueryTokenByUIDReq = permission.QueryTokenByUIDReq RefreshTokenReq = permission.RefreshTokenReq RefreshTokenResp = permission.RefreshTokenResp + RoleResp = permission.RoleResp Token = permission.Token TokenResp = permission.TokenResp Tokens = permission.Tokens + UpdateRoleReq = permission.UpdateRoleReq + UserPermissionReq = permission.UserPermissionReq + UserPermissionResp = permission.UserPermissionResp + UserRoleReq = permission.UserRoleReq + UserRoleResp = permission.UserRoleResp ValidationTokenReq = permission.ValidationTokenReq ValidationTokenResp = permission.ValidationTokenResp PermissionService interface { // ListPermissionStatus 取得所有權限狀態列表,給前端表演用 ListPermissionStatus(ctx context.Context, in *NoneReq, opts ...grpc.CallOption) (*ListPermissionStatusResp, error) - // MapPermissionStatus 取得所有權限開閉狀態,簡易版,給前端表演用 - MapPermissionStatus(ctx context.Context, in *NoneReq, opts ...grpc.CallOption) (*MapPermissionStatusResp, error) + // ListPermission 一次性取得所有權限表 + ListPermission(ctx context.Context, in *NoneReq, opts ...grpc.CallOption) (*MapPermissionStatusResp, error) // CheckPermissionByRole 透過角色 ID 來檢視權限,後台要通過時真的看這個 CheckPermissionByRole(ctx context.Context, in *CheckPermissionByRoleReq, opts ...grpc.CallOption) (*PermissionResp, error) // GetPermissionStatusByPath 透過資源拿取角色的狀態 @@ -67,10 +78,10 @@ func (m *defaultPermissionService) ListPermissionStatus(ctx context.Context, in return client.ListPermissionStatus(ctx, in, opts...) } -// MapPermissionStatus 取得所有權限開閉狀態,簡易版,給前端表演用 -func (m *defaultPermissionService) MapPermissionStatus(ctx context.Context, in *NoneReq, opts ...grpc.CallOption) (*MapPermissionStatusResp, error) { +// ListPermission 一次性取得所有權限表 +func (m *defaultPermissionService) ListPermission(ctx context.Context, in *NoneReq, opts ...grpc.CallOption) (*MapPermissionStatusResp, error) { client := permission.NewPermissionServiceClient(m.cli.Conn()) - return client.MapPermissionStatus(ctx, in, opts...) + return client.ListPermission(ctx, in, opts...) } // CheckPermissionByRole 透過角色 ID 來檢視權限,後台要通過時真的看這個 diff --git a/client/roleservice/role_service.go b/client/roleservice/role_service.go index c2bbf81..4607362 100644 --- a/client/roleservice/role_service.go +++ b/client/roleservice/role_service.go @@ -19,28 +19,44 @@ type ( CheckPermissionByRoleReq = permission.CheckPermissionByRoleReq CreateOneTimeTokenReq = permission.CreateOneTimeTokenReq CreateOneTimeTokenResp = permission.CreateOneTimeTokenResp + CreateRoleReq = permission.CreateRoleReq DoTokenByDeviceIDReq = permission.DoTokenByDeviceIDReq DoTokenByUIDReq = permission.DoTokenByUIDReq GetPermissionStatusByPathReq = permission.GetPermissionStatusByPathReq + GetRoleReq = permission.GetRoleReq + GetRoleResp = permission.GetRoleResp + GetUserRoleResp = permission.GetUserRoleResp ListPermissionResp = permission.ListPermissionResp ListPermissionStatusResp = permission.ListPermissionStatusResp MapPermissionStatusResp = permission.MapPermissionStatusResp NoneReq = permission.NoneReq OKResp = permission.OKResp + PageResponse = permission.PageResponse PermissionItem = permission.PermissionItem PermissionResp = permission.PermissionResp PermissionStatusItem = permission.PermissionStatusItem QueryTokenByUIDReq = permission.QueryTokenByUIDReq RefreshTokenReq = permission.RefreshTokenReq RefreshTokenResp = permission.RefreshTokenResp + RoleResp = permission.RoleResp Token = permission.Token TokenResp = permission.TokenResp Tokens = permission.Tokens + UpdateRoleReq = permission.UpdateRoleReq + UserPermissionReq = permission.UserPermissionReq + UserPermissionResp = permission.UserPermissionResp + UserRoleReq = permission.UserRoleReq + UserRoleResp = permission.UserRoleResp ValidationTokenReq = permission.ValidationTokenReq ValidationTokenResp = permission.ValidationTokenResp RoleService interface { - Ping(ctx context.Context, in *OKResp, opts ...grpc.CallOption) (*OKResp, error) + // CreateRole 建立角色 + CreateRole(ctx context.Context, in *CreateRoleReq, opts ...grpc.CallOption) (*RoleResp, error) + // GetRole 取得搜尋的角色 + GetRole(ctx context.Context, in *GetRoleReq, opts ...grpc.CallOption) (*GetRoleResp, error) + // UpdateRole 更新角色 + UpdateRole(ctx context.Context, in *UpdateRoleReq, opts ...grpc.CallOption) (*RoleResp, error) } defaultRoleService struct { @@ -54,7 +70,20 @@ func NewRoleService(cli zrpc.Client) RoleService { } } -func (m *defaultRoleService) Ping(ctx context.Context, in *OKResp, opts ...grpc.CallOption) (*OKResp, error) { +// CreateRole 建立角色 +func (m *defaultRoleService) CreateRole(ctx context.Context, in *CreateRoleReq, opts ...grpc.CallOption) (*RoleResp, error) { client := permission.NewRoleServiceClient(m.cli.Conn()) - return client.Ping(ctx, in, opts...) + return client.CreateRole(ctx, in, opts...) +} + +// GetRole 取得搜尋的角色 +func (m *defaultRoleService) GetRole(ctx context.Context, in *GetRoleReq, opts ...grpc.CallOption) (*GetRoleResp, error) { + client := permission.NewRoleServiceClient(m.cli.Conn()) + return client.GetRole(ctx, in, opts...) +} + +// UpdateRole 更新角色 +func (m *defaultRoleService) UpdateRole(ctx context.Context, in *UpdateRoleReq, opts ...grpc.CallOption) (*RoleResp, error) { + client := permission.NewRoleServiceClient(m.cli.Conn()) + return client.UpdateRole(ctx, in, opts...) } diff --git a/client/tokenservice/token_service.go b/client/tokenservice/token_service.go index 78dc0ac..f28e13d 100644 --- a/client/tokenservice/token_service.go +++ b/client/tokenservice/token_service.go @@ -19,23 +19,34 @@ type ( CheckPermissionByRoleReq = permission.CheckPermissionByRoleReq CreateOneTimeTokenReq = permission.CreateOneTimeTokenReq CreateOneTimeTokenResp = permission.CreateOneTimeTokenResp + CreateRoleReq = permission.CreateRoleReq DoTokenByDeviceIDReq = permission.DoTokenByDeviceIDReq DoTokenByUIDReq = permission.DoTokenByUIDReq GetPermissionStatusByPathReq = permission.GetPermissionStatusByPathReq + GetRoleReq = permission.GetRoleReq + GetRoleResp = permission.GetRoleResp + GetUserRoleResp = permission.GetUserRoleResp ListPermissionResp = permission.ListPermissionResp ListPermissionStatusResp = permission.ListPermissionStatusResp MapPermissionStatusResp = permission.MapPermissionStatusResp NoneReq = permission.NoneReq OKResp = permission.OKResp + PageResponse = permission.PageResponse PermissionItem = permission.PermissionItem PermissionResp = permission.PermissionResp PermissionStatusItem = permission.PermissionStatusItem QueryTokenByUIDReq = permission.QueryTokenByUIDReq RefreshTokenReq = permission.RefreshTokenReq RefreshTokenResp = permission.RefreshTokenResp + RoleResp = permission.RoleResp Token = permission.Token TokenResp = permission.TokenResp Tokens = permission.Tokens + UpdateRoleReq = permission.UpdateRoleReq + UserPermissionReq = permission.UserPermissionReq + UserPermissionResp = permission.UserPermissionResp + UserRoleReq = permission.UserRoleReq + UserRoleResp = permission.UserRoleResp ValidationTokenReq = permission.ValidationTokenReq ValidationTokenResp = permission.ValidationTokenResp diff --git a/client/userroleservice/user_role_service.go b/client/userroleservice/user_role_service.go new file mode 100644 index 0000000..68ccc0e --- /dev/null +++ b/client/userroleservice/user_role_service.go @@ -0,0 +1,97 @@ +// Code generated by goctl. DO NOT EDIT. +// Source: permission.proto + +package userroleservice + +import ( + "context" + + "ark-permission/gen_result/pb/permission" + + "github.com/zeromicro/go-zero/zrpc" + "google.golang.org/grpc" +) + +type ( + AuthorizationReq = permission.AuthorizationReq + CancelOneTimeTokenReq = permission.CancelOneTimeTokenReq + CancelTokenReq = permission.CancelTokenReq + CheckPermissionByRoleReq = permission.CheckPermissionByRoleReq + CreateOneTimeTokenReq = permission.CreateOneTimeTokenReq + CreateOneTimeTokenResp = permission.CreateOneTimeTokenResp + CreateRoleReq = permission.CreateRoleReq + DoTokenByDeviceIDReq = permission.DoTokenByDeviceIDReq + DoTokenByUIDReq = permission.DoTokenByUIDReq + GetPermissionStatusByPathReq = permission.GetPermissionStatusByPathReq + GetRoleReq = permission.GetRoleReq + GetRoleResp = permission.GetRoleResp + GetUserRoleResp = permission.GetUserRoleResp + ListPermissionResp = permission.ListPermissionResp + ListPermissionStatusResp = permission.ListPermissionStatusResp + MapPermissionStatusResp = permission.MapPermissionStatusResp + NoneReq = permission.NoneReq + OKResp = permission.OKResp + PageResponse = permission.PageResponse + PermissionItem = permission.PermissionItem + PermissionResp = permission.PermissionResp + PermissionStatusItem = permission.PermissionStatusItem + QueryTokenByUIDReq = permission.QueryTokenByUIDReq + RefreshTokenReq = permission.RefreshTokenReq + RefreshTokenResp = permission.RefreshTokenResp + RoleResp = permission.RoleResp + Token = permission.Token + TokenResp = permission.TokenResp + Tokens = permission.Tokens + UpdateRoleReq = permission.UpdateRoleReq + UserPermissionReq = permission.UserPermissionReq + UserPermissionResp = permission.UserPermissionResp + UserRoleReq = permission.UserRoleReq + UserRoleResp = permission.UserRoleResp + ValidationTokenReq = permission.ValidationTokenReq + ValidationTokenResp = permission.ValidationTokenResp + + UserRoleService interface { + // CreateUserRole 建立角色 + CreateUserRole(ctx context.Context, in *UserRoleReq, opts ...grpc.CallOption) (*UserRoleResp, error) + // UpdateRole 更新角色 + UpdateUserRole(ctx context.Context, in *UserRoleReq, opts ...grpc.CallOption) (*UserRoleResp, error) + // GetUserRole 取得角色綁定表,沒有搜尋條件就全部,不分頁 + GetUserRole(ctx context.Context, in *UserRoleReq, opts ...grpc.CallOption) (*GetUserRoleResp, error) + // GetUserPermission 取得角色權限 + GetUserPermission(ctx context.Context, in *UserPermissionReq, opts ...grpc.CallOption) (*UserPermissionResp, error) + } + + defaultUserRoleService struct { + cli zrpc.Client + } +) + +func NewUserRoleService(cli zrpc.Client) UserRoleService { + return &defaultUserRoleService{ + cli: cli, + } +} + +// CreateUserRole 建立角色 +func (m *defaultUserRoleService) CreateUserRole(ctx context.Context, in *UserRoleReq, opts ...grpc.CallOption) (*UserRoleResp, error) { + client := permission.NewUserRoleServiceClient(m.cli.Conn()) + return client.CreateUserRole(ctx, in, opts...) +} + +// UpdateRole 更新角色 +func (m *defaultUserRoleService) UpdateUserRole(ctx context.Context, in *UserRoleReq, opts ...grpc.CallOption) (*UserRoleResp, error) { + client := permission.NewUserRoleServiceClient(m.cli.Conn()) + return client.UpdateUserRole(ctx, in, opts...) +} + +// GetUserRole 取得角色綁定表,沒有搜尋條件就全部,不分頁 +func (m *defaultUserRoleService) GetUserRole(ctx context.Context, in *UserRoleReq, opts ...grpc.CallOption) (*GetUserRoleResp, error) { + client := permission.NewUserRoleServiceClient(m.cli.Conn()) + return client.GetUserRole(ctx, in, opts...) +} + +// GetUserPermission 取得角色權限 +func (m *defaultUserRoleService) GetUserPermission(ctx context.Context, in *UserPermissionReq, opts ...grpc.CallOption) (*UserPermissionResp, error) { + client := permission.NewUserRoleServiceClient(m.cli.Conn()) + return client.GetUserPermission(ctx, in, opts...) +} diff --git a/generate/database/mysql/20240819013052_create_roles_table.down.sql b/generate/database/mysql/20240819013052_create_roles_table.down.sql new file mode 100644 index 0000000..37e4134 --- /dev/null +++ b/generate/database/mysql/20240819013052_create_roles_table.down.sql @@ -0,0 +1 @@ +DROP TABLE IF EXISTS `role`; diff --git a/generate/database/mysql/20240819013052_create_roles_table.up.sql b/generate/database/mysql/20240819013052_create_roles_table.up.sql new file mode 100644 index 0000000..b4b6229 --- /dev/null +++ b/generate/database/mysql/20240819013052_create_roles_table.up.sql @@ -0,0 +1,12 @@ +CREATE TABLE `role` +( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'PK', + `role_id` varchar(50) NOT NULL, + `display_name` varchar(255) NOT NULL COMMENT '名稱', + `status` tinyint NOT NULL DEFAULT '1' COMMENT '狀態 1: 啟用, 2: 禁用', + `create_time` bigint DEFAULT 0 NOT NULL COMMENT '創建時間', + `update_time` bigint DEFAULT 0 NOT NULL COMMENT '更新時間', + PRIMARY KEY (`id`), + UNIQUE KEY `uid_unique_key` (`role_id`), + UNIQUE KEY `name_unique_key` (`display_name`) +) ENGINE = InnoDB COMMENT ='角色'; \ No newline at end of file diff --git a/generate/database/mysql/20240819022436_create_user_role_table.down.sql b/generate/database/mysql/20240819022436_create_user_role_table.down.sql new file mode 100644 index 0000000..c27c315 --- /dev/null +++ b/generate/database/mysql/20240819022436_create_user_role_table.down.sql @@ -0,0 +1 @@ +DROP TABLE IF EXISTS `user_role`; diff --git a/generate/database/mysql/20240819022436_create_user_role_table.up.sql b/generate/database/mysql/20240819022436_create_user_role_table.up.sql new file mode 100644 index 0000000..040fd6c --- /dev/null +++ b/generate/database/mysql/20240819022436_create_user_role_table.up.sql @@ -0,0 +1,12 @@ +CREATE TABLE `user_role` +( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'PK', + `brand` varchar(50) DEFAULT '' NOT NULL COMMENT '', + `uid` varchar(50) NOT NULL, + `role_id` varchar(50) NOT NULL, + `status` tinyint NOT NULL DEFAULT '1' COMMENT '狀態 1: 啟用, 2: 禁用', + `create_time` bigint DEFAULT 0 NOT NULL COMMENT '創建時間', + `update_time` bigint DEFAULT 0 NOT NULL COMMENT '更新時間', + PRIMARY KEY (`id`), + UNIQUE KEY `uid_unique_key` (`uid`) +) ENGINE = InnoDB COMMENT ='會員角色'; \ No newline at end of file diff --git a/generate/database/mysql/20240819090248_create_role_permission_table.down.sql b/generate/database/mysql/20240819090248_create_role_permission_table.down.sql new file mode 100644 index 0000000..26a43a9 --- /dev/null +++ b/generate/database/mysql/20240819090248_create_role_permission_table.down.sql @@ -0,0 +1 @@ +DROP TABLE IF EXISTS `role_permission`; diff --git a/generate/database/mysql/20240819090248_create_role_permission_table.up.sql b/generate/database/mysql/20240819090248_create_role_permission_table.up.sql new file mode 100644 index 0000000..8ab08c7 --- /dev/null +++ b/generate/database/mysql/20240819090248_create_role_permission_table.up.sql @@ -0,0 +1,10 @@ +CREATE TABLE `role_permission` +( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'PK', + `role_id` bigint unsigned DEFAULT NULL COMMENT 'role.id', + `permission_id` bigint unsigned DEFAULT NULL COMMENT 'permission.id', + `create_time` bigint DEFAULT 0 NOT NULL COMMENT '創建時間', + `update_time` bigint DEFAULT 0 NOT NULL COMMENT '更新時間', + PRIMARY KEY (`id`), + KEY `category_id_permission_id_index` (`role_id`, `permission_id`) +) ENGINE = InnoDB COMMENT ='角色權限'; \ No newline at end of file diff --git a/generate/database/seeder/20230620025708_init_role.down.sql b/generate/database/seeder/20230620025708_init_role.down.sql new file mode 100644 index 0000000..36a1962 --- /dev/null +++ b/generate/database/seeder/20230620025708_init_role.down.sql @@ -0,0 +1 @@ +DELETE FROM `role` WHERE (`role_id` = 'AM000000'); diff --git a/generate/database/seeder/20230620025708_init_role.up.sql b/generate/database/seeder/20230620025708_init_role.up.sql new file mode 100644 index 0000000..d4c158e --- /dev/null +++ b/generate/database/seeder/20230620025708_init_role.up.sql @@ -0,0 +1,3 @@ +INSERT INTO `role` (`role_id`, `display_name`, `status`, `create_time`, `update_time`) +VALUES ('AM000000', 'admin', 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()), + ('AM000001', 'visitor', 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()); \ No newline at end of file diff --git a/generate/database/mysql/seeder/20240816014305_init_permission.up.sql b/generate/database/seeder/20240816014305_init_permission.up.sql similarity index 100% rename from generate/database/mysql/seeder/20240816014305_init_permission.up.sql rename to generate/database/seeder/20240816014305_init_permission.up.sql diff --git a/generate/protobuf/permission.proto b/generate/protobuf/permission.proto index 4063650..6dd8a65 100644 --- a/generate/protobuf/permission.proto +++ b/generate/protobuf/permission.proto @@ -227,8 +227,99 @@ service PermissionService { } +// -------------------------------------------------------------------------------- -service RoleService { - rpc Ping(OKResp) returns(OKResp); +message GetRoleReq{ + string role_ids =1; + string display_name=2; + repeated string permissions=3; + PermissionStatus status=4; + int64 page_index=5; + int64 page_size=6; + bool all=7; } +// RoleResp 對應的 Protobuf message +message RoleResp { + int64 id = 1; // ID + string display_name = 2; // name + string role_id = 3; // role_id -> 看得懂,自定義的,不會像 int64 這種比較不確定不好操作 + map permissions = 4; // permissions + PermissionStatus status = 5; // status + int64 create_time = 6; // create_time + int64 update_time = 7; // update_time +} + +// 定義 PageResponse 用來對應 pager.Response +message PageResponse { + int32 page_index = 1; // 頁碼 + int32 page_size = 2; // 每頁顯示數量 + int32 total_pages = 3; // 總頁數 +} + +// PageRoleResp 對應的 Protobuf message +message GetRoleResp { + repeated RoleResp list = 1; // list + PageResponse page = 2; // page +} + +message CreateRoleReq{ + string display_name=1; + PermissionStatus status = 2; // status + string role_id =3; +} + +message UpdateRoleReq{ + string role_id =1; // 搜尋條件 + PermissionStatus status = 2; // status + string display_name =3; +} + +// RoleService 建立所有的角色 +service RoleService { + // CreateRole 建立角色 + rpc CreateRole(CreateRoleReq)returns(RoleResp); + // GetRole 取得搜尋的角色 + rpc GetRole(GetRoleReq)returns(GetRoleResp); + // UpdateRole 更新角色 + rpc UpdateRole(UpdateRoleReq)returns(RoleResp); +} + +message UserRoleReq{ + string uid =1; + string role_id =2; +} + +message UserRoleResp{ + string uid =1; + string role_id =2; + int64 create_time = 3; // create_time + int64 update_time = 4; // update_time +} + +message GetUserRoleResp{ + repeated UpdateRoleReq list=1; +} + +message UserPermissionReq{ + string uid =1; +} +message UserPermissionResp{ + string role_id =1; + map permissions = 2; // permissions +} + +// UserRoleService 綁定角色與權限 +service UserRoleService { + // CreateUserRole 建立角色 + rpc CreateUserRole(UserRoleReq)returns(UserRoleResp); + // UpdateRole 更新角色 + rpc UpdateUserRole(UserRoleReq)returns(UserRoleResp); + // GetUserRole 取得角色綁定表,沒有搜尋條件就全部,不分頁 + rpc GetUserRole(UserRoleReq)returns(GetUserRoleResp); + // GetUserPermission 取得角色權限 + rpc GetUserPermission(UserPermissionReq)returns(UserPermissionResp); +} + + + diff --git a/internal/entity/role.go b/internal/entity/role.go new file mode 100644 index 0000000..d521255 --- /dev/null +++ b/internal/entity/role.go @@ -0,0 +1,17 @@ +package entity + +import "ark-permission/internal/domain" + +type Role struct { + ID int64 `gorm:"column:id"` + RoleID string `gorm:"column:role_id"` + DisplayName string `gorm:"column:display_name"` + Status int `gorm:"column:status"` + Permissions domain.Permissions `gorm:"-"` + CreateTime int64 `gorm:"column:create_time;autoCreateTime"` + UpdateTime int64 `gorm:"column:update_time;autoUpdateTime"` +} + +func (c *Role) TableName() string { + return "role" +} diff --git a/internal/entity/role_change_log.go b/internal/entity/role_change_log.go new file mode 100644 index 0000000..f4d14bf --- /dev/null +++ b/internal/entity/role_change_log.go @@ -0,0 +1,25 @@ +package entity + +import "ark-permission/internal/domain" + +type RoleLog struct { + ID string `json:"id,omitempty"` + Before AlterRoleLog `json:"before"` + After AlterRoleLog `json:"after"` + Name string `json:"name"` + UID string `json:"uid"` + UpdateUserUID string `json:"update_user_uid"` + UpdateUserName string `json:"update_user_name"` + CreateTime int64 `json:"create_time"` + Version string `json:"ver"` +} + +type AlterRoleLog struct { + Permissions []AlterPermission `json:"permissions"` + Status int `json:"status"` +} + +type AlterPermission struct { + Name string `json:"name"` + Status domain.PermissionStatus `json:"status"` +} diff --git a/internal/entity/user_role.go b/internal/entity/user_role.go new file mode 100644 index 0000000..afe76d3 --- /dev/null +++ b/internal/entity/user_role.go @@ -0,0 +1,20 @@ +package entity + +type UserRole struct { + ID int64 `gorm:"column:id"` + Brand string `gorm:"column:brand"` + UID string `gorm:"column:uid"` + RoleID string `gorm:"column:role_id"` + Status int `gorm:"column:status"` + CreateTime int64 `gorm:"column:create_time;autoCreateTime"` + UpdateTime int64 `gorm:"column:update_time;autoUpdateTime"` +} + +func (c *UserRole) TableName() string { + return "user_role" +} + +type RoleUserCount struct { + RoleID string `gorm:"column:role_id"` + Count int `gorm:"column:count"` +} diff --git a/internal/logic/permissionservice/list_permission_logic.go b/internal/logic/permissionservice/list_permission_logic.go new file mode 100644 index 0000000..cbee897 --- /dev/null +++ b/internal/logic/permissionservice/list_permission_logic.go @@ -0,0 +1,31 @@ +package permissionservicelogic + +import ( + "context" + + "ark-permission/gen_result/pb/permission" + "ark-permission/internal/svc" + + "github.com/zeromicro/go-zero/core/logx" +) + +type ListPermissionLogic struct { + ctx context.Context + svcCtx *svc.ServiceContext + logx.Logger +} + +func NewListPermissionLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ListPermissionLogic { + return &ListPermissionLogic{ + ctx: ctx, + svcCtx: svcCtx, + Logger: logx.WithContext(ctx), + } +} + +// ListPermission 一次性取得所有權限表 +func (l *ListPermissionLogic) ListPermission(in *permission.NoneReq) (*permission.MapPermissionStatusResp, error) { + // todo: add your logic here and delete this line + + return &permission.MapPermissionStatusResp{}, nil +} diff --git a/internal/logic/roleservice/create_role_logic.go b/internal/logic/roleservice/create_role_logic.go new file mode 100644 index 0000000..4e29c65 --- /dev/null +++ b/internal/logic/roleservice/create_role_logic.go @@ -0,0 +1,84 @@ +package roleservicelogic + +import ( + "ark-permission/internal/model" + ers "code.30cm.net/wanderland/library-go/errors" + "context" + "fmt" + "time" + + "ark-permission/gen_result/pb/permission" + "ark-permission/internal/svc" + + "github.com/zeromicro/go-zero/core/logx" +) + +type CreateRoleLogic struct { + ctx context.Context + svcCtx *svc.ServiceContext + logx.Logger +} + +func NewCreateRoleLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CreateRoleLogic { + return &CreateRoleLogic{ + ctx: ctx, + svcCtx: svcCtx, + Logger: logx.WithContext(ctx), + } +} + +type createRoleReq struct { + Status string `json:"status" binding:"required"` + RoleID string `json:"role_id"` + DisplayName string `json:"display_name" binding:"required"` +} + +// CreateRole 建立角色 +func (l *CreateRoleLogic) CreateRole(in *permission.CreateRoleReq) (*permission.RoleResp, error) { + // 驗證所需 + if err := l.svcCtx.Validate.ValidateAll(&createRoleReq{ + Status: in.GetStatus().String(), + DisplayName: in.GetDisplayName(), + }); err != nil { + return nil, ers.InvalidFormat(err.Error()) + } + + // 有操作失敗風險,因為如果並行狀態下有可能撞到產生的 role_id 一樣,不過此時有在表當中,擋 UK ,發生機率小,請使用者重試即可 + roleID, err := l.svcCtx.RoleRepo.IncrementID(l.ctx) + if err != nil { + return nil, ers.DBError("[permission.CreateRole] failed to get IncrementID", err.Error()) + } + + rid := in.GetRoleId() + if rid == "" { + rid = fmt.Sprintf("AM%06d", roleID) + } + + now := time.Now().UTC() + data := model.Role{ + RoleId: rid, + DisplayName: in.GetDisplayName(), + Status: int64(in.GetStatus().Number()), + CreateTime: now.Unix(), + UpdateTime: now.Unix(), + } + + res, err := l.svcCtx.RoleRepo.Insert(l.ctx, &data) + if err != nil { + return nil, ers.DBError("[RoleRepo.Insert] failed to insert role data", err.Error()) + } + + lastID, err := res.LastInsertId() + if err != nil { + lastID = 0 + } + + return &permission.RoleResp{ + Id: lastID, + DisplayName: data.DisplayName, + RoleId: data.RoleId, + Status: permission.PermissionStatus(data.Status), + CreateTime: data.CreateTime, + UpdateTime: data.UpdateTime, + }, nil +} diff --git a/internal/logic/roleservice/get_role_logic.go b/internal/logic/roleservice/get_role_logic.go new file mode 100644 index 0000000..172e854 --- /dev/null +++ b/internal/logic/roleservice/get_role_logic.go @@ -0,0 +1,43 @@ +package roleservicelogic + +import ( + "context" + + "ark-permission/gen_result/pb/permission" + "ark-permission/internal/svc" + + "github.com/zeromicro/go-zero/core/logx" +) + +type GetRoleLogic struct { + ctx context.Context + svcCtx *svc.ServiceContext + logx.Logger +} + +func NewGetRoleLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetRoleLogic { + return &GetRoleLogic{ + ctx: ctx, + svcCtx: svcCtx, + Logger: logx.WithContext(ctx), + } +} + +// GetRole 取得搜尋的角色 +func (l *GetRoleLogic) GetRole(in *permission.GetRoleReq) (*permission.GetRoleResp, error) { + // filter := data *Role + // 是否全表搜尋 + if in.GetAll() { + // 不需要帶過濾條件 + + } + + // RoleIds string `protobuf:"bytes,1,opt,name=role_ids,json=roleIds,proto3" json:"role_ids,omitempty"` + // DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + // Permissions []string `protobuf:"bytes,3,rep,name=permissions,proto3" json:"permissions,omitempty"` + // Status PermissionStatus `protobuf:"varint,4,opt,name=status,proto3,enum=permission.PermissionStatus" json:"status,omitempty"` + // PageIndex int64 `protobuf:"varint,5,opt,name=page_index,json=pageIndex,proto3" json:"page_index,omitempty"` + // PageSize int64 `protobuf:"varint,6,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + + return &permission.GetRoleResp{}, nil +} diff --git a/internal/logic/roleservice/ping_logic.go b/internal/logic/roleservice/ping_logic.go deleted file mode 100644 index bbe1ccb..0000000 --- a/internal/logic/roleservice/ping_logic.go +++ /dev/null @@ -1,30 +0,0 @@ -package roleservicelogic - -import ( - "context" - - "ark-permission/gen_result/pb/permission" - "ark-permission/internal/svc" - - "github.com/zeromicro/go-zero/core/logx" -) - -type PingLogic struct { - ctx context.Context - svcCtx *svc.ServiceContext - logx.Logger -} - -func NewPingLogic(ctx context.Context, svcCtx *svc.ServiceContext) *PingLogic { - return &PingLogic{ - ctx: ctx, - svcCtx: svcCtx, - Logger: logx.WithContext(ctx), - } -} - -func (l *PingLogic) Ping(in *permission.OKResp) (*permission.OKResp, error) { - // todo: add your logic here and delete this line - - return &permission.OKResp{}, nil -} diff --git a/internal/logic/roleservice/update_role_logic.go b/internal/logic/roleservice/update_role_logic.go new file mode 100644 index 0000000..959f7e8 --- /dev/null +++ b/internal/logic/roleservice/update_role_logic.go @@ -0,0 +1,75 @@ +package roleservicelogic + +import ( + ers "code.30cm.net/wanderland/library-go/errors" + "context" + "fmt" + "github.com/zeromicro/go-zero/core/stores/sqlx" + + "ark-permission/gen_result/pb/permission" + "ark-permission/internal/svc" + + "github.com/zeromicro/go-zero/core/logx" +) + +type UpdateRoleLogic struct { + ctx context.Context + svcCtx *svc.ServiceContext + logx.Logger +} + +func NewUpdateRoleLogic(ctx context.Context, svcCtx *svc.ServiceContext) *UpdateRoleLogic { + return &UpdateRoleLogic{ + ctx: ctx, + svcCtx: svcCtx, + Logger: logx.WithContext(ctx), + } +} + +// UpdateRole 更新角色 +func (l *UpdateRoleLogic) UpdateRole(in *permission.UpdateRoleReq) (*permission.RoleResp, error) { + if in.GetRoleId() == "" { + return nil, ers.InvalidFormat("failed to get role id") + } + + // 暴露出 transaction 的統包,可以實現跨表跟同表 + err := l.svcCtx.Conn.TransactCtx(l.ctx, func(ctx context.Context, session sqlx.Session) error { + if in.GetStatus() != 0 { + if in.GetStatus() == permission.PermissionStatus_PERMISSION_STATUS_NONE { + return fmt.Errorf("failed to get role id") + } + err := l.svcCtx.RoleRepo.TransUpdateStatusByRoleID( + ctx, session, int64(in.GetStatus().Number()), in.GetRoleId()) + if err != nil { + return err + } + } + + if in.GetDisplayName() != "" { + err := l.svcCtx.RoleRepo.TransUpdateDisplayNameByRoleID( + ctx, session, in.GetDisplayName(), in.GetRoleId()) + if err != nil { + return err + } + } + + return nil + }) + if err != nil { + return nil, ers.DBError(err.Error()) + } + + result, err := l.svcCtx.RoleRepo.FindOneByRoleId(l.ctx, in.GetRoleId()) + if err != nil { + return nil, ers.DBError(err.Error()) + } + + return &permission.RoleResp{ + Id: result.Id, + Status: permission.PermissionStatus(result.Status), + DisplayName: result.DisplayName, + RoleId: result.RoleId, + CreateTime: result.CreateTime, + UpdateTime: result.UpdateTime, + }, nil +} diff --git a/internal/logic/userroleservice/create_user_role_logic.go b/internal/logic/userroleservice/create_user_role_logic.go new file mode 100644 index 0000000..7732886 --- /dev/null +++ b/internal/logic/userroleservice/create_user_role_logic.go @@ -0,0 +1,31 @@ +package userroleservicelogic + +import ( + "context" + + "ark-permission/gen_result/pb/permission" + "ark-permission/internal/svc" + + "github.com/zeromicro/go-zero/core/logx" +) + +type CreateUserRoleLogic struct { + ctx context.Context + svcCtx *svc.ServiceContext + logx.Logger +} + +func NewCreateUserRoleLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CreateUserRoleLogic { + return &CreateUserRoleLogic{ + ctx: ctx, + svcCtx: svcCtx, + Logger: logx.WithContext(ctx), + } +} + +// CreateUserRole 建立角色 +func (l *CreateUserRoleLogic) CreateUserRole(in *permission.UserRoleReq) (*permission.UserRoleResp, error) { + // todo: add your logic here and delete this line + + return &permission.UserRoleResp{}, nil +} diff --git a/internal/logic/userroleservice/get_user_permission_logic.go b/internal/logic/userroleservice/get_user_permission_logic.go new file mode 100644 index 0000000..a142888 --- /dev/null +++ b/internal/logic/userroleservice/get_user_permission_logic.go @@ -0,0 +1,31 @@ +package userroleservicelogic + +import ( + "context" + + "ark-permission/gen_result/pb/permission" + "ark-permission/internal/svc" + + "github.com/zeromicro/go-zero/core/logx" +) + +type GetUserPermissionLogic struct { + ctx context.Context + svcCtx *svc.ServiceContext + logx.Logger +} + +func NewGetUserPermissionLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetUserPermissionLogic { + return &GetUserPermissionLogic{ + ctx: ctx, + svcCtx: svcCtx, + Logger: logx.WithContext(ctx), + } +} + +// GetUserPermission 取得角色權限 +func (l *GetUserPermissionLogic) GetUserPermission(in *permission.UserPermissionReq) (*permission.UserPermissionResp, error) { + // todo: add your logic here and delete this line + + return &permission.UserPermissionResp{}, nil +} diff --git a/internal/logic/userroleservice/get_user_role_logic.go b/internal/logic/userroleservice/get_user_role_logic.go new file mode 100644 index 0000000..db5edee --- /dev/null +++ b/internal/logic/userroleservice/get_user_role_logic.go @@ -0,0 +1,30 @@ +package userroleservicelogic + +import ( + "context" + + "ark-permission/gen_result/pb/permission" + "ark-permission/internal/svc" + + "github.com/zeromicro/go-zero/core/logx" +) + +type GetUserRoleLogic struct { + ctx context.Context + svcCtx *svc.ServiceContext + logx.Logger +} + +func NewGetUserRoleLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetUserRoleLogic { + return &GetUserRoleLogic{ + ctx: ctx, + svcCtx: svcCtx, + Logger: logx.WithContext(ctx), + } +} + +// GetUserRole 取得角色綁定表,沒有搜尋條件就全部,不分頁 +func (l *GetUserRoleLogic) GetUserRole(in *permission.UserRoleReq) (*permission.GetUserRoleResp, error) { + + return &permission.GetUserRoleResp{}, nil +} diff --git a/internal/logic/userroleservice/update_user_role_logic.go b/internal/logic/userroleservice/update_user_role_logic.go new file mode 100644 index 0000000..29403c0 --- /dev/null +++ b/internal/logic/userroleservice/update_user_role_logic.go @@ -0,0 +1,31 @@ +package userroleservicelogic + +import ( + "context" + + "ark-permission/gen_result/pb/permission" + "ark-permission/internal/svc" + + "github.com/zeromicro/go-zero/core/logx" +) + +type UpdateUserRoleLogic struct { + ctx context.Context + svcCtx *svc.ServiceContext + logx.Logger +} + +func NewUpdateUserRoleLogic(ctx context.Context, svcCtx *svc.ServiceContext) *UpdateUserRoleLogic { + return &UpdateUserRoleLogic{ + ctx: ctx, + svcCtx: svcCtx, + Logger: logx.WithContext(ctx), + } +} + +// UpdateRole 更新角色 +func (l *UpdateUserRoleLogic) UpdateUserRole(in *permission.UserRoleReq) (*permission.UserRoleResp, error) { + // todo: add your logic here and delete this line + + return &permission.UserRoleResp{}, nil +} diff --git a/internal/model/role_model.go b/internal/model/role_model.go new file mode 100755 index 0000000..44ca443 --- /dev/null +++ b/internal/model/role_model.go @@ -0,0 +1,84 @@ +package model + +import ( + "context" + "fmt" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "time" +) + +var _ RoleModel = (*customRoleModel)(nil) + +type ( + // RoleModel is an interface to be customized, add more methods here, + // and implement the added methods in customRoleModel. + RoleModel interface { + roleModel + IncrementID(ctx context.Context) (int64, error) + TransUpdateStatusByRoleID( + ctx context.Context, + session sqlx.Session, + status int64, + roleId string) error + TransUpdateDisplayNameByRoleID( + ctx context.Context, + session sqlx.Session, + roleId string, + displayName string) error + } + + customRoleModel struct { + *defaultRoleModel + } + + RoleFilter struct { + PageIndex *int64 + PageSize *int64 + RoleId *string + DisplayName *string + Status *int64 + } +) + +// NewRoleModel returns a model for the database table. +func NewRoleModel(conn sqlx.SqlConn) RoleModel { + return &customRoleModel{ + defaultRoleModel: newRoleModel(conn), + } +} + +func (m *customRoleModel) IncrementID(ctx context.Context) (int64, error) { + var maxID int64 + query := fmt.Sprintf("select IFNULL(MAX(`id`), 0) from %s", m.table) + err := m.conn.QueryRowCtx(ctx, &maxID, query) + if err != nil { + return 0, err + } + + // 返回最大 ID 加 1 + return maxID + 1, nil +} + +func (m *customRoleModel) TransUpdateDisplayNameByRoleID( + ctx context.Context, + session sqlx.Session, + displayName string, + roleId string) error { + query := fmt.Sprintf("update %s set `display_name` = ?, `update_time` = ? where `role_id` = ?", m.table) + // 執行更新操作 + updateTime := time.Now().UTC().Unix() + _, err := session.ExecCtx(ctx, query, displayName, updateTime, roleId) + return err +} + +func (m *customRoleModel) TransUpdateStatusByRoleID( + ctx context.Context, + session sqlx.Session, + status int64, + roleId string) error { + query := fmt.Sprintf("update %s set `status` = ?, `update_time` = ? where `role_id` = ?", m.table) + // 執行更新操作 + updateTime := time.Now().UTC().Unix() + _, err := session.ExecCtx(ctx, query, status, updateTime, roleId) + return err +} diff --git a/internal/model/role_model_gen.go b/internal/model/role_model_gen.go new file mode 100755 index 0000000..81aa5f0 --- /dev/null +++ b/internal/model/role_model_gen.go @@ -0,0 +1,125 @@ +// Code generated by goctl. DO NOT EDIT. + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" +) + +var ( + roleFieldNames = builder.RawFieldNames(&Role{}) + roleRows = strings.Join(roleFieldNames, ",") + roleRowsExpectAutoSet = strings.Join(stringx.Remove(roleFieldNames, "`id`"), ",") + roleRowsWithPlaceHolder = strings.Join(stringx.Remove(roleFieldNames, "`id`"), "=?,") + "=?" +) + +type ( + roleModel interface { + Insert(ctx context.Context, data *Role) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*Role, error) + FindOneByDisplayName(ctx context.Context, displayName string) (*Role, error) + FindOneByRoleId(ctx context.Context, roleId string) (*Role, error) + Update(ctx context.Context, data *Role) error + Delete(ctx context.Context, id int64) error + } + + defaultRoleModel struct { + conn sqlx.SqlConn + table string + } + + Role struct { + Id int64 `db:"id"` // PK + RoleId string `db:"role_id"` + DisplayName string `db:"display_name"` // 名稱 + Status int64 `db:"status"` // 狀態 1: 啟用, 2: 禁用 + CreateTime int64 `db:"create_time"` // 創建時間 + UpdateTime int64 `db:"update_time"` // 更新時間 + } +) + +func newRoleModel(conn sqlx.SqlConn) *defaultRoleModel { + return &defaultRoleModel{ + conn: conn, + table: "`role`", + } +} + +func (m *defaultRoleModel) withSession(session sqlx.Session) *defaultRoleModel { + return &defaultRoleModel{ + conn: sqlx.NewSqlConnFromSession(session), + table: "`role`", + } +} + +func (m *defaultRoleModel) Delete(ctx context.Context, id int64) error { + query := fmt.Sprintf("delete from %s where `id` = ?", m.table) + _, err := m.conn.ExecCtx(ctx, query, id) + return err +} + +func (m *defaultRoleModel) FindOne(ctx context.Context, id int64) (*Role, error) { + query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", roleRows, m.table) + var resp Role + err := m.conn.QueryRowCtx(ctx, &resp, query, id) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultRoleModel) FindOneByDisplayName(ctx context.Context, displayName string) (*Role, error) { + var resp Role + query := fmt.Sprintf("select %s from %s where `display_name` = ? limit 1", roleRows, m.table) + err := m.conn.QueryRowCtx(ctx, &resp, query, displayName) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultRoleModel) FindOneByRoleId(ctx context.Context, roleId string) (*Role, error) { + var resp Role + query := fmt.Sprintf("select %s from %s where `role_id` = ? limit 1", roleRows, m.table) + err := m.conn.QueryRowCtx(ctx, &resp, query, roleId) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultRoleModel) Insert(ctx context.Context, data *Role) (sql.Result, error) { + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?)", m.table, roleRowsExpectAutoSet) + ret, err := m.conn.ExecCtx(ctx, query, data.RoleId, data.DisplayName, data.Status, data.CreateTime, data.UpdateTime) + return ret, err +} + +func (m *defaultRoleModel) Update(ctx context.Context, newData *Role) error { + query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, roleRowsWithPlaceHolder) + _, err := m.conn.ExecCtx(ctx, query, newData.RoleId, newData.DisplayName, newData.Status, newData.CreateTime, newData.UpdateTime, newData.Id) + return err +} + +func (m *defaultRoleModel) tableName() string { + return m.table +} diff --git a/internal/model/role_permission_model.go b/internal/model/role_permission_model.go new file mode 100755 index 0000000..6d8d94b --- /dev/null +++ b/internal/model/role_permission_model.go @@ -0,0 +1,24 @@ +package model + +import "github.com/zeromicro/go-zero/core/stores/sqlx" + +var _ RolePermissionModel = (*customRolePermissionModel)(nil) + +type ( + // RolePermissionModel is an interface to be customized, add more methods here, + // and implement the added methods in customRolePermissionModel. + RolePermissionModel interface { + rolePermissionModel + } + + customRolePermissionModel struct { + *defaultRolePermissionModel + } +) + +// NewRolePermissionModel returns a model for the database table. +func NewRolePermissionModel(conn sqlx.SqlConn) RolePermissionModel { + return &customRolePermissionModel{ + defaultRolePermissionModel: newRolePermissionModel(conn), + } +} diff --git a/internal/model/role_permission_model_gen.go b/internal/model/role_permission_model_gen.go new file mode 100755 index 0000000..90d2663 --- /dev/null +++ b/internal/model/role_permission_model_gen.go @@ -0,0 +1,94 @@ +// Code generated by goctl. DO NOT EDIT. + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" +) + +var ( + rolePermissionFieldNames = builder.RawFieldNames(&RolePermission{}) + rolePermissionRows = strings.Join(rolePermissionFieldNames, ",") + rolePermissionRowsExpectAutoSet = strings.Join(stringx.Remove(rolePermissionFieldNames, "`id`"), ",") + rolePermissionRowsWithPlaceHolder = strings.Join(stringx.Remove(rolePermissionFieldNames, "`id`"), "=?,") + "=?" +) + +type ( + rolePermissionModel interface { + Insert(ctx context.Context, data *RolePermission) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*RolePermission, error) + Update(ctx context.Context, data *RolePermission) error + Delete(ctx context.Context, id int64) error + } + + defaultRolePermissionModel struct { + conn sqlx.SqlConn + table string + } + + RolePermission struct { + Id int64 `db:"id"` // PK + RoleId sql.NullInt64 `db:"role_id"` // role.id + PermissionId sql.NullInt64 `db:"permission_id"` // permission.id + CreateTime int64 `db:"create_time"` // 創建時間 + UpdateTime int64 `db:"update_time"` // 更新時間 + } +) + +func newRolePermissionModel(conn sqlx.SqlConn) *defaultRolePermissionModel { + return &defaultRolePermissionModel{ + conn: conn, + table: "`role_permission`", + } +} + +func (m *defaultRolePermissionModel) withSession(session sqlx.Session) *defaultRolePermissionModel { + return &defaultRolePermissionModel{ + conn: sqlx.NewSqlConnFromSession(session), + table: "`role_permission`", + } +} + +func (m *defaultRolePermissionModel) Delete(ctx context.Context, id int64) error { + query := fmt.Sprintf("delete from %s where `id` = ?", m.table) + _, err := m.conn.ExecCtx(ctx, query, id) + return err +} + +func (m *defaultRolePermissionModel) FindOne(ctx context.Context, id int64) (*RolePermission, error) { + query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", rolePermissionRows, m.table) + var resp RolePermission + err := m.conn.QueryRowCtx(ctx, &resp, query, id) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultRolePermissionModel) Insert(ctx context.Context, data *RolePermission) (sql.Result, error) { + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?)", m.table, rolePermissionRowsExpectAutoSet) + ret, err := m.conn.ExecCtx(ctx, query, data.RoleId, data.PermissionId, data.CreateTime, data.UpdateTime) + return ret, err +} + +func (m *defaultRolePermissionModel) Update(ctx context.Context, data *RolePermission) error { + query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, rolePermissionRowsWithPlaceHolder) + _, err := m.conn.ExecCtx(ctx, query, data.RoleId, data.PermissionId, data.CreateTime, data.UpdateTime, data.Id) + return err +} + +func (m *defaultRolePermissionModel) tableName() string { + return m.table +} diff --git a/internal/model/user_role_model.go b/internal/model/user_role_model.go new file mode 100755 index 0000000..2f89168 --- /dev/null +++ b/internal/model/user_role_model.go @@ -0,0 +1,24 @@ +package model + +import "github.com/zeromicro/go-zero/core/stores/sqlx" + +var _ UserRoleModel = (*customUserRoleModel)(nil) + +type ( + // UserRoleModel is an interface to be customized, add more methods here, + // and implement the added methods in customUserRoleModel. + UserRoleModel interface { + userRoleModel + } + + customUserRoleModel struct { + *defaultUserRoleModel + } +) + +// NewUserRoleModel returns a model for the database table. +func NewUserRoleModel(conn sqlx.SqlConn) UserRoleModel { + return &customUserRoleModel{ + defaultUserRoleModel: newUserRoleModel(conn), + } +} diff --git a/internal/model/user_role_model_gen.go b/internal/model/user_role_model_gen.go new file mode 100755 index 0000000..b18b25c --- /dev/null +++ b/internal/model/user_role_model_gen.go @@ -0,0 +1,111 @@ +// Code generated by goctl. DO NOT EDIT. + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" +) + +var ( + userRoleFieldNames = builder.RawFieldNames(&UserRole{}) + userRoleRows = strings.Join(userRoleFieldNames, ",") + userRoleRowsExpectAutoSet = strings.Join(stringx.Remove(userRoleFieldNames, "`id`"), ",") + userRoleRowsWithPlaceHolder = strings.Join(stringx.Remove(userRoleFieldNames, "`id`"), "=?,") + "=?" +) + +type ( + userRoleModel interface { + Insert(ctx context.Context, data *UserRole) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*UserRole, error) + FindOneByUid(ctx context.Context, uid string) (*UserRole, error) + Update(ctx context.Context, data *UserRole) error + Delete(ctx context.Context, id int64) error + } + + defaultUserRoleModel struct { + conn sqlx.SqlConn + table string + } + + UserRole struct { + Id int64 `db:"id"` // PK + Brand string `db:"brand"` + Uid string `db:"uid"` + RoleId string `db:"role_id"` + Status int64 `db:"status"` // 狀態 1: 啟用, 2: 禁用 + CreateTime int64 `db:"create_time"` // 創建時間 + UpdateTime int64 `db:"update_time"` // 更新時間 + } +) + +func newUserRoleModel(conn sqlx.SqlConn) *defaultUserRoleModel { + return &defaultUserRoleModel{ + conn: conn, + table: "`user_role`", + } +} + +func (m *defaultUserRoleModel) withSession(session sqlx.Session) *defaultUserRoleModel { + return &defaultUserRoleModel{ + conn: sqlx.NewSqlConnFromSession(session), + table: "`user_role`", + } +} + +func (m *defaultUserRoleModel) Delete(ctx context.Context, id int64) error { + query := fmt.Sprintf("delete from %s where `id` = ?", m.table) + _, err := m.conn.ExecCtx(ctx, query, id) + return err +} + +func (m *defaultUserRoleModel) FindOne(ctx context.Context, id int64) (*UserRole, error) { + query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", userRoleRows, m.table) + var resp UserRole + err := m.conn.QueryRowCtx(ctx, &resp, query, id) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultUserRoleModel) FindOneByUid(ctx context.Context, uid string) (*UserRole, error) { + var resp UserRole + query := fmt.Sprintf("select %s from %s where `uid` = ? limit 1", userRoleRows, m.table) + err := m.conn.QueryRowCtx(ctx, &resp, query, uid) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultUserRoleModel) Insert(ctx context.Context, data *UserRole) (sql.Result, error) { + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?)", m.table, userRoleRowsExpectAutoSet) + ret, err := m.conn.ExecCtx(ctx, query, data.Brand, data.Uid, data.RoleId, data.Status, data.CreateTime, data.UpdateTime) + return ret, err +} + +func (m *defaultUserRoleModel) Update(ctx context.Context, newData *UserRole) error { + query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, userRoleRowsWithPlaceHolder) + _, err := m.conn.ExecCtx(ctx, query, newData.Brand, newData.Uid, newData.RoleId, newData.Status, newData.CreateTime, newData.UpdateTime, newData.Id) + return err +} + +func (m *defaultUserRoleModel) tableName() string { + return m.table +} diff --git a/internal/server/permissionservice/permission_service_server.go b/internal/server/permissionservice/permission_service_server.go index 8f89f8f..42c475a 100644 --- a/internal/server/permissionservice/permission_service_server.go +++ b/internal/server/permissionservice/permission_service_server.go @@ -28,10 +28,10 @@ func (s *PermissionServiceServer) ListPermissionStatus(ctx context.Context, in * return l.ListPermissionStatus(in) } -// MapPermissionStatus 取得所有權限開閉狀態,簡易版,給前端表演用 -func (s *PermissionServiceServer) MapPermissionStatus(ctx context.Context, in *permission.NoneReq) (*permission.MapPermissionStatusResp, error) { - l := permissionservicelogic.NewMapPermissionStatusLogic(ctx, s.svcCtx) - return l.MapPermissionStatus(in) +// ListPermission 一次性取得所有權限表 +func (s *PermissionServiceServer) ListPermission(ctx context.Context, in *permission.NoneReq) (*permission.MapPermissionStatusResp, error) { + l := permissionservicelogic.NewListPermissionLogic(ctx, s.svcCtx) + return l.ListPermission(in) } // CheckPermissionByRole 透過角色 ID 來檢視權限,後台要通過時真的看這個 diff --git a/internal/server/roleservice/role_service_server.go b/internal/server/roleservice/role_service_server.go index 0175dc7..79da213 100644 --- a/internal/server/roleservice/role_service_server.go +++ b/internal/server/roleservice/role_service_server.go @@ -22,7 +22,20 @@ func NewRoleServiceServer(svcCtx *svc.ServiceContext) *RoleServiceServer { } } -func (s *RoleServiceServer) Ping(ctx context.Context, in *permission.OKResp) (*permission.OKResp, error) { - l := roleservicelogic.NewPingLogic(ctx, s.svcCtx) - return l.Ping(in) +// CreateRole 建立角色 +func (s *RoleServiceServer) CreateRole(ctx context.Context, in *permission.CreateRoleReq) (*permission.RoleResp, error) { + l := roleservicelogic.NewCreateRoleLogic(ctx, s.svcCtx) + return l.CreateRole(in) +} + +// GetRole 取得搜尋的角色 +func (s *RoleServiceServer) GetRole(ctx context.Context, in *permission.GetRoleReq) (*permission.GetRoleResp, error) { + l := roleservicelogic.NewGetRoleLogic(ctx, s.svcCtx) + return l.GetRole(in) +} + +// UpdateRole 更新角色 +func (s *RoleServiceServer) UpdateRole(ctx context.Context, in *permission.UpdateRoleReq) (*permission.RoleResp, error) { + l := roleservicelogic.NewUpdateRoleLogic(ctx, s.svcCtx) + return l.UpdateRole(in) } diff --git a/internal/server/userroleservice/user_role_service_server.go b/internal/server/userroleservice/user_role_service_server.go new file mode 100644 index 0000000..cfc75b4 --- /dev/null +++ b/internal/server/userroleservice/user_role_service_server.go @@ -0,0 +1,47 @@ +// Code generated by goctl. DO NOT EDIT. +// Source: permission.proto + +package server + +import ( + "context" + + "ark-permission/gen_result/pb/permission" + "ark-permission/internal/logic/userroleservice" + "ark-permission/internal/svc" +) + +type UserRoleServiceServer struct { + svcCtx *svc.ServiceContext + permission.UnimplementedUserRoleServiceServer +} + +func NewUserRoleServiceServer(svcCtx *svc.ServiceContext) *UserRoleServiceServer { + return &UserRoleServiceServer{ + svcCtx: svcCtx, + } +} + +// CreateUserRole 建立角色 +func (s *UserRoleServiceServer) CreateUserRole(ctx context.Context, in *permission.UserRoleReq) (*permission.UserRoleResp, error) { + l := userroleservicelogic.NewCreateUserRoleLogic(ctx, s.svcCtx) + return l.CreateUserRole(in) +} + +// UpdateRole 更新角色 +func (s *UserRoleServiceServer) UpdateUserRole(ctx context.Context, in *permission.UserRoleReq) (*permission.UserRoleResp, error) { + l := userroleservicelogic.NewUpdateUserRoleLogic(ctx, s.svcCtx) + return l.UpdateUserRole(in) +} + +// GetUserRole 取得角色綁定表,沒有搜尋條件就全部,不分頁 +func (s *UserRoleServiceServer) GetUserRole(ctx context.Context, in *permission.UserRoleReq) (*permission.GetUserRoleResp, error) { + l := userroleservicelogic.NewGetUserRoleLogic(ctx, s.svcCtx) + return l.GetUserRole(in) +} + +// GetUserPermission 取得角色權限 +func (s *UserRoleServiceServer) GetUserPermission(ctx context.Context, in *permission.UserPermissionReq) (*permission.UserPermissionResp, error) { + l := userroleservicelogic.NewGetUserPermissionLogic(ctx, s.svcCtx) + return l.GetUserPermission(in) +} diff --git a/internal/svc/service_context.go b/internal/svc/service_context.go index f13e9fe..1fb63b3 100644 --- a/internal/svc/service_context.go +++ b/internal/svc/service_context.go @@ -21,8 +21,11 @@ type ServiceContext struct { Validate required.Validate Redis redis.Redis TokenRedisRepo repository.TokenRepository - Permission model.PermissionModel PolicyAgent domainUseCase.OpaUseCase + + Conn sqlx.SqlConn + Permission model.PermissionModel + RoleRepo model.RoleModel } func NewServiceContext(c config.Config) *ServiceContext { @@ -51,7 +54,10 @@ func NewServiceContext(c config.Config) *ServiceContext { TokenRedisRepo: repo.NewTokenRepository(repo.TokenRepositoryParam{ Store: newRedis, }), - Permission: model.NewPermissionModel(sqlConn), PolicyAgent: pa, + + Permission: model.NewPermissionModel(sqlConn), + RoleRepo: model.NewRoleModel(sqlConn), + Conn: sqlConn, } }