作者 yangfu

快讯\用户角色修改

... ... @@ -68,7 +68,7 @@ type (
}
RoleItem {
Id int64 `json:"id,optional"` // 角色ID
CompanyId int64 `json:"companyId,optional,omitempty"` // 公司ID
CompanyId int64 `json:"companyId,optional,string,omitempty"` // 公司ID
Name string `json:"name"` // 角色名称
AuthIds []int64 `json:"authIds,optional,omitempty"` // 角色权限列表
AuthsDesc string `json:"authsDesc,optional,omitempty"` // 权限列表描述
... ...
... ... @@ -139,8 +139,10 @@ type(
Type string `json:"type"` // 快讯类型 文章:Article 讨论:Discuss ...
Title string `json:"title"` // 标题
Summary string `json:"summary"` // 快讯概要
Time int64 `json:"time"` // 时间
Time int64 `json:"time"` // 时间
ReadFlag bool `json:"readFlag"` // 已读标识 true:已读 false:未读
Images []string `json:"images"` // 图片列表
Author UserItem `json:"author"` // 作者
}
MiniUserFollowedSearchRequest{
Page int `json:"page,optional"`
... ... @@ -166,7 +168,7 @@ type(
//Roles []int64 `json:"roleId,omitempty"` // 角色
Flag int `json:"flag,omitempty"` // 标识 1:管理员 2:普通用户 (有绑定角色是管理员)
Name string `json:"name,omitempty"` // 名称
Avatar string `json:"avatar,omitempty"` // 头像
Avatar *string `json:"avatar,omitempty"` // 头像
Phone string `json:"phone,omitempty"` // 手机号 唯一
Position string `json:"position,omitempty"` // 职位
Enable int `json:"enable,omitempty"` // 启用状态 1:启用 2:禁用
... ...
... ... @@ -31,14 +31,16 @@ func (l *SystemDeleteRoleLogic) SystemDeleteRole(req *types.RoleDeleteRequest) (
conn = l.svcCtx.DefaultDBConn()
role *domain.Role
userRemoveRoleList []*domain.User
userRoles []*domain.UserRole
)
if role, err = l.svcCtx.RoleRepository.FindOne(l.ctx, conn, req.Id); err != nil {
return nil, xerr.NewErrMsgErr("角色不存在", err)
}
for _, item := range role.Users {
_, userRoles, _ = l.svcCtx.UserRoleRepository.Find(l.ctx, conn, domain.IndexCompanyId(role.CompanyId)().WithKV("roleId", role.Id).WithFindOnly())
for _, item := range userRoles {
var user *domain.User
if user, err = l.svcCtx.UserRepository.FindOne(l.ctx, conn, item.Id); err != nil {
return nil, xerr.NewErrMsgErr("用户存在", err)
if user, err = l.svcCtx.UserRepository.FindOne(l.ctx, conn, item.UserId); err != nil {
continue
}
userRemoveRoleList = append(userRemoveRoleList, user)
}
... ... @@ -52,6 +54,9 @@ func (l *SystemDeleteRoleLogic) SystemDeleteRole(req *types.RoleDeleteRequest) (
return err
}
}
if err = l.svcCtx.UserRoleRepository.DeleteRole(l.ctx, conn, role.Id); err != nil {
return err
}
return nil
}, true); err != nil {
return nil, xerr.NewErrMsgErr("删除角色失败", err)
... ...
... ... @@ -56,6 +56,13 @@ func (l *SystemSaveRoleLogic) SystemSaveRole(req *types.RoleSaveRequest) (resp *
if user, err = l.svcCtx.UserRepository.UpdateWithVersion(ctx, conn, user); err != nil {
return err
}
if _, err = l.svcCtx.UserRoleRepository.Insert(l.ctx, conn, &domain.UserRole{
CompanyId: user.CompanyId,
UserId: user.Id,
RoleId: role.Id,
}); err != nil {
return err
}
}
return nil
}, true); err != nil {
... ... @@ -82,7 +89,7 @@ func NewDomainRole(ctx context.Context, item types.RoleItem) *domain.Role {
Name: item.Name,
Auths: item.AuthIds,
Remark: item.Remark,
Users: users,
//Users: users,
}
return role
}
... ...
... ... @@ -37,6 +37,8 @@ func (l *SystemUpdateRoleLogic) SystemUpdateRole(req *types.RoleUpdateRequest) (
userRemoveRoleList []*domain.User
userAddRoleList []*domain.User
userRoles []*domain.UserRole
)
if role, err = l.svcCtx.RoleRepository.FindOne(l.ctx, conn, req.Id); err != nil {
return nil, xerr.NewErrMsgErr("角色不存在", err)
... ... @@ -46,11 +48,12 @@ func (l *SystemUpdateRoleLogic) SystemUpdateRole(req *types.RoleUpdateRequest) (
return nil, xerr.NewErrMsg(fmt.Sprintf("unknown auth %d ", authId))
}
}
lo.ForEach(role.Users, func(item domain.User, index int) {
beforeUserIds = append(beforeUserIds, item.Id)
_, userRoles, _ = l.svcCtx.UserRoleRepository.Find(l.ctx, conn, domain.IndexCompanyId(role.CompanyId)().WithKV("roleId", role.Id).WithFindOnly())
beforeUserIds = domain.Values(userRoles, func(item *domain.UserRole) int64 {
return item.UserId
})
tempRole := NewDomainRole(l.ctx, req.Role)
lo.ForEach(tempRole.Users, func(item domain.User, index int) {
lo.ForEach(req.Role.Users, func(item types.RoleUser, index int) {
afterUserIds = append(afterUserIds, item.Id)
})
removeList, addList := lo.Difference(beforeUserIds, afterUserIds)
... ... @@ -69,26 +72,36 @@ func (l *SystemUpdateRoleLogic) SystemUpdateRole(req *types.RoleUpdateRequest) (
userAddRoleList = append(userAddRoleList, user)
}
if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error {
// 更新角色
role.Name = tempRole.Name
role.Auths = tempRole.Auths
role.Remark = tempRole.Remark
role.Users = tempRole.Users
if role, err = l.svcCtx.RoleRepository.UpdateWithVersion(ctx, conn, role); err != nil {
return err
}
// 移除角色用户
for _, user := range userRemoveRoleList {
user.RemoveRole(role.Id)
if user, err = l.svcCtx.UserRepository.UpdateWithVersion(ctx, conn, user); err != nil {
return err
}
if err = l.svcCtx.UserRoleRepository.DeleteByUserAndRole(ctx, conn, user.Id, role.Id); err != nil {
return err
}
}
// 新增角色用户
for _, user := range userAddRoleList {
user.AddRole(role.Id)
if user, err = l.svcCtx.UserRepository.UpdateWithVersion(ctx, conn, user); err != nil {
return err
}
if _, err = l.svcCtx.UserRoleRepository.Insert(l.ctx, conn, &domain.UserRole{
CompanyId: user.CompanyId,
UserId: user.Id,
RoleId: role.Id,
}); err != nil {
return err
}
}
return nil
}, true); err != nil {
... ...
... ... @@ -58,7 +58,7 @@ func NewUserItemSimple(user *domain.User, company *domain.Company) *types.UserIt
Id: user.Id,
Name: user.Name,
CompanyName: lo.Ternary(company != nil, company.Name, ""),
Avatar: user.Avatar,
Avatar: lo.ToPtr(user.Avatar),
Phone: user.Phone,
Position: user.Position,
AuditStatus: &user.AuditStatus,
... ...
... ... @@ -48,7 +48,7 @@ func (l *MiniUserInfoLogic) MiniUserInfo(req *types.MiniUserInfoRequest) (resp *
User: &types.UserItem{
Id: user.Id,
Name: user.Name,
Avatar: user.Avatar,
Avatar: lo.ToPtr(user.Avatar),
Position: user.Position,
AuditStatus: lo.ToPtr(user.AuditStatus),
Enable: user.Enable,
... ...
... ... @@ -34,6 +34,7 @@ func (l *MiniUserNewsLogic) MiniUserNews(req *types.MiniUserNewsRequest) (resp *
userToken = contextdata.GetUserTokenFromCtx(l.ctx)
articles []*domain.Article
readArticles = make([]*domain.UserReadArticle, 0)
userMap = make(map[int64]*domain.User)
)
if user, err = l.svcCtx.UserRepository.FindOne(l.ctx, conn, userToken.UserId); err != nil {
return nil, xerr.NewErrMsgErr("用户不存在", err)
... ... @@ -67,8 +68,19 @@ func (l *MiniUserNewsLogic) MiniUserNews(req *types.MiniUserNewsRequest) (resp *
Title: item.Title,
Summary: item.Summary,
Time: item.CreatedAt,
Images: make([]string, 0),
ReadFlag: false,
}
if author, _ := domain.LazyLoad(userMap, l.ctx, conn, item.AuthorId, l.svcCtx.UserRepository.FindOne); author != nil {
newsItem.Author = types.UserItem{
Id: author.Id,
Name: author.Name,
Avatar: lo.ToPtr(author.Avatar),
}
}
for _, img := range item.Images {
newsItem.Images = append(newsItem.Images, img.Url)
}
if _, ok := readArticlesMap[item.Id]; ok {
newsItem.ReadFlag = true
}
... ...
... ... @@ -472,12 +472,14 @@ type MiniUserNewsResposne struct {
}
type UserNewsItem struct {
NewsId int64 `json:"newsId"` // 快讯ID
Type string `json:"type"` // 快讯类型 文章:Article 讨论:Discuss ...
Title string `json:"title"` // 标题
Summary string `json:"summary"` // 快讯概要
Time int64 `json:"time"` // 时间
ReadFlag bool `json:"readFlag"` // 已读标识 true:已读 false:未读
NewsId int64 `json:"newsId"` // 快讯ID
Type string `json:"type"` // 快讯类型 文章:Article 讨论:Discuss ...
Title string `json:"title"` // 标题
Summary string `json:"summary"` // 快讯概要
Time int64 `json:"time"` // 时间
ReadFlag bool `json:"readFlag"` // 已读标识 true:已读 false:未读
Images []string `json:"images"` // 图片列表
Author UserItem `json:"author"` // 作者
}
type MiniUserFollowedSearchRequest struct {
... ... @@ -503,7 +505,7 @@ type UserItem struct {
CompanyLogo *string `json:"companyLogo,omitempty"` // 公司LOGO
Flag int `json:"flag,omitempty"` // 标识 1:管理员 2:普通用户 (有绑定角色是管理员)
Name string `json:"name,omitempty"` // 名称
Avatar string `json:"avatar,omitempty"` // 头像
Avatar *string `json:"avatar,omitempty"` // 头像
Phone string `json:"phone,omitempty"` // 手机号 唯一
Position string `json:"position,omitempty"` // 职位
Enable int `json:"enable,omitempty"` // 启用状态 1:启用 2:禁用
... ... @@ -1223,7 +1225,7 @@ type MiniSearchArticleItem struct {
ArticleId int64 `json:"articleId"`
Title string `json:"title"`
Author string `json:"author"` // 发布人
Avatar string `json:"avatar"`
Avatar string `json:"avatar"` // 发布人的头像
Images []string `json:"images"`
CreatedAt int64 `json:"createdAt"`
MeReadFlag int `json:"meReadFlag"` //已读标识 [0:未读] [1:已读]
... ... @@ -1272,15 +1274,15 @@ type RoleSearchResponse struct {
}
type RoleItem struct {
Id int64 `json:"id,optional"` // 角色ID
CompanyId int64 `json:"companyId,optional,omitempty"` // 公司ID
Name string `json:"name"` // 角色名称
AuthIds []int64 `json:"authIds,optional,omitempty"` // 角色权限列表
AuthsDesc string `json:"authsDesc,optional,omitempty"` // 权限列表描述
UsersDesc string `json:"usersDesc,optional,omitempty"` // 用户列表描述
Remark string `json:"remark,optional,omitempty"` // 备注
Users []RoleUser `json:"users,optional,omitempty"` // 绑定的用户
UpdatedAt int64 `json:"updatedAt,optional,omitempty"` // 更新时间
Id int64 `json:"id,optional"` // 角色ID
CompanyId int64 `json:"companyId,optional,string,omitempty"` // 公司ID
Name string `json:"name"` // 角色名称
AuthIds []int64 `json:"authIds,optional,omitempty"` // 角色权限列表
AuthsDesc string `json:"authsDesc,optional,omitempty"` // 权限列表描述
UsersDesc string `json:"usersDesc,optional,omitempty"` // 用户列表描述
Remark string `json:"remark,optional,omitempty"` // 备注
Users []RoleUser `json:"users,optional,omitempty"` // 绑定的用户
UpdatedAt int64 `json:"updatedAt,optional,omitempty"` // 更新时间
}
type RoleUser struct {
... ...
... ... @@ -105,6 +105,36 @@ func (repository *UserRoleRepository) DeleteByUser(ctx context.Context, conn tra
return nil
}
func (repository *UserRoleRepository) DeleteRole(ctx context.Context, conn transaction.Conn, roleId int64) error {
var (
tx = conn.DB()
m = &models.UserRole{}
)
queryFunc := func() (interface{}, error) {
tx = tx.Where("role_id = ?", roleId).Delete(m)
return m, tx.Error
}
if _, err := repository.Query(queryFunc, m.CacheKeyFunc()); err != nil {
return err
}
return nil
}
func (repository *UserRoleRepository) DeleteByUserAndRole(ctx context.Context, conn transaction.Conn, userId int64, roleId int64) error {
var (
tx = conn.DB()
m = &models.UserRole{}
)
queryFunc := func() (interface{}, error) {
tx = tx.Where("user_id = ?", userId).Where("role_id = ?", roleId).Delete(m)
return m, tx.Error
}
if _, err := repository.Query(queryFunc, m.CacheKeyFunc()); err != nil {
return err
}
return nil
}
func (repository *UserRoleRepository) FindOne(ctx context.Context, conn transaction.Conn, id int64) (*domain.UserRole, error) {
var (
err error
... ... @@ -135,6 +165,12 @@ func (repository *UserRoleRepository) Find(ctx context.Context, conn transaction
)
queryFunc := func() (interface{}, error) {
tx = tx.Model(&ms).Order("id desc")
if v, ok := queryOptions["companyId"]; ok {
tx.Where("company_id = ?", v)
}
if v, ok := queryOptions["roleId"]; ok {
tx.Where("role_id = ?", v)
}
if total, tx = transaction.PaginationAndCount(ctx, tx, queryOptions, &ms); tx.Error != nil {
return dms, tx.Error
}
... ...
... ... @@ -11,7 +11,7 @@ type Role struct {
Name string `json:"name"` // 角色名称
Auths []int64 `json:"auths"` // 角色权限列表
Remark string `json:"remark"` // 备注
Users []User `json:"users"` // 绑定的用户
//Users []User `json:"users"` // (废弃)绑定的用户
CreatedAt int64 `json:"createdAt,omitempty"`
UpdatedAt int64 `json:"updatedAt,omitempty"`
... ...
... ... @@ -22,6 +22,8 @@ type UserRoleRepository interface {
UpdateWithVersion(ctx context.Context, conn transaction.Conn, dm *UserRole) (*UserRole, error)
Delete(ctx context.Context, conn transaction.Conn, dm *UserRole) (*UserRole, error)
DeleteByUser(ctx context.Context, conn transaction.Conn, userId int64) error
DeleteRole(ctx context.Context, conn transaction.Conn, roleId int64) error
DeleteByUserAndRole(ctx context.Context, conn transaction.Conn, userId int64, roleId int64) error
FindOne(ctx context.Context, conn transaction.Conn, id int64) (*UserRole, error)
Find(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) (int64, []*UserRole, error)
}
... ...