createProductLogic.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. package product
  2. import (
  3. "context"
  4. "crypto/rand"
  5. "encoding/hex"
  6. "fmt"
  7. "time"
  8. "perms-system-server/internal/consts"
  9. authHelper "perms-system-server/internal/logic/auth"
  10. productModel "perms-system-server/internal/model/product"
  11. "perms-system-server/internal/model/productmember"
  12. userModel "perms-system-server/internal/model/user"
  13. "perms-system-server/internal/response"
  14. "perms-system-server/internal/svc"
  15. "perms-system-server/internal/types"
  16. "github.com/zeromicro/go-zero/core/logx"
  17. "github.com/zeromicro/go-zero/core/stores/sqlx"
  18. "golang.org/x/crypto/bcrypt"
  19. )
  20. type CreateProductLogic struct {
  21. logx.Logger
  22. ctx context.Context
  23. svcCtx *svc.ServiceContext
  24. }
  25. func NewCreateProductLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CreateProductLogic {
  26. return &CreateProductLogic{
  27. Logger: logx.WithContext(ctx),
  28. ctx: ctx,
  29. svcCtx: svcCtx,
  30. }
  31. }
  32. func (l *CreateProductLogic) CreateProduct(req *types.CreateProductReq) (resp *types.CreateProductResp, err error) {
  33. if err := authHelper.RequireSuperAdmin(l.ctx); err != nil {
  34. return nil, err
  35. }
  36. if len(req.Code) > 64 {
  37. return nil, response.ErrBadRequest("产品编码长度不能超过64个字符")
  38. }
  39. if len(req.Name) > 64 {
  40. return nil, response.ErrBadRequest("产品名称长度不能超过64个字符")
  41. }
  42. if len(req.Remark) > 255 {
  43. return nil, response.ErrBadRequest("备注长度不能超过255个字符")
  44. }
  45. _, findErr := l.svcCtx.SysProductModel.FindOneByCode(l.ctx, req.Code)
  46. if findErr == nil {
  47. return nil, response.ErrConflict("产品编码已存在")
  48. }
  49. appKey, err := generateRandomHex(32)
  50. if err != nil {
  51. return nil, err
  52. }
  53. appSecret, err := generateRandomHex(64)
  54. if err != nil {
  55. return nil, err
  56. }
  57. now := time.Now().Unix()
  58. adminUsername := fmt.Sprintf("admin_%s", req.Code)
  59. adminPassword, err := generateRandomHex(8)
  60. if err != nil {
  61. return nil, err
  62. }
  63. hashedPwd, err := bcrypt.GenerateFromPassword([]byte(adminPassword), bcrypt.DefaultCost)
  64. if err != nil {
  65. return nil, err
  66. }
  67. var productId int64
  68. err = l.svcCtx.SysProductModel.TransactCtx(l.ctx, func(ctx context.Context, session sqlx.Session) error {
  69. result, err := l.svcCtx.SysProductModel.InsertWithTx(ctx, session, &productModel.SysProduct{
  70. Code: req.Code,
  71. Name: req.Name,
  72. AppKey: appKey,
  73. AppSecret: appSecret,
  74. Remark: req.Remark,
  75. Status: consts.StatusEnabled,
  76. CreateTime: now,
  77. UpdateTime: now,
  78. })
  79. if err != nil {
  80. return err
  81. }
  82. productId, _ = result.LastInsertId()
  83. userResult, err := l.svcCtx.SysUserModel.InsertWithTx(ctx, session, &userModel.SysUser{
  84. Username: adminUsername,
  85. Password: string(hashedPwd),
  86. Nickname: fmt.Sprintf("%s管理员", req.Name),
  87. IsSuperAdmin: consts.IsSuperAdminNo,
  88. MustChangePassword: consts.MustChangePasswordYes,
  89. Status: consts.StatusEnabled,
  90. CreateTime: now,
  91. UpdateTime: now,
  92. })
  93. if err != nil {
  94. return err
  95. }
  96. userId, _ := userResult.LastInsertId()
  97. _, err = l.svcCtx.SysProductMemberModel.InsertWithTx(ctx, session, &productmember.SysProductMember{
  98. ProductCode: req.Code,
  99. UserId: userId,
  100. MemberType: consts.MemberTypeAdmin,
  101. Status: consts.StatusEnabled,
  102. CreateTime: now,
  103. UpdateTime: now,
  104. })
  105. return err
  106. })
  107. if err != nil {
  108. return nil, err
  109. }
  110. return &types.CreateProductResp{
  111. Id: productId,
  112. Code: req.Code,
  113. AppKey: appKey,
  114. AppSecret: appSecret,
  115. AdminUser: adminUsername,
  116. AdminPassword: adminPassword,
  117. }, nil
  118. }
  119. func generateRandomHex(length int) (string, error) {
  120. b := make([]byte, length)
  121. if _, err := rand.Read(b); err != nil {
  122. return "", fmt.Errorf("generate random bytes failed: %w", err)
  123. }
  124. return hex.EncodeToString(b)[:length], nil
  125. }