diff --git a/example/main.go b/example/main.go deleted file mode 100644 index 47c2182..0000000 --- a/example/main.go +++ /dev/null @@ -1,190 +0,0 @@ -package main - -import ( - "errors" - "fmt" - "sync" - "time" -) - -const ( - // 位数分配 (Bit Allocation) - timestampBits uint8 = 41 - businessIDBits uint8 = 3 - workerIDBits uint8 = 10 - sequenceBits uint8 = 9 // 64 - 1 (sign) - 41 (timestamp) - 3 (business) - 10 (worker) = 9 - - // 最大值 (Max Values) - maxBusinessID int64 = -1 ^ (-1 << businessIDBits) // 2^3 - 1 = 7 - maxWorkerID int64 = -1 ^ (-1 << workerIDBits) // 2^10 - 1 = 1023 - maxSequence int64 = -1 ^ (-1 << sequenceBits) // 2^9 - 1 = 511 - - // 位移量 (Bit Shifts) - workerIDShift = sequenceBits // 9 - businessIDShift = sequenceBits + workerIDBits // 9 + 10 = 19 - timestampShift = sequenceBits + workerIDBits + businessIDBits // 9 + 10 + 3 = 22 - - // 自定义纪元 (Epoch), 单位毫秒. (可以设置为项目上线的日期) - // 例如: 2025-01-01 00:00:00 UTC - customEpoch int64 = 1735689600000 // time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC).UnixMilli() -) - -// ErrClockMovedBackwards indicates that the system clock moved backwards. -var ErrClockMovedBackwards = errors.New("clock moved backwards, refusing to generate id") - -// ErrInvalidBusinessID indicates the business ID is out of range. -var ErrInvalidBusinessID = fmt.Errorf("business ID must be between 0 and %d", maxBusinessID) - -// ErrInvalidWorkerID indicates the worker ID is out of range. -var ErrInvalidWorkerID = fmt.Errorf("worker ID must be between 0 and %d", maxWorkerID) - -// Generator is the core ID generator structure. -type Generator struct { - mu sync.Mutex - lastTimestamp int64 - workerID int64 - businessID int64 - sequence int64 -} - -// NewGenerator creates a new ID generator instance. -func NewGenerator(workerID, businessID int64) (*Generator, error) { - if workerID < 0 || workerID > maxWorkerID { - return nil, ErrInvalidWorkerID - } - if businessID < 0 || businessID > maxBusinessID { - return nil, ErrInvalidBusinessID - } - - return &Generator{ - workerID: workerID, - businessID: businessID, - }, nil -} - -// currentTimeMillis returns the current time in milliseconds since the custom epoch. -func currentTimeMillis() int64 { - return time.Now().UnixMilli() - customEpoch -} - -// tilNextMillis waits until the next millisecond. -func tilNextMillis(lastTimestamp int64) int64 { - timestamp := currentTimeMillis() - for timestamp <= lastTimestamp { - // Spin wait is generally discouraged, but for millisecond precision, - // time.Sleep(1 * time.Millisecond) might overshoot too much. - // A brief sleep can reduce CPU churn if clock skew is minor. - time.Sleep(time.Microsecond * 100) // Sleep briefly - timestamp = currentTimeMillis() - } - return timestamp -} - -// NextID generates the next unique ID. -func (g *Generator) NextID() (int64, error) { - g.mu.Lock() - defer g.mu.Unlock() - - timestamp := currentTimeMillis() - - // 时钟回拨检查 (Clock moved backwards check) - if timestamp < g.lastTimestamp { - // 可以选择: - // 1. 返回错误 (Recommended for safety) - return 0, fmt.Errorf("%w: current: %d, last: %d", ErrClockMovedBackwards, timestamp, g.lastTimestamp) - // 2. 等待时钟追上 (Potentially blocks, less safe if clock jump is large) - // timestamp = tilNextMillis(g.lastTimestamp) - } - - // 同一毫秒内 (Within the same millisecond) - if timestamp == g.lastTimestamp { - g.sequence = (g.sequence + 1) & maxSequence - // 序列号溢出,等待下一毫秒 (Sequence overflow, wait for next millisecond) - if g.sequence == 0 { - timestamp = tilNextMillis(g.lastTimestamp) - // 等待后重置序列号 (Reset sequence after waiting) - // g.sequence = 0 // Reset is implicit as it overflowed to 0 - } - } else { - // 新的毫秒,重置序列号 (New millisecond, reset sequence) - g.sequence = 0 - } - - // 更新最后时间戳 (Update last timestamp) - g.lastTimestamp = timestamp - - // 组合 ID (Assemble the ID) - id := (timestamp << timestampShift) | // 时间戳左移 - (g.businessID << businessIDShift) | // 业务ID左移 - (g.workerID << workerIDShift) | // Worker ID左移 - g.sequence // 序列号 - - return id, nil -} - -// ParseID decomposes an ID into its components. Useful for debugging or analysis. -func ParseID(id int64) (timestampMsSinceEpoch int64, businessID int64, workerID int64, sequence int64, genTimeUTC time.Time) { - timestampMsSinceEpoch = (id >> timestampShift) & (int64(-1) ^ (int64(-1) << timestampBits)) - businessID = (id >> businessIDShift) & maxBusinessID - workerID = (id >> workerIDShift) & maxWorkerID - sequence = id & maxSequence - - // Calculate generation time in UTC - genTimeUTC = time.UnixMilli(timestampMsSinceEpoch + customEpoch).UTC() - - return -} - -func main() { - // !!! IMPORTANT: Worker ID and Business ID MUST be unique per instance/purpose !!! - // These should typically come from configuration. - workerID := int64(1) // Example: Get from config/env - businessIDOrder := int64(1) // Example: 1 for Order - businessIDPayment := int64(2) // Example: 2 for Payment - - // Create generators for different business types - orderGenerator, err := NewGenerator(workerID, businessIDOrder) - if err != nil { - panic(err) - } - - paymentGenerator, err := NewGenerator(workerID, businessIDPayment) - if err != nil { - panic(err) - } - - // Generate some IDs - for i := 0; i < 5; i++ { - orderID, err := orderGenerator.NextID() - if err != nil { - fmt.Println("Error generating order ID:", err) - time.Sleep(1 * time.Millisecond) // Wait before retry on clock issues - continue - } - fmt.Printf("Generated Order ID: %d\n", orderID) - // You can optionally add a human-readable prefix when displaying/logging - fmt.Printf(" Readable Order ID: ORD-%d\n", orderID) - - // Parse it back (for demonstration) - ts, biz, wkr, seq, genTime := ParseID(orderID) - fmt.Printf(" Parsed: Timestamp=%d, Business=%d, Worker=%d, Sequence=%d, GenTime=%s\n", ts, biz, wkr, seq, genTime.Format(time.RFC3339Nano)) - - paymentID, err := paymentGenerator.NextID() - if err != nil { - fmt.Println("Error generating payment ID:", err) - continue - } - fmt.Printf("Generated Payment ID: %d\n", paymentID) - fmt.Printf(" Readable Payment ID: PAY-%d\n", paymentID) - - tsP, bizP, wkrP, seqP, genTimeP := ParseID(paymentID) - fmt.Printf(" Parsed: Timestamp=%d, Business=%d, Worker=%d, Sequence=%d, GenTime=%s\n\n", tsP, bizP, wkrP, seqP, genTimeP.Format(time.RFC3339Nano)) - - time.Sleep(5 * time.Millisecond) // Simulate time passing - } - - // Example of how to get shard key (assuming 64 shards) - orderIDForSharding, _ := orderGenerator.NextID() - shardIndex := orderIDForSharding % 64 - fmt.Printf("\nOrder ID %d would route to Shard Index %d\n", orderIDForSharding, shardIndex) -} diff --git a/internal/db/init/category.go b/internal/db/init/category.go deleted file mode 100644 index 0b3e49a..0000000 --- a/internal/db/init/category.go +++ /dev/null @@ -1,21 +0,0 @@ -package db - -import ( - "context" - - db "management/internal/db/sqlc" -) - -func initCategory() (*db.Category, error) { - arg := db.CreateCategoryParams{ - Name: "根结点", - Icon: "", - Description: "", - Letter: "", - ParentID: 0, - ParentPath: ",0,", - Status: 0, - Sort: 6666, - } - return db.Engine.CreateCategory(context.Background(), &arg) -} diff --git a/internal/db/init/config.go b/internal/db/init/config.go deleted file mode 100644 index 8e236ea..0000000 --- a/internal/db/init/config.go +++ /dev/null @@ -1,27 +0,0 @@ -package db - -import ( - "context" - "encoding/json" - - db "management/internal/db/sqlc" - "management/internal/pkg/know/pearadmin" -) - -func initConfig() error { - b, err := json.Marshal(pearadmin.PearJson) - if err != nil { - return err - } - - arg := db.CreateSysConfigParams{ - Key: pearadmin.PearKey, - Value: b, - } - err = db.Engine.CreateSysConfig(context.Background(), &arg) - if err != nil { - return err - } - - return nil -} diff --git a/internal/db/init/department.go b/internal/db/init/department.go deleted file mode 100644 index 3758ec6..0000000 --- a/internal/db/init/department.go +++ /dev/null @@ -1,21 +0,0 @@ -package db - -import ( - "context" - "time" - - db "management/internal/db/sqlc" -) - -func initDepartment() (*db.SysDepartment, error) { - arg := db.CreateSysDepartmentParams{ - Name: "公司", - ParentID: 0, - ParentPath: ",0,", - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - } - return db.Engine.CreateSysDepartment(context.Background(), &arg) -} diff --git a/internal/db/init/init.go b/internal/db/init/init.go deleted file mode 100644 index 38f0b39..0000000 --- a/internal/db/init/init.go +++ /dev/null @@ -1,92 +0,0 @@ -package db - -import ( - "context" - "log" - - db "management/internal/db/sqlc" - "management/internal/pkg/know/pearadmin" -) - -func InitSeed() { - ctx := context.Background() - - // 后台pear配置 - b, err := db.Engine.ExistsSysConfigByKey(ctx, pearadmin.PearKey) - if err != nil { - log.Fatalf("failed to get sys config: %v", err) - } - if !b { - err = initConfig() - if err != nil { - log.Fatal("sys config: ", err) - } - } - - // 部门 - b, err = db.Engine.ExistsSysDepartment(ctx) - if err != nil { - log.Fatal("department exists: ", err) - } - var depart *db.SysDepartment - if !b { - depart, err = initDepartment() - if err != nil { - log.Fatal("department: ", err) - } - } - - // 角色 - b, err = db.Engine.ExistsVipRole(ctx) - if err != nil { - log.Fatal("role exists: ", err) - } - var role *db.SysRole - if !b { - role, err = initRole() - if err != nil { - log.Fatal("role: ", err) - } - } else { - role, err = db.Engine.GetFirstVipRole(ctx) - if err != nil { - log.Fatal("find role: ", err) - } - } - - // 用户 - b, err = db.Engine.ExistsSysUser(ctx) - if err != nil { - log.Fatal("user exists: ", err) - } - if !b { - _, err = initUser(depart.ID, role.ID) - if err != nil { - log.Fatal("user: ", err) - } - } - - // 类别 - b, err = db.Engine.ExistsCategories(ctx) - if err != nil { - log.Fatal("category exists: ", err) - } - if !b { - _, err := initCategory() - if err != nil { - log.Fatal("category: ", err) - } - } - - // 菜单 - b, err = db.Engine.ExistsMenu(ctx) - if err != nil { - log.Fatal("menu exists: ", err) - } - if !b { - err = initMenu() - if err != nil { - log.Fatal("menu: ", err) - } - } -} diff --git a/internal/db/init/menu.go b/internal/db/init/menu.go deleted file mode 100644 index 3e1719e..0000000 --- a/internal/db/init/menu.go +++ /dev/null @@ -1,28 +0,0 @@ -package db - -import ( - "context" - - "management/internal/db/init/menus" -) - -func initMenu() error { - ctx := context.Background() - - err := menus.SystemInit(ctx) - if err != nil { - return err - } - - err = menus.ERPInit(ctx) - if err != nil { - return err - } - - // err = menus.PaperInit(ctx) - // if err != nil { - // return err - // } - - return nil -} diff --git a/internal/db/init/menus/erp.go b/internal/db/init/menus/erp.go deleted file mode 100644 index 001bfa9..0000000 --- a/internal/db/init/menus/erp.go +++ /dev/null @@ -1,555 +0,0 @@ -package menus - -import ( - "context" - "fmt" - "log" - "time" - - db "management/internal/db/sqlc" - - "github.com/google/uuid" -) - -func ERPInit(ctx context.Context) error { - erp, err := db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "ERP管理", - DisplayName: "ERP管理", - Url: uuid.Must(uuid.NewRandom()).String(), - Type: "node", - ParentID: 0, - ParentPath: ",0,", - Avatar: "layui-icon layui-icon-set", - Style: "", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - pro, err := db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "项目管理", - DisplayName: "项目管理", - Url: uuid.Must(uuid.NewRandom()).String(), - Type: "node", - ParentID: erp.ID, - ParentPath: fmt.Sprintf("%s%d,", erp.ParentPath, erp.ID), - Avatar: "layui-icon layui-icon-vercode", - Style: "", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - project, err := db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "项目管理", - DisplayName: "项目管理", - Url: "/project/list", - Type: "menu", - ParentID: pro.ID, - ParentPath: fmt.Sprintf("%s%d,", pro.ParentPath, pro.ID), - Avatar: "", - Style: "", - Visible: true, - IsList: true, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "新增", - DisplayName: "新增", - Url: "/project/add", - Type: "btn", - ParentID: project.ID, - ParentPath: fmt.Sprintf("%s%d,", project.ParentPath, project.ID), - Avatar: "layui-icon layui-icon-add-1", - Style: "pear-btn-primary pear-btn-sm", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "编辑", - DisplayName: "编辑", - Url: "/project/edit", - Type: "btn", - ParentID: project.ID, - ParentPath: fmt.Sprintf("%s%d,", project.ParentPath, project.ID), - Avatar: "layui-icon layui-icon-edit", - Style: "pear-btn-primary pear-btn-xs", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "保存", - DisplayName: "保存", - Url: "/project/save", - Type: "btn", - ParentID: project.ID, - ParentPath: fmt.Sprintf("%s%d,", project.ParentPath, project.ID), - Avatar: "layui-icon layui-icon-ok", - Style: "pear-btn-primary pear-btn-sm", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "xmselect", - DisplayName: "xmselect", - Url: "/project/xmselect", - Type: "btn", - ParentID: project.ID, - ParentPath: fmt.Sprintf("%s%d,", project.ParentPath, project.ID), - Avatar: "layui-icon layui-icon-ok", - Style: "pear-btn-primary pear-btn-sm", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - budget, err := db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "项目预算", - DisplayName: "项目预算", - Url: "/budget/list", - Type: "menu", - ParentID: pro.ID, - ParentPath: fmt.Sprintf("%s%d,", pro.ParentPath, pro.ID), - Avatar: "", - Style: "", - Visible: true, - IsList: true, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "新增", - DisplayName: "新增", - Url: "/budget/add", - Type: "btn", - ParentID: budget.ID, - ParentPath: fmt.Sprintf("%s%d,", budget.ParentPath, budget.ID), - Avatar: "layui-icon layui-icon-add-1", - Style: "pear-btn-primary pear-btn-sm", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "编辑", - DisplayName: "编辑", - Url: "/budget/edit", - Type: "btn", - ParentID: budget.ID, - ParentPath: fmt.Sprintf("%s%d,", budget.ParentPath, budget.ID), - Avatar: "layui-icon layui-icon-edit", - Style: "pear-btn-primary pear-btn-xs", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "保存", - DisplayName: "保存", - Url: "/budget/save", - Type: "btn", - ParentID: budget.ID, - ParentPath: fmt.Sprintf("%s%d,", budget.ParentPath, budget.ID), - Avatar: "layui-icon layui-icon-ok", - Style: "pear-btn-primary pear-btn-sm", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - projectDashboard, err := db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "项目统计看板", - DisplayName: "项目统计看板", - Url: "/project/dashboard", - Type: "menu", - ParentID: pro.ID, - ParentPath: fmt.Sprintf("%s%d,", pro.ParentPath, pro.ID), - Avatar: "", - Style: "", - Visible: true, - IsList: true, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - log.Println(projectDashboard) - - in, err := db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "应收管理", - DisplayName: "应收管理", - Url: uuid.Must(uuid.NewRandom()).String(), - Type: "node", - ParentID: erp.ID, - ParentPath: fmt.Sprintf("%s%d,", erp.ParentPath, erp.ID), - Avatar: "layui-icon layui-icon-vercode", - Style: "", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - customer, err := db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "客户管理", - DisplayName: "客户管理", - Url: "/customer/list", - Type: "menu", - ParentID: in.ID, - ParentPath: fmt.Sprintf("%s%d,", in.ParentPath, in.ID), - Avatar: "", - Style: "", - Visible: true, - IsList: true, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "新增", - DisplayName: "新增", - Url: "/customer/add", - Type: "btn", - ParentID: customer.ID, - ParentPath: fmt.Sprintf("%s%d,", customer.ParentPath, customer.ID), - Avatar: "layui-icon layui-icon-add-1", - Style: "pear-btn-primary pear-btn-sm", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "编辑", - DisplayName: "编辑", - Url: "/customer/edit", - Type: "btn", - ParentID: customer.ID, - ParentPath: fmt.Sprintf("%s%d,", customer.ParentPath, customer.ID), - Avatar: "layui-icon layui-icon-edit", - Style: "pear-btn-primary pear-btn-xs", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "保存", - DisplayName: "保存", - Url: "/customer/save", - Type: "btn", - ParentID: customer.ID, - ParentPath: fmt.Sprintf("%s%d,", customer.ParentPath, customer.ID), - Avatar: "layui-icon layui-icon-ok", - Style: "pear-btn-primary pear-btn-sm", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "xmselect", - DisplayName: "xmselect", - Url: "/customer/xmselect", - Type: "btn", - ParentID: customer.ID, - ParentPath: fmt.Sprintf("%s%d,", customer.ParentPath, customer.ID), - Avatar: "layui-icon layui-icon-ok", - Style: "pear-btn-primary pear-btn-sm", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - income, err := db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "回款单", - DisplayName: "回款单", - Url: "/income/list", - Type: "menu", - ParentID: in.ID, - ParentPath: fmt.Sprintf("%s%d,", in.ParentPath, in.ID), - Avatar: "", - Style: "", - Visible: true, - IsList: true, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "新增", - DisplayName: "新增", - Url: "/income/add", - Type: "btn", - ParentID: income.ID, - ParentPath: fmt.Sprintf("%s%d,", income.ParentPath, income.ID), - Avatar: "layui-icon layui-icon-add-1", - Style: "pear-btn-primary pear-btn-sm", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "编辑", - DisplayName: "编辑", - Url: "/income/edit", - Type: "btn", - ParentID: income.ID, - ParentPath: fmt.Sprintf("%s%d,", income.ParentPath, income.ID), - Avatar: "layui-icon layui-icon-edit", - Style: "pear-btn-primary pear-btn-xs", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "保存", - DisplayName: "保存", - Url: "/income/save", - Type: "btn", - ParentID: income.ID, - ParentPath: fmt.Sprintf("%s%d,", income.ParentPath, income.ID), - Avatar: "layui-icon layui-icon-ok", - Style: "pear-btn-primary pear-btn-sm", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - cost, err := db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "费用管理", - DisplayName: "费用管理", - Url: uuid.Must(uuid.NewRandom()).String(), - Type: "node", - ParentID: erp.ID, - ParentPath: fmt.Sprintf("%s%d,", erp.ParentPath, erp.ID), - Avatar: "layui-icon layui-icon-vercode", - Style: "", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - expense, err := db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "费用报销单", - DisplayName: "费用报销单", - Url: "/expense/list", - Type: "menu", - ParentID: cost.ID, - ParentPath: fmt.Sprintf("%s%d,", cost.ParentPath, cost.ID), - Avatar: "", - Style: "", - Visible: true, - IsList: true, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "新增", - DisplayName: "新增", - Url: "/expense/add", - Type: "btn", - ParentID: expense.ID, - ParentPath: fmt.Sprintf("%s%d,", expense.ParentPath, expense.ID), - Avatar: "layui-icon layui-icon-add-1", - Style: "pear-btn-primary pear-btn-sm", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "编辑", - DisplayName: "编辑", - Url: "/expense/edit", - Type: "btn", - ParentID: expense.ID, - ParentPath: fmt.Sprintf("%s%d,", expense.ParentPath, expense.ID), - Avatar: "layui-icon layui-icon-edit", - Style: "pear-btn-primary pear-btn-xs", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "保存", - DisplayName: "保存", - Url: "/expense/save", - Type: "btn", - ParentID: expense.ID, - ParentPath: fmt.Sprintf("%s%d,", expense.ParentPath, expense.ID), - Avatar: "layui-icon layui-icon-ok", - Style: "pear-btn-primary pear-btn-sm", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - return nil -} diff --git a/internal/db/init/menus/system.go b/internal/db/init/menus/system.go deleted file mode 100644 index 07393ae..0000000 --- a/internal/db/init/menus/system.go +++ /dev/null @@ -1,1042 +0,0 @@ -package menus - -import ( - "context" - "fmt" - "time" - - db "management/internal/db/sqlc" - - "github.com/google/uuid" -) - -func SystemInit(ctx context.Context) error { - system, err := db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "系统管理", - DisplayName: "系统管理", - Url: uuid.Must(uuid.NewRandom()).String(), - Type: "node", - ParentID: 0, - ParentPath: ",0,", - Avatar: "layui-icon layui-icon-set", - Style: "", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - accountPermission, err := db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "账户权限", - DisplayName: "账户权限", - Url: uuid.Must(uuid.NewRandom()).String(), - Type: "node", - ParentID: system.ID, - ParentPath: fmt.Sprintf("%s%d,", system.ParentPath, system.ID), - Avatar: "layui-icon layui-icon-vercode", - Style: "", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - systemMenu, err := db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "菜单管理", - DisplayName: "菜单管理", - Url: "/system/menu/list", - Type: "menu", - ParentID: accountPermission.ID, - ParentPath: fmt.Sprintf("%s%d,", accountPermission.ParentPath, accountPermission.ID), - Avatar: "", - Style: "", - Visible: true, - IsList: true, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - systemRole, err := db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "角色管理", - DisplayName: "角色管理", - Url: "/system/role/list", - Type: "menu", - ParentID: accountPermission.ID, - ParentPath: fmt.Sprintf("%s%d,", accountPermission.ParentPath, accountPermission.ID), - Avatar: "", - Style: "", - Visible: true, - IsList: true, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - systemDepartment, err := db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "部门管理", - DisplayName: "部门管理", - Url: "/system/department/list", - Type: "menu", - ParentID: accountPermission.ID, - ParentPath: fmt.Sprintf("%s%d,", accountPermission.ParentPath, accountPermission.ID), - Avatar: "", - Style: "", - Visible: true, - IsList: true, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - systemUser, err := db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "用户管理", - DisplayName: "用户管理", - Url: "/system/user/list", - Type: "menu", - ParentID: accountPermission.ID, - ParentPath: fmt.Sprintf("%s%d,", accountPermission.ParentPath, accountPermission.ID), - Avatar: "", - Style: "", - Visible: true, - IsList: true, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "登陆日志", - DisplayName: "登陆日志", - Url: "/system/login_log/list", - Type: "menu", - ParentID: accountPermission.ID, - ParentPath: fmt.Sprintf("%s%d,", accountPermission.ParentPath, accountPermission.ID), - Avatar: "", - Style: "", - Visible: true, - IsList: true, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "审计日志", - DisplayName: "审计日志", - Url: "/system/audit_log/list", - Type: "menu", - ParentID: accountPermission.ID, - ParentPath: fmt.Sprintf("%s%d,", accountPermission.ParentPath, accountPermission.ID), - Avatar: "", - Style: "", - Visible: true, - IsList: true, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - // 菜单 - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "新增", - DisplayName: "新增", - Url: "/system/menu/add", - Type: "btn", - ParentID: systemMenu.ID, - ParentPath: fmt.Sprintf("%s%d,", systemMenu.ParentPath, systemMenu.ID), - Avatar: "layui-icon layui-icon-add-1", - Style: "pear-btn-primary pear-btn-sm", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "新增子菜单", - DisplayName: "新增子菜单", - Url: "/system/menu/add_children", - Type: "btn", - ParentID: systemMenu.ID, - ParentPath: fmt.Sprintf("%s%d,", systemMenu.ParentPath, systemMenu.ID), - Avatar: "layui-icon layui-icon-add-1", - Style: "pear-btn-primary pear-btn-xs", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "编辑", - DisplayName: "编辑", - Url: "/system/menu/edit", - Type: "btn", - ParentID: systemMenu.ID, - ParentPath: fmt.Sprintf("%s%d,", systemMenu.ParentPath, systemMenu.ID), - Avatar: "layui-icon layui-icon-edit", - Style: "pear-btn-primary pear-btn-xs", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "保存", - DisplayName: "保存", - Url: "/system/menu/save", - Type: "btn", - ParentID: systemMenu.ID, - ParentPath: fmt.Sprintf("%s%d,", systemMenu.ParentPath, systemMenu.ID), - Avatar: "layui-icon layui-icon-ok", - Style: "pear-btn-primary pear-btn-sm", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "刷新", - DisplayName: "刷新", - Url: "/system/menu/refresh_cache", - Type: "btn", - ParentID: systemMenu.ID, - ParentPath: fmt.Sprintf("%s%d,", systemMenu.ParentPath, systemMenu.ID), - Avatar: "layui-icon layui-icon-refresh", - Style: "pear-btn-sm", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "菜单树", - DisplayName: "菜单树", - Url: "/system/menu/tree", - Type: "btn", - ParentID: systemMenu.ID, - ParentPath: fmt.Sprintf("%s%d,", systemMenu.ParentPath, systemMenu.ID), - Avatar: "", - Style: "", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "菜单树xm", - DisplayName: "菜单树xm", - Url: "/system/menu/xm_select_tree", - Type: "btn", - ParentID: systemMenu.ID, - ParentPath: fmt.Sprintf("%s%d,", systemMenu.ParentPath, systemMenu.ID), - Avatar: "", - Style: "", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - // 角色 - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "新增", - DisplayName: "新增", - Url: "/system/role/add", - Type: "btn", - ParentID: systemRole.ID, - ParentPath: fmt.Sprintf("%s%d,", systemRole.ParentPath, systemRole.ID), - Avatar: "layui-icon layui-icon-add-1", - Style: "pear-btn-primary pear-btn-sm", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "编辑", - DisplayName: "编辑", - Url: "/system/role/edit", - Type: "btn", - ParentID: systemRole.ID, - ParentPath: fmt.Sprintf("%s%d,", systemRole.ParentPath, systemRole.ID), - Avatar: "layui-icon layui-icon-edit", - Style: "pear-btn-primary pear-btn-xs", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "保存", - DisplayName: "保存", - Url: "/system/role/save", - Type: "btn", - ParentID: systemRole.ID, - ParentPath: fmt.Sprintf("%s%d,", systemRole.ParentPath, systemRole.ID), - Avatar: "layui-icon layui-icon-ok", - Style: "pear-btn-primary pear-btn-sm", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "dtree", - DisplayName: "dtree", - Url: "/system/role/dtree", - Type: "btn", - ParentID: systemRole.ID, - ParentPath: fmt.Sprintf("%s%d,", systemRole.ParentPath, systemRole.ID), - Avatar: "", - Style: "", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "刷新", - DisplayName: "刷新", - Url: "/system/role/refresh", - Type: "btn", - ParentID: systemRole.ID, - ParentPath: fmt.Sprintf("%s%d,", systemRole.ParentPath, systemRole.ID), - Avatar: "layui-icon layui-icon-refresh", - Style: "pear-btn-sm", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "重建父路径", - DisplayName: "重建父路径", - Url: "/system/role/rebuild_parent_path", - Type: "btn", - ParentID: systemRole.ID, - ParentPath: fmt.Sprintf("%s%d,", systemRole.ParentPath, systemRole.ID), - Avatar: "layui-icon layui-icon-refresh", - Style: "pear-btn-danger pear-btn-sm", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "权限刷新", - DisplayName: "权限刷新", - Url: "/system/role/refresh_role_menus", - Type: "btn", - ParentID: systemRole.ID, - ParentPath: fmt.Sprintf("%s%d,", systemRole.ParentPath, systemRole.ID), - Avatar: "layui-icon layui-icon-refresh", - Style: "pear-btn-xs", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "设置权限", - DisplayName: "设置权限", - Url: "/system/role/set_menu", - Type: "btn", - ParentID: systemRole.ID, - ParentPath: fmt.Sprintf("%s%d,", systemRole.ParentPath, systemRole.ID), - Avatar: "layui-icon layui-icon-set", - Style: "pear-btn-danger pear-btn-xs", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - // 部门 - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "新增", - DisplayName: "新增", - Url: "/system/department/add", - Type: "btn", - ParentID: systemDepartment.ID, - ParentPath: fmt.Sprintf("%s%d,", systemDepartment.ParentPath, systemDepartment.ID), - Avatar: "layui-icon layui-icon-add-1", - Style: "pear-btn-primary pear-btn-sm", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "新增子部门", - DisplayName: "新增子部门", - Url: "/system/department/add_children", - Type: "btn", - ParentID: systemDepartment.ID, - ParentPath: fmt.Sprintf("%s%d,", systemDepartment.ParentPath, systemDepartment.ID), - Avatar: "layui-icon layui-icon-add-1", - Style: "pear-btn-primary pear-btn-xs", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "编辑", - DisplayName: "编辑", - Url: "/system/department/edit", - Type: "btn", - ParentID: systemDepartment.ID, - ParentPath: fmt.Sprintf("%s%d,", systemDepartment.ParentPath, systemDepartment.ID), - Avatar: "layui-icon layui-icon-edit", - Style: "pear-btn-primary pear-btn-xs", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "保存", - DisplayName: "保存", - Url: "/system/department/save", - Type: "btn", - ParentID: systemDepartment.ID, - ParentPath: fmt.Sprintf("%s%d,", systemDepartment.ParentPath, systemDepartment.ID), - Avatar: "layui-icon layui-icon-ok", - Style: "pear-btn-primary pear-btn-sm", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "dtree", - DisplayName: "dtree", - Url: "/system/department/dtree", - Type: "btn", - ParentID: systemDepartment.ID, - ParentPath: fmt.Sprintf("%s%d,", systemDepartment.ParentPath, systemDepartment.ID), - Avatar: "", - Style: "", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "刷新", - DisplayName: "刷新", - Url: "/system/department/refresh", - Type: "btn", - ParentID: systemDepartment.ID, - ParentPath: fmt.Sprintf("%s%d,", systemDepartment.ParentPath, systemDepartment.ID), - Avatar: "layui-icon layui-icon-refresh", - Style: "pear-btn-sm", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "重建父路径", - DisplayName: "重建父路径", - Url: "/system/department/rebuild_parent_path", - Type: "btn", - ParentID: systemDepartment.ID, - ParentPath: fmt.Sprintf("%s%d,", systemDepartment.ParentPath, systemDepartment.ID), - Avatar: "layui-icon layui-icon-refresh", - Style: "pear-btn-danger pear-btn-sm", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - // 用户 - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "新增", - DisplayName: "新增", - Url: "/system/user/add", - Type: "btn", - ParentID: systemUser.ID, - ParentPath: fmt.Sprintf("%s%d,", systemUser.ParentPath, systemUser.ID), - Avatar: "layui-icon layui-icon-add-1", - Style: "pear-btn-primary pear-btn-sm", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "编辑", - DisplayName: "编辑", - Url: "/system/user/edit", - Type: "btn", - ParentID: systemUser.ID, - ParentPath: fmt.Sprintf("%s%d,", systemUser.ParentPath, systemUser.ID), - Avatar: "layui-icon layui-icon-edit", - Style: "pear-btn-primary pear-btn-xs", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "基本资料", - DisplayName: "基本资料", - Url: "/system/user/profile", - Type: "btn", - ParentID: systemUser.ID, - ParentPath: fmt.Sprintf("%s%d,", systemUser.ParentPath, systemUser.ID), - Avatar: "", - Style: "", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "保存", - DisplayName: "保存", - Url: "/system/user/save", - Type: "btn", - ParentID: systemUser.ID, - ParentPath: fmt.Sprintf("%s%d,", systemUser.ParentPath, systemUser.ID), - Avatar: "layui-icon layui-icon-ok", - Style: "pear-btn-primary pear-btn-sm", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "xmselect", - DisplayName: "xmselect", - Url: "/system/user/xmselect", - Type: "btn", - ParentID: systemUser.ID, - ParentPath: fmt.Sprintf("%s%d,", systemUser.ParentPath, systemUser.ID), - Avatar: "layui-icon layui-icon-ok", - Style: "pear-btn-primary pear-btn-sm", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - // 基础数据 - basicData, err := db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "基础数据", - DisplayName: "基础数据", - Url: uuid.Must(uuid.NewRandom()).String(), - Type: "node", - ParentID: system.ID, - ParentPath: fmt.Sprintf("%s%d,", system.ParentPath, system.ID), - Avatar: "layui-icon layui-icon-vercode", - Style: "", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - // 系统配置 - systemConfig, err := db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "系统属性", - DisplayName: "系统属性", - Url: "/system/config/list", - Type: "menu", - ParentID: basicData.ID, - ParentPath: fmt.Sprintf("%s%d,", basicData.ParentPath, basicData.ID), - Avatar: "", - Style: "", - Visible: true, - IsList: true, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "新增", - DisplayName: "新增", - Url: "/system/config/add", - Type: "btn", - ParentID: systemConfig.ID, - ParentPath: fmt.Sprintf("%s%d,", systemConfig.ParentPath, systemConfig.ID), - Avatar: "layui-icon layui-icon-add-1", - Style: "pear-btn-primary pear-btn-sm", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "编辑", - DisplayName: "编辑", - Url: "/system/config/edit", - Type: "btn", - ParentID: systemConfig.ID, - ParentPath: fmt.Sprintf("%s%d,", systemConfig.ParentPath, systemConfig.ID), - Avatar: "layui-icon layui-icon-edit", - Style: "pear-btn-primary pear-btn-xs", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "保存", - DisplayName: "保存", - Url: "/system/config/save", - Type: "btn", - ParentID: systemConfig.ID, - ParentPath: fmt.Sprintf("%s%d,", systemConfig.ParentPath, systemConfig.ID), - Avatar: "layui-icon layui-icon-ok", - Style: "pear-btn-primary pear-btn-sm", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "重置Pear", - DisplayName: "重置Pear", - Url: "/system/config/reset_pear", - Type: "btn", - ParentID: systemConfig.ID, - ParentPath: fmt.Sprintf("%s%d,", systemConfig.ParentPath, systemConfig.ID), - Avatar: "layui-icon layui-icon-refresh", - Style: "pear-btn-danger pear-btn-sm", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "刷新", - DisplayName: "刷新", - Url: "/system/config/refresh", - Type: "btn", - ParentID: systemConfig.ID, - ParentPath: fmt.Sprintf("%s%d,", systemConfig.ParentPath, systemConfig.ID), - Avatar: "layui-icon layui-icon-refresh", - Style: "pear-btn-xs", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - // 类别 - systemClass, err := db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "类别配置", - DisplayName: "类别配置", - Url: "/system/category/list", - Type: "menu", - ParentID: basicData.ID, - ParentPath: fmt.Sprintf("%s%d,", basicData.ParentPath, basicData.ID), - Avatar: "", - Style: "", - Visible: true, - IsList: true, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "新增", - DisplayName: "新增", - Url: "/system/category/add", - Type: "btn", - ParentID: systemClass.ID, - ParentPath: fmt.Sprintf("%s%d,", systemClass.ParentPath, systemClass.ID), - Avatar: "layui-icon layui-icon-add-1", - Style: "pear-btn-primary pear-btn-sm", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "新增子栏目", - DisplayName: "新增子栏目", - Url: "/system/category/add_children", - Type: "btn", - ParentID: systemClass.ID, - ParentPath: fmt.Sprintf("%s%d,", systemClass.ParentPath, systemClass.ID), - Avatar: "layui-icon layui-icon-add-1", - Style: "pear-btn-primary pear-btn-xs", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "编辑", - DisplayName: "编辑", - Url: "/system/category/edit", - Type: "btn", - ParentID: systemClass.ID, - ParentPath: fmt.Sprintf("%s%d,", systemClass.ParentPath, systemClass.ID), - Avatar: "layui-icon layui-icon-edit", - Style: "pear-btn-primary pear-btn-xs", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "保存", - DisplayName: "保存", - Url: "/system/category/save", - Type: "btn", - ParentID: systemClass.ID, - ParentPath: fmt.Sprintf("%s%d,", systemClass.ParentPath, systemClass.ID), - Avatar: "layui-icon layui-icon-ok", - Style: "pear-btn-primary pear-btn-sm", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "dtree", - DisplayName: "dtree", - Url: "/system/category/dtree", - Type: "btn", - ParentID: systemClass.ID, - ParentPath: fmt.Sprintf("%s%d,", systemClass.ParentPath, systemClass.ID), - Avatar: "", - Style: "", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "xmselect", - DisplayName: "xmselect", - Url: "/system/category/xmselect", - Type: "btn", - ParentID: systemClass.ID, - ParentPath: fmt.Sprintf("%s%d,", systemClass.ParentPath, systemClass.ID), - Avatar: "layui-icon layui-icon-ok", - Style: "pear-btn-primary pear-btn-sm", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "刷新", - DisplayName: "刷新", - Url: "/system/category/refresh", - Type: "btn", - ParentID: systemClass.ID, - ParentPath: fmt.Sprintf("%s%d,", systemClass.ParentPath, systemClass.ID), - Avatar: "layui-icon layui-icon-refresh", - Style: "pear-btn-sm", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - _, err = db.Engine.CreateSysMenu(ctx, &db.CreateSysMenuParams{ - Name: "重建父路径", - DisplayName: "重建父路径", - Url: "/system/category/rebuild_parent_path", - Type: "btn", - ParentID: systemClass.ID, - ParentPath: fmt.Sprintf("%s%d,", systemClass.ParentPath, systemClass.ID), - Avatar: "layui-icon layui-icon-refresh", - Style: "pear-btn-danger pear-btn-sm", - Visible: true, - IsList: false, - Status: 0, - Sort: 6666, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - }) - if err != nil { - return err - } - - return nil -} diff --git a/internal/db/init/role.go b/internal/db/init/role.go deleted file mode 100644 index 15aa017..0000000 --- a/internal/db/init/role.go +++ /dev/null @@ -1,38 +0,0 @@ -package db - -import ( - "context" - "fmt" - "time" - - db "management/internal/db/sqlc" -) - -func initRole() (*db.SysRole, error) { - arg := db.CreateSysRoleParams{ - Name: "Company", - DisplayName: "公司", - Vip: false, - ParentID: 0, - ParentPath: ",0,", - Status: 0, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - } - role, err := db.Engine.CreateSysRole(context.Background(), &arg) - if err != nil { - return nil, err - } - - arg = db.CreateSysRoleParams{ - Name: "SuperAdmin", - DisplayName: "超级管理员", - Vip: true, - ParentID: role.ID, - ParentPath: fmt.Sprintf(",0,%d,", role.ID), - Status: 0, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - } - return db.Engine.CreateSysRole(context.Background(), &arg) -} diff --git a/internal/db/init/user.go b/internal/db/init/user.go deleted file mode 100644 index b98a85a..0000000 --- a/internal/db/init/user.go +++ /dev/null @@ -1,46 +0,0 @@ -package db - -import ( - "context" - "time" - - db "management/internal/db/sqlc" - "management/internal/pkg/crypto" - "management/internal/pkg/rand" - - "github.com/google/uuid" -) - -func initUser(departID int32, roleID int32) (*db.SysUser, error) { - salt, err := rand.String(10) - if err != nil { - return nil, err - } - - password := "secret" - hashedPassword, err := crypto.BcryptHashPassword(password + salt) - if err != nil { - return nil, err - } - - initTime, err := time.ParseInLocation(time.DateTime, "0001-01-01 00:00:00", time.Local) - if err != nil { - return nil, err - } - arg := db.CreateSysUserParams{ - Uuid: uuid.Must(uuid.NewV7()), - Email: "1185230223@qq.com", - Username: "kenneth", - HashedPassword: hashedPassword, - Salt: salt, - Avatar: "/statics/admin/images/avatar.jpg", - Gender: 1, - DepartmentID: departID, - RoleID: roleID, - Status: 0, - ChangePasswordAt: initTime, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - } - return db.Engine.CreateSysUser(context.Background(), &arg) -} diff --git a/internal/db/migration/000001_init_schema.down.sql b/internal/db/migration/000001_init_schema.down.sql deleted file mode 100644 index 476d700..0000000 --- a/internal/db/migration/000001_init_schema.down.sql +++ /dev/null @@ -1,18 +0,0 @@ -DROP TABLE "sys_user"; -DROP TABLE "sys_user_login_log"; -DROP TABLE "sys_audit_log"; -DROP TABLE "sessions"; -DROP TABLE "sys_department"; -DROP TABLE "sys_role"; -DROP TABLE "sys_menu"; -DROP TABLE "sys_role_menu"; -DROP TABLE "sys_config"; -DROP TABLE "users"; -DROP TABLE "user_sessions"; -DROP TABLE "paper_files"; -DROP TABLE "papers"; -DROP TABLE "idioms"; -DROP TABLE "riddles"; -DROP TABLE "category"; -DROP TABLE "novels"; -DROP TABLE "chapters"; diff --git a/internal/db/migration/000001_init_schema.up.sql b/internal/db/migration/000001_init_schema.up.sql deleted file mode 100644 index c4046f6..0000000 --- a/internal/db/migration/000001_init_schema.up.sql +++ /dev/null @@ -1,682 +0,0 @@ --- SQL dump generated using DBML (dbml.dbdiagram.io) --- Database: PostgreSQL --- Generated at: 2025-03-19T06:50:49.966Z - -CREATE TABLE "sys_user" ( - "id" SERIAL NOT NULL, - "uuid" uuid NOT NULL, - "email" VARCHAR(100) NOT NULL, - "username" VARCHAR(100) NOT NULL, - "hashed_password" bytea NOT NULL, - "salt" VARCHAR(20) NOT NULL, - "avatar" VARCHAR(200) NOT NULL, - "gender" INT NOT NULL DEFAULT 0, - "department_id" INT NOT NULL DEFAULT 0, - "role_id" INT NOT NULL DEFAULT 0, - "status" INT NOT NULL DEFAULT 0, - "change_password_at" TIMESTAMPTZ NOT NULL DEFAULT ('0001-01-01 00:00:00+8'), - "created_at" TIMESTAMPTZ NOT NULL DEFAULT (NOW()), - "updated_at" TIMESTAMPTZ NOT NULL DEFAULT ('0001-01-01 00:00:00+8'), - PRIMARY KEY ("id") -); - -CREATE TABLE "sys_user_login_log" ( - "id" BIGSERIAL NOT NULL, - "created_at" TIMESTAMPTZ NOT NULL DEFAULT (NOW()), - "email" VARCHAR(100) NOT NULL, - "username" VARCHAR(100) NOT NULL, - "user_uuid" uuid NOT NULL, - "is_success" Boolean NOT NULL, - "message" VARCHAR(300) NOT NULL, - "referer_url" VARCHAR(500) NOT NULL, - "url" VARCHAR(500) NOT NULL, - "os" VARCHAR(50) NOT NULL, - "ip" VARCHAR(20) NOT NULL, - "browser" VARCHAR(100) NOT NULL, - PRIMARY KEY ("id") -); - -CREATE TABLE "sys_audit_log" ( - "id" BIGSERIAL NOT NULL, - "created_at" TIMESTAMPTZ NOT NULL DEFAULT (NOW()), - "email" VARCHAR(100) NOT NULL, - "username" VARCHAR(100) NOT NULL, - "user_uuid" uuid NOT NULL, - "start_at" TIMESTAMPTZ NOT NULL, - "end_at" TIMESTAMPTZ NOT NULL, - "duration" VARCHAR(10) NOT NULL, - "url" VARCHAR(500) NOT NULL, - "method" VARCHAR(50) NOT NULL, - "parameters" VARCHAR NOT NULL, - "referer_url" VARCHAR(500) NOT NULL, - "os" VARCHAR(50) NOT NULL, - "ip" VARCHAR(20) NOT NULL, - "browser" VARCHAR(100) NOT NULL, - "remark" VARCHAR(300) NOT NULL, - PRIMARY KEY ("id") -); - -CREATE TABLE "sessions" ( - "token" TEXT NOT NULL, - "data" BYTEA NOT NULL, - "expiry" TIMESTAMPTZ NOT NULL, - PRIMARY KEY ("token") -); - -CREATE TABLE "sys_department" ( - "id" SERIAL NOT NULL, - "name" VARCHAR(200) NOT NULL, - "parent_id" INT NOT NULL, - "parent_path" VARCHAR(500) NOT NULL, - "status" INT NOT NULL DEFAULT 0, - "sort" INT NOT NULL DEFAULT 0, - "created_at" TIMESTAMPTZ NOT NULL DEFAULT (NOW()), - "updated_at" TIMESTAMPTZ NOT NULL DEFAULT ('0001-01-01 00:00:00+8'), - PRIMARY KEY ("id") -); - -CREATE TABLE "sys_role" ( - "id" SERIAL NOT NULL, - "name" VARCHAR(200) NOT NULL, - "display_name" VARCHAR(200) NOT NULL, - "parent_id" INT NOT NULL, - "parent_path" VARCHAR(500) NOT NULL, - "vip" Boolean NOT NULL, - "status" INT NOT NULL DEFAULT 0, - "sort" INT NOT NULL DEFAULT 0, - "created_at" TIMESTAMPTZ NOT NULL DEFAULT (NOW()), - "updated_at" TIMESTAMPTZ NOT NULL DEFAULT ('0001-01-01 00:00:00+8'), - PRIMARY KEY ("id") -); - -CREATE TABLE "sys_menu" ( - "id" SERIAL NOT NULL, - "name" VARCHAR(200) NOT NULL, - "display_name" VARCHAR(200) NOT NULL, - "url" VARCHAR(200) NOT NULL, - "type" VARCHAR(50) NOT NULL, - "parent_id" INT NOT NULL, - "parent_path" VARCHAR(500) NOT NULL, - "avatar" VARCHAR(100) NOT NULL, - "style" VARCHAR(100) NOT NULL, - "visible" Boolean NOT NULL, - "is_list" Boolean NOT NULL, - "status" INT NOT NULL DEFAULT 0, - "sort" INT NOT NULL DEFAULT 0, - "created_at" TIMESTAMPTZ NOT NULL DEFAULT (NOW()), - "updated_at" TIMESTAMPTZ NOT NULL DEFAULT ('0001-01-01 00:00:00+8'), - PRIMARY KEY ("id") -); - -CREATE TABLE "sys_role_menu" ( - "role_id" INT NOT NULL, - "menu_id" INT NOT NULL, - PRIMARY KEY ("role_id", "menu_id") -); - -CREATE TABLE "sys_config" ( - "id" SERIAL NOT NULL, - "key" VARCHAR(100) NOT NULL, - "value" jsonb NOT NULL, - "created_at" TIMESTAMPTZ NOT NULL DEFAULT (NOW()), - "updated_at" TIMESTAMPTZ NOT NULL DEFAULT ('0001-01-01 00:00:00+8'), - PRIMARY KEY ("id") -); - -CREATE TABLE "categories" ( - "id" SERIAL NOT NULL, - "name" VARCHAR(100) NOT NULL, - "icon" VARCHAR(300) NOT NULL DEFAULT '', - "description" VARCHAR(500) NOT NULL DEFAULT '', - "letter" VARCHAR(100) NOT NULL DEFAULT '', - "parent_id" INT NOT NULL DEFAULT 0, - "parent_path" VARCHAR(500) NOT NULL DEFAULT '', - "status" SMALLINT NOT NULL DEFAULT 0, - "sort" INT NOT NULL DEFAULT 0, - "created_at" TIMESTAMPTZ NOT NULL DEFAULT (NOW()), - "updated_at" TIMESTAMPTZ NOT NULL DEFAULT ('0001-01-01 00:00:00+8'), - PRIMARY KEY ("id") -); - -CREATE TABLE "customers" ( - "id" BIGINT NOT NULL, - "name" VARCHAR(100) NOT NULL, - "category" INT NOT NULL DEFAULT 0, - "source" INT NOT NULL DEFAULT 0, - "address" VARCHAR(500) NOT NULL DEFAULT '', - "contact_name" VARCHAR(100) NOT NULL DEFAULT '', - "contact_phone" VARCHAR(50) NOT NULL DEFAULT '', - "status" SMALLINT NOT NULL DEFAULT 0, - "sort" INT NOT NULL DEFAULT 0, - "created_at" TIMESTAMPTZ NOT NULL DEFAULT (NOW()), - "created_by" INT NOT NULL DEFAULT 0, - "updated_at" TIMESTAMPTZ NOT NULL DEFAULT ('0001-01-01 00:00:00+8'), - "updated_by" INT NOT NULL DEFAULT 0, - PRIMARY KEY ("id") -); - -CREATE TABLE "customer_contact" ( - "id" SERIAL NOT NULL, - "name" VARCHAR(100) NOT NULL, - "telephone" VARCHAR(50) NOT NULL, - "customer_id" BIGINT NOT NULL, - "status" SMALLINT NOT NULL DEFAULT 0, - "sort" INT NOT NULL DEFAULT 0, - "created_at" TIMESTAMPTZ NOT NULL DEFAULT (NOW()), - "created_by" INT NOT NULL DEFAULT 0, - "updated_at" TIMESTAMPTZ NOT NULL DEFAULT ('0001-01-01 00:00:00+8'), - "updated_by" INT NOT NULL DEFAULT 0, - PRIMARY KEY ("id") -); - -CREATE TABLE "projects" ( - "id" BIGINT NOT NULL, - "name" VARCHAR(100) NOT NULL, - "start_at" TIMESTAMPTZ NOT NULL, - "end_at" TIMESTAMPTZ NOT NULL, - "customer_id" BIGINT NOT NULL, - "total_money" DECIMAL(10,2) NOT NULL DEFAULT 0, - "description" VARCHAR(500) NOT NULL DEFAULT '', - "apply_at" TIMESTAMPTZ NOT NULL, - "apply_user_id" INT NOT NULL, - "manager_id" INT NOT NULL, - "members" VARCHAR(1000) NOT NULL, - "status" SMALLINT NOT NULL DEFAULT 0, - "sort" INT NOT NULL DEFAULT 0, - "created_at" TIMESTAMPTZ NOT NULL DEFAULT (NOW()), - "created_user_id" INT NOT NULL DEFAULT 0, - "updated_at" TIMESTAMPTZ NOT NULL DEFAULT ('0001-01-01 00:00:00+8'), - "updated_user_id" INT NOT NULL DEFAULT 0, - PRIMARY KEY ("id") -); - -CREATE TABLE "project_files" ( - "id" BIGINT NOT NULL, - "name" VARCHAR(100) NOT NULL, - "path" VARCHAR(500) NOT NULL, - "project_id" BIGINT NOT NULL, - "sort" INT NOT NULL DEFAULT 0, - "created_at" TIMESTAMPTZ NOT NULL DEFAULT (NOW()), - "created_user_id" INT NOT NULL DEFAULT 0, - PRIMARY KEY ("id") -); - -CREATE TABLE "budgets" ( - "id" BIGSERIAL NOT NULL, - "project_id" BIGINT NOT NULL, - "name" VARCHAR(100) NOT NULL, - "budget_type" INT NOT NULL, - "category" INT NOT NULL, - "start_at" TIMESTAMPTZ NOT NULL, - "end_at" TIMESTAMPTZ NOT NULL, - "amount" DECIMAL(10,2) NOT NULL DEFAULT 0, - "used_amount" DECIMAL(10,2) NOT NULL DEFAULT 0, - "remaining_amount" DECIMAL(10,2) NOT NULL DEFAULT 0, - "remark" VARCHAR(500) NOT NULL DEFAULT '', - "status" SMALLINT NOT NULL DEFAULT 0, - "sort" INT NOT NULL DEFAULT 0, - "created_at" TIMESTAMPTZ NOT NULL DEFAULT (NOW()), - "created_user_id" INT NOT NULL DEFAULT 0, - "updated_at" TIMESTAMPTZ NOT NULL DEFAULT ('0001-01-01 00:00:00+8'), - "updated_user_id" INT NOT NULL DEFAULT 0, - PRIMARY KEY ("id") -); - -CREATE TABLE "incomes" ( - "id" BIGSERIAL NOT NULL, - "project_id" BIGINT NOT NULL, - "budget_id" BIGINT NOT NULL DEFAULT 0, - "amount" DECIMAL(10,2) NOT NULL DEFAULT 0, - "income_at" TIMESTAMPTZ NOT NULL, - "income_type" INT NOT NULL, - "income_bank" INT NOT NULL, - "remark" VARCHAR(500) NOT NULL DEFAULT '', - "status" SMALLINT NOT NULL DEFAULT 0, - "created_at" TIMESTAMPTZ NOT NULL DEFAULT (NOW()), - "created_user_id" INT NOT NULL DEFAULT 0, - "updated_at" TIMESTAMPTZ NOT NULL DEFAULT ('0001-01-01 00:00:00+8'), - "updated_user_id" INT NOT NULL DEFAULT 0, - PRIMARY KEY ("id") -); - -CREATE TABLE "expenses" ( - "id" BIGSERIAL NOT NULL, - "project_id" BIGINT NOT NULL, - "budget_id" BIGINT NOT NULL DEFAULT 0, - "amount" DECIMAL(10,2) NOT NULL DEFAULT 0, - "expenses_at" TIMESTAMPTZ NOT NULL, - "expenses_type" INT NOT NULL, - "remark" VARCHAR(500) NOT NULL DEFAULT '', - "status" SMALLINT NOT NULL DEFAULT 0, - "created_at" TIMESTAMPTZ NOT NULL DEFAULT (NOW()), - "created_user_id" INT NOT NULL DEFAULT 0, - "updated_at" TIMESTAMPTZ NOT NULL DEFAULT ('0001-01-01 00:00:00+8'), - "updated_user_id" INT NOT NULL DEFAULT 0, - PRIMARY KEY ("id") -); - -CREATE UNIQUE INDEX ON "sys_user" ("uuid"); - -CREATE UNIQUE INDEX ON "sys_user" ("username"); - -CREATE UNIQUE INDEX ON "sys_user" ("email"); - -CREATE INDEX ON "sys_user" ("status"); - -CREATE INDEX ON "sys_user_login_log" ("created_at"); - -CREATE INDEX ON "sys_user_login_log" ("email"); - -CREATE INDEX ON "sys_user_login_log" ("username"); - -CREATE INDEX ON "sys_audit_log" ("created_at"); - -CREATE INDEX ON "sys_audit_log" ("email"); - -CREATE INDEX ON "sys_audit_log" ("username"); - -CREATE INDEX ON "sessions" ("expiry"); - -CREATE UNIQUE INDEX ON "sys_department" ("name"); - -CREATE INDEX ON "sys_department" ("status"); - -CREATE UNIQUE INDEX ON "sys_role" ("name"); - -CREATE UNIQUE INDEX ON "sys_role" ("display_name"); - -CREATE INDEX ON "sys_role" ("status"); - -CREATE UNIQUE INDEX ON "sys_menu" ("url"); - -CREATE INDEX ON "sys_menu" ("type"); - -CREATE INDEX ON "sys_menu" ("parent_id"); - -CREATE INDEX ON "sys_menu" ("status"); - -CREATE UNIQUE INDEX ON "sys_config" ("key"); - -CREATE INDEX ON "categories" ("name"); - -CREATE UNIQUE INDEX ON "categories" ("letter"); - -CREATE INDEX ON "customers" ("name"); - -CREATE INDEX ON "customer_contact" ("name"); - -CREATE INDEX ON "customer_contact" ("telephone"); - -CREATE INDEX ON "projects" ("name"); - -CREATE INDEX ON "project_files" ("name"); - -CREATE INDEX ON "budgets" ("project_id"); - -CREATE INDEX ON "budgets" ("category"); - -CREATE INDEX ON "incomes" ("project_id"); - -CREATE INDEX ON "incomes" ("budget_id"); - -CREATE INDEX ON "incomes" ("income_type"); - -CREATE INDEX ON "expenses" ("project_id"); - -CREATE INDEX ON "expenses" ("budget_id"); - -CREATE INDEX ON "expenses" ("expenses_type"); - -COMMENT ON COLUMN "sys_user"."email" IS '邮箱地址'; - -COMMENT ON COLUMN "sys_user"."username" IS '用户名称'; - -COMMENT ON COLUMN "sys_user"."hashed_password" IS '加密密码'; - -COMMENT ON COLUMN "sys_user"."salt" IS '密码盐值'; - -COMMENT ON COLUMN "sys_user"."avatar" IS '头像'; - -COMMENT ON COLUMN "sys_user"."gender" IS '性别'; - -COMMENT ON COLUMN "sys_user"."department_id" IS '部门'; - -COMMENT ON COLUMN "sys_user"."role_id" IS '角色'; - -COMMENT ON COLUMN "sys_user"."status" IS '状态'; - -COMMENT ON COLUMN "sys_user"."change_password_at" IS '密码修改时间'; - -COMMENT ON COLUMN "sys_user"."created_at" IS '创建时间'; - -COMMENT ON COLUMN "sys_user"."updated_at" IS '更新时间'; - -COMMENT ON COLUMN "sys_user_login_log"."created_at" IS '创建时间'; - -COMMENT ON COLUMN "sys_user_login_log"."email" IS '邮箱地址'; - -COMMENT ON COLUMN "sys_user_login_log"."username" IS '用户名称'; - -COMMENT ON COLUMN "sys_user_login_log"."user_uuid" IS '用户uuid'; - -COMMENT ON COLUMN "sys_user_login_log"."is_success" IS '是否登陆成功'; - -COMMENT ON COLUMN "sys_user_login_log"."message" IS '登陆消息'; - -COMMENT ON COLUMN "sys_user_login_log"."referer_url" IS '上一个链接'; - -COMMENT ON COLUMN "sys_user_login_log"."url" IS '链接'; - -COMMENT ON COLUMN "sys_user_login_log"."os" IS '系统'; - -COMMENT ON COLUMN "sys_user_login_log"."ip" IS 'ip'; - -COMMENT ON COLUMN "sys_user_login_log"."browser" IS '浏览器'; - -COMMENT ON COLUMN "sys_audit_log"."created_at" IS '创建时间'; - -COMMENT ON COLUMN "sys_audit_log"."email" IS '邮箱地址'; - -COMMENT ON COLUMN "sys_audit_log"."username" IS '用户名称'; - -COMMENT ON COLUMN "sys_audit_log"."user_uuid" IS '用户uuid'; - -COMMENT ON COLUMN "sys_audit_log"."start_at" IS '请求开始时间'; - -COMMENT ON COLUMN "sys_audit_log"."end_at" IS '请求结束时间'; - -COMMENT ON COLUMN "sys_audit_log"."duration" IS '请求总时间'; - -COMMENT ON COLUMN "sys_audit_log"."url" IS '请求链接'; - -COMMENT ON COLUMN "sys_audit_log"."method" IS '请求类型'; - -COMMENT ON COLUMN "sys_audit_log"."parameters" IS '请求参数'; - -COMMENT ON COLUMN "sys_audit_log"."referer_url" IS '上一个链接'; - -COMMENT ON COLUMN "sys_audit_log"."os" IS '系统'; - -COMMENT ON COLUMN "sys_audit_log"."ip" IS 'ip'; - -COMMENT ON COLUMN "sys_audit_log"."browser" IS '浏览器'; - -COMMENT ON COLUMN "sys_audit_log"."remark" IS '备注'; - -COMMENT ON COLUMN "sessions"."token" IS 'token'; - -COMMENT ON COLUMN "sessions"."data" IS 'data'; - -COMMENT ON COLUMN "sessions"."expiry" IS 'expiry'; - -COMMENT ON COLUMN "sys_department"."name" IS '部门名称'; - -COMMENT ON COLUMN "sys_department"."parent_id" IS '上级id'; - -COMMENT ON COLUMN "sys_department"."parent_path" IS '树路径'; - -COMMENT ON COLUMN "sys_department"."status" IS '状态'; - -COMMENT ON COLUMN "sys_department"."sort" IS '排序'; - -COMMENT ON COLUMN "sys_department"."created_at" IS '创建时间'; - -COMMENT ON COLUMN "sys_department"."updated_at" IS '更新时间'; - -COMMENT ON COLUMN "sys_role"."name" IS '名称'; - -COMMENT ON COLUMN "sys_role"."display_name" IS '显示名称'; - -COMMENT ON COLUMN "sys_role"."parent_id" IS '上级id'; - -COMMENT ON COLUMN "sys_role"."parent_path" IS '树路径'; - -COMMENT ON COLUMN "sys_role"."vip" IS '是否vip'; - -COMMENT ON COLUMN "sys_role"."status" IS '状态'; - -COMMENT ON COLUMN "sys_role"."sort" IS '排序'; - -COMMENT ON COLUMN "sys_role"."created_at" IS '创建时间'; - -COMMENT ON COLUMN "sys_role"."updated_at" IS '更新时间'; - -COMMENT ON COLUMN "sys_menu"."name" IS '名称'; - -COMMENT ON COLUMN "sys_menu"."display_name" IS '显示名称'; - -COMMENT ON COLUMN "sys_menu"."url" IS '菜单url'; - -COMMENT ON COLUMN "sys_menu"."type" IS '菜单类型(node, menu, btn)'; - -COMMENT ON COLUMN "sys_menu"."parent_id" IS '上级id'; - -COMMENT ON COLUMN "sys_menu"."parent_path" IS '树路径'; - -COMMENT ON COLUMN "sys_menu"."avatar" IS '菜单图标'; - -COMMENT ON COLUMN "sys_menu"."style" IS '菜单样式'; - -COMMENT ON COLUMN "sys_menu"."visible" IS '是否可见'; - -COMMENT ON COLUMN "sys_menu"."is_list" IS '是否列表'; - -COMMENT ON COLUMN "sys_menu"."status" IS '状态'; - -COMMENT ON COLUMN "sys_menu"."sort" IS '排序'; - -COMMENT ON COLUMN "sys_menu"."created_at" IS '创建时间'; - -COMMENT ON COLUMN "sys_menu"."updated_at" IS '更新时间'; - -COMMENT ON COLUMN "sys_role_menu"."role_id" IS '角色id'; - -COMMENT ON COLUMN "sys_role_menu"."menu_id" IS '菜单id'; - -COMMENT ON COLUMN "sys_config"."key" IS '存储键'; - -COMMENT ON COLUMN "sys_config"."value" IS '存储值'; - -COMMENT ON COLUMN "sys_config"."created_at" IS '创建时间'; - -COMMENT ON COLUMN "sys_config"."updated_at" IS '更新时间'; - -COMMENT ON COLUMN "categories"."id" IS 'ID'; - -COMMENT ON COLUMN "categories"."name" IS '名称'; - -COMMENT ON COLUMN "categories"."icon" IS '图标'; - -COMMENT ON COLUMN "categories"."description" IS '描述'; - -COMMENT ON COLUMN "categories"."letter" IS '拼音'; - -COMMENT ON COLUMN "categories"."parent_id" IS '父级ID'; - -COMMENT ON COLUMN "categories"."parent_path" IS '树路径'; - -COMMENT ON COLUMN "categories"."status" IS '状态'; - -COMMENT ON COLUMN "categories"."sort" IS '排序'; - -COMMENT ON COLUMN "categories"."created_at" IS '创建时间'; - -COMMENT ON COLUMN "categories"."updated_at" IS '更新时间'; - -COMMENT ON COLUMN "customers"."id" IS 'ID'; - -COMMENT ON COLUMN "customers"."name" IS '名称'; - -COMMENT ON COLUMN "customers"."category" IS '类别'; - -COMMENT ON COLUMN "customers"."source" IS '来源'; - -COMMENT ON COLUMN "customers"."address" IS '地址'; - -COMMENT ON COLUMN "customers"."contact_name" IS '主要联系人'; - -COMMENT ON COLUMN "customers"."contact_phone" IS '主要联系人手机'; - -COMMENT ON COLUMN "customers"."status" IS '状态'; - -COMMENT ON COLUMN "customers"."sort" IS '排序'; - -COMMENT ON COLUMN "customers"."created_at" IS '创建时间'; - -COMMENT ON COLUMN "customers"."created_by" IS '创建人'; - -COMMENT ON COLUMN "customers"."updated_at" IS '更新时间'; - -COMMENT ON COLUMN "customers"."updated_by" IS '更新人'; - -COMMENT ON COLUMN "customer_contact"."id" IS 'ID'; - -COMMENT ON COLUMN "customer_contact"."name" IS '名称'; - -COMMENT ON COLUMN "customer_contact"."telephone" IS '联系方式'; - -COMMENT ON COLUMN "customer_contact"."customer_id" IS '客户ID'; - -COMMENT ON COLUMN "customer_contact"."status" IS '状态'; - -COMMENT ON COLUMN "customer_contact"."sort" IS '排序'; - -COMMENT ON COLUMN "customer_contact"."created_at" IS '创建时间'; - -COMMENT ON COLUMN "customer_contact"."created_by" IS '创建人'; - -COMMENT ON COLUMN "customer_contact"."updated_at" IS '更新时间'; - -COMMENT ON COLUMN "customer_contact"."updated_by" IS '更新人'; - -COMMENT ON COLUMN "projects"."id" IS 'ID'; - -COMMENT ON COLUMN "projects"."name" IS '名称'; - -COMMENT ON COLUMN "projects"."start_at" IS '开始时间'; - -COMMENT ON COLUMN "projects"."end_at" IS '结束时间'; - -COMMENT ON COLUMN "projects"."customer_id" IS '客户ID'; - -COMMENT ON COLUMN "projects"."total_money" IS '总金额'; - -COMMENT ON COLUMN "projects"."description" IS '简介'; - -COMMENT ON COLUMN "projects"."apply_at" IS '申请时间'; - -COMMENT ON COLUMN "projects"."apply_user_id" IS '申请人'; - -COMMENT ON COLUMN "projects"."manager_id" IS '项目经理'; - -COMMENT ON COLUMN "projects"."members" IS '项目成员'; - -COMMENT ON COLUMN "projects"."status" IS '状态'; - -COMMENT ON COLUMN "projects"."sort" IS '排序'; - -COMMENT ON COLUMN "projects"."created_at" IS '创建时间'; - -COMMENT ON COLUMN "projects"."created_user_id" IS '创建人'; - -COMMENT ON COLUMN "projects"."updated_at" IS '更新时间'; - -COMMENT ON COLUMN "projects"."updated_user_id" IS '更新人'; - -COMMENT ON COLUMN "project_files"."id" IS 'ID'; - -COMMENT ON COLUMN "project_files"."name" IS '名称'; - -COMMENT ON COLUMN "project_files"."path" IS '路径'; - -COMMENT ON COLUMN "project_files"."project_id" IS '项目ID'; - -COMMENT ON COLUMN "project_files"."sort" IS '排序'; - -COMMENT ON COLUMN "project_files"."created_at" IS '创建时间'; - -COMMENT ON COLUMN "project_files"."created_user_id" IS '创建人'; - -COMMENT ON COLUMN "budgets"."id" IS 'ID'; - -COMMENT ON COLUMN "budgets"."project_id" IS '项目ID'; - -COMMENT ON COLUMN "budgets"."name" IS '名称'; - -COMMENT ON COLUMN "budgets"."budget_type" IS '预算类型: 收入/支出'; - -COMMENT ON COLUMN "budgets"."category" IS '类别'; - -COMMENT ON COLUMN "budgets"."start_at" IS '开始时间'; - -COMMENT ON COLUMN "budgets"."end_at" IS '结束时间'; - -COMMENT ON COLUMN "budgets"."amount" IS '预算金额'; - -COMMENT ON COLUMN "budgets"."used_amount" IS '已使用金额'; - -COMMENT ON COLUMN "budgets"."remaining_amount" IS '剩余金额'; - -COMMENT ON COLUMN "budgets"."remark" IS '备注'; - -COMMENT ON COLUMN "budgets"."status" IS '状态'; - -COMMENT ON COLUMN "budgets"."sort" IS '排序'; - -COMMENT ON COLUMN "budgets"."created_at" IS '创建时间'; - -COMMENT ON COLUMN "budgets"."created_user_id" IS '创建人'; - -COMMENT ON COLUMN "budgets"."updated_at" IS '更新时间'; - -COMMENT ON COLUMN "budgets"."updated_user_id" IS '更新人'; - -COMMENT ON COLUMN "incomes"."id" IS 'ID'; - -COMMENT ON COLUMN "incomes"."project_id" IS '项目ID'; - -COMMENT ON COLUMN "incomes"."budget_id" IS '预算ID'; - -COMMENT ON COLUMN "incomes"."amount" IS '收入金额'; - -COMMENT ON COLUMN "incomes"."income_at" IS '收入时间'; - -COMMENT ON COLUMN "incomes"."income_type" IS '收入类型'; - -COMMENT ON COLUMN "incomes"."income_bank" IS '收入银行'; - -COMMENT ON COLUMN "incomes"."remark" IS '备注'; - -COMMENT ON COLUMN "incomes"."status" IS '状态'; - -COMMENT ON COLUMN "incomes"."created_at" IS '创建时间'; - -COMMENT ON COLUMN "incomes"."created_user_id" IS '创建人'; - -COMMENT ON COLUMN "incomes"."updated_at" IS '更新时间'; - -COMMENT ON COLUMN "incomes"."updated_user_id" IS '更新人'; - -COMMENT ON COLUMN "expenses"."id" IS 'ID'; - -COMMENT ON COLUMN "expenses"."project_id" IS '项目ID'; - -COMMENT ON COLUMN "expenses"."budget_id" IS '预算ID'; - -COMMENT ON COLUMN "expenses"."amount" IS '支出金额'; - -COMMENT ON COLUMN "expenses"."expenses_at" IS '支出时间'; - -COMMENT ON COLUMN "expenses"."expenses_type" IS '支出类型'; - -COMMENT ON COLUMN "expenses"."remark" IS '备注'; - -COMMENT ON COLUMN "expenses"."status" IS '状态'; - -COMMENT ON COLUMN "expenses"."created_at" IS '创建时间'; - -COMMENT ON COLUMN "expenses"."created_user_id" IS '创建人'; - -COMMENT ON COLUMN "expenses"."updated_at" IS '更新时间'; - -COMMENT ON COLUMN "expenses"."updated_user_id" IS '更新人'; diff --git a/internal/db/model/form/budget.go b/internal/db/model/form/budget.go deleted file mode 100644 index 5f693e8..0000000 --- a/internal/db/model/form/budget.go +++ /dev/null @@ -1,53 +0,0 @@ -package form - -import ( - "time" - - db "management/internal/db/sqlc" - "management/internal/pkg/convertor" - - "github.com/jackc/pgx/v5/pgtype" -) - -type BudgetForm struct { - ID int64 `json:"id"` - ProjectID int64 `json:"project_id"` - Name string `json:"name"` - BudgetType int32 `json:"budget_type"` - Category int32 `json:"category"` - StartAt time.Time `json:"start_at"` - EndAt time.Time `json:"end_at"` - Amount float64 `json:"amount"` - AmountF pgtype.Numeric `comment:"预算金额"` - UsedAmount float64 `json:"used_amount"` - UsedAmountF pgtype.Numeric `comment:"已支付金额"` - RemainingAmount float64 `json:"remaining_amount"` - RemainingAmountF pgtype.Numeric `comment:"剩余金额"` - Remark string `json:"remark"` - Status int16 `json:"status"` - Sort int32 `json:"sort"` - CreatedAt time.Time `json:"created_at"` - CreatedName string `comment:"创建人"` - UpdatedAt time.Time `json:"updated_at"` - UpdatedName string `comment:"更新人"` -} - -func (f *BudgetForm) ToForm(p *db.Budget) *BudgetForm { - return &BudgetForm{ - ID: p.ID, - ProjectID: p.ProjectID, - Name: p.Name, - BudgetType: p.BudgetType, - Category: p.Category, - StartAt: p.StartAt, - EndAt: p.EndAt, - Amount: convertor.NumericToFloat64(p.Amount), - UsedAmount: convertor.NumericToFloat64(p.UsedAmount), - RemainingAmount: convertor.NumericToFloat64(p.RemainingAmount), - Remark: p.Remark, - Status: p.Status, - Sort: p.Sort, - CreatedAt: p.CreatedAt, - UpdatedAt: p.UpdatedAt, - } -} diff --git a/internal/db/model/form/customer.go b/internal/db/model/form/customer.go deleted file mode 100644 index f56dbeb..0000000 --- a/internal/db/model/form/customer.go +++ /dev/null @@ -1,39 +0,0 @@ -package form - -import ( - "time" - - db "management/internal/db/sqlc" -) - -type CustomerForm struct { - ID int64 `json:"id" validate:"min=0" comment:"ID"` - Name string `json:"name" validate:"required" comment:"名称"` - Category int32 `json:"category" validate:"min=0" comment:"类别"` - Source int32 `json:"source" validate:"min=0" comment:"来源"` - Address string `json:"address" comment:"地址"` - ContactName string `json:"contact_name" comment:"联系人姓名"` - ContactPhone string `json:"contact_phone" validate:"telephone" comment:"联系人手机"` - Status int16 `json:"status" validate:"min=-1" comment:"状态"` - Sort int32 `json:"sort" validate:"min=0" comment:"排序"` - CreatedAt time.Time `json:"created_at" comment:"创建时间"` - CreatedBy string `json:"created_by" comment:"创建人"` - UpdatedAt time.Time `json:"updated_at" comment:"更新时间"` - UpdatedBy string `json:"updated_by" comment:"更新人"` -} - -func (f *CustomerForm) ToForm(c *db.Customer) *CustomerForm { - return &CustomerForm{ - ID: c.ID, - Name: c.Name, - Category: c.Category, - Source: c.Source, - Address: c.Address, - ContactName: c.ContactName, - ContactPhone: c.ContactPhone, - Status: c.Status, - Sort: c.Sort, - CreatedAt: c.CreatedAt, - UpdatedAt: c.UpdatedAt, - } -} diff --git a/internal/db/model/form/expense.go b/internal/db/model/form/expense.go deleted file mode 100644 index 11c35bf..0000000 --- a/internal/db/model/form/expense.go +++ /dev/null @@ -1,42 +0,0 @@ -package form - -import ( - "time" - - db "management/internal/db/sqlc" - "management/internal/pkg/convertor" - - "github.com/jackc/pgx/v5/pgtype" -) - -type ExpenseForm struct { - ID int64 `json:"id"` - ProjectID int64 `json:"project_id"` - BudgetID int64 `json:"budget_id"` - Amount float64 `json:"amount"` - AmountF pgtype.Numeric `comment:"报销金额"` - ExpensesAt time.Time `json:"expenses_at"` - ExpensesType int32 `json:"expenses_type"` - Remark string `json:"remark"` - Status int16 `json:"status"` - CreatedAt time.Time `json:"created_at"` - CreatedName string `comment:"创建人"` - UpdatedAt time.Time `json:"updated_at"` - UpdatedName string `comment:"更新人"` -} - -func (f *ExpenseForm) ToForm(p *db.Expense) *ExpenseForm { - return &ExpenseForm{ - ID: p.ID, - ProjectID: p.ProjectID, - BudgetID: p.BudgetID, - Amount: convertor.NumericToFloat64(p.Amount), - AmountF: p.Amount, - ExpensesAt: p.ExpensesAt, - ExpensesType: p.ExpensesType, - Remark: p.Remark, - Status: p.Status, - CreatedAt: p.CreatedAt, - UpdatedAt: p.UpdatedAt, - } -} diff --git a/internal/db/model/form/form.go b/internal/db/model/form/form.go deleted file mode 100644 index 4b67f64..0000000 --- a/internal/db/model/form/form.go +++ /dev/null @@ -1,40 +0,0 @@ -package form - -import ( - "net/http" - - "management/internal/pkg/validation" - - "github.com/gorilla/schema" -) - -// 初始化一个解码器实例 -var decoder = schema.NewDecoder() - -func BindForm(r *http.Request, form any) error { - if err := r.ParseForm(); err != nil { - return err - } - - // 忽略名为 "csrf_token" 的表单字段 - delete(r.PostForm, "csrf_token") - - // decoder.RegisterConverter(time.Time{}, func(s string) reflect.Value { - // res, err := time.ParseInLocation("2006-01-02", s, time.Local) - // if err != nil { - // panic(err) - // } - // return reflect.ValueOf(res) - // }) - - if err := decoder.Decode(form, r.PostForm); err != nil { - return err - } - - // 校验表单规则 - if err := validation.ValidateForm(form); err != nil { - return err - } - - return nil -} diff --git a/internal/db/model/form/income.go b/internal/db/model/form/income.go deleted file mode 100644 index 920ca16..0000000 --- a/internal/db/model/form/income.go +++ /dev/null @@ -1,44 +0,0 @@ -package form - -import ( - "time" - - db "management/internal/db/sqlc" - "management/internal/pkg/convertor" - - "github.com/jackc/pgx/v5/pgtype" -) - -type IncomeForm struct { - ID int64 `json:"id"` - ProjectID int64 `json:"project_id"` - BudgetID int64 `json:"budget_id"` - Amount float64 `json:"amount"` - AmountF pgtype.Numeric `comment:"收入金额"` - IncomeAt time.Time `json:"income_at"` - IncomeType int32 `json:"income_type"` - IncomeBank int32 `json:"income_bank"` - Remark string `json:"remark"` - Status int16 `json:"status"` - CreatedAt time.Time `json:"created_at"` - CreatedName string `comment:"创建人"` - UpdatedAt time.Time `json:"updated_at"` - UpdatedName string `comment:"更新人"` -} - -func (f *IncomeForm) ToForm(p *db.Income) *IncomeForm { - return &IncomeForm{ - ID: p.ID, - ProjectID: p.ProjectID, - BudgetID: p.BudgetID, - Amount: convertor.NumericToFloat64(p.Amount), - AmountF: p.Amount, - IncomeAt: p.IncomeAt, - IncomeType: p.IncomeType, - IncomeBank: p.IncomeBank, - Remark: p.Remark, - Status: p.Status, - CreatedAt: p.CreatedAt, - UpdatedAt: p.UpdatedAt, - } -} diff --git a/internal/db/model/form/project.go b/internal/db/model/form/project.go deleted file mode 100644 index c9f12d3..0000000 --- a/internal/db/model/form/project.go +++ /dev/null @@ -1,80 +0,0 @@ -package form - -import ( - "time" - - db "management/internal/db/sqlc" - "management/internal/pkg/convertor" - - "github.com/jackc/pgx/v5/pgtype" -) - -type ProjectFileForm struct { - Combination string `schema:"-"` - ProjectFileItems []*ProjectFileItemForm `schema:"-"` -} -type ProjectFileItemForm struct { - Name string `schema:"-"` - Path string `schema:"-"` - Combination string `schema:"-"` -} - -type ProjectForm struct { - ID int64 `validate:"min=0" comment:"ID"` - Name string `validate:"required" comment:"名称"` - StartAt time.Time `validate:"required" comment:"开始时间"` - EndAt time.Time `validate:"required" comment:"结束时间"` - CustomerID int64 `validate:"required" comment:"客户ID"` - CustomerName string `comment:"客户名称"` - TotalMoney float64 `validate:"required" comment:"总金额"` - TotalMoneyF pgtype.Numeric `comment:"总金额"` - Description string `comment:"简介"` - ApplyAt time.Time `validate:"required" comment:"申请时间"` - ApplyUserID int32 `validate:"required" comment:"申请人"` - ApplyUserName string `comment:"申请人"` - ManagerID int32 `comment:"项目经理"` - ManagerName string `comment:"项目经理"` - Members string `comment:"项目成员"` - MembersName string `comment:"项目成员"` - Status int16 `validate:"min=-1" comment:"状态"` - Sort int32 `validate:"min=0" comment:"排序"` - CreatedAt time.Time `comment:"创建时间"` - CreatedName string `comment:"创建人"` - UpdatedAt time.Time `comment:"更新时间"` - UpdatedName string `comment:"更新人"` - ProjectFiles *ProjectFileForm `schema:"-"` -} - -func (f *ProjectForm) ToForm(p *db.Project, pfs []*db.ProjectFile) *ProjectForm { - var allCombinationPath string - var pfi []*ProjectFileItemForm - for _, pf := range pfs { - pfi = append(pfi, &ProjectFileItemForm{ - Name: pf.Name, - Path: pf.Path, - Combination: pf.Name + "|" + pf.Path, - }) - allCombinationPath += pf.Name + "|" + pf.Path + "," - } - return &ProjectForm{ - ID: p.ID, - Name: p.Name, - StartAt: p.StartAt, - EndAt: p.EndAt, - CustomerID: p.CustomerID, - TotalMoney: convertor.NumericToFloat64(p.TotalMoney), - Description: p.Description, - ApplyAt: p.ApplyAt, - ApplyUserID: p.ApplyUserID, - ManagerID: p.ManagerID, - Members: p.Members, - Status: p.Status, - Sort: p.Sort, - CreatedAt: p.CreatedAt, - UpdatedAt: p.UpdatedAt, - ProjectFiles: &ProjectFileForm{ - Combination: allCombinationPath, - ProjectFileItems: pfi, - }, - } -} diff --git a/internal/db/model/view/dashboard.go b/internal/db/model/view/dashboard.go deleted file mode 100644 index 2c93e29..0000000 --- a/internal/db/model/view/dashboard.go +++ /dev/null @@ -1,107 +0,0 @@ -package view - -type DashboardProject struct { - ProjectIncome float64 `json:"project_income"` // 项目收入 - ProjectExpense float64 `json:"project_expense"` // 项目支出 - ProjectProfit float64 `json:"project_profit"` // 项目利润 - ProjectProfitRate string `json:"project_profit_rate"` // 项目利润率 - IncomeExpenseEcharts EchartsOption `json:"income_expense_echarts"` // 收支图表 - IncomeEcharts EchartsOption `json:"income_echarts"` // 收入图表 - ExpenseEcharts EchartsOption `json:"expense_echarts"` // 支出图表 -} - -type EchartsOption struct { - Title Title `json:"title"` - Color []string `json:"color"` - ToolTip ToolTip `json:"tooltip"` - Grid Grid `json:"grid"` - Legend Legend `json:"legend"` - XAxis []XAxis `json:"xAxis"` - YAxis []YAxis `json:"yAxis"` - BarMaxWidth string `json:"barMaxWidth"` - Label Label `json:"label"` - Series []Series `json:"series"` -} - -type Series struct { - Name string `json:"name,omitempty"` - Type string `json:"type,omitempty"` - Data any `json:"data,omitempty"` - ItemStyle ItemStyle `json:"itemStyle,omitempty"` - Radius string `json:"radius,omitempty"` - Label Label `json:"label,omitempty"` -} - -type ItemStyle struct { - Normal Normal `json:"normal,omitempty"` -} -type Normal struct { - Color string `json:"color,omitempty"` -} - -type Title struct { - Text string `json:"text,omitempty"` - Orient string `json:"orient,omitempty"` - Left string `json:"left,omitempty"` - Top int `json:"top,omitempty"` - FontSize int `json:"fontSize,omitempty"` - TextStyle TextStyle `json:"textStyle,omitempty"` -} - -type TextStyle struct { - Color string `json:"color,omitempty"` - FontWeight string `json:"fontWeight,omitempty"` -} - -type ToolTip struct { - Trigger string `json:"trigger,omitempty"` - AxisPointer AxisPointer `json:"axisPointer,omitempty"` -} -type AxisPointer struct { - Type string `json:"type,omitempty"` -} - -type Grid struct { - Left string `json:"left,omitempty"` - Right string `json:"right,omitempty"` - Bottom string `json:"bottom,omitempty"` - ContainLabel bool `json:"containLabel,omitempty"` -} - -type Legend struct { - Left string `json:"left,omitempty"` - Top string `json:"top,omitempty"` - Data []string `json:"data,omitempty"` -} - -type XAxis struct { - Type string `json:"type,omitempty"` - Data []string `json:"data,omitempty"` - AxisTick AxisTick `json:"axisTick,omitempty"` -} - -type AxisTick struct { - AlignWithLabel bool `json:"alignWithLabel,omitempty"` -} - -type YAxis struct { - Name string `json:"name,omitempty"` - Type string `json:"type,omitempty"` -} - -type Label struct { - Show bool `json:"show,omitempty"` - Position string `json:"position,omitempty"` - TextStyle TextStyle `json:"textStyle,omitempty"` - Normal LableNormal `json:"normal,omitempty"` -} - -type LableNormal struct { - Formatter string `json:"formatter,omitempty"` - TextStyle TextStyle `json:"textStyle,omitempty"` -} - -type DataItem struct { - Name string `json:"name,omitempty"` - Value float64 `json:"value,omitempty"` -} diff --git a/internal/db/query/budget.sql b/internal/db/query/budget.sql deleted file mode 100644 index 1588575..0000000 --- a/internal/db/query/budget.sql +++ /dev/null @@ -1,35 +0,0 @@ --- name: CreateBudget :one -INSERT INTO budgets (project_id, name, budget_type, category, start_at, end_at, amount, used_amount, remaining_amount, remark, created_user_id) -VALUES($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11) -RETURNING *; - --- name: GetBudget :one -SELECT * -FROM budgets -WHERE id = $1 -LIMIT 1; - --- name: UpdateBudget :one -UPDATE budgets -SET - project_id = COALESCE(sqlc.narg(project_id), project_id), - name = COALESCE(sqlc.narg(name), name), - budget_type = COALESCE(sqlc.narg(budget_type), budget_type), - category = COALESCE(sqlc.narg(category), category), - start_at = COALESCE(sqlc.narg(start_at), start_at), - end_at = COALESCE(sqlc.narg(end_at), end_at), - amount = COALESCE(sqlc.narg(amount), amount), - used_amount = COALESCE(sqlc.narg(used_amount), used_amount), - remaining_amount = COALESCE(sqlc.narg(remaining_amount), remaining_amount), - remark = COALESCE(sqlc.narg(remark), remark), - status = COALESCE(sqlc.narg(status), status), - updated_user_id = COALESCE(sqlc.narg(updated_user_id), updated_user_id), - updated_at = NOW() -WHERE id = $1 -RETURNING *; - --- name: ListBudgets :many -SELECT * -FROM budgets -WHERE project_id = $1 -ORDER BY id; \ No newline at end of file diff --git a/internal/db/query/categroy.sql b/internal/db/query/categroy.sql deleted file mode 100644 index eeb62d7..0000000 --- a/internal/db/query/categroy.sql +++ /dev/null @@ -1,84 +0,0 @@ --- name: CreateCategory :one -INSERT INTO categories ( - name, - icon, - description, - letter, - parent_id, - parent_path, - status, - sort -) -VALUES ($1, $2, $3, $4, $5, $6, $7, $8) -RETURNING *; - --- name: UpdateCategory :one -UPDATE categories -SET - name = COALESCE(sqlc.narg(name), name), - icon = COALESCE(sqlc.narg(icon), icon), - description = COALESCE(sqlc.narg(description), description), - letter = COALESCE(sqlc.narg(letter), letter), - parent_id = COALESCE(sqlc.narg(parent_id), parent_id), - parent_path = COALESCE(sqlc.narg(parent_path), parent_path), - sort = COALESCE(sqlc.narg(sort), sort), - status = COALESCE(sqlc.narg(status), status), - updated_at = NOW() -WHERE id = $1 -RETURNING *; - --- name: GetCategory :one -SELECT * -FROM categories -WHERE id = $1 -LIMIT 1; - --- name: ListCategories :many -SELECT * FROM categories -WHERE status = 0; - --- name: ListCategoriesByPath :many -SELECT * FROM categories -WHERE parent_path LIKE $1 -AND status = 0 -ORDER BY sort DESC, id ASC; - --- name: CountCategoriesCondition :one -SELECT COUNT(*) FROM categories -WHERE (NOT @is_status::Boolean OR status = @status) - AND (NOT @is_id::Boolean OR id = @id) - AND (NOT @is_parent_id::Boolean OR parent_id = @parent_id) - AND (@name::text = '' OR name ILIKE '%' || @name || '%'); - --- name: ListCategoriesCondition :many -SELECT * FROM categories -WHERE (NOT @is_status::Boolean OR status = @status) - AND (NOT @is_id::Boolean OR id = @id) - AND (NOT @is_parent_id::Boolean OR parent_id = @parent_id) - AND (@name::text = '' OR name ILIKE '%' || @name || '%') -ORDER BY sort DESC, id ASC -OFFSET @skip -LIMIT @size; - --- name: AllCategories :many -SELECT * FROM categories -WHERE status = 0 -ORDER BY sort DESC, id ASC; - --- name: ExistsCategories :one -SELECT EXISTS ( - SELECT 1 FROM categories -); - --- name: ListCategoriesRecursive :many -WITH RECURSIVE dist AS (SELECT categories.* - FROM categories - WHERE status = 0 - UNION ALL - SELECT categories.* - FROM categories, - dist - WHERE categories.id = dist.parent_id) -SELECT DISTINCT * -FROM dist -ORDER BY sort DESC, id ASC; \ No newline at end of file diff --git a/internal/db/query/customer.sql b/internal/db/query/customer.sql deleted file mode 100644 index fe86aa1..0000000 --- a/internal/db/query/customer.sql +++ /dev/null @@ -1,42 +0,0 @@ --- name: CreateCustomer :one -INSERT INTO customers (id, name, category, source, address, contact_name, contact_phone, created_by) -VALUES ($1, $2, $3, $4, $5, $6, $7, $8) -RETURNING *; - --- name: UpdateCustomer :one -UPDATE customers -SET - name = COALESCE(sqlc.narg(name), name), - category = COALESCE(sqlc.narg(category), category), - source = COALESCE(sqlc.narg(source), source), - address = COALESCE(sqlc.narg(address), address), - contact_name = COALESCE(sqlc.narg(contact_name), contact_name), - contact_phone = COALESCE(sqlc.narg(contact_phone), contact_phone), - status = COALESCE(sqlc.narg(status), status), - updated_by = COALESCE(sqlc.narg(updated_by), updated_by), - updated_at = NOW() -WHERE id = $1 -RETURNING *; - --- name: GetCustomer :one -SELECT * -FROM customers -WHERE id = $1 -LIMIT 1; - --- name: AllCustomers :many -SELECT * FROM customers -WHERE status = 0 -ORDER BY id DESC; - --- name: CountCustomers :one -SELECT COUNT(1) -FROM customers -WHERE status = 0; - --- name: ListCustomers :many -SELECT * -FROM customers -WHERE status = 0 -ORDER BY id DESC -LIMIT $1 OFFSET $2; \ No newline at end of file diff --git a/internal/db/query/expenses.sql b/internal/db/query/expenses.sql deleted file mode 100644 index c3568b6..0000000 --- a/internal/db/query/expenses.sql +++ /dev/null @@ -1,47 +0,0 @@ --- name: CreateExpense :one -INSERT INTO expenses (project_id, budget_id, amount, expenses_at, expenses_type, remark, status, created_user_id) -VALUES ($1, $2, $3, $4, $5, $6, $7, $8) -RETURNING *; - --- name: UpdateExpense :one -UPDATE expenses -SET - project_id = COALESCE(sqlc.narg(project_id), project_id), - budget_id = COALESCE(sqlc.narg(budget_id), budget_id), - amount = COALESCE(sqlc.narg(amount), amount), - expenses_at = COALESCE(sqlc.narg(expenses_at), expenses_at), - expenses_type = COALESCE(sqlc.narg(expenses_type), expenses_type), - remark = COALESCE(sqlc.narg(remark), remark), - status = COALESCE(sqlc.narg(status), status), - updated_user_id = COALESCE(sqlc.narg(updated_user_id), updated_user_id), - updated_at = NOW() -WHERE id = $1 -RETURNING *; - --- name: GetExpense :one -SELECT * -FROM expenses -WHERE id = $1 -LIMIT 1; - --- name: SumExpense :one -SELECT SUM(amount)::numeric -FROM expenses; - --- name: SumExpenseByProjectID :one -SELECT SUM(amount)::numeric -FROM expenses -WHERE project_id = $1; - --- name: StatisticsExpense :many -SELECT SUM(amount)::numeric as total_amount, - (select name from categories where id = expenses.expenses_type) expenses_type_name -FROM expenses -GROUP BY expenses_type; - --- name: StatisticsExpenseByProjectID :many -SELECT SUM(amount)::numeric as total_amount, - (select name from categories where id = expenses.expenses_type) expenses_type_name -FROM expenses -WHERE project_id = $1 -GROUP BY expenses_type; \ No newline at end of file diff --git a/internal/db/query/income.sql b/internal/db/query/income.sql deleted file mode 100644 index 4b67189..0000000 --- a/internal/db/query/income.sql +++ /dev/null @@ -1,48 +0,0 @@ --- name: CreateIncome :one -INSERT INTO incomes (project_id, budget_id, amount, income_at, income_type, income_bank, remark, status, created_user_id) -VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) -RETURNING *; - --- name: UpdateIncome :one -UPDATE incomes -SET - project_id = COALESCE(sqlc.narg(project_id), project_id), - budget_id = COALESCE(sqlc.narg(budget_id), budget_id), - amount = COALESCE(sqlc.narg(amount), amount), - income_at = COALESCE(sqlc.narg(income_at), income_at), - income_type = COALESCE(sqlc.narg(income_type), income_type), - income_bank = COALESCE(sqlc.narg(income_bank), income_bank), - remark = COALESCE(sqlc.narg(remark), remark), - status = COALESCE(sqlc.narg(status), status), - updated_user_id = COALESCE(sqlc.narg(updated_user_id), updated_user_id), - updated_at = NOW() -WHERE id = $1 -RETURNING *; - --- name: GetIncome :one -SELECT * -FROM incomes -WHERE id = $1 -LIMIT 1; - --- name: SumIncome :one -SELECT SUM(amount)::numeric -FROM incomes; - --- name: SumIncomeByProjectID :one -SELECT SUM(amount)::numeric -FROM incomes -WHERE project_id = $1; - --- name: StatisticsIncome :many -SELECT SUM(amount)::numeric as total_amount, - (select name from categories where id = incomes.income_type) income_type_name -FROM incomes -GROUP BY income_type; - --- name: StatisticsIncomeByProjectID :many -SELECT SUM(amount)::numeric as total_amount, - (select name from categories where id = incomes.income_type) income_type_name -FROM incomes -WHERE project_id = $1 -GROUP BY income_type; \ No newline at end of file diff --git a/internal/db/query/project.sql b/internal/db/query/project.sql deleted file mode 100644 index e9d1310..0000000 --- a/internal/db/query/project.sql +++ /dev/null @@ -1,59 +0,0 @@ --- name: CreateProject :one -INSERT INTO projects (id, name, start_at, end_at, customer_id, total_money, description, apply_at, apply_user_id, manager_id, members, status, created_user_id) -VALUES($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13) -RETURNING *; - --- name: UpdateProject :one -UPDATE projects -SET - name = COALESCE(sqlc.narg(name), name), - start_at = COALESCE(sqlc.narg(start_at), start_at), - end_at = COALESCE(sqlc.narg(end_at), end_at), - customer_id = COALESCE(sqlc.narg(customer_id), customer_id), - total_money = COALESCE(sqlc.narg(total_money), total_money), - description = COALESCE(sqlc.narg(description), description), - apply_at = COALESCE(sqlc.narg(apply_at), apply_at), - apply_user_id = COALESCE(sqlc.narg(apply_user_id), apply_user_id), - manager_id = COALESCE(sqlc.narg(manager_id), manager_id), - members = COALESCE(sqlc.narg(members), members), - status = COALESCE(sqlc.narg(status), status), - updated_user_id = COALESCE(sqlc.narg(updated_user_id), updated_user_id), - updated_at = NOW() -WHERE id = $1 -RETURNING *; - --- name: GetProject :one -SELECT * -FROM projects -WHERE id = $1 -LIMIT 1; - --- name: AllProjects :many -SELECT * FROM projects -WHERE status > -1 -ORDER BY id DESC; - --- name: CountProjects :one -SELECT COUNT(1) -FROM projects -WHERE status = $1; - --- name: ListProjects :many -SELECT * -FROM projects -WHERE status = $1 -ORDER BY id DESC -LIMIT $1 OFFSET $2; - --- name: StatisticsProjects :many -select name, - (select sum(amount)::numeric from incomes where project_id = projects.id) income, - (select sum(amount)::numeric from expenses where project_id = projects.id) expense -from projects; - --- name: StatisticsProjectItem :one -select name, - (select sum(amount)::numeric from incomes where project_id = projects.id) income, - (select sum(amount)::numeric from expenses where project_id = projects.id) expense -from projects -where projects.id = $1; \ No newline at end of file diff --git a/internal/db/query/project_file.sql b/internal/db/query/project_file.sql deleted file mode 100644 index 5af192e..0000000 --- a/internal/db/query/project_file.sql +++ /dev/null @@ -1,14 +0,0 @@ --- name: CreateProjectFile :one -INSERT INTO project_files (id, name, path, project_id, created_user_id) -VALUES($1, $2, $3, $4, $5) -RETURNING *; - --- name: DeleteProjectFile :exec -DELETE FROM project_files -WHERE project_id = $1; - --- name: ListProjectFiles :many -SELECT * -FROM project_files -WHERE project_id = $1 -ORDER BY id; \ No newline at end of file diff --git a/internal/db/query/sys_audit_log.sql b/internal/db/query/sys_audit_log.sql deleted file mode 100644 index f520951..0000000 --- a/internal/db/query/sys_audit_log.sql +++ /dev/null @@ -1,32 +0,0 @@ --- name: CreateSysAuditLog :exec -INSERT INTO sys_audit_log (created_at, - email, - username, - user_uuid, - start_at, - end_at, - duration, - url, - method, - parameters, - referer_url, - os, - ip, - browser, - remark) -VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15); - --- name: CountSysAuditLogCondition :one -SELECT COUNT(*) FROM sys_audit_log -WHERE created_at BETWEEN @start_at AND @end_at - AND (@email::text = '' OR email ILIKE '%' || @email || '%') - AND (@username::text = '' OR username ILIKE '%' || @username || '%'); - --- name: ListSysAuditLogCondition :many -SELECT * FROM sys_audit_log -WHERE created_at BETWEEN @start_at AND @end_at - AND (@email::text = '' OR email ILIKE '%' || @email || '%') - AND (@username::text = '' OR username ILIKE '%' || @username || '%') -ORDER BY created_at DESC -OFFSET @skip -LIMIT @size; \ No newline at end of file diff --git a/internal/db/query/sys_config.sql b/internal/db/query/sys_config.sql deleted file mode 100644 index 82a9856..0000000 --- a/internal/db/query/sys_config.sql +++ /dev/null @@ -1,41 +0,0 @@ --- name: CreateSysConfig :exec -INSERT INTO sys_config ( - key, - value -) VALUES ( - $1, $2 -); - --- name: GetSysConfig :one -SELECT * -FROM sys_config -WHERE id = $1 -LIMIT 1; - --- name: GetSysConfigByKey :one -SELECT * -FROM sys_config -WHERE key = $1 -LIMIT 1; - --- name: UpdateSysConfigByKey :exec -UPDATE sys_config -SET value = $2 -WHERE key = $1; - --- name: ExistsSysConfigByKey :one -SELECT EXISTS ( - SELECT 1 FROM sys_config WHERE key = $1 -); - --- name: CountSysConfigCondition :one -SELECT COUNT(*) FROM sys_config -WHERE (@key::text = '' OR key ILIKE '%' || @key || '%'); - --- name: ListSysConfigCondition :many -SELECT * -FROM sys_config -WHERE (@key::text = '' OR key ILIKE '%' || @key || '%') -ORDER BY created_at DESC -OFFSET @skip -LIMIT @size; \ No newline at end of file diff --git a/internal/db/query/sys_department.sql b/internal/db/query/sys_department.sql deleted file mode 100644 index 3fd8a4b..0000000 --- a/internal/db/query/sys_department.sql +++ /dev/null @@ -1,71 +0,0 @@ --- name: CreateSysDepartment :one -INSERT INTO sys_department ( - name, - parent_id, - parent_path, - status, - sort, - created_at, - updated_at -) VALUES ( - $1, $2, $3, $4, $5, $6, $7 -) RETURNING *; - --- name: UpdateSysDepartment :one -UPDATE sys_department -SET name = $2, - parent_id = $3, - parent_path = $4, - status = $5, - sort = $6, - updated_at = $7 -WHERE id = $1 -RETURNING *; - --- name: GetSysDepartment :one -SELECT * FROM sys_department -WHERE id = $1 LIMIT 1; - --- name: ListSysDepartment :many -SELECT * FROM sys_department -WHERE status = 0; - --- name: CountSysDepartmentCondition :one -SELECT COUNT(*) FROM sys_department -WHERE (NOT @is_status::Boolean OR status = @status) - AND (NOT @is_id::Boolean OR id = @id) - AND (NOT @is_parent_id::Boolean OR parent_id = @parent_id) - AND (@name::text = '' OR name ILIKE '%' || @name || '%'); - --- name: ListSysDepartmentCondition :many -SELECT * FROM sys_department -WHERE (NOT @is_status::Boolean OR status = @status) - AND (NOT @is_id::Boolean OR id = @id) - AND (NOT @is_parent_id::Boolean OR parent_id = @parent_id) - AND (@name::text = '' OR name ILIKE '%' || @name || '%') -ORDER BY created_at DESC -OFFSET @skip -LIMIT @size; - --- name: AllSysDepartment :many -SELECT * FROM sys_department -WHERE status = 0 -ORDER BY sort DESC; - --- name: ExistsSysDepartment :one -SELECT EXISTS ( - SELECT 1 FROM sys_department -); - --- name: ListSysDepartmentRecursive :many -WITH RECURSIVE dist AS (SELECT sys_department.* - FROM sys_department - WHERE status = 0 - UNION ALL - SELECT sys_department.* - FROM sys_department, - dist - WHERE sys_department.id = dist.parent_id) -SELECT DISTINCT * -FROM dist -ORDER BY sort DESC; \ No newline at end of file diff --git a/internal/db/query/sys_menu.sql b/internal/db/query/sys_menu.sql deleted file mode 100644 index 5aaa9f4..0000000 --- a/internal/db/query/sys_menu.sql +++ /dev/null @@ -1,97 +0,0 @@ --- name: CreateSysMenu :one -INSERT INTO sys_menu ( - name, - display_name, - url, - type, - parent_id, - parent_path, - avatar, - style, - visible, - is_list, - status, - sort, - created_at, - updated_at -) VALUES ( - $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14 -) RETURNING *; - --- name: UpdateSysMenu :one -UPDATE sys_menu -SET name = $2, - display_name = $3, - url = $4, - type = $5, - parent_id = $6, - parent_path = $7, - avatar = $8, - style = $9, - visible = $10, - is_list = $11, - status = $12, - sort = $13, - updated_at = $14 -WHERE id = $1 -RETURNING *; - --- name: GetSysMenu :one -SELECT * FROM sys_menu -WHERE id = $1 LIMIT 1; - --- name: GetSysMenuByUrl :one -SELECT * FROM sys_menu -WHERE url = $1 LIMIT 1; - --- name: AllSysMenu :many -SELECT * FROM sys_menu -WHERE status = 0 -ORDER BY sort DESC; - --- name: ListSysMenuByRoleID :many -SELECT * FROM sys_menu -WHERE id IN (SELECT menu_id - FROM sys_role_menu - WHERE role_id = $1); - --- name: ListSysMenuIDByRoleID :many -SELECT menu_id -FROM sys_role_menu -WHERE role_id = $1; - --- name: ExistsMenu :one -SELECT EXISTS ( - SELECT 1 FROM sys_menu -); - --- name: RecursiveSysMenus :many -WITH RECURSIVE dist AS (SELECT sys_menu.* - FROM sys_menu - WHERE status = 0 - AND is_list = true - UNION ALL - SELECT sys_menu.* - FROM sys_menu, - dist - WHERE sys_menu.id = dist.parent_id) -SELECT * -FROM dist -ORDER BY dist.sort DESC, dist.id ASC; - --- name: RecursiveSysMenusByRoleID :many -WITH RECURSIVE dist AS (SELECT sys_menu.* - FROM sys_menu - WHERE status = 0 - AND is_list = true - AND id IN (SELECT menu_id - FROM sys_role_menu - WHERE role_id = $1) - UNION ALL - SELECT sys_menu.* - FROM sys_menu, - dist - WHERE sys_menu.id = dist.parent_id) -SELECT * -FROM dist -ORDER BY dist.sort DESC, dist.id ASC; \ No newline at end of file diff --git a/internal/db/query/sys_role.sql b/internal/db/query/sys_role.sql deleted file mode 100644 index 6f01bd6..0000000 --- a/internal/db/query/sys_role.sql +++ /dev/null @@ -1,77 +0,0 @@ --- name: CreateSysRole :one -INSERT INTO sys_role ( - name, - display_name, - vip, - parent_id, - parent_path, - status, - sort, - created_at, - updated_at -) VALUES ( - $1, $2, $3, $4, $5, $6, $7, $8, $9 -) RETURNING *; - --- name: UpdateSysRole :one -UPDATE sys_role -SET display_name = $2, - status = $3, - parent_id = $4, - parent_path = $5, - sort = $6, - updated_at = $7 -WHERE id = $1 -RETURNING *; - --- name: GetSysRole :one -SELECT * FROM sys_role -WHERE id = $1 LIMIT 1; - --- name: CountSysRole :one -SELECT count(*) FROM sys_role -WHERE status = 0; - --- name: ListSysRole :many -SELECT * FROM sys_role -WHERE status = 0; - --- name: AllSysRole :many -SELECT * FROM sys_role -WHERE status = 0 -ORDER BY sort DESC; - --- name: GetSysRoleByUserID :one -SELECT * FROM sys_role -WHERE id = (SELECT role_id - FROM sys_user - WHERE sys_user.id = $1); - --- name: ExistsVipRole :one -SELECT EXISTS ( - SELECT 1 FROM sys_role - WHERE vip = true -); - --- name: GetFirstVipRole :one -SELECT * FROM sys_role -WHERE vip = true -ORDER BY id ASC -LIMIT 1; - --- name: CountSysRoleCondition :one -SELECT COUNT(*) FROM sys_role -WHERE (NOT @is_status::Boolean OR status = @status) - AND (NOT @is_id::Boolean OR id = @id) - AND (NOT @is_parent_id::Boolean OR parent_id = @parent_id) - AND (@display_name::text = '' OR display_name ILIKE '%' || @display_name || '%'); - --- name: ListSysRoleCondition :many -SELECT * FROM sys_role -WHERE (NOT @is_status::Boolean OR status = @status) - AND (NOT @is_id::Boolean OR id = @id) - AND (NOT @is_parent_id::Boolean OR parent_id = @parent_id) - AND (@display_name::text = '' OR display_name ILIKE '%' || @display_name || '%') -ORDER BY created_at DESC -OFFSET @skip -LIMIT @size; \ No newline at end of file diff --git a/internal/db/query/sys_role_menu.sql b/internal/db/query/sys_role_menu.sql deleted file mode 100644 index 8289ec4..0000000 --- a/internal/db/query/sys_role_menu.sql +++ /dev/null @@ -1,11 +0,0 @@ --- name: DeleteRoleMneuByRoleID :exec -DELETE FROM sys_role_menu -WHERE role_id = $1; - --- name: CreateRoleMenu :exec -INSERT INTO sys_role_menu ( - role_id, - menu_id -) VALUES ( - $1, $2 -); \ No newline at end of file diff --git a/internal/db/query/sys_user.sql b/internal/db/query/sys_user.sql deleted file mode 100644 index 635da08..0000000 --- a/internal/db/query/sys_user.sql +++ /dev/null @@ -1,91 +0,0 @@ --- name: CreateSysUser :one -INSERT INTO sys_user ( - uuid, - email, - username, - hashed_password, - salt, - avatar, - gender, - department_id, - role_id, - status, - change_password_at, - created_at, - updated_at -) VALUES ( - $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13 -) RETURNING *; - --- name: UpdateSysUser :one -UPDATE sys_user -SET username = $2, - hashed_password = $3, - avatar = $4, - gender = $5, - department_id = $6, - role_id = $7, - status = $8, - change_password_at = $9, - updated_at = $10 -WHERE id = $1 -RETURNING *; - --- name: GetSysUser :one -SELECT * FROM sys_user -WHERE id = $1 LIMIT 1; - --- name: GetSysUserByEmail :one -SELECT * FROM sys_user -WHERE email = $1 LIMIT 1; - --- name: CountSysUser :one -SELECT COUNT(*) FROM sys_user -WHERE status = 0; - --- name: ListSysUser :many -SELECT * FROM sys_user -WHERE status = 0 -ORDER BY created_at DESC; - --- name: CountSysUserCondition :one -SELECT COUNT(*) FROM sys_user -WHERE (NOT @is_status::Boolean OR status = @status) - AND (NOT @is_id::Boolean OR id = @id) - AND (@username::text = '' OR username ILIKE '%' || @username || '%') - AND (@email::text = '' OR email ILIKE '%' || @email || '%'); - --- name: ListSysUserCondition :many -SELECT id, - uuid, - email, - username, - avatar, - gender, - department_id, - role_id, - status, - change_password_at, - created_at, - updated_at, - COALESCE((SELECT name FROM sys_department WHERE ID = sys_user.department_id), '') AS department_name, - COALESCE((SELECT display_name - FROM sys_role - WHERE id = sys_user.role_id), '') AS role_name -FROM sys_user -WHERE (NOT @is_status::Boolean OR sys_user.status = @status) - AND (NOT @is_id::Boolean OR sys_user.id = @id) - AND (@username::text = '' OR sys_user.username ILIKE '%' || @username || '%') - AND (@email::text = '' OR sys_user.email ILIKE '%' || @email || '%') -ORDER BY created_at DESC -OFFSET @skip -LIMIT @size; - --- name: ExistsSysUser :one -SELECT EXISTS ( - SELECT 1 FROM sys_user -); - --- name: ListSysUserByIds :many -SELECT * FROM sys_user -WHERE id = ANY($1::int[]); \ No newline at end of file diff --git a/internal/db/query/sys_user_login_log.sql b/internal/db/query/sys_user_login_log.sql deleted file mode 100644 index 4172735..0000000 --- a/internal/db/query/sys_user_login_log.sql +++ /dev/null @@ -1,41 +0,0 @@ --- name: CreateSysUserLoginLog :exec -INSERT INTO sys_user_login_log (created_at, - email, - username, - user_uuid, - is_success, - message, - referer_url, - url, - os, - ip, - browser) -VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11); - --- name: CountSysUserLoginLogCondition :one -SELECT COUNT(*) FROM sys_user_login_log -WHERE created_at BETWEEN @start_at AND @end_at - AND (@email::text = '' OR email ILIKE '%' || @email || '%') - AND (@username::text = '' OR username ILIKE '%' || @username || '%'); - --- name: ListSysUserLoginLogCondition :many -SELECT - id, - created_at, - email, - COALESCE((SELECT username FROM sys_user WHERE email = sys_user_login_log.email LIMIT 1), '') AS username, - user_uuid, - is_success, - message, - referer_url, - url, - os, - ip, - browser -FROM sys_user_login_log -WHERE sys_user_login_log.created_at BETWEEN @start_at AND @end_at - AND (@email::text = '' OR email ILIKE '%' || @email || '%') - AND (@username::text = '' OR username ILIKE '%' || @username || '%') -ORDER BY created_at DESC -OFFSET @skip -LIMIT @size; \ No newline at end of file diff --git a/internal/db/sqlc/budget.sql.go b/internal/db/sqlc/budget.sql.go deleted file mode 100644 index 5613f42..0000000 --- a/internal/db/sqlc/budget.sql.go +++ /dev/null @@ -1,222 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. -// versions: -// sqlc v1.28.0 -// source: budget.sql - -package db - -import ( - "context" - "time" - - "github.com/jackc/pgx/v5/pgtype" -) - -const createBudget = `-- name: CreateBudget :one -INSERT INTO budgets (project_id, name, budget_type, category, start_at, end_at, amount, used_amount, remaining_amount, remark, created_user_id) -VALUES($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11) -RETURNING id, project_id, name, budget_type, category, start_at, end_at, amount, used_amount, remaining_amount, remark, status, sort, created_at, created_user_id, updated_at, updated_user_id -` - -type CreateBudgetParams struct { - ProjectID int64 `json:"project_id"` - Name string `json:"name"` - BudgetType int32 `json:"budget_type"` - Category int32 `json:"category"` - StartAt time.Time `json:"start_at"` - EndAt time.Time `json:"end_at"` - Amount pgtype.Numeric `json:"amount"` - UsedAmount pgtype.Numeric `json:"used_amount"` - RemainingAmount pgtype.Numeric `json:"remaining_amount"` - Remark string `json:"remark"` - CreatedUserID int32 `json:"created_user_id"` -} - -func (q *Queries) CreateBudget(ctx context.Context, arg *CreateBudgetParams) (*Budget, error) { - row := q.db.QueryRow(ctx, createBudget, - arg.ProjectID, - arg.Name, - arg.BudgetType, - arg.Category, - arg.StartAt, - arg.EndAt, - arg.Amount, - arg.UsedAmount, - arg.RemainingAmount, - arg.Remark, - arg.CreatedUserID, - ) - var i Budget - err := row.Scan( - &i.ID, - &i.ProjectID, - &i.Name, - &i.BudgetType, - &i.Category, - &i.StartAt, - &i.EndAt, - &i.Amount, - &i.UsedAmount, - &i.RemainingAmount, - &i.Remark, - &i.Status, - &i.Sort, - &i.CreatedAt, - &i.CreatedUserID, - &i.UpdatedAt, - &i.UpdatedUserID, - ) - return &i, err -} - -const getBudget = `-- name: GetBudget :one -SELECT id, project_id, name, budget_type, category, start_at, end_at, amount, used_amount, remaining_amount, remark, status, sort, created_at, created_user_id, updated_at, updated_user_id -FROM budgets -WHERE id = $1 -LIMIT 1 -` - -func (q *Queries) GetBudget(ctx context.Context, id int64) (*Budget, error) { - row := q.db.QueryRow(ctx, getBudget, id) - var i Budget - err := row.Scan( - &i.ID, - &i.ProjectID, - &i.Name, - &i.BudgetType, - &i.Category, - &i.StartAt, - &i.EndAt, - &i.Amount, - &i.UsedAmount, - &i.RemainingAmount, - &i.Remark, - &i.Status, - &i.Sort, - &i.CreatedAt, - &i.CreatedUserID, - &i.UpdatedAt, - &i.UpdatedUserID, - ) - return &i, err -} - -const listBudgets = `-- name: ListBudgets :many -SELECT id, project_id, name, budget_type, category, start_at, end_at, amount, used_amount, remaining_amount, remark, status, sort, created_at, created_user_id, updated_at, updated_user_id -FROM budgets -WHERE project_id = $1 -ORDER BY id -` - -func (q *Queries) ListBudgets(ctx context.Context, projectID int64) ([]*Budget, error) { - rows, err := q.db.Query(ctx, listBudgets, projectID) - if err != nil { - return nil, err - } - defer rows.Close() - items := []*Budget{} - for rows.Next() { - var i Budget - if err := rows.Scan( - &i.ID, - &i.ProjectID, - &i.Name, - &i.BudgetType, - &i.Category, - &i.StartAt, - &i.EndAt, - &i.Amount, - &i.UsedAmount, - &i.RemainingAmount, - &i.Remark, - &i.Status, - &i.Sort, - &i.CreatedAt, - &i.CreatedUserID, - &i.UpdatedAt, - &i.UpdatedUserID, - ); err != nil { - return nil, err - } - items = append(items, &i) - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const updateBudget = `-- name: UpdateBudget :one -UPDATE budgets -SET - project_id = COALESCE($2, project_id), - name = COALESCE($3, name), - budget_type = COALESCE($4, budget_type), - category = COALESCE($5, category), - start_at = COALESCE($6, start_at), - end_at = COALESCE($7, end_at), - amount = COALESCE($8, amount), - used_amount = COALESCE($9, used_amount), - remaining_amount = COALESCE($10, remaining_amount), - remark = COALESCE($11, remark), - status = COALESCE($12, status), - updated_user_id = COALESCE($13, updated_user_id), - updated_at = NOW() -WHERE id = $1 -RETURNING id, project_id, name, budget_type, category, start_at, end_at, amount, used_amount, remaining_amount, remark, status, sort, created_at, created_user_id, updated_at, updated_user_id -` - -type UpdateBudgetParams struct { - ID int64 `json:"id"` - ProjectID pgtype.Int8 `json:"project_id"` - Name pgtype.Text `json:"name"` - BudgetType pgtype.Int4 `json:"budget_type"` - Category pgtype.Int4 `json:"category"` - StartAt pgtype.Timestamptz `json:"start_at"` - EndAt pgtype.Timestamptz `json:"end_at"` - Amount pgtype.Numeric `json:"amount"` - UsedAmount pgtype.Numeric `json:"used_amount"` - RemainingAmount pgtype.Numeric `json:"remaining_amount"` - Remark pgtype.Text `json:"remark"` - Status pgtype.Int2 `json:"status"` - UpdatedUserID pgtype.Int4 `json:"updated_user_id"` -} - -func (q *Queries) UpdateBudget(ctx context.Context, arg *UpdateBudgetParams) (*Budget, error) { - row := q.db.QueryRow(ctx, updateBudget, - arg.ID, - arg.ProjectID, - arg.Name, - arg.BudgetType, - arg.Category, - arg.StartAt, - arg.EndAt, - arg.Amount, - arg.UsedAmount, - arg.RemainingAmount, - arg.Remark, - arg.Status, - arg.UpdatedUserID, - ) - var i Budget - err := row.Scan( - &i.ID, - &i.ProjectID, - &i.Name, - &i.BudgetType, - &i.Category, - &i.StartAt, - &i.EndAt, - &i.Amount, - &i.UsedAmount, - &i.RemainingAmount, - &i.Remark, - &i.Status, - &i.Sort, - &i.CreatedAt, - &i.CreatedUserID, - &i.UpdatedAt, - &i.UpdatedUserID, - ) - return &i, err -} diff --git a/internal/db/sqlc/categroy.sql.go b/internal/db/sqlc/categroy.sql.go deleted file mode 100644 index 78af4b8..0000000 --- a/internal/db/sqlc/categroy.sql.go +++ /dev/null @@ -1,435 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. -// versions: -// sqlc v1.28.0 -// source: categroy.sql - -package db - -import ( - "context" - "time" - - "github.com/jackc/pgx/v5/pgtype" -) - -const allCategories = `-- name: AllCategories :many -SELECT id, name, icon, description, letter, parent_id, parent_path, status, sort, created_at, updated_at FROM categories -WHERE status = 0 -ORDER BY sort DESC, id ASC -` - -func (q *Queries) AllCategories(ctx context.Context) ([]*Category, error) { - rows, err := q.db.Query(ctx, allCategories) - if err != nil { - return nil, err - } - defer rows.Close() - items := []*Category{} - for rows.Next() { - var i Category - if err := rows.Scan( - &i.ID, - &i.Name, - &i.Icon, - &i.Description, - &i.Letter, - &i.ParentID, - &i.ParentPath, - &i.Status, - &i.Sort, - &i.CreatedAt, - &i.UpdatedAt, - ); err != nil { - return nil, err - } - items = append(items, &i) - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const countCategoriesCondition = `-- name: CountCategoriesCondition :one -SELECT COUNT(*) FROM categories -WHERE (NOT $1::Boolean OR status = $2) - AND (NOT $3::Boolean OR id = $4) - AND (NOT $5::Boolean OR parent_id = $6) - AND ($7::text = '' OR name ILIKE '%' || $7 || '%') -` - -type CountCategoriesConditionParams struct { - IsStatus bool `json:"is_status"` - Status int16 `json:"status"` - IsID bool `json:"is_id"` - ID int32 `json:"id"` - IsParentID bool `json:"is_parent_id"` - ParentID int32 `json:"parent_id"` - Name string `json:"name"` -} - -func (q *Queries) CountCategoriesCondition(ctx context.Context, arg *CountCategoriesConditionParams) (int64, error) { - row := q.db.QueryRow(ctx, countCategoriesCondition, - arg.IsStatus, - arg.Status, - arg.IsID, - arg.ID, - arg.IsParentID, - arg.ParentID, - arg.Name, - ) - var count int64 - err := row.Scan(&count) - return count, err -} - -const createCategory = `-- name: CreateCategory :one -INSERT INTO categories ( - name, - icon, - description, - letter, - parent_id, - parent_path, - status, - sort -) -VALUES ($1, $2, $3, $4, $5, $6, $7, $8) -RETURNING id, name, icon, description, letter, parent_id, parent_path, status, sort, created_at, updated_at -` - -type CreateCategoryParams struct { - Name string `json:"name"` - Icon string `json:"icon"` - Description string `json:"description"` - Letter string `json:"letter"` - ParentID int32 `json:"parent_id"` - ParentPath string `json:"parent_path"` - Status int16 `json:"status"` - Sort int32 `json:"sort"` -} - -func (q *Queries) CreateCategory(ctx context.Context, arg *CreateCategoryParams) (*Category, error) { - row := q.db.QueryRow(ctx, createCategory, - arg.Name, - arg.Icon, - arg.Description, - arg.Letter, - arg.ParentID, - arg.ParentPath, - arg.Status, - arg.Sort, - ) - var i Category - err := row.Scan( - &i.ID, - &i.Name, - &i.Icon, - &i.Description, - &i.Letter, - &i.ParentID, - &i.ParentPath, - &i.Status, - &i.Sort, - &i.CreatedAt, - &i.UpdatedAt, - ) - return &i, err -} - -const existsCategories = `-- name: ExistsCategories :one -SELECT EXISTS ( - SELECT 1 FROM categories -) -` - -func (q *Queries) ExistsCategories(ctx context.Context) (bool, error) { - row := q.db.QueryRow(ctx, existsCategories) - var exists bool - err := row.Scan(&exists) - return exists, err -} - -const getCategory = `-- name: GetCategory :one -SELECT id, name, icon, description, letter, parent_id, parent_path, status, sort, created_at, updated_at -FROM categories -WHERE id = $1 -LIMIT 1 -` - -func (q *Queries) GetCategory(ctx context.Context, id int32) (*Category, error) { - row := q.db.QueryRow(ctx, getCategory, id) - var i Category - err := row.Scan( - &i.ID, - &i.Name, - &i.Icon, - &i.Description, - &i.Letter, - &i.ParentID, - &i.ParentPath, - &i.Status, - &i.Sort, - &i.CreatedAt, - &i.UpdatedAt, - ) - return &i, err -} - -const listCategories = `-- name: ListCategories :many -SELECT id, name, icon, description, letter, parent_id, parent_path, status, sort, created_at, updated_at FROM categories -WHERE status = 0 -` - -func (q *Queries) ListCategories(ctx context.Context) ([]*Category, error) { - rows, err := q.db.Query(ctx, listCategories) - if err != nil { - return nil, err - } - defer rows.Close() - items := []*Category{} - for rows.Next() { - var i Category - if err := rows.Scan( - &i.ID, - &i.Name, - &i.Icon, - &i.Description, - &i.Letter, - &i.ParentID, - &i.ParentPath, - &i.Status, - &i.Sort, - &i.CreatedAt, - &i.UpdatedAt, - ); err != nil { - return nil, err - } - items = append(items, &i) - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const listCategoriesByPath = `-- name: ListCategoriesByPath :many -SELECT id, name, icon, description, letter, parent_id, parent_path, status, sort, created_at, updated_at FROM categories -WHERE parent_path LIKE $1 -AND status = 0 -ORDER BY sort DESC, id ASC -` - -func (q *Queries) ListCategoriesByPath(ctx context.Context, parentPath string) ([]*Category, error) { - rows, err := q.db.Query(ctx, listCategoriesByPath, parentPath) - if err != nil { - return nil, err - } - defer rows.Close() - items := []*Category{} - for rows.Next() { - var i Category - if err := rows.Scan( - &i.ID, - &i.Name, - &i.Icon, - &i.Description, - &i.Letter, - &i.ParentID, - &i.ParentPath, - &i.Status, - &i.Sort, - &i.CreatedAt, - &i.UpdatedAt, - ); err != nil { - return nil, err - } - items = append(items, &i) - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const listCategoriesCondition = `-- name: ListCategoriesCondition :many -SELECT id, name, icon, description, letter, parent_id, parent_path, status, sort, created_at, updated_at FROM categories -WHERE (NOT $1::Boolean OR status = $2) - AND (NOT $3::Boolean OR id = $4) - AND (NOT $5::Boolean OR parent_id = $6) - AND ($7::text = '' OR name ILIKE '%' || $7 || '%') -ORDER BY sort DESC, id ASC -OFFSET $8 -LIMIT $9 -` - -type ListCategoriesConditionParams struct { - IsStatus bool `json:"is_status"` - Status int16 `json:"status"` - IsID bool `json:"is_id"` - ID int32 `json:"id"` - IsParentID bool `json:"is_parent_id"` - ParentID int32 `json:"parent_id"` - Name string `json:"name"` - Skip int32 `json:"skip"` - Size int32 `json:"size"` -} - -func (q *Queries) ListCategoriesCondition(ctx context.Context, arg *ListCategoriesConditionParams) ([]*Category, error) { - rows, err := q.db.Query(ctx, listCategoriesCondition, - arg.IsStatus, - arg.Status, - arg.IsID, - arg.ID, - arg.IsParentID, - arg.ParentID, - arg.Name, - arg.Skip, - arg.Size, - ) - if err != nil { - return nil, err - } - defer rows.Close() - items := []*Category{} - for rows.Next() { - var i Category - if err := rows.Scan( - &i.ID, - &i.Name, - &i.Icon, - &i.Description, - &i.Letter, - &i.ParentID, - &i.ParentPath, - &i.Status, - &i.Sort, - &i.CreatedAt, - &i.UpdatedAt, - ); err != nil { - return nil, err - } - items = append(items, &i) - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const listCategoriesRecursive = `-- name: ListCategoriesRecursive :many -WITH RECURSIVE dist AS (SELECT categories.id, categories.name, categories.icon, categories.description, categories.letter, categories.parent_id, categories.parent_path, categories.status, categories.sort, categories.created_at, categories.updated_at - FROM categories - WHERE status = 0 - UNION ALL - SELECT categories.id, categories.name, categories.icon, categories.description, categories.letter, categories.parent_id, categories.parent_path, categories.status, categories.sort, categories.created_at, categories.updated_at - FROM categories, - dist - WHERE categories.id = dist.parent_id) -SELECT DISTINCT id, name, icon, description, letter, parent_id, parent_path, status, sort, created_at, updated_at -FROM dist -ORDER BY sort DESC, id ASC -` - -type ListCategoriesRecursiveRow struct { - ID int32 `json:"id"` - Name string `json:"name"` - Icon string `json:"icon"` - Description string `json:"description"` - Letter string `json:"letter"` - ParentID int32 `json:"parent_id"` - ParentPath string `json:"parent_path"` - Status int16 `json:"status"` - Sort int32 `json:"sort"` - CreatedAt time.Time `json:"created_at"` - UpdatedAt time.Time `json:"updated_at"` -} - -func (q *Queries) ListCategoriesRecursive(ctx context.Context) ([]*ListCategoriesRecursiveRow, error) { - rows, err := q.db.Query(ctx, listCategoriesRecursive) - if err != nil { - return nil, err - } - defer rows.Close() - items := []*ListCategoriesRecursiveRow{} - for rows.Next() { - var i ListCategoriesRecursiveRow - if err := rows.Scan( - &i.ID, - &i.Name, - &i.Icon, - &i.Description, - &i.Letter, - &i.ParentID, - &i.ParentPath, - &i.Status, - &i.Sort, - &i.CreatedAt, - &i.UpdatedAt, - ); err != nil { - return nil, err - } - items = append(items, &i) - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const updateCategory = `-- name: UpdateCategory :one -UPDATE categories -SET - name = COALESCE($2, name), - icon = COALESCE($3, icon), - description = COALESCE($4, description), - letter = COALESCE($5, letter), - parent_id = COALESCE($6, parent_id), - parent_path = COALESCE($7, parent_path), - sort = COALESCE($8, sort), - status = COALESCE($9, status), - updated_at = NOW() -WHERE id = $1 -RETURNING id, name, icon, description, letter, parent_id, parent_path, status, sort, created_at, updated_at -` - -type UpdateCategoryParams struct { - ID int32 `json:"id"` - Name pgtype.Text `json:"name"` - Icon pgtype.Text `json:"icon"` - Description pgtype.Text `json:"description"` - Letter pgtype.Text `json:"letter"` - ParentID pgtype.Int4 `json:"parent_id"` - ParentPath pgtype.Text `json:"parent_path"` - Sort pgtype.Int4 `json:"sort"` - Status pgtype.Int2 `json:"status"` -} - -func (q *Queries) UpdateCategory(ctx context.Context, arg *UpdateCategoryParams) (*Category, error) { - row := q.db.QueryRow(ctx, updateCategory, - arg.ID, - arg.Name, - arg.Icon, - arg.Description, - arg.Letter, - arg.ParentID, - arg.ParentPath, - arg.Sort, - arg.Status, - ) - var i Category - err := row.Scan( - &i.ID, - &i.Name, - &i.Icon, - &i.Description, - &i.Letter, - &i.ParentID, - &i.ParentPath, - &i.Status, - &i.Sort, - &i.CreatedAt, - &i.UpdatedAt, - ) - return &i, err -} diff --git a/internal/db/sqlc/customer.sql.go b/internal/db/sqlc/customer.sql.go deleted file mode 100644 index 34f0be6..0000000 --- a/internal/db/sqlc/customer.sql.go +++ /dev/null @@ -1,246 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. -// versions: -// sqlc v1.28.0 -// source: customer.sql - -package db - -import ( - "context" - - "github.com/jackc/pgx/v5/pgtype" -) - -const allCustomers = `-- name: AllCustomers :many -SELECT id, name, category, source, address, contact_name, contact_phone, status, sort, created_at, created_by, updated_at, updated_by FROM customers -WHERE status = 0 -ORDER BY id DESC -` - -func (q *Queries) AllCustomers(ctx context.Context) ([]*Customer, error) { - rows, err := q.db.Query(ctx, allCustomers) - if err != nil { - return nil, err - } - defer rows.Close() - items := []*Customer{} - for rows.Next() { - var i Customer - if err := rows.Scan( - &i.ID, - &i.Name, - &i.Category, - &i.Source, - &i.Address, - &i.ContactName, - &i.ContactPhone, - &i.Status, - &i.Sort, - &i.CreatedAt, - &i.CreatedBy, - &i.UpdatedAt, - &i.UpdatedBy, - ); err != nil { - return nil, err - } - items = append(items, &i) - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const countCustomers = `-- name: CountCustomers :one -SELECT COUNT(1) -FROM customers -WHERE status = 0 -` - -func (q *Queries) CountCustomers(ctx context.Context) (int64, error) { - row := q.db.QueryRow(ctx, countCustomers) - var count int64 - err := row.Scan(&count) - return count, err -} - -const createCustomer = `-- name: CreateCustomer :one -INSERT INTO customers (id, name, category, source, address, contact_name, contact_phone, created_by) -VALUES ($1, $2, $3, $4, $5, $6, $7, $8) -RETURNING id, name, category, source, address, contact_name, contact_phone, status, sort, created_at, created_by, updated_at, updated_by -` - -type CreateCustomerParams struct { - ID int64 `json:"id"` - Name string `json:"name"` - Category int32 `json:"category"` - Source int32 `json:"source"` - Address string `json:"address"` - ContactName string `json:"contact_name"` - ContactPhone string `json:"contact_phone"` - CreatedBy int32 `json:"created_by"` -} - -func (q *Queries) CreateCustomer(ctx context.Context, arg *CreateCustomerParams) (*Customer, error) { - row := q.db.QueryRow(ctx, createCustomer, - arg.ID, - arg.Name, - arg.Category, - arg.Source, - arg.Address, - arg.ContactName, - arg.ContactPhone, - arg.CreatedBy, - ) - var i Customer - err := row.Scan( - &i.ID, - &i.Name, - &i.Category, - &i.Source, - &i.Address, - &i.ContactName, - &i.ContactPhone, - &i.Status, - &i.Sort, - &i.CreatedAt, - &i.CreatedBy, - &i.UpdatedAt, - &i.UpdatedBy, - ) - return &i, err -} - -const getCustomer = `-- name: GetCustomer :one -SELECT id, name, category, source, address, contact_name, contact_phone, status, sort, created_at, created_by, updated_at, updated_by -FROM customers -WHERE id = $1 -LIMIT 1 -` - -func (q *Queries) GetCustomer(ctx context.Context, id int64) (*Customer, error) { - row := q.db.QueryRow(ctx, getCustomer, id) - var i Customer - err := row.Scan( - &i.ID, - &i.Name, - &i.Category, - &i.Source, - &i.Address, - &i.ContactName, - &i.ContactPhone, - &i.Status, - &i.Sort, - &i.CreatedAt, - &i.CreatedBy, - &i.UpdatedAt, - &i.UpdatedBy, - ) - return &i, err -} - -const listCustomers = `-- name: ListCustomers :many -SELECT id, name, category, source, address, contact_name, contact_phone, status, sort, created_at, created_by, updated_at, updated_by -FROM customers -WHERE status = 0 -ORDER BY id DESC -LIMIT $1 OFFSET $2 -` - -type ListCustomersParams struct { - Limit int32 `json:"limit"` - Offset int32 `json:"offset"` -} - -func (q *Queries) ListCustomers(ctx context.Context, arg *ListCustomersParams) ([]*Customer, error) { - rows, err := q.db.Query(ctx, listCustomers, arg.Limit, arg.Offset) - if err != nil { - return nil, err - } - defer rows.Close() - items := []*Customer{} - for rows.Next() { - var i Customer - if err := rows.Scan( - &i.ID, - &i.Name, - &i.Category, - &i.Source, - &i.Address, - &i.ContactName, - &i.ContactPhone, - &i.Status, - &i.Sort, - &i.CreatedAt, - &i.CreatedBy, - &i.UpdatedAt, - &i.UpdatedBy, - ); err != nil { - return nil, err - } - items = append(items, &i) - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const updateCustomer = `-- name: UpdateCustomer :one -UPDATE customers -SET - name = COALESCE($2, name), - category = COALESCE($3, category), - source = COALESCE($4, source), - address = COALESCE($5, address), - contact_name = COALESCE($6, contact_name), - contact_phone = COALESCE($7, contact_phone), - status = COALESCE($8, status), - updated_by = COALESCE($9, updated_by), - updated_at = NOW() -WHERE id = $1 -RETURNING id, name, category, source, address, contact_name, contact_phone, status, sort, created_at, created_by, updated_at, updated_by -` - -type UpdateCustomerParams struct { - ID int64 `json:"id"` - Name pgtype.Text `json:"name"` - Category pgtype.Int4 `json:"category"` - Source pgtype.Int4 `json:"source"` - Address pgtype.Text `json:"address"` - ContactName pgtype.Text `json:"contact_name"` - ContactPhone pgtype.Text `json:"contact_phone"` - Status pgtype.Int2 `json:"status"` - UpdatedBy pgtype.Int4 `json:"updated_by"` -} - -func (q *Queries) UpdateCustomer(ctx context.Context, arg *UpdateCustomerParams) (*Customer, error) { - row := q.db.QueryRow(ctx, updateCustomer, - arg.ID, - arg.Name, - arg.Category, - arg.Source, - arg.Address, - arg.ContactName, - arg.ContactPhone, - arg.Status, - arg.UpdatedBy, - ) - var i Customer - err := row.Scan( - &i.ID, - &i.Name, - &i.Category, - &i.Source, - &i.Address, - &i.ContactName, - &i.ContactPhone, - &i.Status, - &i.Sort, - &i.CreatedAt, - &i.CreatedBy, - &i.UpdatedAt, - &i.UpdatedBy, - ) - return &i, err -} diff --git a/internal/db/sqlc/db.go b/internal/db/sqlc/db.go deleted file mode 100644 index eeee39e..0000000 --- a/internal/db/sqlc/db.go +++ /dev/null @@ -1,32 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. -// versions: -// sqlc v1.28.0 - -package db - -import ( - "context" - - "github.com/jackc/pgx/v5" - "github.com/jackc/pgx/v5/pgconn" -) - -type DBTX interface { - Exec(context.Context, string, ...interface{}) (pgconn.CommandTag, error) - Query(context.Context, string, ...interface{}) (pgx.Rows, error) - QueryRow(context.Context, string, ...interface{}) pgx.Row -} - -func New(db DBTX) *Queries { - return &Queries{db: db} -} - -type Queries struct { - db DBTX -} - -func (q *Queries) WithTx(tx pgx.Tx) *Queries { - return &Queries{ - db: tx, - } -} diff --git a/internal/db/sqlc/dtos.go b/internal/db/sqlc/dtos.go deleted file mode 100644 index d65a143..0000000 --- a/internal/db/sqlc/dtos.go +++ /dev/null @@ -1,56 +0,0 @@ -package db - -import "time" - -type SysDepartmentDto struct { - ID int32 `json:"id"` - // 部门名称 - Name string `json:"name"` - // 上级id - ParentID int32 `json:"parent_id"` - // 树路径 - ParentPath string `json:"parent_path"` - // 状态 - Status int32 `json:"status"` - // 排序 - Sort int32 `json:"sort"` - // 创建时间 - CreatedAt time.Time `json:"created_at"` - // 更新时间 - UpdatedAt time.Time `json:"updated_at"` - Children []*SysDepartmentDto `json:"children"` -} - -type SysMenuDto struct { - ID int32 `json:"id"` - // 名称 - Name string `json:"name"` - // 显示名称 - DisplayName string `json:"display_name"` - // 菜单url - Url string `json:"url"` - // 菜单类型(node, menu, btn) - Type string `json:"type"` - // 上级id - ParentID int32 `json:"parent_id"` - // 树路径 - ParentPath string `json:"parent_path"` - // 菜单图标 - Avatar string `json:"avatar"` - // 菜单样式 - Style string `json:"style"` - // 是否可见 - Visible bool `json:"visible"` - // 是否列表 - IsList bool `json:"is_list"` - // 状态 - Status int32 `json:"status"` - // 排序 - Sort int32 `json:"sort"` - // 创建时间 - CreatedAt time.Time `json:"created_at"` - // 更新时间 - UpdatedAt time.Time `json:"updated_at"` - - Children []*SysMenuDto `json:"children"` -} diff --git a/internal/db/sqlc/expenses.sql.go b/internal/db/sqlc/expenses.sql.go deleted file mode 100644 index 4a65572..0000000 --- a/internal/db/sqlc/expenses.sql.go +++ /dev/null @@ -1,234 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. -// versions: -// sqlc v1.28.0 -// source: expenses.sql - -package db - -import ( - "context" - "time" - - "github.com/jackc/pgx/v5/pgtype" -) - -const createExpense = `-- name: CreateExpense :one -INSERT INTO expenses (project_id, budget_id, amount, expenses_at, expenses_type, remark, status, created_user_id) -VALUES ($1, $2, $3, $4, $5, $6, $7, $8) -RETURNING id, project_id, budget_id, amount, expenses_at, expenses_type, remark, status, created_at, created_user_id, updated_at, updated_user_id -` - -type CreateExpenseParams struct { - ProjectID int64 `json:"project_id"` - BudgetID int64 `json:"budget_id"` - Amount pgtype.Numeric `json:"amount"` - ExpensesAt time.Time `json:"expenses_at"` - ExpensesType int32 `json:"expenses_type"` - Remark string `json:"remark"` - Status int16 `json:"status"` - CreatedUserID int32 `json:"created_user_id"` -} - -func (q *Queries) CreateExpense(ctx context.Context, arg *CreateExpenseParams) (*Expense, error) { - row := q.db.QueryRow(ctx, createExpense, - arg.ProjectID, - arg.BudgetID, - arg.Amount, - arg.ExpensesAt, - arg.ExpensesType, - arg.Remark, - arg.Status, - arg.CreatedUserID, - ) - var i Expense - err := row.Scan( - &i.ID, - &i.ProjectID, - &i.BudgetID, - &i.Amount, - &i.ExpensesAt, - &i.ExpensesType, - &i.Remark, - &i.Status, - &i.CreatedAt, - &i.CreatedUserID, - &i.UpdatedAt, - &i.UpdatedUserID, - ) - return &i, err -} - -const getExpense = `-- name: GetExpense :one -SELECT id, project_id, budget_id, amount, expenses_at, expenses_type, remark, status, created_at, created_user_id, updated_at, updated_user_id -FROM expenses -WHERE id = $1 -LIMIT 1 -` - -func (q *Queries) GetExpense(ctx context.Context, id int64) (*Expense, error) { - row := q.db.QueryRow(ctx, getExpense, id) - var i Expense - err := row.Scan( - &i.ID, - &i.ProjectID, - &i.BudgetID, - &i.Amount, - &i.ExpensesAt, - &i.ExpensesType, - &i.Remark, - &i.Status, - &i.CreatedAt, - &i.CreatedUserID, - &i.UpdatedAt, - &i.UpdatedUserID, - ) - return &i, err -} - -const statisticsExpense = `-- name: StatisticsExpense :many -SELECT SUM(amount)::numeric as total_amount, - (select name from categories where id = expenses.expenses_type) expenses_type_name -FROM expenses -GROUP BY expenses_type -` - -type StatisticsExpenseRow struct { - TotalAmount pgtype.Numeric `json:"total_amount"` - ExpensesTypeName string `json:"expenses_type_name"` -} - -func (q *Queries) StatisticsExpense(ctx context.Context) ([]*StatisticsExpenseRow, error) { - rows, err := q.db.Query(ctx, statisticsExpense) - if err != nil { - return nil, err - } - defer rows.Close() - items := []*StatisticsExpenseRow{} - for rows.Next() { - var i StatisticsExpenseRow - if err := rows.Scan(&i.TotalAmount, &i.ExpensesTypeName); err != nil { - return nil, err - } - items = append(items, &i) - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const statisticsExpenseByProjectID = `-- name: StatisticsExpenseByProjectID :many -SELECT SUM(amount)::numeric as total_amount, - (select name from categories where id = expenses.expenses_type) expenses_type_name -FROM expenses -WHERE project_id = $1 -GROUP BY expenses_type -` - -type StatisticsExpenseByProjectIDRow struct { - TotalAmount pgtype.Numeric `json:"total_amount"` - ExpensesTypeName string `json:"expenses_type_name"` -} - -func (q *Queries) StatisticsExpenseByProjectID(ctx context.Context, projectID int64) ([]*StatisticsExpenseByProjectIDRow, error) { - rows, err := q.db.Query(ctx, statisticsExpenseByProjectID, projectID) - if err != nil { - return nil, err - } - defer rows.Close() - items := []*StatisticsExpenseByProjectIDRow{} - for rows.Next() { - var i StatisticsExpenseByProjectIDRow - if err := rows.Scan(&i.TotalAmount, &i.ExpensesTypeName); err != nil { - return nil, err - } - items = append(items, &i) - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const sumExpense = `-- name: SumExpense :one -SELECT SUM(amount)::numeric -FROM expenses -` - -func (q *Queries) SumExpense(ctx context.Context) (pgtype.Numeric, error) { - row := q.db.QueryRow(ctx, sumExpense) - var column_1 pgtype.Numeric - err := row.Scan(&column_1) - return column_1, err -} - -const sumExpenseByProjectID = `-- name: SumExpenseByProjectID :one -SELECT SUM(amount)::numeric -FROM expenses -WHERE project_id = $1 -` - -func (q *Queries) SumExpenseByProjectID(ctx context.Context, projectID int64) (pgtype.Numeric, error) { - row := q.db.QueryRow(ctx, sumExpenseByProjectID, projectID) - var column_1 pgtype.Numeric - err := row.Scan(&column_1) - return column_1, err -} - -const updateExpense = `-- name: UpdateExpense :one -UPDATE expenses -SET - project_id = COALESCE($2, project_id), - budget_id = COALESCE($3, budget_id), - amount = COALESCE($4, amount), - expenses_at = COALESCE($5, expenses_at), - expenses_type = COALESCE($6, expenses_type), - remark = COALESCE($7, remark), - status = COALESCE($8, status), - updated_user_id = COALESCE($9, updated_user_id), - updated_at = NOW() -WHERE id = $1 -RETURNING id, project_id, budget_id, amount, expenses_at, expenses_type, remark, status, created_at, created_user_id, updated_at, updated_user_id -` - -type UpdateExpenseParams struct { - ID int64 `json:"id"` - ProjectID pgtype.Int8 `json:"project_id"` - BudgetID pgtype.Int8 `json:"budget_id"` - Amount pgtype.Numeric `json:"amount"` - ExpensesAt pgtype.Timestamptz `json:"expenses_at"` - ExpensesType pgtype.Int4 `json:"expenses_type"` - Remark pgtype.Text `json:"remark"` - Status pgtype.Int2 `json:"status"` - UpdatedUserID pgtype.Int4 `json:"updated_user_id"` -} - -func (q *Queries) UpdateExpense(ctx context.Context, arg *UpdateExpenseParams) (*Expense, error) { - row := q.db.QueryRow(ctx, updateExpense, - arg.ID, - arg.ProjectID, - arg.BudgetID, - arg.Amount, - arg.ExpensesAt, - arg.ExpensesType, - arg.Remark, - arg.Status, - arg.UpdatedUserID, - ) - var i Expense - err := row.Scan( - &i.ID, - &i.ProjectID, - &i.BudgetID, - &i.Amount, - &i.ExpensesAt, - &i.ExpensesType, - &i.Remark, - &i.Status, - &i.CreatedAt, - &i.CreatedUserID, - &i.UpdatedAt, - &i.UpdatedUserID, - ) - return &i, err -} diff --git a/internal/db/sqlc/income.sql.go b/internal/db/sqlc/income.sql.go deleted file mode 100644 index 31e1f03..0000000 --- a/internal/db/sqlc/income.sql.go +++ /dev/null @@ -1,242 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. -// versions: -// sqlc v1.28.0 -// source: income.sql - -package db - -import ( - "context" - "time" - - "github.com/jackc/pgx/v5/pgtype" -) - -const createIncome = `-- name: CreateIncome :one -INSERT INTO incomes (project_id, budget_id, amount, income_at, income_type, income_bank, remark, status, created_user_id) -VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) -RETURNING id, project_id, budget_id, amount, income_at, income_type, income_bank, remark, status, created_at, created_user_id, updated_at, updated_user_id -` - -type CreateIncomeParams struct { - ProjectID int64 `json:"project_id"` - BudgetID int64 `json:"budget_id"` - Amount pgtype.Numeric `json:"amount"` - IncomeAt time.Time `json:"income_at"` - IncomeType int32 `json:"income_type"` - IncomeBank int32 `json:"income_bank"` - Remark string `json:"remark"` - Status int16 `json:"status"` - CreatedUserID int32 `json:"created_user_id"` -} - -func (q *Queries) CreateIncome(ctx context.Context, arg *CreateIncomeParams) (*Income, error) { - row := q.db.QueryRow(ctx, createIncome, - arg.ProjectID, - arg.BudgetID, - arg.Amount, - arg.IncomeAt, - arg.IncomeType, - arg.IncomeBank, - arg.Remark, - arg.Status, - arg.CreatedUserID, - ) - var i Income - err := row.Scan( - &i.ID, - &i.ProjectID, - &i.BudgetID, - &i.Amount, - &i.IncomeAt, - &i.IncomeType, - &i.IncomeBank, - &i.Remark, - &i.Status, - &i.CreatedAt, - &i.CreatedUserID, - &i.UpdatedAt, - &i.UpdatedUserID, - ) - return &i, err -} - -const getIncome = `-- name: GetIncome :one -SELECT id, project_id, budget_id, amount, income_at, income_type, income_bank, remark, status, created_at, created_user_id, updated_at, updated_user_id -FROM incomes -WHERE id = $1 -LIMIT 1 -` - -func (q *Queries) GetIncome(ctx context.Context, id int64) (*Income, error) { - row := q.db.QueryRow(ctx, getIncome, id) - var i Income - err := row.Scan( - &i.ID, - &i.ProjectID, - &i.BudgetID, - &i.Amount, - &i.IncomeAt, - &i.IncomeType, - &i.IncomeBank, - &i.Remark, - &i.Status, - &i.CreatedAt, - &i.CreatedUserID, - &i.UpdatedAt, - &i.UpdatedUserID, - ) - return &i, err -} - -const statisticsIncome = `-- name: StatisticsIncome :many -SELECT SUM(amount)::numeric as total_amount, - (select name from categories where id = incomes.income_type) income_type_name -FROM incomes -GROUP BY income_type -` - -type StatisticsIncomeRow struct { - TotalAmount pgtype.Numeric `json:"total_amount"` - IncomeTypeName string `json:"income_type_name"` -} - -func (q *Queries) StatisticsIncome(ctx context.Context) ([]*StatisticsIncomeRow, error) { - rows, err := q.db.Query(ctx, statisticsIncome) - if err != nil { - return nil, err - } - defer rows.Close() - items := []*StatisticsIncomeRow{} - for rows.Next() { - var i StatisticsIncomeRow - if err := rows.Scan(&i.TotalAmount, &i.IncomeTypeName); err != nil { - return nil, err - } - items = append(items, &i) - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const statisticsIncomeByProjectID = `-- name: StatisticsIncomeByProjectID :many -SELECT SUM(amount)::numeric as total_amount, - (select name from categories where id = incomes.income_type) income_type_name -FROM incomes -WHERE project_id = $1 -GROUP BY income_type -` - -type StatisticsIncomeByProjectIDRow struct { - TotalAmount pgtype.Numeric `json:"total_amount"` - IncomeTypeName string `json:"income_type_name"` -} - -func (q *Queries) StatisticsIncomeByProjectID(ctx context.Context, projectID int64) ([]*StatisticsIncomeByProjectIDRow, error) { - rows, err := q.db.Query(ctx, statisticsIncomeByProjectID, projectID) - if err != nil { - return nil, err - } - defer rows.Close() - items := []*StatisticsIncomeByProjectIDRow{} - for rows.Next() { - var i StatisticsIncomeByProjectIDRow - if err := rows.Scan(&i.TotalAmount, &i.IncomeTypeName); err != nil { - return nil, err - } - items = append(items, &i) - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const sumIncome = `-- name: SumIncome :one -SELECT SUM(amount)::numeric -FROM incomes -` - -func (q *Queries) SumIncome(ctx context.Context) (pgtype.Numeric, error) { - row := q.db.QueryRow(ctx, sumIncome) - var column_1 pgtype.Numeric - err := row.Scan(&column_1) - return column_1, err -} - -const sumIncomeByProjectID = `-- name: SumIncomeByProjectID :one -SELECT SUM(amount)::numeric -FROM incomes -WHERE project_id = $1 -` - -func (q *Queries) SumIncomeByProjectID(ctx context.Context, projectID int64) (pgtype.Numeric, error) { - row := q.db.QueryRow(ctx, sumIncomeByProjectID, projectID) - var column_1 pgtype.Numeric - err := row.Scan(&column_1) - return column_1, err -} - -const updateIncome = `-- name: UpdateIncome :one -UPDATE incomes -SET - project_id = COALESCE($2, project_id), - budget_id = COALESCE($3, budget_id), - amount = COALESCE($4, amount), - income_at = COALESCE($5, income_at), - income_type = COALESCE($6, income_type), - income_bank = COALESCE($7, income_bank), - remark = COALESCE($8, remark), - status = COALESCE($9, status), - updated_user_id = COALESCE($10, updated_user_id), - updated_at = NOW() -WHERE id = $1 -RETURNING id, project_id, budget_id, amount, income_at, income_type, income_bank, remark, status, created_at, created_user_id, updated_at, updated_user_id -` - -type UpdateIncomeParams struct { - ID int64 `json:"id"` - ProjectID pgtype.Int8 `json:"project_id"` - BudgetID pgtype.Int8 `json:"budget_id"` - Amount pgtype.Numeric `json:"amount"` - IncomeAt pgtype.Timestamptz `json:"income_at"` - IncomeType pgtype.Int4 `json:"income_type"` - IncomeBank pgtype.Int4 `json:"income_bank"` - Remark pgtype.Text `json:"remark"` - Status pgtype.Int2 `json:"status"` - UpdatedUserID pgtype.Int4 `json:"updated_user_id"` -} - -func (q *Queries) UpdateIncome(ctx context.Context, arg *UpdateIncomeParams) (*Income, error) { - row := q.db.QueryRow(ctx, updateIncome, - arg.ID, - arg.ProjectID, - arg.BudgetID, - arg.Amount, - arg.IncomeAt, - arg.IncomeType, - arg.IncomeBank, - arg.Remark, - arg.Status, - arg.UpdatedUserID, - ) - var i Income - err := row.Scan( - &i.ID, - &i.ProjectID, - &i.BudgetID, - &i.Amount, - &i.IncomeAt, - &i.IncomeType, - &i.IncomeBank, - &i.Remark, - &i.Status, - &i.CreatedAt, - &i.CreatedUserID, - &i.UpdatedAt, - &i.UpdatedUserID, - ) - return &i, err -} diff --git a/internal/db/sqlc/models.go b/internal/db/sqlc/models.go deleted file mode 100644 index 768f5ce..0000000 --- a/internal/db/sqlc/models.go +++ /dev/null @@ -1,425 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. -// versions: -// sqlc v1.28.0 - -package db - -import ( - "time" - - "github.com/google/uuid" - "github.com/jackc/pgx/v5/pgtype" -) - -type Budget struct { - // ID - ID int64 `json:"id"` - // 项目ID - ProjectID int64 `json:"project_id"` - // 名称 - Name string `json:"name"` - // 预算类型: 收入/支出 - BudgetType int32 `json:"budget_type"` - // 类别 - Category int32 `json:"category"` - // 开始时间 - StartAt time.Time `json:"start_at"` - // 结束时间 - EndAt time.Time `json:"end_at"` - // 预算金额 - Amount pgtype.Numeric `json:"amount"` - // 已使用金额 - UsedAmount pgtype.Numeric `json:"used_amount"` - // 剩余金额 - RemainingAmount pgtype.Numeric `json:"remaining_amount"` - // 备注 - Remark string `json:"remark"` - // 状态 - Status int16 `json:"status"` - // 排序 - Sort int32 `json:"sort"` - // 创建时间 - CreatedAt time.Time `json:"created_at"` - // 创建人 - CreatedUserID int32 `json:"created_user_id"` - // 更新时间 - UpdatedAt time.Time `json:"updated_at"` - // 更新人 - UpdatedUserID int32 `json:"updated_user_id"` -} - -type Category struct { - // ID - ID int32 `json:"id"` - // 名称 - Name string `json:"name"` - // 图标 - Icon string `json:"icon"` - // 描述 - Description string `json:"description"` - // 拼音 - Letter string `json:"letter"` - // 父级ID - ParentID int32 `json:"parent_id"` - // 树路径 - ParentPath string `json:"parent_path"` - // 状态 - Status int16 `json:"status"` - // 排序 - Sort int32 `json:"sort"` - // 创建时间 - CreatedAt time.Time `json:"created_at"` - // 更新时间 - UpdatedAt time.Time `json:"updated_at"` -} - -type Customer struct { - // ID - ID int64 `json:"id"` - // 名称 - Name string `json:"name"` - // 类别 - Category int32 `json:"category"` - // 来源 - Source int32 `json:"source"` - // 地址 - Address string `json:"address"` - // 主要联系人 - ContactName string `json:"contact_name"` - // 主要联系人手机 - ContactPhone string `json:"contact_phone"` - // 状态 - Status int16 `json:"status"` - // 排序 - Sort int32 `json:"sort"` - // 创建时间 - CreatedAt time.Time `json:"created_at"` - // 创建人 - CreatedBy int32 `json:"created_by"` - // 更新时间 - UpdatedAt time.Time `json:"updated_at"` - // 更新人 - UpdatedBy int32 `json:"updated_by"` -} - -type CustomerContact struct { - // ID - ID int32 `json:"id"` - // 名称 - Name string `json:"name"` - // 联系方式 - Telephone string `json:"telephone"` - // 客户ID - CustomerID int64 `json:"customer_id"` - // 状态 - Status int16 `json:"status"` - // 排序 - Sort int32 `json:"sort"` - // 创建时间 - CreatedAt time.Time `json:"created_at"` - // 创建人 - CreatedBy int32 `json:"created_by"` - // 更新时间 - UpdatedAt time.Time `json:"updated_at"` - // 更新人 - UpdatedBy int32 `json:"updated_by"` -} - -type Expense struct { - // ID - ID int64 `json:"id"` - // 项目ID - ProjectID int64 `json:"project_id"` - // 预算ID - BudgetID int64 `json:"budget_id"` - // 支出金额 - Amount pgtype.Numeric `json:"amount"` - // 支出时间 - ExpensesAt time.Time `json:"expenses_at"` - // 支出类型 - ExpensesType int32 `json:"expenses_type"` - // 备注 - Remark string `json:"remark"` - // 状态 - Status int16 `json:"status"` - // 创建时间 - CreatedAt time.Time `json:"created_at"` - // 创建人 - CreatedUserID int32 `json:"created_user_id"` - // 更新时间 - UpdatedAt time.Time `json:"updated_at"` - // 更新人 - UpdatedUserID int32 `json:"updated_user_id"` -} - -type Income struct { - // ID - ID int64 `json:"id"` - // 项目ID - ProjectID int64 `json:"project_id"` - // 预算ID - BudgetID int64 `json:"budget_id"` - // 收入金额 - Amount pgtype.Numeric `json:"amount"` - // 收入时间 - IncomeAt time.Time `json:"income_at"` - // 收入类型 - IncomeType int32 `json:"income_type"` - // 收入银行 - IncomeBank int32 `json:"income_bank"` - // 备注 - Remark string `json:"remark"` - // 状态 - Status int16 `json:"status"` - // 创建时间 - CreatedAt time.Time `json:"created_at"` - // 创建人 - CreatedUserID int32 `json:"created_user_id"` - // 更新时间 - UpdatedAt time.Time `json:"updated_at"` - // 更新人 - UpdatedUserID int32 `json:"updated_user_id"` -} - -type Project struct { - // ID - ID int64 `json:"id"` - // 名称 - Name string `json:"name"` - // 开始时间 - StartAt time.Time `json:"start_at"` - // 结束时间 - EndAt time.Time `json:"end_at"` - // 客户ID - CustomerID int64 `json:"customer_id"` - // 总金额 - TotalMoney pgtype.Numeric `json:"total_money"` - // 简介 - Description string `json:"description"` - // 申请时间 - ApplyAt time.Time `json:"apply_at"` - // 申请人 - ApplyUserID int32 `json:"apply_user_id"` - // 项目经理 - ManagerID int32 `json:"manager_id"` - // 项目成员 - Members string `json:"members"` - // 状态 - Status int16 `json:"status"` - // 排序 - Sort int32 `json:"sort"` - // 创建时间 - CreatedAt time.Time `json:"created_at"` - // 创建人 - CreatedUserID int32 `json:"created_user_id"` - // 更新时间 - UpdatedAt time.Time `json:"updated_at"` - // 更新人 - UpdatedUserID int32 `json:"updated_user_id"` -} - -type ProjectFile struct { - // ID - ID int64 `json:"id"` - // 名称 - Name string `json:"name"` - // 路径 - Path string `json:"path"` - // 项目ID - ProjectID int64 `json:"project_id"` - // 排序 - Sort int32 `json:"sort"` - // 创建时间 - CreatedAt time.Time `json:"created_at"` - // 创建人 - CreatedUserID int32 `json:"created_user_id"` -} - -type Session struct { - // token - Token string `json:"token"` - // data - Data []byte `json:"data"` - // expiry - Expiry time.Time `json:"expiry"` -} - -type SysAuditLog struct { - ID int64 `json:"id"` - // 创建时间 - CreatedAt time.Time `json:"created_at"` - // 邮箱地址 - Email string `json:"email"` - // 用户名称 - Username string `json:"username"` - // 用户uuid - UserUuid uuid.UUID `json:"user_uuid"` - // 请求开始时间 - StartAt time.Time `json:"start_at"` - // 请求结束时间 - EndAt time.Time `json:"end_at"` - // 请求总时间 - Duration string `json:"duration"` - // 请求链接 - Url string `json:"url"` - // 请求类型 - Method string `json:"method"` - // 请求参数 - Parameters string `json:"parameters"` - // 上一个链接 - RefererUrl string `json:"referer_url"` - // 系统 - Os string `json:"os"` - // ip - Ip string `json:"ip"` - // 浏览器 - Browser string `json:"browser"` - // 备注 - Remark string `json:"remark"` -} - -type SysConfig struct { - ID int32 `json:"id"` - // 存储键 - Key string `json:"key"` - // 存储值 - Value []byte `json:"value"` - // 创建时间 - CreatedAt time.Time `json:"created_at"` - // 更新时间 - UpdatedAt time.Time `json:"updated_at"` -} - -type SysDepartment struct { - ID int32 `json:"id"` - // 部门名称 - Name string `json:"name"` - // 上级id - ParentID int32 `json:"parent_id"` - // 树路径 - ParentPath string `json:"parent_path"` - // 状态 - Status int32 `json:"status"` - // 排序 - Sort int32 `json:"sort"` - // 创建时间 - CreatedAt time.Time `json:"created_at"` - // 更新时间 - UpdatedAt time.Time `json:"updated_at"` -} - -type SysMenu struct { - ID int32 `json:"id"` - // 名称 - Name string `json:"name"` - // 显示名称 - DisplayName string `json:"display_name"` - // 菜单url - Url string `json:"url"` - // 菜单类型(node, menu, btn) - Type string `json:"type"` - // 上级id - ParentID int32 `json:"parent_id"` - // 树路径 - ParentPath string `json:"parent_path"` - // 菜单图标 - Avatar string `json:"avatar"` - // 菜单样式 - Style string `json:"style"` - // 是否可见 - Visible bool `json:"visible"` - // 是否列表 - IsList bool `json:"is_list"` - // 状态 - Status int32 `json:"status"` - // 排序 - Sort int32 `json:"sort"` - // 创建时间 - CreatedAt time.Time `json:"created_at"` - // 更新时间 - UpdatedAt time.Time `json:"updated_at"` -} - -type SysRole struct { - ID int32 `json:"id"` - // 名称 - Name string `json:"name"` - // 显示名称 - DisplayName string `json:"display_name"` - // 上级id - ParentID int32 `json:"parent_id"` - // 树路径 - ParentPath string `json:"parent_path"` - // 是否vip - Vip bool `json:"vip"` - // 状态 - Status int32 `json:"status"` - // 排序 - Sort int32 `json:"sort"` - // 创建时间 - CreatedAt time.Time `json:"created_at"` - // 更新时间 - UpdatedAt time.Time `json:"updated_at"` -} - -type SysRoleMenu struct { - // 角色id - RoleID int32 `json:"role_id"` - // 菜单id - MenuID int32 `json:"menu_id"` -} - -type SysUser struct { - ID int32 `json:"id"` - Uuid uuid.UUID `json:"uuid"` - // 邮箱地址 - Email string `json:"email"` - // 用户名称 - Username string `json:"username"` - // 加密密码 - HashedPassword []byte `json:"hashed_password"` - // 密码盐值 - Salt string `json:"salt"` - // 头像 - Avatar string `json:"avatar"` - // 性别 - Gender int32 `json:"gender"` - // 部门 - DepartmentID int32 `json:"department_id"` - // 角色 - RoleID int32 `json:"role_id"` - // 状态 - Status int32 `json:"status"` - // 密码修改时间 - ChangePasswordAt time.Time `json:"change_password_at"` - // 创建时间 - CreatedAt time.Time `json:"created_at"` - // 更新时间 - UpdatedAt time.Time `json:"updated_at"` -} - -type SysUserLoginLog struct { - ID int64 `json:"id"` - // 创建时间 - CreatedAt time.Time `json:"created_at"` - // 邮箱地址 - Email string `json:"email"` - // 用户名称 - Username string `json:"username"` - // 用户uuid - UserUuid uuid.UUID `json:"user_uuid"` - // 是否登陆成功 - IsSuccess bool `json:"is_success"` - // 登陆消息 - Message string `json:"message"` - // 上一个链接 - RefererUrl string `json:"referer_url"` - // 链接 - Url string `json:"url"` - // 系统 - Os string `json:"os"` - // ip - Ip string `json:"ip"` - // 浏览器 - Browser string `json:"browser"` -} diff --git a/internal/db/sqlc/project.sql.go b/internal/db/sqlc/project.sql.go deleted file mode 100644 index b5f64d4..0000000 --- a/internal/db/sqlc/project.sql.go +++ /dev/null @@ -1,343 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. -// versions: -// sqlc v1.28.0 -// source: project.sql - -package db - -import ( - "context" - "time" - - "github.com/jackc/pgx/v5/pgtype" -) - -const allProjects = `-- name: AllProjects :many -SELECT id, name, start_at, end_at, customer_id, total_money, description, apply_at, apply_user_id, manager_id, members, status, sort, created_at, created_user_id, updated_at, updated_user_id FROM projects -WHERE status > -1 -ORDER BY id DESC -` - -func (q *Queries) AllProjects(ctx context.Context) ([]*Project, error) { - rows, err := q.db.Query(ctx, allProjects) - if err != nil { - return nil, err - } - defer rows.Close() - items := []*Project{} - for rows.Next() { - var i Project - if err := rows.Scan( - &i.ID, - &i.Name, - &i.StartAt, - &i.EndAt, - &i.CustomerID, - &i.TotalMoney, - &i.Description, - &i.ApplyAt, - &i.ApplyUserID, - &i.ManagerID, - &i.Members, - &i.Status, - &i.Sort, - &i.CreatedAt, - &i.CreatedUserID, - &i.UpdatedAt, - &i.UpdatedUserID, - ); err != nil { - return nil, err - } - items = append(items, &i) - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const countProjects = `-- name: CountProjects :one -SELECT COUNT(1) -FROM projects -WHERE status = $1 -` - -func (q *Queries) CountProjects(ctx context.Context, status int16) (int64, error) { - row := q.db.QueryRow(ctx, countProjects, status) - var count int64 - err := row.Scan(&count) - return count, err -} - -const createProject = `-- name: CreateProject :one -INSERT INTO projects (id, name, start_at, end_at, customer_id, total_money, description, apply_at, apply_user_id, manager_id, members, status, created_user_id) -VALUES($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13) -RETURNING id, name, start_at, end_at, customer_id, total_money, description, apply_at, apply_user_id, manager_id, members, status, sort, created_at, created_user_id, updated_at, updated_user_id -` - -type CreateProjectParams struct { - ID int64 `json:"id"` - Name string `json:"name"` - StartAt time.Time `json:"start_at"` - EndAt time.Time `json:"end_at"` - CustomerID int64 `json:"customer_id"` - TotalMoney pgtype.Numeric `json:"total_money"` - Description string `json:"description"` - ApplyAt time.Time `json:"apply_at"` - ApplyUserID int32 `json:"apply_user_id"` - ManagerID int32 `json:"manager_id"` - Members string `json:"members"` - Status int16 `json:"status"` - CreatedUserID int32 `json:"created_user_id"` -} - -func (q *Queries) CreateProject(ctx context.Context, arg *CreateProjectParams) (*Project, error) { - row := q.db.QueryRow(ctx, createProject, - arg.ID, - arg.Name, - arg.StartAt, - arg.EndAt, - arg.CustomerID, - arg.TotalMoney, - arg.Description, - arg.ApplyAt, - arg.ApplyUserID, - arg.ManagerID, - arg.Members, - arg.Status, - arg.CreatedUserID, - ) - var i Project - err := row.Scan( - &i.ID, - &i.Name, - &i.StartAt, - &i.EndAt, - &i.CustomerID, - &i.TotalMoney, - &i.Description, - &i.ApplyAt, - &i.ApplyUserID, - &i.ManagerID, - &i.Members, - &i.Status, - &i.Sort, - &i.CreatedAt, - &i.CreatedUserID, - &i.UpdatedAt, - &i.UpdatedUserID, - ) - return &i, err -} - -const getProject = `-- name: GetProject :one -SELECT id, name, start_at, end_at, customer_id, total_money, description, apply_at, apply_user_id, manager_id, members, status, sort, created_at, created_user_id, updated_at, updated_user_id -FROM projects -WHERE id = $1 -LIMIT 1 -` - -func (q *Queries) GetProject(ctx context.Context, id int64) (*Project, error) { - row := q.db.QueryRow(ctx, getProject, id) - var i Project - err := row.Scan( - &i.ID, - &i.Name, - &i.StartAt, - &i.EndAt, - &i.CustomerID, - &i.TotalMoney, - &i.Description, - &i.ApplyAt, - &i.ApplyUserID, - &i.ManagerID, - &i.Members, - &i.Status, - &i.Sort, - &i.CreatedAt, - &i.CreatedUserID, - &i.UpdatedAt, - &i.UpdatedUserID, - ) - return &i, err -} - -const listProjects = `-- name: ListProjects :many -SELECT id, name, start_at, end_at, customer_id, total_money, description, apply_at, apply_user_id, manager_id, members, status, sort, created_at, created_user_id, updated_at, updated_user_id -FROM projects -WHERE status = $1 -ORDER BY id DESC -LIMIT $1 OFFSET $2 -` - -type ListProjectsParams struct { - Limit int32 `json:"limit"` - Offset int32 `json:"offset"` -} - -func (q *Queries) ListProjects(ctx context.Context, arg *ListProjectsParams) ([]*Project, error) { - rows, err := q.db.Query(ctx, listProjects, arg.Limit, arg.Offset) - if err != nil { - return nil, err - } - defer rows.Close() - items := []*Project{} - for rows.Next() { - var i Project - if err := rows.Scan( - &i.ID, - &i.Name, - &i.StartAt, - &i.EndAt, - &i.CustomerID, - &i.TotalMoney, - &i.Description, - &i.ApplyAt, - &i.ApplyUserID, - &i.ManagerID, - &i.Members, - &i.Status, - &i.Sort, - &i.CreatedAt, - &i.CreatedUserID, - &i.UpdatedAt, - &i.UpdatedUserID, - ); err != nil { - return nil, err - } - items = append(items, &i) - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const statisticsProjectItem = `-- name: StatisticsProjectItem :one -select name, - (select sum(amount)::numeric from incomes where project_id = projects.id) income, - (select sum(amount)::numeric from expenses where project_id = projects.id) expense -from projects -where projects.id = $1 -` - -type StatisticsProjectItemRow struct { - Name string `json:"name"` - Income pgtype.Numeric `json:"income"` - Expense pgtype.Numeric `json:"expense"` -} - -func (q *Queries) StatisticsProjectItem(ctx context.Context, id int64) (*StatisticsProjectItemRow, error) { - row := q.db.QueryRow(ctx, statisticsProjectItem, id) - var i StatisticsProjectItemRow - err := row.Scan(&i.Name, &i.Income, &i.Expense) - return &i, err -} - -const statisticsProjects = `-- name: StatisticsProjects :many -select name, - (select sum(amount)::numeric from incomes where project_id = projects.id) income, - (select sum(amount)::numeric from expenses where project_id = projects.id) expense -from projects -` - -type StatisticsProjectsRow struct { - Name string `json:"name"` - Income pgtype.Numeric `json:"income"` - Expense pgtype.Numeric `json:"expense"` -} - -func (q *Queries) StatisticsProjects(ctx context.Context) ([]*StatisticsProjectsRow, error) { - rows, err := q.db.Query(ctx, statisticsProjects) - if err != nil { - return nil, err - } - defer rows.Close() - items := []*StatisticsProjectsRow{} - for rows.Next() { - var i StatisticsProjectsRow - if err := rows.Scan(&i.Name, &i.Income, &i.Expense); err != nil { - return nil, err - } - items = append(items, &i) - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const updateProject = `-- name: UpdateProject :one -UPDATE projects -SET - name = COALESCE($2, name), - start_at = COALESCE($3, start_at), - end_at = COALESCE($4, end_at), - customer_id = COALESCE($5, customer_id), - total_money = COALESCE($6, total_money), - description = COALESCE($7, description), - apply_at = COALESCE($8, apply_at), - apply_user_id = COALESCE($9, apply_user_id), - manager_id = COALESCE($10, manager_id), - members = COALESCE($11, members), - status = COALESCE($12, status), - updated_user_id = COALESCE($13, updated_user_id), - updated_at = NOW() -WHERE id = $1 -RETURNING id, name, start_at, end_at, customer_id, total_money, description, apply_at, apply_user_id, manager_id, members, status, sort, created_at, created_user_id, updated_at, updated_user_id -` - -type UpdateProjectParams struct { - ID int64 `json:"id"` - Name pgtype.Text `json:"name"` - StartAt pgtype.Timestamptz `json:"start_at"` - EndAt pgtype.Timestamptz `json:"end_at"` - CustomerID pgtype.Int8 `json:"customer_id"` - TotalMoney pgtype.Numeric `json:"total_money"` - Description pgtype.Text `json:"description"` - ApplyAt pgtype.Timestamptz `json:"apply_at"` - ApplyUserID pgtype.Int4 `json:"apply_user_id"` - ManagerID pgtype.Int4 `json:"manager_id"` - Members pgtype.Text `json:"members"` - Status pgtype.Int2 `json:"status"` - UpdatedUserID pgtype.Int4 `json:"updated_user_id"` -} - -func (q *Queries) UpdateProject(ctx context.Context, arg *UpdateProjectParams) (*Project, error) { - row := q.db.QueryRow(ctx, updateProject, - arg.ID, - arg.Name, - arg.StartAt, - arg.EndAt, - arg.CustomerID, - arg.TotalMoney, - arg.Description, - arg.ApplyAt, - arg.ApplyUserID, - arg.ManagerID, - arg.Members, - arg.Status, - arg.UpdatedUserID, - ) - var i Project - err := row.Scan( - &i.ID, - &i.Name, - &i.StartAt, - &i.EndAt, - &i.CustomerID, - &i.TotalMoney, - &i.Description, - &i.ApplyAt, - &i.ApplyUserID, - &i.ManagerID, - &i.Members, - &i.Status, - &i.Sort, - &i.CreatedAt, - &i.CreatedUserID, - &i.UpdatedAt, - &i.UpdatedUserID, - ) - return &i, err -} diff --git a/internal/db/sqlc/project_file.sql.go b/internal/db/sqlc/project_file.sql.go deleted file mode 100644 index 9954fd8..0000000 --- a/internal/db/sqlc/project_file.sql.go +++ /dev/null @@ -1,90 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. -// versions: -// sqlc v1.28.0 -// source: project_file.sql - -package db - -import ( - "context" -) - -const createProjectFile = `-- name: CreateProjectFile :one -INSERT INTO project_files (id, name, path, project_id, created_user_id) -VALUES($1, $2, $3, $4, $5) -RETURNING id, name, path, project_id, sort, created_at, created_user_id -` - -type CreateProjectFileParams struct { - ID int64 `json:"id"` - Name string `json:"name"` - Path string `json:"path"` - ProjectID int64 `json:"project_id"` - CreatedUserID int32 `json:"created_user_id"` -} - -func (q *Queries) CreateProjectFile(ctx context.Context, arg *CreateProjectFileParams) (*ProjectFile, error) { - row := q.db.QueryRow(ctx, createProjectFile, - arg.ID, - arg.Name, - arg.Path, - arg.ProjectID, - arg.CreatedUserID, - ) - var i ProjectFile - err := row.Scan( - &i.ID, - &i.Name, - &i.Path, - &i.ProjectID, - &i.Sort, - &i.CreatedAt, - &i.CreatedUserID, - ) - return &i, err -} - -const deleteProjectFile = `-- name: DeleteProjectFile :exec -DELETE FROM project_files -WHERE project_id = $1 -` - -func (q *Queries) DeleteProjectFile(ctx context.Context, projectID int64) error { - _, err := q.db.Exec(ctx, deleteProjectFile, projectID) - return err -} - -const listProjectFiles = `-- name: ListProjectFiles :many -SELECT id, name, path, project_id, sort, created_at, created_user_id -FROM project_files -WHERE project_id = $1 -ORDER BY id -` - -func (q *Queries) ListProjectFiles(ctx context.Context, projectID int64) ([]*ProjectFile, error) { - rows, err := q.db.Query(ctx, listProjectFiles, projectID) - if err != nil { - return nil, err - } - defer rows.Close() - items := []*ProjectFile{} - for rows.Next() { - var i ProjectFile - if err := rows.Scan( - &i.ID, - &i.Name, - &i.Path, - &i.ProjectID, - &i.Sort, - &i.CreatedAt, - &i.CreatedUserID, - ); err != nil { - return nil, err - } - items = append(items, &i) - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} diff --git a/internal/db/sqlc/querier.go b/internal/db/sqlc/querier.go deleted file mode 100644 index 4a71264..0000000 --- a/internal/db/sqlc/querier.go +++ /dev/null @@ -1,116 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. -// versions: -// sqlc v1.28.0 - -package db - -import ( - "context" - - "github.com/jackc/pgx/v5/pgtype" -) - -type Querier interface { - AllCategories(ctx context.Context) ([]*Category, error) - AllCustomers(ctx context.Context) ([]*Customer, error) - AllProjects(ctx context.Context) ([]*Project, error) - AllSysDepartment(ctx context.Context) ([]*SysDepartment, error) - AllSysMenu(ctx context.Context) ([]*SysMenu, error) - AllSysRole(ctx context.Context) ([]*SysRole, error) - CountCategoriesCondition(ctx context.Context, arg *CountCategoriesConditionParams) (int64, error) - CountCustomers(ctx context.Context) (int64, error) - CountProjects(ctx context.Context, status int16) (int64, error) - CountSysAuditLogCondition(ctx context.Context, arg *CountSysAuditLogConditionParams) (int64, error) - CountSysConfigCondition(ctx context.Context, key string) (int64, error) - CountSysDepartmentCondition(ctx context.Context, arg *CountSysDepartmentConditionParams) (int64, error) - CountSysRole(ctx context.Context) (int64, error) - CountSysRoleCondition(ctx context.Context, arg *CountSysRoleConditionParams) (int64, error) - CountSysUser(ctx context.Context) (int64, error) - CountSysUserCondition(ctx context.Context, arg *CountSysUserConditionParams) (int64, error) - CountSysUserLoginLogCondition(ctx context.Context, arg *CountSysUserLoginLogConditionParams) (int64, error) - CreateBudget(ctx context.Context, arg *CreateBudgetParams) (*Budget, error) - CreateCategory(ctx context.Context, arg *CreateCategoryParams) (*Category, error) - CreateCustomer(ctx context.Context, arg *CreateCustomerParams) (*Customer, error) - CreateExpense(ctx context.Context, arg *CreateExpenseParams) (*Expense, error) - CreateIncome(ctx context.Context, arg *CreateIncomeParams) (*Income, error) - CreateProject(ctx context.Context, arg *CreateProjectParams) (*Project, error) - CreateProjectFile(ctx context.Context, arg *CreateProjectFileParams) (*ProjectFile, error) - CreateRoleMenu(ctx context.Context, arg *CreateRoleMenuParams) error - CreateSysAuditLog(ctx context.Context, arg *CreateSysAuditLogParams) error - CreateSysConfig(ctx context.Context, arg *CreateSysConfigParams) error - CreateSysDepartment(ctx context.Context, arg *CreateSysDepartmentParams) (*SysDepartment, error) - CreateSysMenu(ctx context.Context, arg *CreateSysMenuParams) (*SysMenu, error) - CreateSysRole(ctx context.Context, arg *CreateSysRoleParams) (*SysRole, error) - CreateSysUser(ctx context.Context, arg *CreateSysUserParams) (*SysUser, error) - CreateSysUserLoginLog(ctx context.Context, arg *CreateSysUserLoginLogParams) error - DeleteProjectFile(ctx context.Context, projectID int64) error - DeleteRoleMneuByRoleID(ctx context.Context, roleID int32) error - ExistsCategories(ctx context.Context) (bool, error) - ExistsMenu(ctx context.Context) (bool, error) - ExistsSysConfigByKey(ctx context.Context, key string) (bool, error) - ExistsSysDepartment(ctx context.Context) (bool, error) - ExistsSysUser(ctx context.Context) (bool, error) - ExistsVipRole(ctx context.Context) (bool, error) - GetBudget(ctx context.Context, id int64) (*Budget, error) - GetCategory(ctx context.Context, id int32) (*Category, error) - GetCustomer(ctx context.Context, id int64) (*Customer, error) - GetExpense(ctx context.Context, id int64) (*Expense, error) - GetFirstVipRole(ctx context.Context) (*SysRole, error) - GetIncome(ctx context.Context, id int64) (*Income, error) - GetProject(ctx context.Context, id int64) (*Project, error) - GetSysConfig(ctx context.Context, id int32) (*SysConfig, error) - GetSysConfigByKey(ctx context.Context, key string) (*SysConfig, error) - GetSysDepartment(ctx context.Context, id int32) (*SysDepartment, error) - GetSysMenu(ctx context.Context, id int32) (*SysMenu, error) - GetSysMenuByUrl(ctx context.Context, url string) (*SysMenu, error) - GetSysRole(ctx context.Context, id int32) (*SysRole, error) - GetSysRoleByUserID(ctx context.Context, id int32) (*SysRole, error) - GetSysUser(ctx context.Context, id int32) (*SysUser, error) - GetSysUserByEmail(ctx context.Context, email string) (*SysUser, error) - ListBudgets(ctx context.Context, projectID int64) ([]*Budget, error) - ListCategories(ctx context.Context) ([]*Category, error) - ListCategoriesByPath(ctx context.Context, parentPath string) ([]*Category, error) - ListCategoriesCondition(ctx context.Context, arg *ListCategoriesConditionParams) ([]*Category, error) - ListCategoriesRecursive(ctx context.Context) ([]*ListCategoriesRecursiveRow, error) - ListCustomers(ctx context.Context, arg *ListCustomersParams) ([]*Customer, error) - ListProjectFiles(ctx context.Context, projectID int64) ([]*ProjectFile, error) - ListProjects(ctx context.Context, arg *ListProjectsParams) ([]*Project, error) - ListSysAuditLogCondition(ctx context.Context, arg *ListSysAuditLogConditionParams) ([]*SysAuditLog, error) - ListSysConfigCondition(ctx context.Context, arg *ListSysConfigConditionParams) ([]*SysConfig, error) - ListSysDepartment(ctx context.Context) ([]*SysDepartment, error) - ListSysDepartmentCondition(ctx context.Context, arg *ListSysDepartmentConditionParams) ([]*SysDepartment, error) - ListSysDepartmentRecursive(ctx context.Context) ([]*ListSysDepartmentRecursiveRow, error) - ListSysMenuByRoleID(ctx context.Context, roleID int32) ([]*SysMenu, error) - ListSysMenuIDByRoleID(ctx context.Context, roleID int32) ([]int32, error) - ListSysRole(ctx context.Context) ([]*SysRole, error) - ListSysRoleCondition(ctx context.Context, arg *ListSysRoleConditionParams) ([]*SysRole, error) - ListSysUser(ctx context.Context) ([]*SysUser, error) - ListSysUserByIds(ctx context.Context, dollar_1 []int32) ([]*SysUser, error) - ListSysUserCondition(ctx context.Context, arg *ListSysUserConditionParams) ([]*ListSysUserConditionRow, error) - ListSysUserLoginLogCondition(ctx context.Context, arg *ListSysUserLoginLogConditionParams) ([]*ListSysUserLoginLogConditionRow, error) - RecursiveSysMenus(ctx context.Context) ([]*RecursiveSysMenusRow, error) - RecursiveSysMenusByRoleID(ctx context.Context, roleID int32) ([]*RecursiveSysMenusByRoleIDRow, error) - StatisticsExpense(ctx context.Context) ([]*StatisticsExpenseRow, error) - StatisticsExpenseByProjectID(ctx context.Context, projectID int64) ([]*StatisticsExpenseByProjectIDRow, error) - StatisticsIncome(ctx context.Context) ([]*StatisticsIncomeRow, error) - StatisticsIncomeByProjectID(ctx context.Context, projectID int64) ([]*StatisticsIncomeByProjectIDRow, error) - StatisticsProjectItem(ctx context.Context, id int64) (*StatisticsProjectItemRow, error) - StatisticsProjects(ctx context.Context) ([]*StatisticsProjectsRow, error) - SumExpense(ctx context.Context) (pgtype.Numeric, error) - SumExpenseByProjectID(ctx context.Context, projectID int64) (pgtype.Numeric, error) - SumIncome(ctx context.Context) (pgtype.Numeric, error) - SumIncomeByProjectID(ctx context.Context, projectID int64) (pgtype.Numeric, error) - UpdateBudget(ctx context.Context, arg *UpdateBudgetParams) (*Budget, error) - UpdateCategory(ctx context.Context, arg *UpdateCategoryParams) (*Category, error) - UpdateCustomer(ctx context.Context, arg *UpdateCustomerParams) (*Customer, error) - UpdateExpense(ctx context.Context, arg *UpdateExpenseParams) (*Expense, error) - UpdateIncome(ctx context.Context, arg *UpdateIncomeParams) (*Income, error) - UpdateProject(ctx context.Context, arg *UpdateProjectParams) (*Project, error) - UpdateSysConfigByKey(ctx context.Context, arg *UpdateSysConfigByKeyParams) error - UpdateSysDepartment(ctx context.Context, arg *UpdateSysDepartmentParams) (*SysDepartment, error) - UpdateSysMenu(ctx context.Context, arg *UpdateSysMenuParams) (*SysMenu, error) - UpdateSysRole(ctx context.Context, arg *UpdateSysRoleParams) (*SysRole, error) - UpdateSysUser(ctx context.Context, arg *UpdateSysUserParams) (*SysUser, error) -} - -var _ Querier = (*Queries)(nil) diff --git a/internal/db/sqlc/query_budget.go b/internal/db/sqlc/query_budget.go deleted file mode 100644 index 41e4b25..0000000 --- a/internal/db/sqlc/query_budget.go +++ /dev/null @@ -1,131 +0,0 @@ -package db - -import ( - "context" -) - -type ListBudgetConditionParam struct { - TimeBegin string - TimeEnd string - ProjectID int64 - BudgetType int32 - Category int32 - IsTitle bool - Title string - Status int16 - PageID int32 - PageSize int32 -} - -type BudgetView struct { - Budget - ProjectName string `json:"project_name"` - CategoryName string `json:"category_name"` - CreatedName string `json:"created_name"` - UpdatedName string `json:"updated_name"` -} - -func (store *SQLStore) ListBudgetCondition(ctx context.Context, arg *ListBudgetConditionParam) ([]*BudgetView, int64, error) { - query, args, err := BuildQuery(` - SELECT COUNT(1) - FROM budgets - WHERE created_at BETWEEN @start AND @end - {{if ne .status 9999}}AND status = @status{{end}} - {{if ne .projecID 9999}}AND project_id = @projecID{{end}} - {{if ne .budgetType 9999}}AND budget_type = @budgetType{{end}} - {{if ne .category 9999}}AND category = @category{{end}} - {{if .isTitle}}AND name LIKE @title{{end}}; - `, map[string]any{ - "projecID": arg.ProjectID, - "budgetType": arg.BudgetType, - "category": arg.Category, - "start": arg.TimeBegin, - "end": arg.TimeEnd, - "status": arg.Status, - "isTitle": arg.IsTitle, - "title": arg.Title, - }) - if err != nil { - return nil, 0, err - } - - var total int64 - if err := store.db.QueryRow(ctx, query, args...).Scan(&total); err != nil { - return nil, 0, err - } - - if total <= 0 { - return nil, 0, nil - } - - query, args, err = BuildQuery(` - select id, name, budget_type, - project_id, COALESCE((SELECT name FROM projects WHERE id = budgets.project_id), '') as project_name, - category, COALESCE((SELECT name FROM categories WHERE id = budgets.category), '') as category_name, - start_at, end_at, amount, used_amount, remaining_amount, sort, created_at, - created_user_id, COALESCE((SELECT username FROM sys_user WHERE id = budgets.created_user_id), '') as created_name, - updated_at, - updated_user_id, COALESCE((SELECT username FROM sys_user WHERE id = budgets.updated_user_id), '') as updated_name - FROM budgets - WHERE created_at BETWEEN @start AND @end - {{if ne .status 9999}}AND status = @status{{end}} - {{if ne .projecID 9999}}AND project_id = @projecID{{end}} - {{if ne .budgetType 9999}}AND budget_type = @budgetType{{end}} - {{if ne .category 9999}}AND category = @category{{end}} - {{if .isTitle}}AND name LIKE @title{{end}} - ORDER BY id DESC - LIMIT @limit OFFSET @offset; - `, map[string]any{ - "start": arg.TimeBegin, - "end": arg.TimeEnd, - "projecID": arg.ProjectID, - "budgetType": arg.BudgetType, - "category": arg.Category, - "status": arg.Status, - "isTitle": arg.IsTitle, - "title": arg.Title, - "limit": arg.PageSize, - "offset": (arg.PageID - 1) * arg.PageSize, - }) - if err != nil { - return nil, 0, err - } - - rows, err := store.db.Query(ctx, query, args...) - if err != nil { - return nil, 0, err - } - defer rows.Close() - items := []*BudgetView{} - for rows.Next() { - var i BudgetView - if err := rows.Scan( - &i.ID, - &i.Name, - &i.BudgetType, - &i.ProjectID, - &i.ProjectName, - &i.Category, - &i.CategoryName, - &i.StartAt, - &i.EndAt, - &i.Amount, - &i.UsedAmount, - &i.RemainingAmount, - &i.Sort, - &i.CreatedAt, - &i.CreatedUserID, - &i.CreatedName, - &i.UpdatedAt, - &i.UpdatedUserID, - &i.UpdatedName, - ); err != nil { - return nil, 0, err - } - items = append(items, &i) - } - if err := rows.Err(); err != nil { - return nil, 0, err - } - return items, total, nil -} diff --git a/internal/db/sqlc/query_customer.go b/internal/db/sqlc/query_customer.go deleted file mode 100644 index 16734d7..0000000 --- a/internal/db/sqlc/query_customer.go +++ /dev/null @@ -1,125 +0,0 @@ -package db - -import "context" - -type ListCustomerConditionParam struct { - TimeBegin string - TimeEnd string - IsTitle bool - Title string - Status int16 - Category int32 - Source int32 - PageID int32 - PageSize int32 -} - -type CustomerView struct { - Customer - // 字符串ID - SID string `json:"sid"` - // 类别 - CategoryName string `json:"category_name"` - // 来源 - SourceName string `json:"source_name"` - CreatedName string `json:"created_name"` - UpdatedName string `json:"updated_name"` -} - -func (store *SQLStore) ListCustomerCondition(ctx context.Context, arg *ListCustomerConditionParam) ([]*CustomerView, int64, error) { - query, args, err := BuildQuery(` - SELECT COUNT(1) - FROM customers - WHERE created_at BETWEEN @start AND @end - {{if ne .status 9999}}AND status = @status{{end}} - {{if ne .category 9999}}AND category = @category{{end}} - {{if ne .source 9999}}AND source = @source{{end}} - {{if .isTitle}}AND name LIKE @title{{end}}; - `, map[string]interface{}{ - "start": arg.TimeBegin, - "end": arg.TimeEnd, - "status": arg.Status, - "category": arg.Category, - "source": arg.Source, - "isTitle": arg.IsTitle, - "title": arg.Title, - }) - if err != nil { - return nil, 0, err - } - - var total int64 - if err := store.db.QueryRow(ctx, query, args...).Scan(&total); err != nil { - return nil, 0, err - } - - if total <= 0 { - return nil, 0, nil - } - - query, args, err = BuildQuery(` - SELECT id, name, - category, COALESCE((SELECT name FROM categories WHERE id = customers.category), '') as category_name, - source, COALESCE((SELECT name FROM categories WHERE id = customers.source), '') as source_name, - address, contact_name, contact_phone, status, sort, created_at, updated_at, - created_by, COALESCE((SELECT username FROM sys_user WHERE id = customers.created_by), '') as created_name, - updated_by, COALESCE((SELECT username FROM sys_user WHERE id = customers.updated_by), '') as updated_name - FROM customers - WHERE created_at BETWEEN @start AND @end - {{if ne .status 9999}}AND status = @status{{end}} - {{if ne .category 9999}}AND category = @category{{end}} - {{if ne .source 9999}}AND source = @source{{end}} - {{if .isTitle}}AND name LIKE @title{{end}} - ORDER BY id DESC - LIMIT @limit OFFSET @offset; - `, map[string]interface{}{ - "start": arg.TimeBegin, - "end": arg.TimeEnd, - "status": arg.Status, - "category": arg.Category, - "source": arg.Source, - "isTitle": arg.IsTitle, - "title": arg.Title, - "limit": arg.PageSize, - "offset": (arg.PageID - 1) * arg.PageSize, - }) - if err != nil { - return nil, 0, err - } - - rows, err := store.db.Query(ctx, query, args...) - if err != nil { - return nil, 0, err - } - defer rows.Close() - items := []*CustomerView{} - for rows.Next() { - var i CustomerView - if err := rows.Scan( - &i.SID, - &i.Name, - &i.Category, - &i.CategoryName, - &i.Source, - &i.SourceName, - &i.Address, - &i.ContactName, - &i.ContactPhone, - &i.Status, - &i.Sort, - &i.CreatedAt, - &i.UpdatedAt, - &i.CreatedBy, - &i.CreatedName, - &i.UpdatedBy, - &i.UpdatedName, - ); err != nil { - return nil, 0, err - } - items = append(items, &i) - } - if err := rows.Err(); err != nil { - return nil, 0, err - } - return items, total, nil -} diff --git a/internal/db/sqlc/query_expenses.go b/internal/db/sqlc/query_expenses.go deleted file mode 100644 index dc5d4ec..0000000 --- a/internal/db/sqlc/query_expenses.go +++ /dev/null @@ -1,132 +0,0 @@ -package db - -import ( - "context" -) - -type ListExpenseConditionParam struct { - TimeBegin string - TimeEnd string - ProjectID int64 - BudgetID int64 - ExpenseType int32 - IsTitle bool - Title string - Status int16 - PageID int32 - PageSize int32 -} - -type ExpenseView struct { - Expense - ProjectName string `json:"project_name"` - BudgetName string `json:"budget_name"` - ExpensesTypeName string `json:"expenses_type_name"` - CreatedName string `json:"created_name"` - UpdatedName string `json:"updated_name"` -} - -func (store *SQLStore) ListExpenseCondition(ctx context.Context, arg *ListExpenseConditionParam) ([]*ExpenseView, int64, error) { - query, args, err := BuildQuery(` - SELECT COUNT(1) - FROM expenses - WHERE created_at BETWEEN @start AND @end - {{if ne .status 9999}}AND status = @status{{end}} - {{if ne .projecID 9999}}AND project_id = @projecID{{end}} - {{if ne .budgetID 9999}}AND budget_id = @budgetID{{end}} - {{if ne .expensesType 9999}}AND expenses_type = @expensesType{{end}} - {{if .isTitle}}AND name LIKE @title{{end}}; - `, map[string]any{ - "projecID": arg.ProjectID, - "budgetID": arg.BudgetID, - "expensesType": arg.ExpenseType, - "start": arg.TimeBegin, - "end": arg.TimeEnd, - "status": arg.Status, - "isTitle": arg.IsTitle, - "title": arg.Title, - }) - if err != nil { - return nil, 0, err - } - - var total int64 - if err := store.db.QueryRow(ctx, query, args...).Scan(&total); err != nil { - return nil, 0, err - } - - if total <= 0 { - return nil, 0, nil - } - - query, args, err = BuildQuery(` - select id, - project_id, COALESCE((SELECT name FROM projects WHERE id = expenses.project_id), '') as project_name, - budget_id, COALESCE((SELECT name FROM budgets WHERE id = expenses.budget_id), '') as budget_name, - amount, expenses_at, - expenses_type, COALESCE((SELECT name FROM categories WHERE id = expenses.expenses_type), '') as expense_type_name, - remark, status, created_at, - created_user_id, COALESCE((SELECT username FROM sys_user WHERE id = expenses.created_user_id), '') as created_name, - updated_at, - updated_user_id, COALESCE((SELECT username FROM sys_user WHERE id = expenses.updated_user_id), '') as updated_name - FROM expenses - WHERE created_at BETWEEN @start AND @end - {{if ne .status 9999}}AND status = @status{{end}} - {{if ne .projecID 9999}}AND project_id = @projecID{{end}} - {{if ne .budgetID 9999}}AND budget_id = @budgetID{{end}} - {{if ne .expensesType 9999}}AND expenses_type = @expensesType{{end}} - {{if .isTitle}}AND name LIKE @title{{end}} - ORDER BY id DESC - LIMIT @limit OFFSET @offset; - `, map[string]any{ - "projecID": arg.ProjectID, - "budgetID": arg.BudgetID, - "expensesType": arg.ExpenseType, - "start": arg.TimeBegin, - "end": arg.TimeEnd, - "status": arg.Status, - "isTitle": arg.IsTitle, - "title": arg.Title, - "limit": arg.PageSize, - "offset": (arg.PageID - 1) * arg.PageSize, - }) - if err != nil { - return nil, 0, err - } - - rows, err := store.db.Query(ctx, query, args...) - if err != nil { - return nil, 0, err - } - defer rows.Close() - items := []*ExpenseView{} - for rows.Next() { - var i ExpenseView - if err := rows.Scan( - &i.ID, - &i.ProjectID, - &i.ProjectName, - &i.BudgetID, - &i.BudgetName, - &i.Amount, - &i.ExpensesAt, - &i.ExpensesType, - &i.ExpensesTypeName, - &i.Remark, - &i.Status, - &i.CreatedAt, - &i.CreatedUserID, - &i.CreatedName, - &i.UpdatedAt, - &i.UpdatedUserID, - &i.UpdatedName, - ); err != nil { - return nil, 0, err - } - items = append(items, &i) - } - if err := rows.Err(); err != nil { - return nil, 0, err - } - return items, total, nil -} diff --git a/internal/db/sqlc/query_income.go b/internal/db/sqlc/query_income.go deleted file mode 100644 index 0145450..0000000 --- a/internal/db/sqlc/query_income.go +++ /dev/null @@ -1,136 +0,0 @@ -package db - -import ( - "context" -) - -type ListIncomeConditionParam struct { - TimeBegin string - TimeEnd string - ProjectID int64 - BudgetID int64 - IncomeType int32 - IsTitle bool - Title string - Status int16 - PageID int32 - PageSize int32 -} - -type IncomeView struct { - Income - ProjectName string `json:"project_name"` - BudgetName string `json:"budget_name"` - IncomeTypeName string `json:"income_type_name"` - IncomeBankName string `json:"income_bank_name"` - CreatedName string `json:"created_name"` - UpdatedName string `json:"updated_name"` -} - -func (store *SQLStore) ListIncomeCondition(ctx context.Context, arg *ListIncomeConditionParam) ([]*IncomeView, int64, error) { - query, args, err := BuildQuery(` - SELECT COUNT(1) - FROM incomes - WHERE created_at BETWEEN @start AND @end - {{if ne .status 9999}}AND status = @status{{end}} - {{if ne .projecID 9999}}AND project_id = @projecID{{end}} - {{if ne .budgetID 9999}}AND budget_id = @budgetID{{end}} - {{if ne .incomeType 9999}}AND income_type = @incomeType{{end}} - {{if .isTitle}}AND name LIKE @title{{end}}; - `, map[string]any{ - "projecID": arg.ProjectID, - "budgetID": arg.BudgetID, - "incomeType": arg.IncomeType, - "start": arg.TimeBegin, - "end": arg.TimeEnd, - "status": arg.Status, - "isTitle": arg.IsTitle, - "title": arg.Title, - }) - if err != nil { - return nil, 0, err - } - - var total int64 - if err := store.db.QueryRow(ctx, query, args...).Scan(&total); err != nil { - return nil, 0, err - } - - if total <= 0 { - return nil, 0, nil - } - - query, args, err = BuildQuery(` - select id, - project_id, COALESCE((SELECT name FROM projects WHERE id = incomes.project_id), '') as project_name, - budget_id, COALESCE((SELECT name FROM budgets WHERE id = incomes.budget_id), '') as budget_name, - amount, income_at, - income_type, COALESCE((SELECT name FROM categories WHERE id = incomes.income_type), '') as income_type_name, - income_bank, COALESCE((SELECT name FROM categories WHERE id = incomes.income_bank), '') as income_bank_name, - remark, status, created_at, - created_user_id, COALESCE((SELECT username FROM sys_user WHERE id = incomes.created_user_id), '') as created_name, - updated_at, - updated_user_id, COALESCE((SELECT username FROM sys_user WHERE id = incomes.updated_user_id), '') as updated_name - FROM incomes - WHERE created_at BETWEEN @start AND @end - {{if ne .status 9999}}AND status = @status{{end}} - {{if ne .projecID 9999}}AND project_id = @projecID{{end}} - {{if ne .budgetID 9999}}AND budget_id = @budgetID{{end}} - {{if ne .incomeType 9999}}AND income_type = @incomeType{{end}} - {{if .isTitle}}AND name LIKE @title{{end}} - ORDER BY id DESC - LIMIT @limit OFFSET @offset; - `, map[string]any{ - "projecID": arg.ProjectID, - "budgetID": arg.BudgetID, - "incomeType": arg.IncomeType, - "start": arg.TimeBegin, - "end": arg.TimeEnd, - "status": arg.Status, - "isTitle": arg.IsTitle, - "title": arg.Title, - "limit": arg.PageSize, - "offset": (arg.PageID - 1) * arg.PageSize, - }) - if err != nil { - return nil, 0, err - } - - rows, err := store.db.Query(ctx, query, args...) - if err != nil { - return nil, 0, err - } - defer rows.Close() - items := []*IncomeView{} - for rows.Next() { - var i IncomeView - if err := rows.Scan( - &i.ID, - &i.ProjectID, - &i.ProjectName, - &i.BudgetID, - &i.BudgetName, - &i.Amount, - &i.IncomeAt, - &i.IncomeType, - &i.IncomeTypeName, - &i.IncomeBank, - &i.IncomeBankName, - &i.Remark, - &i.Status, - &i.CreatedAt, - &i.CreatedUserID, - &i.CreatedName, - &i.UpdatedAt, - &i.UpdatedUserID, - &i.UpdatedName, - ); err != nil { - return nil, 0, err - } - items = append(items, &i) - } - if err := rows.Err(); err != nil { - return nil, 0, err - } - return items, total, nil -} diff --git a/internal/db/sqlc/query_project.go b/internal/db/sqlc/query_project.go deleted file mode 100644 index eae2721..0000000 --- a/internal/db/sqlc/query_project.go +++ /dev/null @@ -1,131 +0,0 @@ -package db - -import ( - "context" -) - -type ListProjectConditionParam struct { - TimeBegin string - TimeEnd string - IsTitle bool - Title string - Status int16 - PageID int32 - PageSize int32 -} - -type ProjectView struct { - Project - // 字符串ID - SID string `json:"sid"` - CustomerName string `json:"customer_name"` - ApplyName string `json:"apply_name"` - CreatedName string `json:"created_name"` - UpdatedName string `json:"updated_name"` - StatusName string `json:"status_name"` - ManagerName string `json:"manager_name"` - MemberNames string `json:"member_names"` -} - -func (store *SQLStore) ListProjectCondition(ctx context.Context, arg *ListProjectConditionParam) ([]*ProjectView, int64, error) { - query, args, err := BuildQuery(` - SELECT COUNT(1) - FROM projects - WHERE created_at BETWEEN @start AND @end - {{if ne .status 9999}}AND status = @status{{end}} - {{if .isTitle}}AND name LIKE @title{{end}}; - `, map[string]any{ - "start": arg.TimeBegin, - "end": arg.TimeEnd, - "status": arg.Status, - "isTitle": arg.IsTitle, - "title": arg.Title, - }) - if err != nil { - return nil, 0, err - } - - var total int64 - if err := store.db.QueryRow(ctx, query, args...).Scan(&total); err != nil { - return nil, 0, err - } - - if total <= 0 { - return nil, 0, nil - } - - query, args, err = BuildQuery(` - SELECT id, name, start_at, end_at, customer_id, total_money, description, apply_at, - COALESCE((SELECT name FROM customers WHERE id = projects.customer_id), '') as customer_name, - COALESCE((SELECT username FROM sys_user WHERE id = projects.apply_user_id), '') as apply_name, - status, sort, created_at, updated_at, - created_user_id, COALESCE((SELECT username FROM sys_user WHERE id = projects.created_user_id), '') as created_name, - updated_user_id, COALESCE((SELECT username FROM sys_user WHERE id = projects.updated_user_id), '') as updated_name, - (CASE - WHEN status=-1 THEN '已删除' - WHEN status=0 THEN '未开始' - WHEN status=10 THEN '进行中' - WHEN status=20 THEN '已结项' - ELSE '未知' - END) as status_name, - COALESCE((SELECT username FROM sys_user WHERE id = projects.manager_id), '') as manager_name, - COALESCE((SELECT string_agg(username, ',') FROM sys_user WHERE id::text = ANY (string_to_array(projects.members, ','))), '') as member_names - FROM projects - WHERE created_at BETWEEN @start AND @end - {{if ne .status 9999}}AND status = @status{{end}} - {{if .isTitle}}AND name LIKE @title{{end}} - ORDER BY id DESC - LIMIT @limit OFFSET @offset; - `, map[string]any{ - "start": arg.TimeBegin, - "end": arg.TimeEnd, - "status": arg.Status, - "isTitle": arg.IsTitle, - "title": arg.Title, - "limit": arg.PageSize, - "offset": (arg.PageID - 1) * arg.PageSize, - }) - if err != nil { - return nil, 0, err - } - - rows, err := store.db.Query(ctx, query, args...) - if err != nil { - return nil, 0, err - } - defer rows.Close() - items := []*ProjectView{} - for rows.Next() { - var i ProjectView - if err := rows.Scan( - &i.SID, - &i.Name, - &i.StartAt, - &i.EndAt, - &i.CustomerID, - &i.TotalMoney, - &i.Description, - &i.ApplyAt, - &i.CustomerName, - &i.ApplyName, - &i.Status, - &i.Sort, - &i.CreatedAt, - &i.UpdatedAt, - &i.CreatedUserID, - &i.CreatedName, - &i.UpdatedUserID, - &i.UpdatedName, - &i.StatusName, - &i.ManagerName, - &i.MemberNames, - ); err != nil { - return nil, 0, err - } - items = append(items, &i) - } - if err := rows.Err(); err != nil { - return nil, 0, err - } - return items, total, nil -} diff --git a/internal/db/sqlc/store.go b/internal/db/sqlc/store.go deleted file mode 100644 index b6daa48..0000000 --- a/internal/db/sqlc/store.go +++ /dev/null @@ -1,201 +0,0 @@ -package db - -import ( - "context" - "errors" - "fmt" - - "management/internal/pkg/config" - - "github.com/jackc/pgconn" - "github.com/jackc/pgx/v5" - "github.com/jackc/pgx/v5/pgxpool" -) - -// ****************** conn ****************** - -func newDsn(conf config.DB) string { - return fmt.Sprintf("postgresql://%s:%s@%s:%d/%s?sslmode=disable", - conf.Username, - conf.Password, - conf.Host, - conf.Port, - conf.DBName) -} - -// ****************** errors ****************** - -const ( - foreignKeyViolation = "23503" - uniqueViolation = "23505" -) - -// var ErrUniqueViolation = &pgconn.PgError{ -// Code: UniqueViolation, -// } - -func ErrorCode(err error) string { - var pgErr *pgconn.PgError - if errors.As(err, &pgErr) { - return pgErr.Code - } - return "" -} - -// ****************** store ****************** -var Engine Store - -// Store defines all functions to execute db queries and transactions -type Store interface { - Querier - ExecTx(context.Context, func(*Queries) error) error - - Pool() *pgxpool.Pool - - SysDepartmentRebuildPath(ctx context.Context) error - SysRoleRebuildPath(ctx context.Context) error - CategoryRebuildPath(ctx context.Context) error - - ListCustomerCondition(ctx context.Context, arg *ListCustomerConditionParam) ([]*CustomerView, int64, error) - ListProjectCondition(ctx context.Context, arg *ListProjectConditionParam) ([]*ProjectView, int64, error) - ListBudgetCondition(ctx context.Context, arg *ListBudgetConditionParam) ([]*BudgetView, int64, error) - ListIncomeCondition(ctx context.Context, arg *ListIncomeConditionParam) ([]*IncomeView, int64, error) - ListExpenseCondition(ctx context.Context, arg *ListExpenseConditionParam) ([]*ExpenseView, int64, error) -} - -// SQLStore provides all functions to execute SQL queries and transactions -type SQLStore struct { - connPool *pgxpool.Pool - *Queries -} - -func NewIStore(ctx context.Context, conf config.DB) (Store, error) { - pool, err := pgxpool.New(ctx, newDsn(conf)) - if err != nil { - return nil, err - } - - err = pool.Ping(ctx) - if err != nil { - return nil, err - } - - return &SQLStore{ - connPool: pool, - Queries: New(pool), - }, nil -} - -// NewStore creates a new store -func NewStore(ctx context.Context) error { - pool, err := pgxpool.New(ctx, newDsn(config.File.DB)) - if err != nil { - return err - } - - err = pool.Ping(ctx) - if err != nil { - return err - } - - Engine = &SQLStore{ - connPool: pool, - Queries: New(pool), - } - - return nil -} - -func (store *SQLStore) Pool() *pgxpool.Pool { - return store.connPool -} - -func IsUniqueViolation(err error) bool { - return ErrorCode(err) == uniqueViolation -} - -func IsForeignKeyViolation(err error) bool { - return ErrorCode(err) == foreignKeyViolation -} - -func IsNoRows(err error) bool { - return errors.Is(err, pgx.ErrNoRows) -} - -func (store *SQLStore) ExecTx(ctx context.Context, fn func(*Queries) error) error { - tx, err := store.connPool.Begin(ctx) - if err != nil { - return err - } - - q := New(tx) - err = fn(q) - if err != nil { - if rbErr := tx.Rollback(ctx); rbErr != nil { - return fmt.Errorf("tx err: %v, rb err: %v", err, rbErr) - } - return err - } - - return tx.Commit(ctx) -} - -func (store *SQLStore) SysDepartmentRebuildPath(ctx context.Context) error { - query := ` - UPDATE sys_department AS tm - SET parent_path = (SELECT ',' || string_agg(cast(t.parent_id AS VARCHAR), ',') || ',' - FROM (WITH RECURSIVE temp (id, parent_id) AS (SELECT id, tm.parent_id - FROM sys_department - WHERE id = tm.id - UNION ALL - SELECT sys_department.id, sys_department.parent_id - FROM sys_department, - temp - WHERE sys_department.id = temp.parent_id) - SELECT id, parent_id - FROM temp - ORDER BY id) AS t) - WHERE tm.status = 0 ;` - _, err := store.db.Exec(ctx, query) - return err -} - -func (store *SQLStore) SysRoleRebuildPath(ctx context.Context) error { - query := ` - UPDATE sys_role AS tm - SET parent_path = (SELECT ',' || string_agg(cast(t.parent_id AS VARCHAR), ',') || ',' - FROM (WITH RECURSIVE temp (id, parent_id) AS (SELECT id, tm.parent_id - FROM sys_role - WHERE id = tm.id - UNION ALL - SELECT sys_role.id, sys_role.parent_id - FROM sys_role, - temp - WHERE sys_role.id = temp.parent_id) - SELECT id, parent_id - FROM temp - ORDER BY id) AS t) - WHERE tm.status = 0;` - _, err := store.db.Exec(ctx, query) - return err -} - -func (store *SQLStore) CategoryRebuildPath(ctx context.Context) error { - query := ` - UPDATE categories AS tm - SET parent_path = (SELECT ',' || string_agg(cast(t.parent_id AS VARCHAR), ',') || ',' - FROM (WITH RECURSIVE temp (id, parent_id) AS (SELECT id, tm.parent_id - FROM categories - WHERE id = tm.id - UNION ALL - SELECT categories.id, categories.parent_id - FROM categories, - temp - WHERE categories.id = temp.parent_id) - SELECT id, parent_id - FROM temp - ORDER BY id) AS t) - WHERE tm.status = 0;` - _, err := store.db.Exec(ctx, query) - return err -} diff --git a/internal/db/sqlc/sys_audit_log.sql.go b/internal/db/sqlc/sys_audit_log.sql.go deleted file mode 100644 index f4bcd0c..0000000 --- a/internal/db/sqlc/sys_audit_log.sql.go +++ /dev/null @@ -1,160 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. -// versions: -// sqlc v1.28.0 -// source: sys_audit_log.sql - -package db - -import ( - "context" - "time" - - "github.com/google/uuid" -) - -const countSysAuditLogCondition = `-- name: CountSysAuditLogCondition :one -SELECT COUNT(*) FROM sys_audit_log -WHERE created_at BETWEEN $1 AND $2 - AND ($3::text = '' OR email ILIKE '%' || $3 || '%') - AND ($4::text = '' OR username ILIKE '%' || $4 || '%') -` - -type CountSysAuditLogConditionParams struct { - StartAt time.Time `json:"start_at"` - EndAt time.Time `json:"end_at"` - Email string `json:"email"` - Username string `json:"username"` -} - -func (q *Queries) CountSysAuditLogCondition(ctx context.Context, arg *CountSysAuditLogConditionParams) (int64, error) { - row := q.db.QueryRow(ctx, countSysAuditLogCondition, - arg.StartAt, - arg.EndAt, - arg.Email, - arg.Username, - ) - var count int64 - err := row.Scan(&count) - return count, err -} - -const createSysAuditLog = `-- name: CreateSysAuditLog :exec -INSERT INTO sys_audit_log (created_at, - email, - username, - user_uuid, - start_at, - end_at, - duration, - url, - method, - parameters, - referer_url, - os, - ip, - browser, - remark) -VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15) -` - -type CreateSysAuditLogParams struct { - CreatedAt time.Time `json:"created_at"` - Email string `json:"email"` - Username string `json:"username"` - UserUuid uuid.UUID `json:"user_uuid"` - StartAt time.Time `json:"start_at"` - EndAt time.Time `json:"end_at"` - Duration string `json:"duration"` - Url string `json:"url"` - Method string `json:"method"` - Parameters string `json:"parameters"` - RefererUrl string `json:"referer_url"` - Os string `json:"os"` - Ip string `json:"ip"` - Browser string `json:"browser"` - Remark string `json:"remark"` -} - -func (q *Queries) CreateSysAuditLog(ctx context.Context, arg *CreateSysAuditLogParams) error { - _, err := q.db.Exec(ctx, createSysAuditLog, - arg.CreatedAt, - arg.Email, - arg.Username, - arg.UserUuid, - arg.StartAt, - arg.EndAt, - arg.Duration, - arg.Url, - arg.Method, - arg.Parameters, - arg.RefererUrl, - arg.Os, - arg.Ip, - arg.Browser, - arg.Remark, - ) - return err -} - -const listSysAuditLogCondition = `-- name: ListSysAuditLogCondition :many -SELECT id, created_at, email, username, user_uuid, start_at, end_at, duration, url, method, parameters, referer_url, os, ip, browser, remark FROM sys_audit_log -WHERE created_at BETWEEN $1 AND $2 - AND ($3::text = '' OR email ILIKE '%' || $3 || '%') - AND ($4::text = '' OR username ILIKE '%' || $4 || '%') -ORDER BY created_at DESC -OFFSET $5 -LIMIT $6 -` - -type ListSysAuditLogConditionParams struct { - StartAt time.Time `json:"start_at"` - EndAt time.Time `json:"end_at"` - Email string `json:"email"` - Username string `json:"username"` - Skip int32 `json:"skip"` - Size int32 `json:"size"` -} - -func (q *Queries) ListSysAuditLogCondition(ctx context.Context, arg *ListSysAuditLogConditionParams) ([]*SysAuditLog, error) { - rows, err := q.db.Query(ctx, listSysAuditLogCondition, - arg.StartAt, - arg.EndAt, - arg.Email, - arg.Username, - arg.Skip, - arg.Size, - ) - if err != nil { - return nil, err - } - defer rows.Close() - items := []*SysAuditLog{} - for rows.Next() { - var i SysAuditLog - if err := rows.Scan( - &i.ID, - &i.CreatedAt, - &i.Email, - &i.Username, - &i.UserUuid, - &i.StartAt, - &i.EndAt, - &i.Duration, - &i.Url, - &i.Method, - &i.Parameters, - &i.RefererUrl, - &i.Os, - &i.Ip, - &i.Browser, - &i.Remark, - ); err != nil { - return nil, err - } - items = append(items, &i) - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} diff --git a/internal/db/sqlc/sys_config.sql.go b/internal/db/sqlc/sys_config.sql.go deleted file mode 100644 index 418a3a2..0000000 --- a/internal/db/sqlc/sys_config.sql.go +++ /dev/null @@ -1,151 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. -// versions: -// sqlc v1.28.0 -// source: sys_config.sql - -package db - -import ( - "context" -) - -const countSysConfigCondition = `-- name: CountSysConfigCondition :one -SELECT COUNT(*) FROM sys_config -WHERE ($1::text = '' OR key ILIKE '%' || $1 || '%') -` - -func (q *Queries) CountSysConfigCondition(ctx context.Context, key string) (int64, error) { - row := q.db.QueryRow(ctx, countSysConfigCondition, key) - var count int64 - err := row.Scan(&count) - return count, err -} - -const createSysConfig = `-- name: CreateSysConfig :exec -INSERT INTO sys_config ( - key, - value -) VALUES ( - $1, $2 -) -` - -type CreateSysConfigParams struct { - Key string `json:"key"` - Value []byte `json:"value"` -} - -func (q *Queries) CreateSysConfig(ctx context.Context, arg *CreateSysConfigParams) error { - _, err := q.db.Exec(ctx, createSysConfig, arg.Key, arg.Value) - return err -} - -const existsSysConfigByKey = `-- name: ExistsSysConfigByKey :one -SELECT EXISTS ( - SELECT 1 FROM sys_config WHERE key = $1 -) -` - -func (q *Queries) ExistsSysConfigByKey(ctx context.Context, key string) (bool, error) { - row := q.db.QueryRow(ctx, existsSysConfigByKey, key) - var exists bool - err := row.Scan(&exists) - return exists, err -} - -const getSysConfig = `-- name: GetSysConfig :one -SELECT id, key, value, created_at, updated_at -FROM sys_config -WHERE id = $1 -LIMIT 1 -` - -func (q *Queries) GetSysConfig(ctx context.Context, id int32) (*SysConfig, error) { - row := q.db.QueryRow(ctx, getSysConfig, id) - var i SysConfig - err := row.Scan( - &i.ID, - &i.Key, - &i.Value, - &i.CreatedAt, - &i.UpdatedAt, - ) - return &i, err -} - -const getSysConfigByKey = `-- name: GetSysConfigByKey :one -SELECT id, key, value, created_at, updated_at -FROM sys_config -WHERE key = $1 -LIMIT 1 -` - -func (q *Queries) GetSysConfigByKey(ctx context.Context, key string) (*SysConfig, error) { - row := q.db.QueryRow(ctx, getSysConfigByKey, key) - var i SysConfig - err := row.Scan( - &i.ID, - &i.Key, - &i.Value, - &i.CreatedAt, - &i.UpdatedAt, - ) - return &i, err -} - -const listSysConfigCondition = `-- name: ListSysConfigCondition :many -SELECT id, key, value, created_at, updated_at -FROM sys_config -WHERE ($1::text = '' OR key ILIKE '%' || $1 || '%') -ORDER BY created_at DESC -OFFSET $2 -LIMIT $3 -` - -type ListSysConfigConditionParams struct { - Key string `json:"key"` - Skip int32 `json:"skip"` - Size int32 `json:"size"` -} - -func (q *Queries) ListSysConfigCondition(ctx context.Context, arg *ListSysConfigConditionParams) ([]*SysConfig, error) { - rows, err := q.db.Query(ctx, listSysConfigCondition, arg.Key, arg.Skip, arg.Size) - if err != nil { - return nil, err - } - defer rows.Close() - items := []*SysConfig{} - for rows.Next() { - var i SysConfig - if err := rows.Scan( - &i.ID, - &i.Key, - &i.Value, - &i.CreatedAt, - &i.UpdatedAt, - ); err != nil { - return nil, err - } - items = append(items, &i) - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const updateSysConfigByKey = `-- name: UpdateSysConfigByKey :exec -UPDATE sys_config -SET value = $2 -WHERE key = $1 -` - -type UpdateSysConfigByKeyParams struct { - Key string `json:"key"` - Value []byte `json:"value"` -} - -func (q *Queries) UpdateSysConfigByKey(ctx context.Context, arg *UpdateSysConfigByKeyParams) error { - _, err := q.db.Exec(ctx, updateSysConfigByKey, arg.Key, arg.Value) - return err -} diff --git a/internal/db/sqlc/sys_department.sql.go b/internal/db/sqlc/sys_department.sql.go deleted file mode 100644 index 53d10d3..0000000 --- a/internal/db/sqlc/sys_department.sql.go +++ /dev/null @@ -1,357 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. -// versions: -// sqlc v1.28.0 -// source: sys_department.sql - -package db - -import ( - "context" - "time" -) - -const allSysDepartment = `-- name: AllSysDepartment :many -SELECT id, name, parent_id, parent_path, status, sort, created_at, updated_at FROM sys_department -WHERE status = 0 -ORDER BY sort DESC -` - -func (q *Queries) AllSysDepartment(ctx context.Context) ([]*SysDepartment, error) { - rows, err := q.db.Query(ctx, allSysDepartment) - if err != nil { - return nil, err - } - defer rows.Close() - items := []*SysDepartment{} - for rows.Next() { - var i SysDepartment - if err := rows.Scan( - &i.ID, - &i.Name, - &i.ParentID, - &i.ParentPath, - &i.Status, - &i.Sort, - &i.CreatedAt, - &i.UpdatedAt, - ); err != nil { - return nil, err - } - items = append(items, &i) - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const countSysDepartmentCondition = `-- name: CountSysDepartmentCondition :one -SELECT COUNT(*) FROM sys_department -WHERE (NOT $1::Boolean OR status = $2) - AND (NOT $3::Boolean OR id = $4) - AND (NOT $5::Boolean OR parent_id = $6) - AND ($7::text = '' OR name ILIKE '%' || $7 || '%') -` - -type CountSysDepartmentConditionParams struct { - IsStatus bool `json:"is_status"` - Status int32 `json:"status"` - IsID bool `json:"is_id"` - ID int32 `json:"id"` - IsParentID bool `json:"is_parent_id"` - ParentID int32 `json:"parent_id"` - Name string `json:"name"` -} - -func (q *Queries) CountSysDepartmentCondition(ctx context.Context, arg *CountSysDepartmentConditionParams) (int64, error) { - row := q.db.QueryRow(ctx, countSysDepartmentCondition, - arg.IsStatus, - arg.Status, - arg.IsID, - arg.ID, - arg.IsParentID, - arg.ParentID, - arg.Name, - ) - var count int64 - err := row.Scan(&count) - return count, err -} - -const createSysDepartment = `-- name: CreateSysDepartment :one -INSERT INTO sys_department ( - name, - parent_id, - parent_path, - status, - sort, - created_at, - updated_at -) VALUES ( - $1, $2, $3, $4, $5, $6, $7 -) RETURNING id, name, parent_id, parent_path, status, sort, created_at, updated_at -` - -type CreateSysDepartmentParams struct { - Name string `json:"name"` - ParentID int32 `json:"parent_id"` - ParentPath string `json:"parent_path"` - Status int32 `json:"status"` - Sort int32 `json:"sort"` - CreatedAt time.Time `json:"created_at"` - UpdatedAt time.Time `json:"updated_at"` -} - -func (q *Queries) CreateSysDepartment(ctx context.Context, arg *CreateSysDepartmentParams) (*SysDepartment, error) { - row := q.db.QueryRow(ctx, createSysDepartment, - arg.Name, - arg.ParentID, - arg.ParentPath, - arg.Status, - arg.Sort, - arg.CreatedAt, - arg.UpdatedAt, - ) - var i SysDepartment - err := row.Scan( - &i.ID, - &i.Name, - &i.ParentID, - &i.ParentPath, - &i.Status, - &i.Sort, - &i.CreatedAt, - &i.UpdatedAt, - ) - return &i, err -} - -const existsSysDepartment = `-- name: ExistsSysDepartment :one -SELECT EXISTS ( - SELECT 1 FROM sys_department -) -` - -func (q *Queries) ExistsSysDepartment(ctx context.Context) (bool, error) { - row := q.db.QueryRow(ctx, existsSysDepartment) - var exists bool - err := row.Scan(&exists) - return exists, err -} - -const getSysDepartment = `-- name: GetSysDepartment :one -SELECT id, name, parent_id, parent_path, status, sort, created_at, updated_at FROM sys_department -WHERE id = $1 LIMIT 1 -` - -func (q *Queries) GetSysDepartment(ctx context.Context, id int32) (*SysDepartment, error) { - row := q.db.QueryRow(ctx, getSysDepartment, id) - var i SysDepartment - err := row.Scan( - &i.ID, - &i.Name, - &i.ParentID, - &i.ParentPath, - &i.Status, - &i.Sort, - &i.CreatedAt, - &i.UpdatedAt, - ) - return &i, err -} - -const listSysDepartment = `-- name: ListSysDepartment :many -SELECT id, name, parent_id, parent_path, status, sort, created_at, updated_at FROM sys_department -WHERE status = 0 -` - -func (q *Queries) ListSysDepartment(ctx context.Context) ([]*SysDepartment, error) { - rows, err := q.db.Query(ctx, listSysDepartment) - if err != nil { - return nil, err - } - defer rows.Close() - items := []*SysDepartment{} - for rows.Next() { - var i SysDepartment - if err := rows.Scan( - &i.ID, - &i.Name, - &i.ParentID, - &i.ParentPath, - &i.Status, - &i.Sort, - &i.CreatedAt, - &i.UpdatedAt, - ); err != nil { - return nil, err - } - items = append(items, &i) - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const listSysDepartmentCondition = `-- name: ListSysDepartmentCondition :many -SELECT id, name, parent_id, parent_path, status, sort, created_at, updated_at FROM sys_department -WHERE (NOT $1::Boolean OR status = $2) - AND (NOT $3::Boolean OR id = $4) - AND (NOT $5::Boolean OR parent_id = $6) - AND ($7::text = '' OR name ILIKE '%' || $7 || '%') -ORDER BY created_at DESC -OFFSET $8 -LIMIT $9 -` - -type ListSysDepartmentConditionParams struct { - IsStatus bool `json:"is_status"` - Status int32 `json:"status"` - IsID bool `json:"is_id"` - ID int32 `json:"id"` - IsParentID bool `json:"is_parent_id"` - ParentID int32 `json:"parent_id"` - Name string `json:"name"` - Skip int32 `json:"skip"` - Size int32 `json:"size"` -} - -func (q *Queries) ListSysDepartmentCondition(ctx context.Context, arg *ListSysDepartmentConditionParams) ([]*SysDepartment, error) { - rows, err := q.db.Query(ctx, listSysDepartmentCondition, - arg.IsStatus, - arg.Status, - arg.IsID, - arg.ID, - arg.IsParentID, - arg.ParentID, - arg.Name, - arg.Skip, - arg.Size, - ) - if err != nil { - return nil, err - } - defer rows.Close() - items := []*SysDepartment{} - for rows.Next() { - var i SysDepartment - if err := rows.Scan( - &i.ID, - &i.Name, - &i.ParentID, - &i.ParentPath, - &i.Status, - &i.Sort, - &i.CreatedAt, - &i.UpdatedAt, - ); err != nil { - return nil, err - } - items = append(items, &i) - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const listSysDepartmentRecursive = `-- name: ListSysDepartmentRecursive :many -WITH RECURSIVE dist AS (SELECT sys_department.id, sys_department.name, sys_department.parent_id, sys_department.parent_path, sys_department.status, sys_department.sort, sys_department.created_at, sys_department.updated_at - FROM sys_department - WHERE status = 0 - UNION ALL - SELECT sys_department.id, sys_department.name, sys_department.parent_id, sys_department.parent_path, sys_department.status, sys_department.sort, sys_department.created_at, sys_department.updated_at - FROM sys_department, - dist - WHERE sys_department.id = dist.parent_id) -SELECT DISTINCT id, name, parent_id, parent_path, status, sort, created_at, updated_at -FROM dist -ORDER BY sort DESC -` - -type ListSysDepartmentRecursiveRow struct { - ID int32 `json:"id"` - Name string `json:"name"` - ParentID int32 `json:"parent_id"` - ParentPath string `json:"parent_path"` - Status int32 `json:"status"` - Sort int32 `json:"sort"` - CreatedAt time.Time `json:"created_at"` - UpdatedAt time.Time `json:"updated_at"` -} - -func (q *Queries) ListSysDepartmentRecursive(ctx context.Context) ([]*ListSysDepartmentRecursiveRow, error) { - rows, err := q.db.Query(ctx, listSysDepartmentRecursive) - if err != nil { - return nil, err - } - defer rows.Close() - items := []*ListSysDepartmentRecursiveRow{} - for rows.Next() { - var i ListSysDepartmentRecursiveRow - if err := rows.Scan( - &i.ID, - &i.Name, - &i.ParentID, - &i.ParentPath, - &i.Status, - &i.Sort, - &i.CreatedAt, - &i.UpdatedAt, - ); err != nil { - return nil, err - } - items = append(items, &i) - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const updateSysDepartment = `-- name: UpdateSysDepartment :one -UPDATE sys_department -SET name = $2, - parent_id = $3, - parent_path = $4, - status = $5, - sort = $6, - updated_at = $7 -WHERE id = $1 -RETURNING id, name, parent_id, parent_path, status, sort, created_at, updated_at -` - -type UpdateSysDepartmentParams struct { - ID int32 `json:"id"` - Name string `json:"name"` - ParentID int32 `json:"parent_id"` - ParentPath string `json:"parent_path"` - Status int32 `json:"status"` - Sort int32 `json:"sort"` - UpdatedAt time.Time `json:"updated_at"` -} - -func (q *Queries) UpdateSysDepartment(ctx context.Context, arg *UpdateSysDepartmentParams) (*SysDepartment, error) { - row := q.db.QueryRow(ctx, updateSysDepartment, - arg.ID, - arg.Name, - arg.ParentID, - arg.ParentPath, - arg.Status, - arg.Sort, - arg.UpdatedAt, - ) - var i SysDepartment - err := row.Scan( - &i.ID, - &i.Name, - &i.ParentID, - &i.ParentPath, - &i.Status, - &i.Sort, - &i.CreatedAt, - &i.UpdatedAt, - ) - return &i, err -} diff --git a/internal/db/sqlc/sys_menu.sql.go b/internal/db/sqlc/sys_menu.sql.go deleted file mode 100644 index 1af092a..0000000 --- a/internal/db/sqlc/sys_menu.sql.go +++ /dev/null @@ -1,482 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. -// versions: -// sqlc v1.28.0 -// source: sys_menu.sql - -package db - -import ( - "context" - "time" -) - -const allSysMenu = `-- name: AllSysMenu :many -SELECT id, name, display_name, url, type, parent_id, parent_path, avatar, style, visible, is_list, status, sort, created_at, updated_at FROM sys_menu -WHERE status = 0 -ORDER BY sort DESC -` - -func (q *Queries) AllSysMenu(ctx context.Context) ([]*SysMenu, error) { - rows, err := q.db.Query(ctx, allSysMenu) - if err != nil { - return nil, err - } - defer rows.Close() - items := []*SysMenu{} - for rows.Next() { - var i SysMenu - if err := rows.Scan( - &i.ID, - &i.Name, - &i.DisplayName, - &i.Url, - &i.Type, - &i.ParentID, - &i.ParentPath, - &i.Avatar, - &i.Style, - &i.Visible, - &i.IsList, - &i.Status, - &i.Sort, - &i.CreatedAt, - &i.UpdatedAt, - ); err != nil { - return nil, err - } - items = append(items, &i) - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const createSysMenu = `-- name: CreateSysMenu :one -INSERT INTO sys_menu ( - name, - display_name, - url, - type, - parent_id, - parent_path, - avatar, - style, - visible, - is_list, - status, - sort, - created_at, - updated_at -) VALUES ( - $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14 -) RETURNING id, name, display_name, url, type, parent_id, parent_path, avatar, style, visible, is_list, status, sort, created_at, updated_at -` - -type CreateSysMenuParams struct { - Name string `json:"name"` - DisplayName string `json:"display_name"` - Url string `json:"url"` - Type string `json:"type"` - ParentID int32 `json:"parent_id"` - ParentPath string `json:"parent_path"` - Avatar string `json:"avatar"` - Style string `json:"style"` - Visible bool `json:"visible"` - IsList bool `json:"is_list"` - Status int32 `json:"status"` - Sort int32 `json:"sort"` - CreatedAt time.Time `json:"created_at"` - UpdatedAt time.Time `json:"updated_at"` -} - -func (q *Queries) CreateSysMenu(ctx context.Context, arg *CreateSysMenuParams) (*SysMenu, error) { - row := q.db.QueryRow(ctx, createSysMenu, - arg.Name, - arg.DisplayName, - arg.Url, - arg.Type, - arg.ParentID, - arg.ParentPath, - arg.Avatar, - arg.Style, - arg.Visible, - arg.IsList, - arg.Status, - arg.Sort, - arg.CreatedAt, - arg.UpdatedAt, - ) - var i SysMenu - err := row.Scan( - &i.ID, - &i.Name, - &i.DisplayName, - &i.Url, - &i.Type, - &i.ParentID, - &i.ParentPath, - &i.Avatar, - &i.Style, - &i.Visible, - &i.IsList, - &i.Status, - &i.Sort, - &i.CreatedAt, - &i.UpdatedAt, - ) - return &i, err -} - -const existsMenu = `-- name: ExistsMenu :one -SELECT EXISTS ( - SELECT 1 FROM sys_menu -) -` - -func (q *Queries) ExistsMenu(ctx context.Context) (bool, error) { - row := q.db.QueryRow(ctx, existsMenu) - var exists bool - err := row.Scan(&exists) - return exists, err -} - -const getSysMenu = `-- name: GetSysMenu :one -SELECT id, name, display_name, url, type, parent_id, parent_path, avatar, style, visible, is_list, status, sort, created_at, updated_at FROM sys_menu -WHERE id = $1 LIMIT 1 -` - -func (q *Queries) GetSysMenu(ctx context.Context, id int32) (*SysMenu, error) { - row := q.db.QueryRow(ctx, getSysMenu, id) - var i SysMenu - err := row.Scan( - &i.ID, - &i.Name, - &i.DisplayName, - &i.Url, - &i.Type, - &i.ParentID, - &i.ParentPath, - &i.Avatar, - &i.Style, - &i.Visible, - &i.IsList, - &i.Status, - &i.Sort, - &i.CreatedAt, - &i.UpdatedAt, - ) - return &i, err -} - -const getSysMenuByUrl = `-- name: GetSysMenuByUrl :one -SELECT id, name, display_name, url, type, parent_id, parent_path, avatar, style, visible, is_list, status, sort, created_at, updated_at FROM sys_menu -WHERE url = $1 LIMIT 1 -` - -func (q *Queries) GetSysMenuByUrl(ctx context.Context, url string) (*SysMenu, error) { - row := q.db.QueryRow(ctx, getSysMenuByUrl, url) - var i SysMenu - err := row.Scan( - &i.ID, - &i.Name, - &i.DisplayName, - &i.Url, - &i.Type, - &i.ParentID, - &i.ParentPath, - &i.Avatar, - &i.Style, - &i.Visible, - &i.IsList, - &i.Status, - &i.Sort, - &i.CreatedAt, - &i.UpdatedAt, - ) - return &i, err -} - -const listSysMenuByRoleID = `-- name: ListSysMenuByRoleID :many -SELECT id, name, display_name, url, type, parent_id, parent_path, avatar, style, visible, is_list, status, sort, created_at, updated_at FROM sys_menu -WHERE id IN (SELECT menu_id - FROM sys_role_menu - WHERE role_id = $1) -` - -func (q *Queries) ListSysMenuByRoleID(ctx context.Context, roleID int32) ([]*SysMenu, error) { - rows, err := q.db.Query(ctx, listSysMenuByRoleID, roleID) - if err != nil { - return nil, err - } - defer rows.Close() - items := []*SysMenu{} - for rows.Next() { - var i SysMenu - if err := rows.Scan( - &i.ID, - &i.Name, - &i.DisplayName, - &i.Url, - &i.Type, - &i.ParentID, - &i.ParentPath, - &i.Avatar, - &i.Style, - &i.Visible, - &i.IsList, - &i.Status, - &i.Sort, - &i.CreatedAt, - &i.UpdatedAt, - ); err != nil { - return nil, err - } - items = append(items, &i) - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const listSysMenuIDByRoleID = `-- name: ListSysMenuIDByRoleID :many -SELECT menu_id -FROM sys_role_menu -WHERE role_id = $1 -` - -func (q *Queries) ListSysMenuIDByRoleID(ctx context.Context, roleID int32) ([]int32, error) { - rows, err := q.db.Query(ctx, listSysMenuIDByRoleID, roleID) - if err != nil { - return nil, err - } - defer rows.Close() - items := []int32{} - for rows.Next() { - var menu_id int32 - if err := rows.Scan(&menu_id); err != nil { - return nil, err - } - items = append(items, menu_id) - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const recursiveSysMenus = `-- name: RecursiveSysMenus :many -WITH RECURSIVE dist AS (SELECT sys_menu.id, sys_menu.name, sys_menu.display_name, sys_menu.url, sys_menu.type, sys_menu.parent_id, sys_menu.parent_path, sys_menu.avatar, sys_menu.style, sys_menu.visible, sys_menu.is_list, sys_menu.status, sys_menu.sort, sys_menu.created_at, sys_menu.updated_at - FROM sys_menu - WHERE status = 0 - AND is_list = true - UNION ALL - SELECT sys_menu.id, sys_menu.name, sys_menu.display_name, sys_menu.url, sys_menu.type, sys_menu.parent_id, sys_menu.parent_path, sys_menu.avatar, sys_menu.style, sys_menu.visible, sys_menu.is_list, sys_menu.status, sys_menu.sort, sys_menu.created_at, sys_menu.updated_at - FROM sys_menu, - dist - WHERE sys_menu.id = dist.parent_id) -SELECT id, name, display_name, url, type, parent_id, parent_path, avatar, style, visible, is_list, status, sort, created_at, updated_at -FROM dist -ORDER BY dist.sort DESC, dist.id ASC -` - -type RecursiveSysMenusRow struct { - ID int32 `json:"id"` - Name string `json:"name"` - DisplayName string `json:"display_name"` - Url string `json:"url"` - Type string `json:"type"` - ParentID int32 `json:"parent_id"` - ParentPath string `json:"parent_path"` - Avatar string `json:"avatar"` - Style string `json:"style"` - Visible bool `json:"visible"` - IsList bool `json:"is_list"` - Status int32 `json:"status"` - Sort int32 `json:"sort"` - CreatedAt time.Time `json:"created_at"` - UpdatedAt time.Time `json:"updated_at"` -} - -func (q *Queries) RecursiveSysMenus(ctx context.Context) ([]*RecursiveSysMenusRow, error) { - rows, err := q.db.Query(ctx, recursiveSysMenus) - if err != nil { - return nil, err - } - defer rows.Close() - items := []*RecursiveSysMenusRow{} - for rows.Next() { - var i RecursiveSysMenusRow - if err := rows.Scan( - &i.ID, - &i.Name, - &i.DisplayName, - &i.Url, - &i.Type, - &i.ParentID, - &i.ParentPath, - &i.Avatar, - &i.Style, - &i.Visible, - &i.IsList, - &i.Status, - &i.Sort, - &i.CreatedAt, - &i.UpdatedAt, - ); err != nil { - return nil, err - } - items = append(items, &i) - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const recursiveSysMenusByRoleID = `-- name: RecursiveSysMenusByRoleID :many -WITH RECURSIVE dist AS (SELECT sys_menu.id, sys_menu.name, sys_menu.display_name, sys_menu.url, sys_menu.type, sys_menu.parent_id, sys_menu.parent_path, sys_menu.avatar, sys_menu.style, sys_menu.visible, sys_menu.is_list, sys_menu.status, sys_menu.sort, sys_menu.created_at, sys_menu.updated_at - FROM sys_menu - WHERE status = 0 - AND is_list = true - AND id IN (SELECT menu_id - FROM sys_role_menu - WHERE role_id = $1) - UNION ALL - SELECT sys_menu.id, sys_menu.name, sys_menu.display_name, sys_menu.url, sys_menu.type, sys_menu.parent_id, sys_menu.parent_path, sys_menu.avatar, sys_menu.style, sys_menu.visible, sys_menu.is_list, sys_menu.status, sys_menu.sort, sys_menu.created_at, sys_menu.updated_at - FROM sys_menu, - dist - WHERE sys_menu.id = dist.parent_id) -SELECT id, name, display_name, url, type, parent_id, parent_path, avatar, style, visible, is_list, status, sort, created_at, updated_at -FROM dist -ORDER BY dist.sort DESC, dist.id ASC -` - -type RecursiveSysMenusByRoleIDRow struct { - ID int32 `json:"id"` - Name string `json:"name"` - DisplayName string `json:"display_name"` - Url string `json:"url"` - Type string `json:"type"` - ParentID int32 `json:"parent_id"` - ParentPath string `json:"parent_path"` - Avatar string `json:"avatar"` - Style string `json:"style"` - Visible bool `json:"visible"` - IsList bool `json:"is_list"` - Status int32 `json:"status"` - Sort int32 `json:"sort"` - CreatedAt time.Time `json:"created_at"` - UpdatedAt time.Time `json:"updated_at"` -} - -func (q *Queries) RecursiveSysMenusByRoleID(ctx context.Context, roleID int32) ([]*RecursiveSysMenusByRoleIDRow, error) { - rows, err := q.db.Query(ctx, recursiveSysMenusByRoleID, roleID) - if err != nil { - return nil, err - } - defer rows.Close() - items := []*RecursiveSysMenusByRoleIDRow{} - for rows.Next() { - var i RecursiveSysMenusByRoleIDRow - if err := rows.Scan( - &i.ID, - &i.Name, - &i.DisplayName, - &i.Url, - &i.Type, - &i.ParentID, - &i.ParentPath, - &i.Avatar, - &i.Style, - &i.Visible, - &i.IsList, - &i.Status, - &i.Sort, - &i.CreatedAt, - &i.UpdatedAt, - ); err != nil { - return nil, err - } - items = append(items, &i) - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const updateSysMenu = `-- name: UpdateSysMenu :one -UPDATE sys_menu -SET name = $2, - display_name = $3, - url = $4, - type = $5, - parent_id = $6, - parent_path = $7, - avatar = $8, - style = $9, - visible = $10, - is_list = $11, - status = $12, - sort = $13, - updated_at = $14 -WHERE id = $1 -RETURNING id, name, display_name, url, type, parent_id, parent_path, avatar, style, visible, is_list, status, sort, created_at, updated_at -` - -type UpdateSysMenuParams struct { - ID int32 `json:"id"` - Name string `json:"name"` - DisplayName string `json:"display_name"` - Url string `json:"url"` - Type string `json:"type"` - ParentID int32 `json:"parent_id"` - ParentPath string `json:"parent_path"` - Avatar string `json:"avatar"` - Style string `json:"style"` - Visible bool `json:"visible"` - IsList bool `json:"is_list"` - Status int32 `json:"status"` - Sort int32 `json:"sort"` - UpdatedAt time.Time `json:"updated_at"` -} - -func (q *Queries) UpdateSysMenu(ctx context.Context, arg *UpdateSysMenuParams) (*SysMenu, error) { - row := q.db.QueryRow(ctx, updateSysMenu, - arg.ID, - arg.Name, - arg.DisplayName, - arg.Url, - arg.Type, - arg.ParentID, - arg.ParentPath, - arg.Avatar, - arg.Style, - arg.Visible, - arg.IsList, - arg.Status, - arg.Sort, - arg.UpdatedAt, - ) - var i SysMenu - err := row.Scan( - &i.ID, - &i.Name, - &i.DisplayName, - &i.Url, - &i.Type, - &i.ParentID, - &i.ParentPath, - &i.Avatar, - &i.Style, - &i.Visible, - &i.IsList, - &i.Status, - &i.Sort, - &i.CreatedAt, - &i.UpdatedAt, - ) - return &i, err -} diff --git a/internal/db/sqlc/sys_role.sql.go b/internal/db/sqlc/sys_role.sql.go deleted file mode 100644 index 5198a56..0000000 --- a/internal/db/sqlc/sys_role.sql.go +++ /dev/null @@ -1,384 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. -// versions: -// sqlc v1.28.0 -// source: sys_role.sql - -package db - -import ( - "context" - "time" -) - -const allSysRole = `-- name: AllSysRole :many -SELECT id, name, display_name, parent_id, parent_path, vip, status, sort, created_at, updated_at FROM sys_role -WHERE status = 0 -ORDER BY sort DESC -` - -func (q *Queries) AllSysRole(ctx context.Context) ([]*SysRole, error) { - rows, err := q.db.Query(ctx, allSysRole) - if err != nil { - return nil, err - } - defer rows.Close() - items := []*SysRole{} - for rows.Next() { - var i SysRole - if err := rows.Scan( - &i.ID, - &i.Name, - &i.DisplayName, - &i.ParentID, - &i.ParentPath, - &i.Vip, - &i.Status, - &i.Sort, - &i.CreatedAt, - &i.UpdatedAt, - ); err != nil { - return nil, err - } - items = append(items, &i) - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const countSysRole = `-- name: CountSysRole :one -SELECT count(*) FROM sys_role -WHERE status = 0 -` - -func (q *Queries) CountSysRole(ctx context.Context) (int64, error) { - row := q.db.QueryRow(ctx, countSysRole) - var count int64 - err := row.Scan(&count) - return count, err -} - -const countSysRoleCondition = `-- name: CountSysRoleCondition :one -SELECT COUNT(*) FROM sys_role -WHERE (NOT $1::Boolean OR status = $2) - AND (NOT $3::Boolean OR id = $4) - AND (NOT $5::Boolean OR parent_id = $6) - AND ($7::text = '' OR display_name ILIKE '%' || $7 || '%') -` - -type CountSysRoleConditionParams struct { - IsStatus bool `json:"is_status"` - Status int32 `json:"status"` - IsID bool `json:"is_id"` - ID int32 `json:"id"` - IsParentID bool `json:"is_parent_id"` - ParentID int32 `json:"parent_id"` - DisplayName string `json:"display_name"` -} - -func (q *Queries) CountSysRoleCondition(ctx context.Context, arg *CountSysRoleConditionParams) (int64, error) { - row := q.db.QueryRow(ctx, countSysRoleCondition, - arg.IsStatus, - arg.Status, - arg.IsID, - arg.ID, - arg.IsParentID, - arg.ParentID, - arg.DisplayName, - ) - var count int64 - err := row.Scan(&count) - return count, err -} - -const createSysRole = `-- name: CreateSysRole :one -INSERT INTO sys_role ( - name, - display_name, - vip, - parent_id, - parent_path, - status, - sort, - created_at, - updated_at -) VALUES ( - $1, $2, $3, $4, $5, $6, $7, $8, $9 -) RETURNING id, name, display_name, parent_id, parent_path, vip, status, sort, created_at, updated_at -` - -type CreateSysRoleParams struct { - Name string `json:"name"` - DisplayName string `json:"display_name"` - Vip bool `json:"vip"` - ParentID int32 `json:"parent_id"` - ParentPath string `json:"parent_path"` - Status int32 `json:"status"` - Sort int32 `json:"sort"` - CreatedAt time.Time `json:"created_at"` - UpdatedAt time.Time `json:"updated_at"` -} - -func (q *Queries) CreateSysRole(ctx context.Context, arg *CreateSysRoleParams) (*SysRole, error) { - row := q.db.QueryRow(ctx, createSysRole, - arg.Name, - arg.DisplayName, - arg.Vip, - arg.ParentID, - arg.ParentPath, - arg.Status, - arg.Sort, - arg.CreatedAt, - arg.UpdatedAt, - ) - var i SysRole - err := row.Scan( - &i.ID, - &i.Name, - &i.DisplayName, - &i.ParentID, - &i.ParentPath, - &i.Vip, - &i.Status, - &i.Sort, - &i.CreatedAt, - &i.UpdatedAt, - ) - return &i, err -} - -const existsVipRole = `-- name: ExistsVipRole :one -SELECT EXISTS ( - SELECT 1 FROM sys_role - WHERE vip = true -) -` - -func (q *Queries) ExistsVipRole(ctx context.Context) (bool, error) { - row := q.db.QueryRow(ctx, existsVipRole) - var exists bool - err := row.Scan(&exists) - return exists, err -} - -const getFirstVipRole = `-- name: GetFirstVipRole :one -SELECT id, name, display_name, parent_id, parent_path, vip, status, sort, created_at, updated_at FROM sys_role -WHERE vip = true -ORDER BY id ASC -LIMIT 1 -` - -func (q *Queries) GetFirstVipRole(ctx context.Context) (*SysRole, error) { - row := q.db.QueryRow(ctx, getFirstVipRole) - var i SysRole - err := row.Scan( - &i.ID, - &i.Name, - &i.DisplayName, - &i.ParentID, - &i.ParentPath, - &i.Vip, - &i.Status, - &i.Sort, - &i.CreatedAt, - &i.UpdatedAt, - ) - return &i, err -} - -const getSysRole = `-- name: GetSysRole :one -SELECT id, name, display_name, parent_id, parent_path, vip, status, sort, created_at, updated_at FROM sys_role -WHERE id = $1 LIMIT 1 -` - -func (q *Queries) GetSysRole(ctx context.Context, id int32) (*SysRole, error) { - row := q.db.QueryRow(ctx, getSysRole, id) - var i SysRole - err := row.Scan( - &i.ID, - &i.Name, - &i.DisplayName, - &i.ParentID, - &i.ParentPath, - &i.Vip, - &i.Status, - &i.Sort, - &i.CreatedAt, - &i.UpdatedAt, - ) - return &i, err -} - -const getSysRoleByUserID = `-- name: GetSysRoleByUserID :one -SELECT id, name, display_name, parent_id, parent_path, vip, status, sort, created_at, updated_at FROM sys_role -WHERE id = (SELECT role_id - FROM sys_user - WHERE sys_user.id = $1) -` - -func (q *Queries) GetSysRoleByUserID(ctx context.Context, id int32) (*SysRole, error) { - row := q.db.QueryRow(ctx, getSysRoleByUserID, id) - var i SysRole - err := row.Scan( - &i.ID, - &i.Name, - &i.DisplayName, - &i.ParentID, - &i.ParentPath, - &i.Vip, - &i.Status, - &i.Sort, - &i.CreatedAt, - &i.UpdatedAt, - ) - return &i, err -} - -const listSysRole = `-- name: ListSysRole :many -SELECT id, name, display_name, parent_id, parent_path, vip, status, sort, created_at, updated_at FROM sys_role -WHERE status = 0 -` - -func (q *Queries) ListSysRole(ctx context.Context) ([]*SysRole, error) { - rows, err := q.db.Query(ctx, listSysRole) - if err != nil { - return nil, err - } - defer rows.Close() - items := []*SysRole{} - for rows.Next() { - var i SysRole - if err := rows.Scan( - &i.ID, - &i.Name, - &i.DisplayName, - &i.ParentID, - &i.ParentPath, - &i.Vip, - &i.Status, - &i.Sort, - &i.CreatedAt, - &i.UpdatedAt, - ); err != nil { - return nil, err - } - items = append(items, &i) - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const listSysRoleCondition = `-- name: ListSysRoleCondition :many -SELECT id, name, display_name, parent_id, parent_path, vip, status, sort, created_at, updated_at FROM sys_role -WHERE (NOT $1::Boolean OR status = $2) - AND (NOT $3::Boolean OR id = $4) - AND (NOT $5::Boolean OR parent_id = $6) - AND ($7::text = '' OR display_name ILIKE '%' || $7 || '%') -ORDER BY created_at DESC -OFFSET $8 -LIMIT $9 -` - -type ListSysRoleConditionParams struct { - IsStatus bool `json:"is_status"` - Status int32 `json:"status"` - IsID bool `json:"is_id"` - ID int32 `json:"id"` - IsParentID bool `json:"is_parent_id"` - ParentID int32 `json:"parent_id"` - DisplayName string `json:"display_name"` - Skip int32 `json:"skip"` - Size int32 `json:"size"` -} - -func (q *Queries) ListSysRoleCondition(ctx context.Context, arg *ListSysRoleConditionParams) ([]*SysRole, error) { - rows, err := q.db.Query(ctx, listSysRoleCondition, - arg.IsStatus, - arg.Status, - arg.IsID, - arg.ID, - arg.IsParentID, - arg.ParentID, - arg.DisplayName, - arg.Skip, - arg.Size, - ) - if err != nil { - return nil, err - } - defer rows.Close() - items := []*SysRole{} - for rows.Next() { - var i SysRole - if err := rows.Scan( - &i.ID, - &i.Name, - &i.DisplayName, - &i.ParentID, - &i.ParentPath, - &i.Vip, - &i.Status, - &i.Sort, - &i.CreatedAt, - &i.UpdatedAt, - ); err != nil { - return nil, err - } - items = append(items, &i) - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const updateSysRole = `-- name: UpdateSysRole :one -UPDATE sys_role -SET display_name = $2, - status = $3, - parent_id = $4, - parent_path = $5, - sort = $6, - updated_at = $7 -WHERE id = $1 -RETURNING id, name, display_name, parent_id, parent_path, vip, status, sort, created_at, updated_at -` - -type UpdateSysRoleParams struct { - ID int32 `json:"id"` - DisplayName string `json:"display_name"` - Status int32 `json:"status"` - ParentID int32 `json:"parent_id"` - ParentPath string `json:"parent_path"` - Sort int32 `json:"sort"` - UpdatedAt time.Time `json:"updated_at"` -} - -func (q *Queries) UpdateSysRole(ctx context.Context, arg *UpdateSysRoleParams) (*SysRole, error) { - row := q.db.QueryRow(ctx, updateSysRole, - arg.ID, - arg.DisplayName, - arg.Status, - arg.ParentID, - arg.ParentPath, - arg.Sort, - arg.UpdatedAt, - ) - var i SysRole - err := row.Scan( - &i.ID, - &i.Name, - &i.DisplayName, - &i.ParentID, - &i.ParentPath, - &i.Vip, - &i.Status, - &i.Sort, - &i.CreatedAt, - &i.UpdatedAt, - ) - return &i, err -} diff --git a/internal/db/sqlc/sys_role_menu.sql.go b/internal/db/sqlc/sys_role_menu.sql.go deleted file mode 100644 index b46b6ee..0000000 --- a/internal/db/sqlc/sys_role_menu.sql.go +++ /dev/null @@ -1,39 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. -// versions: -// sqlc v1.28.0 -// source: sys_role_menu.sql - -package db - -import ( - "context" -) - -const createRoleMenu = `-- name: CreateRoleMenu :exec -INSERT INTO sys_role_menu ( - role_id, - menu_id -) VALUES ( - $1, $2 -) -` - -type CreateRoleMenuParams struct { - RoleID int32 `json:"role_id"` - MenuID int32 `json:"menu_id"` -} - -func (q *Queries) CreateRoleMenu(ctx context.Context, arg *CreateRoleMenuParams) error { - _, err := q.db.Exec(ctx, createRoleMenu, arg.RoleID, arg.MenuID) - return err -} - -const deleteRoleMneuByRoleID = `-- name: DeleteRoleMneuByRoleID :exec -DELETE FROM sys_role_menu -WHERE role_id = $1 -` - -func (q *Queries) DeleteRoleMneuByRoleID(ctx context.Context, roleID int32) error { - _, err := q.db.Exec(ctx, deleteRoleMneuByRoleID, roleID) - return err -} diff --git a/internal/db/sqlc/sys_user.sql.go b/internal/db/sqlc/sys_user.sql.go deleted file mode 100644 index a4826c9..0000000 --- a/internal/db/sqlc/sys_user.sql.go +++ /dev/null @@ -1,436 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. -// versions: -// sqlc v1.28.0 -// source: sys_user.sql - -package db - -import ( - "context" - "time" - - "github.com/google/uuid" -) - -const countSysUser = `-- name: CountSysUser :one -SELECT COUNT(*) FROM sys_user -WHERE status = 0 -` - -func (q *Queries) CountSysUser(ctx context.Context) (int64, error) { - row := q.db.QueryRow(ctx, countSysUser) - var count int64 - err := row.Scan(&count) - return count, err -} - -const countSysUserCondition = `-- name: CountSysUserCondition :one -SELECT COUNT(*) FROM sys_user -WHERE (NOT $1::Boolean OR status = $2) - AND (NOT $3::Boolean OR id = $4) - AND ($5::text = '' OR username ILIKE '%' || $5 || '%') - AND ($6::text = '' OR email ILIKE '%' || $6 || '%') -` - -type CountSysUserConditionParams struct { - IsStatus bool `json:"is_status"` - Status int32 `json:"status"` - IsID bool `json:"is_id"` - ID int32 `json:"id"` - Username string `json:"username"` - Email string `json:"email"` -} - -func (q *Queries) CountSysUserCondition(ctx context.Context, arg *CountSysUserConditionParams) (int64, error) { - row := q.db.QueryRow(ctx, countSysUserCondition, - arg.IsStatus, - arg.Status, - arg.IsID, - arg.ID, - arg.Username, - arg.Email, - ) - var count int64 - err := row.Scan(&count) - return count, err -} - -const createSysUser = `-- name: CreateSysUser :one -INSERT INTO sys_user ( - uuid, - email, - username, - hashed_password, - salt, - avatar, - gender, - department_id, - role_id, - status, - change_password_at, - created_at, - updated_at -) VALUES ( - $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13 -) RETURNING id, uuid, email, username, hashed_password, salt, avatar, gender, department_id, role_id, status, change_password_at, created_at, updated_at -` - -type CreateSysUserParams struct { - Uuid uuid.UUID `json:"uuid"` - Email string `json:"email"` - Username string `json:"username"` - HashedPassword []byte `json:"hashed_password"` - Salt string `json:"salt"` - Avatar string `json:"avatar"` - Gender int32 `json:"gender"` - DepartmentID int32 `json:"department_id"` - RoleID int32 `json:"role_id"` - Status int32 `json:"status"` - ChangePasswordAt time.Time `json:"change_password_at"` - CreatedAt time.Time `json:"created_at"` - UpdatedAt time.Time `json:"updated_at"` -} - -func (q *Queries) CreateSysUser(ctx context.Context, arg *CreateSysUserParams) (*SysUser, error) { - row := q.db.QueryRow(ctx, createSysUser, - arg.Uuid, - arg.Email, - arg.Username, - arg.HashedPassword, - arg.Salt, - arg.Avatar, - arg.Gender, - arg.DepartmentID, - arg.RoleID, - arg.Status, - arg.ChangePasswordAt, - arg.CreatedAt, - arg.UpdatedAt, - ) - var i SysUser - err := row.Scan( - &i.ID, - &i.Uuid, - &i.Email, - &i.Username, - &i.HashedPassword, - &i.Salt, - &i.Avatar, - &i.Gender, - &i.DepartmentID, - &i.RoleID, - &i.Status, - &i.ChangePasswordAt, - &i.CreatedAt, - &i.UpdatedAt, - ) - return &i, err -} - -const existsSysUser = `-- name: ExistsSysUser :one -SELECT EXISTS ( - SELECT 1 FROM sys_user -) -` - -func (q *Queries) ExistsSysUser(ctx context.Context) (bool, error) { - row := q.db.QueryRow(ctx, existsSysUser) - var exists bool - err := row.Scan(&exists) - return exists, err -} - -const getSysUser = `-- name: GetSysUser :one -SELECT id, uuid, email, username, hashed_password, salt, avatar, gender, department_id, role_id, status, change_password_at, created_at, updated_at FROM sys_user -WHERE id = $1 LIMIT 1 -` - -func (q *Queries) GetSysUser(ctx context.Context, id int32) (*SysUser, error) { - row := q.db.QueryRow(ctx, getSysUser, id) - var i SysUser - err := row.Scan( - &i.ID, - &i.Uuid, - &i.Email, - &i.Username, - &i.HashedPassword, - &i.Salt, - &i.Avatar, - &i.Gender, - &i.DepartmentID, - &i.RoleID, - &i.Status, - &i.ChangePasswordAt, - &i.CreatedAt, - &i.UpdatedAt, - ) - return &i, err -} - -const getSysUserByEmail = `-- name: GetSysUserByEmail :one -SELECT id, uuid, email, username, hashed_password, salt, avatar, gender, department_id, role_id, status, change_password_at, created_at, updated_at FROM sys_user -WHERE email = $1 LIMIT 1 -` - -func (q *Queries) GetSysUserByEmail(ctx context.Context, email string) (*SysUser, error) { - row := q.db.QueryRow(ctx, getSysUserByEmail, email) - var i SysUser - err := row.Scan( - &i.ID, - &i.Uuid, - &i.Email, - &i.Username, - &i.HashedPassword, - &i.Salt, - &i.Avatar, - &i.Gender, - &i.DepartmentID, - &i.RoleID, - &i.Status, - &i.ChangePasswordAt, - &i.CreatedAt, - &i.UpdatedAt, - ) - return &i, err -} - -const listSysUser = `-- name: ListSysUser :many -SELECT id, uuid, email, username, hashed_password, salt, avatar, gender, department_id, role_id, status, change_password_at, created_at, updated_at FROM sys_user -WHERE status = 0 -ORDER BY created_at DESC -` - -func (q *Queries) ListSysUser(ctx context.Context) ([]*SysUser, error) { - rows, err := q.db.Query(ctx, listSysUser) - if err != nil { - return nil, err - } - defer rows.Close() - items := []*SysUser{} - for rows.Next() { - var i SysUser - if err := rows.Scan( - &i.ID, - &i.Uuid, - &i.Email, - &i.Username, - &i.HashedPassword, - &i.Salt, - &i.Avatar, - &i.Gender, - &i.DepartmentID, - &i.RoleID, - &i.Status, - &i.ChangePasswordAt, - &i.CreatedAt, - &i.UpdatedAt, - ); err != nil { - return nil, err - } - items = append(items, &i) - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const listSysUserByIds = `-- name: ListSysUserByIds :many -SELECT id, uuid, email, username, hashed_password, salt, avatar, gender, department_id, role_id, status, change_password_at, created_at, updated_at FROM sys_user -WHERE id = ANY($1::int[]) -` - -func (q *Queries) ListSysUserByIds(ctx context.Context, dollar_1 []int32) ([]*SysUser, error) { - rows, err := q.db.Query(ctx, listSysUserByIds, dollar_1) - if err != nil { - return nil, err - } - defer rows.Close() - items := []*SysUser{} - for rows.Next() { - var i SysUser - if err := rows.Scan( - &i.ID, - &i.Uuid, - &i.Email, - &i.Username, - &i.HashedPassword, - &i.Salt, - &i.Avatar, - &i.Gender, - &i.DepartmentID, - &i.RoleID, - &i.Status, - &i.ChangePasswordAt, - &i.CreatedAt, - &i.UpdatedAt, - ); err != nil { - return nil, err - } - items = append(items, &i) - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const listSysUserCondition = `-- name: ListSysUserCondition :many -SELECT id, - uuid, - email, - username, - avatar, - gender, - department_id, - role_id, - status, - change_password_at, - created_at, - updated_at, - COALESCE((SELECT name FROM sys_department WHERE ID = sys_user.department_id), '') AS department_name, - COALESCE((SELECT display_name - FROM sys_role - WHERE id = sys_user.role_id), '') AS role_name -FROM sys_user -WHERE (NOT $1::Boolean OR sys_user.status = $2) - AND (NOT $3::Boolean OR sys_user.id = $4) - AND ($5::text = '' OR sys_user.username ILIKE '%' || $5 || '%') - AND ($6::text = '' OR sys_user.email ILIKE '%' || $6 || '%') -ORDER BY created_at DESC -OFFSET $7 -LIMIT $8 -` - -type ListSysUserConditionParams struct { - IsStatus bool `json:"is_status"` - Status int32 `json:"status"` - IsID bool `json:"is_id"` - ID int32 `json:"id"` - Username string `json:"username"` - Email string `json:"email"` - Skip int32 `json:"skip"` - Size int32 `json:"size"` -} - -type ListSysUserConditionRow struct { - ID int32 `json:"id"` - Uuid uuid.UUID `json:"uuid"` - Email string `json:"email"` - Username string `json:"username"` - Avatar string `json:"avatar"` - Gender int32 `json:"gender"` - DepartmentID int32 `json:"department_id"` - RoleID int32 `json:"role_id"` - Status int32 `json:"status"` - ChangePasswordAt time.Time `json:"change_password_at"` - CreatedAt time.Time `json:"created_at"` - UpdatedAt time.Time `json:"updated_at"` - DepartmentName interface{} `json:"department_name"` - RoleName interface{} `json:"role_name"` -} - -func (q *Queries) ListSysUserCondition(ctx context.Context, arg *ListSysUserConditionParams) ([]*ListSysUserConditionRow, error) { - rows, err := q.db.Query(ctx, listSysUserCondition, - arg.IsStatus, - arg.Status, - arg.IsID, - arg.ID, - arg.Username, - arg.Email, - arg.Skip, - arg.Size, - ) - if err != nil { - return nil, err - } - defer rows.Close() - items := []*ListSysUserConditionRow{} - for rows.Next() { - var i ListSysUserConditionRow - if err := rows.Scan( - &i.ID, - &i.Uuid, - &i.Email, - &i.Username, - &i.Avatar, - &i.Gender, - &i.DepartmentID, - &i.RoleID, - &i.Status, - &i.ChangePasswordAt, - &i.CreatedAt, - &i.UpdatedAt, - &i.DepartmentName, - &i.RoleName, - ); err != nil { - return nil, err - } - items = append(items, &i) - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const updateSysUser = `-- name: UpdateSysUser :one -UPDATE sys_user -SET username = $2, - hashed_password = $3, - avatar = $4, - gender = $5, - department_id = $6, - role_id = $7, - status = $8, - change_password_at = $9, - updated_at = $10 -WHERE id = $1 -RETURNING id, uuid, email, username, hashed_password, salt, avatar, gender, department_id, role_id, status, change_password_at, created_at, updated_at -` - -type UpdateSysUserParams struct { - ID int32 `json:"id"` - Username string `json:"username"` - HashedPassword []byte `json:"hashed_password"` - Avatar string `json:"avatar"` - Gender int32 `json:"gender"` - DepartmentID int32 `json:"department_id"` - RoleID int32 `json:"role_id"` - Status int32 `json:"status"` - ChangePasswordAt time.Time `json:"change_password_at"` - UpdatedAt time.Time `json:"updated_at"` -} - -func (q *Queries) UpdateSysUser(ctx context.Context, arg *UpdateSysUserParams) (*SysUser, error) { - row := q.db.QueryRow(ctx, updateSysUser, - arg.ID, - arg.Username, - arg.HashedPassword, - arg.Avatar, - arg.Gender, - arg.DepartmentID, - arg.RoleID, - arg.Status, - arg.ChangePasswordAt, - arg.UpdatedAt, - ) - var i SysUser - err := row.Scan( - &i.ID, - &i.Uuid, - &i.Email, - &i.Username, - &i.HashedPassword, - &i.Salt, - &i.Avatar, - &i.Gender, - &i.DepartmentID, - &i.RoleID, - &i.Status, - &i.ChangePasswordAt, - &i.CreatedAt, - &i.UpdatedAt, - ) - return &i, err -} diff --git a/internal/db/sqlc/sys_user_login_log.sql.go b/internal/db/sqlc/sys_user_login_log.sql.go deleted file mode 100644 index 9cd8cc6..0000000 --- a/internal/db/sqlc/sys_user_login_log.sql.go +++ /dev/null @@ -1,172 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. -// versions: -// sqlc v1.28.0 -// source: sys_user_login_log.sql - -package db - -import ( - "context" - "time" - - "github.com/google/uuid" -) - -const countSysUserLoginLogCondition = `-- name: CountSysUserLoginLogCondition :one -SELECT COUNT(*) FROM sys_user_login_log -WHERE created_at BETWEEN $1 AND $2 - AND ($3::text = '' OR email ILIKE '%' || $3 || '%') - AND ($4::text = '' OR username ILIKE '%' || $4 || '%') -` - -type CountSysUserLoginLogConditionParams struct { - StartAt time.Time `json:"start_at"` - EndAt time.Time `json:"end_at"` - Email string `json:"email"` - Username string `json:"username"` -} - -func (q *Queries) CountSysUserLoginLogCondition(ctx context.Context, arg *CountSysUserLoginLogConditionParams) (int64, error) { - row := q.db.QueryRow(ctx, countSysUserLoginLogCondition, - arg.StartAt, - arg.EndAt, - arg.Email, - arg.Username, - ) - var count int64 - err := row.Scan(&count) - return count, err -} - -const createSysUserLoginLog = `-- name: CreateSysUserLoginLog :exec -INSERT INTO sys_user_login_log (created_at, - email, - username, - user_uuid, - is_success, - message, - referer_url, - url, - os, - ip, - browser) -VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11) -` - -type CreateSysUserLoginLogParams struct { - CreatedAt time.Time `json:"created_at"` - Email string `json:"email"` - Username string `json:"username"` - UserUuid uuid.UUID `json:"user_uuid"` - IsSuccess bool `json:"is_success"` - Message string `json:"message"` - RefererUrl string `json:"referer_url"` - Url string `json:"url"` - Os string `json:"os"` - Ip string `json:"ip"` - Browser string `json:"browser"` -} - -func (q *Queries) CreateSysUserLoginLog(ctx context.Context, arg *CreateSysUserLoginLogParams) error { - _, err := q.db.Exec(ctx, createSysUserLoginLog, - arg.CreatedAt, - arg.Email, - arg.Username, - arg.UserUuid, - arg.IsSuccess, - arg.Message, - arg.RefererUrl, - arg.Url, - arg.Os, - arg.Ip, - arg.Browser, - ) - return err -} - -const listSysUserLoginLogCondition = `-- name: ListSysUserLoginLogCondition :many -SELECT - id, - created_at, - email, - COALESCE((SELECT username FROM sys_user WHERE email = sys_user_login_log.email LIMIT 1), '') AS username, - user_uuid, - is_success, - message, - referer_url, - url, - os, - ip, - browser -FROM sys_user_login_log -WHERE sys_user_login_log.created_at BETWEEN $1 AND $2 - AND ($3::text = '' OR email ILIKE '%' || $3 || '%') - AND ($4::text = '' OR username ILIKE '%' || $4 || '%') -ORDER BY created_at DESC -OFFSET $5 -LIMIT $6 -` - -type ListSysUserLoginLogConditionParams struct { - StartAt time.Time `json:"start_at"` - EndAt time.Time `json:"end_at"` - Email string `json:"email"` - Username string `json:"username"` - Skip int32 `json:"skip"` - Size int32 `json:"size"` -} - -type ListSysUserLoginLogConditionRow struct { - ID int64 `json:"id"` - CreatedAt time.Time `json:"created_at"` - Email string `json:"email"` - Username interface{} `json:"username"` - UserUuid uuid.UUID `json:"user_uuid"` - IsSuccess bool `json:"is_success"` - Message string `json:"message"` - RefererUrl string `json:"referer_url"` - Url string `json:"url"` - Os string `json:"os"` - Ip string `json:"ip"` - Browser string `json:"browser"` -} - -func (q *Queries) ListSysUserLoginLogCondition(ctx context.Context, arg *ListSysUserLoginLogConditionParams) ([]*ListSysUserLoginLogConditionRow, error) { - rows, err := q.db.Query(ctx, listSysUserLoginLogCondition, - arg.StartAt, - arg.EndAt, - arg.Email, - arg.Username, - arg.Skip, - arg.Size, - ) - if err != nil { - return nil, err - } - defer rows.Close() - items := []*ListSysUserLoginLogConditionRow{} - for rows.Next() { - var i ListSysUserLoginLogConditionRow - if err := rows.Scan( - &i.ID, - &i.CreatedAt, - &i.Email, - &i.Username, - &i.UserUuid, - &i.IsSuccess, - &i.Message, - &i.RefererUrl, - &i.Url, - &i.Os, - &i.Ip, - &i.Browser, - ); err != nil { - return nil, err - } - items = append(items, &i) - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} diff --git a/internal/db/sqlc/utl.go b/internal/db/sqlc/utl.go deleted file mode 100644 index 7e8b875..0000000 --- a/internal/db/sqlc/utl.go +++ /dev/null @@ -1,44 +0,0 @@ -package db - -import ( - "bytes" - "fmt" - "strings" - "sync" - "text/template" -) - -var queriesCache sync.Map - -func BuildQuery(text string, data map[string]any) (string, []any, error) { - var t *template.Template - v, ok := queriesCache.Load(text) - if !ok { - var err error - t, err = template.New("query").Parse(text) - if err != nil { - return "", nil, fmt.Errorf("could not parse sql query template: %w", err) - } - - queriesCache.Store(text, t) - } else { - t = v.(*template.Template) - } - - var wr bytes.Buffer - if err := t.Execute(&wr, data); err != nil { - return "", nil, fmt.Errorf("could not apply sql query data: %w", err) - } - - query := wr.String() - args := []any{} - for key, val := range data { - if !strings.Contains(query, "@"+key) { - continue - } - - args = append(args, val) - query = strings.ReplaceAll(query, "@"+key, fmt.Sprintf("$%d", len(args))) - } - return query, args, nil -} diff --git a/internal/erpserver/biz/biz.go b/internal/erpserver/biz/biz.go deleted file mode 100644 index ba4cd02..0000000 --- a/internal/erpserver/biz/biz.go +++ /dev/null @@ -1,88 +0,0 @@ -package biz - -import ( - db "management/internal/db/sqlc" - budgetv1 "management/internal/erpserver/biz/v1/budget" - commonv1 "management/internal/erpserver/biz/v1/common" - customerv1 "management/internal/erpserver/biz/v1/customer" - expensev1 "management/internal/erpserver/biz/v1/expense" - incomev1 "management/internal/erpserver/biz/v1/income" - projectv1 "management/internal/erpserver/biz/v1/project" - systemv1 "management/internal/erpserver/biz/v1/system" - "management/internal/erpserver/store" - "management/internal/pkg/redis" - "management/internal/pkg/session" - - "github.com/drhin/logger" -) - -// IBiz 定义了业务层需要实现的方法. -type IBiz interface { - // 获取公共业务接口. - CommonV1() commonv1.CommonBiz - // 获取系统业务接口. - SystemV1() systemv1.SystemBiz - // 项目管理 - ProjectV1() projectv1.ProjectBiz - // 预算管理 - BudgetV1() budgetv1.BudgetBiz - // 客户管理 - CustomerV1() customerv1.CustomerBiz - // 收入管理 - IncomeV1() incomev1.IncomeBiz - // 支出管理 - ExpenseV1() expensev1.ExpenseBiz -} - -// biz 是 IBiz 的一个具体实现. -type biz struct { - database store.IStore - store db.Store - redis redis.RedisCache - session session.Session - logger *logger.Logger -} - -// 确保 biz 实现了 IBiz 接口. -var _ IBiz = (*biz)(nil) - -// NewBiz 创建一个 IBiz 类型的实例. -func NewBiz(database store.IStore, store db.Store, redis redis.RedisCache, session session.Session, logger *logger.Logger) *biz { - return &biz{ - database: database, - store: store, - redis: redis, - session: session, - logger: logger, - } -} - -// CommonV1 返回一个实现了 CommonBiz 接口的实例. -func (b *biz) CommonV1() commonv1.CommonBiz { - return commonv1.New() -} - -// SystemV1 返回一个实现了 SystemBiz 接口的实例. -func (b *biz) SystemV1() systemv1.SystemBiz { - return systemv1.New(b.database, b.store, b.redis, b.session, b.logger) -} - -func (b *biz) ProjectV1() projectv1.ProjectBiz { - return projectv1.New(b.store, b.redis) -} - -func (b *biz) BudgetV1() budgetv1.BudgetBiz { - return budgetv1.New(b.store, b.redis) -} - -func (b *biz) CustomerV1() customerv1.CustomerBiz { - return customerv1.New(b.store, b.redis) -} - -func (b *biz) IncomeV1() incomev1.IncomeBiz { - return incomev1.New(b.store, b.redis) -} - -func (b *biz) ExpenseV1() expensev1.ExpenseBiz { - return expensev1.New(b.store, b.redis) -} diff --git a/internal/erpserver/biz/v1/budget/budget.go b/internal/erpserver/biz/v1/budget/budget.go deleted file mode 100644 index 5d91dbe..0000000 --- a/internal/erpserver/biz/v1/budget/budget.go +++ /dev/null @@ -1,45 +0,0 @@ -package budget - -import ( - "context" - - db "management/internal/db/sqlc" - "management/internal/pkg/redis" -) - -type BudgetBiz interface { - Create(ctx context.Context, arg *db.CreateBudgetParams) (*db.Budget, error) - Update(ctx context.Context, arg *db.UpdateBudgetParams) (*db.Budget, error) - List(ctx context.Context, arg *db.ListBudgetConditionParam) ([]*db.BudgetView, int64, error) - Get(ctx context.Context, id int64) (*db.Budget, error) -} - -type budgetBiz struct { - store db.Store - redis redis.RedisCache -} - -var _ BudgetBiz = (*budgetBiz)(nil) - -func New(store db.Store, redis redis.RedisCache) *budgetBiz { - return &budgetBiz{ - store: store, - redis: redis, - } -} - -func (b *budgetBiz) Create(ctx context.Context, arg *db.CreateBudgetParams) (*db.Budget, error) { - return b.store.CreateBudget(ctx, arg) -} - -func (b *budgetBiz) Update(ctx context.Context, arg *db.UpdateBudgetParams) (*db.Budget, error) { - return b.store.UpdateBudget(ctx, arg) -} - -func (b *budgetBiz) List(ctx context.Context, arg *db.ListBudgetConditionParam) ([]*db.BudgetView, int64, error) { - return b.store.ListBudgetCondition(ctx, arg) -} - -func (b *budgetBiz) Get(ctx context.Context, id int64) (*db.Budget, error) { - return b.store.GetBudget(ctx, id) -} diff --git a/internal/erpserver/biz/v1/common/captcha.go b/internal/erpserver/biz/v1/common/captcha.go deleted file mode 100644 index 89079c1..0000000 --- a/internal/erpserver/biz/v1/common/captcha.go +++ /dev/null @@ -1,36 +0,0 @@ -package common - -import ( - "github.com/mojocn/base64Captcha" -) - -// CaptchaBiz 定义处理验证码请求所需的方法. -type CaptchaBiz interface { - Generate(height int, width int, length int, maxSkew float64, dotCount int) (id, b64s, answer string, err error) - Verify(id, answer string, clear bool) bool -} - -// captchaBiz 是 CaptchaBiz 接口的实现. -type captchaBiz struct{} - -// 确保 captchaBiz 实现了 CaptchaBiz 接口. -var _ CaptchaBiz = (*captchaBiz)(nil) - -func NewCaptcha() *captchaBiz { - return &captchaBiz{} -} - -var captchaStore base64Captcha.Store = base64Captcha.DefaultMemStore - -func (b *captchaBiz) Generate(height int, width int, length int, maxSkew float64, dotCount int) (id, b64s, answer string, err error) { - driver := base64Captcha.NewDriverDigit(height, width, length, maxSkew, dotCount) - // driver := base64Captcha.NewDriverString(config.File.Captcha.ImgHeight, - // config.File.Captcha.ImgWidth, - // 6, 1, keyLong, source, nil, nil, nil) - cp := base64Captcha.NewCaptcha(driver, captchaStore) - return cp.Generate() -} - -func (b *captchaBiz) Verify(id, answer string, clear bool) bool { - return captchaStore.Verify(id, answer, clear) -} diff --git a/internal/erpserver/biz/v1/common/common.go b/internal/erpserver/biz/v1/common/common.go deleted file mode 100644 index 379283c..0000000 --- a/internal/erpserver/biz/v1/common/common.go +++ /dev/null @@ -1,17 +0,0 @@ -package common - -type CommonBiz interface { - CaptchaBiz() CaptchaBiz -} - -type commonBiz struct{} - -var _ CommonBiz = (*commonBiz)(nil) - -func New() *commonBiz { - return &commonBiz{} -} - -func (b *commonBiz) CaptchaBiz() CaptchaBiz { - return NewCaptcha() -} diff --git a/internal/erpserver/biz/v1/customer/customer.go b/internal/erpserver/biz/v1/customer/customer.go deleted file mode 100644 index aead9eb..0000000 --- a/internal/erpserver/biz/v1/customer/customer.go +++ /dev/null @@ -1,45 +0,0 @@ -package customer - -import ( - "context" - - db "management/internal/db/sqlc" - "management/internal/pkg/redis" -) - -type CustomerBiz interface { - Create(ctx context.Context, arg *db.CreateCustomerParams) (*db.Customer, error) - Update(ctx context.Context, arg *db.UpdateCustomerParams) (*db.Customer, error) - List(ctx context.Context, arg *db.ListCustomerConditionParam) ([]*db.CustomerView, int64, error) - Get(ctx context.Context, id int64) (*db.Customer, error) -} - -type customerBiz struct { - store db.Store - redis redis.RedisCache -} - -var _ CustomerBiz = (*customerBiz)(nil) - -func New(store db.Store, redis redis.RedisCache) *customerBiz { - return &customerBiz{ - store: store, - redis: redis, - } -} - -func (b *customerBiz) Create(ctx context.Context, arg *db.CreateCustomerParams) (*db.Customer, error) { - return b.store.CreateCustomer(ctx, arg) -} - -func (b *customerBiz) Update(ctx context.Context, arg *db.UpdateCustomerParams) (*db.Customer, error) { - return b.store.UpdateCustomer(ctx, arg) -} - -func (b *customerBiz) List(ctx context.Context, arg *db.ListCustomerConditionParam) ([]*db.CustomerView, int64, error) { - return b.store.ListCustomerCondition(ctx, arg) -} - -func (b *customerBiz) Get(ctx context.Context, id int64) (*db.Customer, error) { - return b.store.GetCustomer(ctx, id) -} diff --git a/internal/erpserver/biz/v1/expense/expsense.go b/internal/erpserver/biz/v1/expense/expsense.go deleted file mode 100644 index 25a48b6..0000000 --- a/internal/erpserver/biz/v1/expense/expsense.go +++ /dev/null @@ -1,67 +0,0 @@ -package expense - -import ( - "context" - - db "management/internal/db/sqlc" - "management/internal/pkg/redis" - - "github.com/jackc/pgx/v5/pgtype" -) - -type ExpenseBiz interface { - Create(ctx context.Context, arg *db.CreateExpenseParams) (*db.Expense, error) - Update(ctx context.Context, arg *db.UpdateExpenseParams) (*db.Expense, error) - List(ctx context.Context, arg *db.ListExpenseConditionParam) ([]*db.ExpenseView, int64, error) - Get(ctx context.Context, id int64) (*db.Expense, error) - Sum(ctx context.Context) (pgtype.Numeric, error) - SumByProjectID(ctx context.Context, id int64) (pgtype.Numeric, error) - Statistics(ctx context.Context) ([]*db.StatisticsExpenseRow, error) - StatisticsByProjectID(ctx context.Context, projectID int64) ([]*db.StatisticsExpenseByProjectIDRow, error) -} - -type expenseBiz struct { - store db.Store - redis redis.RedisCache -} - -var _ ExpenseBiz = (*expenseBiz)(nil) - -func New(store db.Store, redis redis.RedisCache) *expenseBiz { - return &expenseBiz{ - store: store, - redis: redis, - } -} - -func (b *expenseBiz) Create(ctx context.Context, arg *db.CreateExpenseParams) (*db.Expense, error) { - return b.store.CreateExpense(ctx, arg) -} - -func (b *expenseBiz) Update(ctx context.Context, arg *db.UpdateExpenseParams) (*db.Expense, error) { - return b.store.UpdateExpense(ctx, arg) -} - -func (b *expenseBiz) List(ctx context.Context, arg *db.ListExpenseConditionParam) ([]*db.ExpenseView, int64, error) { - return b.store.ListExpenseCondition(ctx, arg) -} - -func (b *expenseBiz) Get(ctx context.Context, id int64) (*db.Expense, error) { - return b.store.GetExpense(ctx, id) -} - -func (b *expenseBiz) Sum(ctx context.Context) (pgtype.Numeric, error) { - return b.store.SumExpense(ctx) -} - -func (b *expenseBiz) SumByProjectID(ctx context.Context, id int64) (pgtype.Numeric, error) { - return b.store.SumExpenseByProjectID(ctx, id) -} - -func (b *expenseBiz) Statistics(ctx context.Context) ([]*db.StatisticsExpenseRow, error) { - return b.store.StatisticsExpense(ctx) -} - -func (b *expenseBiz) StatisticsByProjectID(ctx context.Context, projectID int64) ([]*db.StatisticsExpenseByProjectIDRow, error) { - return b.store.StatisticsExpenseByProjectID(ctx, projectID) -} diff --git a/internal/erpserver/biz/v1/income/income.go b/internal/erpserver/biz/v1/income/income.go deleted file mode 100644 index 4288609..0000000 --- a/internal/erpserver/biz/v1/income/income.go +++ /dev/null @@ -1,67 +0,0 @@ -package income - -import ( - "context" - - db "management/internal/db/sqlc" - "management/internal/pkg/redis" - - "github.com/jackc/pgx/v5/pgtype" -) - -type IncomeBiz interface { - Create(ctx context.Context, arg *db.CreateIncomeParams) (*db.Income, error) - Update(ctx context.Context, arg *db.UpdateIncomeParams) (*db.Income, error) - List(ctx context.Context, arg *db.ListIncomeConditionParam) ([]*db.IncomeView, int64, error) - Get(ctx context.Context, id int64) (*db.Income, error) - Sum(ctx context.Context) (pgtype.Numeric, error) - SumByProjectID(ctx context.Context, id int64) (pgtype.Numeric, error) - Statistics(ctx context.Context) ([]*db.StatisticsIncomeRow, error) - StatisticsByProjectID(ctx context.Context, projectID int64) ([]*db.StatisticsIncomeByProjectIDRow, error) -} - -type incomeBiz struct { - store db.Store - redis redis.RedisCache -} - -var _ IncomeBiz = (*incomeBiz)(nil) - -func New(store db.Store, redis redis.RedisCache) *incomeBiz { - return &incomeBiz{ - store: store, - redis: redis, - } -} - -func (b *incomeBiz) Create(ctx context.Context, arg *db.CreateIncomeParams) (*db.Income, error) { - return b.store.CreateIncome(ctx, arg) -} - -func (b *incomeBiz) Update(ctx context.Context, arg *db.UpdateIncomeParams) (*db.Income, error) { - return b.store.UpdateIncome(ctx, arg) -} - -func (b *incomeBiz) List(ctx context.Context, arg *db.ListIncomeConditionParam) ([]*db.IncomeView, int64, error) { - return b.store.ListIncomeCondition(ctx, arg) -} - -func (b *incomeBiz) Get(ctx context.Context, id int64) (*db.Income, error) { - return b.store.GetIncome(ctx, id) -} - -func (b *incomeBiz) Sum(ctx context.Context) (pgtype.Numeric, error) { - return b.store.SumIncome(ctx) -} - -func (b *incomeBiz) SumByProjectID(ctx context.Context, id int64) (pgtype.Numeric, error) { - return b.store.SumIncomeByProjectID(ctx, id) -} - -func (b *incomeBiz) Statistics(ctx context.Context) ([]*db.StatisticsIncomeRow, error) { - return b.store.StatisticsIncome(ctx) -} - -func (b *incomeBiz) StatisticsByProjectID(ctx context.Context, projectID int64) ([]*db.StatisticsIncomeByProjectIDRow, error) { - return b.store.StatisticsIncomeByProjectID(ctx, projectID) -} diff --git a/internal/erpserver/biz/v1/project/project.go b/internal/erpserver/biz/v1/project/project.go deleted file mode 100644 index a18f989..0000000 --- a/internal/erpserver/biz/v1/project/project.go +++ /dev/null @@ -1,148 +0,0 @@ -package project - -import ( - "context" - "strconv" - - db "management/internal/db/sqlc" - "management/internal/erpserver/model/view" - "management/internal/pkg/redis" - "management/internal/pkg/tpl/html" -) - -type ProjectBiz interface { - Create(ctx context.Context, p *db.CreateProjectParams, pf []*db.CreateProjectFileParams) error - Update(ctx context.Context, p *db.UpdateProjectParams, pf []*db.CreateProjectFileParams) error - List(ctx context.Context, q *db.ListProjectConditionParam) ([]*db.ProjectView, int64, error) - Get(ctx context.Context, id int64) (*db.Project, error) - - XmSelect(ctx context.Context) ([]*view.XmSelect, error) - ListHtml(ctx context.Context) ([]*html.SelectDict, error) - - ProjectExpansion -} - -type ProjectExpansion interface { - ListProjectFiles(ctx context.Context, projectID int64) ([]*db.ProjectFile, error) - - Statistics(ctx context.Context) ([]*db.StatisticsProjectsRow, error) - StatisticsItem(ctx context.Context, id int64) (*db.StatisticsProjectItemRow, error) -} - -type projectBiz struct { - store db.Store - redis redis.RedisCache -} - -var _ ProjectBiz = (*projectBiz)(nil) - -func New(store db.Store, redis redis.RedisCache) *projectBiz { - return &projectBiz{ - store: store, - redis: redis, - } -} - -func (b *projectBiz) Create(ctx context.Context, p *db.CreateProjectParams, pf []*db.CreateProjectFileParams) error { - return b.store.ExecTx(ctx, func(q *db.Queries) error { - _, err := q.CreateProject(ctx, p) - if err != nil { - return err - } - - for _, item := range pf { - _, err = q.CreateProjectFile(ctx, item) - if err != nil { - return err - } - } - - return nil - }) -} - -func (b *projectBiz) Update(ctx context.Context, p *db.UpdateProjectParams, pf []*db.CreateProjectFileParams) error { - return b.store.ExecTx(ctx, func(q *db.Queries) error { - _, err := q.UpdateProject(ctx, p) - if err != nil { - return err - } - - err = q.DeleteProjectFile(ctx, p.ID) - if err != nil { - return err - } - - for _, item := range pf { - _, err = q.CreateProjectFile(ctx, item) - if err != nil { - return err - } - } - - return nil - }) -} - -func (b *projectBiz) List(ctx context.Context, q *db.ListProjectConditionParam) ([]*db.ProjectView, int64, error) { - res, total, err := b.store.ListProjectCondition(ctx, q) - if err != nil { - return nil, 0, err - } - - return res, total, nil -} - -func (b *projectBiz) Get(ctx context.Context, id int64) (*db.Project, error) { - return b.store.GetProject(ctx, id) -} - -func (b *projectBiz) ListProjectFiles(ctx context.Context, projectID int64) ([]*db.ProjectFile, error) { - return b.store.ListProjectFiles(ctx, projectID) -} - -func (b *projectBiz) XmSelect(ctx context.Context) ([]*view.XmSelect, error) { - all, err := b.store.AllProjects(ctx) - if err != nil || len(all) == 0 { - return nil, err - } - - var res []*view.XmSelect - for _, item := range all { - res = append(res, &view.XmSelect{ - Name: item.Name, - Value: strconv.FormatInt(item.ID, 10), - }) - } - return res, nil -} - -func (b *projectBiz) ListHtml(ctx context.Context) ([]*html.SelectDict, error) { - all, err := b.store.AllProjects(ctx) - if err != nil || len(all) == 0 { - return nil, err - } - - var res []*html.SelectDict - res = append(res, &html.SelectDict{ - Name: "请选择", - Value: "0", - }) - for _, v := range all { - item := html.SelectDict{ - Name: v.Name, - Value: strconv.Itoa(int(v.ID)), - } - res = append(res, &item) - } - - return res, nil -} - -func (b *projectBiz) Statistics(ctx context.Context) ([]*db.StatisticsProjectsRow, error) { - return b.store.StatisticsProjects(ctx) -} - -func (b *projectBiz) StatisticsItem(ctx context.Context, id int64) (*db.StatisticsProjectItemRow, error) { - return b.store.StatisticsProjectItem(ctx, id) -} diff --git a/internal/erpserver/biz/v1/system/audit.go b/internal/erpserver/biz/v1/system/audit.go deleted file mode 100644 index b2f3c69..0000000 --- a/internal/erpserver/biz/v1/system/audit.go +++ /dev/null @@ -1,69 +0,0 @@ -package system - -import ( - "context" - "time" - - "management/internal/db/model/dto" - db "management/internal/db/sqlc" -) - -type AuditBiz interface { - Create(ctx context.Context, arg *db.CreateSysAuditLogParams) error - List(ctx context.Context, q dto.SearchDto) ([]*db.SysAuditLog, int64, error) -} - -type auditBiz struct { - store db.Store -} - -var _ AuditBiz = (*auditBiz)(nil) - -func NewAudit(store db.Store) *auditBiz { - return &auditBiz{ - store: store, - } -} - -func (b *auditBiz) Create(ctx context.Context, arg *db.CreateSysAuditLogParams) error { - return b.store.CreateSysAuditLog(ctx, arg) -} - -func (b *auditBiz) List(ctx context.Context, q dto.SearchDto) ([]*db.SysAuditLog, int64, error) { - start, err := time.ParseInLocation(time.DateTime, q.SearchTimeBegin, time.Local) - if err != nil { - return nil, 0, err - } - end, err := time.ParseInLocation(time.DateTime, q.SearchTimeEnd, time.Local) - if err != nil { - return nil, 0, err - } - - countArg := &db.CountSysAuditLogConditionParams{ - StartAt: start, - EndAt: end, - Email: q.SearchEmail, - Username: q.SearchName, - } - - dataArg := &db.ListSysAuditLogConditionParams{ - StartAt: start, - EndAt: end, - Email: q.SearchEmail, - Username: q.SearchName, - Skip: (int32(q.Page) - 1) * int32(q.Rows), - Size: int32(q.Rows), - } - - count, err := b.store.CountSysAuditLogCondition(ctx, countArg) - if err != nil { - return nil, 0, err - } - - audits, err := b.store.ListSysAuditLogCondition(ctx, dataArg) - if err != nil { - return nil, 0, err - } - - return audits, count, nil -} diff --git a/internal/erpserver/biz/v1/system/category.go b/internal/erpserver/biz/v1/system/category.go deleted file mode 100644 index fbd0a8a..0000000 --- a/internal/erpserver/biz/v1/system/category.go +++ /dev/null @@ -1,356 +0,0 @@ -package system - -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, 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) - Refresh(ctx context.Context) ([]*db.Category, error) - RebuildParentPath(ctx context.Context) error - - Tree(ctx context.Context, id int32) ([]*view.LayuiTree, error) - XmSelect(ctx context.Context, letter string) ([]*view.XmSelect, error) - XmSelectTree(ctx context.Context, id int32) ([]*view.XmSelectTree, error) - - ListHtmlByLetter(ctx context.Context, letter string) ([]*html.SelectDict, error) -} - -type categoryBiz struct { - store db.Store - redis redis.RedisCache -} - -var _ CategoryBiz = (*categoryBiz)(nil) - -func NewCategory(store db.Store, redis redis.RedisCache) *categoryBiz { - return &categoryBiz{ - store: store, - redis: redis, - } -} - -func (b *categoryBiz) All(ctx context.Context) ([]*db.Category, error) { - key := know.GetManageKey(ctx, know.AllCategories) - bs, err := redis.GetBytes(ctx, key) - if err == nil { - var res []*db.Category - if err := json.Unmarshal(bs, &res); err == nil { - return res, nil - } - } - - return b.Refresh(ctx) -} - -func (b *categoryBiz) List(ctx context.Context, q dto.SearchDto) ([]*db.Category, int64, error) { - countArg := &db.CountCategoriesConditionParams{ - IsStatus: q.SearchStatus != 9999, - Status: int16(q.SearchStatus), - IsID: q.SearchID != 0, - ID: int32(q.SearchID), - IsParentID: q.SearchParentID != 0, - ParentID: int32(q.SearchParentID), - Name: q.SearchName, - } - - dataArg := &db.ListCategoriesConditionParams{ - IsStatus: q.SearchStatus != 9999, - Status: int16(q.SearchStatus), - IsID: q.SearchID != 0, - ID: int32(q.SearchID), - IsParentID: q.SearchParentID != 0, - ParentID: int32(q.SearchParentID), - Name: q.SearchName, - Skip: (int32(q.Page) - 1) * int32(q.Rows), - Size: int32(q.Rows), - } - count, err := b.store.CountCategoriesCondition(ctx, countArg) - if err != nil { - return nil, 0, err - } - - departs, err := b.store.ListCategoriesCondition(ctx, dataArg) - if err != nil { - return nil, 0, err - } - - return departs, count, nil -} - -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, 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, 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) { - all, err := b.store.AllCategories(ctx) - if err != nil { - return nil, err - } - - bs, err := json.Marshal(all) - if err != nil { - return nil, err - } - - redis.Del(ctx, know.GetManageKey(ctx, know.AllCategorySimple)) - key := know.GetManageKey(ctx, know.AllCategories) - err = redis.Set(ctx, key, bs, time.Hour*6) - return all, err -} - -func (b *categoryBiz) RebuildParentPath(ctx context.Context) error { - return b.store.CategoryRebuildPath(ctx) -} - -func (b *categoryBiz) Tree(ctx context.Context, id int32) ([]*view.LayuiTree, error) { - all, err := b.All(ctx) - if err != nil { - return nil, err - } - - return b.toTree(id, all), nil -} - -func (b *categoryBiz) XmSelect(ctx context.Context, letter string) ([]*view.XmSelect, error) { - all, err := b.All(ctx) - if err != nil || len(all) == 0 { - return nil, err - } - - var current *db.Category - for _, v := range all { - if v.Letter == letter { - current = v - break - } - } - if current == nil { - return nil, errors.New("未找到当前类别") - } - - var res []*view.XmSelect - for _, v := range all { - if v.ParentID == current.ID { - item := view.XmSelect{ - Name: v.Name, - Value: strconv.FormatInt(int64(v.ID), 10), - } - res = append(res, &item) - } - } - return res, nil -} - -func (b *categoryBiz) XmSelectTree(ctx context.Context, id int32) ([]*view.XmSelectTree, error) { - all, err := b.All(ctx) - if err != nil { - return nil, err - } - - return b.toXmSelectTree(id, all), nil -} - -func (b *categoryBiz) ListHtmlByLetter(ctx context.Context, letter string) ([]*html.SelectDict, error) { - all, err := b.All(ctx) - if err != nil || len(all) == 0 { - return nil, err - } - - var current *db.Category - for _, v := range all { - if v.Letter == letter { - current = v - break - } - } - if current == nil { - return nil, errors.New("未找到当前类别") - } - - var res []*html.SelectDict - res = append(res, &html.SelectDict{ - Name: "请选择", - Value: "0", - }) - for _, v := range all { - if v.ParentID == current.ID { - item := html.SelectDict{ - Name: v.Name, - Value: strconv.Itoa(int(v.ID)), - } - res = append(res, &item) - } - } - - return res, nil -} - -func (b *categoryBiz) toTree(parentId int32, data []*db.Category) []*view.LayuiTree { - var res []*view.LayuiTree - for _, v := range data { - if v.ParentID == parentId { - item := view.LayuiTree{} - item.ID = strconv.FormatInt(int64(v.ID), 10) - item.Title = v.Name - item.Children = b.toTree(v.ID, data) - if v.ParentID == 0 { - item.Spread = true - } - res = append(res, &item) - } - } - - return res -} - -func (b *categoryBiz) toXmSelectTree(parentId int32, data []*db.Category) []*view.XmSelectTree { - var res []*view.XmSelectTree - for _, v := range data { - if v.ParentID == parentId { - item := view.XmSelectTree{ - Name: v.Name, - Value: strconv.FormatInt(int64(v.ID), 10), - Children: b.toXmSelectTree(v.ID, data), - } - res = append(res, &item) - } - } - - return res -} diff --git a/internal/erpserver/biz/v1/system/config.go b/internal/erpserver/biz/v1/system/config.go deleted file mode 100644 index e15b224..0000000 --- a/internal/erpserver/biz/v1/system/config.go +++ /dev/null @@ -1,95 +0,0 @@ -package system - -import ( - "context" - "encoding/json" - "time" - - "management/internal/db/model/dto" - db "management/internal/db/sqlc" - "management/internal/pkg/know" - "management/internal/pkg/know/pearadmin" - "management/internal/pkg/redis" -) - -type ConfigBiz interface { - Create(ctx context.Context, arg *db.CreateSysConfigParams) error - Update(ctx context.Context, arg *db.UpdateSysConfigByKeyParams) error - Get(ctx context.Context, id int32) (*db.SysConfig, error) - List(ctx context.Context, q dto.SearchDto) ([]*db.SysConfig, int64, error) - - ConfigExpansion -} - -type ConfigExpansion interface { - Pear(ctx context.Context) (*dto.PearConfig, error) -} - -type configBiz struct { - store db.Store - redis redis.RedisCache -} - -var _ ConfigBiz = (*configBiz)(nil) - -func NewConfig(store db.Store, redis redis.RedisCache) *configBiz { - return &configBiz{ - store: store, - redis: redis, - } -} - -func (b *configBiz) Create(ctx context.Context, arg *db.CreateSysConfigParams) error { - return b.store.CreateSysConfig(ctx, arg) -} - -func (b *configBiz) Update(ctx context.Context, arg *db.UpdateSysConfigByKeyParams) error { - return b.store.UpdateSysConfigByKey(ctx, arg) -} - -func (b *configBiz) Get(ctx context.Context, id int32) (*db.SysConfig, error) { - return b.store.GetSysConfig(ctx, id) -} - -func (b *configBiz) List(ctx context.Context, q dto.SearchDto) ([]*db.SysConfig, int64, error) { - count, err := b.store.CountSysConfigCondition(ctx, q.SearchKey) - if err != nil { - return nil, 0, err - } - - configs, err := b.store.ListSysConfigCondition(ctx, &db.ListSysConfigConditionParams{ - Key: q.SearchName, - Skip: (int32(q.Page) - 1) * int32(q.Rows), - Size: int32(q.Rows), - }) - if err != nil { - return nil, 0, err - } - - return configs, count, nil -} - -func (b *configBiz) Pear(ctx context.Context) (*dto.PearConfig, error) { - // 判断redis是否存储 - key := know.GetManageKey(ctx, know.PearAdmin) - bs, err := b.redis.GetBytes(ctx, key) - if err == nil { - var res *dto.PearConfig - if err := json.Unmarshal(bs, &res); err == nil { - return res, nil - } - } - - conf, err := b.store.GetSysConfigByKey(ctx, pearadmin.PearKey) - if err != nil { - return nil, err - } - - var pear dto.PearConfig - if err := json.Unmarshal(conf.Value, &pear); err != nil { - return nil, err - } - - _ = b.redis.Set(ctx, key, conf.Value, time.Hour*6) - return &pear, nil -} diff --git a/internal/erpserver/biz/v1/system/department.go b/internal/erpserver/biz/v1/system/department.go deleted file mode 100644 index 510dc5e..0000000 --- a/internal/erpserver/biz/v1/system/department.go +++ /dev/null @@ -1,251 +0,0 @@ -package system - -import ( - "context" - "encoding/json" - "errors" - "fmt" - "strconv" - "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" -) - -type DepartmentBiz interface { - Create(ctx context.Context, req *form.Department) error - Update(ctx context.Context, req *form.Department) error - All(ctx context.Context) ([]*db.SysDepartment, error) - List(ctx context.Context, q dto.SearchDto) ([]*db.SysDepartment, int64, error) - Get(ctx context.Context, id int32) (*db.SysDepartment, error) - Refresh(ctx context.Context) ([]*db.SysDepartment, error) - RebuildParentPath(ctx context.Context) error - - Tree(ctx context.Context, id int32) ([]*view.LayuiTree, error) - XmSelectTree(ctx context.Context, id int32) ([]*view.XmSelectTree, error) - - DepartmentExpansion -} - -type DepartmentExpansion interface{} - -type departmentBiz struct { - store db.Store - redis redis.RedisCache -} - -var _ DepartmentBiz = (*departmentBiz)(nil) - -func NewDepartment(store db.Store, redis redis.RedisCache) *departmentBiz { - return &departmentBiz{ - store: store, - redis: redis, - } -} - -func (b *departmentBiz) All(ctx context.Context) ([]*db.SysDepartment, error) { - key := know.GetManageKey(ctx, know.AllDepartments) - bs, err := redis.GetBytes(ctx, key) - if err == nil { - var res []*db.SysDepartment - if err := json.Unmarshal(bs, &res); err == nil { - return res, nil - } - } - - return b.Refresh(ctx) -} - -func (b *departmentBiz) List(ctx context.Context, q dto.SearchDto) ([]*db.SysDepartment, int64, error) { - countArg := &db.CountSysDepartmentConditionParams{ - IsStatus: q.SearchStatus != 9999, - Status: int32(q.SearchStatus), - IsID: q.SearchID != 0, - ID: int32(q.SearchID), - IsParentID: q.SearchParentID != 0, - ParentID: int32(q.SearchParentID), - Name: q.SearchName, - } - - dataArg := &db.ListSysDepartmentConditionParams{ - IsStatus: q.SearchStatus != 9999, - Status: int32(q.SearchStatus), - IsID: q.SearchID != 0, - ID: int32(q.SearchID), - IsParentID: q.SearchParentID != 0, - ParentID: int32(q.SearchParentID), - Name: q.SearchName, - Skip: (int32(q.Page) - 1) * int32(q.Rows), - Size: int32(q.Rows), - } - count, err := b.store.CountSysDepartmentCondition(ctx, countArg) - if err != nil { - return nil, 0, err - } - - departs, err := b.store.ListSysDepartmentCondition(ctx, dataArg) - if err != nil { - return nil, 0, err - } - - return departs, count, nil -} - -func (b *departmentBiz) Get(ctx context.Context, id int32) (*db.SysDepartment, error) { - return b.store.GetSysDepartment(ctx, id) -} - -func (b *departmentBiz) Create(ctx context.Context, req *form.Department) error { - parent := &db.SysDepartment{ - ID: 0, - ParentID: 0, - ParentPath: ",0,", - } - if *req.ParentID > 0 { - var err error - parent, err = b.store.GetSysDepartment(ctx, *req.ParentID) - if err != nil { - return errors.New("父级节点错误") - } - } - - var order int32 = 6666 - if *req.Sort > 0 { - order = *req.Sort - } - - arg := &db.CreateSysDepartmentParams{ - Name: req.Name, - ParentID: parent.ID, - ParentPath: convertor.HandleParentPath(fmt.Sprintf("%s,%d,", parent.ParentPath, parent.ID)), - Status: *req.Status, - Sort: order, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - } - _, err := b.store.CreateSysDepartment(ctx, arg) - if err != nil { - if db.IsUniqueViolation(err) { - return errors.New("部门已存在") - } - return err - } - return nil -} - -func (b *departmentBiz) Update(ctx context.Context, req *form.Department) error { - parent := &db.SysDepartment{ - ID: 0, - ParentID: 0, - ParentPath: ",0,", - } - if *req.ParentID > 0 { - var err error - parent, err = b.store.GetSysDepartment(ctx, *req.ParentID) - if err != nil { - return errors.New("父级节点错误") - } - } - - depart, err := b.store.GetSysDepartment(ctx, *req.ID) - if err != nil { - return err - } - - var order int32 = 6666 - if *req.Sort > 0 { - order = *req.Sort - } - - arg := &db.UpdateSysDepartmentParams{ - ID: depart.ID, - Name: req.Name, - ParentID: parent.ID, - ParentPath: convertor.HandleParentPath(fmt.Sprintf("%s,%d,", parent.ParentPath, parent.ID)), - Status: *req.Status, - Sort: order, - UpdatedAt: time.Now(), - } - _, err = b.store.UpdateSysDepartment(ctx, arg) - return err -} - -func (b *departmentBiz) Refresh(ctx context.Context) ([]*db.SysDepartment, error) { - all, err := b.store.AllSysDepartment(ctx) - if err != nil { - return nil, err - } - - bs, err := json.Marshal(all) - if err != nil { - return nil, err - } - - key := know.GetManageKey(ctx, know.AllDepartments) - err = redis.Set(ctx, key, bs, time.Hour*6) - if err != nil { - return nil, err - } - return all, nil -} - -func (b *departmentBiz) RebuildParentPath(ctx context.Context) error { - return b.store.SysDepartmentRebuildPath(ctx) -} - -func (b *departmentBiz) Tree(ctx context.Context, id int32) ([]*view.LayuiTree, error) { - all, err := b.All(ctx) - if err != nil { - return nil, err - } - - return b.toTree(id, all), nil -} - -func (b *departmentBiz) XmSelectTree(ctx context.Context, id int32) ([]*view.XmSelectTree, error) { - all, err := b.All(ctx) - if err != nil { - return nil, err - } - - return b.toXmSelectTree(id, all), nil -} - -func (b *departmentBiz) toTree(parentId int32, data []*db.SysDepartment) []*view.LayuiTree { - var res []*view.LayuiTree - for _, v := range data { - if v.ParentID == parentId { - item := view.LayuiTree{} - item.ID = strconv.FormatInt(int64(v.ID), 10) - item.Title = v.Name - item.Children = b.toTree(v.ID, data) - if v.ParentID == 0 { - item.Spread = true - } - res = append(res, &item) - } - } - - return res -} - -func (b *departmentBiz) toXmSelectTree(parentId int32, data []*db.SysDepartment) []*view.XmSelectTree { - var res []*view.XmSelectTree - for _, v := range data { - if v.ParentID == parentId { - item := view.XmSelectTree{ - Name: v.Name, - Value: strconv.FormatInt(int64(v.ID), 10), - Children: b.toXmSelectTree(v.ID, data), - } - res = append(res, &item) - } - } - - return res -} diff --git a/internal/erpserver/biz/v1/system/login_log.go b/internal/erpserver/biz/v1/system/login_log.go deleted file mode 100644 index c1c040b..0000000 --- a/internal/erpserver/biz/v1/system/login_log.go +++ /dev/null @@ -1,42 +0,0 @@ -package system - -import ( - "context" - - "management/internal/db/model/dto" - db "management/internal/db/sqlc" - systemmodel "management/internal/erpserver/model/system" - "management/internal/erpserver/store" -) - -type LoginLogBiz interface { - Create(ctx context.Context, obj *systemmodel.LoginLog) error - List(ctx context.Context, q dto.SearchDto) ([]*systemmodel.LoginLog, int64, error) -} - -type loginLogBiz struct { - database store.IStore - store db.Store -} - -var _ LoginLogBiz = (*loginLogBiz)(nil) - -func NewLoginLog(database store.IStore, store db.Store) *loginLogBiz { - return &loginLogBiz{ - database: database, - store: store, - } -} - -func (b *loginLogBiz) Create(ctx context.Context, obj *systemmodel.LoginLog) error { - return b.database.LoginLog().Create(ctx, obj) -} - -func (b *loginLogBiz) List(ctx context.Context, q dto.SearchDto) ([]*systemmodel.LoginLog, int64, error) { - res, count, err := b.database.LoginLog().List(ctx, q) - if err != nil { - return nil, 0, err - } - - return res, count, nil -} diff --git a/internal/erpserver/biz/v1/system/menu.go b/internal/erpserver/biz/v1/system/menu.go deleted file mode 100644 index 28bd945..0000000 --- a/internal/erpserver/biz/v1/system/menu.go +++ /dev/null @@ -1,545 +0,0 @@ -package system - -import ( - "context" - "encoding/json" - "slices" - "strconv" - "strings" - "time" - - "management/internal/db/model/dto" - db "management/internal/db/sqlc" - "management/internal/erpserver/model/view" - "management/internal/pkg/know" - "management/internal/pkg/redis" -) - -type MenuBiz interface { - MenuExpansion -} - -type MenuExpansion interface { - Create(ctx context.Context, arg *db.CreateSysMenuParams) (*db.SysMenu, error) - Update(ctx context.Context, arg *db.UpdateSysMenuParams) (*db.SysMenu, error) - Get(ctx context.Context, id int32) (*db.SysMenu, error) - GetSysMenuByUrl(ctx context.Context, url string) (*db.SysMenu, error) - AllMenusCache(ctx context.Context) ([]*db.SysMenu, error) - ListMenuTree(ctx context.Context) ([]*db.SysMenuDto, error) - ListOwnerMenuByRoleID(ctx context.Context, roleID int32) ([]*dto.OwnerMenuDto, error) - SetOwnerListMenuByRoleID(ctx context.Context, roleID int32) ([]*dto.OwnerMenuDto, error) - RecursiveSysMenus(ctx context.Context, roleID int32) ([]*dto.MenuUIDto, error) - SetRecursiveSysMenus(ctx context.Context, roleID int32) ([]*dto.MenuUIDto, error) - MapOwnerMenuByRoleID(ctx context.Context, roleID int32) (map[string]*dto.OwnerMenuDto, error) - SetOwnerMapMenuByRoleID(ctx context.Context, roleID int32) (map[string]*dto.OwnerMenuDto, error) - RefreshMenus(ctx context.Context) error - SetMenuViewData(ctx context.Context, roleID int32) ([]*dto.SetMenuDto, error) - - Tree(ctx context.Context, id int32) ([]*view.LayuiTree, error) - XmSelectTree(ctx context.Context, id int32) ([]*view.XmSelectTree, error) - SetMenu(ctx context.Context, roleID int32, menus []*db.SysMenu) error -} - -type menuBiz struct { - store db.Store - redis redis.RedisCache -} - -var _ MenuBiz = (*menuBiz)(nil) - -func NewMenu(store db.Store, redis redis.RedisCache) *menuBiz { - return &menuBiz{ - store: store, - redis: redis, - } -} - -func (b *menuBiz) Create(ctx context.Context, arg *db.CreateSysMenuParams) (*db.SysMenu, error) { - return b.store.CreateSysMenu(ctx, arg) -} - -func (b *menuBiz) Update(ctx context.Context, arg *db.UpdateSysMenuParams) (*db.SysMenu, error) { - return b.store.UpdateSysMenu(ctx, arg) -} - -func (b *menuBiz) Get(ctx context.Context, id int32) (*db.SysMenu, error) { - return b.store.GetSysMenu(ctx, id) -} - -func (b *menuBiz) GetSysMenuByUrl(ctx context.Context, url string) (*db.SysMenu, error) { - return b.store.GetSysMenuByUrl(ctx, url) -} - -func (b *menuBiz) AllMenusCache(ctx context.Context) ([]*db.SysMenu, error) { - key := know.GetManageKey(ctx, know.AllMenus) - bs, err := b.redis.GetBytes(ctx, key) - if err == nil { - var res []*db.SysMenu - if err := json.Unmarshal(bs, &res); err == nil { - return res, nil - } - } - - all, err := b.store.AllSysMenu(ctx) - if err != nil { - return nil, err - } - - bs, err = json.Marshal(all) - if err != nil { - return nil, err - } - - _ = redis.Set(ctx, key, bs, time.Hour*6) - return all, nil -} - -func (b *menuBiz) ListMenuTree(ctx context.Context) ([]*db.SysMenuDto, error) { - all, err := b.AllMenusCache(ctx) - if err != nil { - return nil, err - } - - return toTreeSysMenu(0, all), nil -} - -func (b *menuBiz) ListOwnerMenuByRoleID(ctx context.Context, roleID int32) ([]*dto.OwnerMenuDto, error) { - // 判断redis是否存储 - key := know.GetManageKey(ctx, know.OwnerMenus, roleID) - bs, err := b.redis.GetBytes(ctx, key) - if err == nil { - var res []*dto.OwnerMenuDto - if err := json.Unmarshal(bs, &res); err == nil { - return res, nil - } - } - - return b.SetOwnerListMenuByRoleID(ctx, roleID) -} - -func (b *menuBiz) SetOwnerListMenuByRoleID(ctx context.Context, roleID int32) ([]*dto.OwnerMenuDto, error) { - menus, err := b.ownerMenusByRoleID(ctx, roleID) - if err != nil { - return nil, err - } - - var res []*dto.OwnerMenuDto - for _, menu := range menus { - res = append(res, &dto.OwnerMenuDto{ - ID: menu.ID, - DisplayName: menu.DisplayName, - Url: menu.Url, - ParentID: menu.ParentID, - Avatar: menu.Avatar, - Style: menu.Style, - IsList: menu.IsList, - }) - } - - bs, err := json.Marshal(res) - if err != nil { - return nil, err - } - - key := know.GetManageKey(ctx, know.OwnerMenus, roleID) - _ = redis.Set(ctx, key, bs, time.Hour*6) - return res, nil -} - -func (b *menuBiz) RecursiveSysMenus(ctx context.Context, roleID int32) ([]*dto.MenuUIDto, error) { - // 判断redis是否存储 - key := know.GetManageKey(ctx, know.RecursiveMenus, roleID) - bs, err := b.redis.GetBytes(ctx, key) - if err == nil { - var res []*dto.MenuUIDto - if err := json.Unmarshal(bs, &res); err == nil { - return res, nil - } - } - - return b.SetRecursiveSysMenus(ctx, roleID) -} - -func (b *menuBiz) SetRecursiveSysMenus(ctx context.Context, roleID int32) ([]*dto.MenuUIDto, error) { - // 判断当前用户是否有vip角色 - role, err := b.store.GetSysRole(ctx, roleID) - if err != nil { - return nil, err - } - - var menus []*db.SysMenu - if role.Vip { - // vip 用户 - all, err := b.store.RecursiveSysMenus(ctx) - if err != nil { - return nil, err - } - menus = convertToMenuUIDto(all) - - } else { - // not vip - all, err := b.store.RecursiveSysMenusByRoleID(ctx, roleID) - if err != nil { - return nil, err - } - menus = convertToMenuUIDto2(all) - } - menuList := uniqueSysMenus(menus) - if len(menuList) == 0 { - return nil, nil - } - - tree := convertToUITree(menuList, 0) - bs, err := json.Marshal(tree) - if err != nil { - return nil, err - } - - key := know.GetManageKey(ctx, know.RecursiveMenus, roleID) - _ = redis.Set(ctx, key, bs, time.Hour*6) - return tree, nil -} - -func (b *menuBiz) MapOwnerMenuByRoleID(ctx context.Context, roleID int32) (map[string]*dto.OwnerMenuDto, error) { - // 判断redis是否存储 - key := know.GetManageKey(ctx, know.OwnerMenus, roleID) - bs, err := b.redis.GetBytes(ctx, key) - if err == nil { - var res map[string]*dto.OwnerMenuDto - if err := json.Unmarshal(bs, &res); err == nil { - return res, nil - } - } - - return b.SetOwnerMapMenuByRoleID(ctx, roleID) -} - -func (b *menuBiz) SetOwnerMapMenuByRoleID(ctx context.Context, roleID int32) (map[string]*dto.OwnerMenuDto, error) { - result := make(map[string]*dto.OwnerMenuDto) - menus, err := b.ownerMenusByRoleID(ctx, roleID) - if err != nil { - return result, err - } - - for _, menu := range menus { - result[menu.Url] = &dto.OwnerMenuDto{ - ID: menu.ID, - DisplayName: menu.DisplayName, - Url: menu.Url, - ParentID: menu.ParentID, - Avatar: menu.Avatar, - Style: menu.Style, - IsList: menu.IsList, - } - } - - bs, err := json.Marshal(result) - if err != nil { - return nil, err - } - - key := know.GetManageKey(ctx, know.OwnerMenus, roleID) - _ = redis.Set(ctx, key, bs, time.Hour*6) - return result, nil -} - -func (b *menuBiz) RefreshMenus(ctx context.Context) error { - all, err := b.store.AllSysMenu(ctx) - if err != nil { - return err - } - - bs, err := json.Marshal(all) - if err != nil { - return err - } - - key := know.GetManageKey(ctx, know.AllMenus) - err = redis.Set(ctx, key, bs, time.Hour*6) - return err -} - -func (b *menuBiz) Tree(ctx context.Context, id int32) ([]*view.LayuiTree, error) { - all, err := b.AllMenusCache(ctx) - if err != nil { - return nil, err - } - - return b.toTree(id, all), nil -} - -func (b *menuBiz) XmSelectTree(ctx context.Context, id int32) ([]*view.XmSelectTree, error) { - all, err := b.AllMenusCache(ctx) - if err != nil { - return nil, err - } - - return b.toXmSelectTree(id, all), nil -} - -func (b *menuBiz) SetMenu(ctx context.Context, roleID int32, menus []*db.SysMenu) error { - return b.store.ExecTx(ctx, func(q *db.Queries) error { - err := q.DeleteRoleMneuByRoleID(ctx, roleID) - if err != nil { - return err - } - - for _, m := range menus { - err := q.CreateRoleMenu(ctx, &db.CreateRoleMenuParams{ - RoleID: roleID, - MenuID: m.ID, - }) - if err != nil { - return err - } - } - - return nil - }) -} - -func (b *menuBiz) SetMenuViewData(ctx context.Context, roleID int32) ([]*dto.SetMenuDto, error) { - // 获取该用户已经有的权限 - hs, err := b.store.ListSysMenuIDByRoleID(ctx, roleID) - if err != nil { - return nil, err - } - - all, err := b.AllMenusCache(ctx) - if err != nil { - return nil, err - } - - return toSetMenuTree(all, hs, 0), nil -} - -func (b *menuBiz) ownerMenusByRoleID(ctx context.Context, roleID int32) ([]*db.SysMenu, error) { - // 判断当前用户是否有vip角色 - role, err := b.store.GetSysRole(ctx, roleID) - if err != nil { - return nil, err - } - - var e error - var menus []*db.SysMenu - if role.Vip { - // vip 用户 - menus, e = b.store.AllSysMenu(ctx) - if e != nil { - return nil, err - } - - } else { - // not vip - menus, e = b.store.ListSysMenuByRoleID(ctx, roleID) - if e != nil { - return nil, err - } - } - - return menus, nil -} - -func (b *menuBiz) toTree(parentId int32, data []*db.SysMenu) []*view.LayuiTree { - var res []*view.LayuiTree - for _, v := range data { - if v.ParentID == parentId { - item := view.LayuiTree{} - item.ID = strconv.FormatInt(int64(v.ID), 10) - item.Title = v.DisplayName - item.Children = b.toTree(v.ID, data) - if v.ParentID == 0 { - item.Spread = true - } - res = append(res, &item) - } - } - - return res -} - -func (b *menuBiz) toXmSelectTree(parentId int32, data []*db.SysMenu) []*view.XmSelectTree { - var res []*view.XmSelectTree - for _, v := range data { - if v.ParentID == parentId { - item := view.XmSelectTree{ - Name: v.DisplayName, - Value: strconv.FormatInt(int64(v.ID), 10), - Children: b.toXmSelectTree(v.ID, data), - } - res = append(res, &item) - } - } - - return res -} - -func toTreeSysMenu(parentId int32, data []*db.SysMenu) []*db.SysMenuDto { - var res []*db.SysMenuDto - for _, v := range data { - if v.ParentID == parentId { - item := db.SysMenuDto{} - item.ID = v.ID - item.Name = v.Name - item.DisplayName = v.DisplayName - item.Url = v.Url - item.Type = v.Type - item.ParentID = v.ParentID - item.ParentPath = v.ParentPath - item.Avatar = v.Avatar - item.Style = v.Style - item.Visible = v.Visible - item.IsList = v.IsList - item.Status = v.Status - item.Sort = v.Sort - item.CreatedAt = v.CreatedAt - item.UpdatedAt = v.UpdatedAt - item.Children = toTreeSysMenu(v.ID, data) - res = append(res, &item) - } - } - - return res -} - -func convertToMenuUIDto(data []*db.RecursiveSysMenusRow) []*db.SysMenu { - var res []*db.SysMenu - - for _, item := range data { - temp := &db.SysMenu{ - ID: item.ID, - Name: item.Name, - DisplayName: item.DisplayName, - Url: item.Url, - Type: item.Type, - ParentID: item.ParentID, - ParentPath: item.ParentPath, - Avatar: item.Avatar, - Style: item.Style, - Visible: item.Visible, - IsList: item.IsList, - Status: item.Status, - Sort: item.Sort, - CreatedAt: item.CreatedAt, - UpdatedAt: item.UpdatedAt, - } - res = append(res, temp) - } - - return res -} - -func convertToMenuUIDto2(data []*db.RecursiveSysMenusByRoleIDRow) []*db.SysMenu { - var res []*db.SysMenu - - for _, item := range data { - temp := &db.SysMenu{ - ID: item.ID, - Name: item.Name, - DisplayName: item.DisplayName, - Url: item.Url, - Type: item.Type, - ParentID: item.ParentID, - ParentPath: item.ParentPath, - Avatar: item.Avatar, - Style: item.Style, - Visible: item.Visible, - IsList: item.IsList, - Status: item.Status, - Sort: item.Sort, - CreatedAt: item.CreatedAt, - UpdatedAt: item.UpdatedAt, - } - res = append(res, temp) - } - - return res -} - -func convertToUITree(data []*db.SysMenu, parentID int32) []*dto.MenuUIDto { - var root []*dto.MenuUIDto - for _, item := range data { - if item.ParentID == parentID { - if item.IsList { - temp := &dto.MenuUIDto{ - ID: strings.ToLower(item.Url), - Title: item.DisplayName, - Icon: item.Avatar, - Type: 1, - OpenType: "_iframe", - // OpenType: "_component", - Href: item.Url, - } - root = append(root, temp) - } else { - temp := &dto.MenuUIDto{ - ID: strconv.Itoa(int(item.ID)), - Title: item.DisplayName, - Icon: item.Avatar, - Type: 0, - } - temp.Children = convertToUITree(data, item.ID) - root = append(root, temp) - } - } - } - return root -} - -func uniqueSysMenus(sm []*db.SysMenu) []*db.SysMenu { - res := make([]*db.SysMenu, 0) // 返回的新切片 - m1 := make(map[int32]byte) // 用来去重的临时map - for _, v := range sm { - if _, ok := m1[v.ID]; !ok { - m1[v.ID] = 1 - res = append(res, v) - } - } - return res -} - -func toSetMenuTree(data []*db.SysMenu, ids []int32, parentID int32) []*dto.SetMenuDto { - var res []*dto.SetMenuDto - for _, v := range data { - if v.ParentID == parentID { - isSelect := hasValueInArray(ids, v.ID) - if v.IsList { - item := dto.SetMenuDto{ - ID: v.ID, - Name: v.DisplayName, - Link: v.Type, - IsList: v.IsList, - IsSelect: isSelect, - } - item.Items = []*dto.SetMenuDto{ - { - ID: v.ID, - Name: "列表", - Link: "btn", - IsList: false, - IsSelect: isSelect, - Items: toSetMenuTree(data, ids, v.ID), - }, - } - item.Items = append(item.Items, toSetMenuTree(data, ids, v.ID)...) - res = append(res, &item) - } else { - item := dto.SetMenuDto{ - ID: v.ID, - Name: v.DisplayName, - Link: v.Type, - IsList: v.IsList, - IsSelect: isSelect, - Items: toSetMenuTree(data, ids, v.ID), - } - res = append(res, &item) - } - } - } - - return res -} - -func hasValueInArray(data []int32, id int32) bool { - return slices.Contains(data, id) -} diff --git a/internal/erpserver/biz/v1/system/role.go b/internal/erpserver/biz/v1/system/role.go deleted file mode 100644 index fbfac4a..0000000 --- a/internal/erpserver/biz/v1/system/role.go +++ /dev/null @@ -1,313 +0,0 @@ -package system - -import ( - "context" - "encoding/json" - "errors" - "fmt" - "strconv" - "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" -) - -type RoleBiz interface { - Create(ctx context.Context, req *form.Role) error - Update(ctx context.Context, req *form.Role) error - CreateOrUpdate(ctx context.Context, req *form.Role) error - All(ctx context.Context) ([]*db.SysRole, error) - List(ctx context.Context, q dto.SearchDto) ([]*db.SysRole, int64, error) - Get(ctx context.Context, id int32) (*db.SysRole, error) - Refresh(ctx context.Context) ([]*db.SysRole, error) - RebuildParentPath(ctx context.Context) error - - Tree(ctx context.Context, id int32) ([]*view.LayuiTree, error) - XmSelectTree(ctx context.Context, id int32) ([]*view.XmSelectTree, error) - - RoleExpansion -} - -type RoleExpansion interface{} - -type roleBiz struct { - store db.Store - redis redis.RedisCache -} - -var _ RoleBiz = (*roleBiz)(nil) - -func NewRole(store db.Store, redis redis.RedisCache) *roleBiz { - return &roleBiz{ - store: store, - redis: redis, - } -} - -func (b *roleBiz) Create(ctx context.Context, req *form.Role) error { - parent := &db.SysRole{ - ID: 0, - ParentID: 0, - ParentPath: ",0,", - } - if *req.ParentID > 0 { - var err error - parent, err = b.store.GetSysRole(ctx, *req.ParentID) - if err != nil { - return errors.New("父级节点错误") - } - } - - var order int32 = 6666 - if *req.Sort > 0 { - order = *req.Sort - } - - arg := &db.CreateSysRoleParams{ - Name: req.Name, - DisplayName: req.DisplayName, - Vip: false, - ParentID: parent.ID, - ParentPath: convertor.HandleParentPath(fmt.Sprintf("%s,%d,", parent.ParentPath, parent.ID)), - Status: *req.Status, - Sort: order, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - } - _, err := b.store.CreateSysRole(ctx, arg) - if err != nil { - if db.IsUniqueViolation(err) { - return errors.New("角色名称已存在") - } - return err - } - return nil -} - -func (b *roleBiz) Update(ctx context.Context, req *form.Role) error { - parent := &db.SysRole{ - ID: 0, - ParentID: 0, - ParentPath: ",0,", - } - if *req.ParentID > 0 { - var err error - parent, err = b.store.GetSysRole(ctx, *req.ParentID) - if err != nil { - return errors.New("父级节点错误") - } - } - - role, err := b.store.GetSysRole(ctx, *req.ID) - if err != nil { - return err - } - - var order int32 = 6666 - if *req.Sort > 0 { - order = *req.Sort - } - - arg := &db.UpdateSysRoleParams{ - ID: role.ID, - DisplayName: req.DisplayName, - Status: *req.Status, - ParentID: parent.ID, - ParentPath: convertor.HandleParentPath(fmt.Sprintf("%s,%d,", parent.ParentPath, parent.ID)), - Sort: order, - UpdatedAt: time.Now(), - } - _, err = b.store.UpdateSysRole(ctx, arg) - return err -} - -func (b *roleBiz) CreateOrUpdate(ctx context.Context, req *form.Role) error { - parent := &db.SysRole{ - ID: 0, - ParentID: 0, - ParentPath: ",0,", - } - if *req.ParentID > 0 { - var err error - parent, err = b.store.GetSysRole(ctx, *req.ParentID) - if err != nil { - return errors.New("父级节点错误") - } - } - - var order int32 = 6666 - if *req.Sort > 0 { - order = *req.Sort - } - - if *req.ID > 0 { - role, err := b.store.GetSysRole(ctx, *req.ID) - if err != nil { - return err - } - - arg := &db.UpdateSysRoleParams{ - ID: role.ID, - DisplayName: req.DisplayName, - Status: *req.Status, - ParentID: parent.ID, - ParentPath: convertor.HandleParentPath(fmt.Sprintf("%s,%d,", parent.ParentPath, parent.ID)), - Sort: order, - UpdatedAt: time.Now(), - } - _, err = b.store.UpdateSysRole(ctx, arg) - return err - } else { - arg := &db.CreateSysRoleParams{ - Name: req.Name, - DisplayName: req.DisplayName, - Vip: false, - ParentID: parent.ID, - ParentPath: convertor.HandleParentPath(fmt.Sprintf("%s,%d,", parent.ParentPath, parent.ID)), - Status: *req.Status, - Sort: order, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - } - _, err := b.store.CreateSysRole(ctx, arg) - if err != nil { - if db.IsUniqueViolation(err) { - return errors.New("角色名称已存在") - } - return err - } - return nil - } -} - -func (b *roleBiz) All(ctx context.Context) ([]*db.SysRole, error) { - key := know.GetManageKey(ctx, know.AllRoles) - bs, err := redis.GetBytes(ctx, key) - if err == nil { - var res []*db.SysRole - if err := json.Unmarshal(bs, &res); err == nil { - return res, nil - } - } - - return b.Refresh(ctx) -} - -func (b *roleBiz) List(ctx context.Context, q dto.SearchDto) ([]*db.SysRole, int64, error) { - countArg := &db.CountSysRoleConditionParams{ - IsStatus: q.SearchStatus != 9999, - Status: int32(q.SearchStatus), - IsID: q.SearchID != 0, - ID: int32(q.SearchID), - IsParentID: q.SearchParentID != 0, - ParentID: int32(q.SearchParentID), - DisplayName: q.SearchName, - } - - dataArg := &db.ListSysRoleConditionParams{ - IsStatus: q.SearchStatus != 9999, - Status: int32(q.SearchStatus), - IsID: q.SearchID != 0, - ID: int32(q.SearchID), - IsParentID: q.SearchParentID != 0, - ParentID: int32(q.SearchParentID), - DisplayName: q.SearchName, - Skip: (int32(q.Page) - 1) * int32(q.Rows), - Size: int32(q.Rows), - } - count, err := b.store.CountSysRoleCondition(ctx, countArg) - if err != nil { - return nil, 0, err - } - - departs, err := b.store.ListSysRoleCondition(ctx, dataArg) - if err != nil { - return nil, 0, err - } - - return departs, count, nil -} - -func (b *roleBiz) Get(ctx context.Context, id int32) (*db.SysRole, error) { - return b.store.GetSysRole(ctx, id) -} - -func (b *roleBiz) Refresh(ctx context.Context) ([]*db.SysRole, error) { - all, err := b.store.AllSysRole(ctx) - if err != nil { - return nil, err - } - - bs, err := json.Marshal(all) - if err != nil { - return nil, err - } - - key := know.GetManageKey(ctx, know.AllRoles) - err = redis.Set(ctx, key, bs, time.Hour*6) - if err != nil { - return nil, err - } - return all, nil -} - -func (b *roleBiz) RebuildParentPath(ctx context.Context) error { - return b.store.SysRoleRebuildPath(ctx) -} - -func (b *roleBiz) Tree(ctx context.Context, id int32) ([]*view.LayuiTree, error) { - all, err := b.All(ctx) - if err != nil { - return nil, err - } - - return b.toTree(id, all), nil -} - -func (b *roleBiz) XmSelectTree(ctx context.Context, id int32) ([]*view.XmSelectTree, error) { - all, err := b.All(ctx) - if err != nil { - return nil, err - } - - return b.toXmSelectTree(id, all), nil -} - -func (b *roleBiz) toTree(parentId int32, data []*db.SysRole) []*view.LayuiTree { - var res []*view.LayuiTree - for _, v := range data { - if v.ParentID == parentId { - item := view.LayuiTree{} - item.ID = strconv.FormatInt(int64(v.ID), 10) - item.Title = v.DisplayName - item.Children = b.toTree(v.ID, data) - if v.ParentID == 0 { - item.Spread = true - } - res = append(res, &item) - } - } - - return res -} - -func (b *roleBiz) toXmSelectTree(parentId int32, data []*db.SysRole) []*view.XmSelectTree { - var res []*view.XmSelectTree - for _, v := range data { - if v.ParentID == parentId { - item := view.XmSelectTree{ - Name: v.DisplayName, - Value: strconv.FormatInt(int64(v.ID), 10), - Children: b.toXmSelectTree(v.ID, data), - } - res = append(res, &item) - } - } - - return res -} diff --git a/internal/erpserver/biz/v1/system/system.go b/internal/erpserver/biz/v1/system/system.go deleted file mode 100644 index 5b96a76..0000000 --- a/internal/erpserver/biz/v1/system/system.go +++ /dev/null @@ -1,73 +0,0 @@ -package system - -import ( - db "management/internal/db/sqlc" - "management/internal/erpserver/store" - "management/internal/pkg/redis" - "management/internal/pkg/session" - - "github.com/drhin/logger" -) - -type SystemBiz interface { - UserBiz() UserBiz - MenuBiz() MenuBiz - RoleBiz() RoleBiz - DepartmentBiz() DepartmentBiz - ConfigBiz() ConfigBiz - AuditBiz() AuditBiz - LoginLogBiz() LoginLogBiz - CategoryBiz() CategoryBiz -} - -type systemBiz struct { - database store.IStore - store db.Store - redis redis.RedisCache - session session.Session - logger *logger.Logger -} - -var _ SystemBiz = (*systemBiz)(nil) - -func New(database store.IStore, store db.Store, redis redis.RedisCache, session session.Session, logger *logger.Logger) *systemBiz { - return &systemBiz{ - database: database, - store: store, - redis: redis, - session: session, - logger: logger, - } -} - -func (b *systemBiz) UserBiz() UserBiz { - return NewUser(b.database, b.store, b.session, b.logger) -} - -func (b *systemBiz) MenuBiz() MenuBiz { - return NewMenu(b.store, b.redis) -} - -func (b *systemBiz) RoleBiz() RoleBiz { - return NewRole(b.store, b.redis) -} - -func (b *systemBiz) DepartmentBiz() DepartmentBiz { - return NewDepartment(b.store, b.redis) -} - -func (b *systemBiz) ConfigBiz() ConfigBiz { - return NewConfig(b.store, b.redis) -} - -func (b *systemBiz) AuditBiz() AuditBiz { - return NewAudit(b.store) -} - -func (b *systemBiz) LoginLogBiz() LoginLogBiz { - return NewLoginLog(b.database, b.store) -} - -func (b *systemBiz) CategoryBiz() CategoryBiz { - return NewCategory(b.store, b.redis) -} diff --git a/internal/erpserver/biz/v1/system/user.go b/internal/erpserver/biz/v1/system/user.go deleted file mode 100644 index 613a32c..0000000 --- a/internal/erpserver/biz/v1/system/user.go +++ /dev/null @@ -1,253 +0,0 @@ -package system - -import ( - "context" - "encoding/json" - "errors" - "strconv" - "time" - - "management/internal/db/model/dto" - db "management/internal/db/sqlc" - "management/internal/erpserver/model/form" - systemmodel "management/internal/erpserver/model/system" - "management/internal/erpserver/model/view" - "management/internal/erpserver/store" - "management/internal/pkg/crypto" - "management/internal/pkg/know" - "management/internal/pkg/rand" - "management/internal/pkg/session" - - "github.com/drhin/logger" - "github.com/google/uuid" - "go.uber.org/zap" -) - -// UserBiz 定义处理用户请求所需的方法. -type UserBiz interface { - Create(ctx context.Context, req *form.User) error - Update(ctx context.Context, req *form.User) error - All(ctx context.Context) ([]*db.SysUser, error) - List(ctx context.Context, q dto.SearchDto) ([]*db.ListSysUserConditionRow, int64, error) - Get(ctx context.Context, id int32) (*db.SysUser, error) - - XmSelect(ctx context.Context) ([]*view.XmSelect, error) - - UserExpansion -} - -// UserExpansion 定义用户操作的扩展方法. -type UserExpansion interface { - Login(ctx context.Context, req *form.Login) error -} - -// userBiz 是 UserBiz 接口的实现. -type userBiz struct { - database store.IStore - store db.Store - session session.Session - log *logger.Logger -} - -// 确保 userBiz 实现了 UserBiz 接口. -var _ UserBiz = (*userBiz)(nil) - -func NewUser(database store.IStore, store db.Store, session session.Session, log *logger.Logger) *userBiz { - return &userBiz{ - database: database, - store: store, - session: session, - log: log, - } -} - -func (b *userBiz) Create(ctx context.Context, req *form.User) error { - salt, err := rand.String(10) - if err != nil { - return err - } - - hashedPassword, err := crypto.BcryptHashPassword(req.Password + salt) - if err != nil { - return err - } - - initTime, err := time.ParseInLocation(time.DateTime, "0001-01-01 00:00:00", time.Local) - if err != nil { - return err - } - - arg := &db.CreateSysUserParams{ - Uuid: uuid.Must(uuid.NewV7()), - Email: req.Email, - Username: req.Username, - HashedPassword: hashedPassword, - Salt: salt, - Avatar: req.Avatar, - Gender: req.Gender, - DepartmentID: req.DepartmentID, - RoleID: req.RoleID, - Status: *req.Status, - ChangePasswordAt: initTime, - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - } - _, err = b.store.CreateSysUser(ctx, arg) - if err != nil { - if db.IsUniqueViolation(err) { - return errors.New("用户已经存在") - } - return err - } - return nil -} - -func (b *userBiz) Update(ctx context.Context, req *form.User) error { - user, err := b.store.GetSysUser(ctx, *req.ID) - if err != nil { - return err - } - - arg := &db.UpdateSysUserParams{ - ID: user.ID, - Username: req.Username, - HashedPassword: user.HashedPassword, - Avatar: req.Avatar, - Gender: req.Gender, - DepartmentID: req.DepartmentID, - RoleID: req.RoleID, - Status: *req.Status, - ChangePasswordAt: user.ChangePasswordAt, - UpdatedAt: time.Now(), - } - if req.ChangePassword == "on" { - hashedPassword, err := crypto.BcryptHashPassword(req.Password + user.Salt) - if err != nil { - return err - } - arg.HashedPassword = hashedPassword - arg.ChangePasswordAt = time.Now() - } - _, err = b.store.UpdateSysUser(ctx, arg) - return err -} - -func (b *userBiz) All(ctx context.Context) ([]*db.SysUser, error) { - return b.store.ListSysUser(ctx) -} - -func (b *userBiz) List(ctx context.Context, q dto.SearchDto) ([]*db.ListSysUserConditionRow, int64, error) { - count, err := b.store.CountSysUserCondition(ctx, &db.CountSysUserConditionParams{ - IsStatus: q.SearchStatus != 9999, - Status: int32(q.SearchStatus), - IsID: q.SearchID != 0, - ID: int32(q.SearchID), - Username: q.SearchName, - Email: q.SearchEmail, - }) - if err != nil { - return nil, 0, err - } - - users, err := b.store.ListSysUserCondition(ctx, &db.ListSysUserConditionParams{ - IsStatus: q.SearchStatus != 9999, - Status: int32(q.SearchStatus), - IsID: q.SearchID != 0, - ID: int32(q.SearchID), - Username: q.SearchName, - Email: q.SearchEmail, - Skip: (int32(q.Page) - 1) * int32(q.Rows), - Size: int32(q.Rows), - }) - if err != nil { - return nil, 0, err - } - - return users, count, nil -} - -func (b *userBiz) Get(ctx context.Context, id int32) (*db.SysUser, error) { - return b.store.GetSysUser(ctx, id) -} - -func (b *userBiz) XmSelect(ctx context.Context) ([]*view.XmSelect, error) { - all, err := b.store.ListSysUser(ctx) - if err != nil || len(all) == 0 { - return nil, err - } - - var res []*view.XmSelect - for _, user := range all { - res = append(res, &view.XmSelect{ - Name: user.Username, - Value: strconv.Itoa(int(user.ID)), - }) - } - return res, nil -} - -func (b *userBiz) Login(ctx context.Context, req *form.Login) error { - l := systemmodel.NewLoginLog(req.Email, req.Os, req.Ip, req.Browser, req.Url, req.Referrer) - err := b.login(ctx, req) - if err != nil { - if err := b.database.LoginLog().Create(ctx, l.SetMessage(err.Error())); err != nil { - b.log.Error(err.Error(), err, zap.Any("login_log", l)) - } - return err - } - - if err := b.database.LoginLog().Create(ctx, l.SetOk("登录成功")); err != nil { - b.log.Error(err.Error(), err, zap.Any("login_log", l)) - } - return nil -} - -func (b *userBiz) login(ctx context.Context, req *form.Login) error { - user, err := b.database.User().GetByEmail(ctx, req.Email) - if err != nil { - return err - } - - err = crypto.BcryptComparePassword(user.HashedPassword, req.Password+user.Salt) - if err != nil { - return errors.New("账号或密码错误") - } - - user.Role, err = b.database.Role().Get(ctx, user.RoleID) - if err != nil { - return err - } - if user.Role == nil || user.Role.ID == 0 { - return errors.New("账号没有配置角色, 请联系管理员") - } - - // 登陆成功 - err = b.loginSuccess(ctx, user, req) - if err != nil { - return err - } - - return nil -} - -func (b *userBiz) loginSuccess(ctx context.Context, user *systemmodel.User, req *form.Login) error { - auth := dto.AuthorizeUser{ - ID: user.ID, - Uuid: user.Uuid, - Email: user.Email, - Username: user.Username, - RoleID: user.Role.ID, - RoleName: user.Role.Name, - OS: req.Os, - IP: req.Ip, - Browser: req.Browser, - } - - gob, err := json.Marshal(auth) - if err != nil { - return err - } - - b.session.Put(ctx, know.StoreName, gob) - return nil -} diff --git a/internal/erpserver/handler/budget/budget.go b/internal/erpserver/handler/budget/budget.go deleted file mode 100644 index 78057e9..0000000 --- a/internal/erpserver/handler/budget/budget.go +++ /dev/null @@ -1,274 +0,0 @@ -package budget - -import ( - "errors" - "net/http" - "strconv" - "strings" - "time" - - "management/internal/db/model/form" - db "management/internal/db/sqlc" - "management/internal/erpserver/biz" - "management/internal/pkg/convertor" - "management/internal/pkg/know" - "management/internal/pkg/middleware" - "management/internal/pkg/tpl" - "management/internal/pkg/tpl/html" - - "github.com/jackc/pgx/v5/pgtype" -) - -type BudgetHandler interface { - List(w http.ResponseWriter, r *http.Request) - Add(w http.ResponseWriter, r *http.Request) - Edit(w http.ResponseWriter, r *http.Request) - Save(w http.ResponseWriter, r *http.Request) - Data(w http.ResponseWriter, r *http.Request) -} - -type budgetHandler struct { - render tpl.Renderer - biz biz.IBiz - mi middleware.Middleware -} - -var _ BudgetHandler = (*budgetHandler)(nil) - -func NewBudgetHandler(render tpl.Renderer, biz biz.IBiz, mi middleware.Middleware) *budgetHandler { - return &budgetHandler{ - render: render, - biz: biz, - mi: mi, - } -} - -func (h *budgetHandler) List(w http.ResponseWriter, r *http.Request) { - switch r.Method { - case http.MethodGet: - ctx := r.Context() - pp, _ := h.biz.ProjectV1().ListHtml(ctx) - cc, _ := h.biz.SystemV1().CategoryBiz().ListHtmlByLetter(ctx, know.BudgetCategory) - h.render.HTML(w, r, "budget/list.tmpl", map[string]any{ - "Statuses": html.NewSelectControls(html.Statuses, "0"), - "Projects": html.NewSelectControls(pp, "0"), - "Categories": html.NewSelectControls(cc, "0"), - }) - case http.MethodPost: - ctx := r.Context() - project := convertor.ConvertInt[int64](r.PostFormValue("project"), 9999) - if project == 0 { - project = 9999 - } - - budgetType := convertor.ConvertInt[int32](r.PostFormValue("budgetType"), 9999) - if budgetType == 0 { - budgetType = 9999 - } - - category := convertor.ConvertInt[int32](r.PostFormValue("category"), 9999) - if category == 0 { - category = 9999 - } - - title := strings.TrimSpace(r.PostFormValue("title")) - var search string - if len(title) > 0 { - search = "%" + title + "%" - if strings.HasSuffix(title, ":") { - search = title[:len(title)-1] + "%" - } - } - arg := &db.ListBudgetConditionParam{ - ProjectID: project, - BudgetType: budgetType, - Category: category, - IsTitle: len(search) > 0, - Title: search, - Status: convertor.ConvertInt[int16](r.PostFormValue("status"), 9999), - PageID: convertor.ConvertInt[int32](r.PostFormValue("page"), 1), - PageSize: convertor.ConvertInt[int32](r.PostFormValue("rows"), 10), - } - arg.TimeBegin, arg.TimeEnd = convertor.DefaultStartTimeAndEndTime(r.PostFormValue("timeBegin"), r.PostFormValue("timeEnd")) - res, total, err := h.biz.BudgetV1().List(ctx, arg) - if err != nil { - h.render.JSONERR(w, err.Error()) - return - } - - data := tpl.ResponseList{ - Code: 0, - Message: "ok", - Count: total, - Data: res, - } - h.render.JSON(w, data) - default: - http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) - } -} - -func (h *budgetHandler) Add(w http.ResponseWriter, r *http.Request) { - h.render.HTML(w, r, "budget/edit.tmpl", map[string]any{ - "Item": &form.BudgetForm{ - BudgetType: 1, - }, - "Statuses": html.NewSelectControls(html.Statuses, "0"), - }) -} - -func (h *budgetHandler) Edit(w http.ResponseWriter, r *http.Request) { - vars := r.URL.Query() - id := convertor.QueryInt[int64](vars, "id", 0) - budget := &form.BudgetForm{} - ctx := r.Context() - if id > 0 { - if cus, err := h.biz.BudgetV1().Get(ctx, id); err == nil { - budget = budget.ToForm(cus) - if u, err := h.biz.SystemV1().UserBiz().Get(ctx, cus.CreatedUserID); err == nil { - budget.CreatedName = u.Username - } - if u, err := h.biz.SystemV1().UserBiz().Get(ctx, cus.UpdatedUserID); err == nil { - budget.UpdatedName = u.Username - } - } - } - h.render.HTML(w, r, "budget/edit.tmpl", map[string]any{ - "Item": budget, - "Statuses": html.NewSelectControls(html.Statuses, strconv.Itoa(int(budget.Status))), - }) -} - -func (h *budgetHandler) Save(w http.ResponseWriter, r *http.Request) { - ctx := r.Context() - data, err := validForm(r) - if err != nil { - h.render.JSONERR(w, err.Error()) - return - } - - authUser := h.mi.AuthUser(ctx) - if data.ID > 0 { - arg := &db.UpdateBudgetParams{ - ID: data.ID, - ProjectID: pgtype.Int8{ - Int64: data.ProjectID, - Valid: true, - }, - Name: pgtype.Text{ - String: data.Name, - Valid: true, - }, - BudgetType: pgtype.Int4{ - Int32: data.BudgetType, - Valid: true, - }, - Category: pgtype.Int4{ - Int32: data.Category, - Valid: true, - }, - StartAt: pgtype.Timestamptz{ - Time: data.StartAt, - Valid: true, - }, - EndAt: pgtype.Timestamptz{ - Time: data.EndAt, - Valid: true, - }, - Amount: data.AmountF, - UsedAmount: data.UsedAmountF, - RemainingAmount: data.RemainingAmountF, - Remark: pgtype.Text{ - String: data.Remark, - Valid: true, - }, - Status: pgtype.Int2{ - Int16: data.Status, - Valid: true, - }, - UpdatedUserID: pgtype.Int4{ - Int32: authUser.ID, - Valid: true, - }, - } - _, err := h.biz.BudgetV1().Update(ctx, arg) - if err != nil { - h.render.JSONERR(w, err.Error()) - return - } - h.render.JSONOK(w, "更新成功") - } else { - arg := &db.CreateBudgetParams{ - ProjectID: data.ProjectID, - Name: data.Name, - BudgetType: data.BudgetType, - Category: data.Category, - StartAt: data.StartAt, - EndAt: data.EndAt, - Amount: data.AmountF, - UsedAmount: data.UsedAmountF, - RemainingAmount: data.RemainingAmountF, - Remark: data.Remark, - CreatedUserID: authUser.ID, - } - _, err := h.biz.BudgetV1().Create(ctx, arg) - if err != nil { - h.render.JSONERR(w, err.Error()) - return - } - h.render.JSONOK(w, "添加成功") - } -} - -func (h *budgetHandler) Data(w http.ResponseWriter, r *http.Request) {} - -func validForm(r *http.Request) (form.BudgetForm, error) { - var err error - data := form.BudgetForm{} - - data.ID = convertor.ConvertInt[int64](r.PostFormValue("ID"), 0) - data.ProjectID, err = strconv.ParseInt(r.PostFormValue("ProjectID"), 10, 64) - if err != nil || data.ProjectID == 0 { - return data, errors.New("项目不能为空") - } - - data.Name = r.PostFormValue("Name") - if len(data.Name) == 0 { - return data, errors.New("预算名称不能为空") - } - - budgetType, err := strconv.ParseInt(r.PostFormValue("BudgetType"), 10, 32) - if err != nil { - return data, errors.New("预算类型不能为空") - } - data.BudgetType = int32(budgetType) - - category, err := strconv.ParseInt(r.PostFormValue("Category"), 10, 32) - if err != nil { - return data, errors.New("预算类别不能为空") - } - data.Category = int32(category) - - data.StartAt, err = time.ParseInLocation("2006-01-02", r.PostFormValue("StartAt"), time.Local) - if err != nil { - return data, errors.New("开始时间格式错误") - } - data.EndAt, err = time.ParseInLocation("2006-01-02", r.PostFormValue("EndAt"), time.Local) - if err != nil { - return data, errors.New("结束时间格式错误") - } - - if err := data.AmountF.Scan(r.PostFormValue("Amount")); err != nil { - return data, errors.New("预算金额格式错误") - } - if err := data.UsedAmountF.Scan(r.PostFormValue("UsedAmount")); err != nil { - return data, errors.New("已支付金额格式错误") - } - if err := data.RemainingAmountF.Scan(r.PostFormValue("RemainingAmount")); err != nil { - return data, errors.New("剩余金额格式错误") - } - - data.Remark = r.PostFormValue("Remark") - data.Status = convertor.ConvertInt[int16](r.PostFormValue("Status"), 9999) - return data, nil -} diff --git a/internal/erpserver/handler/customer/customer.go b/internal/erpserver/handler/customer/customer.go deleted file mode 100644 index 7935ee0..0000000 --- a/internal/erpserver/handler/customer/customer.go +++ /dev/null @@ -1,209 +0,0 @@ -package customer - -import ( - "net/http" - "strconv" - "strings" - - "management/internal/db/model/form" - db "management/internal/db/sqlc" - "management/internal/erpserver/biz" - "management/internal/pkg/convertor" - "management/internal/pkg/know" - "management/internal/pkg/middleware" - "management/internal/pkg/snowflake" - "management/internal/pkg/tpl" - "management/internal/pkg/tpl/html" - - "github.com/jackc/pgx/v5/pgtype" -) - -type CustomerHandler interface { - List(w http.ResponseWriter, r *http.Request) - Add(w http.ResponseWriter, r *http.Request) - Edit(w http.ResponseWriter, r *http.Request) - Save(w http.ResponseWriter, r *http.Request) -} - -type customerHandler struct { - render tpl.Renderer - biz biz.IBiz - mi middleware.Middleware -} - -var _ CustomerHandler = (*customerHandler)(nil) - -func NewCustomerHandler(render tpl.Renderer, biz biz.IBiz, mi middleware.Middleware) *customerHandler { - return &customerHandler{ - render: render, - biz: biz, - mi: mi, - } -} - -func (h *customerHandler) List(w http.ResponseWriter, r *http.Request) { - switch r.Method { - case http.MethodGet: - ctx := r.Context() - cc, _ := h.biz.SystemV1().CategoryBiz().ListHtmlByLetter(ctx, know.CustomerCategory) - ss, _ := h.biz.SystemV1().CategoryBiz().ListHtmlByLetter(ctx, know.CustomerSource) - h.render.HTML(w, r, "customer/list.tmpl", map[string]any{ - "Statuses": html.NewSelectControls(html.Statuses, "0"), - "Categories": html.NewSelectControls(cc, "0"), - "Sources": html.NewSelectControls(ss, "0"), - }) - case http.MethodPost: - ctx := r.Context() - category := convertor.ConvertInt[int32](r.PostFormValue("category"), 9999) - if category == 0 { - category = 9999 - } - source := convertor.ConvertInt[int32](r.PostFormValue("source"), 9999) - if source == 0 { - source = 9999 - } - - title := strings.TrimSpace(r.PostFormValue("title")) - var search string - if len(title) > 0 { - search = "%" + title + "%" - if strings.HasSuffix(title, ":") { - search = title[:len(title)-1] + "%" - } - } - arg := &db.ListCustomerConditionParam{ - IsTitle: len(search) > 0, - Title: search, - Status: convertor.ConvertInt[int16](r.PostFormValue("status"), 9999), - Category: category, - Source: source, - PageID: convertor.ConvertInt[int32](r.PostFormValue("page"), 1), - PageSize: convertor.ConvertInt[int32](r.PostFormValue("rows"), 10), - } - arg.TimeBegin, arg.TimeEnd = convertor.DefaultStartTimeAndEndTime(r.PostFormValue("timeBegin"), r.PostFormValue("timeEnd")) - res, total, err := h.biz.CustomerV1().List(ctx, arg) - if err != nil { - h.render.JSONERR(w, err.Error()) - return - } - - data := tpl.ResponseList{ - Code: 0, - Message: "ok", - Count: total, - Data: res, - } - h.render.JSON(w, data) - default: - http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) - } -} - -func (h *customerHandler) Add(w http.ResponseWriter, r *http.Request) { - ctx := r.Context() - cc, _ := h.biz.SystemV1().CategoryBiz().ListHtmlByLetter(ctx, know.CustomerCategory) - ss, _ := h.biz.SystemV1().CategoryBiz().ListHtmlByLetter(ctx, know.CustomerSource) - h.render.HTML(w, r, "customer/edit.tmpl", map[string]any{ - "Item": &form.CustomerForm{}, - "Statuses": html.NewSelectControls(html.Statuses, "0"), - "Categories": html.NewSelectControls(cc, "0"), - "Sources": html.NewSelectControls(ss, "0"), - }) -} - -func (h *customerHandler) Edit(w http.ResponseWriter, r *http.Request) { - vars := r.URL.Query() - id := convertor.ConvertInt[int64](vars.Get("id"), 0) - customer := &form.CustomerForm{} - ctx := r.Context() - if id > 0 { - if cus, err := h.biz.CustomerV1().Get(ctx, id); err == nil { - customer = customer.ToForm(cus) - if u, err := h.biz.SystemV1().UserBiz().Get(ctx, cus.CreatedBy); err == nil { - customer.CreatedBy = u.Username - } - if u, err := h.biz.SystemV1().UserBiz().Get(ctx, cus.UpdatedBy); err == nil { - customer.UpdatedBy = u.Username - } - } - } - cc, _ := h.biz.SystemV1().CategoryBiz().ListHtmlByLetter(ctx, know.CustomerCategory) - ss, _ := h.biz.SystemV1().CategoryBiz().ListHtmlByLetter(ctx, know.CustomerSource) - h.render.HTML(w, r, "customer/edit.tmpl", map[string]any{ - "Item": customer, - "Statuses": html.NewSelectControls(html.Statuses, strconv.Itoa(int(customer.Status))), - "Categories": html.NewSelectControls(cc, strconv.Itoa(int(customer.Category))), - "Sources": html.NewSelectControls(ss, strconv.Itoa(int(customer.Source))), - }) -} - -func (h *customerHandler) Save(w http.ResponseWriter, r *http.Request) { - data := &form.CustomerForm{} - if err := form.BindForm(r, data); err != nil { - h.render.JSONERR(w, err.Error()) - return - } - - ctx := r.Context() - authUser := h.mi.AuthUser(ctx) - if data.ID > 0 { - arg := &db.UpdateCustomerParams{ - ID: data.ID, - Name: pgtype.Text{ - String: data.Name, - Valid: true, - }, - Category: pgtype.Int4{ - Int32: data.Category, - Valid: true, - }, - Source: pgtype.Int4{ - Int32: data.Source, - Valid: true, - }, - Address: pgtype.Text{ - String: data.Address, - Valid: true, - }, - ContactName: pgtype.Text{ - String: data.ContactName, - Valid: true, - }, - ContactPhone: pgtype.Text{ - String: data.ContactPhone, - Valid: true, - }, - Status: pgtype.Int2{ - Int16: data.Status, - Valid: true, - }, - UpdatedBy: pgtype.Int4{ - Int32: authUser.ID, - Valid: true, - }, - } - _, err := h.biz.CustomerV1().Update(ctx, arg) - if err != nil { - h.render.JSONERR(w, err.Error()) - return - } - h.render.JSONOK(w, "更新成功") - } else { - arg := &db.CreateCustomerParams{ - ID: snowflake.GetId(), - Name: data.Name, - Category: data.Category, - Source: data.Source, - Address: data.Address, - ContactName: data.ContactName, - ContactPhone: data.ContactPhone, - CreatedBy: authUser.ID, - } - _, err := h.biz.CustomerV1().Create(ctx, arg) - if err != nil { - h.render.JSONERR(w, err.Error()) - return - } - h.render.JSONOK(w, "添加成功") - } -} diff --git a/internal/erpserver/handler/expense/expense.go b/internal/erpserver/handler/expense/expense.go deleted file mode 100644 index 795bdcc..0000000 --- a/internal/erpserver/handler/expense/expense.go +++ /dev/null @@ -1,231 +0,0 @@ -package expense - -import ( - "errors" - "net/http" - "strconv" - "strings" - "time" - - "management/internal/db/model/form" - db "management/internal/db/sqlc" - "management/internal/erpserver/biz" - "management/internal/pkg/convertor" - "management/internal/pkg/know" - "management/internal/pkg/middleware" - "management/internal/pkg/tpl" - "management/internal/pkg/tpl/html" - - "github.com/jackc/pgx/v5/pgtype" -) - -type ExpenseHandler interface { - List(w http.ResponseWriter, r *http.Request) - Add(w http.ResponseWriter, r *http.Request) - Edit(w http.ResponseWriter, r *http.Request) - Save(w http.ResponseWriter, r *http.Request) -} - -type expenseHandler struct { - render tpl.Renderer - biz biz.IBiz - mi middleware.Middleware -} - -var _ ExpenseHandler = (*expenseHandler)(nil) - -func NewExpenseHandler(render tpl.Renderer, biz biz.IBiz, mi middleware.Middleware) *expenseHandler { - return &expenseHandler{ - render: render, - biz: biz, - mi: mi, - } -} - -func (h *expenseHandler) List(w http.ResponseWriter, r *http.Request) { - switch r.Method { - case http.MethodGet: - ctx := r.Context() - pp, _ := h.biz.ProjectV1().ListHtml(ctx) - cc, _ := h.biz.SystemV1().CategoryBiz().ListHtmlByLetter(ctx, know.ExpenseCategory) - h.render.HTML(w, r, "expense/list.tmpl", map[string]any{ - "Statuses": html.NewSelectControls(html.Statuses, "0"), - "Projects": html.NewSelectControls(pp, "0"), - "Categories": html.NewSelectControls(cc, "0"), - }) - case http.MethodPost: - ctx := r.Context() - project := convertor.ConvertInt[int64](r.PostFormValue("project"), 9999) - if project == 0 { - project = 9999 - } - budget := convertor.ConvertInt[int64](r.PostFormValue("budget"), 9999) - if budget == 0 { - budget = 9999 - } - category := convertor.ConvertInt[int32](r.PostFormValue("category"), 9999) - if category == 0 { - category = 9999 - } - - title := strings.TrimSpace(r.PostFormValue("title")) - var search string - if len(title) > 0 { - search = "%" + title + "%" - if strings.HasSuffix(title, ":") { - search = title[:len(title)-1] + "%" - } - } - arg := &db.ListExpenseConditionParam{ - ProjectID: project, - BudgetID: budget, - ExpenseType: category, - IsTitle: len(search) > 0, - Title: search, - Status: convertor.ConvertInt[int16](r.PostFormValue("status"), 9999), - PageID: convertor.ConvertInt[int32](r.PostFormValue("page"), 1), - PageSize: convertor.ConvertInt[int32](r.PostFormValue("rows"), 10), - } - arg.TimeBegin, arg.TimeEnd = convertor.DefaultStartTimeAndEndTime(r.PostFormValue("timeBegin"), r.PostFormValue("timeEnd")) - res, total, err := h.biz.ExpenseV1().List(ctx, arg) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - data := tpl.ResponseList{ - Code: 0, - Message: "ok", - Count: total, - Data: res, - } - h.render.JSON(w, data) - default: - http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) - } -} - -func (h *expenseHandler) Add(w http.ResponseWriter, r *http.Request) { - h.render.HTML(w, r, "expense/edit.tmpl", map[string]any{ - "Item": &form.ExpenseForm{}, - "Statuses": html.NewSelectControls(html.Statuses, "0"), - }) -} - -func (h *expenseHandler) Edit(w http.ResponseWriter, r *http.Request) { - vars := r.URL.Query() - id := convertor.QueryInt[int64](vars, "id", 0) - expense := &form.ExpenseForm{} - ctx := r.Context() - if id > 0 { - if cus, err := h.biz.ExpenseV1().Get(ctx, id); err == nil { - expense = expense.ToForm(cus) - if u, err := h.biz.SystemV1().UserBiz().Get(ctx, cus.CreatedUserID); err == nil { - expense.CreatedName = u.Username - } - if u, err := h.biz.SystemV1().UserBiz().Get(ctx, cus.UpdatedUserID); err == nil { - expense.UpdatedName = u.Username - } - } - } - h.render.HTML(w, r, "expense/edit.tmpl", map[string]any{ - "Item": expense, - "Statuses": html.NewSelectControls(html.Statuses, strconv.Itoa(int(expense.Status))), - }) -} - -func (h *expenseHandler) Save(w http.ResponseWriter, r *http.Request) { - data, err := validForm(r) - if err != nil { - h.render.JSONERR(w, err.Error()) - return - } - - ctx := r.Context() - authUser := h.mi.AuthUser(ctx) - if data.ID > 0 { - arg := &db.UpdateExpenseParams{ - ID: data.ID, - ProjectID: pgtype.Int8{ - Int64: data.ProjectID, - Valid: true, - }, - BudgetID: pgtype.Int8{ - Int64: data.BudgetID, - Valid: true, - }, - Amount: data.AmountF, - ExpensesAt: pgtype.Timestamptz{ - Time: data.ExpensesAt, - Valid: true, - }, - ExpensesType: pgtype.Int4{ - Int32: data.ExpensesType, - Valid: true, - }, - Remark: pgtype.Text{ - String: data.Remark, - Valid: true, - }, - Status: pgtype.Int2{ - Int16: data.Status, - Valid: true, - }, - UpdatedUserID: pgtype.Int4{ - Int32: authUser.ID, - Valid: true, - }, - } - _, err := h.biz.ExpenseV1().Update(ctx, arg) - if err != nil { - h.render.JSONERR(w, err.Error()) - return - } - h.render.JSONOK(w, "更新成功") - } else { - arg := &db.CreateExpenseParams{ - ProjectID: data.ProjectID, - BudgetID: data.BudgetID, - Amount: data.AmountF, - ExpensesAt: data.ExpensesAt, - ExpensesType: data.ExpensesType, - Remark: data.Remark, - Status: data.Status, - CreatedUserID: authUser.ID, - } - _, err := h.biz.ExpenseV1().Create(ctx, arg) - if err != nil { - h.render.JSONERR(w, err.Error()) - return - } - h.render.JSONOK(w, "添加成功") - } -} - -func validForm(r *http.Request) (form.ExpenseForm, error) { - var err error - data := form.ExpenseForm{} - - data.ID = convertor.ConvertInt[int64](r.PostFormValue("ID"), 0) - data.ProjectID, err = strconv.ParseInt(r.PostFormValue("ProjectID"), 10, 64) - if err != nil || data.ProjectID == 0 { - return data, errors.New("项目不能为空") - } - data.BudgetID, err = strconv.ParseInt(r.PostFormValue("BudgetID"), 10, 64) - - if err := data.AmountF.Scan(r.PostFormValue("Amount")); err != nil { - return data, errors.New("报销金额格式错误") - } - data.ExpensesAt, err = time.ParseInLocation("2006-01-02", r.PostFormValue("ExpensesAt"), time.Local) - if err != nil { - return data, errors.New("报销时间格式错误") - } - expensesType, err := strconv.ParseInt(r.PostFormValue("ExpensesType"), 10, 64) - if err != nil || expensesType == 0 { - return data, errors.New("报销类型不能为空") - } - data.ExpensesType = int32(expensesType) - - data.Status = convertor.ConvertInt[int16](r.PostFormValue("Status"), 9999) - return data, nil -} diff --git a/internal/erpserver/handler/income/income.go b/internal/erpserver/handler/income/income.go deleted file mode 100644 index 2e2dec1..0000000 --- a/internal/erpserver/handler/income/income.go +++ /dev/null @@ -1,249 +0,0 @@ -package income - -import ( - "errors" - "net/http" - "strconv" - "strings" - "time" - - "management/internal/db/model/form" - db "management/internal/db/sqlc" - "management/internal/erpserver/biz" - "management/internal/pkg/convertor" - "management/internal/pkg/know" - "management/internal/pkg/middleware" - "management/internal/pkg/tpl" - "management/internal/pkg/tpl/html" - - "github.com/jackc/pgx/v5/pgtype" -) - -type IncomeHandler interface { - List(w http.ResponseWriter, r *http.Request) - Add(w http.ResponseWriter, r *http.Request) - Edit(w http.ResponseWriter, r *http.Request) - Save(w http.ResponseWriter, r *http.Request) -} - -type incomeHandler struct { - render tpl.Renderer - biz biz.IBiz - mi middleware.Middleware -} - -var _ IncomeHandler = (*incomeHandler)(nil) - -func NewIncomeHandler(render tpl.Renderer, biz biz.IBiz, mi middleware.Middleware) *incomeHandler { - return &incomeHandler{ - render: render, - biz: biz, - mi: mi, - } -} - -func (h *incomeHandler) List(w http.ResponseWriter, r *http.Request) { - switch r.Method { - case http.MethodGet: - ctx := r.Context() - pp, _ := h.biz.ProjectV1().ListHtml(ctx) - cc, _ := h.biz.SystemV1().CategoryBiz().ListHtmlByLetter(ctx, know.IncomeCategory) - h.render.HTML(w, r, "income/list.tmpl", map[string]any{ - "Statuses": html.NewSelectControls(html.Statuses, "0"), - "Projects": html.NewSelectControls(pp, "0"), - "Categories": html.NewSelectControls(cc, "0"), - }) - case http.MethodPost: - ctx := r.Context() - project := convertor.ConvertInt[int64](r.PostFormValue("project"), 9999) - if project == 0 { - project = 9999 - } - budget := convertor.ConvertInt[int64](r.PostFormValue("budget"), 9999) - if budget == 0 { - budget = 9999 - } - category := convertor.ConvertInt[int32](r.PostFormValue("category"), 9999) - if category == 0 { - category = 9999 - } - - title := strings.TrimSpace(r.PostFormValue("title")) - var search string - if len(title) > 0 { - search = "%" + title + "%" - if strings.HasSuffix(title, ":") { - search = title[:len(title)-1] + "%" - } - } - arg := &db.ListIncomeConditionParam{ - ProjectID: project, - BudgetID: budget, - IncomeType: category, - IsTitle: len(search) > 0, - Title: search, - Status: convertor.ConvertInt[int16](r.PostFormValue("status"), 9999), - PageID: convertor.ConvertInt[int32](r.PostFormValue("page"), 1), - PageSize: convertor.ConvertInt[int32](r.PostFormValue("rows"), 10), - } - arg.TimeBegin, arg.TimeEnd = convertor.DefaultStartTimeAndEndTime(r.PostFormValue("timeBegin"), r.PostFormValue("timeEnd")) - res, total, err := h.biz.IncomeV1().List(ctx, arg) - if err != nil { - h.render.JSONERR(w, err.Error()) - return - } - - data := tpl.ResponseList{ - Code: 0, - Message: "ok", - Count: total, - Data: res, - } - h.render.JSON(w, data) - default: - http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) - } -} - -func (h *incomeHandler) Add(w http.ResponseWriter, r *http.Request) { - h.render.HTML(w, r, "income/edit.tmpl", map[string]any{ - "Item": &form.IncomeForm{}, - "Statuses": html.NewSelectControls(html.Statuses, "0"), - }) -} - -func (h *incomeHandler) Edit(w http.ResponseWriter, r *http.Request) { - vars := r.URL.Query() - id := convertor.ConvertInt[int64](vars.Get("id"), 0) - income := &form.IncomeForm{} - ctx := r.Context() - if id > 0 { - if cus, err := h.biz.IncomeV1().Get(ctx, id); err == nil { - income = income.ToForm(cus) - if u, err := h.biz.SystemV1().UserBiz().Get(ctx, cus.CreatedUserID); err == nil { - income.CreatedName = u.Username - } - if u, err := h.biz.SystemV1().UserBiz().Get(ctx, cus.UpdatedUserID); err == nil { - income.UpdatedName = u.Username - } - } - } - h.render.HTML(w, r, "income/edit.tmpl", map[string]any{ - "Item": income, - "Statuses": html.NewSelectControls(html.Statuses, strconv.Itoa(int(income.Status))), - }) -} - -func (h *incomeHandler) Save(w http.ResponseWriter, r *http.Request) { - data, err := validForm(r) - if err != nil { - h.render.JSONERR(w, err.Error()) - return - } - - ctx := r.Context() - authUser := h.mi.AuthUser(ctx) - if data.ID > 0 { - arg := &db.UpdateIncomeParams{ - ID: data.ID, - ProjectID: pgtype.Int8{ - Int64: data.ProjectID, - Valid: true, - }, - BudgetID: pgtype.Int8{ - Int64: data.BudgetID, - Valid: true, - }, - Amount: data.AmountF, - IncomeAt: pgtype.Timestamptz{ - Time: data.IncomeAt, - Valid: true, - }, - IncomeType: pgtype.Int4{ - Int32: data.IncomeType, - Valid: true, - }, - IncomeBank: pgtype.Int4{ - Int32: data.IncomeBank, - Valid: true, - }, - Remark: pgtype.Text{ - String: data.Remark, - Valid: true, - }, - Status: pgtype.Int2{ - Int16: data.Status, - Valid: true, - }, - UpdatedUserID: pgtype.Int4{ - Int32: authUser.ID, - Valid: true, - }, - } - _, err := h.biz.IncomeV1().Update(ctx, arg) - if err != nil { - h.render.JSONERR(w, err.Error()) - return - } - h.render.JSONOK(w, "更新成功") - } else { - arg := &db.CreateIncomeParams{ - ProjectID: data.ProjectID, - BudgetID: data.BudgetID, - Amount: data.AmountF, - IncomeAt: data.IncomeAt, - IncomeType: data.IncomeType, - IncomeBank: data.IncomeBank, - Remark: data.Remark, - Status: data.Status, - CreatedUserID: authUser.ID, - } - _, err := h.biz.IncomeV1().Create(ctx, arg) - if err != nil { - h.render.JSONERR(w, err.Error()) - return - } - h.render.JSONOK(w, "添加成功") - } -} - -func validForm(r *http.Request) (form.IncomeForm, error) { - var err error - data := form.IncomeForm{} - data.ID = convertor.ConvertInt[int64](r.PostFormValue("ID"), 0) - - data.ProjectID, err = strconv.ParseInt(r.PostFormValue("ProjectID"), 10, 64) - if err != nil || data.ProjectID == 0 { - return data, errors.New("项目不能为空") - } - - data.BudgetID, err = strconv.ParseInt(r.PostFormValue("BudgetID"), 10, 64) - if err != nil { - data.BudgetID = 0 - } - - if err := data.AmountF.Scan(r.PostFormValue("Amount")); err != nil { - return data, errors.New("报销金额格式错误") - } - - data.IncomeAt, err = time.ParseInLocation("2006-01-02", r.PostFormValue("IncomeAt"), time.Local) - if err != nil { - return data, errors.New("回款时间格式错误") - } - - incomeType, err := strconv.ParseInt(r.PostFormValue("IncomeType"), 10, 64) - if err != nil { - return data, errors.New("收入类型数据错误") - } - data.IncomeType = int32(incomeType) - - incomeBank, err := strconv.ParseInt(r.PostFormValue("IncomeBank"), 10, 64) - if err != nil { - return data, errors.New("收入银行数据错误") - } - data.IncomeBank = int32(incomeBank) - - data.Remark = r.PostFormValue("Remark") - data.Status = convertor.ConvertInt[int16](r.PostFormValue("Status"), 9999) - return data, nil -} diff --git a/internal/erpserver/handler/project/dashboard.go b/internal/erpserver/handler/project/dashboard.go deleted file mode 100644 index ae4bd12..0000000 --- a/internal/erpserver/handler/project/dashboard.go +++ /dev/null @@ -1,369 +0,0 @@ -package project - -import ( - "context" - "fmt" - "net/http" - - "management/internal/db/model/view" - "management/internal/pkg/convertor" - "management/internal/pkg/tpl" -) - -func (h *projectHandler) Dashboard(w http.ResponseWriter, r *http.Request) { - switch r.Method { - case http.MethodGet: - pp, _ := h.biz.ProjectV1().ListHtml(r.Context()) - h.render.HTML(w, r, "project/dashboard.tmpl", map[string]any{ - "Projects": pp, - }) - case http.MethodPost: - ctx := r.Context() - t := r.PostFormValue("type") - if t == "project" { - var projectIncome float64 - var projectExpense float64 - projectID := convertor.ConvertInt[int64](r.PostFormValue("projectID"), 0) - if projectID == 0 { - si, _ := h.biz.IncomeV1().Sum(ctx) - projectIncome = convertor.NumericToFloat64(si) - se, _ := h.biz.ExpenseV1().Sum(ctx) - projectExpense = convertor.NumericToFloat64(se) - } else { - pi, _ := h.biz.IncomeV1().SumByProjectID(ctx, projectID) - projectIncome = convertor.NumericToFloat64(pi) - pe, _ := h.biz.ExpenseV1().SumByProjectID(ctx, projectID) - projectExpense = convertor.NumericToFloat64(pe) - } - - projectProfit := projectIncome - projectExpense - var projectProfitRate float64 = 0 - if projectExpense > 0 { - projectProfitRate = projectProfit / projectExpense - } - - res := &view.DashboardProject{ - ProjectIncome: projectIncome, - ProjectExpense: projectExpense, - ProjectProfit: projectProfit, - ProjectProfitRate: fmt.Sprintf("%0.2f%%", projectProfitRate*100), - IncomeExpenseEcharts: h.incomeExpenseEcharts(ctx, projectID), - IncomeEcharts: h.incomeEcharts(ctx, projectID), - ExpenseEcharts: h.expenseEcharts(ctx, projectID), - } - h.render.JSON(w, tpl.Response{Success: true, Message: "ok", Data: res}) - return - } else if t == "budget" { - } - h.render.JSONERR(w, "failed to valid type") - default: - http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) - } -} - -func (h *projectHandler) incomeExpenseEcharts(ctx context.Context, projectId int64) view.EchartsOption { - var name []string - var income []float64 - var expense []float64 - - if projectId == 0 { - rows, err := h.biz.ProjectV1().Statistics(ctx) - if err != nil || len(rows) == 0 { - return view.EchartsOption{} - } - - for _, row := range rows { - name = append(name, row.Name) - income = append(income, convertor.NumericToFloat64(row.Income)) - expense = append(expense, convertor.NumericToFloat64(row.Expense)) - } - } else { - row, err := h.biz.ProjectV1().StatisticsItem(ctx, projectId) - if err != nil || row == nil { - return view.EchartsOption{} - } - name = append(name, row.Name) - income = append(income, convertor.NumericToFloat64(row.Income)) - expense = append(expense, convertor.NumericToFloat64(row.Expense)) - } - - return view.EchartsOption{ - Title: view.Title{ - Text: "项目收支情况", - Left: "center", - Top: 2, - FontSize: 15, - TextStyle: view.TextStyle{ - Color: "#666666", - FontWeight: "normal", - }, - }, - Color: []string{"#fed46b", "#2194ff"}, - ToolTip: view.ToolTip{ - Trigger: "axis", - AxisPointer: view.AxisPointer{ - Type: "shadow", - }, - }, - Grid: view.Grid{ - Left: "3%", - Right: "4%", - Bottom: "10%", - ContainLabel: true, - }, - Legend: view.Legend{ - Left: "center", - Top: "bottom", - Data: []string{"支出金额", "收入金额"}, - }, - XAxis: []view.XAxis{ - { - Type: "category", - Data: name, - AxisTick: view.AxisTick{ - AlignWithLabel: true, - }, - }, - }, - YAxis: []view.YAxis{ - { - Type: "value", - Name: "单位:元", - }, - }, - BarMaxWidth: "30", - Label: view.Label{ - Show: true, - Position: "top", - }, - Series: []view.Series{ - { - Name: "支出金额", - Type: "bar", - Data: expense, - ItemStyle: view.ItemStyle{ - Normal: view.Normal{ - Color: "#f89588", - }, - }, - }, - { - Name: "收入金额", - Type: "bar", - Data: income, - ItemStyle: view.ItemStyle{ - Normal: view.Normal{ - Color: "#76da91", - }, - }, - }, - }, - } -} - -func (h *projectHandler) incomeEcharts(ctx context.Context, projectId int64) view.EchartsOption { - var name []string - data := []view.DataItem{} - - if projectId == 0 { - rows, err := h.biz.IncomeV1().Statistics(ctx) - if err != nil || len(rows) == 0 { - return view.EchartsOption{} - } - - for _, row := range rows { - name = append(name, row.IncomeTypeName) - data = append(data, view.DataItem{ - Name: row.IncomeTypeName, - Value: convertor.NumericToFloat64(row.TotalAmount), - }) - } - } else { - rows, err := h.biz.IncomeV1().StatisticsByProjectID(ctx, projectId) - if err != nil || len(rows) == 0 { - return view.EchartsOption{} - } - - for _, row := range rows { - name = append(name, row.IncomeTypeName) - data = append(data, view.DataItem{ - Name: row.IncomeTypeName, - Value: convertor.NumericToFloat64(row.TotalAmount), - }) - } - } - - return view.EchartsOption{ - Title: view.Title{ - Text: "收入分布", - Left: "center", - Orient: "vertical", - FontSize: 15, - TextStyle: view.TextStyle{ - Color: "#666666", - FontWeight: "normal", - }, - }, - ToolTip: view.ToolTip{ - Trigger: "item", - }, - Legend: view.Legend{ - Left: "center", - Top: "bottom", - Data: name, - }, - Color: []string{"#63b2ee", "#76da91", "#f8cb7f", "#f89588", "#7cd6cf", "#9192ab", "#7898e1", "#efa666", "#eddd86", "#9987ce", "#63b2ee", "#76da91"}, - Series: []view.Series{ - { - Type: "pie", - Radius: "50%", - Data: data, - Label: view.Label{ - Show: true, - TextStyle: view.TextStyle{ - Color: "#666666", - }, - Normal: view.LableNormal{ - Formatter: "{c} ({d}%)", - TextStyle: view.TextStyle{ - Color: "#666666", - FontWeight: "normal", - }, - }, - }, - }, - }, - } -} - -func (h *projectHandler) expenseEcharts(ctx context.Context, projectId int64) view.EchartsOption { - var name []string - data := []view.DataItem{} - - if projectId == 0 { - rows, err := h.biz.ExpenseV1().Statistics(ctx) - if err != nil || len(rows) == 0 { - return view.EchartsOption{} - } - - for _, row := range rows { - name = append(name, row.ExpensesTypeName) - data = append(data, view.DataItem{ - Name: row.ExpensesTypeName, - Value: convertor.NumericToFloat64(row.TotalAmount), - }) - } - } else { - rows, err := h.biz.ExpenseV1().StatisticsByProjectID(ctx, projectId) - if err != nil || len(rows) == 0 { - return view.EchartsOption{} - } - - for _, row := range rows { - name = append(name, row.ExpensesTypeName) - data = append(data, view.DataItem{ - Name: row.ExpensesTypeName, - Value: convertor.NumericToFloat64(row.TotalAmount), - }) - } - } - - return view.EchartsOption{ - Title: view.Title{ - Text: "支出分布", - Left: "center", - Orient: "vertical", - FontSize: 15, - TextStyle: view.TextStyle{ - Color: "#666666", - FontWeight: "normal", - }, - }, - ToolTip: view.ToolTip{ - Trigger: "item", - }, - Legend: view.Legend{ - Left: "center", - Top: "bottom", - Data: name, - }, - Color: []string{"#63b2ee", "#76da91", "#f8cb7f", "#f89588", "#7cd6cf", "#9192ab", "#7898e1", "#efa666", "#eddd86", "#9987ce", "#63b2ee", "#76da91"}, - Series: []view.Series{ - { - Type: "pie", - Radius: "50%", - Data: data, - Label: view.Label{ - Show: true, - TextStyle: view.TextStyle{ - Color: "#666666", - }, - Normal: view.LableNormal{ - Formatter: "{c} ({d}%)", - TextStyle: view.TextStyle{ - Color: "#666666", - FontWeight: "normal", - }, - }, - }, - }, - }, - } - - // return view.EchartsOption{ - // Title: view.Title{ - // Text: "支出分布", - // Left: "center", - // Top: 2, - // FontSize: 15, - // TextStyle: view.TextStyle{ - // Color: "#666666", - // FontWeight: "normal", - // }, - // }, - // Color: []string{"#fed46b", "#2194ff"}, - // ToolTip: view.ToolTip{ - // Trigger: "axis", - // AxisPointer: view.AxisPointer{ - // Type: "shadow", - // }, - // }, - // Grid: view.Grid{ - // Left: "3%", - // Right: "4%", - // Bottom: "10%", - // ContainLabel: true, - // }, - // XAxis: []view.XAxis{ - // { - // Type: "category", - // Data: name, - // AxisTick: view.AxisTick{ - // AlignWithLabel: true, - // }, - // }, - // }, - // YAxis: []view.YAxis{ - // { - // Type: "value", - // Name: "单位:元", - // }, - // }, - // BarMaxWidth: "30", - // Label: view.Label{ - // Show: true, - // Position: "top", - // }, - // Series: []view.Series{ - // { - // Type: "bar", - // Data: expense, - // ItemStyle: view.ItemStyle{ - // Normal: view.Normal{ - // Color: "#f89588", - // }, - // }, - // }, - // }, - // } -} diff --git a/internal/erpserver/handler/project/project.go b/internal/erpserver/handler/project/project.go deleted file mode 100644 index d60119b..0000000 --- a/internal/erpserver/handler/project/project.go +++ /dev/null @@ -1,337 +0,0 @@ -package project - -import ( - "errors" - "net/http" - "strconv" - "strings" - "time" - - formDto "management/internal/db/model/form" - db "management/internal/db/sqlc" - "management/internal/erpserver/biz" - "management/internal/pkg/convertor" - "management/internal/pkg/middleware" - "management/internal/pkg/snowflake" - "management/internal/pkg/tpl" - "management/internal/pkg/tpl/html" - - "github.com/jackc/pgx/v5/pgtype" -) - -type ProjectHandler interface { - List(w http.ResponseWriter, r *http.Request) - Add(w http.ResponseWriter, r *http.Request) - Edit(w http.ResponseWriter, r *http.Request) - Save(w http.ResponseWriter, r *http.Request) - Data(w http.ResponseWriter, r *http.Request) - Dashboard(w http.ResponseWriter, r *http.Request) -} - -type projectHandler struct { - render tpl.Renderer - biz biz.IBiz - mi middleware.Middleware -} - -var _ ProjectHandler = (*projectHandler)(nil) - -func NewProjectHandler(render tpl.Renderer, biz biz.IBiz, mi middleware.Middleware) *projectHandler { - return &projectHandler{ - render: render, - biz: biz, - mi: mi, - } -} - -func (h *projectHandler) List(w http.ResponseWriter, r *http.Request) { - switch r.Method { - case http.MethodGet: - h.render.HTML(w, r, "project/list.tmpl", map[string]any{ - "Statuses": html.NewSelectControls(html.ProjectStatuses, "0"), - }) - case http.MethodPost: - title := strings.TrimSpace(r.PostFormValue("title")) - var search string - if len(title) > 0 { - search = "%" + title + "%" - if strings.HasSuffix(title, ":") { - search = title[:len(title)-1] + "%" - } - } - arg := &db.ListProjectConditionParam{ - IsTitle: len(search) > 0, - Title: search, - Status: convertor.ConvertInt[int16](r.PostFormValue("status"), 9999), - PageID: convertor.ConvertInt[int32](r.PostFormValue("page"), 1), - PageSize: convertor.ConvertInt[int32](r.PostFormValue("rows"), 10), - } - arg.TimeBegin, arg.TimeEnd = convertor.DefaultStartTimeAndEndTime(r.PostFormValue("timeBegin"), r.PostFormValue("timeEnd")) - res, total, err := h.biz.ProjectV1().List(r.Context(), arg) - if err != nil { - h.render.JSONERR(w, err.Error()) - return - } - - data := tpl.ResponseList{ - Code: 0, - Message: "ok", - Count: total, - Data: res, - } - h.render.JSON(w, data) - default: - http.Error(w, "Method Not Allowed", http.StatusMethodNotAllowed) - } -} - -func (h *projectHandler) Add(w http.ResponseWriter, r *http.Request) { - authUser := h.mi.AuthUser(r.Context()) - h.render.HTML(w, r, "project/edit.tmpl", map[string]any{ - "Item": &formDto.ProjectForm{ - ApplyUserID: authUser.ID, - ProjectFiles: &formDto.ProjectFileForm{ - ProjectFileItems: []*formDto.ProjectFileItemForm{}, - }, - }, - "Statuses": html.NewSelectControls(html.ProjectStatuses, "0"), - }) -} - -func (h *projectHandler) Edit(w http.ResponseWriter, r *http.Request) { - form := &formDto.ProjectForm{} - id := convertor.ConvertInt[int64](r.URL.Query().Get("id"), 0) - if id > 0 { - ctx := r.Context() - if po, err := h.biz.ProjectV1().Get(ctx, id); err == nil { - pfs, err := h.biz.ProjectV1().ListProjectFiles(ctx, po.ID) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - form = form.ToForm(po, pfs) - if form.ApplyUserID == 0 { - authUser := h.mi.AuthUser(ctx) - form.ApplyUserID = authUser.ID - } - // if c, err := db.Engine.GetCustomer(ctx, po.CustomerID); err == nil { - // form.CustomerName = c.Name - // } - if u, err := h.biz.SystemV1().UserBiz().Get(ctx, po.CreatedUserID); err == nil { - form.CreatedName = u.Username - } - if u, err := h.biz.SystemV1().UserBiz().Get(ctx, po.UpdatedUserID); err == nil { - form.UpdatedName = u.Username - } - } - } - h.render.HTML(w, r, "project/edit.tmpl", map[string]any{ - "Item": form, - "Statuses": html.NewSelectControls(html.ProjectStatuses, strconv.Itoa(int(form.Status))), - }) -} - -func (h *projectHandler) Save(w http.ResponseWriter, r *http.Request) { - ctx := r.Context() - form, err := validForm(r) - if err != nil { - h.render.JSONERR(w, err.Error()) - return - } - - authUser := h.mi.AuthUser(ctx) - if form.ID > 0 { - p := &db.UpdateProjectParams{ - ID: form.ID, - Name: pgtype.Text{ - String: form.Name, - Valid: true, - }, - StartAt: pgtype.Timestamptz{ - Time: form.StartAt, - Valid: true, - }, - EndAt: pgtype.Timestamptz{ - Time: form.EndAt, - Valid: true, - }, - CustomerID: pgtype.Int8{ - Int64: form.CustomerID, - Valid: true, - }, - TotalMoney: form.TotalMoneyF, - Description: pgtype.Text{ - String: form.Description, - Valid: true, - }, - ApplyAt: pgtype.Timestamptz{ - Time: form.ApplyAt, - Valid: true, - }, - ApplyUserID: pgtype.Int4{ - Int32: form.ApplyUserID, - Valid: true, - }, - ManagerID: pgtype.Int4{ - Int32: form.ManagerID, - Valid: true, - }, - Members: pgtype.Text{ - String: form.Members, - Valid: true, - }, - Status: pgtype.Int2{ - Int16: form.Status, - Valid: true, - }, - UpdatedUserID: pgtype.Int4{ - Int32: authUser.ID, - Valid: true, - }, - } - cpfs := []*db.CreateProjectFileParams{} - for _, pfile := range form.ProjectFiles.ProjectFileItems { - cpfs = append(cpfs, &db.CreateProjectFileParams{ - ID: snowflake.GetId(), - Name: pfile.Name, - Path: pfile.Path, - ProjectID: form.ID, - CreatedUserID: authUser.ID, - }) - } - err := h.biz.ProjectV1().Update(ctx, p, cpfs) - if err != nil { - h.render.JSONERR(w, err.Error()) - return - } - h.render.JSONOK(w, "更新成功") - } else { - p := &db.CreateProjectParams{ - ID: snowflake.GetId(), - Name: form.Name, - StartAt: form.StartAt, - EndAt: form.EndAt, - CustomerID: form.CustomerID, - TotalMoney: form.TotalMoneyF, - Description: form.Description, - ApplyAt: form.ApplyAt, - ApplyUserID: form.ApplyUserID, - ManagerID: form.ManagerID, - Members: form.Members, - Status: form.Status, - CreatedUserID: authUser.ID, - } - cpfs := []*db.CreateProjectFileParams{} - for _, pfile := range form.ProjectFiles.ProjectFileItems { - cpfs = append(cpfs, &db.CreateProjectFileParams{ - ID: snowflake.GetId(), - Name: pfile.Name, - Path: pfile.Path, - ProjectID: p.ID, - CreatedUserID: authUser.ID, - }) - } - err := h.biz.ProjectV1().Create(ctx, p, cpfs) - if err != nil { - h.render.JSONERR(w, err.Error()) - return - } - h.render.JSONOK(w, "添加成功") - } -} - -func (h *projectHandler) Data(w http.ResponseWriter, r *http.Request) { - vars := r.URL.Query() - t := vars.Get("type") - if t == "xmselect" { - res, err := h.biz.ProjectV1().XmSelect(r.Context()) - if err != nil { - h.render.JSONERR(w, err.Error()) - return - } - - h.render.JSON(w, res) - return - } - - h.render.JSON(w, nil) -} - -func validForm(r *http.Request) (formDto.ProjectForm, error) { - var err error - form := formDto.ProjectForm{} - - form.ID = convertor.ConvertInt[int64](r.PostFormValue("ID"), 0) - form.CustomerID, err = strconv.ParseInt(r.PostFormValue("CustomerID"), 10, 64) - if err != nil || form.CustomerID == 0 { - return form, errors.New("客户不能为空") - } - - form.Name = r.PostFormValue("Name") - if len(form.Name) == 0 { - return form, errors.New("名称不能为空") - } - form.StartAt, err = time.ParseInLocation("2006-01-02", r.PostFormValue("StartAt"), time.Local) - if err != nil { - return form, errors.New("开始时间格式错误") - } - form.EndAt, err = time.ParseInLocation("2006-01-02", r.PostFormValue("EndAt"), time.Local) - if err != nil { - return form, errors.New("结束时间格式错误") - } - - if err := form.TotalMoneyF.Scan(r.PostFormValue("TotalMoney")); err != nil { - return form, errors.New("总金额格式错误") - } - - form.Description = r.PostFormValue("Description") - form.ApplyAt, err = time.ParseInLocation("2006-01-02", r.PostFormValue("ApplyAt"), time.Local) - if err != nil { - return form, errors.New("申请时间格式错误") - } - form.ApplyUserID = convertor.ConvertInt[int32](r.PostFormValue("ApplyUserID"), 0) - if form.ApplyUserID == 0 { - return form, errors.New("申请人不能为空") - } - - form.ManagerID = convertor.ConvertInt[int32](r.PostFormValue("ManagerID"), 0) - if form.ManagerID == 0 { - return form, errors.New("项目经理不能为空") - } - - form.Members = r.PostFormValue("Members") - if len(form.Members) > 0 { - membersSplit := strings.SplitSeq(form.Members, ",") - for v := range membersSplit { - m := convertor.ConvertInt[int32](v, 0) - if m == 0 { - return form, errors.New("项目成员数据错误") - } - } - } - - form.Status = convertor.ConvertInt[int16](r.PostFormValue("Status"), 9999) - - form.ProjectFiles = &formDto.ProjectFileForm{ - ProjectFileItems: []*formDto.ProjectFileItemForm{}, - } - fns := r.PostFormValue("Paths") - if len(fns) > 0 { - fnsSplit := strings.SplitSeq(fns, ",") - for v := range fnsSplit { - if len(v) > 0 { - read := strings.Split(v, "|") - if len(read) != 2 { - return form, errors.New("文件路径数据错误") - } - pff := &formDto.ProjectFileItemForm{ - Name: read[0], - Path: read[1], - Combination: v, - } - form.ProjectFiles.ProjectFileItems = append(form.ProjectFiles.ProjectFileItems, pff) - } - } - } - return form, nil -} diff --git a/internal/erpserver/handler/system/audit.go b/internal/erpserver/handler/system/audit.go index 03857e7..5cf5046 100644 --- a/internal/erpserver/handler/system/audit.go +++ b/internal/erpserver/handler/system/audit.go @@ -3,7 +3,7 @@ package system import ( "net/http" - "management/internal/db/model/dto" + "management/internal/erpserver/model/dto" v1 "management/internal/erpserver/service/v1" "management/internal/pkg/convertor" "management/internal/pkg/tpl" diff --git a/internal/erpserver/handler/system/category.go b/internal/erpserver/handler/system/category.go deleted file mode 100644 index 15fede1..0000000 --- a/internal/erpserver/handler/system/category.go +++ /dev/null @@ -1,173 +0,0 @@ -package system - -import ( - "net/http" - - "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" -) - -type CategoryHandler interface { - List(w http.ResponseWriter, r *http.Request) - Add(w http.ResponseWriter, r *http.Request) - AddChildren(w http.ResponseWriter, r *http.Request) - Edit(w http.ResponseWriter, r *http.Request) - Save(w http.ResponseWriter, r *http.Request) - Data(w http.ResponseWriter, r *http.Request) - Refresh(w http.ResponseWriter, r *http.Request) - RebuildParentPath(w http.ResponseWriter, r *http.Request) -} - -type categoryHandler struct { - render tpl.Renderer - biz biz.IBiz -} - -var _ CategoryHandler = (*categoryHandler)(nil) - -func NewCategoryHandler(render tpl.Renderer, biz biz.IBiz) *categoryHandler { - return &categoryHandler{ - render: render, - biz: biz, - } -} - -func (h *categoryHandler) List(w http.ResponseWriter, r *http.Request) { - switch r.Method { - case http.MethodGet: - h.render.HTML(w, r, "category/list.tmpl", nil) - case http.MethodPost: - var q dto.SearchDto - q.SearchStatus = convertor.ConvertInt(r.PostFormValue("status"), 9999) - q.SearchParentID = convertor.ConvertInt(r.PostFormValue("parentId"), 0) - q.SearchName = r.PostFormValue("name") - q.SearchID = convertor.ConvertInt[int64](r.PostFormValue("id"), 0) - q.Page = convertor.ConvertInt(r.PostFormValue("page"), 1) - q.Rows = convertor.ConvertInt(r.PostFormValue("rows"), 10) - res, count, err := h.biz.SystemV1().CategoryBiz().List(r.Context(), q) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - data := tpl.ResponseList{ - Code: 0, - Message: "ok", - Count: count, - Data: res, - } - h.render.JSON(w, data) - default: - http.Error(w, "Method Not Allowed", http.StatusMethodNotAllowed) - } -} - -func (h *categoryHandler) Add(w http.ResponseWriter, r *http.Request) { - h.render.HTML(w, r, "category/edit.tmpl", map[string]any{ - "Item": &db.Category{Sort: 6666}, - }) -} - -func (h *categoryHandler) AddChildren(w http.ResponseWriter, r *http.Request) { - vars := r.URL.Query() - parentID := convertor.QueryInt[int32](vars, "parentID", 0) - vm := &db.Category{ParentID: parentID, Sort: 6666} - h.render.HTML(w, r, "category/edit.tmpl", map[string]any{ - "Item": vm, - }) -} - -func (h *categoryHandler) Edit(w http.ResponseWriter, r *http.Request) { - vars := r.URL.Query() - id := convertor.QueryInt[int32](vars, "id", 0) - vm := &db.Category{Sort: 6666} - if id > 0 { - vm, _ = h.biz.SystemV1().CategoryBiz().Get(r.Context(), id) - } - h.render.HTML(w, r, "category/edit.tmpl", map[string]any{ - "Item": vm, - }) -} - -func (h *categoryHandler) Save(w http.ResponseWriter, r *http.Request) { - var req form.Category - if err := binding.Form.Bind(r, &req); err != nil { - h.render.JSONERR(w, binding.ValidatorErrors(err)) - return - } - - if *req.ID == 0 { - err := h.biz.SystemV1().CategoryBiz().Create(r.Context(), &req) - if err != nil { - h.render.JSONERR(w, err.Error()) - return - } - h.render.JSONOK(w, "添加成功") - } else { - err := h.biz.SystemV1().CategoryBiz().Update(r.Context(), &req) - if err != nil { - h.render.JSONERR(w, err.Error()) - return - } - h.render.JSONOK(w, "更新成功") - } -} - -func (h *categoryHandler) Data(w http.ResponseWriter, r *http.Request) { - ctx := r.Context() - vars := r.URL.Query() - t := vars.Get("type") - if t == "tree" { - res, err := h.biz.SystemV1().CategoryBiz().Tree(ctx, 0) - if err != nil { - h.render.JSONERR(w, err.Error()) - return - } - - h.render.JSON(w, res) - return - } else if t == "xmselect_tree" { - res, err := h.biz.SystemV1().CategoryBiz().XmSelectTree(ctx, 0) - if err != nil { - h.render.JSONERR(w, err.Error()) - return - } - - h.render.JSON(w, res) - return - } else if t == "xmselect" { - res, err := h.biz.SystemV1().CategoryBiz().XmSelect(ctx, vars.Get("letter")) - if err != nil { - h.render.JSONERR(w, err.Error()) - return - } - - h.render.JSON(w, res) - return - } -} - -func (h *categoryHandler) Refresh(w http.ResponseWriter, r *http.Request) { - _, err := h.biz.SystemV1().CategoryBiz().Refresh(r.Context()) - if err != nil { - h.render.JSONERR(w, err.Error()) - return - } - - h.render.JSONOK(w, "刷新成功") -} - -func (h *categoryHandler) RebuildParentPath(w http.ResponseWriter, r *http.Request) { - err := h.biz.SystemV1().CategoryBiz().RebuildParentPath(r.Context()) - if err != nil { - h.render.JSONERR(w, err.Error()) - return - } - - h.render.JSONOK(w, "重建成功") -} diff --git a/internal/erpserver/handler/system/config.go b/internal/erpserver/handler/system/config.go index db8324b..be0172e 100644 --- a/internal/erpserver/handler/system/config.go +++ b/internal/erpserver/handler/system/config.go @@ -4,11 +4,11 @@ import ( "net/http" "strings" - "management/internal/db/model/dto" - db "management/internal/db/sqlc" + "management/internal/erpserver/model/dto" systemmodel "management/internal/erpserver/model/system" systemsvc "management/internal/erpserver/service/v1" "management/internal/pkg/convertor" + "management/internal/pkg/database" "management/internal/pkg/redis" "management/internal/pkg/tpl" ) @@ -76,7 +76,7 @@ func (h *configHandler) Save(w http.ResponseWriter, r *http.Request) { } err := h.configsvc.Create(ctx, arg) if err != nil { - if db.IsUniqueViolation(err) { + if database.IsUniqueViolation(err) { h.render.JSONERR(w, "数据已存在") return } diff --git a/internal/erpserver/handler/system/department.go b/internal/erpserver/handler/system/department.go index 9e80f31..1e8b37e 100644 --- a/internal/erpserver/handler/system/department.go +++ b/internal/erpserver/handler/system/department.go @@ -3,7 +3,7 @@ package system import ( "net/http" - "management/internal/db/model/dto" + "management/internal/erpserver/model/dto" "management/internal/erpserver/model/form" systemmodel "management/internal/erpserver/model/system" v1 "management/internal/erpserver/service/v1" diff --git a/internal/erpserver/handler/system/login_log.go b/internal/erpserver/handler/system/login_log.go index ce96027..da324eb 100644 --- a/internal/erpserver/handler/system/login_log.go +++ b/internal/erpserver/handler/system/login_log.go @@ -3,7 +3,7 @@ package system import ( "net/http" - "management/internal/db/model/dto" + "management/internal/erpserver/model/dto" v1 "management/internal/erpserver/service/v1" "management/internal/pkg/convertor" "management/internal/pkg/tpl" diff --git a/internal/erpserver/handler/system/menu.go b/internal/erpserver/handler/system/menu.go index 59da6a0..9608508 100644 --- a/internal/erpserver/handler/system/menu.go +++ b/internal/erpserver/handler/system/menu.go @@ -6,10 +6,10 @@ import ( "strings" "time" - db "management/internal/db/sqlc" systemmodel "management/internal/erpserver/model/system" v1 "management/internal/erpserver/service/v1" "management/internal/pkg/convertor" + "management/internal/pkg/database" "management/internal/pkg/middleware" "management/internal/pkg/tpl" @@ -155,7 +155,7 @@ func (h *menuHandler) Save(w http.ResponseWriter, r *http.Request) { } err := h.svc.Create(ctx, arg) if err != nil { - if db.IsUniqueViolation(err) { + if database.IsUniqueViolation(err) { h.render.JSONERR(w, "菜单已存在") return } diff --git a/internal/erpserver/handler/system/role.go b/internal/erpserver/handler/system/role.go index 65f2b54..20d5013 100644 --- a/internal/erpserver/handler/system/role.go +++ b/internal/erpserver/handler/system/role.go @@ -4,7 +4,7 @@ import ( "net/http" "strings" - "management/internal/db/model/dto" + "management/internal/erpserver/model/dto" "management/internal/erpserver/model/form" "management/internal/erpserver/model/system" v1 "management/internal/erpserver/service/v1" diff --git a/internal/erpserver/handler/system/user.go b/internal/erpserver/handler/system/user.go index b18a8e7..26527dd 100644 --- a/internal/erpserver/handler/system/user.go +++ b/internal/erpserver/handler/system/user.go @@ -4,8 +4,7 @@ import ( "log" "net/http" - "management/internal/db/model/dto" - db "management/internal/db/sqlc" + "management/internal/erpserver/model/dto" "management/internal/erpserver/model/form" systemmodel "management/internal/erpserver/model/system" v1 "management/internal/erpserver/service/v1" @@ -47,7 +46,7 @@ func NewUserHandler( func (h *userHandler) Add(w http.ResponseWriter, r *http.Request) { h.render.HTML(w, r, "user/edit.tmpl", map[string]any{ - "Item": &db.SysUser{ + "Item": &systemmodel.User{ HashedPassword: nil, }, }) diff --git a/internal/erpserver/http.go b/internal/erpserver/http.go deleted file mode 100644 index a44c98a..0000000 --- a/internal/erpserver/http.go +++ /dev/null @@ -1,207 +0,0 @@ -package erpserver - -// import ( -// "net/http" - -// "management/internal/erpserver/handler" -// mw "management/internal/pkg/middleware" - -// "github.com/go-chi/chi/v5" -// "github.com/go-chi/chi/v5/middleware" -// ) - -// func NewRouter(handler handler.IHandler, mw mw.Middleware) *chi.Mux { -// r := chi.NewRouter() - -// r.Use(middleware.RequestID) -// r.Use(middleware.RealIP) -// // r.Use(middleware.Logger) -// r.Use(middleware.Recoverer) - -// staticServer := http.FileServer(http.Dir("./web/statics/")) -// r.Handle("/statics/*", http.StripPrefix("/statics", staticServer)) - -// uploadServer := http.FileServer(http.Dir("./upload/")) -// r.Handle("/upload/*", http.StripPrefix("/upload", uploadServer)) - -// r.Group(func(r chi.Router) { -// r.Use(mw.NoSurf) // CSRF -// r.Use(mw.LoadSession) // Session - -// // capthchaHandler := common.NewCaptchaHandler(handler)) -// // r.Get("/captcha", handler.CommonHandler().CaptchaHandler().Captcha) - -// r.Get("/", handler.SystemHandler().UserHandler().Login) -// r.Post("/login", handler.SystemHandler().UserHandler().Login) -// r.Get("/logout", handler.SystemHandler().UserHandler().Logout) - -// r.With(mw.Authorize, mw.Audit).Post("/upload/img", handler.CommonHandler().UploadHandler().Img) -// r.With(mw.Authorize, mw.Audit).Post("/upload/file", handler.CommonHandler().UploadHandler().File) -// r.With(mw.Authorize, mw.Audit).Post("/upload/mutilfile", handler.CommonHandler().UploadHandler().MutilFiles) - -// r.With(mw.Authorize).Get("/home.html", handler.SystemHandler().Home) -// r.With(mw.Authorize).Get("/dashboard", handler.SystemHandler().Dashboard) -// r.With(mw.Authorize).Get("/pear.json", handler.SystemHandler().ConfigHandler().Pear) - -// r.Route("/system", func(r chi.Router) { -// r.Use(mw.Authorize) - -// r.Route("/config", func(r chi.Router) { -// r.Use(mw.Audit) -// r.Get("/list", handler.SystemHandler().ConfigHandler().List) -// r.Post("/list", handler.SystemHandler().ConfigHandler().List) -// r.Get("/add", handler.SystemHandler().ConfigHandler().Add) -// r.Get("/edit", handler.SystemHandler().ConfigHandler().Edit) -// r.Post("/save", handler.SystemHandler().ConfigHandler().Save) -// r.Post("/reset_pear", handler.SystemHandler().ConfigHandler().ResetPear) -// r.Post("/refresh", handler.SystemHandler().ConfigHandler().Refresh) -// }) - -// r.Route("/department", func(r chi.Router) { -// r.Use(mw.Audit) -// r.Get("/list", handler.SystemHandler().DepartmentHandler().List) -// r.Post("/list", handler.SystemHandler().DepartmentHandler().List) -// r.Get("/add", handler.SystemHandler().DepartmentHandler().Add) -// r.Get("/add_children", handler.SystemHandler().DepartmentHandler().AddChildren) -// r.Get("/edit", handler.SystemHandler().DepartmentHandler().Edit) -// r.Post("/save", handler.SystemHandler().DepartmentHandler().Save) -// r.Post("/data", handler.SystemHandler().DepartmentHandler().Data) -// r.Post("/refresh", handler.SystemHandler().DepartmentHandler().Refresh) -// r.Post("/rebuild_parent_path", handler.SystemHandler().DepartmentHandler().RebuildParentPath) -// }) - -// r.Route("/role", func(r chi.Router) { -// r.Use(mw.Audit) -// r.Get("/list", handler.SystemHandler().RoleHandler().List) -// r.Post("/list", handler.SystemHandler().RoleHandler().List) -// r.Get("/add", handler.SystemHandler().RoleHandler().Add) -// r.Get("/add_children", handler.SystemHandler().RoleHandler().AddChildren) -// r.Get("/edit", handler.SystemHandler().RoleHandler().Edit) -// r.Post("/save", handler.SystemHandler().RoleHandler().Save) -// r.Post("/data", handler.SystemHandler().RoleHandler().Data) -// r.Post("/refresh", handler.SystemHandler().RoleHandler().Refresh) -// r.Post("/rebuild_parent_path", handler.SystemHandler().RoleHandler().RebuildParentPath) -// r.Post("/refresh_role_menus", handler.SystemHandler().RoleHandler().RefreshRoleMenus) -// r.Get("/set_menu", handler.SystemHandler().RoleHandler().SetMenu) -// r.Post("/set_menu", handler.SystemHandler().RoleHandler().SetMenu) -// }) - -// r.Route("/user", func(r chi.Router) { -// r.Get("/list", handler.SystemHandler().UserHandler().List) -// r.Post("/list", handler.SystemHandler().UserHandler().List) -// r.Get("/add", handler.SystemHandler().UserHandler().Add) -// r.Get("/edit", handler.SystemHandler().UserHandler().Edit) -// r.Post("/save", handler.SystemHandler().UserHandler().Save) -// r.Get("/profile", handler.SystemHandler().UserHandler().Profile) -// r.Post("/data", handler.SystemHandler().UserHandler().Data) -// }) - -// r.Route("/login_log", func(r chi.Router) { -// r.Get("/list", handler.SystemHandler().LoginLogHandler().List) -// r.Post("/list", handler.SystemHandler().LoginLogHandler().List) -// }) - -// r.Route("/audit_log", func(r chi.Router) { -// r.Get("/list", handler.SystemHandler().AuditHandler().List) -// r.Post("/list", handler.SystemHandler().AuditHandler().List) -// }) - -// r.Get("/menus", handler.SystemHandler().MenuHandler().Menus) -// r.Route("/menu", func(r chi.Router) { -// r.Use(mw.Audit) -// r.Get("/list", handler.SystemHandler().MenuHandler().List) -// r.Post("/list", handler.SystemHandler().MenuHandler().List) -// r.Get("/add", handler.SystemHandler().MenuHandler().Add) -// r.Get("/add_children", handler.SystemHandler().MenuHandler().AddChildren) -// r.Get("/edit", handler.SystemHandler().MenuHandler().Edit) -// r.Post("/save", handler.SystemHandler().MenuHandler().Save) -// r.Post("/data", handler.SystemHandler().MenuHandler().Data) -// r.Post("/refresh_cache", handler.SystemHandler().MenuHandler().Refresh) -// }) - -// r.Route("/category", func(r chi.Router) { -// r.Use(mw.Audit) -// r.Get("/list", handler.SystemHandler().CategoryHandler().List) -// r.Post("/list", handler.SystemHandler().CategoryHandler().List) -// r.Get("/add", handler.SystemHandler().CategoryHandler().Add) -// r.Get("/add_children", handler.SystemHandler().CategoryHandler().AddChildren) -// r.Get("/edit", handler.SystemHandler().CategoryHandler().Edit) -// r.Post("/save", handler.SystemHandler().CategoryHandler().Save) -// r.Post("/data", handler.SystemHandler().CategoryHandler().Data) -// r.Post("/refresh", handler.SystemHandler().CategoryHandler().Refresh) -// r.Post("/rebuild_parent_path", handler.SystemHandler().CategoryHandler().RebuildParentPath) -// }) -// }) - -// // 客户 -// r.Route("/customer", func(r chi.Router) { -// r.Use(mw.Authorize) -// r.Get("/list", handler.CustomerHandler().List) -// r.Post("/list", handler.CustomerHandler().List) -// r.Get("/add", handler.CustomerHandler().Add) -// r.Get("/edit", handler.CustomerHandler().Edit) -// r.Post("/save", handler.CustomerHandler().Save) -// }) - -// // 项目 -// r.Route("/project", func(r chi.Router) { -// r.Use(mw.Authorize) -// r.Get("/list", handler.ProjectHandler().List) -// r.Post("/list", handler.ProjectHandler().List) -// r.Get("/add", handler.ProjectHandler().Add) -// r.Get("/edit", handler.ProjectHandler().Edit) -// r.Post("/save", handler.ProjectHandler().Save) -// r.Post("/data", handler.ProjectHandler().Data) -// r.Get("/dashboard", handler.ProjectHandler().Dashboard) -// r.Post("/dashboard", handler.ProjectHandler().Dashboard) -// }) - -// // 项目预算 -// r.Route("/budget", func(r chi.Router) { -// r.Use(mw.Authorize) -// r.Get("/list", handler.BudgetHandler().List) -// r.Post("/list", handler.BudgetHandler().List) -// r.Get("/add", handler.BudgetHandler().Add) -// r.Get("/edit", handler.BudgetHandler().Edit) -// r.Post("/save", handler.BudgetHandler().Save) -// r.Post("/data", handler.BudgetHandler().Data) -// }) - -// // 回款单 -// r.Route("/income", func(r chi.Router) { -// r.Use(mw.Authorize) -// r.Get("/list", handler.IncomeHandler().List) -// r.Post("/list", handler.IncomeHandler().List) -// r.Get("/add", handler.IncomeHandler().Add) -// r.Get("/edit", handler.IncomeHandler().Edit) -// r.Post("/save", handler.IncomeHandler().Save) -// }) - -// // 费用报销单 -// r.Route("/expense", func(r chi.Router) { -// r.Use(mw.Authorize) -// r.Get("/list", handler.ExpenseHandler().List) -// r.Post("/list", handler.ExpenseHandler().List) -// r.Get("/add", handler.ExpenseHandler().Add) -// r.Get("/edit", handler.ExpenseHandler().Edit) -// r.Post("/save", handler.ExpenseHandler().Save) -// }) -// }) - -// return r -// } - -/* - -我现在要设计一个订单号,要求如下: -1、可读性强,但不能被预测:包含:业务标识(订单、支付),便于人工识别。 -2、唯一性:确保全局唯一,不能重复(特别是高并发场景下)。 -3、值递增:生成的订单号都是递增,可排序。 -4、高性能:支持高并发生成,避免阻塞或延迟,设计的时候尽量考虑内存生成,最差也是基于Redis生成。 -5、能适应分库分表:订单号中包括分库分表信息,方便路由。 -6、分布式部署:以服务的方式对外提供,集群部署避免单点瓶颈, - -用golang语言开发 -该chat使用中文交流 - -*/ diff --git a/internal/db/model/dto/authorize_user.go b/internal/erpserver/model/dto/authorize_user.go similarity index 100% rename from internal/db/model/dto/authorize_user.go rename to internal/erpserver/model/dto/authorize_user.go diff --git a/internal/db/model/dto/menu_ui_dto.go b/internal/erpserver/model/dto/menu_ui_dto.go similarity index 100% rename from internal/db/model/dto/menu_ui_dto.go rename to internal/erpserver/model/dto/menu_ui_dto.go diff --git a/internal/db/model/dto/pear.go b/internal/erpserver/model/dto/pear.go similarity index 100% rename from internal/db/model/dto/pear.go rename to internal/erpserver/model/dto/pear.go diff --git a/internal/db/model/dto/search.go b/internal/erpserver/model/dto/search.go similarity index 100% rename from internal/db/model/dto/search.go rename to internal/erpserver/model/dto/search.go diff --git a/internal/db/model/dto/set_menu_dto.go b/internal/erpserver/model/dto/set_menu_dto.go similarity index 100% rename from internal/db/model/dto/set_menu_dto.go rename to internal/erpserver/model/dto/set_menu_dto.go diff --git a/internal/db/model/dto/system.go b/internal/erpserver/model/dto/system.go similarity index 100% rename from internal/db/model/dto/system.go rename to internal/erpserver/model/dto/system.go diff --git a/internal/db/model/dto/tree.go b/internal/erpserver/model/dto/tree.go similarity index 100% rename from internal/db/model/dto/tree.go rename to internal/erpserver/model/dto/tree.go diff --git a/internal/db/model/dto/xm_select.go b/internal/erpserver/model/dto/xm_select.go similarity index 100% rename from internal/db/model/dto/xm_select.go rename to internal/erpserver/model/dto/xm_select.go diff --git a/internal/erpserver/model/system/audit_log.go b/internal/erpserver/model/system/audit_log.go index 482a504..db51663 100644 --- a/internal/erpserver/model/system/audit_log.go +++ b/internal/erpserver/model/system/audit_log.go @@ -7,7 +7,7 @@ import ( "strings" "time" - "management/internal/db/model/dto" + "management/internal/erpserver/model/dto" ) type AuditLogRepository interface { diff --git a/internal/erpserver/model/system/config.go b/internal/erpserver/model/system/config.go index ae172ac..5f364ca 100644 --- a/internal/erpserver/model/system/config.go +++ b/internal/erpserver/model/system/config.go @@ -4,7 +4,7 @@ import ( "context" "time" - "management/internal/db/model/dto" + "management/internal/erpserver/model/dto" ) type ConfigRepository interface { diff --git a/internal/erpserver/model/system/department.go b/internal/erpserver/model/system/department.go index e5f6fc7..7562808 100644 --- a/internal/erpserver/model/system/department.go +++ b/internal/erpserver/model/system/department.go @@ -4,7 +4,7 @@ import ( "context" "time" - "management/internal/db/model/dto" + "management/internal/erpserver/model/dto" ) type DepartmentRepository interface { diff --git a/internal/erpserver/model/system/login_log.go b/internal/erpserver/model/system/login_log.go index f555976..7503df4 100644 --- a/internal/erpserver/model/system/login_log.go +++ b/internal/erpserver/model/system/login_log.go @@ -4,7 +4,7 @@ import ( "context" "time" - "management/internal/db/model/dto" + "management/internal/erpserver/model/dto" ) type LoginLogRepository interface { diff --git a/internal/erpserver/model/system/role.go b/internal/erpserver/model/system/role.go index 98b2835..5635967 100644 --- a/internal/erpserver/model/system/role.go +++ b/internal/erpserver/model/system/role.go @@ -4,7 +4,7 @@ import ( "context" "time" - "management/internal/db/model/dto" + "management/internal/erpserver/model/dto" ) type RoleRepository interface { diff --git a/internal/erpserver/model/system/user.go b/internal/erpserver/model/system/user.go index ec66e32..ae6949d 100644 --- a/internal/erpserver/model/system/user.go +++ b/internal/erpserver/model/system/user.go @@ -4,7 +4,7 @@ import ( "context" "time" - "management/internal/db/model/dto" + "management/internal/erpserver/model/dto" "github.com/google/uuid" ) diff --git a/internal/erpserver/repository/system/audit_log.go b/internal/erpserver/repository/system/audit_log.go index 0ffd285..9d336fe 100644 --- a/internal/erpserver/repository/system/audit_log.go +++ b/internal/erpserver/repository/system/audit_log.go @@ -3,7 +3,7 @@ package system import ( "context" - "management/internal/db/model/dto" + "management/internal/erpserver/model/dto" "management/internal/erpserver/model/system" "management/internal/erpserver/repository" ) diff --git a/internal/erpserver/repository/system/config.go b/internal/erpserver/repository/system/config.go index b1cc9fd..026ad8a 100644 --- a/internal/erpserver/repository/system/config.go +++ b/internal/erpserver/repository/system/config.go @@ -3,7 +3,7 @@ package system import ( "context" - "management/internal/db/model/dto" + "management/internal/erpserver/model/dto" "management/internal/erpserver/model/system" "management/internal/erpserver/repository" ) diff --git a/internal/erpserver/repository/system/department.go b/internal/erpserver/repository/system/department.go index 10f7fab..f8003f5 100644 --- a/internal/erpserver/repository/system/department.go +++ b/internal/erpserver/repository/system/department.go @@ -3,7 +3,7 @@ package system import ( "context" - "management/internal/db/model/dto" + "management/internal/erpserver/model/dto" "management/internal/erpserver/model/system" "management/internal/erpserver/repository" ) diff --git a/internal/erpserver/repository/system/login_log.go b/internal/erpserver/repository/system/login_log.go index cd47522..d7c0d3a 100644 --- a/internal/erpserver/repository/system/login_log.go +++ b/internal/erpserver/repository/system/login_log.go @@ -3,7 +3,7 @@ package system import ( "context" - "management/internal/db/model/dto" + "management/internal/erpserver/model/dto" "management/internal/erpserver/model/system" "management/internal/erpserver/repository" ) diff --git a/internal/erpserver/repository/system/role.go b/internal/erpserver/repository/system/role.go index 5215914..22c3b8a 100644 --- a/internal/erpserver/repository/system/role.go +++ b/internal/erpserver/repository/system/role.go @@ -3,7 +3,7 @@ package system import ( "context" - "management/internal/db/model/dto" + "management/internal/erpserver/model/dto" "management/internal/erpserver/model/system" "management/internal/erpserver/repository" ) diff --git a/internal/erpserver/repository/system/user.go b/internal/erpserver/repository/system/user.go index f095842..5d29407 100644 --- a/internal/erpserver/repository/system/user.go +++ b/internal/erpserver/repository/system/user.go @@ -3,7 +3,7 @@ package system import ( "context" - "management/internal/db/model/dto" + "management/internal/erpserver/model/dto" "management/internal/erpserver/model/system" "management/internal/erpserver/repository" ) diff --git a/internal/erpserver/service/v1/service.go b/internal/erpserver/service/v1/service.go index 4f57fee..792ec04 100644 --- a/internal/erpserver/service/v1/service.go +++ b/internal/erpserver/service/v1/service.go @@ -4,7 +4,7 @@ import ( "context" "time" - "management/internal/db/model/dto" + "management/internal/erpserver/model/dto" "management/internal/erpserver/model/form" "management/internal/erpserver/model/system" "management/internal/erpserver/model/view" diff --git a/internal/erpserver/service/v1/system/audit_log.go b/internal/erpserver/service/v1/system/audit_log.go index 705cad3..5f35193 100644 --- a/internal/erpserver/service/v1/system/audit_log.go +++ b/internal/erpserver/service/v1/system/audit_log.go @@ -3,7 +3,7 @@ package system import ( "context" - "management/internal/db/model/dto" + "management/internal/erpserver/model/dto" "management/internal/erpserver/model/system" v1 "management/internal/erpserver/service/v1" ) diff --git a/internal/erpserver/service/v1/system/config.go b/internal/erpserver/service/v1/system/config.go index 805be03..0f604ce 100644 --- a/internal/erpserver/service/v1/system/config.go +++ b/internal/erpserver/service/v1/system/config.go @@ -5,7 +5,7 @@ import ( "encoding/json" "time" - "management/internal/db/model/dto" + "management/internal/erpserver/model/dto" "management/internal/erpserver/model/system" v1 "management/internal/erpserver/service/v1" "management/internal/pkg/know" diff --git a/internal/erpserver/service/v1/system/department.go b/internal/erpserver/service/v1/system/department.go index cdd5e2e..57f458d 100644 --- a/internal/erpserver/service/v1/system/department.go +++ b/internal/erpserver/service/v1/system/department.go @@ -8,13 +8,13 @@ import ( "strconv" "time" - "management/internal/db/model/dto" - db "management/internal/db/sqlc" + "management/internal/erpserver/model/dto" "management/internal/erpserver/model/form" "management/internal/erpserver/model/system" "management/internal/erpserver/model/view" v1 "management/internal/erpserver/service/v1" "management/internal/pkg/convertor" + "management/internal/pkg/database" "management/internal/pkg/know" "management/internal/pkg/redis" ) @@ -61,7 +61,7 @@ func (s *departmentService) Create(ctx context.Context, req *form.Department) er } err := s.repo.Create(ctx, arg) if err != nil { - if db.IsUniqueViolation(err) { + if database.IsUniqueViolation(err) { return errors.New("部门已存在") } return err diff --git a/internal/erpserver/service/v1/system/login_log.go b/internal/erpserver/service/v1/system/login_log.go index 2c53bb3..c5863b4 100644 --- a/internal/erpserver/service/v1/system/login_log.go +++ b/internal/erpserver/service/v1/system/login_log.go @@ -4,7 +4,7 @@ import ( "context" "time" - "management/internal/db/model/dto" + "management/internal/erpserver/model/dto" "management/internal/erpserver/model/system" v1 "management/internal/erpserver/service/v1" ) diff --git a/internal/erpserver/service/v1/system/menu.go b/internal/erpserver/service/v1/system/menu.go index 81d78ed..85a38f4 100644 --- a/internal/erpserver/service/v1/system/menu.go +++ b/internal/erpserver/service/v1/system/menu.go @@ -7,7 +7,7 @@ import ( "strings" "time" - "management/internal/db/model/dto" + "management/internal/erpserver/model/dto" "management/internal/erpserver/model/system" "management/internal/erpserver/model/view" "management/internal/erpserver/repository" diff --git a/internal/erpserver/service/v1/system/role.go b/internal/erpserver/service/v1/system/role.go index ba7e897..1364935 100644 --- a/internal/erpserver/service/v1/system/role.go +++ b/internal/erpserver/service/v1/system/role.go @@ -8,13 +8,13 @@ import ( "strconv" "time" - "management/internal/db/model/dto" - db "management/internal/db/sqlc" + "management/internal/erpserver/model/dto" "management/internal/erpserver/model/form" "management/internal/erpserver/model/system" "management/internal/erpserver/model/view" v1 "management/internal/erpserver/service/v1" "management/internal/pkg/convertor" + "management/internal/pkg/database" "management/internal/pkg/know" "management/internal/pkg/redis" ) @@ -63,7 +63,7 @@ func (s *roleService) Create(ctx context.Context, req *form.Role) error { } err := s.repo.Create(ctx, arg) if err != nil { - if db.IsUniqueViolation(err) { + if database.IsUniqueViolation(err) { return errors.New("角色名称已存在") } return err diff --git a/internal/erpserver/service/v1/system/user.go b/internal/erpserver/service/v1/system/user.go index ed8b362..80937bd 100644 --- a/internal/erpserver/service/v1/system/user.go +++ b/internal/erpserver/service/v1/system/user.go @@ -7,13 +7,13 @@ import ( "strconv" "time" - "management/internal/db/model/dto" - db "management/internal/db/sqlc" + "management/internal/erpserver/model/dto" "management/internal/erpserver/model/form" "management/internal/erpserver/model/system" "management/internal/erpserver/model/view" v1 "management/internal/erpserver/service/v1" "management/internal/pkg/crypto" + "management/internal/pkg/database" "management/internal/pkg/know" "management/internal/pkg/rand" "management/internal/pkg/session" @@ -76,7 +76,7 @@ func (b *userService) Create(ctx context.Context, req *form.User) error { } err = b.repo.Create(ctx, user) if err != nil { - if db.IsUniqueViolation(err) { + if database.IsUniqueViolation(err) { return errors.New("用户已经存在") } return err diff --git a/internal/erpserver/store/expansion.go b/internal/erpserver/store/expansion.go deleted file mode 100644 index 3da45bd..0000000 --- a/internal/erpserver/store/expansion.go +++ /dev/null @@ -1,24 +0,0 @@ -package store - -import "management/internal/erpserver/store/system" - -// ====================================================================================== -// system - -type SystemExpansion interface { - User() system.UserStore - LoginLog() system.LoginLogStore - Role() system.RoleStore -} - -func (store *datastore) User() system.UserStore { - return system.NewUserStore(store.core) -} - -func (store *datastore) LoginLog() system.LoginLogStore { - return system.NewLoginLogStore(store.core) -} - -func (store *datastore) Role() system.RoleStore { - return system.NewRoleStore(store.core) -} diff --git a/internal/erpserver/store/store.go b/internal/erpserver/store/store.go deleted file mode 100644 index 2968470..0000000 --- a/internal/erpserver/store/store.go +++ /dev/null @@ -1,62 +0,0 @@ -package store - -import ( - "context" - "sync" - - "gorm.io/gorm" -) - -var ( - once sync.Once - // 全局变量,方便其它包直接调用已初始化好的 datastore 实例. - engine *datastore -) - -// IStore 定义了 Store 层需要实现的方法. -type IStore interface { - DB(ctx context.Context) *gorm.DB - TX(ctx context.Context, fn func(ctx context.Context) error) error - - SystemExpansion -} - -// transactionKey 用于在 context.Context 中存储事务上下文的键. -type transactionKey struct{} - -// datastore 是 IStore 的具体实现. -type datastore struct { - core *gorm.DB -} - -// 确保 datastore 实现了 IStore 接口. -var _ IStore = (*datastore)(nil) - -// NewStore 创建一个 IStore 类型的实例. -func NewStore(db *gorm.DB) *datastore { - // 确保 engine 只被初始化一次 - once.Do(func() { - engine = &datastore{db} - }) - - return engine -} - -func (store *datastore) DB(ctx context.Context) *gorm.DB { - db := store.core - // 从上下文中提取事务实例 - if tx, ok := ctx.Value(transactionKey{}).(*gorm.DB); ok { - db = tx - } - - return db -} - -func (store *datastore) TX(ctx context.Context, fn func(ctx context.Context) error) error { - return store.core.WithContext(ctx).Transaction( - func(tx *gorm.DB) error { - ctx = context.WithValue(ctx, transactionKey{}, tx) - return fn(ctx) - }, - ) -} diff --git a/internal/erpserver/store/system/login_log.go b/internal/erpserver/store/system/login_log.go deleted file mode 100644 index e547846..0000000 --- a/internal/erpserver/store/system/login_log.go +++ /dev/null @@ -1,58 +0,0 @@ -package system - -import ( - "context" - - "management/internal/db/model/dto" - "management/internal/erpserver/model/system" - - "gorm.io/gorm" -) - -type LoginLogStore interface { - Create(ctx context.Context, obj *system.LoginLog) error - List(ctx context.Context, q dto.SearchDto) ([]*system.LoginLog, int64, error) -} - -type loginLogStore struct { - db *gorm.DB -} - -var _ LoginLogStore = (*loginLogStore)(nil) - -func NewLoginLogStore(db *gorm.DB) *loginLogStore { - return &loginLogStore{ - db: db, - } -} - -func (s *loginLogStore) Create(ctx context.Context, obj *system.LoginLog) error { - return s.db.WithContext(ctx).Create(obj).Error -} - -func (s *loginLogStore) List(ctx context.Context, q dto.SearchDto) ([]*system.LoginLog, int64, error) { - query := s.db.WithContext(ctx). - Model(&system.LoginLog{}). - Where("created_at BETWEEN ? AND ?", q.SearchTimeBegin, q.SearchTimeEnd) - if q.SearchEmail != "" { - query = query.Where("email LIKE ?", "%"+q.SearchEmail+"%") - } - - var count int64 - err := query.Count(&count).Error - if err != nil { - return nil, 0, err - } - - var logs []*system.LoginLog - err = query. - Order("id DESC"). - Offset((q.Page - 1) * q.Rows). - Limit(q.Rows). - Find(&logs). - Error - if err != nil { - return nil, 0, err - } - return logs, count, nil -} diff --git a/internal/erpserver/store/system/role.go b/internal/erpserver/store/system/role.go deleted file mode 100644 index 9406b82..0000000 --- a/internal/erpserver/store/system/role.go +++ /dev/null @@ -1,44 +0,0 @@ -package system - -import ( - "context" - - "management/internal/erpserver/model/system" - - "gorm.io/gorm" -) - -type RoleStore interface { - Create(ctx context.Context, obj *system.Role) error - Update(ctx context.Context, obj *system.Role) error - Get(ctx context.Context, id int32) (*system.Role, error) -} - -type roleStore struct { - db *gorm.DB -} - -var _ RoleStore = (*roleStore)(nil) - -func NewRoleStore(db *gorm.DB) *roleStore { - return &roleStore{ - db: db, - } -} - -func (s *roleStore) Create(ctx context.Context, obj *system.Role) error { - return s.db.WithContext(ctx).Create(obj).Error -} - -func (s *roleStore) Update(ctx context.Context, obj *system.Role) error { - return s.db.WithContext(ctx).Save(obj).Error -} - -func (s *roleStore) Get(ctx context.Context, id int32) (*system.Role, error) { - var role system.Role - err := s.db.WithContext(ctx).Where("id =?", id).First(&role).Error - if err != nil { - return nil, err - } - return &role, nil -} diff --git a/internal/erpserver/store/system/user.go b/internal/erpserver/store/system/user.go deleted file mode 100644 index f578238..0000000 --- a/internal/erpserver/store/system/user.go +++ /dev/null @@ -1,110 +0,0 @@ -package system - -import ( - "context" - - "management/internal/db/model/dto" - "management/internal/erpserver/model/system" - - "gorm.io/gorm" -) - -// UserStore 定义了 user 模块在 store 层所实现的方法. -type UserStore interface { - Create(ctx context.Context, obj *system.User) error - Update(ctx context.Context, obj *system.User) error - Get(ctx context.Context, id int32) (*system.User, error) - GetByEmail(ctx context.Context, email string) (*system.User, error) - All(ctx context.Context) ([]*system.User, error) - List(ctx context.Context, q dto.SearchDto) ([]*system.User, int64, error) - - UserExpansion -} - -// UserExpansion 定义了用户操作的附加方法. -type UserExpansion interface{} - -// userStore 是 UserStore 接口的实现. -type userStore struct { - db *gorm.DB -} - -// 确保 userStore 实现了 UserStore 接口. -var _ UserStore = (*userStore)(nil) - -// NewUserStore 创建 userStore 的实例. -func NewUserStore(db *gorm.DB) *userStore { - return &userStore{ - db: db, - } -} - -func (s *userStore) Create(ctx context.Context, obj *system.User) error { - return s.db.WithContext(ctx).Create(obj).Error -} - -func (s *userStore) Update(ctx context.Context, obj *system.User) error { - return s.db.WithContext(ctx).Save(obj).Error -} - -func (s *userStore) Get(ctx context.Context, id int32) (*system.User, error) { - var user system.User - err := s.db.WithContext(ctx).Where("id = ?", id).First(&user).Error - if err != nil { - return nil, err - } - return &user, nil -} - -func (s *userStore) GetByEmail(ctx context.Context, email string) (*system.User, error) { - var user system.User - err := s.db.WithContext(ctx).Where("email = ?", email).First(&user).Error - if err != nil { - return nil, err - } - return &user, nil -} - -func (s *userStore) All(ctx context.Context) ([]*system.User, error) { - var users []*system.User - err := s.db.WithContext(ctx).Find(&users).Error - if err != nil { - return nil, err - } - return users, nil -} - -func (s *userStore) List(ctx context.Context, q dto.SearchDto) ([]*system.User, int64, error) { - query := s.db.WithContext(ctx). - Model(&system.User{}). - Where("created_at BETWEEN? AND?", q.SearchTimeBegin, q.SearchTimeEnd) - if q.SearchID != 0 { - query = query.Where("id = ?", q.SearchID) - } - if q.SearchName != "" { - query = query.Where("username LIKE ?", "%"+q.SearchName+"%") - } - if q.SearchEmail != "" { - query = query.Where("email LIKE ?", "%"+q.SearchEmail+"%") - } - if q.SearchStatus != 9999 { - query = query.Where("status = ?", q.SearchStatus) - } - - var count int64 - err := query.Count(&count).Error - if err != nil { - return nil, 0, err - } - - var users []*system.User - err = query. - Order("id DESC"). - Offset((q.Page - 1) * q.Rows). - Limit(q.Rows). - Find(&users).Error - if err != nil { - return nil, 0, err - } - return users, count, nil -} diff --git a/internal/pkg/database/error.go b/internal/pkg/database/error.go new file mode 100644 index 0000000..fa64364 --- /dev/null +++ b/internal/pkg/database/error.go @@ -0,0 +1,15 @@ +package database + +import ( + "errors" + + "gorm.io/gorm" +) + +func IsUniqueViolation(err error) bool { + return errors.Is(err, gorm.ErrDuplicatedKey) +} + +func IsNoRows(err error) bool { + return errors.Is(err, gorm.ErrRecordNotFound) +} diff --git a/internal/pkg/know/pearadmin/pearadmin.go b/internal/pkg/know/pearadmin/pearadmin.go index 7af91e0..d47d1a5 100644 --- a/internal/pkg/know/pearadmin/pearadmin.go +++ b/internal/pkg/know/pearadmin/pearadmin.go @@ -1,6 +1,6 @@ package pearadmin -import "management/internal/db/model/dto" +import "management/internal/erpserver/model/dto" const PearKey = "PEAR_JSON" diff --git a/internal/pkg/middleware/authorize.go b/internal/pkg/middleware/authorize.go index d2b2aca..3d8d198 100644 --- a/internal/pkg/middleware/authorize.go +++ b/internal/pkg/middleware/authorize.go @@ -5,7 +5,7 @@ import ( "encoding/json" "net/http" - "management/internal/db/model/dto" + "management/internal/erpserver/model/dto" "management/internal/pkg/know" ) diff --git a/internal/pkg/middleware/middleware.go b/internal/pkg/middleware/middleware.go index ea04afa..cddb398 100644 --- a/internal/pkg/middleware/middleware.go +++ b/internal/pkg/middleware/middleware.go @@ -4,7 +4,7 @@ import ( "context" "net/http" - "management/internal/db/model/dto" + "management/internal/erpserver/model/dto" v1 "management/internal/erpserver/service/v1" "management/internal/pkg/session" ) diff --git a/internal/pkg/tpl/html.go b/internal/pkg/tpl/html.go index 8522dbb..8b3eff7 100644 --- a/internal/pkg/tpl/html.go +++ b/internal/pkg/tpl/html.go @@ -6,7 +6,7 @@ import ( "path/filepath" "strings" - "management/internal/db/model/dto" + "management/internal/erpserver/model/dto" ) type TemplateConfig struct { diff --git a/internal/pkg/tpl/html_btn.go b/internal/pkg/tpl/html_btn.go index 9ee3b97..2928cd1 100644 --- a/internal/pkg/tpl/html_btn.go +++ b/internal/pkg/tpl/html_btn.go @@ -5,7 +5,7 @@ import ( "path/filepath" "strings" - "management/internal/db/model/dto" + "management/internal/erpserver/model/dto" ) func (r *render) btnFuncs() map[string]any { diff --git a/internal/pkg/tpl/util.go b/internal/pkg/tpl/util.go index 6430e3e..c2c630a 100644 --- a/internal/pkg/tpl/util.go +++ b/internal/pkg/tpl/util.go @@ -12,7 +12,7 @@ import ( "slices" "strings" - "management/internal/db/model/dto" + "management/internal/erpserver/model/dto" "management/internal/pkg/know" templates "management/web/templates/manage" diff --git a/sqlc.yaml b/sqlc.yaml deleted file mode 100644 index 85eda77..0000000 --- a/sqlc.yaml +++ /dev/null @@ -1,22 +0,0 @@ -version: "2" -sql: -- schema: "internal/db/migration" - queries: "internal/db/query" - engine: "postgresql" - gen: - go: - package: "db" - out: "internal/db/sqlc" - sql_package: "pgx/v5" - emit_json_tags: true - emit_prepared_queries: true - emit_interface: true - emit_exact_table_names: false - emit_empty_slices: true - emit_params_struct_pointers: true - emit_result_struct_pointers: true - overrides: - - db_type: "timestamptz" - go_type: "time.Time" - - db_type: "uuid" - go_type: "github.com/google/uuid.UUID"