From 32f21d85554f70101b3a00b7774bc26493c983c0 Mon Sep 17 00:00:00 2001 From: feitianbubu Date: Tue, 30 Sep 2025 12:44:22 +0800 Subject: [PATCH 01/28] feat: add check for existing file key before upload --- server/service/example/exa_file_upload_download.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/server/service/example/exa_file_upload_download.go b/server/service/example/exa_file_upload_download.go index c5519fc0..536734ee 100644 --- a/server/service/example/exa_file_upload_download.go +++ b/server/service/example/exa_file_upload_download.go @@ -9,6 +9,7 @@ import ( "github.com/flipped-aurora/gin-vue-admin/server/model/example" "github.com/flipped-aurora/gin-vue-admin/server/model/example/request" "github.com/flipped-aurora/gin-vue-admin/server/utils/upload" + "gorm.io/gorm" ) //@author: [piexlmax](https://github.com/piexlmax) @@ -107,7 +108,13 @@ func (e *FileUploadAndDownloadService) UploadFile(header *multipart.FileHeader, Key: key, } if noSave == "0" { - return f, e.Upload(f) + // 检查是否已存在相同key的记录 + var existingFile example.ExaFileUploadAndDownload + err = global.GVA_DB.Where("`key` = ?", key).First(&existingFile).Error + if errors.Is(err, gorm.ErrRecordNotFound) { + return f, e.Upload(f) + } + return f, err } return f, nil } From b9009bbd482ef7e594e05fe382d6127cc89f076f Mon Sep 17 00:00:00 2001 From: wangyazhou <564631192@qq.com> Date: Tue, 28 Oct 2025 15:14:26 +0800 Subject: [PATCH 02/28] =?UTF-8?q?fix(jwt):=E4=BF=AE=E6=AD=A3=E4=BB=A4?= =?UTF-8?q?=E7=89=8C=E8=BF=87=E6=9C=9F=E6=97=B6=E9=97=B4=E8=AE=A1=E7=AE=97?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 调整了SetToken函数中的过期时间单位,从秒转换为分钟 - 确保新令牌的过期时间与配置保持一致- 修复了因时间单位不匹配导致的令牌提前失效问题 --- server/middleware/jwt.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/server/middleware/jwt.go b/server/middleware/jwt.go index 7715ed9c..f4c02962 100644 --- a/server/middleware/jwt.go +++ b/server/middleware/jwt.go @@ -2,11 +2,12 @@ package middleware import ( "errors" + "strconv" + "time" + "github.com/flipped-aurora/gin-vue-admin/server/global" "github.com/flipped-aurora/gin-vue-admin/server/utils" "github.com/golang-jwt/jwt/v5" - "strconv" - "time" "github.com/flipped-aurora/gin-vue-admin/server/model/common/response" "github.com/gin-gonic/gin" @@ -59,7 +60,7 @@ func JWTAuth() gin.HandlerFunc { newClaims, _ := j.ParseToken(newToken) c.Header("new-token", newToken) c.Header("new-expires-at", strconv.FormatInt(newClaims.ExpiresAt.Unix(), 10)) - utils.SetToken(c, newToken, int(dr.Seconds())) + utils.SetToken(c, newToken, int(dr.Seconds()/60)) if global.GVA_CONFIG.System.UseMultipoint { // 记录新的活跃jwt _ = utils.SetRedisJWT(newToken, newClaims.Username) From d36eeb5134f099e6822c64cd458312c4ece8e25f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?piexlMax=28=E5=A5=87=E6=B7=BC?= Date: Tue, 28 Oct 2025 16:19:25 +0800 Subject: [PATCH 03/28] =?UTF-8?q?feat(=E9=94=99=E8=AF=AF=E6=97=A5=E5=BF=97?= =?UTF-8?q?):=20=E5=AE=9E=E7=8E=B0=E5=89=8D=E5=90=8E=E7=AB=AF=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E6=97=A5=E5=BF=97=E6=94=B6=E9=9B=86=E4=B8=8E=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/api/v1/system/enter.go | 2 + server/api/v1/system/sys_error.go | 169 ++++++++ server/initialize/gorm.go | 1 + server/initialize/router.go | 1 + server/model/system/request/sys_error.go | 14 + server/model/system/sys_error.go | 20 + server/router/system/enter.go | 2 + server/router/system/sys_error.go | 27 ++ server/service/system/enter.go | 1 + server/service/system/sys_error.go | 77 ++++ web/src/api/system/sysError.js | 110 +++++ web/src/core/error-handel.js | 65 +-- web/src/main.js | 5 +- web/src/pinia/modules/user.js | 1 - .../view/systemTools/sysError/sysError.vue | 378 ++++++++++++++++++ 15 files changed, 822 insertions(+), 51 deletions(-) create mode 100644 server/api/v1/system/sys_error.go create mode 100644 server/model/system/request/sys_error.go create mode 100644 server/model/system/sys_error.go create mode 100644 server/router/system/sys_error.go create mode 100644 server/service/system/sys_error.go create mode 100644 web/src/api/system/sysError.js create mode 100644 web/src/view/systemTools/sysError/sysError.vue diff --git a/server/api/v1/system/enter.go b/server/api/v1/system/enter.go index dbc721b1..d8d226d0 100644 --- a/server/api/v1/system/enter.go +++ b/server/api/v1/system/enter.go @@ -23,6 +23,7 @@ type ApiGroup struct { AutoCodeTemplateApi SysParamsApi SysVersionApi + SysErrorApi } var ( @@ -46,4 +47,5 @@ var ( autoCodeHistoryService = service.ServiceGroupApp.SystemServiceGroup.AutoCodeHistory autoCodeTemplateService = service.ServiceGroupApp.SystemServiceGroup.AutoCodeTemplate sysVersionService = service.ServiceGroupApp.SystemServiceGroup.SysVersionService + sysErrprService = service.ServiceGroupApp.SystemServiceGroup.SysErrorService ) diff --git a/server/api/v1/system/sys_error.go b/server/api/v1/system/sys_error.go new file mode 100644 index 00000000..3744bc05 --- /dev/null +++ b/server/api/v1/system/sys_error.go @@ -0,0 +1,169 @@ +package system + +import ( + "github.com/flipped-aurora/gin-vue-admin/server/global" + "github.com/flipped-aurora/gin-vue-admin/server/model/common/response" + "github.com/flipped-aurora/gin-vue-admin/server/model/system" + systemReq "github.com/flipped-aurora/gin-vue-admin/server/model/system/request" + "github.com/gin-gonic/gin" + "go.uber.org/zap" +) + +type SysErrorApi struct{} + +// CreateSysError 创建错误日志 +// @Tags SysError +// @Summary 创建错误日志 +// @Security ApiKeyAuth +// @Accept application/json +// @Produce application/json +// @Param data body system.SysError true "创建错误日志" +// @Success 200 {object} response.Response{msg=string} "创建成功" +// @Router /sysErrpr/createSysError [post] +func (sysErrprApi *SysErrorApi) CreateSysError(c *gin.Context) { + // 创建业务用Context + ctx := c.Request.Context() + + var sysErrpr system.SysError + err := c.ShouldBindJSON(&sysErrpr) + if err != nil { + response.FailWithMessage(err.Error(), c) + return + } + err = sysErrprService.CreateSysError(ctx, &sysErrpr) + if err != nil { + global.GVA_LOG.Error("创建失败!", zap.Error(err)) + response.FailWithMessage("创建失败:"+err.Error(), c) + return + } + response.OkWithMessage("创建成功", c) +} + +// DeleteSysError 删除错误日志 +// @Tags SysError +// @Summary 删除错误日志 +// @Security ApiKeyAuth +// @Accept application/json +// @Produce application/json +// @Param data body system.SysError true "删除错误日志" +// @Success 200 {object} response.Response{msg=string} "删除成功" +// @Router /sysErrpr/deleteSysError [delete] +func (sysErrprApi *SysErrorApi) DeleteSysError(c *gin.Context) { + // 创建业务用Context + ctx := c.Request.Context() + + ID := c.Query("ID") + err := sysErrprService.DeleteSysError(ctx, ID) + if err != nil { + global.GVA_LOG.Error("删除失败!", zap.Error(err)) + response.FailWithMessage("删除失败:"+err.Error(), c) + return + } + response.OkWithMessage("删除成功", c) +} + +// DeleteSysErrorByIds 批量删除错误日志 +// @Tags SysError +// @Summary 批量删除错误日志 +// @Security ApiKeyAuth +// @Accept application/json +// @Produce application/json +// @Success 200 {object} response.Response{msg=string} "批量删除成功" +// @Router /sysErrpr/deleteSysErrorByIds [delete] +func (sysErrprApi *SysErrorApi) DeleteSysErrorByIds(c *gin.Context) { + // 创建业务用Context + ctx := c.Request.Context() + + IDs := c.QueryArray("IDs[]") + err := sysErrprService.DeleteSysErrorByIds(ctx, IDs) + if err != nil { + global.GVA_LOG.Error("批量删除失败!", zap.Error(err)) + response.FailWithMessage("批量删除失败:"+err.Error(), c) + return + } + response.OkWithMessage("批量删除成功", c) +} + +// UpdateSysError 更新错误日志 +// @Tags SysError +// @Summary 更新错误日志 +// @Security ApiKeyAuth +// @Accept application/json +// @Produce application/json +// @Param data body system.SysError true "更新错误日志" +// @Success 200 {object} response.Response{msg=string} "更新成功" +// @Router /sysErrpr/updateSysError [put] +func (sysErrprApi *SysErrorApi) UpdateSysError(c *gin.Context) { + // 从ctx获取标准context进行业务行为 + ctx := c.Request.Context() + + var sysErrpr system.SysError + err := c.ShouldBindJSON(&sysErrpr) + if err != nil { + response.FailWithMessage(err.Error(), c) + return + } + err = sysErrprService.UpdateSysError(ctx, sysErrpr) + if err != nil { + global.GVA_LOG.Error("更新失败!", zap.Error(err)) + response.FailWithMessage("更新失败:"+err.Error(), c) + return + } + response.OkWithMessage("更新成功", c) +} + +// FindSysError 用id查询错误日志 +// @Tags SysError +// @Summary 用id查询错误日志 +// @Security ApiKeyAuth +// @Accept application/json +// @Produce application/json +// @Param ID query uint true "用id查询错误日志" +// @Success 200 {object} response.Response{data=system.SysError,msg=string} "查询成功" +// @Router /sysErrpr/findSysError [get] +func (sysErrprApi *SysErrorApi) FindSysError(c *gin.Context) { + // 创建业务用Context + ctx := c.Request.Context() + + ID := c.Query("ID") + resysErrpr, err := sysErrprService.GetSysError(ctx, ID) + if err != nil { + global.GVA_LOG.Error("查询失败!", zap.Error(err)) + response.FailWithMessage("查询失败:"+err.Error(), c) + return + } + response.OkWithData(resysErrpr, c) +} + +// GetSysErrorList 分页获取错误日志列表 +// @Tags SysError +// @Summary 分页获取错误日志列表 +// @Security ApiKeyAuth +// @Accept application/json +// @Produce application/json +// @Param data query systemReq.SysErrorSearch true "分页获取错误日志列表" +// @Success 200 {object} response.Response{data=response.PageResult,msg=string} "获取成功" +// @Router /sysErrpr/getSysErrorList [get] +func (sysErrprApi *SysErrorApi) GetSysErrorList(c *gin.Context) { + // 创建业务用Context + ctx := c.Request.Context() + + var pageInfo systemReq.SysErrorSearch + err := c.ShouldBindQuery(&pageInfo) + if err != nil { + response.FailWithMessage(err.Error(), c) + return + } + list, total, err := sysErrprService.GetSysErrorInfoList(ctx, pageInfo) + if err != nil { + global.GVA_LOG.Error("获取失败!", zap.Error(err)) + response.FailWithMessage("获取失败:"+err.Error(), c) + return + } + response.OkWithDetailed(response.PageResult{ + List: list, + Total: total, + Page: pageInfo.Page, + PageSize: pageInfo.PageSize, + }, "获取成功", c) +} diff --git a/server/initialize/gorm.go b/server/initialize/gorm.go index 2aacb84a..d044580e 100644 --- a/server/initialize/gorm.go +++ b/server/initialize/gorm.go @@ -62,6 +62,7 @@ func RegisterTables() { system.JoinTemplate{}, system.SysParams{}, system.SysVersion{}, + system.SysError{}, example.ExaFile{}, example.ExaCustomer{}, diff --git a/server/initialize/router.go b/server/initialize/router.go index d297df87..4da500af 100644 --- a/server/initialize/router.go +++ b/server/initialize/router.go @@ -107,6 +107,7 @@ func Routers() *gin.Engine { systemRouter.InitAuthorityBtnRouterRouter(PrivateGroup) // 按钮权限管理 systemRouter.InitSysExportTemplateRouter(PrivateGroup, PublicGroup) // 导出模板 systemRouter.InitSysParamsRouter(PrivateGroup, PublicGroup) // 参数管理 + systemRouter.InitSysErrorRouter(PrivateGroup, PublicGroup) // 错误日志 exampleRouter.InitCustomerRouter(PrivateGroup) // 客户路由 exampleRouter.InitFileUploadAndDownloadRouter(PrivateGroup) // 文件上传下载功能路由 exampleRouter.InitAttachmentCategoryRouterRouter(PrivateGroup) // 文件上传下载分类 diff --git a/server/model/system/request/sys_error.go b/server/model/system/request/sys_error.go new file mode 100644 index 00000000..ca1044d9 --- /dev/null +++ b/server/model/system/request/sys_error.go @@ -0,0 +1,14 @@ + +package request + +import ( + "github.com/flipped-aurora/gin-vue-admin/server/model/common/request" + "time" +) + +type SysErrorSearch struct{ + CreatedAtRange []time.Time `json:"createdAtRange" form:"createdAtRange[]"` + Form *string `json:"form" form:"form"` + Info *string `json:"info" form:"info"` + request.PageInfo +} diff --git a/server/model/system/sys_error.go b/server/model/system/sys_error.go new file mode 100644 index 00000000..191a3153 --- /dev/null +++ b/server/model/system/sys_error.go @@ -0,0 +1,20 @@ +// 自动生成模板SysError +package system + +import ( + "github.com/flipped-aurora/gin-vue-admin/server/global" +) + +// 错误日志 结构体 SysError +type SysError struct { + global.GVA_MODEL + Form *string `json:"form" form:"form" gorm:"comment:错误来源;column:form;type:text;" binding:"required"` //错误来源 + Info *string `json:"info" form:"info" gorm:"comment:错误内容;column:info;type:text;"` //错误内容 + Level string `json:"level" form:"level" gorm:"comment:日志等级;column:level;"` + Solution *string `json:"solution" form:"solution" gorm:"comment:解决方案;column:solution;"` //解决方案 +} + +// TableName 错误日志 SysError自定义表名 sys_error +func (SysError) TableName() string { + return "sys_error" +} diff --git a/server/router/system/enter.go b/server/router/system/enter.go index a0a23f54..79203425 100644 --- a/server/router/system/enter.go +++ b/server/router/system/enter.go @@ -20,6 +20,7 @@ type RouterGroup struct { SysExportTemplateRouter SysParamsRouter SysVersionRouter + SysErrorRouter } var ( @@ -43,4 +44,5 @@ var ( autoCodeTemplateApi = api.ApiGroupApp.SystemApiGroup.AutoCodeTemplateApi exportTemplateApi = api.ApiGroupApp.SystemApiGroup.SysExportTemplateApi sysVersionApi = api.ApiGroupApp.SystemApiGroup.SysVersionApi + sysErrprApi = api.ApiGroupApp.SystemApiGroup.SysErrorApi ) diff --git a/server/router/system/sys_error.go b/server/router/system/sys_error.go new file mode 100644 index 00000000..32665ec8 --- /dev/null +++ b/server/router/system/sys_error.go @@ -0,0 +1,27 @@ +package system + +import ( + "github.com/flipped-aurora/gin-vue-admin/server/middleware" + "github.com/gin-gonic/gin" +) + +type SysErrorRouter struct{} + +// InitSysErrorRouter 初始化 错误日志 路由信息 +func (s *SysErrorRouter) InitSysErrorRouter(Router *gin.RouterGroup, PublicRouter *gin.RouterGroup) { + sysErrprRouter := Router.Group("sysErrpr").Use(middleware.OperationRecord()) + sysErrprRouterWithoutRecord := Router.Group("sysErrpr") + sysErrprRouterWithoutAuth := PublicRouter.Group("sysErrpr") + { + sysErrprRouter.DELETE("deleteSysError", sysErrprApi.DeleteSysError) // 删除错误日志 + sysErrprRouter.DELETE("deleteSysErrorByIds", sysErrprApi.DeleteSysErrorByIds) // 批量删除错误日志 + sysErrprRouter.PUT("updateSysError", sysErrprApi.UpdateSysError) // 更新错误日志 + } + { + sysErrprRouterWithoutRecord.GET("findSysError", sysErrprApi.FindSysError) // 根据ID获取错误日志 + sysErrprRouterWithoutRecord.GET("getSysErrorList", sysErrprApi.GetSysErrorList) // 获取错误日志列表 + } + { + sysErrprRouterWithoutAuth.POST("createSysError", sysErrprApi.CreateSysError) // 新建错误日志 + } +} diff --git a/server/service/system/enter.go b/server/service/system/enter.go index d91f2796..f09123cf 100644 --- a/server/service/system/enter.go +++ b/server/service/system/enter.go @@ -22,4 +22,5 @@ type ServiceGroup struct { AutoCodePackage autoCodePackage AutoCodeHistory autoCodeHistory AutoCodeTemplate autoCodeTemplate + SysErrorService } diff --git a/server/service/system/sys_error.go b/server/service/system/sys_error.go new file mode 100644 index 00000000..87d872f7 --- /dev/null +++ b/server/service/system/sys_error.go @@ -0,0 +1,77 @@ +package system + +import ( + "context" + "github.com/flipped-aurora/gin-vue-admin/server/global" + "github.com/flipped-aurora/gin-vue-admin/server/model/system" + systemReq "github.com/flipped-aurora/gin-vue-admin/server/model/system/request" +) + +type SysErrorService struct{} + +// CreateSysError 创建错误日志记录 +// Author [yourname](https://github.com/yourname) +func (sysErrprService *SysErrorService) CreateSysError(ctx context.Context, sysErrpr *system.SysError) (err error) { + err = global.GVA_DB.Create(sysErrpr).Error + return err +} + +// DeleteSysError 删除错误日志记录 +// Author [yourname](https://github.com/yourname) +func (sysErrprService *SysErrorService) DeleteSysError(ctx context.Context, ID string) (err error) { + err = global.GVA_DB.Delete(&system.SysError{}, "id = ?", ID).Error + return err +} + +// DeleteSysErrorByIds 批量删除错误日志记录 +// Author [yourname](https://github.com/yourname) +func (sysErrprService *SysErrorService) DeleteSysErrorByIds(ctx context.Context, IDs []string) (err error) { + err = global.GVA_DB.Delete(&[]system.SysError{}, "id in ?", IDs).Error + return err +} + +// UpdateSysError 更新错误日志记录 +// Author [yourname](https://github.com/yourname) +func (sysErrprService *SysErrorService) UpdateSysError(ctx context.Context, sysErrpr system.SysError) (err error) { + err = global.GVA_DB.Model(&system.SysError{}).Where("id = ?", sysErrpr.ID).Updates(&sysErrpr).Error + return err +} + +// GetSysError 根据ID获取错误日志记录 +// Author [yourname](https://github.com/yourname) +func (sysErrprService *SysErrorService) GetSysError(ctx context.Context, ID string) (sysErrpr system.SysError, err error) { + err = global.GVA_DB.Where("id = ?", ID).First(&sysErrpr).Error + return +} + +// GetSysErrorInfoList 分页获取错误日志记录 +// Author [yourname](https://github.com/yourname) +func (sysErrprService *SysErrorService) GetSysErrorInfoList(ctx context.Context, info systemReq.SysErrorSearch) (list []system.SysError, total int64, err error) { + limit := info.PageSize + offset := info.PageSize * (info.Page - 1) + // 创建db + db := global.GVA_DB.Model(&system.SysError{}).Order("created desc") + var sysErrprs []system.SysError + // 如果有条件搜索 下方会自动创建搜索语句 + if len(info.CreatedAtRange) == 2 { + db = db.Where("created_at BETWEEN ? AND ?", info.CreatedAtRange[0], info.CreatedAtRange[1]) + } + + if info.Form != nil && *info.Form != "" { + db = db.Where("form = ?", *info.Form) + } + if info.Info != nil && *info.Info != "" { + db = db.Where("info LIKE ?", "%"+*info.Info+"%") + } + err = db.Count(&total).Error + if err != nil { + return + } + + if limit != 0 { + db = db.Limit(limit).Offset(offset) + } + + err = db.Find(&sysErrprs).Error + return sysErrprs, total, err +} diff --git a/web/src/api/system/sysError.js b/web/src/api/system/sysError.js new file mode 100644 index 00000000..2c7a2d36 --- /dev/null +++ b/web/src/api/system/sysError.js @@ -0,0 +1,110 @@ +import service from '@/utils/request' +// @Tags SysError +// @Summary 创建错误日志 +// @Security ApiKeyAuth +// @Accept application/json +// @Produce application/json +// @Param data body model.SysError true "创建错误日志" +// @Success 200 {string} string "{"success":true,"data":{},"msg":"创建成功"}" +// @Router /sysErrpr/createSysError [post] +export const createSysError = (data) => { + return service({ + url: '/sysErrpr/createSysError', + method: 'post', + data + }) +} + +// @Tags SysError +// @Summary 删除错误日志 +// @Security ApiKeyAuth +// @Accept application/json +// @Produce application/json +// @Param data body model.SysError true "删除错误日志" +// @Success 200 {string} string "{"success":true,"data":{},"msg":"删除成功"}" +// @Router /sysErrpr/deleteSysError [delete] +export const deleteSysError = (params) => { + return service({ + url: '/sysErrpr/deleteSysError', + method: 'delete', + params + }) +} + +// @Tags SysError +// @Summary 批量删除错误日志 +// @Security ApiKeyAuth +// @Accept application/json +// @Produce application/json +// @Param data body request.IdsReq true "批量删除错误日志" +// @Success 200 {string} string "{"success":true,"data":{},"msg":"删除成功"}" +// @Router /sysErrpr/deleteSysError [delete] +export const deleteSysErrorByIds = (params) => { + return service({ + url: '/sysErrpr/deleteSysErrorByIds', + method: 'delete', + params + }) +} + +// @Tags SysError +// @Summary 更新错误日志 +// @Security ApiKeyAuth +// @Accept application/json +// @Produce application/json +// @Param data body model.SysError true "更新错误日志" +// @Success 200 {string} string "{"success":true,"data":{},"msg":"更新成功"}" +// @Router /sysErrpr/updateSysError [put] +export const updateSysError = (data) => { + return service({ + url: '/sysErrpr/updateSysError', + method: 'put', + data + }) +} + +// @Tags SysError +// @Summary 用id查询错误日志 +// @Security ApiKeyAuth +// @Accept application/json +// @Produce application/json +// @Param data query model.SysError true "用id查询错误日志" +// @Success 200 {string} string "{"success":true,"data":{},"msg":"查询成功"}" +// @Router /sysErrpr/findSysError [get] +export const findSysError = (params) => { + return service({ + url: '/sysErrpr/findSysError', + method: 'get', + params + }) +} + +// @Tags SysError +// @Summary 分页获取错误日志列表 +// @Security ApiKeyAuth +// @Accept application/json +// @Produce application/json +// @Param data query request.PageInfo true "分页获取错误日志列表" +// @Success 200 {string} string "{"success":true,"data":{},"msg":"获取成功"}" +// @Router /sysErrpr/getSysErrorList [get] +export const getSysErrorList = (params) => { + return service({ + url: '/sysErrpr/getSysErrorList', + method: 'get', + params + }) +} + +// @Tags SysError +// @Summary 不需要鉴权的错误日志接口 +// @Accept application/json +// @Produce application/json +// @Param data query systemReq.SysErrorSearch true "分页获取错误日志列表" +// @Success 200 {object} response.Response{data=object,msg=string} "获取成功" +// @Router /sysErrpr/getSysErrorPublic [get] +export const getSysErrorPublic = () => { + return service({ + url: '/sysErrpr/getSysErrorPublic', + method: 'get', + }) +} diff --git a/web/src/core/error-handel.js b/web/src/core/error-handel.js index 9c06e953..b1e06fa3 100644 --- a/web/src/core/error-handel.js +++ b/web/src/core/error-handel.js @@ -1,51 +1,24 @@ +import { createSysError } from '@/api/system/sysError' + function sendErrorTip(errorInfo) { - console.groupCollapsed(`捕获到错误: ${errorInfo.type}`); - console.log('错误类型:', errorInfo.type); - console.log('错误信息:', errorInfo.message); - console.log('调用栈:', errorInfo.stack); - if (errorInfo.component) { - console.log('组件名:', errorInfo.component.name) - console.log('组件地址:', errorInfo.component.__file) - } - if (errorInfo.vueInfo) console.log('Vue 信息:', errorInfo.vueInfo); - if (errorInfo.source) console.log('来源文件:', errorInfo.source); - if (errorInfo.lineno) console.log('行号:', errorInfo.lineno); - if (errorInfo.colno) console.log('列号:', errorInfo.colno); - console.groupEnd(); + setTimeout(() => { + const errorData = { + form: errorInfo.type, + info: `${errorInfo.message}\nStack: ${errorInfo.stack}${errorInfo.component ? `\nComponent: ${errorInfo.component.name || 'Unknown'}` : ''}${errorInfo.vueInfo ? `\nVue Info: ${errorInfo.vueInfo}` : ''}${errorInfo.source ? `\nSource: ${errorInfo.source}:${errorInfo.lineno}:${errorInfo.colno}` : ''}`, + level: 'error', + solution: null + } + + createSysError(errorData).catch(apiErr => { + console.error('Failed to create error record:', apiErr) + }) + }, 0) } - -function initVueErrorHandler(app) { - app.config.errorHandler = (err, vm, info) => { - let errorType = 'Vue Error'; + window.addEventListener('unhandledrejection', (event) => { sendErrorTip({ - type: errorType, - message: err.message, - stack: err.stack, - component: vm.$options || 'Unknown Vue Component', - vueInfo: info + type: 'Frontend', + message: `错误信息: ${event.reason}`, + stack: `调用栈: ${event.reason?.stack || '没有调用栈信息'}`, }); - }; -} - -function initJsErrorHandler() { - window.onerror = (message, source, lineno, colno, error) => { - let errorType = 'JS Error'; - - sendErrorTip({ - type: errorType, - message: message, - stack: error ? error.stack : 'No stack available', - source: source, - lineno: lineno, - colno: colno - }); - - return false; - }; -} - -export function initErrorHandler(app) { - initVueErrorHandler(app) - initJsErrorHandler() -} + }); diff --git a/web/src/main.js b/web/src/main.js index 107fa680..5855b570 100644 --- a/web/src/main.js +++ b/web/src/main.js @@ -15,13 +15,10 @@ import auth from '@/directive/auth' import clickOutSide from '@/directive/clickOutSide' import { store } from '@/pinia' import App from './App.vue' -// import { initErrorHandler } from '@/core/error-handel' - +import '@/core/error-handel' const app = createApp(App) -// 注入错误处理捕获 -// initErrorHandler(app) app.config.productionTip = false app diff --git a/web/src/pinia/modules/user.js b/web/src/pinia/modules/user.js index 5b1f55c7..974e85ec 100644 --- a/web/src/pinia/modules/user.js +++ b/web/src/pinia/modules/user.js @@ -33,7 +33,6 @@ export const useUserStore = defineStore('user', () => { } }) } - console.log(appStore.config) } const setToken = (val) => { diff --git a/web/src/view/systemTools/sysError/sysError.vue b/web/src/view/systemTools/sysError/sysError.vue new file mode 100644 index 00000000..fd218d38 --- /dev/null +++ b/web/src/view/systemTools/sysError/sysError.vue @@ -0,0 +1,378 @@ + + + + + From d5befa19003c9076610a12fe5b479ce57b0cc7d7 Mon Sep 17 00:00:00 2001 From: Azir-11 <2075125282@qq.com> Date: Mon, 3 Nov 2025 02:13:58 +0800 Subject: [PATCH 04/28] =?UTF-8?q?style(=E7=89=88=E6=9C=AC=E7=AE=A1?= =?UTF-8?q?=E7=90=86):=20=E4=BC=98=E5=8C=96=E5=AF=BC=E5=87=BA=E5=92=8C?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=E7=89=88=E6=9C=AC=E6=8A=BD=E5=B1=89=E7=9A=84?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=EF=BC=8C=E6=94=AF=E6=8C=81=E6=9A=97=E8=89=B2?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/view/systemTools/version/version.vue | 175 ++++++++++--------- 1 file changed, 91 insertions(+), 84 deletions(-) diff --git a/web/src/view/systemTools/version/version.vue b/web/src/view/systemTools/version/version.vue index 6f483826..f61d1d29 100644 --- a/web/src/view/systemTools/version/version.vue +++ b/web/src/view/systemTools/version/version.vue @@ -96,7 +96,8 @@ - +