From 199fc180b7677906c02caa20408f5b5a14e90bf0 Mon Sep 17 00:00:00 2001 From: zhangwenjian Date: Tue, 27 Oct 2020 11:38:49 +0800 Subject: [PATCH] =?UTF-8?q?refactor=F0=9F=8E=A8=20=20:=20=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E7=99=BB=E5=BD=95=E6=97=A5=E5=BF=97=E5=92=8C=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=E6=97=A5=E5=BF=97=E4=BB=A3=E7=A0=81=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/admin/apis/log/loginlog.go | 134 ------- app/admin/apis/log/operlog.go | 113 ------ .../system/sys_login_log/sys_login_log.go | 192 ++++++++++ .../system/sys_opera_log/sys_opera_log.go | 192 ++++++++++ app/admin/middleware/handler/auth.go | 12 +- app/admin/middleware/logger.go | 55 +-- app/admin/models/loginlog.go | 105 ------ app/admin/models/operlog.go | 116 ------ app/admin/models/system/sys_login_log.go | 38 ++ app/admin/models/system/sys_opera_log.go | 46 +++ app/admin/router/sys_login_log.go | 25 ++ app/admin/router/sys_opera_log.go | 25 ++ app/admin/router/sysrouter.go | 24 -- app/admin/service/dto/sys_login_log.go | 110 ++++++ app/admin/service/dto/sys_opera_log.go | 124 +++++++ app/admin/service/sys_login_log.go | 110 ++++++ app/admin/service/sys_opera_log.go | 110 ++++++ .../migration/version/1599190683659_tables.go | 4 +- .../version/1599190683670_migrate.go | 16 +- .../version/1603465014697_migrate.go | 28 ++ .../version/1603516925109_migrate.go | 41 +++ go-admin-ui/src/api/syscategory.js | 47 --- go-admin-ui/src/views/syscategory/index.vue | 329 ------------------ 23 files changed, 1081 insertions(+), 915 deletions(-) delete mode 100644 app/admin/apis/log/loginlog.go delete mode 100644 app/admin/apis/log/operlog.go create mode 100644 app/admin/apis/system/sys_login_log/sys_login_log.go create mode 100644 app/admin/apis/system/sys_opera_log/sys_opera_log.go delete mode 100644 app/admin/models/loginlog.go delete mode 100644 app/admin/models/operlog.go create mode 100644 app/admin/models/system/sys_login_log.go create mode 100644 app/admin/models/system/sys_opera_log.go create mode 100644 app/admin/router/sys_login_log.go create mode 100644 app/admin/router/sys_opera_log.go create mode 100644 app/admin/service/dto/sys_login_log.go create mode 100644 app/admin/service/dto/sys_opera_log.go create mode 100644 app/admin/service/sys_login_log.go create mode 100644 app/admin/service/sys_opera_log.go create mode 100644 cmd/migrate/migration/version/1603465014697_migrate.go create mode 100644 cmd/migrate/migration/version/1603516925109_migrate.go delete mode 100644 go-admin-ui/src/api/syscategory.js delete mode 100644 go-admin-ui/src/views/syscategory/index.vue diff --git a/app/admin/apis/log/loginlog.go b/app/admin/apis/log/loginlog.go deleted file mode 100644 index 6f36f402..00000000 --- a/app/admin/apis/log/loginlog.go +++ /dev/null @@ -1,134 +0,0 @@ -package log - -import ( - "net/http" - - "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" - - "go-admin/app/admin/models" - "go-admin/tools" - "go-admin/tools/app" -) - -// @Summary 登录日志列表 -// @Description 获取JSON -// @Tags 登录日志 -// @Param status query string false "status" -// @Param dictCode query string false "dictCode" -// @Param dictType query string false "dictType" -// @Param pageSize query int false "页条数" -// @Param pageIndex query int false "页码" -// @Success 200 {object} app.Response "{"code": 200, "data": [...]}" -// @Router /api/v1/loginloglist [get] -// @Security Bearer -func GetLoginLogList(c *gin.Context) { - var data models.LoginLog - var err error - var pageSize = 10 - var pageIndex = 1 - - size := c.Request.FormValue("pageSize") - if size != "" { - pageSize, err = tools.StringToInt(size) - } - - index := c.Request.FormValue("pageIndex") - if index != "" { - pageIndex, err = tools.StringToInt(index) - } - - data.Username = c.Request.FormValue("username") - data.Status = c.Request.FormValue("status") - data.Ipaddr = c.Request.FormValue("ipaddr") - result, count, err := data.GetPage(pageSize, pageIndex) - tools.HasError(err, "", -1) - - var mp = make(map[string]interface{}, 3) - mp["list"] = result - mp["count"] = count - mp["pageIndex"] = pageIndex - mp["pageSize"] = pageSize - - var res app.Response - res.Data = mp - c.JSON(http.StatusOK, res.ReturnOK()) -} - -// @Summary 通过编码获取登录日志 -// @Description 获取JSON -// @Tags 登录日志 -// @Param infoId path int true "infoId" -// @Success 200 {object} app.Response "{"code": 200, "data": [...]}" -// @Router /api/v1/loginlog/{infoId} [get] -// @Security Bearer -func GetLoginLog(c *gin.Context) { - var LoginLog models.LoginLog - LoginLog.InfoId, _ = tools.StringToInt(c.Param("infoId")) - result, err := LoginLog.Get() - tools.HasError(err, "抱歉未找到相关信息", -1) - - var res app.Response - res.Data = result - c.JSON(http.StatusOK, res.ReturnOK()) -} - -// @Summary 添加登录日志 -// @Description 获取JSON -// @Tags 登录日志 -// @Accept application/json -// @Product application/json -// @Param data body models.LoginLog true "data" -// @Success 200 {string} string "{"code": 200, "message": "添加成功"}" -// @Success 200 {string} string "{"code": -1, "message": "添加失败"}" -// @Router /api/v1/loginlog [post] -// @Security Bearer -func InsertLoginLog(c *gin.Context) { - var data models.LoginLog - err := c.BindWith(&data, binding.JSON) - tools.HasError(err, "", 500) - result, err := data.Create() - tools.HasError(err, "", -1) - var res app.Response - res.Data = result - c.JSON(http.StatusOK, res.ReturnOK()) -} - -// @Summary 修改登录日志 -// @Description 获取JSON -// @Tags 登录日志 -// @Accept application/json -// @Product application/json -// @Param data body models.LoginLog true "body" -// @Success 200 {string} string "{"code": 200, "message": "添加成功"}" -// @Success 200 {string} string "{"code": -1, "message": "添加失败"}" -// @Router /api/v1/loginlog [put] -// @Security Bearer -func UpdateLoginLog(c *gin.Context) { - var data models.LoginLog - err := c.BindWith(&data, binding.JSON) - tools.HasError(err, "", -1) - result, err := data.Update(data.InfoId) - tools.HasError(err, "", -1) - var res app.Response - res.Data = result - c.JSON(http.StatusOK, res.ReturnOK()) -} - -// @Summary 批量删除登录日志 -// @Description 删除数据 -// @Tags 登录日志 -// @Param infoId path string true "以逗号(,)分割的infoId" -// @Success 200 {string} string "{"code": 200, "message": "删除成功"}" -// @Success 200 {string} string "{"code": -1, "message": "删除失败"}" -// @Router /api/v1/loginlog/{infoId} [delete] -func DeleteLoginLog(c *gin.Context) { - var data models.LoginLog - data.UpdateBy = tools.GetUserIdStr(c) - IDS := tools.IdsStrToIdsIntGroup("infoId", c) - _, err := data.BatchDelete(IDS) - tools.HasError(err, "修改失败", 500) - var res app.Response - res.Msg = "删除成功" - c.JSON(http.StatusOK, res.ReturnOK()) -} diff --git a/app/admin/apis/log/operlog.go b/app/admin/apis/log/operlog.go deleted file mode 100644 index 2e5a8dd6..00000000 --- a/app/admin/apis/log/operlog.go +++ /dev/null @@ -1,113 +0,0 @@ -package log - -import ( - "net/http" - - "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" - - "go-admin/app/admin/models" - "go-admin/tools" - "go-admin/tools/app" -) - -// @Summary 登录日志列表 -// @Description 获取JSON -// @Tags 登录日志 -// @Param status query string false "status" -// @Param dictCode query string false "dictCode" -// @Param dictType query string false "dictType" -// @Param pageSize query int false "页条数" -// @Param pageIndex query int false "页码" -// @Success 200 {object} app.Response "{"code": 200, "data": [...]}" -// @Router /api/v1/operloglist [get] -// @Security Bearer -func GetOperLogList(c *gin.Context) { - var data models.SysOperLog - var err error - var pageSize = 10 - var pageIndex = 1 - - size := c.Request.FormValue("pageSize") - if size != "" { - pageSize, err = tools.StringToInt(size) - } - - index := c.Request.FormValue("pageIndex") - if index != "" { - pageIndex, err = tools.StringToInt(index) - } - - data.OperName = c.Request.FormValue("operName") - data.Status = c.Request.FormValue("status") - data.OperIp = c.Request.FormValue("operIp") - result, count, err := data.GetPage(pageSize, pageIndex) - tools.HasError(err, "", -1) - - var mp = make(map[string]interface{}, 3) - mp["list"] = result - mp["count"] = count - mp["pageIndex"] = pageIndex - mp["pageSize"] = pageSize - - var res app.Response - res.Data = mp - - c.JSON(http.StatusOK, res.ReturnOK()) -} - -// @Summary 通过编码获取登录日志 -// @Description 获取JSON -// @Tags 登录日志 -// @Param infoId path int true "infoId" -// @Success 200 {object} app.Response "{"code": 200, "data": [...]}" -// @Router /api/v1/operlog/{infoId} [get] -// @Security Bearer -func GetOperLog(c *gin.Context) { - var OperLog models.SysOperLog - OperLog.OperId, _ = tools.StringToInt(c.Param("operId")) - result, err := OperLog.Get() - tools.HasError(err, "抱歉未找到相关信息", -1) - var res app.Response - res.Data = result - c.JSON(http.StatusOK, res.ReturnOK()) -} - -// @Summary 添加操作日志 -// @Description 获取JSON -// @Tags 操作日志 -// @Accept application/json -// @Product application/json -// @Param data body models.SysOperLog true "data" -// @Success 200 {string} string "{"code": 200, "message": "添加成功"}" -// @Success 200 {string} string "{"code": -1, "message": "添加失败"}" -// @Router /api/v1/operlog [post] -// @Security Bearer -func InsertOperLog(c *gin.Context) { - var data models.SysOperLog - err := c.BindWith(&data, binding.JSON) - tools.HasError(err, "", 500) - result, err := data.Create() - tools.HasError(err, "", -1) - var res app.Response - res.Data = result - c.JSON(http.StatusOK, res.ReturnOK()) -} - -// @Summary 批量删除操作日志 -// @Description 删除数据 -// @Tags 操作日志 -// @Param operId path string true "以逗号(,)分割的operId" -// @Success 200 {string} string "{"code": 200, "message": "删除成功"}" -// @Success 200 {string} string "{"code": -1, "message": "删除失败"}" -// @Router /api/v1/operlog/{operId} [delete] -func DeleteOperLog(c *gin.Context) { - var data models.SysOperLog - data.UpdateBy = tools.GetUserIdStr(c) - IDS := tools.IdsStrToIdsIntGroup("operId", c) - _, err := data.BatchDelete(IDS) - tools.HasError(err, "删除失败", 500) - var res app.Response - res.Msg = "删除成功" - c.JSON(http.StatusOK, res.ReturnOK()) -} diff --git a/app/admin/apis/system/sys_login_log/sys_login_log.go b/app/admin/apis/system/sys_login_log/sys_login_log.go new file mode 100644 index 00000000..bdd30bfe --- /dev/null +++ b/app/admin/apis/system/sys_login_log/sys_login_log.go @@ -0,0 +1,192 @@ +package sys_login_log + +import ( + "github.com/gin-gonic/gin" + "go-admin/app/admin/models/system" + + "go-admin/app/admin/service" + "go-admin/app/admin/service/dto" + "go-admin/common/apis" + "go-admin/common/log" + common "go-admin/common/models" + "go-admin/tools" + + "net/http" +) + +type SysLoginLog struct { + apis.Api +} + +func (e *SysLoginLog) GetSysLoginLogList(c *gin.Context) { + msgID := tools.GenerateMsgIDFromContext(c) + d := new(dto.SysLoginLogSearch) + db, err := tools.GetOrm(c) + if err != nil { + log.Error(err) + return + } + + req := d.Generate() + + //查询列表 + err = req.Bind(c) + if err != nil { + e.Error(c, http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + + list := make([]system.SysLoginLog, 0) + var count int64 + serviceStudent := service.SysLoginlog{} + serviceStudent.MsgID = msgID + serviceStudent.Orm = db + err = serviceStudent.GetSysLoginlogPage(req, &list, &count) + if err != nil { + e.Error(c, http.StatusUnprocessableEntity, err, "查询失败") + return + } + + e.PageOK(c, list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功") +} + +func (e *SysLoginLog) GetSysLoginLog(c *gin.Context) { + control := new(dto.SysLoginLogById) + db, err := tools.GetOrm(c) + if err != nil { + log.Error(err) + return + } + + msgID := tools.GenerateMsgIDFromContext(c) + //查看详情 + req := control.Generate() + err = req.Bind(c) + if err != nil { + e.Error(c, http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + var object system.SysLoginLog + + serviceSysLoginLog := service.SysLoginlog{} + serviceSysLoginLog.MsgID = msgID + serviceSysLoginLog.Orm = db + err = serviceSysLoginLog.GetSysLoginlog(req, &object) + if err != nil { + e.Error(c, http.StatusUnprocessableEntity, err, "查询失败") + return + } + + e.OK(c, object, "查看成功") +} + +func (e *SysLoginLog) InsertSysLoginLog(c *gin.Context) { + control := new(dto.SysLoginLogControl) + db, err := tools.GetOrm(c) + if err != nil { + log.Error(err) + return + } + + msgID := tools.GenerateMsgIDFromContext(c) + //新增操作 + req := control.Generate() + err = req.Bind(c) + if err != nil { + e.Error(c, http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + var object common.ActiveRecord + object, err = req.GenerateM() + if err != nil { + e.Error(c, http.StatusInternalServerError, err, "模型生成失败") + return + } + // 设置创建人 + object.SetCreateBy(tools.GetUserIdUint(c)) + + serviceSysLoginLog := service.SysLoginlog{} + serviceSysLoginLog.Orm = db + serviceSysLoginLog.MsgID = msgID + err = serviceSysLoginLog.InsertSysLoginlog(object) + if err != nil { + log.Error(err) + e.Error(c, http.StatusInternalServerError, err, "创建失败") + return + } + + e.OK(c, object.GetId(), "创建成功") +} + +func (e *SysLoginLog) UpdateSysLoginLog(c *gin.Context) { + control := new(dto.SysLoginLogControl) + db, err := tools.GetOrm(c) + if err != nil { + log.Error(err) + return + } + + msgID := tools.GenerateMsgIDFromContext(c) + req := control.Generate() + //更新操作 + err = req.Bind(c) + if err != nil { + e.Error(c, http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + var object common.ActiveRecord + object, err = req.GenerateM() + if err != nil { + e.Error(c, http.StatusInternalServerError, err, "模型生成失败") + return + } + object.SetUpdateBy(tools.GetUserIdUint(c)) + + serviceSysLoginLog := service.SysLoginlog{} + serviceSysLoginLog.Orm = db + serviceSysLoginLog.MsgID = msgID + err = serviceSysLoginLog.UpdateSysLoginlog(object) + if err != nil { + log.Error(err) + return + } + e.OK(c, object.GetId(), "更新成功") +} + +func (e *SysLoginLog) DeleteSysLoginLog(c *gin.Context) { + control := new(dto.SysLoginLogById) + db, err := tools.GetOrm(c) + if err != nil { + log.Error(err) + return + } + + msgID := tools.GenerateMsgIDFromContext(c) + //删除操作 + req := control.Generate() + err = req.Bind(c) + if err != nil { + log.Errorf("MsgID[%s] Bind error: %s", msgID, err) + e.Error(c, http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + var object common.ActiveRecord + object, err = req.GenerateM() + if err != nil { + e.Error(c, http.StatusInternalServerError, err, "模型生成失败") + return + } + + // 设置编辑人 + object.SetUpdateBy(tools.GetUserIdUint(c)) + + serviceSysLoginLog := service.SysLoginlog{} + serviceSysLoginLog.Orm = db + serviceSysLoginLog.MsgID = msgID + err = serviceSysLoginLog.RemoveSysLoginlog(req, object) + if err != nil { + log.Error(err) + return + } + e.OK(c, object.GetId(), "删除成功") +} diff --git a/app/admin/apis/system/sys_opera_log/sys_opera_log.go b/app/admin/apis/system/sys_opera_log/sys_opera_log.go new file mode 100644 index 00000000..0a52952d --- /dev/null +++ b/app/admin/apis/system/sys_opera_log/sys_opera_log.go @@ -0,0 +1,192 @@ +package sys_opera_log + +import ( + "github.com/gin-gonic/gin" + + "go-admin/app/admin/models/system" + "go-admin/app/admin/service" + "go-admin/app/admin/service/dto" + "go-admin/common/apis" + "go-admin/common/log" + common "go-admin/common/models" + "go-admin/tools" + + "net/http" +) + +type SysOperaLog struct { + apis.Api +} + +func (e *SysOperaLog) GetSysOperaLogList(c *gin.Context) { + msgID := tools.GenerateMsgIDFromContext(c) + d := new(dto.SysOperaLogSearch) + db, err := tools.GetOrm(c) + if err != nil { + log.Error(err) + return + } + + req := d.Generate() + + //查询列表 + err = req.Bind(c) + if err != nil { + e.Error(c, http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + + list := make([]system.SysOperaLog, 0) + var count int64 + serviceStudent := service.SysOperaLog{} + serviceStudent.MsgID = msgID + serviceStudent.Orm = db + err = serviceStudent.GetSysOperaLogPage(req, &list, &count) + if err != nil { + e.Error(c, http.StatusUnprocessableEntity, err, "查询失败") + return + } + + e.PageOK(c, list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功") +} + +func (e *SysOperaLog) GetSysOperaLog(c *gin.Context) { + control := new(dto.SysOperaLogById) + db, err := tools.GetOrm(c) + if err != nil { + log.Error(err) + return + } + + msgID := tools.GenerateMsgIDFromContext(c) + //查看详情 + req := control.Generate() + err = req.Bind(c) + if err != nil { + e.Error(c, http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + var object system.SysOperaLog + + serviceSysOperlog := service.SysOperaLog{} + serviceSysOperlog.MsgID = msgID + serviceSysOperlog.Orm = db + err = serviceSysOperlog.GetSysOperaLog(req, &object) + if err != nil { + e.Error(c, http.StatusUnprocessableEntity, err, "查询失败") + return + } + + e.OK(c, object, "查看成功") +} + +func (e *SysOperaLog) InsertSysOperaLog(c *gin.Context) { + control := new(dto.SysOperaLogControl) + db, err := tools.GetOrm(c) + if err != nil { + log.Error(err) + return + } + + msgID := tools.GenerateMsgIDFromContext(c) + //新增操作 + req := control.Generate() + err = req.Bind(c) + if err != nil { + e.Error(c, http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + var object common.ActiveRecord + object, err = req.GenerateM() + if err != nil { + e.Error(c, http.StatusInternalServerError, err, "模型生成失败") + return + } + // 设置创建人 + object.SetCreateBy(tools.GetUserIdUint(c)) + + serviceSysOperaLog := service.SysOperaLog{} + serviceSysOperaLog.Orm = db + serviceSysOperaLog.MsgID = msgID + err = serviceSysOperaLog.InsertSysOperaLog(object) + if err != nil { + log.Error(err) + e.Error(c, http.StatusInternalServerError, err, "创建失败") + return + } + + e.OK(c, object.GetId(), "创建成功") +} + +func (e *SysOperaLog) UpdateSysOperaLog(c *gin.Context) { + control := new(dto.SysOperaLogControl) + db, err := tools.GetOrm(c) + if err != nil { + log.Error(err) + return + } + + msgID := tools.GenerateMsgIDFromContext(c) + req := control.Generate() + //更新操作 + err = req.Bind(c) + if err != nil { + e.Error(c, http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + var object common.ActiveRecord + object, err = req.GenerateM() + if err != nil { + e.Error(c, http.StatusInternalServerError, err, "模型生成失败") + return + } + object.SetUpdateBy(tools.GetUserIdUint(c)) + + serviceSysOperaLog := service.SysOperaLog{} + serviceSysOperaLog.Orm = db + serviceSysOperaLog.MsgID = msgID + err = serviceSysOperaLog.UpdateSysOperaLog(object) + if err != nil { + log.Error(err) + return + } + e.OK(c, object.GetId(), "更新成功") +} + +func (e *SysOperaLog) DeleteSysOperaLog(c *gin.Context) { + control := new(dto.SysOperaLogById) + db, err := tools.GetOrm(c) + if err != nil { + log.Error(err) + return + } + + msgID := tools.GenerateMsgIDFromContext(c) + //删除操作 + req := control.Generate() + err = req.Bind(c) + if err != nil { + log.Errorf("MsgID[%s] Bind error: %s", msgID, err) + e.Error(c, http.StatusUnprocessableEntity, err, "参数验证失败") + return + } + var object common.ActiveRecord + object, err = req.GenerateM() + if err != nil { + e.Error(c, http.StatusInternalServerError, err, "模型生成失败") + return + } + + // 设置编辑人 + object.SetUpdateBy(tools.GetUserIdUint(c)) + + serviceSysOperaLog := service.SysOperaLog{} + serviceSysOperaLog.Orm = db + serviceSysOperaLog.MsgID = msgID + err = serviceSysOperaLog.RemoveSysOperaLog(req, object) + if err != nil { + log.Error(err) + return + } + e.OK(c, object.GetId(), "删除成功") +} diff --git a/app/admin/middleware/handler/auth.go b/app/admin/middleware/handler/auth.go index f16c3511..d0b5e272 100644 --- a/app/admin/middleware/handler/auth.go +++ b/app/admin/middleware/handler/auth.go @@ -1,6 +1,8 @@ package handler import ( + "go-admin/app/admin/models/system" + "go-admin/app/admin/service" "net/http" "github.com/gin-gonic/gin" @@ -98,7 +100,8 @@ func Authenticator(c *gin.Context) (interface{}, error) { // Write log to database func LoginLogToDB(c *gin.Context, status string, msg string, username string) { if config.LoggerConfig.EnabledDB { - var loginlog models.LoginLog + var loginlog system.SysLoginLog + serviceLoginLog :=service.SysLoginlog{} ua := user_agent.New(c.Request.UserAgent()) loginlog.Ipaddr = c.ClientIP() loginlog.Username = username @@ -112,7 +115,7 @@ func LoginLogToDB(c *gin.Context, status string, msg string, username string) { loginlog.Os = ua.OS() loginlog.Msg = msg loginlog.Platform = ua.Platform() - _, _ = loginlog.Create() + _ = serviceLoginLog.InsertSysLoginlog(loginlog.Generate()) } } @@ -126,7 +129,7 @@ func LoginLogToDB(c *gin.Context, status string, msg string, username string) { // @Router /logout [post] // @Security Bearer func LogOut(c *gin.Context) { - var loginlog models.LoginLog + var loginlog system.SysLoginLog ua := user_agent.New(c.Request.UserAgent()) loginlog.Ipaddr = c.ClientIP() location := tools.GetLocation(c.ClientIP()) @@ -140,7 +143,8 @@ func LogOut(c *gin.Context) { loginlog.Platform = ua.Platform() loginlog.Username = tools.GetUserName(c) loginlog.Msg = "退出成功" - loginlog.Create() + serviceLoginLog:=service.SysLoginlog{} + _ = serviceLoginLog.InsertSysLoginlog(loginlog.Generate()) c.JSON(http.StatusOK, gin.H{ "code": 200, diff --git a/app/admin/middleware/logger.go b/app/admin/middleware/logger.go index f3a621d8..98aa1d04 100644 --- a/app/admin/middleware/logger.go +++ b/app/admin/middleware/logger.go @@ -2,6 +2,8 @@ package middleware import ( "fmt" + "go-admin/app/admin/models/system" + "go-admin/app/admin/service" "strings" "time" @@ -66,45 +68,46 @@ func SetDBOperLog(c *gin.Context, clientIP string, statusCode int, reqUri string menu.Path = reqUri menu.Action = reqMethod menuList, _ := menu.Get() - sysOperLog := models.SysOperLog{} - sysOperLog.OperIp = clientIP - sysOperLog.OperLocation = tools.GetLocation(clientIP) - sysOperLog.Status = tools.IntToString(statusCode) - sysOperLog.OperName = tools.GetUserName(c) - sysOperLog.RequestMethod = c.Request.Method - sysOperLog.OperUrl = reqUri + sysOperaLog := system.SysOperaLog{} + sysOperaLog.OperIp = clientIP + sysOperaLog.OperLocation = tools.GetLocation(clientIP) + sysOperaLog.Status = tools.IntToString(statusCode) + sysOperaLog.OperName = tools.GetUserName(c) + sysOperaLog.RequestMethod = c.Request.Method + sysOperaLog.OperUrl = reqUri if reqUri == "/login" { - sysOperLog.BusinessType = "10" - sysOperLog.Title = "用户登录" - sysOperLog.OperName = "-" + sysOperaLog.BusinessType = "10" + sysOperaLog.Title = "用户登录" + sysOperaLog.OperName = "-" } else if strings.Contains(reqUri, "/api/v1/logout") { - sysOperLog.BusinessType = "11" + sysOperaLog.BusinessType = "11" } else if strings.Contains(reqUri, "/api/v1/getCaptcha") { - sysOperLog.BusinessType = "12" - sysOperLog.Title = "验证码" + sysOperaLog.BusinessType = "12" + sysOperaLog.Title = "验证码" } else { if reqMethod == "POST" { - sysOperLog.BusinessType = "1" + sysOperaLog.BusinessType = "1" } else if reqMethod == "PUT" { - sysOperLog.BusinessType = "2" + sysOperaLog.BusinessType = "2" } else if reqMethod == "DELETE" { - sysOperLog.BusinessType = "3" + sysOperaLog.BusinessType = "3" } } - sysOperLog.Method = reqMethod + sysOperaLog.Method = reqMethod if len(menuList) > 0 { - sysOperLog.Title = menuList[0].Title + sysOperaLog.Title = menuList[0].Title } b, _ := c.Get("body") - sysOperLog.OperParam, _ = tools.StructToJsonStr(b) - sysOperLog.CreateBy = tools.GetUserName(c) - sysOperLog.OperTime = tools.GetCurrentTime() - sysOperLog.LatencyTime = (latencyTime).String() - sysOperLog.UserAgent = c.Request.UserAgent() + sysOperaLog.OperParam, _ = tools.StructToJsonStr(b) + sysOperaLog.CreateBy = tools.GetUserIdUint(c) + sysOperaLog.OperTime = tools.GetCurrentTime() + sysOperaLog.LatencyTime = (latencyTime).String() + sysOperaLog.UserAgent = c.Request.UserAgent() if c.Err() == nil { - sysOperLog.Status = "0" + sysOperaLog.Status = "0" } else { - sysOperLog.Status = "1" + sysOperaLog.Status = "1" } - _, _ = sysOperLog.Create() + serviceOperaLog:=service.SysOperaLog{} + _ = serviceOperaLog.InsertSysOperaLog(sysOperaLog.Generate()) } diff --git a/app/admin/models/loginlog.go b/app/admin/models/loginlog.go deleted file mode 100644 index af445a8a..00000000 --- a/app/admin/models/loginlog.go +++ /dev/null @@ -1,105 +0,0 @@ -package models - -import ( - "time" - - orm "go-admin/common/global" -) - -type LoginLog struct { - InfoId int `json:"infoId" gorm:"primary_key;auto_increment;"` //主键 - Username string `json:"username" gorm:"size:128;"` //用户名 - Status string `json:"status" gorm:"size:4;"` //状态 - Ipaddr string `json:"ipaddr" gorm:"size:255;"` //ip地址 - LoginLocation string `json:"loginLocation" gorm:"size:255;"` //归属地 - Browser string `json:"browser" gorm:"size:255;"` //浏览器 - Os string `json:"os" gorm:"size:255;"` //系统 - Platform string `json:"platform" gorm:"size:255;"` // 固件 - LoginTime time.Time `json:"loginTime" gorm:"type:timestamp;"` //登录时间 - CreateBy string `json:"createBy" gorm:"size:128;"` //创建人 - UpdateBy string `json:"updateBy" gorm:"size:128;"` //更新者 - DataScope string `json:"dataScope" gorm:"-"` //数据 - Params string `json:"params" gorm:"-"` // - Remark string `json:"remark" gorm:"size:255;"` //备注 - Msg string `json:"msg" gorm:"size:255;"` - BaseModel -} - -func (LoginLog) TableName() string { - return "sys_loginlog" -} - -func (e *LoginLog) Get() (LoginLog, error) { - var doc LoginLog - - table := orm.Eloquent.Table(e.TableName()) - if e.Ipaddr != "" { - table = table.Where("ipaddr = ?", e.Ipaddr) - } - if e.InfoId != 0 { - table = table.Where("info_id = ?", e.InfoId) - } - - if err := table.First(&doc).Error; err != nil { - return doc, err - } - return doc, nil -} - -func (e *LoginLog) GetPage(pageSize int, pageIndex int) ([]LoginLog, int, error) { - var doc []LoginLog - - table := orm.Eloquent.Table(e.TableName()) - if e.Ipaddr != "" { - table = table.Where("ipaddr = ?", e.Ipaddr) - } - if e.Status != "" { - table = table.Where("status = ?", e.Status) - } - if e.Username != "" { - table = table.Where("userName = ?", e.Username) - } - - var count int64 - - if err := table.Order("info_id desc").Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil { - return nil, 0, err - } - //table.Where("`deleted_at` IS NULL").Count(&count) - return doc, int(count), nil -} - -func (e *LoginLog) Create() (LoginLog, error) { - var doc LoginLog - e.CreateBy = "0" - e.UpdateBy = "0" - result := orm.Eloquent.Table(e.TableName()).Create(&e) - if result.Error != nil { - err := result.Error - return doc, err - } - doc = *e - return doc, nil -} - -func (e *LoginLog) Update(id int) (update LoginLog, err error) { - - if err = orm.Eloquent.Table(e.TableName()).First(&update, id).Error; err != nil { - return - } - - //参数1:是要修改的数据 - //参数2:是修改的数据 - if err = orm.Eloquent.Table(e.TableName()).Model(&update).Updates(&e).Error; err != nil { - return - } - return -} - -func (e *LoginLog) BatchDelete(id []int) (Result bool, err error) { - if err = orm.Eloquent.Table(e.TableName()).Where("info_id in (?)", id).Delete(&LoginLog{}).Error; err != nil { - return - } - Result = true - return -} diff --git a/app/admin/models/operlog.go b/app/admin/models/operlog.go deleted file mode 100644 index cde719af..00000000 --- a/app/admin/models/operlog.go +++ /dev/null @@ -1,116 +0,0 @@ -package models - -import ( - "time" - - orm "go-admin/common/global" -) - -//sys_operlog -type SysOperLog struct { - OperId int `json:"operId" gorm:"primary_key;AUTO_INCREMENT"` //日志编码 - Title string `json:"title" gorm:"size:255;"` //操作模块 - BusinessType string `json:"businessType" gorm:"size:128;"` //操作类型 - BusinessTypes string `json:"businessTypes" gorm:"size:128;"` - Method string `json:"method" gorm:"size:128;"` //函数 - RequestMethod string `json:"requestMethod" gorm:"size:128;"` //请求方式 - OperatorType string `json:"operatorType" gorm:"size:128;"` //操作类型 - OperName string `json:"operName" gorm:"size:128;"` //操作者 - DeptName string `json:"deptName" gorm:"size:128;"` //部门名称 - OperUrl string `json:"operUrl" gorm:"size:255;"` //访问地址 - OperIp string `json:"operIp" gorm:"size:128;"` //客户端ip - OperLocation string `json:"operLocation" gorm:"size:128;"` //访问位置 - OperParam string `json:"operParam" gorm:"size:255;"` //请求参数 - Status string `json:"status" gorm:"size:4;"` //操作状态 - OperTime time.Time `json:"operTime" gorm:"type:timestamp;"` //操作时间 - JsonResult string `json:"jsonResult" gorm:"size:255;"` //返回数据 - CreateBy string `json:"createBy" gorm:"size:128;"` //创建人 - UpdateBy string `json:"updateBy" gorm:"size:128;"` //更新者 - DataScope string `json:"dataScope" gorm:"-"` //数据 - Params string `json:"params" gorm:"-"` //参数 - Remark string `json:"remark" gorm:"size:255;"` //备注 - LatencyTime string `json:"latencyime" gorm:"size:128;"` //耗时 - UserAgent string `json:"userAgent" gorm:"size:255;"` //ua - BaseModel -} - -func (SysOperLog) TableName() string { - return "sys_operlog" -} - -func (e *SysOperLog) Get() (SysOperLog, error) { - var doc SysOperLog - - table := orm.Eloquent.Table(e.TableName()) - if e.OperIp != "" { - table = table.Where("oper_ip = ?", e.OperIp) - } - if e.OperId != 0 { - table = table.Where("oper_id = ?", e.OperId) - } - - if err := table.First(&doc).Error; err != nil { - return doc, err - } - return doc, nil -} - -func (e *SysOperLog) GetPage(pageSize int, pageIndex int) ([]SysOperLog, int, error) { - var doc []SysOperLog - - table := orm.Eloquent.Table(e.TableName()) - if e.OperIp != "" { - table = table.Where("oper_ip = ?", e.OperIp) - } - if e.Status != "" { - table = table.Where("status = ?", e.Status) - } - if e.OperName != "" { - table = table.Where("oper_name = ?", e.OperName) - } - if e.BusinessType != "" { - table = table.Where("business_type = ?", e.BusinessType) - } - - var count int64 - - if err := table.Order("oper_id desc").Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil { - return nil, 0, err - } - //table.Where("`deleted_at` IS NULL").Count(&count) - return doc, int(count), nil -} - -func (e *SysOperLog) Create() (SysOperLog, error) { - var doc SysOperLog - e.CreateBy = "0" - e.UpdateBy = "0" - result := orm.Eloquent.Table(e.TableName()).Create(&e) - if result.Error != nil { - err := result.Error - return doc, err - } - doc = *e - return doc, nil -} - -func (e *SysOperLog) Update(id int) (update SysOperLog, err error) { - if err = orm.Eloquent.Table(e.TableName()).First(&update, id).Error; err != nil { - return - } - - //参数1:是要修改的数据 - //参数2:是修改的数据 - if err = orm.Eloquent.Table(e.TableName()).Model(&update).Updates(&e).Error; err != nil { - return - } - return -} - -func (e *SysOperLog) BatchDelete(id []int) (Result bool, err error) { - if err = orm.Eloquent.Table(e.TableName()).Where(" oper_id in (?)", id).Delete(&SysOperLog{}).Error; err != nil { - return - } - Result = true - return -} diff --git a/app/admin/models/system/sys_login_log.go b/app/admin/models/system/sys_login_log.go new file mode 100644 index 00000000..f23d330b --- /dev/null +++ b/app/admin/models/system/sys_login_log.go @@ -0,0 +1,38 @@ +package system + +import ( + "gorm.io/gorm" + + "go-admin/common/models" + + "time" +) + +type SysLoginLog struct { + gorm.Model + models.ControlBy + + Username string `json:"username" gorm:"type:varchar(128);comment:用户名"` // + Status string `json:"status" gorm:"type:varchar(4);comment:状态"` // + Ipaddr string `json:"ipaddr" gorm:"type:varchar(255);comment:ip地址"` // + LoginLocation string `json:"loginLocation" gorm:"type:varchar(255);comment:归属地"` // + Browser string `json:"browser" gorm:"type:varchar(255);comment:浏览器"` // + Os string `json:"os" gorm:"type:varchar(255);comment:系统"` // + Platform string `json:"platform" gorm:"type:varchar(255);comment:固件"` // + LoginTime time.Time `json:"loginTime" gorm:"type:timestamp;comment:登录时间"` // + Remark string `json:"remark" gorm:"type:varchar(255);comment:备注"` // + Msg string `json:"msg" gorm:"type:varchar(255);comment:信息"` // +} + +func (SysLoginLog) TableName() string { + return "sys_login_log" +} + +func (e *SysLoginLog) Generate() models.ActiveRecord { + o := *e + return &o +} + +func (e *SysLoginLog) GetId() interface{} { + return e.ID +} diff --git a/app/admin/models/system/sys_opera_log.go b/app/admin/models/system/sys_opera_log.go new file mode 100644 index 00000000..990e72cb --- /dev/null +++ b/app/admin/models/system/sys_opera_log.go @@ -0,0 +1,46 @@ +package system + +import ( + "gorm.io/gorm" + + "go-admin/common/models" + + "time" +) + +type SysOperaLog struct { + gorm.Model + models.ControlBy + + Title string `json:"title" gorm:"type:varchar(255);comment:操作模块"` // + BusinessType string `json:"businessType" gorm:"type:varchar(128);comment:操作类型"` // + BusinessTypes string `json:"businessTypes" gorm:"type:varchar(128);comment:BusinessTypes"` // + Method string `json:"method" gorm:"type:varchar(128);comment:函数"` // + RequestMethod string `json:"requestMethod" gorm:"type:varchar(128);comment:请求方式"` // + OperatorType string `json:"operatorType" gorm:"type:varchar(128);comment:操作类型"` // + OperName string `json:"operName" gorm:"type:varchar(128);comment:操作者"` // + DeptName string `json:"deptName" gorm:"type:varchar(128);comment:部门名称"` // + OperUrl string `json:"operUrl" gorm:"type:varchar(255);comment:访问地址"` // + OperIp string `json:"operIp" gorm:"type:varchar(128);comment:客户端ip"` // + OperLocation string `json:"operLocation" gorm:"type:varchar(128);comment:访问位置"` // + OperParam string `json:"operParam" gorm:"type:varchar(255);comment:请求参数"` // + Status string `json:"status" gorm:"type:varchar(4);comment:操作状态"` // + OperTime time.Time `json:"operTime" gorm:"type:timestamp;comment:操作时间"` // + JsonResult string `json:"jsonResult" gorm:"type:varchar(255);comment:返回数据"` // + Remark string `json:"remark" gorm:"type:varchar(255);comment:备注"` // + LatencyTime string `json:"latencyTime" gorm:"type:varchar(128);comment:耗时"` // + UserAgent string `json:"userAgent" gorm:"type:varchar(255);comment:ua"` // +} + +func (SysOperaLog) TableName() string { + return "sys_opera_log" +} + +func (e *SysOperaLog) Generate() models.ActiveRecord { + o := *e + return &o +} + +func (e *SysOperaLog) GetId() interface{} { + return e.ID +} diff --git a/app/admin/router/sys_login_log.go b/app/admin/router/sys_login_log.go new file mode 100644 index 00000000..bf2662d5 --- /dev/null +++ b/app/admin/router/sys_login_log.go @@ -0,0 +1,25 @@ +package router + +import ( + "github.com/gin-gonic/gin" + "go-admin/app/admin/apis/system/sys_login_log" + "go-admin/app/admin/middleware" + jwt "go-admin/pkg/jwtauth" +) + +func init() { + routerCheckRole = append(routerCheckRole, registerSysLoginLogRouter) +} + +// 需认证的路由代码 +func registerSysLoginLogRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { + api := &sys_login_log.SysLoginLog{} + r := v1.Group("/sys-login-log").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) + { + r.GET("", api.GetSysLoginLogList) + r.GET("/:id", api.GetSysLoginLog) + r.POST("", api.InsertSysLoginLog) + r.PUT("/:id", api.UpdateSysLoginLog) + r.DELETE("", api.DeleteSysLoginLog) + } +} diff --git a/app/admin/router/sys_opera_log.go b/app/admin/router/sys_opera_log.go new file mode 100644 index 00000000..55bd8098 --- /dev/null +++ b/app/admin/router/sys_opera_log.go @@ -0,0 +1,25 @@ +package router + +import ( + "github.com/gin-gonic/gin" + "go-admin/app/admin/apis/system/sys_opera_log" + "go-admin/app/admin/middleware" + jwt "go-admin/pkg/jwtauth" +) + +func init() { + routerCheckRole = append(routerCheckRole, registerSysOperaLogRouter) +} + +// 需认证的路由代码 +func registerSysOperaLogRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { + api := &sys_opera_log.SysOperaLog{} + r := v1.Group("/sys-opera-log").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) + { + r.GET("", api.GetSysOperaLogList) + r.GET("/:id", api.GetSysOperaLog) + r.POST("", api.InsertSysOperaLog) + r.PUT("/:id", api.UpdateSysOperaLog) + r.DELETE("", api.DeleteSysOperaLog) + } +} diff --git a/app/admin/router/sysrouter.go b/app/admin/router/sysrouter.go index 58c186a6..859bcb16 100644 --- a/app/admin/router/sysrouter.go +++ b/app/admin/router/sysrouter.go @@ -3,7 +3,6 @@ package router import ( "mime" - log2 "go-admin/app/admin/apis/log" "go-admin/app/admin/apis/monitor" "go-admin/app/admin/apis/public" "go-admin/app/admin/apis/system" @@ -112,8 +111,6 @@ func sysCheckRoleRouterInit(r *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddle registerUserCenterRouter(v1, authMiddleware) registerPostRouter(v1, authMiddleware) registerMenuRouter(v1, authMiddleware) - registerLoginLogRouter(v1, authMiddleware) - registerOperLogRouter(v1, authMiddleware) } func registerBaseRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { @@ -127,8 +124,6 @@ func registerBaseRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddlewar v1auth.POST("/logout", handler.LogOut) v1auth.GET("/menuids", system.GetMenuIDS) - - v1auth.GET("/operloglist", log2.GetOperLogList) } } @@ -142,7 +137,6 @@ func registerPageRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddlewar //v1auth.GET("/configList", system.GetConfigList) v1auth.GET("/postlist", system.GetPostList) v1auth.GET("/menulist", system.GetMenuList) - v1auth.GET("/loginloglist", log2.GetLoginLogList) } } @@ -155,24 +149,6 @@ func registerUserCenterRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMid } } -func registerOperLogRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { - operlog := v1.Group("/operlog").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) - { - operlog.GET("/:operId", log2.GetOperLog) - operlog.DELETE("/:operId", log2.DeleteOperLog) - } -} - -func registerLoginLogRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { - loginlog := v1.Group("/loginlog").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) - { - loginlog.GET("/:infoId", log2.GetLoginLog) - loginlog.POST("", log2.InsertLoginLog) - loginlog.PUT("", log2.UpdateLoginLog) - loginlog.DELETE("/:infoId", log2.DeleteLoginLog) - } -} - func registerPostRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { post := v1.Group("/post").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) { diff --git a/app/admin/service/dto/sys_login_log.go b/app/admin/service/dto/sys_login_log.go new file mode 100644 index 00000000..0c382a61 --- /dev/null +++ b/app/admin/service/dto/sys_login_log.go @@ -0,0 +1,110 @@ +package dto + +import ( + "github.com/gin-gonic/gin" + "gorm.io/gorm" + + "go-admin/app/admin/models/system" + "go-admin/common/dto" + "go-admin/common/log" + common "go-admin/common/models" + "go-admin/tools" + + "time" +) + +type SysLoginLogSearch struct { + dto.Pagination `search:"-"` + Username string `form:"username" search:"type:exact;column:username;table:sys_loginlog" comment:"用户名"` + + Status string `form:"status" search:"type:exact;column:status;table:sys_loginlog" comment:"状态"` + + Ipaddr string `form:"ipaddr" search:"type:exact;column:ipaddr;table:sys_loginlog" comment:"ip地址"` + + LoginLocation string `form:"loginLocation" search:"type:exact;column:login_location;table:sys_loginlog" comment:"归属地"` +} + +func (m *SysLoginLogSearch) GetNeedSearch() interface{} { + return *m +} + +func (m *SysLoginLogSearch) Bind(ctx *gin.Context) error { + msgID := tools.GenerateMsgIDFromContext(ctx) + err := ctx.ShouldBind(m) + if err != nil { + log.Debugf("MsgID[%s] ShouldBind error: %s", msgID, err.Error()) + } + return err +} + +func (m *SysLoginLogSearch) Generate() dto.Index { + o := *m + return &o +} + +type SysLoginLogControl struct { + ID uint `uri:"ID" comment:"主键"` // 主键 + Username string `json:"username" comment:"用户名"` + Status string `json:"status" comment:"状态"` + Ipaddr string `json:"ipaddr" comment:"ip地址"` + LoginLocation string `json:"loginLocation" comment:"归属地"` + Browser string `json:"browser" comment:"浏览器"` + Os string `json:"os" comment:"系统"` + Platform string `json:"platform" comment:"固件"` + LoginTime time.Time `json:"loginTime" comment:"登录时间"` + Remark string `json:"remark" comment:"备注"` + Msg string `json:"msg" comment:"信息"` +} + +func (s *SysLoginLogControl) Bind(ctx *gin.Context) error { + msgID := tools.GenerateMsgIDFromContext(ctx) + err := ctx.ShouldBindUri(s) + if err != nil { + log.Debugf("MsgID[%s] ShouldBindUri error: %s", msgID, err.Error()) + return err + } + err = ctx.ShouldBind(s) + if err != nil { + log.Debugf("MsgID[%s] ShouldBind error: %#v", msgID, err.Error()) + } + return err +} + +func (s *SysLoginLogControl) Generate() dto.Control { + cp := *s + return &cp +} + +func (s *SysLoginLogControl) GenerateM() (common.ActiveRecord, error) { + return &system.SysLoginLog{ + + Model: gorm.Model{ID: s.ID}, + Username: s.Username, + Status: s.Status, + Ipaddr: s.Ipaddr, + LoginLocation: s.LoginLocation, + Browser: s.Browser, + Os: s.Os, + Platform: s.Platform, + LoginTime: s.LoginTime, + Remark: s.Remark, + Msg: s.Msg, + }, nil +} + +func (s *SysLoginLogControl) GetId() interface{} { + return s.ID +} + +type SysLoginLogById struct { + dto.ObjectById +} + +func (s *SysLoginLogById) Generate() dto.Control { + cp := *s + return &cp +} + +func (s *SysLoginLogById) GenerateM() (common.ActiveRecord, error) { + return &system.SysLoginLog{}, nil +} diff --git a/app/admin/service/dto/sys_opera_log.go b/app/admin/service/dto/sys_opera_log.go new file mode 100644 index 00000000..a9371721 --- /dev/null +++ b/app/admin/service/dto/sys_opera_log.go @@ -0,0 +1,124 @@ +package dto + +import ( + "github.com/gin-gonic/gin" + "gorm.io/gorm" + + "go-admin/app/admin/models/system" + "go-admin/common/dto" + "go-admin/common/log" + common "go-admin/common/models" + "go-admin/tools" + + "time" +) + +type SysOperaLogSearch struct { + dto.Pagination `search:"-"` + + Title string `form:"title" search:"type:contains;column:title;table:sys_operlog" comment:"操作模块"` + Method string `form:"method" search:"type:contains;column:method;table:sys_operlog" comment:"函数"` + RequestMethod string `form:"requestMethod" search:"type:contains;column:request_method;table:sys_operlog" comment:"请求方式"` + OperUrl string `form:"operUrl" search:"type:contains;column:oper_url;table:sys_operlog" comment:"访问地址"` + OperIp string `form:"operIp" search:"type:exact;column:oper_ip;table:sys_operlog" comment:"客户端ip"` +} + +func (m *SysOperaLogSearch) GetNeedSearch() interface{} { + return *m +} + +func (m *SysOperaLogSearch) Bind(ctx *gin.Context) error { + msgID := tools.GenerateMsgIDFromContext(ctx) + err := ctx.ShouldBind(m) + if err != nil { + log.Debugf("MsgID[%s] ShouldBind error: %s", msgID, err.Error()) + } + return err +} + +func (m *SysOperaLogSearch) Generate() dto.Index { + o := *m + return &o +} + +type SysOperaLogControl struct { + ID uint `uri:"ID" comment:"编码"` // 编码 + Title string `json:"title" comment:"操作模块"` + BusinessType string `json:"businessType" comment:"操作类型"` + BusinessTypes string `json:"businessTypes" comment:""` + Method string `json:"method" comment:"函数"` + RequestMethod string `json:"requestMethod" comment:"请求方式"` + OperatorType string `json:"operatorType" comment:"操作类型"` + OperName string `json:"operName" comment:"操作者"` + DeptName string `json:"deptName" comment:"部门名称"` + OperUrl string `json:"operUrl" comment:"访问地址"` + OperIp string `json:"operIp" comment:"客户端ip"` + OperLocation string `json:"operLocation" comment:"访问位置"` + OperParam string `json:"operParam" comment:"请求参数"` + Status string `json:"status" comment:"操作状态"` + OperTime time.Time `json:"operTime" comment:"操作时间"` + JsonResult string `json:"jsonResult" comment:"返回数据"` + Remark string `json:"remark" comment:"备注"` + LatencyTime string `json:"latencyTime" comment:"耗时"` + UserAgent string `json:"userAgent" comment:"ua"` +} + +func (s *SysOperaLogControl) Bind(ctx *gin.Context) error { + msgID := tools.GenerateMsgIDFromContext(ctx) + err := ctx.ShouldBindUri(s) + if err != nil { + log.Debugf("MsgID[%s] ShouldBindUri error: %s", msgID, err.Error()) + return err + } + err = ctx.ShouldBind(s) + if err != nil { + log.Debugf("MsgID[%s] ShouldBind error: %#v", msgID, err.Error()) + } + return err +} + +func (s *SysOperaLogControl) Generate() dto.Control { + cp := *s + return &cp +} + +func (s *SysOperaLogControl) GenerateM() (common.ActiveRecord, error) { + return &system.SysOperaLog{ + Model: gorm.Model{ID: s.ID}, + Title: s.Title, + BusinessType: s.BusinessType, + BusinessTypes: s.BusinessTypes, + Method: s.Method, + RequestMethod: s.RequestMethod, + OperatorType: s.OperatorType, + OperName: s.OperName, + DeptName: s.DeptName, + OperUrl: s.OperUrl, + OperIp: s.OperIp, + OperLocation: s.OperLocation, + OperParam: s.OperParam, + Status: s.Status, + OperTime: s.OperTime, + JsonResult: s.JsonResult, + Remark: s.Remark, + LatencyTime: s.LatencyTime, + UserAgent: s.UserAgent, + }, nil +} + +func (s *SysOperaLogControl) GetId() interface{} { + return s.ID +} + +type SysOperaLogById struct { + dto.ObjectById +} + +func (s *SysOperaLogById) Generate() dto.Control { + cp := *s + return &cp +} + +func (s *SysOperaLogById) GenerateM() (common.ActiveRecord, error) { + return &system.SysOperaLog{}, nil +} diff --git a/app/admin/service/sys_login_log.go b/app/admin/service/sys_login_log.go new file mode 100644 index 00000000..310d2b63 --- /dev/null +++ b/app/admin/service/sys_login_log.go @@ -0,0 +1,110 @@ +package service + +import ( + "errors" + "go-admin/app/admin/models/system" + cDto "go-admin/common/dto" + "go-admin/common/log" + common "go-admin/common/models" + "go-admin/common/service" + "gorm.io/gorm" +) + +type SysLoginlog struct { + service.Service +} + +// GetSysLoginlogPage 获取SysLoginlog列表 +func (e *SysLoginlog) GetSysLoginlogPage(c cDto.Index, list *[]system.SysLoginLog, count *int64) error { + var err error + var data system.SysLoginLog + msgID := e.MsgID + + err = e.Orm.Model(&data). + Scopes( + cDto.MakeCondition(c.GetNeedSearch()), + cDto.Paginate(c.GetPageSize(), c.GetPageIndex()), + ). + Find(list).Limit(-1).Offset(-1). + Count(count).Error + if err != nil { + log.Errorf("msgID[%s] db error:%s", msgID, err) + return err + } + return nil +} + +// GetSysLoginlog 获取SysLoginlog对象 +func (e *SysLoginlog) GetSysLoginlog(d cDto.Control, model *system.SysLoginLog) error { + var err error + var data system.SysLoginLog + msgID := e.MsgID + + db := e.Orm.Model(&data). + First(model, d.GetId()) + err = db.Error + if err != nil && errors.Is(err, gorm.ErrRecordNotFound) { + err = errors.New("查看对象不存在或无权查看") + log.Errorf("msgID[%s] db error:%s", msgID, err) + return err + } + if db.Error != nil { + log.Errorf("msgID[%s] db error:%s", msgID, err) + return err + } + return nil +} + +// InsertSysLoginlog 创建SysLoginlog对象 +func (e *SysLoginlog) InsertSysLoginlog(model common.ActiveRecord) error { + var err error + var data system.SysLoginLog + msgID := e.MsgID + + err = e.Orm.Model(&data). + Create(model).Error + if err != nil { + log.Errorf("msgID[%s] db error:%s", msgID, err) + return err + } + return nil +} + +// UpdateSysLoginlog 修改SysLoginlog对象 +func (e *SysLoginlog) UpdateSysLoginlog(c common.ActiveRecord) error { + var err error + var data system.SysLoginLog + msgID := e.MsgID + + db := e.Orm.Model(&data). + Where(c.GetId()).Updates(c) + if db.Error != nil { + log.Errorf("msgID[%s] db error:%s", msgID, err) + return err + } + if db.RowsAffected == 0 { + return errors.New("无权更新该数据") + + } + return nil +} + +// RemoveSysLoginlog 删除SysLoginlog +func (e *SysLoginlog) RemoveSysLoginlog(d cDto.Control, c common.ActiveRecord) error { + var err error + var data system.SysLoginLog + msgID := e.MsgID + + db := e.Orm.Model(&data). + Where(d.GetId()).Delete(c) + if db.Error != nil { + err = db.Error + log.Errorf("MsgID[%s] Delete error: %s", msgID, err) + return err + } + if db.RowsAffected == 0 { + err = errors.New("无权删除该数据") + return err + } + return nil +} \ No newline at end of file diff --git a/app/admin/service/sys_opera_log.go b/app/admin/service/sys_opera_log.go new file mode 100644 index 00000000..ca617c50 --- /dev/null +++ b/app/admin/service/sys_opera_log.go @@ -0,0 +1,110 @@ +package service + +import ( + "errors" + "go-admin/app/admin/models/system" + cDto "go-admin/common/dto" + "go-admin/common/log" + common "go-admin/common/models" + "go-admin/common/service" + "gorm.io/gorm" +) + +type SysOperaLog struct { + service.Service +} + +// GetSysOperaLogPage 获取SysOperaLog列表 +func (e *SysOperaLog) GetSysOperaLogPage(c cDto.Index, list *[]system.SysOperaLog, count *int64) error { + var err error + var data system.SysOperaLog + msgID := e.MsgID + + err = e.Orm.Model(&data). + Scopes( + cDto.MakeCondition(c.GetNeedSearch()), + cDto.Paginate(c.GetPageSize(), c.GetPageIndex()), + ). + Find(list).Limit(-1).Offset(-1). + Count(count).Error + if err != nil { + log.Errorf("msgID[%s] db error:%s", msgID, err) + return err + } + return nil +} + +// GetSysOperaLog 获取SysOperaLog对象 +func (e *SysOperaLog) GetSysOperaLog(d cDto.Control, model *system.SysOperaLog) error { + var err error + var data system.SysOperaLog + msgID := e.MsgID + + db := e.Orm.Model(&data). + First(model, d.GetId()) + err = db.Error + if err != nil && errors.Is(err, gorm.ErrRecordNotFound) { + err = errors.New("查看对象不存在或无权查看") + log.Errorf("msgID[%s] db error:%s", msgID, err) + return err + } + if db.Error != nil { + log.Errorf("msgID[%s] db error:%s", msgID, err) + return err + } + return nil +} + +// InsertSysOperaLog 创建SysOperaLog对象 +func (e *SysOperaLog) InsertSysOperaLog(model common.ActiveRecord) error { + var err error + var data system.SysOperaLog + msgID := e.MsgID + + err = e.Orm.Model(&data). + Create(model).Error + if err != nil { + log.Errorf("msgID[%s] db error:%s", msgID, err) + return err + } + return nil +} + +// UpdateSysOperaLog 修改SysOperaLog对象 +func (e *SysOperaLog) UpdateSysOperaLog(c common.ActiveRecord) error { + var err error + var data system.SysOperaLog + msgID := e.MsgID + + db := e.Orm.Model(&data). + Where(c.GetId()).Updates(c) + if db.Error != nil { + log.Errorf("msgID[%s] db error:%s", msgID, err) + return err + } + if db.RowsAffected == 0 { + return errors.New("无权更新该数据") + + } + return nil +} + +// RemoveSysOperaLog 删除SysOperaLog +func (e *SysOperaLog) RemoveSysOperaLog(d cDto.Control, c common.ActiveRecord) error { + var err error + var data system.SysOperaLog + msgID := e.MsgID + + db := e.Orm.Model(&data). + Where(d.GetId()).Delete(c) + if db.Error != nil { + err = db.Error + log.Errorf("MsgID[%s] Delete error: %s", msgID, err) + return err + } + if db.RowsAffected == 0 { + err = errors.New("无权删除该数据") + return err + } + return nil +} \ No newline at end of file diff --git a/cmd/migrate/migration/version/1599190683659_tables.go b/cmd/migrate/migration/version/1599190683659_tables.go index 42eeda3b..e759747a 100644 --- a/cmd/migrate/migration/version/1599190683659_tables.go +++ b/cmd/migrate/migration/version/1599190683659_tables.go @@ -25,8 +25,8 @@ func _1599190683659Tables(db *gorm.DB, version string) error { new(tools.SysTables), new(tools.SysColumns), new(models.Menu), - new(models.LoginLog), - new(models.SysOperLog), + new(system.SysLoginLog), + new(system.SysOperaLog), new(models.RoleMenu), new(models.SysRoleDept), new(models.SysUser), diff --git a/cmd/migrate/migration/version/1599190683670_migrate.go b/cmd/migrate/migration/version/1599190683670_migrate.go index a1756592..88354204 100644 --- a/cmd/migrate/migration/version/1599190683670_migrate.go +++ b/cmd/migrate/migration/version/1599190683670_migrate.go @@ -20,11 +20,6 @@ func init() { func _1599190683670Test(db *gorm.DB, version string) error { return db.Transaction(func(tx *gorm.DB) error { - list1 := []models.RoleMenu{ - } - list2 := []models.CasbinRule{ - } - list3 := []models.SysDept{ {DeptId: 1, ParentId: 0, DeptPath: "/0/1", DeptName: "爱拓科技", Sort: 0, Leader: "aituo", Phone: "13782218188", Email: "atuo@aituo.com", Status: "0", CreateBy: "1", UpdateBy: "1", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, {DeptId: 7, ParentId: 1, DeptPath: "/0/1/7", DeptName: "研发部", Sort: 1, Leader: "aituo", Phone: "13782218188", Email: "atuo@aituo.com", Status: "0", CreateBy: "1", UpdateBy: "1", BaseModel: models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}}, @@ -109,16 +104,7 @@ func _1599190683670Test(db *gorm.DB, version string) error { {2, "函数测试", "DEFAULT", 2, "0/5 * * * * ", "ExamplesOne", "参数", 1, 1, 1, 0, "", "", models.BaseModel{CreatedAt: time.Now(), UpdatedAt: time.Now()}, ""}, } - err := tx.Create(list1).Error - if err != nil { - return err - } - err = tx.Create(list2).Error - if err != nil { - return err - } - - err = tx.Create(list3).Error + err := tx.Create(list3).Error if err != nil { return err } diff --git a/cmd/migrate/migration/version/1603465014697_migrate.go b/cmd/migrate/migration/version/1603465014697_migrate.go new file mode 100644 index 00000000..63aed144 --- /dev/null +++ b/cmd/migrate/migration/version/1603465014697_migrate.go @@ -0,0 +1,28 @@ +package version + +import ( + "go-admin/app/admin/models" + //"go-admin/app/admin/models" + "gorm.io/gorm" + "runtime" + + "go-admin/cmd/migrate/migration" + common "go-admin/common/models" +) + +func init() { + _, fileName, _, _ := runtime.Caller(0) + migration.Migrate.SetVersion(migration.GetFilename(fileName), _1603465014697Test) +} + +func _1603465014697Test(db *gorm.DB, version string) error { + return db.Transaction(func(tx *gorm.DB) error { + err := tx.Debug().Model(&models.Menu{}).Where("path = ?", "/api/v1/syscategoryList").Update("path", "/api/v1/syscategory").Error + if err != nil { + return err + } + return tx.Create(&common.Migration{ + Version: version, + }).Error + }) +} diff --git a/cmd/migrate/migration/version/1603516925109_migrate.go b/cmd/migrate/migration/version/1603516925109_migrate.go new file mode 100644 index 00000000..f2539cfb --- /dev/null +++ b/cmd/migrate/migration/version/1603516925109_migrate.go @@ -0,0 +1,41 @@ +package version + +import ( + "gorm.io/gorm" + + "go-admin/app/admin/models/system" + "go-admin/cmd/migrate/migration" + common "go-admin/common/models" + + "runtime" +) + +func init() { + _, fileName, _, _ := runtime.Caller(0) + migration.Migrate.SetVersion(migration.GetFilename(fileName), _1603516925109Test) +} + +func _1603516925109Test(db *gorm.DB, version string) error { + return db.Transaction(func(tx *gorm.DB) error { + _ = tx.Migrator().RenameTable("sys_operlog", "sys_opera_log") + _ = tx.Migrator().RenameTable("sys_loginlog", "sys_login_log") + + if tx.Migrator().HasColumn(&system.SysLoginLog{}, "info_id") { + err := tx.Migrator().RenameColumn(&system.SysLoginLog{}, "info_id", "id") + if err != nil { + return err + } + } + + if tx.Migrator().HasColumn(&system.SysOperaLog{}, "oper_id") { + err := tx.Migrator().RenameColumn(&system.SysOperaLog{}, "oper_id", "id") + if err != nil { + return err + } + } + + return tx.Create(&common.Migration{ + Version: version, + }).Error + }) +} diff --git a/go-admin-ui/src/api/syscategory.js b/go-admin-ui/src/api/syscategory.js deleted file mode 100644 index cde5aead..00000000 --- a/go-admin-ui/src/api/syscategory.js +++ /dev/null @@ -1,47 +0,0 @@ -import request from '@/utils/request' - -// 查询SysCategory列表 -export function listSysCategory(query) { - return request({ - url: '/api/v1/cms', - method: 'get', - params: query - }) -} - -// 查询SysCategory详细 -export function getSysCategory (ID) { - return request({ - url: '/api/v1/cms/' + ID, - method: 'get' - }) -} - - -// 新增SysCategory -export function addSysCategory(data) { - return request({ - url: '/api/v1/cms', - method: 'post', - data: data - }) -} - -// 修改SysCategory -export function updateSysCategory(data) { - return request({ - url: '/api/v1/cms/'+data.ID, - method: 'put', - data: data - }) -} - -// 删除SysCategory -export function delSysCategory(data) { - return request({ - url: '/api/v1/cms', - method: 'delete', - data: data - }) -} - diff --git a/go-admin-ui/src/views/syscategory/index.vue b/go-admin-ui/src/views/syscategory/index.vue deleted file mode 100644 index 6860b271..00000000 --- a/go-admin-ui/src/views/syscategory/index.vue +++ /dev/null @@ -1,329 +0,0 @@ - - - -