1
Some checks failed
Build / build (push) Has been cancelled
CodeQL / Analyze (go) (push) Has been cancelled
build / Build (push) Has been cancelled
GitHub Actions Mirror / mirror_to_gitee (push) Has been cancelled
GitHub Actions Mirror / mirror_to_gitlab (push) Has been cancelled
Issue Close Require / issue-close-require (push) Has been cancelled
Issue Check Inactive / issue-check-inactive (push) Has been cancelled

This commit is contained in:
2025-06-29 00:36:30 +08:00
commit 8ae43bfba9
305 changed files with 36307 additions and 0 deletions

37
app/admin/apis/captcha.go Normal file
View File

@ -0,0 +1,37 @@
package apis
import (
"github.com/gin-gonic/gin"
"github.com/go-admin-team/go-admin-core/sdk/api"
"github.com/go-admin-team/go-admin-core/sdk/pkg/captcha"
)
type System struct {
api.Api
}
// GenerateCaptchaHandler 获取验证码
// @Summary 获取验证码
// @Description 获取验证码
// @Tags 登陆
// @Success 200 {object} response.Response{data=string,id=string,msg=string} "{"code": 200, "data": [...]}"
// @Router /api/v1/captcha [get]
func (e System) GenerateCaptchaHandler(c *gin.Context) {
err := e.MakeContext(c).Errors
if err != nil {
e.Error(500, err, "服务初始化失败!")
return
}
id, b64s, err := captcha.DriverDigitFunc()
if err != nil {
e.Logger.Errorf("DriverDigitFunc error, %s", err.Error())
e.Error(500, err, "验证码获取失败")
return
}
e.Custom(gin.H{
"code": 200,
"data": b64s,
"id": id,
"msg": "success",
})
}

View File

@ -0,0 +1,39 @@
package apis
import (
"github.com/gin-gonic/gin"
)
const INDEX = `
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>GO-ADMIN欢迎您</title>
<style>
body{
margin:0;
padding:0;
overflow-y:hidden
}
</style>
<script src="https://libs.baidu.com/jquery/1.9.0/jquery.js"></script>
<script type="text/javascript">
window.onerror=function(){return true;}
$(function(){
headerH = 0;
var h=$(window).height();
$("#iframe").height((h-headerH)+"px");
});
</script>
</head>
<body>
<iframe id="iframe" frameborder="0" src="https://doc.go-admin.dev" style="width:100%;"></iframe>
</body>
</html>
`
func GoAdmin(c *gin.Context) {
c.Header("Content-Type", "text/html; charset=utf-8")
c.String(200, INDEX)
}

148
app/admin/apis/sys_api.go Normal file
View File

@ -0,0 +1,148 @@
package apis
import (
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"github.com/go-admin-team/go-admin-core/sdk/api"
"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user"
_ "github.com/go-admin-team/go-admin-core/sdk/pkg/response"
"go-admin/app/admin/models"
"go-admin/app/admin/service"
"go-admin/app/admin/service/dto"
"go-admin/common/actions"
)
type SysApi struct {
api.Api
}
// GetPage 获取接口管理列表
// @Summary 获取接口管理列表
// @Description 获取接口管理列表
// @Tags 接口管理
// @Param name query string false "名称"
// @Param title query string false "标题"
// @Param path query string false "地址"
// @Param action query string false "类型"
// @Param pageSize query int false "页条数"
// @Param pageIndex query int false "页码"
// @Success 200 {object} response.Response{data=response.Page{list=[]models.SysApi}} "{"code": 200, "data": [...]}"
// @Router /api/v1/sys-api [get]
// @Security Bearer
func (e SysApi) GetPage(c *gin.Context) {
s := service.SysApi{}
req := dto.SysApiGetPageReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req, binding.Form).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
//数据权限检查
p := actions.GetPermissionFromContext(c)
list := make([]models.SysApi, 0)
var count int64
err = s.GetPage(&req, p, &list, &count)
if err != nil {
e.Error(500, err, "查询失败")
return
}
e.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功")
}
// Get 获取接口管理
// @Summary 获取接口管理
// @Description 获取接口管理
// @Tags 接口管理
// @Param id path string false "id"
// @Success 200 {object} response.Response{data=models.SysApi} "{"code": 200, "data": [...]}"
// @Router /api/v1/sys-api/{id} [get]
// @Security Bearer
func (e SysApi) Get(c *gin.Context) {
req := dto.SysApiGetReq{}
s := service.SysApi{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req, nil).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
p := actions.GetPermissionFromContext(c)
var object models.SysApi
err = s.Get(&req, p, &object).Error
if err != nil {
e.Error(500, err, "查询失败")
return
}
e.OK(object, "查询成功")
}
// Update 修改接口管理
// @Summary 修改接口管理
// @Description 修改接口管理
// @Tags 接口管理
// @Accept application/json
// @Product application/json
// @Param data body dto.SysApiUpdateReq true "body"
// @Success 200 {object} response.Response "{"code": 200, "message": "修改成功"}"
// @Router /api/v1/sys-api/{id} [put]
// @Security Bearer
func (e SysApi) Update(c *gin.Context) {
req := dto.SysApiUpdateReq{}
s := service.SysApi{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
return
}
req.SetUpdateBy(user.GetUserId(c))
p := actions.GetPermissionFromContext(c)
err = s.Update(&req, p)
if err != nil {
e.Error(500, err, "更新失败")
return
}
e.OK(req.GetId(), "更新成功")
}
// DeleteSysApi 删除接口管理
// @Summary 删除接口管理
// @Description 删除接口管理
// @Tags 接口管理
// @Param data body dto.SysApiDeleteReq true "body"
// @Success 200 {object} response.Response "{"code": 200, "message": "删除成功"}"
// @Router /api/v1/sys-api [delete]
// @Security Bearer
func (e SysApi) DeleteSysApi(c *gin.Context) {
req := dto.SysApiDeleteReq{}
s := service.SysApi{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
return
}
p := actions.GetPermissionFromContext(c)
err = s.Remove(&req, p)
if err != nil {
e.Error(500, err, "删除失败")
return
}
e.OK(req.GetId(), "删除成功")
}

View File

@ -0,0 +1,313 @@
package apis
import (
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"github.com/go-admin-team/go-admin-core/sdk/api"
"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user"
"go-admin/app/admin/models"
"go-admin/app/admin/service"
"go-admin/app/admin/service/dto"
)
type SysConfig struct {
api.Api
}
// GetPage 获取配置管理列表
// @Summary 获取配置管理列表
// @Description 获取配置管理列表
// @Tags 配置管理
// @Param configName query string false "名称"
// @Param configKey query string false "key"
// @Param configType query string false "类型"
// @Param isFrontend query int false "是否前端"
// @Param pageSize query int false "页条数"
// @Param pageIndex query int false "页码"
// @Success 200 {object} response.Response{data=response.Page{list=[]models.SysApi}} "{"code": 200, "data": [...]}"
// @Router /api/v1/sys-config [get]
// @Security Bearer
func (e SysConfig) GetPage(c *gin.Context) {
s := service.SysConfig{}
req := dto.SysConfigGetPageReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req, binding.Form).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
return
}
list := make([]models.SysConfig, 0)
var count int64
err = s.GetPage(&req, &list, &count)
if err != nil {
e.Error(500, err, "查询失败")
return
}
e.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功")
}
// Get 获取配置管理
// @Summary 获取配置管理
// @Description 获取配置管理
// @Tags 配置管理
// @Param id path string false "id"
// @Success 200 {object} response.Response{data=models.SysConfig} "{"code": 200, "data": [...]}"
// @Router /api/v1/sys-config/{id} [get]
// @Security Bearer
func (e SysConfig) Get(c *gin.Context) {
req := dto.SysConfigGetReq{}
s := service.SysConfig{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req, binding.JSON, nil).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
var object models.SysConfig
err = s.Get(&req, &object)
if err != nil {
e.Error(500, err, err.Error())
return
}
e.OK(object, "查询成功")
}
// Insert 创建配置管理
// @Summary 创建配置管理
// @Description 创建配置管理
// @Tags 配置管理
// @Accept application/json
// @Product application/json
// @Param data body dto.SysConfigControl true "body"
// @Success 200 {object} response.Response "{"code": 200, "message": "创建成功"}"
// @Router /api/v1/sys-config [post]
// @Security Bearer
func (e SysConfig) Insert(c *gin.Context) {
s := service.SysConfig{}
req := dto.SysConfigControl{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req, binding.JSON).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
req.SetCreateBy(user.GetUserId(c))
err = s.Insert(&req)
if err != nil {
e.Error(500, err, "创建失败")
return
}
e.OK(req.GetId(), "创建成功")
}
// Update 修改配置管理
// @Summary 修改配置管理
// @Description 修改配置管理
// @Tags 配置管理
// @Accept application/json
// @Product application/json
// @Param data body dto.SysConfigControl true "body"
// @Success 200 {object} response.Response "{"code": 200, "message": "修改成功"}"
// @Router /api/v1/sys-config/{id} [put]
// @Security Bearer
func (e SysConfig) Update(c *gin.Context) {
s := service.SysConfig{}
req := dto.SysConfigControl{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req, binding.JSON, nil).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
req.SetUpdateBy(user.GetUserId(c))
err = s.Update(&req)
if err != nil {
e.Error(500, err, "更新失败")
return
}
e.OK(req.GetId(), "更新成功")
}
// Delete 删除配置管理
// @Summary 删除配置管理
// @Description 删除配置管理
// @Tags 配置管理
// @Param ids body []int false "ids"
// @Success 200 {object} response.Response "{"code": 200, "message": "删除成功"}"
// @Router /api/v1/sys-config [delete]
// @Security Bearer
func (e SysConfig) Delete(c *gin.Context) {
s := service.SysConfig{}
req := dto.SysConfigDeleteReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req, binding.JSON, nil).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
req.SetUpdateBy(user.GetUserId(c))
err = s.Remove(&req)
if err != nil {
e.Error(500, err, "删除失败")
return
}
e.OK(req.GetId(), "删除成功")
}
// Get2SysApp 获取系统配置信息
// @Summary 获取系统前台配置信息,主要注意这里不在验证权限
// @Description 获取系统配置信息,主要注意这里不在验证权限
// @Tags 配置管理
// @Success 200 {object} response.Response{data=map[string]string} "{"code": 200, "data": [...]}"
// @Router /api/v1/app-config [get]
func (e SysConfig) Get2SysApp(c *gin.Context) {
req := dto.SysConfigGetToSysAppReq{}
s := service.SysConfig{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req, binding.Form).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
return
}
// 控制只读前台的数据
req.IsFrontend = "1"
list := make([]models.SysConfig, 0)
err = s.GetWithKeyList(&req, &list)
if err != nil {
e.Error(500, err, "查询失败")
return
}
mp := make(map[string]string)
for i := 0; i < len(list); i++ {
key := list[i].ConfigKey
if key != "" {
mp[key] = list[i].ConfigValue
}
}
e.OK(mp, "查询成功")
}
// Get2Set 获取配置
// @Summary 获取配置
// @Description 界面操作设置配置值的获取
// @Tags 配置管理
// @Accept application/json
// @Product application/json
// @Success 200 {object} response.Response{data=map[string]interface{}} "{"code": 200, "message": "修改成功"}"
// @Router /api/v1/set-config [get]
// @Security Bearer
func (e SysConfig) Get2Set(c *gin.Context) {
s := service.SysConfig{}
req := make([]dto.GetSetSysConfigReq, 0)
err := e.MakeContext(c).
MakeOrm().
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
err = s.GetForSet(&req)
if err != nil {
e.Error(500, err, "查询失败")
return
}
m := make(map[string]interface{}, 0)
for _, v := range req {
m[v.ConfigKey] = v.ConfigValue
}
e.OK(m, "查询成功")
}
// Update2Set 设置配置
// @Summary 设置配置
// @Description 界面操作设置配置值
// @Tags 配置管理
// @Accept application/json
// @Product application/json
// @Param data body []dto.GetSetSysConfigReq true "body"
// @Success 200 {object} response.Response "{"code": 200, "message": "修改成功"}"
// @Router /api/v1/set-config [put]
// @Security Bearer
func (e SysConfig) Update2Set(c *gin.Context) {
s := service.SysConfig{}
req := make([]dto.GetSetSysConfigReq, 0)
err := e.MakeContext(c).
MakeOrm().
Bind(&req, binding.JSON).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
err = s.UpdateForSet(&req)
if err != nil {
e.Error(500, err, err.Error())
return
}
e.OK("", "更新成功")
}
// GetSysConfigByKEYForService 根据Key获取SysConfig的Service
// @Summary 根据Key获取SysConfig的Service
// @Description 根据Key获取SysConfig的Service
// @Tags 配置管理
// @Param configKey path string false "configKey"
// @Success 200 {object} response.Response{data=dto.SysConfigByKeyReq} "{"code": 200, "data": [...]}"
// @Router /api/v1/sys-config/{id} [get]
// @Security Bearer
func (e SysConfig) GetSysConfigByKEYForService(c *gin.Context) {
var s = new(service.SysConfig)
var req = new(dto.SysConfigByKeyReq)
var resp = new(dto.GetSysConfigByKEYForServiceResp)
err := e.MakeContext(c).
MakeOrm().
Bind(req, nil).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
err = s.GetWithKey(req, resp)
if err != nil {
e.Error(500, err, err.Error())
return
}
e.OK(resp, s.Msg)
}

238
app/admin/apis/sys_dept.go Normal file
View File

@ -0,0 +1,238 @@
package apis
import (
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"github.com/go-admin-team/go-admin-core/sdk/api"
"github.com/go-admin-team/go-admin-core/sdk/pkg"
"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user"
_ "github.com/go-admin-team/go-admin-core/sdk/pkg/response"
"go-admin/app/admin/models"
"go-admin/app/admin/service"
"go-admin/app/admin/service/dto"
)
type SysDept struct {
api.Api
}
// GetPage
// @Summary 分页部门列表数据
// @Description 分页列表
// @Tags 部门
// @Param deptName query string false "deptName"
// @Param deptId query string false "deptId"
// @Param position query string false "position"
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/dept [get]
// @Security Bearer
func (e SysDept) GetPage(c *gin.Context) {
s := service.SysDept{}
req := dto.SysDeptGetPageReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
list := make([]models.SysDept, 0)
list, err = s.SetDeptPage(&req)
if err != nil {
e.Error(500, err, "查询失败")
return
}
e.OK(list, "查询成功")
}
// Get
// @Summary 获取部门数据
// @Description 获取JSON
// @Tags 部门
// @Param deptId path string false "deptId"
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/dept/{deptId} [get]
// @Security Bearer
func (e SysDept) Get(c *gin.Context) {
s := service.SysDept{}
req := dto.SysDeptGetReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req, binding.JSON, nil).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
var object models.SysDept
err = s.Get(&req, &object)
if err != nil {
e.Error(500, err, "查询失败")
return
}
e.OK(object, "查询成功")
}
// Insert 添加部门
// @Summary 添加部门
// @Description 获取JSON
// @Tags 部门
// @Accept application/json
// @Product application/json
// @Param data body dto.SysDeptInsertReq true "data"
// @Success 200 {string} string "{"code": 200, "message": "添加成功"}"
// @Success 200 {string} string "{"code": -1, "message": "添加失败"}"
// @Router /api/v1/dept [post]
// @Security Bearer
func (e SysDept) Insert(c *gin.Context) {
s := service.SysDept{}
req := dto.SysDeptInsertReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req, binding.JSON).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
// 设置创建人
req.SetCreateBy(user.GetUserId(c))
err = s.Insert(&req)
if err != nil {
e.Error(500, err, "创建失败")
return
}
e.OK(req.GetId(), "创建成功")
}
// Update
// @Summary 修改部门
// @Description 获取JSON
// @Tags 部门
// @Accept application/json
// @Product application/json
// @Param id path int true "id"
// @Param data body dto.SysDeptUpdateReq true "body"
// @Success 200 {string} string "{"code": 200, "message": "添加成功"}"
// @Success 200 {string} string "{"code": -1, "message": "添加失败"}"
// @Router /api/v1/dept/{deptId} [put]
// @Security Bearer
func (e SysDept) Update(c *gin.Context) {
s := service.SysDept{}
req := dto.SysDeptUpdateReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
req.SetUpdateBy(user.GetUserId(c))
err = s.Update(&req)
if err != nil {
e.Error(500, err, err.Error())
return
}
e.OK(req.GetId(), "更新成功")
}
// Delete
// @Summary 删除部门
// @Description 删除数据
// @Tags 部门
// @Param data body dto.SysDeptDeleteReq true "body"
// @Success 200 {string} string "{"code": 200, "message": "删除成功"}"
// @Success 200 {string} string "{"code": -1, "message": "删除失败"}"
// @Router /api/v1/dept [delete]
// @Security Bearer
func (e SysDept) Delete(c *gin.Context) {
s := service.SysDept{}
req := dto.SysDeptDeleteReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req, binding.JSON, nil).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
err = s.Remove(&req)
if err != nil {
e.Error(500, err, "删除失败")
return
}
e.OK(req.GetId(), "删除成功")
}
// Get2Tree 用户管理 左侧部门树
func (e SysDept) Get2Tree(c *gin.Context) {
s := service.SysDept{}
req := dto.SysDeptGetPageReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req,binding.Form).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
list := make([]dto.DeptLabel, 0)
list, err = s.SetDeptTree(&req)
if err != nil {
e.Error(500, err, "查询失败")
return
}
e.OK(list, "")
}
// GetDeptTreeRoleSelect TODO: 此接口需要调整不应该将list和选中放在一起
func (e SysDept) GetDeptTreeRoleSelect(c *gin.Context) {
s := service.SysDept{}
err := e.MakeContext(c).
MakeOrm().
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
id, err := pkg.StringToInt(c.Param("roleId"))
result, err := s.SetDeptLabel()
if err != nil {
e.Error(500, err, err.Error())
return
}
menuIds := make([]int, 0)
if id != 0 {
menuIds, err = s.GetWithRoleId(id)
if err != nil {
e.Error(500, err, err.Error())
return
}
}
e.OK(gin.H{
"depts": result,
"checkedKeys": menuIds,
}, "")
}

View File

@ -0,0 +1,220 @@
package apis
import (
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"github.com/go-admin-team/go-admin-core/sdk/api"
"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user"
_ "github.com/go-admin-team/go-admin-core/sdk/pkg/response"
"go-admin/app/admin/models"
"go-admin/app/admin/service"
"go-admin/app/admin/service/dto"
)
type SysDictData struct {
api.Api
}
// GetPage
// @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} response.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/dict/data [get]
// @Security Bearer
func (e SysDictData) GetPage(c *gin.Context) {
s := service.SysDictData{}
req := dto.SysDictDataGetPageReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req, binding.Form).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
list := make([]models.SysDictData, 0)
var count int64
err = s.GetPage(&req, &list, &count)
if err != nil {
e.Error(500, err, "查询失败")
return
}
e.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功")
}
// Get
// @Summary 通过编码获取字典数据
// @Description 获取JSON
// @Tags 字典数据
// @Param dictCode path int true "字典编码"
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/dict/data/{dictCode} [get]
// @Security Bearer
func (e SysDictData) Get(c *gin.Context) {
s := service.SysDictData{}
req := dto.SysDictDataGetReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req, nil).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
var object models.SysDictData
err = s.Get(&req, &object)
if err != nil {
e.Logger.Warnf("Get error: %s", err.Error())
e.Error(500, err, "查询失败")
return
}
e.OK(object, "查询成功")
}
// Insert
// @Summary 添加字典数据
// @Description 获取JSON
// @Tags 字典数据
// @Accept application/json
// @Product application/json
// @Param data body dto.SysDictDataInsertReq true "data"
// @Success 200 {object} response.Response "{"code": 200, "message": "添加成功"}"
// @Router /api/v1/dict/data [post]
// @Security Bearer
func (e SysDictData) Insert(c *gin.Context) {
s := service.SysDictData{}
req := dto.SysDictDataInsertReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req, binding.JSON).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
req.SetCreateBy(user.GetUserId(c))
err = s.Insert(&req)
if err != nil {
e.Error(500, err, "创建失败")
return
}
e.OK(req.GetId(), "创建成功")
}
// Update
// @Summary 修改字典数据
// @Description 获取JSON
// @Tags 字典数据
// @Accept application/json
// @Product application/json
// @Param data body dto.SysDictDataUpdateReq true "body"
// @Success 200 {object} response.Response "{"code": 200, "message": "修改成功"}"
// @Router /api/v1/dict/data/{dictCode} [put]
// @Security Bearer
func (e SysDictData) Update(c *gin.Context) {
s := service.SysDictData{}
req := dto.SysDictDataUpdateReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req, binding.JSON, nil).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
req.SetUpdateBy(user.GetUserId(c))
err = s.Update(&req)
if err != nil {
e.Error(500, err, "更新失败")
return
}
e.OK(req.GetId(), "更新成功")
}
// Delete
// @Summary 删除字典数据
// @Description 删除数据
// @Tags 字典数据
// @Param dictCode body dto.SysDictDataDeleteReq true "body"
// @Success 200 {object} response.Response "{"code": 200, "message": "删除成功"}"
// @Router /api/v1/dict/data [delete]
// @Security Bearer
func (e SysDictData) Delete(c *gin.Context) {
s := service.SysDictData{}
req := dto.SysDictDataDeleteReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req, binding.JSON, nil).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
req.SetUpdateBy(user.GetUserId(c))
err = s.Remove(&req)
if err != nil {
e.Error(500, err, "删除失败")
return
}
e.OK(req.GetId(), "删除成功")
}
// GetAll 数据字典根据key获取 业务页面使用
// @Summary 数据字典根据key获取
// @Description 数据字典根据key获取
// @Tags 字典数据
// @Param dictType query int true "dictType"
// @Success 200 {object} response.Response{data=[]dto.SysDictDataGetAllResp} "{"code": 200, "data": [...]}"
// @Router /api/v1/dict-data/option-select [get]
// @Security Bearer
func (e SysDictData) GetAll(c *gin.Context) {
s := service.SysDictData{}
req := dto.SysDictDataGetPageReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
list := make([]models.SysDictData, 0)
err = s.GetAll(&req, &list)
if err != nil {
e.Error(500, err, "查询失败")
return
}
l := make([]dto.SysDictDataGetAllResp, 0)
for _, i := range list {
d := dto.SysDictDataGetAllResp{}
e.Translate(i, &d)
l = append(l, d)
}
e.OK(l,"查询成功")
}

View File

@ -0,0 +1,210 @@
package apis
import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"github.com/go-admin-team/go-admin-core/sdk/api"
"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user"
_ "github.com/go-admin-team/go-admin-core/sdk/pkg/response"
"go-admin/app/admin/models"
"go-admin/app/admin/service"
"go-admin/app/admin/service/dto"
)
type SysDictType struct {
api.Api
}
// GetPage 字典类型列表数据
// @Summary 字典类型列表数据
// @Description 获取JSON
// @Tags 字典类型
// @Param dictName query string false "dictName"
// @Param dictId query string false "dictId"
// @Param dictType query string false "dictType"
// @Param pageSize query int false "页条数"
// @Param pageIndex query int false "页码"
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/dict/type [get]
// @Security Bearer
func (e SysDictType) GetPage(c *gin.Context) {
s := service.SysDictType{}
req :=dto.SysDictTypeGetPageReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req, binding.Form).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
list := make([]models.SysDictType, 0)
var count int64
err = s.GetPage(&req, &list, &count)
if err != nil {
e.Error(500, err, "查询失败")
return
}
e.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功")
}
// Get 字典类型通过字典id获取
// @Summary 字典类型通过字典id获取
// @Description 获取JSON
// @Tags 字典类型
// @Param dictId path int true "字典类型编码"
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/dict/type/{dictId} [get]
// @Security Bearer
func (e SysDictType) Get(c *gin.Context) {
s := service.SysDictType{}
req :=dto.SysDictTypeGetReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req, nil).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
var object models.SysDictType
err = s.Get(&req, &object)
if err != nil {
e.Error(500, err, "查询失败")
return
}
e.OK(object, "查询成功")
}
//Insert 字典类型创建
// @Summary 添加字典类型
// @Description 获取JSON
// @Tags 字典类型
// @Accept application/json
// @Product application/json
// @Param data body dto.SysDictTypeInsertReq true "data"
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/dict/type [post]
// @Security Bearer
func (e SysDictType) Insert(c *gin.Context) {
s := service.SysDictType{}
req :=dto.SysDictTypeInsertReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req, binding.JSON).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
req.SetCreateBy(user.GetUserId(c))
err = s.Insert(&req)
if err != nil {
e.Logger.Error(err)
e.Error(500, err,fmt.Sprintf(" 创建字典类型失败,详情:%s", err.Error()))
return
}
e.OK(req.GetId(), "创建成功")
}
// Update
// @Summary 修改字典类型
// @Description 获取JSON
// @Tags 字典类型
// @Accept application/json
// @Product application/json
// @Param data body dto.SysDictTypeUpdateReq true "body"
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/dict/type/{dictId} [put]
// @Security Bearer
func (e SysDictType) Update(c *gin.Context) {
s := service.SysDictType{}
req :=dto.SysDictTypeUpdateReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req, binding.JSON, nil).
MakeService(&s.Service).
Errors
if err != nil {
e.Error(500, err, err.Error())
e.Logger.Error(err)
return
}
req.SetUpdateBy(user.GetUserId(c))
err = s.Update(&req)
if err != nil {
e.Logger.Error(err)
return
}
e.OK(req.GetId(), "更新成功")
}
// Delete
// @Summary 删除字典类型
// @Description 删除数据
// @Tags 字典类型
// @Param dictCode body dto.SysDictTypeDeleteReq true "body"
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/dict/type [delete]
// @Security Bearer
func (e SysDictType) Delete(c *gin.Context) {
s := service.SysDictType{}
req :=dto.SysDictTypeDeleteReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req, binding.JSON, nil).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
req.SetUpdateBy(user.GetUserId(c))
err = s.Remove(&req)
if err != nil {
e.Error(500, err, err.Error())
return
}
e.OK(req.GetId(), "删除成功")
}
// GetAll
// @Summary 字典类型全部数据 代码生成使用接口
// @Description 获取JSON
// @Tags 字典类型
// @Param dictName query string false "dictName"
// @Param dictId query string false "dictId"
// @Param dictType query string false "dictType"
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/dict/type-option-select [get]
// @Security Bearer
func (e SysDictType) GetAll(c *gin.Context) {
s := service.SysDictType{}
req :=dto.SysDictTypeGetPageReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req, binding.Form).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
list := make([]models.SysDictType, 0)
err = s.GetAll(&req, &list)
if err != nil {
e.Error(500, err, err.Error())
return
}
e.OK(list, "查询成功")
}

View File

@ -0,0 +1,110 @@
package apis
import (
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"github.com/go-admin-team/go-admin-core/sdk/api"
"go-admin/app/admin/models"
"go-admin/app/admin/service"
"go-admin/app/admin/service/dto"
)
type SysLoginLog struct {
api.Api
}
// GetPage 登录日志列表
// @Summary 登录日志列表
// @Description 获取JSON
// @Tags 登录日志
// @Param username query string false "用户名"
// @Param ipaddr query string false "ip地址"
// @Param loginLocation query string false "归属地"
// @Param status query string false "状态"
// @Param beginTime query string false "开始时间"
// @Param endTime query string false "结束时间"
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/sys-login-log [get]
// @Security Bearer
func (e SysLoginLog) GetPage(c *gin.Context) {
s := service.SysLoginLog{}
req :=dto.SysLoginLogGetPageReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req, binding.Form).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
list := make([]models.SysLoginLog, 0)
var count int64
err = s.GetPage(&req, &list, &count)
if err != nil {
e.Error(500, err, "查询失败")
return
}
e.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功")
}
// Get 登录日志通过id获取
// @Summary 登录日志通过id获取
// @Description 获取JSON
// @Tags 登录日志
// @Param id path string false "id"
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/sys-login-log/{id} [get]
// @Security Bearer
func (e SysLoginLog) Get(c *gin.Context) {
s := service.SysLoginLog{}
req :=dto.SysLoginLogGetReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
var object models.SysLoginLog
err = s.Get(&req, &object)
if err != nil {
e.Error(500, err, "查询失败")
return
}
e.OK(object, "查询成功")
}
// Delete 登录日志删除
// @Summary 登录日志删除
// @Description 登录日志删除
// @Tags 登录日志
// @Param data body dto.SysLoginLogDeleteReq true "body"
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/sys-login-log [delete]
// @Security Bearer
func (e SysLoginLog) Delete(c *gin.Context) {
s := service.SysLoginLog{}
req :=dto.SysLoginLogDeleteReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req, binding.JSON, nil).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
err = s.Remove(&req)
if err != nil {
e.Error(500, err, "删除失败")
return
}
e.OK(req.GetId(), "删除成功")
}

287
app/admin/apis/sys_menu.go Normal file
View File

@ -0,0 +1,287 @@
package apis
import (
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"github.com/go-admin-team/go-admin-core/sdk/api"
"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user"
"go-admin/app/admin/models"
"go-admin/app/admin/service"
"go-admin/app/admin/service/dto"
)
type SysMenu struct {
api.Api
}
// GetPage Menu列表数据
// @Summary Menu列表数据
// @Description 获取JSON
// @Tags 菜单
// @Param menuName query string false "menuName"
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/menu [get]
// @Security Bearer
func (e SysMenu) GetPage(c *gin.Context) {
s := service.SysMenu{}
req := dto.SysMenuGetPageReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req, binding.Form).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
var list = make([]models.SysMenu, 0)
err = s.GetPage(&req, &list).Error
if err != nil {
e.Error(500, err, "查询失败")
return
}
e.OK(list, "查询成功")
}
// Get 获取菜单详情
// @Summary Menu详情数据
// @Description 获取JSON
// @Tags 菜单
// @Param id path string false "id"
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/menu/{id} [get]
// @Security Bearer
func (e SysMenu) Get(c *gin.Context) {
req := dto.SysMenuGetReq{}
s := new(service.SysMenu)
err := e.MakeContext(c).
MakeOrm().
Bind(&req, nil).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
var object = models.SysMenu{}
err = s.Get(&req, &object).Error
if err != nil {
e.Error(500, err, "查询失败")
return
}
e.OK(object, "查询成功")
}
// Insert 创建菜单
// @Summary 创建菜单
// @Description 获取JSON
// @Tags 菜单
// @Accept application/json
// @Product application/json
// @Param data body dto.SysMenuInsertReq true "data"
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/menu [post]
// @Security Bearer
func (e SysMenu) Insert(c *gin.Context) {
req := dto.SysMenuInsertReq{}
s := new(service.SysMenu)
err := e.MakeContext(c).
MakeOrm().
Bind(&req, binding.JSON).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
// 设置创建人
req.SetCreateBy(user.GetUserId(c))
err = s.Insert(&req).Error
if err != nil {
e.Error(500, err, "创建失败")
return
}
e.OK(req.GetId(), "创建成功")
}
// Update 修改菜单
// @Summary 修改菜单
// @Description 获取JSON
// @Tags 菜单
// @Accept application/json
// @Product application/json
// @Param id path int true "id"
// @Param data body dto.SysMenuUpdateReq true "body"
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/menu/{id} [put]
// @Security Bearer
func (e SysMenu) Update(c *gin.Context) {
req := dto.SysMenuUpdateReq{}
s := new(service.SysMenu)
err := e.MakeContext(c).
MakeOrm().
Bind(&req, binding.JSON, nil).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
req.SetUpdateBy(user.GetUserId(c))
err = s.Update(&req).Error
if err != nil {
e.Error(500, err, "更新失败")
return
}
e.OK(req.GetId(), "更新成功")
}
// Delete 删除菜单
// @Summary 删除菜单
// @Description 删除数据
// @Tags 菜单
// @Param data body dto.SysMenuDeleteReq true "body"
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/menu [delete]
// @Security Bearer
func (e SysMenu) Delete(c *gin.Context) {
control := new(dto.SysMenuDeleteReq)
s := new(service.SysMenu)
err := e.MakeContext(c).
MakeOrm().
Bind(control, binding.JSON).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
err = s.Remove(control).Error
if err != nil {
e.Logger.Errorf("RemoveSysMenu error, %s", err)
e.Error(500, err, "删除失败")
return
}
e.OK(control.GetId(), "删除成功")
}
// GetMenuRole 根据登录角色名称获取菜单列表数据(左菜单使用)
// @Summary 根据登录角色名称获取菜单列表数据(左菜单使用)
// @Description 获取JSON
// @Tags 菜单
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/menurole [get]
// @Security Bearer
func (e SysMenu) GetMenuRole(c *gin.Context) {
s := new(service.SysMenu)
err := e.MakeContext(c).
MakeOrm().
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
result, err := s.SetMenuRole(user.GetRoleName(c))
if err != nil {
e.Error(500, err, "查询失败")
return
}
e.OK(result, "")
}
//// GetMenuIDS 获取角色对应的菜单id数组
//// @Summary 获取角色对应的菜单id数组设置角色权限使用
//// @Description 获取JSON
//// @Tags 菜单
//// @Param id path int true "id"
//// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
//// @Router /api/v1/menuids/{id} [get]
//// @Security Bearer
//func (e SysMenu) GetMenuIDS(c *gin.Context) {
// s := new(service.SysMenu)
// r := service.SysRole{}
// m := dto.SysRoleByName{}
// err := e.MakeContext(c).
// MakeOrm().
// Bind(&m, binding.JSON).
// MakeService(&s.Service).
// MakeService(&r.Service).
// Errors
// if err != nil {
// e.Logger.Error(err)
// e.Error(500, err, err.Error())
// return
// }
// var data models.SysRole
// err = r.GetWithName(&m, &data).Error
//
// //data.RoleName = c.GetString("role")
// //data.UpdateBy = user.GetUserId(c)
// //result, err := data.GetIDS(s.Orm)
//
// if err != nil {
// e.Logger.Errorf("GetIDS error, %s", err.Error())
// e.Error(500, err, "获取失败")
// return
// }
// e.OK(result, "")
//}
// GetMenuTreeSelect 根据角色ID查询菜单下拉树结构
// @Summary 角色修改使用的菜单列表
// @Description 获取JSON
// @Tags 菜单
// @Accept application/json
// @Product application/json
// @Param roleId path int true "roleId"
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/menuTreeselect/{roleId} [get]
// @Security Bearer
func (e SysMenu) GetMenuTreeSelect(c *gin.Context) {
m := service.SysMenu{}
r := service.SysRole{}
req :=dto.SelectRole{}
err := e.MakeContext(c).
MakeOrm().
MakeService(&m.Service).
MakeService(&r.Service).
Bind(&req, nil).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
result, err := m.SetLabel()
if err != nil {
e.Error(500, err, "查询失败")
return
}
menuIds := make([]int, 0)
if req.RoleId != 0 {
menuIds, err = r.GetRoleMenuId(req.RoleId)
if err != nil {
e.Error(500, err, "")
return
}
}
e.OK(gin.H{
"menus": result,
"checkedKeys": menuIds,
}, "获取成功")
}

View File

@ -0,0 +1,118 @@
package apis
import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"github.com/go-admin-team/go-admin-core/sdk/api"
"go-admin/app/admin/models"
"go-admin/app/admin/service"
"go-admin/app/admin/service/dto"
)
type SysOperaLog struct {
api.Api
}
// GetPage 操作日志列表
// @Summary 操作日志列表
// @Description 获取JSON
// @Tags 操作日志
// @Param title query string false "title"
// @Param method query string false "method"
// @Param requestMethod query string false "requestMethod"
// @Param operUrl query string false "operUrl"
// @Param operIp query string false "operIp"
// @Param status query string false "status"
// @Param beginTime query string false "beginTime"
// @Param endTime query string false "endTime"
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/sys-opera-log [get]
// @Security Bearer
func (e SysOperaLog) GetPage(c *gin.Context) {
s := service.SysOperaLog{}
req := new(dto.SysOperaLogGetPageReq)
err := e.MakeContext(c).
MakeOrm().
Bind(req, binding.Form).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
list := make([]models.SysOperaLog, 0)
var count int64
err = s.GetPage(req, &list, &count)
if err != nil {
e.Error(500, err, "查询失败")
return
}
e.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功")
}
// Get 操作日志通过id获取
// @Summary 操作日志通过id获取
// @Description 获取JSON
// @Tags 操作日志
// @Param id path string false "id"
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/sys-opera-log/{id} [get]
// @Security Bearer
func (e SysOperaLog) Get(c *gin.Context) {
s := new(service.SysOperaLog)
req :=dto.SysOperaLogGetReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req, nil).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
var object models.SysOperaLog
err = s.Get(&req, &object)
if err != nil {
e.Error(500, err, "查询失败")
return
}
e.OK(object, "查询成功")
}
// Delete 操作日志删除
// DeleteSysMenu 操作日志删除
// @Summary 删除操作日志
// @Description 删除数据
// @Tags 操作日志
// @Param data body dto.SysOperaLogDeleteReq true "body"
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/sys-opera-log [delete]
// @Security Bearer
func (e SysOperaLog) Delete(c *gin.Context) {
s := new(service.SysOperaLog)
req :=dto.SysOperaLogDeleteReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req, binding.JSON).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
err = s.Remove(&req)
if err != nil {
e.Logger.Error(err)
e.Error(500,err, fmt.Sprintf("删除失败!错误详情:%s", err.Error()))
return
}
e.OK(req.GetId(), "删除成功")
}

184
app/admin/apis/sys_post.go Normal file
View File

@ -0,0 +1,184 @@
package apis
import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"github.com/go-admin-team/go-admin-core/sdk/api"
"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user"
_ "github.com/go-admin-team/go-admin-core/sdk/pkg/response"
"go-admin/app/admin/models"
"go-admin/app/admin/service"
"go-admin/app/admin/service/dto"
)
type SysPost struct {
api.Api
}
// GetPage
// @Summary 岗位列表数据
// @Description 获取JSON
// @Tags 岗位
// @Param postName query string false "postName"
// @Param postCode query string false "postCode"
// @Param postId query string false "postId"
// @Param status query string false "status"
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/post [get]
// @Security Bearer
func (e SysPost) GetPage(c *gin.Context) {
s := service.SysPost{}
req :=dto.SysPostPageReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req, binding.Form).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
list := make([]models.SysPost, 0)
var count int64
err = s.GetPage(&req, &list, &count)
if err != nil {
e.Error(500, err, "查询失败")
return
}
e.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功")
}
// Get
// @Summary 获取岗位信息
// @Description 获取JSON
// @Tags 岗位
// @Param id path int true "编码"
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/post/{postId} [get]
// @Security Bearer
func (e SysPost) Get(c *gin.Context) {
s := service.SysPost{}
req :=dto.SysPostGetReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req, nil).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
var object models.SysPost
err = s.Get(&req, &object)
if err != nil {
e.Error(500, err, fmt.Sprintf("岗位信息获取失败!错误详情:%s", err.Error()))
return
}
e.OK(object, "查询成功")
}
// Insert
// @Summary 添加岗位
// @Description 获取JSON
// @Tags 岗位
// @Accept application/json
// @Product application/json
// @Param data body dto.SysPostInsertReq true "data"
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/post [post]
// @Security Bearer
func (e SysPost) Insert(c *gin.Context) {
s := service.SysPost{}
req :=dto.SysPostInsertReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req, binding.JSON).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
req.SetCreateBy(user.GetUserId(c))
err = s.Insert(&req)
if err != nil {
e.Error(500, err, fmt.Sprintf("新建岗位失败!错误详情:%s", err.Error()))
return
}
e.OK(req.GetId(), "创建成功")
}
// Update
// @Summary 修改岗位
// @Description 获取JSON
// @Tags 岗位
// @Accept application/json
// @Product application/json
// @Param data body dto.SysPostUpdateReq true "body"
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/post/{id} [put]
// @Security Bearer
func (e SysPost) Update(c *gin.Context) {
s := service.SysPost{}
req :=dto.SysPostUpdateReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req, binding.JSON, nil).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
req.SetUpdateBy(user.GetUserId(c))
err = s.Update(&req)
if err != nil {
e.Error(500, err, fmt.Sprintf("岗位更新失败!错误详情:%s", err.Error()))
return
}
e.OK(req.GetId(), "更新成功")
}
// Delete
// @Summary 删除岗位
// @Description 删除数据
// @Tags 岗位
// @Param id body dto.SysPostDeleteReq true "请求参数"
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/post [delete]
// @Security Bearer
func (e SysPost) Delete(c *gin.Context) {
s := service.SysPost{}
req :=dto.SysPostDeleteReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req, binding.JSON).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
req.SetUpdateBy(user.GetUserId(c))
err = s.Remove(&req)
if err != nil {
e.Error(500, err, fmt.Sprintf("岗位删除失败!错误详情:%s", err.Error()))
return
}
e.OK(req.GetId(), "删除成功")
}

284
app/admin/apis/sys_role.go Normal file
View File

@ -0,0 +1,284 @@
package apis
import (
"fmt"
"go-admin/common/global"
"net/http"
"github.com/gin-gonic/gin/binding"
"github.com/go-admin-team/go-admin-core/sdk"
"go-admin/app/admin/models"
"github.com/gin-gonic/gin"
"github.com/go-admin-team/go-admin-core/sdk/api"
"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user"
_ "github.com/go-admin-team/go-admin-core/sdk/pkg/response"
"go-admin/app/admin/service"
"go-admin/app/admin/service/dto"
)
type SysRole struct {
api.Api
}
// GetPage
// @Summary 角色列表数据
// @Description Get JSON
// @Tags 角色/Role
// @Param roleName query string false "roleName"
// @Param status query string false "status"
// @Param roleKey query string false "roleKey"
// @Param pageSize query int false "页条数"
// @Param pageIndex query int false "页码"
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/role [get]
// @Security Bearer
func (e SysRole) GetPage(c *gin.Context) {
s := service.SysRole{}
req := dto.SysRoleGetPageReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req, binding.Form).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
list := make([]models.SysRole, 0)
var count int64
err = s.GetPage(&req, &list, &count)
if err != nil {
e.Error(500, err, "查询失败")
return
}
e.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功")
}
// Get
// @Summary 获取Role数据
// @Description 获取JSON
// @Tags 角色/Role
// @Param roleId path string false "roleId"
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/role/{id} [get]
// @Security Bearer
func (e SysRole) Get(c *gin.Context) {
s := service.SysRole{}
req := dto.SysRoleGetReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req, nil).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, fmt.Sprintf(" %s ", err.Error()))
return
}
var object models.SysRole
err = s.Get(&req, &object)
if err != nil {
e.Error(http.StatusUnprocessableEntity, err, "查询失败")
return
}
e.OK(object, "查询成功")
}
// Insert
// @Summary 创建角色
// @Description 获取JSON
// @Tags 角色/Role
// @Accept application/json
// @Product application/json
// @Param data body dto.SysRoleInsertReq true "data"
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/role [post]
// @Security Bearer
func (e SysRole) Insert(c *gin.Context) {
s := service.SysRole{}
req := dto.SysRoleInsertReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req, binding.JSON).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
// 设置创建人
req.CreateBy = user.GetUserId(c)
if req.Status == "" {
req.Status = "2"
}
cb := sdk.Runtime.GetCasbinKey(c.Request.Host)
err = s.Insert(&req, cb)
if err != nil {
e.Logger.Error(err)
e.Error(500, err, "创建失败,"+err.Error())
return
}
_, err = global.LoadPolicy(c)
if err != nil {
e.Logger.Error(err)
e.Error(500, err, "创建失败,"+err.Error())
return
}
e.OK(req.GetId(), "创建成功")
}
// Update 修改用户角色
// @Summary 修改用户角色
// @Description 获取JSON
// @Tags 角色/Role
// @Accept application/json
// @Product application/json
// @Param data body dto.SysRoleUpdateReq true "body"
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/role/{id} [put]
// @Security Bearer
func (e SysRole) Update(c *gin.Context) {
s := service.SysRole{}
req := dto.SysRoleUpdateReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req, nil, binding.JSON).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
cb := sdk.Runtime.GetCasbinKey(c.Request.Host)
req.SetUpdateBy(user.GetUserId(c))
err = s.Update(&req, cb)
if err != nil {
e.Logger.Error(err)
return
}
_, err = global.LoadPolicy(c)
if err != nil {
e.Logger.Error(err)
e.Error(500, err, "更新失败,"+err.Error())
return
}
e.OK(req.GetId(), "更新成功")
}
// Delete
// @Summary 删除用户角色
// @Description 删除数据
// @Tags 角色/Role
// @Param data body dto.SysRoleDeleteReq true "body"
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/role [delete]
// @Security Bearer
func (e SysRole) Delete(c *gin.Context) {
s := new(service.SysRole)
req := dto.SysRoleDeleteReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req, binding.JSON).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, fmt.Sprintf("删除角色 %v 失败,\r\n失败信息 %s", req.Ids, err.Error()))
return
}
cb := sdk.Runtime.GetCasbinKey(c.Request.Host)
err = s.Remove(&req, cb)
if err != nil {
e.Logger.Error(err)
e.Error(500, err, "")
return
}
e.OK(req.GetId(), fmt.Sprintf("删除角色角色 %v 状态成功!", req.GetId()))
}
// Update2Status 修改用户角色状态
// @Summary 修改用户角色
// @Description 获取JSON
// @Tags 角色/Role
// @Accept application/json
// @Product application/json
// @Param data body dto.UpdateStatusReq true "body"
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/role-status/{id} [put]
// @Security Bearer
func (e SysRole) Update2Status(c *gin.Context) {
s := service.SysRole{}
req := dto.UpdateStatusReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req, binding.JSON, nil).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, fmt.Sprintf("更新角色状态失败,失败原因:%s ", err.Error()))
return
}
req.SetUpdateBy(user.GetUserId(c))
err = s.UpdateStatus(&req)
if err != nil {
e.Error(500, err, fmt.Sprintf("更新角色状态失败,失败原因:%s ", err.Error()))
return
}
e.OK(req.GetId(), fmt.Sprintf("更新角色 %v 状态成功!", req.GetId()))
}
// Update2DataScope 更新角色数据权限
// @Summary 更新角色数据权限
// @Description 获取JSON
// @Tags 角色/Role
// @Accept application/json
// @Product application/json
// @Param data body dto.RoleDataScopeReq true "body"
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/role-status/{id} [put]
// @Security Bearer
func (e SysRole) Update2DataScope(c *gin.Context) {
s := service.SysRole{}
req := dto.RoleDataScopeReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req, binding.JSON, nil).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
data := &models.SysRole{
RoleId: req.RoleId,
DataScope: req.DataScope,
DeptIds: req.DeptIds,
}
data.UpdateBy = user.GetUserId(c)
err = s.UpdateDataScope(&req).Error
if err != nil {
e.Error(500, err, fmt.Sprintf("更新角色数据权限失败!错误详情:%s", err.Error()))
return
}
e.OK(nil, "操作成功")
}

459
app/admin/apis/sys_user.go Normal file
View File

@ -0,0 +1,459 @@
package apis
import (
"github.com/gin-gonic/gin/binding"
"go-admin/app/admin/models"
"golang.org/x/crypto/bcrypt"
"net/http"
"github.com/gin-gonic/gin"
"github.com/go-admin-team/go-admin-core/sdk/api"
"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user"
_ "github.com/go-admin-team/go-admin-core/sdk/pkg/response"
"github.com/google/uuid"
"go-admin/app/admin/service"
"go-admin/app/admin/service/dto"
"go-admin/common/actions"
)
type SysUser struct {
api.Api
}
// GetPage
// @Summary 列表用户信息数据
// @Description 获取JSON
// @Tags 用户
// @Param username query string false "username"
// @Success 200 {string} {object} response.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/sys-user [get]
// @Security Bearer
func (e SysUser) GetPage(c *gin.Context) {
s := service.SysUser{}
req := dto.SysUserGetPageReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
//数据权限检查
p := actions.GetPermissionFromContext(c)
list := make([]models.SysUser, 0)
var count int64
err = s.GetPage(&req, p, &list, &count)
if err != nil {
e.Error(500, err, "查询失败")
return
}
e.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功")
}
// Get
// @Summary 获取用户
// @Description 获取JSON
// @Tags 用户
// @Param userId path int true "用户编码"
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/sys-user/{userId} [get]
// @Security Bearer
func (e SysUser) Get(c *gin.Context) {
s := service.SysUser{}
req := dto.SysUserById{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req, nil).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
var object models.SysUser
//数据权限检查
p := actions.GetPermissionFromContext(c)
err = s.Get(&req, p, &object)
if err != nil {
e.Error(http.StatusUnprocessableEntity, err, "查询失败")
return
}
e.OK(object, "查询成功")
}
// Insert
// @Summary 创建用户
// @Description 获取JSON
// @Tags 用户
// @Accept application/json
// @Product application/json
// @Param data body dto.SysUserInsertReq true "用户数据"
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/sys-user [post]
// @Security Bearer
func (e SysUser) Insert(c *gin.Context) {
s := service.SysUser{}
req := dto.SysUserInsertReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req, binding.JSON).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
// 设置创建人
req.SetCreateBy(user.GetUserId(c))
err = s.Insert(&req)
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
e.OK(req.GetId(), "创建成功")
}
// Update
// @Summary 修改用户数据
// @Description 获取JSON
// @Tags 用户
// @Accept application/json
// @Product application/json
// @Param data body dto.SysUserUpdateReq true "body"
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/sys-user/{userId} [put]
// @Security Bearer
func (e SysUser) Update(c *gin.Context) {
s := service.SysUser{}
req := dto.SysUserUpdateReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
req.SetUpdateBy(user.GetUserId(c))
//数据权限检查
p := actions.GetPermissionFromContext(c)
err = s.Update(&req, p)
if err != nil {
e.Logger.Error(err)
return
}
e.OK(req.GetId(), "更新成功")
}
// Delete
// @Summary 删除用户数据
// @Description 删除数据
// @Tags 用户
// @Param userId path int true "userId"
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/sys-user/{userId} [delete]
// @Security Bearer
func (e SysUser) Delete(c *gin.Context) {
s := service.SysUser{}
req := dto.SysUserById{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req, binding.JSON).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
// 设置编辑人
req.SetUpdateBy(user.GetUserId(c))
// 数据权限检查
p := actions.GetPermissionFromContext(c)
err = s.Remove(&req, p)
if err != nil {
e.Logger.Error(err)
return
}
e.OK(req.GetId(), "删除成功")
}
// InsetAvatar
// @Summary 修改头像
// @Description 获取JSON
// @Tags 个人中心
// @Accept multipart/form-data
// @Param file formData file true "file"
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/user/avatar [post]
// @Security Bearer
func (e SysUser) InsetAvatar(c *gin.Context) {
s := service.SysUser{}
req := dto.UpdateSysUserAvatarReq{}
err := e.MakeContext(c).
MakeOrm().
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
// 数据权限检查
p := actions.GetPermissionFromContext(c)
form, _ := c.MultipartForm()
files := form.File["upload[]"]
guid := uuid.New().String()
filPath := "static/uploadfile/" + guid + ".jpg"
for _, file := range files {
e.Logger.Debugf("upload avatar file: %s", file.Filename)
// 上传文件至指定目录
err = c.SaveUploadedFile(file, filPath)
if err != nil {
e.Logger.Errorf("save file error, %s", err.Error())
e.Error(500, err, "")
return
}
}
req.UserId = p.UserId
req.Avatar = "/" + filPath
err = s.UpdateAvatar(&req, p)
if err != nil {
e.Logger.Error(err)
return
}
e.OK(filPath, "修改成功")
}
// UpdateStatus 修改用户状态
// @Summary 修改用户状态
// @Description 获取JSON
// @Tags 用户
// @Accept application/json
// @Product application/json
// @Param data body dto.UpdateSysUserStatusReq true "body"
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/user/status [put]
// @Security Bearer
func (e SysUser) UpdateStatus(c *gin.Context) {
s := service.SysUser{}
req := dto.UpdateSysUserStatusReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req, binding.JSON, nil).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
req.SetUpdateBy(user.GetUserId(c))
//数据权限检查
p := actions.GetPermissionFromContext(c)
err = s.UpdateStatus(&req, p)
if err != nil {
e.Logger.Error(err)
return
}
e.OK(req.GetId(), "更新成功")
}
// ResetPwd 重置用户密码
// @Summary 重置用户密码
// @Description 获取JSON
// @Tags 用户
// @Accept application/json
// @Product application/json
// @Param data body dto.ResetSysUserPwdReq true "body"
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/user/pwd/reset [put]
// @Security Bearer
func (e SysUser) ResetPwd(c *gin.Context) {
s := service.SysUser{}
req := dto.ResetSysUserPwdReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req, binding.JSON).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
req.SetUpdateBy(user.GetUserId(c))
//数据权限检查
p := actions.GetPermissionFromContext(c)
err = s.ResetPwd(&req, p)
if err != nil {
e.Logger.Error(err)
return
}
e.OK(req.GetId(), "更新成功")
}
// UpdatePwd
// @Summary 修改密码
// @Description 获取JSON
// @Tags 用户
// @Accept application/json
// @Product application/json
// @Param data body dto.PassWord true "body"
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/user/pwd/set [put]
// @Security Bearer
func (e SysUser) UpdatePwd(c *gin.Context) {
s := service.SysUser{}
req := dto.PassWord{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
// 数据权限检查
p := actions.GetPermissionFromContext(c)
var hash []byte
if hash, err = bcrypt.GenerateFromPassword([]byte(req.NewPassword), bcrypt.DefaultCost); err != nil {
req.NewPassword = string(hash)
}
err = s.UpdatePwd(user.GetUserId(c), req.OldPassword, req.NewPassword, p)
if err != nil {
e.Logger.Error(err)
e.Error(http.StatusForbidden, err, "密码修改失败")
return
}
e.OK(nil, "密码修改成功")
}
// GetProfile
// @Summary 获取个人中心用户
// @Description 获取JSON
// @Tags 个人中心
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/user/profile [get]
// @Security Bearer
func (e SysUser) GetProfile(c *gin.Context) {
s := service.SysUser{}
req := dto.SysUserById{}
err := e.MakeContext(c).
MakeOrm().
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
req.Id = user.GetUserId(c)
sysUser := models.SysUser{}
roles := make([]models.SysRole, 0)
posts := make([]models.SysPost, 0)
err = s.GetProfile(&req, &sysUser, &roles, &posts)
if err != nil {
e.Logger.Errorf("get user profile error, %s", err.Error())
e.Error(500, err, "获取用户信息失败")
return
}
e.OK(gin.H{
"user": sysUser,
"roles": roles,
"posts": posts,
}, "查询成功")
}
// GetInfo
// @Summary 获取个人信息
// @Description 获取JSON
// @Tags 个人中心
// @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
// @Router /api/v1/getinfo [get]
// @Security Bearer
func (e SysUser) GetInfo(c *gin.Context) {
req := dto.SysUserById{}
s := service.SysUser{}
r := service.SysRole{}
err := e.MakeContext(c).
MakeOrm().
MakeService(&r.Service).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
p := actions.GetPermissionFromContext(c)
var roles = make([]string, 1)
roles[0] = user.GetRoleName(c)
var permissions = make([]string, 1)
permissions[0] = "*:*:*"
var buttons = make([]string, 1)
buttons[0] = "*:*:*"
var mp = make(map[string]interface{})
mp["roles"] = roles
if user.GetRoleName(c) == "admin" || user.GetRoleName(c) == "系统管理员" {
mp["permissions"] = permissions
mp["buttons"] = buttons
} else {
list, _ := r.GetById(user.GetRoleId(c))
mp["permissions"] = list
mp["buttons"] = list
}
sysUser := models.SysUser{}
req.Id = user.GetUserId(c)
err = s.Get(&req, p, &sysUser)
if err != nil {
e.Error(http.StatusUnauthorized, err, "登录失败")
return
}
mp["introduction"] = " am a super administrator"
mp["avatar"] = "https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif"
if sysUser.Avatar != "" {
mp["avatar"] = sysUser.Avatar
}
mp["userName"] = sysUser.NickName
mp["userId"] = sysUser.UserId
mp["deptId"] = sysUser.DeptId
mp["name"] = sysUser.NickName
mp["code"] = 200
e.OK(mp, "")
}

306
app/admin/apis/tm_member.go Normal file
View File

@ -0,0 +1,306 @@
package apis
import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/go-admin-team/go-admin-core/sdk/api"
"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user"
_ "github.com/go-admin-team/go-admin-core/sdk/pkg/response"
"go-admin/app/admin/models"
"go-admin/app/admin/service"
"go-admin/app/admin/service/dto"
"go-admin/common/actions"
)
type TmMember struct {
api.Api
}
// GetPage 获取会员表列表
// @Summary 获取会员表列表
// @Description 获取会员表列表
// @Tags 会员表
// @Param nickName query string false "用户昵称"
// @Param mobile query string false "手机号"
// @Param email query string false "邮箱号"
// @Param status query string false "状态 1-启用 2-禁用"
// @Param pageSize query int false "页条数"
// @Param pageIndex query int false "页码"
// @Success 200 {object} response.Response{data=response.Page{list=[]models.TmMember}} "{"code": 200, "data": [...]}"
// @Router /api/v1/tm-member [get]
// @Security Bearer
func (e TmMember) GetPage(c *gin.Context) {
req := dto.TmMemberGetPageReq{}
s := service.TmMember{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
p := actions.GetPermissionFromContext(c)
list := make([]dto.TmMemberResp, 0)
var count int64
err = s.GetPage(&req, p, &list, &count)
if err != nil {
e.Error(500, err, fmt.Sprintf("获取会员表失败,\r\n失败信息 %s", err.Error()))
return
}
e.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功")
}
// Get 获取会员表
// @Summary 获取会员表
// @Description 获取会员表
// @Tags 会员表
// @Param id path int false "id"
// @Success 200 {object} response.Response{data=models.TmMember} "{"code": 200, "data": [...]}"
// @Router /api/v1/tm-member/{id} [get]
// @Security Bearer
func (e TmMember) Get(c *gin.Context) {
req := dto.TmMemberGetReq{}
s := service.TmMember{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
var object models.TmMember
p := actions.GetPermissionFromContext(c)
err = s.Get(&req, p, &object)
if err != nil {
e.Error(500, err, fmt.Sprintf("获取会员表失败,\r\n失败信息 %s", err.Error()))
return
}
e.OK(object, "查询成功")
}
// Insert 创建会员表
// @Summary 创建会员表
// @Description 创建会员表
// @Tags 会员表
// @Accept application/json
// @Product application/json
// @Param data body dto.TmMemberInsertReq true "data"
// @Success 200 {object} response.Response "{"code": 200, "message": "添加成功"}"
// @Router /api/v1/tm-member [post]
// @Security Bearer
func (e TmMember) Insert(c *gin.Context) {
req := dto.TmMemberInsertReq{}
s := service.TmMember{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
// 设置创建人
req.SetCreateBy(user.GetUserId(c))
data := models.TmMember{}
err = s.Insert(&req, &data)
if err != nil {
e.Error(500, err, fmt.Sprintf("创建会员表失败,\r\n失败信息 %s", err.Error()))
return
}
e.OK(req.GetId(), "创建成功")
}
// Update 修改会员表
// @Summary 修改会员表
// @Description 修改会员表
// @Tags 会员表
// @Accept application/json
// @Product application/json
// @Param id path int true "id"
// @Param data body dto.TmMemberUpdateReq true "body"
// @Success 200 {object} response.Response "{"code": 200, "message": "修改成功"}"
// @Router /api/v1/tm-member/{id} [put]
// @Security Bearer
func (e TmMember) Update(c *gin.Context) {
req := dto.TmMemberUpdateReq{}
s := service.TmMember{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
req.SetUpdateBy(user.GetUserId(c))
p := actions.GetPermissionFromContext(c)
err = s.Update(&req, p)
if err != nil {
e.Error(500, err, fmt.Sprintf("修改会员表失败,\r\n失败信息 %s", err.Error()))
return
}
e.OK(req.GetId(), "修改成功")
}
// Delete 删除会员表
// @Summary 删除会员表
// @Description 删除会员表
// @Tags 会员表
// @Param data body dto.TmMemberDeleteReq true "body"
// @Success 200 {object} response.Response "{"code": 200, "message": "删除成功"}"
// @Router /api/v1/tm-member [delete]
// @Security Bearer
func (e TmMember) Delete(c *gin.Context) {
s := service.TmMember{}
req := dto.TmMemberDeleteReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
// req.SetUpdateBy(user.GetUserId(c))
p := actions.GetPermissionFromContext(c)
err = s.Remove(&req, p)
if err != nil {
e.Error(500, err, fmt.Sprintf("删除会员表失败,\r\n失败信息 %s", err.Error()))
return
}
e.OK(req.GetId(), "删除成功")
}
// GetMyApiKey 获取我的apiKey
func (e TmMember) GetMyApiKey(c *gin.Context) {
s := service.TmMember{}
err := e.MakeContext(c).
MakeOrm().
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
// userId := user.GetUserId(c)
// data, err := s.GetMyApiKey(userId)
if err != nil {
e.Error(500, err, fmt.Sprintf("获取apiKey失败\r\n失败信息 %s", err.Error()))
return
}
e.OK("", "获取apiKey成功")
}
// 字符数充值
func (e TmMember) Recharge(c *gin.Context) {
s := service.TmMember{}
req := dto.TmMemberRechargeReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Errorf("字符充值失败:", err)
e.Error(500, err, err.Error())
return
}
userId := user.GetUserId(c)
p := actions.GetPermissionFromContext(c)
err = s.Recharge(&req, p, userId)
if err != nil {
e.Error(500, err, fmt.Sprintf("字符充值失败,\r\n失败信息 %s", err.Error()))
return
}
e.OK(nil, "字符充值成功")
}
// 修改状态
func (e TmMember) ChangeStatus(c *gin.Context) {
s := service.TmMember{}
req := dto.TmMemberChangeStatusReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Errorf("修改状态失败:", err)
e.Error(500, err, err.Error())
return
}
if err := req.Validate(); err != nil {
e.Logger.Errorf("修改状态失败:", err)
e.Error(500, err, err.Error())
return
}
p := actions.GetPermissionFromContext(c)
err = s.ChangeStatus(&req, p)
if err != nil {
e.Error(500, err, fmt.Sprintf("修改状态失败,\r\n失败信息 %s", err.Error()))
return
}
e.OK(nil, "修改状态成功")
}
// 获取个人的翻译平台信息
func (e TmMember) GetPlatforms(c *gin.Context) {
s := service.TmMember{}
err := e.MakeContext(c).
MakeOrm().
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Errorf("获取个人的翻译平台信息失败:", err)
e.Error(500, err, err.Error())
return
}
userId := user.GetUserId(c)
datas := make([]dto.TmMemberPlatformFrontedResp, 0)
err = s.GetUserPlatforms(userId, &datas)
if err != nil {
e.Error(500, err, fmt.Sprintf("获取个人的翻译平台信息失败,\r\n失败信息 %s", err.Error()))
return
}
e.OK(datas, "获取个人的翻译平台信息成功")
}

View File

@ -0,0 +1,191 @@
package apis
import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/go-admin-team/go-admin-core/sdk/api"
"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user"
_ "github.com/go-admin-team/go-admin-core/sdk/pkg/response"
"go-admin/app/admin/models"
"go-admin/app/admin/service"
"go-admin/app/admin/service/dto"
"go-admin/common/actions"
)
type TmMemberDailyUsage struct {
api.Api
}
// GetPage 获取用户-使用量列表
// @Summary 获取用户-使用量列表
// @Description 获取用户-使用量列表
// @Tags 用户-使用量
// @Param pageSize query int false "页条数"
// @Param pageIndex query int false "页码"
// @Success 200 {object} response.Response{data=response.Page{list=[]models.TmMemberDailyUsage}} "{"code": 200, "data": [...]}"
// @Router /api/v1/tm-member-daily-usage [get]
// @Security Bearer
func (e TmMemberDailyUsage) GetPage(c *gin.Context) {
req := dto.TmMemberDailyUsageGetPageReq{}
s := service.TmMemberDailyUsage{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
p := actions.GetPermissionFromContext(c)
list := make([]models.TmMemberDailyUsage, 0)
var count int64
err = s.GetPage(&req, p, &list, &count)
if err != nil {
e.Error(500, err, fmt.Sprintf("获取用户-使用量失败,\r\n失败信息 %s", err.Error()))
return
}
e.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功")
}
// Get 获取用户-使用量
// @Summary 获取用户-使用量
// @Description 获取用户-使用量
// @Tags 用户-使用量
// @Param id path int false "id"
// @Success 200 {object} response.Response{data=models.TmMemberDailyUsage} "{"code": 200, "data": [...]}"
// @Router /api/v1/tm-member-daily-usage/{id} [get]
// @Security Bearer
func (e TmMemberDailyUsage) Get(c *gin.Context) {
req := dto.TmMemberDailyUsageGetReq{}
s := service.TmMemberDailyUsage{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
var object models.TmMemberDailyUsage
p := actions.GetPermissionFromContext(c)
err = s.Get(&req, p, &object)
if err != nil {
e.Error(500, err, fmt.Sprintf("获取用户-使用量失败,\r\n失败信息 %s", err.Error()))
return
}
e.OK( object, "查询成功")
}
// Insert 创建用户-使用量
// @Summary 创建用户-使用量
// @Description 创建用户-使用量
// @Tags 用户-使用量
// @Accept application/json
// @Product application/json
// @Param data body dto.TmMemberDailyUsageInsertReq true "data"
// @Success 200 {object} response.Response "{"code": 200, "message": "添加成功"}"
// @Router /api/v1/tm-member-daily-usage [post]
// @Security Bearer
func (e TmMemberDailyUsage) Insert(c *gin.Context) {
req := dto.TmMemberDailyUsageInsertReq{}
s := service.TmMemberDailyUsage{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
// 设置创建人
req.SetCreateBy(user.GetUserId(c))
err = s.Insert(&req)
if err != nil {
e.Error(500, err, fmt.Sprintf("创建用户-使用量失败,\r\n失败信息 %s", err.Error()))
return
}
e.OK(req.GetId(), "创建成功")
}
// Update 修改用户-使用量
// @Summary 修改用户-使用量
// @Description 修改用户-使用量
// @Tags 用户-使用量
// @Accept application/json
// @Product application/json
// @Param id path int true "id"
// @Param data body dto.TmMemberDailyUsageUpdateReq true "body"
// @Success 200 {object} response.Response "{"code": 200, "message": "修改成功"}"
// @Router /api/v1/tm-member-daily-usage/{id} [put]
// @Security Bearer
func (e TmMemberDailyUsage) Update(c *gin.Context) {
req := dto.TmMemberDailyUsageUpdateReq{}
s := service.TmMemberDailyUsage{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
req.SetUpdateBy(user.GetUserId(c))
p := actions.GetPermissionFromContext(c)
err = s.Update(&req, p)
if err != nil {
e.Error(500, err, fmt.Sprintf("修改用户-使用量失败,\r\n失败信息 %s", err.Error()))
return
}
e.OK( req.GetId(), "修改成功")
}
// Delete 删除用户-使用量
// @Summary 删除用户-使用量
// @Description 删除用户-使用量
// @Tags 用户-使用量
// @Param data body dto.TmMemberDailyUsageDeleteReq true "body"
// @Success 200 {object} response.Response "{"code": 200, "message": "删除成功"}"
// @Router /api/v1/tm-member-daily-usage [delete]
// @Security Bearer
func (e TmMemberDailyUsage) Delete(c *gin.Context) {
s := service.TmMemberDailyUsage{}
req := dto.TmMemberDailyUsageDeleteReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
// req.SetUpdateBy(user.GetUserId(c))
p := actions.GetPermissionFromContext(c)
err = s.Remove(&req, p)
if err != nil {
e.Error(500, err, fmt.Sprintf("删除用户-使用量失败,\r\n失败信息 %s", err.Error()))
return
}
e.OK( req.GetId(), "删除成功")
}

View File

@ -0,0 +1,224 @@
package apis
import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/go-admin-team/go-admin-core/sdk/api"
"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user"
_ "github.com/go-admin-team/go-admin-core/sdk/pkg/response"
"go-admin/app/admin/models"
"go-admin/app/admin/service"
"go-admin/app/admin/service/dto"
"go-admin/common/actions"
)
type TmMemberPlatform struct {
api.Api
}
// GetPage 获取用户-翻译通道列表
// @Summary 获取用户-翻译通道列表
// @Description 获取用户-翻译通道列表
// @Tags 用户-翻译通道
// @Param pageSize query int false "页条数"
// @Param pageIndex query int false "页码"
// @Success 200 {object} response.Response{data=response.Page{list=[]models.TmMemberPlatform}} "{"code": 200, "data": [...]}"
// @Router /api/v1/tm-member-platform [get]
// @Security Bearer
func (e TmMemberPlatform) GetPage(c *gin.Context) {
req := dto.TmMemberPlatformGetPageReq{}
s := service.TmMemberPlatform{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
p := actions.GetPermissionFromContext(c)
list := make([]models.TmMemberPlatform, 0)
var count int64
err = s.GetPage(&req, p, &list, &count)
if err != nil {
e.Error(500, err, fmt.Sprintf("获取用户-翻译通道失败,\r\n失败信息 %s", err.Error()))
return
}
e.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功")
}
// Get 获取用户-翻译通道
// @Summary 获取用户-翻译通道
// @Description 获取用户-翻译通道
// @Tags 用户-翻译通道
// @Param id path int false "id"
// @Success 200 {object} response.Response{data=models.TmMemberPlatform} "{"code": 200, "data": [...]}"
// @Router /api/v1/tm-member-platform/{id} [get]
// @Security Bearer
func (e TmMemberPlatform) Get(c *gin.Context) {
req := dto.TmMemberPlatformGetReq{}
s := service.TmMemberPlatform{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
var object models.TmMemberPlatform
p := actions.GetPermissionFromContext(c)
err = s.Get(&req, p, &object)
if err != nil {
e.Error(500, err, fmt.Sprintf("获取用户-翻译通道失败,\r\n失败信息 %s", err.Error()))
return
}
e.OK(object, "查询成功")
}
// Insert 创建用户-翻译通道
// @Summary 创建用户-翻译通道
// @Description 创建用户-翻译通道
// @Tags 用户-翻译通道
// @Accept application/json
// @Product application/json
// @Param data body dto.TmMemberPlatformInsertReq true "data"
// @Success 200 {object} response.Response "{"code": 200, "message": "添加成功"}"
// @Router /api/v1/tm-member-platform [post]
// @Security Bearer
func (e TmMemberPlatform) Insert(c *gin.Context) {
req := dto.TmMemberPlatformInsertReq{}
s := service.TmMemberPlatform{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
// 设置创建人
req.SetCreateBy(user.GetUserId(c))
err = s.Insert(&req)
if err != nil {
e.Error(500, err, fmt.Sprintf("创建用户-翻译通道失败,\r\n失败信息 %s", err.Error()))
return
}
e.OK(req.GetId(), "创建成功")
}
// Update 修改用户-翻译通道
// @Summary 修改用户-翻译通道
// @Description 修改用户-翻译通道
// @Tags 用户-翻译通道
// @Accept application/json
// @Product application/json
// @Param id path int true "id"
// @Param data body dto.TmMemberPlatformUpdateReq true "body"
// @Success 200 {object} response.Response "{"code": 200, "message": "修改成功"}"
// @Router /api/v1/tm-member-platform/{id} [put]
// @Security Bearer
func (e TmMemberPlatform) Update(c *gin.Context) {
req := dto.TmMemberPlatformUpdateReq{}
s := service.TmMemberPlatform{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
req.SetUpdateBy(user.GetUserId(c))
p := actions.GetPermissionFromContext(c)
err = s.Update(&req, p)
if err != nil {
e.Error(500, err, fmt.Sprintf("修改用户-翻译通道失败,\r\n失败信息 %s", err.Error()))
return
}
e.OK(req.GetId(), "修改成功")
}
// Delete 删除用户-翻译通道
// @Summary 删除用户-翻译通道
// @Description 删除用户-翻译通道
// @Tags 用户-翻译通道
// @Param data body dto.TmMemberPlatformDeleteReq true "body"
// @Success 200 {object} response.Response "{"code": 200, "message": "删除成功"}"
// @Router /api/v1/tm-member-platform [delete]
// @Security Bearer
func (e TmMemberPlatform) Delete(c *gin.Context) {
s := service.TmMemberPlatform{}
req := dto.TmMemberPlatformDeleteReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
// req.SetUpdateBy(user.GetUserId(c))
p := actions.GetPermissionFromContext(c)
err = s.Remove(&req, p)
if err != nil {
e.Error(500, err, fmt.Sprintf("删除用户-翻译通道失败,\r\n失败信息 %s", err.Error()))
return
}
e.OK(req.GetId(), "删除成功")
}
// 获取字符消耗折线图
func (e TmMemberPlatform) GetStatistic(c *gin.Context) {
s := service.TmMemberDailyUsage{}
// req := dto.TmMemberPlatformStatisticReq{}
err := e.MakeContext(c).
MakeOrm().
// Bind(&req).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, nil, "请求数据失败,请刷新")
return
}
userId := user.GetUserId(c)
if userId == 0 {
e.Error(500, nil, "请先登录")
return
}
data := dto.TmMemberPlatformStatisticResp{}
err = s.GetStatistic(userId, &data)
if err != nil {
e.Error(500, err, "获取数据失败")
return
}
e.OK(data, "获取数据成功")
}

View File

@ -0,0 +1,222 @@
package apis
import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/go-admin-team/go-admin-core/sdk/api"
"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user"
_ "github.com/go-admin-team/go-admin-core/sdk/pkg/response"
"go-admin/app/admin/models"
"go-admin/app/admin/service"
"go-admin/app/admin/service/dto"
"go-admin/common/actions"
)
type TmPlatform struct {
api.Api
}
// GetPage 获取翻译平台管理列表
// @Summary 获取翻译平台管理列表
// @Description 获取翻译平台管理列表
// @Tags 翻译平台管理
// @Param name query string false "平台名称"
// @Param showName query string false "展示名称"
// @Param apiBaseUrl query string false "平台接口地址"
// @Param code query string false "平台编码(字典 tm_platform)"
// @Param character query string false "字符数"
// @Param price query string false "单价"
// @Param pageSize query int false "页条数"
// @Param pageIndex query int false "页码"
// @Success 200 {object} response.Response{data=response.Page{list=[]models.TmPlatform}} "{"code": 200, "data": [...]}"
// @Router /api/v1/tm-platform [get]
// @Security Bearer
func (e TmPlatform) GetPage(c *gin.Context) {
req := dto.TmPlatformGetPageReq{}
s := service.TmPlatform{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
p := actions.GetPermissionFromContext(c)
list := make([]models.TmPlatform, 0)
var count int64
err = s.GetPage(&req, p, &list, &count)
if err != nil {
e.Error(500, err, fmt.Sprintf("获取翻译平台管理失败,\r\n失败信息 %s", err.Error()))
return
}
e.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功")
}
// Get 获取翻译平台管理
// @Summary 获取翻译平台管理
// @Description 获取翻译平台管理
// @Tags 翻译平台管理
// @Param id path int false "id"
// @Success 200 {object} response.Response{data=models.TmPlatform} "{"code": 200, "data": [...]}"
// @Router /api/v1/tm-platform/{id} [get]
// @Security Bearer
func (e TmPlatform) Get(c *gin.Context) {
req := dto.TmPlatformGetReq{}
s := service.TmPlatform{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
var object models.TmPlatform
p := actions.GetPermissionFromContext(c)
err = s.Get(&req, p, &object)
if err != nil {
e.Error(500, err, fmt.Sprintf("获取翻译平台管理失败,\r\n失败信息 %s", err.Error()))
return
}
e.OK(object, "查询成功")
}
// Insert 创建翻译平台管理
// @Summary 创建翻译平台管理
// @Description 创建翻译平台管理
// @Tags 翻译平台管理
// @Accept application/json
// @Product application/json
// @Param data body dto.TmPlatformInsertReq true "data"
// @Success 200 {object} response.Response "{"code": 200, "message": "添加成功"}"
// @Router /api/v1/tm-platform [post]
// @Security Bearer
func (e TmPlatform) Insert(c *gin.Context) {
req := dto.TmPlatformInsertReq{}
s := service.TmPlatform{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
// 设置创建人
req.SetCreateBy(user.GetUserId(c))
err = s.Insert(&req)
if err != nil {
e.Error(500, err, fmt.Sprintf("创建翻译平台管理失败,\r\n失败信息 %s", err.Error()))
return
}
e.OK(req.GetId(), "创建成功")
}
// Update 修改翻译平台管理
// @Summary 修改翻译平台管理
// @Description 修改翻译平台管理
// @Tags 翻译平台管理
// @Accept application/json
// @Product application/json
// @Param id path int true "id"
// @Param data body dto.TmPlatformUpdateReq true "body"
// @Success 200 {object} response.Response "{"code": 200, "message": "修改成功"}"
// @Router /api/v1/tm-platform/{id} [put]
// @Security Bearer
func (e TmPlatform) Update(c *gin.Context) {
req := dto.TmPlatformUpdateReq{}
s := service.TmPlatform{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
req.SetUpdateBy(user.GetUserId(c))
p := actions.GetPermissionFromContext(c)
err = s.Update(&req, p)
if err != nil {
e.Error(500, err, fmt.Sprintf("修改翻译平台管理失败,\r\n失败信息 %s", err.Error()))
return
}
e.OK(req.GetId(), "修改成功")
}
// Delete 删除翻译平台管理
// @Summary 删除翻译平台管理
// @Description 删除翻译平台管理
// @Tags 翻译平台管理
// @Param data body dto.TmPlatformDeleteReq true "body"
// @Success 200 {object} response.Response "{"code": 200, "message": "删除成功"}"
// @Router /api/v1/tm-platform [delete]
// @Security Bearer
func (e TmPlatform) Delete(c *gin.Context) {
s := service.TmPlatform{}
req := dto.TmPlatformDeleteReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
// req.SetUpdateBy(user.GetUserId(c))
p := actions.GetPermissionFromContext(c)
err = s.Remove(&req, p)
if err != nil {
e.Error(500, err, fmt.Sprintf("删除翻译平台管理失败,\r\n失败信息 %s", err.Error()))
return
}
e.OK(req.GetId(), "删除成功")
}
// List 翻译平台管理列表
func (e TmPlatform) List(c *gin.Context) {
s := service.TmPlatform{}
err := e.MakeContext(c).
MakeOrm().
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
list := make([]dto.TmPlatformListResp, 0)
err = s.GetList(&list)
if err != nil {
e.Error(500, err, fmt.Sprintf("获取翻译平台管理列表失败"))
return
}
e.OK(list, "")
}

View File

@ -0,0 +1,192 @@
package apis
import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/go-admin-team/go-admin-core/sdk/api"
"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user"
_ "github.com/go-admin-team/go-admin-core/sdk/pkg/response"
"go-admin/app/admin/models"
"go-admin/app/admin/service"
"go-admin/app/admin/service/dto"
"go-admin/common/actions"
)
type TmPlatformAccount struct {
api.Api
}
// GetPage 获取翻译管理_平台账号列表
// @Summary 获取翻译管理_平台账号列表
// @Description 获取翻译管理_平台账号列表
// @Tags 翻译管理_平台账号
// @Param platformId query string false "平台主键"
// @Param pageSize query int false "页条数"
// @Param pageIndex query int false "页码"
// @Success 200 {object} response.Response{data=response.Page{list=[]models.TmPlatformAccount}} "{"code": 200, "data": [...]}"
// @Router /api/v1/tm-platform-account [get]
// @Security Bearer
func (e TmPlatformAccount) GetPage(c *gin.Context) {
req := dto.TmPlatformAccountGetPageReq{}
s := service.TmPlatformAccount{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
p := actions.GetPermissionFromContext(c)
list := make([]models.TmPlatformAccount, 0)
var count int64
err = s.GetPage(&req, p, &list, &count)
if err != nil {
e.Error(500, err, fmt.Sprintf("获取翻译管理_平台账号失败\r\n失败信息 %s", err.Error()))
return
}
e.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功")
}
// Get 获取翻译管理_平台账号
// @Summary 获取翻译管理_平台账号
// @Description 获取翻译管理_平台账号
// @Tags 翻译管理_平台账号
// @Param id path int false "id"
// @Success 200 {object} response.Response{data=models.TmPlatformAccount} "{"code": 200, "data": [...]}"
// @Router /api/v1/tm-platform-account/{id} [get]
// @Security Bearer
func (e TmPlatformAccount) Get(c *gin.Context) {
req := dto.TmPlatformAccountGetReq{}
s := service.TmPlatformAccount{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
var object models.TmPlatformAccount
p := actions.GetPermissionFromContext(c)
err = s.Get(&req, p, &object)
if err != nil {
e.Error(500, err, fmt.Sprintf("获取翻译管理_平台账号失败\r\n失败信息 %s", err.Error()))
return
}
e.OK(object, "查询成功")
}
// Insert 创建翻译管理_平台账号
// @Summary 创建翻译管理_平台账号
// @Description 创建翻译管理_平台账号
// @Tags 翻译管理_平台账号
// @Accept application/json
// @Product application/json
// @Param data body dto.TmPlatformAccountInsertReq true "data"
// @Success 200 {object} response.Response "{"code": 200, "message": "添加成功"}"
// @Router /api/v1/tm-platform-account [post]
// @Security Bearer
func (e TmPlatformAccount) Insert(c *gin.Context) {
req := dto.TmPlatformAccountInsertReq{}
s := service.TmPlatformAccount{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
// 设置创建人
req.SetCreateBy(user.GetUserId(c))
err = s.Insert(&req)
if err != nil {
e.Error(500, err, fmt.Sprintf("创建翻译管理_平台账号失败\r\n失败信息 %s", err.Error()))
return
}
e.OK(req.GetId(), "创建成功")
}
// Update 修改翻译管理_平台账号
// @Summary 修改翻译管理_平台账号
// @Description 修改翻译管理_平台账号
// @Tags 翻译管理_平台账号
// @Accept application/json
// @Product application/json
// @Param id path int true "id"
// @Param data body dto.TmPlatformAccountUpdateReq true "body"
// @Success 200 {object} response.Response "{"code": 200, "message": "修改成功"}"
// @Router /api/v1/tm-platform-account/{id} [put]
// @Security Bearer
func (e TmPlatformAccount) Update(c *gin.Context) {
req := dto.TmPlatformAccountUpdateReq{}
s := service.TmPlatformAccount{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
req.SetUpdateBy(user.GetUserId(c))
p := actions.GetPermissionFromContext(c)
err = s.Update(&req, p)
if err != nil {
e.Error(500, err, fmt.Sprintf("修改翻译管理_平台账号失败\r\n失败信息 %s", err.Error()))
return
}
e.OK(req.GetId(), "修改成功")
}
// Delete 删除翻译管理_平台账号
// @Summary 删除翻译管理_平台账号
// @Description 删除翻译管理_平台账号
// @Tags 翻译管理_平台账号
// @Param data body dto.TmPlatformAccountDeleteReq true "body"
// @Success 200 {object} response.Response "{"code": 200, "message": "删除成功"}"
// @Router /api/v1/tm-platform-account [delete]
// @Security Bearer
func (e TmPlatformAccount) Delete(c *gin.Context) {
s := service.TmPlatformAccount{}
req := dto.TmPlatformAccountDeleteReq{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
// req.SetUpdateBy(user.GetUserId(c))
p := actions.GetPermissionFromContext(c)
err = s.Remove(&req, p)
if err != nil {
e.Error(500, err, fmt.Sprintf("删除翻译管理_平台账号失败\r\n失败信息 %s", err.Error()))
return
}
e.OK(req.GetId(), "删除成功")
}

View File

@ -0,0 +1,85 @@
package apis
import (
"go-admin/app/admin/service"
"go-admin/app/admin/service/dto"
"go-admin/common/statuscode"
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"github.com/go-admin-team/go-admin-core/sdk/api"
"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user"
)
type Translate struct {
api.Api
}
// 公开翻译接口
func (e *Translate) Translate(c *gin.Context) {
req := dto.TranslateReq{}
s := service.TranslatorService{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req, binding.JSON).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, nil, "server error")
return
}
if code := req.Validate(); code != statuscode.Success {
e.Error(code, nil, statuscode.ErrorMessage[code])
return
}
apiKey := c.GetString("apiKey")
result, code := s.TranslateJudge(&req, apiKey)
if code != statuscode.Success {
e.Logger.Error(err)
e.Error(code, nil, statuscode.ErrorMessage[code])
return
}
e.OK(result, "success")
}
// 获取个人翻译统计
func (e *Translate) GetTranslateStatistic(c *gin.Context) {
req := dto.TranslateStatisticReq{}
s := service.TmMember{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req, binding.JSON).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, nil, "server error")
return
}
userId := user.GetUserId(c)
if userId == 0 {
e.Error(statuscode.Unauthorized, nil, "unauthorized")
return
}
result := make([]dto.TranslateStatisticResp, 0)
error := s.GetTranslateStatistic(userId, &result)
if error != nil {
e.Logger.Errorf("获取字符消耗统计数据失败 %v", error)
e.Error(500, nil, "server error")
return
}
e.OK(result, "success")
}

View File

@ -0,0 +1,51 @@
package consumer
import (
"fmt"
"go-admin/app/admin/models"
commonDto "go-admin/common/dto"
"go-admin/common/mq"
"log"
"github.com/bytedance/sonic"
amqp "github.com/rabbitmq/amqp091-go"
"gorm.io/gorm"
)
const (
EXHAUSTED_QUEUE = "account_exhausted_queue"
)
// 消费者:监听 account_exhausted_queue更新数据库账号状态为禁用
func StartAccountExhaustedConsumer(db *gorm.DB, mqConn *amqp.Connection) error {
_, err := mq.MQ.DeclareQueue(EXHAUSTED_QUEUE)
if err != nil {
return fmt.Errorf("failed to declare a queue '%s': %w", EXHAUSTED_QUEUE, err)
}
msgs, err := mq.MQ.Consume(EXHAUSTED_QUEUE)
if err != nil {
log.Fatalf("消费队列失败: %v", err)
}
go func() {
for d := range msgs {
var msg commonDto.ExhaustedAccountMessage
if err := sonic.Unmarshal(d.Body, &msg); err != nil {
log.Printf("failed to parse exhausted message: %v", err)
continue
}
err := db.Model(&models.TmPlatformAccount{}).
Where("id = ?", msg.Id).
Update("status", 2).Error
if err != nil {
log.Printf("failed to update account %d: %v", msg.Id, err)
} else {
log.Printf("account %d marked as exhausted.", msg.Id)
}
}
}()
return nil
}

View File

@ -0,0 +1,16 @@
package models
type CasbinRule struct {
ID uint `gorm:"primaryKey;autoIncrement"`
Ptype string `gorm:"size:512;uniqueIndex:unique_index"`
V0 string `gorm:"size:512;uniqueIndex:unique_index"`
V1 string `gorm:"size:512;uniqueIndex:unique_index"`
V2 string `gorm:"size:512;uniqueIndex:unique_index"`
V3 string `gorm:"size:512;uniqueIndex:unique_index"`
V4 string `gorm:"size:512;uniqueIndex:unique_index"`
V5 string `gorm:"size:512;uniqueIndex:unique_index"`
}
func (CasbinRule) TableName() string {
return "sys_casbin_rule"
}

View File

@ -0,0 +1,81 @@
package models
import (
"errors"
"github.com/go-admin-team/go-admin-core/sdk/pkg"
"gorm.io/gorm"
log "github.com/go-admin-team/go-admin-core/logger"
"github.com/go-admin-team/go-admin-core/sdk/config"
)
type DataPermission struct {
DataScope string
UserId int
DeptId int
RoleId int
}
func (e *DataPermission) GetDataScope(tableName string, db *gorm.DB) (*gorm.DB, error) {
if !config.ApplicationConfig.EnableDP {
usageStr := `数据权限已经为您` + pkg.Green(`关闭`) + `,如需开启请参考配置文件字段说明`
log.Debug("%s\n", usageStr)
return db, nil
}
user := new(SysUser)
role := new(SysRole)
err := db.Find(user, e.UserId).Error
if err != nil {
return nil, errors.New("获取用户数据出错 msg:" + err.Error())
}
err = db.Find(role, user.RoleId).Error
if err != nil {
return nil, errors.New("获取用户数据出错 msg:" + err.Error())
}
if role.DataScope == "2" {
db = db.Where(tableName+".create_by in (select sys_user.user_id from sys_role_dept left join sys_user on sys_user.dept_id=sys_role_dept.dept_id where sys_role_dept.role_id = ?)", user.RoleId)
}
if role.DataScope == "3" {
db = db.Where(tableName+".create_by in (SELECT user_id from sys_user where dept_id = ? )", user.DeptId)
}
if role.DataScope == "4" {
db = db.Where(tableName+".create_by in (SELECT user_id from sys_user where sys_user.dept_id in(select dept_id from sys_dept where dept_path like ? ))", "%"+pkg.IntToString(user.DeptId)+"%")
}
if role.DataScope == "5" || role.DataScope == "" {
db = db.Where(tableName+".create_by = ?", e.UserId)
}
return db, nil
}
//func DataScopes(tableName string, userId int) func(db *gorm.DB) *gorm.DB {
// return func(db *gorm.DB) *gorm.DB {
// user := new(SysUser)
// role := new(SysRole)
// user.UserId = userId
// err := db.Find(user, userId).Error
// if err != nil {
// db.Error = errors.New("获取用户数据出错 msg:" + err.Error())
// return db
// }
// err = db.Find(role, user.RoleId).Error
// if err != nil {
// db.Error = errors.New("获取用户数据出错 msg:" + err.Error())
// return db
// }
// if role.DataScope == "2" {
// return db.Where(tableName+".create_by in (select sys_user.user_id from sys_role_dept left join sys_user on sys_user.dept_id=sys_role_dept.dept_id where sys_role_dept.role_id = ?)", user.RoleId)
// }
// if role.DataScope == "3" {
// return db.Where(tableName+".create_by in (SELECT user_id from sys_user where dept_id = ? )", user.DeptId)
// }
// if role.DataScope == "4" {
// return db.Where(tableName+".create_by in (SELECT user_id from sys_user where sys_user.dept_id in(select dept_id from sys_dept where dept_path like ? ))", "%"+pkg.IntToString(user.DeptId)+"%")
// }
// if role.DataScope == "5" || role.DataScope == "" {
// return db.Where(tableName+".create_by = ?", userId)
// }
// return db
// }
//}

View File

@ -0,0 +1,55 @@
package models
import (
"fmt"
"go-admin/common/global"
"gorm.io/gorm"
"io/ioutil"
"log"
"strings"
)
func InitDb(db *gorm.DB) (err error) {
filePath := "config/db.sql"
err = ExecSql(db, filePath)
if global.Driver == "postgres" {
filePath = "config/pg.sql"
err = ExecSql(db, filePath)
}
return err
}
func ExecSql(db *gorm.DB, filePath string) error {
sql, err := Ioutil(filePath)
if err != nil {
fmt.Println("数据库基础数据初始化脚本读取失败!原因:", err.Error())
return err
}
sqlList := strings.Split(sql, ";")
for i := 0; i < len(sqlList)-1; i++ {
if strings.Contains(sqlList[i], "--") {
fmt.Println(sqlList[i])
continue
}
sql := strings.Replace(sqlList[i]+";", "\n", "", -1)
sql = strings.TrimSpace(sql)
if err = db.Exec(sql).Error; err != nil {
log.Printf("error sql: %s", sql)
if !strings.Contains(err.Error(), "Query was empty") {
return err
}
}
}
return nil
}
func Ioutil(filePath string) (string, error) {
if contents, err := ioutil.ReadFile(filePath); err == nil {
//因为contents是[]byte类型直接转换成string类型后会多一行空格,需要使用strings.Replace替换换行符
result := strings.Replace(string(contents), "\n", "", 1)
fmt.Println("Use ioutil.ReadFile to read a file:", result)
return result, nil
} else {
return "", err
}
}

11
app/admin/models/model.go Normal file
View File

@ -0,0 +1,11 @@
package models
import (
"time"
)
type BaseModel struct {
CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"`
DeletedAt *time.Time `json:"deletedAt"`
}

View File

@ -0,0 +1,91 @@
package models
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"regexp"
"strings"
"github.com/bitly/go-simplejson"
"github.com/go-admin-team/go-admin-core/sdk"
"github.com/go-admin-team/go-admin-core/sdk/runtime"
"github.com/go-admin-team/go-admin-core/storage"
"go-admin/common/models"
)
type SysApi struct {
Id int `json:"id" gorm:"primaryKey;autoIncrement;comment:主键编码"`
Handle string `json:"handle" gorm:"size:128;comment:handle"`
Title string `json:"title" gorm:"size:128;comment:标题"`
Path string `json:"path" gorm:"size:128;comment:地址"`
Action string `json:"action" gorm:"size:16;comment:请求类型"`
Type string `json:"type" gorm:"size:16;comment:接口类型"`
models.ModelTime
models.ControlBy
}
func (*SysApi) TableName() string {
return "sys_api"
}
func (e *SysApi) Generate() models.ActiveRecord {
o := *e
return &o
}
func (e *SysApi) GetId() interface{} {
return e.Id
}
func SaveSysApi(message storage.Messager) (err error) {
var rb []byte
rb, err = json.Marshal(message.GetValues())
if err != nil {
err = fmt.Errorf("json Marshal error, %v", err.Error())
return err
}
var l runtime.Routers
err = json.Unmarshal(rb, &l)
if err != nil {
err = fmt.Errorf("json Unmarshal error, %s", err.Error())
return err
}
dbList := sdk.Runtime.GetDb()
for _, d := range dbList {
for _, v := range l.List {
if v.HttpMethod != "HEAD" ||
strings.Contains(v.RelativePath, "/swagger/") ||
strings.Contains(v.RelativePath, "/static/") ||
strings.Contains(v.RelativePath, "/form-generator/") ||
strings.Contains(v.RelativePath, "/sys/tables") {
// 根据接口方法注释里的@Summary填充接口名称适用于代码生成器
// 可在此处增加配置路径前缀的if判断只对代码生成的自建应用进行定向的接口名称填充
jsonFile, _ := ioutil.ReadFile("docs/swagger.json")
jsonData, _ := simplejson.NewFromReader(bytes.NewReader(jsonFile))
urlPath := v.RelativePath
idPatten := "(.*)/:(\\w+)" // 正则替换,把:id换成{id}
reg, _ := regexp.Compile(idPatten)
if reg.MatchString(urlPath) {
urlPath = reg.ReplaceAllString(v.RelativePath, "${1}/{${2}}") // 把:id换成{id}
}
apiTitle, _ := jsonData.Get("paths").Get(urlPath).Get(strings.ToLower(v.HttpMethod)).Get("summary").String()
err := d.Debug().Where(SysApi{Path: v.RelativePath, Action: v.HttpMethod}).
Attrs(SysApi{Handle: v.Handler, Title: apiTitle}).
FirstOrCreate(&SysApi{}).
//Update("handle", v.Handler).
Error
if err != nil {
err := fmt.Errorf("Models SaveSysApi error: %s \r\n ", err.Error())
return err
}
}
}
}
return nil
}

View File

@ -0,0 +1,30 @@
package models
import (
"go-admin/common/models"
)
type SysConfig struct {
models.Model
ConfigName string `json:"configName" gorm:"size:128;comment:ConfigName"` //
ConfigKey string `json:"configKey" gorm:"size:128;comment:ConfigKey"` //
ConfigValue string `json:"configValue" gorm:"size:255;comment:ConfigValue"` //
ConfigType string `json:"configType" gorm:"size:64;comment:ConfigType"`
IsFrontend string `json:"isFrontend" gorm:"size:64;comment:是否前台"` //
Remark string `json:"remark" gorm:"size:128;comment:Remark"` //
models.ControlBy
models.ModelTime
}
func (*SysConfig) TableName() string {
return "sys_config"
}
func (e *SysConfig) Generate() models.ActiveRecord {
o := *e
return &o
}
func (e *SysConfig) GetId() interface{} {
return e.Id
}

View File

@ -0,0 +1,33 @@
package models
import "go-admin/common/models"
type SysDept struct {
DeptId int `json:"deptId" gorm:"primaryKey;autoIncrement;"` //部门编码
ParentId int `json:"parentId" gorm:""` //上级部门
DeptPath string `json:"deptPath" gorm:"size:255;"` //
DeptName string `json:"deptName" gorm:"size:128;"` //部门名称
Sort int `json:"sort" gorm:"size:4;"` //排序
Leader string `json:"leader" gorm:"size:128;"` //负责人
Phone string `json:"phone" gorm:"size:11;"` //手机
Email string `json:"email" gorm:"size:64;"` //邮箱
Status int `json:"status" gorm:"size:4;"` //状态
models.ControlBy
models.ModelTime
DataScope string `json:"dataScope" gorm:"-"`
Params string `json:"params" gorm:"-"`
Children []SysDept `json:"children" gorm:"-"`
}
func (*SysDept) TableName() string {
return "sys_dept"
}
func (e *SysDept) Generate() models.ActiveRecord {
o := *e
return &o
}
func (e *SysDept) GetId() interface{} {
return e.DeptId
}

View File

@ -0,0 +1,34 @@
package models
import (
"go-admin/common/models"
)
type SysDictData struct {
DictCode int `json:"dictCode" gorm:"primaryKey;column:dict_code;autoIncrement;comment:主键编码"`
DictSort int `json:"dictSort" gorm:"size:20;comment:DictSort"`
DictLabel string `json:"dictLabel" gorm:"size:128;comment:DictLabel"`
DictValue string `json:"dictValue" gorm:"size:255;comment:DictValue"`
DictType string `json:"dictType" gorm:"size:64;comment:DictType"`
CssClass string `json:"cssClass" gorm:"size:128;comment:CssClass"`
ListClass string `json:"listClass" gorm:"size:128;comment:ListClass"`
IsDefault string `json:"isDefault" gorm:"size:8;comment:IsDefault"`
Status int `json:"status" gorm:"size:4;comment:Status"`
Default string `json:"default" gorm:"size:8;comment:Default"`
Remark string `json:"remark" gorm:"size:255;comment:Remark"`
models.ControlBy
models.ModelTime
}
func (*SysDictData) TableName() string {
return "sys_dict_data"
}
func (e *SysDictData) Generate() models.ActiveRecord {
o := *e
return &o
}
func (e *SysDictData) GetId() interface{} {
return e.DictCode
}

View File

@ -0,0 +1,28 @@
package models
import (
"go-admin/common/models"
)
type SysDictType struct {
ID int `json:"id" gorm:"primaryKey;column:dict_id;autoIncrement;comment:主键编码"`
DictName string `json:"dictName" gorm:"size:128;comment:DictName"`
DictType string `json:"dictType" gorm:"size:128;comment:DictType"`
Status int `json:"status" gorm:"size:4;comment:Status"`
Remark string `json:"remark" gorm:"size:255;comment:Remark"`
models.ControlBy
models.ModelTime
}
func (*SysDictType) TableName() string {
return "sys_dict_type"
}
func (e *SysDictType) Generate() models.ActiveRecord {
o := *e
return &o
}
func (e *SysDictType) GetId() interface{} {
return e.ID
}

View File

@ -0,0 +1,72 @@
package models
import (
"encoding/json"
"errors"
"time"
log "github.com/go-admin-team/go-admin-core/logger"
"github.com/go-admin-team/go-admin-core/sdk"
"github.com/go-admin-team/go-admin-core/storage"
"go-admin/common/models"
)
type SysLoginLog struct {
models.Model
Username string `json:"username" gorm:"size:128;comment:用户名"`
Status string `json:"status" gorm:"size:4;comment:状态"`
Ipaddr string `json:"ipaddr" gorm:"size:255;comment:ip地址"`
LoginLocation string `json:"loginLocation" gorm:"size:255;comment:归属地"`
Browser string `json:"browser" gorm:"size:255;comment:浏览器"`
Os string `json:"os" gorm:"size:255;comment:系统"`
Platform string `json:"platform" gorm:"size:255;comment:固件"`
LoginTime time.Time `json:"loginTime" gorm:"comment:登录时间"`
Remark string `json:"remark" gorm:"size:255;comment:备注"`
Msg string `json:"msg" gorm:"size:255;comment:信息"`
CreatedAt time.Time `json:"createdAt" gorm:"comment:创建时间"`
UpdatedAt time.Time `json:"updatedAt" gorm:"comment:最后更新时间"`
models.ControlBy
}
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
}
// SaveLoginLog 从队列中获取登录日志
func SaveLoginLog(message storage.Messager) (err error) {
//准备db
db := sdk.Runtime.GetDbByKey(message.GetPrefix())
if db == nil {
err = errors.New("db not exist")
log.Errorf("host[%s]'s %s", message.GetPrefix(), err.Error())
return err
}
var rb []byte
rb, err = json.Marshal(message.GetValues())
if err != nil {
log.Errorf("json Marshal error, %s", err.Error())
return err
}
var l SysLoginLog
err = json.Unmarshal(rb, &l)
if err != nil {
log.Errorf("json Unmarshal error, %s", err.Error())
return err
}
err = db.Create(&l).Error
if err != nil {
log.Errorf("db create error, %s", err.Error())
return err
}
return nil
}

View File

@ -0,0 +1,50 @@
package models
import "go-admin/common/models"
type SysMenu struct {
MenuId int `json:"menuId" gorm:"primaryKey;autoIncrement"`
MenuName string `json:"menuName" gorm:"size:128;"`
Title string `json:"title" gorm:"size:128;"`
Icon string `json:"icon" gorm:"size:128;"`
Path string `json:"path" gorm:"size:128;"`
Paths string `json:"paths" gorm:"size:128;"`
MenuType string `json:"menuType" gorm:"size:1;"`
Action string `json:"action" gorm:"size:16;"`
Permission string `json:"permission" gorm:"size:255;"`
ParentId int `json:"parentId" gorm:"size:11;"`
NoCache bool `json:"noCache" gorm:"size:8;"`
Breadcrumb string `json:"breadcrumb" gorm:"size:255;"`
Component string `json:"component" gorm:"size:255;"`
Sort int `json:"sort" gorm:"size:4;"`
Visible string `json:"visible" gorm:"size:1;"`
IsFrame string `json:"isFrame" gorm:"size:1;DEFAULT:0;"`
SysApi []SysApi `json:"sysApi" gorm:"many2many:sys_menu_api_rule"`
Apis []int `json:"apis" gorm:"-"`
DataScope string `json:"dataScope" gorm:"-"`
Params string `json:"params" gorm:"-"`
RoleId int `gorm:"-"`
Children []SysMenu `json:"children,omitempty" gorm:"-"`
IsSelect bool `json:"is_select" gorm:"-"`
models.ControlBy
models.ModelTime
}
type SysMenuSlice []SysMenu
func (x SysMenuSlice) Len() int { return len(x) }
func (x SysMenuSlice) Less(i, j int) bool { return x[i].Sort < x[j].Sort }
func (x SysMenuSlice) Swap(i, j int) { x[i], x[j] = x[j], x[i] }
func (*SysMenu) TableName() string {
return "sys_menu"
}
func (e *SysMenu) Generate() models.ActiveRecord {
o := *e
return &o
}
func (e *SysMenu) GetId() interface{} {
return e.MenuId
}

View File

@ -0,0 +1,88 @@
package models
import (
"encoding/json"
"errors"
"time"
log "github.com/go-admin-team/go-admin-core/logger"
"github.com/go-admin-team/go-admin-core/sdk"
"github.com/go-admin-team/go-admin-core/storage"
"go-admin/common/models"
)
type SysOperaLog struct {
models.Model
Title string `json:"title" gorm:"size:255;comment:操作模块"`
BusinessType string `json:"businessType" gorm:"size:128;comment:操作类型"`
BusinessTypes string `json:"businessTypes" gorm:"size:128;comment:BusinessTypes"`
Method string `json:"method" gorm:"size:128;comment:函数"`
RequestMethod string `json:"requestMethod" gorm:"size:128;comment:请求方式 GET POST PUT DELETE"`
OperatorType string `json:"operatorType" gorm:"size:128;comment:操作类型"`
OperName string `json:"operName" gorm:"size:128;comment:操作者"`
DeptName string `json:"deptName" gorm:"size:128;comment:部门名称"`
OperUrl string `json:"operUrl" gorm:"size:255;comment:访问地址"`
OperIp string `json:"operIp" gorm:"size:128;comment:客户端ip"`
OperLocation string `json:"operLocation" gorm:"size:128;comment:访问位置"`
OperParam string `json:"operParam" gorm:"text;comment:请求参数"`
Status string `json:"status" gorm:"size:4;comment:操作状态 1:正常 2:关闭"`
OperTime time.Time `json:"operTime" gorm:"comment:操作时间"`
JsonResult string `json:"jsonResult" gorm:"size:255;comment:返回数据"`
Remark string `json:"remark" gorm:"size:255;comment:备注"`
LatencyTime string `json:"latencyTime" gorm:"size:128;comment:耗时"`
UserAgent string `json:"userAgent" gorm:"size:255;comment:ua"`
CreatedAt time.Time `json:"createdAt" gorm:"comment:创建时间"`
UpdatedAt time.Time `json:"updatedAt" gorm:"comment:最后更新时间"`
models.ControlBy
}
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
}
// SaveOperaLog 从队列中获取操作日志
func SaveOperaLog(message storage.Messager) (err error) {
//准备db
db := sdk.Runtime.GetDbByKey(message.GetPrefix())
if db == nil {
err = errors.New("db not exist")
log.Errorf("host[%s]'s %s", message.GetPrefix(), err.Error())
// Log writing to the database ignores error
return nil
}
var rb []byte
rb, err = json.Marshal(message.GetValues())
if err != nil {
log.Errorf("json Marshal error, %s", err.Error())
// Log writing to the database ignores error
return nil
}
var l SysOperaLog
err = json.Unmarshal(rb, &l)
if err != nil {
log.Errorf("json Unmarshal error, %s", err.Error())
// Log writing to the database ignores error
return nil
}
// 超出100个字符返回值截断
if len(l.JsonResult) > 100 {
l.JsonResult = l.JsonResult[:100]
}
err = db.Create(&l).Error
if err != nil {
log.Errorf("db create error, %s", err.Error())
// Log writing to the database ignores error
return nil
}
return nil
}

View File

@ -0,0 +1,30 @@
package models
import "go-admin/common/models"
type SysPost struct {
PostId int `gorm:"primaryKey;autoIncrement" json:"postId"` //岗位编号
PostName string `gorm:"size:128;" json:"postName"` //岗位名称
PostCode string `gorm:"size:128;" json:"postCode"` //岗位代码
Sort int `gorm:"size:4;" json:"sort"` //岗位排序
Status int `gorm:"size:4;" json:"status"` //状态
Remark string `gorm:"size:255;" json:"remark"` //描述
models.ControlBy
models.ModelTime
DataScope string `gorm:"-" json:"dataScope"`
Params string `gorm:"-" json:"params"`
}
func (*SysPost) TableName() string {
return "sys_post"
}
func (e *SysPost) Generate() models.ActiveRecord {
o := *e
return &o
}
func (e *SysPost) GetId() interface{} {
return e.PostId
}

View File

@ -0,0 +1,35 @@
package models
import "go-admin/common/models"
type SysRole struct {
RoleId int `json:"roleId" gorm:"primaryKey;autoIncrement"` // 角色编码
RoleName string `json:"roleName" gorm:"size:128;"` // 角色名称
Status string `json:"status" gorm:"size:4;"` // 状态 1禁用 2正常
RoleKey string `json:"roleKey" gorm:"size:128;"` //角色代码
RoleSort int `json:"roleSort" gorm:""` //角色排序
Flag string `json:"flag" gorm:"size:128;"` //
Remark string `json:"remark" gorm:"size:255;"` //备注
Admin bool `json:"admin" gorm:"size:4;"`
DataScope string `json:"dataScope" gorm:"size:128;"`
Params string `json:"params" gorm:"-"`
MenuIds []int `json:"menuIds" gorm:"-"`
DeptIds []int `json:"deptIds" gorm:"-"`
SysDept []SysDept `json:"sysDept" gorm:"many2many:sys_role_dept;foreignKey:RoleId;joinForeignKey:role_id;references:DeptId;joinReferences:dept_id;"`
SysMenu *[]SysMenu `json:"sysMenu" gorm:"many2many:sys_role_menu;foreignKey:RoleId;joinForeignKey:role_id;references:MenuId;joinReferences:menu_id;"`
models.ControlBy
models.ModelTime
}
func (*SysRole) TableName() string {
return "sys_role"
}
func (e *SysRole) Generate() models.ActiveRecord {
o := *e
return &o
}
func (e *SysRole) GetId() interface{} {
return e.RoleId
}

View File

@ -0,0 +1,77 @@
package models
import (
"go-admin/common/models"
"golang.org/x/crypto/bcrypt"
"gorm.io/gorm"
)
type SysUser struct {
UserId int `gorm:"primaryKey;autoIncrement;comment:编码" json:"userId"`
Username string `json:"username" gorm:"size:64;comment:用户名"`
Password string `json:"-" gorm:"size:128;comment:密码"`
NickName string `json:"nickName" gorm:"size:128;comment:昵称"`
Phone string `json:"phone" gorm:"size:11;comment:手机号"`
RoleId int `json:"roleId" gorm:"size:20;comment:角色ID"`
Salt string `json:"-" gorm:"size:255;comment:加盐"`
Avatar string `json:"avatar" gorm:"size:255;comment:头像"`
Sex string `json:"sex" gorm:"size:255;comment:性别"`
Email string `json:"email" gorm:"size:128;comment:邮箱"`
DeptId int `json:"deptId" gorm:"size:20;comment:部门"`
PostId int `json:"postId" gorm:"size:20;comment:岗位"`
Remark string `json:"remark" gorm:"size:255;comment:备注"`
Status string `json:"status" gorm:"size:4;comment:状态"`
DeptIds []int `json:"deptIds" gorm:"-"`
PostIds []int `json:"postIds" gorm:"-"`
RoleIds []int `json:"roleIds" gorm:"-"`
Dept *SysDept `json:"dept"`
models.ControlBy
models.ModelTime
}
func (*SysUser) TableName() string {
return "sys_user"
}
func (e *SysUser) Generate() models.ActiveRecord {
o := *e
return &o
}
func (e *SysUser) GetId() interface{} {
return e.UserId
}
// Encrypt 加密
func (e *SysUser) Encrypt() (err error) {
if e.Password == "" {
return
}
var hash []byte
if hash, err = bcrypt.GenerateFromPassword([]byte(e.Password), bcrypt.DefaultCost); err != nil {
return
} else {
e.Password = string(hash)
return
}
}
func (e *SysUser) BeforeCreate(_ *gorm.DB) error {
return e.Encrypt()
}
func (e *SysUser) BeforeUpdate(_ *gorm.DB) error {
var err error
if e.Password != "" {
err = e.Encrypt()
}
return err
}
func (e *SysUser) AfterFind(_ *gorm.DB) error {
e.DeptIds = []int{e.DeptId}
e.PostIds = []int{e.PostId}
e.RoleIds = []int{e.RoleId}
return nil
}

View File

@ -0,0 +1,36 @@
package models
import (
"go-admin/common/models"
)
type TmMember struct {
models.Model
UserId int `json:"userId" gorm:"type:int;comment:用户ID"`
NickName string `json:"nickName" gorm:"type:varchar(30);comment:用户昵称"`
AreaCode string `json:"areaCode" gorm:"type:varchar(10);comment:区号"`
Mobile string `json:"mobile" gorm:"type:varchar(20);comment:手机号"`
Email string `json:"email" gorm:"type:varchar(255);comment:邮箱号"`
Password string `json:"password" gorm:"type:varchar(255);comment:密码"`
Status int `json:"status" gorm:"type:tinyint;comment:状态 1-启用 2-禁用"`
ApiKey string `json:"apiKey" gorm:"type:varchar(20);comment:apiKey"`
TotalChars int `json:"totalChars" gorm:"type:int;comment:总字数"`
RemainChars int `json:"remainChars" gorm:"type:int;comment:剩余字数"`
UserStatus int `json:"userStatus" gorm:"-"`
models.ModelTime
models.ControlBy
}
func (TmMember) TableName() string {
return "tm_member"
}
func (e *TmMember) Generate() models.ActiveRecord {
o := *e
return &o
}
func (e *TmMember) GetId() interface{} {
return e.Id
}

View File

@ -0,0 +1,31 @@
package models
import (
"go-admin/common/models"
"time"
)
type TmMemberDailyUsage struct {
models.Model
MemberId int `json:"memberId" gorm:"type:bigint;comment:用户id"`
PlatformId int `json:"platformId" gorm:"type:bigint;comment:平台id"`
UseChars int `json:"useChars" gorm:"type:bigint;comment:使用字符数"`
RemainChars int `json:"remainChars" gorm:"type:bigint;comment:剩余字符数"`
Date time.Time `json:"date" gorm:"type:date;comment:日期"`
models.ModelTime
models.ControlBy
}
func (TmMemberDailyUsage) TableName() string {
return "tm_member_daily_usage"
}
func (e *TmMemberDailyUsage) Generate() models.ActiveRecord {
o := *e
return &o
}
func (e *TmMemberDailyUsage) GetId() interface{} {
return e.Id
}

View File

@ -0,0 +1,31 @@
package models
import (
"go-admin/common/models"
)
type TmMemberPlatform struct {
models.Model
MemberId int `json:"memberId" gorm:"type:bigint;comment:用户id"`
RemainingCharacter int `json:"remainingCharacter" gorm:"type:bigint;comment:剩余字符数"`
TotalCharacter int `json:"totalCharacter" gorm:"type:bigint;comment:总字符数"`
PlatformId int `json:"platformId" gorm:"type:bigint;comment:平台id"`
PlatformKey string `json:"platformKey" gorm:"type:varchar(50);comment:平台key"`
Status int `json:"status" gorm:"type:tinyint;comment:状态 1-启用 2-禁用"`
models.ModelTime
models.ControlBy
}
func (TmMemberPlatform) TableName() string {
return "tm_member_platform"
}
func (e *TmMemberPlatform) Generate() models.ActiveRecord {
o := *e
return &o
}
func (e *TmMemberPlatform) GetId() interface{} {
return e.Id
}

View File

@ -0,0 +1,34 @@
package models
import (
"go-admin/common/models"
"github.com/shopspring/decimal"
)
type TmPlatform struct {
models.Model
Name string `json:"name" gorm:"type:varchar(20);comment:平台名称"`
ShowName string `json:"showName" gorm:"type:varchar(20);comment:展示名称"`
ApiBaseUrl string `json:"apiBaseUrl" gorm:"type:varchar(500);comment:平台接口地址"`
Description string `json:"description" gorm:"type:varchar(255);comment:描述"`
Code string `json:"code" gorm:"type:varchar(20);comment:平台编码(字典 tm_platform)"`
Character string `json:"character" gorm:"type:int;comment:字符数"`
Price decimal.Decimal `json:"price" gorm:"type:decimal(10,2);comment:单价"`
models.ModelTime
models.ControlBy
}
func (TmPlatform) TableName() string {
return "tm_platform"
}
func (e *TmPlatform) Generate() models.ActiveRecord {
o := *e
return &o
}
func (e *TmPlatform) GetId() interface{} {
return e.Id
}

View File

@ -0,0 +1,32 @@
package models
import (
"go-admin/common/models"
)
type TmPlatformAccount struct {
models.Model
PlatformId int `json:"platformId" gorm:"type:bigint;comment:平台主键"`
PlatformKey string `json:"platformKey" gorm:"type:varchar(30);comment:平台key"`
ApiKey string `json:"apiKey" gorm:"type:varchar(500);comment:api_key"`
ApiSecret string `json:"apiSecret" gorm:"type:varchar(255);comment:api密钥"`
QpsLimit int `json:"qpsLimit" gorm:"type:int;comment:qps限制"`
RemainChars int `json:"remainChars" gorm:"type:int;comment:剩余字符"`
Status int `json:"status" gorm:"type:int;comment:状态 1-启用 2-禁用"`
models.ModelTime
models.ControlBy
}
func (TmPlatformAccount) TableName() string {
return "tm_platform_account"
}
func (e *TmPlatformAccount) Generate() models.ActiveRecord {
o := *e
return &o
}
func (e *TmPlatformAccount) GetId() interface{} {
return e.Id
}

View File

@ -0,0 +1,27 @@
package models
import "go-admin/common/models"
type TmRechargeLog struct {
models.Model
UserId int `json:"userId" gorm:"column:user_id;type:bigint;not null;comment:用户id"`
MemberId int `json:"memberId" gorm:"column:member_id;type:bigint;not null;comment:翻译用户id"`
Status int `json:"status" gorm:"column:status;type:tinyint;not null;comment:状态 1-正常 2-作废"`
TotalChars int `json:"totalChars" gorm:"column:total_chars;type:bigint;not null;comment:充值字符数"`
models.ModelTime
models.ControlBy
}
func (TmRechargeLog) TableName() string {
return "tm_recharge_log"
}
func (e *TmRechargeLog) Generate() models.ActiveRecord {
o := *e
return &o
}
func (e *TmRechargeLog) GetId() interface{} {
return e.Id
}

View File

@ -0,0 +1,40 @@
package router
import (
"os"
"github.com/gin-gonic/gin"
log "github.com/go-admin-team/go-admin-core/logger"
"github.com/go-admin-team/go-admin-core/sdk"
common "go-admin/common/middleware"
)
// InitRouter 路由初始化,不要怀疑,这里用到了
func InitRouter() {
var r *gin.Engine
h := sdk.Runtime.GetEngine()
if h == nil {
log.Fatal("not found engine...")
os.Exit(-1)
}
switch h.(type) {
case *gin.Engine:
r = h.(*gin.Engine)
default:
log.Fatal("not support other engine")
os.Exit(-1)
}
// the jwt middleware
authMiddleware, err := common.AuthInit()
if err != nil {
log.Fatalf("JWT Init Error, %s", err.Error())
}
// 注册系统路由
InitSysRouter(r, authMiddleware)
// 注册业务路由
// TODO: 这里可存放业务路由,里边并无实际路由只有演示代码
InitExamplesRouter(r, authMiddleware)
}

View File

@ -0,0 +1,54 @@
package router
import (
"github.com/gin-gonic/gin"
_ "github.com/gin-gonic/gin"
"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth"
jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth"
)
var (
routerNoCheckRole = make([]func(*gin.RouterGroup), 0)
routerCheckRole = make([]func(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware), 0)
routerApp = make([]func(*gin.RouterGroup), 0)
)
func InitExamplesRouter(r *gin.Engine, authMiddleware *jwt.GinJWTMiddleware) *gin.Engine {
// 无需认证的路由
examplesNoCheckRoleRouter(r)
//对外api
examplesAppRouter(r)
// 需要认证的路由
examplesCheckRoleRouter(r, authMiddleware)
return r
}
// 对外api
func examplesAppRouter(r *gin.Engine) {
v1 := r.Group("/open-api/v1")
for _, f := range routerApp {
f(v1)
}
}
// 无需认证的路由示例
func examplesNoCheckRoleRouter(r *gin.Engine) {
// 可根据业务需求来设置接口版本
v1 := r.Group("/api/v1")
for _, f := range routerNoCheckRole {
f(v1)
}
}
// 需要认证的路由示例
func examplesCheckRoleRouter(r *gin.Engine, authMiddleware *jwtauth.GinJWTMiddleware) {
// 可根据业务需求来设置接口版本
v1 := r.Group("/api/v1")
for _, f := range routerCheckRole {
f(v1, authMiddleware)
}
}

View File

@ -0,0 +1,24 @@
package router
import (
"github.com/gin-gonic/gin"
jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth"
"go-admin/app/admin/apis"
"go-admin/common/middleware"
)
func init() {
routerCheckRole = append(routerCheckRole, registerSysApiRouter)
}
// registerSysApiRouter
func registerSysApiRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {
api := apis.SysApi{}
r := v1.Group("/sys-api").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())
{
r.GET("", api.GetPage)
r.GET("/:id", api.Get)
r.PUT("/:id", api.Update)
}
}

View File

@ -0,0 +1,43 @@
package router
import (
"go-admin/app/admin/apis"
"go-admin/common/middleware"
"github.com/gin-gonic/gin"
jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth"
)
func init() {
routerCheckRole = append(routerCheckRole, registerSysConfigRouter)
}
// 需认证的路由代码
func registerSysConfigRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {
api := apis.SysConfig{}
r := v1.Group("/config").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())
{
r.GET("", api.GetPage)
r.GET("/:id", api.Get)
r.POST("", api.Insert)
r.PUT("/:id", api.Update)
r.DELETE("", api.Delete)
}
r1 := v1.Group("/configKey").Use(authMiddleware.MiddlewareFunc())
{
r1.GET("/:configKey", api.GetSysConfigByKEYForService)
}
r2 := v1.Group("/app-config")
{
r2.GET("", api.Get2SysApp)
}
r3 := v1.Group("/set-config").Use(authMiddleware.MiddlewareFunc())
{
r3.PUT("", api.Update2Set)
r3.GET("", api.Get2Set)
}
}

View File

@ -0,0 +1,32 @@
package router
import (
"github.com/gin-gonic/gin"
jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth"
"go-admin/app/admin/apis"
"go-admin/common/middleware"
)
func init() {
routerCheckRole = append(routerCheckRole, registerSysDeptRouter)
}
// 需认证的路由代码
func registerSysDeptRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {
api := apis.SysDept{}
r := v1.Group("/dept").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())
{
r.GET("", api.GetPage)
r.GET("/:id", api.Get)
r.POST("", api.Insert)
r.PUT("/:id", api.Update)
r.DELETE("", api.Delete)
}
r1 := v1.Group("").Use(authMiddleware.MiddlewareFunc())
{
r1.GET("/deptTree", api.Get2Tree)
}
}

View File

@ -0,0 +1,37 @@
package router
import (
"github.com/gin-gonic/gin"
jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth"
"go-admin/app/admin/apis"
"go-admin/common/middleware"
)
func init() {
routerCheckRole = append(routerCheckRole, registerDictRouter)
}
func registerDictRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {
dictApi := apis.SysDictType{}
dataApi := apis.SysDictData{}
dicts := v1.Group("/dict").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())
{
dicts.GET("/data", dataApi.GetPage)
dicts.GET("/data/:dictCode", dataApi.Get)
dicts.POST("/data", dataApi.Insert)
dicts.PUT("/data/:dictCode", dataApi.Update)
dicts.DELETE("/data", dataApi.Delete)
dicts.GET("/type-option-select", dictApi.GetAll)
dicts.GET("/type", dictApi.GetPage)
dicts.GET("/type/:id", dictApi.Get)
dicts.POST("/type", dictApi.Insert)
dicts.PUT("/type/:id", dictApi.Update)
dicts.DELETE("/type", dictApi.Delete)
}
opSelect := v1.Group("/dict-data").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())
{
opSelect.GET("/option-select", dataApi.GetAll)
}
}

View File

@ -0,0 +1,24 @@
package router
import (
"github.com/gin-gonic/gin"
jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth"
"go-admin/app/admin/apis"
"go-admin/common/middleware"
)
func init() {
routerCheckRole = append(routerCheckRole, registerSysLoginLogRouter)
}
// 需认证的路由代码
func registerSysLoginLogRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {
api := apis.SysLoginLog{}
r := v1.Group("/sys-login-log").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())
{
r.GET("", api.GetPage)
r.GET("/:id", api.Get)
r.DELETE("", api.Delete)
}
}

View File

@ -0,0 +1,33 @@
package router
import (
"github.com/gin-gonic/gin"
jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth"
"go-admin/app/admin/apis"
"go-admin/common/middleware"
)
func init() {
routerCheckRole = append(routerCheckRole, registerSysMenuRouter)
}
// 需认证的路由代码
func registerSysMenuRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {
api := apis.SysMenu{}
r := v1.Group("/menu").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())
{
r.GET("", api.GetPage)
r.GET("/:id", api.Get)
r.POST("", api.Insert)
r.PUT("/:id", api.Update)
r.DELETE("", api.Delete)
}
r1 := v1.Group("").Use(authMiddleware.MiddlewareFunc())
{
r1.GET("/menurole", api.GetMenuRole)
//r1.GET("/menuids", api.GetMenuIDS)
}
}

View File

@ -0,0 +1,23 @@
package router
import (
"github.com/gin-gonic/gin"
jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth"
"go-admin/app/admin/apis"
"go-admin/common/middleware"
)
func init() {
routerCheckRole = append(routerCheckRole, registerSysOperaLogRouter)
}
// 需认证的路由代码
func registerSysOperaLogRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {
api := apis.SysOperaLog{}
r := v1.Group("/sys-opera-log").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())
{
r.GET("", api.GetPage)
r.GET("/:id", api.Get)
r.DELETE("", api.Delete)
}
}

View File

@ -0,0 +1,25 @@
package router
import (
"github.com/gin-gonic/gin"
jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth"
"go-admin/app/admin/apis"
"go-admin/common/middleware"
)
func init() {
routerCheckRole = append(routerCheckRole, registerSyPostRouter)
}
// 需认证的路由代码
func registerSyPostRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {
api := apis.SysPost{}
r := v1.Group("/post").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())
{
r.GET("", api.GetPage)
r.GET("/:id", api.Get)
r.POST("", api.Insert)
r.PUT("/:id", api.Update)
r.DELETE("", api.Delete)
}
}

View File

@ -0,0 +1,31 @@
package router
import (
"github.com/gin-gonic/gin"
jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth"
"go-admin/app/admin/apis"
"go-admin/common/middleware"
)
func init() {
routerCheckRole = append(routerCheckRole, registerSysRoleRouter)
}
// 需认证的路由代码
func registerSysRoleRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {
api := apis.SysRole{}
r := v1.Group("/role").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())
{
r.GET("", api.GetPage)
r.GET("/:id", api.Get)
r.POST("", api.Insert)
r.PUT("/:id", api.Update)
r.DELETE("", api.Delete)
}
r1 := v1.Group("").Use(authMiddleware.MiddlewareFunc())
{
r1.PUT("/role-status", api.Update2Status)
r1.PUT("/roledatascope", api.Update2DataScope)
}
}

View File

@ -0,0 +1,88 @@
package router
import (
"go-admin/app/admin/apis"
"mime"
"github.com/go-admin-team/go-admin-core/sdk/config"
"github.com/gin-gonic/gin"
jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth"
"github.com/go-admin-team/go-admin-core/sdk/pkg/ws"
ginSwagger "github.com/swaggo/gin-swagger"
swaggerfiles "github.com/swaggo/files"
"go-admin/common/middleware"
"go-admin/common/middleware/handler"
_ "go-admin/docs/admin"
)
func InitSysRouter(r *gin.Engine, authMiddleware *jwt.GinJWTMiddleware) *gin.RouterGroup {
g := r.Group("")
sysBaseRouter(g)
// 静态文件
sysStaticFileRouter(g)
// swagger注意生产环境可以注释掉
if config.ApplicationConfig.Mode != "prod" {
sysSwaggerRouter(g)
}
// 需要认证
sysCheckRoleRouterInit(g, authMiddleware)
return g
}
func sysBaseRouter(r *gin.RouterGroup) {
go ws.WebsocketManager.Start()
go ws.WebsocketManager.SendService()
go ws.WebsocketManager.SendAllService()
if config.ApplicationConfig.Mode != "prod" {
r.GET("/", apis.GoAdmin)
}
r.GET("/info", handler.Ping)
}
func sysStaticFileRouter(r *gin.RouterGroup) {
err := mime.AddExtensionType(".js", "application/javascript")
if err != nil {
return
}
r.Static("/static", "./static")
if config.ApplicationConfig.Mode != "prod" {
r.Static("/form-generator", "./static/form-generator")
}
}
func sysSwaggerRouter(r *gin.RouterGroup) {
r.GET("/swagger/admin/*any", ginSwagger.WrapHandler(swaggerfiles.NewHandler(), ginSwagger.InstanceName("admin")))
}
func sysCheckRoleRouterInit(r *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {
wss := r.Group("").Use(authMiddleware.MiddlewareFunc())
{
wss.GET("/ws/:id/:channel", ws.WebsocketManager.WsClient)
wss.GET("/wslogout/:id/:channel", ws.WebsocketManager.UnWsClient)
}
v1 := r.Group("/api/v1")
{
v1.POST("/login", authMiddleware.LoginHandler)
// Refresh time can be longer than token timeout
v1.GET("/refresh_token", authMiddleware.RefreshHandler)
}
registerBaseRouter(v1, authMiddleware)
}
func registerBaseRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {
api := apis.SysMenu{}
api2 := apis.SysDept{}
v1auth := v1.Group("").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())
{
v1auth.GET("/roleMenuTreeselect/:roleId", api.GetMenuTreeSelect)
//v1.GET("/menuTreeselect", api.GetMenuTreeSelect)
v1auth.GET("/roleDeptTreeselect/:roleId", api2.GetDeptTreeRoleSelect)
v1auth.POST("/logout", handler.LogOut)
}
}

View File

@ -0,0 +1,39 @@
package router
import (
"github.com/gin-gonic/gin"
jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth"
"go-admin/app/admin/apis"
"go-admin/common/actions"
"go-admin/common/middleware"
)
func init() {
routerCheckRole = append(routerCheckRole, registerSysUserRouter)
}
// 需认证的路由代码
func registerSysUserRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {
api := apis.SysUser{}
r := v1.Group("/sys-user").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()).Use(actions.PermissionAction())
{
r.GET("", api.GetPage)
r.GET("/:id", api.Get)
r.POST("", api.Insert)
r.PUT("", api.Update)
r.DELETE("", api.Delete)
}
user := v1.Group("/user").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()).Use(actions.PermissionAction())
{
user.GET("/profile", api.GetProfile)
user.POST("/avatar", api.InsetAvatar)
user.PUT("/pwd/set", api.UpdatePwd)
user.PUT("/pwd/reset", api.ResetPwd)
user.PUT("/status", api.UpdateStatus)
}
v1auth := v1.Group("").Use(authMiddleware.MiddlewareFunc())
{
v1auth.GET("/getinfo", api.GetInfo)
}
}

View File

@ -0,0 +1,36 @@
package router
import (
"github.com/gin-gonic/gin"
jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth"
"go-admin/app/admin/apis"
"go-admin/common/actions"
"go-admin/common/middleware"
)
func init() {
routerCheckRole = append(routerCheckRole, registerTmMemberRouter)
}
// registerTmMemberRouter
func registerTmMemberRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {
api := apis.TmMember{}
r := v1.Group("/tm-member").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())
{
r.GET("", actions.PermissionAction(), api.GetPage)
r.GET("/:id", actions.PermissionAction(), api.Get)
r.POST("", api.Insert)
r.PUT("/:id", actions.PermissionAction(), api.Update)
r.DELETE("", api.Delete)
r.POST("recharge", actions.PermissionAction(), api.Recharge) //字符充值
r.PUT("status", actions.PermissionAction(), api.ChangeStatus) //状态变更
}
r2 := v1.Group("/tm-member").Use(authMiddleware.MiddlewareFunc())
{
r2.GET("/api-key", api.GetMyApiKey)
r2.GET("platforms", api.GetPlatforms)
}
}

View File

@ -0,0 +1,27 @@
package router
import (
"github.com/gin-gonic/gin"
jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth"
"go-admin/app/admin/apis"
"go-admin/common/middleware"
"go-admin/common/actions"
)
func init() {
routerCheckRole = append(routerCheckRole, registerTmMemberDailyUsageRouter)
}
// registerTmMemberDailyUsageRouter
func registerTmMemberDailyUsageRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {
api := apis.TmMemberDailyUsage{}
r := v1.Group("/tm-member-daily-usage").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())
{
r.GET("", actions.PermissionAction(), api.GetPage)
r.GET("/:id", actions.PermissionAction(), api.Get)
r.POST("", api.Insert)
r.PUT("/:id", actions.PermissionAction(), api.Update)
r.DELETE("", api.Delete)
}
}

View File

@ -0,0 +1,32 @@
package router
import (
"github.com/gin-gonic/gin"
jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth"
"go-admin/app/admin/apis"
"go-admin/common/actions"
"go-admin/common/middleware"
)
func init() {
routerCheckRole = append(routerCheckRole, registerTmMemberPlatformRouter)
}
// registerTmMemberPlatformRouter
func registerTmMemberPlatformRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {
api := apis.TmMemberPlatform{}
r := v1.Group("/tm-member-platform").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())
{
r.GET("", actions.PermissionAction(), api.GetPage)
r.GET("/:id", actions.PermissionAction(), api.Get)
r.POST("", api.Insert)
r.PUT("/:id", actions.PermissionAction(), api.Update)
r.DELETE("", api.Delete)
}
f2 := v1.Group("/tm-member-platform").Use(authMiddleware.MiddlewareFunc())
{
f2.GET("statistics", api.GetStatistic)
}
}

View File

@ -0,0 +1,32 @@
package router
import (
"github.com/gin-gonic/gin"
jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth"
"go-admin/app/admin/apis"
"go-admin/common/actions"
"go-admin/common/middleware"
)
func init() {
routerCheckRole = append(routerCheckRole, registerTmPlatformRouter)
}
// registerTmPlatformRouter
func registerTmPlatformRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {
api := apis.TmPlatform{}
r := v1.Group("/tm-platform").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())
{
r.GET("", actions.PermissionAction(), api.GetPage)
r.GET("/:id", actions.PermissionAction(), api.Get)
r.POST("", api.Insert)
r.PUT("/:id", actions.PermissionAction(), api.Update)
r.DELETE("", api.Delete)
}
r1 := v1.Group("/tm-platform")
{
r1.GET("list", api.List)
}
}

View File

@ -0,0 +1,27 @@
package router
import (
"github.com/gin-gonic/gin"
jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth"
"go-admin/app/admin/apis"
"go-admin/common/middleware"
"go-admin/common/actions"
)
func init() {
routerCheckRole = append(routerCheckRole, registerTmPlatformAccountRouter)
}
// registerTmPlatformAccountRouter
func registerTmPlatformAccountRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {
api := apis.TmPlatformAccount{}
r := v1.Group("/tm-platform-account").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())
{
r.GET("", actions.PermissionAction(), api.GetPage)
r.GET("/:id", actions.PermissionAction(), api.Get)
r.POST("", api.Insert)
r.PUT("/:id", actions.PermissionAction(), api.Update)
r.DELETE("", api.Delete)
}
}

View File

@ -0,0 +1,32 @@
package router
import (
"go-admin/app/admin/apis"
"go-admin/common/middleware"
"github.com/gin-gonic/gin"
jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth"
)
func init() {
routerCheckRole = append(routerCheckRole, registerTranslateRouter)
routerApp = append(routerApp, registerTmPlatformAppRouter)
}
// registerTmPlatformRouter
func registerTranslateRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {
api := apis.Translate{}
r := v1.Group("/translate").Use(authMiddleware.MiddlewareFunc())
{
r.GET("/datastatistics", api.GetTranslateStatistic)
}
}
func registerTmPlatformAppRouter(v1 *gin.RouterGroup) {
api := apis.Translate{}
r := v1.Group("translate", middleware.FrontedAuth)
{
r.POST("", api.Translate)
}
}

View File

@ -0,0 +1,95 @@
package dto
import (
"go-admin/app/admin/models"
"go-admin/common/dto"
common "go-admin/common/models"
)
// SysApiGetPageReq 功能列表请求参数
type SysApiGetPageReq struct {
dto.Pagination `search:"-"`
Title string `form:"title" search:"type:contains;column:title;table:sys_api" comment:"标题"`
Path string `form:"path" search:"type:contains;column:path;table:sys_api" comment:"地址"`
Action string `form:"action" search:"type:exact;column:action;table:sys_api" comment:"请求方式"`
ParentId string `form:"parentId" search:"type:exact;column:parent_id;table:sys_api" comment:"按钮id"`
Type string `form:"type" search:"-" comment:"类型"`
SysApiOrder
}
type SysApiOrder struct {
TitleOrder string `search:"type:order;column:title;table:sys_api" form:"titleOrder"`
PathOrder string `search:"type:order;column:path;table:sys_api" form:"pathOrder"`
CreatedAtOrder string `search:"type:order;column:created_at;table:sys_api" form:"createdAtOrder"`
}
func (m *SysApiGetPageReq) GetNeedSearch() interface{} {
return *m
}
// SysApiInsertReq 功能创建请求参数
type SysApiInsertReq struct {
Id int `json:"-" comment:"编码"` // 编码
Handle string `json:"handle" comment:"handle"`
Title string `json:"title" comment:"标题"`
Path string `json:"path" comment:"地址"`
Type string `json:"type" comment:""`
Action string `json:"action" comment:"类型"`
common.ControlBy
}
func (s *SysApiInsertReq) Generate(model *models.SysApi) {
model.Handle = s.Handle
model.Title = s.Title
model.Path = s.Path
model.Type = s.Type
model.Action = s.Action
}
func (s *SysApiInsertReq) GetId() interface{} {
return s.Id
}
// SysApiUpdateReq 功能更新请求参数
type SysApiUpdateReq struct {
Id int `uri:"id" comment:"编码"` // 编码
Handle string `json:"handle" comment:"handle"`
Title string `json:"title" comment:"标题"`
Path string `json:"path" comment:"地址"`
Type string `json:"type" comment:""`
Action string `json:"action" comment:"类型"`
common.ControlBy
}
func (s *SysApiUpdateReq) Generate(model *models.SysApi) {
if s.Id != 0 {
model.Id = s.Id
}
model.Handle = s.Handle
model.Title = s.Title
model.Path = s.Path
model.Type = s.Type
model.Action = s.Action
}
func (s *SysApiUpdateReq) GetId() interface{} {
return s.Id
}
// SysApiGetReq 功能获取请求参数
type SysApiGetReq struct {
Id int `uri:"id"`
}
func (s *SysApiGetReq) GetId() interface{} {
return s.Id
}
// SysApiDeleteReq 功能删除请求参数
type SysApiDeleteReq struct {
Ids []int `json:"ids"`
}
func (s *SysApiDeleteReq) GetId() interface{} {
return s.Ids
}

View File

@ -0,0 +1,112 @@
package dto
import (
"go-admin/app/admin/models"
"go-admin/common/dto"
common "go-admin/common/models"
)
// SysConfigGetPageReq 列表或者搜索使用结构体
type SysConfigGetPageReq struct {
dto.Pagination `search:"-"`
ConfigName string `form:"configName" search:"type:contains;column:config_name;table:sys_config"`
ConfigKey string `form:"configKey" search:"type:contains;column:config_key;table:sys_config"`
ConfigType string `form:"configType" search:"type:exact;column:config_type;table:sys_config"`
IsFrontend string `form:"isFrontend" search:"type:exact;column:is_frontend;table:sys_config"`
SysConfigOrder
}
type SysConfigOrder struct {
IdOrder string `search:"type:order;column:id;table:sys_config" form:"idOrder"`
ConfigNameOrder string `search:"type:order;column:config_name;table:sys_config" form:"configNameOrder"`
ConfigKeyOrder string `search:"type:order;column:config_key;table:sys_config" form:"configKeyOrder"`
ConfigTypeOrder string `search:"type:order;column:config_type;table:sys_config" form:"configTypeOrder"`
CreatedAtOrder string `search:"type:order;column:created_at;table:sys_config" form:"createdAtOrder"`
}
func (m *SysConfigGetPageReq) GetNeedSearch() interface{} {
return *m
}
type SysConfigGetToSysAppReq struct {
IsFrontend string `form:"isFrontend" search:"type:exact;column:is_frontend;table:sys_config"`
}
func (m *SysConfigGetToSysAppReq) GetNeedSearch() interface{} {
return *m
}
// SysConfigControl 增、改使用的结构体
type SysConfigControl struct {
Id int `uri:"Id" comment:"编码"` // 编码
ConfigName string `json:"configName" comment:""`
ConfigKey string `uri:"configKey" json:"configKey" comment:""`
ConfigValue string `json:"configValue" comment:""`
ConfigType string `json:"configType" comment:""`
IsFrontend string `json:"isFrontend"`
Remark string `json:"remark" comment:""`
common.ControlBy
}
// Generate 结构体数据转化 从 SysConfigControl 至 system.SysConfig 对应的模型
func (s *SysConfigControl) Generate(model *models.SysConfig) {
if s.Id == 0 {
model.Model = common.Model{Id: s.Id}
}
model.ConfigName = s.ConfigName
model.ConfigKey = s.ConfigKey
model.ConfigValue = s.ConfigValue
model.ConfigType = s.ConfigType
model.IsFrontend = s.IsFrontend
model.Remark = s.Remark
}
// GetId 获取数据对应的ID
func (s *SysConfigControl) GetId() interface{} {
return s.Id
}
// GetSetSysConfigReq 增、改使用的结构体
type GetSetSysConfigReq struct {
ConfigKey string `json:"configKey" comment:""`
ConfigValue string `json:"configValue" comment:""`
}
// Generate 结构体数据转化 从 SysConfigControl 至 system.SysConfig 对应的模型
func (s *GetSetSysConfigReq) Generate(model *models.SysConfig) {
model.ConfigValue = s.ConfigValue
}
type UpdateSetSysConfigReq map[string]string
// SysConfigByKeyReq 根据Key获取配置
type SysConfigByKeyReq struct {
ConfigKey string `uri:"configKey" search:"type:contains;column:config_key;table:sys_config"`
}
func (m *SysConfigByKeyReq) GetNeedSearch() interface{} {
return *m
}
type GetSysConfigByKEYForServiceResp struct {
ConfigKey string `json:"configKey" comment:""`
ConfigValue string `json:"configValue" comment:""`
}
type SysConfigGetReq struct {
Id int `uri:"id"`
}
func (s *SysConfigGetReq) GetId() interface{} {
return s.Id
}
type SysConfigDeleteReq struct {
Ids []int `json:"ids"`
common.ControlBy
}
func (s *SysConfigDeleteReq) GetId() interface{} {
return s.Ids
}

View File

@ -0,0 +1,110 @@
package dto
import (
"go-admin/app/admin/models"
common "go-admin/common/models"
)
// SysDeptGetPageReq 列表或者搜索使用结构体
type SysDeptGetPageReq struct {
DeptId int `form:"deptId" search:"type:exact;column:dept_id;table:sys_dept" comment:"id"` //id
ParentId int `form:"parentId" search:"type:exact;column:parent_id;table:sys_dept" comment:"上级部门"` //上级部门
DeptPath string `form:"deptPath" search:"type:exact;column:dept_path;table:sys_dept" comment:""` //路径
DeptName string `form:"deptName" search:"type:exact;column:dept_name;table:sys_dept" comment:"部门名称"` //部门名称
Sort int `form:"sort" search:"type:exact;column:sort;table:sys_dept" comment:"排序"` //排序
Leader string `form:"leader" search:"type:exact;column:leader;table:sys_dept" comment:"负责人"` //负责人
Phone string `form:"phone" search:"type:exact;column:phone;table:sys_dept" comment:"手机"` //手机
Email string `form:"email" search:"type:exact;column:email;table:sys_dept" comment:"邮箱"` //邮箱
Status string `form:"status" search:"type:exact;column:status;table:sys_dept" comment:"状态"` //状态
}
func (m *SysDeptGetPageReq) GetNeedSearch() interface{} {
return *m
}
type SysDeptInsertReq struct {
DeptId int `uri:"id" comment:"编码"` // 编码
ParentId int `json:"parentId" comment:"上级部门" vd:"?"` //上级部门
DeptPath string `json:"deptPath" comment:""` //路径
DeptName string `json:"deptName" comment:"部门名称" vd:"len($)>0"` //部门名称
Sort int `json:"sort" comment:"排序" vd:"?"` //排序
Leader string `json:"leader" comment:"负责人" vd:"@:len($)>0; msg:'leader不能为空'"` //负责人
Phone string `json:"phone" comment:"手机" vd:"?"` //手机
Email string `json:"email" comment:"邮箱" vd:"?"` //邮箱
Status int `json:"status" comment:"状态" vd:"$>0"` //状态
common.ControlBy
}
func (s *SysDeptInsertReq) Generate(model *models.SysDept) {
if s.DeptId != 0 {
model.DeptId = s.DeptId
}
model.DeptName = s.DeptName
model.ParentId = s.ParentId
model.DeptPath = s.DeptPath
model.Sort = s.Sort
model.Leader = s.Leader
model.Phone = s.Phone
model.Email = s.Email
model.Status = s.Status
}
// GetId 获取数据对应的ID
func (s *SysDeptInsertReq) GetId() interface{} {
return s.DeptId
}
type SysDeptUpdateReq struct {
DeptId int `uri:"id" comment:"编码"` // 编码
ParentId int `json:"parentId" comment:"上级部门" vd:"?"` //上级部门
DeptPath string `json:"deptPath" comment:""` //路径
DeptName string `json:"deptName" comment:"部门名称" vd:"len($)>0"` //部门名称
Sort int `json:"sort" comment:"排序" vd:"?"` //排序
Leader string `json:"leader" comment:"负责人" vd:"@:len($)>0; msg:'leader不能为空'"` //负责人
Phone string `json:"phone" comment:"手机" vd:"?"` //手机
Email string `json:"email" comment:"邮箱" vd:"?"` //邮箱
Status int `json:"status" comment:"状态" vd:"$>0"` //状态
common.ControlBy
}
// Generate 结构体数据转化 从 SysDeptControl 至 SysDept 对应的模型
func (s *SysDeptUpdateReq) Generate(model *models.SysDept) {
if s.DeptId != 0 {
model.DeptId = s.DeptId
}
model.DeptName = s.DeptName
model.ParentId = s.ParentId
model.DeptPath = s.DeptPath
model.Sort = s.Sort
model.Leader = s.Leader
model.Phone = s.Phone
model.Email = s.Email
model.Status = s.Status
}
// GetId 获取数据对应的ID
func (s *SysDeptUpdateReq) GetId() interface{} {
return s.DeptId
}
type SysDeptGetReq struct {
Id int `uri:"id"`
}
func (s *SysDeptGetReq) GetId() interface{} {
return s.Id
}
type SysDeptDeleteReq struct {
Ids []int `json:"ids"`
}
func (s *SysDeptDeleteReq) GetId() interface{} {
return s.Ids
}
type DeptLabel struct {
Id int `gorm:"-" json:"id"`
Label string `gorm:"-" json:"label"`
Children []DeptLabel `gorm:"-" json:"children"`
}

View File

@ -0,0 +1,122 @@
package dto
import (
"go-admin/app/admin/models"
"go-admin/common/dto"
common "go-admin/common/models"
)
type SysDictDataGetPageReq struct {
dto.Pagination `search:"-"`
Id int `form:"id" search:"type:exact;column:dict_code;table:sys_dict_data" comment:""`
DictLabel string `form:"dictLabel" search:"type:contains;column:dict_label;table:sys_dict_data" comment:""`
DictValue string `form:"dictValue" search:"type:contains;column:dict_value;table:sys_dict_data" comment:""`
DictType string `form:"dictType" search:"type:contains;column:dict_type;table:sys_dict_data" comment:""`
Status string `form:"status" search:"type:exact;column:status;table:sys_dict_data" comment:""`
}
func (m *SysDictDataGetPageReq) GetNeedSearch() interface{} {
return *m
}
type SysDictDataGetAllResp struct {
DictLabel string `json:"label"`
DictValue string `json:"value"`
}
type SysDictDataInsertReq struct {
Id int `json:"-" comment:""`
DictSort int `json:"dictSort" comment:""`
DictLabel string `json:"dictLabel" comment:""`
DictValue string `json:"dictValue" comment:""`
DictType string `json:"dictType" comment:""`
CssClass string `json:"cssClass" comment:""`
ListClass string `json:"listClass" comment:""`
IsDefault string `json:"isDefault" comment:""`
Status int `json:"status" comment:""`
Default string `json:"default" comment:""`
Remark string `json:"remark" comment:""`
common.ControlBy
}
func (s *SysDictDataInsertReq) Generate(model *models.SysDictData) {
model.DictCode = s.Id
model.DictSort = s.DictSort
model.DictLabel = s.DictLabel
model.DictValue = s.DictValue
model.DictType = s.DictType
model.CssClass = s.CssClass
model.ListClass = s.ListClass
model.IsDefault = s.IsDefault
model.Status = s.Status
model.Default = s.Default
model.Remark = s.Remark
}
func (s *SysDictDataInsertReq) GetId() interface{} {
return s.Id
}
type SysDictDataDetail struct {
Id int `json:"id"`
DictSort int `json:"dictSort"`
DictLabel string `json:"dictLabel"`
DictValue string `json:"dictValue"`
DictType string `json:"dictType"`
CssClass string `json:"cssClass"`
ListClass string `json:"listClass"`
IsDefault string `json:"isDefault"`
Status int `json:"status"`
Default string `json:"default"`
Remark string `json:"remark"`
}
type SysDictDataUpdateReq struct {
Id int `uri:"dictCode" comment:""`
DictSort int `json:"dictSort" comment:""`
DictLabel string `json:"dictLabel" comment:""`
DictValue string `json:"dictValue" comment:""`
DictType string `json:"dictType" comment:""`
CssClass string `json:"cssClass" comment:""`
ListClass string `json:"listClass" comment:""`
IsDefault string `json:"isDefault" comment:""`
Status int `json:"status" comment:""`
Default string `json:"default" comment:""`
Remark string `json:"remark" comment:""`
common.ControlBy
}
func (s *SysDictDataUpdateReq) Generate(model *models.SysDictData) {
model.DictCode = s.Id
model.DictSort = s.DictSort
model.DictLabel = s.DictLabel
model.DictValue = s.DictValue
model.DictType = s.DictType
model.CssClass = s.CssClass
model.ListClass = s.ListClass
model.IsDefault = s.IsDefault
model.Status = s.Status
model.Default = s.Default
model.Remark = s.Remark
}
func (s *SysDictDataUpdateReq) GetId() interface{} {
return s.Id
}
type SysDictDataGetReq struct {
Id int `uri:"dictCode"`
}
func (s *SysDictDataGetReq) GetId() interface{} {
return s.Id
}
type SysDictDataDeleteReq struct {
Ids []int `json:"ids"`
common.ControlBy `json:"-"`
}
func (s *SysDictDataDeleteReq) GetId() interface{} {
return s.Ids
}

View File

@ -0,0 +1,100 @@
package dto
import (
"go-admin/app/admin/models"
"go-admin/common/dto"
common "go-admin/common/models"
)
type SysDictTypeGetPageReq struct {
dto.Pagination `search:"-"`
DictId []int `form:"dictId" search:"type:in;column:dict_id;table:sys_dict_type"`
DictName string `form:"dictName" search:"type:icontains;column:dict_name;table:sys_dict_type"`
DictType string `form:"dictType" search:"type:icontains;column:dict_type;table:sys_dict_type"`
Status int `form:"status" search:"type:exact;column:status;table:sys_dict_type"`
}
type SysDictTypeOrder struct {
DictIdOrder string `search:"type:order;column:dict_id;table:sys_dict_type" form:"dictIdOrder"`
}
func (m *SysDictTypeGetPageReq) GetNeedSearch() interface{} {
return *m
}
type SysDictTypeInsertReq struct {
Id int `uri:"id"`
DictName string `json:"dictName"`
DictType string `json:"dictType"`
Status int `json:"status"`
Remark string `json:"remark"`
common.ControlBy
}
func (s *SysDictTypeInsertReq) Generate(model *models.SysDictType) {
if s.Id != 0 {
model.ID = s.Id
}
model.DictName = s.DictName
model.DictType = s.DictType
model.Status = s.Status
model.Remark = s.Remark
}
func (s *SysDictTypeInsertReq) GetId() interface{} {
return s.Id
}
// 缓存数据
type SysDictDetailResp struct {
Id int `json:"id"`
DictName string `json:"dictName"`
DictType string `json:"dictType"`
Status int `json:"status"`
Remark string `json:"remark"`
//datas
Datas []SysDictDataDetail `json:"datas"`
}
type SysDictTypeUpdateReq struct {
Id int `uri:"id"`
DictName string `json:"dictName"`
DictType string `json:"dictType"`
Status int `json:"status"`
Remark string `json:"remark"`
common.ControlBy
}
func (s *SysDictTypeUpdateReq) Generate(model *models.SysDictType) {
if s.Id != 0 {
model.ID = s.Id
}
model.DictName = s.DictName
model.DictType = s.DictType
model.Status = s.Status
model.Remark = s.Remark
}
func (s *SysDictTypeUpdateReq) GetId() interface{} {
return s.Id
}
type SysDictTypeGetReq struct {
Id int `uri:"id"`
}
func (s *SysDictTypeGetReq) GetId() interface{} {
return s.Id
}
type SysDictTypeDeleteReq struct {
Ids []int `json:"ids"`
common.ControlBy
}
func (s *SysDictTypeDeleteReq) GetId() interface{} {
return s.Ids
}

View File

@ -0,0 +1,57 @@
package dto
import (
"time"
"go-admin/common/dto"
)
type SysLoginLogGetPageReq struct {
dto.Pagination `search:"-"`
Username string `form:"username" search:"type:exact;column:username;table:sys_login_log" comment:"用户名"`
Status string `form:"status" search:"type:exact;column:status;table:sys_login_log" comment:"状态"`
Ipaddr string `form:"ipaddr" search:"type:exact;column:ipaddr;table:sys_login_log" comment:"ip地址"`
LoginLocation string `form:"loginLocation" search:"type:exact;column:login_location;table:sys_login_log" comment:"归属地"`
BeginTime string `form:"beginTime" search:"type:gte;column:ctime;table:sys_login_log" comment:"创建时间"`
EndTime string `form:"endTime" search:"type:lte;column:ctime;table:sys_login_log" comment:"创建时间"`
SysLoginLogOrder
}
type SysLoginLogOrder struct {
CreatedAtOrder string `search:"type:order;column:created_at;table:sys_login_log" form:"createdAtOrder"`
}
func (m *SysLoginLogGetPageReq) GetNeedSearch() interface{} {
return *m
}
type SysLoginLogControl struct {
ID int `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:"信息"`
}
type SysLoginLogGetReq struct {
Id int `uri:"id"`
}
func (s *SysLoginLogGetReq) GetId() interface{} {
return s.Id
}
// SysLoginLogDeleteReq 功能删除请求参数
type SysLoginLogDeleteReq struct {
Ids []int `json:"ids"`
}
func (s *SysLoginLogDeleteReq) GetId() interface{} {
return s.Ids
}

View File

@ -0,0 +1,159 @@
package dto
import (
"go-admin/app/admin/models"
common "go-admin/common/models"
"go-admin/common/dto"
)
// SysMenuGetPageReq 列表或者搜索使用结构体
type SysMenuGetPageReq struct {
dto.Pagination `search:"-"`
Title string `form:"title" search:"type:contains;column:title;table:sys_menu" comment:"菜单名称"` // 菜单名称
Visible int `form:"visible" search:"type:exact;column:visible;table:sys_menu" comment:"显示状态"` // 显示状态
}
func (m *SysMenuGetPageReq) GetNeedSearch() interface{} {
return *m
}
type SysMenuInsertReq struct {
MenuId int `uri:"id" comment:"编码"` // 编码
MenuName string `form:"menuName" comment:"菜单name"` //菜单name
Title string `form:"title" comment:"显示名称"` //显示名称
Icon string `form:"icon" comment:"图标"` //图标
Path string `form:"path" comment:"路径"` //路径
Paths string `form:"paths" comment:"id路径"` //id路径
MenuType string `form:"menuType" comment:"菜单类型"` //菜单类型
SysApi []models.SysApi `form:"sysApi"`
Apis []int `form:"apis"`
Action string `form:"action" comment:"请求方式"` //请求方式
Permission string `form:"permission" comment:"权限编码"` //权限编码
ParentId int `form:"parentId" comment:"上级菜单"` //上级菜单
NoCache bool `form:"noCache" comment:"是否缓存"` //是否缓存
Breadcrumb string `form:"breadcrumb" comment:"是否面包屑"` //是否面包屑
Component string `form:"component" comment:"组件"` //组件
Sort int `form:"sort" comment:"排序"` //排序
Visible string `form:"visible" comment:"是否显示"` //是否显示
IsFrame string `form:"isFrame" comment:"是否frame"` //是否frame
common.ControlBy
}
func (s *SysMenuInsertReq) Generate(model *models.SysMenu) {
if s.MenuId != 0 {
model.MenuId = s.MenuId
}
model.MenuName = s.MenuName
model.Title = s.Title
model.Icon = s.Icon
model.Path = s.Path
model.Paths = s.Paths
model.MenuType = s.MenuType
model.Action = s.Action
model.SysApi = s.SysApi
model.Permission = s.Permission
model.ParentId = s.ParentId
model.NoCache = s.NoCache
model.Breadcrumb = s.Breadcrumb
model.Component = s.Component
model.Sort = s.Sort
model.Visible = s.Visible
model.IsFrame = s.IsFrame
if s.CreateBy != 0 {
model.CreateBy = s.CreateBy
}
if s.UpdateBy != 0 {
model.UpdateBy = s.UpdateBy
}
}
func (s *SysMenuInsertReq) GetId() interface{} {
return s.MenuId
}
type SysMenuUpdateReq struct {
MenuId int `uri:"id" comment:"编码"` // 编码
MenuName string `form:"menuName" comment:"菜单name"` //菜单name
Title string `form:"title" comment:"显示名称"` //显示名称
Icon string `form:"icon" comment:"图标"` //图标
Path string `form:"path" comment:"路径"` //路径
Paths string `form:"paths" comment:"id路径"` //id路径
MenuType string `form:"menuType" comment:"菜单类型"` //菜单类型
SysApi []models.SysApi `form:"sysApi"`
Apis []int `form:"apis"`
Action string `form:"action" comment:"请求方式"` //请求方式
Permission string `form:"permission" comment:"权限编码"` //权限编码
ParentId int `form:"parentId" comment:"上级菜单"` //上级菜单
NoCache bool `form:"noCache" comment:"是否缓存"` //是否缓存
Breadcrumb string `form:"breadcrumb" comment:"是否面包屑"` //是否面包屑
Component string `form:"component" comment:"组件"` //组件
Sort int `form:"sort" comment:"排序"` //排序
Visible string `form:"visible" comment:"是否显示"` //是否显示
IsFrame string `form:"isFrame" comment:"是否frame"` //是否frame
common.ControlBy
}
func (s *SysMenuUpdateReq) Generate(model *models.SysMenu) {
if s.MenuId != 0 {
model.MenuId = s.MenuId
}
model.MenuName = s.MenuName
model.Title = s.Title
model.Icon = s.Icon
model.Path = s.Path
model.Paths = s.Paths
model.MenuType = s.MenuType
model.Action = s.Action
model.SysApi = s.SysApi
model.Permission = s.Permission
model.ParentId = s.ParentId
model.NoCache = s.NoCache
model.Breadcrumb = s.Breadcrumb
model.Component = s.Component
model.Sort = s.Sort
model.Visible = s.Visible
model.IsFrame = s.IsFrame
if s.CreateBy != 0 {
model.CreateBy = s.CreateBy
}
if s.UpdateBy != 0 {
model.UpdateBy = s.UpdateBy
}
}
func (s *SysMenuUpdateReq) GetId() interface{} {
return s.MenuId
}
type SysMenuGetReq struct {
Id int `uri:"id"`
}
func (s *SysMenuGetReq) GetId() interface{} {
return s.Id
}
type SysMenuDeleteReq struct {
Ids []int `json:"ids"`
common.ControlBy
}
func (s *SysMenuDeleteReq) GetId() interface{} {
return s.Ids
}
type MenuLabel struct {
Id int `json:"id,omitempty" gorm:"-"`
Label string `json:"label,omitempty" gorm:"-"`
Children []MenuLabel `json:"children,omitempty" gorm:"-"`
}
type MenuRole struct {
models.SysMenu
IsSelect bool `json:"is_select" gorm:"-"`
}
type SelectRole struct {
RoleId int `uri:"roleId"`
}

View File

@ -0,0 +1,102 @@
package dto
import (
"time"
"go-admin/app/admin/models"
"go-admin/common/dto"
common "go-admin/common/models"
)
const (
OperaStatusEnabel = "1" // 状态-正常
OperaStatusDisable = "2" // 状态-关闭
)
type SysOperaLogGetPageReq struct {
dto.Pagination `search:"-"`
Title string `form:"title" search:"type:contains;column:title;table:sys_opera_log" comment:"操作模块"`
Method string `form:"method" search:"type:contains;column:method;table:sys_opera_log" comment:"函数"`
RequestMethod string `form:"requestMethod" search:"type:contains;column:request_method;table:sys_opera_log" comment:"请求方式: GET POST PUT DELETE"`
OperUrl string `form:"operUrl" search:"type:contains;column:oper_url;table:sys_opera_log" comment:"访问地址"`
OperIp string `form:"operIp" search:"type:exact;column:oper_ip;table:sys_opera_log" comment:"客户端ip"`
Status int `form:"status" search:"type:exact;column:status;table:sys_opera_log" comment:"状态 1:正常 2:关闭"`
BeginTime string `form:"beginTime" search:"type:gte;column:created_at;table:sys_opera_log" comment:"创建时间"`
EndTime string `form:"endTime" search:"type:lte;column:created_at;table:sys_opera_log" comment:"更新时间"`
SysOperaLogOrder
}
type SysOperaLogOrder struct {
CreatedAtOrder string `search:"type:order;column:created_at;table:sys_opera_log" form:"createdAtOrder"`
}
func (m *SysOperaLogGetPageReq) GetNeedSearch() interface{} {
return *m
}
type SysOperaLogControl struct {
ID int `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) Generate() (*models.SysOperaLog, error) {
return &models.SysOperaLog{
Model: common.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 SysOperaLogGetReq struct {
Id int `uri:"id"`
}
func (s *SysOperaLogGetReq) GetId() interface{} {
return s.Id
}
// SysOperaLogDeleteReq 功能删除请求参数
type SysOperaLogDeleteReq struct {
Ids []int `json:"ids"`
}
func (s *SysOperaLogDeleteReq) GetId() interface{} {
return s.Ids
}

View File

@ -0,0 +1,111 @@
package dto
import (
"go-admin/app/admin/models"
common "go-admin/common/models"
"go-admin/common/dto"
)
// SysPostPageReq 列表或者搜索使用结构体
type SysPostPageReq struct {
dto.Pagination `search:"-"`
PostId int `form:"postId" search:"type:exact;column:post_id;table:sys_post" comment:"id"` // id
PostName string `form:"postName" search:"type:contains;column:post_name;table:sys_post" comment:"名称"` // 名称
PostCode string `form:"postCode" search:"type:contains;column:post_code;table:sys_post" comment:"编码"` // 编码
Sort int `form:"sort" search:"type:exact;column:sort;table:sys_post" comment:"排序"` // 排序
Status int `form:"status" search:"type:exact;column:status;table:sys_post" comment:"状态"` // 状态
Remark string `form:"remark" search:"type:exact;column:remark;table:sys_post" comment:"备注"` // 备注
}
func (m *SysPostPageReq) GetNeedSearch() interface{} {
return *m
}
// SysPostInsertReq 增使用的结构体
type SysPostInsertReq struct {
PostId int `uri:"id" comment:"id"`
PostName string `form:"postName" comment:"名称"`
PostCode string `form:"postCode" comment:"编码"`
Sort int `form:"sort" comment:"排序"`
Status int `form:"status" comment:"状态"`
Remark string `form:"remark" comment:"备注"`
common.ControlBy
}
func (s *SysPostInsertReq) Generate(model *models.SysPost) {
model.PostName = s.PostName
model.PostCode = s.PostCode
model.Sort = s.Sort
model.Status = s.Status
model.Remark = s.Remark
if s.ControlBy.UpdateBy != 0 {
model.UpdateBy = s.UpdateBy
}
if s.ControlBy.CreateBy != 0 {
model.CreateBy = s.CreateBy
}
}
// GetId 获取数据对应的ID
func (s *SysPostInsertReq) GetId() interface{} {
return s.PostId
}
// SysPostUpdateReq 改使用的结构体
type SysPostUpdateReq struct {
PostId int `uri:"id" comment:"id"`
PostName string `form:"postName" comment:"名称"`
PostCode string `form:"postCode" comment:"编码"`
Sort int `form:"sort" comment:"排序"`
Status int `form:"status" comment:"状态"`
Remark string `form:"remark" comment:"备注"`
common.ControlBy
}
func (s *SysPostUpdateReq) Generate(model *models.SysPost) {
model.PostId = s.PostId
model.PostName = s.PostName
model.PostCode = s.PostCode
model.Sort = s.Sort
model.Status = s.Status
model.Remark = s.Remark
if s.ControlBy.UpdateBy != 0 {
model.UpdateBy = s.UpdateBy
}
if s.ControlBy.CreateBy != 0 {
model.CreateBy = s.CreateBy
}
}
func (s *SysPostUpdateReq) GetId() interface{} {
return s.PostId
}
// SysPostGetReq 获取单个的结构体
type SysPostGetReq struct {
Id int `uri:"id"`
}
func (s *SysPostGetReq) GetId() interface{} {
return s.Id
}
// SysPostDeleteReq 删除的结构体
type SysPostDeleteReq struct {
Ids []int `json:"ids"`
common.ControlBy
}
func (s *SysPostDeleteReq) Generate(model *models.SysPost) {
if s.ControlBy.UpdateBy != 0 {
model.UpdateBy = s.UpdateBy
}
if s.ControlBy.CreateBy != 0 {
model.CreateBy = s.CreateBy
}
}
func (s *SysPostDeleteReq) GetId() interface{} {
return s.Ids
}

View File

@ -0,0 +1,164 @@
package dto
import (
"go-admin/app/admin/models"
common "go-admin/common/models"
"go-admin/common/dto"
)
type SysRoleGetPageReq struct {
dto.Pagination `search:"-"`
RoleId int `form:"roleId" search:"type:exact;column:role_id;table:sys_role" comment:"角色编码"` // 角色编码
RoleName string `form:"roleName" search:"type:exact;column:role_name;table:sys_role" comment:"角色名称"` // 角色名称
Status string `form:"status" search:"type:exact;column:status;table:sys_role" comment:"状态"` // 状态
RoleKey string `form:"roleKey" search:"type:exact;column:role_key;table:sys_role" comment:"角色代码"` // 角色代码
RoleSort int `form:"roleSort" search:"type:exact;column:role_sort;table:sys_role" comment:"角色排序"` // 角色排序
Flag string `form:"flag" search:"type:exact;column:flag;table:sys_role" comment:"标记"` // 标记
Remark string `form:"remark" search:"type:exact;column:remark;table:sys_role" comment:"备注"` // 备注
Admin bool `form:"admin" search:"type:exact;column:admin;table:sys_role" comment:"是否管理员"`
DataScope string `form:"dataScope" search:"type:exact;column:data_scope;table:sys_role" comment:"是否管理员"`
}
type SysRoleOrder struct {
RoleIdOrder string `search:"type:order;column:role_id;table:sys_role" form:"roleIdOrder"`
RoleNameOrder string `search:"type:order;column:role_name;table:sys_role" form:"roleNameOrder"`
RoleSortOrder string `search:"type:order;column:role_sort;table:sys_role" form:"usernameOrder"`
StatusOrder string `search:"type:order;column:status;table:sys_role" form:"statusOrder"`
CreatedAtOrder string `search:"type:order;column:created_at;table:sys_role" form:"createdAtOrder"`
}
func (m *SysRoleGetPageReq) GetNeedSearch() interface{} {
return *m
}
type SysRoleInsertReq struct {
RoleId int `uri:"id" comment:"角色编码"` // 角色编码
RoleName string `form:"roleName" comment:"角色名称"` // 角色名称
Status string `form:"status" comment:"状态"` // 状态 1禁用 2正常
RoleKey string `form:"roleKey" comment:"角色代码"` // 角色代码
RoleSort int `form:"roleSort" comment:"角色排序"` // 角色排序
Flag string `form:"flag" comment:"标记"` // 标记
Remark string `form:"remark" comment:"备注"` // 备注
Admin bool `form:"admin" comment:"是否管理员"`
DataScope string `form:"dataScope"`
SysMenu []models.SysMenu `form:"sysMenu"`
MenuIds []int `form:"menuIds"`
SysDept []models.SysDept `form:"sysDept"`
DeptIds []int `form:"deptIds"`
common.ControlBy
}
func (s *SysRoleInsertReq) Generate(model *models.SysRole) {
if s.RoleId != 0 {
model.RoleId = s.RoleId
}
model.RoleName = s.RoleName
model.Status = s.Status
model.RoleKey = s.RoleKey
model.RoleSort = s.RoleSort
model.Flag = s.Flag
model.Remark = s.Remark
model.Admin = s.Admin
model.DataScope = s.DataScope
model.SysMenu = &s.SysMenu
model.SysDept = s.SysDept
}
func (s *SysRoleInsertReq) GetId() interface{} {
return s.RoleId
}
type SysRoleUpdateReq struct {
RoleId int `uri:"id" comment:"角色编码"` // 角色编码
RoleName string `form:"roleName" comment:"角色名称"` // 角色名称
Status string `form:"status" comment:"状态"` // 状态
RoleKey string `form:"roleKey" comment:"角色代码"` // 角色代码
RoleSort int `form:"roleSort" comment:"角色排序"` // 角色排序
Flag string `form:"flag" comment:"标记"` // 标记
Remark string `form:"remark" comment:"备注"` // 备注
Admin bool `form:"admin" comment:"是否管理员"`
DataScope string `form:"dataScope"`
SysMenu []models.SysMenu `form:"sysMenu"`
MenuIds []int `form:"menuIds"`
SysDept []models.SysDept `form:"sysDept"`
DeptIds []int `form:"deptIds"`
common.ControlBy
}
func (s *SysRoleUpdateReq) Generate(model *models.SysRole) {
if s.RoleId != 0 {
model.RoleId = s.RoleId
}
model.RoleName = s.RoleName
model.Status = s.Status
model.RoleKey = s.RoleKey
model.RoleSort = s.RoleSort
model.Flag = s.Flag
model.Remark = s.Remark
model.Admin = s.Admin
model.DataScope = s.DataScope
model.SysMenu = &s.SysMenu
model.SysDept = s.SysDept
}
func (s *SysRoleUpdateReq) GetId() interface{} {
return s.RoleId
}
type UpdateStatusReq struct {
RoleId int `form:"roleId" comment:"角色编码"` // 角色编码
Status string `form:"status" comment:"状态"` // 状态
common.ControlBy
}
func (s *UpdateStatusReq) Generate(model *models.SysRole) {
if s.RoleId != 0 {
model.RoleId = s.RoleId
}
model.Status = s.Status
}
func (s *UpdateStatusReq) GetId() interface{} {
return s.RoleId
}
type SysRoleByName struct {
RoleName string `form:"role"` // 角色编码
}
type SysRoleGetReq struct {
Id int `uri:"id"`
}
func (s *SysRoleGetReq) GetId() interface{} {
return s.Id
}
type SysRoleDeleteReq struct {
Ids []int `json:"ids"`
}
func (s *SysRoleDeleteReq) GetId() interface{} {
return s.Ids
}
// RoleDataScopeReq 角色数据权限修改
type RoleDataScopeReq struct {
RoleId int `json:"roleId" binding:"required"`
DataScope string `json:"dataScope" binding:"required"`
DeptIds []int `json:"deptIds"`
}
func (s *RoleDataScopeReq) Generate(model *models.SysRole) {
if s.RoleId != 0 {
model.RoleId = s.RoleId
}
model.DataScope = s.DataScope
model.DeptIds = s.DeptIds
}
type DeptIdList struct {
DeptId int `json:"DeptId"`
}

View File

@ -0,0 +1,189 @@
package dto
import (
"go-admin/app/admin/models"
"go-admin/common/dto"
common "go-admin/common/models"
)
type SysUserGetPageReq struct {
dto.Pagination `search:"-"`
UserId int `form:"userId" search:"type:exact;column:user_id;table:sys_user" comment:"用户ID"`
Username string `form:"username" search:"type:contains;column:username;table:sys_user" comment:"用户名"`
NickName string `form:"nickName" search:"type:contains;column:nick_name;table:sys_user" comment:"昵称"`
Phone string `form:"phone" search:"type:contains;column:phone;table:sys_user" comment:"手机号"`
RoleId string `form:"roleId" search:"type:exact;column:role_id;table:sys_user" comment:"角色ID"`
Sex string `form:"sex" search:"type:exact;column:sex;table:sys_user" comment:"性别"`
Email string `form:"email" search:"type:contains;column:email;table:sys_user" comment:"邮箱"`
PostId string `form:"postId" search:"type:exact;column:post_id;table:sys_user" comment:"岗位"`
Status string `form:"status" search:"type:exact;column:status;table:sys_user" comment:"状态"`
DeptJoin `search:"type:left;on:dept_id:dept_id;table:sys_user;join:sys_dept"`
SysUserOrder
}
type SysUserOrder struct {
UserIdOrder string `search:"type:order;column:user_id;table:sys_user" form:"userIdOrder"`
UsernameOrder string `search:"type:order;column:username;table:sys_user" form:"usernameOrder"`
StatusOrder string `search:"type:order;column:status;table:sys_user" form:"statusOrder"`
CreatedAtOrder string `search:"type:order;column:created_at;table:sys_user" form:"createdAtOrder"`
}
type DeptJoin struct {
DeptId string `search:"type:contains;column:dept_path;table:sys_dept" form:"deptId"`
}
func (m *SysUserGetPageReq) GetNeedSearch() interface{} {
return *m
}
type ResetSysUserPwdReq struct {
UserId int `json:"userId" comment:"用户ID" vd:"$>0"` // 用户ID
Password string `json:"password" comment:"密码" vd:"len($)>0"`
common.ControlBy
}
func (s *ResetSysUserPwdReq) GetId() interface{} {
return s.UserId
}
func (s *ResetSysUserPwdReq) Generate(model *models.SysUser) {
if s.UserId != 0 {
model.UserId = s.UserId
}
model.Password = s.Password
}
type UpdateSysUserAvatarReq struct {
UserId int `json:"userId" comment:"用户ID" vd:"len($)>0"` // 用户ID
Avatar string `json:"avatar" comment:"头像" vd:"len($)>0"`
common.ControlBy
}
func (s *UpdateSysUserAvatarReq) GetId() interface{} {
return s.UserId
}
func (s *UpdateSysUserAvatarReq) Generate(model *models.SysUser) {
if s.UserId != 0 {
model.UserId = s.UserId
}
model.Avatar = s.Avatar
}
type UpdateSysUserStatusReq struct {
UserId int `json:"userId" comment:"用户ID" vd:"$>0"` // 用户ID
Status string `json:"status" comment:"状态" vd:"len($)>0"`
common.ControlBy
}
func (s *UpdateSysUserStatusReq) GetId() interface{} {
return s.UserId
}
func (s *UpdateSysUserStatusReq) Generate(model *models.SysUser) {
if s.UserId != 0 {
model.UserId = s.UserId
}
model.Status = s.Status
}
type SysUserInsertReq struct {
UserId int `json:"userId" comment:"用户ID"` // 用户ID
Username string `json:"username" comment:"用户名" vd:"len($)>0"`
Password string `json:"password" comment:"密码"`
NickName string `json:"nickName" comment:"昵称" vd:"len($)>0"`
Phone string `json:"phone" comment:"手机号" `
RoleId int `json:"roleId" comment:"角色ID" vd:"$>0"`
Avatar string `json:"avatar" comment:"头像"`
Sex string `json:"sex" comment:"性别"`
Email string `json:"email" comment:"邮箱" ` //vd:"len($)>0,email"
DeptId int `json:"deptId" comment:"部门" vd:"$>0"`
PostId int `json:"postId" comment:"岗位"`
Remark string `json:"remark" comment:"备注"`
Status string `json:"status" comment:"状态" vd:"len($)>0" default:"1"`
common.ControlBy
}
func (s *SysUserInsertReq) Generate(model *models.SysUser) {
if s.UserId != 0 {
model.UserId = s.UserId
}
model.Username = s.Username
model.Password = s.Password
model.NickName = s.NickName
model.Phone = s.Phone
model.RoleId = s.RoleId
model.Avatar = s.Avatar
model.Sex = s.Sex
model.Email = s.Email
model.DeptId = s.DeptId
model.PostId = s.PostId
model.Remark = s.Remark
model.Status = s.Status
model.CreateBy = s.CreateBy
}
func (s *SysUserInsertReq) GetId() interface{} {
return s.UserId
}
type SysUserUpdateReq struct {
UserId int `json:"userId" comment:"用户ID"` // 用户ID
Username string `json:"username" comment:"用户名" vd:"len($)>0"`
NickName string `json:"nickName" comment:"昵称" vd:"len($)>0"`
Phone string `json:"phone" comment:"手机号" vd:"len($)>0"`
RoleId int `json:"roleId" comment:"角色ID" vd:"$>0"`
Avatar string `json:"avatar" comment:"头像"`
Sex string `json:"sex" comment:"性别"`
Email string `json:"email" comment:"邮箱" vd:"len($)>0,email"`
DeptId int `json:"deptId" comment:"部门" vd:"$>0"`
PostId int `json:"postId" comment:"岗位"`
Remark string `json:"remark" comment:"备注"`
Status string `json:"status" comment:"状态" default:"1"`
common.ControlBy
}
func (s *SysUserUpdateReq) Generate(model *models.SysUser) {
if s.UserId != 0 {
model.UserId = s.UserId
}
model.Username = s.Username
model.NickName = s.NickName
model.Phone = s.Phone
model.RoleId = s.RoleId
model.Avatar = s.Avatar
model.Sex = s.Sex
model.Email = s.Email
model.DeptId = s.DeptId
model.PostId = s.PostId
model.Remark = s.Remark
model.Status = s.Status
}
func (s *SysUserUpdateReq) GetId() interface{} {
return s.UserId
}
type SysUserById struct {
dto.ObjectById
common.ControlBy
}
func (s *SysUserById) GetId() interface{} {
if len(s.Ids) > 0 {
s.Ids = append(s.Ids, s.Id)
return s.Ids
}
return s.Id
}
func (s *SysUserById) GenerateM() (common.ActiveRecord, error) {
return &models.SysUser{}, nil
}
// PassWord 密码
type PassWord struct {
NewPassword string `json:"newPassword" vd:"len($)>0"`
OldPassword string `json:"oldPassword" vd:"len($)>0"`
}

View File

@ -0,0 +1,193 @@
package dto
import (
"errors"
"go-admin/app/admin/models"
"go-admin/common/dto"
common "go-admin/common/models"
"time"
)
type TmMemberGetPageReq struct {
dto.Pagination `search:"-"`
NickName string `form:"nickName" search:"type:contains;column:nick_name;table:tm_member" comment:"用户昵称"`
Mobile string `form:"mobile" search:"type:contains;column:mobile;table:tm_member" comment:"手机号"`
Email string `form:"email" search:"type:contains;column:email;table:tm_member" comment:"邮箱号"`
Status string `form:"status" search:"type:exact;column:status;table:tm_member" comment:"状态 1-启用 2-禁用"`
TmMemberOrder
}
type TmMemberOrder struct {
Id string `form:"idOrder" search:"type:order;column:id;table:tm_member"`
NickName string `form:"nickNameOrder" search:"type:order;column:nick_name;table:tm_member"`
AreaCode string `form:"areaCodeOrder" search:"type:order;column:area_code;table:tm_member"`
Mobile string `form:"mobileOrder" search:"type:order;column:mobile;table:tm_member"`
Email string `form:"emailOrder" search:"type:order;column:email;table:tm_member"`
Password string `form:"passwordOrder" search:"type:order;column:password;table:tm_member"`
Status string `form:"statusOrder" search:"type:order;column:status;table:tm_member"`
ApiKey string `form:"apiKeyOrder" search:"type:order;column:api_key;table:tm_member"`
CreatedAt string `form:"createdAtOrder" search:"type:order;column:created_at;table:tm_member"`
UpdatedAt string `form:"updatedAtOrder" search:"type:order;column:updated_at;table:tm_member"`
DeletedAt string `form:"deletedAtOrder" search:"type:order;column:deleted_at;table:tm_member"`
CreateBy string `form:"createByOrder" search:"type:order;column:create_by;table:tm_member"`
UpdateBy string `form:"updateByOrder" search:"type:order;column:update_by;table:tm_member"`
}
func (m *TmMemberGetPageReq) GetNeedSearch() interface{} {
return *m
}
type TmMemberInsertReq struct {
Id int `json:"-" comment:"主键Id"` // 主键Id
UserId int `json:"userId" comment:"用户ID"`
NickName string `json:"nickName" comment:"用户昵称"`
AreaCode string `json:"areaCode" comment:"区号"`
Mobile string `json:"mobile" comment:"手机号"`
Email string `json:"email" comment:"邮箱号"`
Password string `json:"password" comment:"密码"`
Status int `json:"status" comment:"状态 1-启用 2-禁用"`
ApiKey string `json:"apiKey" comment:"apiKey"`
common.ControlBy
}
func (s *TmMemberInsertReq) Generate(model *models.TmMember) {
if s.Id == 0 {
model.Model = common.Model{Id: s.Id}
}
model.NickName = s.NickName
model.UserId = s.UserId
model.AreaCode = s.AreaCode
model.Mobile = s.Mobile
model.Email = s.Email
model.Password = s.Password
model.Status = s.Status
model.ApiKey = s.ApiKey
model.CreateBy = s.CreateBy // 添加这而,需要记录是被谁创建的
}
func (s *TmMemberInsertReq) GetId() interface{} {
return s.Id
}
type TmMemberUpdateReq struct {
Id int `uri:"id" comment:"主键Id"` // 主键Id
UserId int `json:"userId" comment:"用户ID"`
NickName string `json:"nickName" comment:"用户昵称"`
AreaCode string `json:"areaCode" comment:"区号"`
Mobile string `json:"mobile" comment:"手机号"`
Email string `json:"email" comment:"邮箱号"`
Password string `json:"password" comment:"密码"`
Status int `json:"status" comment:"状态 1-启用 2-禁用"`
ApiKey string `json:"apiKey" comment:"apiKey"`
common.ControlBy
}
func (s *TmMemberUpdateReq) Generate(model *models.TmMember) {
if s.Id == 0 {
model.Model = common.Model{Id: s.Id}
}
model.UserId = s.UserId
model.NickName = s.NickName
model.AreaCode = s.AreaCode
model.Mobile = s.Mobile
model.Email = s.Email
model.Password = s.Password
model.Status = s.Status
model.ApiKey = s.ApiKey
model.UpdateBy = s.UpdateBy // 添加这而,需要记录是被谁更新的
}
func (s *TmMemberUpdateReq) GetId() interface{} {
return s.Id
}
// TmMemberGetReq 功能获取请求参数
type TmMemberGetReq struct {
Id int `uri:"id"`
}
func (s *TmMemberGetReq) GetId() interface{} {
return s.Id
}
// TmMemberDeleteReq 功能删除请求参数
type TmMemberDeleteReq struct {
Ids []int `json:"ids"`
}
func (s *TmMemberDeleteReq) GetId() interface{} {
return s.Ids
}
type TmMemberResp struct {
Id int `json:"id"`
UserId int `json:"userId"`
NickName string `json:"nickName"`
UserStatus int `json:"userStatus"`
Status int `json:"status"`
ApiKey string `json:"apiKey"`
TotalChars int `json:"totalChars"`
RemainChars int `json:"remainChars"`
CreatedAt time.Time `json:"createdAt"`
Platforms []TmMemberPlatformResp `json:"platforms"`
}
type TmMemberPlatformResp struct {
Name string `json:"name"`
RemainChars int `json:"remainChars"`
}
type TmMemberRechargeReq struct {
Id int `uri:"id" comment:"主键Id"` // 主键Id
PlatformId int `json:"platformId" comment:"平台ID"`
PlatformCode string `json:"platformCode" comment:"平台编码"`
TotalChars int `json:"totalChars" comment:"总字数(万)"`
}
func (e *TmMemberRechargeReq) Validate() error {
if e.Id <= 0 {
return errors.New("id不能为空")
}
if e.TotalChars <= 0 {
return errors.New("充值字符数不能小于等于0")
}
return nil
}
type TmMemberChangeStatusReq struct {
Id int `uri:"id" comment:"主键Id"` // 主键Id
Status int `json:"status" comment:"状态 1-启用 2-禁用"`
}
func (e *TmMemberChangeStatusReq) Validate() error {
if e.Id <= 0 {
return errors.New("id不能为空")
}
if e.Status < 1 || e.Status > 2 {
return errors.New("状态超出范围")
}
return nil
}
type TmMemberPlatformFrontedResp struct {
Id int `json:"id"`
Name string `json:"name"`
RemainChars int `json:"remainChars"`
TotalChars int `json:"totalChars"`
Price int `json:"price"`
ApiKey string `json:"apiKey"`
}
type TmMemberSyncInsertReq struct {
UserId int `json:"userId" comment:"用户ID"`
NickName string `json:"nickName" comment:"用户昵称"`
PlatformId int `json:"platformId" comment:"平台ID"`
PlatformKey string `json:"platformKey" comment:"平台Key"`
Mobile string `json:"mobile" comment:"手机号"`
Email string `json:"email" comment:"邮箱号"`
CreateBy int `json:"createBy" comment:"创建者"`
}

View File

@ -0,0 +1,101 @@
package dto
import (
"go-admin/app/admin/models"
"go-admin/common/dto"
common "go-admin/common/models"
"time"
)
type TmMemberDailyUsageGetPageReq struct {
dto.Pagination `search:"-"`
TmMemberDailyUsageOrder
}
type TmMemberDailyUsageOrder struct {
Id string `form:"idOrder" search:"type:order;column:id;table:tm_member_daily_usage"`
MemberId string `form:"memberIdOrder" search:"type:order;column:member_id;table:tm_member_daily_usage"`
PlatformId string `form:"platformIdOrder" search:"type:order;column:platform_id;table:tm_member_daily_usage"`
UseChars string `form:"useCharsOrder" search:"type:order;column:use_chars;table:tm_member_daily_usage"`
RemainChars string `form:"remainCharsOrder" search:"type:order;column:remain_chars;table:tm_member_daily_usage"`
Date string `form:"dateOrder" search:"type:order;column:date;table:tm_member_daily_usage"`
CreatedAt string `form:"createdAtOrder" search:"type:order;column:created_at;table:tm_member_daily_usage"`
UpdatedAt string `form:"updatedAtOrder" search:"type:order;column:updated_at;table:tm_member_daily_usage"`
DeletedAt string `form:"deletedAtOrder" search:"type:order;column:deleted_at;table:tm_member_daily_usage"`
CreateBy string `form:"createByOrder" search:"type:order;column:create_by;table:tm_member_daily_usage"`
UpdateBy string `form:"updateByOrder" search:"type:order;column:update_by;table:tm_member_daily_usage"`
}
func (m *TmMemberDailyUsageGetPageReq) GetNeedSearch() interface{} {
return *m
}
type TmMemberDailyUsageInsertReq struct {
Id int `json:"-" comment:"主键"` // 主键
MemberId int `json:"memberId" comment:"用户id"`
PlatformId int `json:"platformId" comment:"平台id"`
UseChars int `json:"useChars" comment:"使用字符数"`
RemainChars int `json:"remainChars" comment:"剩余字符数"`
Date time.Time `json:"date" comment:"日期"`
common.ControlBy
}
func (s *TmMemberDailyUsageInsertReq) Generate(model *models.TmMemberDailyUsage) {
if s.Id == 0 {
model.Model = common.Model{Id: s.Id}
}
model.MemberId = s.MemberId
model.PlatformId = s.PlatformId
model.UseChars = s.UseChars
model.RemainChars = s.RemainChars
model.Date = s.Date
model.CreateBy = s.CreateBy // 添加这而,需要记录是被谁创建的
}
func (s *TmMemberDailyUsageInsertReq) GetId() interface{} {
return s.Id
}
type TmMemberDailyUsageUpdateReq struct {
Id int `uri:"id" comment:"主键"` // 主键
MemberId int `json:"memberId" comment:"用户id"`
PlatformId int `json:"platformId" comment:"平台id"`
UseChars int `json:"useChars" comment:"使用字符数"`
RemainChars int `json:"remainChars" comment:"剩余字符数"`
Date time.Time `json:"date" comment:"日期"`
common.ControlBy
}
func (s *TmMemberDailyUsageUpdateReq) Generate(model *models.TmMemberDailyUsage) {
if s.Id == 0 {
model.Model = common.Model{Id: s.Id}
}
model.MemberId = s.MemberId
model.PlatformId = s.PlatformId
model.UseChars = s.UseChars
model.RemainChars = s.RemainChars
model.Date = s.Date
model.UpdateBy = s.UpdateBy // 添加这而,需要记录是被谁更新的
}
func (s *TmMemberDailyUsageUpdateReq) GetId() interface{} {
return s.Id
}
// TmMemberDailyUsageGetReq 功能获取请求参数
type TmMemberDailyUsageGetReq struct {
Id int `uri:"id"`
}
func (s *TmMemberDailyUsageGetReq) GetId() interface{} {
return s.Id
}
// TmMemberDailyUsageDeleteReq 功能删除请求参数
type TmMemberDailyUsageDeleteReq struct {
Ids []int `json:"ids"`
}
func (s *TmMemberDailyUsageDeleteReq) GetId() interface{} {
return s.Ids
}

View File

@ -0,0 +1,111 @@
package dto
import (
"go-admin/app/admin/models"
"go-admin/common/dto"
common "go-admin/common/models"
)
type TmMemberPlatformGetPageReq struct {
dto.Pagination `search:"-"`
TmMemberPlatformOrder
}
type TmMemberPlatformOrder struct {
Id string `form:"idOrder" search:"type:order;column:id;table:tm_member_platform"`
MemberId string `form:"memberIdOrder" search:"type:order;column:member_id;table:tm_member_platform"`
RemainingCharacter string `form:"remainingCharacterOrder" search:"type:order;column:remaining_character;table:tm_member_platform"`
TotalCharacter string `form:"totalCharacterOrder" search:"type:order;column:total_character;table:tm_member_platform"`
PlatformId string `form:"platformIdOrder" search:"type:order;column:platform_id;table:tm_member_platform"`
Status string `form:"statusOrder" search:"type:order;column:status;table:tm_member_platform"`
CreatedAt string `form:"createdAtOrder" search:"type:order;column:created_at;table:tm_member_platform"`
UpdatedAt string `form:"updatedAtOrder" search:"type:order;column:updated_at;table:tm_member_platform"`
DeletedAt string `form:"deletedAtOrder" search:"type:order;column:deleted_at;table:tm_member_platform"`
CreateBy string `form:"createByOrder" search:"type:order;column:create_by;table:tm_member_platform"`
UpdateBy string `form:"updateByOrder" search:"type:order;column:update_by;table:tm_member_platform"`
}
func (m *TmMemberPlatformGetPageReq) GetNeedSearch() interface{} {
return *m
}
type TmMemberPlatformInsertReq struct {
Id int `json:"-" comment:"主键id"` // 主键id
MemberId int `json:"memberId" comment:"用户id"`
RemainingCharacter int `json:"remainingCharacter" comment:"剩余字符数"`
TotalCharacter int `json:"totalCharacter" comment:"总字符数"`
PlatformId int `json:"platformId" comment:"平台id"`
Status int `json:"status" comment:"状态 1-启用 2-禁用"`
common.ControlBy
}
func (s *TmMemberPlatformInsertReq) Generate(model *models.TmMemberPlatform) {
if s.Id == 0 {
model.Model = common.Model{Id: s.Id}
}
model.MemberId = s.MemberId
model.RemainingCharacter = s.RemainingCharacter
model.TotalCharacter = s.TotalCharacter
model.PlatformId = s.PlatformId
model.Status = s.Status
model.CreateBy = s.CreateBy // 添加这而,需要记录是被谁创建的
}
func (s *TmMemberPlatformInsertReq) GetId() interface{} {
return s.Id
}
type TmMemberPlatformUpdateReq struct {
Id int `uri:"id" comment:"主键id"` // 主键id
MemberId int `json:"memberId" comment:"用户id"`
RemainingCharacter int `json:"remainingCharacter" comment:"剩余字符数"`
TotalCharacter int `json:"totalCharacter" comment:"总字符数"`
PlatformId int `json:"platformId" comment:"平台id"`
Status int `json:"status" comment:"状态 1-启用 2-禁用"`
common.ControlBy
}
func (s *TmMemberPlatformUpdateReq) Generate(model *models.TmMemberPlatform) {
if s.Id == 0 {
model.Model = common.Model{Id: s.Id}
}
model.MemberId = s.MemberId
model.RemainingCharacter = s.RemainingCharacter
model.TotalCharacter = s.TotalCharacter
model.PlatformId = s.PlatformId
model.Status = s.Status
model.UpdateBy = s.UpdateBy // 添加这而,需要记录是被谁更新的
}
func (s *TmMemberPlatformUpdateReq) GetId() interface{} {
return s.Id
}
// TmMemberPlatformGetReq 功能获取请求参数
type TmMemberPlatformGetReq struct {
Id int `uri:"id"`
}
func (s *TmMemberPlatformGetReq) GetId() interface{} {
return s.Id
}
// TmMemberPlatformDeleteReq 功能删除请求参数
type TmMemberPlatformDeleteReq struct {
Ids []int `json:"ids"`
}
func (s *TmMemberPlatformDeleteReq) GetId() interface{} {
return s.Ids
}
type TmMemberPlatformStatisticResp struct {
XAxis []string `json:"xAxis"`
Data []TmMemberPlatformStatisticItemResp `json:"data"`
}
type TmMemberPlatformStatisticItemResp struct {
PlatformName string `json:"platformName"`
PlatformId int `json:"platformId"`
Data []int `json:"data" comment:"数据"`
}

View File

@ -0,0 +1,125 @@
package dto
import (
"go-admin/app/admin/models"
"go-admin/common/dto"
common "go-admin/common/models"
"github.com/shopspring/decimal"
)
type TmPlatformGetPageReq struct {
dto.Pagination `search:"-"`
Name string `form:"name" search:"type:contains;column:name;table:tm_platform" comment:"平台名称"`
ShowName string `form:"showName" search:"type:contains;column:show_name;table:tm_platform" comment:"展示名称"`
ApiBaseUrl string `form:"apiBaseUrl" search:"type:exact;column:api_base_url;table:tm_platform" comment:"平台接口地址"`
Code string `form:"code" search:"type:exact;column:code;table:tm_platform" comment:"平台编码(字典 tm_platform)"`
Character string `form:"character" search:"type:exact;column:character;table:tm_platform" comment:"字符数"`
Price string `form:"price" search:"type:exact;column:price;table:tm_platform" comment:"单价"`
TmPlatformOrder
}
type TmPlatformOrder struct {
Id string `form:"idOrder" search:"type:order;column:id;table:tm_platform"`
Name string `form:"nameOrder" search:"type:order;column:name;table:tm_platform"`
ShowName string `form:"showNameOrder" search:"type:order;column:show_name;table:tm_platform"`
ApiBaseUrl string `form:"apiBaseUrlOrder" search:"type:order;column:api_base_url;table:tm_platform"`
Description string `form:"descriptionOrder" search:"type:order;column:description;table:tm_platform"`
Code string `form:"codeOrder" search:"type:order;column:code;table:tm_platform"`
Character string `form:"characterOrder" search:"type:order;column:character;table:tm_platform"`
Price string `form:"priceOrder" search:"type:order;column:price;table:tm_platform"`
CreatedAt string `form:"createdAtOrder" search:"type:order;column:created_at;table:tm_platform"`
UpdatedAt string `form:"updatedAtOrder" search:"type:order;column:updated_at;table:tm_platform"`
DeletedAt string `form:"deletedAtOrder" search:"type:order;column:deleted_at;table:tm_platform"`
CreateBy string `form:"createByOrder" search:"type:order;column:create_by;table:tm_platform"`
UpdateBy string `form:"updateByOrder" search:"type:order;column:update_by;table:tm_platform"`
}
func (m *TmPlatformGetPageReq) GetNeedSearch() interface{} {
return *m
}
type TmPlatformInsertReq struct {
Id int `json:"-" comment:"平台id"` // 平台id
Name string `json:"name" comment:"平台名称"`
ShowName string `json:"showName" comment:"展示名称"`
ApiBaseUrl string `json:"apiBaseUrl" comment:"平台接口地址"`
Description string `json:"description" comment:"描述"`
Code string `json:"code" comment:"平台编码(字典 tm_platform)"`
Character string `json:"character" comment:"字符数"`
Price decimal.Decimal `json:"price" comment:"单价"`
common.ControlBy
}
func (s *TmPlatformInsertReq) Generate(model *models.TmPlatform) {
if s.Id == 0 {
model.Model = common.Model{Id: s.Id}
}
model.Name = s.Name
model.ShowName = s.ShowName
model.ApiBaseUrl = s.ApiBaseUrl
model.Description = s.Description
model.Code = s.Code
model.Character = s.Character
model.Price = s.Price
model.CreateBy = s.CreateBy // 添加这而,需要记录是被谁创建的
}
func (s *TmPlatformInsertReq) GetId() interface{} {
return s.Id
}
type TmPlatformListResp struct {
Id int `json:"id"`
ShowName string `json:"showName"`
Code string `json:"code"`
Price decimal.Decimal `json:"price"`
}
type TmPlatformUpdateReq struct {
Id int `uri:"id" comment:"平台id"` // 平台id
Name string `json:"name" comment:"平台名称"`
ShowName string `json:"showName" comment:"展示名称"`
ApiBaseUrl string `json:"apiBaseUrl" comment:"平台接口地址"`
Description string `json:"description" comment:"描述"`
Code string `json:"code" comment:"平台编码(字典 tm_platform)"`
Character string `json:"character" comment:"字符数"`
Price decimal.Decimal `json:"price" comment:"单价"`
common.ControlBy
}
func (s *TmPlatformUpdateReq) Generate(model *models.TmPlatform) {
if s.Id == 0 {
model.Model = common.Model{Id: s.Id}
}
model.Name = s.Name
model.ShowName = s.ShowName
model.ApiBaseUrl = s.ApiBaseUrl
model.Description = s.Description
model.Code = s.Code
model.Character = s.Character
model.Price = s.Price
model.UpdateBy = s.UpdateBy // 添加这而,需要记录是被谁更新的
}
func (s *TmPlatformUpdateReq) GetId() interface{} {
return s.Id
}
// TmPlatformGetReq 功能获取请求参数
type TmPlatformGetReq struct {
Id int `uri:"id"`
}
func (s *TmPlatformGetReq) GetId() interface{} {
return s.Id
}
// TmPlatformDeleteReq 功能删除请求参数
type TmPlatformDeleteReq struct {
Ids []int `json:"ids"`
}
func (s *TmPlatformDeleteReq) GetId() interface{} {
return s.Ids
}

View File

@ -0,0 +1,97 @@
package dto
import (
"go-admin/app/admin/models"
"go-admin/common/dto"
common "go-admin/common/models"
)
type TmPlatformAccountGetPageReq struct {
dto.Pagination `search:"-"`
PlatformId string `form:"platformId" search:"type:exact;column:platform_id;table:tm_platform_account" comment:"平台主键"`
TmPlatformAccountOrder
}
type TmPlatformAccountOrder struct {
Id string `form:"idOrder" search:"type:order;column:id;table:tm_platform_account"`
PlatformId string `form:"platformIdOrder" search:"type:order;column:platform_id;table:tm_platform_account"`
ApiKey string `form:"apiKeyOrder" search:"type:order;column:api_key;table:tm_platform_account"`
ApiSecret string `form:"apiSecretOrder" search:"type:order;column:api_secret;table:tm_platform_account"`
QpsLimit string `form:"qpsLimitOrder" search:"type:order;column:qps_limit;table:tm_platform_account"`
CreatedAt string `form:"createdAtOrder" search:"type:order;column:created_at;table:tm_platform_account"`
UpdatedAt string `form:"updatedAtOrder" search:"type:order;column:updated_at;table:tm_platform_account"`
DeletedAt string `form:"deletedAtOrder" search:"type:order;column:deleted_at;table:tm_platform_account"`
CreateBy string `form:"createByOrder" search:"type:order;column:create_by;table:tm_platform_account"`
UpdateBy string `form:"updateByOrder" search:"type:order;column:update_by;table:tm_platform_account"`
}
func (m *TmPlatformAccountGetPageReq) GetNeedSearch() interface{} {
return *m
}
type TmPlatformAccountInsertReq struct {
Id int `json:"-" comment:"主键id"` // 主键id
PlatformId int `json:"platformId" comment:"平台主键"`
ApiKey string `json:"apiKey" comment:"api_key"`
ApiSecret string `json:"apiSecret" comment:"api密钥"`
QpsLimit int `json:"qpsLimit" comment:"qps限制"`
common.ControlBy
}
func (s *TmPlatformAccountInsertReq) Generate(model *models.TmPlatformAccount) {
if s.Id == 0 {
model.Model = common.Model{Id: s.Id}
}
model.PlatformId = s.PlatformId
model.ApiKey = s.ApiKey
model.ApiSecret = s.ApiSecret
model.QpsLimit = s.QpsLimit
model.Status = 1
model.CreateBy = s.CreateBy // 添加这而,需要记录是被谁创建的
}
func (s *TmPlatformAccountInsertReq) GetId() interface{} {
return s.Id
}
type TmPlatformAccountUpdateReq struct {
Id int `uri:"id" comment:"主键id"` // 主键id
PlatformId int `json:"platformId" comment:"平台主键"`
ApiKey string `json:"apiKey" comment:"api_key"`
ApiSecret string `json:"apiSecret" comment:"api密钥"`
QpsLimit int `json:"qpsLimit" comment:"qps限制"`
common.ControlBy
}
func (s *TmPlatformAccountUpdateReq) Generate(model *models.TmPlatformAccount) {
if s.Id == 0 {
model.Model = common.Model{Id: s.Id}
}
model.PlatformId = s.PlatformId
model.ApiKey = s.ApiKey
model.ApiSecret = s.ApiSecret
model.QpsLimit = s.QpsLimit
model.UpdateBy = s.UpdateBy // 添加这而,需要记录是被谁更新的
}
func (s *TmPlatformAccountUpdateReq) GetId() interface{} {
return s.Id
}
// TmPlatformAccountGetReq 功能获取请求参数
type TmPlatformAccountGetReq struct {
Id int `uri:"id"`
}
func (s *TmPlatformAccountGetReq) GetId() interface{} {
return s.Id
}
// TmPlatformAccountDeleteReq 功能删除请求参数
type TmPlatformAccountDeleteReq struct {
Ids []int `json:"ids"`
}
func (s *TmPlatformAccountDeleteReq) GetId() interface{} {
return s.Ids
}

View File

@ -0,0 +1,68 @@
package dto
import "go-admin/common/statuscode"
// TranslateResult 翻译结果
type TranslateResult struct {
TranslatedText string `json:"translatedText" comment:"翻译后的文本"`
SourceLanguage string `json:"sourceLanguage" comment:"源语言"`
TargetLanguage string `json:"targetLanguage" comment:"目标语言"`
}
type DeepseekTranslateRequest struct {
Model string `json:"model"`
Messages []Message `json:"messages"`
Stream bool `json:"stream"`
}
type Message struct {
Role string `json:"role"`
Content string `json:"content"`
}
type DeepSeekResponse struct {
Choices []struct {
Message Message `json:"message"`
} `json:"choices"`
}
//翻译请求
type TranslateReq struct {
Text string `json:"text"`
SourceLang string `json:"sourceLang"`
TargetLang string `json:"targetLang"`
Platform string `json:"platform"`
}
func (e *TranslateReq) Validate() int {
if e.Text == "" {
return statuscode.InvalidParams
}
if e.Platform == "" {
return statuscode.InvalidParams
}
if e.TargetLang == "" {
return statuscode.InvalidParams
}
if e.SourceLang == "" {
e.SourceLang = "auto"
}
return statuscode.Success
}
type TranslateStatisticReq struct {
}
type TranslateStatisticResp struct {
TotalCount int `json:"y" comment:"总字符数"`
Date string `json:"x" comment:"日期"`
}
type TranslateUserInfoResp struct {
UserApiKey string `json:"userApiKey" comment:"用户API Key"`
RemainChars int `json:"remainChars" comment:"剩余可翻译字符数"`
}

View File

@ -0,0 +1,123 @@
package service
import (
"errors"
"fmt"
"github.com/go-admin-team/go-admin-core/sdk/runtime"
"github.com/go-admin-team/go-admin-core/sdk/service"
"gorm.io/gorm"
"go-admin/app/admin/models"
"go-admin/app/admin/service/dto"
"go-admin/common/actions"
cDto "go-admin/common/dto"
"go-admin/common/global"
)
type SysApi struct {
service.Service
}
// GetPage 获取SysApi列表
func (e *SysApi) GetPage(c *dto.SysApiGetPageReq, p *actions.DataPermission, list *[]models.SysApi, count *int64) error {
var err error
var data models.SysApi
orm := e.Orm.Debug().Model(&data).
Scopes(
cDto.MakeCondition(c.GetNeedSearch()),
cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
actions.Permission(data.TableName(), p),
)
if c.Type != "" {
qType := c.Type
if qType == "暂无" {
qType = ""
}
if global.Driver == "postgres" {
orm = orm.Where("type = ?", qType)
} else {
orm = orm.Where("`type` = ?", qType)
}
}
err = orm.Find(list).Limit(-1).Offset(-1).
Count(count).Error
if err != nil {
e.Log.Errorf("Service GetSysApiPage error:%s", err)
return err
}
return nil
}
// Get 获取SysApi对象with id
func (e *SysApi) Get(d *dto.SysApiGetReq, p *actions.DataPermission, model *models.SysApi) *SysApi {
var data models.SysApi
err := e.Orm.Model(&data).
Scopes(
actions.Permission(data.TableName(), p),
).
First(model, d.GetId()).Error
if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
err = errors.New("查看对象不存在或无权查看")
e.Log.Errorf("Service GetSysApi error:%s", err)
_ = e.AddError(err)
return e
}
if err != nil {
e.Log.Errorf("db error:%s", err)
_ = e.AddError(err)
return e
}
return e
}
// Update 修改SysApi对象
func (e *SysApi) Update(c *dto.SysApiUpdateReq, p *actions.DataPermission) error {
var model = models.SysApi{}
db := e.Orm.Debug().First(&model, c.GetId())
if db.RowsAffected == 0 {
return errors.New("无权更新该数据")
}
c.Generate(&model)
db = e.Orm.Save(&model)
if err := db.Error; err != nil {
e.Log.Errorf("Service UpdateSysApi error:%s", err)
return err
}
return nil
}
// Remove 删除SysApi
func (e *SysApi) Remove(d *dto.SysApiDeleteReq, p *actions.DataPermission) error {
var data models.SysApi
db := e.Orm.Model(&data).
Scopes(
actions.Permission(data.TableName(), p),
).Delete(&data, d.GetId())
if err := db.Error; err != nil {
e.Log.Errorf("Service RemoveSysApi error:%s", err)
return err
}
if db.RowsAffected == 0 {
return errors.New("无权删除该数据")
}
return nil
}
// CheckStorageSysApi 创建SysApi对象
func (e *SysApi) CheckStorageSysApi(c *[]runtime.Router) error {
for _, v := range *c {
err := e.Orm.Debug().Where(models.SysApi{Path: v.RelativePath, Action: v.HttpMethod}).
Attrs(models.SysApi{Handle: v.Handler}).
FirstOrCreate(&models.SysApi{}).Error
if err != nil {
err := fmt.Errorf("Service CheckStorageSysApi error: %s \r\n ", err.Error())
return err
}
}
return nil
}

View File

@ -0,0 +1,251 @@
package service
import (
"errors"
"fmt"
"go-admin/app/admin/models"
"go-admin/app/admin/service/dto"
cDto "go-admin/common/dto"
rediskey "go-admin/common/redis_key"
"go-admin/utils/redishelper"
"github.com/bytedance/sonic"
"github.com/go-admin-team/go-admin-core/sdk/service"
"gorm.io/gorm"
)
type SysConfig struct {
service.Service
}
// GetPage 获取SysConfig列表
func (e *SysConfig) GetPage(c *dto.SysConfigGetPageReq, list *[]models.SysConfig, count *int64) error {
err := e.Orm.
Scopes(
cDto.MakeCondition(c.GetNeedSearch()),
cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
).
Find(list).Limit(-1).Offset(-1).
Count(count).Error
if err != nil {
e.Log.Errorf("Service GetSysConfigPage error:%s", err)
return err
}
return nil
}
// Get 获取SysConfig对象
func (e *SysConfig) Get(d *dto.SysConfigGetReq, model *models.SysConfig) error {
err := e.Orm.First(model, d.GetId()).Error
if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
err = errors.New("查看对象不存在或无权查看")
e.Log.Errorf("Service GetSysConfigPage error:%s", err)
return err
}
if err != nil {
e.Log.Errorf("Service GetSysConfig error:%s", err)
return err
}
return nil
}
// Insert 创建SysConfig对象
func (e *SysConfig) Insert(c *dto.SysConfigControl) error {
var err error
var data models.SysConfig
c.Generate(&data)
err = e.Orm.Create(&data).Error
if err != nil {
e.Log.Errorf("Service InsertSysConfig error:%s", err)
return err
}
e.saveCache(data)
return nil
}
// Update 修改SysConfig对象
func (e *SysConfig) Update(c *dto.SysConfigControl) error {
var err error
var model = models.SysConfig{}
e.Orm.First(&model, c.GetId())
c.Generate(&model)
db := e.Orm.Save(&model)
err = db.Error
if err != nil {
e.Log.Errorf("Service UpdateSysConfig error:%s", err)
return err
}
if db.RowsAffected == 0 {
return errors.New("无权更新该数据")
}
e.saveCache(model)
return nil
}
// SetSysConfig 修改SysConfig对象
func (e *SysConfig) SetSysConfig(c *[]dto.GetSetSysConfigReq) error {
var err error
for _, req := range *c {
var model = models.SysConfig{}
e.Orm.Where("config_key = ?", req.ConfigKey).First(&model)
if model.Id != 0 {
req.Generate(&model)
db := e.Orm.Save(&model)
err = db.Error
if err != nil {
e.Log.Errorf("Service SetSysConfig error:%s", err)
return err
}
if db.RowsAffected == 0 {
return errors.New("无权更新该数据")
}
e.saveCache(model)
}
}
return nil
}
func (e *SysConfig) GetForSet(c *[]dto.GetSetSysConfigReq) error {
var err error
var data models.SysConfig
err = e.Orm.Model(&data).
Find(c).Error
if err != nil {
e.Log.Errorf("Service GetSysConfigPage error:%s", err)
return err
}
return nil
}
func (e *SysConfig) UpdateForSet(c *[]dto.GetSetSysConfigReq) error {
m := *c
for _, req := range m {
var data models.SysConfig
if err := e.Orm.Where("config_key = ?", req.ConfigKey).
First(&data).Error; err != nil {
e.Log.Errorf("Service GetSysConfigPage error:%s", err)
return err
}
if data.ConfigValue != req.ConfigValue {
data.ConfigValue = req.ConfigValue
if err := e.Orm.Save(&data).Error; err != nil {
e.Log.Errorf("Service GetSysConfigPage error:%s", err)
return err
}
e.saveCache(data)
}
}
return nil
}
// 更新缓存
// 新数据
func (e *SysConfig) saveCache(entity models.SysConfig) error {
key := fmt.Sprintf(rediskey.SYS_CONFIG_KEY, entity.ConfigKey)
val, err := sonic.MarshalString(entity)
if err != nil || val == "" {
return errors.New("更新配置缓存 缓存序列化失败")
}
redishelper.DefaultRedis.SetString(key, string(val))
return nil
}
// Remove 删除SysConfig
func (e *SysConfig) Remove(d *dto.SysConfigDeleteReq) error {
var err error
var data models.SysConfig
db := e.Orm.Delete(&data, d.Ids)
if err = db.Error; err != nil {
err = db.Error
e.Log.Errorf("Service RemoveSysConfig error:%s", err)
return err
}
if db.RowsAffected == 0 {
err = errors.New("无权删除该数据")
return err
}
key := fmt.Sprintf(rediskey.SYS_CONFIG_KEY, data.ConfigKey)
redishelper.DefaultRedis.DeleteString(key)
return nil
}
// GetWithKey 根据Key获取SysConfig
func (e *SysConfig) GetWithKey(c *dto.SysConfigByKeyReq, resp *dto.GetSysConfigByKEYForServiceResp) error {
var err error
var data models.SysConfig
key := fmt.Sprintf(rediskey.SYS_CONFIG_KEY, c.ConfigKey)
val, _ := redishelper.DefaultRedis.GetString(key)
if val != "" {
err = sonic.UnmarshalString(val, &data)
if err != nil {
e.Log.Errorf("At Service GetSysConfigByKEY Error:%s", err)
return err
}
}
if data.Id == 0 {
err = e.Orm.Table(data.TableName()).Where("config_key = ?", c.ConfigKey).First(resp).Error
if err != nil {
e.Log.Errorf("At Service GetSysConfigByKEY Error:%s", err)
return err
}
}
resp.ConfigKey = data.ConfigKey
resp.ConfigValue = data.ConfigValue
return nil
}
func (e *SysConfig) GetWithKeyList(c *dto.SysConfigGetToSysAppReq, list *[]models.SysConfig) error {
var err error
err = e.Orm.
Scopes(
cDto.MakeCondition(c.GetNeedSearch()),
).
Find(list).Error
if err != nil {
e.Log.Errorf("Service GetSysConfigByKey error:%s", err)
return err
}
return nil
}
// 初始化配置缓存
func (e *SysConfig) InitCache() error {
var list []models.SysConfig
if err := e.Orm.Find(&list).Error; err != nil {
return err
}
for _, entity := range list {
key := fmt.Sprintf(rediskey.SYS_CONFIG_KEY, entity.ConfigKey)
val, err := sonic.MarshalString(entity)
if err != nil || val == "" {
return errors.New("初始化配置缓存 缓存序列化失败")
}
redishelper.DefaultRedis.SetString(key, string(val))
}
return nil
}

View File

@ -0,0 +1,295 @@
package service
import (
"errors"
"go-admin/app/admin/models"
log "github.com/go-admin-team/go-admin-core/logger"
"github.com/go-admin-team/go-admin-core/sdk/pkg"
"gorm.io/gorm"
"go-admin/app/admin/service/dto"
cDto "go-admin/common/dto"
"github.com/go-admin-team/go-admin-core/sdk/service"
)
type SysDept struct {
service.Service
}
// GetPage 获取SysDept列表
//func (e *SysDept) GetPage(c *dto.SysDeptGetPageReq, list *[]models.SysDept) error {
// var err error
// var data models.SysDept
//
// err = e.Orm.Model(&data).
// Scopes(
// cDto.MakeCondition(c.GetNeedSearch()),
// ).
// Find(list).Error
// if err != nil {
// e.Log.Errorf("db error:%s", err)
// return err
// }
// return nil
//}
// Get 获取SysDept对象
func (e *SysDept) Get(d *dto.SysDeptGetReq, model *models.SysDept) error {
var err error
var data models.SysDept
db := e.Orm.Model(&data).
First(model, d.GetId())
err = db.Error
if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
err = errors.New("查看对象不存在或无权查看")
e.Log.Errorf("db error:%s", err)
return err
}
if err = db.Error; err != nil {
e.Log.Errorf("db error:%s", err)
return err
}
return nil
}
// Insert 创建SysDept对象
func (e *SysDept) Insert(c *dto.SysDeptInsertReq) error {
var err error
var data models.SysDept
c.Generate(&data)
tx := e.Orm.Debug().Begin()
defer func() {
if err != nil {
tx.Rollback()
} else {
tx.Commit()
}
}()
err = tx.Create(&data).Error
if err != nil {
e.Log.Errorf("db error:%s", err)
return err
}
deptPath := pkg.IntToString(data.DeptId) + "/"
if data.ParentId != 0 {
var deptP models.SysDept
tx.First(&deptP, data.ParentId)
deptPath = deptP.DeptPath + deptPath
} else {
deptPath = "/0/" + deptPath
}
var mp = map[string]string{}
mp["dept_path"] = deptPath
if err := tx.Model(&data).Update("dept_path", deptPath).Error; err != nil {
e.Log.Errorf("db error:%s", err)
return err
}
return nil
}
// Update 修改SysDept对象
func (e *SysDept) Update(c *dto.SysDeptUpdateReq) error {
var err error
var model = models.SysDept{}
tx := e.Orm.Debug().Begin()
defer func() {
if err != nil {
tx.Rollback()
} else {
tx.Commit()
}
}()
tx.First(&model, c.GetId())
c.Generate(&model)
deptPath := pkg.IntToString(model.DeptId) + "/"
if model.ParentId != 0 {
var deptP models.SysDept
tx.First(&deptP, model.ParentId)
deptPath = deptP.DeptPath + deptPath
} else {
deptPath = "/0/" + deptPath
}
model.DeptPath = deptPath
db := tx.Save(&model)
if err = db.Error; err != nil {
e.Log.Errorf("UpdateSysDept error:%s", err)
return err
}
if db.RowsAffected == 0 {
return errors.New("无权更新该数据")
}
return nil
}
// Remove 删除SysDept
func (e *SysDept) Remove(d *dto.SysDeptDeleteReq) error {
var err error
var data models.SysDept
db := e.Orm.Model(&data).Delete(&data, d.GetId())
if err = db.Error; err != nil {
err = db.Error
e.Log.Errorf("Delete error: %s", err)
return err
}
if db.RowsAffected == 0 {
err = errors.New("无权删除该数据")
return err
}
return nil
}
// GetSysDeptList 获取组织数据
func (e *SysDept) getList(c *dto.SysDeptGetPageReq, list *[]models.SysDept) error {
var err error
var data models.SysDept
err = e.Orm.Model(&data).
Scopes(
cDto.MakeCondition(c.GetNeedSearch()),
).
Find(list).Error
if err != nil {
e.Log.Errorf("db error:%s", err)
return err
}
return nil
}
// SetDeptTree 设置组织数据
func (e *SysDept) SetDeptTree(c *dto.SysDeptGetPageReq) (m []dto.DeptLabel, err error) {
var list []models.SysDept
err = e.getList(c, &list)
m = make([]dto.DeptLabel, 0)
for i := 0; i < len(list); i++ {
if list[i].ParentId != 0 {
continue
}
e := dto.DeptLabel{}
e.Id = list[i].DeptId
e.Label = list[i].DeptName
deptsInfo := deptTreeCall(&list, e)
m = append(m, deptsInfo)
}
return
}
// Call 递归构造组织数据
func deptTreeCall(deptList *[]models.SysDept, dept dto.DeptLabel) dto.DeptLabel {
list := *deptList
min := make([]dto.DeptLabel, 0)
for j := 0; j < len(list); j++ {
if dept.Id != list[j].ParentId {
continue
}
mi := dto.DeptLabel{Id: list[j].DeptId, Label: list[j].DeptName, Children: []dto.DeptLabel{}}
ms := deptTreeCall(deptList, mi)
min = append(min, ms)
}
dept.Children = min
return dept
}
// SetDeptPage 设置dept页面数据
func (e *SysDept) SetDeptPage(c *dto.SysDeptGetPageReq) (m []models.SysDept, err error) {
var list []models.SysDept
err = e.getList(c, &list)
for i := 0; i < len(list); i++ {
if list[i].ParentId != 0 {
continue
}
info := e.deptPageCall(&list, list[i])
m = append(m, info)
}
return
}
func (e *SysDept) deptPageCall(deptlist *[]models.SysDept, menu models.SysDept) models.SysDept {
list := *deptlist
min := make([]models.SysDept, 0)
for j := 0; j < len(list); j++ {
if menu.DeptId != list[j].ParentId {
continue
}
mi := models.SysDept{}
mi.DeptId = list[j].DeptId
mi.ParentId = list[j].ParentId
mi.DeptPath = list[j].DeptPath
mi.DeptName = list[j].DeptName
mi.Sort = list[j].Sort
mi.Leader = list[j].Leader
mi.Phone = list[j].Phone
mi.Email = list[j].Email
mi.Status = list[j].Status
mi.CreatedAt = list[j].CreatedAt
mi.Children = []models.SysDept{}
ms := e.deptPageCall(deptlist, mi)
min = append(min, ms)
}
menu.Children = min
return menu
}
// GetWithRoleId 获取角色的部门ID集合
func (e *SysDept) GetWithRoleId(roleId int) ([]int, error) {
deptIds := make([]int, 0)
deptList := make([]dto.DeptIdList, 0)
if err := e.Orm.Table("sys_role_dept").
Select("sys_role_dept.dept_id").
Joins("LEFT JOIN sys_dept on sys_dept.dept_id=sys_role_dept.dept_id").
Where("role_id = ? ", roleId).
Where(" sys_role_dept.dept_id not in(select sys_dept.parent_id from sys_role_dept LEFT JOIN sys_dept on sys_dept.dept_id=sys_role_dept.dept_id where role_id =? )", roleId).
Find(&deptList).Error; err != nil {
return nil, err
}
for i := 0; i < len(deptList); i++ {
deptIds = append(deptIds, deptList[i].DeptId)
}
return deptIds, nil
}
func (e *SysDept) SetDeptLabel() (m []dto.DeptLabel, err error) {
list := make([]models.SysDept, 0)
err = e.Orm.Find(&list).Error
if err != nil {
log.Error("find dept list error, %s", err.Error())
return
}
m = make([]dto.DeptLabel, 0)
var item dto.DeptLabel
for i := range list {
if list[i].ParentId != 0 {
continue
}
item = dto.DeptLabel{}
item.Id = list[i].DeptId
item.Label = list[i].DeptName
deptInfo := deptLabelCall(&list, item)
m = append(m, deptInfo)
}
return
}
// deptLabelCall
func deptLabelCall(deptList *[]models.SysDept, dept dto.DeptLabel) dto.DeptLabel {
list := *deptList
var mi dto.DeptLabel
min := make([]dto.DeptLabel, 0)
for j := 0; j < len(list); j++ {
if dept.Id != list[j].ParentId {
continue
}
mi = dto.DeptLabel{Id: list[j].DeptId, Label: list[j].DeptName, Children: []dto.DeptLabel{}}
ms := deptLabelCall(deptList, mi)
min = append(min, ms)
}
dept.Children = min
return dept
}

View File

@ -0,0 +1,139 @@
package service
import (
"errors"
"github.com/go-admin-team/go-admin-core/sdk/service"
"gorm.io/gorm"
"go-admin/app/admin/models"
"go-admin/app/admin/service/dto"
cDto "go-admin/common/dto"
)
type SysDictData struct {
service.Service
}
// GetPage 获取列表
func (e *SysDictData) GetPage(c *dto.SysDictDataGetPageReq, list *[]models.SysDictData, count *int64) error {
var err error
var data models.SysDictData
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 {
e.Log.Errorf("db error: %s", err)
return err
}
return nil
}
// Get 获取对象
func (e *SysDictData) Get(d *dto.SysDictDataGetReq, model *models.SysDictData) error {
var err error
var data models.SysDictData
db := e.Orm.Model(&data).
First(model, d.GetId())
err = db.Error
if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
err = errors.New("查看对象不存在或无权查看")
e.Log.Errorf("db error: %s", err)
return err
}
if err = db.Error; err != nil {
e.Log.Errorf("db error: %s", err)
return err
}
return nil
}
// Insert 创建对象
func (e *SysDictData) Insert(c *dto.SysDictDataInsertReq) error {
var err error
var data = new(models.SysDictData)
c.Generate(data)
err = e.Orm.Create(data).Error
if err != nil {
e.Log.Errorf("db error: %s", err)
return err
}
e.saveCache(data)
return nil
}
func (e *SysDictData) saveCache(data *models.SysDictData) {
var dictType models.SysDictType
e.Orm.Model(dictType).Where("dict_type = ?", data.DictType).Find(&dictType)
if dictType.ID > 0 {
dictService := SysDictType{Service: e.Service}
dictService.SaveDataCache(&dictType)
}
}
// Update 修改对象
func (e *SysDictData) Update(c *dto.SysDictDataUpdateReq) error {
var err error
var model = models.SysDictData{}
e.Orm.First(&model, c.GetId())
c.Generate(&model)
db := e.Orm.Save(model)
if err = db.Error; err != nil {
e.Log.Errorf("db error: %s", err)
return err
}
if db.RowsAffected == 0 {
return errors.New("无权更新该数据")
}
e.saveCache(&model)
return nil
}
// Remove 删除
func (e *SysDictData) Remove(c *dto.SysDictDataDeleteReq) error {
var err error
var data models.SysDictData
db := e.Orm.Delete(&data, c.GetId())
if err = db.Error; err != nil {
err = db.Error
e.Log.Errorf("Delete error: %s", err)
return err
}
if db.RowsAffected == 0 {
err = errors.New("无权删除该数据")
return err
}
e.saveCache(&data)
return nil
}
// GetAll 获取所有
func (e *SysDictData) GetAll(c *dto.SysDictDataGetPageReq, list *[]models.SysDictData) error {
var err error
var data models.SysDictData
err = e.Orm.Model(&data).
Scopes(
cDto.MakeCondition(c.GetNeedSearch()),
).
Find(list).Error
if err != nil {
e.Log.Errorf("db error: %s", err)
return err
}
return nil
}

View File

@ -0,0 +1,216 @@
package service
import (
"errors"
"fmt"
"github.com/bytedance/sonic"
"github.com/go-admin-team/go-admin-core/sdk/service"
"github.com/jinzhu/copier"
"gorm.io/gorm"
"go-admin/app/admin/models"
"go-admin/app/admin/service/dto"
cDto "go-admin/common/dto"
rediskey "go-admin/common/redis_key"
"go-admin/utils/redishelper"
)
type SysDictType struct {
service.Service
}
// GetPage 获取列表
func (e *SysDictType) GetPage(c *dto.SysDictTypeGetPageReq, list *[]models.SysDictType, count *int64) error {
var err error
var data models.SysDictType
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 {
e.Log.Errorf("db error: %s", err)
return err
}
return nil
}
// Get 获取对象
func (e *SysDictType) Get(d *dto.SysDictTypeGetReq, model *models.SysDictType) error {
var err error
db := e.Orm.First(model, d.GetId())
err = db.Error
if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
err = errors.New("查看对象不存在或无权查看")
e.Log.Errorf("db error: %s", err)
return err
}
if err = db.Error; err != nil {
e.Log.Errorf("db error: %s", err)
return err
}
return nil
}
// Insert 创建对象
func (e *SysDictType) Insert(c *dto.SysDictTypeInsertReq) error {
var err error
var data models.SysDictType
c.Generate(&data)
var count int64
e.Orm.Model(&data).Where("dict_type = ?", data.DictType).Count(&count)
if count > 0 {
return errors.New(fmt.Sprintf("当前字典类型[%s]已经存在!", data.DictType))
}
err = e.Orm.Create(&data).Error
if err != nil {
e.Log.Errorf("db error: %s", err)
return err
}
e.saveCache(&data)
return nil
}
// Update 修改对象
func (e *SysDictType) Update(c *dto.SysDictTypeUpdateReq) error {
var err error
var model = models.SysDictType{}
e.Orm.First(&model, c.GetId())
c.Generate(&model)
db := e.Orm.Save(&model)
if err = db.Error; err != nil {
e.Log.Errorf("db error: %s", err)
return err
}
if db.RowsAffected == 0 {
return errors.New("无权更新该数据")
}
e.saveCache(&model)
return nil
}
func (e *SysDictType) saveCache(data *models.SysDictType) error {
key := fmt.Sprintf(rediskey.SysDictKey, data.DictType)
val, _ := sonic.MarshalString(data)
if val != "" {
redishelper.DefaultRedis.SetString(key, val)
}
e.SaveDataCache(data)
return nil
}
// 保存字典数据缓存
func (e *SysDictType) SaveDataCache(data *models.SysDictType) error {
cacheData := dto.SysDictDetailResp{}
copier.Copy(&cacheData, data)
dataListKey := fmt.Sprintf(rediskey.SysDictDataList, data.DictType)
datas := make([]models.SysDictData, 0)
cacheDatas := []dto.SysDictDataDetail{}
e.Orm.Model(&models.SysDictData{}).Where("dict_type = ?", data.DictType).Find(&datas)
copier.Copy(&cacheDatas, datas)
cacheData.Datas = cacheDatas
listVal, _ := sonic.MarshalString(cacheData)
if listVal != "" {
redishelper.DefaultRedis.SetString(dataListKey, listVal)
}
return nil
}
// Remove 删除
func (e *SysDictType) Remove(d *dto.SysDictTypeDeleteReq) error {
var err error
var data models.SysDictType
var datas []models.SysDictType
e.Orm.Model(data).Where("id in ?", d.Ids).Select("dict_type").Find(&datas)
db := e.Orm.Delete(&data, d.GetId())
if err = db.Error; err != nil {
err = db.Error
e.Log.Errorf("Delete error: %s", err)
return err
}
if db.RowsAffected == 0 {
err = errors.New("无权删除该数据")
return err
}
for _, item := range datas {
key := fmt.Sprintf(rediskey.SysDictKey, item.DictType)
listKey := fmt.Sprintf(rediskey.SysDictDataList, item.DictType)
redishelper.DefaultRedis.DeleteString(key)
redishelper.DefaultRedis.DeleteString(listKey)
}
return nil
}
// 初始化字典数据
func (e *SysDictType) InitDict() error {
var dicts []models.SysDictType
var datas []models.SysDictData
if err := e.Orm.Model(&models.SysDictType{}).Find(&dicts).Error; err != nil {
return err
}
if err := e.Orm.Model(&models.SysDictData{}).Find(&datas).Error; err != nil {
return err
}
for _, item := range dicts {
key := fmt.Sprintf(rediskey.SysDictKey, item.DictType)
listKey := fmt.Sprintf(rediskey.SysDictDataList, item.DictType)
cacheData := dto.SysDictDetailResp{}
copier.Copy(&cacheData, item)
dataList := make([]models.SysDictData, 0)
for _, dataItem := range datas {
if dataItem.DictType == item.DictType {
dataList = append(dataList, dataItem)
}
}
cacheDatas := []dto.SysDictDataDetail{}
copier.Copy(&cacheDatas, dataList)
cacheData.Datas = cacheDatas
listVal, _ := sonic.MarshalString(cacheData)
val, _ := sonic.MarshalString(item)
if listVal != "" {
redishelper.DefaultRedis.SetString(listKey, listVal)
}
if val != "" {
redishelper.DefaultRedis.SetString(key, val)
}
}
return nil
}
// GetAll 获取所有
func (e *SysDictType) GetAll(c *dto.SysDictTypeGetPageReq, list *[]models.SysDictType) error {
var err error
var data models.SysDictType
err = e.Orm.Model(&data).
Scopes(
cDto.MakeCondition(c.GetNeedSearch()),
).
Find(list).Error
if err != nil {
e.Log.Errorf("db error: %s", err)
return err
}
return nil
}

View File

@ -0,0 +1,70 @@
package service
import (
"errors"
"github.com/go-admin-team/go-admin-core/sdk/service"
"gorm.io/gorm"
"go-admin/app/admin/models"
"go-admin/app/admin/service/dto"
cDto "go-admin/common/dto"
)
type SysLoginLog struct {
service.Service
}
// GetPage 获取SysLoginLog列表
func (e *SysLoginLog) GetPage(c *dto.SysLoginLogGetPageReq, list *[]models.SysLoginLog, count *int64) error {
var err error
var data models.SysLoginLog
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 {
e.Log.Errorf("db error:%s", err)
return err
}
return nil
}
// Get 获取SysLoginLog对象
func (e *SysLoginLog) Get(d *dto.SysLoginLogGetReq, model *models.SysLoginLog) error {
var err error
db := e.Orm.First(model, d.GetId())
err = db.Error
if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
err = errors.New("查看对象不存在或无权查看")
e.Log.Errorf("db error:%s", err)
return err
}
if err = db.Error; err != nil {
e.Log.Errorf("db error:%s", err)
return err
}
return nil
}
// Remove 删除SysLoginLog
func (e *SysLoginLog) Remove(c *dto.SysLoginLogDeleteReq) error {
var err error
var data models.SysLoginLog
db := e.Orm.Delete(&data, c.GetId())
if err = db.Error; err != nil {
err = db.Error
e.Log.Errorf("Delete error: %s", err)
return err
}
if db.RowsAffected == 0 {
err = errors.New("无权删除该数据")
return err
}
return nil
}

View File

@ -0,0 +1,423 @@
package service
import (
"fmt"
"sort"
"strings"
"github.com/go-admin-team/go-admin-core/sdk/pkg"
"github.com/pkg/errors"
"gorm.io/gorm"
"go-admin/app/admin/models"
"go-admin/app/admin/service/dto"
cDto "go-admin/common/dto"
cModels "go-admin/common/models"
"github.com/go-admin-team/go-admin-core/sdk/service"
)
type SysMenu struct {
service.Service
}
// GetPage 获取SysMenu列表
func (e *SysMenu) GetPage(c *dto.SysMenuGetPageReq, menus *[]models.SysMenu) *SysMenu {
var menu = make([]models.SysMenu, 0)
err := e.getPage(c, &menu).Error
if err != nil {
_ = e.AddError(err)
return e
}
for i := 0; i < len(menu); i++ {
if menu[i].ParentId != 0 {
continue
}
menusInfo := menuCall(&menu, menu[i])
*menus = append(*menus, menusInfo)
}
return e
}
// getPage 菜单分页列表
func (e *SysMenu) getPage(c *dto.SysMenuGetPageReq, list *[]models.SysMenu) *SysMenu {
var err error
var data models.SysMenu
err = e.Orm.Model(&data).
Scopes(
cDto.OrderDest("sort", false),
cDto.MakeCondition(c.GetNeedSearch()),
).Preload("SysApi").
Find(list).Error
if err != nil {
e.Log.Errorf("getSysMenuPage error:%s", err)
_ = e.AddError(err)
return e
}
return e
}
// Get 获取SysMenu对象
func (e *SysMenu) Get(d *dto.SysMenuGetReq, model *models.SysMenu) *SysMenu {
var err error
var data models.SysMenu
db := e.Orm.Model(&data).Preload("SysApi").
First(model, d.GetId())
err = db.Error
if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
err = errors.New("查看对象不存在或无权查看")
e.Log.Errorf("GetSysMenu error:%s", err)
_ = e.AddError(err)
return e
}
if err != nil {
e.Log.Errorf("db error:%s", err)
_ = e.AddError(err)
return e
}
apis := make([]int, 0)
for _, v := range model.SysApi {
apis = append(apis, v.Id)
}
model.Apis = apis
return e
}
// Insert 创建SysMenu对象
func (e *SysMenu) Insert(c *dto.SysMenuInsertReq) *SysMenu {
var err error
var data models.SysMenu
c.Generate(&data)
tx := e.Orm.Debug().Begin()
defer func() {
if err != nil {
tx.Rollback()
} else {
tx.Commit()
}
}()
err = tx.Where("id in ?", c.Apis).Find(&data.SysApi).Error
if err != nil {
tx.Rollback()
e.Log.Errorf("db error:%s", err)
_ = e.AddError(err)
}
err = tx.Create(&data).Error
if err != nil {
tx.Rollback()
e.Log.Errorf("db error:%s", err)
_ = e.AddError(err)
}
c.MenuId = data.MenuId
err = e.initPaths(tx, &data)
if err != nil {
tx.Rollback()
e.Log.Errorf("db error:%s", err)
_ = e.AddError(err)
}
tx.Commit()
return e
}
func (e *SysMenu) initPaths(tx *gorm.DB, menu *models.SysMenu) error {
var err error
var data models.SysMenu
parentMenu := new(models.SysMenu)
if menu.ParentId != 0 {
err = tx.Model(&data).First(parentMenu, menu.ParentId).Error
if err != nil {
return err
}
if parentMenu.Paths == "" {
err = errors.New("父级paths异常请尝试对当前节点父级菜单进行更新操作")
return err
}
menu.Paths = parentMenu.Paths + "/" + pkg.IntToString(menu.MenuId)
} else {
menu.Paths = "/0/" + pkg.IntToString(menu.MenuId)
}
err = tx.Model(&data).Where("menu_id = ?", menu.MenuId).Update("paths", menu.Paths).Error
return err
}
// Update 修改SysMenu对象
func (e *SysMenu) Update(c *dto.SysMenuUpdateReq) *SysMenu {
var err error
tx := e.Orm.Debug().Begin()
defer func() {
if err != nil {
tx.Rollback()
} else {
tx.Commit()
}
}()
var alist = make([]models.SysApi, 0)
var model = models.SysMenu{}
tx.Preload("SysApi").First(&model, c.GetId())
oldPath := model.Paths
tx.Where("id in ?", c.Apis).Find(&alist)
err = tx.Model(&model).Association("SysApi").Delete(model.SysApi)
if err != nil {
e.Log.Errorf("delete policy error:%s", err)
_ = e.AddError(err)
return e
}
c.Generate(&model)
model.SysApi = alist
db := tx.Model(&model).Session(&gorm.Session{FullSaveAssociations: true}).Debug().Save(&model)
if err = db.Error; err != nil {
e.Log.Errorf("db error:%s", err)
_ = e.AddError(err)
return e
}
if db.RowsAffected == 0 {
_ = e.AddError(errors.New("无权更新该数据"))
return e
}
var menuList []models.SysMenu
tx.Where("paths like ?", oldPath+"%").Find(&menuList)
for _, v := range menuList {
v.Paths = strings.Replace(v.Paths, oldPath, model.Paths, 1)
tx.Model(&v).Update("paths", v.Paths)
}
return e
}
// Remove 删除SysMenu
func (e *SysMenu) Remove(d *dto.SysMenuDeleteReq) *SysMenu {
var err error
var data models.SysMenu
db := e.Orm.Model(&data).Delete(&data, d.Ids)
if err = db.Error; err != nil {
err = db.Error
e.Log.Errorf("Delete error: %s", err)
_ = e.AddError(err)
}
if db.RowsAffected == 0 {
err = errors.New("无权删除该数据")
_ = e.AddError(err)
}
return e
}
// GetList 获取菜单数据
func (e *SysMenu) GetList(c *dto.SysMenuGetPageReq, list *[]models.SysMenu) error {
var err error
var data models.SysMenu
err = e.Orm.Model(&data).
Scopes(
cDto.MakeCondition(c.GetNeedSearch()),
).
Find(list).Error
if err != nil {
e.Log.Errorf("db error:%s", err)
return err
}
return nil
}
// SetLabel 修改角色中 设置菜单基础数据
func (e *SysMenu) SetLabel() (m []dto.MenuLabel, err error) {
var list []models.SysMenu
err = e.GetList(&dto.SysMenuGetPageReq{}, &list)
m = make([]dto.MenuLabel, 0)
for i := 0; i < len(list); i++ {
if list[i].ParentId != 0 {
continue
}
e := dto.MenuLabel{}
e.Id = list[i].MenuId
e.Label = list[i].Title
deptsInfo := menuLabelCall(&list, e)
m = append(m, deptsInfo)
}
return
}
// GetSysMenuByRoleName 左侧菜单
func (e *SysMenu) GetSysMenuByRoleName(roleName ...string) ([]models.SysMenu, error) {
var MenuList []models.SysMenu
var role models.SysRole
var err error
admin := false
for _, s := range roleName {
if s == "admin" {
admin = true
}
}
if len(roleName) > 0 && admin {
var data []models.SysMenu
err = e.Orm.Where(" menu_type in ('M','C')").
Order("sort").
Find(&data).
Error
MenuList = data
} else {
err = e.Orm.Model(&role).Preload("SysMenu", func(db *gorm.DB) *gorm.DB {
return db.Where(" menu_type in ('M','C')").Order("sort")
}).Where("role_name in ?", roleName).Find(&role).
Error
MenuList = *role.SysMenu
}
if err != nil {
e.Log.Errorf("db error:%s", err)
}
return MenuList, err
}
// menuLabelCall 递归构造组织数据
func menuLabelCall(eList *[]models.SysMenu, dept dto.MenuLabel) dto.MenuLabel {
list := *eList
min := make([]dto.MenuLabel, 0)
for j := 0; j < len(list); j++ {
if dept.Id != list[j].ParentId {
continue
}
mi := dto.MenuLabel{}
mi.Id = list[j].MenuId
mi.Label = list[j].Title
mi.Children = []dto.MenuLabel{}
if list[j].MenuType != "F" {
ms := menuLabelCall(eList, mi)
min = append(min, ms)
} else {
min = append(min, mi)
}
}
if len(min) > 0 {
dept.Children = min
} else {
dept.Children = nil
}
return dept
}
// menuCall 构建菜单树
func menuCall(menuList *[]models.SysMenu, menu models.SysMenu) models.SysMenu {
list := *menuList
min := make([]models.SysMenu, 0)
for j := 0; j < len(list); j++ {
if menu.MenuId != list[j].ParentId {
continue
}
mi := models.SysMenu{}
mi.MenuId = list[j].MenuId
mi.MenuName = list[j].MenuName
mi.Title = list[j].Title
mi.Icon = list[j].Icon
mi.Path = list[j].Path
mi.MenuType = list[j].MenuType
mi.Action = list[j].Action
mi.Permission = list[j].Permission
mi.ParentId = list[j].ParentId
mi.NoCache = list[j].NoCache
mi.Breadcrumb = list[j].Breadcrumb
mi.Component = list[j].Component
mi.Sort = list[j].Sort
mi.Visible = list[j].Visible
mi.CreatedAt = list[j].CreatedAt
mi.SysApi = list[j].SysApi
mi.Children = []models.SysMenu{}
if mi.MenuType != cModels.Button {
ms := menuCall(menuList, mi)
min = append(min, ms)
} else {
min = append(min, mi)
}
}
menu.Children = min
return menu
}
func menuDistinct(menuList []models.SysMenu) (result []models.SysMenu) {
distinctMap := make(map[int]struct{}, len(menuList))
for _, menu := range menuList {
if _, ok := distinctMap[menu.MenuId]; !ok {
distinctMap[menu.MenuId] = struct{}{}
result = append(result, menu)
}
}
return result
}
func recursiveSetMenu(orm *gorm.DB, mIds []int, menus *[]models.SysMenu) error {
if len(mIds) == 0 || menus == nil {
return nil
}
var subMenus []models.SysMenu
err := orm.Where(fmt.Sprintf(" menu_type in ('%s', '%s', '%s') and menu_id in ?",
cModels.Directory, cModels.Menu, cModels.Button), mIds).Order("sort").Find(&subMenus).Error
if err != nil {
return err
}
subIds := make([]int, 0)
for _, menu := range subMenus {
if menu.ParentId != 0 {
subIds = append(subIds, menu.ParentId)
}
if menu.MenuType != cModels.Button {
*menus = append(*menus, menu)
}
}
return recursiveSetMenu(orm, subIds, menus)
}
// SetMenuRole 获取左侧菜单树使用
func (e *SysMenu) SetMenuRole(roleName string) (m []models.SysMenu, err error) {
menus, err := e.getByRoleName(roleName)
m = make([]models.SysMenu, 0)
for i := 0; i < len(menus); i++ {
if menus[i].ParentId != 0 {
continue
}
menusInfo := menuCall(&menus, menus[i])
m = append(m, menusInfo)
}
return
}
func (e *SysMenu) getByRoleName(roleName string) ([]models.SysMenu, error) {
var role models.SysRole
var err error
data := make([]models.SysMenu, 0)
if roleName == "admin" {
err = e.Orm.Where(" menu_type in ('M','C') and deleted_at is null").
Order("sort").
Find(&data).
Error
err = errors.WithStack(err)
} else {
role.RoleKey = roleName
err = e.Orm.Model(&role).Where("role_key = ? ", roleName).Preload("SysMenu").First(&role).Error
if role.SysMenu != nil {
mIds := make([]int, 0)
for _, menu := range *role.SysMenu {
mIds = append(mIds, menu.MenuId)
}
if err := recursiveSetMenu(e.Orm, mIds, &data); err != nil {
return nil, err
}
data = menuDistinct(data)
}
}
sort.Sort(models.SysMenuSlice(data))
return data, err
}

View File

@ -0,0 +1,83 @@
package service
import (
"errors"
"go-admin/app/admin/models"
"go-admin/app/admin/service/dto"
cDto "go-admin/common/dto"
"github.com/go-admin-team/go-admin-core/sdk/service"
"gorm.io/gorm"
)
type SysOperaLog struct {
service.Service
}
// GetPage 获取SysOperaLog列表
func (e *SysOperaLog) GetPage(c *dto.SysOperaLogGetPageReq, list *[]models.SysOperaLog, count *int64) error {
var err error
var data models.SysOperaLog
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 {
e.Log.Errorf("Service GetSysOperaLogPage error:%s", err.Error())
return err
}
return nil
}
// Get 获取SysOperaLog对象
func (e *SysOperaLog) Get(d *dto.SysOperaLogGetReq, model *models.SysOperaLog) error {
var data models.SysOperaLog
err := e.Orm.Model(&data).
First(model, d.GetId()).Error
if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
err = errors.New("查看对象不存在或无权查看")
e.Log.Errorf("Service GetSysOperaLog error:%s", err.Error())
return err
}
if err != nil {
e.Log.Errorf("Service GetSysOperaLog error:%s", err.Error())
return err
}
return nil
}
// Insert 创建SysOperaLog对象
func (e *SysOperaLog) Insert(model *models.SysOperaLog) error {
var err error
var data models.SysOperaLog
err = e.Orm.Model(&data).
Create(model).Error
if err != nil {
e.Log.Errorf("Service InsertSysOperaLog error:%s", err.Error())
return err
}
return nil
}
// Remove 删除SysOperaLog
func (e *SysOperaLog) Remove(d *dto.SysOperaLogDeleteReq) error {
var err error
var data models.SysOperaLog
db := e.Orm.Model(&data).Delete(&data, d.GetId())
if err = db.Error; err != nil {
e.Log.Errorf("Service RemoveSysOperaLog error:%s", err.Error())
return err
}
if db.RowsAffected == 0 {
return errors.New("无权删除该数据")
}
return nil
}

View File

@ -0,0 +1,105 @@
package service
import (
"errors"
"github.com/go-admin-team/go-admin-core/sdk/service"
"gorm.io/gorm"
"go-admin/app/admin/models"
"go-admin/app/admin/service/dto"
cDto "go-admin/common/dto"
)
type SysPost struct {
service.Service
}
// GetPage 获取SysPost列表
func (e *SysPost) GetPage(c *dto.SysPostPageReq, list *[]models.SysPost, count *int64) error {
var err error
var data models.SysPost
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 {
e.Log.Errorf("db error:%s \r", err)
return err
}
return nil
}
// Get 获取SysPost对象
func (e *SysPost) Get(d *dto.SysPostGetReq, model *models.SysPost) error {
var err error
var data models.SysPost
db := e.Orm.Model(&data).
First(model, d.GetId())
err = db.Error
if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
err = errors.New("查看对象不存在或无权查看")
e.Log.Errorf("db error:%s", err)
return err
}
if err = db.Error; err != nil {
e.Log.Errorf("db error:%s", err)
return err
}
return nil
}
// Insert 创建SysPost对象
func (e *SysPost) Insert(c *dto.SysPostInsertReq) error {
var err error
var data models.SysPost
c.Generate(&data)
err = e.Orm.Create(&data).Error
if err != nil {
e.Log.Errorf("db error:%s", err)
return err
}
return nil
}
// Update 修改SysPost对象
func (e *SysPost) Update(c *dto.SysPostUpdateReq) error {
var err error
var model = models.SysPost{}
e.Orm.First(&model, c.GetId())
c.Generate(&model)
db := e.Orm.Save(&model)
if err = db.Error; err != nil {
e.Log.Errorf("db error:%s", err)
return err
}
if db.RowsAffected == 0 {
return errors.New("无权更新该数据")
}
return nil
}
// Remove 删除SysPost
func (e *SysPost) Remove(d *dto.SysPostDeleteReq) error {
var err error
var data models.SysPost
db := e.Orm.Model(&data).Delete(&data, d.GetId())
if err = db.Error; err != nil {
err = db.Error
e.Log.Errorf("Delete error: %s", err)
return err
}
if db.RowsAffected == 0 {
err = errors.New("无权删除该数据")
return err
}
return nil
}

View File

@ -0,0 +1,352 @@
package service
import (
"errors"
"github.com/go-admin-team/go-admin-core/sdk/config"
"gorm.io/gorm/clause"
"github.com/casbin/casbin/v2"
"github.com/go-admin-team/go-admin-core/sdk/service"
"gorm.io/gorm"
"go-admin/app/admin/models"
"go-admin/app/admin/service/dto"
cDto "go-admin/common/dto"
)
type SysRole struct {
service.Service
}
// GetPage 获取SysRole列表
func (e *SysRole) GetPage(c *dto.SysRoleGetPageReq, list *[]models.SysRole, count *int64) error {
var err error
var data models.SysRole
err = e.Orm.Model(&data).Preload("SysMenu").
Scopes(
cDto.MakeCondition(c.GetNeedSearch()),
cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
).
Find(list).Limit(-1).Offset(-1).
Count(count).Error
if err != nil {
e.Log.Errorf("db error:%s", err)
return err
}
return nil
}
// Get 获取SysRole对象
func (e *SysRole) Get(d *dto.SysRoleGetReq, model *models.SysRole) error {
var err error
db := e.Orm.First(model, d.GetId())
err = db.Error
if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
err = errors.New("查看对象不存在或无权查看")
e.Log.Errorf("db error:%s", err)
return err
}
if err != nil {
e.Log.Errorf("db error:%s", err)
return err
}
model.MenuIds, err = e.GetRoleMenuId(model.RoleId)
if err != nil {
e.Log.Errorf("get menuIds error, %s", err.Error())
return err
}
return nil
}
// Insert 创建SysRole对象
func (e *SysRole) Insert(c *dto.SysRoleInsertReq, cb *casbin.SyncedEnforcer) error {
var err error
var data models.SysRole
var dataMenu []models.SysMenu
err = e.Orm.Preload("SysApi").Where("menu_id in ?", c.MenuIds).Find(&dataMenu).Error
if err != nil {
e.Log.Errorf("db error:%s", err)
return err
}
c.SysMenu = dataMenu
c.Generate(&data)
tx := e.Orm
if config.DatabaseConfig.Driver != "sqlite3" {
tx := e.Orm.Begin()
defer func() {
if err != nil {
tx.Rollback()
} else {
tx.Commit()
}
}()
}
var count int64
err = tx.Model(&data).Where("role_key = ?", c.RoleKey).Count(&count).Error
if err != nil {
e.Log.Errorf("db error:%s", err)
return err
}
if count > 0 {
err = errors.New("roleKey已存在需更换在提交")
e.Log.Errorf("db error:%s", err)
return err
}
err = tx.Create(&data).Error
if err != nil {
e.Log.Errorf("db error:%s", err)
return err
}
mp := make(map[string]interface{}, 0)
polices := make([][]string, 0)
for _, menu := range dataMenu {
for _, api := range menu.SysApi {
if mp[data.RoleKey+"-"+api.Path+"-"+api.Action] != "" {
mp[data.RoleKey+"-"+api.Path+"-"+api.Action] = ""
polices = append(polices, []string{data.RoleKey, api.Path, api.Action})
}
}
}
if len(polices) <= 0 {
return nil
}
// 写入 sys_casbin_rule 权限表里 当前角色数据的记录
_, err = cb.AddNamedPolicies("p", polices)
if err != nil {
return err
}
return nil
}
// Update 修改SysRole对象
func (e *SysRole) Update(c *dto.SysRoleUpdateReq, cb *casbin.SyncedEnforcer) error {
var err error
tx := e.Orm
if config.DatabaseConfig.Driver != "sqlite3" {
tx := e.Orm.Begin()
defer func() {
if err != nil {
tx.Rollback()
} else {
tx.Commit()
}
}()
}
var model = models.SysRole{}
var mlist = make([]models.SysMenu, 0)
tx.Preload("SysMenu").First(&model, c.GetId())
tx.Preload("SysApi").Where("menu_id in ?", c.MenuIds).Find(&mlist)
err = tx.Model(&model).Association("SysMenu").Delete(model.SysMenu)
if err != nil {
e.Log.Errorf("delete policy error:%s", err)
return err
}
c.Generate(&model)
model.SysMenu = &mlist
// 更新关联的数据,使用 FullSaveAssociations 模式
db := tx.Session(&gorm.Session{FullSaveAssociations: true}).Debug().Save(&model)
if err = db.Error; err != nil {
e.Log.Errorf("db error:%s", err)
return err
}
if db.RowsAffected == 0 {
return errors.New("无权更新该数据")
}
// 清除 sys_casbin_rule 权限表里 当前角色的所有记录
_, err = cb.RemoveFilteredPolicy(0, model.RoleKey)
if err != nil {
e.Log.Errorf("delete policy error:%s", err)
return err
}
mp := make(map[string]interface{}, 0)
polices := make([][]string, 0)
for _, menu := range mlist {
for _, api := range menu.SysApi {
if mp[model.RoleKey+"-"+api.Path+"-"+api.Action] != "" {
mp[model.RoleKey+"-"+api.Path+"-"+api.Action] = ""
//_, err = cb.AddNamedPolicy("p", model.RoleKey, api.Path, api.Action)
polices = append(polices, []string{model.RoleKey, api.Path, api.Action})
}
}
}
if len(polices) <= 0 {
return nil
}
// 写入 sys_casbin_rule 权限表里 当前角色数据的记录
_, err = cb.AddNamedPolicies("p", polices)
if err != nil {
return err
}
return nil
}
// Remove 删除SysRole
func (e *SysRole) Remove(c *dto.SysRoleDeleteReq, cb *casbin.SyncedEnforcer) error {
var err error
tx := e.Orm
if config.DatabaseConfig.Driver != "sqlite3" {
tx := e.Orm.Begin()
defer func() {
if err != nil {
tx.Rollback()
} else {
tx.Commit()
}
}()
}
var model = models.SysRole{}
tx.Preload("SysMenu").Preload("SysDept").First(&model, c.GetId())
//删除 SysRole 时,同时删除角色所有 关联其它表 记录 (SysMenu 和 SysMenu)
db := tx.Select(clause.Associations).Delete(&model)
if err = db.Error; err != nil {
e.Log.Errorf("db error:%s", err)
return err
}
if db.RowsAffected == 0 {
return errors.New("无权更新该数据")
}
// 清除 sys_casbin_rule 权限表里 当前角色的所有记录
_, _ = cb.RemoveFilteredPolicy(0, model.RoleKey)
return nil
}
// GetRoleMenuId 获取角色对应的菜单ids
func (e *SysRole) GetRoleMenuId(roleId int) ([]int, error) {
menuIds := make([]int, 0)
model := models.SysRole{}
model.RoleId = roleId
if err := e.Orm.Model(&model).Preload("SysMenu").First(&model).Error; err != nil {
return nil, err
}
l := *model.SysMenu
for i := 0; i < len(l); i++ {
menuIds = append(menuIds, l[i].MenuId)
}
return menuIds, nil
}
func (e *SysRole) UpdateDataScope(c *dto.RoleDataScopeReq) *SysRole {
var err error
tx := e.Orm
if config.DatabaseConfig.Driver != "sqlite3" {
tx := e.Orm.Begin()
defer func() {
if err != nil {
tx.Rollback()
} else {
tx.Commit()
}
}()
}
var dlist = make([]models.SysDept, 0)
var model = models.SysRole{}
tx.Preload("SysDept").First(&model, c.RoleId)
tx.Where("dept_id in ?", c.DeptIds).Find(&dlist)
// 删除SysRole 和 SysDept 的关联关系
err = tx.Model(&model).Association("SysDept").Delete(model.SysDept)
if err != nil {
e.Log.Errorf("delete SysDept error:%s", err)
_ = e.AddError(err)
return e
}
c.Generate(&model)
model.SysDept = dlist
// 更新关联的数据,使用 FullSaveAssociations 模式
db := tx.Model(&model).Session(&gorm.Session{FullSaveAssociations: true}).Debug().Save(&model)
if err = db.Error; err != nil {
e.Log.Errorf("db error:%s", err)
_ = e.AddError(err)
return e
}
if db.RowsAffected == 0 {
_ = e.AddError(errors.New("无权更新该数据"))
return e
}
return e
}
// UpdateStatus 修改SysRole对象status
func (e *SysRole) UpdateStatus(c *dto.UpdateStatusReq) error {
var err error
tx := e.Orm
if config.DatabaseConfig.Driver != "sqlite3" {
tx := e.Orm.Begin()
defer func() {
if err != nil {
tx.Rollback()
} else {
tx.Commit()
}
}()
}
var model = models.SysRole{}
tx.First(&model, c.GetId())
c.Generate(&model)
// 更新关联的数据,使用 FullSaveAssociations 模式
db := tx.Session(&gorm.Session{FullSaveAssociations: true}).Debug().Save(&model)
if err = db.Error; err != nil {
e.Log.Errorf("db error:%s", err)
return err
}
if db.RowsAffected == 0 {
return errors.New("无权更新该数据")
}
return nil
}
// GetWithName 获取SysRole对象
func (e *SysRole) GetWithName(d *dto.SysRoleByName, model *models.SysRole) *SysRole {
var err error
db := e.Orm.Where("role_name = ?", d.RoleName).First(model)
err = db.Error
if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
err = errors.New("查看对象不存在或无权查看")
e.Log.Errorf("db error:%s", err)
_ = e.AddError(err)
return e
}
if err != nil {
e.Log.Errorf("db error:%s", err)
_ = e.AddError(err)
return e
}
model.MenuIds, err = e.GetRoleMenuId(model.RoleId)
if err != nil {
e.Log.Errorf("get menuIds error, %s", err.Error())
_ = e.AddError(err)
return e
}
return e
}
// GetById 获取SysRole对象
func (e *SysRole) GetById(roleId int) ([]string, error) {
permissions := make([]string, 0)
model := models.SysRole{}
model.RoleId = roleId
if err := e.Orm.Model(&model).Preload("SysMenu").First(&model).Error; err != nil {
return nil, err
}
l := *model.SysMenu
for i := 0; i < len(l); i++ {
if l[i].Permission != "" {
permissions = append(permissions, l[i].Permission)
}
}
return permissions, nil
}

View File

@ -0,0 +1,110 @@
package service
import (
"github.com/go-admin-team/go-admin-core/sdk/service"
)
// SysRoleMenu 即将弃用结构体
type SysRoleMenu struct {
service.Service
}
//func (e *SysRoleMenu) ReloadRule(tx *gorm.DB, roleId int, menuId []int) (err error) {
// var role models.SysRole
//
// msgID := e.MsgID
//
// menu := make([]models.Menu, 0)
// roleMenu := make([]models.RoleMenu, len(menuId))
// casbinRule := make([]models.CasbinRule, 0)
// //先删除所有的
// err = e.DeleteRoleMenu(tx, roleId)
// if err != nil {
// return
// }
//
// // 在事务中做一些数据库操作(从这一点使用'tx',而不是'db'
// err = tx.Where("role_id = ?", roleId).First(&role).Error
// if err != nil {
// log.Errorf("msgID[%s] get role error, %s", msgID, err.Error())
// return
// }
// err = tx.Where("menu_id in (?)", menuId).
// //Select("path, action, menu_id, menu_type").
// Find(&menu).Error
// if err != nil {
// log.Errorf("msgID[%s] get menu error, %s", msgID, err.Error())
// return
// }
// for i := range menu {
// roleMenu[i] = models.RoleMenu{
// RoleId: role.RoleId,
// MenuId: menu[i].MenuId,
// RoleName: role.RoleKey,
// }
// if menu[i].MenuType == "A" {
// casbinRule = append(casbinRule, models.CasbinRule{
// PType: "p",
// V0: role.RoleKey,
// V1: menu[i].Path,
// V2: menu[i].Action,
// })
// }
// }
// err = tx.Create(&roleMenu).Error
// if err != nil {
// log.Errorf("msgID[%s] batch create role's menu error, %s", msgID, err.Error())
// return
// }
// if len(casbinRule) > 0 {
// err = tx.Create(&casbinRule).Error
// if err != nil {
// log.Errorf("msgID[%s] batch create casbin rule error, %s", msgID, err.Error())
// return
// }
// }
//
// return
//}
//func (e *SysRoleMenu) DeleteRoleMenu(tx *gorm.DB, roleId int) (err error) {
// msgID := e.MsgID
// err = tx.Where("role_id = ?", roleId).
// Delete(&models.SysRoleDept{}).Error
// if err != nil {
// log.Errorf("msgID[%s] delete role's dept error, %s", msgID, err.Error())
// return
// }
// err = tx.Where("role_id = ?", roleId).
// Delete(&models.RoleMenu{}).Error
// if err != nil {
// log.Errorf("msgID[%s] delete role's menu error, %s", msgID, err.Error())
// return
// }
// var role models.SysRole
// err = tx.Where("role_id = ?", roleId).
// First(&role).Error
// if err != nil {
// log.Errorf("msgID[%s] get role error, %s", msgID, err.Error())
// return
// }
// err = tx.Where("v0 = ?", role.RoleKey).
// Delete(&models.CasbinRule{}).Error
// if err != nil {
// log.Errorf("msgID[%s] delete casbin rule error, %s", msgID, err.Error())
// return
// }
// return
//}
//
//func (e *SysRoleMenu) GetIDS(tx *gorm.DB, roleName string) ([]models.MenuPath, error) {
// var r []models.MenuPath
// table := tx.Select("sys_menu.path").Table("sys_role_menu")
// table = table.Joins("left join sys_role on sys_role.role_id=sys_role_menu.role_id")
// table = table.Joins("left join sys_menu on sys_menu.id=sys_role_menu.menu_id")
// table = table.Where("sys_role.role_name = ? and sys_menu.type=1", roleName)
// if err := table.Find(&r).Error; err != nil {
// return nil, err
// }
// return r, nil
//}

View File

@ -0,0 +1,338 @@
package service
import (
"errors"
"fmt"
"go-admin/app/admin/models"
"go-admin/app/admin/service/dto"
"go-admin/utils/redishelper"
"github.com/bytedance/sonic"
log "github.com/go-admin-team/go-admin-core/logger"
"github.com/go-admin-team/go-admin-core/sdk/pkg"
"github.com/go-admin-team/go-admin-core/sdk/service"
"gorm.io/gorm"
"go-admin/common/actions"
cDto "go-admin/common/dto"
rediskey "go-admin/common/redis_key"
)
type SysUser struct {
service.Service
}
func (e SysUser) GetByIds(userIds []int) ([]models.SysUser, error) {
result := make([]models.SysUser, 0)
if err := e.Orm.Model(models.SysUser{}).Where("user_id in ?", userIds).Find(&result).Error; err != nil {
return nil, err
}
return result, nil
}
// GetPage 获取SysUser列表
func (e *SysUser) GetPage(c *dto.SysUserGetPageReq, p *actions.DataPermission, list *[]models.SysUser, count *int64) error {
var err error
var data models.SysUser
err = e.Orm.Debug().Preload("Dept").
Scopes(
cDto.MakeCondition(c.GetNeedSearch()),
cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
actions.Permission(data.TableName(), p),
).
Find(list).Limit(-1).Offset(-1).
Count(count).Error
if err != nil {
e.Log.Errorf("db error: %s", err)
return err
}
return nil
}
// Get 获取SysUser对象
func (e *SysUser) Get(d *dto.SysUserById, p *actions.DataPermission, model *models.SysUser) error {
var data models.SysUser
err := e.Orm.Model(&data).Debug().
Scopes(
actions.Permission(data.TableName(), p),
).
First(model, d.GetId()).Error
if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
err = errors.New("查看对象不存在或无权查看")
e.Log.Errorf("db error: %s", err)
return err
}
if err != nil {
e.Log.Errorf("db error: %s", err)
return err
}
return nil
}
// Insert 创建SysUser对象
func (e *SysUser) Insert(c *dto.SysUserInsertReq) error {
var err error
var data models.SysUser
var role models.SysRole
var i int64
e.Orm.Model(role).Where("role_id = ?", c.RoleId).Find(&role)
if role.RoleId == 0 {
err = errors.New("角色不存在")
}
err = e.Orm.Model(&data).Where("username = ?", c.Username).Count(&i).Error
if err != nil {
e.Log.Errorf("db error: %s", err)
return err
}
if i > 0 {
err := errors.New("用户名已存在!")
e.Log.Errorf("db error: %s", err)
return err
}
c.Generate(&data)
memberService := TmMember{}
memberData := models.TmMember{}
err = e.Orm.Transaction(func(tx *gorm.DB) error {
if err1 := tx.Create(&data).Error; err1 != nil {
return err1
}
//普通用户需要新增 用户翻译信息表
if role.RoleKey == "normal_member" {
memberService.Orm = tx
memberService.Log = e.Log
memberReq := dto.TmMemberSyncInsertReq{
UserId: data.UserId,
NickName: data.NickName,
Mobile: data.Phone,
Email: data.Email,
}
err1 := memberService.SyncInsert(&memberReq, &memberData)
if err1 != nil {
return err1
}
}
return nil
})
if err != nil {
e.Log.Errorf("db error: %s", err)
return err
}
key := fmt.Sprintf(rediskey.TM_MEMBER_BY_KEY, memberData.ApiKey)
val, _ := sonic.MarshalString(memberData)
if val != "" {
redishelper.DefaultRedis.SetString(key, val)
}
return nil
}
// Update 修改SysUser对象
func (e *SysUser) Update(c *dto.SysUserUpdateReq, p *actions.DataPermission) error {
var err error
var model models.SysUser
db := e.Orm.Scopes(
actions.Permission(model.TableName(), p),
).First(&model, c.GetId())
if err = db.Error; err != nil {
e.Log.Errorf("Service UpdateSysUser error: %s", err)
return err
}
if db.RowsAffected == 0 {
return errors.New("无权更新该数据")
}
c.Generate(&model)
update := e.Orm.Model(&model).Where("user_id = ?", &model.UserId).Omit("password", "salt").Updates(&model)
if err = update.Error; err != nil {
e.Log.Errorf("db error: %s", err)
return err
}
if update.RowsAffected == 0 {
err = errors.New("update userinfo error")
log.Warnf("db update error")
return err
}
return nil
}
// UpdateAvatar 更新用户头像
func (e *SysUser) UpdateAvatar(c *dto.UpdateSysUserAvatarReq, p *actions.DataPermission) error {
var err error
var model models.SysUser
db := e.Orm.Scopes(
actions.Permission(model.TableName(), p),
).First(&model, c.GetId())
if err = db.Error; err != nil {
e.Log.Errorf("Service UpdateSysUser error: %s", err)
return err
}
if db.RowsAffected == 0 {
return errors.New("无权更新该数据")
}
err = e.Orm.Table(model.TableName()).Where("user_id =? ", c.UserId).Updates(c).Error
if err != nil {
e.Log.Errorf("Service UpdateSysUser error: %s", err)
return err
}
return nil
}
// UpdateStatus 更新用户状态
func (e *SysUser) UpdateStatus(c *dto.UpdateSysUserStatusReq, p *actions.DataPermission) error {
var err error
var model models.SysUser
db := e.Orm.Scopes(
actions.Permission(model.TableName(), p),
).First(&model, c.GetId())
if err = db.Error; err != nil {
e.Log.Errorf("Service UpdateSysUser error: %s", err)
return err
}
if db.RowsAffected == 0 {
return errors.New("无权更新该数据")
}
err = e.Orm.Table(model.TableName()).Where("user_id =? ", c.UserId).Updates(c).Error
if err != nil {
e.Log.Errorf("Service UpdateSysUser error: %s", err)
return err
}
return nil
}
// ResetPwd 重置用户密码
func (e *SysUser) ResetPwd(c *dto.ResetSysUserPwdReq, p *actions.DataPermission) error {
var err error
var model models.SysUser
db := e.Orm.Scopes(
actions.Permission(model.TableName(), p),
).First(&model, c.GetId())
if err = db.Error; err != nil {
e.Log.Errorf("At Service ResetSysUserPwd error: %s", err)
return err
}
if db.RowsAffected == 0 {
return errors.New("无权更新该数据")
}
c.Generate(&model)
err = e.Orm.Omit("username", "nick_name", "phone", "role_id", "avatar", "sex").Save(&model).Error
if err != nil {
e.Log.Errorf("At Service ResetSysUserPwd error: %s", err)
return err
}
return nil
}
// Remove 删除SysUser
func (e *SysUser) Remove(c *dto.SysUserById, p *actions.DataPermission) error {
var err error
var data models.SysUser
memberService := TmMember{}
err = e.Orm.Transaction(func(tx *gorm.DB) error {
db := tx.Model(&data).
Scopes(
actions.Permission(data.TableName(), p),
).Delete(&data, c.GetId())
if err = db.Error; err != nil {
e.Log.Errorf("Error found in RemoveSysUser : %s", err)
return err
}
if db.RowsAffected == 0 {
return errors.New("无权删除该数据")
}
memberService.Orm = tx
memberService.Log = e.Log
if err := memberService.RemoveByUserIds(c.Ids); err != nil {
e.Log.Errorf("删除翻译账户失败:", err)
return err
}
return nil
})
return err
}
// UpdatePwd 修改SysUser对象密码
func (e *SysUser) UpdatePwd(id int, oldPassword, newPassword string, p *actions.DataPermission) error {
var err error
if newPassword == "" {
return nil
}
c := &models.SysUser{}
err = e.Orm.Model(c).
Scopes(
actions.Permission(c.TableName(), p),
).Select("UserId", "Password", "Salt").
First(c, id).Error
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return errors.New("无权更新该数据")
}
e.Log.Errorf("db error: %s", err)
return err
}
var ok bool
ok, err = pkg.CompareHashAndPassword(c.Password, oldPassword)
if err != nil {
e.Log.Errorf("CompareHashAndPassword error, %s", err.Error())
return err
}
if !ok {
err = errors.New("incorrect Password")
e.Log.Warnf("user[%d] %s", id, err.Error())
return err
}
c.Password = newPassword
db := e.Orm.Model(c).Where("user_id = ?", id).
Select("Password", "Salt").
Updates(c)
if err = db.Error; err != nil {
e.Log.Errorf("db error: %s", err)
return err
}
if db.RowsAffected == 0 {
err = errors.New("set password error")
log.Warnf("db update error")
return err
}
return nil
}
func (e *SysUser) GetProfile(c *dto.SysUserById, user *models.SysUser, roles *[]models.SysRole, posts *[]models.SysPost) error {
err := e.Orm.Preload("Dept").First(user, c.GetId()).Error
if err != nil {
return err
}
err = e.Orm.Find(roles, user.RoleId).Error
if err != nil {
return err
}
err = e.Orm.Find(posts, user.PostIds).Error
if err != nil {
return err
}
return nil
}

View File

@ -0,0 +1,680 @@
package service
import (
"errors"
"fmt"
"strconv"
"strings"
"time"
"github.com/bytedance/sonic"
"github.com/go-admin-team/go-admin-core/sdk/service"
"github.com/go-redis/redis/v8"
"github.com/jinzhu/copier"
"gorm.io/gorm"
"go-admin/app/admin/models"
"go-admin/app/admin/service/dto"
"go-admin/common/actions"
cDto "go-admin/common/dto"
rediskey "go-admin/common/redis_key"
"go-admin/utils/redishelper"
"go-admin/utils/utility"
)
type TmMember struct {
service.Service
}
func (e TmMember) GetUserPlatforms(userId int, resp *[]dto.TmMemberPlatformFrontedResp) error {
var datas []models.TmMemberPlatform
var memberAccount models.TmMember
if err := e.Orm.Model(&memberAccount).
Find(&memberAccount).Error; err != nil {
return err
}
err := e.Orm.Model(&models.TmMemberPlatform{}).
Where(" member_id=?", memberAccount.Id).
Find(&datas).Error
if err != nil {
return err
}
platformService := TmPlatform{Service: e.Service}
for _, item := range datas {
dataItem := dto.TmMemberPlatformFrontedResp{}
copier.Copy(&dataItem, &item)
platform, _ := platformService.GetByKey(item.PlatformKey)
dataItem.ApiKey = memberAccount.ApiKey
dataItem.Name = platform.ShowName
dataItem.Price = int(platform.Price.IntPart())
dataItem.RemainChars, _ = e.GetRemainCount(item.PlatformKey, dataItem.ApiKey)
*resp = append(*resp, dataItem)
}
return nil
}
// GetPage 获取TmMember列表
func (e *TmMember) GetPage(c *dto.TmMemberGetPageReq, p *actions.DataPermission, list *[]dto.TmMemberResp, count *int64) error {
var err error
var data models.TmMember
var datas []models.TmMember
err = e.Orm.Model(&data).
Joins("join sys_user on sys_user.user_id = tm_member.user_id ").
Scopes(
cDto.MakeCondition(c.GetNeedSearch()),
cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
actions.Permission(data.TableName(), p),
).
Select("tm_member.id,tm_member.api_key,tm_member.total_chars,tm_member.remain_chars,tm_member.status,tm_member.created_at,sys_user.status as userStatus,sys_user.nick_name,sys_user.user_id").
Find(&datas).Limit(-1).Offset(-1).
Count(count).Error
if err != nil {
e.Log.Errorf("TmMemberService GetPage error:%s \r\n", err)
return err
}
userIds := []int{}
for _, item := range datas {
if !utility.ContainsInt(userIds, item.UserId) {
userIds = append(userIds, item.UserId)
}
}
platformService := TmPlatform{Service: e.Service}
userService := SysUser{Service: e.Service}
users, _ := userService.GetByIds(userIds)
activeList, _ := platformService.GetActiveList()
for _, item := range datas {
dataItem := dto.TmMemberResp{}
copier.Copy(&dataItem, &item)
// count, _ := e.GetRemainCount(,dataItem.ApiKey)
dataItem.ApiKey = utility.DesensitizeGeneric(dataItem.ApiKey, 2, 2, '*')
// dataItem.RemainChars = count
for _, user := range users {
if user.UserId == item.UserId {
dataItem.UserStatus, _ = strconv.Atoi(user.Status)
}
}
for _, platform := range activeList {
platformItem := dto.TmMemberPlatformResp{}
platformItem.Name = platform.Name
platformItem.RemainChars, _ = e.GetRemainCount(platform.Code, item.ApiKey)
dataItem.Platforms = append(dataItem.Platforms, platformItem)
}
*list = append(*list, dataItem)
}
return nil
}
// Get 获取TmMember对象
func (e *TmMember) Get(d *dto.TmMemberGetReq, p *actions.DataPermission, model *models.TmMember) error {
var data models.TmMember
err := e.Orm.Model(&data).
Scopes(
actions.Permission(data.TableName(), p),
).
First(model, d.GetId()).Error
if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
err = errors.New("查看对象不存在或无权查看")
e.Log.Errorf("Service GetTmMember error:%s \r\n", err)
return err
}
if err != nil {
e.Log.Errorf("db error:%s", err)
return err
}
return nil
}
// Insert 创建TmMember对象
func (e *TmMember) Insert(c *dto.TmMemberInsertReq, data *models.TmMember) error {
var err error
c.Generate(data)
apiKey, err := utility.GenerateBase62Key(32)
if err != nil {
return errors.New("生成apiKey失败")
}
data.ApiKey = apiKey
data.RemainChars = 10000
data.TotalChars = 10000
err = e.Orm.Create(data).Error
if err != nil {
e.Log.Errorf("TmMemberService Insert error:%s \r\n", err)
return err
}
return nil
}
// SaveCache 保存缓存
func (e *TmMember) SaveCache(data *models.TmMember) error {
key := fmt.Sprintf(rediskey.TM_MEMBER_BY_KEY, data.ApiKey)
val, err := sonic.MarshalString(data)
if err != nil {
return err
}
redishelper.DefaultRedis.SetString(key, val)
return nil
}
// SaveAllCache 保存所有缓存
func (e *TmMember) SaveAllCache() error {
var list []models.TmMember
if err := e.Orm.Model(&models.TmMember{}).
Joins("join sys_user on sys_user.user_id = tm_member.user_id").
Find(&list).Error; err != nil {
return err
}
for _, item := range list {
key := fmt.Sprintf(rediskey.TM_MEMBER_BY_KEY, item.ApiKey)
// remainKey := fmt.Sprintf(rediskey.TM_MEMBER_REMAIN_COUNT, item.ApiKey)
val, err := sonic.MarshalString(item)
if err != nil {
return err
}
redishelper.DefaultRedis.SetString(key, val)
// redishelper.DefaultRedis.SetString(remainKey, strconv.Itoa(item.RemainChars))
}
return nil
}
// Update 修改TmMember对象
func (e *TmMember) Update(c *dto.TmMemberUpdateReq, p *actions.DataPermission) error {
var err error
var data = models.TmMember{}
e.Orm.Scopes(
actions.Permission(data.TableName(), p),
).First(&data, c.GetId())
c.Generate(&data)
db := e.Orm.Save(&data)
if err = db.Error; err != nil {
e.Log.Errorf("TmMemberService Save error:%s \r\n", err)
return err
}
if db.RowsAffected == 0 {
return errors.New("无权更新该数据")
}
return nil
}
// Remove 删除TmMember
func (e *TmMember) Remove(d *dto.TmMemberDeleteReq, p *actions.DataPermission) error {
var data models.TmMember
db := e.Orm.Model(&data).
Scopes(
actions.Permission(data.TableName(), p),
).Delete(&data, d.GetId())
if err := db.Error; err != nil {
e.Log.Errorf("Service RemoveTmMember error:%s \r\n", err)
return err
}
if db.RowsAffected == 0 {
return errors.New("无权删除该数据")
}
return nil
}
func (e *TmMember) RemoveByUserIds(userIds []int) error {
data := make([]models.TmMember, 0)
if err := e.Orm.Model(&data).Where("user_id in ?", userIds).Find(&data).Error; err != nil {
return err
}
if err := e.Orm.Model(models.TmMember{}).Delete(&models.TmMember{}, "user_id in ?", userIds).Error; err != nil {
return err
}
for _, item := range data {
key := fmt.Sprintf(rediskey.TM_MEMBER_BY_KEY, item.ApiKey)
remainKey := fmt.Sprintf(rediskey.TM_MEMBER_REMAIN_COUNT, item.ApiKey, "*")
scanKeys, _ := redishelper.DefaultRedis.ScanKeys(remainKey)
redishelper.DefaultRedis.DeleteString(key)
for _, s := range scanKeys {
redishelper.DefaultRedis.DeleteString(s)
}
}
return nil
}
// SyncMemberRemain 同步剩余字符
func (e *TmMember) SyncMemberRemain() error {
scanKeys, err := redishelper.DefaultRedis.ScanKeys(fmt.Sprintf("%s*", rediskey.TM_MEMBER_REMAIN_COUNT_PURE))
if err != nil {
return err
}
members := e.getCacheMembers()
datas := make([]models.TmMemberPlatform, 0)
for _, key := range scanKeys {
items := strings.Split(key, ":")
apiKey := items[len(items)-2]
platform := items[len(items)-1]
val, err := redishelper.DefaultRedis.GetString(key)
remainCount, err1 := strconv.Atoi(val)
if err != nil || err1 != nil {
e.Log.Errorf("TmMemberService SyncMemberRemain GetString error:%s \r\n err1:%s \r\n", err, err1)
continue
}
if member := members[apiKey]; member.Id > 0 {
item := models.TmMemberPlatform{}
item.Id = member.Id
item.RemainingCharacter = remainCount
item.PlatformKey = platform
datas = append(datas, item)
}
}
arrayData := utility.SplitSlice(datas, 1000)
for _, dataBatch := range arrayData {
// 遍历当前批次的所有记录,为每条记录单独执行 UPDATE
for _, record := range dataBatch {
stmt := `
UPDATE tm_member_platform
SET
remaining_character = ?,
updated_at = NOW()
WHERE platform_key = ? AND member_id = ?;
`
args := []interface{}{
record.RemainingCharacter,
record.PlatformKey,
record.Id,
}
// 执行单个 UPDATE 语句
if err := e.Orm.Exec(stmt, args...).Error; err != nil {
// 记录错误,但继续处理批次中的其他记录
e.Log.Errorf("TmMemberService SyncMemberRemain single Exec for PlatformKey %s, MemberID %d error: %s \r\n", record.PlatformKey, record.Id, err)
}
}
}
return nil
}
// SyncMemberDailyUsage 同步每日使用字符
func (e *TmMember) SyncMemberDailyUsage() error {
key := fmt.Sprintf("%s:%s*", rediskey.TM_MEMBER_DAILY_COUNT_PURE, time.Now().AddDate(0, 0, -1).Format("20060102"))
todayKey := fmt.Sprintf("%s:%s*", rediskey.TM_MEMBER_DAILY_COUNT_PURE, time.Now().Format("20060102"))
dailys := make([]models.TmMemberDailyUsage, 0)
members := e.getCacheMembers()
keys, err := redishelper.DefaultRedis.ScanKeys(key)
if err != nil {
e.Log.Errorf("TmMemberService SyncMemberDailyUsage ScanKeys error:%s \r\n", err)
return err
}
todayKeys, err := redishelper.DefaultRedis.ScanKeys(todayKey)
if err != nil {
e.Log.Errorf("TmMemberService SyncMemberDailyUsage ScanKeys error:%s \r\n", err)
return err
}
e.loadSyncData(keys, &members, &dailys)
e.loadSyncData(todayKeys, &members, &dailys)
arrayData := utility.SplitSlice(dailys, 1000)
for _, dataBatch := range arrayData {
// 构建批量插入 SQL
var (
valueStrings []string // 存储 ?, ?, ?, ? 这样的占位符字符串
valueArgs []interface{} // 存储所有参数值
)
// 循环当前批次的数据,构建 SQL 片段和参数
for _, record := range dataBatch {
// 为每一条记录添加 VALUES (?, ?, ?, ?) 部分
valueStrings = append(valueStrings, "(?, ?,?, ?)")
// 按照 SQL 语句中字段的顺序添加参数
valueArgs = append(valueArgs, record.MemberId)
valueArgs = append(valueArgs, record.PlatformId)
valueArgs = append(valueArgs, record.Date) // time.Time 会被 SQL 驱动正确处理为 DATE 类型
valueArgs = append(valueArgs, record.UseChars)
}
// 拼接完整的 SQL 语句
// 核心的 INSERT ... ON DUPLICATE KEY UPDATE 部分
stmt := fmt.Sprintf(`
INSERT INTO tm_member_daily_usage (member_id,platform_id, date, use_chars)
VALUES %s
ON DUPLICATE KEY UPDATE use_chars = VALUES(use_chars), updated_at = NOW();
`, strings.Join(valueStrings, ",")) // 用逗号连接所有的 VALUES 部分
// 执行批量 SQL
if execErr := e.Orm.Exec(stmt, valueArgs...).Error; execErr != nil {
e.Log.Errorf("TmMemberService SyncMemberDailyUsage Exec error:%s \r\n", execErr)
}
}
return nil
}
// 获取缓存memebr
func (e *TmMember) getCacheMembers() map[string]models.TmMember {
memberVals, _ := redishelper.DefaultRedis.GetAllKeysAndValues(fmt.Sprintf(rediskey.TM_MEMBER_BY_KEY, "*"))
members := map[string]models.TmMember{}
for _, val := range memberVals {
var member models.TmMember
err := sonic.UnmarshalString(val, &member)
if err != nil {
e.Log.Errorf("TmMemberService SyncMemberDailyUsage UnmarshalString error:%s \r\n", err)
continue
}
members[member.ApiKey] = member
}
return members
}
// 加载同步数据
func (e *TmMember) loadSyncData(keys []string, members *map[string]models.TmMember, dailys *[]models.TmMemberDailyUsage) {
platformService := TmPlatform{Service: e.Service}
for _, key := range keys {
items := strings.Split(key, ":")
apiKey := items[len(items)-2]
platform := items[len(items)-1]
if apiKey == "" {
continue
}
platformEntity, _ := platformService.GetByKey(platform)
if platformEntity.Id <= 0 {
e.Log.Error("TmMemberService SyncMemberDailyUsage platform not found", platform)
continue
}
keyVal, _ := redishelper.DefaultRedis.GetString(key)
count, err := strconv.Atoi(keyVal)
if err != nil {
e.Log.Errorf("TmMemberService SyncMemberDailyUsage GetString error:%s \r\n", err)
continue
}
if member := (*members)[apiKey]; member.Id > 0 {
date, err := time.Parse("20060102", items[1])
if err != nil {
e.Log.Errorf("同步每日使用字符 日期转换失败 Parse error:%s \r\n", err)
continue
}
*dailys = append(*dailys, models.TmMemberDailyUsage{
MemberId: (*members)[apiKey].Id,
UseChars: count,
Date: date,
PlatformId: platformEntity.Id,
})
}
}
}
// func (e *TmMember) GetMyApiKey(userId int) (dto.TranslateUserInfoResp, error) {
// var data models.TmMember
// resp := dto.TranslateUserInfoResp{}
// if err := e.Orm.Model(&data).Where("user_id = ?", userId).First(&data).Error; err != nil {
// e.Log.Errorf("TmMemberService GetMyApiKey error:%s \r\n", err)
// return resp, nil
// }
// var err error
// resp.UserApiKey = data.ApiKey
// resp.RemainChars, err = e.GetRemainCount(data.ApiKey)
// if err != nil {
// e.Log.Errorf("转换类型失败,error:%v", err)
// }
// return resp, nil
// }
// GetTranslateStatistic 获取翻译统计
func (e *TmMember) GetTranslateStatistic(userId int, list *[]dto.TranslateStatisticResp) error {
endDate := time.Now().Format("2006-01-02")
startDate := time.Now().AddDate(0, 0, -14).Format("2006-01-02")
var datas []models.TmMemberDailyUsage
if err := e.Orm.Model(&models.TmMemberDailyUsage{}).
Joins("join tm_member on tm_member.id = tm_member_daily_usage.member_id").
Where("tm_member.user_id = ? and date >= ? and date <= ?", userId, startDate, endDate).Find(&datas).Error; err != nil {
e.Log.Errorf("个人翻译统计 获取统计数据失败 error:%s \r\n", err)
return err
}
usageMap := make(map[string]int)
for _, usage := range datas {
// 如果同一天有多条记录(例如来自不同平台),则累加其字符数
usageMap[usage.Date.Format("2006-01-02")] += int(usage.UseChars)
}
resultList := make([]dto.TranslateStatisticResp, 0, 15)
currentDate := time.Now().AddDate(0, 0, -14) // 从15天前的日期开始
for i := 0; i < 15; i++ {
dateStr := currentDate.Format("2006-01-02")
// 从 map 中获取当天的总字符数,如果 map 中没有则默认为0
totalChars := usageMap[dateStr]
// 将数据添加到结果列表中
resultList = append(resultList, dto.TranslateStatisticResp{
TotalCount: totalChars,
Date: dateStr,
})
// 移动到下一天
currentDate = currentDate.AddDate(0, 0, 1)
}
// 将生成的列表赋值给传入的指针,以便调用者获取结果
*list = resultList
return nil
}
// 字符数充值
func (e *TmMember) Recharge(req *dto.TmMemberRechargeReq, p *actions.DataPermission, userId int) error {
data := models.TmMember{}
if err := e.GetById(req.Id, &data); err != nil {
return err
}
record := models.TmRechargeLog{}
record.UserId = data.UserId
record.MemberId = data.Id
record.CreateBy = userId
record.CreatedAt = time.Now()
record.TotalChars = req.TotalChars * 10000
if err := e.IncrBy(req.PlatformCode, data.ApiKey, record.TotalChars); err != nil {
e.Log.Errorf("TmMemberService Recharge IncrBy error:%s \r\n", err)
return errors.New("充值失败")
}
if err := e.Orm.Model(record).Create(&record).Error; err != nil {
if err2 := e.DecrBy(req.PlatformCode, data.ApiKey, record.TotalChars); err2 != nil {
e.Log.Errorf("充值失败 缓存重置失败 error:%s \r\n", err2)
}
e.Log.Errorf("TmMemberService Recharge Create error:%s \r\n", err)
return errors.New("充值失败")
}
return nil
}
// 获取可用字符数
func (e *TmMember) GetRemainCount(platformKey, apiKey string) (int, error) {
key := fmt.Sprintf(rediskey.TM_MEMBER_REMAIN_COUNT, apiKey, platformKey)
val, err := redishelper.DefaultRedis.GetString(key)
result := 0
if err != nil && !errors.Is(err, redis.Nil) {
return 0, err
}
if val != "" {
result, err = strconv.Atoi(val)
if err != nil {
return 0, err
}
}
if result == 0 {
var data models.TmMember
if err := e.Orm.Model(&data).Where("api_key = ?", apiKey).First(&data).Error; err != nil {
return 0, err
}
result = data.RemainChars
redishelper.DefaultRedis.SetString(key, strconv.Itoa(result))
}
return result, nil
}
// 增加字符
func (e *TmMember) IncrBy(platformKey, apiKey string, totalChars int) error {
remainCountKey := fmt.Sprintf(rediskey.TM_MEMBER_REMAIN_COUNT, apiKey, platformKey)
return redishelper.DefaultRedis.IncrBy(remainCountKey, int64(totalChars)).Err()
}
// 扣除字符
func (e *TmMember) DecrBy(platformKey, apiKey string, totalChars int) error {
remainCountKey := fmt.Sprintf(rediskey.TM_MEMBER_REMAIN_COUNT, apiKey, platformKey)
return redishelper.DefaultRedis.DecrBy(remainCountKey, int64(totalChars)).Err()
}
// 根据id获取数据
func (e *TmMember) GetById(id int, data *models.TmMember) error {
if err := e.Orm.Model(data).Where("id = ?", id).First(data).Error; err != nil {
return err
}
return nil
}
// 修改翻译用户状态
func (e TmMember) ChangeStatus(req *dto.TmMemberChangeStatusReq, p *actions.DataPermission) error {
var err error
var data = models.TmMember{}
e.Orm.Scopes(
actions.Permission(data.TableName(), p),
).Where("id = ?", req.Id).First(&data)
db := e.Orm.Model(data).Update("status", req.Status)
if err = db.Error; err != nil {
e.Log.Errorf("TmMemberService Save error:%s \r\n", err)
return err
}
if db.RowsAffected == 0 {
return errors.New("无权更新该数据")
}
data.Status = req.Status
val, _ := sonic.MarshalString(data)
if val != "" {
key := fmt.Sprintf(rediskey.TM_MEMBER_BY_KEY, data.ApiKey)
redishelper.DefaultRedis.SetString(key, val)
}
return nil
}
// 根据api key获取数据
func (e *TmMember) GetByKey(apiKey string) (models.TmMember, error) {
key := fmt.Sprintf(rediskey.TM_MEMBER_BY_KEY, apiKey)
val, _ := redishelper.DefaultRedis.GetString(key)
result := models.TmMember{}
if val != "" {
sonic.UnmarshalString(val, &result)
}
if result.Id == 0 {
if err := e.Orm.Model(&result).Where("api_key = ?", apiKey).First(&result).Error; err != nil {
return result, err
}
}
return result, nil
}
// 同步插入数据
func (e *TmMember) SyncInsert(req *dto.TmMemberSyncInsertReq, entity *models.TmMember) error {
platformService := TmPlatform{Service: e.Service}
activePlatforms, _ := platformService.GetActiveList()
TmMemberPlatforms := make([]models.TmMemberPlatform, 0)
copier.Copy(entity, req)
apiKey, err := utility.GenerateBase62Key(32)
if err != nil {
return errors.New("生成apiKey失败")
}
entity.ApiKey = apiKey
entity.CreatedAt = time.Now()
entity.Status = 1
if err := e.Orm.Save(entity).Error; err != nil {
return err
}
for _, platform := range activePlatforms {
item := models.TmMemberPlatform{
MemberId: entity.Id,
PlatformId: platform.Id,
PlatformKey: platform.Code,
Status: 1,
TotalCharacter: 10000,
RemainingCharacter: 10000,
}
TmMemberPlatforms = append(TmMemberPlatforms, item)
}
if err := e.Orm.Save(&TmMemberPlatforms).Error; err != nil {
return err
}
for _, platform := range TmMemberPlatforms {
e.IncrBy(platform.PlatformKey, entity.ApiKey, platform.RemainingCharacter)
}
return nil
}

View File

@ -0,0 +1,180 @@
package service
import (
"errors"
"time"
"github.com/go-admin-team/go-admin-core/sdk/service"
"gorm.io/gorm"
"go-admin/app/admin/models"
"go-admin/app/admin/service/dto"
"go-admin/common/actions"
cDto "go-admin/common/dto"
)
type TmMemberDailyUsage struct {
service.Service
}
// GetPage 获取TmMemberDailyUsage列表
func (e *TmMemberDailyUsage) GetPage(c *dto.TmMemberDailyUsageGetPageReq, p *actions.DataPermission, list *[]models.TmMemberDailyUsage, count *int64) error {
var err error
var data models.TmMemberDailyUsage
err = e.Orm.Model(&data).
Scopes(
cDto.MakeCondition(c.GetNeedSearch()),
cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
actions.Permission(data.TableName(), p),
).
Find(list).Limit(-1).Offset(-1).
Count(count).Error
if err != nil {
e.Log.Errorf("TmMemberDailyUsageService GetPage error:%s \r\n", err)
return err
}
return nil
}
// Get 获取TmMemberDailyUsage对象
func (e *TmMemberDailyUsage) Get(d *dto.TmMemberDailyUsageGetReq, p *actions.DataPermission, model *models.TmMemberDailyUsage) error {
var data models.TmMemberDailyUsage
err := e.Orm.Model(&data).
Scopes(
actions.Permission(data.TableName(), p),
).
First(model, d.GetId()).Error
if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
err = errors.New("查看对象不存在或无权查看")
e.Log.Errorf("Service GetTmMemberDailyUsage error:%s \r\n", err)
return err
}
if err != nil {
e.Log.Errorf("db error:%s", err)
return err
}
return nil
}
// Insert 创建TmMemberDailyUsage对象
func (e *TmMemberDailyUsage) Insert(c *dto.TmMemberDailyUsageInsertReq) error {
var err error
var data models.TmMemberDailyUsage
c.Generate(&data)
err = e.Orm.Create(&data).Error
if err != nil {
e.Log.Errorf("TmMemberDailyUsageService Insert error:%s \r\n", err)
return err
}
return nil
}
// Update 修改TmMemberDailyUsage对象
func (e *TmMemberDailyUsage) Update(c *dto.TmMemberDailyUsageUpdateReq, p *actions.DataPermission) error {
var err error
var data = models.TmMemberDailyUsage{}
e.Orm.Scopes(
actions.Permission(data.TableName(), p),
).First(&data, c.GetId())
c.Generate(&data)
db := e.Orm.Save(&data)
if err = db.Error; err != nil {
e.Log.Errorf("TmMemberDailyUsageService Save error:%s \r\n", err)
return err
}
if db.RowsAffected == 0 {
return errors.New("无权更新该数据")
}
return nil
}
// Remove 删除TmMemberDailyUsage
func (e *TmMemberDailyUsage) Remove(d *dto.TmMemberDailyUsageDeleteReq, p *actions.DataPermission) error {
var data models.TmMemberDailyUsage
db := e.Orm.Model(&data).
Scopes(
actions.Permission(data.TableName(), p),
).Delete(&data, d.GetId())
if err := db.Error; err != nil {
e.Log.Errorf("Service RemoveTmMemberDailyUsage error:%s \r\n", err)
return err
}
if db.RowsAffected == 0 {
return errors.New("无权删除该数据")
}
return nil
}
// 获取字符消耗折线图
func (e *TmMemberDailyUsage) GetStatistic(userId int, resp *dto.TmMemberPlatformStatisticResp) error {
startTime := time.Now().AddDate(0, 0, -14).Format("2006-01-02")
endTime := time.Now().Format("2006-01-02")
var datas []models.TmMemberDailyUsage
platformService := TmPlatform{Service: e.Service}
activeList, _ := platformService.GetActiveList()
respDatas := []dto.TmMemberPlatformStatisticItemResp{}
defaultData := []int{}
for i := 0; i <= 14; i++ {
date := time.Now().AddDate(0, 0, i-14).Format("2006-01-02")
resp.XAxis = append(resp.XAxis, date)
defaultData = append(defaultData, 0)
}
if err := e.Orm.Model(models.TmMemberDailyUsage{}).
Joins("JOIN tm_member on tm_member.id=tm_member_daily_usage.member_id").
Where("tm_member_daily_usage.date >= ? and tm_member_daily_usage.date <= ?", startTime, endTime).Find(&datas).Error; err != nil {
e.Log.Error("获取折线图数据失败", err)
return nil
}
if len(activeList) == 0 {
return nil
} else {
for _, platform := range activeList {
data := []int{}
for i := 0; i <= 14; i++ {
date := time.Now().AddDate(0, 0, i-14).Format("2006-01-02")
count := 0
for _, item := range datas {
if item.Date.Format("2006-01-02") == date && item.PlatformId == platform.Id {
count += item.UseChars
}
}
data = append(data, count)
}
respDatas = append(respDatas, dto.TmMemberPlatformStatisticItemResp{
PlatformName: platform.ShowName,
PlatformId: platform.Id,
Data: data,
})
}
}
//添加默认数据
for _, item := range activeList {
add := true
for _, respItem := range respDatas {
if item.Id == respItem.PlatformId {
add = false
break
}
}
if add {
respDatas = append(respDatas, dto.TmMemberPlatformStatisticItemResp{
PlatformName: item.ShowName,
PlatformId: item.Id,
Data: defaultData,
})
}
}
resp.Data = respDatas
return nil
}

View File

@ -0,0 +1,109 @@
package service
import (
"errors"
"github.com/go-admin-team/go-admin-core/sdk/service"
"gorm.io/gorm"
"go-admin/app/admin/models"
"go-admin/app/admin/service/dto"
"go-admin/common/actions"
cDto "go-admin/common/dto"
)
type TmMemberPlatform struct {
service.Service
}
// GetPage 获取TmMemberPlatform列表
func (e *TmMemberPlatform) GetPage(c *dto.TmMemberPlatformGetPageReq, p *actions.DataPermission, list *[]models.TmMemberPlatform, count *int64) error {
var err error
var data models.TmMemberPlatform
err = e.Orm.Model(&data).
Scopes(
cDto.MakeCondition(c.GetNeedSearch()),
cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
actions.Permission(data.TableName(), p),
).
Find(list).Limit(-1).Offset(-1).
Count(count).Error
if err != nil {
e.Log.Errorf("TmMemberPlatformService GetPage error:%s \r\n", err)
return err
}
return nil
}
// Get 获取TmMemberPlatform对象
func (e *TmMemberPlatform) Get(d *dto.TmMemberPlatformGetReq, p *actions.DataPermission, model *models.TmMemberPlatform) error {
var data models.TmMemberPlatform
err := e.Orm.Model(&data).
Scopes(
actions.Permission(data.TableName(), p),
).
First(model, d.GetId()).Error
if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
err = errors.New("查看对象不存在或无权查看")
e.Log.Errorf("Service GetTmMemberPlatform error:%s \r\n", err)
return err
}
if err != nil {
e.Log.Errorf("db error:%s", err)
return err
}
return nil
}
// Insert 创建TmMemberPlatform对象
func (e *TmMemberPlatform) Insert(c *dto.TmMemberPlatformInsertReq) error {
var err error
var data models.TmMemberPlatform
c.Generate(&data)
err = e.Orm.Create(&data).Error
if err != nil {
e.Log.Errorf("TmMemberPlatformService Insert error:%s \r\n", err)
return err
}
return nil
}
// Update 修改TmMemberPlatform对象
func (e *TmMemberPlatform) Update(c *dto.TmMemberPlatformUpdateReq, p *actions.DataPermission) error {
var err error
var data = models.TmMemberPlatform{}
e.Orm.Scopes(
actions.Permission(data.TableName(), p),
).First(&data, c.GetId())
c.Generate(&data)
db := e.Orm.Save(&data)
if err = db.Error; err != nil {
e.Log.Errorf("TmMemberPlatformService Save error:%s \r\n", err)
return err
}
if db.RowsAffected == 0 {
return errors.New("无权更新该数据")
}
return nil
}
// Remove 删除TmMemberPlatform
func (e *TmMemberPlatform) Remove(d *dto.TmMemberPlatformDeleteReq, p *actions.DataPermission) error {
var data models.TmMemberPlatform
db := e.Orm.Model(&data).
Scopes(
actions.Permission(data.TableName(), p),
).Delete(&data, d.GetId())
if err := db.Error; err != nil {
e.Log.Errorf("Service RemoveTmMemberPlatform error:%s \r\n", err)
return err
}
if db.RowsAffected == 0 {
return errors.New("无权删除该数据")
}
return nil
}

View File

@ -0,0 +1,236 @@
package service
import (
"errors"
"fmt"
"github.com/bytedance/sonic"
"github.com/go-admin-team/go-admin-core/sdk/service"
"github.com/go-redis/redis/v8"
"github.com/jinzhu/copier"
"gorm.io/gorm"
"go-admin/app/admin/models"
"go-admin/app/admin/service/dto"
"go-admin/common/actions"
cDto "go-admin/common/dto"
rediskey "go-admin/common/redis_key"
"go-admin/utils/redishelper"
)
type TmPlatform struct {
service.Service
}
// GetPage 获取TmPlatform列表
func (e *TmPlatform) GetPage(c *dto.TmPlatformGetPageReq, p *actions.DataPermission, list *[]models.TmPlatform, count *int64) error {
var err error
var data models.TmPlatform
err = e.Orm.Model(&data).
Scopes(
cDto.MakeCondition(c.GetNeedSearch()),
cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
actions.Permission(data.TableName(), p),
).
Find(list).Limit(-1).Offset(-1).
Count(count).Error
if err != nil {
e.Log.Errorf("TmPlatformService GetPage error:%s \r\n", err)
return err
}
return nil
}
// Get 获取TmPlatform对象
func (e *TmPlatform) Get(d *dto.TmPlatformGetReq, p *actions.DataPermission, model *models.TmPlatform) error {
var data models.TmPlatform
err := e.Orm.Model(&data).
Scopes(
actions.Permission(data.TableName(), p),
).
First(model, d.GetId()).Error
if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
err = errors.New("查看对象不存在或无权查看")
e.Log.Errorf("Service GetTmPlatform error:%s \r\n", err)
return err
}
if err != nil {
e.Log.Errorf("db error:%s", err)
return err
}
return nil
}
// Insert 创建TmPlatform对象
func (e *TmPlatform) Insert(c *dto.TmPlatformInsertReq) error {
var err error
var data models.TmPlatform
var count int64
c.Generate(&data)
e.Orm.Model(data).Where("code = ?", c.Code).Count(&count)
if count > 0 {
return errors.New("平台编码已存在")
}
err = e.Orm.Create(&data).Error
if err != nil {
e.Log.Errorf("TmPlatformService Insert error:%s \r\n", err)
return err
}
e.saveCache(&data)
return nil
}
// Update 修改TmPlatform对象
func (e *TmPlatform) Update(c *dto.TmPlatformUpdateReq, p *actions.DataPermission) error {
var err error
var data = models.TmPlatform{}
var count int64
e.Orm.Model(data).Where("code = ? and id <> ? ", c.Code, c.Id).Count(&count)
if count > 0 {
return errors.New("平台编码已存在")
}
e.Orm.Scopes(
actions.Permission(data.TableName(), p),
).First(&data, c.GetId())
c.Generate(&data)
db := e.Orm.Save(&data)
if err = db.Error; err != nil {
e.Log.Errorf("TmPlatformService Save error:%s \r\n", err)
return err
}
if db.RowsAffected == 0 {
return errors.New("无权更新该数据")
}
e.saveCache(&data)
return nil
}
// Remove 删除TmPlatform
func (e *TmPlatform) Remove(d *dto.TmPlatformDeleteReq, p *actions.DataPermission) error {
var data models.TmPlatform
db := e.Orm.Model(&data).
Scopes(
actions.Permission(data.TableName(), p),
).Delete(&data, d.GetId())
if err := db.Error; err != nil {
e.Log.Errorf("Service RemoveTmPlatform error:%s \r\n", err)
return err
}
if db.RowsAffected == 0 {
return errors.New("无权删除该数据")
}
key := fmt.Sprintf(rediskey.TM_PLATFORM_KEY, data.Code)
redishelper.DefaultRedis.DeleteString(key)
return nil
}
func (e *TmPlatform) saveCache(data *models.TmPlatform) {
key := fmt.Sprintf(rediskey.TM_PLATFORM_KEY, data.Code)
val, _ := sonic.MarshalString(data)
if val != "" {
redishelper.DefaultRedis.SetString(key, val)
}
e.SaveListCache(false)
}
// 保存json数据到redis缓存
// init 是否是初始化
func (e *TmPlatform) SaveListCache(init bool) []models.TmPlatform {
var list []models.TmPlatform
e.Orm.Find(&list)
items := make([]string, 0)
dataMap := make(map[string]string, 0)
for _, listItem := range list {
if listItem.Id != 0 {
val, _ := sonic.MarshalString(listItem)
items = append(items, val)
dataMap[fmt.Sprintf(rediskey.TM_PLATFORM_KEY, listItem.Code)] = val
}
}
for key, val := range dataMap {
redishelper.DefaultRedis.SetString(key, val)
}
redishelper.DefaultRedis.SetListCache(rediskey.TM_PLATFORM_LIST_KEY, 0, items...)
return list
}
func (e *TmPlatform) GetList(datas *[]dto.TmPlatformListResp) error {
listKey := fmt.Sprintf(rediskey.TM_PLATFORM_LIST_KEY)
vals, _ := redishelper.DefaultRedis.GetAllList(listKey)
if len(vals) == 0 {
for _, val := range vals {
item := dto.TmPlatformListResp{}
sonic.UnmarshalString(val, &item)
if item.Id != 0 {
*datas = append(*datas, item)
}
}
}
if len(*datas) == 0 {
entitys := e.SaveListCache(false)
for _, entity := range entitys {
item := dto.TmPlatformListResp{}
copier.Copy(&item, &entity)
if item.Id != 0 {
*datas = append(*datas, item)
}
}
}
return nil
}
// 根据key 获取翻译平台信息
func (e *TmPlatform) GetByKey(code string) (*models.TmPlatform, error) {
key := fmt.Sprintf(rediskey.TM_PLATFORM_KEY, code)
val, err := redishelper.DefaultRedis.GetString(key)
result := models.TmPlatform{}
if err != nil && !errors.Is(err, redis.Nil) {
return nil, err
}
if val != "" {
err = sonic.UnmarshalString(val, &result)
if err != nil {
return nil, err
}
}
if result.Id == 0 {
e.Orm.Model(&result).Where("code = ?", code).Find(&result)
}
return &result, nil
}
func (e *TmPlatform) GetActiveList() ([]models.TmPlatform, error) {
var list []models.TmPlatform
err := e.Orm.Model(&models.TmPlatform{}).Find(&list).Error
if err != nil {
e.Log.Errorf("db error:%s", err)
return nil, err
}
return list, nil
}

View File

@ -0,0 +1,218 @@
package service
import (
"errors"
"fmt"
"strconv"
"github.com/bytedance/sonic"
"github.com/go-admin-team/go-admin-core/sdk/service"
"gorm.io/gorm"
"go-admin/app/admin/models"
"go-admin/app/admin/service/dto"
"go-admin/common/actions"
cDto "go-admin/common/dto"
rediskey "go-admin/common/redis_key"
"go-admin/utils/redishelper"
)
type TmPlatformAccount struct {
service.Service
}
// GetPage 获取TmPlatformAccount列表
func (e *TmPlatformAccount) GetPage(c *dto.TmPlatformAccountGetPageReq, p *actions.DataPermission, list *[]models.TmPlatformAccount, count *int64) error {
var err error
var data models.TmPlatformAccount
err = e.Orm.Model(&data).
Scopes(
cDto.MakeCondition(c.GetNeedSearch()),
cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
actions.Permission(data.TableName(), p),
).
Find(list).Limit(-1).Offset(-1).
Count(count).Error
if err != nil {
e.Log.Errorf("TmPlatformAccountService GetPage error:%s \r\n", err)
return err
}
return nil
}
// Get 获取TmPlatformAccount对象
func (e *TmPlatformAccount) Get(d *dto.TmPlatformAccountGetReq, p *actions.DataPermission, model *models.TmPlatformAccount) error {
var data models.TmPlatformAccount
err := e.Orm.Model(&data).
Scopes(
actions.Permission(data.TableName(), p),
).
First(model, d.GetId()).Error
if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
err = errors.New("查看对象不存在或无权查看")
e.Log.Errorf("Service GetTmPlatformAccount error:%s \r\n", err)
return err
}
if err != nil {
e.Log.Errorf("db error:%s", err)
return err
}
return nil
}
// Insert 创建TmPlatformAccount对象
func (e *TmPlatformAccount) Insert(c *dto.TmPlatformAccountInsertReq) error {
var err error
var data models.TmPlatformAccount
platform := models.TmPlatform{}
if err := e.Orm.Model(platform).Where("id = ?", c.PlatformId).First(&platform).Error; err != nil {
return err
}
c.Generate(&data)
data.PlatformKey = platform.Code
err = e.Orm.Create(&data).Error
if err != nil {
e.Log.Errorf("TmPlatformAccountService Insert error:%s \r\n", err)
return err
}
e.SaveCache(data.PlatformKey, false)
return nil
}
// Update 修改TmPlatformAccount对象
func (e *TmPlatformAccount) Update(c *dto.TmPlatformAccountUpdateReq, p *actions.DataPermission) error {
var err error
var data = models.TmPlatformAccount{}
platform := models.TmPlatform{}
if err := e.Orm.Model(platform).Where("id = ?", c.PlatformId).First(&platform).Error; err != nil {
return err
}
e.Orm.Scopes(
actions.Permission(data.TableName(), p),
).First(&data, c.GetId())
c.Generate(&data)
data.PlatformKey = platform.Code
db := e.Orm.Save(&data)
if err = db.Error; err != nil {
e.Log.Errorf("TmPlatformAccountService Save error:%s \r\n", err)
return err
}
if db.RowsAffected == 0 {
return errors.New("无权更新该数据")
}
e.SaveCache(data.PlatformKey, false)
return nil
}
// Remove 删除TmPlatformAccount
func (e *TmPlatformAccount) Remove(d *dto.TmPlatformAccountDeleteReq, p *actions.DataPermission) error {
var data models.TmPlatformAccount
db := e.Orm.Model(&data).
Scopes(
actions.Permission(data.TableName(), p),
).Delete(&data, d.GetId())
if err := db.Error; err != nil {
e.Log.Errorf("Service RemoveTmPlatformAccount error:%s \r\n", err)
return err
}
if db.RowsAffected == 0 {
return errors.New("无权删除该数据")
}
redishelper.DefaultRedis.DeleteString(fmt.Sprintf(rediskey.TM_PLATFORM_ACCOUNT_LIST_KEY, data.PlatformKey))
return nil
}
// 保存缓存
func (e *TmPlatformAccount) SaveCache(platformKey string, cacheAll bool) {
var list []models.TmPlatformAccount
cacheList := map[string][]string{}
e.Orm.Model(&models.TmPlatformAccount{}).Where("status =1").Find(&list)
platformService := TmPlatform{}
for _, item := range list {
if cacheAll || (item.Status == 1 && item.PlatformKey == platformKey) {
platform, err := platformService.GetByKey(item.PlatformKey)
if platform == nil || platform.Id == 0 {
e.Log.Errorf("获取翻译平台消息失败 %v", err)
return
}
val, _ := sonic.MarshalString(item)
configs := map[string]interface{}{}
configs[item.PlatformKey] = map[string]interface{}{
"apiKey": item.ApiKey,
"apiSecret": item.ApiSecret,
"endpoint": platform.ApiBaseUrl,
}
cfg := TranslatorServiceConfig{
DefaultProvider: item.PlatformKey,
ProviderConfigs: configs,
}
translator, err := NewTranslatorService(&cfg)
if err != nil {
continue
}
if val != "" {
cacheList[item.PlatformKey] = append(cacheList[item.PlatformKey], val)
}
remainKey := fmt.Sprintf(rediskey.TM_PLATEFORM_ACCOUNT_REMAIN_KEY, item.PlatformKey, item.ApiKey)
remainCount, err := translator.providers[item.PlatformKey].GetRemainCount()
if err != nil {
continue
}
redishelper.DefaultRedis.SetString(remainKey, strconv.Itoa(remainCount))
}
}
for platformKey, item := range cacheList {
key := fmt.Sprintf(rediskey.TM_PLATFORM_ACCOUNT_LIST_KEY, platformKey)
if cacheAll {
redishelper.DefaultRedis.SetListCache(key, 0, item...)
} else {
redishelper.DefaultRedis.RPushList(key, item...)
}
}
}
// 获取平台账号剩余字符数
func (e *TmPlatformAccount) GetRemainCount(platformCode string, accountApiKey string) (int, error) {
key := fmt.Sprintf(rediskey.TM_PLATEFORM_ACCOUNT_REMAIN_KEY, platformCode, accountApiKey)
val, err := redishelper.DefaultRedis.GetString(key)
if err != nil {
return 0, err
}
return strconv.Atoi(val)
}
// 扣除api剩余字符
func (e *TmPlatformAccount) DecrRemainBy(platformCode string, accountApiKey string, count int) error {
key := fmt.Sprintf(rediskey.TM_PLATEFORM_ACCOUNT_REMAIN_KEY, platformCode, accountApiKey)
if err := redishelper.DefaultRedis.DecrBy(key, int64(count)).Err(); err != nil {
e.Log.Errorf("翻译平台扣除字符失败 key: %s err:%v", key, err)
return err
}
return nil
}

View File

@ -0,0 +1,109 @@
package service
import (
"fmt"
"go-admin/app/admin/service/dto"
"go-admin/utils/httphelper"
"strings"
"time"
)
type DeeplTranslatorConfig struct {
ApiKey string `json:"apiKey"`
ApiSecret string `json:"apiSecret"`
Endpoint string `json:"endpoint"`
}
// deepl 或deepl pro 翻译器
type DeeplTranslator struct {
config *DeeplTranslatorConfig
client *httphelper.HTTPClient
}
type deeplTranslationResponse struct {
Translations []struct {
DetectedSourceLanguage string `json:"detected_source_language"`
Text string `json:"text"`
} `json:"translations"`
}
// 定义 Deepl 获取使用量 API 的响应结构
type deeplUsageResponse struct {
CharacterCount int `json:"character_count"`
CharacterLimit int `json:"character_limit"`
TeamCharacterLimit int `json:"team_character_limit,omitempty"` // for Team accounts
}
// 初始化适配器实例
func NewDeeplTranslator(config *DeeplTranslatorConfig) *DeeplTranslator {
defaultHeaders := map[string]string{
"Content-Type": "application/json",
}
httpClient := httphelper.NewHTTPClient(
15*time.Second,
config.Endpoint,
defaultHeaders,
)
return &DeeplTranslator{
config: config,
client: httpClient,
}
}
// deepl 翻译函数
func (e *DeeplTranslator) Translate(text string, sourceLang, targetLang string) (*dto.TranslateResult, error) {
result := dto.TranslateResult{}
requestBody := map[string]interface{}{
"text": []string{text},
"target_lang": targetLang,
}
headers := map[string]string{
"Authorization": fmt.Sprintf("DeepL-Auth-Key %s", e.config.ApiKey),
"Content-Type": "application/json",
}
if sourceLang != "" || strings.ToLower(sourceLang) == "auto" {
requestBody["source_lang"] = ""
}
var responseData deeplTranslationResponse
// Deepl API 翻译通常是 POST 请求到 /v2/translate
err := e.client.Post("/v2/translate", requestBody, headers, &responseData)
if err != nil {
return &result, fmt.Errorf("deepl translate request failed: %w", err)
}
if len(responseData.Translations) > 0 {
result.TranslatedText = responseData.Translations[0].Text
result.SourceLanguage = sourceLang
result.TargetLanguage = targetLang
}
return &result, nil
}
func (e *DeeplTranslator) GetRemainCount() (int, error) {
path := "/v2/usage"
headers := map[string]string{
"Authorization": fmt.Sprintf("DeepL-Auth-Key %s", e.config.ApiKey),
"Content-Type": "application/json",
}
var responseData deeplUsageResponse
err := e.client.Get(path, headers, &responseData) // GET 请求通常没有请求体
if err != nil {
return 0, fmt.Errorf("deepl usage request failed: %w", err)
}
// 返回剩余字符数 (假设 DeepL 返回已用字符数和限制,我们需要计算剩余)
// 根据 DeepL 文档,它通常返回 character_count 和 character_limit
remain := responseData.CharacterLimit - responseData.CharacterCount
return remain, nil
}
// 获取适配器名称
func (e *DeeplTranslator) GetPlatform() string {
return "deepl"
}

View File

@ -0,0 +1,107 @@
package service
import (
"bytes"
"encoding/json"
"fmt"
"go-admin/app/admin/service/dto"
"go-admin/utils/httphelper"
"io/ioutil"
"net/http"
"time"
)
type DeepseekTranslatorConfig struct {
ApiKey string `json:"apiKey"`
ApiSecret string `json:"apiSecret"`
Endpoint string `json:"endpoint"`
}
type DeepSeekTranslator struct {
config *DeepseekTranslatorConfig
client *httphelper.HTTPClient
}
// 初始化适配器实例
func NewDeepseekTranslator(config *DeepseekTranslatorConfig) *DeepSeekTranslator {
defaultHeaders := map[string]string{
"Content-Type": "application/json",
}
httpClient := httphelper.NewHTTPClient(
15*time.Second,
config.Endpoint,
defaultHeaders,
)
return &DeepSeekTranslator{
config: config,
client: httpClient,
}
}
// 翻译
func (e *DeepSeekTranslator) Translate(text string, source string, target string) (*dto.TranslateResult, error) {
// TODO: 实现Deepseek API调用
result := dto.TranslateResult{}
reqBody := dto.DeepseekTranslateRequest{
Model: "deepseek-v3-fast", // v3 fast模型
Stream: false,
Messages: []dto.Message{
{Role: "system", Content: fmt.Sprintf("你是翻译大师,请只将用户输入从%s翻译为%s仅返回翻译后的文本", source, target)},
{Role: "user", Content: text},
},
}
data, err := json.Marshal(reqBody)
if err != nil {
return &result, err
}
req, err := http.NewRequest("POST", e.config.Endpoint, bytes.NewBuffer(data))
if err != nil {
return &result, err
}
req.Header.Set("Authorization", "Bearer "+e.config.ApiKey)
req.Header.Set("Content-Type", "application/json")
client := &http.Client{Timeout: 10 * time.Second}
resp, err := client.Do(req)
if err != nil {
return &result, err
}
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
if resp.StatusCode != 200 {
return &result, fmt.Errorf("DeepSeek error: %s", string(body))
}
var dsResp dto.DeepSeekResponse
err = json.Unmarshal(body, &dsResp)
if err != nil {
return &result, err
}
if len(dsResp.Choices) == 0 {
return &result, fmt.Errorf("no translation result from DeepSeek")
}
result.TranslatedText = dsResp.Choices[0].Message.Content
result.SourceLanguage = source
result.TargetLanguage = target
return &result, nil
}
func (e *DeepSeekTranslator) GetRemainCount() (int, error) {
// TODO: 实现Deepseek API调用
return 0, nil
}
// 返回服务商
func (e *DeepSeekTranslator) GetPlatform() string {
return "deepseek"
}

View File

@ -0,0 +1,33 @@
package service
import (
"fmt"
"testing"
)
func TestDeepSeekTranslator(t *testing.T) {
config := TranslatorServiceConfig{
DefaultProvider: "deepseek",
ProviderConfigs: map[string]interface{}{
"deepseek": map[string]interface{}{
"apiKey": "sk-KlaHS7PtYhuBNLpAG7iNAjs0YQ8JH7plqJxv4dLCwW16xV8x",
"endpoint": "https://api.just2chat.cn/v1/chat/completions",
},
},
}
service, err := NewTranslatorService(&config)
if err != nil {
fmt.Sprintln("报错:", err)
return
}
result, err := service.providers["deepseek"].Translate("我想翻译内容", "zh", "fr")
if err != nil {
fmt.Sprintln("报错:", err)
return
}
fmt.Println(result)
}

View File

@ -0,0 +1,51 @@
package service
import (
"go-admin/app/admin/service/dto"
"go-admin/utils/httphelper"
"time"
)
type GoogleTranslator struct {
config *GoogleTranslatorConfig
client *httphelper.HTTPClient
}
type GoogleTranslatorConfig struct {
ApiKey string `json:"apiKey"`
ApiSecret string `json:"apiSecret"`
Endpoint string `json:"endpoint"`
}
func NewGoogleTranslator(config *GoogleTranslatorConfig) *GoogleTranslator {
defaultHeaders := map[string]string{
"Content-Type": "application/json",
}
httpClient := httphelper.NewHTTPClient(
15*time.Second,
config.Endpoint,
defaultHeaders,
)
return &GoogleTranslator{
config: config,
client: httpClient,
}
}
// 翻译
func (t *GoogleTranslator) Translate(text string, sourceLang, targetLang string) (*dto.TranslateResult, error) {
return &dto.TranslateResult{}, nil
}
func (t *GoogleTranslator) GetRemainCount() (int, error) {
//todo 实现获取剩余调用次数
return 0, nil
}
// 获取服务商
func (t *GoogleTranslator) GetPlatform() string {
return "google"
}

View File

@ -0,0 +1,20 @@
package service
import "go-admin/app/admin/service/dto"
//翻译接口
type Translator interface {
// Translate 执行翻译操作
// ctx: 上下文,用于超时、取消等控制
// text: 待翻译的文本
// sourceLang: 源语言ISO 639-1 标准,如 "en", "zh"
// targetLang: 目标语言ISO 639-1 标准)
// 返回 TranslationResult 和错误
Translate(text, from, to string) (*dto.TranslateResult, error)
//获取剩余字符数
GetRemainCount() (int, error)
// GetServiceName 返回服务商名称
GetPlatform() string
}

View File

@ -0,0 +1,277 @@
package service
import (
"encoding/json"
"fmt"
"go-admin/app/admin/models"
"go-admin/app/admin/service/dto"
"go-admin/common/mq"
rediskey "go-admin/common/redis_key"
"go-admin/common/statuscode"
"go-admin/utils/redishelper"
"time"
"unicode/utf8"
commonDto "go-admin/common/dto"
"github.com/bytedance/sonic"
"github.com/go-admin-team/go-admin-core/logger"
"github.com/go-admin-team/go-admin-core/sdk/service"
"github.com/pkg/errors"
)
type TranslatorServiceConfig struct {
DefaultProvider string // 默认翻译服务商
ProviderConfigs map[string]interface{} // 各个服务商的具体配置
}
type TranslatorService struct {
service.Service
config *TranslatorServiceConfig
providers map[string]Translator // 注册的翻译服务商适配器
// cache cache.Cache // 缓存服务
}
type TranslatorToolService struct {
service.Service
}
// NewTranslatorService 创建翻译服务实例
func NewTranslatorService(cfg *TranslatorServiceConfig) (*TranslatorService, error) {
svc := &TranslatorService{
config: cfg,
// cache: c,
providers: make(map[string]Translator),
}
// 根据配置初始化并注册翻译服务商适配器
for providerName, providerCfg := range cfg.ProviderConfigs {
var newAdapter Translator
switch providerName {
case "google":
googleCfgBytes, _ := json.Marshal(providerCfg) // 假设配置是map[string]interface{},需要转换
var googleCfg GoogleTranslatorConfig
if err := json.Unmarshal(googleCfgBytes, &googleCfg); err != nil {
return nil, errors.Wrapf(err, "failed to unmarshal config for GoogleTranslate")
}
newAdapter = NewGoogleTranslator(&googleCfg)
// case "BaiduTranslate":
// // newAdapter = adapter.NewBaiduTranslator(...)
case "deepseek":
deepseekCfgBytes, _ := json.Marshal(providerCfg) // 假设配置是map[string]interface{},需要转换
var deepseekCfg DeepseekTranslatorConfig
if err := json.Unmarshal(deepseekCfgBytes, &deepseekCfg); err != nil {
return nil, errors.Wrapf(err, "failed to unmarshal config for DeepseekTranslator")
}
newAdapter = NewDeepseekTranslator(&deepseekCfg)
case "deepl", "deepl_free":
deeplCfgBytes, _ := json.Marshal(providerCfg) // 假设配置是map[string]interface{},需要转换
var deeplCfg DeeplTranslatorConfig
if err := json.Unmarshal(deeplCfgBytes, &deeplCfg); err != nil {
return nil, errors.Wrapf(err, "failed to unmarshal config for DeepLTranslator")
}
newAdapter = NewDeeplTranslator(&deeplCfg)
default:
return nil, errors.Errorf("unsupported translation provider: %s", providerName)
}
svc.RegisterProvider(providerName, newAdapter)
}
if len(svc.providers) == 0 {
return nil, errors.New("no translation providers registered")
}
return svc, nil
}
// RegisterProvider 注册翻译服务商适配器
func (s *TranslatorService) RegisterProvider(name string, provider Translator) {
// s.providerMutex.Lock()
// defer s.providerMutex.Unlock()
s.providers[name] = provider
logger.Infof("Registered translation provider: %s", name)
}
// 翻译校验
// return statusCode
func (s *TranslatorService) TranslateJudge(req *dto.TranslateReq, apiKey string) (result *dto.TranslateResult, respCode int) {
tmMemberService := TmMember{Service: s.Service}
tmPlatformAccount := TmPlatformAccount{Service: s.Service}
memberInfo, err1 := tmMemberService.GetByKey(apiKey)
if err1 != nil {
s.Log.Errorf("获取用户信息失败:%v", err1)
respCode = statuscode.ServerError
return
}
if memberInfo.Status == 2 {
respCode = statuscode.ApiUnauthorized
return
}
remainCount, _ := tmMemberService.GetRemainCount(req.Platform, apiKey)
count := utf8.RuneCountInString(req.Text)
respCode = statuscode.Success
if remainCount < count {
respCode = statuscode.InSufficRemainChar
return
}
Translator, code := s.GetTranslator(req.Platform)
if code != statuscode.Success {
respCode = code
return
}
result, err := Translator.providers[req.Platform].Translate(req.Text, req.SourceLang, req.TargetLang)
if err == nil {
err2 := tmMemberService.DecrBy(req.Platform, apiKey, count)
if err2 != nil {
s.Log.Errorf("翻译计数失败:%v", err2)
respCode = statuscode.ServerError
return
}
platformConfigInterface := Translator.config.ProviderConfigs[req.Platform]
// 尝试将 interface{} 断言为 map[string]interface{}
if mapData, ok := platformConfigInterface.(map[string]interface{}); !ok {
tmPlatformAccount.DecrRemainBy(req.Platform, mapData["apiKey"].(string), count)
}
date := time.Now().Format("20060102")
redishelper.DefaultRedis.IncrBy(fmt.Sprintf(rediskey.TM_MEMBER_DAILY_COUNT, date, apiKey, req.Platform), int64(count))
//每日统计保留三天
redishelper.DefaultRedis.Expire(fmt.Sprintf(rediskey.TM_MEMBER_DAILY_COUNT, date, apiKey, req.Platform), 3*24*time.Hour)
} else {
code = statuscode.ServerError
}
return
}
func (s *TranslatorService) GetTranslator(platform string) (translator *TranslatorService, code int) {
platformKey := fmt.Sprintf(rediskey.TM_PLATFORM_KEY, platform)
platformVal, _ := redishelper.DefaultRedis.GetString(platformKey)
if platformVal == "" {
code = statuscode.PlatformNotSupport
return
}
var platformEntity models.TmPlatform
account, err := s.GetNextAccount(platform)
if err != nil {
s.Log.Errorf("获取翻译api失败:%v", err)
}
sonic.UnmarshalString(platformVal, &platformEntity)
if account.Id == 0 || account.Status == 2 {
code = statuscode.TransactionNotAvailable
return
}
configs := map[string]interface{}{}
configs[platform] = map[string]interface{}{
"apiKey": account.ApiKey,
"apiSecret": account.ApiSecret,
"endpoint": platformEntity.ApiBaseUrl,
}
cfg := TranslatorServiceConfig{
DefaultProvider: platform,
ProviderConfigs: configs,
}
switch platform {
case "deepl", "deepl_free", "deepseek":
translator, err = NewTranslatorService(&cfg)
if err != nil {
s.Log.Errorf("failed to create translator service: %s", err)
code = statuscode.ServerError
return
}
code = statuscode.Success
return
default:
code = statuscode.PlatformNotSupport
return
}
}
// 从 Redis List 顺序取出一个账号,使用后放回队尾,模拟轮询
func (s *TranslatorService) GetNextAccount(platformCode string) (*models.TmPlatformAccount, error) {
var val string
var err error
var remain int
key := fmt.Sprintf(rediskey.TM_PLATFORM_ACCOUNT_LIST_KEY, platformCode)
retries := []time.Duration{100 * time.Millisecond, 200 * time.Millisecond, 300 * time.Millisecond}
defer func() {
if val != "" {
if remain > 0 {
// 放回队尾,继续轮询机制
if err := redishelper.DefaultRedis.RPushList(key, val); err != nil {
s.Log.Errorf("failed to push account back to queue: %v", err)
}
}
}
}()
// 尝试从 Redis 队列中弹出账号 ID带重试机制
for _, delay := range retries {
val, err = redishelper.DefaultRedis.LPopList(key)
if err == nil {
// 成功获取到值,跳出重试循环
break
}
time.Sleep(delay)
}
// 如果所有重试都失败了,并且不是因为队列为空
if err != nil {
return nil, errors.New("failed to get account from queue after multiple retries: " + err.Error())
}
accountService := TmPlatformAccount{Service: s.Service}
account := models.TmPlatformAccount{}
sonic.UnmarshalString(val, &account)
switch platformCode {
case "deepseek":
remain = 999999
default:
remain, _ = accountService.GetRemainCount(platformCode, account.ApiKey)
}
// 如果剩余字符数 <= 0跳过该账号不放回队列并更新数据库状态
if remain <= 0 {
event := commonDto.ExhaustedAccountMessage{
Id: account.Id,
Platform: platformCode,
}
payload, _ := sonic.Marshal(event)
err = mq.MQ.Publish( // default exchange
"account_exhausted_queue",
payload,
)
if err != nil {
s.Log.Errorf("发送账号耗尽通知失败:%v", err)
}
return nil, errors.New("account exhausted and removed from queue")
}
return &account, nil
}

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