syntax = "proto3"; package organize; import "aeus/rest.proto"; import "validate/validate.proto"; import "google/protobuf/descriptor.proto"; import "google/api/annotations.proto"; option go_package = "git.nobla.cn/golang/aeis-admin/pb;pb"; // Menu 菜单模型定义 message Menu { option (aeus.rest) = { table: "menus" }; int64 id = 1 [(aeus.field) = {gorm:"primaryKey",comment:"菜单ID"}]; int64 created_at = 2 [(aeus.field)={scenarios:"view;export",comment:"创建时间"}]; int64 updated_at = 3 [(aeus.field)={gorm:"index",scenarios:"view;export",comment:"更新时间"}]; string parent = 4 [(aeus.field)={gorm:"index;size:60",props:"readonly:update",live:"type:dropdown;url:/menu/level-labels",format:"menu",comment:"父级菜单"}]; string name = 5 [(aeus.field)={gorm:"index;size:60",props:"readonly:update",rule:"unique;required",comment: "组件名称"},(validate.rules).string = {max_len: 60}]; string label = 6 [(aeus.field)={gorm:"size:120",rule:"required",comment: "菜单标题"},(validate.rules).string = {max_len: 120}]; string uri = 7 [(aeus.field)={gorm:"size:512",rule:"required",scenarios:"create;update;view;export",comment: "菜单链接"},(validate.rules).string = {max_len: 512}]; string view_path = 8 [(aeus.field)={gorm:"size:512",scenarios:"create;update;view;export",comment: "视图路径"},(validate.rules).string = {max_len: 512}]; string icon = 9 [(aeus.field)={gorm:"size:60",scenarios:"create;update;view;export",comment: "菜单图标"},(validate.rules).string = {max_len: 60}]; bool hidden = 10 [(aeus.field)={scenarios:"create;update;view;export",comment:"是否隐藏"}]; bool public = 11 [(aeus.field)={scenarios:"create;update;view;export",comment:"是否公开"}]; string description = 12 [(aeus.field)={gorm:"size:1024",scenarios:"create;update;view;export;list",format:"textarea",comment: "备注说明"},(validate.rules).string = {max_len: 1024}]; int64 position = 13 [(aeus.field)={comment:"排序",scenarios:"create;update"}]; } // Role 角色模型定义 message Role { option (aeus.rest) = { table: "roles" }; int64 id = 1 [(aeus.field) = {gorm:"primaryKey",comment: "角色ID"}]; int64 created_at = 2 [(aeus.field)={scenarios:"view;export",comment:"创建时间"}]; int64 updated_at = 3 [(aeus.field)={gorm:"index",scenarios:"view;export",comment:"更新时间"}]; string name = 4 [(aeus.field)={gorm:"index;size:60",rule:"required",props:"readonly:update",comment: "角色名称"},(validate.rules).string = {max_len: 60}]; string label = 5 [(aeus.field)={gorm:"size:60",rule:"required",comment: "角色标题"},(validate.rules).string = {max_len: 60}]; string description = 6 [(aeus.field)={gorm:"size:1024",scenarios:"list;create;update;export",format:"textarea",comment: "备注说明"},(validate.rules).string = {max_len: 1024}]; } // Permission 权限模型定义 message Permission { option (aeus.rest) = { table: "permissions" }; int64 id = 1 [(aeus.field) = {gorm:"primaryKey",comment: "权限ID"}]; int64 created_at = 2 [(aeus.field)={scenarios:"view;export",comment:"创建时间"}]; int64 updated_at = 3 [(aeus.field)={gorm:"index",scenarios:"view;export",comment:"更新时间"}]; string menu = 4 [(aeus.field)={gorm:"index;size:60",format:"menu",rule:"required",comment: "所属菜单"}]; string permission = 5 [(aeus.field)={gorm:"index;size:60",rule:"required",comment: "权限名称"},(validate.rules).string = {max_len: 60}]; string label = 6 [(aeus.field)={gorm:"size:60",rule:"required",comment: "权限标题"},(validate.rules).string = {max_len: 60}]; } // RolePermission 角色权限关联表 message RolePermission { option (aeus.rest) = { table: "role_permissions" }; int64 id = 1 [(aeus.field) = {gorm:"primaryKey",comment: "ID"}]; string role = 2 [(aeus.field)={gorm:"index;size:60",rule:"required",comment: "角色"},(validate.rules).string = {max_len: 60}]; string permission = 3 [(aeus.field)={gorm:"size:60",rule:"required",comment: "权限"}]; } // User 用户模型定义 message User { option (aeus.rest) = { table: "users" }; int64 id = 1 [(aeus.field) = {gorm:"primaryKey",comment: "ID"}]; int64 created_at = 2 [(aeus.field)={scenarios:"view;export",comment:"创建时间"}]; int64 updated_at = 3 [(aeus.field)={gorm:"index",scenarios:"view;export",comment:"更新时间"}]; string uid = 4 [(aeus.field) = {gorm:"index;size:20",rule:"required;unique;regexp:^[a-zA-Z0-9]{3,8}$",props:"readonly:update",comment: "用户工号"},(validate.rules).string = {min_len: 5, max_len: 20}]; string username = 5 [(aeus.field)={gorm:"size:20",rule:"required",comment: "用户名称"},(validate.rules).string = {min_len: 5, max_len: 20}]; string role = 6 [(aeus.field)={gorm:"size:60;not null;default:''",rule:"required",format:"role",live:"type:dropdown;url:/role/labels",comment: "所属角色"},(validate.rules).string = {max_len: 60}]; bool admin = 7 [(aeus.field)={scenarios:"create",comment:"管理员"}]; string status = 8 [(aeus.field)={scenarios:"create,update,list,search",gorm:"size:20;default:normal",enum:"normal:正常;disable:禁用",comment:"状态"}]; int64 dept_id = 9 [(aeus.field) = {gorm:"not null;default:0",rule:"required",live:"type:dropdown;url:/department/labels",format:"department",comment: "所属部门"}]; string tag = 10 [ (aeus.field)={gorm:"size:60",scenarios:"list;create;update",dropdown:"created;filterable;default_first",live:"type:dropdown;url:/user/tags",comment: "用户标签"},(validate.rules).string = {max_len: 60}]; string password = 11 [(aeus.field)={gorm:"size:60",rule:"required",scenarios:"create",comment: "用户密码"},(validate.rules).string = {max_len: 60}]; string email = 12 [(aeus.field)={gorm:"size:60",scenarios:"create;update;view;list;export",comment: "用户邮箱"},(validate.rules).string = {max_len: 60}]; string avatar = 13 [(aeus.field)={gorm:"size:1024",scenarios:"view",comment: "用户头像"},(validate.rules).string = {max_len: 1024}]; string gender = 14 [(aeus.field)={gorm:"size:20;default:man",rule:"required",scenarios:"list;create;update;view;export",enum:"man:男;woman:女;other:其他",comment: "用户性别"},(validate.rules).string = {max_len: 20}]; string description = 15 [(aeus.field)={gorm:"size:1024",format:"textarea",scenarios:"create;update;view;export",comment: "备注说明"},(validate.rules).string = {max_len: 1024}]; } // Department 部门模型定义 message Department { option (aeus.rest) = { table: "departments" }; int64 id = 1 [(aeus.field) = {gorm:"primaryKey",comment:"ID"}]; int64 created_at = 2 [(aeus.field)={scenarios:"view;export",comment:"创建时间"}]; int64 updated_at = 3 [(aeus.field)={gorm:"index",scenarios:"view;export",comment:"更新时间"}]; int64 parent_id = 4 [(aeus.field)={live:"type:dropdown;url:/department/level-labels",format:"department",comment:"父级部门"}]; string name = 5 [(aeus.field)={gorm:"size:20",rule:"required",comment: "部门名称"},(validate.rules).string = {max_len: 20}]; string description = 6 [(aeus.field)={gorm:"size:1024",scenarios:"create;update;view;export;list",format:"textarea",comment: "备注说明"},(validate.rules).string = {max_len: 1024}]; } message Login { option (aeus.rest) = { table: "logins" }; int64 id = 1 [(aeus.field) = {gorm:"primaryKey",comment:"ID"}]; int64 created_at = 2 [(aeus.field)={scenarios:"list;search;view;export",comment:"登录时间"}]; string uid = 4 [(aeus.field)={gorm:"index;size:20",rule:"required",props:"readonly:update",format:"user",comment: "用户"},(validate.rules).string = {min_len: 5, max_len: 20}]; string ip = 5 [(aeus.field)={gorm:"size:128",scenarios:"list;search;view;export",comment: "登录地址"}]; string browser = 6 [(aeus.field)={gorm:"size:128",scenarios:"list;view;export",comment: "浏览器"}]; string os = 7 [(aeus.field)={gorm:"size:128",scenarios:"list;view;export",comment: "操作系统"}]; string platform = 8 [(aeus.field)={gorm:"size:128",scenarios:"list;view;export",comment: "系统平台"}]; string access_token = 9 [(aeus.field)={gorm:"size:1024",scenarios:"list;view;export",comment: "访问令牌"}]; string user_agent = 10 [(aeus.field)={gorm:"size:1024",scenarios:"list;view;export",comment: "用户代理"}]; } message LabelValue { string label = 1; string value = 2; } message PermissionItem { string value = 1; string label = 2; } // MenuItem 菜单数据 message MenuItem { string label = 1; string name = 2; string icon = 3; bool hidden = 4; bool public = 5; string route = 6; string view = 7; repeated PermissionItem permissions = 8; repeated MenuItem children = 9; } // 获取菜单的请求 message GetMenuRequest { bool permission = 1; } // 获取菜单的响应 message GetMenuResponse { repeated MenuItem data = 1; } // 获取用户信息 message GetProfileRequest { string uid = 1; } // 获取用户信息 message GetProfileResponse { string uid = 1; string username = 2; string role = 3; string email = 4; string avatar = 5; bool admin = 6; string description = 7; } message ResetPasswordRequest { string uid = 1; string old_password = 2; string new_password = 3; } message ResetPasswordResponse { string uid = 1; } message UpdateProfileRequest { string uid = 1; string username = 2; string email = 4; string avatar = 5; string description = 7; } message UpdateProfileResponse { string uid = 1; } message GetPermissionRequest { string uid = 1; } message GetPermissionResponse { string uid = 1; repeated string permissions = 2; } message GetUserLabelRequest { } message GetUserLabelResponse { repeated LabelValue data = 1; } message GetUserTagRequest { } message GetUserTagResponse { repeated LabelValue data = 1; } // 用户服务 service UserService { // 获取用户菜单 rpc GetMenus(GetMenuRequest) returns (GetMenuResponse) { option (google.api.http) = { get: "/user/menus" }; } // 获取用户信息 rpc GetProfile(GetProfileRequest) returns (GetProfileResponse) { option (google.api.http) = { get: "/user/profile" }; } // 更新用户信息 rpc UpdateProfile(UpdateProfileRequest) returns (UpdateProfileResponse) { option (google.api.http) = { put: "/user/profile" body: "*" }; } // 重置用户密码 rpc ResetPassword(ResetPasswordRequest) returns (ResetPasswordResponse) { option (google.api.http) = { post: "/user/reset-password" body: "*" }; } // 获取用户权限 rpc GetPermissions(GetPermissionRequest) returns (GetPermissionResponse) { option (google.api.http) = { get: "/user/permissions" }; } // 获取用户标签 rpc GetUserLabels(GetUserLabelRequest) returns (GetUserLabelResponse) { option (google.api.http) = { get: "/user/labels" }; } // 获取用户标签 rpc GetUserTags(GetUserTagRequest) returns (GetUserTagResponse) { option (google.api.http) = { get: "/user/tags" }; } } message DepartmentLabelValue { string label = 1; int64 value = 2; } message DepartmentUserValue { string label = 1; string value = 2; bool isuser = 3; repeated DepartmentUserValue children = 4; } message GetDepartmentLabelRequest { } message GetDepartmentLabelResponse { repeated DepartmentLabelValue data = 1; } message GetDepartmentUserRequest { } message GetDepartmentUserResponse { repeated DepartmentUserValue data = 1; } message DepartmentLevelValue { string label = 1; int64 value = 2; repeated DepartmentLevelValue children = 4; } message GetDepartmentLevelLabelsRequest { } message GetDepartmentLevelLabelsResponse { repeated DepartmentLevelValue data = 1; } service DepartmentService { // 获取部门标签 rpc GetDepartmentLabels(GetDepartmentLabelRequest) returns (GetDepartmentLabelResponse) { option (google.api.http) = { get: "/department/labels" }; } rpc GetDepartmentUsers(GetDepartmentUserRequest) returns (GetDepartmentUserResponse) { option (google.api.http) = { get: "/department/users" }; } rpc GetDepartmentLevelLabels(GetDepartmentLevelLabelsRequest) returns (GetDepartmentLevelLabelsResponse) { option (google.api.http) = { get: "/department/level-labels" }; } } message GetRoleLabelRequest { } message GetRoleLabelResponse { repeated LabelValue data = 1; } message GetRolePermissionRequest { string role = 1; } message GetRolePermissionResponse { string role = 1; repeated string permissions = 2; } message SaveRolePermissionRequest { string role = 1; repeated string permissions = 2; } message SaveRolePermissionResponse { string role = 1; } service RoleService { // 获取角色标签 rpc GetRoleLabels(GetRoleLabelRequest) returns (GetRoleLabelResponse) { option (google.api.http) = { get: "/role/labels" }; } // 获取角色权限 rpc GetRolePermissions(GetRolePermissionRequest) returns (GetRolePermissionResponse) { option (google.api.http) = { get: "/role/permissions" }; } rpc SaveRolePermission(SaveRolePermissionRequest) returns (SaveRolePermissionResponse) { option (google.api.http) = { post: "/role/permissions" body: "*" }; } } message MenuLevelValue { string label = 1; string value = 2; repeated MenuLevelValue children = 4; } message GetMenuLevelLabelsRequest { } message GetMenuLevelLabelsResponse { repeated MenuLevelValue data = 1; } service MenuService { rpc GetMenuLevelLabels(GetMenuLevelLabelsRequest) returns (GetMenuLevelLabelsResponse) { option (google.api.http) = { get: "/menu/level-labels" }; } } message LoginRequest { string username = 1; string password = 2; string token = 3; } message LoginResponse { string uid = 1; string username = 2; string token = 3; int64 expires = 4; } message LogoutRequest { string token = 1; } message LogoutResponse { string uid = 1; } // 授权服务 service AuthService { rpc Login(LoginRequest) returns (LoginResponse) { option (google.api.http) = { post: "/passport/login" body: "*" }; } rpc Logout(LogoutRequest) returns (LogoutResponse) { option (google.api.http) = { post: "/passport/logout" body: "*" }; } }