diff --git a/app/main/api/__debug_bin796033340.exe b/app/main/api/__debug_bin796033340.exe deleted file mode 100644 index 2da219d..0000000 Binary files a/app/main/api/__debug_bin796033340.exe and /dev/null differ diff --git a/app/main/api/desc/admin/auth.api b/app/main/api/desc/admin/auth.api new file mode 100644 index 0000000..e8be573 --- /dev/null +++ b/app/main/api/desc/admin/auth.api @@ -0,0 +1,34 @@ +syntax = "v1" + +info ( + title: "认证中心服务" + desc: "认证中心服务" + author: "Liangzai" + email: "2440983361@qq.com" + version: "v1" +) + +@server ( + prefix: api/v1/admin/auth + group: admin_auth +) +service main { + @doc "登录" + @handler AdminLogin + post /login (AdminLoginReq) returns (AdminLoginResp) + +} + +type ( + AdminLoginReq { + Username string `json:"username" validate:"required"` + Password string `json:"password" validate:"required"` + Captcha bool `json:"captcha" validate:"required"` + } + AdminLoginResp { + AccessToken string `json:"access_token"` + AccessExpire int64 `json:"access_expire"` + RefreshAfter int64 `json:"refresh_after"` + Roles []string `json:"roles"` + } +) \ No newline at end of file diff --git a/app/main/api/desc/admin/menu.api b/app/main/api/desc/admin/menu.api new file mode 100644 index 0000000..52d87be --- /dev/null +++ b/app/main/api/desc/admin/menu.api @@ -0,0 +1,149 @@ +syntax = "v1" + +info ( + title: "菜单中心服务" + desc: "菜单中心服务" + author: "Liangzai" + email: "2440983361@qq.com" + version: "v1" +) + +@server ( + prefix: api/v1/admin/menu + group: admin_menu + jwt: JwtAuth +) +service main { + @doc "获取菜单列表" + @handler GetMenuList + get /list (GetMenuListReq) returns ([]MenuListItem) + + @doc "获取菜单详情" + @handler GetMenuDetail + get /detail/:id (GetMenuDetailReq) returns (GetMenuDetailResp) + + @doc "创建菜单" + @handler CreateMenu + post /create (CreateMenuReq) returns (CreateMenuResp) + + @doc "更新菜单" + @handler UpdateMenu + put /update/:id (UpdateMenuReq) returns (UpdateMenuResp) + + @doc "删除菜单" + @handler DeleteMenu + delete /delete/:id (DeleteMenuReq) returns (DeleteMenuResp) + + @doc "获取所有菜单(树形结构)" + @handler GetMenuAll + get /all (GetMenuAllReq) returns ([]GetMenuAllResp) +} + +type ( + // 列表请求 + GetMenuListReq { + Name string `form:"name,optional"` // 菜单名称 + Path string `form:"path,optional"` // 路由路径 + Status int64 `form:"status,optional,default=-1"` // 状态:0-禁用,1-启用 + Type string `form:"type,optional"` // 类型 + } + + // 列表项 + MenuListItem { + Id int64 `json:"id"` // 菜单ID + Pid int64 `json:"pid"` // 父菜单ID + Name string `json:"name"` // 路由名称 + Path string `json:"path"` // 路由路径 + Component string `json:"component"` // 组件路径 + Redirect string `json:"redirect"` // 重定向路径 + Meta map[string]interface{} `json:"meta"` // 路由元数据 + Status int64 `json:"status"` // 状态:0-禁用,1-启用 + Type string `json:"type"` // 类型 + Sort int64 `json:"sort"` // 排序 + CreateTime string `json:"createTime"` // 创建时间 + Children []MenuListItem `json:"children"` // 子菜单 + } + + // 详情请求 + GetMenuDetailReq { + Id int64 `path:"id"` // 菜单ID + } + + // 详情响应 + GetMenuDetailResp { + Id int64 `json:"id"` // 菜单ID + Pid int64 `json:"pid"` // 父菜单ID + Name string `json:"name"` // 路由名称 + Path string `json:"path"` // 路由路径 + Component string `json:"component"` // 组件路径 + Redirect string `json:"redirect"` // 重定向路径 + Meta map[string]interface{} `json:"meta"` // 路由元数据 + Status int64 `json:"status"` // 状态:0-禁用,1-启用 + Type string `json:"type"` // 类型 + Sort int64 `json:"sort"` // 排序 + CreateTime string `json:"createTime"` // 创建时间 + UpdateTime string `json:"updateTime"` // 更新时间 + } + + // 创建请求 + CreateMenuReq { + Pid int64 `json:"pid,optional"` // 父菜单ID + Name string `json:"name"` // 路由名称 + Path string `json:"path,optional"` // 路由路径 + Component string `json:"component,optional"` // 组件路径 + Redirect string `json:"redirect,optional"` // 重定向路径 + Meta map[string]interface{} `json:"meta"` // 路由元数据 + Status int64 `json:"status,optional,default=1"` // 状态:0-禁用,1-启用 + Type string `json:"type"` // 类型 + Sort int64 `json:"sort,optional"` // 排序 + } + + // 创建响应 + CreateMenuResp { + Id int64 `json:"id"` // 菜单ID + } + + // 更新请求 + UpdateMenuReq { + Id int64 `path:"id"` // 菜单ID + Pid int64 `json:"pid,optional"` // 父菜单ID + Name string `json:"name"` // 路由名称 + Path string `json:"path,optional"` // 路由路径 + Component string `json:"component,optional"` // 组件路径 + Redirect string `json:"redirect,optional"` // 重定向路径 + Meta map[string]interface{} `json:"meta"` // 路由元数据 + Status int64 `json:"status,optional"` // 状态:0-禁用,1-启用 + Type string `json:"type"` // 类型 + Sort int64 `json:"sort,optional"` // 排序 + } + + // 更新响应 + UpdateMenuResp { + Success bool `json:"success"` // 是否成功 + } + + // 删除请求 + DeleteMenuReq { + Id int64 `path:"id"` // 菜单ID + } + + // 删除响应 + DeleteMenuResp { + Success bool `json:"success"` // 是否成功 + } + + // 获取所有菜单请求 + GetMenuAllReq { + } + + // 获取所有菜单响应 + GetMenuAllResp { + Name string `json:"name"` + Path string `json:"path"` + Redirect string `json:"redirect,omitempty"` + Component string `json:"component,omitempty"` + Sort int64 `json:"sort"` + Meta map[string]interface{} `json:"meta"` + Children []GetMenuAllResp `json:"children"` + } +) \ No newline at end of file diff --git a/app/main/api/desc/admin/promotion.api b/app/main/api/desc/admin/promotion.api new file mode 100644 index 0000000..b821b9b --- /dev/null +++ b/app/main/api/desc/admin/promotion.api @@ -0,0 +1,183 @@ +syntax = "v1" + +info ( + title: "推广服务" + desc: "推广服务" + author: "Liangzai" + email: "2440983361@qq.com" + version: "v1" +) + +@server ( + prefix: api/v1/admin/promotion/link + group: admin_promotion + jwt: JwtAuth +) +service main { + @doc "获取推广链接列表" + @handler GetPromotionLinkList + get /list (GetPromotionLinkListReq) returns (GetPromotionLinkListResp) + + @doc "获取推广链接详情" + @handler GetPromotionLinkDetail + get /detail/:id (GetPromotionLinkDetailReq) returns (GetPromotionLinkDetailResp) + + @doc "创建推广链接" + @handler CreatePromotionLink + post /create (CreatePromotionLinkReq) returns (CreatePromotionLinkResp) + + @doc "更新推广链接" + @handler UpdatePromotionLink + put /update/:id (UpdatePromotionLinkReq) returns (UpdatePromotionLinkResp) + + @doc "删除推广链接" + @handler DeletePromotionLink + delete /delete/:id (DeletePromotionLinkReq) returns (DeletePromotionLinkResp) +} + +type ( + // 列表请求 + GetPromotionLinkListReq { + Page int64 `form:"page,default=1"` // 页码 + PageSize int64 `form:"pageSize,default=20"` // 每页数量 + Name string `form:"name,optional"` // 链接名称 + Url string `form:"url,optional"` // 推广链接URL + } + + // 列表响应 + GetPromotionLinkListResp { + Total int64 `json:"total"` // 总数 + Items []PromotionLinkItem `json:"items"` // 列表 + } + + // 列表项 + PromotionLinkItem { + Id int64 `json:"id"` // 链接ID + Name string `json:"name"` // 链接名称 + Url string `json:"url"` // 推广链接URL + ClickCount int64 `json:"click_count"` // 点击数 + PayCount int64 `json:"pay_count"` // 付费次数 + PayAmount string `json:"pay_amount"` // 付费金额 + CreateTime string `json:"create_time"` // 创建时间 + LastClickTime string `json:"last_click_time,optional"` // 最后点击时间 + LastPayTime string `json:"last_pay_time,optional"` // 最后付费时间 + } + + // 详情请求 + GetPromotionLinkDetailReq { + Id int64 `path:"id"` // 链接ID + } + + // 详情响应 + GetPromotionLinkDetailResp { + Name string `json:"name"` // 链接名称 + Url string `json:"url"` // 推广链接URL + ClickCount int64 `json:"click_count"` // 点击数 + PayCount int64 `json:"pay_count"` // 付费次数 + PayAmount string `json:"pay_amount"` // 付费金额 + CreateTime string `json:"create_time"` // 创建时间 + UpdateTime string `json:"update_time"` // 更新时间 + LastClickTime string `json:"last_click_time,optional"` // 最后点击时间 + LastPayTime string `json:"last_pay_time,optional"` // 最后付费时间 + } + + // 创建请求 + CreatePromotionLinkReq { + Name string `json:"name"` // 链接名称 + } + + // 创建响应 + CreatePromotionLinkResp { + Id int64 `json:"id"` // 链接ID + Url string `json:"url"` // 生成的推广链接URL + } + + // 更新请求 + UpdatePromotionLinkReq { + Id int64 `path:"id"` // 链接ID + Name *string `json:"name,optional"` // 链接名称 + } + + // 更新响应 + UpdatePromotionLinkResp { + Success bool `json:"success"` // 是否成功 + } + + // 删除请求 + DeletePromotionLinkReq { + Id int64 `path:"id"` // 链接ID + } + + // 删除响应 + DeletePromotionLinkResp { + Success bool `json:"success"` // 是否成功 + } +) + +@server ( + prefix: api/v1/admin/promotion/link + group: admin_promotion +) +service main { + @doc "记录链接点击" + @handler RecordLinkClick + get /record/:path (RecordLinkClickReq) returns (RecordLinkClickResp) +} + +type ( + // 记录链接点击请求 + RecordLinkClickReq { + Path string `path:"path"` // 链接路径 + } + + // 记录链接点击响应 + RecordLinkClickResp { + Success bool `json:"success"` // 是否成功 + } +) +@server ( + prefix: api/v1/admin/promotion/stats + group: admin_promotion + jwt: JwtAuth +) +service main { + @doc "获取推广历史记录" + @handler GetPromotionStatsHistory + get /history (GetPromotionStatsHistoryReq) returns ([]PromotionStatsHistoryItem) + + @doc "获取推广总统计" + @handler GetPromotionStatsTotal + get /total (GetPromotionStatsTotalReq) returns (GetPromotionStatsTotalResp) +} + +type ( + // 获取推广历史记录请求 + GetPromotionStatsHistoryReq { + StartDate string `form:"start_date"` // 开始日期,格式:YYYY-MM-DD + EndDate string `form:"end_date"` // 结束日期,格式:YYYY-MM-DD + } + + // 推广历史记录项 + PromotionStatsHistoryItem { + Id int64 `json:"id"` // 记录ID + LinkId int64 `json:"link_id"` // 链接ID + PayAmount float64 `json:"pay_amount"` // 金额 + ClickCount int64 `json:"click_count"` // 点击数 + PayCount int64 `json:"pay_count"` // 付费次数 + StatsDate string `json:"stats_date"` // 统计日期 + } + + // 获取推广总统计请求 + GetPromotionStatsTotalReq { + } + + // 获取推广总统计响应 + GetPromotionStatsTotalResp { + TodayPayAmount float64 `json:"today_pay_amount"` // 今日金额 + TodayClickCount int64 `json:"today_click_count"` // 今日点击数 + TodayPayCount int64 `json:"today_pay_count"` // 今日付费次数 + TotalPayAmount float64 `json:"total_pay_amount"` // 总金额 + TotalClickCount int64 `json:"total_click_count"` // 总点击数 + TotalPayCount int64 `json:"total_pay_count"` // 总付费次数 + } +) \ No newline at end of file diff --git a/app/main/api/desc/admin/role.api b/app/main/api/desc/admin/role.api new file mode 100644 index 0000000..51a3de9 --- /dev/null +++ b/app/main/api/desc/admin/role.api @@ -0,0 +1,124 @@ +syntax = "v1" + +info ( + title: "角色服务" + desc: "角色服务" + author: "Liangzai" + email: "2440983361@qq.com" + version: "v1" +) + +@server ( + prefix: api/v1/admin/role + group: admin_role + jwt: JwtAuth +) +service main { + @doc "获取角色列表" + @handler GetRoleList + get /list (GetRoleListReq) returns (GetRoleListResp) + + @doc "获取角色详情" + @handler GetRoleDetail + get /detail/:id (GetRoleDetailReq) returns (GetRoleDetailResp) + + @doc "创建角色" + @handler CreateRole + post /create (CreateRoleReq) returns (CreateRoleResp) + + @doc "更新角色" + @handler UpdateRole + put /update/:id (UpdateRoleReq) returns (UpdateRoleResp) + + @doc "删除角色" + @handler DeleteRole + delete /delete/:id (DeleteRoleReq) returns (DeleteRoleResp) +} + +type ( + // 列表请求 + GetRoleListReq { + Page int64 `form:"page,default=1"` // 页码 + PageSize int64 `form:"pageSize,default=20"` // 每页数量 + Name string `form:"name,optional"` // 角色名称 + Code string `form:"code,optional"` // 角色编码 + Status int64 `form:"status,optional,default=-1"` // 状态:0-禁用,1-启用 + } + + // 列表响应 + GetRoleListResp { + Total int64 `json:"total"` // 总数 + Items []RoleListItem `json:"items"` // 列表 + } + + // 列表项 + RoleListItem { + Id int64 `json:"id"` // 角色ID + RoleName string `json:"role_name"` // 角色名称 + RoleCode string `json:"role_code"` // 角色编码 + Description string `json:"description"` // 角色描述 + Status int64 `json:"status"` // 状态:0-禁用,1-启用 + Sort int64 `json:"sort"` // 排序 + CreateTime string `json:"create_time"` // 创建时间 + MenuIds []int64 `json:"menu_ids"` // 关联的菜单ID列表 + } + + // 详情请求 + GetRoleDetailReq { + Id int64 `path:"id"` // 角色ID + } + + // 详情响应 + GetRoleDetailResp { + Id int64 `json:"id"` // 角色ID + RoleName string `json:"role_name"` // 角色名称 + RoleCode string `json:"role_code"` // 角色编码 + Description string `json:"description"` // 角色描述 + Status int64 `json:"status"` // 状态:0-禁用,1-启用 + Sort int64 `json:"sort"` // 排序 + CreateTime string `json:"create_time"` // 创建时间 + UpdateTime string `json:"update_time"` // 更新时间 + MenuIds []int64 `json:"menu_ids"` // 关联的菜单ID列表 + } + + // 创建请求 + CreateRoleReq { + RoleName string `json:"role_name"` // 角色名称 + RoleCode string `json:"role_code"` // 角色编码 + Description string `json:"description"` // 角色描述 + Status int64 `json:"status,default=1"` // 状态:0-禁用,1-启用 + Sort int64 `json:"sort,default=0"` // 排序 + MenuIds []int64 `json:"menu_ids"` // 关联的菜单ID列表 + } + + // 创建响应 + CreateRoleResp { + Id int64 `json:"id"` // 角色ID + } + + // 更新请求 + UpdateRoleReq { + Id int64 `path:"id"` // 角色ID + RoleName *string `json:"role_name,optional"` // 角色名称 + RoleCode *string `json:"role_code,optional"` // 角色编码 + Description *string `json:"description,optional"` // 角色描述 + Status *int64 `json:"status,optional"` // 状态:0-禁用,1-启用 + Sort *int64 `json:"sort,optional"` // 排序 + MenuIds []int64 `json:"menu_ids,optional"` // 关联的菜单ID列表 + } + + // 更新响应 + UpdateRoleResp { + Success bool `json:"success"` // 是否成功 + } + + // 删除请求 + DeleteRoleReq { + Id int64 `path:"id"` // 角色ID + } + + // 删除响应 + DeleteRoleResp { + Success bool `json:"success"` // 是否成功 + } +) \ No newline at end of file diff --git a/app/main/api/desc/admin/user.api b/app/main/api/desc/admin/user.api new file mode 100644 index 0000000..31ace00 --- /dev/null +++ b/app/main/api/desc/admin/user.api @@ -0,0 +1,131 @@ +syntax = "v1" + +info ( + title: "用户中心服务" + desc: "用户中心服务" + author: "Liangzai" + email: "2440983361@qq.com" + version: "v1" +) + +@server ( + prefix: api/v1/admin/user + group: admin_user + jwt: JwtAuth +) +service main { + @doc "获取用户列表" + @handler AdminGetUserList + get /list (AdminGetUserListReq) returns (AdminGetUserListResp) + + @doc "获取用户详情" + @handler AdminGetUserDetail + get /detail/:id (AdminGetUserDetailReq) returns (AdminGetUserDetailResp) + + @doc "创建用户" + @handler AdminCreateUser + post /create (AdminCreateUserReq) returns (AdminCreateUserResp) + + @doc "更新用户" + @handler AdminUpdateUser + put /update/:id (AdminUpdateUserReq) returns (AdminUpdateUserResp) + + @doc "删除用户" + @handler AdminDeleteUser + delete /delete/:id (AdminDeleteUserReq) returns (AdminDeleteUserResp) + + @doc "用户信息" + @handler AdminUserInfo + get /info (AdminUserInfoReq) returns (AdminUserInfoResp) +} + +type ( + // 列表请求 + AdminGetUserListReq { + Page int64 `form:"page,default=1"` // 页码 + PageSize int64 `form:"pageSize,default=20"` // 每页数量 + Username string `form:"username,optional"` // 用户名 + RealName string `form:"real_name,optional"` // 真实姓名 + Status int64 `form:"status,optional,default=-1"` // 状态:0-禁用,1-启用 + } + + // 列表响应 + AdminGetUserListResp { + Total int64 `json:"total"` // 总数 + Items []UserListItem `json:"items"` // 列表 + } + + // 列表项 + UserListItem { + Id int64 `json:"id"` // 用户ID + Username string `json:"username"` // 用户名 + RealName string `json:"real_name"` // 真实姓名 + Status int64 `json:"status"` // 状态:0-禁用,1-启用 + CreateTime string `json:"create_time"` // 创建时间 + RoleIds []int64 `json:"role_ids"` // 关联的角色ID列表 + } + + // 详情请求 + AdminGetUserDetailReq { + Id int64 `path:"id"` // 用户ID + } + + // 详情响应 + AdminGetUserDetailResp { + Id int64 `json:"id"` // 用户ID + Username string `json:"username"` // 用户名 + RealName string `json:"real_name"` // 真实姓名 + Status int64 `json:"status"` // 状态:0-禁用,1-启用 + CreateTime string `json:"create_time"` // 创建时间 + UpdateTime string `json:"update_time"` // 更新时间 + RoleIds []int64 `json:"role_ids"` // 关联的角色ID列表 + } + + // 创建请求 + AdminCreateUserReq { + Username string `json:"username"` // 用户名 + RealName string `json:"real_name"` // 真实姓名 + Status int64 `json:"status,default=1"` // 状态:0-禁用,1-启用 + RoleIds []int64 `json:"role_ids"` // 关联的角色ID列表 + } + + // 创建响应 + AdminCreateUserResp { + Id int64 `json:"id"` // 用户ID + } + + // 更新请求 + AdminUpdateUserReq { + Id int64 `path:"id"` // 用户ID + Username *string `json:"username,optional"` // 用户名 + RealName *string `json:"real_name,optional"` // 真实姓名 + Status *int64 `json:"status,optional"` // 状态:0-禁用,1-启用 + RoleIds []int64 `json:"role_ids,optional"` // 关联的角色ID列表 + } + + // 更新响应 + AdminUpdateUserResp { + Success bool `json:"success"` // 是否成功 + } + + // 删除请求 + AdminDeleteUserReq { + Id int64 `path:"id"` // 用户ID + } + + // 删除响应 + AdminDeleteUserResp { + Success bool `json:"success"` // 是否成功 + } + + // 用户信息请求 + AdminUserInfoReq { + } + + // 用户信息响应 + AdminUserInfoResp { + Username string `json:"username"` // 用户名 + RealName string `json:"real_name"` // 真实姓名 + Roles []string `json:"roles"` // 角色编码列表 + } +) \ No newline at end of file diff --git a/app/main/api/desc/front/pay.api b/app/main/api/desc/front/pay.api index 018f9a0..854c254 100644 --- a/app/main/api/desc/front/pay.api +++ b/app/main/api/desc/front/pay.api @@ -33,7 +33,6 @@ service main { prefix: api/v1 group: pay jwt: JwtAuth - middleware: SourceInterceptor ) service main { // 支付 diff --git a/app/main/api/desc/front/product.api b/app/main/api/desc/front/product.api index 1d97684..0818d03 100644 --- a/app/main/api/desc/front/product.api +++ b/app/main/api/desc/front/product.api @@ -1,35 +1,33 @@ syntax = "v1" info ( - title: "产品服务" - desc: "产品服务" - author: "Liangzai" - email: "2440983361@qq.com" - version: "v1" + title: "产品服务" + desc: "产品服务" + author: "Liangzai" + email: "2440983361@qq.com" + version: "v1" ) import ( - "product/product.api" + "product/product.api" ) @server ( - prefix: api/v1/product - group: product - jwt: JwtAuth + prefix: api/v1/product + group: product + jwt: JwtAuth ) service main { - @handler GetProductByID - get /:id (GetProductByIDRequest) returns (ProductResponse) + @handler GetProductByID + get /:id (GetProductByIDRequest) returns (ProductResponse) - @handler GetProductByEn - get /en/:product_en (GetProductByEnRequest) returns (ProductResponse) + @handler GetProductByEn + get /en/:product_en (GetProductByEnRequest) returns (ProductResponse) } @server ( - prefix: api/v1/product - group: product - middleware: SourceInterceptor + prefix: api/v1/product + group: product ) service main { - @handler GetProductRenderList - get /render_list/:module (GetProductRenderListRequest) returns (GetProductRenderListResponse) -} - + @handler GetProductRenderList + get /render_list/:module (GetProductRenderListRequest) returns (GetProductRenderListResponse) +} \ No newline at end of file diff --git a/app/main/api/desc/main.api b/app/main/api/desc/main.api index 7cc9da4..7a8c095 100644 --- a/app/main/api/desc/main.api +++ b/app/main/api/desc/main.api @@ -11,4 +11,9 @@ info ( import "./front/user.api" import "./front/query.api" import "./front/pay.api" -import "./front/product.api" \ No newline at end of file +import "./front/product.api" +import "./admin/auth.api" +import "./admin/user.api" +import "./admin/menu.api" +import "./admin/role.api" +import "./admin/promotion.api" diff --git a/app/main/api/etc/main.dev.yaml b/app/main/api/etc/main.dev.yaml index 8a22f42..f26352a 100644 --- a/app/main/api/etc/main.dev.yaml +++ b/app/main/api/etc/main.dev.yaml @@ -59,3 +59,9 @@ Ali: Code: "d55b58829efb41c8aa8e86769cba4844" SystemConfig: ThreeVerify: false +AdminConfig: + AccessSecret: "jK8nP3qR7tV2xZ5aB9cD1eF6gH4iJ0kL8mN5oP6qR7sT" + AccessExpire: 604800 + RefreshAfter: 302400 +AdminPromotion: + URLDomain: "https://tianyuancha.cn/p" diff --git a/app/main/api/etc/main.yaml b/app/main/api/etc/main.yaml index 25ccc41..b073a3d 100644 --- a/app/main/api/etc/main.yaml +++ b/app/main/api/etc/main.yaml @@ -61,3 +61,9 @@ Ali: Code: "d55b58829efb41c8aa8e86769cba4844" SystemConfig: ThreeVerify: false +AdminConfig: + AccessSecret: "jK8nP3qR7tV2xZ5aB9cD1eF6gH4iJ0kL8mN5oP6qR7sT" + AccessExpire: 604800 + RefreshAfter: 302400 +AdminPromotion: + URLDomain: "https://tianyuancha.cn/p" diff --git a/app/main/api/internal/config/config.go b/app/main/api/internal/config/config.go index 2100ed0..e38b258 100644 --- a/app/main/api/internal/config/config.go +++ b/app/main/api/internal/config/config.go @@ -7,19 +7,21 @@ import ( type Config struct { rest.RestConf - DataSource string - CacheRedis cache.CacheConf - JwtAuth JwtAuth // JWT 鉴权相关配置 - VerifyCode VerifyCode - Encrypt Encrypt - Alipay AlipayConfig - Wxpay WxpayConfig - Applepay ApplepayConfig - Ali AliConfig - WestConfig WestConfig - YushanConfig YushanConfig - TianjuConfig TianjuConfig - SystemConfig SystemConfig + DataSource string + CacheRedis cache.CacheConf + JwtAuth JwtAuth // JWT 鉴权相关配置 + VerifyCode VerifyCode + Encrypt Encrypt + Alipay AlipayConfig + Wxpay WxpayConfig + Applepay ApplepayConfig + Ali AliConfig + WestConfig WestConfig + YushanConfig YushanConfig + TianjuConfig TianjuConfig + SystemConfig SystemConfig + AdminConfig AdminConfig + AdminPromotion AdminPromotion } // JwtAuth 用于 JWT 鉴权配置 @@ -88,3 +90,13 @@ type TianjuConfig struct { type SystemConfig struct { ThreeVerify bool } + +type AdminConfig struct { + AccessSecret string + AccessExpire int64 + RefreshAfter int64 +} + +type AdminPromotion struct { + URLDomain string +} diff --git a/app/main/api/internal/handler/admin_auth/adminloginhandler.go b/app/main/api/internal/handler/admin_auth/adminloginhandler.go new file mode 100644 index 0000000..70926fa --- /dev/null +++ b/app/main/api/internal/handler/admin_auth/adminloginhandler.go @@ -0,0 +1,29 @@ +package admin_auth + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tyc-server/app/main/api/internal/logic/admin_auth" + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/common/result" + "tyc-server/pkg/lzkit/validator" +) + +func AdminLoginHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.AdminLoginReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_auth.NewAdminLoginLogic(r.Context(), svcCtx) + resp, err := l.AdminLogin(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_menu/createmenuhandler.go b/app/main/api/internal/handler/admin_menu/createmenuhandler.go new file mode 100644 index 0000000..3976e2f --- /dev/null +++ b/app/main/api/internal/handler/admin_menu/createmenuhandler.go @@ -0,0 +1,29 @@ +package admin_menu + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tyc-server/app/main/api/internal/logic/admin_menu" + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/common/result" + "tyc-server/pkg/lzkit/validator" +) + +func CreateMenuHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.CreateMenuReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_menu.NewCreateMenuLogic(r.Context(), svcCtx) + resp, err := l.CreateMenu(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_menu/deletemenuhandler.go b/app/main/api/internal/handler/admin_menu/deletemenuhandler.go new file mode 100644 index 0000000..dfb22c5 --- /dev/null +++ b/app/main/api/internal/handler/admin_menu/deletemenuhandler.go @@ -0,0 +1,29 @@ +package admin_menu + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tyc-server/app/main/api/internal/logic/admin_menu" + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/common/result" + "tyc-server/pkg/lzkit/validator" +) + +func DeleteMenuHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.DeleteMenuReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_menu.NewDeleteMenuLogic(r.Context(), svcCtx) + resp, err := l.DeleteMenu(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_menu/getmenuallhandler.go b/app/main/api/internal/handler/admin_menu/getmenuallhandler.go new file mode 100644 index 0000000..5d42b54 --- /dev/null +++ b/app/main/api/internal/handler/admin_menu/getmenuallhandler.go @@ -0,0 +1,29 @@ +package admin_menu + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tyc-server/app/main/api/internal/logic/admin_menu" + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/common/result" + "tyc-server/pkg/lzkit/validator" +) + +func GetMenuAllHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.GetMenuAllReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_menu.NewGetMenuAllLogic(r.Context(), svcCtx) + resp, err := l.GetMenuAll(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_menu/getmenudetailhandler.go b/app/main/api/internal/handler/admin_menu/getmenudetailhandler.go new file mode 100644 index 0000000..a216072 --- /dev/null +++ b/app/main/api/internal/handler/admin_menu/getmenudetailhandler.go @@ -0,0 +1,29 @@ +package admin_menu + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tyc-server/app/main/api/internal/logic/admin_menu" + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/common/result" + "tyc-server/pkg/lzkit/validator" +) + +func GetMenuDetailHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.GetMenuDetailReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_menu.NewGetMenuDetailLogic(r.Context(), svcCtx) + resp, err := l.GetMenuDetail(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_menu/getmenulisthandler.go b/app/main/api/internal/handler/admin_menu/getmenulisthandler.go new file mode 100644 index 0000000..571fc52 --- /dev/null +++ b/app/main/api/internal/handler/admin_menu/getmenulisthandler.go @@ -0,0 +1,29 @@ +package admin_menu + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tyc-server/app/main/api/internal/logic/admin_menu" + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/common/result" + "tyc-server/pkg/lzkit/validator" +) + +func GetMenuListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.GetMenuListReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_menu.NewGetMenuListLogic(r.Context(), svcCtx) + resp, err := l.GetMenuList(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_menu/updatemenuhandler.go b/app/main/api/internal/handler/admin_menu/updatemenuhandler.go new file mode 100644 index 0000000..c78a73f --- /dev/null +++ b/app/main/api/internal/handler/admin_menu/updatemenuhandler.go @@ -0,0 +1,29 @@ +package admin_menu + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tyc-server/app/main/api/internal/logic/admin_menu" + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/common/result" + "tyc-server/pkg/lzkit/validator" +) + +func UpdateMenuHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.UpdateMenuReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_menu.NewUpdateMenuLogic(r.Context(), svcCtx) + resp, err := l.UpdateMenu(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_promotion/createpromotionlinkhandler.go b/app/main/api/internal/handler/admin_promotion/createpromotionlinkhandler.go new file mode 100644 index 0000000..448fc1e --- /dev/null +++ b/app/main/api/internal/handler/admin_promotion/createpromotionlinkhandler.go @@ -0,0 +1,29 @@ +package admin_promotion + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tyc-server/app/main/api/internal/logic/admin_promotion" + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/common/result" + "tyc-server/pkg/lzkit/validator" +) + +func CreatePromotionLinkHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.CreatePromotionLinkReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_promotion.NewCreatePromotionLinkLogic(r.Context(), svcCtx) + resp, err := l.CreatePromotionLink(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_promotion/deletepromotionlinkhandler.go b/app/main/api/internal/handler/admin_promotion/deletepromotionlinkhandler.go new file mode 100644 index 0000000..98c5fef --- /dev/null +++ b/app/main/api/internal/handler/admin_promotion/deletepromotionlinkhandler.go @@ -0,0 +1,30 @@ +package admin_promotion + +import ( + "net/http" + + "tyc-server/app/main/api/internal/logic/admin_promotion" + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/common/result" + "tyc-server/pkg/lzkit/validator" + + "github.com/zeromicro/go-zero/rest/httpx" +) + +func DeletePromotionLinkHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.DeletePromotionLinkReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_promotion.NewDeletePromotionLinkLogic(r.Context(), svcCtx) + err := l.DeletePromotionLink(&req) + result.HttpResult(r, w, nil, err) + } +} diff --git a/app/main/api/internal/handler/admin_promotion/getpromotionlinkdetailhandler.go b/app/main/api/internal/handler/admin_promotion/getpromotionlinkdetailhandler.go new file mode 100644 index 0000000..171169f --- /dev/null +++ b/app/main/api/internal/handler/admin_promotion/getpromotionlinkdetailhandler.go @@ -0,0 +1,29 @@ +package admin_promotion + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tyc-server/app/main/api/internal/logic/admin_promotion" + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/common/result" + "tyc-server/pkg/lzkit/validator" +) + +func GetPromotionLinkDetailHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.GetPromotionLinkDetailReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_promotion.NewGetPromotionLinkDetailLogic(r.Context(), svcCtx) + resp, err := l.GetPromotionLinkDetail(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_promotion/getpromotionlinklisthandler.go b/app/main/api/internal/handler/admin_promotion/getpromotionlinklisthandler.go new file mode 100644 index 0000000..53ee65e --- /dev/null +++ b/app/main/api/internal/handler/admin_promotion/getpromotionlinklisthandler.go @@ -0,0 +1,29 @@ +package admin_promotion + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tyc-server/app/main/api/internal/logic/admin_promotion" + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/common/result" + "tyc-server/pkg/lzkit/validator" +) + +func GetPromotionLinkListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.GetPromotionLinkListReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_promotion.NewGetPromotionLinkListLogic(r.Context(), svcCtx) + resp, err := l.GetPromotionLinkList(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_promotion/getpromotionstatshistoryhandler.go b/app/main/api/internal/handler/admin_promotion/getpromotionstatshistoryhandler.go new file mode 100644 index 0000000..166b3ac --- /dev/null +++ b/app/main/api/internal/handler/admin_promotion/getpromotionstatshistoryhandler.go @@ -0,0 +1,29 @@ +package admin_promotion + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tyc-server/app/main/api/internal/logic/admin_promotion" + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/common/result" + "tyc-server/pkg/lzkit/validator" +) + +func GetPromotionStatsHistoryHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.GetPromotionStatsHistoryReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_promotion.NewGetPromotionStatsHistoryLogic(r.Context(), svcCtx) + resp, err := l.GetPromotionStatsHistory(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_promotion/getpromotionstatstotalhandler.go b/app/main/api/internal/handler/admin_promotion/getpromotionstatstotalhandler.go new file mode 100644 index 0000000..444ae11 --- /dev/null +++ b/app/main/api/internal/handler/admin_promotion/getpromotionstatstotalhandler.go @@ -0,0 +1,29 @@ +package admin_promotion + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tyc-server/app/main/api/internal/logic/admin_promotion" + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/common/result" + "tyc-server/pkg/lzkit/validator" +) + +func GetPromotionStatsTotalHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.GetPromotionStatsTotalReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_promotion.NewGetPromotionStatsTotalLogic(r.Context(), svcCtx) + resp, err := l.GetPromotionStatsTotal(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_promotion/recordlinkclickhandler.go b/app/main/api/internal/handler/admin_promotion/recordlinkclickhandler.go new file mode 100644 index 0000000..09ec8e4 --- /dev/null +++ b/app/main/api/internal/handler/admin_promotion/recordlinkclickhandler.go @@ -0,0 +1,29 @@ +package admin_promotion + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tyc-server/app/main/api/internal/logic/admin_promotion" + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/common/result" + "tyc-server/pkg/lzkit/validator" +) + +func RecordLinkClickHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.RecordLinkClickReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_promotion.NewRecordLinkClickLogic(r.Context(), svcCtx) + resp, err := l.RecordLinkClick(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_promotion/updatepromotionlinkhandler.go b/app/main/api/internal/handler/admin_promotion/updatepromotionlinkhandler.go new file mode 100644 index 0000000..606acf8 --- /dev/null +++ b/app/main/api/internal/handler/admin_promotion/updatepromotionlinkhandler.go @@ -0,0 +1,30 @@ +package admin_promotion + +import ( + "net/http" + + "tyc-server/app/main/api/internal/logic/admin_promotion" + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/common/result" + "tyc-server/pkg/lzkit/validator" + + "github.com/zeromicro/go-zero/rest/httpx" +) + +func UpdatePromotionLinkHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.UpdatePromotionLinkReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_promotion.NewUpdatePromotionLinkLogic(r.Context(), svcCtx) + err := l.UpdatePromotionLink(&req) + result.HttpResult(r, w, nil, err) + } +} diff --git a/app/main/api/internal/handler/admin_role/createrolehandler.go b/app/main/api/internal/handler/admin_role/createrolehandler.go new file mode 100644 index 0000000..889c28a --- /dev/null +++ b/app/main/api/internal/handler/admin_role/createrolehandler.go @@ -0,0 +1,29 @@ +package admin_role + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tyc-server/app/main/api/internal/logic/admin_role" + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/common/result" + "tyc-server/pkg/lzkit/validator" +) + +func CreateRoleHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.CreateRoleReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_role.NewCreateRoleLogic(r.Context(), svcCtx) + resp, err := l.CreateRole(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_role/deleterolehandler.go b/app/main/api/internal/handler/admin_role/deleterolehandler.go new file mode 100644 index 0000000..594c9e9 --- /dev/null +++ b/app/main/api/internal/handler/admin_role/deleterolehandler.go @@ -0,0 +1,29 @@ +package admin_role + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tyc-server/app/main/api/internal/logic/admin_role" + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/common/result" + "tyc-server/pkg/lzkit/validator" +) + +func DeleteRoleHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.DeleteRoleReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_role.NewDeleteRoleLogic(r.Context(), svcCtx) + resp, err := l.DeleteRole(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_role/getroledetailhandler.go b/app/main/api/internal/handler/admin_role/getroledetailhandler.go new file mode 100644 index 0000000..5033e19 --- /dev/null +++ b/app/main/api/internal/handler/admin_role/getroledetailhandler.go @@ -0,0 +1,29 @@ +package admin_role + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tyc-server/app/main/api/internal/logic/admin_role" + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/common/result" + "tyc-server/pkg/lzkit/validator" +) + +func GetRoleDetailHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.GetRoleDetailReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_role.NewGetRoleDetailLogic(r.Context(), svcCtx) + resp, err := l.GetRoleDetail(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_role/getrolelisthandler.go b/app/main/api/internal/handler/admin_role/getrolelisthandler.go new file mode 100644 index 0000000..3d24d94 --- /dev/null +++ b/app/main/api/internal/handler/admin_role/getrolelisthandler.go @@ -0,0 +1,29 @@ +package admin_role + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tyc-server/app/main/api/internal/logic/admin_role" + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/common/result" + "tyc-server/pkg/lzkit/validator" +) + +func GetRoleListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.GetRoleListReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_role.NewGetRoleListLogic(r.Context(), svcCtx) + resp, err := l.GetRoleList(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_role/updaterolehandler.go b/app/main/api/internal/handler/admin_role/updaterolehandler.go new file mode 100644 index 0000000..b2e1c01 --- /dev/null +++ b/app/main/api/internal/handler/admin_role/updaterolehandler.go @@ -0,0 +1,29 @@ +package admin_role + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tyc-server/app/main/api/internal/logic/admin_role" + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/common/result" + "tyc-server/pkg/lzkit/validator" +) + +func UpdateRoleHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.UpdateRoleReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_role.NewUpdateRoleLogic(r.Context(), svcCtx) + resp, err := l.UpdateRole(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_user/admincreateuserhandler.go b/app/main/api/internal/handler/admin_user/admincreateuserhandler.go new file mode 100644 index 0000000..01f835f --- /dev/null +++ b/app/main/api/internal/handler/admin_user/admincreateuserhandler.go @@ -0,0 +1,29 @@ +package admin_user + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tyc-server/app/main/api/internal/logic/admin_user" + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/common/result" + "tyc-server/pkg/lzkit/validator" +) + +func AdminCreateUserHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.AdminCreateUserReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_user.NewAdminCreateUserLogic(r.Context(), svcCtx) + resp, err := l.AdminCreateUser(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_user/admindeleteuserhandler.go b/app/main/api/internal/handler/admin_user/admindeleteuserhandler.go new file mode 100644 index 0000000..9c1a523 --- /dev/null +++ b/app/main/api/internal/handler/admin_user/admindeleteuserhandler.go @@ -0,0 +1,29 @@ +package admin_user + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tyc-server/app/main/api/internal/logic/admin_user" + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/common/result" + "tyc-server/pkg/lzkit/validator" +) + +func AdminDeleteUserHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.AdminDeleteUserReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_user.NewAdminDeleteUserLogic(r.Context(), svcCtx) + resp, err := l.AdminDeleteUser(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_user/admingetuserdetailhandler.go b/app/main/api/internal/handler/admin_user/admingetuserdetailhandler.go new file mode 100644 index 0000000..64c95f1 --- /dev/null +++ b/app/main/api/internal/handler/admin_user/admingetuserdetailhandler.go @@ -0,0 +1,29 @@ +package admin_user + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tyc-server/app/main/api/internal/logic/admin_user" + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/common/result" + "tyc-server/pkg/lzkit/validator" +) + +func AdminGetUserDetailHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.AdminGetUserDetailReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_user.NewAdminGetUserDetailLogic(r.Context(), svcCtx) + resp, err := l.AdminGetUserDetail(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_user/admingetuserlisthandler.go b/app/main/api/internal/handler/admin_user/admingetuserlisthandler.go new file mode 100644 index 0000000..b166fe0 --- /dev/null +++ b/app/main/api/internal/handler/admin_user/admingetuserlisthandler.go @@ -0,0 +1,30 @@ +package admin_user + +import ( + "net/http" + + "tyc-server/app/main/api/internal/logic/admin_user" + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/common/result" + "tyc-server/pkg/lzkit/validator" + + "github.com/zeromicro/go-zero/rest/httpx" +) + +func AdminGetUserListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.AdminGetUserListReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_user.NewAdminGetUserListLogic(r.Context(), svcCtx) + resp, err := l.AdminGetUserList(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_user/adminupdateuserhandler.go b/app/main/api/internal/handler/admin_user/adminupdateuserhandler.go new file mode 100644 index 0000000..9f8810a --- /dev/null +++ b/app/main/api/internal/handler/admin_user/adminupdateuserhandler.go @@ -0,0 +1,29 @@ +package admin_user + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tyc-server/app/main/api/internal/logic/admin_user" + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/common/result" + "tyc-server/pkg/lzkit/validator" +) + +func AdminUpdateUserHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.AdminUpdateUserReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_user.NewAdminUpdateUserLogic(r.Context(), svcCtx) + resp, err := l.AdminUpdateUser(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_user/adminuserinfohandler.go b/app/main/api/internal/handler/admin_user/adminuserinfohandler.go new file mode 100644 index 0000000..78f7a92 --- /dev/null +++ b/app/main/api/internal/handler/admin_user/adminuserinfohandler.go @@ -0,0 +1,29 @@ +package admin_user + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tyc-server/app/main/api/internal/logic/admin_user" + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/common/result" + "tyc-server/pkg/lzkit/validator" +) + +func AdminUserInfoHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.AdminUserInfoReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_user.NewAdminUserInfoLogic(r.Context(), svcCtx) + resp, err := l.AdminUserInfo(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/routes.go b/app/main/api/internal/handler/routes.go index abfb1c0..0540091 100644 --- a/app/main/api/internal/handler/routes.go +++ b/app/main/api/internal/handler/routes.go @@ -4,6 +4,11 @@ package handler import ( "net/http" + admin_auth "tyc-server/app/main/api/internal/handler/admin_auth" + admin_menu "tyc-server/app/main/api/internal/handler/admin_menu" + admin_promotion "tyc-server/app/main/api/internal/handler/admin_promotion" + admin_role "tyc-server/app/main/api/internal/handler/admin_role" + admin_user "tyc-server/app/main/api/internal/handler/admin_user" auth "tyc-server/app/main/api/internal/handler/auth" notification "tyc-server/app/main/api/internal/handler/notification" pay "tyc-server/app/main/api/internal/handler/pay" @@ -16,6 +21,209 @@ import ( ) func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { + server.AddRoutes( + []rest.Route{ + { + // 登录 + Method: http.MethodPost, + Path: "/login", + Handler: admin_auth.AdminLoginHandler(serverCtx), + }, + }, + rest.WithPrefix("/api/v1/admin/auth"), + ) + + server.AddRoutes( + []rest.Route{ + { + // 获取所有菜单(树形结构) + Method: http.MethodGet, + Path: "/all", + Handler: admin_menu.GetMenuAllHandler(serverCtx), + }, + { + // 创建菜单 + Method: http.MethodPost, + Path: "/create", + Handler: admin_menu.CreateMenuHandler(serverCtx), + }, + { + // 删除菜单 + Method: http.MethodDelete, + Path: "/delete/:id", + Handler: admin_menu.DeleteMenuHandler(serverCtx), + }, + { + // 获取菜单详情 + Method: http.MethodGet, + Path: "/detail/:id", + Handler: admin_menu.GetMenuDetailHandler(serverCtx), + }, + { + // 获取菜单列表 + Method: http.MethodGet, + Path: "/list", + Handler: admin_menu.GetMenuListHandler(serverCtx), + }, + { + // 更新菜单 + Method: http.MethodPut, + Path: "/update/:id", + Handler: admin_menu.UpdateMenuHandler(serverCtx), + }, + }, + rest.WithJwt(serverCtx.Config.JwtAuth.AccessSecret), + rest.WithPrefix("/api/v1/admin/menu"), + ) + + server.AddRoutes( + []rest.Route{ + { + // 创建推广链接 + Method: http.MethodPost, + Path: "/create", + Handler: admin_promotion.CreatePromotionLinkHandler(serverCtx), + }, + { + // 删除推广链接 + Method: http.MethodDelete, + Path: "/delete/:id", + Handler: admin_promotion.DeletePromotionLinkHandler(serverCtx), + }, + { + // 获取推广链接详情 + Method: http.MethodGet, + Path: "/detail/:id", + Handler: admin_promotion.GetPromotionLinkDetailHandler(serverCtx), + }, + { + // 获取推广链接列表 + Method: http.MethodGet, + Path: "/list", + Handler: admin_promotion.GetPromotionLinkListHandler(serverCtx), + }, + { + // 更新推广链接 + Method: http.MethodPut, + Path: "/update/:id", + Handler: admin_promotion.UpdatePromotionLinkHandler(serverCtx), + }, + }, + rest.WithJwt(serverCtx.Config.JwtAuth.AccessSecret), + rest.WithPrefix("/api/v1/admin/promotion/link"), + ) + + server.AddRoutes( + []rest.Route{ + { + // 记录链接点击 + Method: http.MethodGet, + Path: "/record/:path", + Handler: admin_promotion.RecordLinkClickHandler(serverCtx), + }, + }, + rest.WithPrefix("/api/v1/admin/promotion/link"), + ) + + server.AddRoutes( + []rest.Route{ + { + // 获取推广历史记录 + Method: http.MethodGet, + Path: "/history", + Handler: admin_promotion.GetPromotionStatsHistoryHandler(serverCtx), + }, + { + // 获取推广总统计 + Method: http.MethodGet, + Path: "/total", + Handler: admin_promotion.GetPromotionStatsTotalHandler(serverCtx), + }, + }, + rest.WithJwt(serverCtx.Config.JwtAuth.AccessSecret), + rest.WithPrefix("/api/v1/admin/promotion/stats"), + ) + + server.AddRoutes( + []rest.Route{ + { + // 创建角色 + Method: http.MethodPost, + Path: "/create", + Handler: admin_role.CreateRoleHandler(serverCtx), + }, + { + // 删除角色 + Method: http.MethodDelete, + Path: "/delete/:id", + Handler: admin_role.DeleteRoleHandler(serverCtx), + }, + { + // 获取角色详情 + Method: http.MethodGet, + Path: "/detail/:id", + Handler: admin_role.GetRoleDetailHandler(serverCtx), + }, + { + // 获取角色列表 + Method: http.MethodGet, + Path: "/list", + Handler: admin_role.GetRoleListHandler(serverCtx), + }, + { + // 更新角色 + Method: http.MethodPut, + Path: "/update/:id", + Handler: admin_role.UpdateRoleHandler(serverCtx), + }, + }, + rest.WithJwt(serverCtx.Config.JwtAuth.AccessSecret), + rest.WithPrefix("/api/v1/admin/role"), + ) + + server.AddRoutes( + []rest.Route{ + { + // 创建用户 + Method: http.MethodPost, + Path: "/create", + Handler: admin_user.AdminCreateUserHandler(serverCtx), + }, + { + // 删除用户 + Method: http.MethodDelete, + Path: "/delete/:id", + Handler: admin_user.AdminDeleteUserHandler(serverCtx), + }, + { + // 获取用户详情 + Method: http.MethodGet, + Path: "/detail/:id", + Handler: admin_user.AdminGetUserDetailHandler(serverCtx), + }, + { + // 用户信息 + Method: http.MethodGet, + Path: "/info", + Handler: admin_user.AdminUserInfoHandler(serverCtx), + }, + { + // 获取用户列表 + Method: http.MethodGet, + Path: "/list", + Handler: admin_user.AdminGetUserListHandler(serverCtx), + }, + { + // 更新用户 + Method: http.MethodPut, + Path: "/update/:id", + Handler: admin_user.AdminUpdateUserHandler(serverCtx), + }, + }, + rest.WithJwt(serverCtx.Config.JwtAuth.AccessSecret), + rest.WithPrefix("/api/v1/admin/user"), + ) + server.AddRoutes( []rest.Route{ { @@ -62,21 +270,18 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { ) server.AddRoutes( - rest.WithMiddlewares( - []rest.Middleware{serverCtx.SourceInterceptor}, - []rest.Route{ - { - Method: http.MethodPost, - Path: "/pay/iap_callback", - Handler: pay.IapCallbackHandler(serverCtx), - }, - { - Method: http.MethodPost, - Path: "/pay/payment", - Handler: pay.PaymentHandler(serverCtx), - }, - }..., - ), + []rest.Route{ + { + Method: http.MethodPost, + Path: "/pay/iap_callback", + Handler: pay.IapCallbackHandler(serverCtx), + }, + { + Method: http.MethodPost, + Path: "/pay/payment", + Handler: pay.PaymentHandler(serverCtx), + }, + }, rest.WithJwt(serverCtx.Config.JwtAuth.AccessSecret), rest.WithPrefix("/api/v1"), ) @@ -99,16 +304,13 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { ) server.AddRoutes( - rest.WithMiddlewares( - []rest.Middleware{serverCtx.SourceInterceptor}, - []rest.Route{ - { - Method: http.MethodGet, - Path: "/render_list/:module", - Handler: product.GetProductRenderListHandler(serverCtx), - }, - }..., - ), + []rest.Route{ + { + Method: http.MethodGet, + Path: "/render_list/:module", + Handler: product.GetProductRenderListHandler(serverCtx), + }, + }, rest.WithPrefix("/api/v1/product"), ) diff --git a/app/main/api/internal/logic/admin_auth/adminloginlogic.go b/app/main/api/internal/logic/admin_auth/adminloginlogic.go new file mode 100644 index 0000000..35a8ce4 --- /dev/null +++ b/app/main/api/internal/logic/admin_auth/adminloginlogic.go @@ -0,0 +1,85 @@ +package admin_auth + +import ( + "context" + + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + jwtx "tyc-server/common/jwt" + "tyc-server/common/xerr" + "tyc-server/pkg/lzkit/crypto" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" +) + +type AdminLoginLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminLoginLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminLoginLogic { + return &AdminLoginLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminLoginLogic) AdminLogin(req *types.AdminLoginReq) (resp *types.AdminLoginResp, err error) { + // 1. 验证验证码 + if !req.Captcha { + return nil, errors.Wrapf(xerr.NewErrMsg("验证码错误"), "用户登录, 验证码错误, 验证码: %v", req.Captcha) + } + + // 2. 验证用户名和密码 + user, err := l.svcCtx.AdminUserModel.FindOneByUsername(l.ctx, req.Username) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrMsg("用户名或密码错误"), "用户登录, 用户名或密码错误, 用户名: %s", req.Username) + } + + // 3. 验证密码 + if !crypto.PasswordVerify(req.Password, user.Password) { + return nil, errors.Wrapf(xerr.NewErrMsg("用户名或密码错误"), "用户登录, 用户名或密码错误, 用户名: %s", req.Username) + } + + // 4. 获取权限 + adminUserRoleBuilder := l.svcCtx.AdminUserRoleModel.SelectBuilder().Where(squirrel.Eq{"user_id": user.Id}) + permissions, err := l.svcCtx.AdminUserRoleModel.FindAll(l.ctx, adminUserRoleBuilder, "role_id DESC") + if err != nil { + return nil, errors.Wrapf(xerr.NewErrMsg("获取权限失败"), "用户登录, 获取权限失败, 用户名: %s", req.Username) + } + + // 获取角色ID数组 + roleIds := make([]int64, 0) + for _, permission := range permissions { + roleIds = append(roleIds, permission.RoleId) + } + + // 获取角色名称 + roles := make([]string, 0) + for _, roleId := range roleIds { + role, err := l.svcCtx.AdminRoleModel.FindOne(l.ctx, roleId) + if err != nil { + continue + } + roles = append(roles, role.RoleCode) + } + + // 5. 生成token + refreshToken := l.svcCtx.Config.JwtAuth.RefreshAfter + expiresAt := l.svcCtx.Config.JwtAuth.AccessExpire + token, err := jwtx.GenerateJwtToken(user.Id, l.svcCtx.Config.JwtAuth.AccessSecret, expiresAt) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrMsg("生成token失败"), "用户登录, 生成token失败, 用户名: %s", req.Username) + } + + return &types.AdminLoginResp{ + AccessToken: token, + AccessExpire: expiresAt, + RefreshAfter: refreshToken, + Roles: roles, + }, nil +} diff --git a/app/main/api/internal/logic/admin_menu/createmenulogic.go b/app/main/api/internal/logic/admin_menu/createmenulogic.go new file mode 100644 index 0000000..9df24b5 --- /dev/null +++ b/app/main/api/internal/logic/admin_menu/createmenulogic.go @@ -0,0 +1,97 @@ +package admin_menu + +import ( + "context" + "database/sql" + "encoding/json" + "time" + + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/app/main/model" + "tyc-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" +) + +type CreateMenuLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewCreateMenuLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CreateMenuLogic { + return &CreateMenuLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *CreateMenuLogic) CreateMenu(req *types.CreateMenuReq) (resp *types.CreateMenuResp, err error) { + // 1. 参数验证 + if req.Name == "" { + return nil, errors.Wrapf(xerr.NewErrMsg("菜单名称不能为空"), "菜单名称不能为空") + } + if req.Type == "menu" && req.Component == "" { + return nil, errors.Wrapf(xerr.NewErrMsg("组件路径不能为空"), "组件路径不能为空") + } + + // 2. 检查名称和路径是否重复 + exists, err := l.svcCtx.AdminMenuModel.FindOneByNamePath(l.ctx, req.Name, req.Path) + if err != nil && !errors.Is(err, model.ErrNotFound) { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询菜单失败, err: %v", err) + } + if exists != nil { + return nil, errors.Wrapf(xerr.NewErrMsg("菜单名称或路径已存在"), "菜单名称或路径已存在") + } + + // 3. 检查父菜单是否存在(如果不是根菜单) + if req.Pid > 0 { + parentMenu, err := l.svcCtx.AdminMenuModel.FindOne(l.ctx, req.Pid) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询父菜单失败, id: %d, err: %v", req.Pid, err) + } + if parentMenu == nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "父菜单不存在, id: %d", req.Pid) + } + } + + // 4. 将类型标签转换为值 + typeValue, err := l.svcCtx.DictService.GetDictValue(l.ctx, "admin_menu_type", req.Type) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "菜单类型无效: %v", err) + } + + // 5. 创建菜单记录 + menu := &model.AdminMenu{ + Pid: req.Pid, + Name: req.Name, + Path: req.Path, + Component: req.Component, + Redirect: sql.NullString{String: req.Redirect, Valid: req.Redirect != ""}, + Status: req.Status, + Type: typeValue, + Sort: req.Sort, + CreateTime: time.Now(), + UpdateTime: time.Now(), + } + + // 将Meta转换为JSON字符串 + metaJson, err := json.Marshal(req.Meta) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "Meta数据格式错误: %v", err) + } + menu.Meta = string(metaJson) + + // 6. 保存到数据库 + _, err = l.svcCtx.AdminMenuModel.Insert(l.ctx, nil, menu) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "创建菜单失败, err: %v", err) + } + + return &types.CreateMenuResp{ + Id: menu.Id, + }, nil +} diff --git a/app/main/api/internal/logic/admin_menu/deletemenulogic.go b/app/main/api/internal/logic/admin_menu/deletemenulogic.go new file mode 100644 index 0000000..4c48a62 --- /dev/null +++ b/app/main/api/internal/logic/admin_menu/deletemenulogic.go @@ -0,0 +1,30 @@ +package admin_menu + +import ( + "context" + + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + + "github.com/zeromicro/go-zero/core/logx" +) + +type DeleteMenuLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewDeleteMenuLogic(ctx context.Context, svcCtx *svc.ServiceContext) *DeleteMenuLogic { + return &DeleteMenuLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *DeleteMenuLogic) DeleteMenu(req *types.DeleteMenuReq) (resp *types.DeleteMenuResp, err error) { + // todo: add your logic here and delete this line + + return +} diff --git a/app/main/api/internal/logic/admin_menu/getmenualllogic.go b/app/main/api/internal/logic/admin_menu/getmenualllogic.go new file mode 100644 index 0000000..728dcd5 --- /dev/null +++ b/app/main/api/internal/logic/admin_menu/getmenualllogic.go @@ -0,0 +1,250 @@ +package admin_menu + +import ( + "context" + "sort" + "strconv" + + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/common/ctxdata" + "tyc-server/common/xerr" + + "github.com/Masterminds/squirrel" + "github.com/bytedance/sonic" + "github.com/pkg/errors" + "github.com/samber/lo" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/mr" +) + +type GetMenuAllLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewGetMenuAllLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetMenuAllLogic { + return &GetMenuAllLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *GetMenuAllLogic) GetMenuAll(req *types.GetMenuAllReq) (resp *[]types.GetMenuAllResp, err error) { + userId, err := ctxdata.GetUidFromCtx(l.ctx) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取用户ID失败, %+v", err) + } + + // 使用MapReduceVoid并发获取用户角色 + var roleIds []int64 + var permissions []*struct { + RoleId int64 + } + + type UserRoleResult struct { + RoleId int64 + } + + err = mr.MapReduceVoid( + func(source chan<- interface{}) { + adminUserRoleBuilder := l.svcCtx.AdminUserRoleModel.SelectBuilder().Where(squirrel.Eq{"user_id": userId}) + source <- adminUserRoleBuilder + }, + func(item interface{}, writer mr.Writer[*UserRoleResult], cancel func(error)) { + builder := item.(squirrel.SelectBuilder) + result, err := l.svcCtx.AdminUserRoleModel.FindAll(l.ctx, builder, "role_id DESC") + if err != nil { + cancel(errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取用户角色信息失败, %+v", err)) + return + } + + for _, r := range result { + writer.Write(&UserRoleResult{RoleId: r.RoleId}) + } + }, + func(pipe <-chan *UserRoleResult, cancel func(error)) { + for item := range pipe { + permissions = append(permissions, &struct{ RoleId int64 }{RoleId: item.RoleId}) + } + }, + ) + if err != nil { + return nil, err + } + + for _, permission := range permissions { + roleIds = append(roleIds, permission.RoleId) + } + + // 使用MapReduceVoid并发获取角色菜单 + var menuIds []int64 + var roleMenus []*struct { + MenuId int64 + } + + type RoleMenuResult struct { + MenuId int64 + } + + err = mr.MapReduceVoid( + func(source chan<- interface{}) { + getRoleMenuBuilder := l.svcCtx.AdminRoleMenuModel.SelectBuilder().Where(squirrel.Eq{"role_id": roleIds}) + source <- getRoleMenuBuilder + }, + func(item interface{}, writer mr.Writer[*RoleMenuResult], cancel func(error)) { + builder := item.(squirrel.SelectBuilder) + result, err := l.svcCtx.AdminRoleMenuModel.FindAll(l.ctx, builder, "id DESC") + if err != nil { + cancel(errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取角色菜单信息失败, %+v", err)) + return + } + + for _, r := range result { + writer.Write(&RoleMenuResult{MenuId: r.MenuId}) + } + }, + func(pipe <-chan *RoleMenuResult, cancel func(error)) { + for item := range pipe { + roleMenus = append(roleMenus, &struct{ MenuId int64 }{MenuId: item.MenuId}) + } + }, + ) + if err != nil { + return nil, err + } + + for _, roleMenu := range roleMenus { + menuIds = append(menuIds, roleMenu.MenuId) + } + + // 使用MapReduceVoid并发获取菜单 + type AdminMenuStruct struct { + Id int64 + Pid int64 + Name string + Path string + Component string + Redirect struct { + String string + Valid bool + } + Meta string + Sort int64 + Type int64 + Status int64 + } + + var menus []*AdminMenuStruct + + err = mr.MapReduceVoid( + func(source chan<- interface{}) { + adminMenuBuilder := l.svcCtx.AdminMenuModel.SelectBuilder().Where(squirrel.Eq{"id": menuIds}) + source <- adminMenuBuilder + }, + func(item interface{}, writer mr.Writer[*AdminMenuStruct], cancel func(error)) { + builder := item.(squirrel.SelectBuilder) + result, err := l.svcCtx.AdminMenuModel.FindAll(l.ctx, builder, "sort ASC") + if err != nil { + cancel(errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取菜单信息失败, %+v", err)) + return + } + + for _, r := range result { + menu := &AdminMenuStruct{ + Id: r.Id, + Pid: r.Pid, + Name: r.Name, + Path: r.Path, + Component: r.Component, + Redirect: r.Redirect, + Meta: r.Meta, + Sort: r.Sort, + Type: r.Type, + Status: r.Status, + } + writer.Write(menu) + } + }, + func(pipe <-chan *AdminMenuStruct, cancel func(error)) { + for item := range pipe { + menus = append(menus, item) + } + }, + ) + if err != nil { + return nil, err + } + + // 转换为types.Menu结构并存储到映射表 + menuMap := make(map[string]types.GetMenuAllResp) + for _, menu := range menus { + // 只处理状态正常的菜单 + if menu.Status != 1 { + continue + } + + meta := make(map[string]interface{}) + err = sonic.Unmarshal([]byte(menu.Meta), &meta) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "解析菜单Meta信息失败, %+v", err) + } + + redirect := func() string { + if menu.Redirect.Valid { + return menu.Redirect.String + } + return "" + }() + + menuId := strconv.FormatInt(menu.Id, 10) + menuMap[menuId] = types.GetMenuAllResp{ + Name: menu.Name, + Path: menu.Path, + Redirect: redirect, + Component: menu.Component, + Sort: menu.Sort, + Meta: meta, + Children: make([]types.GetMenuAllResp, 0), + } + } + + // 按ParentId将菜单分组 + menuGroups := lo.GroupBy(menus, func(item *AdminMenuStruct) int64 { + return item.Pid + }) + + // 递归构建菜单树 + var buildMenuTree func(parentId int64) []types.GetMenuAllResp + buildMenuTree = func(parentId int64) []types.GetMenuAllResp { + children := make([]types.GetMenuAllResp, 0) + + childMenus, ok := menuGroups[parentId] + if !ok { + return children + } + + // 按Sort排序 + sort.Slice(childMenus, func(i, j int) bool { + return childMenus[i].Sort < childMenus[j].Sort + }) + + for _, childMenu := range childMenus { + menuId := strconv.FormatInt(childMenu.Id, 10) + if menu, exists := menuMap[menuId]; exists && childMenu.Status == 1 { + // 递归构建子菜单 + menu.Children = buildMenuTree(childMenu.Id) + children = append(children, menu) + } + } + + return children + } + + // 从根菜单开始构建(ParentId为0的是根菜单) + menuTree := buildMenuTree(0) + + return &menuTree, nil +} diff --git a/app/main/api/internal/logic/admin_menu/getmenudetaillogic.go b/app/main/api/internal/logic/admin_menu/getmenudetaillogic.go new file mode 100644 index 0000000..53b3b53 --- /dev/null +++ b/app/main/api/internal/logic/admin_menu/getmenudetaillogic.go @@ -0,0 +1,30 @@ +package admin_menu + +import ( + "context" + + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + + "github.com/zeromicro/go-zero/core/logx" +) + +type GetMenuDetailLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewGetMenuDetailLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetMenuDetailLogic { + return &GetMenuDetailLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *GetMenuDetailLogic) GetMenuDetail(req *types.GetMenuDetailReq) (resp *types.GetMenuDetailResp, err error) { + // todo: add your logic here and delete this line + + return +} diff --git a/app/main/api/internal/logic/admin_menu/getmenulistlogic.go b/app/main/api/internal/logic/admin_menu/getmenulistlogic.go new file mode 100644 index 0000000..11ca015 --- /dev/null +++ b/app/main/api/internal/logic/admin_menu/getmenulistlogic.go @@ -0,0 +1,109 @@ +package admin_menu + +import ( + "context" + "encoding/json" + + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" +) + +type GetMenuListLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewGetMenuListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetMenuListLogic { + return &GetMenuListLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *GetMenuListLogic) GetMenuList(req *types.GetMenuListReq) ([]types.MenuListItem, error) { + // 构建查询条件 + builder := l.svcCtx.AdminMenuModel.SelectBuilder() + + // 添加筛选条件 + if len(req.Name) > 0 { + builder = builder.Where("name LIKE ?", "%"+req.Name+"%") + } + if len(req.Path) > 0 { + builder = builder.Where("path LIKE ?", "%"+req.Path+"%") + } + if req.Status != -1 { + builder = builder.Where("status = ?", req.Status) + } + if req.Type != "" { + builder = builder.Where("type = ?", req.Type) + } + + // 排序但不分页,获取所有符合条件的菜单 + builder = builder.OrderBy("sort ASC") + + // 获取所有菜单 + menus, err := l.svcCtx.AdminMenuModel.FindAll(l.ctx, builder, "id ASC") + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询菜单失败, err: %v", err) + } + + // 将菜单按ID存入map + menuMap := make(map[int64]types.MenuListItem) + for _, menu := range menus { + var meta map[string]interface{} + err := json.Unmarshal([]byte(menu.Meta), &meta) + if err != nil { + logx.Errorf("解析Meta字段失败: %v", err) + meta = make(map[string]interface{}) + } + menuType, err := l.svcCtx.DictService.GetDictLabel(l.ctx, "admin_menu_type", menu.Type) + if err != nil { + logx.Errorf("获取菜单类型失败: %v", err) + menuType = "" + } + item := types.MenuListItem{ + Id: menu.Id, + Pid: menu.Pid, + Name: menu.Name, + Path: menu.Path, + Component: menu.Component, + Redirect: menu.Redirect.String, + Meta: meta, + Status: menu.Status, + Type: menuType, + Sort: menu.Sort, + CreateTime: menu.CreateTime.Format("2006-01-02 15:04:05"), + Children: make([]types.MenuListItem, 0), + } + menuMap[menu.Id] = item + } + + // 构建父子关系 + for _, menu := range menus { + if menu.Pid > 0 { + // 找到父菜单 + if parent, exists := menuMap[menu.Pid]; exists { + // 添加当前菜单到父菜单的子菜单列表 + children := append(parent.Children, menuMap[menu.Id]) + parent.Children = children + menuMap[menu.Pid] = parent + } + } + } + + // 提取顶级菜单(ParentId为0)到响应列表 + result := make([]types.MenuListItem, 0) + for _, menu := range menus { + if menu.Pid == 0 { + result = append(result, menuMap[menu.Id]) + } + } + + return result, nil +} diff --git a/app/main/api/internal/logic/admin_menu/updatemenulogic.go b/app/main/api/internal/logic/admin_menu/updatemenulogic.go new file mode 100644 index 0000000..a1d6172 --- /dev/null +++ b/app/main/api/internal/logic/admin_menu/updatemenulogic.go @@ -0,0 +1,96 @@ +package admin_menu + +import ( + "context" + "database/sql" + "encoding/json" + + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/app/main/model" + "tyc-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" +) + +type UpdateMenuLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewUpdateMenuLogic(ctx context.Context, svcCtx *svc.ServiceContext) *UpdateMenuLogic { + return &UpdateMenuLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *UpdateMenuLogic) UpdateMenu(req *types.UpdateMenuReq) (resp *types.UpdateMenuResp, err error) { + // 1. 检查菜单是否存在 + menu, err := l.svcCtx.AdminMenuModel.FindOne(l.ctx, req.Id) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询菜单失败, id: %d, err: %v", req.Id, err) + } + if menu == nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "菜单不存在, id: %d", req.Id) + } + + // 2. 将类型标签转换为值 + typeValue, err := l.svcCtx.DictService.GetDictValue(l.ctx, "admin_menu_type", req.Type) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "菜单类型无效: %v", err) + } + + // 3. 检查父菜单是否存在(如果不是根菜单) + if req.Pid > 0 { + parentMenu, err := l.svcCtx.AdminMenuModel.FindOne(l.ctx, req.Pid) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询父菜单失败, id: %d, err: %v", req.Pid, err) + } + if parentMenu == nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "父菜单不存在, id: %d", req.Pid) + } + } + + // 4. 检查名称和路径是否重复 + if req.Name != menu.Name || req.Path != menu.Path { + exists, err := l.svcCtx.AdminMenuModel.FindOneByNamePath(l.ctx, req.Name, req.Path) + if err != nil && !errors.Is(err, model.ErrNotFound) { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询菜单失败, err: %v", err) + } + if exists != nil && exists.Id != req.Id { + return nil, errors.Wrapf(xerr.NewErrMsg("菜单名称或路径已存在"), "菜单名称或路径已存在") + } + } + + // 5. 更新菜单信息 + + menu.Pid = req.Pid + menu.Name = req.Name + menu.Path = req.Path + menu.Component = req.Component + menu.Redirect = sql.NullString{String: req.Redirect, Valid: req.Redirect != ""} + menu.Status = req.Status + menu.Type = typeValue + menu.Sort = req.Sort + + // 将Meta转换为JSON字符串 + metaJson, err := json.Marshal(req.Meta) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "Meta数据格式错误: %v", err) + } + menu.Meta = string(metaJson) + + // 6. 保存更新 + _, err = l.svcCtx.AdminMenuModel.Update(l.ctx, nil, menu) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "更新菜单失败, err: %v", err) + } + + return &types.UpdateMenuResp{ + Success: true, + }, nil +} diff --git a/app/main/api/internal/logic/admin_promotion/createpromotionlinklogic.go b/app/main/api/internal/logic/admin_promotion/createpromotionlinklogic.go new file mode 100644 index 0000000..bf5ef7c --- /dev/null +++ b/app/main/api/internal/logic/admin_promotion/createpromotionlinklogic.go @@ -0,0 +1,136 @@ +package admin_promotion + +import ( + "context" + "crypto/rand" + "fmt" + "math/big" + "time" + + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/app/main/model" + "tyc-server/common/ctxdata" + "tyc-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +type CreatePromotionLinkLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewCreatePromotionLinkLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CreatePromotionLinkLogic { + return &CreatePromotionLinkLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +// 生成6位随机字符串(大小写字母和数字) +func generateRandomString() (string, error) { + const ( + chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" + length = 6 + ) + + result := make([]byte, length) + for i := 0; i < length; i++ { + num, err := rand.Int(rand.Reader, big.NewInt(int64(len(chars)))) + if err != nil { + return "", err + } + result[i] = chars[num.Int64()] + } + return string(result), nil +} + +func (l *CreatePromotionLinkLogic) CreatePromotionLink(req *types.CreatePromotionLinkReq) (resp *types.CreatePromotionLinkResp, err error) { + // 获取当前用户ID + adminUserId, getUidErr := ctxdata.GetUidFromCtx(l.ctx) + if getUidErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "创建推广链接, 获取用户信息失败, %+v", getUidErr) + } + + // 生成唯一URL + var url string + maxRetries := 5 // 最大重试次数 + for i := 0; i < maxRetries; i++ { + // 生成6位随机字符串 + randomStr, err := generateRandomString() + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "创建推广链接, 生成随机字符串失败, %+v", err) + } + + // 检查URL是否已存在 + existLink, err := l.svcCtx.AdminPromotionLinkModel.FindOneByUrl(l.ctx, randomStr) + if err != nil && !errors.Is(err, model.ErrNotFound) { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "创建推广链接, 检查URL是否存在失败, %+v", err) + } + + if existLink != nil { + continue // URL已存在,继续尝试 + } + + // URL可用 + url = randomStr + break + } + + if url == "" { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "创建推广链接失败, 多次尝试生成唯一URL均失败") + } + url = fmt.Sprintf("%s/%s", l.svcCtx.Config.AdminPromotion.URLDomain, url) + // 创建推广链接 + link := &model.AdminPromotionLink{ + Name: req.Name, + Url: url, + AdminUserId: adminUserId, + } + + var linkId int64 + err = l.svcCtx.AdminPromotionLinkModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error { + result, err := l.svcCtx.AdminPromotionLinkModel.Insert(l.ctx, session, link) + if err != nil { + return fmt.Errorf("创建推广链接失败, %+v", err) + } + + linkId, err = result.LastInsertId() + if err != nil { + return fmt.Errorf("获取推广链接ID失败, %+v", err) + } + + // 创建总统计记录 + totalStats := &model.AdminPromotionLinkStatsTotal{ + LinkId: linkId, + } + _, err = l.svcCtx.AdminPromotionLinkStatsTotalModel.Insert(l.ctx, session, totalStats) + if err != nil { + return fmt.Errorf("创建推广链接总统计记录失败, %+v", err) + } + + // 创建统计历史记录 + historyStats := &model.AdminPromotionLinkStatsHistory{ + LinkId: linkId, + StatsDate: time.Now().Truncate(24 * time.Hour), + } + _, err = l.svcCtx.AdminPromotionLinkStatsHistoryModel.Insert(l.ctx, session, historyStats) + if err != nil { + return fmt.Errorf("创建推广链接统计历史记录失败, %+v", err) + } + return nil + }) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "创建推广链接失败, %+v", err) + } + + return &types.CreatePromotionLinkResp{ + Id: linkId, + Url: url, + }, nil +} diff --git a/app/main/api/internal/logic/admin_promotion/deletepromotionlinklogic.go b/app/main/api/internal/logic/admin_promotion/deletepromotionlinklogic.go new file mode 100644 index 0000000..07c56b7 --- /dev/null +++ b/app/main/api/internal/logic/admin_promotion/deletepromotionlinklogic.go @@ -0,0 +1,91 @@ +package admin_promotion + +import ( + "context" + + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/app/main/model" + "tyc-server/common/ctxdata" + "tyc-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +type DeletePromotionLinkLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewDeletePromotionLinkLogic(ctx context.Context, svcCtx *svc.ServiceContext) *DeletePromotionLinkLogic { + return &DeletePromotionLinkLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *DeletePromotionLinkLogic) DeletePromotionLink(req *types.DeletePromotionLinkReq) error { + // 获取当前用户ID + adminUserId, getUidErr := ctxdata.GetUidFromCtx(l.ctx) + if getUidErr != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "删除推广链接, 获取用户信息失败, %+v", getUidErr) + } + + // 获取链接信息 + link, err := l.svcCtx.AdminPromotionLinkModel.FindOne(l.ctx, req.Id) + if err != nil { + return errors.Wrapf(err, "删除推广链接, 获取链接信息失败, %+v", err) + } + + // 验证用户权限 + if link.AdminUserId != adminUserId { + return errors.Wrapf(xerr.NewErrMsg("无权限删除此链接"), "删除推广链接, 无权限删除此链接, %+v", link) + } + + // 在事务中执行所有删除操作 + err = l.svcCtx.AdminPromotionLinkModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error { + // 软删除链接 + err = l.svcCtx.AdminPromotionLinkModel.DeleteSoft(l.ctx, session, link) + if err != nil { + return errors.Wrapf(err, "删除推广链接, 软删除链接失败, %+v", err) + } + + // 软删除总统计记录 + totalStats, err := l.svcCtx.AdminPromotionLinkStatsTotalModel.FindOneByLinkId(l.ctx, link.Id) + if err != nil && !errors.Is(err, model.ErrNotFound) { + return errors.Wrapf(err, "删除推广链接, 获取总统计记录失败, %+v", err) + } + if totalStats != nil { + err = l.svcCtx.AdminPromotionLinkStatsTotalModel.DeleteSoft(l.ctx, session, totalStats) + if err != nil { + return errors.Wrapf(err, "删除推广链接, 软删除总统计记录失败, %+v", err) + } + } + + // 软删除历史统计记录 + builder := l.svcCtx.AdminPromotionLinkStatsHistoryModel.SelectBuilder() + builder = builder.Where("link_id = ?", link.Id) + historyStats, err := l.svcCtx.AdminPromotionLinkStatsHistoryModel.FindAll(l.ctx, builder, "") + if err != nil { + return errors.Wrapf(err, "删除推广链接, 获取历史统计记录失败, %+v", err) + } + for _, stat := range historyStats { + err = l.svcCtx.AdminPromotionLinkStatsHistoryModel.DeleteSoft(l.ctx, session, stat) + if err != nil { + return errors.Wrapf(err, "删除推广链接, 软删除历史统计记录失败, %+v", err) + } + } + + return nil + }) + + if err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "删除推广链接失败, %+v", err) + } + + return nil +} diff --git a/app/main/api/internal/logic/admin_promotion/getpromotionlinkdetaillogic.go b/app/main/api/internal/logic/admin_promotion/getpromotionlinkdetaillogic.go new file mode 100644 index 0000000..dfbb758 --- /dev/null +++ b/app/main/api/internal/logic/admin_promotion/getpromotionlinkdetaillogic.go @@ -0,0 +1,65 @@ +package admin_promotion + +import ( + "context" + "fmt" + + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/app/main/model" + "tyc-server/common/ctxdata" + "tyc-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" +) + +type GetPromotionLinkDetailLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewGetPromotionLinkDetailLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetPromotionLinkDetailLogic { + return &GetPromotionLinkDetailLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *GetPromotionLinkDetailLogic) GetPromotionLinkDetail(req *types.GetPromotionLinkDetailReq) (resp *types.GetPromotionLinkDetailResp, err error) { + // 获取当前用户ID + adminUserId, getUidErr := ctxdata.GetUidFromCtx(l.ctx) + if getUidErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取当前用户ID失败, %+v", getUidErr) + } + + // 获取链接信息 + link, err := l.svcCtx.AdminPromotionLinkModel.FindOne(l.ctx, req.Id) + if err != nil { + return nil, errors.Wrapf(err, "获取链接信息失败, %+v", err) + } + + // 验证用户权限 + if link.AdminUserId != adminUserId { + return nil, errors.Wrapf(xerr.NewErrMsg("无权限访问此链接"), "获取链接信息失败, 无权限访问此链接, %+v", link) + } + + // 获取总统计 + totalStats, err := l.svcCtx.AdminPromotionLinkStatsTotalModel.FindOne(l.ctx, link.Id) + if err != nil && !errors.Is(err, model.ErrNotFound) { + return nil, errors.Wrapf(err, "获取总统计失败, %+v", err) + } + return &types.GetPromotionLinkDetailResp{ + Name: link.Name, + Url: link.Url, + ClickCount: totalStats.ClickCount, + PayCount: totalStats.PayCount, + PayAmount: fmt.Sprintf("%.2f", totalStats.PayAmount), + CreateTime: link.CreateTime.Format("2006-01-02 15:04:05"), + UpdateTime: link.UpdateTime.Format("2006-01-02 15:04:05"), + LastClickTime: totalStats.LastClickTime.Time.Format("2006-01-02 15:04:05"), + LastPayTime: totalStats.LastPayTime.Time.Format("2006-01-02 15:04:05"), + }, nil +} diff --git a/app/main/api/internal/logic/admin_promotion/getpromotionlinklistlogic.go b/app/main/api/internal/logic/admin_promotion/getpromotionlinklistlogic.go new file mode 100644 index 0000000..68cb037 --- /dev/null +++ b/app/main/api/internal/logic/admin_promotion/getpromotionlinklistlogic.go @@ -0,0 +1,104 @@ +package admin_promotion + +import ( + "context" + "fmt" + + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/app/main/model" + "tyc-server/common/ctxdata" + "tyc-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/mr" +) + +type GetPromotionLinkListLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewGetPromotionLinkListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetPromotionLinkListLogic { + return &GetPromotionLinkListLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *GetPromotionLinkListLogic) GetPromotionLinkList(req *types.GetPromotionLinkListReq) (resp *types.GetPromotionLinkListResp, err error) { + // 获取当前用户ID + adminUserId, getUidErr := ctxdata.GetUidFromCtx(l.ctx) + if getUidErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取当前用户ID失败, %+v", getUidErr) + } + + // 构建查询条件 + builder := l.svcCtx.AdminPromotionLinkModel.SelectBuilder() + builder = builder.Where("admin_user_id = ?", adminUserId) + if req.Name != "" { + builder = builder.Where("name LIKE ?", "%"+req.Name+"%") + } + if req.Url != "" { + builder = builder.Where("url LIKE ?", "%"+req.Url+"%") + } + + // 获取列表和总数 + links, total, err := l.svcCtx.AdminPromotionLinkModel.FindPageListByPageWithTotal(l.ctx, builder, req.Page, req.PageSize, "create_time DESC") + if err != nil { + return nil, errors.Wrapf(err, "获取推广链接列表失败, %+v", err) + } + + // 使用MapReduce并发获取统计数据 + items := make([]types.PromotionLinkItem, len(links)) + err = mr.MapReduceVoid(func(source chan<- interface{}) { + for _, link := range links { + source <- link + } + }, func(item interface{}, writer mr.Writer[types.PromotionLinkItem], cancel func(error)) { + link := item.(*model.AdminPromotionLink) + // 获取总统计 + totalStats, err := l.svcCtx.AdminPromotionLinkStatsTotalModel.FindOneByLinkId(l.ctx, link.Id) + if err != nil && !errors.Is(err, model.ErrNotFound) { + cancel(errors.Wrapf(err, "获取总统计失败, linkId: %d, %+v", link.Id, err)) + return + } + writer.Write(types.PromotionLinkItem{ + Id: link.Id, + Name: link.Name, + Url: link.Url, + ClickCount: totalStats.ClickCount, + PayCount: totalStats.PayCount, + PayAmount: fmt.Sprintf("%.2f", totalStats.PayAmount), + CreateTime: link.CreateTime.Format("2006-01-02 15:04:05"), + LastClickTime: func() string { + if totalStats.LastClickTime.Valid { + return totalStats.LastClickTime.Time.Format("2006-01-02 15:04:05") + } + return "" + }(), + LastPayTime: func() string { + if totalStats.LastPayTime.Valid { + return totalStats.LastPayTime.Time.Format("2006-01-02 15:04:05") + } + return "" + }(), + }) + }, func(pipe <-chan types.PromotionLinkItem, cancel func(error)) { + for i := 0; i < len(links); i++ { + item := <-pipe + items[i] = item + } + }) + if err != nil { + return nil, errors.Wrapf(err, "获取推广链接统计数据失败, %+v", err) + } + + return &types.GetPromotionLinkListResp{ + Total: total, + Items: items, + }, nil +} diff --git a/app/main/api/internal/logic/admin_promotion/getpromotionstatshistorylogic.go b/app/main/api/internal/logic/admin_promotion/getpromotionstatshistorylogic.go new file mode 100644 index 0000000..3a84e14 --- /dev/null +++ b/app/main/api/internal/logic/admin_promotion/getpromotionstatshistorylogic.go @@ -0,0 +1,83 @@ +package admin_promotion + +import ( + "context" + "time" + + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/common/ctxdata" + "tyc-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" +) + +type GetPromotionStatsHistoryLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewGetPromotionStatsHistoryLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetPromotionStatsHistoryLogic { + return &GetPromotionStatsHistoryLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *GetPromotionStatsHistoryLogic) GetPromotionStatsHistory(req *types.GetPromotionStatsHistoryReq) (resp []types.PromotionStatsHistoryItem, err error) { + // 获取当前用户ID + adminUserId, getUidErr := ctxdata.GetUidFromCtx(l.ctx) + if getUidErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取当前用户ID失败, %+v", getUidErr) + } + // 构建查询条件 + builder := l.svcCtx.AdminPromotionLinkStatsHistoryModel.SelectBuilder() + + // 如果有日期范围,添加日期过滤 + if req.StartDate != "" && req.EndDate != "" { + startDate, err := time.Parse("2006-01-02", req.StartDate) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "开始日期格式错误") + } + endDate, err := time.Parse("2006-01-02", req.EndDate) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "结束日期格式错误") + } + // 将结束日期设置为当天的最后一刻 + endDate = endDate.Add(24*time.Hour - time.Second) + builder = builder.Where("stats_date BETWEEN ? AND ?", startDate, endDate) + } + + // 获取历史统计数据 + historyStats, err := l.svcCtx.AdminPromotionLinkStatsHistoryModel.FindAll(l.ctx, builder, "stats_date DESC") + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取历史统计数据失败") + } + + // 转换为响应格式 + resp = make([]types.PromotionStatsHistoryItem, 0, len(historyStats)) + for _, stat := range historyStats { + // 验证链接是否属于当前用户 + link, err := l.svcCtx.AdminPromotionLinkModel.FindOne(l.ctx, stat.LinkId) + if err != nil { + continue // 如果链接不存在,跳过该记录 + } + if link.AdminUserId != adminUserId { + continue // 如果链接不属于当前用户,跳过该记录 + } + + resp = append(resp, types.PromotionStatsHistoryItem{ + Id: stat.Id, + LinkId: stat.LinkId, + PayAmount: stat.PayAmount, + ClickCount: stat.ClickCount, + PayCount: stat.PayCount, + StatsDate: stat.StatsDate.Format("2006-01-02"), + }) + } + + return resp, nil +} diff --git a/app/main/api/internal/logic/admin_promotion/getpromotionstatstotallogic.go b/app/main/api/internal/logic/admin_promotion/getpromotionstatstotallogic.go new file mode 100644 index 0000000..979715d --- /dev/null +++ b/app/main/api/internal/logic/admin_promotion/getpromotionstatstotallogic.go @@ -0,0 +1,165 @@ +package admin_promotion + +import ( + "context" + "time" + + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/app/main/model" + "tyc-server/common/ctxdata" + "tyc-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/mr" +) + +type GetPromotionStatsTotalLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewGetPromotionStatsTotalLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetPromotionStatsTotalLogic { + return &GetPromotionStatsTotalLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *GetPromotionStatsTotalLogic) GetPromotionStatsTotal(req *types.GetPromotionStatsTotalReq) (resp *types.GetPromotionStatsTotalResp, err error) { + // 获取当前用户ID + adminUserId, getUidErr := ctxdata.GetUidFromCtx(l.ctx) + if getUidErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取当前用户ID失败, %+v", getUidErr) + } + + // 获取用户的所有推广链接 + linkBuilder := l.svcCtx.AdminPromotionLinkModel.SelectBuilder() + linkBuilder = linkBuilder.Where("admin_user_id = ?", adminUserId) + links, err := l.svcCtx.AdminPromotionLinkModel.FindAll(l.ctx, linkBuilder, "") + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取推广链接列表失败, %+v", err) + } + + // 如果没有推广链接,返回空统计 + if len(links) == 0 { + return &types.GetPromotionStatsTotalResp{}, nil + } + + // 构建链接ID列表 + linkIds := make([]int64, len(links)) + for i, link := range links { + linkIds[i] = link.Id + } + + // 获取并计算总统计数据 + var totalClickCount, totalPayCount int64 + var totalPayAmount float64 + err = mr.MapReduceVoid(func(source chan<- interface{}) { + for _, linkId := range linkIds { + source <- linkId + } + }, func(item interface{}, writer mr.Writer[struct { + ClickCount int64 + PayCount int64 + PayAmount float64 + }], cancel func(error)) { + linkId := item.(int64) + stats, err := l.svcCtx.AdminPromotionLinkStatsTotalModel.FindOneByLinkId(l.ctx, linkId) + if err != nil && !errors.Is(err, model.ErrNotFound) { + cancel(errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取总统计数据失败, linkId: %d, %+v", linkId, err)) + return + } + if stats != nil { + writer.Write(struct { + ClickCount int64 + PayCount int64 + PayAmount float64 + }{ + ClickCount: stats.ClickCount, + PayCount: stats.PayCount, + PayAmount: stats.PayAmount, + }) + } + }, func(pipe <-chan struct { + ClickCount int64 + PayCount int64 + PayAmount float64 + }, cancel func(error)) { + for stats := range pipe { + totalClickCount += stats.ClickCount + totalPayCount += stats.PayCount + totalPayAmount += stats.PayAmount + } + }) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取总统计数据失败, %+v", err) + } + + // 获取今日统计数据 + today := time.Now().Truncate(24 * time.Hour) + var todayClickCount, todayPayCount int64 + var todayPayAmount float64 + + err = mr.MapReduceVoid(func(source chan<- interface{}) { + for _, linkId := range linkIds { + source <- linkId + } + }, func(item interface{}, writer mr.Writer[struct { + ClickCount int64 + PayCount int64 + PayAmount float64 + }], cancel func(error)) { + linkId := item.(int64) + builder := l.svcCtx.AdminPromotionLinkStatsHistoryModel.SelectBuilder() + builder = builder.Where("link_id = ? AND DATE(stats_date) = DATE(?)", linkId, today) + histories, err := l.svcCtx.AdminPromotionLinkStatsHistoryModel.FindAll(l.ctx, builder, "") + if err != nil { + cancel(errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取今日统计数据失败, linkId: %d, %+v", linkId, err)) + return + } + + var clickCount, payCount int64 + var payAmount float64 + for _, history := range histories { + clickCount += history.ClickCount + payCount += history.PayCount + payAmount += history.PayAmount + } + + writer.Write(struct { + ClickCount int64 + PayCount int64 + PayAmount float64 + }{ + ClickCount: clickCount, + PayCount: payCount, + PayAmount: payAmount, + }) + }, func(pipe <-chan struct { + ClickCount int64 + PayCount int64 + PayAmount float64 + }, cancel func(error)) { + for stats := range pipe { + todayClickCount += stats.ClickCount + todayPayCount += stats.PayCount + todayPayAmount += stats.PayAmount + } + }) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取今日统计数据失败, %+v", err) + } + + return &types.GetPromotionStatsTotalResp{ + TodayClickCount: int64(todayClickCount), + TodayPayCount: int64(todayPayCount), + TodayPayAmount: todayPayAmount, + TotalClickCount: int64(totalClickCount), + TotalPayCount: int64(totalPayCount), + TotalPayAmount: totalPayAmount, + }, nil +} diff --git a/app/main/api/internal/logic/admin_promotion/recordlinkclicklogic.go b/app/main/api/internal/logic/admin_promotion/recordlinkclicklogic.go new file mode 100644 index 0000000..c156c1c --- /dev/null +++ b/app/main/api/internal/logic/admin_promotion/recordlinkclicklogic.go @@ -0,0 +1,98 @@ +package admin_promotion + +import ( + "context" + "fmt" + "time" + + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/app/main/model" + "tyc-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +type RecordLinkClickLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewRecordLinkClickLogic(ctx context.Context, svcCtx *svc.ServiceContext) *RecordLinkClickLogic { + return &RecordLinkClickLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *RecordLinkClickLogic) RecordLinkClick(req *types.RecordLinkClickReq) (resp *types.RecordLinkClickResp, err error) { + // 校验路径格式 + if len(req.Path) != 6 { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "无效的推广链接路径") + } + + // 检查是否只包含大小写字母和数字 + for _, char := range req.Path { + if !((char >= 'a' && char <= 'z') || (char >= 'A' && char <= 'Z') || (char >= '0' && char <= '9')) { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "无效的推广链接路径") + } + } + url := fmt.Sprintf("%s/%s", l.svcCtx.Config.AdminPromotion.URLDomain, req.Path) + + link, err := l.svcCtx.AdminPromotionLinkModel.FindOneByUrl(l.ctx, url) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "无效的推广链接路径") + } + + err = l.svcCtx.AdminPromotionLinkModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error { + // 更新总统计 + totalStats, err := l.svcCtx.AdminPromotionLinkStatsTotalModel.FindOneByLinkId(l.ctx, link.Id) + if err != nil { + return err + } + totalStats.ClickCount = totalStats.ClickCount + 1 + err = l.svcCtx.AdminPromotionLinkStatsTotalModel.UpdateWithVersion(l.ctx, session, totalStats) + if err != nil { + return fmt.Errorf("更新总统计失败%+v", err) + } + // 更新历史统计 + today := time.Now().Truncate(24 * time.Hour) + builder := l.svcCtx.AdminPromotionLinkStatsHistoryModel.SelectBuilder() + builder = builder.Where("link_id = ? AND DATE(stats_date) = DATE(?)", link.Id, today) + historyStats, err := l.svcCtx.AdminPromotionLinkStatsHistoryModel.FindAll(l.ctx, builder, "") + if err != nil { + return fmt.Errorf("查询今日统计记录失败%+v", err) + } + + if len(historyStats) == 0 { + // 创建今天的记录 + newStats := &model.AdminPromotionLinkStatsHistory{ + LinkId: link.Id, + StatsDate: today, + ClickCount: 1, + } + _, err = l.svcCtx.AdminPromotionLinkStatsHistoryModel.Insert(l.ctx, session, newStats) + if err != nil { + return fmt.Errorf("创建今日统计记录失败%+v", err) + } + } else { + // 更新今日记录 + historyStats[0].ClickCount++ + err = l.svcCtx.AdminPromotionLinkStatsHistoryModel.UpdateWithVersion(l.ctx, session, historyStats[0]) + if err != nil { + return fmt.Errorf("更新历史统计失败%+v", err) + } + } + return nil + }) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "更新总统计失败,%+v", err) + } + return &types.RecordLinkClickResp{ + Success: true, + }, nil +} diff --git a/app/main/api/internal/logic/admin_promotion/updatepromotionlinklogic.go b/app/main/api/internal/logic/admin_promotion/updatepromotionlinklogic.go new file mode 100644 index 0000000..0873ab1 --- /dev/null +++ b/app/main/api/internal/logic/admin_promotion/updatepromotionlinklogic.go @@ -0,0 +1,57 @@ +package admin_promotion + +import ( + "context" + "time" + + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/common/ctxdata" + "tyc-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" +) + +type UpdatePromotionLinkLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewUpdatePromotionLinkLogic(ctx context.Context, svcCtx *svc.ServiceContext) *UpdatePromotionLinkLogic { + return &UpdatePromotionLinkLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *UpdatePromotionLinkLogic) UpdatePromotionLink(req *types.UpdatePromotionLinkReq) error { + // 获取当前用户ID + adminUserId, getUidErr := ctxdata.GetUidFromCtx(l.ctx) + if getUidErr != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "更新推广链接, 获取用户信息失败, %+v", getUidErr) + } + + // 获取链接信息 + link, err := l.svcCtx.AdminPromotionLinkModel.FindOne(l.ctx, req.Id) + if err != nil { + return errors.Wrapf(err, "更新推广链接, 获取链接信息失败, %+v", err) + } + + // 验证用户权限 + if link.AdminUserId != adminUserId { + return errors.Wrapf(xerr.NewErrMsg("无权限修改此链接"), "更新推广链接, 无权限修改此链接, %+v", link) + } + + // 更新链接信息 + link.Name = *req.Name + link.UpdateTime = time.Now() + + _, err = l.svcCtx.AdminPromotionLinkModel.Update(l.ctx, nil, link) + if err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "更新推广链接, 更新链接信息失败, %+v", err) + } + return nil +} diff --git a/app/main/api/internal/logic/admin_role/createrolelogic.go b/app/main/api/internal/logic/admin_role/createrolelogic.go new file mode 100644 index 0000000..0aa93cc --- /dev/null +++ b/app/main/api/internal/logic/admin_role/createrolelogic.go @@ -0,0 +1,83 @@ +package admin_role + +import ( + "context" + + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/app/main/model" + "tyc-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +type CreateRoleLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewCreateRoleLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CreateRoleLogic { + return &CreateRoleLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *CreateRoleLogic) CreateRole(req *types.CreateRoleReq) (resp *types.CreateRoleResp, err error) { + // 检查角色编码是否已存在 + roleModel, err := l.svcCtx.AdminRoleModel.FindOneByRoleCode(l.ctx, req.RoleCode) + if err != nil && err != model.ErrNotFound { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "创建角色失败: %v", err) + } + if roleModel != nil && roleModel.RoleName == req.RoleName { + return nil, errors.Wrapf(xerr.NewErrMsg("角色名称已存在"), "创建角色失败, 角色名称已存在: %v", err) + } + // 创建角色 + role := &model.AdminRole{ + RoleName: req.RoleName, + RoleCode: req.RoleCode, + Description: req.Description, + Status: req.Status, + Sort: req.Sort, + } + var roleId int64 + // 使用事务创建角色和关联菜单 + err = l.svcCtx.AdminRoleModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error { + // 创建角色 + result, err := l.svcCtx.AdminRoleModel.Insert(ctx, session, role) + if err != nil { + return errors.New("插入新角色失败") + } + roleId, err = result.LastInsertId() + if err != nil { + return errors.New("获取新角色ID失败") + } + + // 创建角色菜单关联 + if len(req.MenuIds) > 0 { + for _, menuId := range req.MenuIds { + roleMenu := &model.AdminRoleMenu{ + RoleId: roleId, + MenuId: menuId, + } + _, err = l.svcCtx.AdminRoleMenuModel.Insert(ctx, session, roleMenu) + if err != nil { + return errors.New("插入角色菜单关联失败") + } + } + } + + return nil + }) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "创建角色失败: %v", err) + } + + return &types.CreateRoleResp{ + Id: roleId, + }, nil +} diff --git a/app/main/api/internal/logic/admin_role/deleterolelogic.go b/app/main/api/internal/logic/admin_role/deleterolelogic.go new file mode 100644 index 0000000..ebbc143 --- /dev/null +++ b/app/main/api/internal/logic/admin_role/deleterolelogic.go @@ -0,0 +1,84 @@ +package admin_role + +import ( + "context" + + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/app/main/model" + "tyc-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +type DeleteRoleLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewDeleteRoleLogic(ctx context.Context, svcCtx *svc.ServiceContext) *DeleteRoleLogic { + return &DeleteRoleLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *DeleteRoleLogic) DeleteRole(req *types.DeleteRoleReq) (resp *types.DeleteRoleResp, err error) { + // 检查角色是否存在 + _, err = l.svcCtx.AdminRoleModel.FindOne(l.ctx, req.Id) + if err != nil { + if errors.Is(err, model.ErrNotFound) { + return nil, errors.Wrapf(xerr.NewErrMsg("角色不存在"), "删除角色失败, 角色不存在err: %v", err) + } + return nil, err + } + + // 使用事务删除角色和关联数据 + err = l.svcCtx.AdminRoleModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error { + // 删除角色菜单关联 + builder := l.svcCtx.AdminRoleMenuModel.SelectBuilder(). + Where("role_id = ?", req.Id) + menus, err := l.svcCtx.AdminRoleMenuModel.FindAll(ctx, builder, "id ASC") + if err != nil { + return err + } + for _, menu := range menus { + err = l.svcCtx.AdminRoleMenuModel.Delete(ctx, session, menu.Id) + if err != nil { + return err + } + } + + // 删除角色用户关联 + builder = l.svcCtx.AdminUserRoleModel.SelectBuilder(). + Where("role_id = ?", req.Id) + users, err := l.svcCtx.AdminUserRoleModel.FindAll(ctx, builder, "id ASC") + if err != nil { + return err + } + for _, user := range users { + err = l.svcCtx.AdminUserRoleModel.Delete(ctx, session, user.Id) + if err != nil { + return err + } + } + + // 删除角色 + err = l.svcCtx.AdminRoleModel.Delete(ctx, session, req.Id) + if err != nil { + return err + } + return nil + }) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "删除角色失败err: %v", err) + } + + return &types.DeleteRoleResp{ + Success: true, + }, nil +} diff --git a/app/main/api/internal/logic/admin_role/getroledetaillogic.go b/app/main/api/internal/logic/admin_role/getroledetaillogic.go new file mode 100644 index 0000000..9d45dbb --- /dev/null +++ b/app/main/api/internal/logic/admin_role/getroledetaillogic.go @@ -0,0 +1,91 @@ +package admin_role + +import ( + "context" + "sync" + + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/app/main/model" + "tyc-server/common/xerr" + + "github.com/pkg/errors" + "github.com/samber/lo" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/mr" +) + +type GetRoleDetailLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewGetRoleDetailLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetRoleDetailLogic { + return &GetRoleDetailLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *GetRoleDetailLogic) GetRoleDetail(req *types.GetRoleDetailReq) (resp *types.GetRoleDetailResp, err error) { + // 使用MapReduceVoid并发获取角色信息和菜单ID + var role *model.AdminRole + var menuIds []int64 + var mutex sync.Mutex + var wg sync.WaitGroup + + mr.MapReduceVoid(func(source chan<- interface{}) { + source <- 1 // 获取角色信息 + source <- 2 // 获取菜单ID + }, func(item interface{}, writer mr.Writer[interface{}], cancel func(error)) { + taskType := item.(int) + wg.Add(1) + defer wg.Done() + + if taskType == 1 { + result, err := l.svcCtx.AdminRoleModel.FindOne(l.ctx, req.Id) + if err != nil { + cancel(err) + return + } + mutex.Lock() + role = result + mutex.Unlock() + } else if taskType == 2 { + builder := l.svcCtx.AdminRoleMenuModel.SelectBuilder(). + Where("role_id = ?", req.Id) + menus, err := l.svcCtx.AdminRoleMenuModel.FindAll(l.ctx, builder, "id ASC") + if err != nil { + cancel(err) + return + } + mutex.Lock() + menuIds = lo.Map(menus, func(item *model.AdminRoleMenu, _ int) int64 { + return item.MenuId + }) + mutex.Unlock() + } + }, func(pipe <-chan interface{}, cancel func(error)) { + // 不需要处理pipe中的数据 + }) + + wg.Wait() + + if role == nil { + return nil, errors.Wrapf(xerr.NewErrMsg("角色不存在"), "获取角色详情失败, 角色不存在err: %v", err) + } + + return &types.GetRoleDetailResp{ + Id: role.Id, + RoleName: role.RoleName, + RoleCode: role.RoleCode, + Description: role.Description, + Status: role.Status, + Sort: role.Sort, + CreateTime: role.CreateTime.Format("2006-01-02 15:04:05"), + UpdateTime: role.UpdateTime.Format("2006-01-02 15:04:05"), + MenuIds: menuIds, + }, nil +} diff --git a/app/main/api/internal/logic/admin_role/getrolelistlogic.go b/app/main/api/internal/logic/admin_role/getrolelistlogic.go new file mode 100644 index 0000000..fd43c31 --- /dev/null +++ b/app/main/api/internal/logic/admin_role/getrolelistlogic.go @@ -0,0 +1,148 @@ +package admin_role + +import ( + "context" + "sync" + + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/app/main/model" + + "github.com/samber/lo" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/mr" +) + +type GetRoleListLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewGetRoleListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetRoleListLogic { + return &GetRoleListLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} +func (l *GetRoleListLogic) GetRoleList(req *types.GetRoleListReq) (resp *types.GetRoleListResp, err error) { + resp = &types.GetRoleListResp{ + Items: make([]types.RoleListItem, 0), + Total: 0, + } + + // 构建查询条件 + builder := l.svcCtx.AdminRoleModel.SelectBuilder() + if len(req.Name) > 0 { + builder = builder.Where("role_name LIKE ?", "%"+req.Name+"%") + } + if len(req.Code) > 0 { + builder = builder.Where("role_code LIKE ?", "%"+req.Code+"%") + } + if req.Status != -1 { + builder = builder.Where("status = ?", req.Status) + } + + // 设置分页 + offset := (req.Page - 1) * req.PageSize + builder = builder.OrderBy("sort ASC").Limit(uint64(req.PageSize)).Offset(uint64(offset)) + + // 使用MapReduceVoid并发获取总数和列表数据 + var roles []*model.AdminRole + var total int64 + var mutex sync.Mutex + var wg sync.WaitGroup + + mr.MapReduceVoid(func(source chan<- interface{}) { + source <- 1 // 获取角色列表 + source <- 2 // 获取总数 + }, func(item interface{}, writer mr.Writer[*model.AdminRole], cancel func(error)) { + taskType := item.(int) + wg.Add(1) + defer wg.Done() + + if taskType == 1 { + result, err := l.svcCtx.AdminRoleModel.FindAll(l.ctx, builder, "id DESC") + if err != nil { + cancel(err) + return + } + mutex.Lock() + roles = result + mutex.Unlock() + } else if taskType == 2 { + countBuilder := l.svcCtx.AdminRoleModel.SelectBuilder() + if len(req.Name) > 0 { + countBuilder = countBuilder.Where("role_name LIKE ?", "%"+req.Name+"%") + } + if len(req.Code) > 0 { + countBuilder = countBuilder.Where("role_code LIKE ?", "%"+req.Code+"%") + } + if req.Status != -1 { + countBuilder = countBuilder.Where("status = ?", req.Status) + } + + count, err := l.svcCtx.AdminRoleModel.FindCount(l.ctx, countBuilder, "id") + if err != nil { + cancel(err) + return + } + mutex.Lock() + total = count + mutex.Unlock() + } + }, func(pipe <-chan *model.AdminRole, cancel func(error)) { + // 不需要处理pipe中的数据 + }) + + wg.Wait() + + // 并发获取每个角色的菜单ID + var roleItems []types.RoleListItem + var roleItemsMutex sync.Mutex + + mr.MapReduceVoid(func(source chan<- interface{}) { + for _, role := range roles { + source <- role + } + }, func(item interface{}, writer mr.Writer[[]int64], cancel func(error)) { + role := item.(*model.AdminRole) + + // 获取角色关联的菜单ID + builder := l.svcCtx.AdminRoleMenuModel.SelectBuilder(). + Where("role_id = ?", role.Id) + menus, err := l.svcCtx.AdminRoleMenuModel.FindAll(l.ctx, builder, "id ASC") + if err != nil { + cancel(err) + return + } + menuIds := lo.Map(menus, func(item *model.AdminRoleMenu, _ int) int64 { + return item.MenuId + }) + + writer.Write(menuIds) + }, func(pipe <-chan []int64, cancel func(error)) { + for _, role := range roles { + menuIds := <-pipe + item := types.RoleListItem{ + Id: role.Id, + RoleName: role.RoleName, + RoleCode: role.RoleCode, + Description: role.Description, + Status: role.Status, + Sort: role.Sort, + CreateTime: role.CreateTime.Format("2006-01-02 15:04:05"), + MenuIds: menuIds, + } + roleItemsMutex.Lock() + roleItems = append(roleItems, item) + roleItemsMutex.Unlock() + } + }) + + resp.Items = roleItems + resp.Total = total + + return resp, nil +} diff --git a/app/main/api/internal/logic/admin_role/updaterolelogic.go b/app/main/api/internal/logic/admin_role/updaterolelogic.go new file mode 100644 index 0000000..2ea8427 --- /dev/null +++ b/app/main/api/internal/logic/admin_role/updaterolelogic.go @@ -0,0 +1,148 @@ +package admin_role + +import ( + "context" + + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/app/main/model" + "tyc-server/common/xerr" + + "github.com/pkg/errors" + "github.com/samber/lo" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +type UpdateRoleLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewUpdateRoleLogic(ctx context.Context, svcCtx *svc.ServiceContext) *UpdateRoleLogic { + return &UpdateRoleLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *UpdateRoleLogic) UpdateRole(req *types.UpdateRoleReq) (resp *types.UpdateRoleResp, err error) { + // 检查角色是否存在 + role, err := l.svcCtx.AdminRoleModel.FindOne(l.ctx, req.Id) + if err != nil { + if errors.Is(err, model.ErrNotFound) { + return nil, errors.Wrapf(xerr.NewErrMsg("角色不存在"), "更新角色失败, 角色不存在err: %v", err) + } + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "更新角色失败err: %v", err) + } + + // 检查角色编码是否重复 + if req.RoleCode != nil && *req.RoleCode != role.RoleCode { + roleModel, err := l.svcCtx.AdminRoleModel.FindOneByRoleCode(l.ctx, *req.RoleCode) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "更新角色失败err: %v", err) + } + if roleModel != nil { + return nil, errors.Wrapf(xerr.NewErrMsg("角色编码已存在"), "更新角色失败, 角色编码已存在err: %v", err) + } + } + + // 更新角色信息 + if req.RoleName != nil { + role.RoleName = *req.RoleName + } + if req.RoleCode != nil { + role.RoleCode = *req.RoleCode + } + if req.Description != nil { + role.Description = *req.Description + } + if req.Status != nil { + role.Status = *req.Status + } + if req.Sort != nil { + role.Sort = *req.Sort + } + + // 使用事务更新角色和关联菜单 + err = l.svcCtx.AdminRoleModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error { + // 更新角色 + _, err = l.svcCtx.AdminRoleModel.Update(ctx, session, role) + if err != nil { + return err + } + if req.MenuIds != nil { + // 1. 获取当前关联的菜单ID + builder := l.svcCtx.AdminRoleMenuModel.SelectBuilder(). + Where("role_id = ?", req.Id) + currentMenus, err := l.svcCtx.AdminRoleMenuModel.FindAll(ctx, builder, "id ASC") + if err != nil { + return err + } + + // 2. 转换为map便于查找 + currentMenuMap := make(map[int64]*model.AdminRoleMenu) + for _, menu := range currentMenus { + currentMenuMap[menu.MenuId] = menu + } + + // 3. 检查新的菜单ID是否存在 + for _, menuId := range req.MenuIds { + exists, err := l.svcCtx.AdminMenuModel.FindOne(ctx, menuId) + if err != nil || exists == nil { + return errors.Wrapf(xerr.NewErrMsg("菜单不存在"), "菜单ID: %d", menuId) + } + } + + // 4. 找出需要删除和新增的关联 + var toDelete []*model.AdminRoleMenu + var toInsert []int64 + + // 需要删除的:当前存在但新列表中没有的 + for menuId, roleMenu := range currentMenuMap { + if !lo.Contains(req.MenuIds, menuId) { + toDelete = append(toDelete, roleMenu) + } + } + + // 需要新增的:新列表中有但当前不存在的 + for _, menuId := range req.MenuIds { + if _, exists := currentMenuMap[menuId]; !exists { + toInsert = append(toInsert, menuId) + } + } + + // 5. 删除需要移除的关联 + for _, roleMenu := range toDelete { + err = l.svcCtx.AdminRoleMenuModel.Delete(ctx, session, roleMenu.Id) + if err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "删除角色菜单关联失败: %v", err) + } + } + + // 6. 添加新的关联 + for _, menuId := range toInsert { + roleMenu := &model.AdminRoleMenu{ + RoleId: req.Id, + MenuId: menuId, + } + _, err = l.svcCtx.AdminRoleMenuModel.Insert(ctx, session, roleMenu) + if err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "添加角色菜单关联失败: %v", err) + } + } + } + + return nil + }) + + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "更新角色失败err: %v", err) + } + + return &types.UpdateRoleResp{ + Success: true, + }, nil +} diff --git a/app/main/api/internal/logic/admin_user/admincreateuserlogic.go b/app/main/api/internal/logic/admin_user/admincreateuserlogic.go new file mode 100644 index 0000000..222482b --- /dev/null +++ b/app/main/api/internal/logic/admin_user/admincreateuserlogic.go @@ -0,0 +1,88 @@ +package admin_user + +import ( + "context" + + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/app/main/model" + "tyc-server/common/xerr" + "tyc-server/pkg/lzkit/crypto" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +type AdminCreateUserLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminCreateUserLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminCreateUserLogic { + return &AdminCreateUserLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminCreateUserLogic) AdminCreateUser(req *types.AdminCreateUserReq) (resp *types.AdminCreateUserResp, err error) { + // 检查用户名是否已存在 + exists, err := l.svcCtx.AdminUserModel.FindOneByUsername(l.ctx, req.Username) + if err != nil && err != model.ErrNotFound { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "创建用户失败: %v", err) + } + if exists != nil { + return nil, errors.Wrapf(xerr.NewErrMsg("用户名已存在"), "创建用户失败") + } + password, err := crypto.PasswordHash("123456") + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "创建用户失败, 加密密码失败: %v", err) + } + // 创建用户 + user := &model.AdminUser{ + Username: req.Username, + Password: password, // 注意:实际应用中需要加密密码 + RealName: req.RealName, + Status: req.Status, + } + + // 使用事务创建用户和关联角色 + err = l.svcCtx.AdminUserModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error { + // 创建用户 + result, err := l.svcCtx.AdminUserModel.Insert(ctx, session, user) + if err != nil { + return err + } + userId, err := result.LastInsertId() + if err != nil { + return err + } + + // 创建用户角色关联 + if len(req.RoleIds) > 0 { + for _, roleId := range req.RoleIds { + userRole := &model.AdminUserRole{ + UserId: userId, + RoleId: roleId, + } + _, err = l.svcCtx.AdminUserRoleModel.Insert(ctx, session, userRole) + if err != nil { + return err + } + } + } + + return nil + }) + + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "创建用户失败: %v", err) + } + + return &types.AdminCreateUserResp{ + Id: user.Id, + }, nil +} diff --git a/app/main/api/internal/logic/admin_user/admindeleteuserlogic.go b/app/main/api/internal/logic/admin_user/admindeleteuserlogic.go new file mode 100644 index 0000000..e645a45 --- /dev/null +++ b/app/main/api/internal/logic/admin_user/admindeleteuserlogic.go @@ -0,0 +1,68 @@ +package admin_user + +import ( + "context" + + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +type AdminDeleteUserLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminDeleteUserLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminDeleteUserLogic { + return &AdminDeleteUserLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminDeleteUserLogic) AdminDeleteUser(req *types.AdminDeleteUserReq) (resp *types.AdminDeleteUserResp, err error) { + // 检查用户是否存在 + _, err = l.svcCtx.AdminUserModel.FindOne(l.ctx, req.Id) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "用户不存在: %v", err) + } + + // 使用事务删除用户和关联数据 + err = l.svcCtx.AdminUserModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error { + // 删除用户角色关联 + builder := l.svcCtx.AdminUserRoleModel.SelectBuilder(). + Where("user_id = ?", req.Id) + roles, err := l.svcCtx.AdminUserRoleModel.FindAll(ctx, builder, "id ASC") + if err != nil { + return err + } + for _, role := range roles { + err = l.svcCtx.AdminUserRoleModel.Delete(ctx, session, role.Id) + if err != nil { + return err + } + } + + // 删除用户 + err = l.svcCtx.AdminUserModel.Delete(ctx, session, req.Id) + if err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "删除用户失败: %v", err) + } + + return &types.AdminDeleteUserResp{ + Success: true, + }, nil +} diff --git a/app/main/api/internal/logic/admin_user/admingetuserdetaillogic.go b/app/main/api/internal/logic/admin_user/admingetuserdetaillogic.go new file mode 100644 index 0000000..4ace487 --- /dev/null +++ b/app/main/api/internal/logic/admin_user/admingetuserdetaillogic.go @@ -0,0 +1,88 @@ +package admin_user + +import ( + "context" + "errors" + "sync" + + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/app/main/model" + + "github.com/samber/lo" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/mr" +) + +type AdminGetUserDetailLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminGetUserDetailLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminGetUserDetailLogic { + return &AdminGetUserDetailLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminGetUserDetailLogic) AdminGetUserDetail(req *types.AdminGetUserDetailReq) (resp *types.AdminGetUserDetailResp, err error) { + // 使用MapReduceVoid并发获取用户信息和角色ID + var user *model.AdminUser + var roleIds []int64 + var mutex sync.Mutex + var wg sync.WaitGroup + + mr.MapReduceVoid(func(source chan<- interface{}) { + source <- 1 // 获取用户信息 + source <- 2 // 获取角色ID + }, func(item interface{}, writer mr.Writer[interface{}], cancel func(error)) { + taskType := item.(int) + wg.Add(1) + defer wg.Done() + + if taskType == 1 { + result, err := l.svcCtx.AdminUserModel.FindOne(l.ctx, req.Id) + if err != nil { + cancel(err) + return + } + mutex.Lock() + user = result + mutex.Unlock() + } else if taskType == 2 { + builder := l.svcCtx.AdminUserRoleModel.SelectBuilder(). + Where("user_id = ?", req.Id) + roles, err := l.svcCtx.AdminUserRoleModel.FindAll(l.ctx, builder, "id ASC") + if err != nil { + cancel(err) + return + } + mutex.Lock() + roleIds = lo.Map(roles, func(item *model.AdminUserRole, _ int) int64 { + return item.RoleId + }) + mutex.Unlock() + } + }, func(pipe <-chan interface{}, cancel func(error)) { + // 不需要处理pipe中的数据 + }) + + wg.Wait() + + if user == nil { + return nil, errors.New("用户不存在") + } + + return &types.AdminGetUserDetailResp{ + Id: user.Id, + Username: user.Username, + RealName: user.RealName, + Status: user.Status, + CreateTime: user.CreateTime.Format("2006-01-02 15:04:05"), + UpdateTime: user.UpdateTime.Format("2006-01-02 15:04:05"), + RoleIds: roleIds, + }, nil +} diff --git a/app/main/api/internal/logic/admin_user/admingetuserlistlogic.go b/app/main/api/internal/logic/admin_user/admingetuserlistlogic.go new file mode 100644 index 0000000..4477515 --- /dev/null +++ b/app/main/api/internal/logic/admin_user/admingetuserlistlogic.go @@ -0,0 +1,149 @@ +package admin_user + +import ( + "context" + "sync" + + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/app/main/model" + + "github.com/samber/lo" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/mr" +) + +type AdminGetUserListLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminGetUserListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminGetUserListLogic { + return &AdminGetUserListLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminGetUserListLogic) AdminGetUserList(req *types.AdminGetUserListReq) (resp *types.AdminGetUserListResp, err error) { + resp = &types.AdminGetUserListResp{ + Items: make([]types.UserListItem, 0), + Total: 0, + } + + // 构建查询条件 + builder := l.svcCtx.AdminUserModel.SelectBuilder(). + Where("del_state = ?", 0) + if len(req.Username) > 0 { + builder = builder.Where("username LIKE ?", "%"+req.Username+"%") + } + if len(req.RealName) > 0 { + builder = builder.Where("real_name LIKE ?", "%"+req.RealName+"%") + } + if req.Status != -1 { + builder = builder.Where("status = ?", req.Status) + } + + // 设置分页 + offset := (req.Page - 1) * req.PageSize + builder = builder.OrderBy("id DESC").Limit(uint64(req.PageSize)).Offset(uint64(offset)) + + // 使用MapReduceVoid并发获取总数和列表数据 + var users []*model.AdminUser + var total int64 + var mutex sync.Mutex + var wg sync.WaitGroup + + mr.MapReduceVoid(func(source chan<- interface{}) { + source <- 1 // 获取用户列表 + source <- 2 // 获取总数 + }, func(item interface{}, writer mr.Writer[*model.AdminUser], cancel func(error)) { + taskType := item.(int) + wg.Add(1) + defer wg.Done() + + if taskType == 1 { + result, err := l.svcCtx.AdminUserModel.FindAll(l.ctx, builder, "id DESC") + if err != nil { + cancel(err) + return + } + mutex.Lock() + users = result + mutex.Unlock() + } else if taskType == 2 { + countBuilder := l.svcCtx.AdminUserModel.SelectBuilder(). + Where("del_state = ?", 0) + if len(req.Username) > 0 { + countBuilder = countBuilder.Where("username LIKE ?", "%"+req.Username+"%") + } + if len(req.RealName) > 0 { + countBuilder = countBuilder.Where("real_name LIKE ?", "%"+req.RealName+"%") + } + if req.Status != -1 { + countBuilder = countBuilder.Where("status = ?", req.Status) + } + + count, err := l.svcCtx.AdminUserModel.FindCount(l.ctx, countBuilder, "id") + if err != nil { + cancel(err) + return + } + mutex.Lock() + total = count + mutex.Unlock() + } + }, func(pipe <-chan *model.AdminUser, cancel func(error)) { + // 不需要处理pipe中的数据 + }) + + wg.Wait() + + // 并发获取每个用户的角色ID + var userItems []types.UserListItem + var userItemsMutex sync.Mutex + + mr.MapReduceVoid(func(source chan<- interface{}) { + for _, user := range users { + source <- user + } + }, func(item interface{}, writer mr.Writer[[]int64], cancel func(error)) { + user := item.(*model.AdminUser) + + // 获取用户关联的角色ID + builder := l.svcCtx.AdminUserRoleModel.SelectBuilder(). + Where("user_id = ?", user.Id) + roles, err := l.svcCtx.AdminUserRoleModel.FindAll(l.ctx, builder, "id ASC") + if err != nil { + cancel(err) + return + } + roleIds := lo.Map(roles, func(item *model.AdminUserRole, _ int) int64 { + return item.RoleId + }) + + writer.Write(roleIds) + }, func(pipe <-chan []int64, cancel func(error)) { + for _, user := range users { + roleIds := <-pipe + item := types.UserListItem{ + Id: user.Id, + Username: user.Username, + RealName: user.RealName, + Status: user.Status, + CreateTime: user.CreateTime.Format("2006-01-02 15:04:05"), + RoleIds: roleIds, + } + userItemsMutex.Lock() + userItems = append(userItems, item) + userItemsMutex.Unlock() + } + }) + + resp.Items = userItems + resp.Total = total + + return resp, nil +} diff --git a/app/main/api/internal/logic/admin_user/adminupdateuserlogic.go b/app/main/api/internal/logic/admin_user/adminupdateuserlogic.go new file mode 100644 index 0000000..a739ea2 --- /dev/null +++ b/app/main/api/internal/logic/admin_user/adminupdateuserlogic.go @@ -0,0 +1,141 @@ +package admin_user + +import ( + "context" + + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/app/main/model" + "tyc-server/common/xerr" + + "github.com/pkg/errors" + "github.com/samber/lo" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +type AdminUpdateUserLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminUpdateUserLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminUpdateUserLogic { + return &AdminUpdateUserLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminUpdateUserLogic) AdminUpdateUser(req *types.AdminUpdateUserReq) (resp *types.AdminUpdateUserResp, err error) { + // 检查用户是否存在 + user, err := l.svcCtx.AdminUserModel.FindOne(l.ctx, req.Id) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "用户不存在: %v", err) + } + + // 检查用户名是否重复 + if req.Username != nil && *req.Username != user.Username { + exists, err := l.svcCtx.AdminUserModel.FindOneByUsername(l.ctx, *req.Username) + if err != nil && err != model.ErrNotFound { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "更新用户失败: %v", err) + } + if exists != nil { + return nil, errors.Wrapf(xerr.NewErrMsg("用户名已存在"), "更新用户失败") + } + } + + // 更新用户信息 + if req.Username != nil { + user.Username = *req.Username + } + if req.RealName != nil { + user.RealName = *req.RealName + } + if req.Status != nil { + user.Status = *req.Status + } + + // 使用事务更新用户和关联角色 + err = l.svcCtx.AdminUserModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error { + // 更新用户 + _, err = l.svcCtx.AdminUserModel.Update(ctx, session, user) + if err != nil { + return err + } + + // 只有当RoleIds不为nil时才更新角色关联 + if req.RoleIds != nil { + // 1. 获取当前关联的角色ID + builder := l.svcCtx.AdminUserRoleModel.SelectBuilder(). + Where("user_id = ?", req.Id) + currentRoles, err := l.svcCtx.AdminUserRoleModel.FindAll(ctx, builder, "id ASC") + if err != nil { + return err + } + + // 2. 转换为map便于查找 + currentRoleMap := make(map[int64]*model.AdminUserRole) + for _, role := range currentRoles { + currentRoleMap[role.RoleId] = role + } + + // 3. 检查新的角色ID是否存在 + for _, roleId := range req.RoleIds { + exists, err := l.svcCtx.AdminRoleModel.FindOne(ctx, roleId) + if err != nil || exists == nil { + return errors.Wrapf(xerr.NewErrMsg("角色不存在"), "角色ID: %d", roleId) + } + } + + // 4. 找出需要删除和新增的关联 + var toDelete []*model.AdminUserRole + var toInsert []int64 + + // 需要删除的:当前存在但新列表中没有的 + for roleId, userRole := range currentRoleMap { + if !lo.Contains(req.RoleIds, roleId) { + toDelete = append(toDelete, userRole) + } + } + + // 需要新增的:新列表中有但当前不存在的 + for _, roleId := range req.RoleIds { + if _, exists := currentRoleMap[roleId]; !exists { + toInsert = append(toInsert, roleId) + } + } + + // 5. 删除需要移除的关联 + for _, userRole := range toDelete { + err = l.svcCtx.AdminUserRoleModel.Delete(ctx, session, userRole.Id) + if err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "删除用户角色关联失败: %v", err) + } + } + + // 6. 添加新的关联 + for _, roleId := range toInsert { + userRole := &model.AdminUserRole{ + UserId: req.Id, + RoleId: roleId, + } + _, err = l.svcCtx.AdminUserRoleModel.Insert(ctx, session, userRole) + if err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "添加用户角色关联失败: %v", err) + } + } + } + + return nil + }) + + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "更新用户失败: %v", err) + } + + return &types.AdminUpdateUserResp{ + Success: true, + }, nil +} diff --git a/app/main/api/internal/logic/admin_user/adminuserinfologic.go b/app/main/api/internal/logic/admin_user/adminuserinfologic.go new file mode 100644 index 0000000..6518fc4 --- /dev/null +++ b/app/main/api/internal/logic/admin_user/adminuserinfologic.go @@ -0,0 +1,67 @@ +package admin_user + +import ( + "context" + + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/common/ctxdata" + "tyc-server/common/xerr" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" +) + +type AdminUserInfoLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminUserInfoLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminUserInfoLogic { + return &AdminUserInfoLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminUserInfoLogic) AdminUserInfo(req *types.AdminUserInfoReq) (resp *types.AdminUserInfoResp, err error) { + userId, err := ctxdata.GetUidFromCtx(l.ctx) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取用户ID失败, %+v", err) + } + + user, err := l.svcCtx.AdminUserModel.FindOne(l.ctx, userId) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取用户ID信息失败, %+v", err) + } + // 获取权限 + adminUserRoleBuilder := l.svcCtx.AdminUserRoleModel.SelectBuilder().Where(squirrel.Eq{"user_id": user.Id}) + permissions, err := l.svcCtx.AdminUserRoleModel.FindAll(l.ctx, adminUserRoleBuilder, "role_id DESC") + if err != nil { + return nil, errors.Wrapf(xerr.NewErrMsg("获取权限失败"), "用户登录, 获取权限失败, 用户名: %s", user.Username) + } + + // 获取角色ID数组 + roleIds := make([]int64, 0) + for _, permission := range permissions { + roleIds = append(roleIds, permission.RoleId) + } + + // 获取角色名称 + roles := make([]string, 0) + for _, roleId := range roleIds { + role, err := l.svcCtx.AdminRoleModel.FindOne(l.ctx, roleId) + if err != nil { + continue + } + roles = append(roles, role.RoleCode) + } + return &types.AdminUserInfoResp{ + Username: user.Username, + RealName: user.RealName, + Roles: roles, + }, nil +} diff --git a/app/main/api/internal/logic/pay/paymentlogic.go b/app/main/api/internal/logic/pay/paymentlogic.go index 22bbc7a..a2846e2 100644 --- a/app/main/api/internal/logic/pay/paymentlogic.go +++ b/app/main/api/internal/logic/pay/paymentlogic.go @@ -99,6 +99,29 @@ func (l *PaymentLogic) Payment(req *types.PaymentReq) (resp *types.PaymentResp, return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成订单, 获取保存订单ID失败: %+v", lastInsertIdErr) } orderID = insertedOrderID + + promoteKey, ok := l.ctx.Value("promoteKey").(string) + if ok && promoteKey != "" { + // TODO: 在这里添加处理 promoteKey 的逻辑 + url := fmt.Sprintf("%s/%s", l.svcCtx.Config.AdminPromotion.URLDomain, promoteKey) + promoteLink, err := l.svcCtx.AdminPromotionLinkModel.FindOneByUrl(l.ctx, url) + if err != nil && !errors.Is(err, model.ErrNotFound) { + return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成订单, 查找推广链接失败: %+v", err) + } + if promoteLink != nil { + promoteOrder := &model.AdminPromotionOrder{ + OrderId: orderID, + LinkId: promoteLink.Id, + UserId: userID, + AdminUserId: promoteLink.AdminUserId, + } + _, insertPromoteOrderErr := l.svcCtx.AdminPromotionOrderModel.Insert(ctx, session, promoteOrder) + if insertPromoteOrderErr != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成订单, 保存推广订单失败: %+v", insertPromoteOrderErr) + } + } + } + return nil }) if transErr != nil { diff --git a/app/main/api/internal/middleware/authinterceptormiddleware.go b/app/main/api/internal/middleware/authinterceptormiddleware.go new file mode 100644 index 0000000..dda02f1 --- /dev/null +++ b/app/main/api/internal/middleware/authinterceptormiddleware.go @@ -0,0 +1,43 @@ +package middleware + +import ( + "net/http" + + "tyc-server/app/main/api/internal/config" +) + +type AuthInterceptorMiddleware struct { + Config config.Config +} + +func NewAuthInterceptorMiddleware(c config.Config) *AuthInterceptorMiddleware { + return &AuthInterceptorMiddleware{ + Config: c, + } +} + +func (m *AuthInterceptorMiddleware) Handle(next http.HandlerFunc) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + // 从请求头中获取Authorization字段 + // authHeader := r.Header.Get("Authorization") + + // if authHeader != "" && strings.HasPrefix(authHeader, "Bearer ") { + // // 提取JWT令牌(去除Bearer前缀) + // tokenString := strings.TrimPrefix(authHeader, "Bearer ") + + // // 使用jwtx.ParseJwtTokenV2()解析令牌 + // claims, err := jwtx.ParseJwtTokenV2(tokenString, m.Config.AdminConfig.AccessSecret) + // if err != nil { + + // resultErr := errors.Wrapf(xerr.NewErrMsg("用户名或密码错误"), "用户登录, 用户名或密码错误, 用户名: %s") + // result.HttpResult(r, w, nil, resultErr) + // return + // } + // // 如果解析失败,可以添加处理代码,如返回401错误 + // } + + // 如果没有Authorization头或解析失败,继续传递到下一个处理器 + // 根据业务需求可以决定是否继续处理请求 + next(w, r) + } +} diff --git a/app/main/api/internal/middleware/global/reqHeaderCtxMiddleware.go b/app/main/api/internal/middleware/global/reqHeaderCtxMiddleware.go new file mode 100644 index 0000000..c9a15c4 --- /dev/null +++ b/app/main/api/internal/middleware/global/reqHeaderCtxMiddleware.go @@ -0,0 +1,34 @@ +package middleware + +import ( + "context" + "net/http" +) + +type contextKey string + +const ( + brandKey contextKey = "brand" + platformKey contextKey = "platform" + promoteKey contextKey = "promoteKey" +) + +func ReqHeaderCtxMiddleware(next http.HandlerFunc) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + brand := r.Header.Get("X-Brand") + platform := r.Header.Get("X-Platform") + promoteValue := r.Header.Get("X-Promote-Key") + ctx := r.Context() + if brand != "" { + ctx = context.WithValue(ctx, brandKey, brand) + } + if platform != "" { + ctx = context.WithValue(ctx, platformKey, platform) + } + if promoteValue != "" { + ctx = context.WithValue(ctx, promoteKey, promoteValue) + } + r = r.WithContext(ctx) + next(w, r) + } +} diff --git a/app/main/api/internal/service/dictService.go b/app/main/api/internal/service/dictService.go new file mode 100644 index 0000000..1861cee --- /dev/null +++ b/app/main/api/internal/service/dictService.go @@ -0,0 +1,47 @@ +package service + +import ( + "context" + "errors" + "tyc-server/app/main/model" +) + +type DictService struct { + adminDictTypeModel model.AdminDictTypeModel + adminDictDataModel model.AdminDictDataModel +} + +func NewDictService(adminDictTypeModel model.AdminDictTypeModel, adminDictDataModel model.AdminDictDataModel) *DictService { + return &DictService{adminDictTypeModel: adminDictTypeModel, adminDictDataModel: adminDictDataModel} +} +func (s *DictService) GetDictLabel(ctx context.Context, dictType string, dictValue int64) (string, error) { + dictTypeModel, err := s.adminDictTypeModel.FindOneByDictType(ctx, dictType) + if err != nil { + return "", err + } + if dictTypeModel.Status != 1 { + return "", errors.New("字典类型未启用") + } + dictData, err := s.adminDictDataModel.FindOneByDictTypeDictValue(ctx, dictTypeModel.DictType, dictValue) + if err != nil { + return "", err + } + if dictData.Status != 1 { + return "", errors.New("字典数据未启用") + } + return dictData.DictLabel, nil +} +func (s *DictService) GetDictValue(ctx context.Context, dictType string, dictLabel string) (int64, error) { + dictTypeModel, err := s.adminDictTypeModel.FindOneByDictType(ctx, dictType) + if err != nil { + return 0, err + } + if dictTypeModel.Status != 1 { + return 0, errors.New("字典类型未启用") + } + dictData, err := s.adminDictDataModel.FindOneByDictTypeDictLabel(ctx, dictTypeModel.DictType, dictLabel) + if err != nil { + return 0, err + } + return dictData.DictValue, nil +} diff --git a/app/main/api/internal/svc/servicecontext.go b/app/main/api/internal/svc/servicecontext.go index aad67aa..69e6de8 100644 --- a/app/main/api/internal/svc/servicecontext.go +++ b/app/main/api/internal/svc/servicecontext.go @@ -14,9 +14,14 @@ import ( ) type ServiceContext struct { - Config config.Config - Redis *redis.Redis - SourceInterceptor rest.Middleware + Config config.Config + Redis *redis.Redis + + // 中间件 + SourceInterceptor rest.Middleware + AuthInterceptor rest.Middleware + + // 模型 UserModel model.UserModel UserAuthModel model.UserAuthModel ProductModel model.ProductModel @@ -28,16 +33,36 @@ type ServiceContext struct { GlobalNotificationsModel model.GlobalNotificationsModel ExampleModel model.ExampleModel ExampleParamsModel model.ExampleParamsModel - AlipayService *service.AliPayService - WechatPayService *service.WechatPayService - ApplePayService *service.ApplePayService - WestDexService *service.WestDexService - YushanService *service.YushanService - TianjuService *service.TianjuService - ApiRequestService *service.ApiRequestService - AsynqServer *asynq.Server // 服务端 - AsynqService *service.AsynqService // 客户端 - VerificationService *service.VerificationService + + // 服务 + AlipayService *service.AliPayService + WechatPayService *service.WechatPayService + ApplePayService *service.ApplePayService + WestDexService *service.WestDexService + YushanService *service.YushanService + TianjuService *service.TianjuService + ApiRequestService *service.ApiRequestService + AsynqServer *asynq.Server // 服务端 + AsynqService *service.AsynqService // 客户端 + VerificationService *service.VerificationService + DictService *service.DictService + + // admin + AdminApiModel model.AdminApiModel + AdminMenuModel model.AdminMenuModel + AdminRoleModel model.AdminRoleModel + AdminRoleApiModel model.AdminRoleApiModel + AdminRoleMenuModel model.AdminRoleMenuModel + AdminUserModel model.AdminUserModel + AdminUserRoleModel model.AdminUserRoleModel + AdminDictDataModel model.AdminDictDataModel + AdminDictTypeModel model.AdminDictTypeModel + + // admin promotion + AdminPromotionLinkModel model.AdminPromotionLinkModel + AdminPromotionLinkStatsTotalModel model.AdminPromotionLinkStatsTotalModel + AdminPromotionLinkStatsHistoryModel model.AdminPromotionLinkStatsHistoryModel + AdminPromotionOrderModel model.AdminPromotionOrderModel } func NewServiceContext(c config.Config) *ServiceContext { @@ -57,6 +82,22 @@ func NewServiceContext(c config.Config) *ServiceContext { Concurrency: 10, }, ) + adminApiModel := model.NewAdminApiModel(db, c.CacheRedis) + adminMenuModel := model.NewAdminMenuModel(db, c.CacheRedis) + adminRoleModel := model.NewAdminRoleModel(db, c.CacheRedis) + adminRoleApiModel := model.NewAdminRoleApiModel(db, c.CacheRedis) + adminRoleMenuModel := model.NewAdminRoleMenuModel(db, c.CacheRedis) + adminUserModel := model.NewAdminUserModel(db, c.CacheRedis) + adminUserRoleModel := model.NewAdminUserRoleModel(db, c.CacheRedis) + adminDictDataModel := model.NewAdminDictDataModel(db, c.CacheRedis) + adminDictTypeModel := model.NewAdminDictTypeModel(db, c.CacheRedis) + + // admin promotion + adminPromotionLinkModel := model.NewAdminPromotionLinkModel(db, c.CacheRedis) + adminPromotionLinkStatsTotalModel := model.NewAdminPromotionLinkStatsTotalModel(db, c.CacheRedis) + adminPromotionLinkStatsHistoryModel := model.NewAdminPromotionLinkStatsHistoryModel(db, c.CacheRedis) + adminPromotionOrderModel := model.NewAdminPromotionOrderModel(db, c.CacheRedis) + westDexService := service.NewWestDexService(c) yushanService := service.NewYushanService(c) tianjuService := service.NewTianjuService(c) @@ -65,10 +106,12 @@ func NewServiceContext(c config.Config) *ServiceContext { userAuthModel := model.NewUserAuthModel(db, c.CacheRedis) apiRequestService := service.NewApiRequestService(c, westDexService, yushanService, tianjuService, featureModel, productFeatureModel) + dictService := service.NewDictService(adminDictTypeModel, adminDictDataModel) return &ServiceContext{ Config: c, Redis: redis.MustNewRedis(redisConf), SourceInterceptor: middleware.NewSourceInterceptorMiddleware().Handle, + AuthInterceptor: middleware.NewAuthInterceptorMiddleware(c).Handle, AlipayService: service.NewAliPayService(c), WechatPayService: service.NewWechatPayService(c, userAuthModel), ApplePayService: service.NewApplePayService(c), @@ -79,6 +122,7 @@ func NewServiceContext(c config.Config) *ServiceContext { AsynqServer: asynqServer, ApiRequestService: apiRequestService, AsynqService: service.NewAsynqService(c), + DictService: dictService, UserModel: model.NewUserModel(db, c.CacheRedis), UserAuthModel: userAuthModel, ProductModel: model.NewProductModel(db, c.CacheRedis), @@ -90,6 +134,21 @@ func NewServiceContext(c config.Config) *ServiceContext { GlobalNotificationsModel: model.NewGlobalNotificationsModel(db, c.CacheRedis), FeatureModel: featureModel, ProductFeatureModel: productFeatureModel, + + AdminApiModel: adminApiModel, + AdminMenuModel: adminMenuModel, + AdminRoleModel: adminRoleModel, + AdminRoleApiModel: adminRoleApiModel, + AdminRoleMenuModel: adminRoleMenuModel, + AdminUserModel: adminUserModel, + AdminUserRoleModel: adminUserRoleModel, + AdminDictDataModel: adminDictDataModel, + AdminDictTypeModel: adminDictTypeModel, + + AdminPromotionLinkModel: adminPromotionLinkModel, + AdminPromotionLinkStatsTotalModel: adminPromotionLinkStatsTotalModel, + AdminPromotionLinkStatsHistoryModel: adminPromotionLinkStatsHistoryModel, + AdminPromotionOrderModel: adminPromotionOrderModel, } } func (s *ServiceContext) Close() { diff --git a/app/main/api/internal/types/types.go b/app/main/api/internal/types/types.go index 0b2a818..4a0b1c1 100644 --- a/app/main/api/internal/types/types.go +++ b/app/main/api/internal/types/types.go @@ -1,12 +1,193 @@ // Code generated by goctl. DO NOT EDIT. package types +type AdminCreateUserReq struct { + Username string `json:"username"` // 用户名 + RealName string `json:"real_name"` // 真实姓名 + Status int64 `json:"status,default=1"` // 状态:0-禁用,1-启用 + RoleIds []int64 `json:"role_ids"` // 关联的角色ID列表 +} + +type AdminCreateUserResp struct { + Id int64 `json:"id"` // 用户ID +} + +type AdminDeleteUserReq struct { + Id int64 `path:"id"` // 用户ID +} + +type AdminDeleteUserResp struct { + Success bool `json:"success"` // 是否成功 +} + +type AdminGetUserDetailReq struct { + Id int64 `path:"id"` // 用户ID +} + +type AdminGetUserDetailResp struct { + Id int64 `json:"id"` // 用户ID + Username string `json:"username"` // 用户名 + RealName string `json:"real_name"` // 真实姓名 + Status int64 `json:"status"` // 状态:0-禁用,1-启用 + CreateTime string `json:"create_time"` // 创建时间 + UpdateTime string `json:"update_time"` // 更新时间 + RoleIds []int64 `json:"role_ids"` // 关联的角色ID列表 +} + +type AdminGetUserListReq struct { + Page int64 `form:"page,default=1"` // 页码 + PageSize int64 `form:"pageSize,default=20"` // 每页数量 + Username string `form:"username,optional"` // 用户名 + RealName string `form:"real_name,optional"` // 真实姓名 + Status int64 `form:"status,optional,default=-1"` // 状态:0-禁用,1-启用 +} + +type AdminGetUserListResp struct { + Total int64 `json:"total"` // 总数 + Items []UserListItem `json:"items"` // 列表 +} + +type AdminLoginReq struct { + Username string `json:"username" validate:"required"` + Password string `json:"password" validate:"required"` + Captcha bool `json:"captcha" validate:"required"` +} + +type AdminLoginResp struct { + AccessToken string `json:"access_token"` + AccessExpire int64 `json:"access_expire"` + RefreshAfter int64 `json:"refresh_after"` + Roles []string `json:"roles"` +} + +type AdminUpdateUserReq struct { + Id int64 `path:"id"` // 用户ID + Username *string `json:"username,optional"` // 用户名 + RealName *string `json:"real_name,optional"` // 真实姓名 + Status *int64 `json:"status,optional"` // 状态:0-禁用,1-启用 + RoleIds []int64 `json:"role_ids,optional"` // 关联的角色ID列表 +} + +type AdminUpdateUserResp struct { + Success bool `json:"success"` // 是否成功 +} + +type AdminUserInfoReq struct { +} + +type AdminUserInfoResp struct { + Username string `json:"username"` // 用户名 + RealName string `json:"real_name"` // 真实姓名 + Roles []string `json:"roles"` // 角色编码列表 +} + +type CreateMenuReq struct { + Pid int64 `json:"pid,optional"` // 父菜单ID + Name string `json:"name"` // 路由名称 + Path string `json:"path,optional"` // 路由路径 + Component string `json:"component,optional"` // 组件路径 + Redirect string `json:"redirect,optional"` // 重定向路径 + Meta map[string]interface{} `json:"meta"` // 路由元数据 + Status int64 `json:"status,optional,default=1"` // 状态:0-禁用,1-启用 + Type string `json:"type"` // 类型 + Sort int64 `json:"sort,optional"` // 排序 +} + +type CreateMenuResp struct { + Id int64 `json:"id"` // 菜单ID +} + +type CreatePromotionLinkReq struct { + Name string `json:"name"` // 链接名称 +} + +type CreatePromotionLinkResp struct { + Id int64 `json:"id"` // 链接ID + Url string `json:"url"` // 生成的推广链接URL +} + +type CreateRoleReq struct { + RoleName string `json:"role_name"` // 角色名称 + RoleCode string `json:"role_code"` // 角色编码 + Description string `json:"description"` // 角色描述 + Status int64 `json:"status,default=1"` // 状态:0-禁用,1-启用 + Sort int64 `json:"sort,default=0"` // 排序 + MenuIds []int64 `json:"menu_ids"` // 关联的菜单ID列表 +} + +type CreateRoleResp struct { + Id int64 `json:"id"` // 角色ID +} + +type DeleteMenuReq struct { + Id int64 `path:"id"` // 菜单ID +} + +type DeleteMenuResp struct { + Success bool `json:"success"` // 是否成功 +} + +type DeletePromotionLinkReq struct { + Id int64 `path:"id"` // 链接ID +} + +type DeletePromotionLinkResp struct { + Success bool `json:"success"` // 是否成功 +} + +type DeleteRoleReq struct { + Id int64 `path:"id"` // 角色ID +} + +type DeleteRoleResp struct { + Success bool `json:"success"` // 是否成功 +} + type Feature struct { ID int64 `json:"id"` // 功能ID ApiID string `json:"api_id"` // API标识 Name string `json:"name"` // 功能描述 } +type GetMenuAllReq struct { +} + +type GetMenuAllResp struct { + Name string `json:"name"` + Path string `json:"path"` + Redirect string `json:"redirect,omitempty"` + Component string `json:"component,omitempty"` + Sort int64 `json:"sort"` + Meta map[string]interface{} `json:"meta"` + Children []GetMenuAllResp `json:"children"` +} + +type GetMenuDetailReq struct { + Id int64 `path:"id"` // 菜单ID +} + +type GetMenuDetailResp struct { + Id int64 `json:"id"` // 菜单ID + Pid int64 `json:"pid"` // 父菜单ID + Name string `json:"name"` // 路由名称 + Path string `json:"path"` // 路由路径 + Component string `json:"component"` // 组件路径 + Redirect string `json:"redirect"` // 重定向路径 + Meta map[string]interface{} `json:"meta"` // 路由元数据 + Status int64 `json:"status"` // 状态:0-禁用,1-启用 + Type string `json:"type"` // 类型 + Sort int64 `json:"sort"` // 排序 + CreateTime string `json:"createTime"` // 创建时间 + UpdateTime string `json:"updateTime"` // 更新时间 +} + +type GetMenuListReq struct { + Name string `form:"name,optional"` // 菜单名称 + Path string `form:"path,optional"` // 路由路径 + Status int64 `form:"status,optional,default=-1"` // 状态:0-禁用,1-启用 + Type string `form:"type,optional"` // 类型 +} + type GetNotificationsResp struct { Notifications []Notification `json:"notifications"` // 通知列表 Total int64 `json:"total"` // 总记录数 @@ -28,11 +209,100 @@ type GetProductRenderListResponse struct { Product []Product } +type GetPromotionLinkDetailReq struct { + Id int64 `path:"id"` // 链接ID +} + +type GetPromotionLinkDetailResp struct { + Name string `json:"name"` // 链接名称 + Url string `json:"url"` // 推广链接URL + ClickCount int64 `json:"click_count"` // 点击数 + PayCount int64 `json:"pay_count"` // 付费次数 + PayAmount string `json:"pay_amount"` // 付费金额 + CreateTime string `json:"create_time"` // 创建时间 + UpdateTime string `json:"update_time"` // 更新时间 + LastClickTime string `json:"last_click_time,optional"` // 最后点击时间 + LastPayTime string `json:"last_pay_time,optional"` // 最后付费时间 +} + +type GetPromotionLinkListReq struct { + Page int64 `form:"page,default=1"` // 页码 + PageSize int64 `form:"pageSize,default=20"` // 每页数量 + Name string `form:"name,optional"` // 链接名称 + Url string `form:"url,optional"` // 推广链接URL +} + +type GetPromotionLinkListResp struct { + Total int64 `json:"total"` // 总数 + Items []PromotionLinkItem `json:"items"` // 列表 +} + +type GetPromotionStatsHistoryReq struct { + StartDate string `form:"start_date"` // 开始日期,格式:YYYY-MM-DD + EndDate string `form:"end_date"` // 结束日期,格式:YYYY-MM-DD +} + +type GetPromotionStatsTotalReq struct { +} + +type GetPromotionStatsTotalResp struct { + TodayPayAmount float64 `json:"today_pay_amount"` // 今日金额 + TodayClickCount int64 `json:"today_click_count"` // 今日点击数 + TodayPayCount int64 `json:"today_pay_count"` // 今日付费次数 + TotalPayAmount float64 `json:"total_pay_amount"` // 总金额 + TotalClickCount int64 `json:"total_click_count"` // 总点击数 + TotalPayCount int64 `json:"total_pay_count"` // 总付费次数 +} + +type GetRoleDetailReq struct { + Id int64 `path:"id"` // 角色ID +} + +type GetRoleDetailResp struct { + Id int64 `json:"id"` // 角色ID + RoleName string `json:"role_name"` // 角色名称 + RoleCode string `json:"role_code"` // 角色编码 + Description string `json:"description"` // 角色描述 + Status int64 `json:"status"` // 状态:0-禁用,1-启用 + Sort int64 `json:"sort"` // 排序 + CreateTime string `json:"create_time"` // 创建时间 + UpdateTime string `json:"update_time"` // 更新时间 + MenuIds []int64 `json:"menu_ids"` // 关联的菜单ID列表 +} + +type GetRoleListReq struct { + Page int64 `form:"page,default=1"` // 页码 + PageSize int64 `form:"pageSize,default=20"` // 每页数量 + Name string `form:"name,optional"` // 角色名称 + Code string `form:"code,optional"` // 角色编码 + Status int64 `form:"status,optional,default=-1"` // 状态:0-禁用,1-启用 +} + +type GetRoleListResp struct { + Total int64 `json:"total"` // 总数 + Items []RoleListItem `json:"items"` // 列表 +} + type IapCallbackReq struct { OrderID int64 `json:"order_id" validate:"required"` TransactionReceipt string `json:"transaction_receipt" validate:"required"` } +type MenuListItem struct { + Id int64 `json:"id"` // 菜单ID + Pid int64 `json:"pid"` // 父菜单ID + Name string `json:"name"` // 路由名称 + Path string `json:"path"` // 路由路径 + Component string `json:"component"` // 组件路径 + Redirect string `json:"redirect"` // 重定向路径 + Meta map[string]interface{} `json:"meta"` // 路由元数据 + Status int64 `json:"status"` // 状态:0-禁用,1-启用 + Type string `json:"type"` // 类型 + Sort int64 `json:"sort"` // 排序 + CreateTime string `json:"createTime"` // 创建时间 + Children []MenuListItem `json:"children"` // 子菜单 +} + type MobileCodeLoginReq struct { Mobile string `json:"mobile"` Code string `json:"code" validate:"required"` @@ -89,6 +359,27 @@ type ProductResponse struct { Product } +type PromotionLinkItem struct { + Id int64 `json:"id"` // 链接ID + Name string `json:"name"` // 链接名称 + Url string `json:"url"` // 推广链接URL + ClickCount int64 `json:"click_count"` // 点击数 + PayCount int64 `json:"pay_count"` // 付费次数 + PayAmount string `json:"pay_amount"` // 付费金额 + CreateTime string `json:"create_time"` // 创建时间 + LastClickTime string `json:"last_click_time,optional"` // 最后点击时间 + LastPayTime string `json:"last_pay_time,optional"` // 最后付费时间 +} + +type PromotionStatsHistoryItem struct { + Id int64 `json:"id"` // 记录ID + LinkId int64 `json:"link_id"` // 链接ID + PayAmount float64 `json:"pay_amount"` // 金额 + ClickCount int64 `json:"click_count"` // 点击数 + PayCount int64 `json:"pay_count"` // 付费次数 + StatsDate string `json:"stats_date"` // 统计日期 +} + type Query struct { Id int64 `json:"id"` // 主键ID OrderId int64 `json:"order_id"` // 订单ID @@ -191,6 +482,14 @@ type QuerySingleTestResp struct { Api string `json:"api"` } +type RecordLinkClickReq struct { + Path string `path:"path"` // 链接路径 +} + +type RecordLinkClickResp struct { + Success bool `json:"success"` // 是否成功 +} + type RegisterReq struct { Mobile string `json:"mobile" validate:"required,mobile"` Password string `json:"password" validate:"required,min=11,max=11,password"` @@ -203,6 +502,43 @@ type RegisterResp struct { RefreshAfter int64 `json:"refreshAfter"` } +type RoleListItem struct { + Id int64 `json:"id"` // 角色ID + RoleName string `json:"role_name"` // 角色名称 + RoleCode string `json:"role_code"` // 角色编码 + Description string `json:"description"` // 角色描述 + Status int64 `json:"status"` // 状态:0-禁用,1-启用 + Sort int64 `json:"sort"` // 排序 + CreateTime string `json:"create_time"` // 创建时间 + MenuIds []int64 `json:"menu_ids"` // 关联的菜单ID列表 +} + +type UpdateMenuReq struct { + Id int64 `path:"id"` // 菜单ID + Pid int64 `json:"pid,optional"` // 父菜单ID + Name string `json:"name"` // 路由名称 + Path string `json:"path,optional"` // 路由路径 + Component string `json:"component,optional"` // 组件路径 + Redirect string `json:"redirect,optional"` // 重定向路径 + Meta map[string]interface{} `json:"meta"` // 路由元数据 + Status int64 `json:"status,optional"` // 状态:0-禁用,1-启用 + Type string `json:"type"` // 类型 + Sort int64 `json:"sort,optional"` // 排序 +} + +type UpdateMenuResp struct { + Success bool `json:"success"` // 是否成功 +} + +type UpdatePromotionLinkReq struct { + Id int64 `path:"id"` // 链接ID + Name *string `json:"name,optional"` // 链接名称 +} + +type UpdatePromotionLinkResp struct { + Success bool `json:"success"` // 是否成功 +} + type UpdateQueryDataReq struct { Id int64 `json:"id"` // 查询ID QueryData string `json:"query_data"` // 查询数据(未加密的JSON) @@ -213,6 +549,20 @@ type UpdateQueryDataResp struct { UpdatedAt string `json:"updated_at"` // 更新时间 } +type UpdateRoleReq struct { + Id int64 `path:"id"` // 角色ID + RoleName *string `json:"role_name,optional"` // 角色名称 + RoleCode *string `json:"role_code,optional"` // 角色编码 + Description *string `json:"description,optional"` // 角色描述 + Status *int64 `json:"status,optional"` // 状态:0-禁用,1-启用 + Sort *int64 `json:"sort,optional"` // 排序 + MenuIds []int64 `json:"menu_ids,optional"` // 关联的菜单ID列表 +} + +type UpdateRoleResp struct { + Success bool `json:"success"` // 是否成功 +} + type User struct { Id int64 `json:"id"` Mobile string `json:"mobile"` @@ -223,6 +573,15 @@ type UserInfoResp struct { UserInfo User `json:"userInfo"` } +type UserListItem struct { + Id int64 `json:"id"` // 用户ID + Username string `json:"username"` // 用户名 + RealName string `json:"real_name"` // 真实姓名 + Status int64 `json:"status"` // 状态:0-禁用,1-启用 + CreateTime string `json:"create_time"` // 创建时间 + RoleIds []int64 `json:"role_ids"` // 关联的角色ID列表 +} + type WXH5AuthReq struct { Code string `json:"code"` } diff --git a/app/main/api/main.go b/app/main/api/main.go index 95ffd2d..4180c04 100644 --- a/app/main/api/main.go +++ b/app/main/api/main.go @@ -7,6 +7,7 @@ import ( "os" "tyc-server/app/main/api/internal/config" "tyc-server/app/main/api/internal/handler" + middleware "tyc-server/app/main/api/internal/middleware/global" "tyc-server/app/main/api/internal/queue" "tyc-server/app/main/api/internal/svc" @@ -57,6 +58,10 @@ func main() { // script.RunEncryptMobile() // }() server := rest.MustNewServer(c.RestConf) + + // 全局中间件 + server.Use(middleware.ReqHeaderCtxMiddleware) + defer server.Stop() handler.RegisterHandlers(server, svcContext) diff --git a/app/main/model/adminApiModel.go b/app/main/model/adminApiModel.go new file mode 100644 index 0000000..6ed3633 --- /dev/null +++ b/app/main/model/adminApiModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ AdminApiModel = (*customAdminApiModel)(nil) + +type ( + // AdminApiModel is an interface to be customized, add more methods here, + // and implement the added methods in customAdminApiModel. + AdminApiModel interface { + adminApiModel + } + + customAdminApiModel struct { + *defaultAdminApiModel + } +) + +// NewAdminApiModel returns a model for the database table. +func NewAdminApiModel(conn sqlx.SqlConn, c cache.CacheConf) AdminApiModel { + return &customAdminApiModel{ + defaultAdminApiModel: newAdminApiModel(conn, c), + } +} diff --git a/app/main/model/adminApiModel_gen.go b/app/main/model/adminApiModel_gen.go new file mode 100644 index 0000000..8fd41c4 --- /dev/null +++ b/app/main/model/adminApiModel_gen.go @@ -0,0 +1,411 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "tyc-server/common/globalkey" +) + +var ( + adminApiFieldNames = builder.RawFieldNames(&AdminApi{}) + adminApiRows = strings.Join(adminApiFieldNames, ",") + adminApiRowsExpectAutoSet = strings.Join(stringx.Remove(adminApiFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + adminApiRowsWithPlaceHolder = strings.Join(stringx.Remove(adminApiFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheTycAdminApiIdPrefix = "cache:tyc:adminApi:id:" + cacheTycAdminApiApiCodePrefix = "cache:tyc:adminApi:apiCode:" +) + +type ( + adminApiModel interface { + Insert(ctx context.Context, session sqlx.Session, data *AdminApi) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*AdminApi, error) + FindOneByApiCode(ctx context.Context, apiCode string) (*AdminApi, error) + Update(ctx context.Context, session sqlx.Session, data *AdminApi) (sql.Result, error) + UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AdminApi) error + Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminApi) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*AdminApi, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminApi, error) + FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminApi, int64, error) + FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminApi, error) + FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminApi, error) + Delete(ctx context.Context, session sqlx.Session, id int64) error + } + + defaultAdminApiModel struct { + sqlc.CachedConn + table string + } + + AdminApi struct { + Id int64 `db:"id"` + CreateTime time.Time `db:"create_time"` + UpdateTime time.Time `db:"update_time"` + DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 + DelState int64 `db:"del_state"` + Version int64 `db:"version"` // 版本号 + ApiName string `db:"api_name"` // 接口名称 + ApiCode string `db:"api_code"` // 接口编码 + Method string `db:"method"` // 请求方法:GET、POST等 + Url string `db:"url"` // 接口URL + Status int64 `db:"status"` // 状态:0-禁用,1-启用 + Description string `db:"description"` // 接口描述 + } +) + +func newAdminApiModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAdminApiModel { + return &defaultAdminApiModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`admin_api`", + } +} + +func (m *defaultAdminApiModel) Insert(ctx context.Context, session sqlx.Session, data *AdminApi) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + tycAdminApiApiCodeKey := fmt.Sprintf("%s%v", cacheTycAdminApiApiCodePrefix, data.ApiCode) + tycAdminApiIdKey := fmt.Sprintf("%s%v", cacheTycAdminApiIdPrefix, data.Id) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, adminApiRowsExpectAutoSet) + if session != nil { + return session.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.ApiName, data.ApiCode, data.Method, data.Url, data.Status, data.Description) + } + return conn.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.ApiName, data.ApiCode, data.Method, data.Url, data.Status, data.Description) + }, tycAdminApiApiCodeKey, tycAdminApiIdKey) +} + +func (m *defaultAdminApiModel) FindOne(ctx context.Context, id int64) (*AdminApi, error) { + tycAdminApiIdKey := fmt.Sprintf("%s%v", cacheTycAdminApiIdPrefix, id) + var resp AdminApi + err := m.QueryRowCtx(ctx, &resp, tycAdminApiIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminApiRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminApiModel) FindOneByApiCode(ctx context.Context, apiCode string) (*AdminApi, error) { + tycAdminApiApiCodeKey := fmt.Sprintf("%s%v", cacheTycAdminApiApiCodePrefix, apiCode) + var resp AdminApi + err := m.QueryRowIndexCtx(ctx, &resp, tycAdminApiApiCodeKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `api_code` = ? and del_state = ? limit 1", adminApiRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, apiCode, globalkey.DelStateNo); err != nil { + return nil, err + } + return resp.Id, nil + }, m.queryPrimary) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminApiModel) Update(ctx context.Context, session sqlx.Session, newData *AdminApi) (sql.Result, error) { + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return nil, err + } + tycAdminApiApiCodeKey := fmt.Sprintf("%s%v", cacheTycAdminApiApiCodePrefix, data.ApiCode) + tycAdminApiIdKey := fmt.Sprintf("%s%v", cacheTycAdminApiIdPrefix, data.Id) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, adminApiRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.ApiName, newData.ApiCode, newData.Method, newData.Url, newData.Status, newData.Description, newData.Id) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.ApiName, newData.ApiCode, newData.Method, newData.Url, newData.Status, newData.Description, newData.Id) + }, tycAdminApiApiCodeKey, tycAdminApiIdKey) +} + +func (m *defaultAdminApiModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *AdminApi) error { + + oldVersion := newData.Version + newData.Version += 1 + + var sqlResult sql.Result + var err error + + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return err + } + tycAdminApiApiCodeKey := fmt.Sprintf("%s%v", cacheTycAdminApiApiCodePrefix, data.ApiCode) + tycAdminApiIdKey := fmt.Sprintf("%s%v", cacheTycAdminApiIdPrefix, data.Id) + sqlResult, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ? and version = ? ", m.table, adminApiRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.ApiName, newData.ApiCode, newData.Method, newData.Url, newData.Status, newData.Description, newData.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.ApiName, newData.ApiCode, newData.Method, newData.Url, newData.Status, newData.Description, newData.Id, oldVersion) + }, tycAdminApiApiCodeKey, tycAdminApiIdKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultAdminApiModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminApi) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "AdminApiModel delete err : %+v", err) + } + return nil +} + +func (m *defaultAdminApiModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminApiModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminApiModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*AdminApi, error) { + + builder = builder.Columns(adminApiRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminApi + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminApiModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminApi, error) { + + builder = builder.Columns(adminApiRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminApi + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminApiModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminApi, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(adminApiRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*AdminApi + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultAdminApiModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminApi, error) { + + builder = builder.Columns(adminApiRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminApi + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminApiModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminApi, error) { + + builder = builder.Columns(adminApiRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminApi + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminApiModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultAdminApiModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultAdminApiModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + data, err := m.FindOne(ctx, id) + if err != nil { + return err + } + + tycAdminApiApiCodeKey := fmt.Sprintf("%s%v", cacheTycAdminApiApiCodePrefix, data.ApiCode) + tycAdminApiIdKey := fmt.Sprintf("%s%v", cacheTycAdminApiIdPrefix, id) + _, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("delete from %s where `id` = ?", m.table) + if session != nil { + return session.ExecCtx(ctx, query, id) + } + return conn.ExecCtx(ctx, query, id) + }, tycAdminApiApiCodeKey, tycAdminApiIdKey) + return err +} +func (m *defaultAdminApiModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheTycAdminApiIdPrefix, primary) +} +func (m *defaultAdminApiModel) queryPrimary(ctx context.Context, conn sqlx.SqlConn, v, primary interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminApiRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultAdminApiModel) tableName() string { + return m.table +} diff --git a/app/main/model/adminDictDataModel.go b/app/main/model/adminDictDataModel.go new file mode 100644 index 0000000..cbec9c9 --- /dev/null +++ b/app/main/model/adminDictDataModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ AdminDictDataModel = (*customAdminDictDataModel)(nil) + +type ( + // AdminDictDataModel is an interface to be customized, add more methods here, + // and implement the added methods in customAdminDictDataModel. + AdminDictDataModel interface { + adminDictDataModel + } + + customAdminDictDataModel struct { + *defaultAdminDictDataModel + } +) + +// NewAdminDictDataModel returns a model for the database table. +func NewAdminDictDataModel(conn sqlx.SqlConn, c cache.CacheConf) AdminDictDataModel { + return &customAdminDictDataModel{ + defaultAdminDictDataModel: newAdminDictDataModel(conn, c), + } +} diff --git a/app/main/model/adminDictDataModel_gen.go b/app/main/model/adminDictDataModel_gen.go new file mode 100644 index 0000000..0822468 --- /dev/null +++ b/app/main/model/adminDictDataModel_gen.go @@ -0,0 +1,437 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "tyc-server/common/globalkey" +) + +var ( + adminDictDataFieldNames = builder.RawFieldNames(&AdminDictData{}) + adminDictDataRows = strings.Join(adminDictDataFieldNames, ",") + adminDictDataRowsExpectAutoSet = strings.Join(stringx.Remove(adminDictDataFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + adminDictDataRowsWithPlaceHolder = strings.Join(stringx.Remove(adminDictDataFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheTycAdminDictDataIdPrefix = "cache:tyc:adminDictData:id:" + cacheTycAdminDictDataDictTypeDictLabelPrefix = "cache:tyc:adminDictData:dictType:dictLabel:" + cacheTycAdminDictDataDictTypeDictValuePrefix = "cache:tyc:adminDictData:dictType:dictValue:" +) + +type ( + adminDictDataModel interface { + Insert(ctx context.Context, session sqlx.Session, data *AdminDictData) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*AdminDictData, error) + FindOneByDictTypeDictLabel(ctx context.Context, dictType string, dictLabel string) (*AdminDictData, error) + FindOneByDictTypeDictValue(ctx context.Context, dictType string, dictValue int64) (*AdminDictData, error) + Update(ctx context.Context, session sqlx.Session, data *AdminDictData) (sql.Result, error) + UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AdminDictData) error + Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminDictData) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*AdminDictData, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminDictData, error) + FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminDictData, int64, error) + FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminDictData, error) + FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminDictData, error) + Delete(ctx context.Context, session sqlx.Session, id int64) error + } + + defaultAdminDictDataModel struct { + sqlc.CachedConn + table string + } + + AdminDictData struct { + Id int64 `db:"id"` + CreateTime time.Time `db:"create_time"` + UpdateTime time.Time `db:"update_time"` + DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 + DelState int64 `db:"del_state"` + Version int64 `db:"version"` // 版本号 + DictType string `db:"dict_type"` // 字典类型编码 + DictLabel string `db:"dict_label"` // 字典标签 + DictValue int64 `db:"dict_value"` // 字典键值 + DictSort int64 `db:"dict_sort"` // 字典排序 + Status int64 `db:"status"` // 状态:0-禁用,1-启用 + Remark sql.NullString `db:"remark"` // 备注 + } +) + +func newAdminDictDataModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAdminDictDataModel { + return &defaultAdminDictDataModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`admin_dict_data`", + } +} + +func (m *defaultAdminDictDataModel) Insert(ctx context.Context, session sqlx.Session, data *AdminDictData) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + tycAdminDictDataDictTypeDictLabelKey := fmt.Sprintf("%s%v:%v", cacheTycAdminDictDataDictTypeDictLabelPrefix, data.DictType, data.DictLabel) + tycAdminDictDataDictTypeDictValueKey := fmt.Sprintf("%s%v:%v", cacheTycAdminDictDataDictTypeDictValuePrefix, data.DictType, data.DictValue) + tycAdminDictDataIdKey := fmt.Sprintf("%s%v", cacheTycAdminDictDataIdPrefix, data.Id) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, adminDictDataRowsExpectAutoSet) + if session != nil { + return session.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.DictType, data.DictLabel, data.DictValue, data.DictSort, data.Status, data.Remark) + } + return conn.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.DictType, data.DictLabel, data.DictValue, data.DictSort, data.Status, data.Remark) + }, tycAdminDictDataDictTypeDictLabelKey, tycAdminDictDataDictTypeDictValueKey, tycAdminDictDataIdKey) +} + +func (m *defaultAdminDictDataModel) FindOne(ctx context.Context, id int64) (*AdminDictData, error) { + tycAdminDictDataIdKey := fmt.Sprintf("%s%v", cacheTycAdminDictDataIdPrefix, id) + var resp AdminDictData + err := m.QueryRowCtx(ctx, &resp, tycAdminDictDataIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminDictDataRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminDictDataModel) FindOneByDictTypeDictLabel(ctx context.Context, dictType string, dictLabel string) (*AdminDictData, error) { + tycAdminDictDataDictTypeDictLabelKey := fmt.Sprintf("%s%v:%v", cacheTycAdminDictDataDictTypeDictLabelPrefix, dictType, dictLabel) + var resp AdminDictData + err := m.QueryRowIndexCtx(ctx, &resp, tycAdminDictDataDictTypeDictLabelKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `dict_type` = ? and `dict_label` = ? and del_state = ? limit 1", adminDictDataRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, dictType, dictLabel, globalkey.DelStateNo); err != nil { + return nil, err + } + return resp.Id, nil + }, m.queryPrimary) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminDictDataModel) FindOneByDictTypeDictValue(ctx context.Context, dictType string, dictValue int64) (*AdminDictData, error) { + tycAdminDictDataDictTypeDictValueKey := fmt.Sprintf("%s%v:%v", cacheTycAdminDictDataDictTypeDictValuePrefix, dictType, dictValue) + var resp AdminDictData + err := m.QueryRowIndexCtx(ctx, &resp, tycAdminDictDataDictTypeDictValueKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `dict_type` = ? and `dict_value` = ? and del_state = ? limit 1", adminDictDataRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, dictType, dictValue, globalkey.DelStateNo); err != nil { + return nil, err + } + return resp.Id, nil + }, m.queryPrimary) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminDictDataModel) Update(ctx context.Context, session sqlx.Session, newData *AdminDictData) (sql.Result, error) { + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return nil, err + } + tycAdminDictDataDictTypeDictLabelKey := fmt.Sprintf("%s%v:%v", cacheTycAdminDictDataDictTypeDictLabelPrefix, data.DictType, data.DictLabel) + tycAdminDictDataDictTypeDictValueKey := fmt.Sprintf("%s%v:%v", cacheTycAdminDictDataDictTypeDictValuePrefix, data.DictType, data.DictValue) + tycAdminDictDataIdKey := fmt.Sprintf("%s%v", cacheTycAdminDictDataIdPrefix, data.Id) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, adminDictDataRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.DictType, newData.DictLabel, newData.DictValue, newData.DictSort, newData.Status, newData.Remark, newData.Id) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.DictType, newData.DictLabel, newData.DictValue, newData.DictSort, newData.Status, newData.Remark, newData.Id) + }, tycAdminDictDataDictTypeDictLabelKey, tycAdminDictDataDictTypeDictValueKey, tycAdminDictDataIdKey) +} + +func (m *defaultAdminDictDataModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *AdminDictData) error { + + oldVersion := newData.Version + newData.Version += 1 + + var sqlResult sql.Result + var err error + + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return err + } + tycAdminDictDataDictTypeDictLabelKey := fmt.Sprintf("%s%v:%v", cacheTycAdminDictDataDictTypeDictLabelPrefix, data.DictType, data.DictLabel) + tycAdminDictDataDictTypeDictValueKey := fmt.Sprintf("%s%v:%v", cacheTycAdminDictDataDictTypeDictValuePrefix, data.DictType, data.DictValue) + tycAdminDictDataIdKey := fmt.Sprintf("%s%v", cacheTycAdminDictDataIdPrefix, data.Id) + sqlResult, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ? and version = ? ", m.table, adminDictDataRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.DictType, newData.DictLabel, newData.DictValue, newData.DictSort, newData.Status, newData.Remark, newData.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.DictType, newData.DictLabel, newData.DictValue, newData.DictSort, newData.Status, newData.Remark, newData.Id, oldVersion) + }, tycAdminDictDataDictTypeDictLabelKey, tycAdminDictDataDictTypeDictValueKey, tycAdminDictDataIdKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultAdminDictDataModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminDictData) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "AdminDictDataModel delete err : %+v", err) + } + return nil +} + +func (m *defaultAdminDictDataModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminDictDataModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminDictDataModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*AdminDictData, error) { + + builder = builder.Columns(adminDictDataRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminDictData + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminDictDataModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminDictData, error) { + + builder = builder.Columns(adminDictDataRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminDictData + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminDictDataModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminDictData, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(adminDictDataRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*AdminDictData + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultAdminDictDataModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminDictData, error) { + + builder = builder.Columns(adminDictDataRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminDictData + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminDictDataModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminDictData, error) { + + builder = builder.Columns(adminDictDataRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminDictData + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminDictDataModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultAdminDictDataModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultAdminDictDataModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + data, err := m.FindOne(ctx, id) + if err != nil { + return err + } + + tycAdminDictDataDictTypeDictLabelKey := fmt.Sprintf("%s%v:%v", cacheTycAdminDictDataDictTypeDictLabelPrefix, data.DictType, data.DictLabel) + tycAdminDictDataDictTypeDictValueKey := fmt.Sprintf("%s%v:%v", cacheTycAdminDictDataDictTypeDictValuePrefix, data.DictType, data.DictValue) + tycAdminDictDataIdKey := fmt.Sprintf("%s%v", cacheTycAdminDictDataIdPrefix, id) + _, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("delete from %s where `id` = ?", m.table) + if session != nil { + return session.ExecCtx(ctx, query, id) + } + return conn.ExecCtx(ctx, query, id) + }, tycAdminDictDataDictTypeDictLabelKey, tycAdminDictDataDictTypeDictValueKey, tycAdminDictDataIdKey) + return err +} +func (m *defaultAdminDictDataModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheTycAdminDictDataIdPrefix, primary) +} +func (m *defaultAdminDictDataModel) queryPrimary(ctx context.Context, conn sqlx.SqlConn, v, primary interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminDictDataRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultAdminDictDataModel) tableName() string { + return m.table +} diff --git a/app/main/model/adminDictTypeModel.go b/app/main/model/adminDictTypeModel.go new file mode 100644 index 0000000..1153feb --- /dev/null +++ b/app/main/model/adminDictTypeModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ AdminDictTypeModel = (*customAdminDictTypeModel)(nil) + +type ( + // AdminDictTypeModel is an interface to be customized, add more methods here, + // and implement the added methods in customAdminDictTypeModel. + AdminDictTypeModel interface { + adminDictTypeModel + } + + customAdminDictTypeModel struct { + *defaultAdminDictTypeModel + } +) + +// NewAdminDictTypeModel returns a model for the database table. +func NewAdminDictTypeModel(conn sqlx.SqlConn, c cache.CacheConf) AdminDictTypeModel { + return &customAdminDictTypeModel{ + defaultAdminDictTypeModel: newAdminDictTypeModel(conn, c), + } +} diff --git a/app/main/model/adminDictTypeModel_gen.go b/app/main/model/adminDictTypeModel_gen.go new file mode 100644 index 0000000..86aacc7 --- /dev/null +++ b/app/main/model/adminDictTypeModel_gen.go @@ -0,0 +1,409 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "tyc-server/common/globalkey" +) + +var ( + adminDictTypeFieldNames = builder.RawFieldNames(&AdminDictType{}) + adminDictTypeRows = strings.Join(adminDictTypeFieldNames, ",") + adminDictTypeRowsExpectAutoSet = strings.Join(stringx.Remove(adminDictTypeFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + adminDictTypeRowsWithPlaceHolder = strings.Join(stringx.Remove(adminDictTypeFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheTycAdminDictTypeIdPrefix = "cache:tyc:adminDictType:id:" + cacheTycAdminDictTypeDictTypePrefix = "cache:tyc:adminDictType:dictType:" +) + +type ( + adminDictTypeModel interface { + Insert(ctx context.Context, session sqlx.Session, data *AdminDictType) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*AdminDictType, error) + FindOneByDictType(ctx context.Context, dictType string) (*AdminDictType, error) + Update(ctx context.Context, session sqlx.Session, data *AdminDictType) (sql.Result, error) + UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AdminDictType) error + Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminDictType) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*AdminDictType, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminDictType, error) + FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminDictType, int64, error) + FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminDictType, error) + FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminDictType, error) + Delete(ctx context.Context, session sqlx.Session, id int64) error + } + + defaultAdminDictTypeModel struct { + sqlc.CachedConn + table string + } + + AdminDictType struct { + Id int64 `db:"id"` + CreateTime time.Time `db:"create_time"` + UpdateTime time.Time `db:"update_time"` + DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 + DelState int64 `db:"del_state"` + Version int64 `db:"version"` // 版本号 + DictType string `db:"dict_type"` // 字典类型编码 + DictName string `db:"dict_name"` // 字典类型名称 + Status int64 `db:"status"` // 状态:0-禁用,1-启用 + Remark sql.NullString `db:"remark"` // 备注 + } +) + +func newAdminDictTypeModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAdminDictTypeModel { + return &defaultAdminDictTypeModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`admin_dict_type`", + } +} + +func (m *defaultAdminDictTypeModel) Insert(ctx context.Context, session sqlx.Session, data *AdminDictType) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + tycAdminDictTypeDictTypeKey := fmt.Sprintf("%s%v", cacheTycAdminDictTypeDictTypePrefix, data.DictType) + tycAdminDictTypeIdKey := fmt.Sprintf("%s%v", cacheTycAdminDictTypeIdPrefix, data.Id) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?)", m.table, adminDictTypeRowsExpectAutoSet) + if session != nil { + return session.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.DictType, data.DictName, data.Status, data.Remark) + } + return conn.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.DictType, data.DictName, data.Status, data.Remark) + }, tycAdminDictTypeDictTypeKey, tycAdminDictTypeIdKey) +} + +func (m *defaultAdminDictTypeModel) FindOne(ctx context.Context, id int64) (*AdminDictType, error) { + tycAdminDictTypeIdKey := fmt.Sprintf("%s%v", cacheTycAdminDictTypeIdPrefix, id) + var resp AdminDictType + err := m.QueryRowCtx(ctx, &resp, tycAdminDictTypeIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminDictTypeRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminDictTypeModel) FindOneByDictType(ctx context.Context, dictType string) (*AdminDictType, error) { + tycAdminDictTypeDictTypeKey := fmt.Sprintf("%s%v", cacheTycAdminDictTypeDictTypePrefix, dictType) + var resp AdminDictType + err := m.QueryRowIndexCtx(ctx, &resp, tycAdminDictTypeDictTypeKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `dict_type` = ? and del_state = ? limit 1", adminDictTypeRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, dictType, globalkey.DelStateNo); err != nil { + return nil, err + } + return resp.Id, nil + }, m.queryPrimary) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminDictTypeModel) Update(ctx context.Context, session sqlx.Session, newData *AdminDictType) (sql.Result, error) { + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return nil, err + } + tycAdminDictTypeDictTypeKey := fmt.Sprintf("%s%v", cacheTycAdminDictTypeDictTypePrefix, data.DictType) + tycAdminDictTypeIdKey := fmt.Sprintf("%s%v", cacheTycAdminDictTypeIdPrefix, data.Id) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, adminDictTypeRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.DictType, newData.DictName, newData.Status, newData.Remark, newData.Id) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.DictType, newData.DictName, newData.Status, newData.Remark, newData.Id) + }, tycAdminDictTypeDictTypeKey, tycAdminDictTypeIdKey) +} + +func (m *defaultAdminDictTypeModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *AdminDictType) error { + + oldVersion := newData.Version + newData.Version += 1 + + var sqlResult sql.Result + var err error + + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return err + } + tycAdminDictTypeDictTypeKey := fmt.Sprintf("%s%v", cacheTycAdminDictTypeDictTypePrefix, data.DictType) + tycAdminDictTypeIdKey := fmt.Sprintf("%s%v", cacheTycAdminDictTypeIdPrefix, data.Id) + sqlResult, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ? and version = ? ", m.table, adminDictTypeRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.DictType, newData.DictName, newData.Status, newData.Remark, newData.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.DictType, newData.DictName, newData.Status, newData.Remark, newData.Id, oldVersion) + }, tycAdminDictTypeDictTypeKey, tycAdminDictTypeIdKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultAdminDictTypeModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminDictType) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "AdminDictTypeModel delete err : %+v", err) + } + return nil +} + +func (m *defaultAdminDictTypeModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminDictTypeModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminDictTypeModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*AdminDictType, error) { + + builder = builder.Columns(adminDictTypeRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminDictType + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminDictTypeModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminDictType, error) { + + builder = builder.Columns(adminDictTypeRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminDictType + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminDictTypeModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminDictType, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(adminDictTypeRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*AdminDictType + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultAdminDictTypeModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminDictType, error) { + + builder = builder.Columns(adminDictTypeRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminDictType + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminDictTypeModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminDictType, error) { + + builder = builder.Columns(adminDictTypeRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminDictType + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminDictTypeModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultAdminDictTypeModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultAdminDictTypeModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + data, err := m.FindOne(ctx, id) + if err != nil { + return err + } + + tycAdminDictTypeDictTypeKey := fmt.Sprintf("%s%v", cacheTycAdminDictTypeDictTypePrefix, data.DictType) + tycAdminDictTypeIdKey := fmt.Sprintf("%s%v", cacheTycAdminDictTypeIdPrefix, id) + _, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("delete from %s where `id` = ?", m.table) + if session != nil { + return session.ExecCtx(ctx, query, id) + } + return conn.ExecCtx(ctx, query, id) + }, tycAdminDictTypeDictTypeKey, tycAdminDictTypeIdKey) + return err +} +func (m *defaultAdminDictTypeModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheTycAdminDictTypeIdPrefix, primary) +} +func (m *defaultAdminDictTypeModel) queryPrimary(ctx context.Context, conn sqlx.SqlConn, v, primary interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminDictTypeRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultAdminDictTypeModel) tableName() string { + return m.table +} diff --git a/app/main/model/adminMenuModel.go b/app/main/model/adminMenuModel.go new file mode 100644 index 0000000..c2dc171 --- /dev/null +++ b/app/main/model/adminMenuModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ AdminMenuModel = (*customAdminMenuModel)(nil) + +type ( + // AdminMenuModel is an interface to be customized, add more methods here, + // and implement the added methods in customAdminMenuModel. + AdminMenuModel interface { + adminMenuModel + } + + customAdminMenuModel struct { + *defaultAdminMenuModel + } +) + +// NewAdminMenuModel returns a model for the database table. +func NewAdminMenuModel(conn sqlx.SqlConn, c cache.CacheConf) AdminMenuModel { + return &customAdminMenuModel{ + defaultAdminMenuModel: newAdminMenuModel(conn, c), + } +} diff --git a/app/main/model/adminMenuModel_gen.go b/app/main/model/adminMenuModel_gen.go new file mode 100644 index 0000000..7e0c545 --- /dev/null +++ b/app/main/model/adminMenuModel_gen.go @@ -0,0 +1,414 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "tyc-server/common/globalkey" +) + +var ( + adminMenuFieldNames = builder.RawFieldNames(&AdminMenu{}) + adminMenuRows = strings.Join(adminMenuFieldNames, ",") + adminMenuRowsExpectAutoSet = strings.Join(stringx.Remove(adminMenuFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + adminMenuRowsWithPlaceHolder = strings.Join(stringx.Remove(adminMenuFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheTycAdminMenuIdPrefix = "cache:tyc:adminMenu:id:" + cacheTycAdminMenuNamePathPrefix = "cache:tyc:adminMenu:name:path:" +) + +type ( + adminMenuModel interface { + Insert(ctx context.Context, session sqlx.Session, data *AdminMenu) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*AdminMenu, error) + FindOneByNamePath(ctx context.Context, name string, path string) (*AdminMenu, error) + Update(ctx context.Context, session sqlx.Session, data *AdminMenu) (sql.Result, error) + UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AdminMenu) error + Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminMenu) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*AdminMenu, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminMenu, error) + FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminMenu, int64, error) + FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminMenu, error) + FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminMenu, error) + Delete(ctx context.Context, session sqlx.Session, id int64) error + } + + defaultAdminMenuModel struct { + sqlc.CachedConn + table string + } + + AdminMenu struct { + Id int64 `db:"id"` + CreateTime time.Time `db:"create_time"` + UpdateTime time.Time `db:"update_time"` + DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 + DelState int64 `db:"del_state"` + Version int64 `db:"version"` // 版本号 + Pid int64 `db:"pid"` // 父菜单ID + Name string `db:"name"` // 路由名称 + Path string `db:"path"` // 路由路径 + Component string `db:"component"` // 组件路径 + Redirect sql.NullString `db:"redirect"` // 重定向路径 + Meta string `db:"meta"` // 路由元数据配置 + Status int64 `db:"status"` // 状态: 0-禁用, 1-启用 + Type int64 `db:"type"` + Sort int64 `db:"sort"` // 排序号 + } +) + +func newAdminMenuModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAdminMenuModel { + return &defaultAdminMenuModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`admin_menu`", + } +} + +func (m *defaultAdminMenuModel) Insert(ctx context.Context, session sqlx.Session, data *AdminMenu) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + tycAdminMenuIdKey := fmt.Sprintf("%s%v", cacheTycAdminMenuIdPrefix, data.Id) + tycAdminMenuNamePathKey := fmt.Sprintf("%s%v:%v", cacheTycAdminMenuNamePathPrefix, data.Name, data.Path) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, adminMenuRowsExpectAutoSet) + if session != nil { + return session.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.Pid, data.Name, data.Path, data.Component, data.Redirect, data.Meta, data.Status, data.Type, data.Sort) + } + return conn.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.Pid, data.Name, data.Path, data.Component, data.Redirect, data.Meta, data.Status, data.Type, data.Sort) + }, tycAdminMenuIdKey, tycAdminMenuNamePathKey) +} + +func (m *defaultAdminMenuModel) FindOne(ctx context.Context, id int64) (*AdminMenu, error) { + tycAdminMenuIdKey := fmt.Sprintf("%s%v", cacheTycAdminMenuIdPrefix, id) + var resp AdminMenu + err := m.QueryRowCtx(ctx, &resp, tycAdminMenuIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminMenuRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminMenuModel) FindOneByNamePath(ctx context.Context, name string, path string) (*AdminMenu, error) { + tycAdminMenuNamePathKey := fmt.Sprintf("%s%v:%v", cacheTycAdminMenuNamePathPrefix, name, path) + var resp AdminMenu + err := m.QueryRowIndexCtx(ctx, &resp, tycAdminMenuNamePathKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `name` = ? and `path` = ? and del_state = ? limit 1", adminMenuRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, name, path, globalkey.DelStateNo); err != nil { + return nil, err + } + return resp.Id, nil + }, m.queryPrimary) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminMenuModel) Update(ctx context.Context, session sqlx.Session, newData *AdminMenu) (sql.Result, error) { + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return nil, err + } + tycAdminMenuIdKey := fmt.Sprintf("%s%v", cacheTycAdminMenuIdPrefix, data.Id) + tycAdminMenuNamePathKey := fmt.Sprintf("%s%v:%v", cacheTycAdminMenuNamePathPrefix, data.Name, data.Path) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, adminMenuRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.Pid, newData.Name, newData.Path, newData.Component, newData.Redirect, newData.Meta, newData.Status, newData.Type, newData.Sort, newData.Id) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.Pid, newData.Name, newData.Path, newData.Component, newData.Redirect, newData.Meta, newData.Status, newData.Type, newData.Sort, newData.Id) + }, tycAdminMenuIdKey, tycAdminMenuNamePathKey) +} + +func (m *defaultAdminMenuModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *AdminMenu) error { + + oldVersion := newData.Version + newData.Version += 1 + + var sqlResult sql.Result + var err error + + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return err + } + tycAdminMenuIdKey := fmt.Sprintf("%s%v", cacheTycAdminMenuIdPrefix, data.Id) + tycAdminMenuNamePathKey := fmt.Sprintf("%s%v:%v", cacheTycAdminMenuNamePathPrefix, data.Name, data.Path) + sqlResult, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ? and version = ? ", m.table, adminMenuRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.Pid, newData.Name, newData.Path, newData.Component, newData.Redirect, newData.Meta, newData.Status, newData.Type, newData.Sort, newData.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.Pid, newData.Name, newData.Path, newData.Component, newData.Redirect, newData.Meta, newData.Status, newData.Type, newData.Sort, newData.Id, oldVersion) + }, tycAdminMenuIdKey, tycAdminMenuNamePathKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultAdminMenuModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminMenu) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "AdminMenuModel delete err : %+v", err) + } + return nil +} + +func (m *defaultAdminMenuModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminMenuModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminMenuModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*AdminMenu, error) { + + builder = builder.Columns(adminMenuRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminMenu + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminMenuModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminMenu, error) { + + builder = builder.Columns(adminMenuRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminMenu + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminMenuModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminMenu, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(adminMenuRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*AdminMenu + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultAdminMenuModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminMenu, error) { + + builder = builder.Columns(adminMenuRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminMenu + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminMenuModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminMenu, error) { + + builder = builder.Columns(adminMenuRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminMenu + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminMenuModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultAdminMenuModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultAdminMenuModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + data, err := m.FindOne(ctx, id) + if err != nil { + return err + } + + tycAdminMenuIdKey := fmt.Sprintf("%s%v", cacheTycAdminMenuIdPrefix, id) + tycAdminMenuNamePathKey := fmt.Sprintf("%s%v:%v", cacheTycAdminMenuNamePathPrefix, data.Name, data.Path) + _, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("delete from %s where `id` = ?", m.table) + if session != nil { + return session.ExecCtx(ctx, query, id) + } + return conn.ExecCtx(ctx, query, id) + }, tycAdminMenuIdKey, tycAdminMenuNamePathKey) + return err +} +func (m *defaultAdminMenuModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheTycAdminMenuIdPrefix, primary) +} +func (m *defaultAdminMenuModel) queryPrimary(ctx context.Context, conn sqlx.SqlConn, v, primary interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminMenuRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultAdminMenuModel) tableName() string { + return m.table +} diff --git a/app/main/model/adminPromotionLinkModel.go b/app/main/model/adminPromotionLinkModel.go new file mode 100644 index 0000000..d82c42e --- /dev/null +++ b/app/main/model/adminPromotionLinkModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ AdminPromotionLinkModel = (*customAdminPromotionLinkModel)(nil) + +type ( + // AdminPromotionLinkModel is an interface to be customized, add more methods here, + // and implement the added methods in customAdminPromotionLinkModel. + AdminPromotionLinkModel interface { + adminPromotionLinkModel + } + + customAdminPromotionLinkModel struct { + *defaultAdminPromotionLinkModel + } +) + +// NewAdminPromotionLinkModel returns a model for the database table. +func NewAdminPromotionLinkModel(conn sqlx.SqlConn, c cache.CacheConf) AdminPromotionLinkModel { + return &customAdminPromotionLinkModel{ + defaultAdminPromotionLinkModel: newAdminPromotionLinkModel(conn, c), + } +} diff --git a/app/main/model/adminPromotionLinkModel_gen.go b/app/main/model/adminPromotionLinkModel_gen.go new file mode 100644 index 0000000..96b7091 --- /dev/null +++ b/app/main/model/adminPromotionLinkModel_gen.go @@ -0,0 +1,408 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "tyc-server/common/globalkey" +) + +var ( + adminPromotionLinkFieldNames = builder.RawFieldNames(&AdminPromotionLink{}) + adminPromotionLinkRows = strings.Join(adminPromotionLinkFieldNames, ",") + adminPromotionLinkRowsExpectAutoSet = strings.Join(stringx.Remove(adminPromotionLinkFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + adminPromotionLinkRowsWithPlaceHolder = strings.Join(stringx.Remove(adminPromotionLinkFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheTycAdminPromotionLinkIdPrefix = "cache:tyc:adminPromotionLink:id:" + cacheTycAdminPromotionLinkUrlPrefix = "cache:tyc:adminPromotionLink:url:" +) + +type ( + adminPromotionLinkModel interface { + Insert(ctx context.Context, session sqlx.Session, data *AdminPromotionLink) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*AdminPromotionLink, error) + FindOneByUrl(ctx context.Context, url string) (*AdminPromotionLink, error) + Update(ctx context.Context, session sqlx.Session, data *AdminPromotionLink) (sql.Result, error) + UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AdminPromotionLink) error + Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminPromotionLink) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*AdminPromotionLink, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminPromotionLink, error) + FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminPromotionLink, int64, error) + FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminPromotionLink, error) + FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminPromotionLink, error) + Delete(ctx context.Context, session sqlx.Session, id int64) error + } + + defaultAdminPromotionLinkModel struct { + sqlc.CachedConn + table string + } + + AdminPromotionLink struct { + Id int64 `db:"id"` + CreateTime time.Time `db:"create_time"` + UpdateTime time.Time `db:"update_time"` + DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 + DelState int64 `db:"del_state"` + Version int64 `db:"version"` // 版本号 + Url string `db:"url"` // 推广链接URL + Name string `db:"name"` // 推广链接名称 + AdminUserId int64 `db:"admin_user_id"` // 推广者账号ID + } +) + +func newAdminPromotionLinkModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAdminPromotionLinkModel { + return &defaultAdminPromotionLinkModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`admin_promotion_link`", + } +} + +func (m *defaultAdminPromotionLinkModel) Insert(ctx context.Context, session sqlx.Session, data *AdminPromotionLink) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + tycAdminPromotionLinkIdKey := fmt.Sprintf("%s%v", cacheTycAdminPromotionLinkIdPrefix, data.Id) + tycAdminPromotionLinkUrlKey := fmt.Sprintf("%s%v", cacheTycAdminPromotionLinkUrlPrefix, data.Url) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?)", m.table, adminPromotionLinkRowsExpectAutoSet) + if session != nil { + return session.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.Url, data.Name, data.AdminUserId) + } + return conn.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.Url, data.Name, data.AdminUserId) + }, tycAdminPromotionLinkIdKey, tycAdminPromotionLinkUrlKey) +} + +func (m *defaultAdminPromotionLinkModel) FindOne(ctx context.Context, id int64) (*AdminPromotionLink, error) { + tycAdminPromotionLinkIdKey := fmt.Sprintf("%s%v", cacheTycAdminPromotionLinkIdPrefix, id) + var resp AdminPromotionLink + err := m.QueryRowCtx(ctx, &resp, tycAdminPromotionLinkIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminPromotionLinkRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminPromotionLinkModel) FindOneByUrl(ctx context.Context, url string) (*AdminPromotionLink, error) { + tycAdminPromotionLinkUrlKey := fmt.Sprintf("%s%v", cacheTycAdminPromotionLinkUrlPrefix, url) + var resp AdminPromotionLink + err := m.QueryRowIndexCtx(ctx, &resp, tycAdminPromotionLinkUrlKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `url` = ? and del_state = ? limit 1", adminPromotionLinkRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, url, globalkey.DelStateNo); err != nil { + return nil, err + } + return resp.Id, nil + }, m.queryPrimary) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminPromotionLinkModel) Update(ctx context.Context, session sqlx.Session, newData *AdminPromotionLink) (sql.Result, error) { + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return nil, err + } + tycAdminPromotionLinkIdKey := fmt.Sprintf("%s%v", cacheTycAdminPromotionLinkIdPrefix, data.Id) + tycAdminPromotionLinkUrlKey := fmt.Sprintf("%s%v", cacheTycAdminPromotionLinkUrlPrefix, data.Url) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, adminPromotionLinkRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.Url, newData.Name, newData.AdminUserId, newData.Id) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.Url, newData.Name, newData.AdminUserId, newData.Id) + }, tycAdminPromotionLinkIdKey, tycAdminPromotionLinkUrlKey) +} + +func (m *defaultAdminPromotionLinkModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *AdminPromotionLink) error { + + oldVersion := newData.Version + newData.Version += 1 + + var sqlResult sql.Result + var err error + + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return err + } + tycAdminPromotionLinkIdKey := fmt.Sprintf("%s%v", cacheTycAdminPromotionLinkIdPrefix, data.Id) + tycAdminPromotionLinkUrlKey := fmt.Sprintf("%s%v", cacheTycAdminPromotionLinkUrlPrefix, data.Url) + sqlResult, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ? and version = ? ", m.table, adminPromotionLinkRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.Url, newData.Name, newData.AdminUserId, newData.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.Url, newData.Name, newData.AdminUserId, newData.Id, oldVersion) + }, tycAdminPromotionLinkIdKey, tycAdminPromotionLinkUrlKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultAdminPromotionLinkModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminPromotionLink) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "AdminPromotionLinkModel delete err : %+v", err) + } + return nil +} + +func (m *defaultAdminPromotionLinkModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminPromotionLinkModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminPromotionLinkModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*AdminPromotionLink, error) { + + builder = builder.Columns(adminPromotionLinkRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminPromotionLink + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminPromotionLinkModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminPromotionLink, error) { + + builder = builder.Columns(adminPromotionLinkRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminPromotionLink + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminPromotionLinkModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminPromotionLink, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(adminPromotionLinkRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*AdminPromotionLink + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultAdminPromotionLinkModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminPromotionLink, error) { + + builder = builder.Columns(adminPromotionLinkRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminPromotionLink + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminPromotionLinkModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminPromotionLink, error) { + + builder = builder.Columns(adminPromotionLinkRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminPromotionLink + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminPromotionLinkModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultAdminPromotionLinkModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultAdminPromotionLinkModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + data, err := m.FindOne(ctx, id) + if err != nil { + return err + } + + tycAdminPromotionLinkIdKey := fmt.Sprintf("%s%v", cacheTycAdminPromotionLinkIdPrefix, id) + tycAdminPromotionLinkUrlKey := fmt.Sprintf("%s%v", cacheTycAdminPromotionLinkUrlPrefix, data.Url) + _, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("delete from %s where `id` = ?", m.table) + if session != nil { + return session.ExecCtx(ctx, query, id) + } + return conn.ExecCtx(ctx, query, id) + }, tycAdminPromotionLinkIdKey, tycAdminPromotionLinkUrlKey) + return err +} +func (m *defaultAdminPromotionLinkModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheTycAdminPromotionLinkIdPrefix, primary) +} +func (m *defaultAdminPromotionLinkModel) queryPrimary(ctx context.Context, conn sqlx.SqlConn, v, primary interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminPromotionLinkRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultAdminPromotionLinkModel) tableName() string { + return m.table +} diff --git a/app/main/model/adminPromotionLinkStatsHistoryModel.go b/app/main/model/adminPromotionLinkStatsHistoryModel.go new file mode 100644 index 0000000..685db69 --- /dev/null +++ b/app/main/model/adminPromotionLinkStatsHistoryModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ AdminPromotionLinkStatsHistoryModel = (*customAdminPromotionLinkStatsHistoryModel)(nil) + +type ( + // AdminPromotionLinkStatsHistoryModel is an interface to be customized, add more methods here, + // and implement the added methods in customAdminPromotionLinkStatsHistoryModel. + AdminPromotionLinkStatsHistoryModel interface { + adminPromotionLinkStatsHistoryModel + } + + customAdminPromotionLinkStatsHistoryModel struct { + *defaultAdminPromotionLinkStatsHistoryModel + } +) + +// NewAdminPromotionLinkStatsHistoryModel returns a model for the database table. +func NewAdminPromotionLinkStatsHistoryModel(conn sqlx.SqlConn, c cache.CacheConf) AdminPromotionLinkStatsHistoryModel { + return &customAdminPromotionLinkStatsHistoryModel{ + defaultAdminPromotionLinkStatsHistoryModel: newAdminPromotionLinkStatsHistoryModel(conn, c), + } +} diff --git a/app/main/model/adminPromotionLinkStatsHistoryModel_gen.go b/app/main/model/adminPromotionLinkStatsHistoryModel_gen.go new file mode 100644 index 0000000..35296ed --- /dev/null +++ b/app/main/model/adminPromotionLinkStatsHistoryModel_gen.go @@ -0,0 +1,412 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "tyc-server/common/globalkey" +) + +var ( + adminPromotionLinkStatsHistoryFieldNames = builder.RawFieldNames(&AdminPromotionLinkStatsHistory{}) + adminPromotionLinkStatsHistoryRows = strings.Join(adminPromotionLinkStatsHistoryFieldNames, ",") + adminPromotionLinkStatsHistoryRowsExpectAutoSet = strings.Join(stringx.Remove(adminPromotionLinkStatsHistoryFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + adminPromotionLinkStatsHistoryRowsWithPlaceHolder = strings.Join(stringx.Remove(adminPromotionLinkStatsHistoryFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheTycAdminPromotionLinkStatsHistoryIdPrefix = "cache:tyc:adminPromotionLinkStatsHistory:id:" + cacheTycAdminPromotionLinkStatsHistoryLinkIdStatsDatePrefix = "cache:tyc:adminPromotionLinkStatsHistory:linkId:statsDate:" +) + +type ( + adminPromotionLinkStatsHistoryModel interface { + Insert(ctx context.Context, session sqlx.Session, data *AdminPromotionLinkStatsHistory) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*AdminPromotionLinkStatsHistory, error) + FindOneByLinkIdStatsDate(ctx context.Context, linkId int64, statsDate time.Time) (*AdminPromotionLinkStatsHistory, error) + Update(ctx context.Context, session sqlx.Session, data *AdminPromotionLinkStatsHistory) (sql.Result, error) + UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AdminPromotionLinkStatsHistory) error + Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminPromotionLinkStatsHistory) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*AdminPromotionLinkStatsHistory, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminPromotionLinkStatsHistory, error) + FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminPromotionLinkStatsHistory, int64, error) + FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminPromotionLinkStatsHistory, error) + FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminPromotionLinkStatsHistory, error) + Delete(ctx context.Context, session sqlx.Session, id int64) error + } + + defaultAdminPromotionLinkStatsHistoryModel struct { + sqlc.CachedConn + table string + } + + AdminPromotionLinkStatsHistory struct { + Id int64 `db:"id"` + CreateTime time.Time `db:"create_time"` + UpdateTime time.Time `db:"update_time"` + DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 + DelState int64 `db:"del_state"` + Version int64 `db:"version"` // 版本号 + LinkId int64 `db:"link_id"` // 推广链接ID + StatsDate time.Time `db:"stats_date"` // 统计日期 + ClickCount int64 `db:"click_count"` // 点击数 + PayCount int64 `db:"pay_count"` // 付费次数 + PayAmount float64 `db:"pay_amount"` // 付费金额 + LastClickTime sql.NullTime `db:"last_click_time"` // 最后点击时间 + LastPayTime sql.NullTime `db:"last_pay_time"` // 最后付费时间 + } +) + +func newAdminPromotionLinkStatsHistoryModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAdminPromotionLinkStatsHistoryModel { + return &defaultAdminPromotionLinkStatsHistoryModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`admin_promotion_link_stats_history`", + } +} + +func (m *defaultAdminPromotionLinkStatsHistoryModel) Insert(ctx context.Context, session sqlx.Session, data *AdminPromotionLinkStatsHistory) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + tycAdminPromotionLinkStatsHistoryIdKey := fmt.Sprintf("%s%v", cacheTycAdminPromotionLinkStatsHistoryIdPrefix, data.Id) + tycAdminPromotionLinkStatsHistoryLinkIdStatsDateKey := fmt.Sprintf("%s%v:%v", cacheTycAdminPromotionLinkStatsHistoryLinkIdStatsDatePrefix, data.LinkId, data.StatsDate) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, adminPromotionLinkStatsHistoryRowsExpectAutoSet) + if session != nil { + return session.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.LinkId, data.StatsDate, data.ClickCount, data.PayCount, data.PayAmount, data.LastClickTime, data.LastPayTime) + } + return conn.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.LinkId, data.StatsDate, data.ClickCount, data.PayCount, data.PayAmount, data.LastClickTime, data.LastPayTime) + }, tycAdminPromotionLinkStatsHistoryIdKey, tycAdminPromotionLinkStatsHistoryLinkIdStatsDateKey) +} + +func (m *defaultAdminPromotionLinkStatsHistoryModel) FindOne(ctx context.Context, id int64) (*AdminPromotionLinkStatsHistory, error) { + tycAdminPromotionLinkStatsHistoryIdKey := fmt.Sprintf("%s%v", cacheTycAdminPromotionLinkStatsHistoryIdPrefix, id) + var resp AdminPromotionLinkStatsHistory + err := m.QueryRowCtx(ctx, &resp, tycAdminPromotionLinkStatsHistoryIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminPromotionLinkStatsHistoryRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminPromotionLinkStatsHistoryModel) FindOneByLinkIdStatsDate(ctx context.Context, linkId int64, statsDate time.Time) (*AdminPromotionLinkStatsHistory, error) { + tycAdminPromotionLinkStatsHistoryLinkIdStatsDateKey := fmt.Sprintf("%s%v:%v", cacheTycAdminPromotionLinkStatsHistoryLinkIdStatsDatePrefix, linkId, statsDate) + var resp AdminPromotionLinkStatsHistory + err := m.QueryRowIndexCtx(ctx, &resp, tycAdminPromotionLinkStatsHistoryLinkIdStatsDateKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `link_id` = ? and `stats_date` = ? and del_state = ? limit 1", adminPromotionLinkStatsHistoryRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, linkId, statsDate, globalkey.DelStateNo); err != nil { + return nil, err + } + return resp.Id, nil + }, m.queryPrimary) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminPromotionLinkStatsHistoryModel) Update(ctx context.Context, session sqlx.Session, newData *AdminPromotionLinkStatsHistory) (sql.Result, error) { + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return nil, err + } + tycAdminPromotionLinkStatsHistoryIdKey := fmt.Sprintf("%s%v", cacheTycAdminPromotionLinkStatsHistoryIdPrefix, data.Id) + tycAdminPromotionLinkStatsHistoryLinkIdStatsDateKey := fmt.Sprintf("%s%v:%v", cacheTycAdminPromotionLinkStatsHistoryLinkIdStatsDatePrefix, data.LinkId, data.StatsDate) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, adminPromotionLinkStatsHistoryRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.LinkId, newData.StatsDate, newData.ClickCount, newData.PayCount, newData.PayAmount, newData.LastClickTime, newData.LastPayTime, newData.Id) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.LinkId, newData.StatsDate, newData.ClickCount, newData.PayCount, newData.PayAmount, newData.LastClickTime, newData.LastPayTime, newData.Id) + }, tycAdminPromotionLinkStatsHistoryIdKey, tycAdminPromotionLinkStatsHistoryLinkIdStatsDateKey) +} + +func (m *defaultAdminPromotionLinkStatsHistoryModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *AdminPromotionLinkStatsHistory) error { + + oldVersion := newData.Version + newData.Version += 1 + + var sqlResult sql.Result + var err error + + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return err + } + tycAdminPromotionLinkStatsHistoryIdKey := fmt.Sprintf("%s%v", cacheTycAdminPromotionLinkStatsHistoryIdPrefix, data.Id) + tycAdminPromotionLinkStatsHistoryLinkIdStatsDateKey := fmt.Sprintf("%s%v:%v", cacheTycAdminPromotionLinkStatsHistoryLinkIdStatsDatePrefix, data.LinkId, data.StatsDate) + sqlResult, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ? and version = ? ", m.table, adminPromotionLinkStatsHistoryRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.LinkId, newData.StatsDate, newData.ClickCount, newData.PayCount, newData.PayAmount, newData.LastClickTime, newData.LastPayTime, newData.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.LinkId, newData.StatsDate, newData.ClickCount, newData.PayCount, newData.PayAmount, newData.LastClickTime, newData.LastPayTime, newData.Id, oldVersion) + }, tycAdminPromotionLinkStatsHistoryIdKey, tycAdminPromotionLinkStatsHistoryLinkIdStatsDateKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultAdminPromotionLinkStatsHistoryModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminPromotionLinkStatsHistory) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "AdminPromotionLinkStatsHistoryModel delete err : %+v", err) + } + return nil +} + +func (m *defaultAdminPromotionLinkStatsHistoryModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminPromotionLinkStatsHistoryModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminPromotionLinkStatsHistoryModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*AdminPromotionLinkStatsHistory, error) { + + builder = builder.Columns(adminPromotionLinkStatsHistoryRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminPromotionLinkStatsHistory + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminPromotionLinkStatsHistoryModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminPromotionLinkStatsHistory, error) { + + builder = builder.Columns(adminPromotionLinkStatsHistoryRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminPromotionLinkStatsHistory + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminPromotionLinkStatsHistoryModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminPromotionLinkStatsHistory, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(adminPromotionLinkStatsHistoryRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*AdminPromotionLinkStatsHistory + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultAdminPromotionLinkStatsHistoryModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminPromotionLinkStatsHistory, error) { + + builder = builder.Columns(adminPromotionLinkStatsHistoryRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminPromotionLinkStatsHistory + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminPromotionLinkStatsHistoryModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminPromotionLinkStatsHistory, error) { + + builder = builder.Columns(adminPromotionLinkStatsHistoryRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminPromotionLinkStatsHistory + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminPromotionLinkStatsHistoryModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultAdminPromotionLinkStatsHistoryModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultAdminPromotionLinkStatsHistoryModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + data, err := m.FindOne(ctx, id) + if err != nil { + return err + } + + tycAdminPromotionLinkStatsHistoryIdKey := fmt.Sprintf("%s%v", cacheTycAdminPromotionLinkStatsHistoryIdPrefix, id) + tycAdminPromotionLinkStatsHistoryLinkIdStatsDateKey := fmt.Sprintf("%s%v:%v", cacheTycAdminPromotionLinkStatsHistoryLinkIdStatsDatePrefix, data.LinkId, data.StatsDate) + _, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("delete from %s where `id` = ?", m.table) + if session != nil { + return session.ExecCtx(ctx, query, id) + } + return conn.ExecCtx(ctx, query, id) + }, tycAdminPromotionLinkStatsHistoryIdKey, tycAdminPromotionLinkStatsHistoryLinkIdStatsDateKey) + return err +} +func (m *defaultAdminPromotionLinkStatsHistoryModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheTycAdminPromotionLinkStatsHistoryIdPrefix, primary) +} +func (m *defaultAdminPromotionLinkStatsHistoryModel) queryPrimary(ctx context.Context, conn sqlx.SqlConn, v, primary interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminPromotionLinkStatsHistoryRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultAdminPromotionLinkStatsHistoryModel) tableName() string { + return m.table +} diff --git a/app/main/model/adminPromotionLinkStatsTotalModel.go b/app/main/model/adminPromotionLinkStatsTotalModel.go new file mode 100644 index 0000000..e5dfacc --- /dev/null +++ b/app/main/model/adminPromotionLinkStatsTotalModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ AdminPromotionLinkStatsTotalModel = (*customAdminPromotionLinkStatsTotalModel)(nil) + +type ( + // AdminPromotionLinkStatsTotalModel is an interface to be customized, add more methods here, + // and implement the added methods in customAdminPromotionLinkStatsTotalModel. + AdminPromotionLinkStatsTotalModel interface { + adminPromotionLinkStatsTotalModel + } + + customAdminPromotionLinkStatsTotalModel struct { + *defaultAdminPromotionLinkStatsTotalModel + } +) + +// NewAdminPromotionLinkStatsTotalModel returns a model for the database table. +func NewAdminPromotionLinkStatsTotalModel(conn sqlx.SqlConn, c cache.CacheConf) AdminPromotionLinkStatsTotalModel { + return &customAdminPromotionLinkStatsTotalModel{ + defaultAdminPromotionLinkStatsTotalModel: newAdminPromotionLinkStatsTotalModel(conn, c), + } +} diff --git a/app/main/model/adminPromotionLinkStatsTotalModel_gen.go b/app/main/model/adminPromotionLinkStatsTotalModel_gen.go new file mode 100644 index 0000000..9ae1557 --- /dev/null +++ b/app/main/model/adminPromotionLinkStatsTotalModel_gen.go @@ -0,0 +1,411 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "tyc-server/common/globalkey" +) + +var ( + adminPromotionLinkStatsTotalFieldNames = builder.RawFieldNames(&AdminPromotionLinkStatsTotal{}) + adminPromotionLinkStatsTotalRows = strings.Join(adminPromotionLinkStatsTotalFieldNames, ",") + adminPromotionLinkStatsTotalRowsExpectAutoSet = strings.Join(stringx.Remove(adminPromotionLinkStatsTotalFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + adminPromotionLinkStatsTotalRowsWithPlaceHolder = strings.Join(stringx.Remove(adminPromotionLinkStatsTotalFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheTycAdminPromotionLinkStatsTotalIdPrefix = "cache:tyc:adminPromotionLinkStatsTotal:id:" + cacheTycAdminPromotionLinkStatsTotalLinkIdPrefix = "cache:tyc:adminPromotionLinkStatsTotal:linkId:" +) + +type ( + adminPromotionLinkStatsTotalModel interface { + Insert(ctx context.Context, session sqlx.Session, data *AdminPromotionLinkStatsTotal) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*AdminPromotionLinkStatsTotal, error) + FindOneByLinkId(ctx context.Context, linkId int64) (*AdminPromotionLinkStatsTotal, error) + Update(ctx context.Context, session sqlx.Session, data *AdminPromotionLinkStatsTotal) (sql.Result, error) + UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AdminPromotionLinkStatsTotal) error + Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminPromotionLinkStatsTotal) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*AdminPromotionLinkStatsTotal, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminPromotionLinkStatsTotal, error) + FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminPromotionLinkStatsTotal, int64, error) + FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminPromotionLinkStatsTotal, error) + FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminPromotionLinkStatsTotal, error) + Delete(ctx context.Context, session sqlx.Session, id int64) error + } + + defaultAdminPromotionLinkStatsTotalModel struct { + sqlc.CachedConn + table string + } + + AdminPromotionLinkStatsTotal struct { + Id int64 `db:"id"` + CreateTime time.Time `db:"create_time"` + UpdateTime time.Time `db:"update_time"` + DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 + DelState int64 `db:"del_state"` + Version int64 `db:"version"` // 版本号 + LinkId int64 `db:"link_id"` // 推广链接ID + ClickCount int64 `db:"click_count"` // 总点击数 + PayCount int64 `db:"pay_count"` // 总付费次数 + PayAmount float64 `db:"pay_amount"` // 总付费金额 + LastClickTime sql.NullTime `db:"last_click_time"` // 最后点击时间 + LastPayTime sql.NullTime `db:"last_pay_time"` // 最后付费时间 + } +) + +func newAdminPromotionLinkStatsTotalModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAdminPromotionLinkStatsTotalModel { + return &defaultAdminPromotionLinkStatsTotalModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`admin_promotion_link_stats_total`", + } +} + +func (m *defaultAdminPromotionLinkStatsTotalModel) Insert(ctx context.Context, session sqlx.Session, data *AdminPromotionLinkStatsTotal) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + tycAdminPromotionLinkStatsTotalIdKey := fmt.Sprintf("%s%v", cacheTycAdminPromotionLinkStatsTotalIdPrefix, data.Id) + tycAdminPromotionLinkStatsTotalLinkIdKey := fmt.Sprintf("%s%v", cacheTycAdminPromotionLinkStatsTotalLinkIdPrefix, data.LinkId) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, adminPromotionLinkStatsTotalRowsExpectAutoSet) + if session != nil { + return session.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.LinkId, data.ClickCount, data.PayCount, data.PayAmount, data.LastClickTime, data.LastPayTime) + } + return conn.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.LinkId, data.ClickCount, data.PayCount, data.PayAmount, data.LastClickTime, data.LastPayTime) + }, tycAdminPromotionLinkStatsTotalIdKey, tycAdminPromotionLinkStatsTotalLinkIdKey) +} + +func (m *defaultAdminPromotionLinkStatsTotalModel) FindOne(ctx context.Context, id int64) (*AdminPromotionLinkStatsTotal, error) { + tycAdminPromotionLinkStatsTotalIdKey := fmt.Sprintf("%s%v", cacheTycAdminPromotionLinkStatsTotalIdPrefix, id) + var resp AdminPromotionLinkStatsTotal + err := m.QueryRowCtx(ctx, &resp, tycAdminPromotionLinkStatsTotalIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminPromotionLinkStatsTotalRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminPromotionLinkStatsTotalModel) FindOneByLinkId(ctx context.Context, linkId int64) (*AdminPromotionLinkStatsTotal, error) { + tycAdminPromotionLinkStatsTotalLinkIdKey := fmt.Sprintf("%s%v", cacheTycAdminPromotionLinkStatsTotalLinkIdPrefix, linkId) + var resp AdminPromotionLinkStatsTotal + err := m.QueryRowIndexCtx(ctx, &resp, tycAdminPromotionLinkStatsTotalLinkIdKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `link_id` = ? and del_state = ? limit 1", adminPromotionLinkStatsTotalRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, linkId, globalkey.DelStateNo); err != nil { + return nil, err + } + return resp.Id, nil + }, m.queryPrimary) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminPromotionLinkStatsTotalModel) Update(ctx context.Context, session sqlx.Session, newData *AdminPromotionLinkStatsTotal) (sql.Result, error) { + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return nil, err + } + tycAdminPromotionLinkStatsTotalIdKey := fmt.Sprintf("%s%v", cacheTycAdminPromotionLinkStatsTotalIdPrefix, data.Id) + tycAdminPromotionLinkStatsTotalLinkIdKey := fmt.Sprintf("%s%v", cacheTycAdminPromotionLinkStatsTotalLinkIdPrefix, data.LinkId) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, adminPromotionLinkStatsTotalRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.LinkId, newData.ClickCount, newData.PayCount, newData.PayAmount, newData.LastClickTime, newData.LastPayTime, newData.Id) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.LinkId, newData.ClickCount, newData.PayCount, newData.PayAmount, newData.LastClickTime, newData.LastPayTime, newData.Id) + }, tycAdminPromotionLinkStatsTotalIdKey, tycAdminPromotionLinkStatsTotalLinkIdKey) +} + +func (m *defaultAdminPromotionLinkStatsTotalModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *AdminPromotionLinkStatsTotal) error { + + oldVersion := newData.Version + newData.Version += 1 + + var sqlResult sql.Result + var err error + + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return err + } + tycAdminPromotionLinkStatsTotalIdKey := fmt.Sprintf("%s%v", cacheTycAdminPromotionLinkStatsTotalIdPrefix, data.Id) + tycAdminPromotionLinkStatsTotalLinkIdKey := fmt.Sprintf("%s%v", cacheTycAdminPromotionLinkStatsTotalLinkIdPrefix, data.LinkId) + sqlResult, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ? and version = ? ", m.table, adminPromotionLinkStatsTotalRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.LinkId, newData.ClickCount, newData.PayCount, newData.PayAmount, newData.LastClickTime, newData.LastPayTime, newData.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.LinkId, newData.ClickCount, newData.PayCount, newData.PayAmount, newData.LastClickTime, newData.LastPayTime, newData.Id, oldVersion) + }, tycAdminPromotionLinkStatsTotalIdKey, tycAdminPromotionLinkStatsTotalLinkIdKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultAdminPromotionLinkStatsTotalModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminPromotionLinkStatsTotal) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "AdminPromotionLinkStatsTotalModel delete err : %+v", err) + } + return nil +} + +func (m *defaultAdminPromotionLinkStatsTotalModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminPromotionLinkStatsTotalModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminPromotionLinkStatsTotalModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*AdminPromotionLinkStatsTotal, error) { + + builder = builder.Columns(adminPromotionLinkStatsTotalRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminPromotionLinkStatsTotal + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminPromotionLinkStatsTotalModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminPromotionLinkStatsTotal, error) { + + builder = builder.Columns(adminPromotionLinkStatsTotalRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminPromotionLinkStatsTotal + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminPromotionLinkStatsTotalModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminPromotionLinkStatsTotal, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(adminPromotionLinkStatsTotalRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*AdminPromotionLinkStatsTotal + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultAdminPromotionLinkStatsTotalModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminPromotionLinkStatsTotal, error) { + + builder = builder.Columns(adminPromotionLinkStatsTotalRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminPromotionLinkStatsTotal + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminPromotionLinkStatsTotalModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminPromotionLinkStatsTotal, error) { + + builder = builder.Columns(adminPromotionLinkStatsTotalRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminPromotionLinkStatsTotal + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminPromotionLinkStatsTotalModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultAdminPromotionLinkStatsTotalModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultAdminPromotionLinkStatsTotalModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + data, err := m.FindOne(ctx, id) + if err != nil { + return err + } + + tycAdminPromotionLinkStatsTotalIdKey := fmt.Sprintf("%s%v", cacheTycAdminPromotionLinkStatsTotalIdPrefix, id) + tycAdminPromotionLinkStatsTotalLinkIdKey := fmt.Sprintf("%s%v", cacheTycAdminPromotionLinkStatsTotalLinkIdPrefix, data.LinkId) + _, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("delete from %s where `id` = ?", m.table) + if session != nil { + return session.ExecCtx(ctx, query, id) + } + return conn.ExecCtx(ctx, query, id) + }, tycAdminPromotionLinkStatsTotalIdKey, tycAdminPromotionLinkStatsTotalLinkIdKey) + return err +} +func (m *defaultAdminPromotionLinkStatsTotalModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheTycAdminPromotionLinkStatsTotalIdPrefix, primary) +} +func (m *defaultAdminPromotionLinkStatsTotalModel) queryPrimary(ctx context.Context, conn sqlx.SqlConn, v, primary interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminPromotionLinkStatsTotalRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultAdminPromotionLinkStatsTotalModel) tableName() string { + return m.table +} diff --git a/app/main/model/adminPromotionOrderModel.go b/app/main/model/adminPromotionOrderModel.go new file mode 100644 index 0000000..9d8366f --- /dev/null +++ b/app/main/model/adminPromotionOrderModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ AdminPromotionOrderModel = (*customAdminPromotionOrderModel)(nil) + +type ( + // AdminPromotionOrderModel is an interface to be customized, add more methods here, + // and implement the added methods in customAdminPromotionOrderModel. + AdminPromotionOrderModel interface { + adminPromotionOrderModel + } + + customAdminPromotionOrderModel struct { + *defaultAdminPromotionOrderModel + } +) + +// NewAdminPromotionOrderModel returns a model for the database table. +func NewAdminPromotionOrderModel(conn sqlx.SqlConn, c cache.CacheConf) AdminPromotionOrderModel { + return &customAdminPromotionOrderModel{ + defaultAdminPromotionOrderModel: newAdminPromotionOrderModel(conn, c), + } +} diff --git a/app/main/model/adminPromotionOrderModel_gen.go b/app/main/model/adminPromotionOrderModel_gen.go new file mode 100644 index 0000000..7fe4663 --- /dev/null +++ b/app/main/model/adminPromotionOrderModel_gen.go @@ -0,0 +1,409 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "tyc-server/common/globalkey" +) + +var ( + adminPromotionOrderFieldNames = builder.RawFieldNames(&AdminPromotionOrder{}) + adminPromotionOrderRows = strings.Join(adminPromotionOrderFieldNames, ",") + adminPromotionOrderRowsExpectAutoSet = strings.Join(stringx.Remove(adminPromotionOrderFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + adminPromotionOrderRowsWithPlaceHolder = strings.Join(stringx.Remove(adminPromotionOrderFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheTycAdminPromotionOrderIdPrefix = "cache:tyc:adminPromotionOrder:id:" + cacheTycAdminPromotionOrderOrderIdPrefix = "cache:tyc:adminPromotionOrder:orderId:" +) + +type ( + adminPromotionOrderModel interface { + Insert(ctx context.Context, session sqlx.Session, data *AdminPromotionOrder) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*AdminPromotionOrder, error) + FindOneByOrderId(ctx context.Context, orderId int64) (*AdminPromotionOrder, error) + Update(ctx context.Context, session sqlx.Session, data *AdminPromotionOrder) (sql.Result, error) + UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AdminPromotionOrder) error + Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminPromotionOrder) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*AdminPromotionOrder, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminPromotionOrder, error) + FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminPromotionOrder, int64, error) + FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminPromotionOrder, error) + FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminPromotionOrder, error) + Delete(ctx context.Context, session sqlx.Session, id int64) error + } + + defaultAdminPromotionOrderModel struct { + sqlc.CachedConn + table string + } + + AdminPromotionOrder struct { + Id int64 `db:"id"` + CreateTime time.Time `db:"create_time"` + UpdateTime time.Time `db:"update_time"` + DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 + DelState int64 `db:"del_state"` + Version int64 `db:"version"` // 版本号 + LinkId int64 `db:"link_id"` // 推广链接ID + OrderId int64 `db:"order_id"` // 订单ID + UserId int64 `db:"user_id"` // 下单用户ID + AdminUserId int64 `db:"admin_user_id"` // 推广者账号ID + } +) + +func newAdminPromotionOrderModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAdminPromotionOrderModel { + return &defaultAdminPromotionOrderModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`admin_promotion_order`", + } +} + +func (m *defaultAdminPromotionOrderModel) Insert(ctx context.Context, session sqlx.Session, data *AdminPromotionOrder) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + tycAdminPromotionOrderIdKey := fmt.Sprintf("%s%v", cacheTycAdminPromotionOrderIdPrefix, data.Id) + tycAdminPromotionOrderOrderIdKey := fmt.Sprintf("%s%v", cacheTycAdminPromotionOrderOrderIdPrefix, data.OrderId) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?)", m.table, adminPromotionOrderRowsExpectAutoSet) + if session != nil { + return session.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.LinkId, data.OrderId, data.UserId, data.AdminUserId) + } + return conn.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.LinkId, data.OrderId, data.UserId, data.AdminUserId) + }, tycAdminPromotionOrderIdKey, tycAdminPromotionOrderOrderIdKey) +} + +func (m *defaultAdminPromotionOrderModel) FindOne(ctx context.Context, id int64) (*AdminPromotionOrder, error) { + tycAdminPromotionOrderIdKey := fmt.Sprintf("%s%v", cacheTycAdminPromotionOrderIdPrefix, id) + var resp AdminPromotionOrder + err := m.QueryRowCtx(ctx, &resp, tycAdminPromotionOrderIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminPromotionOrderRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminPromotionOrderModel) FindOneByOrderId(ctx context.Context, orderId int64) (*AdminPromotionOrder, error) { + tycAdminPromotionOrderOrderIdKey := fmt.Sprintf("%s%v", cacheTycAdminPromotionOrderOrderIdPrefix, orderId) + var resp AdminPromotionOrder + err := m.QueryRowIndexCtx(ctx, &resp, tycAdminPromotionOrderOrderIdKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `order_id` = ? and del_state = ? limit 1", adminPromotionOrderRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, orderId, globalkey.DelStateNo); err != nil { + return nil, err + } + return resp.Id, nil + }, m.queryPrimary) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminPromotionOrderModel) Update(ctx context.Context, session sqlx.Session, newData *AdminPromotionOrder) (sql.Result, error) { + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return nil, err + } + tycAdminPromotionOrderIdKey := fmt.Sprintf("%s%v", cacheTycAdminPromotionOrderIdPrefix, data.Id) + tycAdminPromotionOrderOrderIdKey := fmt.Sprintf("%s%v", cacheTycAdminPromotionOrderOrderIdPrefix, data.OrderId) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, adminPromotionOrderRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.LinkId, newData.OrderId, newData.UserId, newData.AdminUserId, newData.Id) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.LinkId, newData.OrderId, newData.UserId, newData.AdminUserId, newData.Id) + }, tycAdminPromotionOrderIdKey, tycAdminPromotionOrderOrderIdKey) +} + +func (m *defaultAdminPromotionOrderModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *AdminPromotionOrder) error { + + oldVersion := newData.Version + newData.Version += 1 + + var sqlResult sql.Result + var err error + + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return err + } + tycAdminPromotionOrderIdKey := fmt.Sprintf("%s%v", cacheTycAdminPromotionOrderIdPrefix, data.Id) + tycAdminPromotionOrderOrderIdKey := fmt.Sprintf("%s%v", cacheTycAdminPromotionOrderOrderIdPrefix, data.OrderId) + sqlResult, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ? and version = ? ", m.table, adminPromotionOrderRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.LinkId, newData.OrderId, newData.UserId, newData.AdminUserId, newData.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.LinkId, newData.OrderId, newData.UserId, newData.AdminUserId, newData.Id, oldVersion) + }, tycAdminPromotionOrderIdKey, tycAdminPromotionOrderOrderIdKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultAdminPromotionOrderModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminPromotionOrder) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "AdminPromotionOrderModel delete err : %+v", err) + } + return nil +} + +func (m *defaultAdminPromotionOrderModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminPromotionOrderModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminPromotionOrderModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*AdminPromotionOrder, error) { + + builder = builder.Columns(adminPromotionOrderRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminPromotionOrder + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminPromotionOrderModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminPromotionOrder, error) { + + builder = builder.Columns(adminPromotionOrderRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminPromotionOrder + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminPromotionOrderModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminPromotionOrder, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(adminPromotionOrderRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*AdminPromotionOrder + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultAdminPromotionOrderModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminPromotionOrder, error) { + + builder = builder.Columns(adminPromotionOrderRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminPromotionOrder + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminPromotionOrderModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminPromotionOrder, error) { + + builder = builder.Columns(adminPromotionOrderRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminPromotionOrder + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminPromotionOrderModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultAdminPromotionOrderModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultAdminPromotionOrderModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + data, err := m.FindOne(ctx, id) + if err != nil { + return err + } + + tycAdminPromotionOrderIdKey := fmt.Sprintf("%s%v", cacheTycAdminPromotionOrderIdPrefix, id) + tycAdminPromotionOrderOrderIdKey := fmt.Sprintf("%s%v", cacheTycAdminPromotionOrderOrderIdPrefix, data.OrderId) + _, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("delete from %s where `id` = ?", m.table) + if session != nil { + return session.ExecCtx(ctx, query, id) + } + return conn.ExecCtx(ctx, query, id) + }, tycAdminPromotionOrderIdKey, tycAdminPromotionOrderOrderIdKey) + return err +} +func (m *defaultAdminPromotionOrderModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheTycAdminPromotionOrderIdPrefix, primary) +} +func (m *defaultAdminPromotionOrderModel) queryPrimary(ctx context.Context, conn sqlx.SqlConn, v, primary interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminPromotionOrderRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultAdminPromotionOrderModel) tableName() string { + return m.table +} diff --git a/app/main/model/adminRoleApiModel.go b/app/main/model/adminRoleApiModel.go new file mode 100644 index 0000000..bcb9fc7 --- /dev/null +++ b/app/main/model/adminRoleApiModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ AdminRoleApiModel = (*customAdminRoleApiModel)(nil) + +type ( + // AdminRoleApiModel is an interface to be customized, add more methods here, + // and implement the added methods in customAdminRoleApiModel. + AdminRoleApiModel interface { + adminRoleApiModel + } + + customAdminRoleApiModel struct { + *defaultAdminRoleApiModel + } +) + +// NewAdminRoleApiModel returns a model for the database table. +func NewAdminRoleApiModel(conn sqlx.SqlConn, c cache.CacheConf) AdminRoleApiModel { + return &customAdminRoleApiModel{ + defaultAdminRoleApiModel: newAdminRoleApiModel(conn, c), + } +} diff --git a/app/main/model/adminRoleApiModel_gen.go b/app/main/model/adminRoleApiModel_gen.go new file mode 100644 index 0000000..cef0ded --- /dev/null +++ b/app/main/model/adminRoleApiModel_gen.go @@ -0,0 +1,407 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "tyc-server/common/globalkey" +) + +var ( + adminRoleApiFieldNames = builder.RawFieldNames(&AdminRoleApi{}) + adminRoleApiRows = strings.Join(adminRoleApiFieldNames, ",") + adminRoleApiRowsExpectAutoSet = strings.Join(stringx.Remove(adminRoleApiFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + adminRoleApiRowsWithPlaceHolder = strings.Join(stringx.Remove(adminRoleApiFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheTycAdminRoleApiIdPrefix = "cache:tyc:adminRoleApi:id:" + cacheTycAdminRoleApiRoleIdApiIdPrefix = "cache:tyc:adminRoleApi:roleId:apiId:" +) + +type ( + adminRoleApiModel interface { + Insert(ctx context.Context, session sqlx.Session, data *AdminRoleApi) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*AdminRoleApi, error) + FindOneByRoleIdApiId(ctx context.Context, roleId int64, apiId int64) (*AdminRoleApi, error) + Update(ctx context.Context, session sqlx.Session, data *AdminRoleApi) (sql.Result, error) + UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AdminRoleApi) error + Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminRoleApi) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*AdminRoleApi, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminRoleApi, error) + FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminRoleApi, int64, error) + FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminRoleApi, error) + FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminRoleApi, error) + Delete(ctx context.Context, session sqlx.Session, id int64) error + } + + defaultAdminRoleApiModel struct { + sqlc.CachedConn + table string + } + + AdminRoleApi struct { + Id int64 `db:"id"` + CreateTime time.Time `db:"create_time"` + UpdateTime time.Time `db:"update_time"` + DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 + DelState int64 `db:"del_state"` + Version int64 `db:"version"` // 版本号 + RoleId int64 `db:"role_id"` // 关联到角色表的id + ApiId int64 `db:"api_id"` // 关联到接口表的id + } +) + +func newAdminRoleApiModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAdminRoleApiModel { + return &defaultAdminRoleApiModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`admin_role_api`", + } +} + +func (m *defaultAdminRoleApiModel) Insert(ctx context.Context, session sqlx.Session, data *AdminRoleApi) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + tycAdminRoleApiIdKey := fmt.Sprintf("%s%v", cacheTycAdminRoleApiIdPrefix, data.Id) + tycAdminRoleApiRoleIdApiIdKey := fmt.Sprintf("%s%v:%v", cacheTycAdminRoleApiRoleIdApiIdPrefix, data.RoleId, data.ApiId) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?)", m.table, adminRoleApiRowsExpectAutoSet) + if session != nil { + return session.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.RoleId, data.ApiId) + } + return conn.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.RoleId, data.ApiId) + }, tycAdminRoleApiIdKey, tycAdminRoleApiRoleIdApiIdKey) +} + +func (m *defaultAdminRoleApiModel) FindOne(ctx context.Context, id int64) (*AdminRoleApi, error) { + tycAdminRoleApiIdKey := fmt.Sprintf("%s%v", cacheTycAdminRoleApiIdPrefix, id) + var resp AdminRoleApi + err := m.QueryRowCtx(ctx, &resp, tycAdminRoleApiIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminRoleApiRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminRoleApiModel) FindOneByRoleIdApiId(ctx context.Context, roleId int64, apiId int64) (*AdminRoleApi, error) { + tycAdminRoleApiRoleIdApiIdKey := fmt.Sprintf("%s%v:%v", cacheTycAdminRoleApiRoleIdApiIdPrefix, roleId, apiId) + var resp AdminRoleApi + err := m.QueryRowIndexCtx(ctx, &resp, tycAdminRoleApiRoleIdApiIdKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `role_id` = ? and `api_id` = ? and del_state = ? limit 1", adminRoleApiRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, roleId, apiId, globalkey.DelStateNo); err != nil { + return nil, err + } + return resp.Id, nil + }, m.queryPrimary) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminRoleApiModel) Update(ctx context.Context, session sqlx.Session, newData *AdminRoleApi) (sql.Result, error) { + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return nil, err + } + tycAdminRoleApiIdKey := fmt.Sprintf("%s%v", cacheTycAdminRoleApiIdPrefix, data.Id) + tycAdminRoleApiRoleIdApiIdKey := fmt.Sprintf("%s%v:%v", cacheTycAdminRoleApiRoleIdApiIdPrefix, data.RoleId, data.ApiId) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, adminRoleApiRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.RoleId, newData.ApiId, newData.Id) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.RoleId, newData.ApiId, newData.Id) + }, tycAdminRoleApiIdKey, tycAdminRoleApiRoleIdApiIdKey) +} + +func (m *defaultAdminRoleApiModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *AdminRoleApi) error { + + oldVersion := newData.Version + newData.Version += 1 + + var sqlResult sql.Result + var err error + + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return err + } + tycAdminRoleApiIdKey := fmt.Sprintf("%s%v", cacheTycAdminRoleApiIdPrefix, data.Id) + tycAdminRoleApiRoleIdApiIdKey := fmt.Sprintf("%s%v:%v", cacheTycAdminRoleApiRoleIdApiIdPrefix, data.RoleId, data.ApiId) + sqlResult, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ? and version = ? ", m.table, adminRoleApiRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.RoleId, newData.ApiId, newData.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.RoleId, newData.ApiId, newData.Id, oldVersion) + }, tycAdminRoleApiIdKey, tycAdminRoleApiRoleIdApiIdKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultAdminRoleApiModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminRoleApi) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "AdminRoleApiModel delete err : %+v", err) + } + return nil +} + +func (m *defaultAdminRoleApiModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminRoleApiModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminRoleApiModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*AdminRoleApi, error) { + + builder = builder.Columns(adminRoleApiRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminRoleApi + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminRoleApiModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminRoleApi, error) { + + builder = builder.Columns(adminRoleApiRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminRoleApi + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminRoleApiModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminRoleApi, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(adminRoleApiRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*AdminRoleApi + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultAdminRoleApiModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminRoleApi, error) { + + builder = builder.Columns(adminRoleApiRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminRoleApi + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminRoleApiModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminRoleApi, error) { + + builder = builder.Columns(adminRoleApiRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminRoleApi + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminRoleApiModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultAdminRoleApiModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultAdminRoleApiModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + data, err := m.FindOne(ctx, id) + if err != nil { + return err + } + + tycAdminRoleApiIdKey := fmt.Sprintf("%s%v", cacheTycAdminRoleApiIdPrefix, id) + tycAdminRoleApiRoleIdApiIdKey := fmt.Sprintf("%s%v:%v", cacheTycAdminRoleApiRoleIdApiIdPrefix, data.RoleId, data.ApiId) + _, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("delete from %s where `id` = ?", m.table) + if session != nil { + return session.ExecCtx(ctx, query, id) + } + return conn.ExecCtx(ctx, query, id) + }, tycAdminRoleApiIdKey, tycAdminRoleApiRoleIdApiIdKey) + return err +} +func (m *defaultAdminRoleApiModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheTycAdminRoleApiIdPrefix, primary) +} +func (m *defaultAdminRoleApiModel) queryPrimary(ctx context.Context, conn sqlx.SqlConn, v, primary interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminRoleApiRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultAdminRoleApiModel) tableName() string { + return m.table +} diff --git a/app/main/model/adminRoleMenuModel.go b/app/main/model/adminRoleMenuModel.go new file mode 100644 index 0000000..8dc9812 --- /dev/null +++ b/app/main/model/adminRoleMenuModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ AdminRoleMenuModel = (*customAdminRoleMenuModel)(nil) + +type ( + // AdminRoleMenuModel is an interface to be customized, add more methods here, + // and implement the added methods in customAdminRoleMenuModel. + AdminRoleMenuModel interface { + adminRoleMenuModel + } + + customAdminRoleMenuModel struct { + *defaultAdminRoleMenuModel + } +) + +// NewAdminRoleMenuModel returns a model for the database table. +func NewAdminRoleMenuModel(conn sqlx.SqlConn, c cache.CacheConf) AdminRoleMenuModel { + return &customAdminRoleMenuModel{ + defaultAdminRoleMenuModel: newAdminRoleMenuModel(conn, c), + } +} diff --git a/app/main/model/adminRoleMenuModel_gen.go b/app/main/model/adminRoleMenuModel_gen.go new file mode 100644 index 0000000..792fb13 --- /dev/null +++ b/app/main/model/adminRoleMenuModel_gen.go @@ -0,0 +1,407 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "tyc-server/common/globalkey" +) + +var ( + adminRoleMenuFieldNames = builder.RawFieldNames(&AdminRoleMenu{}) + adminRoleMenuRows = strings.Join(adminRoleMenuFieldNames, ",") + adminRoleMenuRowsExpectAutoSet = strings.Join(stringx.Remove(adminRoleMenuFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + adminRoleMenuRowsWithPlaceHolder = strings.Join(stringx.Remove(adminRoleMenuFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheTycAdminRoleMenuIdPrefix = "cache:tyc:adminRoleMenu:id:" + cacheTycAdminRoleMenuRoleIdMenuIdPrefix = "cache:tyc:adminRoleMenu:roleId:menuId:" +) + +type ( + adminRoleMenuModel interface { + Insert(ctx context.Context, session sqlx.Session, data *AdminRoleMenu) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*AdminRoleMenu, error) + FindOneByRoleIdMenuId(ctx context.Context, roleId int64, menuId int64) (*AdminRoleMenu, error) + Update(ctx context.Context, session sqlx.Session, data *AdminRoleMenu) (sql.Result, error) + UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AdminRoleMenu) error + Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminRoleMenu) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*AdminRoleMenu, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminRoleMenu, error) + FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminRoleMenu, int64, error) + FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminRoleMenu, error) + FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminRoleMenu, error) + Delete(ctx context.Context, session sqlx.Session, id int64) error + } + + defaultAdminRoleMenuModel struct { + sqlc.CachedConn + table string + } + + AdminRoleMenu struct { + Id int64 `db:"id"` + CreateTime time.Time `db:"create_time"` + UpdateTime time.Time `db:"update_time"` + DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 + DelState int64 `db:"del_state"` + Version int64 `db:"version"` // 版本号 + RoleId int64 `db:"role_id"` // 关联到角色表的id + MenuId int64 `db:"menu_id"` // 关联到菜单表的id + } +) + +func newAdminRoleMenuModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAdminRoleMenuModel { + return &defaultAdminRoleMenuModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`admin_role_menu`", + } +} + +func (m *defaultAdminRoleMenuModel) Insert(ctx context.Context, session sqlx.Session, data *AdminRoleMenu) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + tycAdminRoleMenuIdKey := fmt.Sprintf("%s%v", cacheTycAdminRoleMenuIdPrefix, data.Id) + tycAdminRoleMenuRoleIdMenuIdKey := fmt.Sprintf("%s%v:%v", cacheTycAdminRoleMenuRoleIdMenuIdPrefix, data.RoleId, data.MenuId) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?)", m.table, adminRoleMenuRowsExpectAutoSet) + if session != nil { + return session.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.RoleId, data.MenuId) + } + return conn.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.RoleId, data.MenuId) + }, tycAdminRoleMenuIdKey, tycAdminRoleMenuRoleIdMenuIdKey) +} + +func (m *defaultAdminRoleMenuModel) FindOne(ctx context.Context, id int64) (*AdminRoleMenu, error) { + tycAdminRoleMenuIdKey := fmt.Sprintf("%s%v", cacheTycAdminRoleMenuIdPrefix, id) + var resp AdminRoleMenu + err := m.QueryRowCtx(ctx, &resp, tycAdminRoleMenuIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminRoleMenuRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminRoleMenuModel) FindOneByRoleIdMenuId(ctx context.Context, roleId int64, menuId int64) (*AdminRoleMenu, error) { + tycAdminRoleMenuRoleIdMenuIdKey := fmt.Sprintf("%s%v:%v", cacheTycAdminRoleMenuRoleIdMenuIdPrefix, roleId, menuId) + var resp AdminRoleMenu + err := m.QueryRowIndexCtx(ctx, &resp, tycAdminRoleMenuRoleIdMenuIdKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `role_id` = ? and `menu_id` = ? and del_state = ? limit 1", adminRoleMenuRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, roleId, menuId, globalkey.DelStateNo); err != nil { + return nil, err + } + return resp.Id, nil + }, m.queryPrimary) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminRoleMenuModel) Update(ctx context.Context, session sqlx.Session, newData *AdminRoleMenu) (sql.Result, error) { + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return nil, err + } + tycAdminRoleMenuIdKey := fmt.Sprintf("%s%v", cacheTycAdminRoleMenuIdPrefix, data.Id) + tycAdminRoleMenuRoleIdMenuIdKey := fmt.Sprintf("%s%v:%v", cacheTycAdminRoleMenuRoleIdMenuIdPrefix, data.RoleId, data.MenuId) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, adminRoleMenuRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.RoleId, newData.MenuId, newData.Id) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.RoleId, newData.MenuId, newData.Id) + }, tycAdminRoleMenuIdKey, tycAdminRoleMenuRoleIdMenuIdKey) +} + +func (m *defaultAdminRoleMenuModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *AdminRoleMenu) error { + + oldVersion := newData.Version + newData.Version += 1 + + var sqlResult sql.Result + var err error + + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return err + } + tycAdminRoleMenuIdKey := fmt.Sprintf("%s%v", cacheTycAdminRoleMenuIdPrefix, data.Id) + tycAdminRoleMenuRoleIdMenuIdKey := fmt.Sprintf("%s%v:%v", cacheTycAdminRoleMenuRoleIdMenuIdPrefix, data.RoleId, data.MenuId) + sqlResult, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ? and version = ? ", m.table, adminRoleMenuRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.RoleId, newData.MenuId, newData.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.RoleId, newData.MenuId, newData.Id, oldVersion) + }, tycAdminRoleMenuIdKey, tycAdminRoleMenuRoleIdMenuIdKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultAdminRoleMenuModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminRoleMenu) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "AdminRoleMenuModel delete err : %+v", err) + } + return nil +} + +func (m *defaultAdminRoleMenuModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminRoleMenuModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminRoleMenuModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*AdminRoleMenu, error) { + + builder = builder.Columns(adminRoleMenuRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminRoleMenu + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminRoleMenuModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminRoleMenu, error) { + + builder = builder.Columns(adminRoleMenuRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminRoleMenu + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminRoleMenuModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminRoleMenu, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(adminRoleMenuRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*AdminRoleMenu + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultAdminRoleMenuModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminRoleMenu, error) { + + builder = builder.Columns(adminRoleMenuRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminRoleMenu + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminRoleMenuModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminRoleMenu, error) { + + builder = builder.Columns(adminRoleMenuRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminRoleMenu + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminRoleMenuModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultAdminRoleMenuModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultAdminRoleMenuModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + data, err := m.FindOne(ctx, id) + if err != nil { + return err + } + + tycAdminRoleMenuIdKey := fmt.Sprintf("%s%v", cacheTycAdminRoleMenuIdPrefix, id) + tycAdminRoleMenuRoleIdMenuIdKey := fmt.Sprintf("%s%v:%v", cacheTycAdminRoleMenuRoleIdMenuIdPrefix, data.RoleId, data.MenuId) + _, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("delete from %s where `id` = ?", m.table) + if session != nil { + return session.ExecCtx(ctx, query, id) + } + return conn.ExecCtx(ctx, query, id) + }, tycAdminRoleMenuIdKey, tycAdminRoleMenuRoleIdMenuIdKey) + return err +} +func (m *defaultAdminRoleMenuModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheTycAdminRoleMenuIdPrefix, primary) +} +func (m *defaultAdminRoleMenuModel) queryPrimary(ctx context.Context, conn sqlx.SqlConn, v, primary interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminRoleMenuRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultAdminRoleMenuModel) tableName() string { + return m.table +} diff --git a/app/main/model/adminRoleModel.go b/app/main/model/adminRoleModel.go new file mode 100644 index 0000000..26dc91d --- /dev/null +++ b/app/main/model/adminRoleModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ AdminRoleModel = (*customAdminRoleModel)(nil) + +type ( + // AdminRoleModel is an interface to be customized, add more methods here, + // and implement the added methods in customAdminRoleModel. + AdminRoleModel interface { + adminRoleModel + } + + customAdminRoleModel struct { + *defaultAdminRoleModel + } +) + +// NewAdminRoleModel returns a model for the database table. +func NewAdminRoleModel(conn sqlx.SqlConn, c cache.CacheConf) AdminRoleModel { + return &customAdminRoleModel{ + defaultAdminRoleModel: newAdminRoleModel(conn, c), + } +} diff --git a/app/main/model/adminRoleModel_gen.go b/app/main/model/adminRoleModel_gen.go new file mode 100644 index 0000000..5666e0a --- /dev/null +++ b/app/main/model/adminRoleModel_gen.go @@ -0,0 +1,410 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "tyc-server/common/globalkey" +) + +var ( + adminRoleFieldNames = builder.RawFieldNames(&AdminRole{}) + adminRoleRows = strings.Join(adminRoleFieldNames, ",") + adminRoleRowsExpectAutoSet = strings.Join(stringx.Remove(adminRoleFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + adminRoleRowsWithPlaceHolder = strings.Join(stringx.Remove(adminRoleFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheTycAdminRoleIdPrefix = "cache:tyc:adminRole:id:" + cacheTycAdminRoleRoleCodePrefix = "cache:tyc:adminRole:roleCode:" +) + +type ( + adminRoleModel interface { + Insert(ctx context.Context, session sqlx.Session, data *AdminRole) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*AdminRole, error) + FindOneByRoleCode(ctx context.Context, roleCode string) (*AdminRole, error) + Update(ctx context.Context, session sqlx.Session, data *AdminRole) (sql.Result, error) + UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AdminRole) error + Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminRole) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*AdminRole, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminRole, error) + FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminRole, int64, error) + FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminRole, error) + FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminRole, error) + Delete(ctx context.Context, session sqlx.Session, id int64) error + } + + defaultAdminRoleModel struct { + sqlc.CachedConn + table string + } + + AdminRole struct { + Id int64 `db:"id"` + CreateTime time.Time `db:"create_time"` + UpdateTime time.Time `db:"update_time"` + DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 + DelState int64 `db:"del_state"` + Version int64 `db:"version"` // 版本号 + RoleName string `db:"role_name"` // 角色名称 + RoleCode string `db:"role_code"` // 角色编码 + Description string `db:"description"` // 角色描述 + Status int64 `db:"status"` // 状态:0-禁用,1-启用 + Sort int64 `db:"sort"` // 排序 + } +) + +func newAdminRoleModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAdminRoleModel { + return &defaultAdminRoleModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`admin_role`", + } +} + +func (m *defaultAdminRoleModel) Insert(ctx context.Context, session sqlx.Session, data *AdminRole) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + tycAdminRoleIdKey := fmt.Sprintf("%s%v", cacheTycAdminRoleIdPrefix, data.Id) + tycAdminRoleRoleCodeKey := fmt.Sprintf("%s%v", cacheTycAdminRoleRoleCodePrefix, data.RoleCode) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?)", m.table, adminRoleRowsExpectAutoSet) + if session != nil { + return session.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.RoleName, data.RoleCode, data.Description, data.Status, data.Sort) + } + return conn.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.RoleName, data.RoleCode, data.Description, data.Status, data.Sort) + }, tycAdminRoleIdKey, tycAdminRoleRoleCodeKey) +} + +func (m *defaultAdminRoleModel) FindOne(ctx context.Context, id int64) (*AdminRole, error) { + tycAdminRoleIdKey := fmt.Sprintf("%s%v", cacheTycAdminRoleIdPrefix, id) + var resp AdminRole + err := m.QueryRowCtx(ctx, &resp, tycAdminRoleIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminRoleRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminRoleModel) FindOneByRoleCode(ctx context.Context, roleCode string) (*AdminRole, error) { + tycAdminRoleRoleCodeKey := fmt.Sprintf("%s%v", cacheTycAdminRoleRoleCodePrefix, roleCode) + var resp AdminRole + err := m.QueryRowIndexCtx(ctx, &resp, tycAdminRoleRoleCodeKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `role_code` = ? and del_state = ? limit 1", adminRoleRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, roleCode, globalkey.DelStateNo); err != nil { + return nil, err + } + return resp.Id, nil + }, m.queryPrimary) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminRoleModel) Update(ctx context.Context, session sqlx.Session, newData *AdminRole) (sql.Result, error) { + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return nil, err + } + tycAdminRoleIdKey := fmt.Sprintf("%s%v", cacheTycAdminRoleIdPrefix, data.Id) + tycAdminRoleRoleCodeKey := fmt.Sprintf("%s%v", cacheTycAdminRoleRoleCodePrefix, data.RoleCode) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, adminRoleRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.RoleName, newData.RoleCode, newData.Description, newData.Status, newData.Sort, newData.Id) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.RoleName, newData.RoleCode, newData.Description, newData.Status, newData.Sort, newData.Id) + }, tycAdminRoleIdKey, tycAdminRoleRoleCodeKey) +} + +func (m *defaultAdminRoleModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *AdminRole) error { + + oldVersion := newData.Version + newData.Version += 1 + + var sqlResult sql.Result + var err error + + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return err + } + tycAdminRoleIdKey := fmt.Sprintf("%s%v", cacheTycAdminRoleIdPrefix, data.Id) + tycAdminRoleRoleCodeKey := fmt.Sprintf("%s%v", cacheTycAdminRoleRoleCodePrefix, data.RoleCode) + sqlResult, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ? and version = ? ", m.table, adminRoleRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.RoleName, newData.RoleCode, newData.Description, newData.Status, newData.Sort, newData.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.RoleName, newData.RoleCode, newData.Description, newData.Status, newData.Sort, newData.Id, oldVersion) + }, tycAdminRoleIdKey, tycAdminRoleRoleCodeKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultAdminRoleModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminRole) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "AdminRoleModel delete err : %+v", err) + } + return nil +} + +func (m *defaultAdminRoleModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminRoleModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminRoleModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*AdminRole, error) { + + builder = builder.Columns(adminRoleRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminRole + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminRoleModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminRole, error) { + + builder = builder.Columns(adminRoleRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminRole + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminRoleModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminRole, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(adminRoleRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*AdminRole + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultAdminRoleModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminRole, error) { + + builder = builder.Columns(adminRoleRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminRole + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminRoleModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminRole, error) { + + builder = builder.Columns(adminRoleRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminRole + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminRoleModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultAdminRoleModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultAdminRoleModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + data, err := m.FindOne(ctx, id) + if err != nil { + return err + } + + tycAdminRoleIdKey := fmt.Sprintf("%s%v", cacheTycAdminRoleIdPrefix, id) + tycAdminRoleRoleCodeKey := fmt.Sprintf("%s%v", cacheTycAdminRoleRoleCodePrefix, data.RoleCode) + _, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("delete from %s where `id` = ?", m.table) + if session != nil { + return session.ExecCtx(ctx, query, id) + } + return conn.ExecCtx(ctx, query, id) + }, tycAdminRoleIdKey, tycAdminRoleRoleCodeKey) + return err +} +func (m *defaultAdminRoleModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheTycAdminRoleIdPrefix, primary) +} +func (m *defaultAdminRoleModel) queryPrimary(ctx context.Context, conn sqlx.SqlConn, v, primary interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminRoleRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultAdminRoleModel) tableName() string { + return m.table +} diff --git a/app/main/model/adminUserModel.go b/app/main/model/adminUserModel.go new file mode 100644 index 0000000..25d463e --- /dev/null +++ b/app/main/model/adminUserModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ AdminUserModel = (*customAdminUserModel)(nil) + +type ( + // AdminUserModel is an interface to be customized, add more methods here, + // and implement the added methods in customAdminUserModel. + AdminUserModel interface { + adminUserModel + } + + customAdminUserModel struct { + *defaultAdminUserModel + } +) + +// NewAdminUserModel returns a model for the database table. +func NewAdminUserModel(conn sqlx.SqlConn, c cache.CacheConf) AdminUserModel { + return &customAdminUserModel{ + defaultAdminUserModel: newAdminUserModel(conn, c), + } +} diff --git a/app/main/model/adminUserModel_gen.go b/app/main/model/adminUserModel_gen.go new file mode 100644 index 0000000..66d9d36 --- /dev/null +++ b/app/main/model/adminUserModel_gen.go @@ -0,0 +1,435 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "tyc-server/common/globalkey" +) + +var ( + adminUserFieldNames = builder.RawFieldNames(&AdminUser{}) + adminUserRows = strings.Join(adminUserFieldNames, ",") + adminUserRowsExpectAutoSet = strings.Join(stringx.Remove(adminUserFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + adminUserRowsWithPlaceHolder = strings.Join(stringx.Remove(adminUserFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheTycAdminUserIdPrefix = "cache:tyc:adminUser:id:" + cacheTycAdminUserRealNamePrefix = "cache:tyc:adminUser:realName:" + cacheTycAdminUserUsernamePrefix = "cache:tyc:adminUser:username:" +) + +type ( + adminUserModel interface { + Insert(ctx context.Context, session sqlx.Session, data *AdminUser) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*AdminUser, error) + FindOneByRealName(ctx context.Context, realName string) (*AdminUser, error) + FindOneByUsername(ctx context.Context, username string) (*AdminUser, error) + Update(ctx context.Context, session sqlx.Session, data *AdminUser) (sql.Result, error) + UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AdminUser) error + Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminUser) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*AdminUser, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminUser, error) + FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminUser, int64, error) + FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminUser, error) + FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminUser, error) + Delete(ctx context.Context, session sqlx.Session, id int64) error + } + + defaultAdminUserModel struct { + sqlc.CachedConn + table string + } + + AdminUser struct { + Id int64 `db:"id"` + CreateTime time.Time `db:"create_time"` + UpdateTime time.Time `db:"update_time"` + DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 + DelState int64 `db:"del_state"` + Version int64 `db:"version"` // 版本号 + Username string `db:"username"` // 用户名 + Password string `db:"password"` // 密码 + RealName string `db:"real_name"` // 真实姓名 + Status int64 `db:"status"` // 状态:0-禁用,1-启用 + } +) + +func newAdminUserModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAdminUserModel { + return &defaultAdminUserModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`admin_user`", + } +} + +func (m *defaultAdminUserModel) Insert(ctx context.Context, session sqlx.Session, data *AdminUser) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + tycAdminUserIdKey := fmt.Sprintf("%s%v", cacheTycAdminUserIdPrefix, data.Id) + tycAdminUserRealNameKey := fmt.Sprintf("%s%v", cacheTycAdminUserRealNamePrefix, data.RealName) + tycAdminUserUsernameKey := fmt.Sprintf("%s%v", cacheTycAdminUserUsernamePrefix, data.Username) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?)", m.table, adminUserRowsExpectAutoSet) + if session != nil { + return session.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.Username, data.Password, data.RealName, data.Status) + } + return conn.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.Username, data.Password, data.RealName, data.Status) + }, tycAdminUserIdKey, tycAdminUserRealNameKey, tycAdminUserUsernameKey) +} + +func (m *defaultAdminUserModel) FindOne(ctx context.Context, id int64) (*AdminUser, error) { + tycAdminUserIdKey := fmt.Sprintf("%s%v", cacheTycAdminUserIdPrefix, id) + var resp AdminUser + err := m.QueryRowCtx(ctx, &resp, tycAdminUserIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminUserRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminUserModel) FindOneByRealName(ctx context.Context, realName string) (*AdminUser, error) { + tycAdminUserRealNameKey := fmt.Sprintf("%s%v", cacheTycAdminUserRealNamePrefix, realName) + var resp AdminUser + err := m.QueryRowIndexCtx(ctx, &resp, tycAdminUserRealNameKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `real_name` = ? and del_state = ? limit 1", adminUserRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, realName, globalkey.DelStateNo); err != nil { + return nil, err + } + return resp.Id, nil + }, m.queryPrimary) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminUserModel) FindOneByUsername(ctx context.Context, username string) (*AdminUser, error) { + tycAdminUserUsernameKey := fmt.Sprintf("%s%v", cacheTycAdminUserUsernamePrefix, username) + var resp AdminUser + err := m.QueryRowIndexCtx(ctx, &resp, tycAdminUserUsernameKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `username` = ? and del_state = ? limit 1", adminUserRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, username, globalkey.DelStateNo); err != nil { + return nil, err + } + return resp.Id, nil + }, m.queryPrimary) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminUserModel) Update(ctx context.Context, session sqlx.Session, newData *AdminUser) (sql.Result, error) { + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return nil, err + } + tycAdminUserIdKey := fmt.Sprintf("%s%v", cacheTycAdminUserIdPrefix, data.Id) + tycAdminUserRealNameKey := fmt.Sprintf("%s%v", cacheTycAdminUserRealNamePrefix, data.RealName) + tycAdminUserUsernameKey := fmt.Sprintf("%s%v", cacheTycAdminUserUsernamePrefix, data.Username) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, adminUserRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.Username, newData.Password, newData.RealName, newData.Status, newData.Id) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.Username, newData.Password, newData.RealName, newData.Status, newData.Id) + }, tycAdminUserIdKey, tycAdminUserRealNameKey, tycAdminUserUsernameKey) +} + +func (m *defaultAdminUserModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *AdminUser) error { + + oldVersion := newData.Version + newData.Version += 1 + + var sqlResult sql.Result + var err error + + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return err + } + tycAdminUserIdKey := fmt.Sprintf("%s%v", cacheTycAdminUserIdPrefix, data.Id) + tycAdminUserRealNameKey := fmt.Sprintf("%s%v", cacheTycAdminUserRealNamePrefix, data.RealName) + tycAdminUserUsernameKey := fmt.Sprintf("%s%v", cacheTycAdminUserUsernamePrefix, data.Username) + sqlResult, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ? and version = ? ", m.table, adminUserRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.Username, newData.Password, newData.RealName, newData.Status, newData.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.Username, newData.Password, newData.RealName, newData.Status, newData.Id, oldVersion) + }, tycAdminUserIdKey, tycAdminUserRealNameKey, tycAdminUserUsernameKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultAdminUserModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminUser) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "AdminUserModel delete err : %+v", err) + } + return nil +} + +func (m *defaultAdminUserModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminUserModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminUserModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*AdminUser, error) { + + builder = builder.Columns(adminUserRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminUser + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminUserModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminUser, error) { + + builder = builder.Columns(adminUserRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminUser + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminUserModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminUser, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(adminUserRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*AdminUser + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultAdminUserModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminUser, error) { + + builder = builder.Columns(adminUserRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminUser + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminUserModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminUser, error) { + + builder = builder.Columns(adminUserRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminUser + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminUserModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultAdminUserModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultAdminUserModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + data, err := m.FindOne(ctx, id) + if err != nil { + return err + } + + tycAdminUserIdKey := fmt.Sprintf("%s%v", cacheTycAdminUserIdPrefix, id) + tycAdminUserRealNameKey := fmt.Sprintf("%s%v", cacheTycAdminUserRealNamePrefix, data.RealName) + tycAdminUserUsernameKey := fmt.Sprintf("%s%v", cacheTycAdminUserUsernamePrefix, data.Username) + _, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("delete from %s where `id` = ?", m.table) + if session != nil { + return session.ExecCtx(ctx, query, id) + } + return conn.ExecCtx(ctx, query, id) + }, tycAdminUserIdKey, tycAdminUserRealNameKey, tycAdminUserUsernameKey) + return err +} +func (m *defaultAdminUserModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheTycAdminUserIdPrefix, primary) +} +func (m *defaultAdminUserModel) queryPrimary(ctx context.Context, conn sqlx.SqlConn, v, primary interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminUserRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultAdminUserModel) tableName() string { + return m.table +} diff --git a/app/main/model/adminUserRoleModel.go b/app/main/model/adminUserRoleModel.go new file mode 100644 index 0000000..d9772ad --- /dev/null +++ b/app/main/model/adminUserRoleModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ AdminUserRoleModel = (*customAdminUserRoleModel)(nil) + +type ( + // AdminUserRoleModel is an interface to be customized, add more methods here, + // and implement the added methods in customAdminUserRoleModel. + AdminUserRoleModel interface { + adminUserRoleModel + } + + customAdminUserRoleModel struct { + *defaultAdminUserRoleModel + } +) + +// NewAdminUserRoleModel returns a model for the database table. +func NewAdminUserRoleModel(conn sqlx.SqlConn, c cache.CacheConf) AdminUserRoleModel { + return &customAdminUserRoleModel{ + defaultAdminUserRoleModel: newAdminUserRoleModel(conn, c), + } +} diff --git a/app/main/model/adminUserRoleModel_gen.go b/app/main/model/adminUserRoleModel_gen.go new file mode 100644 index 0000000..eeaa917 --- /dev/null +++ b/app/main/model/adminUserRoleModel_gen.go @@ -0,0 +1,407 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "tyc-server/common/globalkey" +) + +var ( + adminUserRoleFieldNames = builder.RawFieldNames(&AdminUserRole{}) + adminUserRoleRows = strings.Join(adminUserRoleFieldNames, ",") + adminUserRoleRowsExpectAutoSet = strings.Join(stringx.Remove(adminUserRoleFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + adminUserRoleRowsWithPlaceHolder = strings.Join(stringx.Remove(adminUserRoleFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheTycAdminUserRoleIdPrefix = "cache:tyc:adminUserRole:id:" + cacheTycAdminUserRoleUserIdRoleIdPrefix = "cache:tyc:adminUserRole:userId:roleId:" +) + +type ( + adminUserRoleModel interface { + Insert(ctx context.Context, session sqlx.Session, data *AdminUserRole) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*AdminUserRole, error) + FindOneByUserIdRoleId(ctx context.Context, userId int64, roleId int64) (*AdminUserRole, error) + Update(ctx context.Context, session sqlx.Session, data *AdminUserRole) (sql.Result, error) + UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AdminUserRole) error + Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminUserRole) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*AdminUserRole, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminUserRole, error) + FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminUserRole, int64, error) + FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminUserRole, error) + FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminUserRole, error) + Delete(ctx context.Context, session sqlx.Session, id int64) error + } + + defaultAdminUserRoleModel struct { + sqlc.CachedConn + table string + } + + AdminUserRole struct { + Id int64 `db:"id"` + CreateTime time.Time `db:"create_time"` + UpdateTime time.Time `db:"update_time"` + DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 + DelState int64 `db:"del_state"` + Version int64 `db:"version"` // 版本号 + UserId int64 `db:"user_id"` // 关联到用户表的id + RoleId int64 `db:"role_id"` // 关联到角色表的id + } +) + +func newAdminUserRoleModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAdminUserRoleModel { + return &defaultAdminUserRoleModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`admin_user_role`", + } +} + +func (m *defaultAdminUserRoleModel) Insert(ctx context.Context, session sqlx.Session, data *AdminUserRole) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + tycAdminUserRoleIdKey := fmt.Sprintf("%s%v", cacheTycAdminUserRoleIdPrefix, data.Id) + tycAdminUserRoleUserIdRoleIdKey := fmt.Sprintf("%s%v:%v", cacheTycAdminUserRoleUserIdRoleIdPrefix, data.UserId, data.RoleId) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?)", m.table, adminUserRoleRowsExpectAutoSet) + if session != nil { + return session.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.UserId, data.RoleId) + } + return conn.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.UserId, data.RoleId) + }, tycAdminUserRoleIdKey, tycAdminUserRoleUserIdRoleIdKey) +} + +func (m *defaultAdminUserRoleModel) FindOne(ctx context.Context, id int64) (*AdminUserRole, error) { + tycAdminUserRoleIdKey := fmt.Sprintf("%s%v", cacheTycAdminUserRoleIdPrefix, id) + var resp AdminUserRole + err := m.QueryRowCtx(ctx, &resp, tycAdminUserRoleIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminUserRoleRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminUserRoleModel) FindOneByUserIdRoleId(ctx context.Context, userId int64, roleId int64) (*AdminUserRole, error) { + tycAdminUserRoleUserIdRoleIdKey := fmt.Sprintf("%s%v:%v", cacheTycAdminUserRoleUserIdRoleIdPrefix, userId, roleId) + var resp AdminUserRole + err := m.QueryRowIndexCtx(ctx, &resp, tycAdminUserRoleUserIdRoleIdKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `user_id` = ? and `role_id` = ? and del_state = ? limit 1", adminUserRoleRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, userId, roleId, globalkey.DelStateNo); err != nil { + return nil, err + } + return resp.Id, nil + }, m.queryPrimary) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminUserRoleModel) Update(ctx context.Context, session sqlx.Session, newData *AdminUserRole) (sql.Result, error) { + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return nil, err + } + tycAdminUserRoleIdKey := fmt.Sprintf("%s%v", cacheTycAdminUserRoleIdPrefix, data.Id) + tycAdminUserRoleUserIdRoleIdKey := fmt.Sprintf("%s%v:%v", cacheTycAdminUserRoleUserIdRoleIdPrefix, data.UserId, data.RoleId) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, adminUserRoleRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.UserId, newData.RoleId, newData.Id) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.UserId, newData.RoleId, newData.Id) + }, tycAdminUserRoleIdKey, tycAdminUserRoleUserIdRoleIdKey) +} + +func (m *defaultAdminUserRoleModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *AdminUserRole) error { + + oldVersion := newData.Version + newData.Version += 1 + + var sqlResult sql.Result + var err error + + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return err + } + tycAdminUserRoleIdKey := fmt.Sprintf("%s%v", cacheTycAdminUserRoleIdPrefix, data.Id) + tycAdminUserRoleUserIdRoleIdKey := fmt.Sprintf("%s%v:%v", cacheTycAdminUserRoleUserIdRoleIdPrefix, data.UserId, data.RoleId) + sqlResult, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ? and version = ? ", m.table, adminUserRoleRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.UserId, newData.RoleId, newData.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.UserId, newData.RoleId, newData.Id, oldVersion) + }, tycAdminUserRoleIdKey, tycAdminUserRoleUserIdRoleIdKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultAdminUserRoleModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminUserRole) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "AdminUserRoleModel delete err : %+v", err) + } + return nil +} + +func (m *defaultAdminUserRoleModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminUserRoleModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminUserRoleModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*AdminUserRole, error) { + + builder = builder.Columns(adminUserRoleRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminUserRole + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminUserRoleModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminUserRole, error) { + + builder = builder.Columns(adminUserRoleRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminUserRole + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminUserRoleModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminUserRole, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(adminUserRoleRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*AdminUserRole + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultAdminUserRoleModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminUserRole, error) { + + builder = builder.Columns(adminUserRoleRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminUserRole + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminUserRoleModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminUserRole, error) { + + builder = builder.Columns(adminUserRoleRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminUserRole + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminUserRoleModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultAdminUserRoleModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultAdminUserRoleModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + data, err := m.FindOne(ctx, id) + if err != nil { + return err + } + + tycAdminUserRoleIdKey := fmt.Sprintf("%s%v", cacheTycAdminUserRoleIdPrefix, id) + tycAdminUserRoleUserIdRoleIdKey := fmt.Sprintf("%s%v:%v", cacheTycAdminUserRoleUserIdRoleIdPrefix, data.UserId, data.RoleId) + _, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("delete from %s where `id` = ?", m.table) + if session != nil { + return session.ExecCtx(ctx, query, id) + } + return conn.ExecCtx(ctx, query, id) + }, tycAdminUserRoleIdKey, tycAdminUserRoleUserIdRoleIdKey) + return err +} +func (m *defaultAdminUserRoleModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheTycAdminUserRoleIdPrefix, primary) +} +func (m *defaultAdminUserRoleModel) queryPrimary(ctx context.Context, conn sqlx.SqlConn, v, primary interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminUserRoleRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultAdminUserRoleModel) tableName() string { + return m.table +} diff --git a/common/jwt/jwtx.go b/common/jwt/jwtx.go index bae8de9..211a109 100644 --- a/common/jwt/jwtx.go +++ b/common/jwt/jwtx.go @@ -2,9 +2,10 @@ package jwtx import ( "errors" - "github.com/golang-jwt/jwt/v4" "strconv" "time" + + "github.com/golang-jwt/jwt/v4" ) // Token 生成逻辑的函数,接收 userId、过期时间和密钥,返回生成的 token diff --git a/common/jwt/jwtxV2.go b/common/jwt/jwtxV2.go new file mode 100644 index 0000000..6c9c28d --- /dev/null +++ b/common/jwt/jwtxV2.go @@ -0,0 +1,64 @@ +package jwtx + +import ( + "context" + "errors" + "fmt" + "time" + + "github.com/golang-jwt/jwt/v4" +) + +// Token 生成逻辑的函数,接收 userId、过期时间和密钥,返回生成的 token +func GenerateJwtTokenV2(claims map[string]interface{}, secret string, expireTime int64) (string, error) { + // 获取当前时间戳 + now := time.Now().Unix() + // 定义 JWT Claims + claimsMap := jwt.MapClaims{ + "exp": now + expireTime, // token 过期时间 + "iat": now, // 签发时间 + "claims": claims, // 自定义claims + } + + // 创建新的 JWT token + token := jwt.NewWithClaims(jwt.SigningMethodHS256, claimsMap) + + // 使用密钥对 token 签名 + signedToken, err := token.SignedString([]byte(secret)) + if err != nil { + return "", err + } + + return signedToken, nil +} +func ParseJwtTokenV2(tokenStr string, secret string) (map[string]interface{}, error) { + token, err := jwt.Parse(tokenStr, func(token *jwt.Token) (interface{}, error) { + return []byte(secret), nil + }) + + if err != nil || !token.Valid { + return nil, errors.New("invalid JWT") + } + + claims, ok := token.Claims.(jwt.MapClaims) + if !ok || !token.Valid { + return nil, errors.New("invalid JWT claims") + } + + // 从 claims 中提取 userId + claimsRaw, ok := claims["claims"] + if !ok { + return nil, errors.New("claims not found in JWT") + } + + return claimsRaw.(map[string]interface{}), nil +} + +func GetJwtClaims(ctx context.Context) (map[string]interface{}, error) { + // 尝试从上下文中获取 jwtUserId + claims, ok := ctx.Value("claims").(map[string]interface{}) + if !ok { + return nil, fmt.Errorf("无法获取jwt claims: %v", claims) + } + return claims, nil +} diff --git a/deploy/script/genModel.ps1 b/deploy/script/genModel.ps1 deleted file mode 100644 index 29a6e8a..0000000 --- a/deploy/script/genModel.ps1 +++ /dev/null @@ -1,25 +0,0 @@ -# 使用方法: -# .\genModel.ps1 user user -# .\genModel.ps1 user user_auth -# 再将 .\genModel 下的文件剪切到对应服务的 model 目录里面,记得改 package -# goctl model mysql datasource -url="tyc:5vg67b3UNHu8@tcp(127.0.0.1:20001)/tyc" -table="product" -dir="./model" --home="../template" -cache=true --style=goZero -param ( - [string]$database, - [string]$tables -) - -# 生成的表名 -$modeldir = "./genModel" -$templateDir = Join-Path -Path (Resolve-Path "$PSScriptRoot/..") -ChildPath "template" -# 数据库配置 -$host = "127.0.0.1" -$port = "20001" -$dbname = "$database" -$username = "tyc" -$passwd = "5vg67b3UNHu8" - -Write-Output "开始创建库:$dbname 的表:$tables" - -# 执行 goctl 命令生成 model -$command = "goctl model mysql datasource -url=`"$username`:$passwd`@tcp($host`:$port)/$dbname`" -table=`"$tables`" -dir=`"$modeldir`" --home=`"$templateDir`" -cache=true --style=goZero" -Invoke-Expression $command \ No newline at end of file diff --git a/deploy/script/gen_models.ps1 b/deploy/script/gen_models.ps1 index 42ae7b3..5931f60 100644 --- a/deploy/script/gen_models.ps1 +++ b/deploy/script/gen_models.ps1 @@ -7,7 +7,7 @@ $TEMPLATE_DIR = "../template" # 表名列表 $tables = @( - "example_params" + # "example_params" # "feature", # "global_notifications", # "order", @@ -17,6 +17,19 @@ $tables = @( # "query", # "user", # "user_auth" + # "admin_user" + # "admin_user_role" + # "admin_api", + # "admin_menu" + # "admin_role", + # "admin_role_api", + # "admin_role_menu", + # "admin_dict_data" + # "admin_dict_type" + # "admin_promotion_link" + # "admin_promotion_link_stats_total" + # "admin_promotion_link_stats_history" + "admin_promotion_order" ) # 为每个表生成模型 diff --git a/deploy/script/model/exampleModel.go b/deploy/script/model/exampleModel.go deleted file mode 100644 index d041ea0..0000000 --- a/deploy/script/model/exampleModel.go +++ /dev/null @@ -1,27 +0,0 @@ -package model - -import ( - "github.com/zeromicro/go-zero/core/stores/cache" - "github.com/zeromicro/go-zero/core/stores/sqlx" -) - -var _ ExampleModel = (*customExampleModel)(nil) - -type ( - // ExampleModel is an interface to be customized, add more methods here, - // and implement the added methods in customExampleModel. - ExampleModel interface { - exampleModel - } - - customExampleModel struct { - *defaultExampleModel - } -) - -// NewExampleModel returns a model for the database table. -func NewExampleModel(conn sqlx.SqlConn, c cache.CacheConf) ExampleModel { - return &customExampleModel{ - defaultExampleModel: newExampleModel(conn, c), - } -} diff --git a/deploy/script/model/exampleModel_gen.go b/deploy/script/model/exampleModel_gen.go deleted file mode 100644 index 9064d83..0000000 --- a/deploy/script/model/exampleModel_gen.go +++ /dev/null @@ -1,434 +0,0 @@ -// Code generated by goctl. DO NOT EDIT! - -package model - -import ( - "context" - "database/sql" - "fmt" - "strings" - - "time" - - "github.com/Masterminds/squirrel" - "github.com/pkg/errors" - "github.com/zeromicro/go-zero/core/stores/builder" - "github.com/zeromicro/go-zero/core/stores/cache" - "github.com/zeromicro/go-zero/core/stores/sqlc" - "github.com/zeromicro/go-zero/core/stores/sqlx" - "github.com/zeromicro/go-zero/core/stringx" - "tyc-server/common/globalkey" -) - -var ( - exampleFieldNames = builder.RawFieldNames(&Example{}) - exampleRows = strings.Join(exampleFieldNames, ",") - exampleRowsExpectAutoSet = strings.Join(stringx.Remove(exampleFieldNames, "`id`", "`create_time`", "`update_time`"), ",") - exampleRowsWithPlaceHolder = strings.Join(stringx.Remove(exampleFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" - - cacheTycExampleIdPrefix = "cache:tyc:example:id:" - cacheTycExampleApiIdPrefix = "cache:tyc:example:apiId:" - cacheTycExampleFeatureIdPrefix = "cache:tyc:example:featureId:" -) - -type ( - exampleModel interface { - Insert(ctx context.Context, session sqlx.Session, data *Example) (sql.Result, error) - FindOne(ctx context.Context, id int64) (*Example, error) - FindOneByApiId(ctx context.Context, apiId string) (*Example, error) - FindOneByFeatureId(ctx context.Context, featureId int64) (*Example, error) - Update(ctx context.Context, session sqlx.Session, data *Example) (sql.Result, error) - UpdateWithVersion(ctx context.Context, session sqlx.Session, data *Example) error - Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error - SelectBuilder() squirrel.SelectBuilder - DeleteSoft(ctx context.Context, session sqlx.Session, data *Example) error - FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) - FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) - FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*Example, error) - FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*Example, error) - FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*Example, int64, error) - FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*Example, error) - FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*Example, error) - Delete(ctx context.Context, session sqlx.Session, id int64) error - } - - defaultExampleModel struct { - sqlc.CachedConn - table string - } - - Example struct { - Id int64 `db:"id"` // 主键ID - CreateTime time.Time `db:"create_time"` // 创建时间 - UpdateTime time.Time `db:"update_time"` // 更新时间 - DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 - DelState int64 `db:"del_state"` // 删除状态 - Version int64 `db:"version"` // 版本号 - ApiId string `db:"api_id"` // API标识 - FeatureId int64 `db:"feature_id"` // 关联feature表的ID - Content string `db:"content"` // 内容 - } -) - -func newExampleModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultExampleModel { - return &defaultExampleModel{ - CachedConn: sqlc.NewConn(conn, c), - table: "`example`", - } -} - -func (m *defaultExampleModel) Insert(ctx context.Context, session sqlx.Session, data *Example) (sql.Result, error) { - data.DelState = globalkey.DelStateNo - tycExampleApiIdKey := fmt.Sprintf("%s%v", cacheTycExampleApiIdPrefix, data.ApiId) - tycExampleFeatureIdKey := fmt.Sprintf("%s%v", cacheTycExampleFeatureIdPrefix, data.FeatureId) - tycExampleIdKey := fmt.Sprintf("%s%v", cacheTycExampleIdPrefix, data.Id) - return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { - query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?)", m.table, exampleRowsExpectAutoSet) - if session != nil { - return session.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.ApiId, data.FeatureId, data.Content) - } - return conn.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.ApiId, data.FeatureId, data.Content) - }, tycExampleApiIdKey, tycExampleFeatureIdKey, tycExampleIdKey) -} - -func (m *defaultExampleModel) FindOne(ctx context.Context, id int64) (*Example, error) { - tycExampleIdKey := fmt.Sprintf("%s%v", cacheTycExampleIdPrefix, id) - var resp Example - err := m.QueryRowCtx(ctx, &resp, tycExampleIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { - query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", exampleRows, m.table) - return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) - }) - switch err { - case nil: - return &resp, nil - case sqlc.ErrNotFound: - return nil, ErrNotFound - default: - return nil, err - } -} - -func (m *defaultExampleModel) FindOneByApiId(ctx context.Context, apiId string) (*Example, error) { - tycExampleApiIdKey := fmt.Sprintf("%s%v", cacheTycExampleApiIdPrefix, apiId) - var resp Example - err := m.QueryRowIndexCtx(ctx, &resp, tycExampleApiIdKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { - query := fmt.Sprintf("select %s from %s where `api_id` = ? and del_state = ? limit 1", exampleRows, m.table) - if err := conn.QueryRowCtx(ctx, &resp, query, apiId, globalkey.DelStateNo); err != nil { - return nil, err - } - return resp.Id, nil - }, m.queryPrimary) - switch err { - case nil: - return &resp, nil - case sqlc.ErrNotFound: - return nil, ErrNotFound - default: - return nil, err - } -} - -func (m *defaultExampleModel) FindOneByFeatureId(ctx context.Context, featureId int64) (*Example, error) { - tycExampleFeatureIdKey := fmt.Sprintf("%s%v", cacheTycExampleFeatureIdPrefix, featureId) - var resp Example - err := m.QueryRowIndexCtx(ctx, &resp, tycExampleFeatureIdKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { - query := fmt.Sprintf("select %s from %s where `feature_id` = ? and del_state = ? limit 1", exampleRows, m.table) - if err := conn.QueryRowCtx(ctx, &resp, query, featureId, globalkey.DelStateNo); err != nil { - return nil, err - } - return resp.Id, nil - }, m.queryPrimary) - switch err { - case nil: - return &resp, nil - case sqlc.ErrNotFound: - return nil, ErrNotFound - default: - return nil, err - } -} - -func (m *defaultExampleModel) Update(ctx context.Context, session sqlx.Session, newData *Example) (sql.Result, error) { - data, err := m.FindOne(ctx, newData.Id) - if err != nil { - return nil, err - } - tycExampleApiIdKey := fmt.Sprintf("%s%v", cacheTycExampleApiIdPrefix, data.ApiId) - tycExampleFeatureIdKey := fmt.Sprintf("%s%v", cacheTycExampleFeatureIdPrefix, data.FeatureId) - tycExampleIdKey := fmt.Sprintf("%s%v", cacheTycExampleIdPrefix, data.Id) - return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { - query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, exampleRowsWithPlaceHolder) - if session != nil { - return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.ApiId, newData.FeatureId, newData.Content, newData.Id) - } - return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.ApiId, newData.FeatureId, newData.Content, newData.Id) - }, tycExampleApiIdKey, tycExampleFeatureIdKey, tycExampleIdKey) -} - -func (m *defaultExampleModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *Example) error { - - oldVersion := newData.Version - newData.Version += 1 - - var sqlResult sql.Result - var err error - - data, err := m.FindOne(ctx, newData.Id) - if err != nil { - return err - } - tycExampleApiIdKey := fmt.Sprintf("%s%v", cacheTycExampleApiIdPrefix, data.ApiId) - tycExampleFeatureIdKey := fmt.Sprintf("%s%v", cacheTycExampleFeatureIdPrefix, data.FeatureId) - tycExampleIdKey := fmt.Sprintf("%s%v", cacheTycExampleIdPrefix, data.Id) - sqlResult, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { - query := fmt.Sprintf("update %s set %s where `id` = ? and version = ? ", m.table, exampleRowsWithPlaceHolder) - if session != nil { - return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.ApiId, newData.FeatureId, newData.Content, newData.Id, oldVersion) - } - return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.ApiId, newData.FeatureId, newData.Content, newData.Id, oldVersion) - }, tycExampleApiIdKey, tycExampleFeatureIdKey, tycExampleIdKey) - if err != nil { - return err - } - updateCount, err := sqlResult.RowsAffected() - if err != nil { - return err - } - if updateCount == 0 { - return ErrNoRowsUpdate - } - - return nil -} - -func (m *defaultExampleModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *Example) error { - data.DelState = globalkey.DelStateYes - data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} - if err := m.UpdateWithVersion(ctx, session, data); err != nil { - return errors.Wrapf(errors.New("delete soft failed "), "ExampleModel delete err : %+v", err) - } - return nil -} - -func (m *defaultExampleModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { - - if len(field) == 0 { - return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") - } - - builder = builder.Columns("IFNULL(SUM(" + field + "),0)") - - query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() - if err != nil { - return 0, err - } - - var resp float64 - err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) - switch err { - case nil: - return resp, nil - default: - return 0, err - } -} - -func (m *defaultExampleModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { - - if len(field) == 0 { - return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") - } - - builder = builder.Columns("COUNT(" + field + ")") - - query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() - if err != nil { - return 0, err - } - - var resp int64 - err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) - switch err { - case nil: - return resp, nil - default: - return 0, err - } -} - -func (m *defaultExampleModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*Example, error) { - - builder = builder.Columns(exampleRows) - - if orderBy == "" { - builder = builder.OrderBy("id DESC") - } else { - builder = builder.OrderBy(orderBy) - } - - query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() - if err != nil { - return nil, err - } - - var resp []*Example - err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) - switch err { - case nil: - return resp, nil - default: - return nil, err - } -} - -func (m *defaultExampleModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*Example, error) { - - builder = builder.Columns(exampleRows) - - if orderBy == "" { - builder = builder.OrderBy("id DESC") - } else { - builder = builder.OrderBy(orderBy) - } - - if page < 1 { - page = 1 - } - offset := (page - 1) * pageSize - - query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() - if err != nil { - return nil, err - } - - var resp []*Example - err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) - switch err { - case nil: - return resp, nil - default: - return nil, err - } -} - -func (m *defaultExampleModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*Example, int64, error) { - - total, err := m.FindCount(ctx, builder, "id") - if err != nil { - return nil, 0, err - } - - builder = builder.Columns(exampleRows) - - if orderBy == "" { - builder = builder.OrderBy("id DESC") - } else { - builder = builder.OrderBy(orderBy) - } - - if page < 1 { - page = 1 - } - offset := (page - 1) * pageSize - - query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() - if err != nil { - return nil, total, err - } - - var resp []*Example - err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) - switch err { - case nil: - return resp, total, nil - default: - return nil, total, err - } -} - -func (m *defaultExampleModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*Example, error) { - - builder = builder.Columns(exampleRows) - - if preMinId > 0 { - builder = builder.Where(" id < ? ", preMinId) - } - - query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() - if err != nil { - return nil, err - } - - var resp []*Example - err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) - switch err { - case nil: - return resp, nil - default: - return nil, err - } -} - -func (m *defaultExampleModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*Example, error) { - - builder = builder.Columns(exampleRows) - - if preMaxId > 0 { - builder = builder.Where(" id > ? ", preMaxId) - } - - query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() - if err != nil { - return nil, err - } - - var resp []*Example - err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) - switch err { - case nil: - return resp, nil - default: - return nil, err - } -} - -func (m *defaultExampleModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { - - return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { - return fn(ctx, session) - }) - -} - -func (m *defaultExampleModel) SelectBuilder() squirrel.SelectBuilder { - return squirrel.Select().From(m.table) -} -func (m *defaultExampleModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { - data, err := m.FindOne(ctx, id) - if err != nil { - return err - } - - tycExampleApiIdKey := fmt.Sprintf("%s%v", cacheTycExampleApiIdPrefix, data.ApiId) - tycExampleFeatureIdKey := fmt.Sprintf("%s%v", cacheTycExampleFeatureIdPrefix, data.FeatureId) - tycExampleIdKey := fmt.Sprintf("%s%v", cacheTycExampleIdPrefix, id) - _, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { - query := fmt.Sprintf("delete from %s where `id` = ?", m.table) - if session != nil { - return session.ExecCtx(ctx, query, id) - } - return conn.ExecCtx(ctx, query, id) - }, tycExampleApiIdKey, tycExampleFeatureIdKey, tycExampleIdKey) - return err -} -func (m *defaultExampleModel) formatPrimary(primary interface{}) string { - return fmt.Sprintf("%s%v", cacheTycExampleIdPrefix, primary) -} -func (m *defaultExampleModel) queryPrimary(ctx context.Context, conn sqlx.SqlConn, v, primary interface{}) error { - query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", exampleRows, m.table) - return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) -} - -func (m *defaultExampleModel) tableName() string { - return m.table -} diff --git a/deploy/sql/admin_rbac.sql b/deploy/sql/admin_rbac.sql index b41ff0c..059983c 100644 --- a/deploy/sql/admin_rbac.sql +++ b/deploy/sql/admin_rbac.sql @@ -10,10 +10,12 @@ CREATE TABLE `admin_user` ( /* 业务字段开始 */ `username` varchar(50) NOT NULL DEFAULT '' COMMENT '用户名', `password` varchar(255) NOT NULL DEFAULT '' COMMENT '密码', + `real_name` varchar(50) NOT NULL DEFAULT '' COMMENT '真实姓名', `status` tinyint NOT NULL DEFAULT '1' COMMENT '状态:0-禁用,1-启用', /* 业务字段结束 */ PRIMARY KEY (`id`), + UNIQUE KEY `uk_real_name` (`real_name`), UNIQUE KEY `uk_username` (`username`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='管理员用户表'; @@ -48,21 +50,24 @@ CREATE TABLE `admin_menu` ( `version` bigint NOT NULL DEFAULT '0' COMMENT '版本号', /* 业务字段开始 */ - `parent_id` bigint NOT NULL DEFAULT '0' COMMENT '父菜单ID', - `menu_name` varchar(50) NOT NULL DEFAULT '' COMMENT '菜单名称', - `menu_code` varchar(100) NOT NULL DEFAULT '' COMMENT '菜单编码', + `pid` bigint NOT NULL DEFAULT '0' COMMENT '父菜单ID', + `name` varchar(100) NOT NULL DEFAULT '' COMMENT '路由名称', `path` varchar(255) NOT NULL DEFAULT '' COMMENT '路由路径', `component` varchar(255) NOT NULL DEFAULT '' COMMENT '组件路径', - `icon` varchar(100) NOT NULL DEFAULT '' COMMENT '图标', - `sort` int NOT NULL DEFAULT '0' COMMENT '排序', - `visible` tinyint NOT NULL DEFAULT '1' COMMENT '是否可见:0-隐藏,1-显示', - `status` tinyint NOT NULL DEFAULT '1' COMMENT '状态:0-禁用,1-启用', - `is_cache` tinyint NOT NULL DEFAULT '0' COMMENT '是否缓存:0-不缓存,1-缓存', + `redirect` varchar(255) DEFAULT NULL COMMENT '重定向路径', + + /* Meta配置JSON字段 */ + `meta` json NOT NULL COMMENT '路由元数据配置', + + /* 附加信息 */ + `status` tinyint NOT NULL DEFAULT '1' COMMENT '状态: 0-禁用, 1-启用', + `type` tinyint NOT NULL DEFAULT '0' COMMENT '类型: 0-目录, 1-菜单, 2-按钮', + `sort` int NOT NULL DEFAULT '0' COMMENT '排序号', /* 业务字段结束 */ PRIMARY KEY (`id`), - UNIQUE KEY `uk_menu_code` (`menu_code`), - KEY `idx_parent_id` (`parent_id`) COMMENT '优化层级查询' + UNIQUE KEY `uk_name_path` (`name`, `path`), + KEY `idx_pid` (`pid`) COMMENT '优化层级查询' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='菜单表'; -- 接口表 @@ -149,4 +154,43 @@ CREATE TABLE `admin_role_api` ( UNIQUE KEY `uk_role_api` (`role_id`, `api_id`), KEY `idx_role_id` (`role_id`) COMMENT '优化角色查询', KEY `idx_api_id` (`api_id`) COMMENT '优化接口查询' -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='角色接口关联表'; \ No newline at end of file +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='角色接口关联表'; +-- 字典类型表 +CREATE TABLE `admin_dict_type` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `delete_time` datetime DEFAULT NULL COMMENT '删除时间', + `del_state` tinyint NOT NULL DEFAULT '0', + `version` bigint NOT NULL DEFAULT '0' COMMENT '版本号', + + `dict_type` varchar(50) NOT NULL COMMENT '字典类型编码', + `dict_name` varchar(100) NOT NULL COMMENT '字典类型名称', + `status` tinyint NOT NULL DEFAULT '1' COMMENT '状态:0-禁用,1-启用', + `remark` varchar(255) DEFAULT NULL COMMENT '备注', + + PRIMARY KEY (`id`), + UNIQUE KEY `uk_dict_type` (`dict_type`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='字典类型表'; + +-- 字典数据表 +CREATE TABLE `admin_dict_data` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `delete_time` datetime DEFAULT NULL COMMENT '删除时间', + `del_state` tinyint NOT NULL DEFAULT '0', + `version` bigint NOT NULL DEFAULT '0' COMMENT '版本号', + + `dict_type` varchar(50) NOT NULL COMMENT '字典类型编码', + `dict_label` varchar(100) NOT NULL COMMENT '字典标签', + `dict_value` tinyint NOT NULL COMMENT '字典键值', + `dict_sort` int NOT NULL DEFAULT '0' COMMENT '字典排序', + `status` tinyint NOT NULL DEFAULT '1' COMMENT '状态:0-禁用,1-启用', + `remark` varchar(255) DEFAULT NULL COMMENT '备注', + + PRIMARY KEY (`id`), + UNIQUE KEY `uk_type_value` (`dict_type`, `dict_value`), + UNIQUE KEY `uk_type_label` (`dict_type`, `dict_label`), + KEY `idx_dict_type` (`dict_type`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='字典数据表'; \ No newline at end of file diff --git a/deploy/sql/promotion.sql b/deploy/sql/promotion.sql new file mode 100644 index 0000000..0410db9 --- /dev/null +++ b/deploy/sql/promotion.sql @@ -0,0 +1,92 @@ +CREATE TABLE `admin_promotion_link` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `delete_time` datetime DEFAULT NULL COMMENT '删除时间', + `del_state` tinyint NOT NULL DEFAULT '0', + `version` bigint NOT NULL DEFAULT '0' COMMENT '版本号', + + /* 业务字段开始 */ + `url` varchar(1024) NOT NULL COMMENT '推广链接URL', + `name` varchar(100) NOT NULL COMMENT '推广链接名称', + `admin_user_id` bigint NOT NULL DEFAULT '0' COMMENT '推广者账号ID', + /* 业务字段结束 */ + + PRIMARY KEY (`id`), + UNIQUE KEY `uk_url` (`url`(255)) COMMENT '确保URL唯一', + KEY `idx_name` (`name`) COMMENT '优化名称查询', + KEY `idx_admin_user_id` (`admin_user_id`) COMMENT '优化推广者查询' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='推广链接表'; + +-- 总统计表(缓存汇总数据,提升查询性能) +CREATE TABLE `admin_promotion_link_stats_total` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `delete_time` datetime DEFAULT NULL COMMENT '删除时间', + `del_state` tinyint NOT NULL DEFAULT '0', + `version` bigint NOT NULL DEFAULT '0' COMMENT '版本号', + + /* 业务字段开始 */ + `link_id` bigint NOT NULL COMMENT '推广链接ID', + `click_count` bigint NOT NULL DEFAULT '0' COMMENT '总点击数', + `pay_count` bigint NOT NULL DEFAULT '0' COMMENT '总付费次数', + `pay_amount` decimal(20,2) NOT NULL DEFAULT '0.00' COMMENT '总付费金额', + `last_click_time` datetime DEFAULT NULL COMMENT '最后点击时间', + `last_pay_time` datetime DEFAULT NULL COMMENT '最后付费时间', + /* 业务字段结束 */ + + PRIMARY KEY (`id`), + UNIQUE KEY `uk_link_id` (`link_id`) COMMENT '确保每个链接只有一条总统计记录' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='推广链接总统计表(缓存汇总数据,提升查询性能)'; + +-- 历史统计表(按天统计,包含当天实时统计) +CREATE TABLE `admin_promotion_link_stats_history` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `delete_time` datetime DEFAULT NULL COMMENT '删除时间', + `del_state` tinyint NOT NULL DEFAULT '0', + `version` bigint NOT NULL DEFAULT '0' COMMENT '版本号', + + /* 业务字段开始 */ + `link_id` bigint NOT NULL COMMENT '推广链接ID', + `stats_date` date NOT NULL COMMENT '统计日期', + `click_count` bigint NOT NULL DEFAULT '0' COMMENT '点击数', + `pay_count` bigint NOT NULL DEFAULT '0' COMMENT '付费次数', + `pay_amount` decimal(20,2) NOT NULL DEFAULT '0.00' COMMENT '付费金额', + `last_click_time` datetime DEFAULT NULL COMMENT '最后点击时间', + `last_pay_time` datetime DEFAULT NULL COMMENT '最后付费时间', + /* 业务字段结束 */ + + PRIMARY KEY (`id`), + UNIQUE KEY `uk_link_date` (`link_id`, `stats_date`) COMMENT '确保每个链接每天只有一条统计记录', + KEY `idx_stats_date` (`stats_date`) COMMENT '优化日期查询', + KEY `idx_link_id` (`link_id`) COMMENT '优化链接查询', + KEY `idx_link_date` (`link_id`, `stats_date`) COMMENT '优化链接日期查询' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='推广链接历史统计表'; + +-- 推广订单表 +CREATE TABLE `admin_promotion_order` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `delete_time` datetime DEFAULT NULL COMMENT '删除时间', + `del_state` tinyint NOT NULL DEFAULT '0', + `version` bigint NOT NULL DEFAULT '0' COMMENT '版本号', + + /* 业务字段开始 */ + `link_id` bigint NOT NULL COMMENT '推广链接ID', + `order_id` bigint NOT NULL COMMENT '订单ID', + `user_id` bigint NOT NULL COMMENT '下单用户ID', + `admin_user_id` bigint NOT NULL COMMENT '推广者账号ID', + /* 业务字段结束 */ + + PRIMARY KEY (`id`), + UNIQUE KEY `uk_order_id` (`order_id`) COMMENT '确保每个订单只有一条推广记录', + UNIQUE KEY `uk_url` (`url`(255)) COMMENT '确保URL唯一', + KEY `idx_link_id` (`link_id`) COMMENT '优化链接查询', + KEY `idx_user_id` (`user_id`) COMMENT '优化用户查询', + KEY `idx_admin_user_id` (`admin_user_id`) COMMENT '优化推广者查询' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='推广订单表'; + diff --git a/go.mod b/go.mod index 699bf31..643bc39 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,8 @@ module tyc-server -go 1.22.4 +go 1.23.0 + +toolchain go1.23.4 require ( github.com/Masterminds/squirrel v1.5.4 @@ -67,6 +69,7 @@ require ( github.com/prometheus/procfs v0.15.1 // indirect github.com/redis/go-redis/v9 v9.7.0 // indirect github.com/robfig/cron/v3 v3.0.1 // indirect + github.com/samber/lo v1.50.0 // indirect github.com/smartwalle/ncrypto v1.0.4 // indirect github.com/smartwalle/ngx v1.0.9 // indirect github.com/smartwalle/nsign v1.0.9 // indirect @@ -90,10 +93,10 @@ require ( go.opentelemetry.io/proto/otlp v1.3.1 // indirect go.uber.org/automaxprocs v1.6.0 // indirect golang.org/x/arch v0.0.0-20210923205945-b76863e36670 // indirect - golang.org/x/crypto v0.28.0 // indirect + golang.org/x/crypto v0.37.0 // indirect golang.org/x/net v0.30.0 // indirect - golang.org/x/sys v0.26.0 // indirect - golang.org/x/text v0.21.0 // indirect + golang.org/x/sys v0.32.0 // indirect + golang.org/x/text v0.24.0 // indirect golang.org/x/time v0.7.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 // indirect diff --git a/go.sum b/go.sum index d6f593b..3e2414a 100644 --- a/go.sum +++ b/go.sum @@ -217,6 +217,8 @@ github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/samber/lo v1.50.0 h1:XrG0xOeHs+4FQ8gJR97zDz5uOFMW7OwFWiFVzqopKgY= +github.com/samber/lo v1.50.0/go.mod h1:RjZyNk6WSnUFRKK6EyOhsRJMqft3G+pg7dCWHQCWvsc= github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= github.com/smartwalle/alipay/v3 v3.2.23 h1:i1VwJeu70EmwpsXXz6GZZnMAtRx5MTfn2dPoql/L3zE= @@ -315,6 +317,8 @@ golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDf golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= +golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= +golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= @@ -370,6 +374,8 @@ golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= +golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= @@ -388,6 +394,8 @@ golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0= +golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU= golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ= golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/pkg/lzkit/crypto/bcrypt.go b/pkg/lzkit/crypto/bcrypt.go new file mode 100644 index 0000000..7ed4512 --- /dev/null +++ b/pkg/lzkit/crypto/bcrypt.go @@ -0,0 +1,28 @@ +package crypto + +import ( + "golang.org/x/crypto/bcrypt" +) + +// PasswordHash 使用bcrypt对密码进行加密 +// cost参数确定加密的复杂度,默认为10,越高越安全但性能消耗越大 +func PasswordHash(password string, cost ...int) (string, error) { + defaultCost := 10 + if len(cost) > 0 && cost[0] > 0 { + defaultCost = cost[0] + } + + bytes, err := bcrypt.GenerateFromPassword([]byte(password), defaultCost) + if err != nil { + return "", err + } + + return string(bytes), nil +} + +// PasswordVerify 验证密码是否匹配 +// password是用户输入的明文密码,hash是存储的加密密码 +func PasswordVerify(password, hash string) bool { + err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password)) + return err == nil +} diff --git a/pkg/lzkit/crypto/bcrypt_test.go b/pkg/lzkit/crypto/bcrypt_test.go new file mode 100644 index 0000000..6ed7fd6 --- /dev/null +++ b/pkg/lzkit/crypto/bcrypt_test.go @@ -0,0 +1,105 @@ +package crypto + +import ( + "testing" +) + +func TestPasswordHashAndVerify(t *testing.T) { + tests := []struct { + name string + password string + cost []int + }{ + { + name: "普通密码-默认复杂度", + password: "password123", + cost: []int{}, + }, + { + name: "普通密码-低复杂度", + password: "password123", + cost: []int{4}, + }, + { + name: "空密码", + password: "", + cost: []int{}, + }, + { + name: "中文密码", + password: "密码123", + cost: []int{}, + }, + { + name: "特殊字符密码", + password: "p@$$w0rd!#*&", + cost: []int{}, + }, + { + name: "我的密码", + password: "aA2021.12.31", + cost: []int{10}, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + // 1. 测试加密 + hash, err := PasswordHash(tt.password, tt.cost...) + if err != nil { + t.Errorf("PasswordHash() error = %v", err) + return + } + if hash == "" { + t.Error("PasswordHash() 返回空哈希值") + } + if hash == tt.password { + t.Error("PasswordHash() 返回的哈希值与明文密码相同") + } + + // 2. 测试验证 - 正确密码 + if !PasswordVerify(tt.password, hash) { + t.Error("PasswordVerify() 无法验证正确的密码") + } + + // 3. 测试验证 - 错误密码 + if PasswordVerify(tt.password+"wrong", hash) { + t.Error("PasswordVerify() 错误地验证了错误的密码") + } + t.Logf("用户名: %s, 密码: %s, 哈希值: %s", tt.name, tt.password, hash) + }) + } +} + +func TestPasswordHashWithInvalidCost(t *testing.T) { + // bcrypt库的cost范围是4-31,超出范围会返回错误 + password := "testpassword" + + // 测试过低的cost + _, err := PasswordHash(password, 2) + if err == nil { + t.Error("PasswordHash() 应该对过低的cost返回错误") + } + + // 测试过高的cost + _, err = PasswordHash(password, 32) + if err == nil { + t.Error("PasswordHash() 应该对过高的cost返回错误") + } +} + +func BenchmarkPasswordHash(b *testing.B) { + password := "benchmark-password" + for i := 0; i < b.N; i++ { + _, _ = PasswordHash(password) + } +} + +func BenchmarkPasswordVerify(b *testing.B) { + password := "benchmark-password" + hash, _ := PasswordHash(password) + b.ResetTimer() + for i := 0; i < b.N; i++ { + _ = PasswordVerify(password, hash) + } +}