diff --git a/cmd/erp.go b/cmd/erp.go index e5a9640..6a26b08 100644 --- a/cmd/erp.go +++ b/cmd/erp.go @@ -5,12 +5,12 @@ import ( "fmt" "log" - "management/internal/config" db "management/internal/db/sqlc" "management/internal/erpserver" "management/internal/erpserver/biz" "management/internal/erpserver/handler" "management/internal/pkg/binding" + "management/internal/pkg/config" "management/internal/pkg/logger" "management/internal/pkg/middleware" "management/internal/pkg/redis" diff --git a/internal/db/sqlc/store.go b/internal/db/sqlc/store.go index 1e15602..b6daa48 100644 --- a/internal/db/sqlc/store.go +++ b/internal/db/sqlc/store.go @@ -5,7 +5,7 @@ import ( "errors" "fmt" - "management/internal/config" + "management/internal/pkg/config" "github.com/jackc/pgconn" "github.com/jackc/pgx/v5" diff --git a/internal/erpserver/biz/v1/system/category.go b/internal/erpserver/biz/v1/system/category.go index 571644e..090d56c 100644 --- a/internal/erpserver/biz/v1/system/category.go +++ b/internal/erpserver/biz/v1/system/category.go @@ -4,20 +4,27 @@ import ( "context" "encoding/json" "errors" + "fmt" "strconv" + "strings" "time" "management/internal/db/model/dto" db "management/internal/db/sqlc" + "management/internal/erpserver/model/form" "management/internal/erpserver/model/view" + "management/internal/pkg/convertor" "management/internal/pkg/know" "management/internal/pkg/redis" "management/internal/pkg/tpl/html" + + "github.com/google/uuid" + "github.com/jackc/pgx/v5/pgtype" ) type CategoryBiz interface { - Create(ctx context.Context, arg *db.CreateCategoryParams) (*db.Category, error) - Update(ctx context.Context, arg *db.UpdateCategoryParams) (*db.Category, error) + Create(ctx context.Context, req *form.Category) error + Update(ctx context.Context, req *form.Category) error All(ctx context.Context) ([]*db.Category, error) List(ctx context.Context, q dto.SearchDto) ([]*db.Category, int64, error) Get(ctx context.Context, id int32) (*db.Category, error) @@ -97,12 +104,117 @@ func (b *categoryBiz) Get(ctx context.Context, id int32) (*db.Category, error) { return b.store.GetCategory(ctx, id) } -func (b *categoryBiz) Create(ctx context.Context, arg *db.CreateCategoryParams) (*db.Category, error) { - return b.store.CreateCategory(ctx, arg) +func (b *categoryBiz) Create(ctx context.Context, req *form.Category) error { + if len(req.Icon) > 0 && !strings.HasPrefix(req.Icon, "/") { + req.Icon = "/" + req.Icon + } + + if len(req.Letter) == 0 { + req.Letter = uuid.New().String() + } + + parent := &db.Category{ + ID: 0, + ParentID: 0, + ParentPath: ",0,", + } + if *req.ParentID > 0 { + var err error + parent, err = b.store.GetCategory(ctx, *req.ParentID) + if err != nil { + return errors.New("父级节点错误") + } + } + + var order int32 = 6666 + if *req.Sort > 0 { + order = *req.Sort + } + + arg := &db.CreateCategoryParams{ + Name: req.Name, + Icon: req.Icon, + Description: req.Description, + Letter: req.Letter, + ParentID: parent.ID, + ParentPath: convertor.HandleParentPath(fmt.Sprintf("%s,%d,", parent.ParentPath, parent.ID)), + Status: *req.Status, + Sort: order, + } + _, err := b.store.CreateCategory(ctx, arg) + if err != nil { + if db.IsUniqueViolation(err) { + return errors.New("类别已存在") + } + return err + } + return nil } -func (b *categoryBiz) Update(ctx context.Context, arg *db.UpdateCategoryParams) (*db.Category, error) { - return b.store.UpdateCategory(ctx, arg) +func (b *categoryBiz) Update(ctx context.Context, req *form.Category) error { + if len(req.Icon) > 0 && !strings.HasPrefix(req.Icon, "/") { + req.Icon = "/" + req.Icon + } + + if len(req.Letter) == 0 { + req.Letter = uuid.New().String() + } + + parent := &db.Category{ + ID: 0, + ParentID: 0, + ParentPath: ",0,", + } + if *req.ParentID > 0 { + var err error + parent, err = b.store.GetCategory(ctx, *req.ParentID) + if err != nil { + return errors.New("父级节点错误") + } + } + + var order int32 = 6666 + if *req.Sort > 0 { + order = *req.Sort + } + + arg := &db.UpdateCategoryParams{ + ID: *req.ID, + Name: pgtype.Text{ + String: req.Name, + Valid: true, + }, + Icon: pgtype.Text{ + String: req.Icon, + Valid: len(req.Icon) > 0, + }, + Description: pgtype.Text{ + String: req.Description, + Valid: len(req.Description) > 0, + }, + Letter: pgtype.Text{ + String: req.Letter, + Valid: len(req.Letter) > 0, + }, + ParentID: pgtype.Int4{ + Int32: *req.ParentID, + Valid: true, + }, + ParentPath: pgtype.Text{ + String: convertor.HandleParentPath(fmt.Sprintf("%s,%d,", parent.ParentPath, parent.ID)), + Valid: true, + }, + Sort: pgtype.Int4{ + Int32: order, + Valid: true, + }, + Status: pgtype.Int2{ + Int16: *req.Status, + Valid: true, + }, + } + _, err := b.store.UpdateCategory(ctx, arg) + return err } func (b *categoryBiz) Refresh(ctx context.Context) ([]*db.Category, error) { diff --git a/internal/erpserver/handler/common/captcha.go b/internal/erpserver/handler/common/captcha.go index 2e60d26..43f2893 100644 --- a/internal/erpserver/handler/common/captcha.go +++ b/internal/erpserver/handler/common/captcha.go @@ -3,8 +3,8 @@ package common import ( "net/http" - "management/internal/config" commonv1 "management/internal/erpserver/biz/v1/common" + "management/internal/pkg/config" "management/internal/pkg/tpl" ) diff --git a/internal/erpserver/handler/common/common.go b/internal/erpserver/handler/common/common.go index 2f047a0..8be16ee 100644 --- a/internal/erpserver/handler/common/common.go +++ b/internal/erpserver/handler/common/common.go @@ -1,8 +1,8 @@ package common import ( - "management/internal/config" commonv1 "management/internal/erpserver/biz/v1/common" + "management/internal/pkg/config" "management/internal/pkg/tpl" ) diff --git a/internal/erpserver/handler/handler.go b/internal/erpserver/handler/handler.go index 873cf55..525ca96 100644 --- a/internal/erpserver/handler/handler.go +++ b/internal/erpserver/handler/handler.go @@ -1,7 +1,6 @@ package handler import ( - "management/internal/config" "management/internal/erpserver/biz" "management/internal/erpserver/handler/budget" "management/internal/erpserver/handler/common" @@ -10,6 +9,7 @@ import ( "management/internal/erpserver/handler/income" "management/internal/erpserver/handler/project" "management/internal/erpserver/handler/system" + "management/internal/pkg/config" "management/internal/pkg/middleware" "management/internal/pkg/redis" "management/internal/pkg/session" diff --git a/internal/erpserver/handler/system/category.go b/internal/erpserver/handler/system/category.go index ab363c2..15fede1 100644 --- a/internal/erpserver/handler/system/category.go +++ b/internal/erpserver/handler/system/category.go @@ -1,18 +1,15 @@ package system import ( - "fmt" "net/http" - "strings" "management/internal/db/model/dto" db "management/internal/db/sqlc" "management/internal/erpserver/biz" + "management/internal/erpserver/model/form" + "management/internal/pkg/binding" "management/internal/pkg/convertor" "management/internal/pkg/tpl" - - "github.com/google/uuid" - "github.com/jackc/pgx/v5/pgtype" ) type CategoryHandler interface { @@ -98,98 +95,25 @@ func (h *categoryHandler) Edit(w http.ResponseWriter, r *http.Request) { } func (h *categoryHandler) Save(w http.ResponseWriter, r *http.Request) { - id := convertor.ConvertInt(r.PostFormValue("ID"), 0) - parentID := convertor.ConvertInt[int32](r.PostFormValue("ParentID"), 0) - name := r.PostFormValue("Name") - icon := r.PostFormValue("File") - if len(icon) > 0 && !strings.HasPrefix(icon, "/") { - icon = "/" + icon - } - description := r.PostFormValue("Description") - letter := r.PostFormValue("Letter") - if len(letter) == 0 { - letter = uuid.New().String() - } - sort := convertor.ConvertInt[int32](r.PostFormValue("Sort"), 6666) - status := convertor.ConvertInt[int16](r.PostFormValue("Status"), 9999) - - ctx := r.Context() - var parent *db.Category - if parentID > 0 { - var err error - parent, err = h.biz.SystemV1().CategoryBiz().Get(ctx, parentID) - if err != nil { - h.render.JSONERR(w, "父级节点错误") - return - } + var req form.Category + if err := binding.Form.Bind(r, &req); err != nil { + h.render.JSONERR(w, binding.ValidatorErrors(err)) + return } - path := fmt.Sprintf("%s,%d,", parent.ParentPath, parent.ID) - path = strings.ReplaceAll(path, ",,", ",") - if id == 0 { - arg := &db.CreateCategoryParams{ - Name: name, - Icon: icon, - Description: description, - Letter: letter, - ParentID: parentID, - ParentPath: path, - Status: status, - Sort: sort, - } - _, err := h.biz.SystemV1().CategoryBiz().Create(ctx, arg) + if *req.ID == 0 { + err := h.biz.SystemV1().CategoryBiz().Create(r.Context(), &req) if err != nil { - if db.IsUniqueViolation(err) { - h.render.JSONERR(w, "名称已存在") - return - } h.render.JSONERR(w, err.Error()) return } - h.render.JSONOK(w, "添加成功") } else { - arg := &db.UpdateCategoryParams{ - ID: int32(id), - Name: pgtype.Text{ - String: name, - Valid: true, - }, - Icon: pgtype.Text{ - String: icon, - Valid: len(icon) > 0, - }, - Description: pgtype.Text{ - String: description, - Valid: len(description) > 0, - }, - Letter: pgtype.Text{ - String: letter, - Valid: len(letter) > 0, - }, - ParentID: pgtype.Int4{ - Int32: parentID, - Valid: true, - }, - ParentPath: pgtype.Text{ - String: path, - Valid: true, - }, - Sort: pgtype.Int4{ - Int32: sort, - Valid: true, - }, - Status: pgtype.Int2{ - Int16: status, - Valid: true, - }, - } - _, err := h.biz.SystemV1().CategoryBiz().Update(ctx, arg) + err := h.biz.SystemV1().CategoryBiz().Update(r.Context(), &req) if err != nil { h.render.JSONERR(w, err.Error()) return } - h.render.JSONOK(w, "更新成功") } } diff --git a/internal/erpserver/model/form/category.go b/internal/erpserver/model/form/category.go new file mode 100644 index 0000000..0c718d2 --- /dev/null +++ b/internal/erpserver/model/form/category.go @@ -0,0 +1,12 @@ +package form + +type Category struct { + ID *int32 `form:"id" binding:"required"` + Name string `form:"name" binding:"required"` + ParentID *int32 `form:"parent_id" binding:"required"` + Icon string `form:"File"` + Description string `form:"description"` + Letter string `form:"letter"` + Sort *int32 `form:"sort"` + Status *int16 `form:"status" binding:"required"` +} diff --git a/internal/config/app.go b/internal/pkg/config/app.go similarity index 100% rename from internal/config/app.go rename to internal/pkg/config/app.go diff --git a/internal/config/applet.go b/internal/pkg/config/applet.go similarity index 100% rename from internal/config/applet.go rename to internal/pkg/config/applet.go diff --git a/internal/config/captcha.go b/internal/pkg/config/captcha.go similarity index 100% rename from internal/config/captcha.go rename to internal/pkg/config/captcha.go diff --git a/internal/config/config.go b/internal/pkg/config/config.go similarity index 100% rename from internal/config/config.go rename to internal/pkg/config/config.go diff --git a/internal/config/cors.go b/internal/pkg/config/cors.go similarity index 100% rename from internal/config/cors.go rename to internal/pkg/config/cors.go diff --git a/internal/config/db.go b/internal/pkg/config/db.go similarity index 100% rename from internal/config/db.go rename to internal/pkg/config/db.go diff --git a/internal/config/jwt.go b/internal/pkg/config/jwt.go similarity index 100% rename from internal/config/jwt.go rename to internal/pkg/config/jwt.go diff --git a/internal/config/redis.go b/internal/pkg/config/redis.go similarity index 100% rename from internal/config/redis.go rename to internal/pkg/config/redis.go diff --git a/internal/config/smb.go b/internal/pkg/config/smb.go similarity index 100% rename from internal/config/smb.go rename to internal/pkg/config/smb.go diff --git a/internal/config/upload.go b/internal/pkg/config/upload.go similarity index 100% rename from internal/config/upload.go rename to internal/pkg/config/upload.go diff --git a/internal/pkg/logger/log.go b/internal/pkg/logger/log.go index bf5add1..ef8b8ec 100644 --- a/internal/pkg/logger/log.go +++ b/internal/pkg/logger/log.go @@ -4,7 +4,7 @@ import ( "os" "time" - "management/internal/config" + "management/internal/pkg/config" "github.com/natefinch/lumberjack" "github.com/rs/zerolog" diff --git a/internal/pkg/rand/rand.go b/internal/pkg/rand/rand.go index 21efef3..2482f02 100644 --- a/internal/pkg/rand/rand.go +++ b/internal/pkg/rand/rand.go @@ -44,7 +44,7 @@ func RandomString(n int) string { var sb strings.Builder k := len(alphabet) - for i := 0; i < n; i++ { + for range n { c := alphabet[randv2.IntN(k)] sb.WriteByte(c) } diff --git a/internal/pkg/redis/redis.go b/internal/pkg/redis/redis.go index 57b02d7..23205be 100644 --- a/internal/pkg/redis/redis.go +++ b/internal/pkg/redis/redis.go @@ -8,7 +8,7 @@ import ( "fmt" "time" - "management/internal/config" + "management/internal/pkg/config" "github.com/redis/go-redis/v9" ) diff --git a/internal/pkg/smb/smb.go b/internal/pkg/smb/smb.go index 3f5f88c..f12daea 100644 --- a/internal/pkg/smb/smb.go +++ b/internal/pkg/smb/smb.go @@ -4,7 +4,7 @@ import ( "io/fs" "net" - "management/internal/config" + "management/internal/pkg/config" "github.com/hirochachacha/go-smb2" ) diff --git a/internal/pkg/token/paseto_maker.go b/internal/pkg/token/paseto_maker.go index 2e8f35e..2ae494b 100644 --- a/internal/pkg/token/paseto_maker.go +++ b/internal/pkg/token/paseto_maker.go @@ -4,7 +4,7 @@ import ( "fmt" "time" - "management/internal/config" + "management/internal/pkg/config" "github.com/aead/chacha20poly1305" "github.com/o1egl/paseto" diff --git a/management b/management index 3d01a5a..a4f0ec3 100755 Binary files a/management and b/management differ