作者 yangfu

合并分支 'chenaq' 到 'dev'

Chenaq



查看合并请求 !14
... ... @@ -13,6 +13,7 @@ require (
github.com/google/go-querystring v1.1.0 // indirect
github.com/gorilla/websocket v1.4.2 // indirect
github.com/imkira/go-interpol v1.1.0 // indirect
github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 // indirect
github.com/linmadan/egglib-go v0.0.0-20210313060205-8b5e456b11f7
github.com/mattn/go-colorable v0.1.8 // indirect
github.com/moul/http2curl v1.0.0 // indirect
... ...
... ... @@ -132,6 +132,8 @@ github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 h1:uC1QfSlInpQF+M0ao65imhwqKnz3Q2z/d8PWZRMQvDM=
github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k=
github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/klauspost/compress v1.11.8 h1:difgzQsp5mdAz9v8lm3P/I+EpDKMU/6uTMw1y1FObuo=
... ...
... ... @@ -39,6 +39,7 @@ func CreateReturnGoodsService(options map[string]interface{}) (service.ReturnGoo
}
func CreateUserCreateService(options map[string]interface{}) (service.UserCreateService, error) {
var transactionContext *pgTransaction.TransactionContext
if value, ok := options["transactionContext"]; ok {
transactionContext = value.(*pgTransaction.TransactionContext)
... ... @@ -53,3 +54,11 @@ func CreatePhoneAuthService(options map[string]interface{}) (service.PhoneAuthSe
}
return domainService.NewPhoneAuthenticationService(transactionContext)
}
func CreateAddUserService(options map[string]interface{}) (service.AddUserService, error) {
var transactionContext *pgTransaction.TransactionContext
if value, ok := options["transactionContext"]; ok {
transactionContext = value.(*pgTransaction.TransactionContext)
}
return domainService.NewAddUserService(transactionContext)
}
... ...
package command
import (
"fmt"
"github.com/beego/beego/v2/core/validation"
)
type ConvertUserStatusCommand struct {
// 用户id
UserId int64 `json:"userId,omitempty"`
// 状态 1正常 2禁用
Status int64 `json:"status" valid:"Required"`
}
func (convertUserStatusCommand *ConvertUserStatusCommand) Valid(validation *validation.Validation) {
//validation.SetError("CustomValid", "未实现的自定义认证")
}
func (convertUserStatusCommand *ConvertUserStatusCommand) ValidateCommand() error {
valid := validation.Validation{}
b, err := valid.Valid(convertUserStatusCommand)
if err != nil {
return err
}
if !b {
for _, validErr := range valid.Errors {
return fmt.Errorf("%s %s", validErr.Key, validErr.Message)
}
}
return nil
}
... ...
package command
import (
"fmt"
"github.com/beego/beego/v2/core/validation"
"gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/domain"
)
type CreateUserCommand struct {
//按位与 1.高管 001 右第0位高管 ; 2.合伙人 010 右第1位合伙人 ;3.高管,合伙人 011;
// 1.高管 2.合伙人 3高管,合伙人 4:游客
UserType int `json:"userType" valid:"Required"`
// 管理员类型 1.超级管理员 10:企业管理员 100:普通用户
AdminType int `json:"adminType" valid:"Required"`
// 状态 1正常 2禁用
Status int64 `json:"status" valid:"Required"`
//用户账号(手机号)
UserAccount string `json:"userAccount" valid:"Required"`
// 业务员
Salesmans []*domain.Salesman `json:"salesmans,omitempty"`
// 用户信息
UserInfo *domain.UserInfo `json:"userInfo,omitempty"`
//合伙人信息
PartnerInfo *domain.PartnerInfo `json:"partnerInfo"`
//// 合伙人类型
PartnerCategorys []*domain.PartnerCategory `json:"partnerCategorys,omitempty"`
// 可查看合伙人列表
AccessPartners []int64 `json:"accessPartners,omitempty"`
}
func (createUserCommand *CreateUserCommand) Valid(validation *validation.Validation) {
//validation.SetError("CustomValid", "未实现的自定义认证")
}
func (createUserCommand *CreateUserCommand) ValidateCommand() error {
valid := validation.Validation{}
b, err := valid.Valid(createUserCommand)
if err != nil {
return err
}
if !b {
for _, validErr := range valid.Errors {
return fmt.Errorf("%s %s", validErr.Key, validErr.Message)
}
}
return nil
}
... ...
package command
import (
"fmt"
"github.com/beego/beego/v2/core/validation"
)
type RemoveUserCommand struct {
// 用户id
UserId int64 `json:"userId" valid:"Required"`
}
func (removeUserCommand *RemoveUserCommand) Valid(validation *validation.Validation) {
//validation.SetError("CustomValid", "未实现的自定义认证")
}
func (removeUserCommand *RemoveUserCommand) ValidateCommand() error {
valid := validation.Validation{}
b, err := valid.Valid(removeUserCommand)
if err != nil {
return err
}
if !b {
for _, validErr := range valid.Errors {
return fmt.Errorf("%s %s", validErr.Key, validErr.Message)
}
}
return nil
}
... ...
package command
import (
"fmt"
"github.com/beego/beego/v2/core/validation"
)
type SetPermissionCommand struct {
// 用户id
UserId int64 `json:"userId" valid:"Required"`
// 权限编码列表
Permissons []int `json:"permissons,omitempty"`
}
func (setPermissionCommand *SetPermissionCommand) Valid(validation *validation.Validation) {
//validation.SetError("CustomValid", "未实现的自定义认证")
}
func (setPermissionCommand *SetPermissionCommand) ValidateCommand() error {
valid := validation.Validation{}
b, err := valid.Valid(setPermissionCommand)
if err != nil {
return err
}
if !b {
for _, validErr := range valid.Errors {
return fmt.Errorf("%s %s", validErr.Key, validErr.Message)
}
}
return nil
}
... ...
package command
import (
"fmt"
"github.com/beego/beego/v2/core/validation"
"gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/domain"
)
type UpdateUserCommand struct {
// 用户id
UserId int64 `json:"userId" valid:"Required"`
// 1.高管 2.合伙人 4:游客
UserType int `json:"userType,omitempty"`
// 管理员类型 1.超级管理员 10:企业管理员 100:普通用户
AdminType int `json:"adminType,omitempty"`
// 状态 1正常 2禁用
Status int64 `json:"status,omitempty"`
// 是否是公司负责人
UserInfo *domain.UserInfo `json:"userInfo,omitempty"`
// 业务员
Salesmans []*domain.Salesman `json:"salesmans,omitempty"`
// 合伙人类型
PartnerCategorys []*domain.PartnerCategory `json:"partnerCategorys,omitempty"`
// 可查看合伙人列表
AccessPartners []int64 `json:"accessPartners,omitempty"`
}
func (updateUserCommand *UpdateUserCommand) Valid(validation *validation.Validation) {
//validation.SetError("CustomValid", "未实现的自定义认证")
}
func (updateUserCommand *UpdateUserCommand) ValidateCommand() error {
valid := validation.Validation{}
b, err := valid.Valid(updateUserCommand)
if err != nil {
return err
}
if !b {
for _, validErr := range valid.Errors {
return fmt.Errorf("%s %s", validErr.Key, validErr.Message)
}
}
return nil
}
... ...
package query
import (
"fmt"
"github.com/beego/beego/v2/core/validation"
)
type GetUserQuery struct {
// 用户id
UserId int64 `json:"userId" valid:"Required"`
}
func (getUserQuery *GetUserQuery) Valid(validation *validation.Validation) {
//validation.SetError("CustomValid", "未实现的自定义认证")
}
func (getUserQuery *GetUserQuery) ValidateQuery() error {
valid := validation.Validation{}
b, err := valid.Valid(getUserQuery)
if err != nil {
return err
}
if !b {
for _, validErr := range valid.Errors {
return fmt.Errorf("%s %s", validErr.Key, validErr.Message)
}
}
return nil
}
... ...
package query
import (
"fmt"
"github.com/beego/beego/v2/core/validation"
)
type ListUserQuery struct {
// 查询偏离量
Offset int `json:"offset"`
// 查询限制
Limit int `json:"limit" valid:"Required"`
}
func (listUserQuery *ListUserQuery) Valid(validation *validation.Validation) {
//validation.SetError("CustomValid", "未实现的自定义认证")
}
func (listUserQuery *ListUserQuery) ValidateQuery() error {
valid := validation.Validation{}
b, err := valid.Valid(listUserQuery)
if err != nil {
return err
}
if !b {
for _, validErr := range valid.Errors {
return fmt.Errorf("%s %s", validErr.Key, validErr.Message)
}
}
return nil
}
... ...
package service
import (
"fmt"
"github.com/linmadan/egglib-go/core/application"
"github.com/linmadan/egglib-go/utils/tool_funs"
"gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/application/factory"
"gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/application/user/command"
"gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/application/user/query"
"gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/domain"
"gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/domain/service"
)
// 用户管理服务
type UserService struct {
}
// 用户状态转换(禁用、启用)
func (userService *UserService) ConvertUserStatus(convertUserStatusCommand *command.ConvertUserStatusCommand) (interface{}, error) {
if err := convertUserStatusCommand.ValidateCommand(); err != nil {
return nil, application.ThrowError(application.ARG_ERROR, err.Error())
}
transactionContext, err := factory.CreateTransactionContext(nil)
if err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
if err := transactionContext.StartTransaction(); err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
defer func() {
transactionContext.RollbackTransaction()
}()
var userRepository domain.UserRepository
if value, err := factory.CreateUserRepository(map[string]interface{}{
"transactionContext": transactionContext,
}); err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
} else {
userRepository = value
}
user, err := userRepository.FindOne(map[string]interface{}{"userId": convertUserStatusCommand.UserId})
if err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
}
if user == nil {
return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%s", string(convertUserStatusCommand.UserId)))
}
if err := user.CovertUserStatus(convertUserStatusCommand.Status); err != nil {
return nil, application.ThrowError(application.BUSINESS_ERROR, err.Error())
}
if _, err := userRepository.Save(user); err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
}
if err := transactionContext.CommitTransaction(); err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
return nil, nil
}
// 创建
func (userService *UserService) CreateUser(createUserCommand *command.CreateUserCommand) (interface{}, error) {
if err := createUserCommand.ValidateCommand(); err != nil {
return nil, application.ThrowError(application.ARG_ERROR, err.Error())
}
transactionContext, err := factory.CreateTransactionContext(nil)
if err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
if err := transactionContext.StartTransaction(); err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
defer func() {
transactionContext.RollbackTransaction()
}()
newUser := &domain.User{
UserType: createUserCommand.UserType,
AdminType: createUserCommand.AdminType,
UserAccount: createUserCommand.UserAccount,
Status: createUserCommand.Status,
UserInfo: createUserCommand.UserInfo,
PartnerInfo: createUserCommand.PartnerInfo,
AccessPartners: createUserCommand.AccessPartners,
}
var addUserService service.UserCreateService
if value, err := factory.CreateUserCreateService(map[string]interface{}{
"transactionContext": transactionContext,
}); err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
} else {
addUserService = value
}
if user, err := addUserService.CreateUser(0, newUser); err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
} else {
if err := transactionContext.CommitTransaction(); err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
return user, nil
}
}
// 返回
func (userService *UserService) GetUser(getUserQuery *query.GetUserQuery) (interface{}, error) {
if err := getUserQuery.ValidateQuery(); err != nil {
return nil, application.ThrowError(application.ARG_ERROR, err.Error())
}
transactionContext, err := factory.CreateTransactionContext(nil)
if err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
if err := transactionContext.StartTransaction(); err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
defer func() {
transactionContext.RollbackTransaction()
}()
var userRepository domain.UserRepository
if value, err := factory.CreateUserRepository(map[string]interface{}{
"transactionContext": transactionContext,
}); err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
} else {
userRepository = value
}
user, err := userRepository.FindOne(map[string]interface{}{"userId": getUserQuery.UserId})
if err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
}
if user == nil {
return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%s", string(getUserQuery.UserId)))
} else {
if err := transactionContext.CommitTransaction(); err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
return user, nil
}
}
// 返回列表
func (userService *UserService) ListUser(listUserQuery *query.ListUserQuery) (interface{}, error) {
if err := listUserQuery.ValidateQuery(); err != nil {
return nil, application.ThrowError(application.ARG_ERROR, err.Error())
}
transactionContext, err := factory.CreateTransactionContext(nil)
if err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
if err := transactionContext.StartTransaction(); err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
defer func() {
transactionContext.RollbackTransaction()
}()
var userRepository domain.UserRepository
if value, err := factory.CreateUserRepository(map[string]interface{}{
"transactionContext": transactionContext,
}); err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
} else {
userRepository = value
}
if count, users, err := userRepository.Find(tool_funs.SimpleStructToMap(listUserQuery)); err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
} else {
if err := transactionContext.CommitTransaction(); err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
return map[string]interface{}{
"count": count,
"users": users,
}, nil
}
}
// 移除
func (userService *UserService) RemoveUser(removeUserCommand *command.RemoveUserCommand) (interface{}, error) {
if err := removeUserCommand.ValidateCommand(); err != nil {
return nil, application.ThrowError(application.ARG_ERROR, err.Error())
}
transactionContext, err := factory.CreateTransactionContext(nil)
if err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
if err := transactionContext.StartTransaction(); err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
defer func() {
transactionContext.RollbackTransaction()
}()
var userRepository domain.UserRepository
if value, err := factory.CreateUserRepository(map[string]interface{}{
"transactionContext": transactionContext,
}); err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
} else {
userRepository = value
}
user, err := userRepository.FindOne(map[string]interface{}{"userId": removeUserCommand.UserId})
if err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
}
if user == nil {
return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%s", string(removeUserCommand.UserId)))
}
if user, err := userRepository.Remove(user); err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
} else {
if err := transactionContext.CommitTransaction(); err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
return user, nil
}
}
// 设置权限
func (userService *UserService) SetPermission(setPermissionCommand *command.SetPermissionCommand) (interface{}, error) {
if err := setPermissionCommand.ValidateCommand(); err != nil {
return nil, application.ThrowError(application.ARG_ERROR, err.Error())
}
transactionContext, err := factory.CreateTransactionContext(nil)
if err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
if err := transactionContext.StartTransaction(); err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
defer func() {
transactionContext.RollbackTransaction()
}()
var userRepository domain.UserRepository
if value, err := factory.CreateUserRepository(map[string]interface{}{
"transactionContext": transactionContext,
}); err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
} else {
userRepository = value
}
user, err := userRepository.FindOne(map[string]interface{}{"userId": setPermissionCommand.UserId})
if err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
}
if user == nil {
return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%s", string(setPermissionCommand.UserId)))
}
if err := user.SetPermission(setPermissionCommand.Permissons); err != nil {
return nil, application.ThrowError(application.BUSINESS_ERROR, err.Error())
}
if _, err := userRepository.Save(user); err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
}
if err := transactionContext.CommitTransaction(); err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
return nil, nil
}
// 更新
func (userService *UserService) UpdateUser(updateUserCommand *command.UpdateUserCommand) (interface{}, error) {
if err := updateUserCommand.ValidateCommand(); err != nil {
return nil, application.ThrowError(application.ARG_ERROR, err.Error())
}
transactionContext, err := factory.CreateTransactionContext(nil)
if err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
if err := transactionContext.StartTransaction(); err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
defer func() {
transactionContext.RollbackTransaction()
}()
var userRepository domain.UserRepository
if value, err := factory.CreateUserRepository(map[string]interface{}{
"transactionContext": transactionContext,
}); err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
} else {
userRepository = value
}
user, err := userRepository.FindOne(map[string]interface{}{"userId": updateUserCommand.UserId})
if err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
}
if user == nil {
return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%s", string(updateUserCommand.UserId)))
}
if err := user.Update(tool_funs.SimpleStructToMap(updateUserCommand)); err != nil {
return nil, application.ThrowError(application.BUSINESS_ERROR, err.Error())
}
if user, err := userRepository.Save(user); err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
} else {
if err := transactionContext.CommitTransaction(); err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
return user, nil
}
}
func NewUserService(options map[string]interface{}) *UserService {
newUserService := &UserService{}
return newUserService
}
... ...
package service
import (
coreDomain "github.com/linmadan/egglib-go/core/domain"
"gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/domain"
)
type AddUserService interface {
coreDomain.DomainEventPublisher
AddUser(*domain.User) (*domain.User, error)
}
... ...
package domain
import "time"
import (
"fmt"
"time"
)
const (
StatusEnable int64 = 1
StatusDisable int64 = 2
StatusEnable int64 = 1 //启用
StatusDisable int64 = 2 //禁用
)
// 管理员类型 1.超级管理员 10:企业管理员 100:普通用户
const (
SuperAdministrator = 1
EnterpriseAdministrator = 10
NormalUser = 100
SuperAdministrator = 1 //超级管理员
EnterpriseAdministrator = 10 //企业管理员
NormalUser = 100 //普通用户
)
// UserType
const (
Manager = 1
Partner = 2
Guest = 3
Manager = 1 //高管
Partner = 2 //合伙人
Guest = 3 //游客
)
// 用户实体
... ... @@ -25,6 +30,8 @@ type User struct {
UserId int64 `json:"userId"`
// 1.高管 2.合伙人 4:游客
UserType int `json:"userType"`
//用户账号(手机号)
UserAccount string `json:"userAccount"`
// 用户权限
Permissions []int `json:"permissions"`
// 公司Id
... ... @@ -61,66 +68,84 @@ func (user *User) Identify() interface{} {
return user.UserId
}
func (user *User) Update(data map[string]interface{}) error {
if userId, ok := data["userId"]; ok {
user.UserId = userId.(int64)
func (user *User) SetPermission(permissions []int) error {
user.Permissions = permissions
return nil
}
func (user *User) CovertUserStatus(status int64) error {
if !(status == StatusEnable || status == StatusDisable) {
return fmt.Errorf("status options value (%v,%v) , invalid %v", StatusEnable, StatusDisable, status)
}
user.Status = status
return nil
}
func (user *User) Update(data map[string]interface{}) error {
if userType, ok := data["userType"]; ok {
user.UserType = userType.(int)
}
if permissions, ok := data["permissions"]; ok {
user.Permissions = permissions.([]int)
}
if companyId, ok := data["companyId"]; ok {
user.CompanyId = companyId.(int64)
}
if isPrincipal, ok := data["isPrincipal"]; ok {
user.UserInfo.IsPrincipal = isPrincipal.(bool)
}
if uid, ok := data["uid"]; ok {
user.UserInfo.Uid = uid.(int64)
if userInfo, ok := data["userInfo"]; ok {
user.UserInfo = userInfo.(*UserInfo)
}
if userAccount, ok := data["userAccount"]; ok {
user.UserInfo.UserAccount = userAccount.(string)
if partnerAccount, ok := data["partnerAccount"]; ok {
user.PartnerInfo.PartnerAccount = partnerAccount.(string)
}
if userAvatarUrl, ok := data["userAvatarUrl"]; ok {
user.UserInfo.UserAvatarUrl = userAvatarUrl.(string)
if partnerName, ok := data["partnerName"]; ok {
user.PartnerInfo.PartnerName = partnerName.(string)
}
if userName, ok := data["userName"]; ok {
user.UserInfo.UserName = userName.(string)
if regionName, ok := data["regionName"]; ok {
user.PartnerInfo.RegionInfo.RegionName = regionName.(string)
}
if email, ok := data["email"]; ok {
user.UserInfo.Email = email.(string)
if status, ok := data["status"]; ok {
user.PartnerInfo.Status = status.(int64)
}
if gender, ok := data["gender"]; ok {
user.UserInfo.Gender = gender.(int)
user.UpdateAt = time.Now()
return nil
}
//添加/编辑高管
func CheckAdminUserType(dm *User) (*User, error) {
if dm.UserInfo.Uid == int64(0) {
return nil, fmt.Errorf("高管的uid不能为空")
}
if entryTime, ok := data["entryTime"]; ok {
user.UserInfo.EntryTime = entryTime.(time.Time)
if dm.UserInfo.Email == "" {
return nil, fmt.Errorf("高管的Email不能为空")
}
if extension, ok := data["extension"]; ok {
user.UserInfo.Extension = extension.(string)
if dm.UserInfo.EntryTime.IsZero() {
return nil, fmt.Errorf("高管的入职时间不能为空")
}
if workplace, ok := data["workplace"]; ok {
user.UserInfo.Workplace = workplace.(string)
if dm.UserInfo.Workplace == "" {
return nil, fmt.Errorf("高管的工作地不能为空")
}
if privateNumber, ok := data["privateNumber"]; ok {
user.UserInfo.PrivateNumber = privateNumber.(string)
if dm.UserInfo.JobNumber == "" {
return nil, fmt.Errorf("高管的工号不能为空")
}
if jobNumber, ok := data["jobNumber"]; ok {
user.UserInfo.JobNumber = jobNumber.(string)
return dm, nil
}
//添加/编辑合伙人
type PartnerUserType struct{}
func CheckPartnerUserType(dm *User) (*User, error) {
if dm.PartnerInfo.Status == 0 {
return nil, fmt.Errorf("合伙人的状态不能为空")
}
if partnerAccount, ok := data["partnerAccount"]; ok {
user.PartnerInfo.PartnerAccount = partnerAccount.(string)
if dm.PartnerInfo.PartnerAccount == "" {
return nil, fmt.Errorf("合伙人账号不能为空")
}
if partnerName, ok := data["partnerName"]; ok {
user.PartnerInfo.PartnerName = partnerName.(string)
if dm.PartnerInfo.PartnerName == "" {
return nil, fmt.Errorf("合伙人姓名不能为空")
}
if regionName, ok := data["regionName"]; ok {
user.PartnerInfo.RegionInfo.RegionName = regionName.(string)
if len(dm.PartnerInfo.PartnerCategorys) == 0 {
return nil, fmt.Errorf("合伙人类别不能为空")
}
if status, ok := data["status"]; ok {
user.PartnerInfo.Status = status.(int64)
if len(dm.PartnerInfo.Salesmans) == 0 {
return nil, fmt.Errorf("合伙人查看合伙人账号不能为空")
}
return nil
return dm, nil
}
... ...
package domainService
import (
"fmt"
coreDomain "github.com/linmadan/egglib-go/core/domain"
"gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/domain"
"gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/infrastructure/repository"
pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
)
type AddUserService struct {
coreDomain.BaseEventPublisher
transactionContext *pgTransaction.TransactionContext
}
func (service *AddUserService) AddUser(user *domain.User) (*domain.User, error) {
if user.UserType&1 > 0 {
if _, err := domain.CheckAdminUserType(user); err != nil {
return nil, err
}
}
if user.UserType&2 > 0 {
if _, err := domain.CheckPartnerUserType(user); err != nil {
return nil, err
}
}
var userRepository domain.UserRepository
if repository, err := repository.NewUserRepository(service.transactionContext); err != nil {
return nil, err
} else {
userRepository = repository
}
count, existUser, err := userRepository.Find(map[string]interface{}{
"userAccount": user.UserAccount,
"companyId": user.CompanyId,
})
if count != 0 {
if existUser[0].UserType^user.UserType == 0 {
return nil, fmt.Errorf("用户已存在")
}
if existUser[0].UserType&1 > 0 {
user.UserInfo = existUser[0].UserInfo
}
if existUser[0].UserType&2 > 0 {
user.PartnerInfo = existUser[0].PartnerInfo
}
user.UserType = existUser[0].UserType + user.UserType
}
user, err = userRepository.Save(user)
if err != nil {
return nil, err
}
return user, nil
}
func NewAddUserService(transactionContext *pgTransaction.TransactionContext) (*AddUserService, error) {
if transactionContext == nil {
return nil, fmt.Errorf("transactionContext参数不能为nil")
} else {
return &AddUserService{
transactionContext: transactionContext,
}, nil
}
}
... ...
... ... @@ -13,6 +13,8 @@ type User struct {
UserType int
// 用户权限
Permissions []int `pg:",array"`
//用户账号(手机号)
UserAccount string
// 公司Id
CompanyId int64
// 用户信息
... ...
... ... @@ -30,6 +30,7 @@ func (repository *UserRepository) Save(user *domain.User) (*domain.User, error)
"user_type",
"permissions",
"company_id",
"user_account",
"user_info",
"partner_info",
"status",
... ... @@ -42,7 +43,7 @@ func (repository *UserRepository) Save(user *domain.User) (*domain.User, error)
insertFieldsSnippet := sqlbuilder.SqlFieldsSnippet(sqlBuildFields)
insertPlaceHoldersSnippet := sqlbuilder.SqlPlaceHoldersSnippet(sqlBuildFields)
returningFieldsSnippet := sqlbuilder.SqlFieldsSnippet(sqlBuildFields)
updateFields := sqlbuilder.RemoveSqlFields(sqlBuildFields, "user_id")
updateFields := sqlbuilder.RemoveSqlFields(sqlBuildFields, "user_id", "delete_at", "create_at")
updateFieldsSnippet := sqlbuilder.SqlUpdateFieldsSnippet(updateFields)
tx := repository.transactionContext.PgTx
if user.Identify() == nil {
... ... @@ -58,6 +59,7 @@ func (repository *UserRepository) Save(user *domain.User) (*domain.User, error)
&user.UserType,
pg.Array(&user.Permissions),
&user.CompanyId,
&user.UserAccount,
&user.UserInfo,
&user.PartnerInfo,
&user.Status,
... ... @@ -72,6 +74,7 @@ func (repository *UserRepository) Save(user *domain.User) (*domain.User, error)
user.UserType,
pg.Array(user.Permissions),
user.CompanyId,
user.UserAccount,
user.UserInfo,
user.PartnerInfo,
user.Status,
... ... @@ -90,6 +93,7 @@ func (repository *UserRepository) Save(user *domain.User) (*domain.User, error)
&user.UserType,
pg.Array(&user.Permissions),
&user.CompanyId,
&user.UserAccount,
&user.UserInfo,
&user.PartnerInfo,
&user.Status,
... ... @@ -100,18 +104,16 @@ func (repository *UserRepository) Save(user *domain.User) (*domain.User, error)
&user.DeleteAt,
),
fmt.Sprintf("UPDATE users SET %s WHERE user_id=? RETURNING %s", updateFieldsSnippet, returningFieldsSnippet),
user.UserId,
user.UserType,
pg.Array(user.Permissions),
user.CompanyId,
user.UserAccount,
user.UserInfo,
user.PartnerInfo,
user.Status,
user.AdminType,
pg.Array(user.AccessPartners),
user.CreateAt,
user.UpdateAt,
user.DeleteAt,
user.Identify(),
); err != nil {
return user, err
... ...
package controllers
import (
"github.com/linmadan/egglib-go/web/beego"
"gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/application/user/command"
"gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/application/user/query"
"gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/application/user/service"
)
type UserController struct {
beego.BaseController
}
func (controller *UserController) CreateUser() {
userService := service.NewUserService(nil)
createUserCommand := &command.CreateUserCommand{}
controller.Unmarshal(createUserCommand)
data, err := userService.CreateUser(createUserCommand)
controller.Response(data, err)
}
func (controller *UserController) UpdateUser() {
userService := service.NewUserService(nil)
updateUserCommand := &command.UpdateUserCommand{}
controller.Unmarshal(updateUserCommand)
userId, _ := controller.GetInt64(":userId")
updateUserCommand.UserId = userId
data, err := userService.UpdateUser(updateUserCommand)
controller.Response(data, err)
}
func (controller *UserController) GetUser() {
userService := service.NewUserService(nil)
getUserQuery := &query.GetUserQuery{}
userId, _ := controller.GetInt64(":userId")
getUserQuery.UserId = userId
data, err := userService.GetUser(getUserQuery)
controller.Response(data, err)
}
func (controller *UserController) RemoveUser() {
userService := service.NewUserService(nil)
removeUserCommand := &command.RemoveUserCommand{}
controller.Unmarshal(removeUserCommand)
userId, _ := controller.GetInt64(":userId")
removeUserCommand.UserId = userId
data, err := userService.RemoveUser(removeUserCommand)
controller.Response(data, err)
}
func (controller *UserController) ListUser() {
userService := service.NewUserService(nil)
listUserQuery := &query.ListUserQuery{}
offset, _ := controller.GetInt("offset")
listUserQuery.Offset = offset
limit, _ := controller.GetInt("limit")
listUserQuery.Limit = limit
data, err := userService.ListUser(listUserQuery)
controller.Response(data, err)
}
func (controller *UserController) ConvertUserStatus() {
userService := service.NewUserService(nil)
convertUserStatusCommand := &command.ConvertUserStatusCommand{}
controller.Unmarshal(convertUserStatusCommand)
data, err := userService.ConvertUserStatus(convertUserStatusCommand)
controller.Response(data, err)
}
func (controller *UserController) SetPermission() {
userService := service.NewUserService(nil)
setPermissionCommand := &command.SetPermissionCommand{}
controller.Unmarshal(setPermissionCommand)
data, err := userService.SetPermission(setPermissionCommand)
controller.Response(data, err)
}
... ...
package routers
import (
"github.com/beego/beego/v2/server/web"
"gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/port/beego/controllers"
)
func init() {
web.Router("/users/", &controllers.UserController{}, "Post:CreateUser")
web.Router("/users/:userId", &controllers.UserController{}, "Put:UpdateUser")
web.Router("/users/:userId", &controllers.UserController{}, "Get:GetUser")
web.Router("/users/:userId", &controllers.UserController{}, "Delete:RemoveUser")
web.Router("/users/", &controllers.UserController{}, "Get:ListUser")
web.Router("/users/convert-user-status", &controllers.UserController{}, "Post:ConvertUserStatus")
web.Router("/users/set-permission", &controllers.UserController{}, "Post:SetPermission")
}
... ...
package user
import (
"github.com/go-pg/pg/v10"
"net/http"
"github.com/gavv/httpexpect"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
pG "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/infrastructure/pg"
)
var _ = Describe("用户状态转换(禁用、启用)", func() {
var userId int64
BeforeEach(func() {
_, err := pG.DB.QueryOne(
pg.Scan(&userId),
"INSERT INTO users (user_id, user_type, permissions, company_id, user_info, partner_info, status, admin_type) VALUES (?, ?, ?, ?, ?, ?, ?, ?) RETURNING user_id",
1, 1, pg.Array([]int{}), 1, `{}`, `{}`, 1, 1)
Expect(err).NotTo(HaveOccurred())
})
Describe("用户状态转换(禁用、启用)", func() {
Context("", func() {
It("", func() {
httpExpect := httpexpect.New(GinkgoT(), server.URL)
body := map[string]interface{}{
"userId": 1,
"status": 2,
}
httpExpect.POST("/users/convert-user-status").
WithJSON(body).
Expect().
Status(http.StatusOK).
JSON().
Object().
ContainsKey("code").ValueEqual("code", 0).
ContainsKey("msg").ValueEqual("msg", "ok")
//ContainsKey("data").Value("data").Object()
})
})
})
AfterEach(func() {
_, err := pG.DB.Exec("DELETE FROM users WHERE true")
Expect(err).NotTo(HaveOccurred())
})
})
... ...
package user
import (
pG "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/infrastructure/pg"
"net/http"
"github.com/gavv/httpexpect"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
var _ = Describe("创建", func() {
Describe("提交数据创建", func() {
Context("提交正确的新用户实体数据", func() {
It("返回用户实体数据", func() {
httpExpect := httpexpect.New(GinkgoT(), server.URL)
body := map[string]interface{}{
"userType": 1,
"adminType": 1,
"status": 1,
"userAccount": "13800000000",
"userInfo": map[string]interface{}{
"isPrincipal": false,
"uid": 5678664411598702,
"userAccount": "13800000000",
"userAvatarUrl": "www.baidu.com",
"userName": "彭于晏",
"email": "gfghf@qq.com",
"gender": 1,
"extension": "1",
"workplace": "2",
"privateNumber": "3",
"jobNumber": "4",
},
"partnerCategorys": "[]",
"accessPartners": "[]",
}
httpExpect.POST("/users/").
WithJSON(body).
Expect().
Status(http.StatusOK).
JSON().
Object().
ContainsKey("code").ValueEqual("code", 0).
ContainsKey("msg").ValueEqual("msg", "ok").
ContainsKey("data").Value("data").Object().
ContainsKey("userId").ValueNotEqual("userId", BeZero())
})
})
})
AfterEach(func() {
_, err := pG.DB.Exec("DELETE FROM users WHERE true")
_, err = pG.DB.Exec("DELETE FROM user_auth WHERE true")
Expect(err).NotTo(HaveOccurred())
})
})
... ...
package user
import (
"github.com/go-pg/pg/v10"
"net/http"
"github.com/gavv/httpexpect"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
pG "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/infrastructure/pg"
)
var _ = Describe("返回", func() {
var userId int64
BeforeEach(func() {
_, err := pG.DB.QueryOne(
pg.Scan(&userId),
"INSERT INTO users (user_id, user_type, permissions, company_id, user_info, partner_info, status, admin_type) VALUES (?, ?, ?, ?, ?, ?, ?, ?) RETURNING user_id",
1, 1, pg.Array([]int{}), 1, `{}`, `{}`, 1, 1)
Expect(err).NotTo(HaveOccurred())
})
Describe("根据userId参数返回用户实体", func() {
Context("传入有效的userId", func() {
It("返回用户实体数据", func() {
httpExpect := httpexpect.New(GinkgoT(), server.URL)
httpExpect.GET("/users/1").
Expect().
Status(http.StatusOK).
JSON().
Object().
ContainsKey("code").ValueEqual("code", 0).
ContainsKey("msg").ValueEqual("msg", "ok").
ContainsKey("data").Value("data").Object()
})
})
})
AfterEach(func() {
_, err := pG.DB.Exec("DELETE FROM users WHERE true")
Expect(err).NotTo(HaveOccurred())
})
})
... ...
package user
import (
"github.com/go-pg/pg/v10"
"net/http"
"github.com/gavv/httpexpect"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
pG "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/infrastructure/pg"
)
var _ = Describe("返回列表", func() {
var userId int64
BeforeEach(func() {
_, err := pG.DB.QueryOne(
pg.Scan(&userId),
"INSERT INTO users (user_id, user_type, permissions, company_id, user_info, partner_info, status, admin_type) VALUES (?, ?, ?, ?, ?, ?, ?, ?) RETURNING user_id",
1, 1, pg.Array([]int{}), 1, `{}`, `{}`, 1, 1)
Expect(err).NotTo(HaveOccurred())
})
Describe("根据参数返回用户实体列表", func() {
Context("传入有效的参数", func() {
It("返回用户实体数据列表", func() {
httpExpect := httpexpect.New(GinkgoT(), server.URL)
httpExpect.GET("/users/").
WithQuery("offset", 0).
WithQuery("limit", 10).
Expect().
Status(http.StatusOK).
JSON().
Object().
ContainsKey("code").ValueEqual("code", 0).
ContainsKey("msg").ValueEqual("msg", "ok").
ContainsKey("data").Value("data").Object().
ContainsKey("count").ValueEqual("count", 1).
ContainsKey("users").Value("users").Array()
})
})
})
AfterEach(func() {
_, err := pG.DB.Exec("DELETE FROM users WHERE true")
Expect(err).NotTo(HaveOccurred())
})
})
... ...
package user
import (
"github.com/go-pg/pg/v10"
"net/http"
"github.com/gavv/httpexpect"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
pG "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/infrastructure/pg"
)
var _ = Describe("移除", func() {
var userId int64
BeforeEach(func() {
_, err := pG.DB.QueryOne(
pg.Scan(&userId),
"INSERT INTO users (user_id, user_type, permissions, company_id, user_info, partner_info, status, admin_type) VALUES (?, ?, ?, ?, ?, ?, ?, ?) RETURNING user_id",
1, 1, pg.Array([]int{}), 1, `{}`, `{}`, 1, 1)
Expect(err).NotTo(HaveOccurred())
})
Describe("根据参数移除", func() {
Context("传入有效的userId", func() {
It("返回被移除用户实体的数据", func() {
httpExpect := httpexpect.New(GinkgoT(), server.URL)
httpExpect.DELETE("/users/1").
Expect().
Status(http.StatusOK).
JSON().
Object().
ContainsKey("code").ValueEqual("code", 0).
ContainsKey("msg").ValueEqual("msg", "ok").
ContainsKey("data").Value("data").Object()
})
})
})
AfterEach(func() {
_, err := pG.DB.Exec("DELETE FROM users WHERE true")
Expect(err).NotTo(HaveOccurred())
})
})
... ...
package user
import (
"github.com/go-pg/pg/v10"
"net/http"
"github.com/gavv/httpexpect"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
pG "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/infrastructure/pg"
)
var _ = Describe("设置权限", func() {
return
var userId int64
BeforeEach(func() {
_, err := pG.DB.QueryOne(
pg.Scan(&userId),
"INSERT INTO users (user_id, user_type, permissions, company_id, user_info, partner_info, status, admin_type) VALUES (?, ?, ?, ?, ?, ?, ?, ?) RETURNING user_id",
1, 1, pg.Array([]int{}), 1, `{}`, `{}`, 1, 1)
Expect(err).NotTo(HaveOccurred())
})
Describe("设置权限", func() {
Context("", func() {
It("", func() {
httpExpect := httpexpect.New(GinkgoT(), server.URL)
body := map[string]interface{}{
"userId": 1,
"permissons": []int{1, 2, 3},
}
httpExpect.POST("/users/setPermission").
WithJSON(body).
Expect().
Status(http.StatusOK).
JSON().
Object().
ContainsKey("code").ValueEqual("code", 0).
ContainsKey("msg").ValueEqual("msg", "ok").
ContainsKey("data").Value("data").Object()
})
})
})
AfterEach(func() {
_, err := pG.DB.Exec("DELETE FROM users WHERE true")
Expect(err).NotTo(HaveOccurred())
})
})
... ...
package user
import (
"github.com/go-pg/pg/v10"
"net/http"
"github.com/gavv/httpexpect"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
pG "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/infrastructure/pg"
)
var _ = Describe("更新", func() {
var userId int64
BeforeEach(func() {
_, err := pG.DB.QueryOne(
pg.Scan(&userId),
"INSERT INTO users (user_id, user_type, permissions, company_id, user_info, partner_info, status, admin_type) VALUES (?, ?, ?, ?, ?, ?, ?, ?) RETURNING user_id",
1, 1, pg.Array([]int{}), 1, `{}`, `{}`, 1, 1)
Expect(err).NotTo(HaveOccurred())
})
Describe("提交数据更新", func() {
Context("提交正确的用户实体数据", func() {
It("返回更新后的用户实体数据", func() {
httpExpect := httpexpect.New(GinkgoT(), server.URL)
body := map[string]interface{}{
"userInfo": map[string]interface{}{
"isPrincipal": false,
"uid": 5678664411598702,
"userAccount": "13800000000",
"userAvatarUrl": "www.baidu.com",
"userName": "彭于晏01",
"email": "gfghf@qq.com",
"gender": 1,
"extension": "1",
"workplace": "2",
"privateNumber": "3",
"jobNumber": "4",
},
}
httpExpect.PUT("/users/1").
WithJSON(body).
Expect().
Status(http.StatusOK).
JSON().
Object().
ContainsKey("code").ValueEqual("code", 0).
ContainsKey("msg").ValueEqual("msg", "ok").
ContainsKey("data").Value("data").Object().
ContainsKey("userId").ValueEqual("userId", userId)
})
})
})
AfterEach(func() {
_, err := pG.DB.Exec("DELETE FROM users WHERE true")
Expect(err).NotTo(HaveOccurred())
})
})
... ...
package user
import (
"net/http"
"net/http/httptest"
"testing"
"github.com/beego/beego/v2/server/web"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
_ "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/infrastructure/pg"
_ "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/port/beego"
)
func TestUser(t *testing.T) {
RegisterFailHandler(Fail)
RunSpecs(t, "Beego Port User Correlations Test Case Suite")
}
var handler http.Handler
var server *httptest.Server
var _ = BeforeSuite(func() {
handler = web.BeeApp.Handlers
server = httptest.NewServer(handler)
})
var _ = AfterSuite(func() {
server.Close()
})
... ...