作者 郑周

Merge remote-tracking branch 'origin/dev' into dev

... ... @@ -2,11 +2,11 @@ package main
import (
"flag"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db"
"net/http"
"strings"
"github.com/zeromicro/go-zero/core/logx"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
"github.com/golang-jwt/jwt/v4/request"
... ... @@ -53,7 +53,9 @@ func main() {
ctx := svc.NewServiceContext(c)
handler.RegisterHandlers(server, ctx)
db.Migrate(ctx.DB)
if c.Migrate {
db.Migrate(ctx.DB)
}
logx.Infof("Starting server at %s:%d... \n", c.Host, c.Port)
server.Start()
... ...
... ... @@ -100,17 +100,20 @@ type(
UserItem {
Id int64 `json:"id,omitempty"` // 用户ID
CompanyId int64 `json:"companyId,omitempty"` // 公司ID
DepartmentId int64 `json:"departmentId,omitempty"` // 部门ID
Roles []int64 `json:"roleId,omitempty"` // 角色
CompanyName string `json:"companyName,omitempty"` // 公司名称
//DepartmentId int64 `json:"departmentId,omitempty"` // 部门ID
//Roles []int64 `json:"roleId,omitempty"` // 角色
Flag int `json:"flag,omitempty"` // 标识 1:管理员 2:普通用户 (有绑定角色是管理员)
Name string `json:"name,omitempty"` // 名称
Avatar string `json:"avatar,omitempty"` // 头像
Phone string `json:"phone,omitempty"` // 手机号 唯一
Position string `json:"position,omitempty"` // 职位
Enable int `json:"enable,omitempty"` // 启用状态 1:启用 2:禁用
AuditStatus int `json:"auditStatus,omitempty"` // 审核状态 0:待审核 1:审核通过 2:拒绝
AuditStatus *int `json:"auditStatus,omitempty"` // 审核状态 0:待审核 1:审核通过 2:拒绝
Follower []int64 `json:"followers,omitempty"` // 关注我的人 (冗余)
Following []int64 `json:"following,omitempty"` // 我关注的人 (冗余)
Departments []int64 `json:"departments,omitempty"` // 所属部门
AccountFrom string `json:"accountFrom,omitempty"` // 账号来源 后台新增、扫码注册
}
Department struct {
Id int64 `json:"id,omitempty"` // 部门ID
... ...
... ... @@ -2,6 +2,7 @@ Name: discuss
Host: 0.0.0.0
Port: 8081
Verbose: true
Migrate: false
Log:
#Mode: file
... ...
... ... @@ -12,4 +12,5 @@ type Config struct {
Redis redis.RedisConf `json:",optional"`
SystemAuth config.Auth
MiniAuth config.Auth
Migrate bool `json:",optional,default=true"`
}
... ...
... ... @@ -3,8 +3,10 @@ package user
import (
"context"
"errors"
"fmt"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/transaction"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/tool"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
... ... @@ -32,6 +34,7 @@ func (l *MiniUserApplyJoinCompanyLogic) MiniUserApplyJoinCompany(req *types.Mini
conn = l.svcCtx.DefaultDBConn()
company *domain.Company
user *domain.User
name = fmt.Sprintf("用户%s", tool.Krand(6, tool.KC_RAND_KIND_NUM))
)
if company, err = l.svcCtx.CompanyRepository.FindOneByCode(l.ctx, conn, req.Code); err != nil {
return nil, xerr.NewErrMsgErr("公司不存在", err)
... ... @@ -52,14 +55,25 @@ func (l *MiniUserApplyJoinCompanyLogic) MiniUserApplyJoinCompany(req *types.Mini
return nil, xerr.NewErrMsgErr("公司已申请", err)
}
}
queryOptions := domain.NewQueryOptions().
WithOffsetLimit(1, 1).
MustWithKV("phone", req.Phone).
MustWithKV("auditStatus", []int{domain.UserAuditStatusWait, domain.UserAuditStatusPassed})
if _, users, _ := l.svcCtx.UserRepository.Find(l.ctx, conn, queryOptions); len(users) >= 1 {
name = users[0].Name
}
if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error {
user = &domain.User{
CompanyId: company.Id,
Phone: req.Phone,
Enable: domain.UserEnable,
Roles: make([]int64, 0),
Follower: make([]int64, 0),
Following: make([]int64, 0),
CompanyId: company.Id,
Phone: req.Phone,
Name: name,
Flag: domain.UserCommon,
Enable: domain.UserEnable,
Roles: make([]int64, 0),
Follower: make([]int64, 0),
Following: make([]int64, 0),
AccountFrom: domain.AccountFromQr,
Departments: make([]int64, 0),
}
if user, err = l.svcCtx.UserRepository.Insert(ctx, conn, user); err != nil {
return err
... ...
... ... @@ -2,8 +2,12 @@ package user
import (
"context"
"github.com/samber/lo"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/contextdata"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr"
"github.com/zeromicro/go-zero/core/logx"
)
... ... @@ -23,5 +27,39 @@ func NewMiniUserAuditListLogic(ctx context.Context, svcCtx *svc.ServiceContext)
}
func (l *MiniUserAuditListLogic) MiniUserAuditList(req *types.UserSearchRequest) (resp *types.UserSearchResponse, err error) {
var (
userToken = contextdata.GetUserTokenFromCtx(l.ctx)
users []*domain.User
conn = l.svcCtx.DefaultDBConn()
total int64
companyMap = make(map[int64]*domain.Company)
)
queryOptions := domain.NewQueryOptions().
WithOffsetLimit(req.Page, req.Size).
MustWithKV("companyId", userToken.CompanyId)
if req.AuditFlag != nil && *req.AuditFlag >= 0 {
queryOptions.MustWithKV("auditStatus", []int{*req.AuditFlag})
}
if total, users, err = l.svcCtx.UserRepository.Find(l.ctx, conn, queryOptions); err != nil {
return nil, xerr.NewErrMsgErr("查询审核列表失败", err)
}
resp = &types.UserSearchResponse{Total: total}
lo.ForEach(users, func(item *domain.User, index int) {
company, _ := domain.LazyLoad(companyMap, l.ctx, conn, item.CompanyId, l.svcCtx.CompanyRepository.FindOne)
resp.List = append(resp.List, NewUserItemSimple(item, company))
})
return
}
func NewUserItemSimple(user *domain.User, company *domain.Company) *types.UserItem {
return &types.UserItem{
Id: user.Id,
Name: user.Name,
CompanyName: lo.Ternary(company != nil, company.Name, ""),
Avatar: user.Avatar,
Phone: user.Phone,
Position: user.Position,
AuditStatus: &user.AuditStatus,
}
}
... ...
... ... @@ -187,19 +187,20 @@ type MiniUserDepartmentUsersResponse struct {
}
type UserItem struct {
Id int64 `json:"id,omitempty"` // 用户ID
CompanyId int64 `json:"companyId,omitempty"` // 公司ID
DepartmentId int64 `json:"departmentId,omitempty"` // 部门ID
Roles []int64 `json:"roleId,omitempty"` // 角色
Flag int `json:"flag,omitempty"` // 标识 1:管理员 2:普通用户 (有绑定角色是管理员)
Name string `json:"name,omitempty"` // 名称
Avatar string `json:"avatar,omitempty"` // 头像
Phone string `json:"phone,omitempty"` // 手机号 唯一
Position string `json:"position,omitempty"` // 职位
Enable int `json:"enable,omitempty"` // 启用状态 1:启用 2:禁用
AuditStatus int `json:"auditStatus,omitempty"` // 审核状态 0:待审核 1:审核通过 2:拒绝
Follower []int64 `json:"followers,omitempty"` // 关注我的人 (冗余)
Following []int64 `json:"following,omitempty"` // 我关注的人 (冗余)
Id int64 `json:"id,omitempty"` // 用户ID
CompanyId int64 `json:"companyId,omitempty"` // 公司ID
CompanyName string `json:"companyName,omitempty"` // 公司名称
Flag int `json:"flag,omitempty"` // 标识 1:管理员 2:普通用户 (有绑定角色是管理员)
Name string `json:"name,omitempty"` // 名称
Avatar string `json:"avatar,omitempty"` // 头像
Phone string `json:"phone,omitempty"` // 手机号 唯一
Position string `json:"position,omitempty"` // 职位
Enable int `json:"enable,omitempty"` // 启用状态 1:启用 2:禁用
AuditStatus *int `json:"auditStatus,omitempty"` // 审核状态 0:待审核 1:审核通过 2:拒绝
Follower []int64 `json:"followers,omitempty"` // 关注我的人 (冗余)
Following []int64 `json:"following,omitempty"` // 我关注的人 (冗余)
Departments []int64 `json:"departments,omitempty"` // 所属部门
AccountFrom string `json:"accountFrom,omitempty"` // 账号来源 后台新增、扫码注册
}
type Department struct {
... ...
... ... @@ -9,19 +9,20 @@ import (
)
type User struct {
Id int64 // 唯一标识
CompanyId int64 // 公司ID
DepartmentId int64 // 部门ID
Roles []int64 `gorm:"type:jsonb;serializer:json"` // 角色
Flag int // 标识 1:管理员 2:普通用户 (有绑定角色是管理员)
Name string // 名称
Avatar string // 头像
Phone string // 手机号 唯一
Position string // 职位
Enable int // 启用状态 1:启用 2:禁用
AuditStatus int // 审核状态 0:待审核 1:审核通过 2:拒绝
Follower []int64 `gorm:"type:jsonb;serializer:json"` // 关注我的人 (冗余)
Following []int64 `gorm:"type:jsonb;serializer:json"` // 我关注的人 (冗余)
Id int64 // 唯一标识
CompanyId int64 // 公司ID
Roles []int64 `gorm:"type:jsonb;serializer:json"` // 角色
Flag int // 标识 1:管理员 2:普通用户 (有绑定角色是管理员)
Name string // 名称
Avatar string // 头像
Phone string // 手机号 唯一
Position string // 职位
Enable int // 启用状态 1:启用 2:禁用
AuditStatus int // 审核状态 0:待审核 1:审核通过 2:拒绝
Follower []int64 `gorm:"type:jsonb;serializer:json"` // 关注我的人 (冗余)
Following []int64 `gorm:"type:jsonb;serializer:json"` // 我关注的人 (冗余)
Departments []int64 `gorm:"type:jsonb;serializer:json"` // 所属部门
AccountFrom string // 账号来源 后台新增、扫码注册
CreatedAt int64
UpdatedAt int64
... ...
... ... @@ -142,6 +142,9 @@ func (repository *UserRepository) Find(ctx context.Context, conn transaction.Con
)
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["ids"]; ok {
tx.Where("id in (?)", v)
}
... ...
package domain
import (
"context"
"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/transaction"
"reflect"
)
... ... @@ -62,3 +64,15 @@ func (options QueryOptions) WithFindOnly() QueryOptions {
options["findOnly"] = true
return options
}
func LazyLoad[K comparable, T any](source map[K]T, ctx context.Context, conn transaction.Conn, k K, load func(context.Context, transaction.Conn, K) (T, error)) (T, error) {
if v, ok := source[k]; ok {
return v, nil
}
if v, err := load(ctx, conn, k); err != nil {
return v, err
} else {
source[k] = v
return v, nil
}
}
... ...
... ... @@ -21,11 +21,12 @@ type User struct {
AuditStatus int `json:"auditStatus,omitempty"` // 审核状态 0:待审核 1:审核通过 2:拒绝
Follower []int64 `json:"followers,omitempty"` // 关注我的人 (冗余)
Following []int64 `json:"following,omitempty"` // 我关注的人 (冗余)
CreatedAt int64 `json:"createdAt,omitempty"`
UpdatedAt int64 `json:"updatedAt,omitempty"`
DeletedAt int64 `json:"deletedAt,omitempty"`
Version int `json:"version,omitempty"`
Departments []int64 `json:"departments,omitempty"` // 所属部门
AccountFrom string `json:"accountFrom,omitempty"` // 账号来源 后台新增、扫码注册
CreatedAt int64 `json:"createdAt,omitempty"`
UpdatedAt int64 `json:"updatedAt,omitempty"`
DeletedAt int64 `json:"deletedAt,omitempty"`
Version int `json:"version,omitempty"`
}
type UserRepository interface {
... ... @@ -63,6 +64,16 @@ const (
UserDisable = 2
)
const (
AccountFromQr = "扫码注册"
AccountFromMr = "后台新增"
)
const (
UserAdmin = 1
UserCommon = 2
)
func (m *User) Audit(status int) error {
if !lo.Contains([]int{UserAuditStatusWait, UserAuditStatusPassed, UserAuditStatusReject}, status) {
return fmt.Errorf("unknown status:%d", status)
... ...