This commit is contained in:
liangzai 2025-05-27 18:35:01 +08:00
parent ca66cc91d4
commit 79e1ba2616
115 changed files with 22039 additions and 1045 deletions

186
.cursor/rules/api.mdc Normal file
View File

@ -0,0 +1,186 @@
# Cursor 工作流程和规范
## 目录结构说明
### API 定义目录 (`app/main/api/desc/`)
```
desc/
├── admin/ # 后台管理接口
│ ├── admin_user.api # 管理员用户相关接口
│ ├── platform_user.api # 平台用户相关接口
│ ├── order.api # 订单管理接口
│ ├── promotion.api # 促销活动接口
│ ├── menu.api # 菜单管理接口
│ ├── role.api # 角色权限接口
│ └── auth.api # 后台认证接口
├── front/ # 前台业务接口
│ ├── user.api # 用户相关接口
│ ├── product.api # 产品相关接口
│ ├── pay.api # 支付相关接口
│ ├── query.api # 查询相关接口
│ ├── auth/ # 前台认证相关子模块
│ ├── product/ # 产品相关子模块
│ ├── query/ # 查询相关子模块
│ ├── user/ # 用户相关子模块
│ └── pay/ # 支付相关子模块
└── main.api # API 主入口文件,用于引入所有子模块
```
### 目录规范
1. 后台管理接口统一放在 `admin/` 目录下
- 所有后台管理相关的 API 定义文件都放在此目录
- 文件名应清晰表明模块功能,如 `order.api`、`user.api` 等
- 后台接口统一使用 `/api/v1/admin/` 前缀
2. 前台业务接口统一放在 `front/` 目录下
- 所有面向用户的 API 定义文件都放在此目录
- 可以根据业务模块创建子目录,如 `user/`、`product/` 等
- 前台接口统一使用 `/api/v1/` 前缀
3. 主入口文件 `main.api`
- 用于引入所有子模块的 API 定义
- 保持清晰的模块分类和注释
## API 开发流程
### 1. API 定义
- 根据业务类型选择正确的目录:
- 后台管理接口:`app/main/api/desc/admin/` 目录
- 前台业务接口:`app/main/api/desc/front/` 目录
- 创建新的 `.api` 文件,遵循以下命名规范:
- 后台接口:`[模块名].api`,如 `order.api`、`user.api`
- 前台接口:`[模块名].api`,如 `product.api`、`pay.api`
- API 定义规范:
- 使用 RESTful 风格
- 请求/响应结构体命名规范:`[模块名][操作名][Req/Resp]`
- 字段类型使用 string 而不是 int64 来存储枚举值
- 添加必要的注释说明
- 请求/响应参数定义规范:
```go
type (
// 创建类请求(必填字段)
AdminCreateXXXReq {
Field1 string `json:"field1"` // 字段1说明
Field2 int64 `json:"field2"` // 字段2说明
Field3 string `json:"field3"` // 字段3说明
}
// 更新类请求(可选字段使用指针类型)
AdminUpdateXXXReq {
Id int64 `path:"id"` // ID路径参数
Field1 *string `json:"field1,optional"` // 字段1说明可选
Field2 *int64 `json:"field2,optional"` // 字段2说明可选
Field3 *string `json:"field3,optional"` // 字段3说明可选
}
// 查询列表请求(分页参数 + 可选查询条件)
AdminGetXXXListReq {
Page int64 `form:"page"` // 页码
PageSize int64 `form:"pageSize"` // 每页数量
Field1 *string `form:"field1,optional"` // 查询条件1可选
Field2 *int64 `form:"field2,optional"` // 查询条件2可选
Field3 *string `form:"field3,optional"` // 查询条件3可选
}
// 列表项结构体(用于列表响应)
XXXListItem {
Id int64 `json:"id"` // ID
Field1 string `json:"field1"` // 字段1
Field2 string `json:"field2"` // 字段2
Field3 string `json:"field3"` // 字段3
CreateTime string `json:"create_time"` // 创建时间
UpdateTime string `json:"update_time"` // 更新时间
}
// 列表响应
AdminGetXXXListResp {
Total int64 `json:"total"` // 总数
Items []XXXListItem `json:"items"` // 列表数据
}
)
```
- 参数定义注意事项:
1. 创建类请求Create
- 所有字段都是必填的,使用普通类型(非指针)
- 使用 `json` 标签,不需要 `optional` 标记
- 必须添加字段说明注释
2. 更新类请求Update
- 除 ID 外的所有字段都是可选的,使用指针类型(如 `*string`、`*int64`
- 使用 `json` 标签,并添加 `optional` 标记
- ID 字段使用 `path` 标签,因为是路径参数
- 必须添加字段说明注释
3. 查询列表请求GetList
- 分页参数page、pageSize使用普通类型
- 查询条件字段都是可选的,使用指针类型
- 使用 `form` 标签,并添加 `optional` 标记
- 必须添加字段说明注释
4. 响应结构体:
- 列表响应使用 `Total` 和 `Items` 字段
- 列表项使用单独的结构体定义
- 时间字段统一使用 string 类型
- 必须添加字段说明注释
5. 标签使用规范:
- 路径参数:`path:"id"`
- JSON 参数:`json:"field_name"`
- 表单参数:`form:"field_name"`
- 可选字段:添加 `optional` 标记
- 所有字段必须添加说明注释
- 示例:
```go
// 通知管理接口
@server(
prefix: /api/v1/admin/notification
group: admin_notification
)
service main {
// 创建通知
@handler AdminCreateNotification
post /create (AdminCreateNotificationReq) returns (AdminCreateNotificationResp)
// 更新通知
@handler AdminUpdateNotification
put /update/:id (AdminUpdateNotificationReq) returns (AdminUpdateNotificationResp)
// 获取通知列表
@handler AdminGetNotificationList
get /list (AdminGetNotificationListReq) returns (AdminGetNotificationListResp)
}
```
### 2. 引入 API
- 在 `app/main/api/main.api` 中引入新定义的 API 文件:
```go
import "desc/order.api"
```
### 3. 生成代码
- 在项目根目录运行 `gen_api.ps1` 脚本生成相关代码:
```powershell
./gen_api.ps1
```
- 生成的文件包括:
- `app/main/api/internal/handler/` - 处理器
- `app/main/api/internal/logic/` - 业务逻辑
- `app/main/api/internal/svc/` - 服务上下文
- `app/main/api/internal/types/` - 类型定义
### 4. 实现业务逻辑
- 在 `app/main/api/internal/logic/` 目录下实现各个接口的业务逻辑
- 具体实现规范请参考 `logic.mdc` 文件
## 注意事项
1. 所有枚举类型使用 string 而不是 int64
2. 错误处理必须使用 errors.Wrapf 和 xerr 包
3. 涉及多表操作时使用事务
4. 并发操作时注意使用互斥锁保护共享资源
5. 时间类型统一使用 "2006-01-02 15:04:05" 格式
6. 代码生成后需要检查并完善业务逻辑实现
7. 保持代码风格统一,添加必要的注释

270
.cursor/rules/logic.mdc Normal file
View File

@ -0,0 +1,270 @@
# Your rule content
- You can @ files here
- You can use markdown but dont have to
# Logic 实现规范
## 目录结构
```
app/main/api/internal/logic/
├── admin_notification/ # 通知管理模块
│ ├── admincreatenotificationlogic.go # 创建通知
│ ├── admindeletnotificationlogic.go # 删除通知
│ ├── admingetnotificationdetaillogic.go # 获取通知详情
│ ├── admingetnotificationlistlogic.go # 获取通知列表
│ └── adminupdatenotificationlogic.go # 更新通知
└── [其他模块]/
```
## Logic 实现规范
### 1. 基础结构
每个 Logic 文件都应包含以下基础结构:
```go
package [模块名]
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"
)
type [操作名]Logic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func New[操作名]Logic(ctx context.Context, svcCtx *svc.ServiceContext) *[操作名]Logic {
return &[操作名]Logic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
```
### 2. 增删改查实现规范
#### 2.1 创建操作Create
```go
func (l *[操作名]Logic) [操作名](req *types.[操作名]Req) (resp *types.[操作名]Resp, err error) {
// 1. 数据转换和验证
data := &model.[表名]{
Field1: req.Field1,
Field2: req.Field2,
// ... 其他字段映射
}
// 2. 数据库操作
result, err := l.svcCtx.[表名]Model.Insert(l.ctx, nil, data)
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR),
"创建[操作对象]失败, err: %v, req: %+v", err, req)
}
// 3. 返回结果
id, _ := result.LastInsertId()
return &types.[操作名]Resp{Id: id}, nil
}
```
#### 2.2 删除操作Delete
```go
func (l *[操作名]Logic) [操作名](req *types.[操作名]Req) (resp *types.[操作名]Resp, err error) {
// 1. 查询记录是否存在
record, err := l.svcCtx.[表名]Model.FindOne(l.ctx, req.Id)
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR),
"查找[操作对象]失败, err: %v, id: %d", err, req.Id)
}
// 2. 执行删除操作(软删除)
err = l.svcCtx.[表名]Model.DeleteSoft(l.ctx, nil, record)
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR),
"删除[操作对象]失败, err: %v, id: %d", err, req.Id)
}
// 3. 返回结果
return &types.[操作名]Resp{Success: true}, nil
}
```
#### 2.3 更新操作Update
```go
func (l *[操作名]Logic) [操作名](req *types.[操作名]Req) (resp *types.[操作名]Resp, err error) {
// 1. 查询记录是否存在
record, err := l.svcCtx.[表名]Model.FindOne(l.ctx, req.Id)
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR),
"查找[操作对象]失败, err: %v, id: %d", err, req.Id)
}
// 2. 更新字段(使用指针判断是否更新)
if req.Field1 != nil {
record.Field1 = *req.Field1
}
if req.Field2 != nil {
record.Field2 = *req.Field2
}
// ... 其他字段更新
// 3. 执行更新操作
_, err = l.svcCtx.[表名]Model.Update(l.ctx, nil, record)
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR),
"更新[操作对象]失败, err: %v, req: %+v", err, req)
}
// 4. 返回结果
return &types.[操作名]Resp{Success: true}, nil
}
```
#### 2.4 查询详情GetDetail
```go
func (l *[操作名]Logic) [操作名](req *types.[操作名]Req) (resp *types.[操作名]Resp, err error) {
// 1. 查询记录
record, err := l.svcCtx.[表名]Model.FindOne(l.ctx, req.Id)
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR),
"查找[操作对象]失败, err: %v, id: %d", err, req.Id)
}
// 2. 构建响应
resp = &types.[操作名]Resp{
Id: record.Id,
Field1: record.Field1,
Field2: record.Field2,
CreateTime: record.CreateTime.Format("2006-01-02 15:04:05"),
UpdateTime: record.UpdateTime.Format("2006-01-02 15:04:05"),
}
// 3. 处理可选字段(如时间字段)
if record.OptionalField.Valid {
resp.OptionalField = record.OptionalField.Time.Format("2006-01-02")
}
return resp, nil
}
```
#### 2.5 查询列表GetList
```go
func (l *[操作名]Logic) [操作名](req *types.[操作名]Req) (resp *types.[操作名]Resp, err error) {
// 1. 构建查询条件
builder := l.svcCtx.[表名]Model.SelectBuilder()
// 2. 添加查询条件(使用指针判断是否添加条件)
if req.Field1 != nil {
builder = builder.Where("field1 LIKE ?", "%"+*req.Field1+"%")
}
if req.Field2 != nil {
builder = builder.Where("field2 = ?", *req.Field2)
}
// ... 其他查询条件
// 3. 执行分页查询
list, total, err := l.svcCtx.[表名]Model.FindPageListByPageWithTotal(
l.ctx, builder, req.Page, req.PageSize, "id DESC")
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR),
"查询[操作对象]列表失败, err: %v, req: %+v", err, req)
}
// 4. 构建响应列表
items := make([]types.[列表项类型], 0, len(list))
for _, item := range list {
listItem := types.[列表项类型]{
Id: item.Id,
Field1: item.Field1,
Field2: item.Field2,
CreateTime: item.CreateTime.Format("2006-01-02 15:04:05"),
UpdateTime: item.UpdateTime.Format("2006-01-02 15:04:05"),
}
// 处理可选字段
if item.OptionalField.Valid {
listItem.OptionalField = item.OptionalField.Time.Format("2006-01-02")
}
items = append(items, listItem)
}
// 5. 返回结果
return &types.[操作名]Resp{
Total: total,
Items: items,
}, nil
}
```
### 3. 错误处理规范
1. 使用 `errors.Wrapf` 包装错误
2. 使用 `xerr.NewErrCode` 创建业务错误
3. 错误信息应包含:
- 操作类型(创建/更新/删除/查询)
- 具体错误描述
- 相关参数信息ID、请求参数等
### 4. 时间处理规范
1. 时间格式化:
- 日期时间:`"2006-01-02 15:04:05"`
- 仅日期:`"2006-01-02"`
2. 可选时间字段处理:
```go
if field.Valid {
resp.Field = field.Time.Format("2006-01-02")
}
```
### 5. 数据库操作规范
1. 查询条件构建:
```go
builder := l.svcCtx.[表名]Model.SelectBuilder()
builder = builder.Where("field = ?", value)
```
2. 分页查询:
```go
list, total, err := l.svcCtx.[表名]Model.FindPageListByPageWithTotal(
ctx, builder, page, pageSize, "id DESC")
```
3. 事务处理:
```go
err = l.svcCtx.[表名]Model.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error {
// 事务操作
return nil
})
```
### 6. 并发处理规范
```go
var mu sync.Mutex
err = mr.MapReduceVoid(func(source chan<- interface{}) {
// 并发处理
}, func(item interface{}, writer mr.Writer[struct{}], cancel func(error)) {
// 处理单个项目
}, func(pipe <-chan struct{}, cancel func(error)) {
// 完成处理
})
```
### 7. 注意事项
1. 所有数据库操作必须进行错误处理
2. 更新操作必须使用指针类型判断字段是否更新
3. 查询列表必须支持分页
4. 时间字段必须统一格式化
5. 可选字段必须进行空值判断
6. 保持代码风格统一,添加必要的注释
7. 涉及多表操作时使用事务
8. 并发操作时注意使用互斥锁保护共享资源
9. 错误处理必须使用 errors.Wrapf 和 xerr 包
10. 时间类型统一使用 "2006-01-02 15:04:05" 格式
# Your rule content
- You can @ files here
- You can use markdown but dont have to

Binary file not shown.

View File

@ -0,0 +1,75 @@
# 后台管理面板功能说明
## 1. 统计中心
- **数据概览**
展示平台核心数据指标,包括用户数、订单数、收入等关键指标的实时统计。
- **趋势分析**
提供各项数据的趋势图表,支持按日、周、月、年等维度查看数据变化。
- **转化分析**
分析用户行为路径和转化率,帮助优化业务流程。
- **地域分布**
展示用户和订单的地域分布情况,支持地图可视化。
## 2. 系统管理
- **用户管理**
管理平台所有用户信息,包括用户的基本资料、状态、权限等。
- **角色管理**
管理系统角色,分配不同角色的权限,支持角色的增删改查。
- **菜单管理**
配置后台左侧菜单栏的结构和显示内容,支持菜单的自定义和排序。
## 3. 推广管理
- **推广数据分析**
查看和分析推广相关的数据报表,支持多维度统计和导出。
- **推广链接管理**
管理推广渠道和推广链接,支持生成、分发和统计推广链接的效果。
## 4. 订单管理
- 管理平台所有订单,支持订单的查询、退款、导出等操作。
## 5. 平台用户管理
- **用户信息管理**
基于 user 表,管理平台所有注册用户的详细信息。
- **用户认证管理**
基于 userAuth 表,管理用户的认证信息(如第三方登录、手机号、邮箱等)。
## 6. 通知管理
- 管理平台的系统通知,包括通知的发布、编辑、删除和推送历史。
## 7. 产品与功能管理
- **产品管理**
管理平台所有产品的信息,包括产品的价格、介绍、上下架等。
- **功能管理**
管理平台所有功能点,支持功能的增删改查。
- **产品功能配置**
支持为每个产品配置可用的功能,实现产品与功能的灵活绑定。
## 8. 示例管理
- 管理产品的示例内容,支持为不同产品配置不同的示例,便于用户参考和体验。
## 9. 平台配置管理
- 用于管理平台的全局配置项,如站点信息、支付配置、第三方集成等。
## 10. 版本更新管理
- **版本发布**
管理平台版本更新,包括版本号、更新内容、发布时间等。
- **更新记录**
维护版本更新历史,支持查看历史版本信息和回滚操作。
- **强制更新**
配置版本强制更新策略,确保用户使用最新版本。
- **灰度发布**
支持新版本灰度发布,可控制更新推送比例和范围。
---
> 以上为后台管理面板的主要功能模块规划,后续可根据业务发展持续扩展和优化。

View File

@ -0,0 +1,108 @@
syntax = "v1"
info (
title: "后台功能管理服务"
desc: "后台功能管理相关接口"
author: "Liangzai"
email: "2440983361@qq.com"
version: "v1"
)
// 功能管理接口
@server(
prefix: /api/v1/admin/feature
group: admin_feature
)
service main {
// 创建功能
@handler AdminCreateFeature
post /create (AdminCreateFeatureReq) returns (AdminCreateFeatureResp)
// 更新功能
@handler AdminUpdateFeature
put /update/:id (AdminUpdateFeatureReq) returns (AdminUpdateFeatureResp)
// 删除功能
@handler AdminDeleteFeature
delete /delete/:id (AdminDeleteFeatureReq) returns (AdminDeleteFeatureResp)
// 获取功能列表
@handler AdminGetFeatureList
get /list (AdminGetFeatureListReq) returns (AdminGetFeatureListResp)
// 获取功能详情
@handler AdminGetFeatureDetail
get /detail/:id (AdminGetFeatureDetailReq) returns (AdminGetFeatureDetailResp)
}
type (
// 创建功能请求
AdminCreateFeatureReq {
ApiId string `json:"api_id"` // API标识
Name string `json:"name"` // 描述
}
// 创建功能响应
AdminCreateFeatureResp {
Id int64 `json:"id"` // 功能ID
}
// 更新功能请求
AdminUpdateFeatureReq {
Id int64 `path:"id"` // 功能ID
ApiId *string `json:"api_id,optional"` // API标识
Name *string `json:"name,optional"` // 描述
}
// 更新功能响应
AdminUpdateFeatureResp {
Success bool `json:"success"` // 是否成功
}
// 删除功能请求
AdminDeleteFeatureReq {
Id int64 `path:"id"` // 功能ID
}
// 删除功能响应
AdminDeleteFeatureResp {
Success bool `json:"success"` // 是否成功
}
// 获取功能列表请求
AdminGetFeatureListReq {
Page int64 `form:"page"` // 页码
PageSize int64 `form:"pageSize"` // 每页数量
ApiId *string `form:"api_id,optional"` // API标识
Name *string `form:"name,optional"` // 描述
}
// 功能列表项
FeatureListItem {
Id int64 `json:"id"` // 功能ID
ApiId string `json:"api_id"` // API标识
Name string `json:"name"` // 描述
CreateTime string `json:"create_time"` // 创建时间
UpdateTime string `json:"update_time"` // 更新时间
}
// 获取功能列表响应
AdminGetFeatureListResp {
Total int64 `json:"total"` // 总数
Items []FeatureListItem `json:"items"` // 列表数据
}
// 获取功能详情请求
AdminGetFeatureDetailReq {
Id int64 `path:"id"` // 功能ID
}
// 获取功能详情响应
AdminGetFeatureDetailResp {
Id int64 `json:"id"` // 功能ID
ApiId string `json:"api_id"` // API标识
Name string `json:"name"` // 描述
CreateTime string `json:"create_time"` // 创建时间
UpdateTime string `json:"update_time"` // 更新时间
}
)

View File

@ -0,0 +1,175 @@
syntax = "v1"
info (
title: "后台产品管理服务"
desc: "后台产品管理相关接口"
author: "Liangzai"
email: "2440983361@qq.com"
version: "v1"
)
// 产品管理接口
@server(
prefix: /api/v1/admin/product
group: admin_product
)
service main {
// 创建产品
@handler AdminCreateProduct
post /create (AdminCreateProductReq) returns (AdminCreateProductResp)
// 更新产品
@handler AdminUpdateProduct
put /update/:id (AdminUpdateProductReq) returns (AdminUpdateProductResp)
// 删除产品
@handler AdminDeleteProduct
delete /delete/:id (AdminDeleteProductReq) returns (AdminDeleteProductResp)
// 获取产品列表
@handler AdminGetProductList
get /list (AdminGetProductListReq) returns (AdminGetProductListResp)
// 获取产品详情
@handler AdminGetProductDetail
get /detail/:id (AdminGetProductDetailReq) returns (AdminGetProductDetailResp)
// 获取产品功能列表
@handler AdminGetProductFeatureList
get /feature/list/:product_id (AdminGetProductFeatureListReq) returns ([]AdminGetProductFeatureListResp)
// 更新产品功能关联(批量)
@handler AdminUpdateProductFeatures
put /feature/update/:product_id (AdminUpdateProductFeaturesReq) returns (AdminUpdateProductFeaturesResp)
}
type (
// 创建产品请求
AdminCreateProductReq {
ProductName string `json:"product_name"` // 服务名
ProductEn string `json:"product_en"` // 英文名
Description string `json:"description"` // 描述
Notes string `json:"notes,optional"` // 备注
CostPrice float64 `json:"cost_price"` // 成本
SellPrice float64 `json:"sell_price"` // 售价
}
// 创建产品响应
AdminCreateProductResp {
Id int64 `json:"id"` // 产品ID
}
// 更新产品请求
AdminUpdateProductReq {
Id int64 `path:"id"` // 产品ID
ProductName *string `json:"product_name,optional"` // 服务名
ProductEn *string `json:"product_en,optional"` // 英文名
Description *string `json:"description,optional"` // 描述
Notes *string `json:"notes,optional"` // 备注
CostPrice *float64 `json:"cost_price,optional"` // 成本
SellPrice *float64 `json:"sell_price,optional"` // 售价
}
// 更新产品响应
AdminUpdateProductResp {
Success bool `json:"success"` // 是否成功
}
// 删除产品请求
AdminDeleteProductReq {
Id int64 `path:"id"` // 产品ID
}
// 删除产品响应
AdminDeleteProductResp {
Success bool `json:"success"` // 是否成功
}
// 获取产品列表请求
AdminGetProductListReq {
Page int64 `form:"page"` // 页码
PageSize int64 `form:"pageSize"` // 每页数量
ProductName *string `form:"product_name,optional"` // 服务名
ProductEn *string `form:"product_en,optional"` // 英文名
}
// 产品列表项
ProductListItem {
Id int64 `json:"id"` // 产品ID
ProductName string `json:"product_name"` // 服务名
ProductEn string `json:"product_en"` // 英文名
Description string `json:"description"` // 描述
Notes string `json:"notes"` // 备注
CostPrice float64 `json:"cost_price"` // 成本
SellPrice float64 `json:"sell_price"` // 售价
CreateTime string `json:"create_time"` // 创建时间
UpdateTime string `json:"update_time"` // 更新时间
}
// 获取产品列表响应
AdminGetProductListResp {
Total int64 `json:"total"` // 总数
Items []ProductListItem `json:"items"` // 列表数据
}
// 获取产品详情请求
AdminGetProductDetailReq {
Id int64 `path:"id"` // 产品ID
}
// 获取产品详情响应
AdminGetProductDetailResp {
Id int64 `json:"id"` // 产品ID
ProductName string `json:"product_name"` // 服务名
ProductEn string `json:"product_en"` // 英文名
Description string `json:"description"` // 描述
Notes string `json:"notes"` // 备注
CostPrice float64 `json:"cost_price"` // 成本
SellPrice float64 `json:"sell_price"` // 售价
CreateTime string `json:"create_time"` // 创建时间
UpdateTime string `json:"update_time"` // 更新时间
}
// 获取产品功能列表请求
AdminGetProductFeatureListReq {
ProductId int64 `path:"product_id"` // 产品ID
}
// 获取产品功能列表响应Item
AdminGetProductFeatureListResp {
Id int64 `json:"id"` // 关联ID
ProductId int64 `json:"product_id"` // 产品ID
FeatureId int64 `json:"feature_id"` // 功能ID
ApiId string `json:"api_id"` // API标识
Name string `json:"name"` // 功能描述
Sort int64 `json:"sort"` // 排序
Enable int64 `json:"enable"` // 是否启用
IsImportant int64 `json:"is_important"` // 是否重要
CreateTime string `json:"create_time"` // 创建时间
UpdateTime string `json:"update_time"` // 更新时间
}
// // 获取产品功能列表响应
// AdminGetProductFeatureListResp {
// Items []ProductFeatureListItem `json:"items"` // 列表数据
// }
// 产品功能关联项
ProductFeatureItem {
FeatureId int64 `json:"feature_id"` // 功能ID
Sort int64 `json:"sort"` // 排序
Enable int64 `json:"enable"` // 是否启用
IsImportant int64 `json:"is_important"` // 是否重要
}
// 更新产品功能关联请求(批量)
AdminUpdateProductFeaturesReq {
ProductId int64 `path:"product_id"` // 产品ID
Features []ProductFeatureItem `json:"features"` // 功能列表
}
// 更新产品功能关联响应
AdminUpdateProductFeaturesResp {
Success bool `json:"success"` // 是否成功
}
)

View File

@ -1,8 +1,8 @@
syntax = "v1"
info (
title: "用户中心服务"
desc: "用户中心服务"
title: "后台用户中心服务"
desc: "后台用户中心服务"
author: "Liangzai"
email: "2440983361@qq.com"
version: "v1"
@ -51,12 +51,12 @@ type (
// 列表响应
AdminGetUserListResp {
Total int64 `json:"total"` // 总数
Items []UserListItem `json:"items"` // 列表
Total int64 `json:"total"` // 总数
Items []AdminUserListItem `json:"items"` // 列表
}
// 列表项
UserListItem {
AdminUserListItem {
Id int64 `json:"id"` // 用户ID
Username string `json:"username"` // 用户名
RealName string `json:"real_name"` // 真实姓名

View File

@ -0,0 +1,127 @@
syntax = "v1"
type (
// 创建通知请求
AdminCreateNotificationReq {
Title string `json:"title"` // 通知标题
NotificationPage string `json:"notification_page"` // 通知页面
Content string `json:"content"` // 通知内容
StartDate string `json:"start_date"` // 生效开始日期yyyy-MM-dd
StartTime string `json:"start_time"` // 生效开始时间HH:mm:ss
EndDate string `json:"end_date"` // 生效结束日期yyyy-MM-dd
EndTime string `json:"end_time"` // 生效结束时间HH:mm:ss
Status int64 `json:"status"` // 状态1-启用0-禁用
}
// 创建通知响应
AdminCreateNotificationResp {
Id int64 `json:"id"` // 通知ID
}
// 更新通知请求
AdminUpdateNotificationReq {
Id int64 `path:"id"` // 通知ID
Title *string `json:"title,optional"` // 通知标题
Content *string `json:"content,optional"` // 通知内容
NotificationPage *string `json:"notification_page,optional"` // 通知页面
StartDate *string `json:"start_date,optional"` // 生效开始日期
StartTime *string `json:"start_time,optional"` // 生效开始时间
EndDate *string `json:"end_date,optional"` // 生效结束日期
EndTime *string `json:"end_time,optional"` // 生效结束时间
Status *int64 `json:"status,optional"` // 状态
}
// 更新通知响应
AdminUpdateNotificationResp {
Success bool `json:"success"` // 是否成功
}
// 删除通知请求
AdminDeleteNotificationReq {
Id int64 `path:"id"` // 通知ID
}
// 删除通知响应
AdminDeleteNotificationResp {
Success bool `json:"success"` // 是否成功
}
// 获取通知详情请求
AdminGetNotificationDetailReq {
Id int64 `path:"id"` // 通知ID
}
// 获取通知详情响应
AdminGetNotificationDetailResp {
Id int64 `json:"id"` // 通知ID
Title string `json:"title"` // 通知标题
Content string `json:"content"` // 通知内容
NotificationPage string `json:"notification_page"` // 通知页面
StartDate string `json:"start_date"` // 生效开始日期
StartTime string `json:"start_time"` // 生效开始时间
EndDate string `json:"end_date"` // 生效结束日期
EndTime string `json:"end_time"` // 生效结束时间
Status int64 `json:"status"` // 状态
CreateTime string `json:"create_time"` // 创建时间
UpdateTime string `json:"update_time"` // 更新时间
}
// 获取通知列表请求
AdminGetNotificationListReq {
Page int64 `form:"page"` // 页码
PageSize int64 `form:"pageSize"` // 每页数量
Title *string `form:"title,optional"` // 通知标题(可选)
NotificationPage *string `form:"notification_page,optional"` // 通知页面(可选)
Status *int64 `form:"status,optional"` // 状态(可选)
StartDate *string `form:"start_date,optional"` // 开始日期范围(可选)
EndDate *string `form:"end_date,optional"` // 结束日期范围(可选)
}
// 通知列表项
NotificationListItem {
Id int64 `json:"id"` // 通知ID
Title string `json:"title"` // 通知标题
NotificationPage string `json:"notification_page"` // 通知页面
Content string `json:"content"` // 通知内容
StartDate string `json:"start_date"` // 生效开始日期
StartTime string `json:"start_time"` // 生效开始时间
EndDate string `json:"end_date"` // 生效结束日期
EndTime string `json:"end_time"` // 生效结束时间
Status int64 `json:"status"` // 状态
CreateTime string `json:"create_time"` // 创建时间
UpdateTime string `json:"update_time"` // 更新时间
}
// 获取通知列表响应
AdminGetNotificationListResp {
Total int64 `json:"total"` // 总数
Items []NotificationListItem `json:"items"` // 列表数据
}
)
// 通知管理接口
@server(
prefix: /api/v1/admin/notification
group: admin_notification
)
service main {
// 创建通知
@handler AdminCreateNotification
post /create (AdminCreateNotificationReq) returns (AdminCreateNotificationResp)
// 更新通知
@handler AdminUpdateNotification
put /update/:id (AdminUpdateNotificationReq) returns (AdminUpdateNotificationResp)
// 删除通知
@handler AdminDeleteNotification
delete /delete/:id (AdminDeleteNotificationReq) returns (AdminDeleteNotificationResp)
// 获取通知详情
@handler AdminGetNotificationDetail
get /detail/:id (AdminGetNotificationDetailReq) returns (AdminGetNotificationDetailResp)
// 获取通知列表
@handler AdminGetNotificationList
get /list (AdminGetNotificationListReq) returns (AdminGetNotificationListResp)
}

View File

@ -0,0 +1,167 @@
syntax = "v1"
info (
title: "订单服务"
desc: "订单服务"
author: "Liangzai"
email: "2440983361@qq.com"
version: "v1"
)
@server (
prefix: api/v1/admin/order
group: admin_order
jwt: JwtAuth
)
service main {
@doc "获取订单列表"
@handler AdminGetOrderList
get /list (AdminGetOrderListReq) returns (AdminGetOrderListResp)
@doc "获取订单详情"
@handler AdminGetOrderDetail
get /detail/:id (AdminGetOrderDetailReq) returns (AdminGetOrderDetailResp)
@doc "创建订单"
@handler AdminCreateOrder
post /create (AdminCreateOrderReq) returns (AdminCreateOrderResp)
@doc "更新订单"
@handler AdminUpdateOrder
put /update/:id (AdminUpdateOrderReq) returns (AdminUpdateOrderResp)
@doc "删除订单"
@handler AdminDeleteOrder
delete /delete/:id (AdminDeleteOrderReq) returns (AdminDeleteOrderResp)
@doc "订单退款"
@handler AdminRefundOrder
post /refund/:id (AdminRefundOrderReq) returns (AdminRefundOrderResp)
}
type (
// 列表请求
AdminGetOrderListReq {
Page int64 `form:"page,default=1"` // 页码
PageSize int64 `form:"pageSize,default=20"` // 每页数量
OrderNo string `form:"order_no,optional"` // 商户订单号
PlatformOrderId string `form:"platform_order_id,optional"` // 支付订单号
ProductName string `form:"product_name,optional"` // 产品名称
PaymentPlatform string `form:"payment_platform,optional"` // 支付方式
PaymentScene string `form:"payment_scene,optional"` // 支付平台
Amount float64 `form:"amount,optional"` // 金额
Status string `form:"status,optional"` // 支付状态pending-待支付paid-已支付refunded-已退款closed-已关闭failed-支付失败
IsPromotion int64 `form:"is_promotion,optional,default=-1"` // 是否推广订单0-否1-是
CreateTimeStart string `form:"create_time_start,optional"` // 创建时间开始
CreateTimeEnd string `form:"create_time_end,optional"` // 创建时间结束
PayTimeStart string `form:"pay_time_start,optional"` // 支付时间开始
PayTimeEnd string `form:"pay_time_end,optional"` // 支付时间结束
RefundTimeStart string `form:"refund_time_start,optional"` // 退款时间开始
RefundTimeEnd string `form:"refund_time_end,optional"` // 退款时间结束
}
// 列表响应
AdminGetOrderListResp {
Total int64 `json:"total"` // 总数
Items []OrderListItem `json:"items"` // 列表
}
// 列表项
OrderListItem {
Id int64 `json:"id"` // 订单ID
OrderNo string `json:"order_no"` // 商户订单号
PlatformOrderId string `json:"platform_order_id"` // 支付订单号
ProductName string `json:"product_name"` // 产品名称
PaymentPlatform string `json:"payment_platform"` // 支付方式
PaymentScene string `json:"payment_scene"` // 支付平台
Amount float64 `json:"amount"` // 金额
Status string `json:"status"` // 支付状态pending-待支付paid-已支付refunded-已退款closed-已关闭failed-支付失败
CreateTime string `json:"create_time"` // 创建时间
PayTime string `json:"pay_time"` // 支付时间
RefundTime string `json:"refund_time"` // 退款时间
IsPromotion int64 `json:"is_promotion"` // 是否推广订单0-否1-是
}
// 详情请求
AdminGetOrderDetailReq {
Id int64 `path:"id"` // 订单ID
}
// 详情响应
AdminGetOrderDetailResp {
Id int64 `json:"id"` // 订单ID
OrderNo string `json:"order_no"` // 商户订单号
PlatformOrderId string `json:"platform_order_id"` // 支付订单号
ProductName string `json:"product_name"` // 产品名称
PaymentPlatform string `json:"payment_platform"` // 支付方式
PaymentScene string `json:"payment_scene"` // 支付平台
Amount float64 `json:"amount"` // 金额
Status string `json:"status"` // 支付状态pending-待支付paid-已支付refunded-已退款closed-已关闭failed-支付失败
CreateTime string `json:"create_time"` // 创建时间
PayTime string `json:"pay_time"` // 支付时间
RefundTime string `json:"refund_time"` // 退款时间
IsPromotion int64 `json:"is_promotion"` // 是否推广订单0-否1-是
UpdateTime string `json:"update_time"` // 更新时间
}
// 创建请求
AdminCreateOrderReq {
OrderNo string `json:"order_no"` // 商户订单号
PlatformOrderId string `json:"platform_order_id"` // 支付订单号
ProductName string `json:"product_name"` // 产品名称
PaymentPlatform string `json:"payment_platform"` // 支付方式
PaymentScene string `json:"payment_scene"` // 支付平台
Amount float64 `json:"amount"` // 金额
Status string `json:"status,default=pending"` // 支付状态pending-待支付paid-已支付refunded-已退款closed-已关闭failed-支付失败
IsPromotion int64 `json:"is_promotion,default=0"` // 是否推广订单0-否1-是
}
// 创建响应
AdminCreateOrderResp {
Id int64 `json:"id"` // 订单ID
}
// 更新请求
AdminUpdateOrderReq {
Id int64 `path:"id"` // 订单ID
OrderNo *string `json:"order_no,optional"` // 商户订单号
PlatformOrderId *string `json:"platform_order_id,optional"` // 支付订单号
ProductName *string `json:"product_name,optional"` // 产品名称
PaymentPlatform *string `json:"payment_platform,optional"` // 支付方式
PaymentScene *string `json:"payment_scene,optional"` // 支付平台
Amount *float64 `json:"amount,optional"` // 金额
Status *string `json:"status,optional"` // 支付状态pending-待支付paid-已支付refunded-已退款closed-已关闭failed-支付失败
PayTime *string `json:"pay_time,optional"` // 支付时间
RefundTime *string `json:"refund_time,optional"` // 退款时间
IsPromotion *int64 `json:"is_promotion,optional"` // 是否推广订单0-否1-是
}
// 更新响应
AdminUpdateOrderResp {
Success bool `json:"success"` // 是否成功
}
// 删除请求
AdminDeleteOrderReq {
Id int64 `path:"id"` // 订单ID
}
// 删除响应
AdminDeleteOrderResp {
Success bool `json:"success"` // 是否成功
}
// 退款请求
AdminRefundOrderReq {
Id int64 `path:"id"` // 订单ID
RefundAmount float64 `json:"refund_amount"` // 退款金额
RefundReason string `json:"refund_reason"` // 退款原因
}
// 退款响应
AdminRefundOrderResp {
Status string `json:"status"` // 退款状态
RefundNo string `json:"refund_no"` // 退款单号
Amount float64 `json:"amount"` // 退款金额
}
)

View File

@ -0,0 +1,124 @@
syntax = "v1"
info (
title: "平台用户管理"
desc: "平台用户管理"
author: "Liangzai"
email: "2440983361@qq.com"
version: "v1"
)
// 平台用户管理接口
@server(
prefix: /api/v1/admin/platform_user
group: admin_platform_user
jwt: JwtAuth
)
service main {
// 创建平台用户
@handler AdminCreatePlatformUser
post /create (AdminCreatePlatformUserReq) returns (AdminCreatePlatformUserResp)
// 更新平台用户
@handler AdminUpdatePlatformUser
put /update/:id (AdminUpdatePlatformUserReq) returns (AdminUpdatePlatformUserResp)
// 删除平台用户
@handler AdminDeletePlatformUser
delete /delete/:id (AdminDeletePlatformUserReq) returns (AdminDeletePlatformUserResp)
// 获取平台用户分页列表
@handler AdminGetPlatformUserList
get /list (AdminGetPlatformUserListReq) returns (AdminGetPlatformUserListResp)
// 获取平台用户详情
@handler AdminGetPlatformUserDetail
get /detail/:id (AdminGetPlatformUserDetailReq) returns (AdminGetPlatformUserDetailResp)
}
type (
// 分页列表请求
AdminGetPlatformUserListReq {
Page int64 `form:"page,default=1"` // 页码
PageSize int64 `form:"pageSize,default=20"` // 每页数量
Mobile string `form:"mobile,optional"` // 手机号
Nickname string `form:"nickname,optional"` // 昵称
Inside int64 `form:"inside,optional"` // 是否内部用户 1-是 0-否
CreateTimeStart string `form:"create_time_start,optional"` // 创建时间开始
CreateTimeEnd string `form:"create_time_end,optional"` // 创建时间结束
OrderBy string `form:"order_by,optional"` // 排序字段
OrderType string `form:"order_type,optional"` // 排序类型
}
// 分页列表响应
AdminGetPlatformUserListResp {
Total int64 `json:"total"` // 总数
Items []PlatformUserListItem `json:"items"` // 列表
}
// 列表项
PlatformUserListItem {
Id int64 `json:"id"` // 用户ID
Mobile string `json:"mobile"` // 手机号
Nickname string `json:"nickname"` // 昵称
Info string `json:"info"` // 备注信息
Inside int64 `json:"inside"` // 是否内部用户 1-是 0-否
CreateTime string `json:"create_time"` // 创建时间
UpdateTime string `json:"update_time"` // 更新时间
}
// 详情请求
AdminGetPlatformUserDetailReq {
Id int64 `path:"id"` // 用户ID
}
// 详情响应
AdminGetPlatformUserDetailResp {
Id int64 `json:"id"` // 用户ID
Mobile string `json:"mobile"` // 手机号
Nickname string `json:"nickname"` // 昵称
Info string `json:"info"` // 备注信息
Inside int64 `json:"inside"` // 是否内部用户 1-是 0-否
CreateTime string `json:"create_time"` // 创建时间
UpdateTime string `json:"update_time"` // 更新时间
}
// 创建请求
AdminCreatePlatformUserReq {
Mobile string `json:"mobile"` // 手机号
Password string `json:"password"` // 密码
Nickname string `json:"nickname"` // 昵称
Info string `json:"info"` // 备注信息
Inside int64 `json:"inside"` // 是否内部用户 1-是 0-否
}
// 创建响应
AdminCreatePlatformUserResp {
Id int64 `json:"id"` // 用户ID
}
// 更新请求
AdminUpdatePlatformUserReq {
Id int64 `path:"id"` // 用户ID
Mobile *string `json:"mobile,optional"` // 手机号
Password *string `json:"password,optional"` // 密码
Nickname *string `json:"nickname,optional"` // 昵称
Info *string `json:"info,optional"` // 备注信息
Inside *int64 `json:"inside,optional"` // 是否内部用户 1-是 0-否
}
// 更新响应
AdminUpdatePlatformUserResp {
Success bool `json:"success"` // 是否成功
}
// 删除请求
AdminDeletePlatformUserReq {
Id int64 `path:"id"` // 用户ID
}
// 删除响应
AdminDeletePlatformUserResp {
Success bool `json:"success"` // 是否成功
}
)

View File

@ -13,7 +13,12 @@ import "./front/query.api"
import "./front/pay.api"
import "./front/product.api"
import "./admin/auth.api"
import "./admin/user.api"
import "./admin/menu.api"
import "./admin/role.api"
import "./admin/promotion.api"
import "./admin/order.api"
import "./admin/admin_user.api"
import "./admin/platform_user.api"
import "./admin/notification.api"
import "./admin/admin_product.api"
import "./admin/admin_feature.api"

View File

@ -32,6 +32,7 @@ TianjuConfig:
ApiKey: "479bcac2a77b56e976d044ff2bd996f4"
BaseURL: "https://apis.tianapi.com"
Alipay:
Enabled: true
AppID: "2021004161631930"
PrivateKey: "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCOh6r6Ce7ZgMf5mWqVsU8sYNdU0HRlZbgYUQ2wF65PzWU3vL52+LG89ATbtHeKUy6esuuaAyYhuDrqU9f6mUl5QJGsWCF6JqqyberVIMJfdsdOTbgooSSUBxIsMYfoRZPdsZ9dHomDxfi2oGWJdAnaruTxKw7W8EPJwqc9/vopzdxLsT8t/eMzr4jvHIBVHtkMbmgNJ8b05tqJ1FViK3Yt78YBkt3PLdyjLzqRuKlVpmNceBEhzNbg4menGBzpJHTWO4uGk0KzUgY7wCSfyjrA9IPyWnDqlhws+9LwFKgkNpqxmwGgMihLysDRFOD5D1VLfry/yYT22UrwAzXFQYUvAgMBAAECggEAfKGfXXMwG5sjwltnuyvHepvXzz9UeJHgz8qYeIHMl9WYC4wM1IWVDhAm62M8IIWqP3Ve1VapklTBl8PnGSfO+qr+dsC9zU1geBPrg6BYtxdrIkqNnWGDVbl1J5XMLMwih3nZS5j3UHXdjPxmrTH9p+7FHSm0mTiRXizLB0gdwk0E+H+btJKLpCvqqIoEucowzbjY/ch86ASojpQGZiWapbi+03Xke6/wlGCbNzgGmQQo/C6XAbxl2ZKJxS/yp0JxGfO6gPJYx3xkuf+Pwr0U3imN8yDB/xo0LVamoxQggWua+mQXt72J4zD2imIU7TB4JFJV3kUd+45KLOccOsOuCQKBgQDLfsBxU/LiNn+zW6yus+dCu7JzQSN2K57XF+PSXhQTSjIu4K4y8v4WZHdSwkAGQSU3MLq66QD7ELYHGDBakFFj3sX7z2CHshFlu2I/DYP+0LPVRlIblsSDFn6rYBLOPXc3VkuEFcA0PpO3vW6yF7h2d9OpGaiYmpTvXa/6oPLQfQKBgQCzTgxTTrzZjLXCv85fzX3aYu9ceP4N0jaOwveEMvKNClSomUIDfHLn4sUTmAvHBdJz4Xqy/7+v/YpI0ifC0KouX0t6h3+YA6n4hCvpBMlUVACtHUfx+mzjj+KLxEvmm6ZJCmV5DC3yYvaDTANafM3PzyQRs/jw5WPWywezFfooGwKBgQC4Fq9TFkWYHQNDJ0C9PqSL+y7BEwFYireED+maSl9Q4AMr4zfTgX0YlsRXSsEOp2paVivmoJixh3mUS26azwnCFir21LCXsSAJ7w0+yyRIpVa6LoZizO5zRCtNL3lzt6kcl2VzVRXubVnGk4kLdWf7TAVfaYXan6TyMcfcLDPdJQKBgCwtV6YS6T6kh4fjICLEi3SKGbVr7hRTrbOA3+EHeHE9kVw03mnjeKAfZDUOqiAwFAkPDd8aWg0vZ6nHdZpvNO7V9c/LoKlAhdlAH117G2uWgtAkPbyl2bw7kDKle5nm0ZJ/aD7pvExTC6+Pw+fAhijkPVvLPtODgRTD0zLRgF/vAoGBAMdxes5p7u+Eoa41c3Y39dGvY30QiiGPB4oWLTdmyh4VQfC7DU7ihUCRsk5w4i/BuTNNlJauWM2MMX7YeRBt6ncq59vBAU2OeLd6oRsOkE2ZkH7tNDnGxZuOZkiSFnYUQLMBPnVe4JkS7ZvRWSyuIi9SE8TDpTLbH1kfEmIMq4dR"
AlipayPublicKey: "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAomw6g4rBmCr/QoX3NI3DVLyDpkaUytZ2uFhdfQaegIDAuUfZfgpTCASlAtO82t8ISAbSOSyp9CUpwdGV4EYOiCBbLxMYB6taaHPiIjJ1zNT1EakJzWgU53hz1AVeABB9kdAvMqSvjH6KLoVupmqm4Li8ZwDW9M2ANAmyDfKgiF0Lt4aUUnaZktoCrTWTkpmtfRZCHNACj851IllvN2wyC4OL7dJq5UzOFxmn07Dy/2z4UAhaaSAyRVawpOui5AIYJTXZERLYL3KMyRnMuZoFq3xltzVTzRPM06nRa9RfeVNVwWVtGBIe/r8tcg5wyhI57KUszGNOmUIm/se6G2lnAQIDAQAB"
@ -39,6 +40,7 @@ Alipay:
NotifyUrl: "https://6m4685017o.goho.co/api/v1/pay/alipay/callback"
ReturnURL: "http://localhost:5678/inquire"
Wxpay:
Enabled: false
AppID: "wxba8424db4771cc18"
AppSecret: "89646203d7f76eb7aef0d926b9efffaa"
MchID: "1682635136"
@ -48,6 +50,7 @@ Wxpay:
NotifyUrl: "https://6m4685017o.goho.co/api/v1/pay/wechat/callback"
RefundNotifyUrl: "https://6m4685017o.goho.co/api/v1/wechat/refund_callback"
Applepay:
Enabled: false
ProductionVerifyURL: "https://api.storekit.itunes.apple.com/inApps/v1/transactions/receipt"
SandboxVerifyURL: "https://api.storekit-sandbox.itunes.apple.com/inApps/v1/transactions/receipt"
Sandbox: false
@ -65,3 +68,22 @@ AdminConfig:
RefreshAfter: 302400
AdminPromotion:
URLDomain: "https://tianyuancha.cn/p"
CleanTask:
Enabled: true
Time: "0 3 * * *"
Days: 15
Log:
ServiceName: "tyc-server"
Mode: "console"
Level: "info"
Encoding: "json"
Rotation: "daily"
TimeFormat: "2006-01-02T15:04:05.000Z07:00"
MaxSize: 3
Categories:
- "system" # 系统日志
- "access" # 访问日志
- "error" # 错误日志
- "stat" # 统计日志
- "business" # 业务日志
- "security" # 安全日志

View File

@ -34,6 +34,7 @@ TianjuConfig:
ApiKey: "479bcac2a77b56e976d044ff2bd996f4"
BaseURL: "https://apis.tianapi.com"
Alipay:
Enabled: true
AppID: "2021004161631930"
PrivateKey: "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCOh6r6Ce7ZgMf5mWqVsU8sYNdU0HRlZbgYUQ2wF65PzWU3vL52+LG89ATbtHeKUy6esuuaAyYhuDrqU9f6mUl5QJGsWCF6JqqyberVIMJfdsdOTbgooSSUBxIsMYfoRZPdsZ9dHomDxfi2oGWJdAnaruTxKw7W8EPJwqc9/vopzdxLsT8t/eMzr4jvHIBVHtkMbmgNJ8b05tqJ1FViK3Yt78YBkt3PLdyjLzqRuKlVpmNceBEhzNbg4menGBzpJHTWO4uGk0KzUgY7wCSfyjrA9IPyWnDqlhws+9LwFKgkNpqxmwGgMihLysDRFOD5D1VLfry/yYT22UrwAzXFQYUvAgMBAAECggEAfKGfXXMwG5sjwltnuyvHepvXzz9UeJHgz8qYeIHMl9WYC4wM1IWVDhAm62M8IIWqP3Ve1VapklTBl8PnGSfO+qr+dsC9zU1geBPrg6BYtxdrIkqNnWGDVbl1J5XMLMwih3nZS5j3UHXdjPxmrTH9p+7FHSm0mTiRXizLB0gdwk0E+H+btJKLpCvqqIoEucowzbjY/ch86ASojpQGZiWapbi+03Xke6/wlGCbNzgGmQQo/C6XAbxl2ZKJxS/yp0JxGfO6gPJYx3xkuf+Pwr0U3imN8yDB/xo0LVamoxQggWua+mQXt72J4zD2imIU7TB4JFJV3kUd+45KLOccOsOuCQKBgQDLfsBxU/LiNn+zW6yus+dCu7JzQSN2K57XF+PSXhQTSjIu4K4y8v4WZHdSwkAGQSU3MLq66QD7ELYHGDBakFFj3sX7z2CHshFlu2I/DYP+0LPVRlIblsSDFn6rYBLOPXc3VkuEFcA0PpO3vW6yF7h2d9OpGaiYmpTvXa/6oPLQfQKBgQCzTgxTTrzZjLXCv85fzX3aYu9ceP4N0jaOwveEMvKNClSomUIDfHLn4sUTmAvHBdJz4Xqy/7+v/YpI0ifC0KouX0t6h3+YA6n4hCvpBMlUVACtHUfx+mzjj+KLxEvmm6ZJCmV5DC3yYvaDTANafM3PzyQRs/jw5WPWywezFfooGwKBgQC4Fq9TFkWYHQNDJ0C9PqSL+y7BEwFYireED+maSl9Q4AMr4zfTgX0YlsRXSsEOp2paVivmoJixh3mUS26azwnCFir21LCXsSAJ7w0+yyRIpVa6LoZizO5zRCtNL3lzt6kcl2VzVRXubVnGk4kLdWf7TAVfaYXan6TyMcfcLDPdJQKBgCwtV6YS6T6kh4fjICLEi3SKGbVr7hRTrbOA3+EHeHE9kVw03mnjeKAfZDUOqiAwFAkPDd8aWg0vZ6nHdZpvNO7V9c/LoKlAhdlAH117G2uWgtAkPbyl2bw7kDKle5nm0ZJ/aD7pvExTC6+Pw+fAhijkPVvLPtODgRTD0zLRgF/vAoGBAMdxes5p7u+Eoa41c3Y39dGvY30QiiGPB4oWLTdmyh4VQfC7DU7ihUCRsk5w4i/BuTNNlJauWM2MMX7YeRBt6ncq59vBAU2OeLd6oRsOkE2ZkH7tNDnGxZuOZkiSFnYUQLMBPnVe4JkS7ZvRWSyuIi9SE8TDpTLbH1kfEmIMq4dR"
AlipayPublicKey: "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAomw6g4rBmCr/QoX3NI3DVLyDpkaUytZ2uFhdfQaegIDAuUfZfgpTCASlAtO82t8ISAbSOSyp9CUpwdGV4EYOiCBbLxMYB6taaHPiIjJ1zNT1EakJzWgU53hz1AVeABB9kdAvMqSvjH6KLoVupmqm4Li8ZwDW9M2ANAmyDfKgiF0Lt4aUUnaZktoCrTWTkpmtfRZCHNACj851IllvN2wyC4OL7dJq5UzOFxmn07Dy/2z4UAhaaSAyRVawpOui5AIYJTXZERLYL3KMyRnMuZoFq3xltzVTzRPM06nRa9RfeVNVwWVtGBIe/r8tcg5wyhI57KUszGNOmUIm/se6G2lnAQIDAQAB"
@ -41,6 +42,7 @@ Alipay:
NotifyUrl: "https://www.tianyuancha.cn/api/v1/pay/alipay/callback"
ReturnURL: "https://www.tianyuancha.cn/report"
Wxpay:
Enabled: true
AppID: "wxba8424db4771cc18"
AppSecret: "89646203d7f76eb7aef0d926b9efffaa"
MchID: "1682635136"
@ -50,9 +52,10 @@ Wxpay:
NotifyUrl: "https://www.tianyuancha.cn/api/v1/pay/wechat/callback"
RefundNotifyUrl: "https://www.tianyuancha.cn/api/v1/wechat/refund_callback"
Applepay:
Enabled: false
ProductionVerifyURL: "https://api.storekit.itunes.apple.com/inApps/v1/transactions/receipt"
SandboxVerifyURL: "https://api.storekit-sandbox.itunes.apple.com/inApps/v1/transactions/receipt"
Sandbox: true
Sandbox: false
BundleID: "com.allinone.check"
IssuerID: "bf828d85-5269-4914-9660-c066e09cd6ef"
KeyID: "LAY65829DQ"
@ -67,3 +70,25 @@ AdminConfig:
RefreshAfter: 302400
AdminPromotion:
URLDomain: "https://tianyuancha.cn/p"
CleanTask:
Enabled: true
Time: "0 3 * * *"
Days: 15
Log:
ServiceName: "tyc-server"
Mode: "file"
Path: "logs"
Level: "info"
Encoding: "json"
Rotation: "daily"
TimeFormat: "2006-01-02T15:04:05.000Z07:00"
MaxSize: 3
Categories:
- "system" # 系统日志
- "access" # 访问日志
- "error" # 错误日志
- "stat" # 统计日志
- "business" # 业务日志
- "security" # 安全日志

View File

@ -22,6 +22,7 @@ type Config struct {
SystemConfig SystemConfig
AdminConfig AdminConfig
AdminPromotion AdminPromotion
CleanTask CleanTask
}
// JwtAuth 用于 JWT 鉴权配置
@ -43,6 +44,7 @@ type Encrypt struct {
}
type AlipayConfig struct {
Enabled bool
AppID string
PrivateKey string
AlipayPublicKey string
@ -51,6 +53,7 @@ type AlipayConfig struct {
ReturnURL string
}
type WxpayConfig struct {
Enabled bool
AppID string
AppSecret string
MchID string
@ -64,6 +67,7 @@ type AliConfig struct {
Code string
}
type ApplepayConfig struct {
Enabled bool
ProductionVerifyURL string
SandboxVerifyURL string // 沙盒环境的验证 URL
Sandbox bool
@ -100,3 +104,8 @@ type AdminConfig struct {
type AdminPromotion struct {
URLDomain string
}
type CleanTask struct {
Enabled bool
Time string
Days int
}

View File

@ -0,0 +1,29 @@
package admin_feature
import (
"net/http"
"github.com/zeromicro/go-zero/rest/httpx"
"tyc-server/app/main/api/internal/logic/admin_feature"
"tyc-server/app/main/api/internal/svc"
"tyc-server/app/main/api/internal/types"
"tyc-server/common/result"
"tyc-server/pkg/lzkit/validator"
)
func AdminCreateFeatureHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.AdminCreateFeatureReq
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_feature.NewAdminCreateFeatureLogic(r.Context(), svcCtx)
resp, err := l.AdminCreateFeature(&req)
result.HttpResult(r, w, resp, err)
}
}

View File

@ -0,0 +1,29 @@
package admin_feature
import (
"net/http"
"github.com/zeromicro/go-zero/rest/httpx"
"tyc-server/app/main/api/internal/logic/admin_feature"
"tyc-server/app/main/api/internal/svc"
"tyc-server/app/main/api/internal/types"
"tyc-server/common/result"
"tyc-server/pkg/lzkit/validator"
)
func AdminDeleteFeatureHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.AdminDeleteFeatureReq
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_feature.NewAdminDeleteFeatureLogic(r.Context(), svcCtx)
resp, err := l.AdminDeleteFeature(&req)
result.HttpResult(r, w, resp, err)
}
}

View File

@ -0,0 +1,29 @@
package admin_feature
import (
"net/http"
"github.com/zeromicro/go-zero/rest/httpx"
"tyc-server/app/main/api/internal/logic/admin_feature"
"tyc-server/app/main/api/internal/svc"
"tyc-server/app/main/api/internal/types"
"tyc-server/common/result"
"tyc-server/pkg/lzkit/validator"
)
func AdminGetFeatureDetailHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.AdminGetFeatureDetailReq
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_feature.NewAdminGetFeatureDetailLogic(r.Context(), svcCtx)
resp, err := l.AdminGetFeatureDetail(&req)
result.HttpResult(r, w, resp, err)
}
}

View File

@ -0,0 +1,29 @@
package admin_feature
import (
"net/http"
"github.com/zeromicro/go-zero/rest/httpx"
"tyc-server/app/main/api/internal/logic/admin_feature"
"tyc-server/app/main/api/internal/svc"
"tyc-server/app/main/api/internal/types"
"tyc-server/common/result"
"tyc-server/pkg/lzkit/validator"
)
func AdminGetFeatureListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.AdminGetFeatureListReq
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_feature.NewAdminGetFeatureListLogic(r.Context(), svcCtx)
resp, err := l.AdminGetFeatureList(&req)
result.HttpResult(r, w, resp, err)
}
}

View File

@ -0,0 +1,29 @@
package admin_feature
import (
"net/http"
"github.com/zeromicro/go-zero/rest/httpx"
"tyc-server/app/main/api/internal/logic/admin_feature"
"tyc-server/app/main/api/internal/svc"
"tyc-server/app/main/api/internal/types"
"tyc-server/common/result"
"tyc-server/pkg/lzkit/validator"
)
func AdminUpdateFeatureHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.AdminUpdateFeatureReq
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_feature.NewAdminUpdateFeatureLogic(r.Context(), svcCtx)
resp, err := l.AdminUpdateFeature(&req)
result.HttpResult(r, w, resp, err)
}
}

View File

@ -0,0 +1,29 @@
package admin_notification
import (
"net/http"
"github.com/zeromicro/go-zero/rest/httpx"
"tyc-server/app/main/api/internal/logic/admin_notification"
"tyc-server/app/main/api/internal/svc"
"tyc-server/app/main/api/internal/types"
"tyc-server/common/result"
"tyc-server/pkg/lzkit/validator"
)
func AdminCreateNotificationHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.AdminCreateNotificationReq
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_notification.NewAdminCreateNotificationLogic(r.Context(), svcCtx)
resp, err := l.AdminCreateNotification(&req)
result.HttpResult(r, w, resp, err)
}
}

View File

@ -0,0 +1,29 @@
package admin_notification
import (
"net/http"
"github.com/zeromicro/go-zero/rest/httpx"
"tyc-server/app/main/api/internal/logic/admin_notification"
"tyc-server/app/main/api/internal/svc"
"tyc-server/app/main/api/internal/types"
"tyc-server/common/result"
"tyc-server/pkg/lzkit/validator"
)
func AdminDeleteNotificationHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.AdminDeleteNotificationReq
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_notification.NewAdminDeleteNotificationLogic(r.Context(), svcCtx)
resp, err := l.AdminDeleteNotification(&req)
result.HttpResult(r, w, resp, err)
}
}

View File

@ -0,0 +1,29 @@
package admin_notification
import (
"net/http"
"github.com/zeromicro/go-zero/rest/httpx"
"tyc-server/app/main/api/internal/logic/admin_notification"
"tyc-server/app/main/api/internal/svc"
"tyc-server/app/main/api/internal/types"
"tyc-server/common/result"
"tyc-server/pkg/lzkit/validator"
)
func AdminGetNotificationDetailHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.AdminGetNotificationDetailReq
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_notification.NewAdminGetNotificationDetailLogic(r.Context(), svcCtx)
resp, err := l.AdminGetNotificationDetail(&req)
result.HttpResult(r, w, resp, err)
}
}

View File

@ -0,0 +1,29 @@
package admin_notification
import (
"net/http"
"github.com/zeromicro/go-zero/rest/httpx"
"tyc-server/app/main/api/internal/logic/admin_notification"
"tyc-server/app/main/api/internal/svc"
"tyc-server/app/main/api/internal/types"
"tyc-server/common/result"
"tyc-server/pkg/lzkit/validator"
)
func AdminGetNotificationListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.AdminGetNotificationListReq
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_notification.NewAdminGetNotificationListLogic(r.Context(), svcCtx)
resp, err := l.AdminGetNotificationList(&req)
result.HttpResult(r, w, resp, err)
}
}

View File

@ -0,0 +1,29 @@
package admin_notification
import (
"net/http"
"github.com/zeromicro/go-zero/rest/httpx"
"tyc-server/app/main/api/internal/logic/admin_notification"
"tyc-server/app/main/api/internal/svc"
"tyc-server/app/main/api/internal/types"
"tyc-server/common/result"
"tyc-server/pkg/lzkit/validator"
)
func AdminUpdateNotificationHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.AdminUpdateNotificationReq
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_notification.NewAdminUpdateNotificationLogic(r.Context(), svcCtx)
resp, err := l.AdminUpdateNotification(&req)
result.HttpResult(r, w, resp, err)
}
}

View File

@ -0,0 +1,29 @@
package admin_order
import (
"net/http"
"github.com/zeromicro/go-zero/rest/httpx"
"tyc-server/app/main/api/internal/logic/admin_order"
"tyc-server/app/main/api/internal/svc"
"tyc-server/app/main/api/internal/types"
"tyc-server/common/result"
"tyc-server/pkg/lzkit/validator"
)
func AdminCreateOrderHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.AdminCreateOrderReq
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_order.NewAdminCreateOrderLogic(r.Context(), svcCtx)
resp, err := l.AdminCreateOrder(&req)
result.HttpResult(r, w, resp, err)
}
}

View File

@ -0,0 +1,29 @@
package admin_order
import (
"net/http"
"github.com/zeromicro/go-zero/rest/httpx"
"tyc-server/app/main/api/internal/logic/admin_order"
"tyc-server/app/main/api/internal/svc"
"tyc-server/app/main/api/internal/types"
"tyc-server/common/result"
"tyc-server/pkg/lzkit/validator"
)
func AdminDeleteOrderHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.AdminDeleteOrderReq
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_order.NewAdminDeleteOrderLogic(r.Context(), svcCtx)
resp, err := l.AdminDeleteOrder(&req)
result.HttpResult(r, w, resp, err)
}
}

View File

@ -0,0 +1,29 @@
package admin_order
import (
"net/http"
"github.com/zeromicro/go-zero/rest/httpx"
"tyc-server/app/main/api/internal/logic/admin_order"
"tyc-server/app/main/api/internal/svc"
"tyc-server/app/main/api/internal/types"
"tyc-server/common/result"
"tyc-server/pkg/lzkit/validator"
)
func AdminGetOrderDetailHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.AdminGetOrderDetailReq
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_order.NewAdminGetOrderDetailLogic(r.Context(), svcCtx)
resp, err := l.AdminGetOrderDetail(&req)
result.HttpResult(r, w, resp, err)
}
}

View File

@ -0,0 +1,29 @@
package admin_order
import (
"net/http"
"github.com/zeromicro/go-zero/rest/httpx"
"tyc-server/app/main/api/internal/logic/admin_order"
"tyc-server/app/main/api/internal/svc"
"tyc-server/app/main/api/internal/types"
"tyc-server/common/result"
"tyc-server/pkg/lzkit/validator"
)
func AdminGetOrderListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.AdminGetOrderListReq
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_order.NewAdminGetOrderListLogic(r.Context(), svcCtx)
resp, err := l.AdminGetOrderList(&req)
result.HttpResult(r, w, resp, err)
}
}

View File

@ -0,0 +1,29 @@
package admin_order
import (
"net/http"
"github.com/zeromicro/go-zero/rest/httpx"
"tyc-server/app/main/api/internal/logic/admin_order"
"tyc-server/app/main/api/internal/svc"
"tyc-server/app/main/api/internal/types"
"tyc-server/common/result"
"tyc-server/pkg/lzkit/validator"
)
func AdminRefundOrderHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.AdminRefundOrderReq
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_order.NewAdminRefundOrderLogic(r.Context(), svcCtx)
resp, err := l.AdminRefundOrder(&req)
result.HttpResult(r, w, resp, err)
}
}

View File

@ -0,0 +1,29 @@
package admin_order
import (
"net/http"
"github.com/zeromicro/go-zero/rest/httpx"
"tyc-server/app/main/api/internal/logic/admin_order"
"tyc-server/app/main/api/internal/svc"
"tyc-server/app/main/api/internal/types"
"tyc-server/common/result"
"tyc-server/pkg/lzkit/validator"
)
func AdminUpdateOrderHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.AdminUpdateOrderReq
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_order.NewAdminUpdateOrderLogic(r.Context(), svcCtx)
resp, err := l.AdminUpdateOrder(&req)
result.HttpResult(r, w, resp, err)
}
}

View File

@ -0,0 +1,29 @@
package admin_platform_user
import (
"net/http"
"github.com/zeromicro/go-zero/rest/httpx"
"tyc-server/app/main/api/internal/logic/admin_platform_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 AdminCreatePlatformUserHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.AdminCreatePlatformUserReq
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_platform_user.NewAdminCreatePlatformUserLogic(r.Context(), svcCtx)
resp, err := l.AdminCreatePlatformUser(&req)
result.HttpResult(r, w, resp, err)
}
}

View File

@ -0,0 +1,29 @@
package admin_platform_user
import (
"net/http"
"github.com/zeromicro/go-zero/rest/httpx"
"tyc-server/app/main/api/internal/logic/admin_platform_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 AdminDeletePlatformUserHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.AdminDeletePlatformUserReq
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_platform_user.NewAdminDeletePlatformUserLogic(r.Context(), svcCtx)
resp, err := l.AdminDeletePlatformUser(&req)
result.HttpResult(r, w, resp, err)
}
}

View File

@ -0,0 +1,29 @@
package admin_platform_user
import (
"net/http"
"github.com/zeromicro/go-zero/rest/httpx"
"tyc-server/app/main/api/internal/logic/admin_platform_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 AdminGetPlatformUserDetailHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.AdminGetPlatformUserDetailReq
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_platform_user.NewAdminGetPlatformUserDetailLogic(r.Context(), svcCtx)
resp, err := l.AdminGetPlatformUserDetail(&req)
result.HttpResult(r, w, resp, err)
}
}

View File

@ -0,0 +1,29 @@
package admin_platform_user
import (
"net/http"
"github.com/zeromicro/go-zero/rest/httpx"
"tyc-server/app/main/api/internal/logic/admin_platform_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 AdminGetPlatformUserListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.AdminGetPlatformUserListReq
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_platform_user.NewAdminGetPlatformUserListLogic(r.Context(), svcCtx)
resp, err := l.AdminGetPlatformUserList(&req)
result.HttpResult(r, w, resp, err)
}
}

View File

@ -0,0 +1,29 @@
package admin_platform_user
import (
"net/http"
"github.com/zeromicro/go-zero/rest/httpx"
"tyc-server/app/main/api/internal/logic/admin_platform_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 AdminUpdatePlatformUserHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.AdminUpdatePlatformUserReq
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_platform_user.NewAdminUpdatePlatformUserLogic(r.Context(), svcCtx)
resp, err := l.AdminUpdatePlatformUser(&req)
result.HttpResult(r, w, resp, err)
}
}

View File

@ -0,0 +1,29 @@
package admin_product
import (
"net/http"
"github.com/zeromicro/go-zero/rest/httpx"
"tyc-server/app/main/api/internal/logic/admin_product"
"tyc-server/app/main/api/internal/svc"
"tyc-server/app/main/api/internal/types"
"tyc-server/common/result"
"tyc-server/pkg/lzkit/validator"
)
func AdminCreateProductHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.AdminCreateProductReq
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_product.NewAdminCreateProductLogic(r.Context(), svcCtx)
resp, err := l.AdminCreateProduct(&req)
result.HttpResult(r, w, resp, err)
}
}

View File

@ -0,0 +1,29 @@
package admin_product
import (
"net/http"
"github.com/zeromicro/go-zero/rest/httpx"
"tyc-server/app/main/api/internal/logic/admin_product"
"tyc-server/app/main/api/internal/svc"
"tyc-server/app/main/api/internal/types"
"tyc-server/common/result"
"tyc-server/pkg/lzkit/validator"
)
func AdminDeleteProductHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.AdminDeleteProductReq
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_product.NewAdminDeleteProductLogic(r.Context(), svcCtx)
resp, err := l.AdminDeleteProduct(&req)
result.HttpResult(r, w, resp, err)
}
}

View File

@ -0,0 +1,29 @@
package admin_product
import (
"net/http"
"github.com/zeromicro/go-zero/rest/httpx"
"tyc-server/app/main/api/internal/logic/admin_product"
"tyc-server/app/main/api/internal/svc"
"tyc-server/app/main/api/internal/types"
"tyc-server/common/result"
"tyc-server/pkg/lzkit/validator"
)
func AdminGetProductDetailHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.AdminGetProductDetailReq
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_product.NewAdminGetProductDetailLogic(r.Context(), svcCtx)
resp, err := l.AdminGetProductDetail(&req)
result.HttpResult(r, w, resp, err)
}
}

View File

@ -0,0 +1,29 @@
package admin_product
import (
"net/http"
"github.com/zeromicro/go-zero/rest/httpx"
"tyc-server/app/main/api/internal/logic/admin_product"
"tyc-server/app/main/api/internal/svc"
"tyc-server/app/main/api/internal/types"
"tyc-server/common/result"
"tyc-server/pkg/lzkit/validator"
)
func AdminGetProductFeatureListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.AdminGetProductFeatureListReq
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_product.NewAdminGetProductFeatureListLogic(r.Context(), svcCtx)
resp, err := l.AdminGetProductFeatureList(&req)
result.HttpResult(r, w, resp, err)
}
}

View File

@ -0,0 +1,29 @@
package admin_product
import (
"net/http"
"github.com/zeromicro/go-zero/rest/httpx"
"tyc-server/app/main/api/internal/logic/admin_product"
"tyc-server/app/main/api/internal/svc"
"tyc-server/app/main/api/internal/types"
"tyc-server/common/result"
"tyc-server/pkg/lzkit/validator"
)
func AdminGetProductListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.AdminGetProductListReq
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_product.NewAdminGetProductListLogic(r.Context(), svcCtx)
resp, err := l.AdminGetProductList(&req)
result.HttpResult(r, w, resp, err)
}
}

View File

@ -0,0 +1,29 @@
package admin_product
import (
"net/http"
"github.com/zeromicro/go-zero/rest/httpx"
"tyc-server/app/main/api/internal/logic/admin_product"
"tyc-server/app/main/api/internal/svc"
"tyc-server/app/main/api/internal/types"
"tyc-server/common/result"
"tyc-server/pkg/lzkit/validator"
)
func AdminUpdateProductFeaturesHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.AdminUpdateProductFeaturesReq
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_product.NewAdminUpdateProductFeaturesLogic(r.Context(), svcCtx)
resp, err := l.AdminUpdateProductFeatures(&req)
result.HttpResult(r, w, resp, err)
}
}

View File

@ -0,0 +1,29 @@
package admin_product
import (
"net/http"
"github.com/zeromicro/go-zero/rest/httpx"
"tyc-server/app/main/api/internal/logic/admin_product"
"tyc-server/app/main/api/internal/svc"
"tyc-server/app/main/api/internal/types"
"tyc-server/common/result"
"tyc-server/pkg/lzkit/validator"
)
func AdminUpdateProductHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.AdminUpdateProductReq
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_product.NewAdminUpdateProductLogic(r.Context(), svcCtx)
resp, err := l.AdminUpdateProduct(&req)
result.HttpResult(r, w, resp, err)
}
}

View File

@ -5,7 +5,12 @@ import (
"net/http"
admin_auth "tyc-server/app/main/api/internal/handler/admin_auth"
admin_feature "tyc-server/app/main/api/internal/handler/admin_feature"
admin_menu "tyc-server/app/main/api/internal/handler/admin_menu"
admin_notification "tyc-server/app/main/api/internal/handler/admin_notification"
admin_order "tyc-server/app/main/api/internal/handler/admin_order"
admin_platform_user "tyc-server/app/main/api/internal/handler/admin_platform_user"
admin_product "tyc-server/app/main/api/internal/handler/admin_product"
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"
@ -33,6 +38,37 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
rest.WithPrefix("/api/v1/admin/auth"),
)
server.AddRoutes(
[]rest.Route{
{
Method: http.MethodPost,
Path: "/create",
Handler: admin_feature.AdminCreateFeatureHandler(serverCtx),
},
{
Method: http.MethodDelete,
Path: "/delete/:id",
Handler: admin_feature.AdminDeleteFeatureHandler(serverCtx),
},
{
Method: http.MethodGet,
Path: "/detail/:id",
Handler: admin_feature.AdminGetFeatureDetailHandler(serverCtx),
},
{
Method: http.MethodGet,
Path: "/list",
Handler: admin_feature.AdminGetFeatureListHandler(serverCtx),
},
{
Method: http.MethodPut,
Path: "/update/:id",
Handler: admin_feature.AdminUpdateFeatureHandler(serverCtx),
},
},
rest.WithPrefix("/api/v1/admin/feature"),
)
server.AddRoutes(
[]rest.Route{
{
@ -76,6 +112,153 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
rest.WithPrefix("/api/v1/admin/menu"),
)
server.AddRoutes(
[]rest.Route{
{
Method: http.MethodPost,
Path: "/create",
Handler: admin_notification.AdminCreateNotificationHandler(serverCtx),
},
{
Method: http.MethodDelete,
Path: "/delete/:id",
Handler: admin_notification.AdminDeleteNotificationHandler(serverCtx),
},
{
Method: http.MethodGet,
Path: "/detail/:id",
Handler: admin_notification.AdminGetNotificationDetailHandler(serverCtx),
},
{
Method: http.MethodGet,
Path: "/list",
Handler: admin_notification.AdminGetNotificationListHandler(serverCtx),
},
{
Method: http.MethodPut,
Path: "/update/:id",
Handler: admin_notification.AdminUpdateNotificationHandler(serverCtx),
},
},
rest.WithPrefix("/api/v1/admin/notification"),
)
server.AddRoutes(
[]rest.Route{
{
// 创建订单
Method: http.MethodPost,
Path: "/create",
Handler: admin_order.AdminCreateOrderHandler(serverCtx),
},
{
// 删除订单
Method: http.MethodDelete,
Path: "/delete/:id",
Handler: admin_order.AdminDeleteOrderHandler(serverCtx),
},
{
// 获取订单详情
Method: http.MethodGet,
Path: "/detail/:id",
Handler: admin_order.AdminGetOrderDetailHandler(serverCtx),
},
{
// 获取订单列表
Method: http.MethodGet,
Path: "/list",
Handler: admin_order.AdminGetOrderListHandler(serverCtx),
},
{
// 订单退款
Method: http.MethodPost,
Path: "/refund/:id",
Handler: admin_order.AdminRefundOrderHandler(serverCtx),
},
{
// 更新订单
Method: http.MethodPut,
Path: "/update/:id",
Handler: admin_order.AdminUpdateOrderHandler(serverCtx),
},
},
rest.WithJwt(serverCtx.Config.JwtAuth.AccessSecret),
rest.WithPrefix("/api/v1/admin/order"),
)
server.AddRoutes(
[]rest.Route{
{
Method: http.MethodPost,
Path: "/create",
Handler: admin_platform_user.AdminCreatePlatformUserHandler(serverCtx),
},
{
Method: http.MethodDelete,
Path: "/delete/:id",
Handler: admin_platform_user.AdminDeletePlatformUserHandler(serverCtx),
},
{
Method: http.MethodGet,
Path: "/detail/:id",
Handler: admin_platform_user.AdminGetPlatformUserDetailHandler(serverCtx),
},
{
Method: http.MethodGet,
Path: "/list",
Handler: admin_platform_user.AdminGetPlatformUserListHandler(serverCtx),
},
{
Method: http.MethodPut,
Path: "/update/:id",
Handler: admin_platform_user.AdminUpdatePlatformUserHandler(serverCtx),
},
},
rest.WithJwt(serverCtx.Config.JwtAuth.AccessSecret),
rest.WithPrefix("/api/v1/admin/platform_user"),
)
server.AddRoutes(
[]rest.Route{
{
Method: http.MethodPost,
Path: "/create",
Handler: admin_product.AdminCreateProductHandler(serverCtx),
},
{
Method: http.MethodDelete,
Path: "/delete/:id",
Handler: admin_product.AdminDeleteProductHandler(serverCtx),
},
{
Method: http.MethodGet,
Path: "/detail/:id",
Handler: admin_product.AdminGetProductDetailHandler(serverCtx),
},
{
Method: http.MethodGet,
Path: "/feature/list/:product_id",
Handler: admin_product.AdminGetProductFeatureListHandler(serverCtx),
},
{
Method: http.MethodPut,
Path: "/feature/update/:product_id",
Handler: admin_product.AdminUpdateProductFeaturesHandler(serverCtx),
},
{
Method: http.MethodGet,
Path: "/list",
Handler: admin_product.AdminGetProductListHandler(serverCtx),
},
{
Method: http.MethodPut,
Path: "/update/:id",
Handler: admin_product.AdminUpdateProductHandler(serverCtx),
},
},
rest.WithPrefix("/api/v1/admin/product"),
)
server.AddRoutes(
[]rest.Route{
{

View File

@ -0,0 +1,45 @@
package admin_feature
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"
)
type AdminCreateFeatureLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewAdminCreateFeatureLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminCreateFeatureLogic {
return &AdminCreateFeatureLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *AdminCreateFeatureLogic) AdminCreateFeature(req *types.AdminCreateFeatureReq) (resp *types.AdminCreateFeatureResp, err error) {
// 1. 数据转换
data := &model.Feature{
ApiId: req.ApiId,
Name: req.Name,
}
// 2. 数据库操作
result, err := l.svcCtx.FeatureModel.Insert(l.ctx, nil, data)
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR),
"创建功能失败, err: %v, req: %+v", err, req)
}
// 3. 返回结果
id, _ := result.LastInsertId()
return &types.AdminCreateFeatureResp{Id: id}, nil
}

View File

@ -0,0 +1,44 @@
package admin_feature
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"
)
type AdminDeleteFeatureLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewAdminDeleteFeatureLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminDeleteFeatureLogic {
return &AdminDeleteFeatureLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *AdminDeleteFeatureLogic) AdminDeleteFeature(req *types.AdminDeleteFeatureReq) (resp *types.AdminDeleteFeatureResp, err error) {
// 1. 查询记录是否存在
record, err := l.svcCtx.FeatureModel.FindOne(l.ctx, req.Id)
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR),
"查找功能失败, err: %v, id: %d", err, req.Id)
}
// 2. 执行软删除
err = l.svcCtx.FeatureModel.DeleteSoft(l.ctx, nil, record)
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR),
"删除功能失败, err: %v, id: %d", err, req.Id)
}
// 3. 返回结果
return &types.AdminDeleteFeatureResp{Success: true}, nil
}

View File

@ -0,0 +1,45 @@
package admin_feature
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"
)
type AdminGetFeatureDetailLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewAdminGetFeatureDetailLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminGetFeatureDetailLogic {
return &AdminGetFeatureDetailLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *AdminGetFeatureDetailLogic) AdminGetFeatureDetail(req *types.AdminGetFeatureDetailReq) (resp *types.AdminGetFeatureDetailResp, err error) {
// 1. 查询记录
record, err := l.svcCtx.FeatureModel.FindOne(l.ctx, req.Id)
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR),
"查找功能失败, err: %v, id: %d", err, req.Id)
}
// 2. 构建响应
resp = &types.AdminGetFeatureDetailResp{
Id: record.Id,
ApiId: record.ApiId,
Name: record.Name,
CreateTime: record.CreateTime.Format("2006-01-02 15:04:05"),
UpdateTime: record.UpdateTime.Format("2006-01-02 15:04:05"),
}
return resp, nil
}

View File

@ -0,0 +1,65 @@
package admin_feature
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"
)
type AdminGetFeatureListLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewAdminGetFeatureListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminGetFeatureListLogic {
return &AdminGetFeatureListLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *AdminGetFeatureListLogic) AdminGetFeatureList(req *types.AdminGetFeatureListReq) (resp *types.AdminGetFeatureListResp, err error) {
// 1. 构建查询条件
builder := l.svcCtx.FeatureModel.SelectBuilder()
// 2. 添加查询条件
if req.ApiId != nil && *req.ApiId != "" {
builder = builder.Where("api_id LIKE ?", "%"+*req.ApiId+"%")
}
if req.Name != nil && *req.Name != "" {
builder = builder.Where("name LIKE ?", "%"+*req.Name+"%")
}
// 3. 执行分页查询
list, total, err := l.svcCtx.FeatureModel.FindPageListByPageWithTotal(
l.ctx, builder, req.Page, req.PageSize, "id DESC")
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR),
"查询功能列表失败, err: %v, req: %+v", err, req)
}
// 4. 构建响应列表
items := make([]types.FeatureListItem, 0, len(list))
for _, item := range list {
listItem := types.FeatureListItem{
Id: item.Id,
ApiId: item.ApiId,
Name: item.Name,
CreateTime: item.CreateTime.Format("2006-01-02 15:04:05"),
UpdateTime: item.UpdateTime.Format("2006-01-02 15:04:05"),
}
items = append(items, listItem)
}
// 5. 返回结果
return &types.AdminGetFeatureListResp{
Total: total,
Items: items,
}, nil
}

View File

@ -0,0 +1,30 @@
package admin_feature
import (
"context"
"tyc-server/app/main/api/internal/svc"
"tyc-server/app/main/api/internal/types"
"github.com/zeromicro/go-zero/core/logx"
)
type AdminUpdateFeatureLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewAdminUpdateFeatureLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminUpdateFeatureLogic {
return &AdminUpdateFeatureLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *AdminUpdateFeatureLogic) AdminUpdateFeature(req *types.AdminUpdateFeatureReq) (resp *types.AdminUpdateFeatureResp, err error) {
// todo: add your logic here and delete this line
return
}

View File

@ -0,0 +1,49 @@
package admin_notification
import (
"context"
"database/sql"
"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 AdminCreateNotificationLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewAdminCreateNotificationLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminCreateNotificationLogic {
return &AdminCreateNotificationLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *AdminCreateNotificationLogic) AdminCreateNotification(req *types.AdminCreateNotificationReq) (resp *types.AdminCreateNotificationResp, err error) {
startDate, _ := time.Parse("2006-01-02", req.StartDate)
endDate, _ := time.Parse("2006-01-02", req.EndDate)
data := &model.GlobalNotifications{
Title: req.Title,
Content: req.Content,
NotificationPage: req.NotificationPage,
StartDate: sql.NullTime{Time: startDate, Valid: req.StartDate != ""},
EndDate: sql.NullTime{Time: endDate, Valid: req.EndDate != ""},
StartTime: req.StartTime,
EndTime: req.EndTime,
Status: req.Status,
}
result, err := l.svcCtx.GlobalNotificationsModel.Insert(l.ctx, nil, data)
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "创建通知失败, err: %v, req: %+v", err, req)
}
id, _ := result.LastInsertId()
return &types.AdminCreateNotificationResp{Id: id}, nil
}

View File

@ -0,0 +1,38 @@
package admin_notification
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"
)
type AdminDeleteNotificationLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewAdminDeleteNotificationLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminDeleteNotificationLogic {
return &AdminDeleteNotificationLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *AdminDeleteNotificationLogic) AdminDeleteNotification(req *types.AdminDeleteNotificationReq) (resp *types.AdminDeleteNotificationResp, err error) {
notification, err := l.svcCtx.GlobalNotificationsModel.FindOne(l.ctx, req.Id)
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查找通知失败, err: %v, id: %d", err, req.Id)
}
err = l.svcCtx.GlobalNotificationsModel.DeleteSoft(l.ctx, nil, notification)
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "删除通知失败, err: %v, id: %d", err, req.Id)
}
return &types.AdminDeleteNotificationResp{Success: true}, nil
}

View File

@ -0,0 +1,53 @@
package admin_notification
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"
)
type AdminGetNotificationDetailLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewAdminGetNotificationDetailLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminGetNotificationDetailLogic {
return &AdminGetNotificationDetailLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *AdminGetNotificationDetailLogic) AdminGetNotificationDetail(req *types.AdminGetNotificationDetailReq) (resp *types.AdminGetNotificationDetailResp, err error) {
notification, err := l.svcCtx.GlobalNotificationsModel.FindOne(l.ctx, req.Id)
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查找通知失败, err: %v, id: %d", err, req.Id)
}
resp = &types.AdminGetNotificationDetailResp{
Id: notification.Id,
Title: notification.Title,
Content: notification.Content,
NotificationPage: notification.NotificationPage,
StartDate: "",
StartTime: notification.StartTime,
EndDate: "",
EndTime: notification.EndTime,
Status: notification.Status,
CreateTime: notification.CreateTime.Format("2006-01-02 15:04:05"),
UpdateTime: notification.UpdateTime.Format("2006-01-02 15:04:05"),
}
if notification.StartDate.Valid {
resp.StartDate = notification.StartDate.Time.Format("2006-01-02")
}
if notification.EndDate.Valid {
resp.EndDate = notification.EndDate.Time.Format("2006-01-02")
}
return resp, nil
}

View File

@ -0,0 +1,83 @@
package admin_notification
import (
"context"
"tyc-server/app/main/api/internal/svc"
"tyc-server/app/main/api/internal/types"
"tyc-server/common/xerr"
"time"
"github.com/pkg/errors"
"github.com/zeromicro/go-zero/core/logx"
)
type AdminGetNotificationListLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewAdminGetNotificationListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminGetNotificationListLogic {
return &AdminGetNotificationListLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *AdminGetNotificationListLogic) AdminGetNotificationList(req *types.AdminGetNotificationListReq) (resp *types.AdminGetNotificationListResp, err error) {
builder := l.svcCtx.GlobalNotificationsModel.SelectBuilder()
if req.Title != nil {
builder = builder.Where("title LIKE ?", "%"+*req.Title+"%")
}
if req.NotificationPage != nil {
builder = builder.Where("notification_page = ?", *req.NotificationPage)
}
if req.Status != nil {
builder = builder.Where("status = ?", *req.Status)
}
if req.StartDate != nil {
if t, err := time.Parse("2006-01-02", *req.StartDate); err == nil {
builder = builder.Where("start_date >= ?", t)
}
}
if req.EndDate != nil {
if t, err := time.Parse("2006-01-02", *req.EndDate); err == nil {
builder = builder.Where("end_date <= ?", t)
}
}
list, total, err := l.svcCtx.GlobalNotificationsModel.FindPageListByPageWithTotal(l.ctx, builder, req.Page, req.PageSize, "id DESC")
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询通知列表失败, err: %v, req: %+v", err, req)
}
items := make([]types.NotificationListItem, 0, len(list))
for _, n := range list {
item := types.NotificationListItem{
Id: n.Id,
Title: n.Title,
NotificationPage: n.NotificationPage,
Content: n.Content,
StartDate: "",
StartTime: n.StartTime,
EndDate: "",
EndTime: n.EndTime,
Status: n.Status,
CreateTime: n.CreateTime.Format("2006-01-02 15:04:05"),
UpdateTime: n.UpdateTime.Format("2006-01-02 15:04:05"),
}
if n.StartDate.Valid {
item.StartDate = n.StartDate.Time.Format("2006-01-02")
}
if n.EndDate.Valid {
item.EndDate = n.EndDate.Time.Format("2006-01-02")
}
items = append(items, item)
}
resp = &types.AdminGetNotificationListResp{
Total: total,
Items: items,
}
return resp, nil
}

View File

@ -0,0 +1,65 @@
package admin_notification
import (
"context"
"database/sql"
"time"
"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 AdminUpdateNotificationLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewAdminUpdateNotificationLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminUpdateNotificationLogic {
return &AdminUpdateNotificationLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *AdminUpdateNotificationLogic) AdminUpdateNotification(req *types.AdminUpdateNotificationReq) (resp *types.AdminUpdateNotificationResp, err error) {
notification, err := l.svcCtx.GlobalNotificationsModel.FindOne(l.ctx, req.Id)
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查找通知失败, err: %v, id: %d", err, req.Id)
}
if req.StartDate != nil {
startDate, _ := time.Parse("2006-01-02", *req.StartDate)
notification.StartDate = sql.NullTime{Time: startDate, Valid: true}
}
if req.EndDate != nil {
endDate, _ := time.Parse("2006-01-02", *req.EndDate)
notification.EndDate = sql.NullTime{Time: endDate, Valid: true}
}
if req.Title != nil {
notification.Title = *req.Title
}
if req.Content != nil {
notification.Content = *req.Content
}
if req.NotificationPage != nil {
notification.NotificationPage = *req.NotificationPage
}
if req.StartTime != nil {
notification.StartTime = *req.StartTime
}
if req.EndTime != nil {
notification.EndTime = *req.EndTime
}
if req.Status != nil {
notification.Status = *req.Status
}
_, err = l.svcCtx.GlobalNotificationsModel.Update(l.ctx, nil, notification)
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "更新通知失败, err: %v, req: %+v", err, req)
}
return &types.AdminUpdateNotificationResp{Success: true}, nil
}

View File

@ -0,0 +1,99 @@
package admin_order
import (
"context"
"database/sql"
"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 AdminCreateOrderLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewAdminCreateOrderLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminCreateOrderLogic {
return &AdminCreateOrderLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *AdminCreateOrderLogic) AdminCreateOrder(req *types.AdminCreateOrderReq) (resp *types.AdminCreateOrderResp, err error) {
// 生成订单号
orderNo := fmt.Sprintf("%dADMIN", time.Now().UnixNano())
// 根据产品名称查询产品ID
builder := l.svcCtx.ProductModel.SelectBuilder()
builder = builder.Where("product_name = ? AND del_state = ?", req.ProductName, 0)
products, err := l.svcCtx.ProductModel.FindAll(l.ctx, builder, "")
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "AdminCreateOrder, 查询产品失败 err: %v", err)
}
if len(products) == 0 {
return nil, errors.Wrapf(xerr.NewErrMsg(fmt.Sprintf("产品不存在: %s", req.ProductName)), "AdminCreateOrder, 查询产品失败 err: %v", err)
}
product := products[0]
// 创建订单对象
order := &model.Order{
OrderNo: orderNo,
PlatformOrderId: sql.NullString{String: req.PlatformOrderId, Valid: req.PlatformOrderId != ""},
ProductId: product.Id,
PaymentPlatform: req.PaymentPlatform,
PaymentScene: req.PaymentScene,
Amount: req.Amount,
Status: req.Status,
}
// 使用事务处理订单创建
var orderId int64
err = l.svcCtx.OrderModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error {
// 插入订单
result, err := l.svcCtx.OrderModel.Insert(ctx, session, order)
if err != nil {
return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "AdminCreateOrder, 创建订单失败 err: %v", err)
}
// 获取订单ID
orderId, err = result.LastInsertId()
if err != nil {
return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "AdminCreateOrder, 获取订单ID失败 err: %v", err)
}
// 如果是推广订单,创建推广订单记录
if req.IsPromotion == 1 {
promotionOrder := &model.AdminPromotionOrder{
OrderId: orderId,
Version: 1,
CreateTime: time.Now(),
UpdateTime: time.Now(),
}
_, err = l.svcCtx.AdminPromotionOrderModel.Insert(ctx, session, promotionOrder)
if err != nil {
return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "AdminCreateOrder, 创建推广订单失败 err: %v", err)
}
}
return nil
})
if err != nil {
return nil, err
}
return &types.AdminCreateOrderResp{
Id: orderId,
}, nil
}

View File

@ -0,0 +1,63 @@
package admin_order
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 AdminDeleteOrderLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewAdminDeleteOrderLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminDeleteOrderLogic {
return &AdminDeleteOrderLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *AdminDeleteOrderLogic) AdminDeleteOrder(req *types.AdminDeleteOrderReq) (resp *types.AdminDeleteOrderResp, err error) {
// 获取订单信息
order, err := l.svcCtx.OrderModel.FindOne(l.ctx, req.Id)
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "AdminDeleteOrder, 查询订单失败 err: %v", err)
}
// 使用事务删除订单
err = l.svcCtx.OrderModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error {
// 软删除订单
err := l.svcCtx.OrderModel.DeleteSoft(ctx, session, order)
if err != nil {
return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "AdminDeleteOrder, 删除订单失败 err: %v", err)
}
// 删除关联的推广订单记录
promotionOrder, err := l.svcCtx.AdminPromotionOrderModel.FindOneByOrderId(ctx, order.Id)
if err == nil && promotionOrder != nil {
err = l.svcCtx.AdminPromotionOrderModel.DeleteSoft(ctx, session, promotionOrder)
if err != nil {
return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "AdminDeleteOrder, 删除推广订单失败 err: %v", err)
}
}
return nil
})
if err != nil {
return nil, err
}
return &types.AdminDeleteOrderResp{
Success: true,
}, nil
}

View File

@ -0,0 +1,72 @@
package admin_order
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"
)
type AdminGetOrderDetailLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewAdminGetOrderDetailLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminGetOrderDetailLogic {
return &AdminGetOrderDetailLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *AdminGetOrderDetailLogic) AdminGetOrderDetail(req *types.AdminGetOrderDetailReq) (resp *types.AdminGetOrderDetailResp, err error) {
// 获取订单信息
order, err := l.svcCtx.OrderModel.FindOne(l.ctx, req.Id)
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "AdminGetOrderDetail, 查询订单失败 err: %v", err)
}
// 获取产品信息
product, err := l.svcCtx.ProductModel.FindOne(l.ctx, order.ProductId)
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "AdminGetOrderDetail, 查询产品失败 err: %v", err)
}
// 判断是否为推广订单
var isPromotion int64
promotionOrder, err := l.svcCtx.AdminPromotionOrderModel.FindOneByOrderId(l.ctx, order.Id)
if err == nil && promotionOrder != nil {
isPromotion = 1
}
// 构建响应
resp = &types.AdminGetOrderDetailResp{
Id: order.Id,
OrderNo: order.OrderNo,
PlatformOrderId: order.PlatformOrderId.String,
ProductName: product.ProductName,
PaymentPlatform: order.PaymentPlatform,
PaymentScene: order.PaymentScene,
Amount: order.Amount,
Status: order.Status,
CreateTime: order.CreateTime.Format("2006-01-02 15:04:05"),
UpdateTime: order.UpdateTime.Format("2006-01-02 15:04:05"),
IsPromotion: isPromotion,
}
// 处理可选字段
if order.PayTime.Valid {
resp.PayTime = order.PayTime.Time.Format("2006-01-02 15:04:05")
}
if order.RefundTime.Valid {
resp.RefundTime = order.RefundTime.Time.Format("2006-01-02 15:04:05")
}
return resp, nil
}

View File

@ -0,0 +1,159 @@
package admin_order
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/zeromicro/go-zero/core/logx"
"github.com/zeromicro/go-zero/core/mr"
)
type AdminGetOrderListLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewAdminGetOrderListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminGetOrderListLogic {
return &AdminGetOrderListLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *AdminGetOrderListLogic) AdminGetOrderList(req *types.AdminGetOrderListReq) (resp *types.AdminGetOrderListResp, err error) {
// 构建查询条件
builder := l.svcCtx.OrderModel.SelectBuilder()
if req.OrderNo != "" {
builder = builder.Where("order_no = ?", req.OrderNo)
}
if req.PlatformOrderId != "" {
builder = builder.Where("platform_order_id = ?", req.PlatformOrderId)
}
if req.ProductName != "" {
builder = builder.Where("product_id IN (SELECT id FROM product WHERE product_name LIKE ?)", "%"+req.ProductName+"%")
}
if req.PaymentPlatform != "" {
builder = builder.Where("payment_platform = ?", req.PaymentPlatform)
}
if req.PaymentScene != "" {
builder = builder.Where("payment_scene = ?", req.PaymentScene)
}
if req.Amount > 0 {
builder = builder.Where("amount = ?", req.Amount)
}
if req.Status != "" {
builder = builder.Where("status = ?", req.Status)
}
if req.IsPromotion != -1 {
builder = builder.Where("id IN (SELECT order_id FROM admin_promotion_order WHERE del_state = 0)")
}
// 时间范围查询
if req.CreateTimeStart != "" {
builder = builder.Where("create_time >= ?", req.CreateTimeStart)
}
if req.CreateTimeEnd != "" {
builder = builder.Where("create_time <= ?", req.CreateTimeEnd)
}
if req.PayTimeStart != "" {
builder = builder.Where("pay_time >= ?", req.PayTimeStart)
}
if req.PayTimeEnd != "" {
builder = builder.Where("pay_time <= ?", req.PayTimeEnd)
}
if req.RefundTimeStart != "" {
builder = builder.Where("refund_time >= ?", req.RefundTimeStart)
}
if req.RefundTimeEnd != "" {
builder = builder.Where("refund_time <= ?", req.RefundTimeEnd)
}
// 并发获取总数和列表
var total int64
var orders []*model.Order
err = mr.Finish(func() error {
var err error
total, err = l.svcCtx.OrderModel.FindCount(l.ctx, builder, "id")
if err != nil {
return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "AdminGetOrderList, 查询订单总数失败 err: %v", err)
}
return nil
}, func() error {
var err error
orders, err = l.svcCtx.OrderModel.FindPageListByPage(l.ctx, builder, req.Page, req.PageSize, "id DESC")
if err != nil {
return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "AdminGetOrderList, 查询订单列表失败 err: %v", err)
}
return nil
})
if err != nil {
return nil, err
}
// 并发获取产品信息
productMap := make(map[int64]string)
var mu sync.Mutex
err = mr.MapReduceVoid(func(source chan<- interface{}) {
for _, order := range orders {
source <- order.ProductId
}
}, func(item interface{}, writer mr.Writer[struct{}], cancel func(error)) {
productId := item.(int64)
product, err := l.svcCtx.ProductModel.FindOne(l.ctx, productId)
if err != nil {
cancel(errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "AdminGetOrderList, 查询产品信息失败 err: %v", err))
return
}
mu.Lock()
productMap[product.Id] = product.ProductName
mu.Unlock()
writer.Write(struct{}{})
}, func(pipe <-chan struct{}, cancel func(error)) {
for range pipe {
}
})
if err != nil {
return nil, err
}
// 构建响应
resp = &types.AdminGetOrderListResp{
Total: total,
Items: make([]types.OrderListItem, 0, len(orders)),
}
for _, order := range orders {
item := types.OrderListItem{
Id: order.Id,
OrderNo: order.OrderNo,
PlatformOrderId: order.PlatformOrderId.String,
ProductName: productMap[order.ProductId],
PaymentPlatform: order.PaymentPlatform,
PaymentScene: order.PaymentScene,
Amount: order.Amount,
Status: order.Status,
CreateTime: order.CreateTime.Format("2006-01-02 15:04:05"),
}
if order.PayTime.Valid {
item.PayTime = order.PayTime.Time.Format("2006-01-02 15:04:05")
}
if order.RefundTime.Valid {
item.RefundTime = order.RefundTime.Time.Format("2006-01-02 15:04:05")
}
// 判断是否为推广订单
promotionOrder, err := l.svcCtx.AdminPromotionOrderModel.FindOneByOrderId(l.ctx, order.Id)
if err == nil && promotionOrder != nil {
item.IsPromotion = 1
}
resp.Items = append(resp.Items, item)
}
return resp, nil
}

View File

@ -0,0 +1,60 @@
package admin_order
import (
"context"
"tyc-server/app/main/api/internal/service"
"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 AdminRefundOrderLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewAdminRefundOrderLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminRefundOrderLogic {
return &AdminRefundOrderLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *AdminRefundOrderLogic) AdminRefundOrder(req *types.AdminRefundOrderReq) (resp *types.AdminRefundOrderResp, err error) {
// 获取订单信息
order, err := l.svcCtx.OrderModel.FindOne(l.ctx, req.Id)
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "AdminRefundOrder, 查询订单失败 err: %v", err)
}
// 检查订单状态
if order.Status != "paid" {
return nil, errors.Wrapf(xerr.NewErrMsg("订单状态不正确,无法退款"), "AdminRefundOrder, 订单状态不正确,无法退款 err: %v", err)
}
// 检查退款金额
if req.RefundAmount > order.Amount {
return nil, errors.Wrapf(xerr.NewErrMsg("退款金额不能大于订单金额"), "AdminRefundOrder, 退款金额不能大于订单金额 err: %v", err)
}
refundResp, err := l.svcCtx.PayService.Refund(l.ctx, &service.RefundRequest{
OrderId: order.Id,
RefundAmount: req.RefundAmount,
Reason: req.RefundReason,
})
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "AdminRefundOrder, 退款失败 err: %v", err)
}
return &types.AdminRefundOrderResp{
Status: refundResp.Status,
RefundNo: refundResp.RefundNo,
Amount: refundResp.Amount,
}, nil
}

View File

@ -0,0 +1,113 @@
package admin_order
import (
"context"
"database/sql"
"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 AdminUpdateOrderLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewAdminUpdateOrderLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminUpdateOrderLogic {
return &AdminUpdateOrderLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *AdminUpdateOrderLogic) AdminUpdateOrder(req *types.AdminUpdateOrderReq) (resp *types.AdminUpdateOrderResp, err error) {
// 获取原订单信息
order, err := l.svcCtx.OrderModel.FindOne(l.ctx, req.Id)
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "AdminUpdateOrder, 查询订单失败 err: %v", err)
}
// 更新订单字段
if req.OrderNo != nil {
order.OrderNo = *req.OrderNo
}
if req.PlatformOrderId != nil {
order.PlatformOrderId = sql.NullString{String: *req.PlatformOrderId, Valid: true}
}
if req.PaymentPlatform != nil {
order.PaymentPlatform = *req.PaymentPlatform
}
if req.PaymentScene != nil {
order.PaymentScene = *req.PaymentScene
}
if req.Amount != nil {
order.Amount = *req.Amount
}
if req.Status != nil {
order.Status = *req.Status
}
if req.PayTime != nil {
payTime, err := time.Parse("2006-01-02 15:04:05", *req.PayTime)
if err == nil {
order.PayTime = sql.NullTime{Time: payTime, Valid: true}
}
}
if req.RefundTime != nil {
refundTime, err := time.Parse("2006-01-02 15:04:05", *req.RefundTime)
if err == nil {
order.RefundTime = sql.NullTime{Time: refundTime, Valid: true}
}
}
// 使用事务更新订单
err = l.svcCtx.OrderModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error {
// 更新订单
_, err := l.svcCtx.OrderModel.Update(ctx, session, order)
if err != nil {
return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "AdminUpdateOrder, 更新订单失败 err: %v", err)
}
// 处理推广订单状态
if req.IsPromotion != nil {
promotionOrder, err := l.svcCtx.AdminPromotionOrderModel.FindOneByOrderId(ctx, order.Id)
if err == nil && promotionOrder != nil {
// 如果存在推广订单记录但不需要推广,则删除
if *req.IsPromotion == 0 {
err = l.svcCtx.AdminPromotionOrderModel.DeleteSoft(ctx, session, promotionOrder)
if err != nil {
return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "AdminUpdateOrder, 删除推广订单失败 err: %v", err)
}
}
} else if *req.IsPromotion == 1 {
// 如果需要推广但不存在记录,则创建
newPromotionOrder := &model.AdminPromotionOrder{
OrderId: order.Id,
Version: 1,
}
_, err = l.svcCtx.AdminPromotionOrderModel.Insert(ctx, session, newPromotionOrder)
if err != nil {
return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "AdminUpdateOrder, 创建推广订单失败 err: %v", err)
}
}
}
return nil
})
if err != nil {
return nil, err
}
return &types.AdminUpdateOrderResp{
Success: true,
}, nil
}

View File

@ -0,0 +1,57 @@
package admin_platform_user
import (
"context"
"database/sql"
"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 AdminCreatePlatformUserLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewAdminCreatePlatformUserLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminCreatePlatformUserLogic {
return &AdminCreatePlatformUserLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *AdminCreatePlatformUserLogic) AdminCreatePlatformUser(req *types.AdminCreatePlatformUserReq) (resp *types.AdminCreatePlatformUserResp, err error) {
// 校验手机号唯一性
_, err = l.svcCtx.UserModel.FindOneByMobile(l.ctx, req.Mobile)
if err == nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "手机号已存在: %s", req.Mobile)
}
if err != model.ErrNotFound {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询手机号失败: %v", err)
}
user := &model.User{
Mobile: req.Mobile,
Password: sql.NullString{String: req.Password, Valid: req.Password != ""},
Nickname: sql.NullString{String: req.Nickname, Valid: req.Nickname != ""},
Info: req.Info,
Inside: req.Inside,
}
result, err := l.svcCtx.UserModel.Insert(l.ctx, nil, user)
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "创建用户失败: %v", err)
}
id, err := result.LastInsertId()
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取用户ID失败: %v", err)
}
resp = &types.AdminCreatePlatformUserResp{Id: id}
return resp, nil
}

View File

@ -0,0 +1,44 @@
package admin_platform_user
import (
"context"
"tyc-server/app/main/api/internal/svc"
"tyc-server/app/main/api/internal/types"
"time"
"tyc-server/common/xerr"
"github.com/pkg/errors"
"github.com/zeromicro/go-zero/core/logx"
)
type AdminDeletePlatformUserLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewAdminDeletePlatformUserLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminDeletePlatformUserLogic {
return &AdminDeletePlatformUserLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *AdminDeletePlatformUserLogic) AdminDeletePlatformUser(req *types.AdminDeletePlatformUserReq) (resp *types.AdminDeletePlatformUserResp, err error) {
user, err := l.svcCtx.UserModel.FindOne(l.ctx, req.Id)
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "用户不存在: %d, err: %v", req.Id, err)
}
user.DelState = 1
user.DeleteTime.Time = time.Now()
user.DeleteTime.Valid = true
err = l.svcCtx.UserModel.DeleteSoft(l.ctx, nil, user)
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "软删除用户失败: %v", err)
}
resp = &types.AdminDeletePlatformUserResp{Success: true}
return resp, nil
}

View File

@ -0,0 +1,54 @@
package admin_platform_user
import (
"context"
"tyc-server/app/main/api/internal/svc"
"tyc-server/app/main/api/internal/types"
"tyc-server/pkg/lzkit/crypto"
"tyc-server/common/xerr"
"github.com/pkg/errors"
"github.com/zeromicro/go-zero/core/logx"
)
type AdminGetPlatformUserDetailLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewAdminGetPlatformUserDetailLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminGetPlatformUserDetailLogic {
return &AdminGetPlatformUserDetailLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *AdminGetPlatformUserDetailLogic) AdminGetPlatformUserDetail(req *types.AdminGetPlatformUserDetailReq) (resp *types.AdminGetPlatformUserDetailResp, err error) {
user, err := l.svcCtx.UserModel.FindOne(l.ctx, req.Id)
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "用户不存在: %d, err: %v", req.Id, err)
}
key := l.svcCtx.Config.Encrypt.SecretKey
DecryptMobile, err := crypto.DecryptMobile(user.Mobile, key)
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "解密手机号失败: %v", err)
}
// 查询平台类型取第一个user_auth
resp = &types.AdminGetPlatformUserDetailResp{
Id: user.Id,
Mobile: DecryptMobile,
Nickname: "",
Info: user.Info,
Inside: user.Inside,
CreateTime: user.CreateTime.Format("2006-01-02 15:04:05"),
UpdateTime: user.UpdateTime.Format("2006-01-02 15:04:05"),
}
if user.Nickname.Valid {
resp.Nickname = user.Nickname.String
}
return resp, nil
}

View File

@ -0,0 +1,88 @@
package admin_platform_user
import (
"context"
"fmt"
"tyc-server/app/main/api/internal/svc"
"tyc-server/app/main/api/internal/types"
"tyc-server/pkg/lzkit/crypto"
"tyc-server/common/xerr"
"github.com/pkg/errors"
"github.com/zeromicro/go-zero/core/logx"
)
type AdminGetPlatformUserListLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewAdminGetPlatformUserListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminGetPlatformUserListLogic {
return &AdminGetPlatformUserListLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *AdminGetPlatformUserListLogic) AdminGetPlatformUserList(req *types.AdminGetPlatformUserListReq) (resp *types.AdminGetPlatformUserListResp, err error) {
builder := l.svcCtx.UserModel.SelectBuilder()
if req.Mobile != "" {
builder = builder.Where("mobile = ?", req.Mobile)
}
if req.Nickname != "" {
builder = builder.Where("nickname = ?", req.Nickname)
}
if req.Inside != 0 {
builder = builder.Where("inside = ?", req.Inside)
}
if req.CreateTimeStart != "" {
builder = builder.Where("create_time >= ?", req.CreateTimeStart)
}
if req.CreateTimeEnd != "" {
builder = builder.Where("create_time <= ?", req.CreateTimeEnd)
}
orderBy := "id DESC"
if req.OrderBy != "" && req.OrderType != "" {
orderBy = fmt.Sprintf("%s %s", req.OrderBy, req.OrderType)
}
users, total, err := l.svcCtx.UserModel.FindPageListByPageWithTotal(l.ctx, builder, req.Page, req.PageSize, orderBy)
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询用户分页失败: %v", err)
}
var items []types.PlatformUserListItem
secretKey := l.svcCtx.Config.Encrypt.SecretKey
for _, user := range users {
mobile := user.Mobile
if mobile != "" {
encryptedMobile, err := crypto.DecryptMobile(mobile, secretKey)
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "手机登录, 解密手机号失败: %+v", err)
}
mobile = encryptedMobile
}
itemData := types.PlatformUserListItem{
Id: user.Id,
Mobile: mobile,
Nickname: "",
Info: user.Info,
Inside: user.Inside,
CreateTime: user.CreateTime.Format("2006-01-02 15:04:05"),
UpdateTime: user.UpdateTime.Format("2006-01-02 15:04:05"),
}
if user.Nickname.Valid {
itemData.Nickname = user.Nickname.String
}
items = append(items, itemData)
}
resp = &types.AdminGetPlatformUserListResp{
Total: total,
Items: items,
}
return resp, nil
}

View File

@ -0,0 +1,64 @@
package admin_platform_user
import (
"context"
"database/sql"
"tyc-server/app/main/api/internal/svc"
"tyc-server/app/main/api/internal/types"
"tyc-server/common/xerr"
"tyc-server/pkg/lzkit/crypto"
"github.com/pkg/errors"
"github.com/zeromicro/go-zero/core/logx"
)
type AdminUpdatePlatformUserLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewAdminUpdatePlatformUserLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminUpdatePlatformUserLogic {
return &AdminUpdatePlatformUserLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *AdminUpdatePlatformUserLogic) AdminUpdatePlatformUser(req *types.AdminUpdatePlatformUserReq) (resp *types.AdminUpdatePlatformUserResp, err error) {
user, err := l.svcCtx.UserModel.FindOne(l.ctx, req.Id)
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "用户不存在: %d, err: %v", req.Id, err)
}
if req.Mobile != nil {
key := l.svcCtx.Config.Encrypt.SecretKey
EncryptMobile, err := crypto.EncryptMobile(*req.Mobile, key)
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "加密手机号失败: %v", err)
}
user.Mobile = EncryptMobile
}
if req.Nickname != nil {
user.Nickname = sql.NullString{String: *req.Nickname, Valid: *req.Nickname != ""}
}
if req.Info != nil {
user.Info = *req.Info
}
if req.Inside != nil {
if *req.Inside != 1 && *req.Inside != 0 {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "内部用户状态错误: %d", *req.Inside)
}
user.Inside = *req.Inside
}
if req.Password != nil {
user.Password = sql.NullString{String: *req.Password, Valid: *req.Password != ""}
}
_, err = l.svcCtx.UserModel.Update(l.ctx, nil, user)
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "更新用户失败: %v", err)
}
resp = &types.AdminUpdatePlatformUserResp{Success: true}
return resp, nil
}

View File

@ -0,0 +1,50 @@
package admin_product
import (
"context"
"database/sql"
"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 AdminCreateProductLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewAdminCreateProductLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminCreateProductLogic {
return &AdminCreateProductLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *AdminCreateProductLogic) AdminCreateProduct(req *types.AdminCreateProductReq) (resp *types.AdminCreateProductResp, err error) {
// 1. 数据转换
data := &model.Product{
ProductName: req.ProductName,
ProductEn: req.ProductEn,
Description: req.Description,
Notes: sql.NullString{String: req.Notes, Valid: req.Notes != ""},
CostPrice: req.CostPrice,
SellPrice: req.SellPrice,
}
// 2. 数据库操作
result, err := l.svcCtx.ProductModel.Insert(l.ctx, nil, data)
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR),
"创建产品失败, err: %v, req: %+v", err, req)
}
// 3. 返回结果
id, _ := result.LastInsertId()
return &types.AdminCreateProductResp{Id: id}, nil
}

View File

@ -0,0 +1,44 @@
package admin_product
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"
)
type AdminDeleteProductLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewAdminDeleteProductLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminDeleteProductLogic {
return &AdminDeleteProductLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *AdminDeleteProductLogic) AdminDeleteProduct(req *types.AdminDeleteProductReq) (resp *types.AdminDeleteProductResp, err error) {
// 1. 查询记录是否存在
record, err := l.svcCtx.ProductModel.FindOne(l.ctx, req.Id)
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR),
"查找产品失败, err: %v, id: %d", err, req.Id)
}
// 2. 执行软删除
err = l.svcCtx.ProductModel.DeleteSoft(l.ctx, nil, record)
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR),
"删除产品失败, err: %v, id: %d", err, req.Id)
}
// 3. 返回结果
return &types.AdminDeleteProductResp{Success: true}, nil
}

View File

@ -0,0 +1,49 @@
package admin_product
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"
)
type AdminGetProductDetailLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewAdminGetProductDetailLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminGetProductDetailLogic {
return &AdminGetProductDetailLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *AdminGetProductDetailLogic) AdminGetProductDetail(req *types.AdminGetProductDetailReq) (resp *types.AdminGetProductDetailResp, err error) {
// 1. 查询记录
record, err := l.svcCtx.ProductModel.FindOne(l.ctx, req.Id)
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR),
"查找产品失败, err: %v, id: %d", err, req.Id)
}
// 2. 构建响应
resp = &types.AdminGetProductDetailResp{
Id: record.Id,
ProductName: record.ProductName,
ProductEn: record.ProductEn,
Description: record.Description,
Notes: record.Notes.String,
CostPrice: record.CostPrice,
SellPrice: record.SellPrice,
CreateTime: record.CreateTime.Format("2006-01-02 15:04:05"),
UpdateTime: record.UpdateTime.Format("2006-01-02 15:04:05"),
}
return resp, nil
}

View File

@ -0,0 +1,119 @@
package admin_product
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/mr"
)
type AdminGetProductFeatureListLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewAdminGetProductFeatureListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminGetProductFeatureListLogic {
return &AdminGetProductFeatureListLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *AdminGetProductFeatureListLogic) AdminGetProductFeatureList(req *types.AdminGetProductFeatureListReq) (resp *[]types.AdminGetProductFeatureListResp, err error) {
// 1. 构建查询条件
builder := l.svcCtx.ProductFeatureModel.SelectBuilder().
Where("product_id = ?", req.ProductId)
// 2. 执行查询
list, err := l.svcCtx.ProductFeatureModel.FindAll(l.ctx, builder, "sort ASC")
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR),
"查询产品功能列表失败, err: %v, product_id: %d", err, req.ProductId)
}
// 3. 获取所有功能ID
featureIds := make([]int64, 0, len(list))
for _, item := range list {
featureIds = append(featureIds, item.FeatureId)
}
// 4. 并发查询功能详情
type featureResult struct {
feature *model.Feature
err error
}
results := make([]featureResult, len(featureIds))
err = mr.MapReduceVoid(func(source chan<- interface{}) {
for i, id := range featureIds {
source <- struct {
index int
id int64
}{i, id}
}
}, func(item interface{}, writer mr.Writer[featureResult], cancel func(error)) {
data := item.(struct {
index int
id int64
})
feature, err := l.svcCtx.FeatureModel.FindOne(l.ctx, data.id)
writer.Write(featureResult{
feature: feature,
err: err,
})
}, func(pipe <-chan featureResult, cancel func(error)) {
for result := range pipe {
if result.err != nil {
l.Logger.Errorf("查询功能详情失败, feature_id: %d, err: %v", result.feature.Id, result.err)
continue
}
results = append(results, result)
}
})
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR),
"并发查询功能详情失败, err: %v", err)
}
// 5. 构建功能ID到详情的映射
featureMap := make(map[int64]*model.Feature)
for _, result := range results {
if result.feature != nil {
featureMap[result.feature.Id] = result.feature
}
}
// 6. 构建响应列表
items := make([]types.AdminGetProductFeatureListResp, 0, len(list))
for _, item := range list {
feature, exists := featureMap[item.FeatureId]
if !exists {
continue // 跳过不存在的功能
}
listItem := types.AdminGetProductFeatureListResp{
Id: item.Id,
ProductId: item.ProductId,
FeatureId: item.FeatureId,
ApiId: feature.ApiId,
Name: feature.Name,
Sort: item.Sort,
Enable: item.Enable,
IsImportant: item.IsImportant,
CreateTime: item.CreateTime.Format("2006-01-02 15:04:05"),
UpdateTime: item.UpdateTime.Format("2006-01-02 15:04:05"),
}
items = append(items, listItem)
}
// 7. 返回结果
return &items, nil
}

View File

@ -0,0 +1,69 @@
package admin_product
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"
)
type AdminGetProductListLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewAdminGetProductListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminGetProductListLogic {
return &AdminGetProductListLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *AdminGetProductListLogic) AdminGetProductList(req *types.AdminGetProductListReq) (resp *types.AdminGetProductListResp, err error) {
// 1. 构建查询条件
builder := l.svcCtx.ProductModel.SelectBuilder()
// 2. 添加查询条件
if req.ProductName != nil && *req.ProductName != "" {
builder = builder.Where("product_name LIKE ?", "%"+*req.ProductName+"%")
}
if req.ProductEn != nil && *req.ProductEn != "" {
builder = builder.Where("product_en LIKE ?", "%"+*req.ProductEn+"%")
}
// 3. 执行分页查询
list, total, err := l.svcCtx.ProductModel.FindPageListByPageWithTotal(
l.ctx, builder, req.Page, req.PageSize, "id DESC")
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR),
"查询产品列表失败, err: %v, req: %+v", err, req)
}
// 4. 构建响应列表
items := make([]types.ProductListItem, 0, len(list))
for _, item := range list {
listItem := types.ProductListItem{
Id: item.Id,
ProductName: item.ProductName,
ProductEn: item.ProductEn,
Description: item.Description,
Notes: item.Notes.String,
CostPrice: item.CostPrice,
SellPrice: item.SellPrice,
CreateTime: item.CreateTime.Format("2006-01-02 15:04:05"),
UpdateTime: item.UpdateTime.Format("2006-01-02 15:04:05"),
}
items = append(items, listItem)
}
// 5. 返回结果
return &types.AdminGetProductListResp{
Total: total,
Items: items,
}, nil
}

View File

@ -0,0 +1,159 @@
package admin_product
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/zeromicro/go-zero/core/logx"
"github.com/zeromicro/go-zero/core/mr"
"github.com/zeromicro/go-zero/core/stores/sqlx"
)
type AdminUpdateProductFeaturesLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewAdminUpdateProductFeaturesLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminUpdateProductFeaturesLogic {
return &AdminUpdateProductFeaturesLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *AdminUpdateProductFeaturesLogic) AdminUpdateProductFeatures(req *types.AdminUpdateProductFeaturesReq) (resp *types.AdminUpdateProductFeaturesResp, err error) {
// 1. 查询现有关联
builder := l.svcCtx.ProductFeatureModel.SelectBuilder().
Where("product_id = ?", req.ProductId)
existingList, err := l.svcCtx.ProductFeatureModel.FindAll(l.ctx, builder, "id ASC")
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR),
"查询现有产品功能关联失败, err: %v, product_id: %d", err, req.ProductId)
}
// 2. 构建现有关联的映射
existingMap := make(map[int64]*model.ProductFeature)
for _, item := range existingList {
existingMap[item.FeatureId] = item
}
// 3. 构建新关联的映射
newMap := make(map[int64]*types.ProductFeatureItem)
for _, item := range req.Features {
newMap[item.FeatureId] = &item
}
// 4. 在事务中执行更新操作
err = l.svcCtx.ProductFeatureModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error {
// 4.1 处理需要删除的关联
var mu sync.Mutex
var deleteIds []int64
err = mr.MapReduceVoid(func(source chan<- interface{}) {
for featureId, existing := range existingMap {
if _, exists := newMap[featureId]; !exists {
source <- existing.Id
}
}
}, func(item interface{}, writer mr.Writer[struct{}], cancel func(error)) {
id := item.(int64)
mu.Lock()
deleteIds = append(deleteIds, id)
mu.Unlock()
}, func(pipe <-chan struct{}, cancel func(error)) {
// 等待所有ID收集完成
})
if err != nil {
return errors.Wrapf(err, "收集待删除ID失败")
}
// 批量删除
if len(deleteIds) > 0 {
for _, id := range deleteIds {
err = l.svcCtx.ProductFeatureModel.Delete(ctx, session, id)
if err != nil {
return errors.Wrapf(err, "删除产品功能关联失败, product_id: %d, id: %d",
req.ProductId, id)
}
}
}
// 4.2 并发处理需要新增或更新的关联
var updateErr error
err = mr.MapReduceVoid(func(source chan<- interface{}) {
for featureId, newItem := range newMap {
source <- struct {
featureId int64
newItem *types.ProductFeatureItem
existing *model.ProductFeature
}{
featureId: featureId,
newItem: newItem,
existing: existingMap[featureId],
}
}
}, func(item interface{}, writer mr.Writer[struct{}], cancel func(error)) {
data := item.(struct {
featureId int64
newItem *types.ProductFeatureItem
existing *model.ProductFeature
})
if data.existing != nil {
// 更新现有关联
data.existing.Sort = data.newItem.Sort
data.existing.Enable = data.newItem.Enable
data.existing.IsImportant = data.newItem.IsImportant
_, err = l.svcCtx.ProductFeatureModel.Update(ctx, session, data.existing)
if err != nil {
updateErr = errors.Wrapf(err, "更新产品功能关联失败, product_id: %d, feature_id: %d",
req.ProductId, data.featureId)
cancel(updateErr)
return
}
} else {
// 新增关联
newFeature := &model.ProductFeature{
ProductId: req.ProductId,
FeatureId: data.featureId,
Sort: data.newItem.Sort,
Enable: data.newItem.Enable,
IsImportant: data.newItem.IsImportant,
}
_, err = l.svcCtx.ProductFeatureModel.Insert(ctx, session, newFeature)
if err != nil {
updateErr = errors.Wrapf(err, "新增产品功能关联失败, product_id: %d, feature_id: %d",
req.ProductId, data.featureId)
cancel(updateErr)
return
}
}
}, func(pipe <-chan struct{}, cancel func(error)) {
// 等待所有更新完成
})
if err != nil {
return errors.Wrapf(err, "并发更新产品功能关联失败")
}
if updateErr != nil {
return updateErr
}
return nil
})
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR),
"更新产品功能关联失败, err: %v, req: %+v", err, req)
}
// 5. 返回结果
return &types.AdminUpdateProductFeaturesResp{Success: true}, nil
}

View File

@ -0,0 +1,65 @@
package admin_product
import (
"context"
"database/sql"
"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 AdminUpdateProductLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewAdminUpdateProductLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminUpdateProductLogic {
return &AdminUpdateProductLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *AdminUpdateProductLogic) AdminUpdateProduct(req *types.AdminUpdateProductReq) (resp *types.AdminUpdateProductResp, err error) {
// 1. 查询记录是否存在
record, err := l.svcCtx.ProductModel.FindOne(l.ctx, req.Id)
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR),
"查找产品失败, err: %v, id: %d", err, req.Id)
}
// 2. 更新字段
if req.ProductName != nil {
record.ProductName = *req.ProductName
}
if req.ProductEn != nil {
record.ProductEn = *req.ProductEn
}
if req.Description != nil {
record.Description = *req.Description
}
if req.Notes != nil {
record.Notes = sql.NullString{String: *req.Notes, Valid: *req.Notes != ""}
}
if req.CostPrice != nil {
record.CostPrice = *req.CostPrice
}
if req.SellPrice != nil {
record.SellPrice = *req.SellPrice
}
// 3. 执行更新操作
_, err = l.svcCtx.ProductModel.Update(l.ctx, nil, record)
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR),
"更新产品失败, err: %v, req: %+v", err, req)
}
// 4. 返回结果
return &types.AdminUpdateProductResp{Success: true}, nil
}

View File

@ -29,7 +29,7 @@ func NewAdminGetUserListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *
func (l *AdminGetUserListLogic) AdminGetUserList(req *types.AdminGetUserListReq) (resp *types.AdminGetUserListResp, err error) {
resp = &types.AdminGetUserListResp{
Items: make([]types.UserListItem, 0),
Items: make([]types.AdminUserListItem, 0),
Total: 0,
}
@ -102,7 +102,7 @@ func (l *AdminGetUserListLogic) AdminGetUserList(req *types.AdminGetUserListReq)
wg.Wait()
// 并发获取每个用户的角色ID
var userItems []types.UserListItem
var userItems []types.AdminUserListItem
var userItemsMutex sync.Mutex
mr.MapReduceVoid(func(source chan<- interface{}) {
@ -128,7 +128,7 @@ func (l *AdminGetUserListLogic) AdminGetUserList(req *types.AdminGetUserListReq)
}, func(pipe <-chan []int64, cancel func(error)) {
for _, user := range users {
roleIds := <-pipe
item := types.UserListItem{
item := types.AdminUserListItem{
Id: user.Id,
Username: user.Username,
RealName: user.RealName,

View File

@ -38,7 +38,7 @@ func (l *GetNotificationsLogic) GetNotifications() (resp *types.GetNotifications
// 构建查询条件
builder := l.svcCtx.GlobalNotificationsModel.SelectBuilder().
Where("status = ?", "active").
Where("status = ?", 1).
Where("(start_date IS NULL OR start_date <= ?)", todayEnd). // start_date 是 NULL 或者小于等于今天结束时间
Where("(end_date IS NULL OR end_date >= ?)", todayStart) // end_date 是 NULL 或者大于等于今天开始时间

View File

@ -3,8 +3,6 @@ package pay
import (
"context"
"net/http"
"time"
"tyc-server/pkg/lzkit/lzUtils"
"github.com/smartwalle/alipay/v3"
@ -28,49 +26,11 @@ func NewAlipayCallbackLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Al
}
func (l *AlipayCallbackLogic) AlipayCallback(w http.ResponseWriter, r *http.Request) error {
notification, err := l.svcCtx.AlipayService.HandleAliPaymentNotification(r)
err := l.svcCtx.PayService.HandlePaymentCallback(l.ctx, "alipay", r)
if err != nil {
logx.Errorf("支付宝支付回调,%+v", err)
return nil
}
order, findOrderErr := l.svcCtx.OrderModel.FindOneByOrderNo(l.ctx, notification.OutTradeNo)
if findOrderErr != nil {
logx.Errorf("支付宝支付回调,查找订单失败: %+v", findOrderErr)
return nil
}
if order.Status != "pending" {
alipay.ACKNotification(w)
return nil
}
amount := lzUtils.ToAlipayAmount(order.Amount)
// 确保订单金额和状态正确,防止重复更新
if amount != notification.TotalAmount {
logx.Errorf("支付宝支付回调,金额不一致")
return nil
}
if order.Status != "pending" {
w.WriteHeader(http.StatusOK)
_, _ = w.Write([]byte("success")) // 确保只写入一次响应
return nil
}
switch notification.TradeStatus {
case alipay.TradeStatusSuccess:
order.Status = "paid"
order.PayTime = lzUtils.TimeToNullTime(time.Now())
default:
return nil
}
order.PlatformOrderId = lzUtils.StringToNullString(notification.TradeNo)
if updateErr := l.svcCtx.OrderModel.UpdateWithVersion(l.ctx, nil, order); updateErr != nil {
logx.Errorf("支付宝支付回调,修改订单信息失败: %+v", updateErr)
return nil
}
if order.Status == "paid" {
if asyncErr := l.svcCtx.AsynqService.SendQueryTask(order.Id); asyncErr != nil {
logx.Errorf("异步任务调度失败: %v", asyncErr)
return asyncErr
}
}
alipay.ACKNotification(w)
return nil
}

View File

@ -4,15 +4,14 @@ import (
"context"
"encoding/json"
"fmt"
"tyc-server/app/main/api/internal/service"
"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 PaymentLogic struct {
@ -34,104 +33,45 @@ func (l *PaymentLogic) Payment(req *types.PaymentReq) (resp *types.PaymentResp,
if getUidErr != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成订单, 获取用户信息失败, %+v", getUidErr)
}
brand, ok := l.ctx.Value("brand").(string)
if !ok {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成订单, 获取平台失败, %+v", getUidErr)
}
// 从缓存中获取订单信息
outTradeNo := req.Id
redisKey := fmt.Sprintf("%d:%s", userID, outTradeNo)
cache, cacheErr := l.svcCtx.Redis.GetCtx(l.ctx, redisKey)
if cacheErr != nil {
return nil, cacheErr
}
var data types.QueryCacheLoad
err = json.Unmarshal([]byte(cache), &data)
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成订单, 解析缓存内容失败, %+v", err)
}
product, err := l.svcCtx.ProductModel.FindOneByProductEn(l.ctx, data.Product)
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成订单, 查找产品错误: %+v", err)
}
var prepayData interface{}
var amount float64
user, err := l.svcCtx.UserModel.FindOne(l.ctx, userID)
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "生成订单, 获取用户信息失败: %+v", err)
}
if user.Inside == 1 {
amount = 0.01
} else {
amount = product.SellPrice
}
var createOrderErr error
if req.PayMethod == "wechat" {
prepayData, createOrderErr = l.svcCtx.WechatPayService.CreateWechatOrder(l.ctx, amount, product.ProductName, outTradeNo)
} else if req.PayMethod == "alipay" {
prepayData, createOrderErr = l.svcCtx.AlipayService.CreateAlipayOrder(l.ctx, amount, product.ProductName, outTradeNo, brand)
} else if req.PayMethod == "appleiap" {
prepayData = l.svcCtx.ApplePayService.GetIappayAppID(product.ProductEn)
}
if createOrderErr != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成订单, 创建支付订单失败: %+v", createOrderErr)
}
var orderID int64
transErr := l.svcCtx.OrderModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error {
order := model.Order{
OrderNo: outTradeNo,
UserId: userID,
ProductId: product.Id,
PaymentPlatform: req.PayMethod,
PaymentScene: "tyc",
Amount: amount,
Status: "pending",
}
orderInsertResult, insertOrderErr := l.svcCtx.OrderModel.Insert(ctx, session, &order)
if insertOrderErr != nil {
return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成订单, 保存订单失败: %+v", insertOrderErr)
}
insertedOrderID, lastInsertIdErr := orderInsertResult.LastInsertId()
if lastInsertIdErr != nil {
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 {
return nil, transErr
}
switch v := prepayData.(type) {
case string:
// 如果 prepayData 是字符串类型,直接返回
return &types.PaymentResp{PrepayId: v, OrderID: orderID}, nil
var payMethod service.PayMethod
switch req.PayMethod {
case "alipay":
payMethod = service.PayMethodAlipay
case "wechat":
payMethod = service.PayMethodWechat
// case "apple":
// payMethod = service.PayMethodApple
default:
return &types.PaymentResp{PrepayData: prepayData, OrderID: orderID}, nil
return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成订单, 不支持的支付方式: %+v", req.PayMethod)
}
// 创建支付订单
orderReq := &service.CreateOrderRequest{
PayMethod: payMethod,
ProductEn: data.Product,
}
orderResp, err := l.svcCtx.PayService.CreateOrder(l.ctx, orderReq)
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成订单失败: %+v", err)
}
return &types.PaymentResp{
PrepayData: orderResp.PayData,
PrepayId: orderResp.OrderNo,
OrderID: orderResp.OrderID,
}, nil
}

View File

@ -3,9 +3,6 @@ package pay
import (
"context"
"net/http"
"time"
"tyc-server/app/main/api/internal/service"
"tyc-server/pkg/lzkit/lzUtils"
"tyc-server/app/main/api/internal/svc"
@ -27,50 +24,11 @@ func NewWechatPayCallbackLogic(ctx context.Context, svcCtx *svc.ServiceContext)
}
func (l *WechatPayCallbackLogic) WechatPayCallback(w http.ResponseWriter, r *http.Request) error {
notification, err := l.svcCtx.WechatPayService.HandleWechatPayNotification(l.ctx, r)
err := l.svcCtx.PayService.HandlePaymentCallback(l.ctx, "wechat", r)
if err != nil {
logx.Errorf("微信支付回调,%+v", err)
return nil
}
order, findOrderErr := l.svcCtx.OrderModel.FindOneByOrderNo(l.ctx, *notification.OutTradeNo)
if findOrderErr != nil {
logx.Errorf("微信支付回调,查找订单信息失败: %+v", findOrderErr)
return nil
}
amount := lzUtils.ToWechatAmount(order.Amount)
if amount != *notification.Amount.Total {
logx.Errorf("微信支付回调,金额不一致")
return nil
}
if order.Status != "pending" {
w.WriteHeader(http.StatusOK)
_, _ = w.Write([]byte("success")) // 确保只写入一次响应
return nil
}
switch *notification.TradeState {
case service.TradeStateSuccess:
order.Status = "paid"
order.PayTime = lzUtils.TimeToNullTime(time.Now())
case service.TradeStateClosed:
order.Status = "closed"
order.CloseTime = lzUtils.TimeToNullTime(time.Now())
case service.TradeStateRevoked:
order.Status = "failed"
default:
return nil
}
order.PlatformOrderId = lzUtils.StringToNullString(*notification.TransactionId)
if updateErr := l.svcCtx.OrderModel.UpdateWithVersion(l.ctx, nil, order); updateErr != nil {
logx.Errorf("微信支付回调,更新订单失败%+v", updateErr)
return nil
}
if order.Status == "paid" {
if asyncErr := l.svcCtx.AsynqService.SendQueryTask(order.Id); asyncErr != nil {
logx.Errorf("异步任务调度失败: %v", asyncErr)
return asyncErr
}
}
// 响应微信回调成功
w.WriteHeader(http.StatusOK)

View File

@ -5,7 +5,6 @@ import (
"net/http"
"tyc-server/app/main/api/internal/svc"
"github.com/wechatpay-apiv3/wechatpay-go/services/refunddomestic"
"github.com/zeromicro/go-zero/core/logx"
)
@ -24,32 +23,36 @@ func NewWechatPayRefundCallbackLogic(ctx context.Context, svcCtx *svc.ServiceCon
}
func (l *WechatPayRefundCallbackLogic) WechatPayRefundCallback(w http.ResponseWriter, r *http.Request) error {
notification, err := l.svcCtx.WechatPayService.HandleRefundNotification(l.ctx, r)
if err != nil {
logx.Errorf("微信退款回调,%+v", err)
return nil
}
order, findOrderErr := l.svcCtx.OrderModel.FindOneByOrderNo(l.ctx, *notification.OutTradeNo)
if findOrderErr != nil {
logx.Errorf("微信退款回调,查找订单信息失败: %+v", findOrderErr)
return nil
}
// notification, err := l.svcCtx.PayService.re(l.ctx, r)
// if err != nil {
// logx.Errorf("微信退款回调,%+v", err)
// return nil
// }
// order, findOrderErr := l.svcCtx.OrderModel.FindOneByOrderNo(l.ctx, *notification.OutTradeNo)
// if findOrderErr != nil {
// logx.Errorf("微信退款回调,查找订单信息失败: %+v", findOrderErr)
// return nil
// }
switch *notification.Status {
case refunddomestic.STATUS_SUCCESS:
order.Status = "refunded"
case refunddomestic.STATUS_ABNORMAL:
// 异常
return nil
default:
return nil
}
if updateErr := l.svcCtx.OrderModel.UpdateWithVersion(l.ctx, nil, order); updateErr != nil {
logx.Errorf("微信退款回调,更新订单失败%+v", updateErr)
return nil
}
// 响应微信回调成功
w.WriteHeader(http.StatusOK)
_, _ = w.Write([]byte("success")) // 确保只写入一次响应
// switch *notification.Status {
// case refunddomestic.STATUS_SUCCESS:
// order.Status = "refunded"
// order.RefundTime = sql.NullTime{
// Time: time.Now(),
// Valid: true,
// }
// case refunddomestic.STATUS_ABNORMAL:
// // 异常
// return nil
// default:
// return nil
// }
// if updateErr := l.svcCtx.OrderModel.UpdateWithVersion(l.ctx, nil, order); updateErr != nil {
// logx.Errorf("微信退款回调,更新订单失败%+v", updateErr)
// return nil
// }
// // 响应微信回调成功
// w.WriteHeader(http.StatusOK)
// _, _ = w.Write([]byte("success")) // 确保只写入一次响应
return nil
}

View File

@ -2,9 +2,12 @@ package query
import (
"context"
"crypto/rand"
"encoding/hex"
"encoding/json"
"fmt"
"strconv"
"sync/atomic"
"time"
"tyc-server/app/main/api/internal/service"
"tyc-server/common/ctxdata"
@ -140,13 +143,13 @@ func (l *QueryServiceLogic) CacheData(params map[string]interface{}, Product str
if marshalErr != nil {
return "", errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 序列化参数失败: %+v", marshalErr)
}
outTradeNo := l.svcCtx.AlipayService.GenerateOutTradeNo()
redisKey := fmt.Sprintf("%d:%s", userID, outTradeNo)
cacheNo := l.GenerateCacheNo()
redisKey := fmt.Sprintf("%d:%s", userID, cacheNo)
cacheErr := l.svcCtx.Redis.SetexCtx(l.ctx, redisKey, string(jsonData), int(2*time.Hour))
if cacheErr != nil {
return "", cacheErr
}
return outTradeNo, nil
return cacheNo, nil
}
var productProcessors = map[string]func(*QueryServiceLogic, *types.QueryServiceReq) (*types.QueryServiceResp, error){
@ -2067,3 +2070,27 @@ func (l *QueryServiceLogic) ProcessTocPersonEnterpriseProLogic(req *types.QueryS
return &types.QueryServiceResp{Id: cacheNo}, nil
}
// 全局原子计数器
var CacheNoCounter uint32 = 0
func (l *QueryServiceLogic) GenerateCacheNo() string {
// 获取当前时间戳(秒级)
timestamp := time.Now().Unix()
timeStr := strconv.FormatInt(timestamp, 10)
// 原子递增计数器
counter := atomic.AddUint32(&CacheNoCounter, 1)
// 生成4字节真随机数
randomBytes := make([]byte, 4)
_, err := rand.Read(randomBytes)
if err != nil {
// 如果随机数生成失败,回退到使用时间纳秒数据
randomBytes = []byte(strconv.FormatInt(time.Now().UnixNano()%1000000, 16))
}
randomHex := hex.EncodeToString(randomBytes)
// 组合所有部分: 前缀 + 时间戳 + 计数器 + 随机数
return fmt.Sprintf("query_%s%06x%s", timeStr, counter%0xFFFFFF, randomHex[:6])
}

View File

@ -79,7 +79,7 @@ func (l *MobileCodeLoginLogic) MobileCodeLogin(req *types.MobileCodeLoginReq) (r
userAuth := new(model.UserAuth)
userAuth.UserId = lastId
userAuth.AuthKey = encryptedMobile
userAuth.AuthType = model.UserAuthTypeAppMobile
userAuth.AuthType = model.UserAuthTypeMobile
if _, userAuthInsertErr := l.svcCtx.UserAuthModel.Insert(ctx, session, userAuth); userAuthInsertErr != nil {
return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "手机注册, 数据库插入用户认证失败, err:%+v", userAuthInsertErr)
}

View File

@ -86,7 +86,7 @@ func (l *RegisterLogic) Register(req *types.RegisterReq) (resp *types.RegisterRe
userAuth := new(model.UserAuth)
userAuth.UserId = lastId
userAuth.AuthKey = encryptedMobile
userAuth.AuthType = model.UserAuthTypeAppMobile
userAuth.AuthType = model.UserAuthTypeMobile
if _, userAuthInsertErr := l.svcCtx.UserAuthModel.Insert(ctx, session, userAuth); userAuthInsertErr != nil {
return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "手机注册, 数据库插入用户认证失败, err:%+v", userAuthInsertErr)
}

View File

@ -42,7 +42,7 @@ func (l *WxMiniAuthLogic) WxMiniAuth(req *types.WXMiniAuthReq) (resp *types.WXMi
}
// 2. 根据 openid 查找用户
userAuth, findErr := l.svcCtx.UserAuthModel.FindOneByAuthTypeAuthKey(l.ctx, model.UserAuthTypeWxMini, weChatResponse.OpenId)
userAuth, findErr := l.svcCtx.UserAuthModel.FindOneByAuthTypeAuthKey(l.ctx, model.UserAuthTypeWechatMiniOpenID, weChatResponse.OpenId)
if findErr != nil && findErr != model.ErrNotFound {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "微信登录, 读取用户认证信息失败, openid: %s, err: %+v", weChatResponse.OpenId, findErr)
}
@ -70,7 +70,7 @@ func (l *WxMiniAuthLogic) WxMiniAuth(req *types.WXMiniAuthReq) (resp *types.WXMi
newUserAuth := &model.UserAuth{
UserId: lastId,
AuthKey: weChatResponse.OpenId,
AuthType: model.UserAuthTypeWxMini,
AuthType: model.UserAuthTypeWechatMiniOpenID,
}
if _, userAuthInsertErr := l.svcCtx.UserAuthModel.Insert(ctx, session, newUserAuth); userAuthInsertErr != nil {
return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "微信登录, 数据库插入用户认证信息失败, err:%+v", userAuthInsertErr)

View File

@ -3,20 +3,21 @@ package queue
import (
"context"
"time"
"tyc-server/app/main/api/internal/config"
"tyc-server/app/main/api/internal/svc"
"github.com/hibiken/asynq"
"github.com/zeromicro/go-zero/core/logx"
)
const TASKTIME = "0 3 * * *"
type CleanQueryDataHandler struct {
config *config.Config
svcCtx *svc.ServiceContext
}
func NewCleanQueryDataHandler(svcCtx *svc.ServiceContext) *CleanQueryDataHandler {
func NewCleanQueryDataHandler(config *config.Config, svcCtx *svc.ServiceContext) *CleanQueryDataHandler {
return &CleanQueryDataHandler{
config: config,
svcCtx: svcCtx,
}
}
@ -25,14 +26,10 @@ func (l *CleanQueryDataHandler) ProcessTask(ctx context.Context, t *asynq.Task)
now := time.Now().Format("2006-01-02 15:04:05")
logx.Infof("%s - 开始执行查询数据清理任务", now)
// 计算7天前的时间
sevenDaysAgo := time.Now().AddDate(0, 0, -7)
// 计算15天前的时间
sevenDaysAgo := time.Now().AddDate(0, 0, -l.config.CleanTask.Days)
// 创建查询条件排除product_id为4的记录
conditions := l.svcCtx.QueryModel.SelectBuilder().Where("product_id != ?", 4)
// 调用QueryModel删除7天前的数据排除product_id为4的记录
result, err := l.svcCtx.QueryModel.DeleteBefore(ctx, sevenDaysAgo, conditions)
result, err := l.svcCtx.QueryModel.DeleteBefore(ctx, sevenDaysAgo)
if err != nil {
logx.Errorf("%s - 清理查询数据失败: %v", time.Now().Format("2006-01-02 15:04:05"), err)
return err

View File

@ -7,6 +7,7 @@ import (
"errors"
"fmt"
"strings"
"tyc-server/app/main/api/internal/service"
"tyc-server/app/main/api/internal/svc"
"tyc-server/app/main/api/internal/types"
"tyc-server/app/main/model"
@ -159,33 +160,29 @@ func (l *PaySuccessNotifyUserHandler) handleError(ctx context.Context, err error
return asynq.SkipRetry
}
payRefundRequest := &service.RefundRequest{
OrderId: order.Id,
RefundAmount: order.Amount,
Reason: "查询失败退款",
}
// 退款
if order.PaymentPlatform == "wechat" {
refundErr := l.svcCtx.WechatPayService.WeChatRefund(ctx, order.OrderNo, order.Amount, order.Amount)
refundResp, refundErr := l.svcCtx.PayService.Refund(ctx, payRefundRequest)
if refundErr != nil {
logx.Error(refundErr)
return asynq.SkipRetry
}
if refundResp.Status == "success" {
// 直接成功
} else {
return asynq.SkipRetry
}
} else {
refund, refundErr := l.svcCtx.AlipayService.AliRefund(ctx, order.OrderNo, order.Amount)
_, refundErr := l.svcCtx.PayService.Refund(ctx, payRefundRequest)
if refundErr != nil {
logx.Error(refundErr)
return asynq.SkipRetry
}
if refund.IsSuccess() {
logx.Errorf("支付宝退款成功, orderID: %d", order.Id)
// 更新订单状态为退款
order.Status = "refunded"
updateOrderErr := l.svcCtx.OrderModel.UpdateWithVersion(ctx, nil, order)
if updateOrderErr != nil {
logx.Errorf("更新订单状态失败订单ID: %d, 错误: %v", order.Id, updateOrderErr)
return fmt.Errorf("更新订单状态失败: %v", updateOrderErr)
}
return asynq.SkipRetry
} else {
logx.Errorf("支付宝退款失败:%v", refundErr)
return asynq.SkipRetry
}
// 直接成功
}

View File

@ -3,19 +3,23 @@ package queue
import (
"context"
"fmt"
"tyc-server/app/main/api/internal/config"
"tyc-server/app/main/api/internal/svc"
"tyc-server/app/main/api/internal/types"
"github.com/hibiken/asynq"
"github.com/zeromicro/go-zero/core/logx"
)
type CronJob struct {
config *config.Config
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewCronJob(ctx context.Context, svcCtx *svc.ServiceContext) *CronJob {
func NewCronJob(config *config.Config, ctx context.Context, svcCtx *svc.ServiceContext) *CronJob {
return &CronJob{
config: config,
ctx: ctx,
svcCtx: svcCtx,
}
@ -24,17 +28,21 @@ func NewCronJob(ctx context.Context, svcCtx *svc.ServiceContext) *CronJob {
func (l *CronJob) Register() *asynq.ServeMux {
redisClientOpt := asynq.RedisClientOpt{Addr: l.svcCtx.Config.CacheRedis[0].Host, Password: l.svcCtx.Config.CacheRedis[0].Pass}
scheduler := asynq.NewScheduler(redisClientOpt, nil)
task := asynq.NewTask(types.MsgCleanQueryData, nil, nil)
_, err := scheduler.Register(TASKTIME, task)
if err != nil {
panic(fmt.Sprintf("定时任务注册失败:%v", err))
// 根据配置决定是否启动清理任务
if l.config.CleanTask.Enabled {
task := asynq.NewTask(types.MsgCleanQueryData, nil, nil)
_, err := scheduler.Register(l.config.CleanTask.Time, task)
if err != nil {
panic(fmt.Sprintf("定时任务注册失败:%v", err))
}
scheduler.Start()
logx.Infof("清理数据定时任务已启动")
}
scheduler.Start()
fmt.Println("定时任务启动!!!")
mux := asynq.NewServeMux()
mux.Handle(types.MsgPaySuccessQuery, NewPaySuccessNotifyUserHandler(l.svcCtx))
mux.Handle(types.MsgCleanQueryData, NewCleanQueryDataHandler(l.svcCtx))
mux.Handle(types.MsgCleanQueryData, NewCleanQueryDataHandler(l.config, l.svcCtx))
mux.Handle(types.MsgCarMaintenanceQuery, NewCarMaintenanceQueryHandler(l.svcCtx))
return mux

View File

@ -1,196 +0,0 @@
package service
import (
"context"
"crypto/rand"
"encoding/hex"
"fmt"
"net/http"
"strconv"
"sync/atomic"
"time"
"tyc-server/app/main/api/internal/config"
"tyc-server/pkg/lzkit/lzUtils"
"github.com/smartwalle/alipay/v3"
)
type AliPayService struct {
config config.AlipayConfig
AlipayClient *alipay.Client
}
// NewAliPayService 是一个构造函数,用于初始化 AliPayService
func NewAliPayService(c config.Config) *AliPayService {
client, err := alipay.New(c.Alipay.AppID, c.Alipay.PrivateKey, c.Alipay.IsProduction)
if err != nil {
panic(fmt.Sprintf("创建支付宝客户端失败: %v", err))
}
// 加载支付宝公钥
err = client.LoadAliPayPublicKey(c.Alipay.AlipayPublicKey)
if err != nil {
panic(fmt.Sprintf("加载支付宝公钥失败: %v", err))
}
return &AliPayService{
config: c.Alipay,
AlipayClient: client,
}
}
func (a *AliPayService) CreateAlipayAppOrder(amount float64, subject string, outTradeNo string) (string, error) {
client := a.AlipayClient
totalAmount := lzUtils.ToAlipayAmount(amount)
// 构造移动支付请求
p := alipay.TradeAppPay{
Trade: alipay.Trade{
Subject: subject,
OutTradeNo: outTradeNo,
TotalAmount: totalAmount,
ProductCode: "QUICK_MSECURITY_PAY", // 移动端支付专用代码
NotifyURL: a.config.NotifyUrl, // 异步回调通知地址
},
}
// 获取APP支付字符串这里会签名
payStr, err := client.TradeAppPay(p)
if err != nil {
return "", fmt.Errorf("创建支付宝订单失败: %v", err)
}
return payStr, nil
}
// CreateAlipayH5Order 创建支付宝H5支付订单
func (a *AliPayService) CreateAlipayH5Order(amount float64, subject string, outTradeNo string, brand string) (string, error) {
var returnURL string
var notifyURL string
if brand == "tyc" {
returnURL = "https://www.tianyuancha.cn/report"
notifyURL = "https://www.tianyuancha.cn/api/v1/pay/alipay/callback"
} else {
returnURL = a.config.ReturnURL
notifyURL = a.config.NotifyUrl
}
client := a.AlipayClient
totalAmount := lzUtils.ToAlipayAmount(amount)
// 构造H5支付请求
p := alipay.TradeWapPay{
Trade: alipay.Trade{
Subject: subject,
OutTradeNo: outTradeNo,
TotalAmount: totalAmount,
ProductCode: "QUICK_WAP_PAY", // H5支付专用产品码
NotifyURL: notifyURL, // 异步回调通知地址
ReturnURL: returnURL,
},
}
// 获取H5支付请求字符串这里会签名
payUrl, err := client.TradeWapPay(p)
if err != nil {
return "", fmt.Errorf("创建支付宝H5订单失败: %v", err)
}
return payUrl.String(), nil
}
// CreateAlipayOrder 根据平台类型创建支付宝支付订单
func (a *AliPayService) CreateAlipayOrder(ctx context.Context, amount float64, subject string, outTradeNo string, brand string) (string, error) {
// 根据 ctx 中的 platform 判断平台
platform, platformOk := ctx.Value("platform").(string)
if !platformOk {
return "", fmt.Errorf("无的支付平台: %s", platform)
}
switch platform {
case "app":
// 调用App支付的创建方法
return a.CreateAlipayAppOrder(amount, subject, outTradeNo)
case "h5":
// 调用H5支付的创建方法并传入 returnUrl
return a.CreateAlipayH5Order(amount, subject, outTradeNo, brand)
default:
return "", fmt.Errorf("不支持的支付平台: %s", platform)
}
}
// AliRefund 发起支付宝退款
func (a *AliPayService) AliRefund(ctx context.Context, outTradeNo string, refundAmount float64) (*alipay.TradeRefundRsp, error) {
refund := alipay.TradeRefund{
OutTradeNo: outTradeNo,
RefundAmount: lzUtils.ToAlipayAmount(refundAmount),
OutRequestNo: fmt.Sprintf("%s-refund", outTradeNo),
}
// 发起退款请求
refundResp, err := a.AlipayClient.TradeRefund(ctx, refund)
if err != nil {
return nil, fmt.Errorf("支付宝退款请求错误:%v", err)
}
return refundResp, nil
}
// HandleAliPaymentNotification 支付宝支付回调
func (a *AliPayService) HandleAliPaymentNotification(r *http.Request) (*alipay.Notification, error) {
// 解析表单
err := r.ParseForm()
if err != nil {
return nil, fmt.Errorf("解析请求表单失败:%v", err)
}
// 解析并验证通知DecodeNotification 会自动验证签名
notification, err := a.AlipayClient.DecodeNotification(r.Form)
if err != nil {
return nil, fmt.Errorf("验证签名失败: %v", err)
}
return notification, nil
}
func (a *AliPayService) QueryOrderStatus(ctx context.Context, outTradeNo string) (*alipay.TradeQueryRsp, error) {
queryRequest := alipay.TradeQuery{
OutTradeNo: outTradeNo,
}
// 发起查询请求
resp, err := a.AlipayClient.TradeQuery(ctx, queryRequest)
if err != nil {
return nil, fmt.Errorf("查询支付宝订单失败: %v", err)
}
// 返回交易状态
if resp.IsSuccess() {
return resp, nil
}
return nil, fmt.Errorf("查询支付宝订单失败: %v", resp.SubMsg)
}
// 添加全局原子计数器
var alipayOrderCounter uint32 = 0
// GenerateOutTradeNo 生成唯一订单号的函数 - 优化版本
func (a *AliPayService) GenerateOutTradeNo() string {
// 获取当前时间戳(毫秒级)
timestamp := time.Now().UnixMilli()
timeStr := strconv.FormatInt(timestamp, 10)
// 原子递增计数器
counter := atomic.AddUint32(&alipayOrderCounter, 1)
// 生成4字节真随机数
randomBytes := make([]byte, 4)
_, err := rand.Read(randomBytes)
if err != nil {
// 如果随机数生成失败,回退到使用时间纳秒数据
randomBytes = []byte(strconv.FormatInt(time.Now().UnixNano()%1000000, 16))
}
randomHex := hex.EncodeToString(randomBytes)
// 组合所有部分: 前缀 + 时间戳 + 计数器 + 随机数
orderNo := fmt.Sprintf("%s%06x%s", timeStr[:10], counter%0xFFFFFF, randomHex[:6])
// 确保长度不超过32字符大多数支付平台的限制
if len(orderNo) > 32 {
orderNo = orderNo[:32]
}
return orderNo
}

View File

@ -1,169 +0,0 @@
package service
import (
"context"
"crypto/ecdsa"
"crypto/x509"
"encoding/json"
"encoding/pem"
"fmt"
"io/ioutil"
"net/http"
"strconv"
"time"
"tyc-server/app/main/api/internal/config"
"github.com/golang-jwt/jwt/v4"
)
// ApplePayService 是 Apple IAP 支付服务的结构体
type ApplePayService struct {
config config.ApplepayConfig // 配置项
}
// NewApplePayService 是一个构造函数,用于初始化 ApplePayService
func NewApplePayService(c config.Config) *ApplePayService {
return &ApplePayService{
config: c.Applepay,
}
}
func (a *ApplePayService) GetIappayAppID(productName string) string {
return fmt.Sprintf("%s.%s", a.config.BundleID, productName)
}
// VerifyReceipt 验证苹果支付凭证
func (a *ApplePayService) VerifyReceipt(ctx context.Context, receipt string) (*AppleVerifyResponse, error) {
var reqUrl string
if a.config.Sandbox {
reqUrl = a.config.SandboxVerifyURL
} else {
reqUrl = a.config.ProductionVerifyURL
}
// 读取私钥
privateKey, err := loadPrivateKey(a.config.LoadPrivateKeyPath)
if err != nil {
return nil, fmt.Errorf("加载私钥失败:%v", err)
}
// 生成 JWT
token, err := generateJWT(privateKey, a.config.KeyID, a.config.IssuerID)
if err != nil {
return nil, fmt.Errorf("生成JWT失败%v", err)
}
// 构造查询参数
queryParams := fmt.Sprintf("?receipt-data=%s", receipt)
fullUrl := reqUrl + queryParams
// 构建 HTTP GET 请求
req, err := http.NewRequestWithContext(ctx, http.MethodGet, fullUrl, nil)
if err != nil {
return nil, fmt.Errorf("创建 HTTP 请求失败:%v", err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer "+token)
// 发送请求
client := &http.Client{Timeout: 10 * time.Second}
resp, err := client.Do(req)
if err != nil {
return nil, fmt.Errorf("请求苹果验证接口失败:%v", err)
}
defer resp.Body.Close()
// 解析响应
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, fmt.Errorf("读取响应体失败:%v", err)
}
var verifyResponse AppleVerifyResponse
err = json.Unmarshal(body, &verifyResponse)
if err != nil {
return nil, fmt.Errorf("解析响应体失败:%v", err)
}
// 根据实际响应处理逻辑
if verifyResponse.Status != 0 {
return nil, fmt.Errorf("验证失败,状态码:%d", verifyResponse.Status)
}
return &verifyResponse, nil
}
func loadPrivateKey(path string) (*ecdsa.PrivateKey, error) {
data, err := ioutil.ReadFile(path)
if err != nil {
return nil, err
}
block, _ := pem.Decode(data)
if block == nil || block.Type != "PRIVATE KEY" {
return nil, fmt.Errorf("无效的私钥数据")
}
key, err := x509.ParsePKCS8PrivateKey(block.Bytes)
if err != nil {
return nil, err
}
ecdsaKey, ok := key.(*ecdsa.PrivateKey)
if !ok {
return nil, fmt.Errorf("私钥类型错误")
}
return ecdsaKey, nil
}
func generateJWT(privateKey *ecdsa.PrivateKey, keyID, issuerID string) (string, error) {
now := time.Now()
claims := jwt.RegisteredClaims{
Issuer: issuerID,
IssuedAt: jwt.NewNumericDate(now),
ExpiresAt: jwt.NewNumericDate(now.Add(1 * time.Hour)),
Audience: jwt.ClaimStrings{"appstoreconnect-v1"},
}
token := jwt.NewWithClaims(jwt.SigningMethodES256, claims)
token.Header["kid"] = keyID
tokenString, err := token.SignedString(privateKey)
if err != nil {
return "", err
}
return tokenString, nil
}
// GenerateOutTradeNo 生成唯一订单号
func (a *ApplePayService) GenerateOutTradeNo() string {
length := 16
timestamp := time.Now().UnixNano()
timeStr := strconv.FormatInt(timestamp, 10)
randomPart := strconv.Itoa(int(timestamp % 1e6))
combined := timeStr + randomPart
if len(combined) >= length {
return combined[:length]
}
for len(combined) < length {
combined += strconv.Itoa(int(timestamp % 10))
}
return combined
}
// AppleVerifyResponse 定义苹果验证接口的响应结构
type AppleVerifyResponse struct {
Status int `json:"status"` // 验证状态码0 表示收据有效
Receipt *Receipt `json:"receipt"` // 收据信息
}
// Receipt 定义收据的精简结构
type Receipt struct {
BundleID string `json:"bundle_id"` // 应用的 Bundle ID
InApp []InAppItem `json:"in_app"` // 应用内购买记录
}
// InAppItem 定义单条交易记录
type InAppItem struct {
ProductID string `json:"product_id"` // 商品 ID
TransactionID string `json:"transaction_id"` // 交易 ID
PurchaseDate string `json:"purchase_date"` // 购买日期 (ISO 8601)
OriginalTransID string `json:"original_transaction_id"` // 原始交易 ID
}

View File

@ -0,0 +1,495 @@
package service
import (
"context"
"database/sql"
"fmt"
"net/http"
"time"
"tyc-server/app/main/api/internal/config"
"tyc-server/app/main/model"
"tyc-server/common/ctxdata"
"tyc-server/pkg/core/payment"
"github.com/zeromicro/go-zero/core/stores/sqlx"
)
// PayService 支付服务
type PayService struct {
config config.Config
orderModel model.OrderModel
orderRefundModel model.OrderRefundModel
productModel model.ProductModel
userAuthModel model.UserAuthModel
userModel model.UserModel
alipayService *payment.AliPayService
wechatService *payment.WechatPayService
appleService *payment.ApplePayService
}
// NewPayService 创建支付服务
func NewPayService(c config.Config, orderModel model.OrderModel, orderRefundModel model.OrderRefundModel, productModel model.ProductModel, userAuthModel model.UserAuthModel) *PayService {
ps := &PayService{
config: c,
orderModel: orderModel,
orderRefundModel: orderRefundModel,
productModel: productModel,
userAuthModel: userAuthModel,
}
// 根据配置选择性初始化支付服务
if c.Alipay.Enabled {
// 初始化支付宝服务
alipayConfig := payment.AlipayConfig{
AppID: c.Alipay.AppID,
PrivateKey: c.Alipay.PrivateKey,
AlipayPublicKey: c.Alipay.AlipayPublicKey,
IsProduction: c.Alipay.IsProduction,
NotifyURL: c.Alipay.NotifyUrl,
ReturnURL: c.Alipay.ReturnURL,
}
alipayService, err := payment.NewAliPayService(alipayConfig)
if err != nil {
panic(fmt.Sprintf("初始化支付宝服务失败: %v", err))
}
ps.alipayService = alipayService
}
if c.Wxpay.Enabled {
// 初始化微信支付服务
wechatConfig := &payment.WechatPayConfig{
AppID: c.Wxpay.AppID,
MchID: c.Wxpay.MchID,
SerialNo: c.Wxpay.MchCertificateSerialNumber,
MchAPIv3Key: c.Wxpay.MchApiv3Key,
PrivateKey: c.Wxpay.MchPrivateKeyPath,
NotifyURL: c.Wxpay.NotifyUrl,
RefundURL: c.Wxpay.RefundNotifyUrl,
}
wechatService, err := payment.NewWechatPayService(wechatConfig)
if err != nil {
panic(fmt.Sprintf("初始化微信支付服务失败: %v", err))
}
ps.wechatService = wechatService
}
if c.Applepay.Enabled {
// 初始化苹果支付服务
appleConfig := payment.ApplePayConfig{
BundleID: c.Applepay.BundleID,
KeyID: c.Applepay.KeyID,
TeamID: c.Applepay.IssuerID,
PrivateKey: c.Applepay.LoadPrivateKeyPath,
IsProduction: !c.Applepay.Sandbox,
NotifyURL: c.Applepay.ProductionVerifyURL,
RefundNotifyURL: c.Applepay.SandboxVerifyURL,
}
appleService, err := payment.NewApplePayService(appleConfig)
if err != nil {
panic(fmt.Sprintf("初始化苹果支付服务失败: %v", err))
}
ps.appleService = appleService
}
return ps
}
// CreateOrder 创建支付订单
func (p *PayService) CreateOrder(ctx context.Context, req *CreateOrderRequest) (*CreateOrderResponse, error) {
platform, ok := ctx.Value("platform").(string)
if !ok {
return nil, fmt.Errorf("获取平台失败")
}
userID, err := ctxdata.GetUidFromCtx(ctx)
if err != nil {
return nil, fmt.Errorf("获取用户信息失败: %v", err)
}
product, err := p.productModel.FindOneByProductEn(ctx, req.ProductEn)
if err != nil {
return nil, fmt.Errorf("获取商品失败: %v", err)
}
user, err := p.userModel.FindOne(ctx, userID)
if err != nil {
return nil, fmt.Errorf("获取用户失败: %v", err)
}
var outTradeNo string
var orderID int64
amount := product.SellPrice
if user.Inside == 1 {
amount = 0.01
}
// 使用事务创建订单
var payData interface{}
err = p.orderModel.Trans(ctx, func(ctx context.Context, session sqlx.Session) error {
// 根据支付方式创建支付订单
switch req.PayMethod {
case "alipay":
orderReq := &payment.AlipayCreateOrderRequest{
Amount: amount,
Subject: product.ProductName,
Platform: payment.PlatformApp,
}
resp, err := p.alipayService.CreateOrder(ctx, orderReq)
if err != nil {
return fmt.Errorf("创建支付宝订单失败: %v", err)
}
payData = resp.PayParams
case "wechat":
orderReq := &payment.Order{
OutTradeNo: outTradeNo,
Subject: product.ProductName,
Amount: amount,
Platform: payment.PlatformApp,
NotifyURL: p.config.Wxpay.NotifyUrl,
}
// 如果是小程序支付,需要获取用户的 OpenID
if platform == "mp-weixin" {
userAuth, err := p.userAuthModel.FindOneByUserIdAuthType(ctx, userID, model.UserAuthTypeWechatMiniOpenID)
if err != nil {
return fmt.Errorf("获取用户认证信息失败: %v", err)
}
orderReq.OpenID = userAuth.AuthKey
}
resp, err := p.wechatService.CreateOrder(orderReq)
if err != nil {
return fmt.Errorf("创建微信支付订单失败: %v", err)
}
payData = resp.PayParams
outTradeNo = resp.OrderNo
// case "apple":
// orderReq := &payment.AppleCreateOrderRequest{
// Amount: amount,
// Subject: product.ProductName,
// OutTradeNo: outTradeNo,
// Platform: payment.PlatformApp,
// NotifyURL: p.config.Applepay.ProductionVerifyURL,
// }
// resp, err := p.appleService.CreateOrder(ctx, orderReq)
// if err != nil {
// return fmt.Errorf("创建苹果支付订单失败: %v", err)
// }
// payData = resp.PayParams
default:
return fmt.Errorf("不支持的支付方式: %s", req.PayMethod)
}
// 创建订单记录
order := &model.Order{
OrderNo: outTradeNo,
UserId: userID,
ProductId: product.Id,
PaymentPlatform: string(req.PayMethod),
PaymentScene: platform,
Amount: amount,
Status: model.OrderStatusPending,
}
result, err := p.orderModel.Insert(ctx, session, order)
if err != nil {
return fmt.Errorf("创建订单记录失败: %v", err)
}
orderID, err = result.LastInsertId()
if err != nil {
return fmt.Errorf("获取订单ID失败: %v", err)
}
return nil
})
if err != nil {
return nil, err
}
return &CreateOrderResponse{
OrderNo: outTradeNo,
PayData: payData,
PayMethod: req.PayMethod,
OrderID: orderID,
}, nil
}
// HandlePaymentCallback 处理支付回调
func (p *PayService) HandlePaymentCallback(ctx context.Context, payType string, req *http.Request) error {
return p.orderModel.Trans(ctx, func(ctx context.Context, session sqlx.Session) error {
var payOrder *payment.QueryOrderResponse
var err error
switch payType {
case "alipay":
payOrder, err = p.handleAlipayCallback(ctx, req, session)
case "wechat":
payOrder, err = p.handleWechatCallback(ctx, req, session)
case "apple":
payOrder, err = p.handleAppleCallback(ctx, req, session)
default:
return fmt.Errorf("不支持的支付类型: %s", payType)
}
if err != nil {
return err
}
if payOrder == nil {
return fmt.Errorf("支付订单信息为空")
}
// 查询订单
order, err := p.orderModel.FindOneByOrderNo(ctx, payOrder.OrderNo)
if err != nil {
return fmt.Errorf("查询订单失败: %v", err)
}
// 验证订单金额
if payOrder.Amount != order.Amount {
return fmt.Errorf("订单金额不匹配")
}
// 根据支付状态更新订单状态
switch payOrder.Status {
case payment.StatusSuccess:
order.Status = model.OrderStatusPaid
case payment.StatusFailed:
order.Status = model.OrderStatusFailed
case payment.StatusClosed:
order.Status = model.OrderStatusClosed
case payment.StatusRefunded:
order.Status = model.OrderStatusRefunding
default:
return fmt.Errorf("不支持的支付状态: %s", payOrder.Status)
}
// 更新订单状态
order.PlatformOrderId = sql.NullString{String: payOrder.TransactionID, Valid: true}
_, err = p.orderModel.Update(ctx, session, order)
if err != nil {
return fmt.Errorf("更新订单状态失败: %v", err)
}
return nil
})
}
// handleAlipayCallback 处理支付宝回调
func (p *PayService) handleAlipayCallback(ctx context.Context, req *http.Request, session sqlx.Session) (*payment.QueryOrderResponse, error) {
return p.alipayService.HandlePaymentNotification(req)
}
// handleWechatCallback 处理微信支付回调
func (p *PayService) handleWechatCallback(ctx context.Context, req *http.Request, session sqlx.Session) (*payment.QueryOrderResponse, error) {
notification, err := p.wechatService.HandlePaymentNotification(req)
if err != nil {
return nil, fmt.Errorf("处理微信支付回调失败: %v", err)
}
// 将微信支付通知转换为统一的查询订单响应格式
return &payment.QueryOrderResponse{
OrderNo: notification.OrderNo,
TransactionID: notification.TransactionID,
Status: notification.Status,
Amount: notification.Amount,
PayTime: notification.PayTime,
PayMethod: payment.MethodWechat,
}, nil
}
// handleAppleCallback 处理苹果支付回调
func (p *PayService) handleAppleCallback(ctx context.Context, req *http.Request, session sqlx.Session) (*payment.QueryOrderResponse, error) {
receipt := req.FormValue("receipt-data")
if receipt == "" {
return nil, fmt.Errorf("无效的苹果支付收据")
}
verifyResp, err := p.appleService.VerifyReceipt(ctx, receipt)
if err != nil {
return nil, fmt.Errorf("验证苹果支付收据失败: %v", err)
}
if verifyResp.Status != payment.StatusSuccess {
return nil, fmt.Errorf("苹果支付验证失败,状态码: %s", verifyResp.Status)
}
// 将苹果支付验证响应转换为统一的查询订单响应格式
return &payment.QueryOrderResponse{
OrderNo: verifyResp.OrderNo,
TransactionID: verifyResp.TransactionID,
Status: verifyResp.Status,
Amount: verifyResp.Amount,
PayTime: time.Now(),
PayMethod: payment.MethodApple,
}, nil
}
// Refund 申请退款
func (p *PayService) Refund(ctx context.Context, req *RefundRequest) (*RefundResponse, error) {
// 查询订单信息
order, err := p.orderModel.FindOne(ctx, req.OrderId)
if err != nil {
return nil, fmt.Errorf("查询订单失败: %v", err)
}
// 验证订单状态
if order.Status != model.OrderStatusPaid {
return nil, fmt.Errorf("订单状态为 %s无法退款", order.Status)
}
if req.RefundAmount > order.Amount {
return nil, fmt.Errorf("退款金额 %.2f 不能大于订单金额 %.2f", req.RefundAmount, order.Amount)
}
var result refundResult
result.status = model.OrderRefundStatusPending
order.Status = model.OrderStatusRefunding
// 使用事务处理退款流程
err = p.orderModel.Trans(ctx, func(ctx context.Context, session sqlx.Session) error {
// 根据支付方式申请退款
switch order.PaymentPlatform {
case string(PayMethodAlipay):
refundReq := &payment.AlipayRefundRequest{
OrderNo: order.OrderNo,
RefundAmount: req.RefundAmount,
}
resp, err := p.alipayService.Refund(ctx, refundReq)
if err != nil {
return fmt.Errorf("支付宝退款申请失败: %v", err)
}
result = refundResult{
refundNo: resp.RefundNo,
status: model.OrderRefundStatusSuccess,
refundTime: resp.RefundTime,
refundAmount: resp.RefundAmount,
platformRefundId: sql.NullString{String: resp.RefundID, Valid: true},
}
order.Status = model.OrderRefundStatusSuccess
default:
return fmt.Errorf("不支持的支付平台退款: %s", order.PaymentPlatform)
}
// 创建退款记录
refund := &model.OrderRefund{
RefundNo: result.refundNo,
PlatformRefundId: result.platformRefundId,
OrderId: order.Id,
UserId: order.UserId,
ProductId: order.ProductId,
RefundAmount: result.refundAmount,
RefundReason: sql.NullString{String: req.Reason, Valid: true},
Status: result.status,
RefundTime: sql.NullTime{Time: result.refundTime, Valid: !result.refundTime.IsZero()},
}
if _, err := p.orderRefundModel.Insert(ctx, session, refund); err != nil {
return fmt.Errorf("创建退款记录失败: %v", err)
}
// 更新订单状态
order.Status = model.OrderStatusRefunding
order.RefundTime = sql.NullTime{Time: result.refundTime, Valid: !result.refundTime.IsZero()}
if _, err := p.orderModel.Update(ctx, session, order); err != nil {
return fmt.Errorf("更新订单状态失败: %v", err)
}
return nil
})
if err != nil {
return nil, err
}
return &RefundResponse{
RefundNo: result.refundNo,
Amount: result.refundAmount,
Status: result.status,
}, nil
}
// QueryOrderStatus 查询订单状态
func (p *PayService) QueryOrderStatus(ctx context.Context, orderNo string) (*OrderStatusResponse, error) {
// 查询订单信息
order, err := p.orderModel.FindOneByOrderNo(ctx, orderNo)
if err != nil {
return nil, fmt.Errorf("查询订单失败: %v", err)
}
// 根据支付方式查询支付状态
var payStatus payment.PaymentStatus
switch order.PaymentPlatform {
case "alipay":
queryReq := &payment.QueryOrderRequest{
OrderNo: orderNo,
}
resp, err := p.alipayService.QueryOrder(ctx, queryReq)
if err != nil {
return nil, fmt.Errorf("查询支付宝订单状态失败: %v", err)
}
payStatus = resp.Status
// case "wechat":
// queryReq := &payment.OrderQuery{
// OrderNo: orderNo,
// }
// resp, err := p.wechatService.QueryOrder(queryReq)
// if err != nil {
// return nil, fmt.Errorf("查询微信支付订单状态失败: %v", err)
// }
// payStatus = resp.Status
// case "apple":
// return nil, fmt.Errorf("苹果支付暂不支持主动查询订单状态")
default:
return nil, fmt.Errorf("不支持的支付方式: %s", order.PaymentPlatform)
}
return &OrderStatusResponse{
OrderNo: orderNo,
PayMethod: PayMethod(order.PaymentPlatform),
PayStatus: string(payStatus),
OrderStatus: order.Status,
Amount: order.Amount,
}, nil
}
type PayMethod string
const (
PayMethodAlipay PayMethod = "alipay"
PayMethodWechat PayMethod = "wechat"
PayMethodApple PayMethod = "apple"
)
// 请求和响应结构体定义
type CreateOrderRequest struct {
PayMethod PayMethod `json:"pay_method"` // 支付方式alipay, wechat, apple
ProductEn string `json:"product_en"` // 商品英文名
}
type CreateOrderResponse struct {
OrderNo string `json:"order_no"` // 订单号
PayData interface{} `json:"pay_data"` // 支付数据
PayMethod PayMethod `json:"pay_type"` // 支付方式
OrderID int64 `json:"order_id"` // 订单ID
}
type RefundRequest struct {
OrderId int64 `json:"order_id"` // 订单ID
RefundAmount float64 `json:"refund_amount"` // 退款金额
Reason string `json:"reason"` // 退款原因
}
// 定义退款结果结构
type refundResult struct {
refundNo string
status string
refundTime time.Time
refundAmount float64
platformRefundId sql.NullString
}
type RefundResponse struct {
RefundNo string `json:"refund_no"` // 退款单号
Amount float64 `json:"amount"` // 退款金额
Status string `json:"status"` // 退款状态
}
type OrderStatusResponse struct {
OrderNo string `json:"order_no"` // 订单号
PayMethod PayMethod `json:"pay_type"` // 支付方式
PayStatus string `json:"pay_status"` // 支付状态
OrderStatus string `json:"order_status"` // 订单状态
Amount float64 `json:"amount"` // 订单金额
}

View File

@ -1,260 +0,0 @@
package service
import (
"context"
"fmt"
"net/http"
"strconv"
"time"
"tyc-server/app/main/api/internal/config"
"tyc-server/app/main/model"
"tyc-server/common/ctxdata"
"tyc-server/pkg/lzkit/lzUtils"
"github.com/wechatpay-apiv3/wechatpay-go/core"
"github.com/wechatpay-apiv3/wechatpay-go/core/auth/verifiers"
"github.com/wechatpay-apiv3/wechatpay-go/core/downloader"
"github.com/wechatpay-apiv3/wechatpay-go/core/notify"
"github.com/wechatpay-apiv3/wechatpay-go/core/option"
"github.com/wechatpay-apiv3/wechatpay-go/services/payments"
"github.com/wechatpay-apiv3/wechatpay-go/services/payments/app"
"github.com/wechatpay-apiv3/wechatpay-go/services/payments/jsapi"
"github.com/wechatpay-apiv3/wechatpay-go/services/refunddomestic"
"github.com/wechatpay-apiv3/wechatpay-go/utils"
"github.com/zeromicro/go-zero/core/logx"
)
const (
TradeStateSuccess = "SUCCESS" // 支付成功
TradeStateRefund = "REFUND" // 转入退款
TradeStateNotPay = "NOTPAY" // 未支付
TradeStateClosed = "CLOSED" // 已关闭
TradeStateRevoked = "REVOKED" // 已撤销(付款码支付)
TradeStateUserPaying = "USERPAYING" // 用户支付中(付款码支付)
TradeStatePayError = "PAYERROR" // 支付失败(其他原因,如银行返回失败)
)
type WechatPayService struct {
config config.WxpayConfig
wechatClient *core.Client
notifyHandler *notify.Handler
userAuthModel model.UserAuthModel
}
// NewWechatPayService 初始化微信支付服务
func NewWechatPayService(c config.Config, userAuthModel model.UserAuthModel) *WechatPayService {
// 从配置中加载商户信息
mchID := c.Wxpay.MchID
mchCertificateSerialNumber := c.Wxpay.MchCertificateSerialNumber
mchAPIv3Key := c.Wxpay.MchApiv3Key
// 从文件中加载商户私钥
mchPrivateKey, err := utils.LoadPrivateKeyWithPath(c.Wxpay.MchPrivateKeyPath)
if err != nil {
logx.Errorf("加载商户私钥失败: %v", err)
panic(fmt.Sprintf("初始化失败,服务停止: %v", err)) // 记录错误并停止程序
}
// 使用商户私钥和其他参数初始化微信支付客户端
opts := []core.ClientOption{
option.WithWechatPayAutoAuthCipher(mchID, mchCertificateSerialNumber, mchPrivateKey, mchAPIv3Key),
}
client, err := core.NewClient(context.Background(), opts...)
if err != nil {
logx.Errorf("创建微信支付客户端失败: %v", err)
panic(fmt.Sprintf("初始化失败,服务停止: %v", err)) // 记录错误并停止程序
}
// 在初始化时获取证书访问器并创建 notifyHandler
certificateVisitor := downloader.MgrInstance().GetCertificateVisitor(mchID)
notifyHandler, err := notify.NewRSANotifyHandler(mchAPIv3Key, verifiers.NewSHA256WithRSAVerifier(certificateVisitor))
if err != nil {
logx.Errorf("获取证书访问器失败: %v", err)
panic(fmt.Sprintf("初始化失败,服务停止: %v", err)) // 记录错误并停止程序
}
return &WechatPayService{
config: c.Wxpay,
wechatClient: client,
notifyHandler: notifyHandler,
userAuthModel: userAuthModel,
}
}
// CreateWechatAppOrder 创建微信APP支付订单
func (w *WechatPayService) CreateWechatAppOrder(ctx context.Context, amount float64, description string, outTradeNo string) (string, error) {
totalAmount := lzUtils.ToWechatAmount(amount)
// 构建支付请求参数
payRequest := app.PrepayRequest{
Appid: core.String(w.config.AppID),
Mchid: core.String(w.config.MchID),
Description: core.String(description),
OutTradeNo: core.String(outTradeNo),
NotifyUrl: core.String(w.config.NotifyUrl),
Amount: &app.Amount{
Total: core.Int64(totalAmount),
},
}
// 初始化 AppApiService
svc := app.AppApiService{Client: w.wechatClient}
// 发起预支付请求
resp, result, err := svc.Prepay(ctx, payRequest)
if err != nil {
return "", fmt.Errorf("微信支付订单创建失败: %v, 状态码: %d", err, result.Response.StatusCode)
}
// 返回预支付交易会话标识
return *resp.PrepayId, nil
}
// CreateWechatMiniProgramOrder 创建微信小程序支付订单
func (w *WechatPayService) CreateWechatMiniProgramOrder(ctx context.Context, amount float64, description string, outTradeNo string, openid string) (interface{}, error) {
totalAmount := lzUtils.ToWechatAmount(amount)
// 构建支付请求参数
payRequest := jsapi.PrepayRequest{
Appid: core.String(w.config.AppID),
Mchid: core.String(w.config.MchID),
Description: core.String(description),
OutTradeNo: core.String(outTradeNo),
NotifyUrl: core.String(w.config.NotifyUrl),
Amount: &jsapi.Amount{
Total: core.Int64(totalAmount),
},
Payer: &jsapi.Payer{
Openid: core.String(openid), // 用户的 OpenID通过前端传入
}}
// 初始化 AppApiService
svc := jsapi.JsapiApiService{Client: w.wechatClient}
// 发起预支付请求
resp, result, err := svc.PrepayWithRequestPayment(ctx, payRequest)
if err != nil {
return "", fmt.Errorf("微信支付订单创建失败: %v, 状态码: %d", err, result.Response.StatusCode)
}
// 返回预支付交易会话标识
return resp, nil
}
// CreateWechatOrder 创建微信支付订单(集成 APP、H5、小程序
func (w *WechatPayService) CreateWechatOrder(ctx context.Context, amount float64, description string, outTradeNo string) (interface{}, error) {
// 根据 ctx 中的 platform 判断平台
platform := ctx.Value("platform").(string)
var prepayData interface{}
var err error
switch platform {
case "mp-weixin":
userID, getUidErr := ctxdata.GetUidFromCtx(ctx)
if getUidErr != nil {
return "", fmt.Errorf("获取用户信息失败: %s", getUidErr)
}
userAuthModel, findUserAuthErr := w.userAuthModel.FindOneByUserIdAuthType(ctx, userID, "wx_mini")
if findUserAuthErr != nil {
return "", fmt.Errorf("获取用户认证信息失败: %s", findUserAuthErr)
}
// 如果是小程序平台,调用小程序支付订单创建
prepayData, err = w.CreateWechatMiniProgramOrder(ctx, amount, description, outTradeNo, userAuthModel.AuthKey)
case "app":
// 如果是 APP 平台,调用 APP 支付订单创建
prepayData, err = w.CreateWechatAppOrder(ctx, amount, description, outTradeNo)
default:
return "", fmt.Errorf("不支持的支付平台: %s", platform)
}
// 如果创建支付订单失败,返回错误
if err != nil {
return "", fmt.Errorf("支付订单创建失败: %v", err)
}
// 返回预支付ID
return prepayData, nil
}
// HandleWechatPayNotification 处理微信支付回调
func (w *WechatPayService) HandleWechatPayNotification(ctx context.Context, req *http.Request) (*payments.Transaction, error) {
transaction := new(payments.Transaction)
_, err := w.notifyHandler.ParseNotifyRequest(ctx, req, transaction)
if err != nil {
return nil, fmt.Errorf("微信支付通知处理失败: %v", err)
}
// 返回交易信息
return transaction, nil
}
// HandleRefundNotification 处理微信退款回调
func (w *WechatPayService) HandleRefundNotification(ctx context.Context, req *http.Request) (*refunddomestic.Refund, error) {
refund := new(refunddomestic.Refund)
_, err := w.notifyHandler.ParseNotifyRequest(ctx, req, refund)
if err != nil {
return nil, fmt.Errorf("微信退款回调通知处理失败: %v", err)
}
return refund, nil
}
// QueryOrderStatus 主动查询订单状态
func (w *WechatPayService) QueryOrderStatus(ctx context.Context, transactionID string) (*payments.Transaction, error) {
svc := jsapi.JsapiApiService{Client: w.wechatClient}
// 调用 QueryOrderById 方法查询订单状态
resp, result, err := svc.QueryOrderById(ctx, jsapi.QueryOrderByIdRequest{
TransactionId: core.String(transactionID),
Mchid: core.String(w.config.MchID),
})
if err != nil {
return nil, fmt.Errorf("订单查询失败: %v, 状态码: %d", err, result.Response.StatusCode)
}
return resp, nil
}
// WeChatRefund 申请微信退款
func (w *WechatPayService) WeChatRefund(ctx context.Context, outTradeNo string, refundAmount float64, totalAmount float64) error {
// 生成唯一的退款单号
outRefundNo := fmt.Sprintf("%s-refund", outTradeNo)
// 初始化退款服务
svc := refunddomestic.RefundsApiService{Client: w.wechatClient}
// 创建退款请求
resp, result, err := svc.Create(ctx, refunddomestic.CreateRequest{
OutTradeNo: core.String(outTradeNo),
OutRefundNo: core.String(outRefundNo),
NotifyUrl: core.String(w.config.RefundNotifyUrl),
Amount: &refunddomestic.AmountReq{
Currency: core.String("CNY"),
Refund: core.Int64(lzUtils.ToWechatAmount(refundAmount)),
Total: core.Int64(lzUtils.ToWechatAmount(totalAmount)),
},
})
if err != nil {
return fmt.Errorf("微信订单申请退款错误: %v", err)
}
// 打印退款结果
logx.Infof("退款申请成功,状态码=%d退款单号=%s微信退款单号=%s", result.Response.StatusCode, *resp.OutRefundNo, *resp.RefundId)
return nil
}
// GenerateOutTradeNo 生成唯一订单号
func (w *WechatPayService) GenerateOutTradeNo() string {
length := 16
timestamp := time.Now().UnixNano()
timeStr := strconv.FormatInt(timestamp, 10)
randomPart := strconv.Itoa(int(timestamp % 1e6))
combined := timeStr + randomPart
if len(combined) >= length {
return combined[:length]
}
for len(combined) < length {
combined += strconv.Itoa(int(timestamp % 10))
}
return combined
}

View File

@ -21,7 +21,19 @@ type ServiceContext struct {
SourceInterceptor rest.Middleware
AuthInterceptor rest.Middleware
// 模型
// 服务
PayService *service.PayService
WestDexService *service.WestDexService
YushanService *service.YushanService
TianjuService *service.TianjuService
ApiRequestService *service.ApiRequestService
AsynqServer *asynq.Server
AsynqService *service.AsynqService
VerificationService *service.VerificationService
DictService *service.DictService
AdminPromotionLinkStatsService *service.AdminPromotionLinkStatsService
// 基础模型
UserModel model.UserModel
UserAuthModel model.UserAuthModel
ProductModel model.ProductModel
@ -29,26 +41,13 @@ type ServiceContext struct {
ProductFeatureModel model.ProductFeatureModel
ProductRenderModel model.ProductRenderModel
OrderModel model.OrderModel
OrderRefundModel model.OrderRefundModel
QueryModel model.QueryModel
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
DictService *service.DictService
AdminPromotionLinkStatsService *service.AdminPromotionLinkStatsService
// admin
// 管理后台模型
AdminApiModel model.AdminApiModel
AdminMenuModel model.AdminMenuModel
AdminRoleModel model.AdminRoleModel
@ -59,20 +58,24 @@ type ServiceContext struct {
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 {
db := sqlx.NewMysql(c.DataSource)
// 初始化基础服务
func initBaseServices(c config.Config) (*redis.Redis, *asynq.Server) {
// 初始化Redis
redisConf := redis.RedisConf{
Host: c.CacheRedis[0].Host,
Pass: c.CacheRedis[0].Pass,
Type: c.CacheRedis[0].Type,
}
r := redis.MustNewRedis(redisConf)
// 初始化Asynq服务
asynqServer := asynq.NewServer(
asynq.RedisClientOpt{Addr: c.CacheRedis[0].Host, Password: c.CacheRedis[0].Pass},
asynq.Config{
@ -83,80 +86,203 @@ 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)
return r, asynqServer
}
// 初始化基础模型
func initBaseModels(db sqlx.SqlConn, c config.Config) *BaseModels {
return &BaseModels{
UserModel: model.NewUserModel(db, c.CacheRedis),
UserAuthModel: model.NewUserAuthModel(db, c.CacheRedis),
ProductModel: model.NewProductModel(db, c.CacheRedis),
FeatureModel: model.NewFeatureModel(db, c.CacheRedis),
ProductFeatureModel: model.NewProductFeatureModel(db, c.CacheRedis),
ProductRenderModel: model.NewProductRenderModel(db, c.CacheRedis),
OrderModel: model.NewOrderModel(db, c.CacheRedis),
OrderRefundModel: model.NewOrderRefundModel(db, c.CacheRedis),
QueryModel: model.NewQueryModel(db, c.CacheRedis),
GlobalNotificationsModel: model.NewGlobalNotificationsModel(db, c.CacheRedis),
ExampleModel: model.NewExampleModel(db, c.CacheRedis),
ExampleParamsModel: model.NewExampleParamsModel(db, c.CacheRedis),
}
}
// 初始化管理后台模型
func initAdminModels(db sqlx.SqlConn, c config.Config) *AdminModels {
return &AdminModels{
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),
}
}
// 初始化推广相关模型
func initPromotionModels(db sqlx.SqlConn, c config.Config) *PromotionModels {
return &PromotionModels{
AdminPromotionLinkModel: model.NewAdminPromotionLinkModel(db, c.CacheRedis),
AdminPromotionLinkStatsTotalModel: model.NewAdminPromotionLinkStatsTotalModel(db, c.CacheRedis),
AdminPromotionLinkStatsHistoryModel: model.NewAdminPromotionLinkStatsHistoryModel(db, c.CacheRedis),
AdminPromotionOrderModel: model.NewAdminPromotionOrderModel(db, c.CacheRedis),
}
}
// 初始化业务服务
func initBusinessServices(c config.Config, models *BaseModels, adminModels *AdminModels, promotionModels *PromotionModels) *BusinessServices {
// 初始化基础服务
westDexService := service.NewWestDexService(c)
yushanService := service.NewYushanService(c)
tianjuService := service.NewTianjuService(c)
productFeatureModel := model.NewProductFeatureModel(db, c.CacheRedis)
featureModel := model.NewFeatureModel(db, c.CacheRedis)
userAuthModel := model.NewUserAuthModel(db, c.CacheRedis)
apiRequestService := service.NewApiRequestService(c, westDexService, yushanService, tianjuService, featureModel, productFeatureModel)
// 初始化API请求服务
apiRequestService := service.NewApiRequestService(
c,
westDexService,
yushanService,
tianjuService,
models.FeatureModel,
models.ProductFeatureModel,
)
// 初始化推广统计服务
adminPromotionLinkStatsService := service.NewAdminPromotionLinkStatsService(&service.ServiceContext{
AdminPromotionLinkModel: adminPromotionLinkModel,
AdminPromotionLinkStatsTotalModel: adminPromotionLinkStatsTotalModel,
AdminPromotionLinkStatsHistoryModel: adminPromotionLinkStatsHistoryModel,
AdminPromotionLinkModel: promotionModels.AdminPromotionLinkModel,
AdminPromotionLinkStatsTotalModel: promotionModels.AdminPromotionLinkStatsTotalModel,
AdminPromotionLinkStatsHistoryModel: promotionModels.AdminPromotionLinkStatsHistoryModel,
})
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),
return &BusinessServices{
PayService: service.NewPayService(c, models.OrderModel, models.OrderRefundModel, models.ProductModel, models.UserAuthModel),
WestDexService: westDexService,
YushanService: yushanService,
TianjuService: tianjuService,
AdminPromotionLinkStatsService: adminPromotionLinkStatsService,
VerificationService: service.NewVerificationService(c, westDexService, apiRequestService),
AsynqServer: asynqServer,
ApiRequestService: apiRequestService,
AsynqService: service.NewAsynqService(c),
DictService: dictService,
UserModel: model.NewUserModel(db, c.CacheRedis),
UserAuthModel: userAuthModel,
ProductModel: model.NewProductModel(db, c.CacheRedis),
ProductRenderModel: model.NewProductRenderModel(db, c.CacheRedis),
OrderModel: model.NewOrderModel(db, c.CacheRedis),
QueryModel: model.NewQueryModel(db, c.CacheRedis),
ExampleModel: model.NewExampleModel(db, c.CacheRedis),
ExampleParamsModel: model.NewExampleParamsModel(db, c.CacheRedis),
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,
VerificationService: service.NewVerificationService(c, westDexService, apiRequestService),
DictService: service.NewDictService(adminModels.AdminDictTypeModel, adminModels.AdminDictDataModel),
AdminPromotionLinkStatsService: adminPromotionLinkStatsService,
}
}
func NewServiceContext(c config.Config) *ServiceContext {
// 初始化数据库连接
db := sqlx.NewMysql(c.DataSource)
// 初始化基础服务
redis, asynqServer := initBaseServices(c)
// 初始化各种模型
baseModels := initBaseModels(db, c)
adminModels := initAdminModels(db, c)
promotionModels := initPromotionModels(db, c)
// 初始化业务服务
businessServices := initBusinessServices(c, baseModels, adminModels, promotionModels)
return &ServiceContext{
Config: c,
Redis: redis,
AsynqServer: asynqServer,
SourceInterceptor: middleware.NewSourceInterceptorMiddleware().Handle,
AuthInterceptor: middleware.NewAuthInterceptorMiddleware(c).Handle,
// 注入业务服务
PayService: businessServices.PayService,
WestDexService: businessServices.WestDexService,
YushanService: businessServices.YushanService,
TianjuService: businessServices.TianjuService,
ApiRequestService: businessServices.ApiRequestService,
AsynqService: businessServices.AsynqService,
VerificationService: businessServices.VerificationService,
DictService: businessServices.DictService,
AdminPromotionLinkStatsService: businessServices.AdminPromotionLinkStatsService,
// 注入基础模型
UserModel: baseModels.UserModel,
UserAuthModel: baseModels.UserAuthModel,
ProductModel: baseModels.ProductModel,
FeatureModel: baseModels.FeatureModel,
ProductFeatureModel: baseModels.ProductFeatureModel,
ProductRenderModel: baseModels.ProductRenderModel,
OrderModel: baseModels.OrderModel,
OrderRefundModel: baseModels.OrderRefundModel,
QueryModel: baseModels.QueryModel,
GlobalNotificationsModel: baseModels.GlobalNotificationsModel,
ExampleModel: baseModels.ExampleModel,
ExampleParamsModel: baseModels.ExampleParamsModel,
// 注入管理后台模型
AdminApiModel: adminModels.AdminApiModel,
AdminMenuModel: adminModels.AdminMenuModel,
AdminRoleModel: adminModels.AdminRoleModel,
AdminRoleApiModel: adminModels.AdminRoleApiModel,
AdminRoleMenuModel: adminModels.AdminRoleMenuModel,
AdminUserModel: adminModels.AdminUserModel,
AdminUserRoleModel: adminModels.AdminUserRoleModel,
AdminDictDataModel: adminModels.AdminDictDataModel,
AdminDictTypeModel: adminModels.AdminDictTypeModel,
// 注入推广相关模型
AdminPromotionLinkModel: promotionModels.AdminPromotionLinkModel,
AdminPromotionLinkStatsTotalModel: promotionModels.AdminPromotionLinkStatsTotalModel,
AdminPromotionLinkStatsHistoryModel: promotionModels.AdminPromotionLinkStatsHistoryModel,
AdminPromotionOrderModel: promotionModels.AdminPromotionOrderModel,
}
}
// 辅助结构体,用于分组初始化
type BaseModels struct {
UserModel model.UserModel
UserAuthModel model.UserAuthModel
ProductModel model.ProductModel
FeatureModel model.FeatureModel
ProductFeatureModel model.ProductFeatureModel
ProductRenderModel model.ProductRenderModel
OrderModel model.OrderModel
OrderRefundModel model.OrderRefundModel
QueryModel model.QueryModel
GlobalNotificationsModel model.GlobalNotificationsModel
ExampleModel model.ExampleModel
ExampleParamsModel model.ExampleParamsModel
}
type AdminModels struct {
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
}
type PromotionModels struct {
AdminPromotionLinkModel model.AdminPromotionLinkModel
AdminPromotionLinkStatsTotalModel model.AdminPromotionLinkStatsTotalModel
AdminPromotionLinkStatsHistoryModel model.AdminPromotionLinkStatsHistoryModel
AdminPromotionOrderModel model.AdminPromotionOrderModel
}
type BusinessServices struct {
PayService *service.PayService
WestDexService *service.WestDexService
YushanService *service.YushanService
TianjuService *service.TianjuService
ApiRequestService *service.ApiRequestService
AsynqService *service.AsynqService
VerificationService *service.VerificationService
DictService *service.DictService
AdminPromotionLinkStatsService *service.AdminPromotionLinkStatsService
}
func (s *ServiceContext) Close() {
if s.AsynqService != nil {
s.AsynqService.Close()

View File

@ -1,6 +1,70 @@
// Code generated by goctl. DO NOT EDIT.
package types
type AdminCreateFeatureReq struct {
ApiId string `json:"api_id"` // API标识
Name string `json:"name"` // 描述
}
type AdminCreateFeatureResp struct {
Id int64 `json:"id"` // 功能ID
}
type AdminCreateNotificationReq struct {
Title string `json:"title"` // 通知标题
NotificationPage string `json:"notification_page"` // 通知页面
Content string `json:"content"` // 通知内容
StartDate string `json:"start_date"` // 生效开始日期yyyy-MM-dd
StartTime string `json:"start_time"` // 生效开始时间HH:mm:ss
EndDate string `json:"end_date"` // 生效结束日期yyyy-MM-dd
EndTime string `json:"end_time"` // 生效结束时间HH:mm:ss
Status int64 `json:"status"` // 状态1-启用0-禁用
}
type AdminCreateNotificationResp struct {
Id int64 `json:"id"` // 通知ID
}
type AdminCreateOrderReq struct {
OrderNo string `json:"order_no"` // 商户订单号
PlatformOrderId string `json:"platform_order_id"` // 支付订单号
ProductName string `json:"product_name"` // 产品名称
PaymentPlatform string `json:"payment_platform"` // 支付方式
PaymentScene string `json:"payment_scene"` // 支付平台
Amount float64 `json:"amount"` // 金额
Status string `json:"status,default=pending"` // 支付状态pending-待支付paid-已支付refunded-已退款closed-已关闭failed-支付失败
IsPromotion int64 `json:"is_promotion,default=0"` // 是否推广订单0-否1-是
}
type AdminCreateOrderResp struct {
Id int64 `json:"id"` // 订单ID
}
type AdminCreatePlatformUserReq struct {
Mobile string `json:"mobile"` // 手机号
Password string `json:"password"` // 密码
Nickname string `json:"nickname"` // 昵称
Info string `json:"info"` // 备注信息
Inside int64 `json:"inside"` // 是否内部用户 1-是 0-否
}
type AdminCreatePlatformUserResp struct {
Id int64 `json:"id"` // 用户ID
}
type AdminCreateProductReq struct {
ProductName string `json:"product_name"` // 服务名
ProductEn string `json:"product_en"` // 英文名
Description string `json:"description"` // 描述
Notes string `json:"notes,optional"` // 备注
CostPrice float64 `json:"cost_price"` // 成本
SellPrice float64 `json:"sell_price"` // 售价
}
type AdminCreateProductResp struct {
Id int64 `json:"id"` // 产品ID
}
type AdminCreateUserReq struct {
Username string `json:"username"` // 用户名
RealName string `json:"real_name"` // 真实姓名
@ -12,6 +76,46 @@ type AdminCreateUserResp struct {
Id int64 `json:"id"` // 用户ID
}
type AdminDeleteFeatureReq struct {
Id int64 `path:"id"` // 功能ID
}
type AdminDeleteFeatureResp struct {
Success bool `json:"success"` // 是否成功
}
type AdminDeleteNotificationReq struct {
Id int64 `path:"id"` // 通知ID
}
type AdminDeleteNotificationResp struct {
Success bool `json:"success"` // 是否成功
}
type AdminDeleteOrderReq struct {
Id int64 `path:"id"` // 订单ID
}
type AdminDeleteOrderResp struct {
Success bool `json:"success"` // 是否成功
}
type AdminDeletePlatformUserReq struct {
Id int64 `path:"id"` // 用户ID
}
type AdminDeletePlatformUserResp struct {
Success bool `json:"success"` // 是否成功
}
type AdminDeleteProductReq struct {
Id int64 `path:"id"` // 产品ID
}
type AdminDeleteProductResp struct {
Success bool `json:"success"` // 是否成功
}
type AdminDeleteUserReq struct {
Id int64 `path:"id"` // 用户ID
}
@ -20,6 +124,183 @@ type AdminDeleteUserResp struct {
Success bool `json:"success"` // 是否成功
}
type AdminGetFeatureDetailReq struct {
Id int64 `path:"id"` // 功能ID
}
type AdminGetFeatureDetailResp struct {
Id int64 `json:"id"` // 功能ID
ApiId string `json:"api_id"` // API标识
Name string `json:"name"` // 描述
CreateTime string `json:"create_time"` // 创建时间
UpdateTime string `json:"update_time"` // 更新时间
}
type AdminGetFeatureListReq struct {
Page int64 `form:"page"` // 页码
PageSize int64 `form:"pageSize"` // 每页数量
ApiId *string `form:"api_id,optional"` // API标识
Name *string `form:"name,optional"` // 描述
}
type AdminGetFeatureListResp struct {
Total int64 `json:"total"` // 总数
Items []FeatureListItem `json:"items"` // 列表数据
}
type AdminGetNotificationDetailReq struct {
Id int64 `path:"id"` // 通知ID
}
type AdminGetNotificationDetailResp struct {
Id int64 `json:"id"` // 通知ID
Title string `json:"title"` // 通知标题
Content string `json:"content"` // 通知内容
NotificationPage string `json:"notification_page"` // 通知页面
StartDate string `json:"start_date"` // 生效开始日期
StartTime string `json:"start_time"` // 生效开始时间
EndDate string `json:"end_date"` // 生效结束日期
EndTime string `json:"end_time"` // 生效结束时间
Status int64 `json:"status"` // 状态
CreateTime string `json:"create_time"` // 创建时间
UpdateTime string `json:"update_time"` // 更新时间
}
type AdminGetNotificationListReq struct {
Page int64 `form:"page"` // 页码
PageSize int64 `form:"pageSize"` // 每页数量
Title *string `form:"title,optional"` // 通知标题(可选)
NotificationPage *string `form:"notification_page,optional"` // 通知页面(可选)
Status *int64 `form:"status,optional"` // 状态(可选)
StartDate *string `form:"start_date,optional"` // 开始日期范围(可选)
EndDate *string `form:"end_date,optional"` // 结束日期范围(可选)
}
type AdminGetNotificationListResp struct {
Total int64 `json:"total"` // 总数
Items []NotificationListItem `json:"items"` // 列表数据
}
type AdminGetOrderDetailReq struct {
Id int64 `path:"id"` // 订单ID
}
type AdminGetOrderDetailResp struct {
Id int64 `json:"id"` // 订单ID
OrderNo string `json:"order_no"` // 商户订单号
PlatformOrderId string `json:"platform_order_id"` // 支付订单号
ProductName string `json:"product_name"` // 产品名称
PaymentPlatform string `json:"payment_platform"` // 支付方式
PaymentScene string `json:"payment_scene"` // 支付平台
Amount float64 `json:"amount"` // 金额
Status string `json:"status"` // 支付状态pending-待支付paid-已支付refunded-已退款closed-已关闭failed-支付失败
CreateTime string `json:"create_time"` // 创建时间
PayTime string `json:"pay_time"` // 支付时间
RefundTime string `json:"refund_time"` // 退款时间
IsPromotion int64 `json:"is_promotion"` // 是否推广订单0-否1-是
UpdateTime string `json:"update_time"` // 更新时间
}
type AdminGetOrderListReq struct {
Page int64 `form:"page,default=1"` // 页码
PageSize int64 `form:"pageSize,default=20"` // 每页数量
OrderNo string `form:"order_no,optional"` // 商户订单号
PlatformOrderId string `form:"platform_order_id,optional"` // 支付订单号
ProductName string `form:"product_name,optional"` // 产品名称
PaymentPlatform string `form:"payment_platform,optional"` // 支付方式
PaymentScene string `form:"payment_scene,optional"` // 支付平台
Amount float64 `form:"amount,optional"` // 金额
Status string `form:"status,optional"` // 支付状态pending-待支付paid-已支付refunded-已退款closed-已关闭failed-支付失败
IsPromotion int64 `form:"is_promotion,optional,default=-1"` // 是否推广订单0-否1-是
CreateTimeStart string `form:"create_time_start,optional"` // 创建时间开始
CreateTimeEnd string `form:"create_time_end,optional"` // 创建时间结束
PayTimeStart string `form:"pay_time_start,optional"` // 支付时间开始
PayTimeEnd string `form:"pay_time_end,optional"` // 支付时间结束
RefundTimeStart string `form:"refund_time_start,optional"` // 退款时间开始
RefundTimeEnd string `form:"refund_time_end,optional"` // 退款时间结束
}
type AdminGetOrderListResp struct {
Total int64 `json:"total"` // 总数
Items []OrderListItem `json:"items"` // 列表
}
type AdminGetPlatformUserDetailReq struct {
Id int64 `path:"id"` // 用户ID
}
type AdminGetPlatformUserDetailResp struct {
Id int64 `json:"id"` // 用户ID
Mobile string `json:"mobile"` // 手机号
Nickname string `json:"nickname"` // 昵称
Info string `json:"info"` // 备注信息
Inside int64 `json:"inside"` // 是否内部用户 1-是 0-否
CreateTime string `json:"create_time"` // 创建时间
UpdateTime string `json:"update_time"` // 更新时间
}
type AdminGetPlatformUserListReq struct {
Page int64 `form:"page,default=1"` // 页码
PageSize int64 `form:"pageSize,default=20"` // 每页数量
Mobile string `form:"mobile,optional"` // 手机号
Nickname string `form:"nickname,optional"` // 昵称
Inside int64 `form:"inside,optional"` // 是否内部用户 1-是 0-否
CreateTimeStart string `form:"create_time_start,optional"` // 创建时间开始
CreateTimeEnd string `form:"create_time_end,optional"` // 创建时间结束
OrderBy string `form:"order_by,optional"` // 排序字段
OrderType string `form:"order_type,optional"` // 排序类型
}
type AdminGetPlatformUserListResp struct {
Total int64 `json:"total"` // 总数
Items []PlatformUserListItem `json:"items"` // 列表
}
type AdminGetProductDetailReq struct {
Id int64 `path:"id"` // 产品ID
}
type AdminGetProductDetailResp struct {
Id int64 `json:"id"` // 产品ID
ProductName string `json:"product_name"` // 服务名
ProductEn string `json:"product_en"` // 英文名
Description string `json:"description"` // 描述
Notes string `json:"notes"` // 备注
CostPrice float64 `json:"cost_price"` // 成本
SellPrice float64 `json:"sell_price"` // 售价
CreateTime string `json:"create_time"` // 创建时间
UpdateTime string `json:"update_time"` // 更新时间
}
type AdminGetProductFeatureListReq struct {
ProductId int64 `path:"product_id"` // 产品ID
}
type AdminGetProductFeatureListResp struct {
Id int64 `json:"id"` // 关联ID
ProductId int64 `json:"product_id"` // 产品ID
FeatureId int64 `json:"feature_id"` // 功能ID
ApiId string `json:"api_id"` // API标识
Name string `json:"name"` // 功能描述
Sort int64 `json:"sort"` // 排序
Enable int64 `json:"enable"` // 是否启用
IsImportant int64 `json:"is_important"` // 是否重要
CreateTime string `json:"create_time"` // 创建时间
UpdateTime string `json:"update_time"` // 更新时间
}
type AdminGetProductListReq struct {
Page int64 `form:"page"` // 页码
PageSize int64 `form:"pageSize"` // 每页数量
ProductName *string `form:"product_name,optional"` // 服务名
ProductEn *string `form:"product_en,optional"` // 英文名
}
type AdminGetProductListResp struct {
Total int64 `json:"total"` // 总数
Items []ProductListItem `json:"items"` // 列表数据
}
type AdminGetUserDetailReq struct {
Id int64 `path:"id"` // 用户ID
}
@ -43,8 +324,8 @@ type AdminGetUserListReq struct {
}
type AdminGetUserListResp struct {
Total int64 `json:"total"` // 总数
Items []UserListItem `json:"items"` // 列表
Total int64 `json:"total"` // 总数
Items []AdminUserListItem `json:"items"` // 列表
}
type AdminLoginReq struct {
@ -60,6 +341,98 @@ type AdminLoginResp struct {
Roles []string `json:"roles"`
}
type AdminRefundOrderReq struct {
Id int64 `path:"id"` // 订单ID
RefundAmount float64 `json:"refund_amount"` // 退款金额
RefundReason string `json:"refund_reason"` // 退款原因
}
type AdminRefundOrderResp struct {
Status string `json:"status"` // 退款状态
RefundNo string `json:"refund_no"` // 退款单号
Amount float64 `json:"amount"` // 退款金额
}
type AdminUpdateFeatureReq struct {
Id int64 `path:"id"` // 功能ID
ApiId *string `json:"api_id,optional"` // API标识
Name *string `json:"name,optional"` // 描述
}
type AdminUpdateFeatureResp struct {
Success bool `json:"success"` // 是否成功
}
type AdminUpdateNotificationReq struct {
Id int64 `path:"id"` // 通知ID
Title *string `json:"title,optional"` // 通知标题
Content *string `json:"content,optional"` // 通知内容
NotificationPage *string `json:"notification_page,optional"` // 通知页面
StartDate *string `json:"start_date,optional"` // 生效开始日期
StartTime *string `json:"start_time,optional"` // 生效开始时间
EndDate *string `json:"end_date,optional"` // 生效结束日期
EndTime *string `json:"end_time,optional"` // 生效结束时间
Status *int64 `json:"status,optional"` // 状态
}
type AdminUpdateNotificationResp struct {
Success bool `json:"success"` // 是否成功
}
type AdminUpdateOrderReq struct {
Id int64 `path:"id"` // 订单ID
OrderNo *string `json:"order_no,optional"` // 商户订单号
PlatformOrderId *string `json:"platform_order_id,optional"` // 支付订单号
ProductName *string `json:"product_name,optional"` // 产品名称
PaymentPlatform *string `json:"payment_platform,optional"` // 支付方式
PaymentScene *string `json:"payment_scene,optional"` // 支付平台
Amount *float64 `json:"amount,optional"` // 金额
Status *string `json:"status,optional"` // 支付状态pending-待支付paid-已支付refunded-已退款closed-已关闭failed-支付失败
PayTime *string `json:"pay_time,optional"` // 支付时间
RefundTime *string `json:"refund_time,optional"` // 退款时间
IsPromotion *int64 `json:"is_promotion,optional"` // 是否推广订单0-否1-是
}
type AdminUpdateOrderResp struct {
Success bool `json:"success"` // 是否成功
}
type AdminUpdatePlatformUserReq struct {
Id int64 `path:"id"` // 用户ID
Mobile *string `json:"mobile,optional"` // 手机号
Password *string `json:"password,optional"` // 密码
Nickname *string `json:"nickname,optional"` // 昵称
Info *string `json:"info,optional"` // 备注信息
Inside *int64 `json:"inside,optional"` // 是否内部用户 1-是 0-否
}
type AdminUpdatePlatformUserResp struct {
Success bool `json:"success"` // 是否成功
}
type AdminUpdateProductFeaturesReq struct {
ProductId int64 `path:"product_id"` // 产品ID
Features []ProductFeatureItem `json:"features"` // 功能列表
}
type AdminUpdateProductFeaturesResp struct {
Success bool `json:"success"` // 是否成功
}
type AdminUpdateProductReq struct {
Id int64 `path:"id"` // 产品ID
ProductName *string `json:"product_name,optional"` // 服务名
ProductEn *string `json:"product_en,optional"` // 英文名
Description *string `json:"description,optional"` // 描述
Notes *string `json:"notes,optional"` // 备注
CostPrice *float64 `json:"cost_price,optional"` // 成本
SellPrice *float64 `json:"sell_price,optional"` // 售价
}
type AdminUpdateProductResp struct {
Success bool `json:"success"` // 是否成功
}
type AdminUpdateUserReq struct {
Id int64 `path:"id"` // 用户ID
Username *string `json:"username,optional"` // 用户名
@ -81,6 +454,15 @@ type AdminUserInfoResp struct {
Roles []string `json:"roles"` // 角色编码列表
}
type AdminUserListItem 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 CreateMenuReq struct {
Pid int64 `json:"pid,optional"` // 父菜单ID
Name string `json:"name"` // 路由名称
@ -149,6 +531,14 @@ type Feature struct {
Name string `json:"name"` // 功能描述
}
type FeatureListItem struct {
Id int64 `json:"id"` // 功能ID
ApiId string `json:"api_id"` // API标识
Name string `json:"name"` // 描述
CreateTime string `json:"create_time"` // 创建时间
UpdateTime string `json:"update_time"` // 更新时间
}
type GetMenuAllReq struct {
}
@ -335,6 +725,35 @@ type Notification struct {
EndTime string `json:"endTime"` // 每天通知结束时间,格式 "HH:MM:SS"
}
type NotificationListItem struct {
Id int64 `json:"id"` // 通知ID
Title string `json:"title"` // 通知标题
NotificationPage string `json:"notification_page"` // 通知页面
Content string `json:"content"` // 通知内容
StartDate string `json:"start_date"` // 生效开始日期
StartTime string `json:"start_time"` // 生效开始时间
EndDate string `json:"end_date"` // 生效结束日期
EndTime string `json:"end_time"` // 生效结束时间
Status int64 `json:"status"` // 状态
CreateTime string `json:"create_time"` // 创建时间
UpdateTime string `json:"update_time"` // 更新时间
}
type OrderListItem struct {
Id int64 `json:"id"` // 订单ID
OrderNo string `json:"order_no"` // 商户订单号
PlatformOrderId string `json:"platform_order_id"` // 支付订单号
ProductName string `json:"product_name"` // 产品名称
PaymentPlatform string `json:"payment_platform"` // 支付方式
PaymentScene string `json:"payment_scene"` // 支付平台
Amount float64 `json:"amount"` // 金额
Status string `json:"status"` // 支付状态pending-待支付paid-已支付refunded-已退款closed-已关闭failed-支付失败
CreateTime string `json:"create_time"` // 创建时间
PayTime string `json:"pay_time"` // 支付时间
RefundTime string `json:"refund_time"` // 退款时间
IsPromotion int64 `json:"is_promotion"` // 是否推广订单0-否1-是
}
type PaymentReq struct {
Id string `json:"id"`
PayMethod string `json:"pay_method"`
@ -346,6 +765,16 @@ type PaymentResp struct {
OrderID int64 `json:"order_id"`
}
type PlatformUserListItem struct {
Id int64 `json:"id"` // 用户ID
Mobile string `json:"mobile"` // 手机号
Nickname string `json:"nickname"` // 昵称
Info string `json:"info"` // 备注信息
Inside int64 `json:"inside"` // 是否内部用户 1-是 0-否
CreateTime string `json:"create_time"` // 创建时间
UpdateTime string `json:"update_time"` // 更新时间
}
type Product struct {
ProductName string `json:"product_name"`
ProductEn string `json:"product_en"`
@ -355,6 +784,25 @@ type Product struct {
Features []Feature `json:"features"` // 关联功能列表
}
type ProductFeatureItem struct {
FeatureId int64 `json:"feature_id"` // 功能ID
Sort int64 `json:"sort"` // 排序
Enable int64 `json:"enable"` // 是否启用
IsImportant int64 `json:"is_important"` // 是否重要
}
type ProductListItem struct {
Id int64 `json:"id"` // 产品ID
ProductName string `json:"product_name"` // 服务名
ProductEn string `json:"product_en"` // 英文名
Description string `json:"description"` // 描述
Notes string `json:"notes"` // 备注
CostPrice float64 `json:"cost_price"` // 成本
SellPrice float64 `json:"sell_price"` // 售价
CreateTime string `json:"create_time"` // 创建时间
UpdateTime string `json:"update_time"` // 更新时间
}
type ProductResponse struct {
Product
}
@ -573,15 +1021,6 @@ 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"`
}

View File

@ -0,0 +1,500 @@
{"@timestamp":"2025-05-15T12:02:14.955+08:00","caller":"queue/cleanQueryData.go:27","content":"2025-05-15 12:02:14 - 开始执行查询数据清理任务","level":"info"}
{"@timestamp":"2025-05-15T12:02:15.289+08:00","caller":"sqlx/stmt.go:274","content":"sql exec: DELETE FROM `query` WHERE create_time < '2025-04-30 12:02:14' AND del_state = 0","duration":"185.2ms","level":"info","span":"0d49fc3e22a92cd4","trace":"a6f957b8d18da08b3f126bc0f4c3ed38"}
{"@timestamp":"2025-05-15T12:02:15.292+08:00","caller":"queue/cleanQueryData.go:38","content":"2025-05-15 12:02:15 - 查询数据清理完成,共删除 0 条记录","level":"info"}
{"@timestamp":"2025-05-15T12:29:12.198+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"6.8ms","level":"info","span":"8ca64668d965c260","trace":"11ef7b36aae246eddb343cabb66820fb"}
{"@timestamp":"2025-05-15T12:29:12.200+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/user/info - [::1]:63674 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"13.3ms","level":"info","span":"12870a71d69da520","trace":"11ef7b36aae246eddb343cabb66820fb"}
{"@timestamp":"2025-05-15T12:29:12.237+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"1.7ms","level":"info","span":"eec1dc49fa661362","trace":"58941b0752becf1c9eb3297b8079f5a1"}
{"@timestamp":"2025-05-15T12:29:12.239+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`role_id`,`menu_id` FROM `admin_role_menu` WHERE role_id IN (1) AND del_state = 0 ORDER BY id DESC","duration":"1.6ms","level":"info","span":"4a7d5702c8c456a1","trace":"58941b0752becf1c9eb3297b8079f5a1"}
{"@timestamp":"2025-05-15T12:29:12.241+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`pid`,`name`,`path`,`component`,`redirect`,`meta`,`status`,`type`,`sort` FROM `admin_menu` WHERE id IN (19,18,17,16,15,14,13,12,11,10,6,3,2,1) AND del_state = 0 ORDER BY sort ASC","duration":"1.6ms","level":"info","span":"22531e662411c163","trace":"58941b0752becf1c9eb3297b8079f5a1"}
{"@timestamp":"2025-05-15T12:29:12.241+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/menu/all - [::1]:63686 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"6.4ms","level":"info","span":"2007efb430e437b1","trace":"58941b0752becf1c9eb3297b8079f5a1"}
{"@timestamp":"2025-05-15T12:29:12.776+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"2.7ms","level":"info","span":"57cd6b032185150f","trace":"6d1ba081877c06b07fed6c5439dfc14b"}
{"@timestamp":"2025-05-15T12:29:12.777+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`created_at`,`updated_at`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.0ms","level":"info","span":"4e98bbd3f892f5da","trace":"6d1ba081877c06b07fed6c5439dfc14b"}
{"@timestamp":"2025-05-15T12:29:12.777+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:63730 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"3.8ms","level":"info","span":"cbe6ed0de3a5281d","trace":"6d1ba081877c06b07fed6c5439dfc14b"}
{"@timestamp":"2025-05-15T12:30:28.216+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"5.8ms","level":"info","span":"5f202c05e6888420","trace":"d773f26e96ed95cb1f5d2f188cc6fb67"}
{"@timestamp":"2025-05-15T12:30:28.217+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/user/info - [::1]:64196 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"8.1ms","level":"info","span":"e0640376ad9543a6","trace":"d773f26e96ed95cb1f5d2f188cc6fb67"}
{"@timestamp":"2025-05-15T12:30:28.251+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"1.6ms","level":"info","span":"31668d24847d4a55","trace":"34be1906fc9946a2c18303edb717045c"}
{"@timestamp":"2025-05-15T12:30:28.254+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`role_id`,`menu_id` FROM `admin_role_menu` WHERE role_id IN (1) AND del_state = 0 ORDER BY id DESC","duration":"1.6ms","level":"info","span":"deacab86a8c6f3af","trace":"34be1906fc9946a2c18303edb717045c"}
{"@timestamp":"2025-05-15T12:30:28.256+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`pid`,`name`,`path`,`component`,`redirect`,`meta`,`status`,`type`,`sort` FROM `admin_menu` WHERE id IN (19,18,17,16,15,14,13,12,11,10,6,3,2,1) AND del_state = 0 ORDER BY sort ASC","duration":"2.1ms","level":"info","span":"24bcd4d4edbf1863","trace":"34be1906fc9946a2c18303edb717045c"}
{"@timestamp":"2025-05-15T12:30:28.256+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/menu/all - [::1]:64198 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"6.9ms","level":"info","span":"0801e367f8e82654","trace":"34be1906fc9946a2c18303edb717045c"}
{"@timestamp":"2025-05-15T12:30:28.778+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"1.6ms","level":"info","span":"7c291ce1e7608356","trace":"363d5e0a0b2944b68698f3b2800c9a54"}
{"@timestamp":"2025-05-15T12:30:28.780+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`created_at`,`updated_at`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.6ms","level":"info","span":"0bae4ffec2264d24","trace":"363d5e0a0b2944b68698f3b2800c9a54"}
{"@timestamp":"2025-05-15T12:30:28.780+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:64201 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"3.8ms","level":"info","span":"a3067ff21c4873be","trace":"363d5e0a0b2944b68698f3b2800c9a54"}
{"@timestamp":"2025-05-15T12:34:37.469+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"5.2ms","level":"info","span":"104d6265c41f8393","trace":"066ef0a26466f966539804cff6c6b93b"}
{"@timestamp":"2025-05-15T12:34:37.470+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/user/info - [::1]:50549 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"8.2ms","level":"info","span":"37fa3ff3d2243544","trace":"066ef0a26466f966539804cff6c6b93b"}
{"@timestamp":"2025-05-15T12:34:37.505+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"1.6ms","level":"info","span":"fa7d1ba3681f3672","trace":"978b546fb46fce630eab81853839e18e"}
{"@timestamp":"2025-05-15T12:34:37.507+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`role_id`,`menu_id` FROM `admin_role_menu` WHERE role_id IN (1) AND del_state = 0 ORDER BY id DESC","duration":"1.6ms","level":"info","span":"533455b338510a98","trace":"978b546fb46fce630eab81853839e18e"}
{"@timestamp":"2025-05-15T12:34:37.509+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`pid`,`name`,`path`,`component`,`redirect`,`meta`,`status`,`type`,`sort` FROM `admin_menu` WHERE id IN (19,18,17,16,15,14,13,12,11,10,6,3,2,1) AND del_state = 0 ORDER BY sort ASC","duration":"1.6ms","level":"info","span":"9bcf35de9c8d8624","trace":"978b546fb46fce630eab81853839e18e"}
{"@timestamp":"2025-05-15T12:34:37.509+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/menu/all - [::1]:50551 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"6.3ms","level":"info","span":"1d3714f4fb3e7153","trace":"978b546fb46fce630eab81853839e18e"}
{"@timestamp":"2025-05-15T12:34:38.016+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"1.9ms","level":"info","span":"51ecc3c40d427b4e","trace":"6855849b4e06d3cf536d0f329db6ed73"}
{"@timestamp":"2025-05-15T12:34:38.017+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`created_at`,`updated_at`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.0ms","level":"info","span":"e741138a4f766791","trace":"6855849b4e06d3cf536d0f329db6ed73"}
{"@timestamp":"2025-05-15T12:34:38.017+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:50565 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"3.0ms","level":"info","span":"2b94f0ebb589f629","trace":"6855849b4e06d3cf536d0f329db6ed73"}
{"@timestamp":"2025-05-15T13:35:27.818+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"4.7ms","level":"info","span":"e6728d297b5f57bb","trace":"98301b471e6c921f296a0e17f7d85f1b"}
{"@timestamp":"2025-05-15T13:35:27.819+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/user/info - [::1]:56569 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"11.6ms","level":"info","span":"d691f1bfd4cff953","trace":"98301b471e6c921f296a0e17f7d85f1b"}
{"@timestamp":"2025-05-15T13:35:27.854+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"1.6ms","level":"info","span":"576a10f9b828f894","trace":"2edf86399993708401e03c3055424946"}
{"@timestamp":"2025-05-15T13:35:27.855+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`role_id`,`menu_id` FROM `admin_role_menu` WHERE role_id IN (1) AND del_state = 0 ORDER BY id DESC","duration":"1.6ms","level":"info","span":"1fc6cfb58028dfe0","trace":"2edf86399993708401e03c3055424946"}
{"@timestamp":"2025-05-15T13:35:27.857+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`pid`,`name`,`path`,`component`,`redirect`,`meta`,`status`,`type`,`sort` FROM `admin_menu` WHERE id IN (19,18,17,16,15,14,13,12,11,10,6,3,2,1) AND del_state = 0 ORDER BY sort ASC","duration":"1.6ms","level":"info","span":"c7434151b7f8f203","trace":"2edf86399993708401e03c3055424946"}
{"@timestamp":"2025-05-15T13:35:27.857+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/menu/all - [::1]:56580 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"5.3ms","level":"info","span":"31e70730f129be78","trace":"2edf86399993708401e03c3055424946"}
{"@timestamp":"2025-05-15T13:35:28.353+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"1.7ms","level":"info","span":"abe035f3e9dcd2ba","trace":"748b4ea725800142e49d5e8391e02525"}
{"@timestamp":"2025-05-15T13:35:28.355+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`created_at`,`updated_at`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.1ms","level":"info","span":"6917737a9ea9d8a9","trace":"748b4ea725800142e49d5e8391e02525"}
{"@timestamp":"2025-05-15T13:35:28.355+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:56618 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"3.9ms","level":"info","span":"eb49668bec8dcefd","trace":"748b4ea725800142e49d5e8391e02525"}
{"@timestamp":"2025-05-15T13:40:24.560+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 404 - PUT /api/v1/admin/notification/update - [::1]:58634 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"0.0ms","level":"info","span":"b8243375f2658aa7","trace":"48716f3fc08c6f9d9f3db87ffa6d9fe0"}
{"@timestamp":"2025-05-15T13:40:40.169+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 404 - PUT /api/v1/admin/notification/update - [::1]:58752 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"0.0ms","level":"info","span":"800b5a86361a5da9","trace":"89c9a006f09537fc246c427f9996435f"}
{"@timestamp":"2025-05-15T13:40:46.468+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"6.3ms","level":"info","span":"e0a2fbecd7e0c1e3","trace":"ea94a22ef86298fa3bb8799a56953385"}
{"@timestamp":"2025-05-15T13:40:46.470+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/user/info - [::1]:58803 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"8.6ms","level":"info","span":"d50943d18c4e2f01","trace":"ea94a22ef86298fa3bb8799a56953385"}
{"@timestamp":"2025-05-15T13:40:46.510+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"2.2ms","level":"info","span":"4a4a2e4be24d494c","trace":"eabc4cedaada6d816e99cfb617f6406a"}
{"@timestamp":"2025-05-15T13:40:46.513+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`role_id`,`menu_id` FROM `admin_role_menu` WHERE role_id IN (1) AND del_state = 0 ORDER BY id DESC","duration":"2.5ms","level":"info","span":"312399ffabb89b03","trace":"eabc4cedaada6d816e99cfb617f6406a"}
{"@timestamp":"2025-05-15T13:40:46.514+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`pid`,`name`,`path`,`component`,`redirect`,`meta`,`status`,`type`,`sort` FROM `admin_menu` WHERE id IN (19,18,17,16,15,14,13,12,11,10,6,3,2,1) AND del_state = 0 ORDER BY sort ASC","duration":"1.1ms","level":"info","span":"916dc73d1bea74d6","trace":"eabc4cedaada6d816e99cfb617f6406a"}
{"@timestamp":"2025-05-15T13:40:46.515+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/menu/all - [::1]:58806 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"6.8ms","level":"info","span":"1060fa212c425b13","trace":"eabc4cedaada6d816e99cfb617f6406a"}
{"@timestamp":"2025-05-15T13:40:46.987+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"1.7ms","level":"info","span":"466cb21ca7aaff98","trace":"abb328cce5e86de23894f8ef0d1e2199"}
{"@timestamp":"2025-05-15T13:40:46.989+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`created_at`,`updated_at`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.6ms","level":"info","span":"5e850943266c5877","trace":"abb328cce5e86de23894f8ef0d1e2199"}
{"@timestamp":"2025-05-15T13:40:46.989+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:58811 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"4.3ms","level":"info","span":"73e04aa2cb80b072","trace":"abb328cce5e86de23894f8ef0d1e2199"}
{"@timestamp":"2025-05-15T14:10:41.951+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"10.2ms","level":"info","span":"02c3a2d822d58e9a","trace":"00d8b27025522757c6887400e6c37df7"}
{"@timestamp":"2025-05-15T14:10:41.952+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/user/info - [::1]:56062 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"12.5ms","level":"info","span":"7a203230dfd73521","trace":"00d8b27025522757c6887400e6c37df7"}
{"@timestamp":"2025-05-15T14:10:41.987+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"1.5ms","level":"info","span":"06dd2b87d05318d0","trace":"fae28007b6acb15952e35752997d2893"}
{"@timestamp":"2025-05-15T14:10:41.988+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`role_id`,`menu_id` FROM `admin_role_menu` WHERE role_id IN (1) AND del_state = 0 ORDER BY id DESC","duration":"1.1ms","level":"info","span":"42e02c4d469cacae","trace":"fae28007b6acb15952e35752997d2893"}
{"@timestamp":"2025-05-15T14:10:41.990+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`pid`,`name`,`path`,`component`,`redirect`,`meta`,`status`,`type`,`sort` FROM `admin_menu` WHERE id IN (19,18,17,16,15,14,13,12,11,10,6,3,2,1) AND del_state = 0 ORDER BY sort ASC","duration":"1.6ms","level":"info","span":"73fe2b586c9f9aa8","trace":"fae28007b6acb15952e35752997d2893"}
{"@timestamp":"2025-05-15T14:10:41.991+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/menu/all - [::1]:56064 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"6.2ms","level":"info","span":"5f109eb8817db8c6","trace":"fae28007b6acb15952e35752997d2893"}
{"@timestamp":"2025-05-15T14:10:42.473+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"2.2ms","level":"info","span":"923388fc556580d2","trace":"07e1888e32b17db897faa164c0a1a2d6"}
{"@timestamp":"2025-05-15T14:10:42.474+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`created_at`,`updated_at`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.6ms","level":"info","span":"c067f5577e35c71e","trace":"07e1888e32b17db897faa164c0a1a2d6"}
{"@timestamp":"2025-05-15T14:10:42.474+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:56068 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"3.8ms","level":"info","span":"c6b0301667195a86","trace":"07e1888e32b17db897faa164c0a1a2d6"}
{"@timestamp":"2025-05-15T14:10:48.804+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"2.1ms","level":"info","span":"55bbd5460497d9b5","trace":"30aaa5be606f3c2e9865badf11da70e3"}
{"@timestamp":"2025-05-15T14:10:48.805+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/user/info - [::1]:56191 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"4.3ms","level":"info","span":"92f729ab64b9b79f","trace":"30aaa5be606f3c2e9865badf11da70e3"}
{"@timestamp":"2025-05-15T14:10:48.842+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"3.6ms","level":"info","span":"48d42e44b82fa76b","trace":"fc48b4f703ad692539f0c99ca64c8cff"}
{"@timestamp":"2025-05-15T14:10:48.844+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`role_id`,`menu_id` FROM `admin_role_menu` WHERE role_id IN (1) AND del_state = 0 ORDER BY id DESC","duration":"2.1ms","level":"info","span":"cf5d059660b99a14","trace":"fc48b4f703ad692539f0c99ca64c8cff"}
{"@timestamp":"2025-05-15T14:10:48.845+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`pid`,`name`,`path`,`component`,`redirect`,`meta`,`status`,`type`,`sort` FROM `admin_menu` WHERE id IN (19,18,17,16,15,14,13,12,11,10,6,3,2,1) AND del_state = 0 ORDER BY sort ASC","duration":"1.6ms","level":"info","span":"b1183e002babbcf8","trace":"fc48b4f703ad692539f0c99ca64c8cff"}
{"@timestamp":"2025-05-15T14:10:48.846+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/menu/all - [::1]:56192 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"7.8ms","level":"info","span":"64cc813fa7fad6cf","trace":"fc48b4f703ad692539f0c99ca64c8cff"}
{"@timestamp":"2025-05-15T14:10:49.495+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"1.0ms","level":"info","span":"78694fb4b9617597","trace":"eca6b430e71f9d953fbf9b86dd79d455"}
{"@timestamp":"2025-05-15T14:10:49.496+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`created_at`,`updated_at`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.1ms","level":"info","span":"9fc7803da2e4e804","trace":"eca6b430e71f9d953fbf9b86dd79d455"}
{"@timestamp":"2025-05-15T14:10:49.496+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:56220 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"2.6ms","level":"info","span":"8625e8cc793450fb","trace":"eca6b430e71f9d953fbf9b86dd79d455"}
{"@timestamp":"2025-05-15T14:11:05.455+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 404 - PUT /api/v1/admin/notification/update - [::1]:56274 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"0.0ms","level":"info","span":"039f673094e4e7f5","trace":"a55ab549f123fae67065bfb16a03ee64"}
{"@timestamp":"2025-05-15T14:11:12.932+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 404 - PUT /api/v1/admin/notification/update - [::1]:56280 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"0.0ms","level":"info","span":"8e2566faee2ebb8f","trace":"83145cc4845f981e10758253a9a99850"}
{"@timestamp":"2025-05-15T14:11:17.127+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 404 - PUT /api/v1/admin/notification/update - [::1]:56296 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"0.0ms","level":"info","span":"a454ee24c185706a","trace":"04615cf6029935e3cbb35a14593ebbe6"}
{"@timestamp":"2025-05-15T14:11:30.153+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 404 - PUT /api/v1/admin/notification/update - [::1]:56385 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"0.0ms","level":"info","span":"aade698241597d28","trace":"e2e78b0aa38c6b0bade11aad223b8433"}
{"@timestamp":"2025-05-15T14:11:53.328+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"3.6ms","level":"info","span":"e6e6b4cc9ea17e63","trace":"e1700f33c08a9583c24e85c7bb0d5b7f"}
{"@timestamp":"2025-05-15T14:11:53.330+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`created_at`,`updated_at`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.0ms","level":"info","span":"115ada147940abaf","trace":"e1700f33c08a9583c24e85c7bb0d5b7f"}
{"@timestamp":"2025-05-15T14:11:53.330+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:56554 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"5.2ms","level":"info","span":"810f71ffc138fe14","trace":"e1700f33c08a9583c24e85c7bb0d5b7f"}
{"@timestamp":"2025-05-15T14:12:14.692+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"1.6ms","level":"info","span":"a1df2accbbac379d","trace":"9c0d7efbc29cdeae6f0aa0527da715d0"}
{"@timestamp":"2025-05-15T14:12:14.692+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/user/info - [::1]:56686 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"3.7ms","level":"info","span":"4d40c108407189ea","trace":"9c0d7efbc29cdeae6f0aa0527da715d0"}
{"@timestamp":"2025-05-15T14:12:14.725+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"2.1ms","level":"info","span":"eadc8a599db35d2d","trace":"9d08509c540a2e46e44ba76e59c591a3"}
{"@timestamp":"2025-05-15T14:12:14.727+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`role_id`,`menu_id` FROM `admin_role_menu` WHERE role_id IN (1) AND del_state = 0 ORDER BY id DESC","duration":"1.6ms","level":"info","span":"0dc12e080d474d80","trace":"9d08509c540a2e46e44ba76e59c591a3"}
{"@timestamp":"2025-05-15T14:12:14.729+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`pid`,`name`,`path`,`component`,`redirect`,`meta`,`status`,`type`,`sort` FROM `admin_menu` WHERE id IN (19,18,17,16,15,14,13,12,11,10,6,3,2,1) AND del_state = 0 ORDER BY sort ASC","duration":"1.6ms","level":"info","span":"bd05a48e3307e92c","trace":"9d08509c540a2e46e44ba76e59c591a3"}
{"@timestamp":"2025-05-15T14:12:14.729+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/menu/all - [::1]:56687 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"6.2ms","level":"info","span":"cac74c8a02c49bc8","trace":"9d08509c540a2e46e44ba76e59c591a3"}
{"@timestamp":"2025-05-15T14:12:15.249+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"1.6ms","level":"info","span":"056b322ba9103a5e","trace":"82c3e0ac1044dabec24947ef34d8dc2e"}
{"@timestamp":"2025-05-15T14:12:15.250+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`created_at`,`updated_at`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.0ms","level":"info","span":"4188860ddbe41ab4","trace":"82c3e0ac1044dabec24947ef34d8dc2e"}
{"@timestamp":"2025-05-15T14:12:15.250+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:56690 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"3.1ms","level":"info","span":"9942b5cf558a6b24","trace":"82c3e0ac1044dabec24947ef34d8dc2e"}
{"@timestamp":"2025-05-15T14:12:16.316+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"1.4ms","level":"info","span":"adec157742ea969c","trace":"d6ef08e1ddd4eefca026f28e46553fab"}
{"@timestamp":"2025-05-15T14:12:16.316+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`created_at`,`updated_at`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"0.5ms","level":"info","span":"c8d6e5bfd1ec6695","trace":"d6ef08e1ddd4eefca026f28e46553fab"}
{"@timestamp":"2025-05-15T14:12:16.316+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:56702 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"1.9ms","level":"info","span":"4bb3674eb57b6a68","trace":"d6ef08e1ddd4eefca026f28e46553fab"}
{"@timestamp":"2025-05-15T14:34:11.838+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"6.0ms","level":"info","span":"329ad4d02a6f47c0","trace":"31d0f27a43f2be235e41cb5af67c3b46"}
{"@timestamp":"2025-05-15T14:34:11.839+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`created_at`,`updated_at`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.0ms","level":"info","span":"ed78cfb7d56ccb50","trace":"31d0f27a43f2be235e41cb5af67c3b46"}
{"@timestamp":"2025-05-15T14:34:11.840+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:49329 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"8.1ms","level":"info","span":"d86c0a899cdf1e28","trace":"31d0f27a43f2be235e41cb5af67c3b46"}
{"@timestamp":"2025-05-15T14:36:29.422+08:00","caller":"api/main.go:65","content":"Starting server at %s:%d...0.0.0.08888","level":"info"}
{"@timestamp":"2025-05-15T14:36:36.021+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"2.6ms","level":"info","span":"02b860a7784d87fc","trace":"09b1a7612816a23b0202e5df025d0c85"}
{"@timestamp":"2025-05-15T14:36:36.022+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/user/info - [::1]:51104 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"9.4ms","level":"info","span":"09842a55abb438b2","trace":"09b1a7612816a23b0202e5df025d0c85"}
{"@timestamp":"2025-05-15T14:36:36.067+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"1.3ms","level":"info","span":"367328ceede93394","trace":"8e1e639f64109952b1249fa52984e9d2"}
{"@timestamp":"2025-05-15T14:36:36.070+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`role_id`,`menu_id` FROM `admin_role_menu` WHERE role_id IN (1) AND del_state = 0 ORDER BY id DESC","duration":"2.7ms","level":"info","span":"f6147ac7214913ee","trace":"8e1e639f64109952b1249fa52984e9d2"}
{"@timestamp":"2025-05-15T14:36:36.072+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`pid`,`name`,`path`,`component`,`redirect`,`meta`,`status`,`type`,`sort` FROM `admin_menu` WHERE id IN (19,18,17,16,15,14,13,12,11,10,6,3,2,1) AND del_state = 0 ORDER BY sort ASC","duration":"2.1ms","level":"info","span":"38cf6632f9f15157","trace":"8e1e639f64109952b1249fa52984e9d2"}
{"@timestamp":"2025-05-15T14:36:36.075+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/menu/all - [::1]:51106 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"9.8ms","level":"info","span":"e6ffec7d48832677","trace":"8e1e639f64109952b1249fa52984e9d2"}
{"@timestamp":"2025-05-15T14:36:36.554+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"2.2ms","level":"info","span":"52cfd395f4520841","trace":"a91ade174968687554c1659eaf139c3f"}
{"@timestamp":"2025-05-15T14:36:36.556+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`created_at`,`updated_at`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.1ms","level":"info","span":"2e796fb8a1fef002","trace":"a91ade174968687554c1659eaf139c3f"}
{"@timestamp":"2025-05-15T14:36:36.556+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:51134 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"4.3ms","level":"info","span":"f06c72a6edc8e1ec","trace":"a91ade174968687554c1659eaf139c3f"}
{"@timestamp":"2025-05-15T14:37:20.699+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"2.8ms","level":"info","span":"5cbafb76d32a3316","trace":"9a86b7624efb38430743f89bb302a2e6"}
{"@timestamp":"2025-05-15T14:37:20.700+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/user/info - [::1]:51773 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"5.5ms","level":"info","span":"85e6569ac49c9039","trace":"9a86b7624efb38430743f89bb302a2e6"}
{"@timestamp":"2025-05-15T14:37:20.746+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"1.6ms","level":"info","span":"3121b41081b5ee67","trace":"41ce9124a90b31b12de3094fa5241f9c"}
{"@timestamp":"2025-05-15T14:37:20.748+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`role_id`,`menu_id` FROM `admin_role_menu` WHERE role_id IN (1) AND del_state = 0 ORDER BY id DESC","duration":"1.0ms","level":"info","span":"30718ed01ca20ce6","trace":"41ce9124a90b31b12de3094fa5241f9c"}
{"@timestamp":"2025-05-15T14:37:20.749+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`pid`,`name`,`path`,`component`,`redirect`,`meta`,`status`,`type`,`sort` FROM `admin_menu` WHERE id IN (19,18,17,16,15,14,13,12,11,10,6,3,2,1) AND del_state = 0 ORDER BY sort ASC","duration":"1.0ms","level":"info","span":"f26061bc88d0f7d3","trace":"41ce9124a90b31b12de3094fa5241f9c"}
{"@timestamp":"2025-05-15T14:37:20.750+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/menu/all - [::1]:51774 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"5.3ms","level":"info","span":"7ebccdc548c2a1da","trace":"41ce9124a90b31b12de3094fa5241f9c"}
{"@timestamp":"2025-05-15T14:37:21.412+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"1.4ms","level":"info","span":"117a8da02525a148","trace":"d5033d5a8c9f33c73eab96beb10911af"}
{"@timestamp":"2025-05-15T14:37:21.415+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`created_at`,`updated_at`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.6ms","level":"info","span":"3ee7003c30a530e7","trace":"d5033d5a8c9f33c73eab96beb10911af"}
{"@timestamp":"2025-05-15T14:37:21.415+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:51778 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"4.6ms","level":"info","span":"213b7725aacff851","trace":"d5033d5a8c9f33c73eab96beb10911af"}
{"@timestamp":"2025-05-15T14:37:59.903+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"32.9ms","level":"info","span":"ea933fe923c408d2","trace":"5eaf6ecb9755a83a2710bd58d51b0e4f"}
{"@timestamp":"2025-05-15T14:37:59.905+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`created_at`,`updated_at`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"2.1ms","level":"info","span":"4a9ee516c38a9977","trace":"5eaf6ecb9755a83a2710bd58d51b0e4f"}
{"@timestamp":"2025-05-15T14:37:59.906+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:52182 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"35.5ms","level":"info","span":"276577acd478b2c1","trace":"5eaf6ecb9755a83a2710bd58d51b0e4f"}
{"@timestamp":"2025-05-15T14:38:01.205+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"1.6ms","level":"info","span":"3246508a9f1affd6","trace":"1d29999a61f4dc2c9c8ff16c48d2b443"}
{"@timestamp":"2025-05-15T14:38:01.206+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/user/info - [::1]:52209 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"4.1ms","level":"info","span":"2ed0f6709ce65423","trace":"1d29999a61f4dc2c9c8ff16c48d2b443"}
{"@timestamp":"2025-05-15T14:38:01.243+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"2.2ms","level":"info","span":"5cee985e2c66feb6","trace":"d7933e4284b4b8be810197d3cc5ca877"}
{"@timestamp":"2025-05-15T14:38:01.245+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`role_id`,`menu_id` FROM `admin_role_menu` WHERE role_id IN (1) AND del_state = 0 ORDER BY id DESC","duration":"1.6ms","level":"info","span":"af70b0193d38c1b7","trace":"d7933e4284b4b8be810197d3cc5ca877"}
{"@timestamp":"2025-05-15T14:38:01.247+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`pid`,`name`,`path`,`component`,`redirect`,`meta`,`status`,`type`,`sort` FROM `admin_menu` WHERE id IN (19,18,17,16,15,14,13,12,11,10,6,3,2,1) AND del_state = 0 ORDER BY sort ASC","duration":"1.6ms","level":"info","span":"d08f42fbc0a75301","trace":"d7933e4284b4b8be810197d3cc5ca877"}
{"@timestamp":"2025-05-15T14:38:01.247+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/menu/all - [::1]:52210 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"6.9ms","level":"info","span":"739e80ace5ff5c5b","trace":"d7933e4284b4b8be810197d3cc5ca877"}
{"@timestamp":"2025-05-15T14:38:01.709+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"1.6ms","level":"info","span":"9db8bca863205add","trace":"43bc1cff3266da2924b3ebea1d4e39e8"}
{"@timestamp":"2025-05-15T14:38:01.710+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`created_at`,`updated_at`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.0ms","level":"info","span":"654355085967869c","trace":"43bc1cff3266da2924b3ebea1d4e39e8"}
{"@timestamp":"2025-05-15T14:38:01.710+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:52214 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"2.6ms","level":"info","span":"f912167ca80e8ea5","trace":"43bc1cff3266da2924b3ebea1d4e39e8"}
{"@timestamp":"2025-05-15T14:38:10.061+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"1.4ms","level":"info","span":"6c3cad14ef7bd056","trace":"81c1eb756c107d355624646a2dee5447"}
{"@timestamp":"2025-05-15T14:38:10.062+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`created_at`,`updated_at`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.0ms","level":"info","span":"b07a34215e8e39a3","trace":"81c1eb756c107d355624646a2dee5447"}
{"@timestamp":"2025-05-15T14:38:10.063+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:52221 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"3.0ms","level":"info","span":"aa6f8cdc22adf180","trace":"81c1eb756c107d355624646a2dee5447"}
{"@timestamp":"2025-05-15T14:46:51.386+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"5.6ms","level":"info","span":"c8d3228cf9fa05a5","trace":"a8d13878237dada367e262d975226129"}
{"@timestamp":"2025-05-15T14:46:51.386+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/user/info - [::1]:55516 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"7.2ms","level":"info","span":"749f972fd651c2bf","trace":"a8d13878237dada367e262d975226129"}
{"@timestamp":"2025-05-15T14:46:51.421+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"1.4ms","level":"info","span":"29dde8366bf6e7bd","trace":"36e6f2c9b1e2c81a83e140f212171d0f"}
{"@timestamp":"2025-05-15T14:46:51.423+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`role_id`,`menu_id` FROM `admin_role_menu` WHERE role_id IN (1) AND del_state = 0 ORDER BY id DESC","duration":"1.1ms","level":"info","span":"19eefcd585974557","trace":"36e6f2c9b1e2c81a83e140f212171d0f"}
{"@timestamp":"2025-05-15T14:46:51.425+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`pid`,`name`,`path`,`component`,`redirect`,`meta`,`status`,`type`,`sort` FROM `admin_menu` WHERE id IN (19,18,17,16,15,14,13,12,11,10,6,3,2,1) AND del_state = 0 ORDER BY sort ASC","duration":"1.1ms","level":"info","span":"9d724f4157f32b67","trace":"36e6f2c9b1e2c81a83e140f212171d0f"}
{"@timestamp":"2025-05-15T14:46:51.425+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/menu/all - [::1]:55518 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"5.6ms","level":"info","span":"ff071f22abb6ac2f","trace":"36e6f2c9b1e2c81a83e140f212171d0f"}
{"@timestamp":"2025-05-15T14:46:51.876+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"1.7ms","level":"info","span":"322003c98d78374c","trace":"f1e3edb5be8b7a9e9eb1e9e6d0dd01e2"}
{"@timestamp":"2025-05-15T14:46:51.878+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`created_at`,`updated_at`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.1ms","level":"info","span":"92492cc55685435d","trace":"f1e3edb5be8b7a9e9eb1e9e6d0dd01e2"}
{"@timestamp":"2025-05-15T14:46:51.878+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:55522 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"3.3ms","level":"info","span":"22ad0ea8b65f9224","trace":"f1e3edb5be8b7a9e9eb1e9e6d0dd01e2"}
{"@timestamp":"2025-05-15T14:47:05.899+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"1.6ms","level":"info","span":"c1fc378e35262f18","trace":"1c5824dfd526abac1b04b14a48b54d4c"}
{"@timestamp":"2025-05-15T14:47:05.900+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/user/info - [::1]:55610 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"4.1ms","level":"info","span":"5b8287dd4d22b785","trace":"1c5824dfd526abac1b04b14a48b54d4c"}
{"@timestamp":"2025-05-15T14:47:05.936+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"2.2ms","level":"info","span":"c2507b9080433a60","trace":"c615b6624f7967a2baeeec2a3c73a812"}
{"@timestamp":"2025-05-15T14:47:05.938+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`role_id`,`menu_id` FROM `admin_role_menu` WHERE role_id IN (1) AND del_state = 0 ORDER BY id DESC","duration":"1.6ms","level":"info","span":"82c8e6a2c171531b","trace":"c615b6624f7967a2baeeec2a3c73a812"}
{"@timestamp":"2025-05-15T14:47:05.940+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`pid`,`name`,`path`,`component`,`redirect`,`meta`,`status`,`type`,`sort` FROM `admin_menu` WHERE id IN (19,18,17,16,15,14,13,12,11,10,6,3,2,1) AND del_state = 0 ORDER BY sort ASC","duration":"1.0ms","level":"info","span":"bdad564b894d6aa2","trace":"c615b6624f7967a2baeeec2a3c73a812"}
{"@timestamp":"2025-05-15T14:47:05.940+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/menu/all - [::1]:55611 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"6.5ms","level":"info","span":"3c870716793d17ab","trace":"c615b6624f7967a2baeeec2a3c73a812"}
{"@timestamp":"2025-05-15T14:47:06.445+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"1.8ms","level":"info","span":"96223791735101f9","trace":"17179835a8e900af42ede648747f9b62"}
{"@timestamp":"2025-05-15T14:47:06.446+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`created_at`,`updated_at`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.6ms","level":"info","span":"0613db40a49c6c20","trace":"17179835a8e900af42ede648747f9b62"}
{"@timestamp":"2025-05-15T14:47:06.447+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:55636 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"3.3ms","level":"info","span":"e6b6d4fd062236e6","trace":"17179835a8e900af42ede648747f9b62"}
{"@timestamp":"2025-05-15T14:47:47.113+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"1.6ms","level":"info","span":"b6780f83d0b3bc58","trace":"62f52a2f96c9dad0c6556316c430ab1f"}
{"@timestamp":"2025-05-15T14:47:47.114+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/user/info - [::1]:55937 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"4.0ms","level":"info","span":"6a799e956c85e344","trace":"62f52a2f96c9dad0c6556316c430ab1f"}
{"@timestamp":"2025-05-15T14:47:47.155+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"1.6ms","level":"info","span":"68f2979a21178462","trace":"5a69f88efe709b96f9177f9d07f270de"}
{"@timestamp":"2025-05-15T14:47:47.157+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`role_id`,`menu_id` FROM `admin_role_menu` WHERE role_id IN (1) AND del_state = 0 ORDER BY id DESC","duration":"1.6ms","level":"info","span":"2de51a527817100d","trace":"5a69f88efe709b96f9177f9d07f270de"}
{"@timestamp":"2025-05-15T14:47:47.158+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`pid`,`name`,`path`,`component`,`redirect`,`meta`,`status`,`type`,`sort` FROM `admin_menu` WHERE id IN (19,18,17,16,15,14,13,12,11,10,6,3,2,1) AND del_state = 0 ORDER BY sort ASC","duration":"1.1ms","level":"info","span":"af9c410327fc4d61","trace":"5a69f88efe709b96f9177f9d07f270de"}
{"@timestamp":"2025-05-15T14:47:47.159+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/menu/all - [::1]:55938 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"5.3ms","level":"info","span":"58a9583b8bda70ec","trace":"5a69f88efe709b96f9177f9d07f270de"}
{"@timestamp":"2025-05-15T14:47:47.602+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"1.4ms","level":"info","span":"ba1723500fa8b751","trace":"0db2d664df4dfea90a04dbc004ddd33a"}
{"@timestamp":"2025-05-15T14:47:47.603+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`created_at`,`updated_at`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.1ms","level":"info","span":"6d59620647fdea2f","trace":"0db2d664df4dfea90a04dbc004ddd33a"}
{"@timestamp":"2025-05-15T14:47:47.603+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:55942 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"2.4ms","level":"info","span":"fd412abc23960474","trace":"0db2d664df4dfea90a04dbc004ddd33a"}
{"@timestamp":"2025-05-15T14:49:45.830+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"5.2ms","level":"info","span":"2dc7ad3162482f5e","trace":"c30034b52fec293016b4e3131edd5134"}
{"@timestamp":"2025-05-15T14:49:45.832+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/user/info - [::1]:56726 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"7.5ms","level":"info","span":"bac4f1805d61a1f7","trace":"c30034b52fec293016b4e3131edd5134"}
{"@timestamp":"2025-05-15T14:49:45.865+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"1.5ms","level":"info","span":"5bca461727211e78","trace":"9c9b4a25fcbdd3fae88f9783109241bc"}
{"@timestamp":"2025-05-15T14:49:45.866+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`role_id`,`menu_id` FROM `admin_role_menu` WHERE role_id IN (1) AND del_state = 0 ORDER BY id DESC","duration":"1.1ms","level":"info","span":"2a6e48ac966ef9cd","trace":"9c9b4a25fcbdd3fae88f9783109241bc"}
{"@timestamp":"2025-05-15T14:49:45.867+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`pid`,`name`,`path`,`component`,`redirect`,`meta`,`status`,`type`,`sort` FROM `admin_menu` WHERE id IN (19,18,17,16,15,14,13,12,11,10,6,3,2,1) AND del_state = 0 ORDER BY sort ASC","duration":"1.1ms","level":"info","span":"0ab286416bf4ca5a","trace":"9c9b4a25fcbdd3fae88f9783109241bc"}
{"@timestamp":"2025-05-15T14:49:45.868+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/menu/all - [::1]:56728 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"4.1ms","level":"info","span":"864a2c0c08325bb3","trace":"9c9b4a25fcbdd3fae88f9783109241bc"}
{"@timestamp":"2025-05-15T14:49:46.419+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"1.8ms","level":"info","span":"306257bcd4b673a7","trace":"13e976fa3dba1a9a3f75324433c765d1"}
{"@timestamp":"2025-05-15T14:49:46.421+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`created_at`,`updated_at`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.1ms","level":"info","span":"1e9da66981803518","trace":"13e976fa3dba1a9a3f75324433c765d1"}
{"@timestamp":"2025-05-15T14:49:46.421+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:56732 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"3.9ms","level":"info","span":"b6a51bbe4e127897","trace":"13e976fa3dba1a9a3f75324433c765d1"}
{"@timestamp":"2025-05-15T14:50:19.534+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"2.1ms","level":"info","span":"3121093847d0095c","trace":"69b5c3b6d229aa50d35919ebb6b5c380"}
{"@timestamp":"2025-05-15T14:50:19.535+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/user/info - [::1]:57034 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"4.4ms","level":"info","span":"05af50357546fac3","trace":"69b5c3b6d229aa50d35919ebb6b5c380"}
{"@timestamp":"2025-05-15T14:50:19.573+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"1.6ms","level":"info","span":"e1a81b0b2e5c1b7a","trace":"de776769053cda6ecf8bb705325d08ea"}
{"@timestamp":"2025-05-15T14:50:19.574+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`role_id`,`menu_id` FROM `admin_role_menu` WHERE role_id IN (1) AND del_state = 0 ORDER BY id DESC","duration":"1.6ms","level":"info","span":"3edd0c42b4d12cef","trace":"de776769053cda6ecf8bb705325d08ea"}
{"@timestamp":"2025-05-15T14:50:19.575+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`pid`,`name`,`path`,`component`,`redirect`,`meta`,`status`,`type`,`sort` FROM `admin_menu` WHERE id IN (19,18,17,16,15,14,13,12,11,10,6,3,2,1) AND del_state = 0 ORDER BY sort ASC","duration":"1.0ms","level":"info","span":"d1dbd5baeefb1f6a","trace":"de776769053cda6ecf8bb705325d08ea"}
{"@timestamp":"2025-05-15T14:50:19.576+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/menu/all - [::1]:57035 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"4.8ms","level":"info","span":"6f529eb949ef4927","trace":"de776769053cda6ecf8bb705325d08ea"}
{"@timestamp":"2025-05-15T14:50:20.079+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"1.5ms","level":"info","span":"d9979ae2c055847a","trace":"168aac9359d21272307ee97557046f0a"}
{"@timestamp":"2025-05-15T14:50:20.081+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`created_at`,`updated_at`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.6ms","level":"info","span":"ffe7ac22d3e4bf3a","trace":"168aac9359d21272307ee97557046f0a"}
{"@timestamp":"2025-05-15T14:50:20.081+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:57038 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"3.0ms","level":"info","span":"fa3d48e269d1e6f9","trace":"168aac9359d21272307ee97557046f0a"}
{"@timestamp":"2025-05-15T14:50:36.551+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"2.1ms","level":"info","span":"8d159499574611af","trace":"7fae16e5e9675b707090134925291723"}
{"@timestamp":"2025-05-15T14:50:36.552+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/user/info - [::1]:57120 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"4.2ms","level":"info","span":"2d9908111f81c513","trace":"7fae16e5e9675b707090134925291723"}
{"@timestamp":"2025-05-15T14:50:36.589+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"1.6ms","level":"info","span":"ce215969e67b05ec","trace":"1b4e973a6e8a385a9ff7b5f79c1d2580"}
{"@timestamp":"2025-05-15T14:50:36.590+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`role_id`,`menu_id` FROM `admin_role_menu` WHERE role_id IN (1) AND del_state = 0 ORDER BY id DESC","duration":"1.0ms","level":"info","span":"8b8f605a988505f4","trace":"1b4e973a6e8a385a9ff7b5f79c1d2580"}
{"@timestamp":"2025-05-15T14:50:36.591+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`pid`,`name`,`path`,`component`,`redirect`,`meta`,`status`,`type`,`sort` FROM `admin_menu` WHERE id IN (19,18,17,16,15,14,13,12,11,10,6,3,2,1) AND del_state = 0 ORDER BY sort ASC","duration":"1.0ms","level":"info","span":"c2d9bdd0572a5699","trace":"1b4e973a6e8a385a9ff7b5f79c1d2580"}
{"@timestamp":"2025-05-15T14:50:36.592+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/menu/all - [::1]:57121 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"4.7ms","level":"info","span":"4696e7391831fac0","trace":"1b4e973a6e8a385a9ff7b5f79c1d2580"}
{"@timestamp":"2025-05-15T14:50:37.022+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"1.6ms","level":"info","span":"ef56d4020e7dcc98","trace":"f2f944f84cb7e103939e608d322384d8"}
{"@timestamp":"2025-05-15T14:50:37.024+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`created_at`,`updated_at`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.7ms","level":"info","span":"59c5d2471a7ebb00","trace":"f2f944f84cb7e103939e608d322384d8"}
{"@timestamp":"2025-05-15T14:50:37.025+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:57124 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"4.3ms","level":"info","span":"d531f53eb3c1f5d5","trace":"f2f944f84cb7e103939e608d322384d8"}
{"@timestamp":"2025-05-15T14:52:43.992+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"5.7ms","level":"info","span":"d2f3bc24a1f02fd1","trace":"e14bbc45a4b44810bfe5a70d3581c879"}
{"@timestamp":"2025-05-15T14:52:43.992+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/user/info - [::1]:58616 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"7.7ms","level":"info","span":"be236e905468b6f0","trace":"e14bbc45a4b44810bfe5a70d3581c879"}
{"@timestamp":"2025-05-15T14:52:44.032+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"1.6ms","level":"info","span":"7c21a768b0f7ba70","trace":"ef0e96841a35be6d35465a912f02a3d0"}
{"@timestamp":"2025-05-15T14:52:44.034+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`role_id`,`menu_id` FROM `admin_role_menu` WHERE role_id IN (1) AND del_state = 0 ORDER BY id DESC","duration":"2.1ms","level":"info","span":"647bfbbb9dfce28a","trace":"ef0e96841a35be6d35465a912f02a3d0"}
{"@timestamp":"2025-05-15T14:52:44.037+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`pid`,`name`,`path`,`component`,`redirect`,`meta`,`status`,`type`,`sort` FROM `admin_menu` WHERE id IN (19,18,17,16,15,14,13,12,11,10,6,3,2,1) AND del_state = 0 ORDER BY sort ASC","duration":"2.7ms","level":"info","span":"ca1be1c2101dab25","trace":"ef0e96841a35be6d35465a912f02a3d0"}
{"@timestamp":"2025-05-15T14:52:44.037+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/menu/all - [::1]:58618 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"7.9ms","level":"info","span":"d7ab4d1aba8c354c","trace":"ef0e96841a35be6d35465a912f02a3d0"}
{"@timestamp":"2025-05-15T14:52:44.502+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"1.5ms","level":"info","span":"0a912b0f4af1ecc4","trace":"d3f570110e7d2180ac96894017974240"}
{"@timestamp":"2025-05-15T14:52:44.504+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`created_at`,`updated_at`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.6ms","level":"info","span":"69acc2c6cd201c33","trace":"d3f570110e7d2180ac96894017974240"}
{"@timestamp":"2025-05-15T14:52:44.504+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:58621 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"3.1ms","level":"info","span":"8b393656bf7371b8","trace":"d3f570110e7d2180ac96894017974240"}
{"@timestamp":"2025-05-15T14:56:07.812+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"5.3ms","level":"info","span":"738969102ce199aa","trace":"3fedf5b34e91421354a5bcb571eb18df"}
{"@timestamp":"2025-05-15T14:56:07.813+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/user/info - [::1]:59605 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"7.6ms","level":"info","span":"c3f756b35286d1d5","trace":"3fedf5b34e91421354a5bcb571eb18df"}
{"@timestamp":"2025-05-15T14:56:07.843+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"2.4ms","level":"info","span":"54907b8d73c73478","trace":"dfea0bf08c72afdeffa3cd925743847d"}
{"@timestamp":"2025-05-15T14:56:07.846+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`role_id`,`menu_id` FROM `admin_role_menu` WHERE role_id IN (1) AND del_state = 0 ORDER BY id DESC","duration":"1.6ms","level":"info","span":"c2366261f7115108","trace":"dfea0bf08c72afdeffa3cd925743847d"}
{"@timestamp":"2025-05-15T14:56:07.848+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`pid`,`name`,`path`,`component`,`redirect`,`meta`,`status`,`type`,`sort` FROM `admin_menu` WHERE id IN (19,18,17,16,15,14,13,12,11,10,6,3,2,1) AND del_state = 0 ORDER BY sort ASC","duration":"2.1ms","level":"info","span":"7f89cdd36e985e5a","trace":"dfea0bf08c72afdeffa3cd925743847d"}
{"@timestamp":"2025-05-15T14:56:07.848+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/menu/all - [::1]:59607 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"6.7ms","level":"info","span":"393935998a4b938a","trace":"dfea0bf08c72afdeffa3cd925743847d"}
{"@timestamp":"2025-05-15T14:56:08.262+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"1.8ms","level":"info","span":"48a0b6d249ed6bca","trace":"79dc50dc26463b6b0634b12811e465df"}
{"@timestamp":"2025-05-15T14:56:08.264+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`created_at`,`updated_at`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.7ms","level":"info","span":"109134c91a58872e","trace":"79dc50dc26463b6b0634b12811e465df"}
{"@timestamp":"2025-05-15T14:56:08.264+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:59610 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"3.5ms","level":"info","span":"0cbc4ac81a1e7854","trace":"79dc50dc26463b6b0634b12811e465df"}
{"@timestamp":"2025-05-15T14:57:02.542+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"1.5ms","level":"info","span":"a829f00ee488e8a5","trace":"aec08f2114a43d2889836496c66b1293"}
{"@timestamp":"2025-05-15T14:57:02.543+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/user/info - [::1]:59963 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"3.1ms","level":"info","span":"9768981705b4bb59","trace":"aec08f2114a43d2889836496c66b1293"}
{"@timestamp":"2025-05-15T14:57:02.604+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"1.9ms","level":"info","span":"f4eedbd9b8b206a9","trace":"b7bac1975c311c4f08d5b4e1d984697a"}
{"@timestamp":"2025-05-15T14:57:02.605+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`role_id`,`menu_id` FROM `admin_role_menu` WHERE role_id IN (1) AND del_state = 0 ORDER BY id DESC","duration":"1.1ms","level":"info","span":"e3b12e9d07d1861c","trace":"b7bac1975c311c4f08d5b4e1d984697a"}
{"@timestamp":"2025-05-15T14:57:02.606+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`pid`,`name`,`path`,`component`,`redirect`,`meta`,`status`,`type`,`sort` FROM `admin_menu` WHERE id IN (19,18,17,16,15,14,13,12,11,10,6,3,2,1) AND del_state = 0 ORDER BY sort ASC","duration":"1.0ms","level":"info","span":"433298e800350425","trace":"b7bac1975c311c4f08d5b4e1d984697a"}
{"@timestamp":"2025-05-15T14:57:02.607+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/menu/all - [::1]:59964 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"5.1ms","level":"info","span":"d8c212db0e70a1d4","trace":"b7bac1975c311c4f08d5b4e1d984697a"}
{"@timestamp":"2025-05-15T14:57:03.144+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"1.5ms","level":"info","span":"f80e15cecfdc9f67","trace":"01aa1e74b907e53914f35a7a6e19b7ef"}
{"@timestamp":"2025-05-15T14:57:03.145+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`created_at`,`updated_at`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.0ms","level":"info","span":"9879d38742428091","trace":"01aa1e74b907e53914f35a7a6e19b7ef"}
{"@timestamp":"2025-05-15T14:57:03.145+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:59967 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"2.5ms","level":"info","span":"6ccc5b8c26315181","trace":"01aa1e74b907e53914f35a7a6e19b7ef"}
{"@timestamp":"2025-05-15T15:04:29.603+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"4.7ms","level":"info","span":"dd66ee5f1a4f309f","trace":"7a6c441a32058ae72fcf5f5665b98369"}
{"@timestamp":"2025-05-15T15:04:29.604+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/user/info - [::1]:63985 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"7.2ms","level":"info","span":"5577c99cf72bcc45","trace":"7a6c441a32058ae72fcf5f5665b98369"}
{"@timestamp":"2025-05-15T15:04:29.628+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"2.4ms","level":"info","span":"5b6363effad691aa","trace":"c47851afdafa93fd6e2750fb66d91659"}
{"@timestamp":"2025-05-15T15:04:29.629+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`role_id`,`menu_id` FROM `admin_role_menu` WHERE role_id IN (1) AND del_state = 0 ORDER BY id DESC","duration":"1.6ms","level":"info","span":"f65cd5c563939187","trace":"c47851afdafa93fd6e2750fb66d91659"}
{"@timestamp":"2025-05-15T15:04:29.631+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`pid`,`name`,`path`,`component`,`redirect`,`meta`,`status`,`type`,`sort` FROM `admin_menu` WHERE id IN (19,18,17,16,15,14,13,12,11,10,6,3,2,1) AND del_state = 0 ORDER BY sort ASC","duration":"1.6ms","level":"info","span":"3d476b0acb4b7203","trace":"c47851afdafa93fd6e2750fb66d91659"}
{"@timestamp":"2025-05-15T15:04:29.632+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/menu/all - [::1]:63987 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"6.6ms","level":"info","span":"80f0108cb0d32ad2","trace":"c47851afdafa93fd6e2750fb66d91659"}
{"@timestamp":"2025-05-15T15:04:30.050+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"1.6ms","level":"info","span":"9a1da969cbf59565","trace":"532b4de5d96cce140b34c743aee0bc98"}
{"@timestamp":"2025-05-15T15:04:30.051+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`created_at`,`updated_at`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.6ms","level":"info","span":"d4314e1fb26954f1","trace":"532b4de5d96cce140b34c743aee0bc98"}
{"@timestamp":"2025-05-15T15:04:30.051+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:63991 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"3.2ms","level":"info","span":"be6bb17d2a70030f","trace":"532b4de5d96cce140b34c743aee0bc98"}
{"@timestamp":"2025-05-15T15:04:48.898+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"1.6ms","level":"info","span":"58fe0a509fa23cda","trace":"7af8ccd62def3cefdced7fa0150dd379"}
{"@timestamp":"2025-05-15T15:04:48.898+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/user/info - [::1]:64176 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"3.0ms","level":"info","span":"f75dba73c31de568","trace":"7af8ccd62def3cefdced7fa0150dd379"}
{"@timestamp":"2025-05-15T15:04:48.918+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"1.7ms","level":"info","span":"9834896b337b094c","trace":"a2bbc112f378629bc1fecae6ddea1f2d"}
{"@timestamp":"2025-05-15T15:04:48.920+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`role_id`,`menu_id` FROM `admin_role_menu` WHERE role_id IN (1) AND del_state = 0 ORDER BY id DESC","duration":"1.1ms","level":"info","span":"f69641820f2f450d","trace":"a2bbc112f378629bc1fecae6ddea1f2d"}
{"@timestamp":"2025-05-15T15:04:48.922+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`pid`,`name`,`path`,`component`,`redirect`,`meta`,`status`,`type`,`sort` FROM `admin_menu` WHERE id IN (19,18,17,16,15,14,13,12,11,10,6,3,2,1) AND del_state = 0 ORDER BY sort ASC","duration":"1.0ms","level":"info","span":"533574de9ec9523d","trace":"a2bbc112f378629bc1fecae6ddea1f2d"}
{"@timestamp":"2025-05-15T15:04:48.922+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/menu/all - [::1]:64177 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"6.1ms","level":"info","span":"f2b5f0423e158a20","trace":"a2bbc112f378629bc1fecae6ddea1f2d"}
{"@timestamp":"2025-05-15T15:04:49.212+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"1.6ms","level":"info","span":"aa26e0e7b7474d4b","trace":"7701c13dfc4150790c70a87763785022"}
{"@timestamp":"2025-05-15T15:04:49.213+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`created_at`,`updated_at`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.6ms","level":"info","span":"dcdf4eb0ee90b2e8","trace":"7701c13dfc4150790c70a87763785022"}
{"@timestamp":"2025-05-15T15:04:49.213+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:64225 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"3.2ms","level":"info","span":"f107ef73923e9a31","trace":"7701c13dfc4150790c70a87763785022"}
{"@timestamp":"2025-05-15T15:05:01.460+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 404 - PUT /api/v1/admin/notification/update - [::1]:64281 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"0.0ms","level":"info","span":"39d72f553dcf5c18","trace":"5ee6b9fa0ef2970dcfaf00204fd60086"}
{"@timestamp":"2025-05-15T15:05:37.034+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"5.3ms","level":"info","span":"5caf4d2cab410f38","trace":"b8d7aa54734da6219ad86adb77f44543"}
{"@timestamp":"2025-05-15T15:05:37.035+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/user/info - [::1]:64440 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"7.9ms","level":"info","span":"d103a6bbd6d48c79","trace":"b8d7aa54734da6219ad86adb77f44543"}
{"@timestamp":"2025-05-15T15:05:37.072+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"1.6ms","level":"info","span":"e1403f9ea0584b84","trace":"7dad9d05d8f36b6f79e9770c60590513"}
{"@timestamp":"2025-05-15T15:05:37.073+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`role_id`,`menu_id` FROM `admin_role_menu` WHERE role_id IN (1) AND del_state = 0 ORDER BY id DESC","duration":"1.0ms","level":"info","span":"aac168e9fc05c1f8","trace":"7dad9d05d8f36b6f79e9770c60590513"}
{"@timestamp":"2025-05-15T15:05:37.075+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`pid`,`name`,`path`,`component`,`redirect`,`meta`,`status`,`type`,`sort` FROM `admin_menu` WHERE id IN (19,18,17,16,15,14,13,12,11,10,6,3,2,1) AND del_state = 0 ORDER BY sort ASC","duration":"1.6ms","level":"info","span":"886dc5ebc1ff1433","trace":"7dad9d05d8f36b6f79e9770c60590513"}
{"@timestamp":"2025-05-15T15:05:37.075+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/menu/all - [::1]:64442 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"5.2ms","level":"info","span":"4afee86089048416","trace":"7dad9d05d8f36b6f79e9770c60590513"}
{"@timestamp":"2025-05-15T15:05:37.589+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"1.6ms","level":"info","span":"703d0502d09e7539","trace":"12b1d24506394a4d80ab284b3fd33c0c"}
{"@timestamp":"2025-05-15T15:05:37.590+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`created_at`,`updated_at`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.0ms","level":"info","span":"9fad59166d3d21d4","trace":"12b1d24506394a4d80ab284b3fd33c0c"}
{"@timestamp":"2025-05-15T15:05:37.590+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:64445 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"2.6ms","level":"info","span":"6ead144f8ff4e655","trace":"12b1d24506394a4d80ab284b3fd33c0c"}
{"@timestamp":"2025-05-15T15:05:52.145+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 404 - PUT /api/v1/admin/notification/update - [::1]:64573 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"0.0ms","level":"info","span":"70132d0863400bae","trace":"0384e8daa2e388f85983ee8395d749d8"}
{"@timestamp":"2025-05-15T15:05:59.336+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 404 - PUT /api/v1/admin/notification/update - [::1]:64579 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"0.0ms","level":"info","span":"be712e2d37b93dd2","trace":"10984f46912bb19b7ce2a27eb48b4f6a"}
{"@timestamp":"2025-05-15T15:11:17.138+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE status = 'inactive' AND del_state = 0","duration":"15.5ms","level":"info","span":"394c1e4ccb0e19d2","trace":"def45a31f2a193856597cd7dc34fdaaa"}
{"@timestamp":"2025-05-15T15:11:17.140+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`created_at`,`updated_at`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE status = 'inactive' AND del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.0ms","level":"info","span":"10881db0c5ba6904","trace":"def45a31f2a193856597cd7dc34fdaaa"}
{"@timestamp":"2025-05-15T15:11:17.140+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20&status=inactive - [::1]:50499 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"18.0ms","level":"info","span":"ec1429b4375f9220","trace":"def45a31f2a193856597cd7dc34fdaaa"}
{"@timestamp":"2025-05-15T15:11:17.475+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE status = 'inactive' AND del_state = 0","duration":"1.5ms","level":"info","span":"08754e77eb48d6c5","trace":"d7f6ff2faea733a5d80d1787088ff77d"}
{"@timestamp":"2025-05-15T15:11:17.476+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`created_at`,`updated_at`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE status = 'inactive' AND del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.0ms","level":"info","span":"22658b788fc1271b","trace":"d7f6ff2faea733a5d80d1787088ff77d"}
{"@timestamp":"2025-05-15T15:11:17.476+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20&status=inactive - [::1]:50504 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"3.0ms","level":"info","span":"cd8ee9caec48b76b","trace":"d7f6ff2faea733a5d80d1787088ff77d"}
{"@timestamp":"2025-05-15T15:11:18.693+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE status = 'active' AND del_state = 0","duration":"1.5ms","level":"info","span":"a69debf9a6f29e8d","trace":"876eb1b3fdb783fbf137ca7b1b91856b"}
{"@timestamp":"2025-05-15T15:11:18.694+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`created_at`,`updated_at`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE status = 'active' AND del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"0.5ms","level":"info","span":"a837255f2fb0d7db","trace":"876eb1b3fdb783fbf137ca7b1b91856b"}
{"@timestamp":"2025-05-15T15:11:18.694+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20&status=active - [::1]:50508 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"2.0ms","level":"info","span":"b26edcf575237191","trace":"876eb1b3fdb783fbf137ca7b1b91856b"}
{"@timestamp":"2025-05-15T15:11:19.569+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"1.6ms","level":"info","span":"c2c10bb04dbd5daa","trace":"3cf87cb2ca8febd3f72178ae8ded68bb"}
{"@timestamp":"2025-05-15T15:11:19.570+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`created_at`,`updated_at`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.0ms","level":"info","span":"66d8afc7a2ef2dee","trace":"3cf87cb2ca8febd3f72178ae8ded68bb"}
{"@timestamp":"2025-05-15T15:11:19.570+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:50511 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"3.2ms","level":"info","span":"26958c2a0c497387","trace":"3cf87cb2ca8febd3f72178ae8ded68bb"}
{"@timestamp":"2025-05-15T15:12:24.499+08:00","caller":"sqlx/stmt.go:274","content":"sql query: select `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`created_at`,`updated_at`,`status`,`del_state`,`version`,`delete_time` from `global_notifications` where `id` = 4 and del_state = 0 limit 1","duration":"3.7ms","level":"info","span":"ee910b8fc47ee4a8","trace":"86a49825f320f9d6735b58d19188c942"}
{"@timestamp":"2025-05-15T15:12:24.500+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - DELETE /api/v1/admin/notification/delete/4 - [::1]:50919 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"6.3ms","level":"info","span":"bce16c7987c89bb9","trace":"86a49825f320f9d6735b58d19188c942"}
{"@timestamp":"2025-05-15T15:13:49.635+08:00","caller":"api/main.go:65","content":"Starting server at %s:%d...0.0.0.08888","level":"info"}
{"@timestamp":"2025-05-15T15:13:56.002+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"1.6ms","level":"info","span":"8efea0d4edfff728","trace":"355f7c8707389d8650a07bbf270df793"}
{"@timestamp":"2025-05-15T15:13:56.003+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/user/info - [::1]:51954 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"9.2ms","level":"info","span":"7597f0f5fcdaf390","trace":"355f7c8707389d8650a07bbf270df793"}
{"@timestamp":"2025-05-15T15:13:56.053+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"2.7ms","level":"info","span":"648cf2880d6a8d9e","trace":"5e1646f2a90b291b63e17328b27608fa"}
{"@timestamp":"2025-05-15T15:13:56.055+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`role_id`,`menu_id` FROM `admin_role_menu` WHERE role_id IN (1) AND del_state = 0 ORDER BY id DESC","duration":"1.6ms","level":"info","span":"479c3a0e4e06b5cf","trace":"5e1646f2a90b291b63e17328b27608fa"}
{"@timestamp":"2025-05-15T15:13:56.058+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`pid`,`name`,`path`,`component`,`redirect`,`meta`,`status`,`type`,`sort` FROM `admin_menu` WHERE id IN (19,18,17,16,15,14,13,12,11,10,6,3,2,1) AND del_state = 0 ORDER BY sort ASC","duration":"2.6ms","level":"info","span":"28f7c99701284705","trace":"5e1646f2a90b291b63e17328b27608fa"}
{"@timestamp":"2025-05-15T15:13:56.061+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/menu/all - [::1]:51956 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"12.2ms","level":"info","span":"794b329f85603258","trace":"5e1646f2a90b291b63e17328b27608fa"}
{"@timestamp":"2025-05-15T15:13:56.597+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"2.4ms","level":"info","span":"06d0600539d5e981","trace":"f516882af69315fc50db1ef3f0550580"}
{"@timestamp":"2025-05-15T15:13:56.599+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`created_at`,`updated_at`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"2.1ms","level":"info","span":"9aab2cb930c09dfc","trace":"f516882af69315fc50db1ef3f0550580"}
{"@timestamp":"2025-05-15T15:13:56.600+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:51959 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"5.0ms","level":"info","span":"894651eb02d6b289","trace":"f516882af69315fc50db1ef3f0550580"}
{"@timestamp":"2025-05-15T15:13:58.686+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `user` WHERE del_state = 0","duration":"48.9ms","level":"info","span":"c1f62a93c788ccc3","trace":"ed213b263c1a5506e8bbed5a6c1d70a5"}
{"@timestamp":"2025-05-15T15:13:58.688+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`mobile`,`password`,`nickname`,`info`,`inside` FROM `user` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.5ms","level":"info","span":"dd7bb76200c5ef1e","trace":"ed213b263c1a5506e8bbed5a6c1d70a5"}
{"@timestamp":"2025-05-15T15:13:58.688+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/platform_user/list?page=1&pageSize=20 - [::1]:51961 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"51.0ms","level":"info","span":"466ac6e949eee534","trace":"ed213b263c1a5506e8bbed5a6c1d70a5"}
{"@timestamp":"2025-05-15T15:14:04.233+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `user` WHERE del_state = 0","duration":"2.1ms","level":"info","span":"78852dd33e44813b","trace":"4ecd52cc180c1ed53fd17828bdd84d37"}
{"@timestamp":"2025-05-15T15:14:04.235+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`mobile`,`password`,`nickname`,`info`,`inside` FROM `user` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 4380","duration":"2.1ms","level":"info","span":"38658f914c9e5a03","trace":"4ecd52cc180c1ed53fd17828bdd84d37"}
{"@timestamp":"2025-05-15T15:14:04.235+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/platform_user/list?page=220&pageSize=20 - [::1]:51971 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"4.7ms","level":"info","span":"26e953fbc147ff2b","trace":"4ecd52cc180c1ed53fd17828bdd84d37"}
{"@timestamp":"2025-05-15T15:14:08.771+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 404 - PUT /api/v1/admin/platform_user/update/1 - [::1]:51975 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"0.0ms","level":"info","span":"b4982519124a68cf","trace":"fbe27a5c174f35a30f999f5e509de8ca"}
{"@timestamp":"2025-05-15T15:15:43.715+08:00","caller":"api/main.go:65","content":"Starting server at %s:%d...0.0.0.08888","level":"info"}
{"@timestamp":"2025-05-15T15:16:22.004+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"1.6ms","level":"info","span":"7fab3149e19aa0a8","trace":"5dbc5a1e574c55c3cb0f84e30f0a6eec"}
{"@timestamp":"2025-05-15T15:16:22.006+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/user/info - [::1]:53211 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"8.9ms","level":"info","span":"5dc8e518e5e56edb","trace":"5dbc5a1e574c55c3cb0f84e30f0a6eec"}
{"@timestamp":"2025-05-15T15:16:22.055+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"1.8ms","level":"info","span":"17a7e2124852bb82","trace":"f8893cea346e39bc41c6f61ef556f9c7"}
{"@timestamp":"2025-05-15T15:16:22.057+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`role_id`,`menu_id` FROM `admin_role_menu` WHERE role_id IN (1) AND del_state = 0 ORDER BY id DESC","duration":"1.1ms","level":"info","span":"37559e55a012d489","trace":"f8893cea346e39bc41c6f61ef556f9c7"}
{"@timestamp":"2025-05-15T15:16:22.059+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`pid`,`name`,`path`,`component`,`redirect`,`meta`,`status`,`type`,`sort` FROM `admin_menu` WHERE id IN (19,18,17,16,15,14,13,12,11,10,6,3,2,1) AND del_state = 0 ORDER BY sort ASC","duration":"1.1ms","level":"info","span":"329634aee4e66ab0","trace":"f8893cea346e39bc41c6f61ef556f9c7"}
{"@timestamp":"2025-05-15T15:16:22.061+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/menu/all - [::1]:53213 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"8.2ms","level":"info","span":"b1cf209141c2c6be","trace":"f8893cea346e39bc41c6f61ef556f9c7"}
{"@timestamp":"2025-05-15T15:16:23.147+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `user` WHERE del_state = 0","duration":"2.7ms","level":"info","span":"2913f7f4e14eaf58","trace":"cb19a5304befb7321dd24f16b8f279b1"}
{"@timestamp":"2025-05-15T15:16:23.147+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`mobile`,`password`,`nickname`,`info`,`inside` FROM `user` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"0.5ms","level":"info","span":"9cfa58d4e7f9add6","trace":"cb19a5304befb7321dd24f16b8f279b1"}
{"@timestamp":"2025-05-15T15:16:23.148+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/platform_user/list?page=1&pageSize=20 - [::1]:53219 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"3.8ms","level":"info","span":"e027d1f11eb08fd7","trace":"cb19a5304befb7321dd24f16b8f279b1"}
{"@timestamp":"2025-05-15T15:16:33.305+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"2.3ms","level":"info","span":"257085f958a8e3ec","trace":"a847a5bee6826a3d7b7dda6cd42ac01b"}
{"@timestamp":"2025-05-15T15:16:33.307+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`created_at`,`updated_at`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.6ms","level":"info","span":"33f464c278eeede6","trace":"a847a5bee6826a3d7b7dda6cd42ac01b"}
{"@timestamp":"2025-05-15T15:16:33.307+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:53338 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"4.4ms","level":"info","span":"70a798c8cc05a396","trace":"a847a5bee6826a3d7b7dda6cd42ac01b"}
{"@timestamp":"2025-05-15T15:16:40.907+08:00","caller":"sqlx/stmt.go:274","content":"sql query: select `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`created_at`,`updated_at`,`status`,`del_state`,`version`,`delete_time` from `global_notifications` where `id` = 3 and del_state = 0 limit 1","duration":"1.0ms","level":"info","span":"d7196b561f6bc984","trace":"41f2a4d6ffade6e2b0523212b71d6c8e"}
{"@timestamp":"2025-05-15T15:16:40.911+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - PUT /api/v1/admin/notification/update/3 - [::1]:53388 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"5.3ms","level":"info","span":"1787695655594302","trace":"41f2a4d6ffade6e2b0523212b71d6c8e"}
{"@timestamp":"2025-05-15T15:28:23.920+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - PUT /api/v1/admin/notification/update/3 - [::1]:57473 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"1.1ms","level":"info","span":"690bc5b4ab2fc543","trace":"8a6ea2e1ee3add71fe988caf55916061"}
{"@timestamp":"2025-05-15T15:29:51.042+08:00","caller":"api/main.go:65","content":"Starting server at %s:%d...0.0.0.08888","level":"info"}
{"@timestamp":"2025-05-15T15:29:56.036+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - PUT /api/v1/admin/notification/update/3 - [::1]:58053 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"7.5ms","level":"info","span":"d9f4e055384cc73f","trace":"c14d7c4e38a84e333f31d899ce3df99a"}
{"@timestamp":"2025-05-15T15:30:33.437+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `user` WHERE del_state = 0","duration":"2.1ms","level":"info","span":"f20b77281e1dca2f","trace":"e1bd06cea4ba10543e875677ed458716"}
{"@timestamp":"2025-05-15T15:30:33.439+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`mobile`,`password`,`nickname`,`info`,`inside` FROM `user` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.0ms","level":"info","span":"c0e603b75e031380","trace":"e1bd06cea4ba10543e875677ed458716"}
{"@timestamp":"2025-05-15T15:30:33.439+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/platform_user/list?page=1&pageSize=20 - [::1]:58175 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"4.7ms","level":"info","span":"fe8a6af518294aee","trace":"e1bd06cea4ba10543e875677ed458716"}
{"@timestamp":"2025-05-15T15:30:34.294+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `user` WHERE del_state = 0","duration":"2.2ms","level":"info","span":"ff1ba0bdec4f4ff7","trace":"248e4b4225b12e3a0a6b512b501411c3"}
{"@timestamp":"2025-05-15T15:30:34.297+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`mobile`,`password`,`nickname`,`info`,`inside` FROM `user` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 4380","duration":"2.2ms","level":"info","span":"1bc720e5c5c1b1c0","trace":"248e4b4225b12e3a0a6b512b501411c3"}
{"@timestamp":"2025-05-15T15:30:34.297+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/platform_user/list?page=220&pageSize=20 - [::1]:58179 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"4.4ms","level":"info","span":"c6837522bffb496a","trace":"248e4b4225b12e3a0a6b512b501411c3"}
{"@timestamp":"2025-05-15T15:30:37.540+08:00","caller":"sqlx/stmt.go:274","content":"sql query: select `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`mobile`,`password`,`nickname`,`info`,`inside` from `user` where `id` = 1 and del_state = 0 limit 1","duration":"1.2ms","level":"info","span":"bb76c7931fe479c8","trace":"5adbb30f9c63e6c3d981bfd3203bb665"}
{"@timestamp":"2025-05-15T15:30:37.576+08:00","caller":"sqlx/stmt.go:274","content":"sql exec: update `user` set `delete_time`={0001-01-01 00:00:00 +0000 UTC false},`del_state`=0,`version`=0,`mobile`='6YOGOyDLWF8EfQlf+wBeSQ==',`password`={7305e58de264a489e59c223bb4ff29f8 true},`nickname`={十分靓仔 true},`info`='',`inside`=0 where `id` = 1","duration":"35.0ms","level":"info","span":"4c7fd4c33d57da78","trace":"5adbb30f9c63e6c3d981bfd3203bb665"}
{"@timestamp":"2025-05-15T15:30:37.577+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - PUT /api/v1/admin/platform_user/update/1 - [::1]:58183 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"39.2ms","level":"info","span":"6bffbc4286c21112","trace":"5adbb30f9c63e6c3d981bfd3203bb665"}
{"@timestamp":"2025-05-15T15:30:37.601+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `user` WHERE del_state = 0","duration":"2.2ms","level":"info","span":"690e2b9af8b3c4bb","trace":"31b35590c30ff715bac4035c09079c2a"}
{"@timestamp":"2025-05-15T15:30:37.604+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`mobile`,`password`,`nickname`,`info`,`inside` FROM `user` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 4380","duration":"2.7ms","level":"info","span":"53ef46e42229741a","trace":"31b35590c30ff715bac4035c09079c2a"}
{"@timestamp":"2025-05-15T15:30:37.604+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/platform_user/list?page=220&pageSize=20 - [::1]:58185 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"4.8ms","level":"info","span":"e414b5550a4d0a66","trace":"31b35590c30ff715bac4035c09079c2a"}
{"@timestamp":"2025-05-15T15:30:41.529+08:00","caller":"sqlx/stmt.go:274","content":"sql query: select `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`mobile`,`password`,`nickname`,`info`,`inside` from `user` where `id` = 1 and del_state = 0 limit 1","duration":"2.2ms","level":"info","span":"8c90ad9eabc9f30d","trace":"7867042e672c83a0c9bb3dc3b6419bb9"}
{"@timestamp":"2025-05-15T15:30:41.547+08:00","caller":"sqlx/stmt.go:274","content":"sql exec: update `user` set `delete_time`={0001-01-01 00:00:00 +0000 UTC false},`del_state`=0,`version`=0,`mobile`='6YOGOyDLWF8EfQlf+wBeSQ==',`password`={7305e58de264a489e59c223bb4ff29f8 true},`nickname`={十分靓仔 true},`info`='',`inside`=1 where `id` = 1","duration":"14.4ms","level":"info","span":"5288d07ff3af5237","trace":"7867042e672c83a0c9bb3dc3b6419bb9"}
{"@timestamp":"2025-05-15T15:30:41.549+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - PUT /api/v1/admin/platform_user/update/1 - [::1]:58265 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"23.6ms","level":"info","span":"714e27156b2e0f44","trace":"7867042e672c83a0c9bb3dc3b6419bb9"}
{"@timestamp":"2025-05-15T15:30:41.577+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `user` WHERE del_state = 0","duration":"2.1ms","level":"info","span":"21511879f4670b9e","trace":"d465228fcdadcf61b0a4991ed001ae02"}
{"@timestamp":"2025-05-15T15:30:41.579+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`mobile`,`password`,`nickname`,`info`,`inside` FROM `user` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 4380","duration":"2.1ms","level":"info","span":"94617cab3129f807","trace":"d465228fcdadcf61b0a4991ed001ae02"}
{"@timestamp":"2025-05-15T15:30:41.579+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/platform_user/list?page=220&pageSize=20 - [::1]:58267 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"4.2ms","level":"info","span":"dd18f8625b27fade","trace":"d465228fcdadcf61b0a4991ed001ae02"}
{"@timestamp":"2025-05-15T15:30:43.570+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"2.5ms","level":"info","span":"4b7177b4d28f5dad","trace":"f4e7078954702a1fe53db0a01f36e5dd"}
{"@timestamp":"2025-05-15T15:30:43.572+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`created_at`,`updated_at`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.6ms","level":"info","span":"8a23cabc5d06ff99","trace":"f4e7078954702a1fe53db0a01f36e5dd"}
{"@timestamp":"2025-05-15T15:30:43.572+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:58292 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"5.1ms","level":"info","span":"85c5693779dcc283","trace":"f4e7078954702a1fe53db0a01f36e5dd"}
{"@timestamp":"2025-05-15T15:41:44.549+08:00","caller":"api/main.go:65","content":"Starting server at %s:%d...0.0.0.08888","level":"info"}
{"@timestamp":"2025-05-15T15:42:08.935+08:00","caller":"sqlx/stmt.go:274","content":"sql exec: update `global_notifications` set `title`='元旦节日惠客通知',`content`='<p>🎉元旦感恩特惠活动公告🎉 尊敬的用户,您好!为庆祝元旦节日,我们特别推出限时优惠活动: 活动时间: 2025年1月1日12:00 至 2025年1月2日12:00 活动内容: 活动期间内,所有功能无限次数通通 2折 优惠! 参与方式: 在活动时间内登录系统,即可享受所有服务 2 折优惠,机会难得,不容错过! 温馨提示: 为了方便您参与未来更多优惠活动,请将我们的网站收藏到您的浏览器书签中,或在百度搜索随时访问我们的最新动态和活动信息! 活动解释权归平台所有。 感谢您的支持,祝您元旦快乐!🎊</p>',`notification_page`='/',`start_date`={2025-01-01 00:00:00 +0000 UTC true},`end_date`={2025-01-02 00:00:00 +0000 UTC true},`start_time`='',`end_time`='',`created_time`='0001-01-01 00:00:00 +0000 UTC',`updated_time`='0001-01-01 00:00:00 +0000 UTC',`status`='inactive',`del_state`=0,`version`=1,`delete_time`={0001-01-01 00:00:00 +0000 UTC false} where `id` = 3","duration":"3.7ms","level":"info","span":"94463b3d515ade48","trace":"28ca068539c01ebd5e93b87b2f4db8c7"}
{"@timestamp":"2025-05-15T15:42:08.935+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - PUT /api/v1/admin/notification/update/3 - [::1]:63609 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"8.1ms","level":"info","span":"09470cfafab12cfc","trace":"28ca068539c01ebd5e93b87b2f4db8c7"}
{"@timestamp":"2025-05-15T15:43:50.516+08:00","caller":"api/main.go:65","content":"Starting server at %s:%d...0.0.0.08888","level":"info"}
{"@timestamp":"2025-05-15T15:43:59.434+08:00","caller":"sqlx/stmt.go:274","content":"sql exec: update `global_notifications` set `title`='元旦节日惠客通知',`content`='<p>🎉元旦感恩特惠活动公告🎉 尊敬的用户,您好!为庆祝元旦节日,我们特别推出限时优惠活动: 活动时间: 2025年1月1日12:00 至 2025年1月2日12:00 活动内容: 活动期间内,所有功能无限次数通通 2折 优惠! 参与方式: 在活动时间内登录系统,即可享受所有服务 2 折优惠,机会难得,不容错过! 温馨提示: 为了方便您参与未来更多优惠活动,请将我们的网站收藏到您的浏览器书签中,或在百度搜索随时访问我们的最新动态和活动信息! 活动解释权归平台所有。 感谢您的支持,祝您元旦快乐!🎊</p>',`notification_page`='/',`start_date`={2025-01-01 00:00:00 +0000 UTC true},`end_date`={2025-01-02 00:00:00 +0000 UTC true},`start_time`='',`end_time`='',`created_time`='0001-01-01 00:00:00 +0000 UTC',`updated_time`='0001-01-01 00:00:00 +0000 UTC',`status`='inactive',`del_state`=0,`version`=1,`delete_time`={0001-01-01 00:00:00 +0000 UTC false} where `id` = 3","duration":"2.7ms","level":"info","span":"05dda203e991ed65","trace":"0628633c2e124a03269789a41c9f0be5"}
{"@timestamp":"2025-05-15T15:43:59.435+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - PUT /api/v1/admin/notification/update/3 - [::1]:64238 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"8.5ms","level":"info","span":"5e7c558378b89b9b","trace":"0628633c2e124a03269789a41c9f0be5"}
{"@timestamp":"2025-05-15T15:45:03.689+08:00","caller":"sqlx/stmt.go:274","content":"sql query: select `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`created_time`,`updated_time`,`status`,`del_state`,`version`,`delete_time` from `global_notifications` where `id` = 1 and del_state = 0 limit 1","duration":"3.7ms","level":"info","span":"28f862bd16ef8897","trace":"3f79274580eaf8984bd9f7877044bcb1"}
{"@timestamp":"2025-05-15T15:45:03.697+08:00","caller":"sqlx/stmt.go:274","content":"sql exec: update `global_notifications` set `title`='通知',`content`='<div class=\\\"font-2xl font-bold mb-2\\\">通知</div>\\n<p class=\\\"mb-4\\\">\\n 尊敬的用户您好由于民政部门的系统升级近期婚姻报告服务将在每晚凌晨0点至2点30分进行维护期间停止查询。\\n 我们深感抱歉,给您带来的不便敬请谅解。\\n</p>\\n<p class=\\\"text-base text-gray-500 mb-4\\\">\\n 请您在维护完成后再尝试查询。感谢您的理解与支持!\\n</p>\\n',`notification_page`='/inquire/toc_Marriage',`start_date`={0001-01-01 00:00:00 +0000 UTC false},`end_date`={0001-01-01 00:00:00 +0000 UTC false},`start_time`='00:00:00',`end_time`='02:30:00',`created_time`='2024-12-31 21:51:54 +0800 CST',`updated_time`='2025-01-14 11:34:22 +0800 CST',`status`='inactive',`del_state`=1,`version`=1,`delete_time`={2025-05-15 15:45:03.6900656 +0800 CST m=+73.196598201 true} where `id` = 1 and version = 0 ","duration":"7.3ms","level":"info","span":"57e9e50454c90162","trace":"3f79274580eaf8984bd9f7877044bcb1"}
{"@timestamp":"2025-05-15T15:45:03.697+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - DELETE /api/v1/admin/notification/delete/1 - [::1]:64772 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"14.2ms","level":"info","span":"63849fc74c7f2b04","trace":"3f79274580eaf8984bd9f7877044bcb1"}
{"@timestamp":"2025-05-15T15:45:03.732+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"1.7ms","level":"info","span":"dd535183b6bf23e6","trace":"cd941ff6f0ae3362cbf0c6c26ab2ad6c"}
{"@timestamp":"2025-05-15T15:45:03.733+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`created_time`,`updated_time`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.1ms","level":"info","span":"b7d6d1bc4c1e2ac4","trace":"cd941ff6f0ae3362cbf0c6c26ab2ad6c"}
{"@timestamp":"2025-05-15T15:45:03.733+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:64780 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"2.8ms","level":"info","span":"e579bcd76c1dc810","trace":"cd941ff6f0ae3362cbf0c6c26ab2ad6c"}
{"@timestamp":"2025-05-15T15:45:08.357+08:00","caller":"sqlx/stmt.go:274","content":"sql exec: update `global_notifications` set `title`='通知',`content`='<div class=\\\"font-2xl font-bold mb-2\\\">升级通知</div> \\r\\n<p class=\\\"mb-4\\\">\\r\\n 尊敬的用户您好由于平台进行全面功能升级今日12点至下午15点期间所有功能将暂时不可用。 \\r\\n 我们深感抱歉,给您带来的不便敬请谅解。\\r\\n</p>\\r\\n<p class=\\\"text-base text-gray-500 mb-4\\\">\\r\\n 请您在升级完成后再尝试使用相关功能。感谢您的理解与支持!\\r\\n</p>\\r\\n',`notification_page`='/',`start_date`={0001-01-01 00:00:00 +0000 UTC false},`end_date`={0001-01-01 00:00:00 +0000 UTC false},`start_time`='12:00:00',`end_time`='15:00:00',`created_time`='0001-01-01 00:00:00 +0000 UTC',`updated_time`='0001-01-01 00:00:00 +0000 UTC',`status`='inactive',`del_state`=1,`version`=1,`delete_time`={2025-05-15 15:45:08.3562001 +0800 CST m=+77.862732701 true} where `id` = 4 and version = 0 ","duration":"1.0ms","level":"info","span":"099ec10c8fcaa297","trace":"01027e3fb1f1d7700eeb0467712590b4"}
{"@timestamp":"2025-05-15T15:45:08.357+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - DELETE /api/v1/admin/notification/delete/4 - [::1]:64828 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"1.9ms","level":"info","span":"6099296888d29cb1","trace":"01027e3fb1f1d7700eeb0467712590b4"}
{"@timestamp":"2025-05-15T15:45:18.242+08:00","caller":"sqlx/stmt.go:274","content":"sql exec: update `global_notifications` set `title`='通知',`content`='<div class=\\\"font-2xl font-bold mb-2\\\">升级通知</div> \\r\\n<p class=\\\"mb-4\\\">\\r\\n 尊敬的用户您好由于平台进行全面功能升级今日12点至下午15点期间所有功能将暂时不可用。 \\r\\n 我们深感抱歉,给您带来的不便敬请谅解。\\r\\n</p>\\r\\n<p class=\\\"text-base text-gray-500 mb-4\\\">\\r\\n 请您在升级完成后再尝试使用相关功能。感谢您的理解与支持!\\r\\n</p>\\r\\n',`notification_page`='/',`start_date`={0001-01-01 00:00:00 +0000 UTC false},`end_date`={0001-01-01 00:00:00 +0000 UTC false},`start_time`='12:00:00',`end_time`='15:00:00',`created_time`='0001-01-01 00:00:00 +0000 UTC',`updated_time`='0001-01-01 00:00:00 +0000 UTC',`status`='inactive',`del_state`=1,`version`=1,`delete_time`={2025-05-15 15:45:18.2411283 +0800 CST m=+87.747660901 true} where `id` = 4 and version = 0 ","duration":"1.1ms","level":"info","span":"27a568bb7c17df60","trace":"3fa21f5f87161092d428e62480cdea7a"}
{"@timestamp":"2025-05-15T15:45:18.242+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - DELETE /api/v1/admin/notification/delete/4 - [::1]:64871 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"2.6ms","level":"info","span":"8475cb20edf83232","trace":"3fa21f5f87161092d428e62480cdea7a"}
{"@timestamp":"2025-05-15T15:45:19.566+08:00","caller":"sqlx/stmt.go:274","content":"sql exec: update `global_notifications` set `title`='元旦节日惠客通知',`content`='<div style=\\\"font-family: Arial, sans-serif; line-height: 1.3; color: #333;\\\">\\n <h2 style=\\\"text-align: center; color: #d9534f; font-size: 24px; margin-bottom: 20px;\\\">🎉元旦感恩特惠活动公告🎉</h2>\\n \\n <p style=\\\"font-size: 18px; margin-bottom: 10px;\\\">\\n 尊敬的用户,您好!为庆祝元旦节日,我们特别推出限时优惠活动:\\n </p>\\n \\n <p style=\\\"font-size: 16px; margin-bottom: 10px;\\\">\\n <strong style=\\\"color: #d9534f;\\\">活动时间:</strong> \\n <span style=\\\"color: #0275d8;\\\">2025年1月1日12:00 至 2025年1月2日12:00</span>\\n </p>\\n \\n <p style=\\\"font-size: 16px; margin-bottom: 10px;\\\">\\n <strong style=\\\"color: #d9534f;\\\">活动内容:</strong> \\n 活动期间内,所有功能无限次数通通 \\n <span style=\\\"color: #d9534f; font-weight: bold; font-size: 20px;\\\">2折</span> 优惠!\\n </p>\\n \\n <p style=\\\"font-size: 16px; margin-bottom: 10px;\\\">\\n <strong style=\\\"color: #d9534f;\\\">参与方式:</strong> \\n 在活动时间内登录系统,即可享受所有服务 2 折优惠,机会难得,不容错过!\\n </p>\\n \\n <p style=\\\"font-size: 16px; margin-bottom: 10px; color: #333;\\\">\\n <strong style=\\\"color: #5cb85c;\\\">温馨提示:</strong>\\n 为了方便您参与未来更多优惠活动,请将我们的网站收藏到您的浏览器书签中,或在百度搜索随时访问我们的最新动态和活动信息!\\n </p>\\n \\n <p style=\\\"font-size: 14px; margin-bottom: 10px; color: #888;\\\">\\n 活动解释权归平台所有。\\n </p>\\n \\n <p style=\\\"text-align: center; margin-top: 20px; font-size: 16px; color: #5cb85c;\\\">\\n 感谢您的支持,祝您元旦快乐!🎊\\n </p>\\n </div>',`notification_page`='/',`start_date`={2025-01-01 00:00:00 +0800 CST true},`end_date`={2025-01-02 00:00:00 +0800 CST true},`start_time`='00:00:00',`end_time`='12:00:00',`created_time`='0001-01-01 00:00:00 +0000 UTC',`updated_time`='0001-01-01 00:00:00 +0000 UTC',`status`='inactive',`del_state`=1,`version`=2,`delete_time`={2025-05-15 15:45:19.5655646 +0800 CST m=+89.072097201 true} where `id` = 3 and version = 1 ","duration":"1.1ms","level":"info","span":"ebef4569c7d11958","trace":"60a60432285c02bea2c0187441f06503"}
{"@timestamp":"2025-05-15T15:45:19.567+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - DELETE /api/v1/admin/notification/delete/3 - [::1]:64876 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"2.6ms","level":"info","span":"61b3b0137f0a6c33","trace":"60a60432285c02bea2c0187441f06503"}
{"@timestamp":"2025-05-15T15:45:37.302+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"2.1ms","level":"info","span":"97c0ec61fb52e5c9","trace":"f7a8a5c212816e34e08fc435e7910668"}
{"@timestamp":"2025-05-15T15:45:37.302+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/user/info - [::1]:64926 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"4.7ms","level":"info","span":"92cd6c392bf7cc35","trace":"f7a8a5c212816e34e08fc435e7910668"}
{"@timestamp":"2025-05-15T15:45:37.338+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"1.9ms","level":"info","span":"2c590d7aff01ba55","trace":"1c2f52d026282c13857581889907a795"}
{"@timestamp":"2025-05-15T15:45:37.339+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`role_id`,`menu_id` FROM `admin_role_menu` WHERE role_id IN (1) AND del_state = 0 ORDER BY id DESC","duration":"1.0ms","level":"info","span":"6c365b896abff53f","trace":"1c2f52d026282c13857581889907a795"}
{"@timestamp":"2025-05-15T15:45:37.340+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`pid`,`name`,`path`,`component`,`redirect`,`meta`,`status`,`type`,`sort` FROM `admin_menu` WHERE id IN (19,18,17,16,15,14,13,12,11,10,6,3,2,1) AND del_state = 0 ORDER BY sort ASC","duration":"0.5ms","level":"info","span":"d7358a40c5d7e95c","trace":"1c2f52d026282c13857581889907a795"}
{"@timestamp":"2025-05-15T15:45:37.343+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/menu/all - [::1]:64927 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"6.5ms","level":"info","span":"c59111fd6d330eef","trace":"1c2f52d026282c13857581889907a795"}
{"@timestamp":"2025-05-15T15:45:37.758+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"1.4ms","level":"info","span":"e6b92fb905d3d3e6","trace":"e2bb2ce56433421a11bb833908b13fbb"}
{"@timestamp":"2025-05-15T15:45:37.759+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`created_time`,`updated_time`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"0.5ms","level":"info","span":"5b76114753fdbfbf","trace":"e2bb2ce56433421a11bb833908b13fbb"}
{"@timestamp":"2025-05-15T15:45:37.759+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:64930 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"2.4ms","level":"info","span":"d815d0a99c8c8490","trace":"e2bb2ce56433421a11bb833908b13fbb"}
{"@timestamp":"2025-05-15T15:45:59.204+08:00","caller":"sqlx/stmt.go:274","content":"sql exec: insert into `global_notifications` (`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`created_time`,`updated_time`,`status`,`del_state`,`version`,`delete_time`) values ('节日特惠', '<p style=\\\"text-align: start;\\\">尊敬的顾客朋友:</p><p style=\\\"text-align: start;\\\">感谢您一直以来对【店铺/品牌名称】的支持!为回馈新老客户,我们特推出以下超值优惠活动:</p><p style=\\\"text-align: start;\\\"><strong>📅 活动时间</strong><br><br>2023年X月X日 - X月X日</p><p style=\\\"text-align: start;\\\"><strong>🎉 促销内容</strong><br><br>1<strong>全场商品低至5折</strong>​:指定商品享折上折,部分爆款限时秒杀!<br><br>2<strong>满减狂欢</strong>​:单笔消费满【金额】立减【金额】,多买多省!<br><br>3<strong>赠品福利</strong>​:消费满【金额】即赠【赠品名称】,数量有限,先到先得!<br><br>4<strong>会员专享</strong>注册成为会员额外领【XX元无门槛优惠券】</p><p style=\\\"text-align: start;\\\"><strong>📍 参与方式</strong><br><br>线下:到店选购,地址:【门店地址】<br><br>线上:进入【小程序/APP/网店名称】,搜索活动专区即可参与!</p><p style=\\\"text-align: start;\\\"><strong>📞 咨询方式</strong><br><br>电话【XXX-XXXXXXX】<br><br>客服微信:【微信号/二维码】</p><p style=\\\"text-align: start;\\\">**❗ 温馨提示**<br><br>• 活动仅限指定商品,不与其他优惠叠加。<br><br>• 赠品/优惠券数量有限,先到先得,用完即止。</p><p style=\\\"text-align: start;\\\"><strong>👉 速来抢购,错过再等一年!​</strong></p><p style=\\\"text-align: start;\\\">【店铺/品牌名称】<br><br>2023年X月X日</p>', '/', {2025-05-23 00:00:00 +0000 UTC true}, {2025-05-23 00:00:00 +0000 UTC true}, '', '', '0001-01-01 00:00:00 +0000 UTC', '0001-01-01 00:00:00 +0000 UTC', 'active', 0, 0, {0001-01-01 00:00:00 +0000 UTC false})","duration":"2.8ms","level":"info","span":"9aed83c75afe42a9","trace":"4497c3cfbb931fdfb0d03cab2ea5b665"}
{"@timestamp":"2025-05-15T15:45:59.205+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - POST /api/v1/admin/notification/create - [::1]:65061 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"3.3ms","level":"info","span":"0404912b66efc809","trace":"4497c3cfbb931fdfb0d03cab2ea5b665"}
{"@timestamp":"2025-05-15T15:51:14.009+08:00","caller":"api/main.go:65","content":"Starting server at %s:%d...0.0.0.08888","level":"info"}
{"@timestamp":"2025-05-15T15:51:19.821+08:00","caller":"sqlx/stmt.go:274","content":"sql exec: insert into `global_notifications` (`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`status`,`del_state`,`version`,`delete_time`) values ('节日特惠', '<p style=\\\"text-align: start;\\\">尊敬的顾客朋友:</p><p style=\\\"text-align: start;\\\">感谢您一直以来对【店铺/品牌名称】的支持!为回馈新老客户,我们特推出以下超值优惠活动:</p><p style=\\\"text-align: start;\\\"><strong>📅 活动时间</strong><br><br>2023年X月X日 - X月X日</p><p style=\\\"text-align: start;\\\"><strong>🎉 促销内容</strong><br><br>1<strong>全场商品低至5折</strong>​:指定商品享折上折,部分爆款限时秒杀!<br><br>2<strong>满减狂欢</strong>​:单笔消费满【金额】立减【金额】,多买多省!<br><br>3<strong>赠品福利</strong>​:消费满【金额】即赠【赠品名称】,数量有限,先到先得!<br><br>4<strong>会员专享</strong>注册成为会员额外领【XX元无门槛优惠券】</p><p style=\\\"text-align: start;\\\"><strong>📍 参与方式</strong><br><br>线下:到店选购,地址:【门店地址】<br><br>线上:进入【小程序/APP/网店名称】,搜索活动专区即可参与!</p><p style=\\\"text-align: start;\\\"><strong>📞 咨询方式</strong><br><br>电话【XXX-XXXXXXX】<br><br>客服微信:【微信号/二维码】</p><p style=\\\"text-align: start;\\\">**❗ 温馨提示**<br><br>• 活动仅限指定商品,不与其他优惠叠加。<br><br>• 赠品/优惠券数量有限,先到先得,用完即止。</p><p style=\\\"text-align: start;\\\"><strong>👉 速来抢购,错过再等一年!​</strong></p><p style=\\\"text-align: start;\\\">【店铺/品牌名称】<br><br>2023年X月X日</p>', '/', {2025-05-23 00:00:00 +0000 UTC true}, {2025-05-23 00:00:00 +0000 UTC true}, '', '', 'active', 0, 0, {0001-01-01 00:00:00 +0000 UTC false})","duration":"7.4ms","level":"info","span":"0c30083bedbf2f0b","trace":"59023bcab2ddb15e574a8dc559c9dca9"}
{"@timestamp":"2025-05-15T15:51:19.822+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - POST /api/v1/admin/notification/create - [::1]:51134 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"11.7ms","level":"info","span":"900da2b1b6c7617e","trace":"59023bcab2ddb15e574a8dc559c9dca9"}
{"@timestamp":"2025-05-15T15:51:19.868+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"2.1ms","level":"info","span":"15fcf84068a523d9","trace":"fec7a513d21119c428f15dd76635fd06"}
{"@timestamp":"2025-05-15T15:51:19.869+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`create_time`,`update_time`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.6ms","level":"info","span":"1ccaff281e302a9d","trace":"fec7a513d21119c428f15dd76635fd06"}
{"@timestamp":"2025-05-15T15:51:19.870+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:51137 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"4.8ms","level":"info","span":"64ab5373fa283e77","trace":"fec7a513d21119c428f15dd76635fd06"}
{"@timestamp":"2025-05-15T15:56:23.262+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"3.8ms","level":"info","span":"2cb0a240d871f383","trace":"110834811f402edc0468a3d22b1a8dbb"}
{"@timestamp":"2025-05-15T15:56:23.263+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`create_time`,`update_time`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.0ms","level":"info","span":"0403d241d6266577","trace":"110834811f402edc0468a3d22b1a8dbb"}
{"@timestamp":"2025-05-15T15:56:23.263+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:52965 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"4.8ms","level":"info","span":"dedb5a6388accef9","trace":"110834811f402edc0468a3d22b1a8dbb"}
{"@timestamp":"2025-05-15T15:56:45.406+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"2.7ms","level":"info","span":"b15722c33ee0046b","trace":"feccc69d6ba25fcb99164ee90e163b87"}
{"@timestamp":"2025-05-15T15:56:45.407+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/user/info - [::1]:53128 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"4.6ms","level":"info","span":"9b8e69a428734275","trace":"feccc69d6ba25fcb99164ee90e163b87"}
{"@timestamp":"2025-05-15T15:56:45.447+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"1.5ms","level":"info","span":"bce802235dfb2754","trace":"5ecddcfc284ced62a3c5e44f47013140"}
{"@timestamp":"2025-05-15T15:56:45.449+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`role_id`,`menu_id` FROM `admin_role_menu` WHERE role_id IN (1) AND del_state = 0 ORDER BY id DESC","duration":"2.1ms","level":"info","span":"947470098f63cef8","trace":"5ecddcfc284ced62a3c5e44f47013140"}
{"@timestamp":"2025-05-15T15:56:45.451+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`pid`,`name`,`path`,`component`,`redirect`,`meta`,`status`,`type`,`sort` FROM `admin_menu` WHERE id IN (19,18,17,16,15,14,13,12,11,10,6,3,2,1) AND del_state = 0 ORDER BY sort ASC","duration":"1.6ms","level":"info","span":"e99544b794c34f0f","trace":"5ecddcfc284ced62a3c5e44f47013140"}
{"@timestamp":"2025-05-15T15:56:45.454+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/menu/all - [::1]:53129 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"8.4ms","level":"info","span":"919fe26a6b0d4659","trace":"5ecddcfc284ced62a3c5e44f47013140"}
{"@timestamp":"2025-05-15T15:56:45.945+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"1.5ms","level":"info","span":"86c646ae2604a423","trace":"83047513a1c1c6da0cc61b23d4ceaa3d"}
{"@timestamp":"2025-05-15T15:56:45.946+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`create_time`,`update_time`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.1ms","level":"info","span":"fc83eb7c32010938","trace":"83047513a1c1c6da0cc61b23d4ceaa3d"}
{"@timestamp":"2025-05-15T15:56:45.946+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:53155 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"2.7ms","level":"info","span":"0089f76e95de9679","trace":"83047513a1c1c6da0cc61b23d4ceaa3d"}
{"@timestamp":"2025-05-15T15:57:53.934+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"3.3ms","level":"info","span":"9c7377b249d07c93","trace":"c4045a6dd4e8440dc68ff05d308eef2b"}
{"@timestamp":"2025-05-15T15:57:53.935+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`create_time`,`update_time`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.0ms","level":"info","span":"a81091937ceff016","trace":"c4045a6dd4e8440dc68ff05d308eef2b"}
{"@timestamp":"2025-05-15T15:57:53.935+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:53625 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"4.3ms","level":"info","span":"56d7ac8213359221","trace":"c4045a6dd4e8440dc68ff05d308eef2b"}
{"@timestamp":"2025-05-15T15:57:57.101+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"2.1ms","level":"info","span":"96bcce3617298017","trace":"21905a4a484f4c9e1d56a8803cbe7fe0"}
{"@timestamp":"2025-05-15T15:57:57.102+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/user/info - [::1]:53635 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"4.1ms","level":"info","span":"dade54b1366294bc","trace":"21905a4a484f4c9e1d56a8803cbe7fe0"}
{"@timestamp":"2025-05-15T15:57:57.133+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"1.7ms","level":"info","span":"5d2f93b7523f2ef3","trace":"073c6691099054ecafb964d641c9c3f0"}
{"@timestamp":"2025-05-15T15:57:57.135+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`role_id`,`menu_id` FROM `admin_role_menu` WHERE role_id IN (1) AND del_state = 0 ORDER BY id DESC","duration":"1.0ms","level":"info","span":"b07d97ce7faf9293","trace":"073c6691099054ecafb964d641c9c3f0"}
{"@timestamp":"2025-05-15T15:57:57.136+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`pid`,`name`,`path`,`component`,`redirect`,`meta`,`status`,`type`,`sort` FROM `admin_menu` WHERE id IN (19,18,17,16,15,14,13,12,11,10,6,3,2,1) AND del_state = 0 ORDER BY sort ASC","duration":"1.1ms","level":"info","span":"af199ebcdd714594","trace":"073c6691099054ecafb964d641c9c3f0"}
{"@timestamp":"2025-05-15T15:57:57.137+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/menu/all - [::1]:53636 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"5.4ms","level":"info","span":"e3a34df18e8081fc","trace":"073c6691099054ecafb964d641c9c3f0"}
{"@timestamp":"2025-05-15T15:57:57.695+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"1.4ms","level":"info","span":"16820e404248ec0d","trace":"6188ac04b8e96f8e843dd45e4a932979"}
{"@timestamp":"2025-05-15T15:57:57.696+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`create_time`,`update_time`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.0ms","level":"info","span":"b085a6021f97d156","trace":"6188ac04b8e96f8e843dd45e4a932979"}
{"@timestamp":"2025-05-15T15:57:57.696+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:53637 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"2.4ms","level":"info","span":"f264f5e262ac3ccf","trace":"6188ac04b8e96f8e843dd45e4a932979"}
{"@timestamp":"2025-05-15T15:59:52.530+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"4.1ms","level":"info","span":"ceb818f25e7f09e1","trace":"b3033cf79b5319997a2c9126755fd64a"}
{"@timestamp":"2025-05-15T15:59:52.531+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/user/info - [::1]:54520 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"6.1ms","level":"info","span":"04a40baf449abd04","trace":"b3033cf79b5319997a2c9126755fd64a"}
{"@timestamp":"2025-05-15T15:59:52.598+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"1.4ms","level":"info","span":"af721c608ae26e6b","trace":"82e6e6ab7f938548fe9db5f79de61c37"}
{"@timestamp":"2025-05-15T15:59:52.599+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`role_id`,`menu_id` FROM `admin_role_menu` WHERE role_id IN (1) AND del_state = 0 ORDER BY id DESC","duration":"1.6ms","level":"info","span":"69ce609bb5e9db7e","trace":"82e6e6ab7f938548fe9db5f79de61c37"}
{"@timestamp":"2025-05-15T15:59:52.600+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`pid`,`name`,`path`,`component`,`redirect`,`meta`,`status`,`type`,`sort` FROM `admin_menu` WHERE id IN (19,18,17,16,15,14,13,12,11,10,6,3,2,1) AND del_state = 0 ORDER BY sort ASC","duration":"0.5ms","level":"info","span":"aac0d47d15500ec9","trace":"82e6e6ab7f938548fe9db5f79de61c37"}
{"@timestamp":"2025-05-15T15:59:52.601+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/menu/all - [::1]:54522 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"4.5ms","level":"info","span":"27cb62767047d9af","trace":"82e6e6ab7f938548fe9db5f79de61c37"}
{"@timestamp":"2025-05-15T15:59:53.117+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"1.9ms","level":"info","span":"d1cae9eaed71fac2","trace":"e59069802150ea95615d3c6f8604eda6"}
{"@timestamp":"2025-05-15T15:59:53.118+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`create_time`,`update_time`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.0ms","level":"info","span":"cf59754ded643a59","trace":"e59069802150ea95615d3c6f8604eda6"}
{"@timestamp":"2025-05-15T15:59:53.118+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:54525 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"3.4ms","level":"info","span":"4bec7bc89afe006c","trace":"e59069802150ea95615d3c6f8604eda6"}
{"@timestamp":"2025-05-15T16:00:39.212+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"1.7ms","level":"info","span":"2a9ea88cbf2343db","trace":"a119a42f8129c7f935c82daa0b89f7ff"}
{"@timestamp":"2025-05-15T16:00:39.214+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`create_time`,`update_time`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.0ms","level":"info","span":"cb367d9eb6a68eb6","trace":"a119a42f8129c7f935c82daa0b89f7ff"}
{"@timestamp":"2025-05-15T16:00:39.214+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:54849 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"2.8ms","level":"info","span":"be78d60e78fdd82e","trace":"a119a42f8129c7f935c82daa0b89f7ff"}
{"@timestamp":"2025-05-15T16:00:40.139+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"1.6ms","level":"info","span":"1c9cb665259b8ef6","trace":"3e41026c00888fcf90c095ef0b078e00"}
{"@timestamp":"2025-05-15T16:00:40.140+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/user/info - [::1]:54876 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"3.7ms","level":"info","span":"1ad1f1c7a0386ccd","trace":"3e41026c00888fcf90c095ef0b078e00"}
{"@timestamp":"2025-05-15T16:00:40.169+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"1.6ms","level":"info","span":"de17cec7f33e8d2a","trace":"916ffe03befbf0dd1487cf7f1a8d49a6"}
{"@timestamp":"2025-05-15T16:00:40.171+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`role_id`,`menu_id` FROM `admin_role_menu` WHERE role_id IN (1) AND del_state = 0 ORDER BY id DESC","duration":"1.0ms","level":"info","span":"da4cc9cad02ff3ee","trace":"916ffe03befbf0dd1487cf7f1a8d49a6"}
{"@timestamp":"2025-05-15T16:00:40.174+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`pid`,`name`,`path`,`component`,`redirect`,`meta`,`status`,`type`,`sort` FROM `admin_menu` WHERE id IN (19,18,17,16,15,14,13,12,11,10,6,3,2,1) AND del_state = 0 ORDER BY sort ASC","duration":"1.5ms","level":"info","span":"a22c825d3c1fbdd9","trace":"916ffe03befbf0dd1487cf7f1a8d49a6"}
{"@timestamp":"2025-05-15T16:00:40.174+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/menu/all - [::1]:54877 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"5.8ms","level":"info","span":"f44a9cb6382ecb84","trace":"916ffe03befbf0dd1487cf7f1a8d49a6"}
{"@timestamp":"2025-05-15T16:00:40.539+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"1.4ms","level":"info","span":"b69e2b20bdfa2c96","trace":"cd338799084e109de154548d7c269998"}
{"@timestamp":"2025-05-15T16:00:40.541+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`create_time`,`update_time`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.6ms","level":"info","span":"65aef82cad642afb","trace":"cd338799084e109de154548d7c269998"}
{"@timestamp":"2025-05-15T16:00:40.541+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:54880 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"2.9ms","level":"info","span":"e42e58413d519242","trace":"cd338799084e109de154548d7c269998"}
{"@timestamp":"2025-05-15T16:01:12.980+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"3.3ms","level":"info","span":"4641df82cb3d0589","trace":"330ae1115c22b9626128aba0950f5628"}
{"@timestamp":"2025-05-15T16:01:12.981+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`create_time`,`update_time`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.0ms","level":"info","span":"f86023f1704d7400","trace":"330ae1115c22b9626128aba0950f5628"}
{"@timestamp":"2025-05-15T16:01:12.981+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:54981 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"4.8ms","level":"info","span":"43d6b17f4acf519e","trace":"330ae1115c22b9626128aba0950f5628"}
{"@timestamp":"2025-05-15T16:03:01.329+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"3.2ms","level":"info","span":"37de58686f8c39bd","trace":"1ec71391e6e8ebac58db7bcd71bad8de"}
{"@timestamp":"2025-05-15T16:03:01.330+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`create_time`,`update_time`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.0ms","level":"info","span":"0df9fb9d1b0c83a1","trace":"1ec71391e6e8ebac58db7bcd71bad8de"}
{"@timestamp":"2025-05-15T16:03:01.330+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:56208 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"4.2ms","level":"info","span":"124209c1bccaf156","trace":"1ec71391e6e8ebac58db7bcd71bad8de"}
{"@timestamp":"2025-05-15T16:03:06.384+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"1.7ms","level":"info","span":"dedce9c645ff8928","trace":"5099e916e705e83105da78a97a6d47c5"}
{"@timestamp":"2025-05-15T16:03:06.385+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`create_time`,`update_time`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.0ms","level":"info","span":"ce1d3edf456c02a8","trace":"5099e916e705e83105da78a97a6d47c5"}
{"@timestamp":"2025-05-15T16:03:06.385+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:56271 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"2.7ms","level":"info","span":"95f029018dd77644","trace":"5099e916e705e83105da78a97a6d47c5"}
{"@timestamp":"2025-05-15T16:03:11.800+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"2.5ms","level":"info","span":"1805a5d4a94e38db","trace":"3c2da3ca1198b39185eae978b15bb2e0"}
{"@timestamp":"2025-05-15T16:03:11.802+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`create_time`,`update_time`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.6ms","level":"info","span":"1b100cd18c6b7da9","trace":"3c2da3ca1198b39185eae978b15bb2e0"}
{"@timestamp":"2025-05-15T16:03:11.802+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:56295 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"4.7ms","level":"info","span":"3e24035bfe2ff274","trace":"3c2da3ca1198b39185eae978b15bb2e0"}
{"@timestamp":"2025-05-15T16:03:14.519+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"2.7ms","level":"info","span":"53fbd76e17e6ecf3","trace":"1501e547d9e7ca05174847bcce9354da"}
{"@timestamp":"2025-05-15T16:03:14.520+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/user/info - [::1]:56303 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"5.0ms","level":"info","span":"0a34f6b7afb4fb03","trace":"1501e547d9e7ca05174847bcce9354da"}
{"@timestamp":"2025-05-15T16:03:14.566+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"2.0ms","level":"info","span":"650b02fd71b8aa3a","trace":"1cbbc504bc854f39cc11107854d6618d"}
{"@timestamp":"2025-05-15T16:03:14.568+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`role_id`,`menu_id` FROM `admin_role_menu` WHERE role_id IN (1) AND del_state = 0 ORDER BY id DESC","duration":"1.6ms","level":"info","span":"c9a35d05e8607a72","trace":"1cbbc504bc854f39cc11107854d6618d"}
{"@timestamp":"2025-05-15T16:03:14.571+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`pid`,`name`,`path`,`component`,`redirect`,`meta`,`status`,`type`,`sort` FROM `admin_menu` WHERE id IN (19,18,17,16,15,14,13,12,11,10,6,3,2,1) AND del_state = 0 ORDER BY sort ASC","duration":"2.1ms","level":"info","span":"6f1ccf610aee79bd","trace":"1cbbc504bc854f39cc11107854d6618d"}
{"@timestamp":"2025-05-15T16:03:14.571+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/menu/all - [::1]:56304 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"6.7ms","level":"info","span":"4de262c77eeb3b65","trace":"1cbbc504bc854f39cc11107854d6618d"}
{"@timestamp":"2025-05-15T16:03:15.096+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"1.6ms","level":"info","span":"7e651a476d5d5928","trace":"ecf713d4addaf89168cc7230a81479be"}
{"@timestamp":"2025-05-15T16:03:15.098+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`create_time`,`update_time`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.6ms","level":"info","span":"13c53cc5cfa62a36","trace":"ecf713d4addaf89168cc7230a81479be"}
{"@timestamp":"2025-05-15T16:03:15.099+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:56307 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"4.2ms","level":"info","span":"0f623304cdbc456d","trace":"ecf713d4addaf89168cc7230a81479be"}
{"@timestamp":"2025-05-15T16:03:48.053+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"1.4ms","level":"info","span":"e826107623f9de42","trace":"79cb88479c1c01603e8817888beb588f"}
{"@timestamp":"2025-05-15T16:03:48.054+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`create_time`,`update_time`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.1ms","level":"info","span":"b9df25e609c9a027","trace":"79cb88479c1c01603e8817888beb588f"}
{"@timestamp":"2025-05-15T16:03:48.054+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:56495 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"2.5ms","level":"info","span":"7bad0dc38480f107","trace":"79cb88479c1c01603e8817888beb588f"}
{"@timestamp":"2025-05-15T16:03:56.076+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"1.4ms","level":"info","span":"d2c8076e17e0c676","trace":"debffd548d7c125843c2d1045899d877"}
{"@timestamp":"2025-05-15T16:03:56.077+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`create_time`,`update_time`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.1ms","level":"info","span":"3b5cc2c2e0710886","trace":"debffd548d7c125843c2d1045899d877"}
{"@timestamp":"2025-05-15T16:03:56.078+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:56588 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"3.0ms","level":"info","span":"eac42231c9271c75","trace":"debffd548d7c125843c2d1045899d877"}
{"@timestamp":"2025-05-15T16:05:28.917+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"5.2ms","level":"info","span":"6aad97b0490a605a","trace":"88fa0882429fbcd1bf12e1f81e5b63ca"}
{"@timestamp":"2025-05-15T16:05:28.918+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/user/info - [::1]:57168 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"10.0ms","level":"info","span":"b077c2a8682a18e2","trace":"88fa0882429fbcd1bf12e1f81e5b63ca"}
{"@timestamp":"2025-05-15T16:05:28.956+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"2.1ms","level":"info","span":"12e07b4ce5937cb7","trace":"54980d6fbeafa0a0e9b71a7234f0d7e2"}
{"@timestamp":"2025-05-15T16:05:28.957+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`role_id`,`menu_id` FROM `admin_role_menu` WHERE role_id IN (1) AND del_state = 0 ORDER BY id DESC","duration":"1.6ms","level":"info","span":"99838a8ff8e4abd5","trace":"54980d6fbeafa0a0e9b71a7234f0d7e2"}
{"@timestamp":"2025-05-15T16:05:28.959+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`pid`,`name`,`path`,`component`,`redirect`,`meta`,`status`,`type`,`sort` FROM `admin_menu` WHERE id IN (19,18,17,16,15,14,13,12,11,10,6,3,2,1) AND del_state = 0 ORDER BY sort ASC","duration":"2.1ms","level":"info","span":"cb4ca6cf07a89624","trace":"54980d6fbeafa0a0e9b71a7234f0d7e2"}
{"@timestamp":"2025-05-15T16:05:28.960+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/menu/all - [::1]:57170 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"6.8ms","level":"info","span":"7fd2fc365ee7ec66","trace":"54980d6fbeafa0a0e9b71a7234f0d7e2"}
{"@timestamp":"2025-05-15T16:05:29.462+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"1.6ms","level":"info","span":"214584c8fc6e3441","trace":"7a6f591be540ccca9998056e016eae3c"}
{"@timestamp":"2025-05-15T16:05:29.463+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`create_time`,`update_time`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.0ms","level":"info","span":"58ecbd57611ba8cc","trace":"7a6f591be540ccca9998056e016eae3c"}
{"@timestamp":"2025-05-15T16:05:29.463+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:57174 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"3.2ms","level":"info","span":"b4d34d3edef7fc2a","trace":"7a6f591be540ccca9998056e016eae3c"}
{"@timestamp":"2025-05-15T16:05:54.999+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"1.1ms","level":"info","span":"ecdd8e485bdd8788","trace":"66f2e2ba79aca8110be6d61e13f6e2af"}
{"@timestamp":"2025-05-15T16:05:55.000+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`create_time`,`update_time`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.0ms","level":"info","span":"8b031b8468a1f2e8","trace":"66f2e2ba79aca8110be6d61e13f6e2af"}
{"@timestamp":"2025-05-15T16:05:55.000+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:57312 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"2.6ms","level":"info","span":"4e355dccaf2389d2","trace":"66f2e2ba79aca8110be6d61e13f6e2af"}
{"@timestamp":"2025-05-15T16:06:34.330+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `admin_user` WHERE del_state = 0 AND del_state = 0","duration":"3.7ms","level":"info","span":"4d4551e25fe65b11","trace":"49c59fd555c3706476a13852fa90e0c6"}
{"@timestamp":"2025-05-15T16:06:34.330+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`username`,`password`,`real_name`,`status` FROM `admin_user` WHERE del_state = 0 AND del_state = 0 ORDER BY id DESC, id DESC LIMIT 20 OFFSET 0","duration":"4.2ms","level":"info","span":"f63f93130b52220f","trace":"49c59fd555c3706476a13852fa90e0c6"}
{"@timestamp":"2025-05-15T16:06:34.333+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 2 AND del_state = 0 ORDER BY id ASC","duration":"1.7ms","level":"info","span":"baf43504b0f117de","trace":"49c59fd555c3706476a13852fa90e0c6"}
{"@timestamp":"2025-05-15T16:06:34.333+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY id ASC","duration":"1.7ms","level":"info","span":"7c0a2851fb168653","trace":"49c59fd555c3706476a13852fa90e0c6"}
{"@timestamp":"2025-05-15T16:06:34.342+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/user/list?page=1&pageSize=20 - [::1]:57467 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"24.3ms","level":"info","span":"2043a882a5cc3e1a","trace":"49c59fd555c3706476a13852fa90e0c6"}
{"@timestamp":"2025-05-15T16:08:17.456+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`order_no`,`user_id`,`product_id`,`payment_platform`,`payment_scene`,`platform_order_id`,`amount`,`status`,`del_state`,`version`,`create_time`,`update_time`,`pay_time`,`refund_time`,`close_time`,`delete_time` FROM `order` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"5.4ms","level":"info","span":"cc60b7e851b1636d","trace":"7e7c2d332d3504bd33c531f21b06f797"}
{"@timestamp":"2025-05-15T16:08:17.457+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `order` WHERE del_state = 0","duration":"5.9ms","level":"info","span":"a1885afa7c45d34c","trace":"7e7c2d332d3504bd33c531f21b06f797"}
{"@timestamp":"2025-05-15T16:08:17.483+08:00","caller":"sqlx/stmt.go:274","content":"sql query: select `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`link_id`,`order_id`,`user_id`,`admin_user_id` from `admin_promotion_order` where `order_id` = 2357 and del_state = 0 limit 1","duration":"17.4ms","level":"info","span":"b6967fc9bdd77ab8","trace":"7e7c2d332d3504bd33c531f21b06f797"}
{"@timestamp":"2025-05-15T16:08:17.488+08:00","caller":"sqlx/stmt.go:274","content":"sql query: select `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`link_id`,`order_id`,`user_id`,`admin_user_id` from `admin_promotion_order` where `order_id` = 2356 and del_state = 0 limit 1","duration":"2.1ms","level":"info","span":"bf2df7f568d20a64","trace":"7e7c2d332d3504bd33c531f21b06f797"}
{"@timestamp":"2025-05-15T16:08:17.490+08:00","caller":"sqlx/stmt.go:274","content":"sql query: select `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`link_id`,`order_id`,`user_id`,`admin_user_id` from `admin_promotion_order` where `order_id` = 2355 and del_state = 0 limit 1","duration":"0.5ms","level":"info","span":"b36d851874327b32","trace":"7e7c2d332d3504bd33c531f21b06f797"}
{"@timestamp":"2025-05-15T16:08:17.494+08:00","caller":"sqlx/stmt.go:274","content":"sql query: select `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`link_id`,`order_id`,`user_id`,`admin_user_id` from `admin_promotion_order` where `order_id` = 2354 and del_state = 0 limit 1","duration":"2.1ms","level":"info","span":"332fd68bd3a5edac","trace":"7e7c2d332d3504bd33c531f21b06f797"}
{"@timestamp":"2025-05-15T16:08:17.496+08:00","caller":"sqlx/stmt.go:274","content":"sql query: select `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`link_id`,`order_id`,`user_id`,`admin_user_id` from `admin_promotion_order` where `order_id` = 2353 and del_state = 0 limit 1","duration":"1.0ms","level":"info","span":"fee9f794d147cc21","trace":"7e7c2d332d3504bd33c531f21b06f797"}
{"@timestamp":"2025-05-15T16:08:17.499+08:00","caller":"sqlx/stmt.go:274","content":"sql query: select `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`link_id`,`order_id`,`user_id`,`admin_user_id` from `admin_promotion_order` where `order_id` = 2352 and del_state = 0 limit 1","duration":"1.6ms","level":"info","span":"7dcc998b4810c65a","trace":"7e7c2d332d3504bd33c531f21b06f797"}
{"@timestamp":"2025-05-15T16:08:17.502+08:00","caller":"sqlx/stmt.go:274","content":"sql query: select `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`link_id`,`order_id`,`user_id`,`admin_user_id` from `admin_promotion_order` where `order_id` = 2351 and del_state = 0 limit 1","duration":"1.6ms","level":"info","span":"4c0ff2bc27ae2675","trace":"7e7c2d332d3504bd33c531f21b06f797"}
{"@timestamp":"2025-05-15T16:08:17.505+08:00","caller":"sqlx/stmt.go:274","content":"sql query: select `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`link_id`,`order_id`,`user_id`,`admin_user_id` from `admin_promotion_order` where `order_id` = 2350 and del_state = 0 limit 1","duration":"1.6ms","level":"info","span":"bc0fab08aae84e0a","trace":"7e7c2d332d3504bd33c531f21b06f797"}
{"@timestamp":"2025-05-15T16:08:17.507+08:00","caller":"sqlx/stmt.go:274","content":"sql query: select `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`link_id`,`order_id`,`user_id`,`admin_user_id` from `admin_promotion_order` where `order_id` = 2349 and del_state = 0 limit 1","duration":"1.0ms","level":"info","span":"7781e93d8e32f131","trace":"7e7c2d332d3504bd33c531f21b06f797"}
{"@timestamp":"2025-05-15T16:08:17.510+08:00","caller":"sqlx/stmt.go:274","content":"sql query: select `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`link_id`,`order_id`,`user_id`,`admin_user_id` from `admin_promotion_order` where `order_id` = 2348 and del_state = 0 limit 1","duration":"1.6ms","level":"info","span":"68b583b893685496","trace":"7e7c2d332d3504bd33c531f21b06f797"}
{"@timestamp":"2025-05-15T16:08:17.513+08:00","caller":"sqlx/stmt.go:274","content":"sql query: select `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`link_id`,`order_id`,`user_id`,`admin_user_id` from `admin_promotion_order` where `order_id` = 2347 and del_state = 0 limit 1","duration":"1.1ms","level":"info","span":"f906c6eb15f7f94a","trace":"7e7c2d332d3504bd33c531f21b06f797"}
{"@timestamp":"2025-05-15T16:08:17.515+08:00","caller":"sqlx/stmt.go:274","content":"sql query: select `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`link_id`,`order_id`,`user_id`,`admin_user_id` from `admin_promotion_order` where `order_id` = 2346 and del_state = 0 limit 1","duration":"1.0ms","level":"info","span":"ba049bdcbf30404f","trace":"7e7c2d332d3504bd33c531f21b06f797"}
{"@timestamp":"2025-05-15T16:08:17.517+08:00","caller":"sqlx/stmt.go:274","content":"sql query: select `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`link_id`,`order_id`,`user_id`,`admin_user_id` from `admin_promotion_order` where `order_id` = 2345 and del_state = 0 limit 1","duration":"1.6ms","level":"info","span":"7030653ff2578ba3","trace":"7e7c2d332d3504bd33c531f21b06f797"}
{"@timestamp":"2025-05-15T16:08:17.520+08:00","caller":"sqlx/stmt.go:274","content":"sql query: select `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`link_id`,`order_id`,`user_id`,`admin_user_id` from `admin_promotion_order` where `order_id` = 2344 and del_state = 0 limit 1","duration":"1.0ms","level":"info","span":"70f94459c8eb1673","trace":"7e7c2d332d3504bd33c531f21b06f797"}
{"@timestamp":"2025-05-15T16:08:17.522+08:00","caller":"sqlx/stmt.go:274","content":"sql query: select `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`link_id`,`order_id`,`user_id`,`admin_user_id` from `admin_promotion_order` where `order_id` = 2343 and del_state = 0 limit 1","duration":"1.0ms","level":"info","span":"7397f52483e4d4db","trace":"7e7c2d332d3504bd33c531f21b06f797"}
{"@timestamp":"2025-05-15T16:08:17.525+08:00","caller":"sqlx/stmt.go:274","content":"sql query: select `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`link_id`,`order_id`,`user_id`,`admin_user_id` from `admin_promotion_order` where `order_id` = 2342 and del_state = 0 limit 1","duration":"1.6ms","level":"info","span":"5e50d3d642181a5a","trace":"7e7c2d332d3504bd33c531f21b06f797"}
{"@timestamp":"2025-05-15T16:08:17.529+08:00","caller":"sqlx/stmt.go:274","content":"sql query: select `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`link_id`,`order_id`,`user_id`,`admin_user_id` from `admin_promotion_order` where `order_id` = 2341 and del_state = 0 limit 1","duration":"2.1ms","level":"info","span":"35ea82dadc32cd5f","trace":"7e7c2d332d3504bd33c531f21b06f797"}
{"@timestamp":"2025-05-15T16:08:17.531+08:00","caller":"sqlx/stmt.go:274","content":"sql query: select `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`link_id`,`order_id`,`user_id`,`admin_user_id` from `admin_promotion_order` where `order_id` = 2340 and del_state = 0 limit 1","duration":"1.0ms","level":"info","span":"efb98bc214655ddf","trace":"7e7c2d332d3504bd33c531f21b06f797"}
{"@timestamp":"2025-05-15T16:08:17.535+08:00","caller":"sqlx/stmt.go:274","content":"sql query: select `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`link_id`,`order_id`,`user_id`,`admin_user_id` from `admin_promotion_order` where `order_id` = 2339 and del_state = 0 limit 1","duration":"2.0ms","level":"info","span":"d2199a0d1e7d7e4c","trace":"7e7c2d332d3504bd33c531f21b06f797"}
{"@timestamp":"2025-05-15T16:08:17.538+08:00","caller":"sqlx/stmt.go:274","content":"sql query: select `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`link_id`,`order_id`,`user_id`,`admin_user_id` from `admin_promotion_order` where `order_id` = 2338 and del_state = 0 limit 1","duration":"1.0ms","level":"info","span":"50c8581c03d3afb2","trace":"7e7c2d332d3504bd33c531f21b06f797"}
{"@timestamp":"2025-05-15T16:08:17.539+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/order/list?page=1&pageSize=20 - [::1]:58197 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"91.1ms","level":"info","span":"7051d606d787f004","trace":"7e7c2d332d3504bd33c531f21b06f797"}
{"@timestamp":"2025-05-15T16:08:18.983+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"1.5ms","level":"info","span":"9e64ee31225556b3","trace":"a4b54f23f377d8dfd7ebdd500b4c6c38"}
{"@timestamp":"2025-05-15T16:08:18.984+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`create_time`,`update_time`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.0ms","level":"info","span":"e006bd1f57e3c15b","trace":"a4b54f23f377d8dfd7ebdd500b4c6c38"}
{"@timestamp":"2025-05-15T16:08:18.984+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:58219 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"2.6ms","level":"info","span":"53cdcff76bdfacaf","trace":"a4b54f23f377d8dfd7ebdd500b4c6c38"}
{"@timestamp":"2025-05-15T16:08:19.345+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `user` WHERE del_state = 0","duration":"3.3ms","level":"info","span":"6c3e71b00d0431a6","trace":"2425d912f7720cd31ce01332ae95e0fd"}
{"@timestamp":"2025-05-15T16:08:19.346+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`mobile`,`password`,`nickname`,`info`,`inside` FROM `user` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.0ms","level":"info","span":"6350ad8ada1febd3","trace":"2425d912f7720cd31ce01332ae95e0fd"}
{"@timestamp":"2025-05-15T16:08:19.347+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/platform_user/list?page=1&pageSize=20 - [::1]:58222 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"6.5ms","level":"info","span":"d4858334d494aa30","trace":"2425d912f7720cd31ce01332ae95e0fd"}
{"@timestamp":"2025-05-15T16:08:19.827+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"1.6ms","level":"info","span":"45db096f6544f0ba","trace":"b3d6f4eaa5d3e536299cf2f2d42cfe44"}
{"@timestamp":"2025-05-15T16:08:19.828+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`create_time`,`update_time`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.1ms","level":"info","span":"fa7116818269c1cb","trace":"b3d6f4eaa5d3e536299cf2f2d42cfe44"}
{"@timestamp":"2025-05-15T16:08:19.828+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:58223 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"2.6ms","level":"info","span":"e1a2d3d4cf15ad44","trace":"b3d6f4eaa5d3e536299cf2f2d42cfe44"}
{"@timestamp":"2025-05-15T16:08:26.016+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"1.6ms","level":"info","span":"cd86d32470373935","trace":"29551173f42c358eb8bd7be1413fb685"}
{"@timestamp":"2025-05-15T16:08:26.017+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`create_time`,`update_time`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.6ms","level":"info","span":"fdfa8ec7afe283fb","trace":"29551173f42c358eb8bd7be1413fb685"}
{"@timestamp":"2025-05-15T16:08:26.017+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:58233 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"3.2ms","level":"info","span":"1c2d46079ff9e390","trace":"29551173f42c358eb8bd7be1413fb685"}
{"@timestamp":"2025-05-15T16:08:47.951+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"2.1ms","level":"info","span":"8cad625c659e7e66","trace":"65bf359d33253d552dc74197fb71a0e3"}
{"@timestamp":"2025-05-15T16:08:47.952+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`create_time`,`update_time`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.6ms","level":"info","span":"d2d40da04bc00dd4","trace":"65bf359d33253d552dc74197fb71a0e3"}
{"@timestamp":"2025-05-15T16:08:47.952+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:58341 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"3.7ms","level":"info","span":"68dc57de0f3f13ac","trace":"65bf359d33253d552dc74197fb71a0e3"}
{"@timestamp":"2025-05-15T16:12:10.412+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"5.1ms","level":"info","span":"e4abcf04e957fae0","trace":"3037602403968c67d085d86e4b8b814a"}
{"@timestamp":"2025-05-15T16:12:10.414+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`create_time`,`update_time`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.6ms","level":"info","span":"f81800691775e862","trace":"3037602403968c67d085d86e4b8b814a"}
{"@timestamp":"2025-05-15T16:12:10.414+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:59586 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"7.3ms","level":"info","span":"ec4cc4e440a2c013","trace":"3037602403968c67d085d86e4b8b814a"}
{"@timestamp":"2025-05-15T16:12:30.913+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"2.1ms","level":"info","span":"5043e35c87acbee4","trace":"5274749c8f58f5e32b652458b0462cbc"}
{"@timestamp":"2025-05-15T16:12:30.914+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/user/info - [::1]:59777 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"3.7ms","level":"info","span":"48f9fbd795fcf6dc","trace":"5274749c8f58f5e32b652458b0462cbc"}
{"@timestamp":"2025-05-15T16:12:30.952+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"2.2ms","level":"info","span":"3813d21c8dd8b21b","trace":"6caa17041d4938d45eee2bdb158fc103"}
{"@timestamp":"2025-05-15T16:12:30.955+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`role_id`,`menu_id` FROM `admin_role_menu` WHERE role_id IN (1) AND del_state = 0 ORDER BY id DESC","duration":"2.1ms","level":"info","span":"60c128a9c90ab7e0","trace":"6caa17041d4938d45eee2bdb158fc103"}
{"@timestamp":"2025-05-15T16:12:30.957+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`pid`,`name`,`path`,`component`,`redirect`,`meta`,`status`,`type`,`sort` FROM `admin_menu` WHERE id IN (19,18,17,16,15,14,13,12,11,10,6,3,2,1) AND del_state = 0 ORDER BY sort ASC","duration":"2.1ms","level":"info","span":"7515956b8d1752a0","trace":"6caa17041d4938d45eee2bdb158fc103"}
{"@timestamp":"2025-05-15T16:12:30.957+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/menu/all - [::1]:59778 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"7.6ms","level":"info","span":"45b7c3e05167b77c","trace":"6caa17041d4938d45eee2bdb158fc103"}
{"@timestamp":"2025-05-15T16:12:31.436+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"1.1ms","level":"info","span":"625395de6d84c0eb","trace":"6e27561ad6cf96e2e532fe5c8357bff2"}
{"@timestamp":"2025-05-15T16:12:31.438+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`create_time`,`update_time`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.6ms","level":"info","span":"a08d079e66e5c207","trace":"6e27561ad6cf96e2e532fe5c8357bff2"}
{"@timestamp":"2025-05-15T16:12:31.438+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:59781 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"3.8ms","level":"info","span":"a3d3d370be67c298","trace":"6e27561ad6cf96e2e532fe5c8357bff2"}
{"@timestamp":"2025-05-15T16:13:19.953+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"3.2ms","level":"info","span":"c827bcd53bc0bea6","trace":"f08d30a9eea935cc690ada9dfd640570"}
{"@timestamp":"2025-05-15T16:13:19.954+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`create_time`,`update_time`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.5ms","level":"info","span":"650e5baec41d9c95","trace":"f08d30a9eea935cc690ada9dfd640570"}
{"@timestamp":"2025-05-15T16:13:19.954+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:60136 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"4.8ms","level":"info","span":"59b0f05f8b8427fd","trace":"f08d30a9eea935cc690ada9dfd640570"}
{"@timestamp":"2025-05-15T16:13:57.722+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"2.1ms","level":"info","span":"cc194629768021fc","trace":"5091388764b4388d3dddd014000f9587"}
{"@timestamp":"2025-05-15T16:13:57.723+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/user/info - [::1]:60861 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"4.4ms","level":"info","span":"defb5a86fb9f3ebf","trace":"5091388764b4388d3dddd014000f9587"}
{"@timestamp":"2025-05-15T16:13:57.758+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"2.4ms","level":"info","span":"2fe1621e39b0560c","trace":"8a45bebeaff8eda8b0748384ff6c03a8"}
{"@timestamp":"2025-05-15T16:13:57.760+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`role_id`,`menu_id` FROM `admin_role_menu` WHERE role_id IN (1) AND del_state = 0 ORDER BY id DESC","duration":"2.2ms","level":"info","span":"0a43e32d23906dd6","trace":"8a45bebeaff8eda8b0748384ff6c03a8"}
{"@timestamp":"2025-05-15T16:13:57.762+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`pid`,`name`,`path`,`component`,`redirect`,`meta`,`status`,`type`,`sort` FROM `admin_menu` WHERE id IN (19,18,17,16,15,14,13,12,11,10,6,3,2,1) AND del_state = 0 ORDER BY sort ASC","duration":"1.6ms","level":"info","span":"626a5cf6d48ce53c","trace":"8a45bebeaff8eda8b0748384ff6c03a8"}
{"@timestamp":"2025-05-15T16:13:57.763+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/menu/all - [::1]:60862 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"6.7ms","level":"info","span":"133465a927cd3b8f","trace":"8a45bebeaff8eda8b0748384ff6c03a8"}
{"@timestamp":"2025-05-15T16:13:58.309+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"1.5ms","level":"info","span":"2a550eb9f1d7cf9f","trace":"e04d07516e69c70297eaa310abd5d3f2"}
{"@timestamp":"2025-05-15T16:13:58.310+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`create_time`,`update_time`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.6ms","level":"info","span":"5e2aafe5ac9263aa","trace":"e04d07516e69c70297eaa310abd5d3f2"}
{"@timestamp":"2025-05-15T16:13:58.310+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:60865 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"3.1ms","level":"info","span":"e6d8decf5585eef6","trace":"e04d07516e69c70297eaa310abd5d3f2"}
{"@timestamp":"2025-05-15T16:16:36.208+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"5.3ms","level":"info","span":"6e6522599db2cae2","trace":"67eee62ad7cd9c25d3bb7801fa9008c2"}
{"@timestamp":"2025-05-15T16:16:36.209+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/user/info - [::1]:61376 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"7.6ms","level":"info","span":"d6e4687002d4e145","trace":"67eee62ad7cd9c25d3bb7801fa9008c2"}
{"@timestamp":"2025-05-15T16:16:36.252+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`user_id`,`role_id` FROM `admin_user_role` WHERE user_id = 1 AND del_state = 0 ORDER BY role_id DESC","duration":"2.1ms","level":"info","span":"12c1514fc576acb4","trace":"b9d99590e1a5ceca1bf866d681ceb1c9"}
{"@timestamp":"2025-05-15T16:16:36.254+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`role_id`,`menu_id` FROM `admin_role_menu` WHERE role_id IN (1) AND del_state = 0 ORDER BY id DESC","duration":"1.0ms","level":"info","span":"188320d397d4262a","trace":"b9d99590e1a5ceca1bf866d681ceb1c9"}
{"@timestamp":"2025-05-15T16:16:36.256+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`create_time`,`update_time`,`delete_time`,`del_state`,`version`,`pid`,`name`,`path`,`component`,`redirect`,`meta`,`status`,`type`,`sort` FROM `admin_menu` WHERE id IN (19,18,17,16,15,14,13,12,11,10,6,3,2,1) AND del_state = 0 ORDER BY sort ASC","duration":"1.6ms","level":"info","span":"a510fa7802e42400","trace":"b9d99590e1a5ceca1bf866d681ceb1c9"}
{"@timestamp":"2025-05-15T16:16:36.257+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/menu/all - [::1]:61378 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"6.8ms","level":"info","span":"6932d9a937e81f75","trace":"b9d99590e1a5ceca1bf866d681ceb1c9"}
{"@timestamp":"2025-05-15T16:16:36.808+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT COUNT(id) FROM `global_notifications` WHERE del_state = 0","duration":"1.6ms","level":"info","span":"4dc27a167e125e7a","trace":"e29f0797983d2a4353fdeb6d9fc0c9ed"}
{"@timestamp":"2025-05-15T16:16:36.811+08:00","caller":"sqlx/stmt.go:274","content":"sql query: SELECT `id`,`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`create_time`,`update_time`,`status`,`del_state`,`version`,`delete_time` FROM `global_notifications` WHERE del_state = 0 ORDER BY id DESC LIMIT 20 OFFSET 0","duration":"1.6ms","level":"info","span":"22ac5061e0e92271","trace":"e29f0797983d2a4353fdeb6d9fc0c9ed"}
{"@timestamp":"2025-05-15T16:16:36.811+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /api/v1/admin/notification/list?page=1&pageSize=20 - [::1]:61381 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","duration":"3.6ms","level":"info","span":"09f844e5e505a313","trace":"e29f0797983d2a4353fdeb6d9fc0c9ed"}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,32 @@
{"@timestamp":"2025-05-13T14:31:55.084+08:00","caller":"result/httpResult.go:40","content":"【API-ERR】 : ErrCode:100001ErrMsg:服务器开小差啦,稍后再来试一试\nAdminRefundOrder, 退款失败 err: 支付宝退款申请失败: 申请支付宝退款失败: 交易不存在\ntyc-server/app/main/api/internal/logic/admin_order.(*AdminRefundOrderLogic).AdminRefundOrder\n\tD:/Code/tyc-server/app/main/api/internal/logic/admin_order/adminrefundorderlogic.go:52\ntyc-server/app/main/api/internal/handler/admin_order.AdminRefundOrderHandler.func1\n\tD:/Code/tyc-server/app/main/api/internal/handler/admin_order/adminrefundorderhandler.go:26\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ntyc-server/app/main/api/internal/middleware/global.ReqHeaderCtxMiddleware.func1\n\tD:/Code/tyc-server/app/main/api/internal/middleware/global/reqHeaderCtxMiddleware.go:24\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.Authorize.func1.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/authhandler.go:81\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.GunzipHandler.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/gunziphandler.go:26\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.MaxBytesHandler.func2.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/maxbyteshandler.go:24\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.MetricHandler.func1.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/metrichandler.go:21\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.RecoverHandler.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/recoverhandler.go:21\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.(*timeoutHandler).ServeHTTP.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/timeouthandler.go:86\nruntime.goexit\n\tD:/Go/src/runtime/asm_amd64.s:1700 ","level":"error","span":"9a72009ad3e58f79","trace":"8b13d8216f560059f537fdc6220acfaa"}
{"@timestamp":"2025-05-13T14:34:08.712+08:00","caller":"result/httpResult.go:40","content":"【API-ERR】 : ErrCode:100001ErrMsg:服务器开小差啦,稍后再来试一试\nAdminRefundOrder, 退款失败 err: 支付宝退款申请失败: 申请支付宝退款失败: 交易不存在\ntyc-server/app/main/api/internal/logic/admin_order.(*AdminRefundOrderLogic).AdminRefundOrder\n\tD:/Code/tyc-server/app/main/api/internal/logic/admin_order/adminrefundorderlogic.go:52\ntyc-server/app/main/api/internal/handler/admin_order.AdminRefundOrderHandler.func1\n\tD:/Code/tyc-server/app/main/api/internal/handler/admin_order/adminrefundorderhandler.go:26\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ntyc-server/app/main/api/internal/middleware/global.ReqHeaderCtxMiddleware.func1\n\tD:/Code/tyc-server/app/main/api/internal/middleware/global/reqHeaderCtxMiddleware.go:24\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.Authorize.func1.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/authhandler.go:81\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.GunzipHandler.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/gunziphandler.go:26\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.MaxBytesHandler.func2.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/maxbyteshandler.go:24\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.MetricHandler.func1.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/metrichandler.go:21\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.RecoverHandler.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/recoverhandler.go:21\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.(*timeoutHandler).ServeHTTP.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/timeouthandler.go:86\nruntime.goexit\n\tD:/Go/src/runtime/asm_amd64.s:1700 ","level":"error","span":"391e7f42b7a93512","trace":"729f4d10c6e8e7a9c6f4d8b66926dbf4"}
{"@timestamp":"2025-05-13T14:44:55.104+08:00","caller":"sqlx/utils.go:147","content":"stmt: insert into `order_refund` (`refund_no`,`order_id`,`user_id`,`product_id`,`platform_refund_id`,`refund_amount`,`refund_reason`,`status`,`del_state`,`version`,`refund_time`,`close_time`,`delete_time`) values ('REF_ALI_1747118693000005007826_1747118693000006946574', 71, 1, 26, {2025051122001432531452878279 true}, 0.01, {用户不满意要求退款 true}, 'success', 0, 0, {2025-05-13 14:44:55.0942351 +0800 CST m=+3511.628886201 true}, {0001-01-01 00:00:00 +0000 UTC false}, {0001-01-01 00:00:00 +0000 UTC false}), error: Error 1406 (22001): Data too long for column 'refund_no' at row 1","level":"error","span":"e152d57fbdb0ee1e","trace":"39dba17b09053137576465344d148d8c"}
{"@timestamp":"2025-05-13T14:44:55.105+08:00","caller":"result/httpResult.go:40","content":"【API-ERR】 : ErrCode:100001ErrMsg:服务器开小差啦,稍后再来试一试\nAdminRefundOrder, 退款失败 err: 创建退款记录失败: Error 1406 (22001): Data too long for column 'refund_no' at row 1\ntyc-server/app/main/api/internal/logic/admin_order.(*AdminRefundOrderLogic).AdminRefundOrder\n\tD:/Code/tyc-server/app/main/api/internal/logic/admin_order/adminrefundorderlogic.go:52\ntyc-server/app/main/api/internal/handler/admin_order.AdminRefundOrderHandler.func1\n\tD:/Code/tyc-server/app/main/api/internal/handler/admin_order/adminrefundorderhandler.go:26\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ntyc-server/app/main/api/internal/middleware/global.ReqHeaderCtxMiddleware.func1\n\tD:/Code/tyc-server/app/main/api/internal/middleware/global/reqHeaderCtxMiddleware.go:24\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.Authorize.func1.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/authhandler.go:81\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.GunzipHandler.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/gunziphandler.go:26\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.MaxBytesHandler.func2.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/maxbyteshandler.go:24\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.MetricHandler.func1.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/metrichandler.go:21\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.RecoverHandler.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/recoverhandler.go:21\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.(*timeoutHandler).ServeHTTP.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/timeouthandler.go:86\nruntime.goexit\n\tD:/Go/src/runtime/asm_amd64.s:1700 ","level":"error","span":"e2f43b44d0c7e18c","trace":"39dba17b09053137576465344d148d8c"}
{"@timestamp":"2025-05-13T14:48:32.908+08:00","caller":"sqlx/utils.go:147","content":"stmt: insert into `order_refund` (`refund_no`,`order_id`,`user_id`,`product_id`,`platform_refund_id`,`refund_amount`,`refund_reason`,`status`,`del_state`,`version`,`refund_time`,`close_time`,`delete_time`) values ('REF_ALI_1747118911000007eb05b5_17471189110000084cd63f', 72, 1, 26, {2025051222001432531454850724 true}, 0.01, {重复下单退款 true}, 'success', 0, 0, {2025-05-13 14:48:32.9070915 +0800 CST m=+3729.441742601 true}, {0001-01-01 00:00:00 +0000 UTC false}, {0001-01-01 00:00:00 +0000 UTC false}), error: Error 1406 (22001): Data too long for column 'refund_no' at row 1","level":"error","span":"63425cd2009c2e2a","trace":"6175ff3a33388b09d8f8ac904f3f8735"}
{"@timestamp":"2025-05-13T14:48:32.909+08:00","caller":"result/httpResult.go:40","content":"【API-ERR】 : ErrCode:100001ErrMsg:服务器开小差啦,稍后再来试一试\nAdminRefundOrder, 退款失败 err: 创建退款记录失败: Error 1406 (22001): Data too long for column 'refund_no' at row 1\ntyc-server/app/main/api/internal/logic/admin_order.(*AdminRefundOrderLogic).AdminRefundOrder\n\tD:/Code/tyc-server/app/main/api/internal/logic/admin_order/adminrefundorderlogic.go:52\ntyc-server/app/main/api/internal/handler/admin_order.AdminRefundOrderHandler.func1\n\tD:/Code/tyc-server/app/main/api/internal/handler/admin_order/adminrefundorderhandler.go:26\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ntyc-server/app/main/api/internal/middleware/global.ReqHeaderCtxMiddleware.func1\n\tD:/Code/tyc-server/app/main/api/internal/middleware/global/reqHeaderCtxMiddleware.go:24\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.Authorize.func1.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/authhandler.go:81\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.GunzipHandler.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/gunziphandler.go:26\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.MaxBytesHandler.func2.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/maxbyteshandler.go:24\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.MetricHandler.func1.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/metrichandler.go:21\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.RecoverHandler.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/recoverhandler.go:21\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.(*timeoutHandler).ServeHTTP.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/timeouthandler.go:86\nruntime.goexit\n\tD:/Go/src/runtime/asm_amd64.s:1700 ","level":"error","span":"8852637ff26e229c","trace":"6175ff3a33388b09d8f8ac904f3f8735"}
{"@timestamp":"2025-05-13T14:54:54.729+08:00","caller":"handler/loghandler.go:149","content":"[HTTP] 503 - POST /api/v1/admin/order/refund/73 - [::1]:65232 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36\nPOST /api/v1/admin/order/refund/73 HTTP/1.1\r\nHost: localhost:8888\r\nAccept: application/json, text/plain, */*\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nAccept-Language: zh-CN\r\nAuthorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NDkzOTExMTYsImlhdCI6MTc0Njc5OTExNiwidXNlcklkIjoxfQ.4gJXQZbU6_n6RLlX5l1S5Zk2dsRtFNGJ2CIrqmn4_dw\r\nConnection: close\r\nContent-Length: 59\r\nContent-Type: application/json;charset=UTF-8\r\nCookie: pma_lang=zh_CN; phpMyAdmin=b6eb658324c8a60061e566b86986d8f9\r\nOrigin: http://localhost:5666\r\nReferer: http://localhost:5666/order\r\nSec-Ch-Ua: \"Chromium\";v=\"136\", \"Google Chrome\";v=\"136\", \"Not.A/Brand\";v=\"99\"\r\nSec-Ch-Ua-Mobile: ?0\r\nSec-Ch-Ua-Platform: \"Windows\"\r\nSec-Fetch-Dest: empty\r\nSec-Fetch-Mode: cors\r\nSec-Fetch-Site: same-origin\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36\r\n\r\n{\"refund_amount\":0.01,\"refund_reason\":\"重复下单退款\"}","duration":"22225.1ms","level":"error","span":"56f994acf11f4947","trace":"ec66934967ca81a2c4f22b64f4f8daa8"}
{"@timestamp":"2025-05-13T23:39:56.028+08:00","caller":"result/httpResult.go:40","content":"【API-ERR】 : ErrCode:100001ErrMsg:服务器开小差啦,稍后再来试一试\n手机登录, 加密手机号失败: 手机号不能为空\ntyc-server/app/main/api/internal/logic/admin_platform_user.(*AdminGetPlatformUserListLogic).AdminGetPlatformUserList\n\tD:/Code/tyc-server/app/main/api/internal/logic/admin_platform_user/admingetplatformuserlistlogic.go:63\ntyc-server/app/main/api/internal/handler/admin_platform_user.AdminGetPlatformUserListHandler.func1\n\tD:/Code/tyc-server/app/main/api/internal/handler/admin_platform_user/admingetplatformuserlisthandler.go:26\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ntyc-server/app/main/api/internal/middleware/global.ReqHeaderCtxMiddleware.func1\n\tD:/Code/tyc-server/app/main/api/internal/middleware/global/reqHeaderCtxMiddleware.go:24\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.Authorize.func1.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/authhandler.go:81\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.GunzipHandler.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/gunziphandler.go:26\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.MaxBytesHandler.func2.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/maxbyteshandler.go:24\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.MetricHandler.func1.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/metrichandler.go:21\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.RecoverHandler.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/recoverhandler.go:21\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.(*timeoutHandler).ServeHTTP.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/timeouthandler.go:86\nruntime.goexit\n\tD:/Go/src/runtime/asm_amd64.s:1700 ","level":"error","span":"eb333127d6028ccb","trace":"e13c0a77bdadf2dc2cb726c960aa9116"}
{"@timestamp":"2025-05-13T23:39:56.564+08:00","caller":"result/httpResult.go:40","content":"【API-ERR】 : ErrCode:100001ErrMsg:服务器开小差啦,稍后再来试一试\n手机登录, 加密手机号失败: 手机号不能为空\ntyc-server/app/main/api/internal/logic/admin_platform_user.(*AdminGetPlatformUserListLogic).AdminGetPlatformUserList\n\tD:/Code/tyc-server/app/main/api/internal/logic/admin_platform_user/admingetplatformuserlistlogic.go:63\ntyc-server/app/main/api/internal/handler/admin_platform_user.AdminGetPlatformUserListHandler.func1\n\tD:/Code/tyc-server/app/main/api/internal/handler/admin_platform_user/admingetplatformuserlisthandler.go:26\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ntyc-server/app/main/api/internal/middleware/global.ReqHeaderCtxMiddleware.func1\n\tD:/Code/tyc-server/app/main/api/internal/middleware/global/reqHeaderCtxMiddleware.go:24\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.Authorize.func1.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/authhandler.go:81\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.GunzipHandler.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/gunziphandler.go:26\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.MaxBytesHandler.func2.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/maxbyteshandler.go:24\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.MetricHandler.func1.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/metrichandler.go:21\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.RecoverHandler.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/recoverhandler.go:21\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.(*timeoutHandler).ServeHTTP.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/timeouthandler.go:86\nruntime.goexit\n\tD:/Go/src/runtime/asm_amd64.s:1700 ","level":"error","span":"2830c780ed5513c3","trace":"e77e9596bba88f2fe0a91936f25d3c3c"}
{"@timestamp":"2025-05-13T23:40:16.227+08:00","caller":"result/httpResult.go:40","content":"【API-ERR】 : ErrCode:100001ErrMsg:服务器开小差啦,稍后再来试一试\n手机登录, 解密手机号失败: 加密手机号不能为空\ntyc-server/app/main/api/internal/logic/admin_platform_user.(*AdminGetPlatformUserListLogic).AdminGetPlatformUserList\n\tD:/Code/tyc-server/app/main/api/internal/logic/admin_platform_user/admingetplatformuserlistlogic.go:63\ntyc-server/app/main/api/internal/handler/admin_platform_user.AdminGetPlatformUserListHandler.func1\n\tD:/Code/tyc-server/app/main/api/internal/handler/admin_platform_user/admingetplatformuserlisthandler.go:26\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ntyc-server/app/main/api/internal/middleware/global.ReqHeaderCtxMiddleware.func1\n\tD:/Code/tyc-server/app/main/api/internal/middleware/global/reqHeaderCtxMiddleware.go:24\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.Authorize.func1.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/authhandler.go:81\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.GunzipHandler.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/gunziphandler.go:26\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.MaxBytesHandler.func2.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/maxbyteshandler.go:24\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.MetricHandler.func1.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/metrichandler.go:21\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.RecoverHandler.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/recoverhandler.go:21\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.(*timeoutHandler).ServeHTTP.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/timeouthandler.go:86\nruntime.goexit\n\tD:/Go/src/runtime/asm_amd64.s:1700 ","level":"error","span":"e404839cd4553c5f","trace":"3efab040c893cbef1b76285862bc1ace"}
{"@timestamp":"2025-05-13T23:40:16.724+08:00","caller":"result/httpResult.go:40","content":"【API-ERR】 : ErrCode:100001ErrMsg:服务器开小差啦,稍后再来试一试\n手机登录, 解密手机号失败: 加密手机号不能为空\ntyc-server/app/main/api/internal/logic/admin_platform_user.(*AdminGetPlatformUserListLogic).AdminGetPlatformUserList\n\tD:/Code/tyc-server/app/main/api/internal/logic/admin_platform_user/admingetplatformuserlistlogic.go:63\ntyc-server/app/main/api/internal/handler/admin_platform_user.AdminGetPlatformUserListHandler.func1\n\tD:/Code/tyc-server/app/main/api/internal/handler/admin_platform_user/admingetplatformuserlisthandler.go:26\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ntyc-server/app/main/api/internal/middleware/global.ReqHeaderCtxMiddleware.func1\n\tD:/Code/tyc-server/app/main/api/internal/middleware/global/reqHeaderCtxMiddleware.go:24\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.Authorize.func1.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/authhandler.go:81\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.GunzipHandler.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/gunziphandler.go:26\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.MaxBytesHandler.func2.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/maxbyteshandler.go:24\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.MetricHandler.func1.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/metrichandler.go:21\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.RecoverHandler.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/recoverhandler.go:21\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.(*timeoutHandler).ServeHTTP.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/timeouthandler.go:86\nruntime.goexit\n\tD:/Go/src/runtime/asm_amd64.s:1700 ","level":"error","span":"cc3490bd557e95f9","trace":"8da8bc102fc7c7162de764fad338da99"}
{"@timestamp":"2025-05-13T23:40:17.176+08:00","caller":"result/httpResult.go:40","content":"【API-ERR】 : ErrCode:100001ErrMsg:服务器开小差啦,稍后再来试一试\n手机登录, 解密手机号失败: 加密手机号不能为空\ntyc-server/app/main/api/internal/logic/admin_platform_user.(*AdminGetPlatformUserListLogic).AdminGetPlatformUserList\n\tD:/Code/tyc-server/app/main/api/internal/logic/admin_platform_user/admingetplatformuserlistlogic.go:63\ntyc-server/app/main/api/internal/handler/admin_platform_user.AdminGetPlatformUserListHandler.func1\n\tD:/Code/tyc-server/app/main/api/internal/handler/admin_platform_user/admingetplatformuserlisthandler.go:26\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ntyc-server/app/main/api/internal/middleware/global.ReqHeaderCtxMiddleware.func1\n\tD:/Code/tyc-server/app/main/api/internal/middleware/global/reqHeaderCtxMiddleware.go:24\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.Authorize.func1.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/authhandler.go:81\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.GunzipHandler.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/gunziphandler.go:26\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.MaxBytesHandler.func2.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/maxbyteshandler.go:24\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.MetricHandler.func1.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/metrichandler.go:21\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.RecoverHandler.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/recoverhandler.go:21\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.(*timeoutHandler).ServeHTTP.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/timeouthandler.go:86\nruntime.goexit\n\tD:/Go/src/runtime/asm_amd64.s:1700 ","level":"error","span":"f95074f00c45a9c8","trace":"1904b03d7d27ee682b61847c16e7533d"}
{"@timestamp":"2025-05-15T15:12:24.500+08:00","caller":"result/httpResult.go:40","content":"【API-ERR】 : ErrCode:100005ErrMsg:数据库繁忙,请稍后再试\n删除通知失败, err: GlobalNotificationsModel delete err : 14 ? in sql, but only 13 arguments provided: delete soft failed , id: 4\ntyc-server/app/main/api/internal/logic/admin_notification.(*AdminDeleteNotificationLogic).AdminDeleteNotification\n\tD:/Code/tyc-server/app/main/api/internal/logic/admin_notification/admindeletenotificationlogic.go:35\ntyc-server/app/main/api/internal/handler/admin_notification.AdminDeleteNotificationHandler.func1\n\tD:/Code/tyc-server/app/main/api/internal/handler/admin_notification/admindeletenotificationhandler.go:26\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ntyc-server/app/main/api/internal/middleware/global.ReqHeaderCtxMiddleware.func1\n\tD:/Code/tyc-server/app/main/api/internal/middleware/global/reqHeaderCtxMiddleware.go:24\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.GunzipHandler.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/gunziphandler.go:26\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.MaxBytesHandler.func2.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/maxbyteshandler.go:24\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.MetricHandler.func1.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/metrichandler.go:21\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.RecoverHandler.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/recoverhandler.go:21\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.(*timeoutHandler).ServeHTTP.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/timeouthandler.go:86\nruntime.goexit\n\tD:/Go/src/runtime/asm_amd64.s:1700 ","level":"error","span":"bce16c7987c89bb9","trace":"86a49825f320f9d6735b58d19188c942"}
{"@timestamp":"2025-05-15T15:16:40.910+08:00","caller":"result/httpResult.go:40","content":"【API-ERR】 : ErrCode:100005ErrMsg:数据库繁忙,请稍后再试\n更新通知失败, err: 13 ? in sql, but only 12 arguments provided, req: &{Id:3 Title:元旦节日惠客通知 Content:<p>🎉元旦感恩特惠活动公告🎉 尊敬的用户,您好!为庆祝元旦节日,我们特别推出限时优惠活动: 活动时间: 2025年1月1日12:00 至 2025年1月2日12:00 活动内容: 活动期间内,所有功能无限次数通通 2折 优惠! 参与方式: 在活动时间内登录系统,即可享受所有服务 2 折优惠,机会难得,不容错过! 温馨提示: 为了方便您参与未来更多优惠活动,请将我们的网站收藏到您的浏览器书签中,或在百度搜索随时访问我们的最新动态和活动信息! 活动解释权归平台所有。 感谢您的支持,祝您元旦快乐!🎊</p> NotificationPage:/ StartDate:2025-01-01 StartTime: EndDate:2025-01-02 EndTime: Status:inactive}\ntyc-server/app/main/api/internal/logic/admin_notification.(*AdminUpdateNotificationLogic).AdminUpdateNotification\n\tD:/Code/tyc-server/app/main/api/internal/logic/admin_notification/adminupdatenotificationlogic.go:46\ntyc-server/app/main/api/internal/handler/admin_notification.AdminUpdateNotificationHandler.func1\n\tD:/Code/tyc-server/app/main/api/internal/handler/admin_notification/adminupdatenotificationhandler.go:26\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ntyc-server/app/main/api/internal/middleware/global.ReqHeaderCtxMiddleware.func1\n\tD:/Code/tyc-server/app/main/api/internal/middleware/global/reqHeaderCtxMiddleware.go:24\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.GunzipHandler.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/gunziphandler.go:26\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.MaxBytesHandler.func2.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/maxbyteshandler.go:24\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.MetricHandler.func1.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/metrichandler.go:21\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.RecoverHandler.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/recoverhandler.go:21\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.(*timeoutHandler).ServeHTTP.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/timeouthandler.go:86\nruntime.goexit\n\tD:/Go/src/runtime/asm_amd64.s:1700 ","level":"error","span":"1787695655594302","trace":"41f2a4d6ffade6e2b0523212b71d6c8e"}
{"@timestamp":"2025-05-15T15:28:19.393+08:00","caller":"result/httpResult.go:40","content":"【API-ERR】 : ErrCode:100005ErrMsg:数据库繁忙,请稍后再试\n更新通知失败, err: context deadline exceeded, req: &{Id:3 Title:元旦节日惠客通知 Content:<p>🎉元旦感恩特惠活动公告🎉 尊敬的用户,您好!为庆祝元旦节日,我们特别推出限时优惠活动: 活动时间: 2025年1月1日12:00 至 2025年1月2日12:00 活动内容: 活动期间内,所有功能无限次数通通 2折 优惠! 参与方式: 在活动时间内登录系统,即可享受所有服务 2 折优惠,机会难得,不容错过! 温馨提示: 为了方便您参与未来更多优惠活动,请将我们的网站收藏到您的浏览器书签中,或在百度搜索随时访问我们的最新动态和活动信息! 活动解释权归平台所有。 感谢您的支持,祝您元旦快乐!🎊</p> NotificationPage:/ StartDate:2025-01-01 StartTime: EndDate:2025-01-02 EndTime: Status:inactive}\ntyc-server/app/main/api/internal/logic/admin_notification.(*AdminUpdateNotificationLogic).AdminUpdateNotification\n\tD:/Code/tyc-server/app/main/api/internal/logic/admin_notification/adminupdatenotificationlogic.go:46\ntyc-server/app/main/api/internal/handler/admin_notification.AdminUpdateNotificationHandler.func1\n\tD:/Code/tyc-server/app/main/api/internal/handler/admin_notification/adminupdatenotificationhandler.go:26\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ntyc-server/app/main/api/internal/middleware/global.ReqHeaderCtxMiddleware.func1\n\tD:/Code/tyc-server/app/main/api/internal/middleware/global/reqHeaderCtxMiddleware.go:24\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.GunzipHandler.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/gunziphandler.go:26\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.MaxBytesHandler.func2.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/maxbyteshandler.go:24\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.MetricHandler.func1.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/metrichandler.go:21\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.RecoverHandler.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/recoverhandler.go:21\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.(*timeoutHandler).ServeHTTP.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/timeouthandler.go:86\nruntime.goexit\n\tD:/Go/src/runtime/asm_amd64.s:1700 ","level":"error","span":"a3d736f56bf9b9e0","trace":"5f7d45910180fc01355d02ccef655bb8"}
{"@timestamp":"2025-05-15T15:28:19.393+08:00","caller":"handler/loghandler.go:149","content":"[HTTP] 503 - PUT /api/v1/admin/notification/update/3 - [::1]:56840 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36\nPUT /api/v1/admin/notification/update/3 HTTP/1.1\r\nHost: localhost:8888\r\nAccept: application/json, text/plain, */*\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nAccept-Language: zh-CN\r\nAuthorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NDkzOTExMTYsImlhdCI6MTc0Njc5OTExNiwidXNlcklkIjoxfQ.4gJXQZbU6_n6RLlX5l1S5Zk2dsRtFNGJ2CIrqmn4_dw\r\nConnection: close\r\nContent-Length: 842\r\nContent-Type: application/json;charset=UTF-8\r\nCookie: pma_lang=zh_CN; phpMyAdmin=b6eb658324c8a60061e566b86986d8f9\r\nOrigin: http://localhost:5666\r\nReferer: http://localhost:5666/notification\r\nSec-Ch-Ua: \"Chromium\";v=\"136\", \"Google Chrome\";v=\"136\", \"Not.A/Brand\";v=\"99\"\r\nSec-Ch-Ua-Mobile: ?0\r\nSec-Ch-Ua-Platform: \"Windows\"\r\nSec-Fetch-Dest: empty\r\nSec-Fetch-Mode: cors\r\nSec-Fetch-Site: same-origin\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36\r\n\r\n{\"status\":\"inactive\",\"title\":\"元旦节日惠客通知\",\"notification_page\":\"/\",\"content\":\"<p>🎉元旦感恩特惠活动公告🎉 尊敬的用户,您好!为庆祝元旦节日,我们特别推出限时优惠活动: 活动时间: 2025年1月1日12:00 至 2025年1月2日12:00 活动内容: 活动期间内,所有功能无限次数通通 2折 优惠! 参与方式: 在活动时间内登录系统,即可享受所有服务 2 折优惠,机会难得,不容错过! 温馨提示: 为了方便您参与未来更多优惠活动,请将我们的网站收藏到您的浏览器书签中,或在百度搜索随时访问我们的最新动态和活动信息! 活动解释权归平台所有。 感谢您的支持,祝您元旦快乐!🎊</p>\",\"start_time\":\"\",\"end_time\":\"\",\"start_date\":\"2025-01-01\",\"end_date\":\"2025-01-02\"}","duration":"125335.6ms","level":"error","span":"a3d736f56bf9b9e0","trace":"5f7d45910180fc01355d02ccef655bb8"}
{"@timestamp":"2025-05-15T15:28:23.920+08:00","caller":"result/httpResult.go:40","content":"【API-ERR】 : ErrCode:100005ErrMsg:数据库繁忙,请稍后再试\n更新通知失败, err: 13 ? in sql, but only 12 arguments provided, req: &{Id:3 Title:元旦节日惠客通知 Content:<p>🎉元旦感恩特惠活动公告🎉 尊敬的用户,您好!为庆祝元旦节日,我们特别推出限时优惠活动: 活动时间: 2025年1月1日12:00 至 2025年1月2日12:00 活动内容: 活动期间内,所有功能无限次数通通 2折 优惠! 参与方式: 在活动时间内登录系统,即可享受所有服务 2 折优惠,机会难得,不容错过! 温馨提示: 为了方便您参与未来更多优惠活动,请将我们的网站收藏到您的浏览器书签中,或在百度搜索随时访问我们的最新动态和活动信息! 活动解释权归平台所有。 感谢您的支持,祝您元旦快乐!🎊</p> NotificationPage:/ StartDate:2025-01-01 StartTime: EndDate:2025-01-02 EndTime: Status:inactive}\ntyc-server/app/main/api/internal/logic/admin_notification.(*AdminUpdateNotificationLogic).AdminUpdateNotification\n\tD:/Code/tyc-server/app/main/api/internal/logic/admin_notification/adminupdatenotificationlogic.go:46\ntyc-server/app/main/api/internal/handler/admin_notification.AdminUpdateNotificationHandler.func1\n\tD:/Code/tyc-server/app/main/api/internal/handler/admin_notification/adminupdatenotificationhandler.go:26\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ntyc-server/app/main/api/internal/middleware/global.ReqHeaderCtxMiddleware.func1\n\tD:/Code/tyc-server/app/main/api/internal/middleware/global/reqHeaderCtxMiddleware.go:24\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.GunzipHandler.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/gunziphandler.go:26\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.MaxBytesHandler.func2.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/maxbyteshandler.go:24\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.MetricHandler.func1.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/metrichandler.go:21\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.RecoverHandler.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/recoverhandler.go:21\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.(*timeoutHandler).ServeHTTP.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/timeouthandler.go:86\nruntime.goexit\n\tD:/Go/src/runtime/asm_amd64.s:1700 ","level":"error","span":"690bc5b4ab2fc543","trace":"8a6ea2e1ee3add71fe988caf55916061"}
{"@timestamp":"2025-05-15T15:29:56.035+08:00","caller":"result/httpResult.go:40","content":"【API-ERR】 : ErrCode:100005ErrMsg:数据库繁忙,请稍后再试\n更新通知失败, err: 13 ? in sql, but only 12 arguments provided, req: &{Id:3 Title:元旦节日惠客通知 Content:<p>🎉元旦感恩特惠活动公告🎉 尊敬的用户,您好!为庆祝元旦节日,我们特别推出限时优惠活动: 活动时间: 2025年1月1日12:00 至 2025年1月2日12:00 活动内容: 活动期间内,所有功能无限次数通通 2折 优惠! 参与方式: 在活动时间内登录系统,即可享受所有服务 2 折优惠,机会难得,不容错过! 温馨提示: 为了方便您参与未来更多优惠活动,请将我们的网站收藏到您的浏览器书签中,或在百度搜索随时访问我们的最新动态和活动信息! 活动解释权归平台所有。 感谢您的支持,祝您元旦快乐!🎊</p> NotificationPage:/ StartDate:2025-01-01 StartTime: EndDate:2025-01-02 EndTime: Status:inactive}\ntyc-server/app/main/api/internal/logic/admin_notification.(*AdminUpdateNotificationLogic).AdminUpdateNotification\n\tD:/Code/tyc-server/app/main/api/internal/logic/admin_notification/adminupdatenotificationlogic.go:46\ntyc-server/app/main/api/internal/handler/admin_notification.AdminUpdateNotificationHandler.func1\n\tD:/Code/tyc-server/app/main/api/internal/handler/admin_notification/adminupdatenotificationhandler.go:26\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ntyc-server/app/main/api/internal/middleware/global.ReqHeaderCtxMiddleware.func1\n\tD:/Code/tyc-server/app/main/api/internal/middleware/global/reqHeaderCtxMiddleware.go:24\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.GunzipHandler.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/gunziphandler.go:26\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.MaxBytesHandler.func2.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/maxbyteshandler.go:24\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.MetricHandler.func1.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/metrichandler.go:21\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.RecoverHandler.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/recoverhandler.go:21\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.(*timeoutHandler).ServeHTTP.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/timeouthandler.go:86\nruntime.goexit\n\tD:/Go/src/runtime/asm_amd64.s:1700 ","level":"error","span":"d9f4e055384cc73f","trace":"c14d7c4e38a84e333f31d899ce3df99a"}
{"@timestamp":"2025-05-15T15:42:08.935+08:00","caller":"sqlx/utils.go:147","content":"stmt: update `global_notifications` set `title`='元旦节日惠客通知',`content`='<p>🎉元旦感恩特惠活动公告🎉 尊敬的用户,您好!为庆祝元旦节日,我们特别推出限时优惠活动: 活动时间: 2025年1月1日12:00 至 2025年1月2日12:00 活动内容: 活动期间内,所有功能无限次数通通 2折 优惠! 参与方式: 在活动时间内登录系统,即可享受所有服务 2 折优惠,机会难得,不容错过! 温馨提示: 为了方便您参与未来更多优惠活动,请将我们的网站收藏到您的浏览器书签中,或在百度搜索随时访问我们的最新动态和活动信息! 活动解释权归平台所有。 感谢您的支持,祝您元旦快乐!🎊</p>',`notification_page`='/',`start_date`={2025-01-01 00:00:00 +0000 UTC true},`end_date`={2025-01-02 00:00:00 +0000 UTC true},`start_time`='',`end_time`='',`created_time`='0001-01-01 00:00:00 +0000 UTC',`updated_time`='0001-01-01 00:00:00 +0000 UTC',`status`='inactive',`del_state`=0,`version`=1,`delete_time`={0001-01-01 00:00:00 +0000 UTC false} where `id` = 3, error: Error 1292 (22007): Incorrect datetime value: '0000-00-00' for column 'created_time' at row 1","level":"error","span":"94463b3d515ade48","trace":"28ca068539c01ebd5e93b87b2f4db8c7"}
{"@timestamp":"2025-05-15T15:42:08.935+08:00","caller":"result/httpResult.go:40","content":"【API-ERR】 : ErrCode:100005ErrMsg:数据库繁忙,请稍后再试\n更新通知失败, err: Error 1292 (22007): Incorrect datetime value: '0000-00-00' for column 'created_time' at row 1, req: &{Id:3 Title:元旦节日惠客通知 Content:<p>🎉元旦感恩特惠活动公告🎉 尊敬的用户,您好!为庆祝元旦节日,我们特别推出限时优惠活动: 活动时间: 2025年1月1日12:00 至 2025年1月2日12:00 活动内容: 活动期间内,所有功能无限次数通通 2折 优惠! 参与方式: 在活动时间内登录系统,即可享受所有服务 2 折优惠,机会难得,不容错过! 温馨提示: 为了方便您参与未来更多优惠活动,请将我们的网站收藏到您的浏览器书签中,或在百度搜索随时访问我们的最新动态和活动信息! 活动解释权归平台所有。 感谢您的支持,祝您元旦快乐!🎊</p> NotificationPage:/ StartDate:2025-01-01 StartTime: EndDate:2025-01-02 EndTime: Status:inactive}\ntyc-server/app/main/api/internal/logic/admin_notification.(*AdminUpdateNotificationLogic).AdminUpdateNotification\n\tD:/Code/tyc-server/app/main/api/internal/logic/admin_notification/adminupdatenotificationlogic.go:46\ntyc-server/app/main/api/internal/handler/admin_notification.AdminUpdateNotificationHandler.func1\n\tD:/Code/tyc-server/app/main/api/internal/handler/admin_notification/adminupdatenotificationhandler.go:26\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ntyc-server/app/main/api/internal/middleware/global.ReqHeaderCtxMiddleware.func1\n\tD:/Code/tyc-server/app/main/api/internal/middleware/global/reqHeaderCtxMiddleware.go:24\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.GunzipHandler.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/gunziphandler.go:26\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.MaxBytesHandler.func2.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/maxbyteshandler.go:24\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.MetricHandler.func1.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/metrichandler.go:21\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.RecoverHandler.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/recoverhandler.go:21\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.(*timeoutHandler).ServeHTTP.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/timeouthandler.go:86\nruntime.goexit\n\tD:/Go/src/runtime/asm_amd64.s:1700 ","level":"error","span":"09470cfafab12cfc","trace":"28ca068539c01ebd5e93b87b2f4db8c7"}
{"@timestamp":"2025-05-15T15:43:59.434+08:00","caller":"sqlx/utils.go:147","content":"stmt: update `global_notifications` set `title`='元旦节日惠客通知',`content`='<p>🎉元旦感恩特惠活动公告🎉 尊敬的用户,您好!为庆祝元旦节日,我们特别推出限时优惠活动: 活动时间: 2025年1月1日12:00 至 2025年1月2日12:00 活动内容: 活动期间内,所有功能无限次数通通 2折 优惠! 参与方式: 在活动时间内登录系统,即可享受所有服务 2 折优惠,机会难得,不容错过! 温馨提示: 为了方便您参与未来更多优惠活动,请将我们的网站收藏到您的浏览器书签中,或在百度搜索随时访问我们的最新动态和活动信息! 活动解释权归平台所有。 感谢您的支持,祝您元旦快乐!🎊</p>',`notification_page`='/',`start_date`={2025-01-01 00:00:00 +0000 UTC true},`end_date`={2025-01-02 00:00:00 +0000 UTC true},`start_time`='',`end_time`='',`created_time`='0001-01-01 00:00:00 +0000 UTC',`updated_time`='0001-01-01 00:00:00 +0000 UTC',`status`='inactive',`del_state`=0,`version`=1,`delete_time`={0001-01-01 00:00:00 +0000 UTC false} where `id` = 3, error: Error 1292 (22007): Incorrect datetime value: '0000-00-00' for column 'created_time' at row 1","level":"error","span":"05dda203e991ed65","trace":"0628633c2e124a03269789a41c9f0be5"}
{"@timestamp":"2025-05-15T15:43:59.435+08:00","caller":"result/httpResult.go:40","content":"【API-ERR】 : ErrCode:100005ErrMsg:数据库繁忙,请稍后再试\n更新通知失败, err: Error 1292 (22007): Incorrect datetime value: '0000-00-00' for column 'created_time' at row 1, req: &{Id:3 Title:元旦节日惠客通知 Content:<p>🎉元旦感恩特惠活动公告🎉 尊敬的用户,您好!为庆祝元旦节日,我们特别推出限时优惠活动: 活动时间: 2025年1月1日12:00 至 2025年1月2日12:00 活动内容: 活动期间内,所有功能无限次数通通 2折 优惠! 参与方式: 在活动时间内登录系统,即可享受所有服务 2 折优惠,机会难得,不容错过! 温馨提示: 为了方便您参与未来更多优惠活动,请将我们的网站收藏到您的浏览器书签中,或在百度搜索随时访问我们的最新动态和活动信息! 活动解释权归平台所有。 感谢您的支持,祝您元旦快乐!🎊</p> NotificationPage:/ StartDate:2025-01-01 StartTime: EndDate:2025-01-02 EndTime: Status:inactive}\ntyc-server/app/main/api/internal/logic/admin_notification.(*AdminUpdateNotificationLogic).AdminUpdateNotification\n\tD:/Code/tyc-server/app/main/api/internal/logic/admin_notification/adminupdatenotificationlogic.go:46\ntyc-server/app/main/api/internal/handler/admin_notification.AdminUpdateNotificationHandler.func1\n\tD:/Code/tyc-server/app/main/api/internal/handler/admin_notification/adminupdatenotificationhandler.go:26\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ntyc-server/app/main/api/internal/middleware/global.ReqHeaderCtxMiddleware.func1\n\tD:/Code/tyc-server/app/main/api/internal/middleware/global/reqHeaderCtxMiddleware.go:24\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.GunzipHandler.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/gunziphandler.go:26\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.MaxBytesHandler.func2.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/maxbyteshandler.go:24\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.MetricHandler.func1.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/metrichandler.go:21\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.RecoverHandler.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/recoverhandler.go:21\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.(*timeoutHandler).ServeHTTP.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/timeouthandler.go:86\nruntime.goexit\n\tD:/Go/src/runtime/asm_amd64.s:1700 ","level":"error","span":"5e7c558378b89b9b","trace":"0628633c2e124a03269789a41c9f0be5"}
{"@timestamp":"2025-05-15T15:45:03.683+08:00","caller":"result/httpResult.go:40","content":"【API-ERR】 : ErrCode:100005ErrMsg:数据库繁忙,请稍后再试\n更新通知失败, err: context deadline exceeded, req: &{Id:3 Title:元旦节日惠客通知 Content:<p>🎉元旦感恩特惠活动公告🎉 尊敬的用户,您好!为庆祝元旦节日,我们特别推出限时优惠活动: 活动时间: 2025年1月1日12:00 至 2025年1月2日12:00 活动内容: 活动期间内,所有功能无限次数通通 2折 优惠! 参与方式: 在活动时间内登录系统,即可享受所有服务 2 折优惠,机会难得,不容错过! 温馨提示: 为了方便您参与未来更多优惠活动,请将我们的网站收藏到您的浏览器书签中,或在百度搜索随时访问我们的最新动态和活动信息! 活动解释权归平台所有。 感谢您的支持,祝您元旦快乐!🎊</p> NotificationPage:/ StartDate:2025-01-01 StartTime: EndDate:2025-01-02 EndTime: Status:inactive}\ntyc-server/app/main/api/internal/logic/admin_notification.(*AdminUpdateNotificationLogic).AdminUpdateNotification\n\tD:/Code/tyc-server/app/main/api/internal/logic/admin_notification/adminupdatenotificationlogic.go:46\ntyc-server/app/main/api/internal/handler/admin_notification.AdminUpdateNotificationHandler.func1\n\tD:/Code/tyc-server/app/main/api/internal/handler/admin_notification/adminupdatenotificationhandler.go:26\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ntyc-server/app/main/api/internal/middleware/global.ReqHeaderCtxMiddleware.func1\n\tD:/Code/tyc-server/app/main/api/internal/middleware/global/reqHeaderCtxMiddleware.go:24\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.GunzipHandler.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/gunziphandler.go:26\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.MaxBytesHandler.func2.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/maxbyteshandler.go:24\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.MetricHandler.func1.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/metrichandler.go:21\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.RecoverHandler.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/recoverhandler.go:21\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.(*timeoutHandler).ServeHTTP.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/timeouthandler.go:86\nruntime.goexit\n\tD:/Go/src/runtime/asm_amd64.s:1700 ","level":"error","span":"65102f377c6dbb0b","trace":"3b9ed793f0302dc36de6a96d7f269ec3"}
{"@timestamp":"2025-05-15T15:45:03.683+08:00","caller":"handler/loghandler.go:149","content":"[HTTP] 503 - PUT /api/v1/admin/notification/update/3 - [::1]:64584 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36\nPUT /api/v1/admin/notification/update/3 HTTP/1.1\r\nHost: localhost:8888\r\nAccept: application/json, text/plain, */*\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nAccept-Language: zh-CN\r\nAuthorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NDkzOTExMTYsImlhdCI6MTc0Njc5OTExNiwidXNlcklkIjoxfQ.4gJXQZbU6_n6RLlX5l1S5Zk2dsRtFNGJ2CIrqmn4_dw\r\nConnection: close\r\nContent-Length: 842\r\nContent-Type: application/json;charset=UTF-8\r\nCookie: pma_lang=zh_CN; phpMyAdmin=b6eb658324c8a60061e566b86986d8f9\r\nOrigin: http://localhost:5666\r\nReferer: http://localhost:5666/notification\r\nSec-Ch-Ua: \"Chromium\";v=\"136\", \"Google Chrome\";v=\"136\", \"Not.A/Brand\";v=\"99\"\r\nSec-Ch-Ua-Mobile: ?0\r\nSec-Ch-Ua-Platform: \"Windows\"\r\nSec-Fetch-Dest: empty\r\nSec-Fetch-Mode: cors\r\nSec-Fetch-Site: same-origin\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36\r\n\r\n{\"status\":\"inactive\",\"title\":\"元旦节日惠客通知\",\"notification_page\":\"/\",\"content\":\"<p>🎉元旦感恩特惠活动公告🎉 尊敬的用户,您好!为庆祝元旦节日,我们特别推出限时优惠活动: 活动时间: 2025年1月1日12:00 至 2025年1月2日12:00 活动内容: 活动期间内,所有功能无限次数通通 2折 优惠! 参与方式: 在活动时间内登录系统,即可享受所有服务 2 折优惠,机会难得,不容错过! 温馨提示: 为了方便您参与未来更多优惠活动,请将我们的网站收藏到您的浏览器书签中,或在百度搜索随时访问我们的最新动态和活动信息! 活动解释权归平台所有。 感谢您的支持,祝您元旦快乐!🎊</p>\",\"start_time\":\"\",\"end_time\":\"\",\"start_date\":\"2025-01-01\",\"end_date\":\"2025-01-02\"}","duration":"26595.8ms","level":"error","span":"65102f377c6dbb0b","trace":"3b9ed793f0302dc36de6a96d7f269ec3"}
{"@timestamp":"2025-05-15T15:45:08.357+08:00","caller":"sqlx/utils.go:147","content":"stmt: update `global_notifications` set `title`='通知',`content`='<div class=\\\"font-2xl font-bold mb-2\\\">升级通知</div> \\r\\n<p class=\\\"mb-4\\\">\\r\\n 尊敬的用户您好由于平台进行全面功能升级今日12点至下午15点期间所有功能将暂时不可用。 \\r\\n 我们深感抱歉,给您带来的不便敬请谅解。\\r\\n</p>\\r\\n<p class=\\\"text-base text-gray-500 mb-4\\\">\\r\\n 请您在升级完成后再尝试使用相关功能。感谢您的理解与支持!\\r\\n</p>\\r\\n',`notification_page`='/',`start_date`={0001-01-01 00:00:00 +0000 UTC false},`end_date`={0001-01-01 00:00:00 +0000 UTC false},`start_time`='12:00:00',`end_time`='15:00:00',`created_time`='0001-01-01 00:00:00 +0000 UTC',`updated_time`='0001-01-01 00:00:00 +0000 UTC',`status`='inactive',`del_state`=1,`version`=1,`delete_time`={2025-05-15 15:45:08.3562001 +0800 CST m=+77.862732701 true} where `id` = 4 and version = 0 , error: Error 1292 (22007): Incorrect datetime value: '0000-00-00' for column 'created_time' at row 1","level":"error","span":"099ec10c8fcaa297","trace":"01027e3fb1f1d7700eeb0467712590b4"}
{"@timestamp":"2025-05-15T15:45:08.357+08:00","caller":"result/httpResult.go:40","content":"【API-ERR】 : ErrCode:100005ErrMsg:数据库繁忙,请稍后再试\n删除通知失败, err: GlobalNotificationsModel delete err : Error 1292 (22007): Incorrect datetime value: '0000-00-00' for column 'created_time' at row 1: delete soft failed , id: 4\ntyc-server/app/main/api/internal/logic/admin_notification.(*AdminDeleteNotificationLogic).AdminDeleteNotification\n\tD:/Code/tyc-server/app/main/api/internal/logic/admin_notification/admindeletenotificationlogic.go:35\ntyc-server/app/main/api/internal/handler/admin_notification.AdminDeleteNotificationHandler.func1\n\tD:/Code/tyc-server/app/main/api/internal/handler/admin_notification/admindeletenotificationhandler.go:26\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ntyc-server/app/main/api/internal/middleware/global.ReqHeaderCtxMiddleware.func1\n\tD:/Code/tyc-server/app/main/api/internal/middleware/global/reqHeaderCtxMiddleware.go:24\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.GunzipHandler.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/gunziphandler.go:26\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.MaxBytesHandler.func2.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/maxbyteshandler.go:24\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.MetricHandler.func1.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/metrichandler.go:21\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.RecoverHandler.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/recoverhandler.go:21\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.(*timeoutHandler).ServeHTTP.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/timeouthandler.go:86\nruntime.goexit\n\tD:/Go/src/runtime/asm_amd64.s:1700 ","level":"error","span":"6099296888d29cb1","trace":"01027e3fb1f1d7700eeb0467712590b4"}
{"@timestamp":"2025-05-15T15:45:18.242+08:00","caller":"sqlx/utils.go:147","content":"stmt: update `global_notifications` set `title`='通知',`content`='<div class=\\\"font-2xl font-bold mb-2\\\">升级通知</div> \\r\\n<p class=\\\"mb-4\\\">\\r\\n 尊敬的用户您好由于平台进行全面功能升级今日12点至下午15点期间所有功能将暂时不可用。 \\r\\n 我们深感抱歉,给您带来的不便敬请谅解。\\r\\n</p>\\r\\n<p class=\\\"text-base text-gray-500 mb-4\\\">\\r\\n 请您在升级完成后再尝试使用相关功能。感谢您的理解与支持!\\r\\n</p>\\r\\n',`notification_page`='/',`start_date`={0001-01-01 00:00:00 +0000 UTC false},`end_date`={0001-01-01 00:00:00 +0000 UTC false},`start_time`='12:00:00',`end_time`='15:00:00',`created_time`='0001-01-01 00:00:00 +0000 UTC',`updated_time`='0001-01-01 00:00:00 +0000 UTC',`status`='inactive',`del_state`=1,`version`=1,`delete_time`={2025-05-15 15:45:18.2411283 +0800 CST m=+87.747660901 true} where `id` = 4 and version = 0 , error: Error 1292 (22007): Incorrect datetime value: '0000-00-00' for column 'created_time' at row 1","level":"error","span":"27a568bb7c17df60","trace":"3fa21f5f87161092d428e62480cdea7a"}
{"@timestamp":"2025-05-15T15:45:18.242+08:00","caller":"result/httpResult.go:40","content":"【API-ERR】 : ErrCode:100005ErrMsg:数据库繁忙,请稍后再试\n删除通知失败, err: GlobalNotificationsModel delete err : Error 1292 (22007): Incorrect datetime value: '0000-00-00' for column 'created_time' at row 1: delete soft failed , id: 4\ntyc-server/app/main/api/internal/logic/admin_notification.(*AdminDeleteNotificationLogic).AdminDeleteNotification\n\tD:/Code/tyc-server/app/main/api/internal/logic/admin_notification/admindeletenotificationlogic.go:35\ntyc-server/app/main/api/internal/handler/admin_notification.AdminDeleteNotificationHandler.func1\n\tD:/Code/tyc-server/app/main/api/internal/handler/admin_notification/admindeletenotificationhandler.go:26\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ntyc-server/app/main/api/internal/middleware/global.ReqHeaderCtxMiddleware.func1\n\tD:/Code/tyc-server/app/main/api/internal/middleware/global/reqHeaderCtxMiddleware.go:24\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.GunzipHandler.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/gunziphandler.go:26\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.MaxBytesHandler.func2.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/maxbyteshandler.go:24\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.MetricHandler.func1.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/metrichandler.go:21\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.RecoverHandler.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/recoverhandler.go:21\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.(*timeoutHandler).ServeHTTP.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/timeouthandler.go:86\nruntime.goexit\n\tD:/Go/src/runtime/asm_amd64.s:1700 ","level":"error","span":"8475cb20edf83232","trace":"3fa21f5f87161092d428e62480cdea7a"}
{"@timestamp":"2025-05-15T15:45:19.567+08:00","caller":"sqlx/utils.go:147","content":"stmt: update `global_notifications` set `title`='元旦节日惠客通知',`content`='<div style=\\\"font-family: Arial, sans-serif; line-height: 1.3; color: #333;\\\">\\n <h2 style=\\\"text-align: center; color: #d9534f; font-size: 24px; margin-bottom: 20px;\\\">🎉元旦感恩特惠活动公告🎉</h2>\\n \\n <p style=\\\"font-size: 18px; margin-bottom: 10px;\\\">\\n 尊敬的用户,您好!为庆祝元旦节日,我们特别推出限时优惠活动:\\n </p>\\n \\n <p style=\\\"font-size: 16px; margin-bottom: 10px;\\\">\\n <strong style=\\\"color: #d9534f;\\\">活动时间:</strong> \\n <span style=\\\"color: #0275d8;\\\">2025年1月1日12:00 至 2025年1月2日12:00</span>\\n </p>\\n \\n <p style=\\\"font-size: 16px; margin-bottom: 10px;\\\">\\n <strong style=\\\"color: #d9534f;\\\">活动内容:</strong> \\n 活动期间内,所有功能无限次数通通 \\n <span style=\\\"color: #d9534f; font-weight: bold; font-size: 20px;\\\">2折</span> 优惠!\\n </p>\\n \\n <p style=\\\"font-size: 16px; margin-bottom: 10px;\\\">\\n <strong style=\\\"color: #d9534f;\\\">参与方式:</strong> \\n 在活动时间内登录系统,即可享受所有服务 2 折优惠,机会难得,不容错过!\\n </p>\\n \\n <p style=\\\"font-size: 16px; margin-bottom: 10px; color: #333;\\\">\\n <strong style=\\\"color: #5cb85c;\\\">温馨提示:</strong>\\n 为了方便您参与未来更多优惠活动,请将我们的网站收藏到您的浏览器书签中,或在百度搜索随时访问我们的最新动态和活动信息!\\n </p>\\n \\n <p style=\\\"font-size: 14px; margin-bottom: 10px; color: #888;\\\">\\n 活动解释权归平台所有。\\n </p>\\n \\n <p style=\\\"text-align: center; margin-top: 20px; font-size: 16px; color: #5cb85c;\\\">\\n 感谢您的支持,祝您元旦快乐!🎊\\n </p>\\n </div>',`notification_page`='/',`start_date`={2025-01-01 00:00:00 +0800 CST true},`end_date`={2025-01-02 00:00:00 +0800 CST true},`start_time`='00:00:00',`end_time`='12:00:00',`created_time`='0001-01-01 00:00:00 +0000 UTC',`updated_time`='0001-01-01 00:00:00 +0000 UTC',`status`='inactive',`del_state`=1,`version`=2,`delete_time`={2025-05-15 15:45:19.5655646 +0800 CST m=+89.072097201 true} where `id` = 3 and version = 1 , error: Error 1292 (22007): Incorrect datetime value: '0000-00-00' for column 'created_time' at row 1","level":"error","span":"ebef4569c7d11958","trace":"60a60432285c02bea2c0187441f06503"}
{"@timestamp":"2025-05-15T15:45:19.567+08:00","caller":"result/httpResult.go:40","content":"【API-ERR】 : ErrCode:100005ErrMsg:数据库繁忙,请稍后再试\n删除通知失败, err: GlobalNotificationsModel delete err : Error 1292 (22007): Incorrect datetime value: '0000-00-00' for column 'created_time' at row 1: delete soft failed , id: 3\ntyc-server/app/main/api/internal/logic/admin_notification.(*AdminDeleteNotificationLogic).AdminDeleteNotification\n\tD:/Code/tyc-server/app/main/api/internal/logic/admin_notification/admindeletenotificationlogic.go:35\ntyc-server/app/main/api/internal/handler/admin_notification.AdminDeleteNotificationHandler.func1\n\tD:/Code/tyc-server/app/main/api/internal/handler/admin_notification/admindeletenotificationhandler.go:26\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ntyc-server/app/main/api/internal/middleware/global.ReqHeaderCtxMiddleware.func1\n\tD:/Code/tyc-server/app/main/api/internal/middleware/global/reqHeaderCtxMiddleware.go:24\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.GunzipHandler.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/gunziphandler.go:26\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.MaxBytesHandler.func2.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/maxbyteshandler.go:24\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.MetricHandler.func1.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/metrichandler.go:21\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.RecoverHandler.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/recoverhandler.go:21\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.(*timeoutHandler).ServeHTTP.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/timeouthandler.go:86\nruntime.goexit\n\tD:/Go/src/runtime/asm_amd64.s:1700 ","level":"error","span":"61b3b0137f0a6c33","trace":"60a60432285c02bea2c0187441f06503"}
{"@timestamp":"2025-05-15T15:45:59.204+08:00","caller":"sqlx/utils.go:147","content":"stmt: insert into `global_notifications` (`title`,`content`,`notification_page`,`start_date`,`end_date`,`start_time`,`end_time`,`created_time`,`updated_time`,`status`,`del_state`,`version`,`delete_time`) values ('节日特惠', '<p style=\\\"text-align: start;\\\">尊敬的顾客朋友:</p><p style=\\\"text-align: start;\\\">感谢您一直以来对【店铺/品牌名称】的支持!为回馈新老客户,我们特推出以下超值优惠活动:</p><p style=\\\"text-align: start;\\\"><strong>📅 活动时间</strong><br><br>2023年X月X日 - X月X日</p><p style=\\\"text-align: start;\\\"><strong>🎉 促销内容</strong><br><br>1<strong>全场商品低至5折</strong>​:指定商品享折上折,部分爆款限时秒杀!<br><br>2<strong>满减狂欢</strong>​:单笔消费满【金额】立减【金额】,多买多省!<br><br>3<strong>赠品福利</strong>​:消费满【金额】即赠【赠品名称】,数量有限,先到先得!<br><br>4<strong>会员专享</strong>注册成为会员额外领【XX元无门槛优惠券】</p><p style=\\\"text-align: start;\\\"><strong>📍 参与方式</strong><br><br>线下:到店选购,地址:【门店地址】<br><br>线上:进入【小程序/APP/网店名称】,搜索活动专区即可参与!</p><p style=\\\"text-align: start;\\\"><strong>📞 咨询方式</strong><br><br>电话【XXX-XXXXXXX】<br><br>客服微信:【微信号/二维码】</p><p style=\\\"text-align: start;\\\">**❗ 温馨提示**<br><br>• 活动仅限指定商品,不与其他优惠叠加。<br><br>• 赠品/优惠券数量有限,先到先得,用完即止。</p><p style=\\\"text-align: start;\\\"><strong>👉 速来抢购,错过再等一年!​</strong></p><p style=\\\"text-align: start;\\\">【店铺/品牌名称】<br><br>2023年X月X日</p>', '/', {2025-05-23 00:00:00 +0000 UTC true}, {2025-05-23 00:00:00 +0000 UTC true}, '', '', '0001-01-01 00:00:00 +0000 UTC', '0001-01-01 00:00:00 +0000 UTC', 'active', 0, 0, {0001-01-01 00:00:00 +0000 UTC false}), error: Error 1292 (22007): Incorrect datetime value: '0000-00-00' for column 'created_time' at row 1","level":"error","span":"9aed83c75afe42a9","trace":"4497c3cfbb931fdfb0d03cab2ea5b665"}
{"@timestamp":"2025-05-15T15:45:59.205+08:00","caller":"result/httpResult.go:40","content":"【API-ERR】 : ErrCode:100005ErrMsg:数据库繁忙,请稍后再试\n创建通知失败, err: Error 1292 (22007): Incorrect datetime value: '0000-00-00' for column 'created_time' at row 1, req: &{Title:节日特惠 NotificationPage:/ Content:<p style=\"text-align: start;\">尊敬的顾客朋友:</p><p style=\"text-align: start;\">感谢您一直以来对【店铺/品牌名称】的支持!为回馈新老客户,我们特推出以下超值优惠活动:</p><p style=\"text-align: start;\"><strong>📅 活动时间</strong><br><br>2023年X月X日 - X月X日</p><p style=\"text-align: start;\"><strong>🎉 促销内容</strong><br><br>1<strong>全场商品低至5折</strong>​:指定商品享折上折,部分爆款限时秒杀!<br><br>2<strong>满减狂欢</strong>​:单笔消费满【金额】立减【金额】,多买多省!<br><br>3<strong>赠品福利</strong>​:消费满【金额】即赠【赠品名称】,数量有限,先到先得!<br><br>4<strong>会员专享</strong>注册成为会员额外领【XX元无门槛优惠券】</p><p style=\"text-align: start;\"><strong>📍 参与方式</strong><br><br>线下:到店选购,地址:【门店地址】<br><br>线上:进入【小程序/APP/网店名称】,搜索活动专区即可参与!</p><p style=\"text-align: start;\"><strong>📞 咨询方式</strong><br><br>电话【XXX-XXXXXXX】<br><br>客服微信:【微信号/二维码】</p><p style=\"text-align: start;\">**❗ 温馨提示**<br><br>• 活动仅限指定商品,不与其他优惠叠加。<br><br>• 赠品/优惠券数量有限,先到先得,用完即止。</p><p style=\"text-align: start;\"><strong>👉 速来抢购,错过再等一年!​</strong></p><p style=\"text-align: start;\">【店铺/品牌名称】<br><br>2023年X月X日</p> StartDate:2025-05-23 StartTime: EndDate:2025-05-23 EndTime: Status:active}\ntyc-server/app/main/api/internal/logic/admin_notification.(*AdminCreateNotificationLogic).AdminCreateNotification\n\tD:/Code/tyc-server/app/main/api/internal/logic/admin_notification/admincreatenotificationlogic.go:45\ntyc-server/app/main/api/internal/handler/admin_notification.AdminCreateNotificationHandler.func1\n\tD:/Code/tyc-server/app/main/api/internal/handler/admin_notification/admincreatenotificationhandler.go:26\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ntyc-server/app/main/api/internal/middleware/global.ReqHeaderCtxMiddleware.func1\n\tD:/Code/tyc-server/app/main/api/internal/middleware/global/reqHeaderCtxMiddleware.go:24\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.GunzipHandler.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/gunziphandler.go:26\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.MaxBytesHandler.func2.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/maxbyteshandler.go:24\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.MetricHandler.func1.1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/metrichandler.go:21\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.RecoverHandler.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/recoverhandler.go:21\nnet/http.HandlerFunc.ServeHTTP\n\tD:/Go/src/net/http/server.go:2220\ngithub.com/zeromicro/go-zero/rest/handler.(*timeoutHandler).ServeHTTP.func1\n\tD:/GoPath/pkg/mod/github.com/zeromicro/go-zero@v1.7.3/rest/handler/timeouthandler.go:86\nruntime.goexit\n\tD:/Go/src/runtime/asm_amd64.s:1700 ","level":"error","span":"0404912b66efc809","trace":"4497c3cfbb931fdfb0d03cab2ea5b665"}

View File

View File

@ -0,0 +1,7 @@
{"@timestamp":"2025-05-13T14:31:55.084+08:00","caller":"handler/loghandler.go:131","content":"[HTTP] 200 - POST /api/v1/admin/order/refund/71 - [::1]:61204 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 - slowcall(500.6ms)","duration":"500.6ms","level":"slow","span":"9a72009ad3e58f79","trace":"8b13d8216f560059f537fdc6220acfaa"}
{"@timestamp":"2025-05-13T14:44:55.105+08:00","caller":"handler/loghandler.go:131","content":"[HTTP] 200 - POST /api/v1/admin/order/refund/71 - [::1]:63669 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 - slowcall(1216.3ms)","duration":"1216.3ms","level":"slow","span":"e2f43b44d0c7e18c","trace":"39dba17b09053137576465344d148d8c"}
{"@timestamp":"2025-05-13T14:48:32.909+08:00","caller":"handler/loghandler.go:131","content":"[HTTP] 200 - POST /api/v1/admin/order/refund/72 - [::1]:64320 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 - slowcall(1367.8ms)","duration":"1367.8ms","level":"slow","span":"8852637ff26e229c","trace":"6175ff3a33388b09d8f8ac904f3f8735"}
{"@timestamp":"2025-05-13T14:54:47.148+08:00","caller":"handler/loghandler.go:131","content":"[HTTP] 503 - POST /api/v1/admin/order/refund/73 - [::1]:65232 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 - slowcall(22225.1ms)","duration":"22225.1ms","level":"slow","span":"56f994acf11f4947","trace":"ec66934967ca81a2c4f22b64f4f8daa8"}
{"@timestamp":"2025-05-13T14:59:26.548+08:00","caller":"handler/loghandler.go:131","content":"[HTTP] 200 - POST /api/v1/admin/order/refund/74 - [::1]:50813 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 - slowcall(1326.7ms)","duration":"1326.7ms","level":"slow","span":"760e1882583f08e6","trace":"bb4ad1ceac0185e5b7004c66f3e876d6"}
{"@timestamp":"2025-05-15T15:28:19.393+08:00","caller":"handler/loghandler.go:131","content":"[HTTP] 503 - PUT /api/v1/admin/notification/update/3 - [::1]:56840 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 - slowcall(125335.6ms)","duration":"125335.6ms","level":"slow","span":"a3d736f56bf9b9e0","trace":"5f7d45910180fc01355d02ccef655bb8"}
{"@timestamp":"2025-05-15T15:45:03.683+08:00","caller":"handler/loghandler.go:131","content":"[HTTP] 503 - PUT /api/v1/admin/notification/update/3 - [::1]:64584 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 - slowcall(26595.8ms)","duration":"26595.8ms","level":"slow","span":"65102f377c6dbb0b","trace":"3b9ed793f0302dc36de6a96d7f269ec3"}

1061
app/main/api/logs/stat.log Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

1
app/main/api/main.api Normal file
View File

@ -0,0 +1 @@
import "desc/admin/notification.api"

Some files were not shown because too many files have changed in this diff Show More