作者 yangfu

feat: 2.0 角色菜单权限、账号切换、账号安全

正在显示 46 个修改的文件 包含 2361 行增加109 行删除
@@ -25,4 +25,4 @@ Redis: @@ -25,4 +25,4 @@ Redis:
25 Type: node 25 Type: node
26 Pass: 26 Pass:
27 DB: 27 DB:
28 - DataSource: host=114.55.200.59 user=postgres password=eagle1010 dbname=su_enterprise_platform_preonline port=31543 sslmode=disable TimeZone=Asia/Shanghai 28 + DataSource: host=114.55.200.59 user=postgres password=eagle1010 dbname=su_enterprise_platform port=31543 sslmode=disable TimeZone=Asia/Shanghai
  1 +package auth
  2 +
  3 +import (
  4 + "net/http"
  5 +
  6 + "github.com/zeromicro/go-zero/rest/httpx"
  7 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/logic/auth"
  8 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/svc"
  9 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/types"
  10 +)
  11 +
  12 +func SystemAuthChangePasswordHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  13 + return func(w http.ResponseWriter, r *http.Request) {
  14 + var req types.ChangePasswordRequest
  15 + if err := httpx.Parse(r, &req); err != nil {
  16 + httpx.ErrorCtx(r.Context(), w, err)
  17 + return
  18 + }
  19 +
  20 + l := auth.NewSystemAuthChangePasswordLogic(r.Context(), svcCtx)
  21 + resp, err := l.SystemAuthChangePassword(&req)
  22 + if err != nil {
  23 + httpx.ErrorCtx(r.Context(), w, err)
  24 + } else {
  25 + httpx.OkJsonCtx(r.Context(), w, resp)
  26 + }
  27 + }
  28 +}
  1 +package auth
  2 +
  3 +import (
  4 + "net/http"
  5 +
  6 + "github.com/zeromicro/go-zero/rest/httpx"
  7 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/logic/auth"
  8 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/svc"
  9 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/types"
  10 +)
  11 +
  12 +func SystemAuthEditUserInfoHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  13 + return func(w http.ResponseWriter, r *http.Request) {
  14 + var req types.EditUserInfoRequest
  15 + if err := httpx.Parse(r, &req); err != nil {
  16 + httpx.ErrorCtx(r.Context(), w, err)
  17 + return
  18 + }
  19 +
  20 + l := auth.NewSystemAuthEditUserInfoLogic(r.Context(), svcCtx)
  21 + resp, err := l.SystemAuthEditUserInfo(&req)
  22 + if err != nil {
  23 + httpx.ErrorCtx(r.Context(), w, err)
  24 + } else {
  25 + httpx.OkJsonCtx(r.Context(), w, resp)
  26 + }
  27 + }
  28 +}
  1 +package auth
  2 +
  3 +import (
  4 + "net/http"
  5 +
  6 + "github.com/zeromicro/go-zero/rest/httpx"
  7 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/logic/auth"
  8 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/svc"
  9 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/types"
  10 +)
  11 +
  12 +func SystemAuthResetPasswordHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  13 + return func(w http.ResponseWriter, r *http.Request) {
  14 + var req types.ResetPasswordRequest
  15 + if err := httpx.Parse(r, &req); err != nil {
  16 + httpx.ErrorCtx(r.Context(), w, err)
  17 + return
  18 + }
  19 +
  20 + l := auth.NewSystemAuthResetPasswordLogic(r.Context(), svcCtx)
  21 + resp, err := l.SystemAuthResetPassword(&req)
  22 + if err != nil {
  23 + httpx.ErrorCtx(r.Context(), w, err)
  24 + } else {
  25 + httpx.OkJsonCtx(r.Context(), w, resp)
  26 + }
  27 + }
  28 +}
  1 +package role
  2 +
  3 +import (
  4 + "net/http"
  5 +
  6 + "github.com/zeromicro/go-zero/rest/httpx"
  7 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/logic/role"
  8 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/svc"
  9 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/types"
  10 +)
  11 +
  12 +func SystemMenuListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  13 + return func(w http.ResponseWriter, r *http.Request) {
  14 + var req types.MenuListRequest
  15 + if err := httpx.Parse(r, &req); err != nil {
  16 + httpx.ErrorCtx(r.Context(), w, err)
  17 + return
  18 + }
  19 +
  20 + l := role.NewSystemMenuListLogic(r.Context(), svcCtx)
  21 + resp, err := l.SystemMenuList(&req)
  22 + if err != nil {
  23 + httpx.ErrorCtx(r.Context(), w, err)
  24 + } else {
  25 + httpx.OkJsonCtx(r.Context(), w, resp)
  26 + }
  27 + }
  28 +}
  1 +package role
  2 +
  3 +import (
  4 + "net/http"
  5 +
  6 + "github.com/zeromicro/go-zero/rest/httpx"
  7 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/logic/role"
  8 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/svc"
  9 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/types"
  10 +)
  11 +
  12 +func SystemRoleDeleteHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  13 + return func(w http.ResponseWriter, r *http.Request) {
  14 + var req types.RoleDeleteRequest
  15 + if err := httpx.Parse(r, &req); err != nil {
  16 + httpx.ErrorCtx(r.Context(), w, err)
  17 + return
  18 + }
  19 +
  20 + l := role.NewSystemRoleDeleteLogic(r.Context(), svcCtx)
  21 + resp, err := l.SystemRoleDelete(&req)
  22 + if err != nil {
  23 + httpx.ErrorCtx(r.Context(), w, err)
  24 + } else {
  25 + httpx.OkJsonCtx(r.Context(), w, resp)
  26 + }
  27 + }
  28 +}
  1 +package role
  2 +
  3 +import (
  4 + "net/http"
  5 +
  6 + "github.com/zeromicro/go-zero/rest/httpx"
  7 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/logic/role"
  8 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/svc"
  9 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/types"
  10 +)
  11 +
  12 +func SystemRoleGetHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  13 + return func(w http.ResponseWriter, r *http.Request) {
  14 + var req types.RoleGetRequest
  15 + if err := httpx.Parse(r, &req); err != nil {
  16 + httpx.ErrorCtx(r.Context(), w, err)
  17 + return
  18 + }
  19 +
  20 + l := role.NewSystemRoleGetLogic(r.Context(), svcCtx)
  21 + resp, err := l.SystemRoleGet(&req)
  22 + if err != nil {
  23 + httpx.ErrorCtx(r.Context(), w, err)
  24 + } else {
  25 + httpx.OkJsonCtx(r.Context(), w, resp)
  26 + }
  27 + }
  28 +}
  1 +package role
  2 +
  3 +import (
  4 + "net/http"
  5 +
  6 + "github.com/zeromicro/go-zero/rest/httpx"
  7 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/logic/role"
  8 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/svc"
  9 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/types"
  10 +)
  11 +
  12 +func SystemRoleSaveHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  13 + return func(w http.ResponseWriter, r *http.Request) {
  14 + var req types.RoleSaveRequest
  15 + if err := httpx.Parse(r, &req); err != nil {
  16 + httpx.ErrorCtx(r.Context(), w, err)
  17 + return
  18 + }
  19 +
  20 + l := role.NewSystemRoleSaveLogic(r.Context(), svcCtx)
  21 + resp, err := l.SystemRoleSave(&req)
  22 + if err != nil {
  23 + httpx.ErrorCtx(r.Context(), w, err)
  24 + } else {
  25 + httpx.OkJsonCtx(r.Context(), w, resp)
  26 + }
  27 + }
  28 +}
  1 +package role
  2 +
  3 +import (
  4 + "net/http"
  5 +
  6 + "github.com/zeromicro/go-zero/rest/httpx"
  7 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/logic/role"
  8 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/svc"
  9 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/types"
  10 +)
  11 +
  12 +func SystemRoleSearchHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  13 + return func(w http.ResponseWriter, r *http.Request) {
  14 + var req types.RoleSearchRequest
  15 + if err := httpx.Parse(r, &req); err != nil {
  16 + httpx.ErrorCtx(r.Context(), w, err)
  17 + return
  18 + }
  19 +
  20 + l := role.NewSystemRoleSearchLogic(r.Context(), svcCtx)
  21 + resp, err := l.SystemRoleSearch(&req)
  22 + if err != nil {
  23 + httpx.ErrorCtx(r.Context(), w, err)
  24 + } else {
  25 + httpx.OkJsonCtx(r.Context(), w, resp)
  26 + }
  27 + }
  28 +}
  1 +package role
  2 +
  3 +import (
  4 + "net/http"
  5 +
  6 + "github.com/zeromicro/go-zero/rest/httpx"
  7 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/logic/role"
  8 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/svc"
  9 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/types"
  10 +)
  11 +
  12 +func SystemRoleUpdateHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  13 + return func(w http.ResponseWriter, r *http.Request) {
  14 + var req types.RoleUpdateRequest
  15 + if err := httpx.Parse(r, &req); err != nil {
  16 + httpx.ErrorCtx(r.Context(), w, err)
  17 + return
  18 + }
  19 +
  20 + l := role.NewSystemRoleUpdateLogic(r.Context(), svcCtx)
  21 + resp, err := l.SystemRoleUpdate(&req)
  22 + if err != nil {
  23 + httpx.ErrorCtx(r.Context(), w, err)
  24 + } else {
  25 + httpx.OkJsonCtx(r.Context(), w, resp)
  26 + }
  27 + }
  28 +}
@@ -9,6 +9,8 @@ import ( @@ -9,6 +9,8 @@ import (
9 company "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/handler/company" 9 company "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/handler/company"
10 department "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/handler/department" 10 department "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/handler/department"
11 employee "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/handler/employee" 11 employee "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/handler/employee"
  12 + role "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/handler/role"
  13 + user "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/handler/user"
12 "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/svc" 14 "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/svc"
13 15
14 "github.com/zeromicro/go-zero/rest" 16 "github.com/zeromicro/go-zero/rest"
@@ -45,6 +47,21 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { @@ -45,6 +47,21 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
45 }, 47 },
46 { 48 {
47 Method: http.MethodPost, 49 Method: http.MethodPost,
  50 + Path: "/auth/edit_user_info",
  51 + Handler: auth.SystemAuthEditUserInfoHandler(serverCtx),
  52 + },
  53 + {
  54 + Method: http.MethodPost,
  55 + Path: "/auth/change_password",
  56 + Handler: auth.SystemAuthChangePasswordHandler(serverCtx),
  57 + },
  58 + {
  59 + Method: http.MethodPost,
  60 + Path: "/auth/reset_password",
  61 + Handler: auth.SystemAuthResetPasswordHandler(serverCtx),
  62 + },
  63 + {
  64 + Method: http.MethodPost,
48 Path: "/auth/switch_company", 65 Path: "/auth/switch_company",
49 Handler: auth.SystemAuthSwitchCompanyHandler(serverCtx), 66 Handler: auth.SystemAuthSwitchCompanyHandler(serverCtx),
50 }, 67 },
@@ -59,6 +76,21 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { @@ -59,6 +76,21 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
59 []rest.Middleware{serverCtx.LogRequest}, 76 []rest.Middleware{serverCtx.LogRequest},
60 []rest.Route{ 77 []rest.Route{
61 { 78 {
  79 + Method: http.MethodPost,
  80 + Path: "/user/company_users",
  81 + Handler: user.UserCompanyUsersHandler(serverCtx),
  82 + },
  83 + }...,
  84 + ),
  85 + rest.WithJwt(serverCtx.Config.SystemAuth.AccessSecret),
  86 + rest.WithPrefix("/v1"),
  87 + )
  88 +
  89 + server.AddRoutes(
  90 + rest.WithMiddlewares(
  91 + []rest.Middleware{serverCtx.LogRequest},
  92 + []rest.Route{
  93 + {
62 Method: http.MethodGet, 94 Method: http.MethodGet,
63 Path: "/system/company_info", 95 Path: "/system/company_info",
64 Handler: company.SystemCompanyInfoHandler(serverCtx), 96 Handler: company.SystemCompanyInfoHandler(serverCtx),
@@ -135,6 +167,46 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { @@ -135,6 +167,46 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
135 []rest.Route{ 167 []rest.Route{
136 { 168 {
137 Method: http.MethodGet, 169 Method: http.MethodGet,
  170 + Path: "/role/:id",
  171 + Handler: role.SystemRoleGetHandler(serverCtx),
  172 + },
  173 + {
  174 + Method: http.MethodPost,
  175 + Path: "/role",
  176 + Handler: role.SystemRoleSaveHandler(serverCtx),
  177 + },
  178 + {
  179 + Method: http.MethodDelete,
  180 + Path: "/role/:id",
  181 + Handler: role.SystemRoleDeleteHandler(serverCtx),
  182 + },
  183 + {
  184 + Method: http.MethodPut,
  185 + Path: "/role/:id",
  186 + Handler: role.SystemRoleUpdateHandler(serverCtx),
  187 + },
  188 + {
  189 + Method: http.MethodPost,
  190 + Path: "/role/search",
  191 + Handler: role.SystemRoleSearchHandler(serverCtx),
  192 + },
  193 + {
  194 + Method: http.MethodPost,
  195 + Path: "/menu/list",
  196 + Handler: role.SystemMenuListHandler(serverCtx),
  197 + },
  198 + }...,
  199 + ),
  200 + rest.WithJwt(serverCtx.Config.SystemAuth.AccessSecret),
  201 + rest.WithPrefix("/v1/system"),
  202 + )
  203 +
  204 + server.AddRoutes(
  205 + rest.WithMiddlewares(
  206 + []rest.Middleware{serverCtx.LogRequest},
  207 + []rest.Route{
  208 + {
  209 + Method: http.MethodGet,
138 Path: "/system/app/:id", 210 Path: "/system/app/:id",
139 Handler: app.SystemAppGetHandler(serverCtx), 211 Handler: app.SystemAppGetHandler(serverCtx),
140 }, 212 },
@@ -144,7 +216,7 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { @@ -144,7 +216,7 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
144 Handler: app.SystemAppSearchHandler(serverCtx), 216 Handler: app.SystemAppSearchHandler(serverCtx),
145 }, 217 },
146 { 218 {
147 - Method: http.MethodGet, 219 + Method: http.MethodPost,
148 Path: "/system/app/set_config", 220 Path: "/system/app/set_config",
149 Handler: app.SystemAppSetConfigHandler(serverCtx), 221 Handler: app.SystemAppSetConfigHandler(serverCtx),
150 }, 222 },
  1 +package user
  2 +
  3 +import (
  4 + "net/http"
  5 +
  6 + "github.com/zeromicro/go-zero/rest/httpx"
  7 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/logic/user"
  8 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/svc"
  9 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/types"
  10 +)
  11 +
  12 +func UserCompanyUsersHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  13 + return func(w http.ResponseWriter, r *http.Request) {
  14 + var req types.CompanyUsersRequest
  15 + if err := httpx.Parse(r, &req); err != nil {
  16 + httpx.ErrorCtx(r.Context(), w, err)
  17 + return
  18 + }
  19 +
  20 + l := user.NewUserCompanyUsersLogic(r.Context(), svcCtx)
  21 + resp, err := l.UserCompanyUsers(&req)
  22 + if err != nil {
  23 + httpx.ErrorCtx(r.Context(), w, err)
  24 + } else {
  25 + httpx.OkJsonCtx(r.Context(), w, resp)
  26 + }
  27 + }
  28 +}
@@ -72,7 +72,7 @@ func (l *SystemAppSearchLogic) SystemAppSearch(req *types.SystemAppSearchRequest @@ -72,7 +72,7 @@ func (l *SystemAppSearchLogic) SystemAppSearch(req *types.SystemAppSearchRequest
72 CompanyId: token.CompanyId, 72 CompanyId: token.CompanyId,
73 AppId: app.Id, 73 AppId: app.Id,
74 Status: domain.Enable, 74 Status: domain.Enable,
75 - VisibleFlag: domain.VisibleAll, 75 + VisibleFlag: domain.VisibleParts,
76 VisibleUsers: make([]int64, 0), 76 VisibleUsers: make([]int64, 0),
77 VisibleGroups: make([]int64, 0), 77 VisibleGroups: make([]int64, 0),
78 AppConfig: domain.AppConfig{}, 78 AppConfig: domain.AppConfig{},
@@ -2,6 +2,9 @@ package app @@ -2,6 +2,9 @@ package app
2 2
3 import ( 3 import (
4 "context" 4 "context"
  5 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/internal/pkg/domain"
  6 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/transaction"
  7 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/xerr"
5 8
6 "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/svc" 9 "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/svc"
7 "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/types" 10 "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/types"
@@ -24,6 +27,26 @@ func NewSystemAppSetConfigLogic(ctx context.Context, svcCtx *svc.ServiceContext) @@ -24,6 +27,26 @@ func NewSystemAppSetConfigLogic(ctx context.Context, svcCtx *svc.ServiceContext)
24 } 27 }
25 28
26 func (l *SystemAppSetConfigLogic) SystemAppSetConfig(req *types.SystemAppSetConfigRequest) (resp *types.SystemAppSetConfigResponse, err error) { 29 func (l *SystemAppSetConfigLogic) SystemAppSetConfig(req *types.SystemAppSetConfigRequest) (resp *types.SystemAppSetConfigResponse, err error) {
  30 + var (
  31 + conn = l.svcCtx.DefaultDBConn()
  32 + companyApp *domain.SysCompanyApp
  33 + //app *domain.SysApp
  34 + )
  35 + if companyApp, err = l.svcCtx.CompanyAppRepository.FindOne(l.ctx, conn, req.AppId); err != nil {
  36 + return nil, xerr.NewErrMsgErr("不存在", err)
  37 + }
  38 +
  39 + companyApp.VisibleFlag = req.VisibleFlag
  40 + companyApp.VisibleUsers = req.VisibleUsers
  41 + companyApp.VisibleDepartments = req.VisibleDepartments
27 42
  43 + // 更新
  44 + if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error {
  45 + companyApp, err = l.svcCtx.CompanyAppRepository.UpdateWithVersion(l.ctx, conn, companyApp)
  46 + return err
  47 + }, true); err != nil {
  48 + return nil, xerr.NewErrMsg("更新失败")
  49 + }
  50 + resp = &types.SystemAppSetConfigResponse{}
28 return 51 return
29 } 52 }
  1 +package auth
  2 +
  3 +import (
  4 + "context"
  5 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/internal/pkg/domain"
  6 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/contextdata"
  7 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/transaction"
  8 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/xerr"
  9 +
  10 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/svc"
  11 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/types"
  12 +
  13 + "github.com/zeromicro/go-zero/core/logx"
  14 +)
  15 +
  16 +type SystemAuthChangePasswordLogic struct {
  17 + logx.Logger
  18 + ctx context.Context
  19 + svcCtx *svc.ServiceContext
  20 +}
  21 +
  22 +func NewSystemAuthChangePasswordLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SystemAuthChangePasswordLogic {
  23 + return &SystemAuthChangePasswordLogic{
  24 + Logger: logx.WithContext(ctx),
  25 + ctx: ctx,
  26 + svcCtx: svcCtx,
  27 + }
  28 +}
  29 +
  30 +func (l *SystemAuthChangePasswordLogic) SystemAuthChangePassword(req *types.ChangePasswordRequest) (resp *types.ChangePasswordResponse, err error) {
  31 + var (
  32 + conn = l.svcCtx.DefaultDBConn()
  33 + user *domain.SysUser
  34 + token = contextdata.GetUserTokenFromCtx(l.ctx)
  35 + )
  36 + if user, err = l.svcCtx.UserRepository.FindOne(l.ctx, conn, token.UserId); err != nil {
  37 + return nil, xerr.NewErrMsgErr("用户不存在", err)
  38 + }
  39 + if req.OldPassword != user.Password {
  40 + return nil, xerr.NewErrMsgErr("旧密码有误", err)
  41 + }
  42 + if req.NewPassword != req.ConfirmPassword {
  43 + return nil, xerr.NewErrMsgErr("输入的密码不一致", err)
  44 + }
  45 + user.Password = req.ConfirmPassword
  46 + if err = transaction.MustUseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error {
  47 + if user, err = l.svcCtx.UserRepository.UpdateWithVersion(l.ctx, conn, user); err != nil {
  48 + return err
  49 + }
  50 + return nil
  51 + }); err != nil {
  52 + return nil, xerr.NewErrMsgErr("更新失败", err)
  53 + }
  54 + return
  55 +}
  1 +package auth
  2 +
  3 +import (
  4 + "context"
  5 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/internal/pkg/domain"
  6 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/contextdata"
  7 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/transaction"
  8 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/xerr"
  9 +
  10 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/svc"
  11 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/types"
  12 +
  13 + "github.com/zeromicro/go-zero/core/logx"
  14 +)
  15 +
  16 +type SystemAuthEditUserInfoLogic struct {
  17 + logx.Logger
  18 + ctx context.Context
  19 + svcCtx *svc.ServiceContext
  20 +}
  21 +
  22 +func NewSystemAuthEditUserInfoLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SystemAuthEditUserInfoLogic {
  23 + return &SystemAuthEditUserInfoLogic{
  24 + Logger: logx.WithContext(ctx),
  25 + ctx: ctx,
  26 + svcCtx: svcCtx,
  27 + }
  28 +}
  29 +
  30 +func (l *SystemAuthEditUserInfoLogic) SystemAuthEditUserInfo(req *types.EditUserInfoRequest) (resp *types.UserInfoResponse, err error) {
  31 + var (
  32 + conn = l.svcCtx.DefaultDBConn()
  33 + user *domain.SysUser
  34 + token = contextdata.GetUserTokenFromCtx(l.ctx)
  35 + )
  36 + if user, err = l.svcCtx.UserRepository.FindOne(l.ctx, conn, token.UserId); err != nil {
  37 + return nil, xerr.NewErrMsgErr("用户不存在", err)
  38 + }
  39 + if req.Phone != nil {
  40 + if user, err = l.svcCtx.UserRepository.FindOneByPhone(l.ctx, conn, *req.Phone); err != nil {
  41 + return nil, xerr.NewErrMsgErr("手机号已被占用", err)
  42 + }
  43 + user.Phone = *req.Phone
  44 + }
  45 + if req.Name != nil {
  46 + user.Name = *req.Name
  47 + }
  48 + if req.Avatar != nil {
  49 + user.Avatar = *req.Avatar
  50 + }
  51 + if err = transaction.MustUseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error {
  52 + if user, err = l.svcCtx.UserRepository.UpdateWithVersion(l.ctx, conn, user); err != nil {
  53 + return err
  54 + }
  55 + return nil
  56 + }); err != nil {
  57 + return nil, xerr.NewErrMsgErr("更新失败", err)
  58 + }
  59 + return
  60 +}
@@ -44,7 +44,7 @@ func (l *SystemAuthLoginLogic) SystemAuthLogin(req *types.AuthLoginRequest) (res @@ -44,7 +44,7 @@ func (l *SystemAuthLoginLogic) SystemAuthLogin(req *types.AuthLoginRequest) (res
44 company *domain.SysCompany 44 company *domain.SysCompany
45 ) 45 )
46 if user, err = l.svcCtx.UserRepository.FindOneByPhone(l.ctx, conn, req.Phone); err != nil { 46 if user, err = l.svcCtx.UserRepository.FindOneByPhone(l.ctx, conn, req.Phone); err != nil {
47 - return nil, xerr.NewErr(err) 47 + return nil, xerr.NewErrMsgErr("账号不存在", err)
48 } 48 }
49 switch req.LoginType { 49 switch req.LoginType {
50 case LoginTypeWechatLogin: 50 case LoginTypeWechatLogin:
  1 +package auth
  2 +
  3 +import (
  4 + "context"
  5 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/internal/pkg/domain"
  6 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/contextdata"
  7 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/gateway/smslib"
  8 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/transaction"
  9 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/xerr"
  10 +
  11 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/svc"
  12 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/types"
  13 +
  14 + "github.com/zeromicro/go-zero/core/logx"
  15 +)
  16 +
  17 +type SystemAuthResetPasswordLogic struct {
  18 + logx.Logger
  19 + ctx context.Context
  20 + svcCtx *svc.ServiceContext
  21 +}
  22 +
  23 +func NewSystemAuthResetPasswordLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SystemAuthResetPasswordLogic {
  24 + return &SystemAuthResetPasswordLogic{
  25 + Logger: logx.WithContext(ctx),
  26 + ctx: ctx,
  27 + svcCtx: svcCtx,
  28 + }
  29 +}
  30 +
  31 +func (l *SystemAuthResetPasswordLogic) SystemAuthResetPassword(req *types.ResetPasswordRequest) (resp *types.ResetPasswordResponse, err error) {
  32 + var (
  33 + conn = l.svcCtx.DefaultDBConn()
  34 + user *domain.SysUser
  35 + token = contextdata.GetUserTokenFromCtx(l.ctx)
  36 + )
  37 + if user, err = l.svcCtx.UserRepository.FindOne(l.ctx, conn, token.UserId); err != nil {
  38 + return nil, xerr.NewErrMsgErr("用户不存在", err)
  39 + }
  40 + var (
  41 + skipCheckSmsCode bool = false
  42 + )
  43 + if l.svcCtx.Config.DebugSmsCode != "" && l.svcCtx.Config.DebugSmsCode == req.Code {
  44 + skipCheckSmsCode = true
  45 + }
  46 + if _, err = l.svcCtx.SmsService.CheckSmsCode(l.ctx, smslib.RequestCheckSmsCode{Phone: user.Phone, Code: req.Code}); err != nil && !skipCheckSmsCode {
  47 + return nil, xerr.NewErrMsgErr(err.Error(), err)
  48 + }
  49 + if req.NewPassword != req.ConfirmPassword {
  50 + return nil, xerr.NewErrMsgErr("输入的密码不一致", err)
  51 + }
  52 + user.Password = req.ConfirmPassword
  53 + if err = transaction.MustUseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error {
  54 + if user, err = l.svcCtx.UserRepository.UpdateWithVersion(l.ctx, conn, user); err != nil {
  55 + return err
  56 + }
  57 + return nil
  58 + }); err != nil {
  59 + return nil, xerr.NewErrMsgErr("更新失败", err)
  60 + }
  61 + return
  62 +}
@@ -2,6 +2,9 @@ package auth @@ -2,6 +2,9 @@ package auth
2 2
3 import ( 3 import (
4 "context" 4 "context"
  5 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/internal/pkg/domain"
  6 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/contextdata"
  7 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/xerr"
5 8
6 "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/svc" 9 "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/svc"
7 "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/types" 10 "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/types"
@@ -24,7 +27,36 @@ func NewSystemAuthSwitchCompanyLogic(ctx context.Context, svcCtx *svc.ServiceCon @@ -24,7 +27,36 @@ func NewSystemAuthSwitchCompanyLogic(ctx context.Context, svcCtx *svc.ServiceCon
24 } 27 }
25 28
26 func (l *SystemAuthSwitchCompanyLogic) SystemAuthSwitchCompany(req *types.SwitchCompanyRequest) (resp *types.AuthLoginResponse, err error) { 29 func (l *SystemAuthSwitchCompanyLogic) SystemAuthSwitchCompany(req *types.SwitchCompanyRequest) (resp *types.AuthLoginResponse, err error) {
27 - // todo: add your logic here and delete this line  
28 - 30 + var (
  31 + conn = l.svcCtx.DefaultDBConn()
  32 + company *domain.SysCompany
  33 + user *domain.SysUser
  34 + employee *domain.SysEmployee
  35 + token = contextdata.GetUserTokenFromCtx(l.ctx)
  36 + )
  37 + if employee, err = l.svcCtx.EmployeeRepository.FindOneByUserId(l.ctx, conn, req.CompanyId, token.UserId); err != nil {
  38 + return nil, xerr.NewErrMsgErr("账号不存在", err)
  39 + }
  40 + if employee.AccountStatus != domain.Enable {
  41 + return nil, xerr.NewErrMsgErr("账号已被禁用", err)
  42 + }
  43 + if user, err = l.svcCtx.UserRepository.FindOne(l.ctx, conn, employee.UserId); err != nil {
  44 + return nil, xerr.NewErrMsgErr("账号不存在", err)
  45 + }
  46 + if company, err = l.svcCtx.CompanyRepository.FindOne(l.ctx, conn, employee.CompanyId); err != nil {
  47 + return nil, xerr.NewErrMsgErr("账号不存在", err)
  48 + }
  49 + if company.Status != domain.Enable {
  50 + return nil, xerr.NewErrMsgErr("公司已被禁用", err)
  51 + }
  52 + userToken := contextdata.UserToken{
  53 + CompanyId: employee.CompanyId,
  54 + UserId: user.Id,
  55 + EmployeeId: employee.Id,
  56 + }
  57 + tokenStr, _ := userToken.GenerateToken(l.svcCtx.Config.SystemAuth.AccessSecret, l.svcCtx.Config.SystemAuth.AccessExpire)
  58 + resp = &types.AuthLoginResponse{
  59 + Token: tokenStr,
  60 + }
29 return 61 return
30 } 62 }
@@ -3,6 +3,7 @@ package auth @@ -3,6 +3,7 @@ package auth
3 import ( 3 import (
4 "context" 4 "context"
5 "github.com/samber/lo" 5 "github.com/samber/lo"
  6 + "github.com/zeromicro/go-zero/core/collection"
6 "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/internal/pkg/domain" 7 "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/internal/pkg/domain"
7 "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/xerr" 8 "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/xerr"
8 9
@@ -31,8 +32,7 @@ func (l *SystemAuthUserInfoLogic) SystemAuthUserInfo(req *types.UserInfoRequest) @@ -31,8 +32,7 @@ func (l *SystemAuthUserInfoLogic) SystemAuthUserInfo(req *types.UserInfoRequest)
31 conn = l.svcCtx.DefaultDBConn() 32 conn = l.svcCtx.DefaultDBConn()
32 company *domain.SysCompany 33 company *domain.SysCompany
33 user *domain.SysUser 34 user *domain.SysUser
34 - employee *domain.SysEmployee  
35 - companies []types.Company 35 + companies []types.AccountInfo
36 ) 36 )
37 if company, err = l.svcCtx.CompanyRepository.FindOne(l.ctx, conn, req.CompanyId); err != nil { 37 if company, err = l.svcCtx.CompanyRepository.FindOne(l.ctx, conn, req.CompanyId); err != nil {
38 return nil, xerr.NewErr(err) 38 return nil, xerr.NewErr(err)
@@ -40,30 +40,110 @@ func (l *SystemAuthUserInfoLogic) SystemAuthUserInfo(req *types.UserInfoRequest) @@ -40,30 +40,110 @@ func (l *SystemAuthUserInfoLogic) SystemAuthUserInfo(req *types.UserInfoRequest)
40 if user, err = l.svcCtx.UserRepository.FindOne(l.ctx, conn, req.UserId); err != nil { 40 if user, err = l.svcCtx.UserRepository.FindOne(l.ctx, conn, req.UserId); err != nil {
41 return nil, xerr.NewErr(err) 41 return nil, xerr.NewErr(err)
42 } 42 }
43 - if employee, err = l.svcCtx.EmployeeRepository.FindOne(l.ctx, conn, req.EmployeeId); err != nil {  
44 - return nil, xerr.NewErr(err)  
45 - }  
46 if _, employees, _ := l.svcCtx.EmployeeRepository.FindByUserId(l.ctx, conn, req.UserId); len(employees) > 0 { 43 if _, employees, _ := l.svcCtx.EmployeeRepository.FindByUserId(l.ctx, conn, req.UserId); len(employees) > 0 {
47 for _, e := range employees { 44 for _, e := range employees {
48 - if c, _ := l.svcCtx.CompanyRepository.FindOne(l.ctx, conn, e.CompanyId); c != nil {  
49 - companies = append(companies, NewTypesCompany(c)) 45 + if findOne, _ := l.svcCtx.CompanyRepository.FindOne(l.ctx, conn, e.CompanyId); findOne != nil && findOne.Status == domain.Enable {
  46 + companies = append(companies, types.AccountInfo{
  47 + Company: NewTypesCompany(findOne),
  48 + Selected: findOne.Id == company.Id,
  49 + })
50 } 50 }
51 } 51 }
52 } 52 }
  53 +
53 resp = &types.UserInfoResponse{ 54 resp = &types.UserInfoResponse{
54 - Id: user.Id,  
55 - Name: user.Name,  
56 - Phone: user.Phone,  
57 - Company: &types.Company{  
58 - Id: company.Id,  
59 - Name: company.Name,  
60 - },  
61 - EmployeeInfo: lo.ToPtr(NewTypesEmployee(employee)),  
62 - CompanyList: companies, 55 + Id: user.Id,
  56 + Name: user.Name,
  57 + Phone: user.Phone,
  58 + Avatar: user.Avatar,
  59 + Accounts: companies,
  60 + Menus: l.GetUserAuthMenus(user.Id, company.Id, user.Phone == company.BaseInfo.ContactPhone),
  61 + Apps: l.GetUserApps(user.Id, company.Id),
63 } 62 }
64 return 63 return
65 } 64 }
66 65
  66 +func (l *SystemAuthUserInfoLogic) GetUserAuthMenus(userId int64, companyId int64, isCompanyAdmin bool) []types.Menu {
  67 + var (
  68 + conn = l.svcCtx.DefaultDBConn()
  69 + )
  70 + var typesMenus = make([]types.Menu, 0)
  71 + var menusSet = collection.NewSet()
  72 + _, roles, _ := l.svcCtx.RoleRepository.FindByEmployee(l.ctx, conn, companyId, userId, domain.NewQueryOptions().WithFindOnly())
  73 + var hasAllAuth bool
  74 + for _, role := range roles {
  75 + if !lo.Contains(role.AuthUsers, userId) {
  76 + continue
  77 + }
  78 + if role.AuthRange == domain.AuthRangeAll {
  79 + hasAllAuth = true
  80 + }
  81 + menusSet.Add(lo.ToAnySlice(role.Menus)...)
  82 + }
  83 +
  84 + menuLazyLoad := domain.NewLazyLoadService(domain.FineOneMenu)
  85 + menuIds := menusSet.KeysInt64()
  86 + if isCompanyAdmin || hasAllAuth {
  87 + for _, menu := range domain.DefaultMenus {
  88 + typesMenus = append(typesMenus, types.NewTypesMenu(menu))
  89 + }
  90 + } else {
  91 + for _, menuId := range menuIds {
  92 + if menu, _ := menuLazyLoad.Load(l.ctx, conn, menuId); menu != nil {
  93 + typesMenus = append(typesMenus, types.NewTypesMenu(menu))
  94 + }
  95 + }
  96 + }
  97 + // TODO:先给所有菜单,后期修改
  98 + if len(typesMenus) == 0 {
  99 + for _, menu := range domain.DefaultMenus {
  100 + typesMenus = append(typesMenus, types.NewTypesMenu(menu))
  101 + }
  102 + }
  103 + return typesMenus
  104 +}
  105 +
  106 +func (l *SystemAuthUserInfoLogic) GetUserApps(userId int64, companyId int64) []types.SystemAppItem {
  107 + var (
  108 + conn = l.svcCtx.DefaultDBConn()
  109 + typesApps = make([]types.SystemAppItem, 0)
  110 + companyApps []*domain.SysCompanyApp
  111 + err error
  112 + )
  113 +
  114 + if _, companyApps, err = l.svcCtx.CompanyAppRepository.Find(l.ctx, conn, domain.NewQueryOptions().WithFindOnly().MustWithKV("companyId", companyId)); err != nil {
  115 + return typesApps
  116 + }
  117 + lazyApp := domain.NewLazyLoadService(l.svcCtx.AppRepository.FindOne)
  118 + for _, companyApp := range companyApps {
  119 + var app, _ = lazyApp.Load(l.ctx, conn, companyApp.AppId)
  120 + if app == nil {
  121 + continue
  122 + }
  123 + typeApp := types.NewTypesSystemAppItem(app, companyApp)
  124 + // 有指定用户权限
  125 + if len(companyApp.VisibleUsers) > 0 && lo.Contains(companyApp.VisibleUsers, userId) {
  126 + typeApp.HasAuth = true
  127 + }
  128 + // 有部门权限
  129 + if !(typeApp.HasAuth) && len(companyApp.VisibleDepartments) > 0 {
  130 + _, departments, _ := l.svcCtx.UserDepartmentRepository.FindByUser(l.ctx, conn, companyId, []int64{userId})
  131 + if lo.ContainsBy(departments, func(item *domain.SysUserDepartment) bool {
  132 + for _, id := range companyApp.VisibleDepartments {
  133 + if id == item.DepartmentId {
  134 + return true
  135 + }
  136 + }
  137 + return false
  138 + }) {
  139 + typeApp.HasAuth = true
  140 + }
  141 + }
  142 + typesApps = append(typesApps, typeApp)
  143 + }
  144 + return typesApps
  145 +}
  146 +
67 func NewDomainSysEmployee(item types.Employee) *domain.SysEmployee { 147 func NewDomainSysEmployee(item types.Employee) *domain.SysEmployee {
68 return &domain.SysEmployee{} 148 return &domain.SysEmployee{}
69 } 149 }
@@ -100,7 +100,7 @@ func (l *SystemEmployeeUpdateLogic) SystemEmployeeUpdate(req *types.EmployeeUpda @@ -100,7 +100,7 @@ func (l *SystemEmployeeUpdateLogic) SystemEmployeeUpdate(req *types.EmployeeUpda
100 100
101 return nil 101 return nil
102 }); err != nil { 102 }); err != nil {
103 - 103 + return nil, xerr.NewErrMsgErr("更新失败", err)
104 } 104 }
105 105
106 return 106 return
  1 +package role
  2 +
  3 +import (
  4 + "context"
  5 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/internal/pkg/domain"
  6 +
  7 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/svc"
  8 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/types"
  9 +
  10 + "github.com/zeromicro/go-zero/core/logx"
  11 +)
  12 +
  13 +type SystemMenuListLogic struct {
  14 + logx.Logger
  15 + ctx context.Context
  16 + svcCtx *svc.ServiceContext
  17 +}
  18 +
  19 +func NewSystemMenuListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SystemMenuListLogic {
  20 + return &SystemMenuListLogic{
  21 + Logger: logx.WithContext(ctx),
  22 + ctx: ctx,
  23 + svcCtx: svcCtx,
  24 + }
  25 +}
  26 +
  27 +func (l *SystemMenuListLogic) SystemMenuList(req *types.MenuListRequest) (resp *types.MenuListResponse, err error) {
  28 + // todo: add your logic here and delete this line
  29 + resp = &types.MenuListResponse{}
  30 + for _, menu := range domain.DefaultMenus {
  31 + resp.List = append(resp.List, types.NewTypesMenu(menu))
  32 + }
  33 + return
  34 +}
  1 +package role
  2 +
  3 +import (
  4 + "context"
  5 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/internal/pkg/domain"
  6 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/transaction"
  7 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/xerr"
  8 +
  9 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/svc"
  10 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/types"
  11 +
  12 + "github.com/zeromicro/go-zero/core/logx"
  13 +)
  14 +
  15 +type SystemRoleDeleteLogic struct {
  16 + logx.Logger
  17 + ctx context.Context
  18 + svcCtx *svc.ServiceContext
  19 +}
  20 +
  21 +func NewSystemRoleDeleteLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SystemRoleDeleteLogic {
  22 + return &SystemRoleDeleteLogic{
  23 + Logger: logx.WithContext(ctx),
  24 + ctx: ctx,
  25 + svcCtx: svcCtx,
  26 + }
  27 +}
  28 +
  29 +func (l *SystemRoleDeleteLogic) SystemRoleDelete(req *types.RoleDeleteRequest) (resp *types.RoleDeleteResponse, err error) {
  30 + var (
  31 + conn = l.svcCtx.DefaultDBConn()
  32 + dm *domain.SysRole
  33 + )
  34 + if dm, err = l.svcCtx.RoleRepository.FindOne(l.ctx, conn, req.Id); err != nil {
  35 + return nil, xerr.NewErrMsgErr("不存在", err)
  36 + }
  37 + if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error {
  38 + if dm, err = l.svcCtx.RoleRepository.Delete(l.ctx, conn, dm); err != nil {
  39 + return err
  40 + }
  41 + return nil
  42 + }, true); err != nil {
  43 + return nil, xerr.NewErrMsgErr("移除失败", err)
  44 + }
  45 + return
  46 +}
  1 +package role
  2 +
  3 +import (
  4 + "context"
  5 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/internal/pkg/domain"
  6 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/xerr"
  7 +
  8 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/svc"
  9 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/types"
  10 +
  11 + "github.com/zeromicro/go-zero/core/logx"
  12 +)
  13 +
  14 +type SystemRoleGetLogic struct {
  15 + logx.Logger
  16 + ctx context.Context
  17 + svcCtx *svc.ServiceContext
  18 +}
  19 +
  20 +func NewSystemRoleGetLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SystemRoleGetLogic {
  21 + return &SystemRoleGetLogic{
  22 + Logger: logx.WithContext(ctx),
  23 + ctx: ctx,
  24 + svcCtx: svcCtx,
  25 + }
  26 +}
  27 +
  28 +func (l *SystemRoleGetLogic) SystemRoleGet(req *types.RoleGetRequest) (resp *types.RoleGetResponse, err error) {
  29 + var (
  30 + conn = l.svcCtx.DefaultDBConn()
  31 + dm *domain.SysRole
  32 + )
  33 + // 货号唯一
  34 + if dm, err = l.svcCtx.RoleRepository.FindOne(l.ctx, conn, req.Id); err != nil {
  35 + return nil, xerr.NewErrMsgErr("不存在", err)
  36 + }
  37 + userLazyLoad := domain.NewLazyLoadService(l.svcCtx.UserRepository.FindOne)
  38 + menuLazyLoad := domain.NewLazyLoadService(domain.FineOneMenu)
  39 + role := NewTypesSysRole(dm)
  40 + for _, userId := range dm.AuthUsers {
  41 + if user, _ := userLazyLoad.Load(l.ctx, conn, userId); user != nil {
  42 + role.AuthUsers = append(role.AuthUsers, types.NewTypesUser(user))
  43 + }
  44 + }
  45 + for _, menuId := range dm.Menus {
  46 + if menu, _ := menuLazyLoad.Load(l.ctx, conn, menuId); menu != nil {
  47 + role.Menus = append(role.Menus, types.NewTypesMenu(menu))
  48 + }
  49 + }
  50 + resp = &types.RoleGetResponse{
  51 + Role: role,
  52 + }
  53 + return
  54 +}
  1 +package role
  2 +
  3 +import (
  4 + "context"
  5 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/internal/pkg/domain"
  6 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/contextdata"
  7 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/transaction"
  8 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/xerr"
  9 +
  10 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/svc"
  11 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/types"
  12 +
  13 + "github.com/zeromicro/go-zero/core/logx"
  14 +)
  15 +
  16 +type SystemRoleSaveLogic struct {
  17 + logx.Logger
  18 + ctx context.Context
  19 + svcCtx *svc.ServiceContext
  20 +}
  21 +
  22 +func NewSystemRoleSaveLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SystemRoleSaveLogic {
  23 + return &SystemRoleSaveLogic{
  24 + Logger: logx.WithContext(ctx),
  25 + ctx: ctx,
  26 + svcCtx: svcCtx,
  27 + }
  28 +}
  29 +
  30 +func (l *SystemRoleSaveLogic) SystemRoleSave(req *types.RoleSaveRequest) (resp *types.RoleSaveResponse, err error) {
  31 + var (
  32 + //conn = l.svcCtx.DefaultDBConn()
  33 + dm *domain.SysRole
  34 + token = contextdata.GetUserTokenFromCtx(l.ctx)
  35 + )
  36 + // 唯一判断
  37 +
  38 + dm = NewDomainSysRole(token.CompanyId, req.Role)
  39 + if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error {
  40 + dm, err = l.svcCtx.RoleRepository.Insert(l.ctx, conn, dm)
  41 + return err
  42 + }, true); err != nil {
  43 + return nil, xerr.NewErrMsg("保存失败")
  44 + }
  45 + resp = &types.RoleSaveResponse{}
  46 + return
  47 +}
  48 +
  49 +func NewDomainSysRole(companyId int64, item types.Role) *domain.SysRole {
  50 + menus := domain.Values(item.Menus, func(item types.Menu) int64 {
  51 + return item.Id
  52 + })
  53 + users := domain.Values(item.AuthUsers, func(item types.User) int64 {
  54 + return item.Id
  55 + })
  56 + if item.AuthRange == 0 {
  57 + if len(menus) == len(domain.DefaultMenus) {
  58 + item.AuthRange = domain.AuthRangeAll
  59 + } else {
  60 + item.AuthRange = domain.AuthRangePart
  61 + }
  62 + }
  63 + return &domain.SysRole{
  64 + CompanyId: companyId,
  65 + Name: item.Name,
  66 + Menus: menus,
  67 + AuthUsers: users,
  68 + AuthRange: item.AuthRange,
  69 + }
  70 +}
  71 +
  72 +func NewTypesSysRole(item *domain.SysRole) types.Role {
  73 + return types.Role{
  74 + Id: item.Id,
  75 + Name: item.Name,
  76 + AuthRange: item.AuthRange,
  77 + UpdatedAt: item.UpdatedAt,
  78 + }
  79 +}
  1 +package role
  2 +
  3 +import (
  4 + "context"
  5 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/internal/pkg/domain"
  6 +
  7 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/svc"
  8 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/types"
  9 +
  10 + "github.com/zeromicro/go-zero/core/logx"
  11 +)
  12 +
  13 +type SystemRoleSearchLogic struct {
  14 + logx.Logger
  15 + ctx context.Context
  16 + svcCtx *svc.ServiceContext
  17 +}
  18 +
  19 +func NewSystemRoleSearchLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SystemRoleSearchLogic {
  20 + return &SystemRoleSearchLogic{
  21 + Logger: logx.WithContext(ctx),
  22 + ctx: ctx,
  23 + svcCtx: svcCtx,
  24 + }
  25 +}
  26 +
  27 +func (l *SystemRoleSearchLogic) SystemRoleSearch(req *types.RoleSearchRequest) (resp *types.RoleSearchResponse, err error) {
  28 + var (
  29 + conn = l.svcCtx.DefaultDBConn()
  30 + dms []*domain.SysRole
  31 + total int64
  32 + )
  33 +
  34 + queryOptions := domain.NewQueryOptions().WithOffsetLimit(req.Page, req.Size).
  35 + WithKV("userName", req.UserName).
  36 + WithKV("roleName", req.RoleName)
  37 +
  38 + total, dms, err = l.svcCtx.RoleRepository.Find(l.ctx, conn, queryOptions)
  39 + list := make([]types.Role, 0)
  40 + userLazyLoad := domain.NewLazyLoadService(l.svcCtx.UserRepository.FindOne)
  41 + menuLazyLoad := domain.NewLazyLoadService(domain.FineOneMenu)
  42 + for i := range dms {
  43 + role := NewTypesSysRole(dms[i])
  44 + for j, userId := range dms[i].AuthUsers {
  45 + // 超过十名的不查用户信息
  46 + if j > 5 {
  47 + role.AuthUsers = append(role.AuthUsers, types.NewTypesUser(&domain.SysUser{Id: userId}))
  48 + }
  49 + if user, _ := userLazyLoad.Load(l.ctx, conn, userId); user != nil {
  50 + role.AuthUsers = append(role.AuthUsers, types.NewTypesUser(user))
  51 + }
  52 + }
  53 + for _, menuId := range dms[i].Menus {
  54 + if menu, _ := menuLazyLoad.Load(l.ctx, conn, menuId); menu != nil {
  55 + role.Menus = append(role.Menus, types.NewTypesMenu(menu))
  56 + }
  57 + }
  58 + list = append(list, role)
  59 + }
  60 + resp = &types.RoleSearchResponse{
  61 + List: list,
  62 + Total: total,
  63 + }
  64 + return
  65 +}
  1 +package role
  2 +
  3 +import (
  4 + "context"
  5 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/internal/pkg/domain"
  6 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/transaction"
  7 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/xerr"
  8 +
  9 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/svc"
  10 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/types"
  11 +
  12 + "github.com/zeromicro/go-zero/core/logx"
  13 +)
  14 +
  15 +type SystemRoleUpdateLogic struct {
  16 + logx.Logger
  17 + ctx context.Context
  18 + svcCtx *svc.ServiceContext
  19 +}
  20 +
  21 +func NewSystemRoleUpdateLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SystemRoleUpdateLogic {
  22 + return &SystemRoleUpdateLogic{
  23 + Logger: logx.WithContext(ctx),
  24 + ctx: ctx,
  25 + svcCtx: svcCtx,
  26 + }
  27 +}
  28 +
  29 +func (l *SystemRoleUpdateLogic) SystemRoleUpdate(req *types.RoleUpdateRequest) (resp *types.RoleUpdateResponse, err error) {
  30 + var (
  31 + conn = l.svcCtx.DefaultDBConn()
  32 + dm *domain.SysRole
  33 + )
  34 + if dm, err = l.svcCtx.RoleRepository.FindOne(l.ctx, conn, req.Id); err != nil {
  35 + return nil, xerr.NewErrMsgErr("不存在", err)
  36 + }
  37 + // 不可编辑判断
  38 +
  39 + // 赋值
  40 + menus := domain.Values(req.Role.Menus, func(item types.Menu) int64 {
  41 + return item.Id
  42 + })
  43 + users := domain.Values(req.Role.AuthUsers, func(item types.User) int64 {
  44 + return item.Id
  45 + })
  46 +
  47 + dm.Name = req.Role.Name
  48 + dm.Menus = menus
  49 + dm.AuthUsers = users
  50 + if req.Role.AuthRange == 0 {
  51 + if len(menus) == len(domain.DefaultMenus) {
  52 + dm.AuthRange = domain.AuthRangeAll
  53 + } else {
  54 + dm.AuthRange = domain.AuthRangePart
  55 + }
  56 + } else {
  57 + dm.AuthRange = req.Role.AuthRange
  58 + }
  59 + // 更新
  60 + if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error {
  61 + dm, err = l.svcCtx.RoleRepository.UpdateWithVersion(l.ctx, conn, dm)
  62 + return err
  63 + }, true); err != nil {
  64 + return nil, xerr.NewErrMsg("更新失败")
  65 + }
  66 + resp = &types.RoleUpdateResponse{}
  67 + return
  68 +}
  1 +package user
  2 +
  3 +import (
  4 + "context"
  5 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/internal/pkg/domain"
  6 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/pkg/contextdata"
  7 +
  8 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/svc"
  9 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/api/internal/types"
  10 +
  11 + "github.com/zeromicro/go-zero/core/logx"
  12 +)
  13 +
  14 +type UserCompanyUsersLogic struct {
  15 + logx.Logger
  16 + ctx context.Context
  17 + svcCtx *svc.ServiceContext
  18 +}
  19 +
  20 +func NewUserCompanyUsersLogic(ctx context.Context, svcCtx *svc.ServiceContext) *UserCompanyUsersLogic {
  21 + return &UserCompanyUsersLogic{
  22 + Logger: logx.WithContext(ctx),
  23 + ctx: ctx,
  24 + svcCtx: svcCtx,
  25 + }
  26 +}
  27 +
  28 +func (l *UserCompanyUsersLogic) UserCompanyUsers(req *types.CompanyUsersRequest) (resp *types.CompanyUsersResponse, err error) {
  29 + var (
  30 + conn = l.svcCtx.DefaultDBConn()
  31 + users []*domain.SysUser
  32 + //total int64
  33 + token = contextdata.GetUserTokenFromCtx(l.ctx)
  34 + )
  35 + options := domain.NewQueryOptions().MustWithKV("companyId", token.CompanyId).WithFindOnly()
  36 + _, users, _ = l.svcCtx.UserRepository.Find(l.ctx, conn, options)
  37 + resp = &types.CompanyUsersResponse{
  38 + List: make([]types.User, 0),
  39 + }
  40 + for _, user := range users {
  41 + resp.List = append(resp.List, types.NewTypesUser(user))
  42 + }
  43 + return
  44 +}
  1 +package types
  2 +
  3 +import "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/internal/pkg/domain"
  4 +
  5 +func NewTypesSystemAppItem(item *domain.SysApp, cp *domain.SysCompanyApp) SystemAppItem {
  6 + return SystemAppItem{
  7 + Id: cp.Id,
  8 + Code: item.Code,
  9 + Name: item.Name,
  10 + Logo: item.Logo,
  11 + Description: item.Description,
  12 + Type: item.Type,
  13 + VersionNumber: item.VersionNumber,
  14 + Status: cp.Status,
  15 + VisibleFlag: cp.VisibleFlag,
  16 + VisibleUsers: cp.VisibleUsers,
  17 + Sort: cp.Sort,
  18 + }
  19 +}
  1 +package types
  2 +
  3 +import (
  4 + "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/internal/pkg/domain"
  5 +)
  6 +
  7 +func NewTypesMenu(m *domain.SysMenu) Menu {
  8 + return Menu{
  9 + Id: m.Id,
  10 + ParentId: m.ParentId,
  11 + Name: m.Name,
  12 + Code: m.Code,
  13 + Sort: m.Sort,
  14 + MenuType: m.MenuType,
  15 + Icon: m.Icon,
  16 + }
  17 +}
@@ -2,9 +2,10 @@ @@ -2,9 +2,10 @@
2 package types 2 package types
3 3
4 type User struct { 4 type User struct {
5 - Id int64 `json:"id"` // 用户ID  
6 - Name string `json:"name"` // 用户名称  
7 - Phone string `json:"phone,optional,omitempty"` // 用户手机号 5 + Id int64 `json:"id,optional"` // 用户ID
  6 + Name string `json:"name,optional"` // 用户名称
  7 + Phone string `json:"phone,optional,omitempty"` // 用户手机号
  8 + Avatar string `json:"avatar,optional,omitempty"` // 头像
8 } 9 }
9 10
10 type CompanyRegisterRequest struct { 11 type CompanyRegisterRequest struct {
@@ -36,16 +37,53 @@ type UserInfoRequest struct { @@ -36,16 +37,53 @@ type UserInfoRequest struct {
36 } 37 }
37 38
38 type UserInfoResponse struct { 39 type UserInfoResponse struct {
39 - Id int64 `json:"id"` // 用户ID  
40 - Name string `json:"name"` // 用户名称  
41 - Phone string `json:"phone"` // 用户手机号  
42 - EmployeeInfo *Employee `json:"employeeInfo"` // 职员信息  
43 - Company *Company `json:"company"` // 当前公司信息  
44 - CompanyList []Company `json:"companies"` // 拥有的公司 40 + Id int64 `json:"id"` // 用户ID
  41 + Avatar string `json:"avatar"` // 头像
  42 + Name string `json:"name"` // 用户名称
  43 + Phone string `json:"phone"` // 用户手机号
  44 + Accounts []AccountInfo `json:"accounts"` // 账号列表
  45 + Apps []SystemAppItem `json:"apps"` // 应用列表
  46 + Menus []Menu `json:"menus"` // 有权限的菜单
  47 +}
  48 +
  49 +type AccountInfo struct {
  50 + Company Company `json:"company"` // 公司
  51 + Selected bool `json:"selected"` // 当前选择的账号
  52 +}
  53 +
  54 +type EditUserInfoRequest struct {
  55 + Avatar *string `json:"avatar,optional"` // 头像
  56 + Name *string `json:"name,optional"` // 用户名称
  57 + Phone *string `json:"phone,optional"` // 用户手机号
  58 +}
  59 +
  60 +type ChangePasswordRequest struct {
  61 + OldPassword string `json:"oldPassword,optional"` // 旧密码
  62 + NewPassword string `json:"newPassword"` // 新密码
  63 + ConfirmPassword string `json:"confirmPassword"` // 确认密码
  64 +}
  65 +
  66 +type ChangePasswordResponse struct {
  67 +}
  68 +
  69 +type ResetPasswordRequest struct {
  70 + Code string `json:"code"` // 验证码
  71 + NewPassword string `json:"newPassword"` // 新密码
  72 + ConfirmPassword string `json:"confirmPassword"` // 确认密码
  73 +}
  74 +
  75 +type ResetPasswordResponse struct {
45 } 76 }
46 77
47 type SwitchCompanyRequest struct { 78 type SwitchCompanyRequest struct {
48 - CompanyId int64 `json:"companyId"` // 公司ID 79 + CompanyId int64 `json:"companyId,string"` // 公司ID
  80 +}
  81 +
  82 +type CompanyUsersRequest struct {
  83 +}
  84 +
  85 +type CompanyUsersResponse struct {
  86 + List []User `json:"list"` // 用户列表
49 } 87 }
50 88
51 type SystemCompanyInfoRequest struct { 89 type SystemCompanyInfoRequest struct {
@@ -142,8 +180,71 @@ type DepartmentImportResponse struct { @@ -142,8 +180,71 @@ type DepartmentImportResponse struct {
142 } 180 }
143 181
144 type Role struct { 182 type Role struct {
145 - Id int64 `json:"id"` // 角色ID  
146 - Name string `json:"name"` // 角色名称 183 + Id int64 `json:"id,optional,omitempty"` // 角色ID
  184 + Name string `json:"name,optional,omitempty"` // 角色名称
  185 + Menus []Menu `json:"menus,optional,omitempty"` // 菜单列表
  186 + AuthUsers []User `json:"users,optional,omitempty"` // 拥护该角色的用户列表 user_id 列表
  187 + AuthRange int `json:"authRange,optional,omitempty,option=0|1|2"` // 权限范围(1:全部权限 2:部分权限)
  188 + UpdatedAt int64 `json:"updatedAt,optional,omitempty"` // 更新时间
  189 +}
  190 +
  191 +type RoleGetRequest struct {
  192 + Id int64 `path:"id"`
  193 +}
  194 +
  195 +type RoleGetResponse struct {
  196 + Role Role `json:"role"`
  197 +}
  198 +
  199 +type RoleSaveRequest struct {
  200 + Role Role `json:"role"`
  201 +}
  202 +
  203 +type RoleSaveResponse struct {
  204 +}
  205 +
  206 +type RoleDeleteRequest struct {
  207 + Id int64 `path:"id"`
  208 +}
  209 +
  210 +type RoleDeleteResponse struct {
  211 +}
  212 +
  213 +type RoleUpdateRequest struct {
  214 + Id int64 `path:"id"`
  215 + Role Role `json:"role"`
  216 +}
  217 +
  218 +type RoleUpdateResponse struct {
  219 +}
  220 +
  221 +type RoleSearchRequest struct {
  222 + Page int `json:"page"`
  223 + Size int `json:"size"`
  224 + RoleName string `json:"rolename,optional"` // 角色名称
  225 + UserName string `json:"userName,optional"` // 用户名称
  226 +}
  227 +
  228 +type RoleSearchResponse struct {
  229 + List []Role `json:"list"`
  230 + Total int64 `json:"total"`
  231 +}
  232 +
  233 +type MenuListRequest struct {
  234 +}
  235 +
  236 +type MenuListResponse struct {
  237 + List []Menu `json:"list"`
  238 +}
  239 +
  240 +type Menu struct {
  241 + Id int64 `json:"id,optional,omitempty"` // 菜单ID
  242 + ParentId int64 `json:"parentId,optional"` // 父级ID
  243 + Name string `json:"name,optional,omitempty"` // 菜单名称
  244 + Code string `json:"code,optional,omitempty"` // 菜单编码
  245 + MenuType string `json:"menuType,optional,omitempty"` // 菜单类型 (目录catalog、菜单menu、按钮button)
  246 + Icon string `json:"icon,optional,omitempty"` // 图标
  247 + Sort int64 `json:"sort,optional,omitempty"` // 排序
147 } 248 }
148 249
149 type Group struct { 250 type Group struct {
@@ -186,11 +287,14 @@ type SystemAppItem struct { @@ -186,11 +287,14 @@ type SystemAppItem struct {
186 VisibleFlag int `json:"visibleFlag,omitempty"` // 1:全员可见 2:部分可见 287 VisibleFlag int `json:"visibleFlag,omitempty"` // 1:全员可见 2:部分可见
187 VisibleUsers []int64 `json:"visibleUsers,omitempty"` // 可见的用户 所有用户:空 部分用户:用户ID列表 288 VisibleUsers []int64 `json:"visibleUsers,omitempty"` // 可见的用户 所有用户:空 部分用户:用户ID列表
188 Sort int `json:"sort,omitempty"` // 排序 289 Sort int `json:"sort,omitempty"` // 排序
  290 + HasAuth bool `json:"hasAuth"` // true:用户有权限 false:用户无权限
189 } 291 }
190 292
191 type SystemAppSetConfigRequest struct { 293 type SystemAppSetConfigRequest struct {
192 - VisibleFlag int `json:"visibleFlag"` // 1:全员可见 2:部分可见  
193 - VisibleUsers []int64 `json:"visibleUsers"` // 可见的用户 所有用户:空 部分用户:用户ID列表 294 + AppId int64 `json:"id"` // 公司应用ID
  295 + VisibleFlag int `json:"visibleFlag"` // 1:全员可见 2:部分可见
  296 + VisibleUsers []int64 `json:"visibleUsers"` // 可见的用户 所有用户:空 部分用户:用户ID列表
  297 + VisibleDepartments []int64 `json:"visibleDepartments"` // 可见的部门 部门ID列表
194 } 298 }
195 299
196 type SystemAppSetConfigResponse struct { 300 type SystemAppSetConfigResponse struct {
  1 +package types
  2 +
  3 +import "gitlab.fjmaimaimai.com/allied-creation/su-micro/cmd/ep/system/internal/pkg/domain"
  4 +
  5 +func NewTypesUser(user *domain.SysUser) User {
  6 + return User{
  7 + Id: user.Id,
  8 + Name: user.Name,
  9 + Phone: user.Phone,
  10 + Avatar: user.Avatar,
  11 + }
  12 +}
  1 +alter table sys.company_app add column visible_departments jsonb;
  2 +update sys.company_app set visible_departments = '[]';
  1 +
  2 +syntax = "v1"
  3 +
  4 +info(
  5 + title: "xx实例"
  6 + desc: "xx实例"
  7 + author: "author"
  8 + email: "email"
  9 + version: "v1"
  10 +)
  11 +
  12 +@server(
  13 + prefix: v1
  14 + group: sys_company_app
  15 + jwt: JwtAuth
  16 +)
  17 +service Core {
  18 + @doc "详情"
  19 + @handler sys_company_appGet
  20 + get /sys_company_app/:id (SysCompanyAppGetRequest) returns (SysCompanyAppGetResponse)
  21 + @doc "保存"
  22 + @handler sys_company_appSave
  23 + post /sys_company_app (SysCompanyAppSaveRequest) returns (SysCompanyAppSaveResponse)
  24 + @doc "删除"
  25 + @handler sys_company_appDelete
  26 + delete /sys_company_app/:id (SysCompanyAppDeleteRequest) returns (SysCompanyAppDeleteResponse)
  27 + @doc "更新"
  28 + @handler sys_company_appUpdate
  29 + put /sys_company_app/:id (SysCompanyAppUpdateRequest) returns (SysCompanyAppUpdateResponse)
  30 + @doc "搜索"
  31 + @handler sys_company_appSearch
  32 + post /sys_company_app/search (SysCompanyAppSearchRequest) returns (SysCompanyAppSearchResponse)
  33 +}
  34 +
  35 +type (
  36 + SysCompanyAppGetRequest {
  37 + Id int64 `path:"id"`
  38 + }
  39 + SysCompanyAppGetResponse struct{
  40 + SysCompanyApp SysCompanyAppItem `json:"sys_company_app"`
  41 + }
  42 +
  43 + SysCompanyAppSaveRequest struct{
  44 + SysCompanyApp SysCompanyAppItem `json:"sys_company_app"`
  45 + }
  46 + SysCompanyAppSaveResponse struct{}
  47 +
  48 + SysCompanyAppDeleteRequest struct{
  49 + Id int64 `path:"id"`
  50 + }
  51 + SysCompanyAppDeleteResponse struct{}
  52 +
  53 + SysCompanyAppUpdateRequest struct{
  54 + Id int64 `path:"id"`
  55 + SysCompanyApp SysCompanyAppItem `json:"sys_company_app"`
  56 + }
  57 + SysCompanyAppUpdateResponse struct{}
  58 +
  59 + SysCompanyAppSearchRequest struct{
  60 + Page int `json:"page"`
  61 + Size int `json:"size"`
  62 + }
  63 + SysCompanyAppSearchResponse{
  64 + List []SysCompanyAppItem `json:"list"`
  65 + Total int64 `json:"total"`
  66 + }
  67 + SysCompanyAppItem struct{
  68 +
  69 + }
  70 +)
  71 +
  72 +// logic CRUD
  73 +// Save
  74 + //var (
  75 + // conn = l.svcCtx.DefaultDBConn()
  76 + // dm *domain.SysCompanyApp
  77 + //)
  78 + //// 唯一判断
  79 +
  80 + //dm = NewDomainSysCompanyApp(req.SysCompanyApp)
  81 + //if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error {
  82 + // dm, err = l.svcCtx.SysCompanyAppRepository.Insert(l.ctx, conn, dm)
  83 + // return err
  84 + //}, true); err != nil {
  85 + // return nil, xerr.NewErrMsg("保存失败")
  86 + //}
  87 + ////resp = &types.SysCompanyAppSaveResponse{}
  88 + //return
  89 +
  90 +//func NewDomainSysCompanyApp(item types.SysCompanyAppItem) *domain.SysCompanyApp {
  91 +// return &domain.SysCompanyApp{
  92 +
  93 +// }
  94 +//}
  95 +//
  96 +//func NewTypesSysCompanyApp(item *domain.SysCompanyApp) types.SysCompanyAppItem {
  97 +// return types.SysCompanyAppItem{
  98 +// Id: item.Id,
  99 +// }
  100 +//}
  101 +
  102 +// Get
  103 + //var (
  104 + // conn = l.svcCtx.DefaultDBConn()
  105 + // dm *domain.SysCompanyApp
  106 + //)
  107 + //// 货号唯一
  108 + //if dm, err = l.svcCtx.SysCompanyAppRepository.FindOne(l.ctx, conn, req.Id); err != nil {
  109 + // return nil, xerr.NewErrMsgErr("不存在", err)
  110 + //}
  111 + //resp = &types.SysCompanyAppGetResponse{
  112 + // SysCompanyApp: NewTypesSysCompanyApp(dm),
  113 + //}
  114 + //return
  115 +
  116 +// Delete
  117 + //var (
  118 + // conn = l.svcCtx.DefaultDBConn()
  119 + // dm *domain.SysCompanyApp
  120 + //)
  121 + //if dm, err = l.svcCtx.SysCompanyAppRepository.FindOne(l.ctx, conn, req.Id); err != nil {
  122 + // return nil, xerr.NewErrMsgErr("不存在", err)
  123 + //}
  124 + //if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error {
  125 + // if dm, err = l.svcCtx.SysCompanyAppRepository.Delete(l.ctx, conn, dm); err != nil {
  126 + // return err
  127 + // }
  128 + // return nil
  129 + //}, true); err != nil {
  130 + // return nil, xerr.NewErrMsgErr("移除失败", err)
  131 + //}
  132 + //return
  133 +
  134 +// Search
  135 + //var (
  136 + // conn = l.svcCtx.DefaultDBConn()
  137 + // dms []*domain.SysCompanyApp
  138 + // total int64
  139 + //)
  140 + //
  141 + //queryOptions := domain.NewQueryOptions().WithOffsetLimit(req.Page, req.Size).
  142 + // WithKV("", "")
  143 +
  144 + //total, dms, err = l.svcCtx.SysCompanyAppRepository.Find(l.ctx, conn, queryOptions)
  145 + //list := make([]types.SysCompanyAppItem, 0)
  146 + //for i := range dms {
  147 + // list = append(list, NewTypesSysCompanyApp(dms[i]))
  148 + //}
  149 + //resp = &types.SysCompanyAppSearchResponse{
  150 + // List: list,
  151 + // Total: total,
  152 + //}
  153 + //return
  154 +
  155 +// Update
  156 + //var (
  157 + // conn = l.svcCtx.DefaultDBConn()
  158 + // dm *domain.SysCompanyApp
  159 + //)
  160 + //if dm, err = l.svcCtx.SysCompanyAppRepository.FindOne(l.ctx, conn, req.Id); err != nil {
  161 + // return nil, xerr.NewErrMsgErr("不存在", err)
  162 + //}
  163 + //// 不可编辑判断
  164 +
  165 + //// 赋值
  166 +
  167 + //// 更新
  168 + //if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error {
  169 + // dm, err = l.svcCtx.SysCompanyAppRepository.UpdateWithVersion(l.ctx, conn, dm)
  170 + // return err
  171 + //}, true); err != nil {
  172 + // return nil, xerr.NewErrMsg("更新失败")
  173 + //}
  174 + //resp = &types.SysCompanyAppUpdateResponse{}
  175 + //return
  1 +
  2 +syntax = "proto3";
  3 +
  4 +option go_package ="./pb";
  5 +
  6 +package pb;
  7 +
  8 +message SysCompanyAppGetReq {
  9 + int64 Id = 1;
  10 +}
  11 +message SysCompanyAppGetResp{
  12 + SysCompanyAppItem SysCompanyApp = 1;
  13 +}
  14 +
  15 +message SysCompanyAppSaveReq {
  16 +
  17 +}
  18 +message SysCompanyAppSaveResp{
  19 +
  20 +}
  21 +
  22 +message SysCompanyAppDeleteReq {
  23 + int64 Id = 1;
  24 +}
  25 +message SysCompanyAppDeleteResp{
  26 +
  27 +}
  28 +
  29 +message SysCompanyAppUpdateReq {
  30 + int64 Id = 1;
  31 +}
  32 +message SysCompanyAppUpdateResp{
  33 +
  34 +}
  35 +
  36 +message SysCompanyAppSearchReq {
  37 + int64 PageNumber = 1;
  38 + int64 PageSize = 2;
  39 +}
  40 +message SysCompanyAppSearchResp{
  41 + repeated SysCompanyAppItem List =1;
  42 + int64 Total =2;
  43 +}
  44 +message SysCompanyAppItem {
  45 +
  46 +}
  47 +
  48 +service SysCompanyAppService {
  49 + rpc SysCompanyAppGet(SysCompanyAppGetReq) returns(SysCompanyAppGetResp);
  50 + rpc SysCompanyAppSave(SysCompanyAppSaveReq) returns(SysCompanyAppSaveResp);
  51 + rpc SysCompanyAppDelete(SysCompanyAppDeleteReq) returns(SysCompanyAppDeleteResp);
  52 + rpc SysCompanyAppUpdate(SysCompanyAppUpdateReq) returns(SysCompanyAppUpdateResp);
  53 + rpc SysCompanyAppSearch(SysCompanyAppSearchReq) returns(SysCompanyAppSearchResp);
  54 +}
@@ -17,7 +17,7 @@ service Core { @@ -17,7 +17,7 @@ service Core {
17 post /system/app/search (SystemAppSearchRequest) returns (SystemAppSearchResponse) 17 post /system/app/search (SystemAppSearchRequest) returns (SystemAppSearchResponse)
18 @doc "应用-设置配置" 18 @doc "应用-设置配置"
19 @handler systemAppSetConfig 19 @handler systemAppSetConfig
20 - get /system/app/set_config (SystemAppSetConfigRequest) returns (SystemAppSetConfigResponse) 20 + post /system/app/set_config (SystemAppSetConfigRequest) returns (SystemAppSetConfigResponse)
21 } 21 }
22 22
23 type ( 23 type (
@@ -52,14 +52,17 @@ type ( @@ -52,14 +52,17 @@ type (
52 VisibleFlag int `json:"visibleFlag,omitempty"` // 1:全员可见 2:部分可见 52 VisibleFlag int `json:"visibleFlag,omitempty"` // 1:全员可见 2:部分可见
53 VisibleUsers []int64 `json:"visibleUsers,omitempty"` // 可见的用户 所有用户:空 部分用户:用户ID列表 53 VisibleUsers []int64 `json:"visibleUsers,omitempty"` // 可见的用户 所有用户:空 部分用户:用户ID列表
54 Sort int `json:"sort,omitempty"` // 排序 54 Sort int `json:"sort,omitempty"` // 排序
  55 + HasAuth bool `json:"hasAuth"` // true:用户有权限 false:用户无权限
55 } 56 }
56 ) 57 )
57 58
58 // 应用-设置配置 59 // 应用-设置配置
59 type( 60 type(
60 SystemAppSetConfigRequest{ 61 SystemAppSetConfigRequest{
61 - VisibleFlag int `json:"visibleFlag"` // 1:全员可见 2:部分可见  
62 - VisibleUsers []int64 `json:"visibleUsers"` // 可见的用户 所有用户:空 部分用户:用户ID列表 62 + AppId int64 `json:"id"` // 公司应用ID
  63 + VisibleFlag int `json:"visibleFlag"` // 1:全员可见 2:部分可见
  64 + VisibleUsers []int64 `json:"visibleUsers"` // 可见的用户 所有用户:空 部分用户:用户ID列表
  65 + VisibleDepartments []int64 `json:"visibleDepartments"` // 可见的部门 部门ID列表
63 } 66 }
64 SystemAppSetConfigResponse{ 67 SystemAppSetConfigResponse{
65 SystemApp SystemAppItem `json:"app"` 68 SystemApp SystemAppItem `json:"app"`
@@ -2,7 +2,94 @@ syntax = "v1" @@ -2,7 +2,94 @@ syntax = "v1"
2 2
3 type( 3 type(
4 Role{ 4 Role{
5 - Id int64 `json:"id"` // 角色ID  
6 - Name string `json:"name"` // 角色名称 5 + Id int64 `json:"id,optional,omitempty"` // 角色ID
  6 + Name string `json:"name,optional,omitempty"` // 角色名称
  7 + Menus []Menu `json:"menus,optional,omitempty"` // 菜单列表
  8 + AuthUsers []User `json:"users,optional,omitempty"` // 拥护该角色的用户列表 user_id 列表
  9 + AuthRange int `json:"authRange,optional,omitempty,option=0|1|2"` // 权限范围(1:全部权限 2:部分权限)
  10 + UpdatedAt int64 `json:"updatedAt,optional,omitempty"` // 更新时间
  11 + }
  12 +)
  13 +
  14 +@server(
  15 + prefix: v1/system
  16 + group: role
  17 + middleware: LogRequest
  18 + jwt: SystemAuth
  19 +)
  20 +service Core {
  21 + @doc "角色-详情"
  22 + @handler systemRoleGet
  23 + get /role/:id (RoleGetRequest) returns (RoleGetResponse)
  24 + @doc "角色-保存"
  25 + @handler systemRoleSave
  26 + post /role (RoleSaveRequest) returns (RoleSaveResponse)
  27 + @doc "角色-删除"
  28 + @handler systemRoleDelete
  29 + delete /role/:id (RoleDeleteRequest) returns (RoleDeleteResponse)
  30 + @doc "角色-更新"
  31 + @handler systemRoleUpdate
  32 + put /role/:id (RoleUpdateRequest) returns (RoleUpdateResponse)
  33 + @doc "角色-搜索"
  34 + @handler systemRoleSearch
  35 + post /role/search (RoleSearchRequest) returns (RoleSearchResponse)
  36 +
  37 + @doc "菜单-列表"
  38 + @handler systemMenuList
  39 + post /menu/list (MenuListRequest) returns (MenuListResponse)
  40 +}
  41 +
  42 +type (
  43 + RoleGetRequest {
  44 + Id int64 `path:"id"`
  45 + }
  46 + RoleGetResponse struct{
  47 + Role Role `json:"role"`
  48 + }
  49 +
  50 + RoleSaveRequest struct{
  51 + Role Role `json:"role"`
  52 + }
  53 + RoleSaveResponse struct{}
  54 +
  55 + RoleDeleteRequest struct{
  56 + Id int64 `path:"id"`
  57 + }
  58 + RoleDeleteResponse struct{}
  59 +
  60 + RoleUpdateRequest struct{
  61 + Id int64 `path:"id"`
  62 + Role Role `json:"role"`
  63 + }
  64 + RoleUpdateResponse struct{}
  65 +
  66 + RoleSearchRequest struct{
  67 + Page int `json:"page"`
  68 + Size int `json:"size"`
  69 + RoleName string `json:"rolename,optional"` // 角色名称
  70 + UserName string `json:"userName,optional"` // 用户名称
  71 + }
  72 + RoleSearchResponse{
  73 + List []Role `json:"list"`
  74 + Total int64 `json:"total"`
  75 + }
  76 +)
  77 +
  78 +// 菜单列表
  79 +type(
  80 + MenuListRequest{
  81 +
  82 + }
  83 + MenuListResponse{
  84 + List []Menu `json:"list"`
  85 + }
  86 + Menu{
  87 + Id int64 `json:"id,optional,omitempty"` // 菜单ID
  88 + ParentId int64 `json:"parentId,optional"` // 父级ID
  89 + Name string `json:"name,optional,omitempty"` // 菜单名称
  90 + Code string `json:"code,optional,omitempty"` // 菜单编码
  91 + MenuType string `json:"menuType,optional,omitempty"` // 菜单类型 (目录catalog、菜单menu、按钮button)
  92 + Icon string `json:"icon,optional,omitempty"` // 图标
  93 + Sort int64 `json:"sort,optional,omitempty"` // 排序
7 } 94 }
8 ) 95 )
@@ -34,16 +34,39 @@ service Core { @@ -34,16 +34,39 @@ service Core {
34 @doc "系统用户信息" 34 @doc "系统用户信息"
35 @handler systemAuthUserInfo 35 @handler systemAuthUserInfo
36 post /auth/user_info(UserInfoRequest) returns (UserInfoResponse) 36 post /auth/user_info(UserInfoRequest) returns (UserInfoResponse)
  37 + @doc "修改用户信息"
  38 + @handler systemAuthEditUserInfo
  39 + post /auth/edit_user_info(EditUserInfoRequest) returns (UserInfoResponse)
  40 + @doc "修改密码"
  41 + @handler systemAuthChangePassword
  42 + post /auth/change_password(ChangePasswordRequest) returns (ChangePasswordResponse)
  43 + @doc "重置密码"
  44 + @handler systemAuthResetPassword
  45 + post /auth/reset_password(ResetPasswordRequest) returns (ResetPasswordResponse)
37 @doc "系统用户信息" 46 @doc "系统用户信息"
38 @handler systemAuthSwitchCompany 47 @handler systemAuthSwitchCompany
39 post /auth/switch_company(SwitchCompanyRequest) returns (AuthLoginResponse) 48 post /auth/switch_company(SwitchCompanyRequest) returns (AuthLoginResponse)
  49 +
  50 +}
  51 +
  52 +@server(
  53 + prefix: v1
  54 + group: user
  55 + middleware: LogRequest
  56 + jwt: SystemAuth
  57 +)
  58 +service Core {
  59 + @doc "公司用户列表"
  60 + @handler userCompanyUsers
  61 + post /user/company_users(CompanyUsersRequest) returns (CompanyUsersResponse)
40 } 62 }
41 63
42 type( 64 type(
43 User{ 65 User{
44 - Id int64 `json:"id"` // 用户ID  
45 - Name string `json:"name"` // 用户名称  
46 - Phone string `json:"phone,optional,omitempty"` // 用户手机号 66 + Id int64 `json:"id,optional"` // 用户ID
  67 + Name string `json:"name,optional"` // 用户名称
  68 + Phone string `json:"phone,optional,omitempty"` // 用户手机号
  69 + Avatar string `json:"avatar,optional,omitempty"`// 头像
47 } 70 }
48 ) 71 )
49 72
@@ -81,17 +104,71 @@ type( @@ -81,17 +104,71 @@ type(
81 EmployeeId int64 `json:"employeeId,optional"` 104 EmployeeId int64 `json:"employeeId,optional"`
82 } 105 }
83 UserInfoResponse{ 106 UserInfoResponse{
84 - Id int64 `json:"id"` // 用户ID  
85 - Name string `json:"name"` // 用户名称  
86 - Phone string `json:"phone"` // 用户手机号  
87 - EmployeeInfo *Employee `json:"employeeInfo"` // 职员信息  
88 - Company *Company `json:"company"` // 当前公司信息  
89 - CompanyList []Company `json:"companies"` // 拥有的公司 107 + Id int64 `json:"id"` // 用户ID
  108 + Avatar string `json:"avatar"` // 头像
  109 + Name string `json:"name"` // 用户名称
  110 + Phone string `json:"phone"` // 用户手机号
  111 + Accounts []AccountInfo `json:"accounts"` // 账号列表
  112 + Apps []SystemAppItem `json:"apps"` // 应用列表
  113 + Menus []Menu `json:"menus"` // 有权限的菜单
90 } 114 }
  115 + AccountInfo{
  116 + //EmployeeId int64 `json:"employeeId"` // 职员ID
  117 + Company Company `json:"company"` // 公司
  118 + Selected bool `json:"selected"` // 当前选择的账号
  119 + }
  120 +)
  121 +
  122 +// 修改用户信息
  123 +type(
  124 + EditUserInfoRequest{
  125 + Avatar *string `json:"avatar,optional"` // 头像
  126 + Name *string `json:"name,optional"` // 用户名称
  127 + Phone *string `json:"phone,optional"` // 用户手机号
  128 + //Password *string `json:"password,optional"` // 密码base64((MD5))
  129 + }
  130 +// UserInfoResponse{
  131 +//
  132 +// }
91 ) 133 )
  134 +
  135 +// 修改密码
  136 +type(
  137 + ChangePasswordRequest{
  138 + OldPassword string `json:"oldPassword,optional"` // 旧密码
  139 + NewPassword string `json:"newPassword"` // 新密码
  140 + ConfirmPassword string `json:"confirmPassword"` // 确认密码
  141 + }
  142 + ChangePasswordResponse{
  143 +
  144 + }
  145 +)
  146 +
  147 +// 重置密码
  148 +type(
  149 + ResetPasswordRequest{
  150 + Code string `json:"code"` // 验证码
  151 + NewPassword string `json:"newPassword"` // 新密码
  152 + ConfirmPassword string `json:"confirmPassword"` // 确认密码
  153 + }
  154 + ResetPasswordResponse{
  155 +
  156 + }
  157 +)
  158 +
92 // 切换公司请求 159 // 切换公司请求
93 type( 160 type(
94 SwitchCompanyRequest{ 161 SwitchCompanyRequest{
95 - CompanyId int64 `json:"companyId"` // 公司ID 162 + CompanyId int64 `json:"companyId,string"` // 公司ID
  163 + }
  164 +)
  165 +
  166 +// 公司用户搜索
  167 +type(
  168 + CompanyUsersRequest{
  169 +
  170 + }
  171 + CompanyUsersResponse{
  172 + List []User `json:"list"` // 用户列表
96 } 173 }
97 ) 174 )
@@ -15,6 +15,34 @@ @@ -15,6 +15,34 @@
15 "application/json" 15 "application/json"
16 ], 16 ],
17 "paths": { 17 "paths": {
  18 + "v1/auth/change_password": {
  19 + "post": {
  20 + "summary": "修改密码",
  21 + "operationId": "systemAuthChangePassword",
  22 + "responses": {
  23 + "200": {
  24 + "description": "A successful response.",
  25 + "schema": {
  26 + "$ref": "#/definitions/ChangePasswordResponse"
  27 + }
  28 + }
  29 + },
  30 + "parameters": [
  31 + {
  32 + "name": "body",
  33 + "in": "body",
  34 + "required": true,
  35 + "schema": {
  36 + "$ref": "#/definitions/ChangePasswordRequest"
  37 + }
  38 + }
  39 + ],
  40 + "requestBody": {},
  41 + "tags": [
  42 + "auth"
  43 + ]
  44 + }
  45 + },
18 "v1/auth/company_sign_up": { 46 "v1/auth/company_sign_up": {
19 "post": { 47 "post": {
20 "summary": "公司注册", 48 "summary": "公司注册",
@@ -43,6 +71,34 @@ @@ -43,6 +71,34 @@
43 ] 71 ]
44 } 72 }
45 }, 73 },
  74 + "v1/auth/edit_user_info": {
  75 + "post": {
  76 + "summary": "修改用户信息",
  77 + "operationId": "systemAuthEditUserInfo",
  78 + "responses": {
  79 + "200": {
  80 + "description": "A successful response.",
  81 + "schema": {
  82 + "$ref": "#/definitions/UserInfoResponse"
  83 + }
  84 + }
  85 + },
  86 + "parameters": [
  87 + {
  88 + "name": "body",
  89 + "in": "body",
  90 + "required": true,
  91 + "schema": {
  92 + "$ref": "#/definitions/EditUserInfoRequest"
  93 + }
  94 + }
  95 + ],
  96 + "requestBody": {},
  97 + "tags": [
  98 + "auth"
  99 + ]
  100 + }
  101 + },
46 "v1/auth/login": { 102 "v1/auth/login": {
47 "post": { 103 "post": {
48 "summary": "系统用户登录", 104 "summary": "系统用户登录",
@@ -71,6 +127,62 @@ @@ -71,6 +127,62 @@
71 ] 127 ]
72 } 128 }
73 }, 129 },
  130 + "v1/auth/reset_password": {
  131 + "post": {
  132 + "summary": "重置密码",
  133 + "operationId": "systemAuthResetPassword",
  134 + "responses": {
  135 + "200": {
  136 + "description": "A successful response.",
  137 + "schema": {
  138 + "$ref": "#/definitions/ResetPasswordResponse"
  139 + }
  140 + }
  141 + },
  142 + "parameters": [
  143 + {
  144 + "name": "body",
  145 + "in": "body",
  146 + "required": true,
  147 + "schema": {
  148 + "$ref": "#/definitions/ResetPasswordRequest"
  149 + }
  150 + }
  151 + ],
  152 + "requestBody": {},
  153 + "tags": [
  154 + "auth"
  155 + ]
  156 + }
  157 + },
  158 + "v1/auth/switch_company": {
  159 + "post": {
  160 + "summary": "系统用户信息",
  161 + "operationId": "systemAuthSwitchCompany",
  162 + "responses": {
  163 + "200": {
  164 + "description": "A successful response.",
  165 + "schema": {
  166 + "$ref": "#/definitions/AuthLoginResponse"
  167 + }
  168 + }
  169 + },
  170 + "parameters": [
  171 + {
  172 + "name": "body",
  173 + "in": "body",
  174 + "required": true,
  175 + "schema": {
  176 + "$ref": "#/definitions/SwitchCompanyRequest"
  177 + }
  178 + }
  179 + ],
  180 + "requestBody": {},
  181 + "tags": [
  182 + "auth"
  183 + ]
  184 + }
  185 + },
74 "v1/auth/user_info": { 186 "v1/auth/user_info": {
75 "post": { 187 "post": {
76 "summary": "系统用户信息", 188 "summary": "系统用户信息",
@@ -781,9 +893,202 @@ @@ -781,9 +893,202 @@
781 "employee" 893 "employee"
782 ] 894 ]
783 } 895 }
  896 + },
  897 + "v1/system/menu/list": {
  898 + "post": {
  899 + "summary": "菜单-列表",
  900 + "operationId": "systemMenuList",
  901 + "responses": {
  902 + "200": {
  903 + "description": "A successful response.",
  904 + "schema": {
  905 + "$ref": "#/definitions/MenuListResponse"
  906 + }
  907 + }
  908 + },
  909 + "parameters": [
  910 + {
  911 + "name": "body",
  912 + "in": "body",
  913 + "required": true,
  914 + "schema": {
  915 + "$ref": "#/definitions/MenuListRequest"
  916 + }
  917 + }
  918 + ],
  919 + "requestBody": {},
  920 + "tags": [
  921 + "role"
  922 + ]
  923 + }
  924 + },
  925 + "v1/system/role": {
  926 + "post": {
  927 + "summary": "角色-保存",
  928 + "operationId": "systemRoleSave",
  929 + "responses": {
  930 + "200": {
  931 + "description": "A successful response.",
  932 + "schema": {
  933 + "$ref": "#/definitions/RoleSaveResponse"
  934 + }
  935 + }
  936 + },
  937 + "parameters": [
  938 + {
  939 + "name": "body",
  940 + "in": "body",
  941 + "required": true,
  942 + "schema": {
  943 + "$ref": "#/definitions/RoleSaveRequest"
  944 + }
  945 + }
  946 + ],
  947 + "requestBody": {},
  948 + "tags": [
  949 + "role"
  950 + ]
  951 + }
  952 + },
  953 + "v1/system/role/search": {
  954 + "post": {
  955 + "summary": "角色-搜索",
  956 + "operationId": "systemRoleSearch",
  957 + "responses": {
  958 + "200": {
  959 + "description": "A successful response.",
  960 + "schema": {
  961 + "$ref": "#/definitions/RoleSearchResponse"
  962 + }
  963 + }
  964 + },
  965 + "parameters": [
  966 + {
  967 + "name": "body",
  968 + "in": "body",
  969 + "required": true,
  970 + "schema": {
  971 + "$ref": "#/definitions/RoleSearchRequest"
  972 + }
  973 + }
  974 + ],
  975 + "requestBody": {},
  976 + "tags": [
  977 + "role"
  978 + ]
  979 + }
  980 + },
  981 + "v1/system/role/{id}": {
  982 + "get": {
  983 + "summary": "角色-详情",
  984 + "operationId": "systemRoleGet",
  985 + "responses": {
  986 + "200": {
  987 + "description": "A successful response.",
  988 + "schema": {
  989 + "$ref": "#/definitions/RoleGetResponse"
  990 + }
  991 + }
  992 + },
  993 + "parameters": [
  994 + {
  995 + "name": "id",
  996 + "in": "path",
  997 + "required": true,
  998 + "type": "string"
  999 + }
  1000 + ],
  1001 + "requestBody": {},
  1002 + "tags": [
  1003 + "role"
  1004 + ]
  1005 + },
  1006 + "delete": {
  1007 + "summary": "角色-删除",
  1008 + "operationId": "systemRoleDelete",
  1009 + "responses": {
  1010 + "200": {
  1011 + "description": "A successful response.",
  1012 + "schema": {
  1013 + "$ref": "#/definitions/RoleDeleteResponse"
  1014 + }
  1015 + }
  1016 + },
  1017 + "parameters": [
  1018 + {
  1019 + "name": "id",
  1020 + "in": "path",
  1021 + "required": true,
  1022 + "type": "string"
  1023 + },
  1024 + {
  1025 + "name": "body",
  1026 + "in": "body",
  1027 + "required": true,
  1028 + "schema": {
  1029 + "$ref": "#/definitions/RoleDeleteRequest"
  1030 + }
  1031 + }
  1032 + ],
  1033 + "requestBody": {},
  1034 + "tags": [
  1035 + "role"
  1036 + ]
  1037 + },
  1038 + "put": {
  1039 + "summary": "角色-更新",
  1040 + "operationId": "systemRoleUpdate",
  1041 + "responses": {
  1042 + "200": {
  1043 + "description": "A successful response.",
  1044 + "schema": {
  1045 + "$ref": "#/definitions/RoleUpdateResponse"
  1046 + }
  1047 + }
  1048 + },
  1049 + "parameters": [
  1050 + {
  1051 + "name": "id",
  1052 + "in": "path",
  1053 + "required": true,
  1054 + "type": "string"
  1055 + },
  1056 + {
  1057 + "name": "body",
  1058 + "in": "body",
  1059 + "required": true,
  1060 + "schema": {
  1061 + "$ref": "#/definitions/RoleUpdateRequest"
  1062 + }
  1063 + }
  1064 + ],
  1065 + "requestBody": {},
  1066 + "tags": [
  1067 + "role"
  1068 + ]
  1069 + }
784 } 1070 }
785 }, 1071 },
786 "definitions": { 1072 "definitions": {
  1073 + "AccountInfo": {
  1074 + "type": "object",
  1075 + "properties": {
  1076 + "company": {
  1077 + "$ref": "#/definitions/Company",
  1078 + "description": " 公司"
  1079 + },
  1080 + "selected": {
  1081 + "type": "boolean",
  1082 + "format": "boolean",
  1083 + "description": " 当前选择的账号"
  1084 + }
  1085 + },
  1086 + "title": "AccountInfo",
  1087 + "required": [
  1088 + "company",
  1089 + "selected"
  1090 + ]
  1091 + },
787 "AuthLoginRequest": { 1092 "AuthLoginRequest": {
788 "type": "object", 1093 "type": "object",
789 "properties": { 1094 "properties": {
@@ -821,6 +1126,32 @@ @@ -821,6 +1126,32 @@
821 "token" 1126 "token"
822 ] 1127 ]
823 }, 1128 },
  1129 + "ChangePasswordRequest": {
  1130 + "type": "object",
  1131 + "properties": {
  1132 + "oldPassword": {
  1133 + "type": "string",
  1134 + "description": " 旧密码"
  1135 + },
  1136 + "newPassword": {
  1137 + "type": "string",
  1138 + "description": " 新密码"
  1139 + },
  1140 + "confirmPassword": {
  1141 + "type": "string",
  1142 + "description": " 确认密码"
  1143 + }
  1144 + },
  1145 + "title": "ChangePasswordRequest",
  1146 + "required": [
  1147 + "newPassword",
  1148 + "confirmPassword"
  1149 + ]
  1150 + },
  1151 + "ChangePasswordResponse": {
  1152 + "type": "object",
  1153 + "title": "ChangePasswordResponse"
  1154 + },
824 "Company": { 1155 "Company": {
825 "type": "object", 1156 "type": "object",
826 "properties": { 1157 "properties": {
@@ -1175,6 +1506,24 @@ @@ -1175,6 +1506,24 @@
1175 "type": "object", 1506 "type": "object",
1176 "title": "DepartmentUpdateResponse" 1507 "title": "DepartmentUpdateResponse"
1177 }, 1508 },
  1509 + "EditUserInfoRequest": {
  1510 + "type": "object",
  1511 + "properties": {
  1512 + "avatar": {
  1513 + "$ref": "#/definitions/string",
  1514 + "description": " 头像"
  1515 + },
  1516 + "name": {
  1517 + "$ref": "#/definitions/string",
  1518 + "description": " 用户名称"
  1519 + },
  1520 + "phone": {
  1521 + "$ref": "#/definitions/string",
  1522 + "description": " 用户手机号"
  1523 + }
  1524 + },
  1525 + "title": "EditUserInfoRequest"
  1526 + },
1178 "Employee": { 1527 "Employee": {
1179 "type": "object", 1528 "type": "object",
1180 "properties": { 1529 "properties": {
@@ -1182,6 +1531,10 @@ @@ -1182,6 +1531,10 @@
1182 "type": "integer", 1531 "type": "integer",
1183 "format": "int64" 1532 "format": "int64"
1184 }, 1533 },
  1534 + "userId": {
  1535 + "type": "integer",
  1536 + "format": "int64"
  1537 + },
1185 "name": { 1538 "name": {
1186 "type": "string", 1539 "type": "string",
1187 "description": " 姓名" 1540 "description": " 姓名"
@@ -1237,6 +1590,7 @@ @@ -1237,6 +1590,7 @@
1237 "title": "Employee", 1590 "title": "Employee",
1238 "required": [ 1591 "required": [
1239 "id", 1592 "id",
  1593 + "userId",
1240 "name", 1594 "name",
1241 "code", 1595 "code",
1242 "phone", 1596 "phone",
@@ -1255,16 +1609,14 @@ @@ -1255,16 +1609,14 @@
1255 "employeeList": { 1609 "employeeList": {
1256 "type": "array", 1610 "type": "array",
1257 "items": { 1611 "items": {
1258 - "type": "integer",  
1259 - "format": "int64" 1612 + "type": "string"
1260 }, 1613 },
1261 "description": " 职员列表" 1614 "description": " 职员列表"
1262 }, 1615 },
1263 "departments": { 1616 "departments": {
1264 "type": "array", 1617 "type": "array",
1265 "items": { 1618 "items": {
1266 - "type": "integer",  
1267 - "format": "int64" 1619 + "type": "string"
1268 }, 1620 },
1269 "description": " 部门列表" 1621 "description": " 部门列表"
1270 } 1622 }
@@ -1374,7 +1726,10 @@ @@ -1374,7 +1726,10 @@
1374 "description": " 按部门过滤" 1726 "description": " 按部门过滤"
1375 } 1727 }
1376 }, 1728 },
1377 - "title": "EmployeeSearchRequest" 1729 + "title": "EmployeeSearchRequest",
  1730 + "required": [
  1731 + "departmentId"
  1732 + ]
1378 }, 1733 },
1379 "EmployeeSearchResponse": { 1734 "EmployeeSearchResponse": {
1380 "type": "object", 1735 "type": "object",
@@ -1463,6 +1818,98 @@ @@ -1463,6 +1818,98 @@
1463 "name" 1818 "name"
1464 ] 1819 ]
1465 }, 1820 },
  1821 + "Menu": {
  1822 + "type": "object",
  1823 + "properties": {
  1824 + "id": {
  1825 + "type": "integer",
  1826 + "format": "int64",
  1827 + "description": " 菜单ID"
  1828 + },
  1829 + "parentId": {
  1830 + "type": "integer",
  1831 + "format": "int64",
  1832 + "description": " 父级ID"
  1833 + },
  1834 + "name": {
  1835 + "type": "string",
  1836 + "description": " 菜单名称"
  1837 + },
  1838 + "code": {
  1839 + "type": "string",
  1840 + "description": " 菜单编码"
  1841 + },
  1842 + "menuType": {
  1843 + "type": "string",
  1844 + "description": " 菜单类型 (目录catalog、菜单menu、按钮button)"
  1845 + },
  1846 + "icon": {
  1847 + "type": "string",
  1848 + "description": " 图标"
  1849 + },
  1850 + "sort": {
  1851 + "type": "integer",
  1852 + "format": "int64",
  1853 + "description": " 排序"
  1854 + }
  1855 + },
  1856 + "title": "Menu",
  1857 + "required": [
  1858 + "id",
  1859 + "parentId",
  1860 + "name",
  1861 + "code",
  1862 + "menuType",
  1863 + "icon",
  1864 + "sort"
  1865 + ]
  1866 + },
  1867 + "MenuListRequest": {
  1868 + "type": "object",
  1869 + "title": "MenuListRequest"
  1870 + },
  1871 + "MenuListResponse": {
  1872 + "type": "object",
  1873 + "properties": {
  1874 + "list": {
  1875 + "type": "array",
  1876 + "items": {
  1877 + "$ref": "#/definitions/Menu"
  1878 + }
  1879 + }
  1880 + },
  1881 + "title": "MenuListResponse",
  1882 + "required": [
  1883 + "list"
  1884 + ]
  1885 + },
  1886 + "ResetPasswordRequest": {
  1887 + "type": "object",
  1888 + "properties": {
  1889 + "code": {
  1890 + "type": "string",
  1891 + "description": " 验证码"
  1892 + },
  1893 + "newPassword": {
  1894 + "type": "string",
  1895 + "description": " 新密码"
  1896 + },
  1897 + "confirmPassword": {
  1898 + "type": "string",
  1899 + "description": " 确认密码"
  1900 + }
  1901 + },
  1902 + "title": "ResetPasswordRequest",
  1903 + "required": [
  1904 + "code",
  1905 + "newPassword",
  1906 + "confirmPassword"
  1907 + ]
  1908 + },
  1909 + "ResetPasswordResponse": {
  1910 + "type": "object",
  1911 + "title": "ResetPasswordResponse"
  1912 + },
1466 "Role": { 1913 "Role": {
1467 "type": "object", 1914 "type": "object",
1468 "properties": { 1915 "properties": {
@@ -1474,12 +1921,179 @@ @@ -1474,12 +1921,179 @@
1474 "name": { 1921 "name": {
1475 "type": "string", 1922 "type": "string",
1476 "description": " 角色名称" 1923 "description": " 角色名称"
  1924 + },
  1925 + "menus": {
  1926 + "type": "array",
  1927 + "items": {
  1928 + "$ref": "#/definitions/Menu"
  1929 + },
  1930 + "description": " 菜单列表"
  1931 + },
  1932 + "users": {
  1933 + "type": "array",
  1934 + "items": {
  1935 + "$ref": "#/definitions/User"
  1936 + },
  1937 + "description": " 拥护该角色的用户列表 user_id 列表"
  1938 + },
  1939 + "authRange": {
  1940 + "type": "integer",
  1941 + "format": "int32",
  1942 + "description": " 权限范围(1:全部权限 2:部分权限)"
  1943 + },
  1944 + "updatedAt": {
  1945 + "type": "integer",
  1946 + "format": "int64",
  1947 + "description": " 更新时间"
1477 } 1948 }
1478 }, 1949 },
1479 "title": "Role", 1950 "title": "Role",
1480 "required": [ 1951 "required": [
1481 "id", 1952 "id",
1482 - "name" 1953 + "name",
  1954 + "menus",
  1955 + "users",
  1956 + "authRange",
  1957 + "updatedAt"
  1958 + ]
  1959 + },
  1960 + "RoleDeleteRequest": {
  1961 + "type": "object",
  1962 + "properties": {
  1963 + "id": {
  1964 + "type": "integer",
  1965 + "format": "int64"
  1966 + }
  1967 + },
  1968 + "title": "RoleDeleteRequest",
  1969 + "required": [
  1970 + "id"
  1971 + ]
  1972 + },
  1973 + "RoleDeleteResponse": {
  1974 + "type": "object",
  1975 + "title": "RoleDeleteResponse"
  1976 + },
  1977 + "RoleGetRequest": {
  1978 + "type": "object",
  1979 + "properties": {
  1980 + "id": {
  1981 + "type": "integer",
  1982 + "format": "int64"
  1983 + }
  1984 + },
  1985 + "title": "RoleGetRequest",
  1986 + "required": [
  1987 + "id"
  1988 + ]
  1989 + },
  1990 + "RoleGetResponse": {
  1991 + "type": "object",
  1992 + "properties": {
  1993 + "role": {
  1994 + "$ref": "#/definitions/Role"
  1995 + }
  1996 + },
  1997 + "title": "RoleGetResponse",
  1998 + "required": [
  1999 + "role"
  2000 + ]
  2001 + },
  2002 + "RoleSaveRequest": {
  2003 + "type": "object",
  2004 + "properties": {
  2005 + "role": {
  2006 + "$ref": "#/definitions/Role"
  2007 + }
  2008 + },
  2009 + "title": "RoleSaveRequest",
  2010 + "required": [
  2011 + "role"
  2012 + ]
  2013 + },
  2014 + "RoleSaveResponse": {
  2015 + "type": "object",
  2016 + "title": "RoleSaveResponse"
  2017 + },
  2018 + "RoleSearchRequest": {
  2019 + "type": "object",
  2020 + "properties": {
  2021 + "page": {
  2022 + "type": "integer",
  2023 + "format": "int32"
  2024 + },
  2025 + "size": {
  2026 + "type": "integer",
  2027 + "format": "int32"
  2028 + },
  2029 + "rolename": {
  2030 + "type": "string",
  2031 + "description": " 角色名称"
  2032 + },
  2033 + "userName": {
  2034 + "type": "string",
  2035 + "description": " 用户名称"
  2036 + }
  2037 + },
  2038 + "title": "RoleSearchRequest",
  2039 + "required": [
  2040 + "page",
  2041 + "size"
  2042 + ]
  2043 + },
  2044 + "RoleSearchResponse": {
  2045 + "type": "object",
  2046 + "properties": {
  2047 + "list": {
  2048 + "type": "array",
  2049 + "items": {
  2050 + "$ref": "#/definitions/Role"
  2051 + }
  2052 + },
  2053 + "total": {
  2054 + "type": "integer",
  2055 + "format": "int64"
  2056 + }
  2057 + },
  2058 + "title": "RoleSearchResponse",
  2059 + "required": [
  2060 + "list",
  2061 + "total"
  2062 + ]
  2063 + },
  2064 + "RoleUpdateRequest": {
  2065 + "type": "object",
  2066 + "properties": {
  2067 + "id": {
  2068 + "type": "integer",
  2069 + "format": "int64"
  2070 + },
  2071 + "role": {
  2072 + "$ref": "#/definitions/Role"
  2073 + }
  2074 + },
  2075 + "title": "RoleUpdateRequest",
  2076 + "required": [
  2077 + "id",
  2078 + "role"
  2079 + ]
  2080 + },
  2081 + "RoleUpdateResponse": {
  2082 + "type": "object",
  2083 + "title": "RoleUpdateResponse"
  2084 + },
  2085 + "SwitchCompanyRequest": {
  2086 + "type": "object",
  2087 + "properties": {
  2088 + "companyId": {
  2089 + "type": "integer",
  2090 + "format": "int64",
  2091 + "description": " 公司ID"
  2092 + }
  2093 + },
  2094 + "title": "SwitchCompanyRequest",
  2095 + "required": [
  2096 + "companyId"
1483 ] 2097 ]
1484 }, 2098 },
1485 "SystemAppGetRequest": { 2099 "SystemAppGetRequest": {
@@ -1714,13 +2328,16 @@ @@ -1714,13 +2328,16 @@
1714 "phone": { 2328 "phone": {
1715 "type": "string", 2329 "type": "string",
1716 "description": " 用户手机号" 2330 "description": " 用户手机号"
  2331 + },
  2332 + "avatar": {
  2333 + "type": "string",
  2334 + "description": " 头像"
1717 } 2335 }
1718 }, 2336 },
1719 "title": "User", 2337 "title": "User",
1720 "required": [ 2338 "required": [
1721 - "id",  
1722 - "name",  
1723 - "phone" 2339 + "phone",
  2340 + "avatar"
1724 ] 2341 ]
1725 }, 2342 },
1726 "UserInfoRequest": { 2343 "UserInfoRequest": {
@@ -1749,6 +2366,10 @@ @@ -1749,6 +2366,10 @@
1749 "format": "int64", 2366 "format": "int64",
1750 "description": " 用户ID" 2367 "description": " 用户ID"
1751 }, 2368 },
  2369 + "avatar": {
  2370 + "type": "string",
  2371 + "description": " 头像"
  2372 + },
1752 "name": { 2373 "name": {
1753 "type": "string", 2374 "type": "string",
1754 "description": " 用户名称" 2375 "description": " 用户名称"
@@ -1757,30 +2378,29 @@ @@ -1757,30 +2378,29 @@
1757 "type": "string", 2378 "type": "string",
1758 "description": " 用户手机号" 2379 "description": " 用户手机号"
1759 }, 2380 },
1760 - "employeeInfo": {  
1761 - "$ref": "#/definitions/Employee",  
1762 - "description": " 职员信息"  
1763 - },  
1764 - "company": {  
1765 - "$ref": "#/definitions/Company",  
1766 - "description": " 当前公司信息" 2381 + "accounts": {
  2382 + "type": "array",
  2383 + "items": {
  2384 + "$ref": "#/definitions/AccountInfo"
  2385 + },
  2386 + "description": " 账号列表"
1767 }, 2387 },
1768 - "companies": { 2388 + "apps": {
1769 "type": "array", 2389 "type": "array",
1770 "items": { 2390 "items": {
1771 - "$ref": "#/definitions/Company" 2391 + "$ref": "#/definitions/SystemAppItem"
1772 }, 2392 },
1773 - "description": " 拥有的公司" 2393 + "description": " 应用列表"
1774 } 2394 }
1775 }, 2395 },
1776 "title": "UserInfoResponse", 2396 "title": "UserInfoResponse",
1777 "required": [ 2397 "required": [
1778 "id", 2398 "id",
  2399 + "avatar",
1779 "name", 2400 "name",
1780 "phone", 2401 "phone",
1781 - "employeeInfo",  
1782 - "company",  
1783 - "companies" 2402 + "accounts",
  2403 + "apps"
1784 ] 2404 ]
1785 } 2405 }
1786 }, 2406 },
@@ -14,5 +14,6 @@ func Migrate(db *gorm.DB) { @@ -14,5 +14,6 @@ func Migrate(db *gorm.DB) {
14 models.SysUserDepartment{}, 14 models.SysUserDepartment{},
15 models.SysApp{}, 15 models.SysApp{},
16 models.SysCompanyApp{}, 16 models.SysCompanyApp{},
  17 + models.SysRole{},
17 ) 18 )
18 } 19 }
@@ -8,20 +8,21 @@ import ( @@ -8,20 +8,21 @@ import (
8 ) 8 )
9 9
10 type SysCompanyApp struct { 10 type SysCompanyApp struct {
11 - Id int64 // 唯一标识  
12 - CompanyId int64 // 公司表ID  
13 - AppId int64 // 应用ID  
14 - Status int // 1:启用、2:停用  
15 - VisibleFlag int // 1:全员可见 2:部分可见  
16 - VisibleUsers []int64 `gorm:"type:jsonb;serializer:json"` // 可见的用户 所有用户:空 部分用户:用户ID列表  
17 - VisibleGroups []int64 `gorm:"type:jsonb;serializer:json"` // 可见的用户组 所有用户:空 部分用户:用户ID列表  
18 - AppConfig domain.AppConfig `gorm:"type:jsonb;serializer:json"` // 应用配置  
19 - Sort int // 排序  
20 - CreatedAt int64  
21 - UpdatedAt int64  
22 - DeletedAt int64  
23 - Version int  
24 - IsDel soft_delete.DeletedAt `gorm:"softDelete:flag,DeletedAtField:DeletedAt"` 11 + Id int64 // 唯一标识
  12 + CompanyId int64 // 公司表ID
  13 + AppId int64 // 应用ID
  14 + Status int // 1:启用、2:停用
  15 + VisibleFlag int // 1:全员可见 2:部分可见
  16 + VisibleUsers []int64 `gorm:"type:jsonb;serializer:json"` // 可见的用户 所有用户:空 部分用户:用户ID列表
  17 + VisibleGroups []int64 `gorm:"type:jsonb;serializer:json"` // 可见的用户组 所有用户:空 部分用户:用户ID列表
  18 + VisibleDepartments []int64 `gorm:"type:jsonb;serializer:json"` // 可见的部门 部门ID列表
  19 + AppConfig domain.AppConfig `gorm:"type:jsonb;serializer:json"` // 应用配置
  20 + Sort int // 排序
  21 + CreatedAt int64
  22 + UpdatedAt int64
  23 + DeletedAt int64
  24 + Version int
  25 + IsDel soft_delete.DeletedAt `gorm:"softDelete:flag,DeletedAtField:DeletedAt"`
25 } 26 }
26 27
27 func (m *SysCompanyApp) TableName() string { 28 func (m *SysCompanyApp) TableName() string {
@@ -13,6 +13,7 @@ type SysRole struct { @@ -13,6 +13,7 @@ type SysRole struct {
13 Name string // 公司名称 13 Name string // 公司名称
14 Menus []int64 `gorm:"type:jsonb;serializer:json"` // 菜单列表 14 Menus []int64 `gorm:"type:jsonb;serializer:json"` // 菜单列表
15 AuthUsers []int64 `gorm:"type:jsonb;serializer:json"` // 拥护该角色的用户列表 15 AuthUsers []int64 `gorm:"type:jsonb;serializer:json"` // 拥护该角色的用户列表
  16 + AuthRange int
16 CreatedAt int64 17 CreatedAt int64
17 UpdatedAt int64 18 UpdatedAt int64
18 DeletedAt int64 19 DeletedAt int64
@@ -2,6 +2,7 @@ package repository @@ -2,6 +2,7 @@ package repository
2 2
3 import ( 3 import (
4 "context" 4 "context"
  5 + "fmt"
5 "github.com/jinzhu/copier" 6 "github.com/jinzhu/copier"
6 "github.com/pkg/errors" 7 "github.com/pkg/errors"
7 "github.com/tiptok/gocomm/pkg/cache" 8 "github.com/tiptok/gocomm/pkg/cache"
@@ -169,7 +170,7 @@ func (repository *SysRoleRepository) FindByEmployee(ctx context.Context, conn tr @@ -169,7 +170,7 @@ func (repository *SysRoleRepository) FindByEmployee(ctx context.Context, conn tr
169 total int64 170 total int64
170 ) 171 )
171 queryFunc := func() (interface{}, error) { 172 queryFunc := func() (interface{}, error) {
172 - tx = tx.Model(&ms).Where("company_id = ?", companyId).Where("auth_users @> '[?]'", userId).Order("id desc") 173 + tx = tx.Model(&ms).Where("company_id = ?", companyId).Where(fmt.Sprintf("auth_users @> '[%d]'", userId)).Order("id desc")
173 if total, tx = transaction.PaginationAndCount(ctx, tx, queryOptions, &ms); tx.Error != nil { 174 if total, tx = transaction.PaginationAndCount(ctx, tx, queryOptions, &ms); tx.Error != nil {
174 return dms, tx.Error 175 return dms, tx.Error
175 } 176 }
@@ -6,19 +6,20 @@ import ( @@ -6,19 +6,20 @@ import (
6 ) 6 )
7 7
8 type SysCompanyApp struct { 8 type SysCompanyApp struct {
9 - Id int64 // 唯一标识  
10 - CompanyId int64 `json:",omitempty"` // 公司表ID  
11 - AppId int64 `json:",omitempty"` // 应用ID  
12 - Status int `json:",omitempty"` // 1:启用、2:停用  
13 - VisibleFlag int `json:",omitempty"` // 1:全员可见 2:部分可见  
14 - VisibleUsers []int64 `json:",omitempty"` // 可见的用户 所有用户:空 部分用户:用户ID列表  
15 - VisibleGroups []int64 `json:",omitempty"` // 可见的用户组 所有用户:空 部分用户:用户ID列表  
16 - AppConfig AppConfig `json:",omitempty"` // 应用配置  
17 - Sort int `json:",omitempty"` // 排序  
18 - CreatedAt int64 `json:",omitempty"`  
19 - UpdatedAt int64 `json:",omitempty"`  
20 - DeletedAt int64 `json:",omitempty"`  
21 - Version int `json:",omitempty"` 9 + Id int64 // 唯一标识
  10 + CompanyId int64 `json:",omitempty"` // 公司表ID
  11 + AppId int64 `json:",omitempty"` // 应用ID
  12 + Status int `json:",omitempty"` // 1:启用、2:停用
  13 + VisibleFlag int `json:",omitempty"` // 1:全员可见 2:部分可见
  14 + VisibleUsers []int64 `json:",omitempty"` // 可见的用户 所有用户:空 部分用户:用户ID列表
  15 + VisibleDepartments []int64 `json:",omitempty"` // 可见的部门 部门ID列表
  16 + VisibleGroups []int64 `json:",omitempty"` // 可见的用户组 所有用户:空 部分用户:用户ID列表
  17 + AppConfig AppConfig `json:",omitempty"` // 应用配置
  18 + Sort int `json:",omitempty"` // 排序
  19 + CreatedAt int64 `json:",omitempty"`
  20 + UpdatedAt int64 `json:",omitempty"`
  21 + DeletedAt int64 `json:",omitempty"`
  22 + Version int `json:",omitempty"`
22 } 23 }
23 24
24 type SysCompanyAppRepository interface { 25 type SysCompanyAppRepository interface {
@@ -9,9 +9,10 @@ import ( @@ -9,9 +9,10 @@ import (
9 type SysRole struct { 9 type SysRole struct {
10 Id int64 `json:",omitempty"` // 唯一标识 10 Id int64 `json:",omitempty"` // 唯一标识
11 CompanyId int64 `json:"companyId"` // 公司ID 11 CompanyId int64 `json:"companyId"` // 公司ID
12 - Name string `json:",omitempty"` // 公司名称 12 + Name string `json:",omitempty"` // 角色名称
13 Menus []int64 `json:",omitempty"` // 菜单列表 13 Menus []int64 `json:",omitempty"` // 菜单列表
14 AuthUsers []int64 `json:",omitempty"` // 拥护该角色的用户列表 14 AuthUsers []int64 `json:",omitempty"` // 拥护该角色的用户列表
  15 + AuthRange int `json:",omitempty"` // 权限范围(1:全部权限 2:部分权限)
15 CreatedAt int64 `json:",omitempty"` 16 CreatedAt int64 `json:",omitempty"`
16 UpdatedAt int64 `json:",omitempty"` 17 UpdatedAt int64 `json:",omitempty"`
17 DeletedAt int64 `json:",omitempty"` 18 DeletedAt int64 `json:",omitempty"`
@@ -58,24 +59,39 @@ type SysMenu struct { @@ -58,24 +59,39 @@ type SysMenu struct {
58 Version int `json:"version,omitempty"` 59 Version int `json:"version,omitempty"`
59 } 60 }
60 61
  62 +const (
  63 + AuthRangeAll = 1 // 全部权限
  64 + AuthRangePart = 2 // 部分权限
  65 +)
  66 +
61 var DefaultMenus []*SysMenu = []*SysMenu{ 67 var DefaultMenus []*SysMenu = []*SysMenu{
62 - NewMenu(10, "工作台", "SYSTEM_WORKBENCH", 0, 1), 68 + //NewMenu(10, "工作台", "SYSTEM_WORKBENCH", 0, 1),
63 //NewMenu(40, "通知公告", "SYSTEM_NOTICE", 0, 1), 69 //NewMenu(40, "通知公告", "SYSTEM_NOTICE", 0, 1),
64 //NewMenu(60, "系统日志", "SYSTEM_LOG", 0, 1), 70 //NewMenu(60, "系统日志", "SYSTEM_LOG", 0, 1),
65 71
66 NewMenu(20, "组织架构", "SYSTEM_ORGANIZATION", 0, 2), 72 NewMenu(20, "组织架构", "SYSTEM_ORGANIZATION", 0, 2),
67 - NewMenu(21, "成员", "SYSTEM_ORGANIZATION_EMPLOYEE", 20, 1),  
68 - NewMenu(22, "部门", "SYSTEM_ORGANIZATION_DEPARTMENT", 20, 2),  
69 - NewMenu(22, "用户组", "SYSTEM_ORGANIZATION_GROUP", 20, 3), 73 + NewMenu(21, "成员与部门", "SYSTEM_ORGANIZATION_EMPLOYEE-DEPARTMENT", 20, 1),
  74 + //NewMenu(22, "部门", "SYSTEM_ORGANIZATION_DEPARTMENT", 20, 2),
  75 + //NewMenu(22, "用户组", "SYSTEM_ORGANIZATION_GROUP", 20, 3),
70 76
71 NewMenu(30, "应用管理", "SYSTEM_APP-MANAGER", 0, 3), 77 NewMenu(30, "应用管理", "SYSTEM_APP-MANAGER", 0, 3),
72 - NewMenu(31, "应用中心", "SYSTEM_APP-MANAGER_APP", 30, 1), 78 + NewMenu(31, "应用中心", "SYSTEM_APP-MANAGER_APP-CENTER", 30, 1),
  79 + NewMenu(32, "应用配置", "SYSTEM_APP-MANAGER_APP-CENTER_SET", 30, 1).WithMenuTypeButton(),
73 80
74 - NewMenu(50, "企业设置", "SYSTEM_COMPANY-SETTING", 0, 5), 81 + NewMenu(50, "企业设置", "SYSTEM_COMPANY-SETTING", 0, 4),
75 NewMenu(51, "企业信息", "SYSTEM_COMPANY-SETTING_INFO", 50, 1), 82 NewMenu(51, "企业信息", "SYSTEM_COMPANY-SETTING_INFO", 50, 1),
76 NewMenu(52, "管理员权限", "SYSTEM_COMPANY-SETTING_ADMIN-AUTH", 50, 2), 83 NewMenu(52, "管理员权限", "SYSTEM_COMPANY-SETTING_ADMIN-AUTH", 50, 2),
77 } 84 }
78 85
  86 +func FineOneMenu(ctx context.Context, conn transaction.Conn, menuId int64) (*SysMenu, error) {
  87 + for _, menu := range DefaultMenus {
  88 + if menu.Id == menuId {
  89 + return menu, nil
  90 + }
  91 + }
  92 + return nil, ErrNotFound
  93 +}
  94 +
79 func NewMenu(id int64, name, code string, pid int64, sort int64) *SysMenu { 95 func NewMenu(id int64, name, code string, pid int64, sort int64) *SysMenu {
80 return &SysMenu{ 96 return &SysMenu{
81 Id: id, 97 Id: id,
@@ -83,5 +99,11 @@ func NewMenu(id int64, name, code string, pid int64, sort int64) *SysMenu { @@ -83,5 +99,11 @@ func NewMenu(id int64, name, code string, pid int64, sort int64) *SysMenu {
83 Code: code, 99 Code: code,
84 ParentId: pid, 100 ParentId: pid,
85 Sort: sort, 101 Sort: sort,
  102 + MenuType: "menu",
86 } 103 }
87 } 104 }
  105 +
  106 +func (m *SysMenu) WithMenuTypeButton() *SysMenu {
  107 + m.MenuType = "button"
  108 + return m
  109 +}
@@ -31,6 +31,7 @@ type SysUserRepository interface { @@ -31,6 +31,7 @@ type SysUserRepository interface {
31 FindOneByPhone(ctx context.Context, conn transaction.Conn, phone string) (*SysUser, error) 31 FindOneByPhone(ctx context.Context, conn transaction.Conn, phone string) (*SysUser, error)
32 FindOneUnscoped(ctx context.Context, conn transaction.Conn, id int64) (*SysUser, error) 32 FindOneUnscoped(ctx context.Context, conn transaction.Conn, id int64) (*SysUser, error)
33 Find(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) (int64, []*SysUser, error) 33 Find(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) (int64, []*SysUser, error)
  34 + //FindByCompany(ctx context.Context, conn transaction.Conn, companyId int64,queryOptions map[string]interface{}) (int64, []*SysUser, error)
34 } 35 }
35 36
36 func NewDomainSysUser(phone string, name string, password string) *SysUser { 37 func NewDomainSysUser(phone string, name string, password string) *SysUser {