应用接口处理

This commit is contained in:
guosl 2024-07-29 17:37:13 +08:00
parent a9d040fb36
commit 802dd213ec
18 changed files with 164 additions and 32 deletions

View File

@ -57,7 +57,7 @@ CREATE TABLE IF NOT EXISTS `user_organization` (
-- 角色表 -- 角色表
CREATE TABLE IF NOT EXISTS `role` ( CREATE TABLE IF NOT EXISTS `role` (
`id` int UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'id' , `id` int UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'id' ,
`code` VARCHAR(255) NOT NULL COMMENT 'code', `code` VARCHAR(64) NOT NULL COMMENT 'code',
`name` VARCHAR(255) NOT NULL COMMENT '名称', `name` VARCHAR(255) NOT NULL COMMENT '名称',
`created_by` VARCHAR(64) DEFAULT '' COMMENT '创建人', `created_by` VARCHAR(64) DEFAULT '' COMMENT '创建人',
`created_on` DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL COMMENT '记录创建时间', `created_on` DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL COMMENT '记录创建时间',
@ -67,6 +67,18 @@ CREATE TABLE IF NOT EXISTS `role` (
UNIQUE KEY `uk_code` (`code`) UNIQUE KEY `uk_code` (`code`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb3 COMMENT='角色表'; ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb3 COMMENT='角色表';
-- 用户角色表
CREATE TABLE IF NOT EXISTS `user_role` (
`id` int UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'id' ,
`user_account` VARCHAR(64) NOT NULL COMMENT '用户账号',
`role_code` VARCHAR(64) NOT NULL COMMENT '名称',
`created_by` VARCHAR(64) DEFAULT '' COMMENT '创建人',
`created_on` DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL COMMENT '记录创建时间',
`modified_by` VARCHAR(64) DEFAULT '' COMMENT '修改人',
`modified_on` DATETIME DEFAULT CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP COMMENT '记录修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_user_role` (`user_account`,`role_code`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb3 COMMENT='用户角色表';
-- 组织角色表 -- 组织角色表
CREATE TABLE IF NOT EXISTS `organization_role` ( CREATE TABLE IF NOT EXISTS `organization_role` (
@ -174,3 +186,16 @@ CREATE TABLE IF NOT EXISTS `user_info`(
-- 默认管理员 pwd:Passw0rd@20240703 -- 默认管理员 pwd:Passw0rd@20240703
REPLACE INTO `user`(`account`,`name`,`mobile`,`email`,`pwd`,`salt`,`created_by`) values ('admin','admin','13077164722','puff.guo@foxmail.com','5b5b2a3ddd62790986676e50e6c4a31b4516ab8387a3a2421df8ebe13b5f4d37','12345678900987654321','admin'); REPLACE INTO `user`(`account`,`name`,`mobile`,`email`,`pwd`,`salt`,`created_by`) values ('admin','admin','13077164722','puff.guo@foxmail.com','5b5b2a3ddd62790986676e50e6c4a31b4516ab8387a3a2421df8ebe13b5f4d37','12345678900987654321','admin');
-- init application
REPLACE INTO `application` (`code`,`secret`,`name`,`description`,`created_by`) VALUES('user-busniss-center','146E5EA66B4B6036C6BBF395CC90C30E','用户中心','用户,统一登陆等','admin');
--init menu
REPLACE INTO `menu`(`app_code`,`code`,`name`,`parent_code`,`type`,`order`,`icon`,`path`,`child_path`,`is_show`,`created_by`) VALUES('user-busniss-center','index','首页','',1,0,'home','/home','',1,'admin');
REPLACE INTO `menu`(`app_code`,`code`,`name`,`parent_code`,`type`,`order`,`icon`,`path`,`child_path`,`is_show`,`created_by`) VALUES('user-busniss-center','user','用户','',1,1,'user','/user','',1,'admin');
REPLACE INTO `menu`(`app_code`,`code`,`name`,`parent_code`,`type`,`order`,`icon`,`path`,`child_path`,`is_show`,`created_by`) VALUES('user-busniss-center','organization','组织','',1,2,'organization','/organization','',1,'admin');
REPLACE INTO `menu`(`app_code`,`code`,`name`,`parent_code`,`type`,`order`,`icon`,`path`,`child_path`,`is_show`,`created_by`) VALUES('user-busniss-center','role','角色','',1,3,'role','/role','',1,'admin');
REPLACE INTO `menu`(`app_code`,`code`,`name`,`parent_code`,`type`,`order`,`icon`,`path`,`child_path`,`is_show`,`created_by`) VALUES('user-busniss-center','application','应用','',1,4,'application','/application','',1,'admin');
-- init role
REPLACE INTO `role` (`code`,`name`,`created_by`) VALUES('admin','超级管理员','admin');

View File

@ -12,6 +12,7 @@ type ApplicationInfo struct {
CreatedOn time.Time `json:"created_on"` // 记录创建时间 CreatedOn time.Time `json:"created_on"` // 记录创建时间
ModifiedBy string `json:"modified_by"` // 修改人 ModifiedBy string `json:"modified_by"` // 修改人
ModifiedOn time.Time `json:"modified_on"` // 记录修改时间 ModifiedOn time.Time `json:"modified_on"` // 记录修改时间
Menus []Menu `json:"menus"`
} }
type Menu struct { type Menu struct {

View File

@ -8,7 +8,7 @@ type CreateReq struct {
} }
type ResetSecretReq struct { type ResetSecretReq struct {
Id uint `json:"id" binding:"required"` Code string `json:"code" binding:"required"`
Secret string `json:"secret" binding:"required,len=32"` Secret string `json:"secret" binding:"required,len=32"`
} }
@ -35,6 +35,9 @@ func (q *Query) Default() {
type List struct { type List struct {
List []ApplicationInfo `json:"list"` List []ApplicationInfo `json:"list"`
Total int64
Page int
PageSize int
} }
type MenusReq struct { type MenusReq struct {
@ -42,11 +45,11 @@ type MenusReq struct {
} }
type DeleteAppReq struct { type DeleteAppReq struct {
Id uint `json:"id" binding:"required"` Id uint `form:"id" json:"id" binding:"required"`
} }
type GetAppReq struct { type GetAppReq struct {
Id uint `form:"id" json:"id" binding:"required"` Code string `form:"code" json:"code" binding:"required"`
} }
type CreateMenuReq struct { type CreateMenuReq struct {

View File

@ -9,8 +9,8 @@ import (
type UserStatus int type UserStatus int
const ( const (
EnableUserStatus UserStatus = 0 EnableUserStatus UserStatus = 1
DisableUserStatus UserStatus = 1 DisableUserStatus UserStatus = 0
) )
type LoginInfo struct { type LoginInfo struct {
@ -83,3 +83,10 @@ func (q *Query) Default() {
type Enable struct { type Enable struct {
Id uint `json:"id" binding:"required"` Id uint `json:"id" binding:"required"`
} }
type SearchRsp struct {
List []User
Page int
PageSize int
Total int64
}

View File

@ -38,6 +38,7 @@ type ApplicationRepo interface {
Search(ctx context.Context, query Query) ([]Application, error) Search(ctx context.Context, query Query) ([]Application, error)
ResetSecret(ctx context.Context, app Application) error ResetSecret(ctx context.Context, app Application) error
DelApp(ctx context.Context,id uint)error DelApp(ctx context.Context,id uint)error
SearchCount(ctx context.Context, query Query) (int64, error)
} }
type applicationRepoS struct { type applicationRepoS struct {
@ -69,7 +70,7 @@ func (u *applicationRepoS) SaveApplication(ctx context.Context, application Appl
} }
func (u *applicationRepoS) CreateApplication(ctx context.Context, application Application) error { func (u *applicationRepoS) CreateApplication(ctx context.Context, application Application) error {
return u.db.Create(application).Error return u.db.Create(&application).Error
} }
@ -87,10 +88,22 @@ func (u *applicationRepoS) Search(ctx context.Context, query Query) ([]Applicati
} }
func (u *applicationRepoS) ResetSecret(ctx context.Context, app Application) error { func (u *applicationRepoS) ResetSecret(ctx context.Context, app Application) error {
err := u.db.Model(&Application{}).Where("id = ?", app.ID).Update("secret",app.Secret).Error err := u.db.Model(&Application{}).Where("code = ?", app.Code).Update("secret",app.Secret).Error
return err return err
} }
func (u *applicationRepoS) DelApp(ctx context.Context,id uint)error{ func (u *applicationRepoS) DelApp(ctx context.Context,id uint)error{
return u.db.Where("id = ?",id).Delete(&Application{}).Error return u.db.Where("id = ?",id).Delete(&Application{}).Error
} }
func (u *applicationRepoS) SearchCount(ctx context.Context, query Query) (int64, error){
var total int64
keyword := fmt.Sprintf("%%%s%%", query.Keyword)
db := u.db.Model(&Application{})
if query.Keyword != "" {
db = db.Where("code like ? or name like ?", keyword, keyword)
}
err := db.Count(&total).Error
return total, err
}

View File

@ -9,7 +9,7 @@ import (
func convertMenu(menu Menu) appModel.Menu { func convertMenu(menu Menu) appModel.Menu {
aMenu := appModel.Menu{} aMenu := appModel.Menu{}
copier.Copy(aMenu, menu) copier.Copy(&aMenu, menu)
return aMenu return aMenu
} }

View File

@ -11,7 +11,7 @@ import (
) )
func init(){ func init(){
do.Provide[ApplicationRepo](nil, NewApplicationRepoS) do.Provide[MenuRepo](nil, NewMenuRepo)
} }
// 菜单 // 菜单

View File

@ -10,7 +10,7 @@ import (
func init(){ func init(){
do.Provide[UserOrganizationRepo](nil,NewUserOrganizationRepo) do.Provide[OrganizationRoleRepo](nil,NewOrganizationRoleRepo)
} }
// 组织角色表 // 组织角色表

View File

@ -42,7 +42,9 @@ type UserRepo interface {
CreateUser(ctx context.Context, user *User) error CreateUser(ctx context.Context, user *User) error
SetUserStatus(ctx context.Context, id uint, status userModel.UserStatus) error SetUserStatus(ctx context.Context, id uint, status userModel.UserStatus) error
Search(ctx context.Context, query *userModel.Query) ([]User, error) Search(ctx context.Context, query *userModel.Query) ([]User, error)
SearchCount(ctx context.Context, query *userModel.Query) (int64, error)
ResetPwd(ctx context.Context, user User) error ResetPwd(ctx context.Context, user User) error
GetUserById(ctx context.Context, id uint) (user User, err error)
} }
type userRepoS struct { type userRepoS struct {
@ -104,3 +106,21 @@ func (u *userRepoS) ResetPwd(ctx context.Context, user User) error {
err := u.db.Model(&User{}).Where("id = ?", user.ID).Updates(map[string]any{"pwd": user.Pwd, "salt": user.Salt}).Error err := u.db.Model(&User{}).Where("id = ?", user.ID).Updates(map[string]any{"pwd": user.Pwd, "salt": user.Salt}).Error
return err return err
} }
func (u *userRepoS) SearchCount(ctx context.Context, query *userModel.Query) (int64, error) {
keyword := fmt.Sprintf("%%%s%%", query.Keyword)
db := u.db.Model(&User{})
if query.Keyword != "" {
db = db.Where("account like ? or name like ?", keyword, keyword)
}
var total int64
err := db.Count(&total).Error
return total, err
}
func (u *userRepoS)GetUserById(ctx context.Context, id uint) (user User, err error){
err = u.db.Where("id = ?", id).Take(&user).Error
return
}

View File

@ -5,6 +5,7 @@ import (
appModel "busniess-user-center/internal/models/application" appModel "busniess-user-center/internal/models/application"
"busniess-user-center/internal/repo" "busniess-user-center/internal/repo"
"busniess-user-center/pkg/redis" "busniess-user-center/pkg/redis"
contextUtil "busniess-user-center/pkg/utils/context"
"context" "context"
"fmt" "fmt"
@ -37,18 +38,33 @@ func NewApplicationService(i *do.Injector) (ApplicationService, error) {
} }
func (a *applicationService) Create(ctx context.Context, info *appModel.CreateReq) error { func (a *applicationService) Create(ctx context.Context, info *appModel.CreateReq) error {
dbApp := repo.Application{} session, err := contextUtil.GetSession(ctx)
err := copier.Copy(dbApp, info)
if err != nil { if err != nil {
return err return err
} }
_, err = a.appRepo.GetAppByCode(ctx, info.Code)
if err != nil && err != gorm.ErrRecordNotFound {
return err
}
if err == nil {
return fmt.Errorf("应用code:%s已经存在", info.Code)
}
dbApp := repo.Application{}
err = copier.Copy(&dbApp, info)
if err != nil {
return err
}
dbApp.CreatedBy = session.Account
return a.appRepo.CreateApplication(ctx, dbApp) return a.appRepo.CreateApplication(ctx, dbApp)
} }
func (a *applicationService) ResetSecret(ctx context.Context, info *appModel.ResetSecretReq) error { func (a *applicationService) ResetSecret(ctx context.Context, info *appModel.ResetSecretReq) error {
dbApp := repo.Application{} dbApp := repo.Application{}
err := copier.Copy(dbApp, info) err := copier.Copy(&dbApp, info)
if err != nil { if err != nil {
return err return err
} }
@ -63,7 +79,7 @@ func (a *applicationService) Delete(ctx context.Context, req *appModel.DeleteApp
} }
func (a *applicationService) GetApp(ctx context.Context, req *appModel.GetAppReq) (app appModel.ApplicationInfo, err error) { func (a *applicationService) GetApp(ctx context.Context, req *appModel.GetAppReq) (app appModel.ApplicationInfo, err error) {
dbApp, err := a.appRepo.GetAppById(ctx, req.Id) dbApp, err := a.appRepo.GetAppByCode(ctx, req.Code)
if err != nil && err != gorm.ErrRecordNotFound { if err != nil && err != gorm.ErrRecordNotFound {
return return
} }
@ -72,14 +88,19 @@ func (a *applicationService) GetApp(ctx context.Context, req *appModel.GetAppReq
return return
} }
err = copier.Copy(app, dbApp) app.Menus, err = a.menuRepo.GetAppMenus(ctx, dbApp.Code)
if err != nil {
return
}
err = copier.Copy(&app, dbApp)
return return
} }
func (a *applicationService) Search(ctx context.Context, query *appModel.Query) (rsp appModel.List, err error) { func (a *applicationService) Search(ctx context.Context, query *appModel.Query) (rsp appModel.List, err error) {
query.Default() query.Default()
dbQuery := repo.Query{} dbQuery := repo.Query{}
err = copier.Copy(dbQuery, query) err = copier.Copy(&dbQuery, query)
if err != nil { if err != nil {
return return
} }
@ -89,12 +110,21 @@ func (a *applicationService) Search(ctx context.Context, query *appModel.Query)
return return
} }
total, err := a.appRepo.SearchCount(ctx, dbQuery)
if err != nil {
return
}
for _, item := range dbList { for _, item := range dbList {
info := appModel.ApplicationInfo{} info := appModel.ApplicationInfo{}
copier.Copy(info, item) copier.Copy(&info, item)
rsp.List = append(rsp.List, info) rsp.List = append(rsp.List, info)
} }
rsp.Page = query.Page
rsp.PageSize = query.PageSize
rsp.Total = total
return return
} }
@ -105,7 +135,7 @@ func (a *applicationService) Menus(ctx context.Context, info *appModel.MenusReq)
func (a *applicationService) CreateMenu(ctx context.Context, info *appModel.CreateMenuReq) error { func (a *applicationService) CreateMenu(ctx context.Context, info *appModel.CreateMenuReq) error {
// todo 校验权限 // todo 校验权限
menu := repo.Menu{} menu := repo.Menu{}
err := copier.Copy(menu, info) err := copier.Copy(&menu, info)
if err != nil { if err != nil {
return err return err
} }
@ -143,3 +173,19 @@ func (a *applicationService) DeleteMenu(ctx context.Context, info *appModel.DelM
err := a.menuRepo.DelMenuById(ctx, info.Id) err := a.menuRepo.DelMenuById(ctx, info.Id)
return err return err
} }
func (a *applicationService) Modify(ctx context.Context, info *appModel.Application) error {
dbApp := repo.Application{}
err := copier.Copy(&dbApp, info)
if err != nil {
return err
}
app, err := a.appRepo.GetAppByCode(ctx, info.Info.Code)
if err != nil {
return err
}
dbApp.ID = app.ID
return a.appRepo.SaveApplication(ctx, dbApp)
}

View File

@ -12,4 +12,5 @@ type ApplicationService interface {
GetApp(ctx context.Context, req *appModel.GetAppReq) (app appModel.ApplicationInfo, err error) GetApp(ctx context.Context, req *appModel.GetAppReq) (app appModel.ApplicationInfo, err error)
Search(ctx context.Context, query *appModel.Query) (rsp appModel.List, err error) Search(ctx context.Context, query *appModel.Query) (rsp appModel.List, err error)
Menus(ctx context.Context, info *appModel.MenusReq) (rsp []appModel.Menu, err error) Menus(ctx context.Context, info *appModel.MenusReq) (rsp []appModel.Menu, err error)
Modify(ctx context.Context, info *appModel.Application) error
} }

View File

@ -88,7 +88,7 @@ func (o *organizationService) Organization(ctx context.Context, info *orgModel.G
return return
} }
copier.Copy(org, dbOrg) copier.Copy(&org, dbOrg)
return return
} }

View File

@ -74,13 +74,13 @@ func (o *roleService) Role(ctx context.Context, info *roleModel.GetReq) (role ro
return return
} }
err = copier.Copy(role, dbRole) err = copier.Copy(&role, dbRole)
return return
} }
func (o *roleService) Search(ctx context.Context, info *roleModel.Query) ([]roleModel.Role, error) { func (o *roleService) Search(ctx context.Context, info *roleModel.Query) ([]roleModel.Role, error) {
dbQuery := repo.Query{} dbQuery := repo.Query{}
copier.Copy(dbQuery, info) copier.Copy(&dbQuery, info)
dbRoles, err := o.roleRepo.Search(ctx, dbQuery) dbRoles, err := o.roleRepo.Search(ctx, dbQuery)
if err != nil { if err != nil {
return nil, err return nil, err

View File

@ -13,7 +13,7 @@ type UserService interface {
Modify(ctx context.Context, mInfo *userModel.ModifyInfo) error Modify(ctx context.Context, mInfo *userModel.ModifyInfo) error
Disable(ctx context.Context, req *userModel.Enable) error Disable(ctx context.Context, req *userModel.Enable) error
Enable(ctx context.Context, req *userModel.Enable) error Enable(ctx context.Context, req *userModel.Enable) error
Search(ctx context.Context, query *userModel.Query) ([]userModel.User, error) Search(ctx context.Context, query *userModel.Query) (*userModel.SearchRsp, error)
ResetPwd(ctx context.Context, req *userModel.ResetPwdReq) error ResetPwd(ctx context.Context, req *userModel.ResetPwdReq) error
GetUser(ctx context.Context, req *userModel.GetUserReq) (user userModel.User, err error) GetUser(ctx context.Context, req *userModel.GetUserReq) (user userModel.User, err error)
} }

View File

@ -183,7 +183,7 @@ func (u *userService) Enable(ctx context.Context, req *userModel.Enable) error {
return u.repo.SetUserStatus(ctx, req.Id, userModel.EnableUserStatus) return u.repo.SetUserStatus(ctx, req.Id, userModel.EnableUserStatus)
} }
func (u *userService) Search(ctx context.Context, query *userModel.Query) ([]userModel.User, error) { func (u *userService) Search(ctx context.Context, query *userModel.Query) (*userModel.SearchRsp, error) {
// 获取操作用户 // 获取操作用户
_, err := contextUtil.GetSession(ctx) _, err := contextUtil.GetSession(ctx)
if err != nil { if err != nil {
@ -196,8 +196,19 @@ func (u *userService) Search(ctx context.Context, query *userModel.Query) ([]use
return nil, err return nil, err
} }
list := convertUserList(users) total, err := u.repo.SearchCount(ctx, query)
return list, err if err != nil {
return nil, err
}
rsp := &userModel.SearchRsp{
List: convertUserList(users),
Page: query.Page,
PageSize: query.PageSize,
Total: total,
}
return rsp, err
} }
func (u *userService) ResetPwd(ctx context.Context, req *userModel.ResetPwdReq) error { func (u *userService) ResetPwd(ctx context.Context, req *userModel.ResetPwdReq) error {
@ -208,7 +219,7 @@ func (u *userService) ResetPwd(ctx context.Context, req *userModel.ResetPwdReq)
} }
// 判断是否本人操作 // 判断是否本人操作
rUser, err := u.repo.GetUserByAccount(ctx, session.Account) rUser, err := u.repo.GetUserById(ctx, req.Id)
if err != nil && err != gorm.ErrRecordNotFound { if err != nil && err != gorm.ErrRecordNotFound {
return err return err
} }

View File

@ -69,7 +69,7 @@ func (u *userService) removeCookie(ctx context.Context) {
} }
func convertUserList(users []repo.User) []userModel.User { func convertUserList(users []repo.User) []userModel.User {
list := make([]userModel.User, len(users)) list := make([]userModel.User,0, len(users))
for _, item := range users { for _, item := range users {
list = append(list, convertUser(item)) list = append(list, convertUser(item))
} }

View File

@ -32,9 +32,10 @@ func RegisterRoute(api *gin.RouterGroup) {
server := do.MustInvoke[*ApplicationServer](nil) server := do.MustInvoke[*ApplicationServer](nil)
api.POST("/create", ginUtil.WrapNoRsp(server.Create)) api.POST("/create", ginUtil.WrapNoRsp(server.Create))
api.POST("/reset", ginUtil.WrapNoRsp(server.ResetSecret)) api.POST("/reset", ginUtil.WrapNoRsp(server.ResetSecret))
api.POST("/delete", ginUtil.WrapNoRsp(server.DelApp)) api.DELETE("/delete", ginUtil.WrapNoRsp(server.DelApp))
api.GET("/search", ginUtil.Wrap(server.Search)) api.GET("/search", ginUtil.Wrap(server.Search))
api.GET("/menus", ginUtil.WrapNoRsp(server.ResetSecret)) api.GET("/application", ginUtil.Wrap(server.Get))
api.GET("/modify", ginUtil.WrapNoRsp(server.Modify))
} }
func (u *ApplicationServer) Create(ctx context.Context, req *appModel.CreateReq) (err error) { func (u *ApplicationServer) Create(ctx context.Context, req *appModel.CreateReq) (err error) {
@ -58,3 +59,7 @@ func (u *ApplicationServer) ResetSecret(ctx context.Context, req *appModel.Reset
func (u *ApplicationServer) DelApp(ctx context.Context, req *appModel.DeleteAppReq) error { func (u *ApplicationServer) DelApp(ctx context.Context, req *appModel.DeleteAppReq) error {
return u.applicationService.Delete(ctx, req) return u.applicationService.Delete(ctx, req)
} }
func (u *ApplicationServer) Modify(ctx context.Context, info *appModel.Application) error {
return u.applicationService.Modify(ctx, info)
}

View File

@ -83,7 +83,7 @@ func (u *UserServer) Enable(ctx context.Context, req *userModel.Enable) error {
return u.userService.Enable(ctx, req) return u.userService.Enable(ctx, req)
} }
func (u *UserServer) Search(ctx context.Context, query *userModel.Query) ([]userModel.User, error) { func (u *UserServer) Search(ctx context.Context, query *userModel.Query) (*userModel.SearchRsp, error) {
query.Default() query.Default()
return u.userService.Search(ctx, query) return u.userService.Search(ctx, query)
} }