feat:完善项目信息

This commit is contained in:
henry
2022-01-06 17:11:57 +08:00
parent 1b0f71735b
commit a92801b1ce
29 changed files with 815 additions and 623 deletions

View File

@ -2,32 +2,48 @@ package api
import (
"SciencesServer/app/api/admin/controller"
"SciencesServer/app/basic/api"
"github.com/gin-gonic/gin"
)
type Config struct{}
func (a *Config) List(c *gin.Context) {
func (a *Config) Index(c *gin.Context) {
form := &struct {
Kind int `json:"kind" form:"kind"`
pageForm
}{}
if err := bind(form)(c); err != nil {
APIFailure(err.(error))(c)
if err := api.Bind(form)(c); err != nil {
api.APIFailure(err.(error))(c)
return
}
data, err := controller.NewConfig()().Config(form.Kind, form.Page, form.PageSize)
APIResponse(err, data)
api.APIResponse(err, data)
}
func (a *Config) Add(c *gin.Context) {
form := &struct {
Kind int `json:"kind" form:"kind" binding:"required"`
Name string `json:"name" form:"name" binding:"required"`
Key string `json:"key" form:"key" binding:"required"`
Value interface{} `json:"value" form:"value" binding:"required"`
}{}
if err := api.Bind(form)(c); err != nil {
api.APIFailure(err.(error))(c)
return
}
err := controller.NewConfig()().Add(form.Kind, form.Name, form.Key, form.Value)
api.APIResponse(err)
}
func (a *Config) Edit(c *gin.Context) {
form := &struct {
Params map[string]interface{} `json:"params" form:"params" binding:"required"`
}{}
if err := bind(form)(c); err != nil {
APIFailure(err.(error))(c)
if err := api.Bind(form)(c); err != nil {
api.APIFailure(err.(error))(c)
return
}
err := controller.NewConfig()().Form(form.Params)
APIResponse(err)
api.APIResponse(err)
}

View File

@ -1,8 +1,9 @@
package api
import (
"SciencesServer/app/api/admin/controller"
"SciencesServer/app/service"
"SciencesServer/app/api/admin/controller/department"
"SciencesServer/app/basic/api"
"SciencesServer/app/session"
"github.com/gin-gonic/gin"
)
@ -10,58 +11,61 @@ import (
type Department struct{}
type departmentForm struct {
ParentID uint64 `json:"parent_id" form:"parent_id"`
Title string `json:"title" form:"title" binding:"required"`
Name string `json:"name" form:"name"`
Mobile string `json:"mobile" form:"mobile"`
Remark string `json:"remark" form:"remark"`
ParentID string `json:"parent_id" form:"parent_id"`
Name string `json:"name" form:"name" binding:"required"`
Contact string `json:"contact" form:"contact_title"`
ContactMobile string `json:"contact_mobile" form:"contact_mobile"`
Status int `json:"status" form:"status" binding:"required"`
Remark string `json:"remark" form:"remark"`
}
func (a *Department) List(c *gin.Context) {
data, err := controller.NewDepartment()(getSession()(c).(*service.Session)).List()
APIResponse(err, data)(c)
func (a *Department) Index(c *gin.Context) {
data, err := department.NewInstance()(api.GetSession()(c).(*session.Admin)).Index()
api.APIResponse(err, data)(c)
}
func (a *Department) Select(c *gin.Context) {
data, err := controller.NewDepartment()(getSession()(c).(*service.Session)).Select()
APIResponse(err, data)(c)
data, err := department.NewInstance()(api.GetSession()(c).(*session.Admin)).Select()
api.APIResponse(err, data)(c)
}
func (a *Department) Add(c *gin.Context) {
form := new(departmentForm)
if err := bind(form)(c); err != nil {
APIFailure(err.(error))(c)
if err := api.Bind(form)(c); err != nil {
api.APIFailure(err.(error))(c)
return
}
err := controller.NewDepartment()(getSession()(c).(*service.Session)).Data(&controller.DepartmentParams{
ParentID: form.ParentID, Title: form.Title, Name: form.Name, Mobile: form.Mobile, Remark: form.Remark,
err := department.NewInstance()(api.GetSession()(c).(*session.Admin)).Form(&department.InstanceParams{
ParentID: (&api.IDStringForm{ID: form.ParentID}).Convert(), Contact: form.Contact, Name: form.Name,
ContactMobile: form.ContactMobile, Status: form.Status, Remark: form.Remark,
})
APIResponse(err)(c)
api.APIResponse(err)(c)
}
func (a *Department) Edit(c *gin.Context) {
form := &struct {
idForm
api.IDStringForm
departmentForm
}{}
if err := bind(form)(c); err != nil {
APIFailure(err.(error))(c)
if err := api.Bind(form)(c); err != nil {
api.APIFailure(err.(error))(c)
return
}
err := controller.NewDepartment()(getSession()(c).(*service.Session)).Data(&controller.DepartmentParams{
ID: form.ID, ParentID: form.ParentID, Title: form.Title, Name: form.Name, Mobile: form.Mobile, Remark: form.Remark,
err := department.NewInstance()(api.GetSession()(c).(*session.Admin)).Form(&department.InstanceParams{
ID: form.Convert(), ParentID: (&api.IDStringForm{ID: form.ParentID}).Convert(), Contact: form.Contact,
Name: form.Name, ContactMobile: form.ContactMobile, Status: form.Status, Remark: form.Remark,
})
APIResponse(err)(c)
api.APIResponse(err)(c)
}
func (a *Department) Delete(c *gin.Context) {
form := new(idForm)
form := new(api.IDStringForm)
if err := bind(form)(c); err != nil {
APIFailure(err.(error))(c)
if err := api.Bind(form)(c); err != nil {
api.APIFailure(err.(error))(c)
return
}
err := controller.NewDepartment()(getSession()(c).(*service.Session)).Delete(form.ID)
APIResponse(err)(c)
err := department.NewInstance()(api.GetSession()(c).(*session.Admin)).Delete(form.Convert())
api.APIResponse(err)(c)
}

View File

@ -13,78 +13,80 @@ type Menu struct{}
type (
// menuForm 菜单信息
menuForm struct {
ParentID uint64 `json:"parent_id" form:"parent_id"`
ParentID string `json:"parent_id" form:"parent_id"`
Name string `json:"name" form:"name" binding:"required"`
Kind int `json:"kind" form:"kind" binding:"required"`
Link string `json:"link" form:"link"`
Link string `json:"path" form:"path"`
Component string `json:"component" form:"component"`
Icon string `json:"icon" form:"icon"`
Auth int `json:"auth" form:"auth"`
Sort int `json:"sort" form:"sort"`
IsCache int `json:"is_cache" form:"is_cache"`
Hidden int `json:"hidden" form:"hidden"`
Status int `json:"status" form:"status"`
Remark string `json:"remark" form:"remark"`
}
)
/**
* @apiDefine Menu 菜单管理
*/
func (a *Menu) List(c *gin.Context) {
data, err := menu.NewInstance()(api.GetSession()(c).(*session.Admin)).List()
data, err := menu.NewInstance()(api.GetSession()(c).(*session.Admin)).Index()
api.APIResponse(err, data)(c)
}
func (a *Menu) Add(c *gin.Context) {
form := new(menuForm)
if err := bind(form)(c); err != nil {
APIFailure(err.(error))(c)
if err := api.Bind(form)(c); err != nil {
api.APIFailure(err.(error))(c)
return
}
err := menu.NewInstance()(api.GetSession()(c).(*session.Admin)).Form(&menu.InstanceParams{
ParentID: form.ParentID, Name: form.Name, Kind: form.Kind, Link: form.Link, Component: form.Component,
ParentID: (&api.IDStringForm{ID: form.ParentID}).Convert(),
Name: form.Name, Kind: form.Kind, Link: form.Link, Component: form.Component,
IsCache: form.IsCache, IsHidden: form.Hidden,
Icon: form.Icon, Auth: form.Auth, Sort: form.Sort, Status: form.Status, Remark: form.Remark,
})
APIResponse(err)(c)
api.APIResponse(err)(c)
}
func (a *Menu) Edit(c *gin.Context) {
form := &struct {
idForm
api.IDStringForm
menuForm
}{}
if err := bind(form)(c); err != nil {
APIFailure(err.(error))(c)
if err := api.Bind(form)(c); err != nil {
api.APIFailure(err.(error))(c)
return
}
err := menu.NewInstance()(api.GetSession()(c).(*session.Admin)).Form(&menu.InstanceParams{
ID: form.ID, ParentID: form.ParentID, Name: form.Name, Kind: form.Kind, Link: form.Link, Component: form.Component,
Icon: form.Icon, Auth: form.Auth, Sort: form.Sort, Status: form.Status, Remark: form.Remark,
ID: form.Convert(), ParentID: (&api.IDStringForm{ID: form.ParentID}).Convert(), Name: form.Name,
Kind: form.Kind, Link: form.Link, Component: form.Component,
Icon: form.Icon, Auth: form.Auth, IsCache: form.IsCache, IsHidden: form.Hidden,
Sort: form.Sort, Status: form.Status, Remark: form.Remark,
})
APIResponse(err)(c)
api.APIResponse(err)(c)
}
func (a *Menu) Status(c *gin.Context) {
form := &struct {
idForm
api.IDStringForm
Status int `json:"status" form:"status" binding:"required"`
}{}
if err := bind(form)(c); err != nil {
if err := api.Bind(form)(c); err != nil {
APIFailure(err.(error))(c)
return
}
err := menu.NewInstance()(api.GetSession()(c).(*session.Admin)).Status(form.ID, form.Status)
APIResponse(err)(c)
err := menu.NewInstance()(api.GetSession()(c).(*session.Admin)).Status(form.Convert(), form.Status)
api.APIResponse(err)(c)
}
func (a *Menu) Delete(c *gin.Context) {
form := new(idForm)
form := new(api.IDStringForm)
if err := bind(form)(c); err != nil {
APIFailure(err.(error))(c)
if err := api.Bind(form)(c); err != nil {
api.APIFailure(err.(error))(c)
return
}
err := menu.NewInstance()(api.GetSession()(c).(*session.Admin)).Delete(form.ID)
APIResponse(err)(c)
err := menu.NewInstance()(api.GetSession()(c).(*session.Admin)).Delete(form.Convert())
api.APIResponse(err)(c)
}

View File

@ -1,132 +1,89 @@
package api
import (
role2 "SciencesServer/app/api/admin/controller/role"
"SciencesServer/app/api/admin/controller/role"
"SciencesServer/app/basic/api"
"SciencesServer/app/service"
"SciencesServer/app/session"
"github.com/gin-gonic/gin"
)
type Role struct{}
func (a *Role) List(c *gin.Context) {
func (*Role) Index(c *gin.Context) {
form := &struct {
Name string `json:"name" form:"name"`
Status int `json:"status" form:"status"`
pageForm
api.PageForm
}{}
if err := bind(form)(c); err != nil {
APIFailure(err.(error))(c)
if err := api.Bind(form)(c); err != nil {
api.APIFailure(err.(error))(c)
return
}
data, err := role2.NewInstance()(getSession()(c).(*service.Session)).List(form.Name, form.Status, form.Page, form.PageSize)
APIResponse(err, data)(c)
data, err := role.NewInstance()(api.GetSession()(c).(*session.Admin)).Index(form.Name, form.Page, form.PageSize)
api.APIResponse(err, data)(c)
}
func (a *Role) Select(c *gin.Context) {
data, err := role2.NewInstance()(getSession()(c).(*service.Session)).Select()
APIResponse(err, data)(c)
func (*Role) Select(c *gin.Context) {
data, err := role.NewInstance()(api.GetSession()(c).(*session.Admin)).Select()
api.APIResponse(err, data)(c)
}
func (a *Role) Add(c *gin.Context) {
func (*Role) Add(c *gin.Context) {
form := &struct {
Name string `json:"name" form:"name" binding:"required"`
Remark string `json:"remark" form:"remark" binding:"required"`
Sort int `json:"sort" form:"sort"`
}{}
if err := bind(form)(c); err != nil {
APIFailure(err.(error))(c)
if err := api.Bind(form)(c); err != nil {
api.APIFailure(err.(error))(c)
return
}
err := role2.NewInstance()(getSession()(c).(*service.Session)).Data(0, form.Name, form.Remark, form.Sort)
APIResponse(err)(c)
err := role.NewInstance()(api.GetSession()(c).(*session.Admin)).Form(0, form.Name, form.Remark, form.Sort)
api.APIResponse(err)(c)
}
func (a *Role) Edit(c *gin.Context) {
func (*Role) Edit(c *gin.Context) {
form := &struct {
idForm
api.IDStringForm
Name string `json:"name" form:"name" binding:"required"`
Remark string `json:"remark" form:"remark" binding:"required"`
Sort int `json:"sort" form:"sort"`
}{}
if err := bind(form)(c); err != nil {
APIFailure(err.(error))(c)
if err := api.Bind(form)(c); err != nil {
api.APIFailure(err.(error))(c)
return
}
err := role2.NewInstance()(getSession()(c).(*service.Session)).Data(form.ID, form.Name, form.Remark, form.Sort)
APIResponse(err)(c)
err := role.NewInstance()(api.GetSession()(c).(*session.Admin)).Form(form.Convert(), form.Name, form.Remark, form.Sort)
api.APIResponse(err)(c)
}
func (a *Role) Status(c *gin.Context) {
func (*Role) Status(c *gin.Context) {
form := &struct {
idForm
api.IDStringForm
Status int `json:"status" form:"status" binding:"required"`
}{}
if err := bind(form)(c); err != nil {
APIFailure(err.(error))(c)
if err := api.Bind(form)(c); err != nil {
api.APIFailure(err.(error))(c)
return
}
err := role2.NewInstance()(getSession()(c).(*service.Session)).Status(form.ID, form.Status)
APIResponse(err)(c)
err := role.NewInstance()(api.GetSession()(c).(*session.Admin)).Status(form.Convert(), form.Status)
api.APIResponse(err)(c)
}
func (a *Role) Delete(c *gin.Context) {
form := new(idForm)
func (*Role) Delete(c *gin.Context) {
form := new(api.IDStringForm)
if err := bind(form)(c); err != nil {
APIFailure(err.(error))(c)
if err := api.Bind(form)(c); err != nil {
api.APIFailure(err.(error))(c)
return
}
err := role2.NewInstance()(getSession()(c).(*service.Session)).Delete(form.ID)
APIResponse(err)(c)
err := role.NewInstance()(api.GetSession()(c).(*session.Admin)).Delete(form.Convert())
api.APIResponse(err)(c)
}
/**
* @api {post} /api/role/menu 菜单信息
* @apiVersion 1.0.0
* @apiName RoleMenu
* @apiGroup Role
*
* @apiHeader {string} x-token token
*
* @apiSuccess (200) {Number} code 成功响应状态码!
* @apiSuccess (200) {String} msg 成功提示
* @apiSuccess (200) {Array} data 具体信息
* @apiSuccess (200) {Number} data.id 菜单ID
* @apiSuccess (200) {Number} data.parent_id 父级ID
* @apiSuccess (200) {String} data.name 菜单名称
* @apiSuccess (200) {Number} data.kind 类型1目录2菜单
* @apiSuccess (200) {String} data.link 访问地址
* @apiSuccess (200) {String} data.component 组件
* @apiSuccess (200) {Array} data.children="[]" 子集
*
* @apiSuccessExample {json} Success response:
* HTTPS 200 OK
* {
* "code": 200
* "msg": "ok"
* "data": [
* "id": 1,
* "parent_id": 0,
* "name": "系统管理",
* "kind": 1,
* "link": "1"
* "component": ""
* "children": [
* {
* "id": 2,
* "parent_id": 1,
* "name": "用户管理",
* "kind": 1,
* "link": "1"
* "component": ""
* "children": [],
* }
* ]
* ]
* }
*/
func (a *Role) Menu(c *gin.Context) {
func (*Role) Menu(c *gin.Context) {
form := &struct {
RoleID uint64 `json:"role_id" form:"role_id" binding:"required"`
}{}
@ -134,33 +91,11 @@ func (a *Role) Menu(c *gin.Context) {
APIFailure(err.(error))(c)
return
}
data, err := role2.NewMenu()(getSession()(c).(*service.Session)).List(form.RoleID)
data, err := role.NewMenu()(getSession()(c).(*service.Session)).List(form.RoleID)
APIResponse(err, data)(c)
}
/**
* @api {post} /api/role/menu/bind 菜单绑定
* @apiVersion 1.0.0
* @apiName RoleMenuBind
* @apiGroup Role
*
* @apiHeader {string} x-token token
*
* @apiParam {Number} role_id 角色ID
* @apiParam {Array.Number} menu_ids 菜单ID
*
* @apiSuccess (200) {Number} code=200 成功响应状态码!
* @apiSuccess (200) {String} msg="ok" 成功提示
*
* @apiSuccessExample {json} Success response:
* HTTPS 200 OK
* {
* "code": 200
* "msg": "ok"
* "data": null
* }
*/
func (a *Role) MenuBind(c *gin.Context) {
func (*Role) MenuBind(c *gin.Context) {
form := &struct {
RoleID uint64 `json:"role_id" form:"role_id" binding:"required"`
MenuIDs []uint64 `json:"menu_ids" form:"menu_ids" binding:"required"`
@ -169,54 +104,11 @@ func (a *Role) MenuBind(c *gin.Context) {
APIFailure(err.(error))(c)
return
}
err := role2.NewMenu()(getSession()(c).(*service.Session)).Bind(form.RoleID, form.MenuIDs)
err := role.NewMenu()(getSession()(c).(*service.Session)).Bind(form.RoleID, form.MenuIDs)
APIResponse(err)(c)
}
/**
* @api {post} /api/role/auth 权限信息
* @apiVersion 1.0.0
* @apiName RoleAuth
* @apiGroup Role
*
* @apiHeader {string} x-token token
*
* @apiParam {Number} role_id 角色ID
*
* @apiSuccess (200) {Number} code 成功响应状态码!
* @apiSuccess (200) {String} msg 成功提示
* @apiSuccess (200) {Array} data 具体信息
* @apiSuccess (200) {Number} data.id ID
* @apiSuccess (200) {Number} data.kind_title 权限类型名称
* @apiSuccess (200) {String} data.kind 权限类型
* @apiSuccess (200) {String} data.name 权限名称
* @apiSuccess (200) {String} data.auth 权限信息
* @apiSuccess (200) {Bool} data.checked 选中状态
* @apiSuccess (200) {String} data.remark 备注信息
* @apiSuccess (200) {Array} data.children 子集
*
* @apiSuccessExample {json} Success response:
* HTTPS 200 OK
* {
* "code": 200
* "msg": "ok"
* "data": {
* {
* "id": 1,
* "kind": 1,
* "name": "测试",
* "auth": "",
* "checked": false,
* "remark": "",
* "created_at": "2021-09-15T13:59:35+08:00",
* "updated_at": "2021-09-15T13:59:35+08:00",
* "kind_title": "模块",
* "children": []
* }
* }
* }
*/
func (a *Role) Auth(c *gin.Context) {
func (*Role) Auth(c *gin.Context) {
form := &struct {
RoleID uint64 `json:"role_id" form:"role_id" binding:"required"`
}{}
@ -224,33 +116,11 @@ func (a *Role) Auth(c *gin.Context) {
APIFailure(err.(error))(c)
return
}
data, err := role2.NewAuth()(getSession()(c).(*service.Session)).List(form.RoleID)
data, err := role.NewAuth()(getSession()(c).(*service.Session)).List(form.RoleID)
APIResponse(err, data)(c)
}
/**
* @api {post} /api/role/auth/bind 权限绑定
* @apiVersion 1.0.0
* @apiName RoleAuthBind
* @apiGroup Role
*
* @apiHeader {string} x-token token
*
* @apiParam {Number} role_id 角色ID
* @apiParam {Array.Number} auth_ids 权限ID
*
* @apiSuccess (200) {Number} code 成功响应状态码!
* @apiSuccess (200) {String} msg 成功提示
*
* @apiSuccessExample {json} Success response:
* HTTPS 200 OK
* {
* "code": 200
* "msg": "ok"
* "data": null
* }
*/
func (a *Role) AuthBind(c *gin.Context) {
func (*Role) AuthBind(c *gin.Context) {
form := &struct {
RoleID uint64 `json:"role_id" form:"role_id" binding:"required"`
AuthIDs []uint64 `json:"auth_ids" form:"auth_ids" binding:"required"`
@ -259,6 +129,6 @@ func (a *Role) AuthBind(c *gin.Context) {
APIFailure(err.(error))(c)
return
}
err := role2.NewAuth()(getSession()(c).(*service.Session)).Bind(form.RoleID, form.AuthIDs)
err := role.NewAuth()(getSession()(c).(*service.Session)).Bind(form.RoleID, form.AuthIDs)
APIResponse(err)(c)
}

View File

@ -12,20 +12,32 @@ import (
type User struct{}
type userForm struct {
Account string `json:"account" form:"account" binding:"required"`
Name string `json:"name" form:"name" binding:"required"`
Mobile string `json:"mobile" form:"mobile" binding:"required"`
Gender int `json:"gender" form:"gender" binding:"required"`
Departments []uint64 `json:"departments" form:"departments"`
Roles []uint64 `json:"roles" form:"roles"`
Remark string `json:"remark" form:"remark"`
Account string `json:"account" form:"account" binding:"required"`
Name string `json:"name" form:"name" binding:"required"`
Mobile string `json:"mobile" form:"mobile" binding:"required"`
Gender int `json:"gender" form:"gender" binding:"required"`
DepartmentID string `json:"department_id" form:"department_id"`
RoleIDs []string `json:"role_ids" form:"role_ids"`
Remark string `json:"remark" form:"remark"`
}
/**
* @apiDefine User 用户管理
*/
func (this *userForm) departmentInfo() uint64 {
return (&api.IDStringForm{ID: this.DepartmentID}).Convert()
}
func (a *User) Info(c *gin.Context) {
func (this *userForm) RoleInfo() []uint64 {
out := make([]uint64, 0)
obj := new(api.IDStringForm)
for _, v := range this.RoleIDs {
obj.ID = v
out = append(out, obj.Convert())
}
return out
}
func (*User) Info(c *gin.Context) {
data, err := user.NewInstance()(api.GetSession()(c).(*session.Admin)).Info()
APIResponse(err, data)(c)
}
@ -46,7 +58,7 @@ func (a *User) List(c *gin.Context) {
}
func (a *User) Menu(c *gin.Context) {
data, err := user.NewMenu()(api.GetSession()(c).(*session.Admin)).List()
data, err := user.NewMenu()(api.GetSession()(c).(*session.Admin)).Index()
APIResponse(err, data)(c)
}
@ -61,7 +73,7 @@ func (a *User) Add(c *gin.Context) {
}
err := user.NewInstance()(api.GetSession()(c).(*session.Admin)).Add(&user.InstanceForm{
Account: form.Account, Name: form.Name, Mobile: form.Mobile, Password: form.Password,
Remark: form.Remark, Gender: form.Gender, Departments: form.Departments, Roles: form.Roles,
Remark: form.Remark, Gender: form.Gender, DepartmentID: form.departmentInfo(), RoleIDs: form.RoleInfo(),
})
api.APIResponse(err)(c)
}
@ -77,7 +89,7 @@ func (a *User) Edit(c *gin.Context) {
}
err := user.NewInstance()(api.GetSession()(c).(*session.Admin)).Edit(&user.InstanceForm{
ID: form.ID, Account: form.Account, Name: form.Name, Mobile: form.Mobile,
Remark: form.Remark, Gender: form.Gender, Departments: form.Departments, Roles: form.Roles,
Remark: form.Remark, Gender: form.Gender, DepartmentID: form.departmentInfo(), RoleIDs: form.RoleInfo(),
})
APIResponse(err)(c)
}

View File

@ -6,6 +6,7 @@ import (
"SciencesServer/config"
"SciencesServer/serve/orm"
"errors"
"fmt"
"time"
"gorm.io/gorm"
@ -34,6 +35,31 @@ func (c *Config) Config(kind, page, pageSize int) (*ReturnPages, error) {
return &ReturnPages{Data: out, Count: count}, nil
}
func (c *Config) Add(kind int, name, key string, value interface{}) error {
mSysConfig := model.NewSysConfig()
var count int64
err := model2.Count(mSysConfig.SysConfig, &count, model2.NewWhere("key", key))
if err != nil {
return err
} else if count > 0 {
return errors.New("key已存在")
}
mSysConfig.Kind = model2.SysConfigKind(kind)
mSysConfig.Name = name
mSysConfig.Key = key
mSysConfig.Value = fmt.Sprintf("%v", value)
if err = model2.Create(mSysConfig.SysConfig); err != nil {
return err
}
config.SystemConfig[key] = value
return nil
}
func (c *Config) Form(params map[string]interface{}) error {
if len(params) <= 0 {
return nil

View File

@ -1,98 +0,0 @@
package controller
import (
"SciencesServer/app/api/admin/model"
model2 "SciencesServer/app/common/model"
"SciencesServer/app/service"
"time"
)
type Department struct{ *Platform }
type DepartmentHandle func(session *service.Session) *Department
type DepartmentParams struct {
ID, ParentID uint64
Title, Name, Mobile, Remark string
}
type DepartmentTree struct {
*model2.SysDepartment
Children []*DepartmentTree `json:"children"`
}
func (c *Department) tree(src []*model2.SysDepartment, parentID uint64) []*DepartmentTree {
out := make([]*DepartmentTree, 0)
for _, v := range src {
if v.ParentID == parentID {
out = append(out, &DepartmentTree{
SysDepartment: v,
Children: c.tree(src, v.ID),
})
}
}
return out
}
func (c *Department) List() ([]*DepartmentTree, error) {
mSysDepartment := model.NewSysDepartment()
out := make([]*model2.SysDepartment, 0)
if err := model2.Scan(mSysDepartment.SysDepartment, &out, &model2.ModelWhereOrder{
Where: model2.NewWhere("tenant_id", c.TenantID),
Order: model2.NewOrder("parent_id", model2.OrderModeToAsc)}); err != nil {
return nil, err
}
return c.tree(out, 0), nil
}
func (c *Department) Select() ([]*DepartmentTree, error) {
mSysDepartment := model.NewSysDepartment()
out := make([]*model2.SysDepartment, 0)
if err := model2.ScanFields(mSysDepartment.SysDepartment, &out, []string{"id", "name"}, &model2.ModelWhereOrder{
Where: model2.NewWhere("tenant_id", c.TenantID),
Order: model2.NewOrder("parent_id", model2.OrderModeToAsc)}); err != nil {
return nil, err
}
return c.tree(out, 0), nil
}
func (c *Department) Data(params *DepartmentParams) error {
mSysDepartment := model.NewSysDepartment()
if params.ID <= 0 {
mSysDepartment.ParentID = params.ParentID
mSysDepartment.Title = params.Title
mSysDepartment.Name = params.Name
mSysDepartment.Mobile = params.Mobile
mSysDepartment.Remark = params.Remark
return model2.Create(mSysDepartment.SysDepartment)
}
mSysDepartment.ID = params.ID
return model2.Updates(mSysDepartment.SysDepartment, map[string]interface{}{
"parent_id": params.ParentID, "title": params.Title, "name": params.Name,
"mobile": params.Mobile, "remark": params.Remark, "updated_at": time.Now(),
})
}
func (c *Department) Delete(id uint64) error {
mSysDepartment := model.NewSysDepartment()
mSysDepartment.ID = id
if err := model2.Delete(mSysDepartment.SysDepartment); err != nil {
return err
}
return nil
}
func NewDepartment() DepartmentHandle {
return func(session *service.Session) *Department {
return &Department{Platform: &Platform{Session: session}}
}
}

View File

@ -0,0 +1,114 @@
package department
import (
"SciencesServer/app/api/admin/model"
model2 "SciencesServer/app/common/model"
"SciencesServer/app/session"
"time"
)
type Instance struct{ *session.Admin }
type InstanceHandle func(session *session.Admin) *Instance
type InstanceParams struct {
ID, ParentID uint64
Name, Contact, ContactMobile, Remark string
Status int
}
type (
// InstanceInfo 部门信息
InstanceInfo struct {
ID string `json:"id"`
ParentID string `json:"parent_id"`
*model2.SysDepartment
}
// InstanceTreeInfo 部门树
InstanceTreeInfo struct {
*InstanceInfo
Children []*InstanceTreeInfo `json:"children"`
}
)
func (c *Instance) tree(src []*model2.SysDepartment, parentID uint64) []*InstanceTreeInfo {
out := make([]*InstanceTreeInfo, 0)
for _, v := range src {
if v.ParentID == parentID {
out = append(out, &InstanceTreeInfo{
InstanceInfo: &InstanceInfo{
ID: v.GetEncodeID(),
ParentID: (&model2.Model{ID: v.ParentID}).GetEncodeID(),
SysDepartment: v,
},
Children: c.tree(src, v.ID),
})
}
}
return out
}
func (c *Instance) Index() ([]*InstanceTreeInfo, error) {
mSysDepartment := model.NewSysDepartment()
out := make([]*model2.SysDepartment, 0)
if err := model2.Scan(mSysDepartment.SysDepartment, &out, &model2.ModelWhereOrder{
Where: model2.NewWhere("tenant_id", c.TenantID),
Order: model2.NewOrder("parent_id", model2.OrderModeToAsc)}); err != nil {
return nil, err
}
return c.tree(out, 0), nil
}
func (c *Instance) Select() ([]*InstanceTreeInfo, error) {
mSysDepartment := model.NewSysDepartment()
out := make([]*model2.SysDepartment, 0)
if err := model2.ScanFields(mSysDepartment.SysDepartment, &out, []string{"id", "name"}, &model2.ModelWhereOrder{
Where: model2.NewWhere("tenant_id", c.TenantID),
Order: model2.NewOrder("parent_id", model2.OrderModeToAsc)}); err != nil {
return nil, err
}
return c.tree(out, 0), nil
}
func (c *Instance) Form(params *InstanceParams) error {
mSysDepartment := model.NewSysDepartment()
if params.ID <= 0 {
mSysDepartment.ParentID = params.ParentID
mSysDepartment.Name = params.Name
mSysDepartment.Contact = params.Contact
mSysDepartment.ContactMobile = params.ContactMobile
mSysDepartment.Status = params.Status
mSysDepartment.Remark = params.Remark
return model2.Create(mSysDepartment.SysDepartment)
}
mSysDepartment.ID = params.ID
return model2.Updates(mSysDepartment.SysDepartment, map[string]interface{}{
"parent_id": params.ParentID, "name": params.Name, "contact": params.Contact,
"contact_mobile": params.ContactMobile, "status": params.Status, "remark": params.Remark,
"updated_at": time.Now(),
})
}
func (c *Instance) Delete(id uint64) error {
mSysDepartment := model.NewSysDepartment()
mSysDepartment.ID = id
if err := model2.Delete(mSysDepartment.SysDepartment); err != nil {
return err
}
return nil
}
func NewInstance() InstanceHandle {
return func(session *session.Admin) *Instance {
return &Instance{Admin: session}
}
}

View File

@ -7,11 +7,19 @@ import (
type (
Tree struct {
ID string `json:"id"`
ParentID string `json:"parent_id"`
*model2.SysMenu
Path string `json:"path"`
Hidden int `json:"hidden"`
Children []*Tree `json:"children"`
}
TreeChecked struct {
ID string `json:"id"`
ParentID string `json:"parent_id"`
*model2.SysMenuBasic
Path string `json:"path"`
Hidden int `json:"hidden"`
Checked bool `json:"checked"`
Children []*TreeChecked `json:"children"`
}
@ -24,7 +32,11 @@ func tree(src []*model2.SysMenu, parentID uint64) []*Tree {
for _, v := range src {
if v.ParentID == parentID {
out = append(out, &Tree{
ID: v.GetEncodeID(),
ParentID: (&model2.Model{ID: v.ParentID}).GetEncodeID(),
SysMenu: v,
Path: v.Link,
Hidden: int(v.IsHidden),
Children: tree(src, v.ID),
})
}
@ -39,7 +51,11 @@ func TreeCheckedFunc(src []*model.SysMenuScene, parentID uint64) []*TreeChecked
for _, v := range src {
if v.ParentID == parentID {
out = append(out, &TreeChecked{
ID: v.GetEncodeID(),
ParentID: (&model2.Model{ID: v.ParentID}).GetEncodeID(),
SysMenuBasic: v.SysMenuBasic,
Path: v.Link,
Hidden: int(v.IsHidden),
Checked: v.SceneID > 0,
Children: TreeCheckedFunc(src, v.ID),
})
@ -58,9 +74,9 @@ func menuForSystem(iModel model2.IModel, where ...*model2.ModelWhere) ([]*Tree,
return tree(out, 0), nil
}
// MenuForSystem 系统管理员菜单
func MenuForSystem(iModel model2.IModel, where ...*model2.ModelWhere) ([]*Tree, error) {
out, err := iModel.(*model.SysMenu).SystemMenu(where...)
// menuForTenant 租户人员菜单
func menuForTenant(iModel model2.IModel, tenantID uint64, where ...*model2.ModelWhere) ([]*Tree, error) {
out, err := iModel.(*model.SysMenu).TenantMenu(tenantID, where...)
if err != nil {
return nil, err
@ -68,28 +84,39 @@ func MenuForSystem(iModel model2.IModel, where ...*model2.ModelWhere) ([]*Tree,
return tree(out, 0), nil
}
// MenuForTenant 租户人员菜单
func MenuForTenant(iModel model2.IModel, tenantID uint64) ([]*TreeChecked, error) {
out, err := iModel.(*model.SysMenu).TenantMenu(tenantID)
if err != nil {
return nil, err
}
return TreeCheckedFunc(out, 0), nil
// MenuForSystem 系统管理员菜单
func MenuForSystem(iModel model2.IModel, where ...*model2.ModelWhere) ([]*Tree, error) {
return menuForSystem(iModel, where...)
}
func MenuForRole(iModel model2.IModel, tenantID uint64, roleID uint64) ([]*TreeChecked, error) {
out, err := iModel.(*model.SysMenu).RoleMenu(tenantID, roleID)
if err != nil {
return nil, err
}
return TreeCheckedFunc(out, 0), nil
// MenuForTenant 租户人员菜单
func MenuForTenant(iModel model2.IModel, tenantID uint64, where ...*model2.ModelWhere) ([]*Tree, error) {
return menuForTenant(iModel, tenantID, where...)
}
// MenuForUser 当前用户菜单
func MenuForUser(iModel model2.IModel, tenantID uint64, uid uint64) ([]*TreeChecked, error) {
out, err := iModel.(*model.SysMenu).UserMenu(tenantID, uid)
func MenuForUser(iModel model2.IModel, tenantID uint64, uid uint64, where ...*model2.ModelWhere) ([]*Tree, error) {
out, err := iModel.(*model.SysMenu).UserMenu(tenantID, uid, where...)
if err != nil {
return nil, err
}
return tree(out, 0), nil
}
// MenuForTenantChecked 租户选中菜单
func MenuForTenantChecked(iModel model2.IModel, tenantID uint64) ([]*TreeChecked, error) {
out, err := iModel.(*model.SysMenu).TenantMenuChecked(tenantID)
if err != nil {
return nil, err
}
return TreeCheckedFunc(out, 0), nil
}
// MenuForRoleChecked 角色选中菜单
func MenuForRoleChecked(iModel model2.IModel, tenantID uint64, roleID uint64) ([]*TreeChecked, error) {
out, err := iModel.(*model.SysMenu).RoleMenuChecked(tenantID, roleID)
if err != nil {
return nil, err
}

View File

@ -16,24 +16,24 @@ type InstanceHandle func(session *session.Admin) *Instance
type (
// InstanceParams 菜单参数
InstanceParams struct {
ID, ParentID uint64
Kind, Auth int
Name, Link, Component, Icon string
Sort, Status int
Remark string
ID, ParentID uint64
Kind, Auth int
Name, Link, Component, Icon string
Sort, IsCache, IsHidden, Status int
Remark string
}
)
// List 列表信息
func (c *Instance) List() ([]*Tree, error) {
// Index 列表信息
func (c *Instance) Index() ([]*Tree, error) {
// 总管理:
// 租户管理:
mSysMenu := model.NewSysMenu()
auth := []model2.SysMenuAuth{model2.SysMenuAuthForOrdinary}
if c.IsAdmin {
auth = append(auth, model2.SysMenuAuthForSystem)
if c.IsAdmin && c.TenantID <= 0 {
return menuForSystem(mSysMenu)
}
return menuForSystem(mSysMenu, model2.NewWhereIn("auth", auth))
return menuForTenant(mSysMenu, c.TenantID)
}
// Form 数据操作
@ -46,11 +46,13 @@ func (c *Instance) Form(params *InstanceParams) error {
Kind: model2.SysMenuKind(params.Kind),
Link: params.Link,
Component: params.Component,
IsCache: model2.SysMenuCacheStatus(params.IsCache),
IsHidden: model2.SysMenuHiddenStatus(params.IsHidden),
Icon: params.Icon,
},
Auth: model2.SysMenuAuth(params.Auth),
Sort: params.Sort,
Status: model2.SysMenuStatusForNormal,
Status: model2.SysMenuStatus(params.Status),
Remark: params.Remark,
})
}
@ -62,7 +64,7 @@ func (c *Instance) Form(params *InstanceParams) error {
if err != nil {
return err
} else if !isExist {
return errors.New("菜单信息不存在")
return errors.New("操作错误,菜单信息不存在")
}
out.ParentID = params.ParentID
out.Name = params.Name
@ -71,6 +73,8 @@ func (c *Instance) Form(params *InstanceParams) error {
out.Component = params.Component
out.Icon = params.Icon
out.Auth = model2.SysMenuAuth(params.Auth)
out.IsCache = model2.SysMenuCacheStatus(params.IsCache)
out.IsHidden = model2.SysMenuHiddenStatus(params.IsHidden)
out.Sort = params.Sort
out.Status = model2.SysMenuStatus(params.Status)
out.Remark = params.Remark

View File

@ -5,20 +5,23 @@ import (
"SciencesServer/app/api/admin/model"
model2 "SciencesServer/app/common/model"
"SciencesServer/app/service"
"SciencesServer/app/session"
"SciencesServer/serve/logger"
"SciencesServer/utils"
"errors"
"fmt"
"time"
)
type Instance struct{ *controller.Platform }
type Instance struct{ *session.Admin }
type InstanceHandle func(session *service.Session) *Instance
type InstanceHandle func(session *session.Admin) *Instance
type (
// InstanceInfo 角色信息
InstanceInfo struct {
ID string `json:"id"`
*model2.SysRole
StatusTitle string `json:"status_title"`
}
// InstanceBasicInfo 角色基本信息
InstanceBasicInfo struct {
@ -27,14 +30,14 @@ type (
}
)
// List 列表信息
func (c *Instance) List(name string, status, page, pageSize int) (*controller.ReturnPages, error) {
// Index 列表信息
func (c *Instance) Index(name string, page, pageSize int) (*controller.ReturnPages, error) {
mSysRole := model.NewSysRole()
where := []*model2.ModelWhereOrder{
&model2.ModelWhereOrder{
Where: model2.NewWhere("tenant_id", c.TenantID),
Order: model2.NewOrder("sort", model2.OrderModeToDesc),
Order: model2.NewOrder("sort", model2.OrderModeToAsc),
},
&model2.ModelWhereOrder{
Order: model2.NewOrder("id", model2.OrderModeToDesc),
@ -42,12 +45,7 @@ func (c *Instance) List(name string, status, page, pageSize int) (*controller.Re
}
if name != "" {
where = append(where, &model2.ModelWhereOrder{
Where: model2.NewWhere("tenant_id", c.TenantID),
})
}
if status > 0 {
where = append(where, &model2.ModelWhereOrder{
Where: model2.NewWhere("status", status),
Where: model2.NewWhereLike("name", name),
})
}
var count int64
@ -60,7 +58,7 @@ func (c *Instance) List(name string, status, page, pageSize int) (*controller.Re
list := make([]*InstanceInfo, 0)
for _, v := range out {
list = append(list, &InstanceInfo{SysRole: v, StatusTitle: v.StatusTitle()})
list = append(list, &InstanceInfo{ID: v.GetEncodeID(), SysRole: v})
}
return &controller.ReturnPages{Data: list, Count: count}, nil
@ -73,10 +71,9 @@ func (c *Instance) Select() ([]*InstanceBasicInfo, error) {
where := []*model2.ModelWhereOrder{
&model2.ModelWhereOrder{
Where: model2.NewWhere("tenant_id", c.TenantID),
Order: model2.NewOrder("sort", model2.OrderModeToDesc),
Order: model2.NewOrder("sort", model2.OrderModeToAsc),
},
&model2.ModelWhereOrder{
Where: model2.NewWhere("status", model2.SysRoleStatusForNormal),
Order: model2.NewOrder("id", model2.OrderModeToDesc),
},
}
@ -88,8 +85,8 @@ func (c *Instance) Select() ([]*InstanceBasicInfo, error) {
return out, nil
}
// Data 数据操作
func (c *Instance) Data(id uint64, name, remark string, sort int) error {
// Form 数据操作
func (c *Instance) Form(id uint64, name, remark string, sort int) error {
mSysRole := model.NewSysRole()
if id <= 0 {
@ -147,27 +144,28 @@ func (c *Instance) Delete(id uint64) error {
if err != nil {
return err
} else if !isExist {
return errors.New("角色不存在")
}
if c.TenantID > 0 && c.TenantID != mSysRole.TenantID {
return errors.New("不可删除其他租户角色")
return errors.New("操作错误,角色信息不存在")
} else if c.TenantID > 0 && c.TenantID != mSysRole.TenantID {
return errors.New("操作错误,无权限操作")
}
if err = model2.Delete(mSysRole.SysRole); err != nil {
return err
}
go utils.TryCatch(func() {
//permission := service.NewPermission([]string{utils.UintToString(id)})(c.TenantKey, "")
//// 删除角色权限
//if _, err = permission.RemoveRolePolicy(); err != nil {
// logger.ErrorF("删除租户【%s】下角色【%d】权限信息错误%v", c.TenantKey, id, err)
// return
//}
permission := service.NewPermission(
service.WithAuthTenant(fmt.Sprintf("%d", mSysRole.TenantID)),
service.WithAuthRoles([]string{fmt.Sprintf("%d", id)}),
)
if _, err = permission.RemoveRolePolicy(); err != nil {
logger.ErrorF("Casbin 删除租户【%d】下角色【%d】权限信息错误%v", mSysRole.TenantID, id, err)
return
}
})
return nil
}
func NewInstance() InstanceHandle {
return func(session *service.Session) *Instance {
return &Instance{Platform: &controller.Platform{Session: session}}
return func(session *session.Admin) *Instance {
return &Instance{Admin: session}
}
}

View File

@ -19,7 +19,7 @@ type MenuHandle func(session *service.Session) *Menu
// List 菜单列表
func (c *Menu) List(roleID uint64) ([]*menu2.TreeChecked, error) {
mSysMenu := model3.NewSysMenu()
return menu2.MenuForRole(mSysMenu, c.TenantID, roleID)
return menu2.MenuForRoleChecked(mSysMenu, c.TenantID, roleID)
}
// Bind 绑定菜单

View File

@ -27,7 +27,7 @@ func (c *Auth) delete(tenantID uint64, tenantKey string, tx *gorm.DB) error {
return err
}
go utils.TryCatch(func() {
permission := service.NewPermission(nil)(tenantKey, "")
permission := service.NewPermission(service.WithAuthTenant(tenantKey))
if succ, err := permission.RemoveFilteredGroupingPolicy(); err != nil {
logger.ErrorF("删除租户【%s】权限信息错误%v", tenantKey, err)

View File

@ -19,7 +19,7 @@ type MenuHandle func(session *service.Session) *Menu
// List 菜单列表
func (c *Menu) List(tenantID uint64) ([]*menu2.TreeChecked, error) {
mSysMenu := model3.NewSysMenu()
return menu2.MenuForTenant(mSysMenu, tenantID)
return menu2.MenuForTenantChecked(mSysMenu, tenantID)
}
// Bind 绑定菜单

View File

@ -7,8 +7,13 @@ import (
"SciencesServer/app/service"
"SciencesServer/app/session"
"SciencesServer/config"
"SciencesServer/serve/logger"
"SciencesServer/serve/orm"
"SciencesServer/utils"
"errors"
"fmt"
"gorm.io/gorm"
"strings"
"time"
)
@ -21,9 +26,12 @@ type (
InstanceInfo struct {
ID string `json:"id"`
InstanceUserInfo
Gender model2.GenderKind `json:"gender"`
IsAdmin model2.SysUserAdministrator `json:"is_admin"`
CreatedAt time.Time `json:"created_at"`
Gender model2.GenderKind `json:"gender"`
IsAdmin model2.SysUserAdministrator `json:"is_admin"`
Status model2.SysUserStatus `json:"status"`
Department *InstanceDepartmentInfo `json:"department"`
Role *InstanceRoleInfo `json:"role"`
CreatedAt time.Time `json:"created_at"`
}
// InstanceUserInfo 用户信息
InstanceUserInfo struct {
@ -33,14 +41,85 @@ type (
Email string `json:"email"`
Mobile string `json:"mobile"`
}
// InstanceDepartmentInfo 部门信息
InstanceDepartmentInfo struct {
ID string `json:"id"`
Name string `json:"name"`
}
// InstanceRoleInfo 角色信息
InstanceRoleInfo struct {
IDs []string `json:"ids"`
Names []string `json:"names"`
}
)
// InstanceForm 表单信息
type InstanceForm struct {
ID uint64 // 租户用户主键ID
ID uint64
Account, Name, Mobile, Password, Remark string
Gender int
Departments, Roles []uint64
DepartmentID uint64
RoleIDs []uint64
}
func (c *InstanceForm) sync(tx *gorm.DB, first bool, uid, tenantID uint64) error {
var err error
mSysUserDepartment := model.NewSysUserDepartment()
mSysUserRole := model.NewSysUserRole()
permission := service.NewPermission(
service.WithAuthTenant(fmt.Sprintf("%d", tenantID)),
service.WithAuthUser(fmt.Sprintf("%d", uid)),
)
if !first {
if err = model2.DeleteWhere(mSysUserDepartment.SysUserDepartment, []*model2.ModelWhere{
model2.NewWhere("uid", uid)}, tx); err != nil {
return err
}
if err = model2.DeleteWhere(mSysUserRole.SysUserRole, []*model2.ModelWhere{
model2.NewWhere("uid", uid)}, tx); err != nil {
return err
}
go utils.TryCatch(func() {
if _, err = permission.DeleteRolesForUser(false); err != nil {
logger.ErrorF("Casbin 删除用户【%d】权限错误%v", uid, err)
}
})
}
if c.DepartmentID > 0 {
mSysUserDepartment.UID = uid
mSysUserDepartment.DepartmentID = c.DepartmentID
if err = model2.Create(mSysUserDepartment.SysUserDepartment, tx); err != nil {
return err
}
}
if len(c.RoleIDs) > 0 {
roles := make([]*model2.SysUserRole, 0)
rolesIDs := make([]string, 0)
for _, v := range c.RoleIDs {
roles = append(roles, &model2.SysUserRole{
UID: uid,
RoleID: v,
})
rolesIDs = append(rolesIDs, fmt.Sprintf("%d", v))
}
if err := model2.Creates(mSysUserRole.SysUserRole, roles, tx); err != nil {
return err
}
go utils.TryCatch(func() {
permission.AddRole(rolesIDs)
if _, err = permission.AddRoleForUser(); err != nil {
logger.ErrorF("Casbin 给予用户【%d】权限错误%v", uid, err)
}
})
}
return nil
}
// Info 用户信息
@ -60,50 +139,59 @@ func (c *Instance) Info() (*InstanceUserInfo, error) {
// Index 列表信息
func (c *Instance) Index(name, mobile string, status, page, pageSize int) (*controller.ReturnPages, error) {
where := []*model2.ModelWhereOrder{&model2.ModelWhereOrder{
Where: model2.NewWhere("tenant_id", c.TenantID),
Order: model2.NewOrder("id", model2.OrderModeToDesc),
}}
where := []*model2.ModelWhere{model2.NewWhere("u.tenant_id", c.TenantID)}
if name != "" {
where = append(where, &model2.ModelWhereOrder{
Where: model2.NewWhereLike("name", name),
})
where = append(where, model2.NewWhereLike("u.name", name))
}
if mobile != "" {
where = append(where, &model2.ModelWhereOrder{
Where: model2.NewWhereLike("mobile", mobile),
})
where = append(where, model2.NewWhereLike("u.mobile", mobile))
}
if status > 0 {
where = append(where, &model2.ModelWhereOrder{
Where: model2.NewWhere("status", status),
})
where = append(where, model2.NewWhere("u.status", status))
}
mSysUser := model.NewSysUser()
out := make([]*model2.SysUser, 0)
var count int64
if err := model2.PagesFields(mSysUser.SysUser, &out, []string{"id", "uuid", "account", "avatar", "name", "mobile", "gender",
"is_admin", "created_at"}, page, pageSize, &count, where...); err != nil {
out, err := mSysUser.Users(page, pageSize, &count, where...)
if err != nil {
return nil, err
}
list := make([]*InstanceInfo, 0)
obj := new(model2.Model)
for _, v := range out {
list = append(list, &InstanceInfo{ID: v.GetEncodeID(),
data := &InstanceInfo{ID: v.GetEncodeID(),
InstanceUserInfo: InstanceUserInfo{
UID: v.UUIDString(),
Avatar: v.Avatar,
Name: v.Name,
Email: v.Email,
Mobile: v.Mobile,
UID: v.UUIDString(), Avatar: v.Avatar, Name: v.Name, Email: v.Email, Mobile: v.Mobile,
},
Gender: v.Gender.Gender,
IsAdmin: v.IsAdmin,
CreatedAt: v.CreatedAt,
})
Gender: v.Gender.Gender, IsAdmin: v.IsAdmin, Status: v.Status, CreatedAt: v.CreatedAt,
}
if v.DepartmentID > 0 {
obj.ID = v.DepartmentID
data.Department = &InstanceDepartmentInfo{
ID: obj.GetEncodeID(),
Name: v.DepartmentName,
}
}
if v.RoleIDs != "" {
roleIDs := make([]string, 0)
for _, v := range strings.Split(v.RoleIDs, "&&") {
obj.ID = utils.StringToUnit64(v)
roleIDs = append(roleIDs, obj.GetEncodeID())
}
roles := &InstanceRoleInfo{
IDs: roleIDs,
Names: strings.Split(v.RoleNames, "&&"),
}
data.Role = roles
}
list = append(list, data)
}
return &controller.ReturnPages{Data: list, Count: count}, nil
}
@ -123,14 +211,25 @@ func (c *Instance) Add(params *InstanceForm) error {
if err != nil {
return err
}
mSysUser.Account = params.Account
mSysUser.Name = params.Name
mSysUser.Mobile = params.Mobile
mSysUser.Gender.Gender = model2.GenderKind(params.Gender)
mSysUser.Password = params.Password
mSysUser.Remark = params.Remark
return model2.Create(mSysUser.SysUser)
return orm.GetDB().Transaction(func(tx *gorm.DB) error {
mSysUser.TenantID = c.TenantID
mSysUser.Account = params.Account
mSysUser.Name = params.Name
mSysUser.Mobile = params.Mobile
mSysUser.Gender.Gender = model2.GenderKind(params.Gender)
mSysUser.Password = params.Password
mSysUser.Remark = params.Remark
if err = model2.Create(mSysUser.SysUser, tx); err != nil {
return err
}
if err = params.sync(tx, true, mSysUser.UUID, c.TenantID); err != nil {
return err
}
return nil
})
}
// Edit 修改用户信息
@ -166,7 +265,15 @@ func (c *Instance) Edit(params *InstanceForm) error {
mSysUser.Gender.Gender = model2.GenderKind(params.Gender)
mSysUser.Remark = params.Remark
return model2.Updates(mSysUser.SysUser, mSysUser.SysUser)
return orm.GetDB().Transaction(func(tx *gorm.DB) error {
if err = model2.Updates(mSysUser.SysUser, mSysUser.SysUser, tx); err != nil {
return err
}
if err = params.sync(tx, false, mSysUser.UUID, mSysUser.TenantID); err != nil {
return err
}
return nil
})
}
func (c *Instance) Password(id uint64, password, repeatPwd string) error {

View File

@ -1,8 +1,9 @@
package user
import (
menu2 "SciencesServer/app/api/admin/controller/menu"
"SciencesServer/app/api/admin/controller/menu"
"SciencesServer/app/api/admin/model"
model2 "SciencesServer/app/common/model"
"SciencesServer/app/session"
)
@ -10,26 +11,22 @@ type Menu struct{ *session.Admin }
type MenuHandle func(session *session.Admin) *Menu
// List 菜单列表
func (c *Menu) List() (interface{}, error) {
// Index 菜单列表
func (c *Menu) Index() ([]*menu.Tree, error) {
mSysMenu := model.NewSysMenu()
if c.IsAdmin {
return menu2.MenuForSystem(mSysMenu)
kinds := []model2.SysMenuKind{
model2.SysMenuKindForCatalogue,
model2.SysMenuKindForMenu,
}
//mSysUserTenant := model.NewSysUserTenant()
//
//if isExist, err := model2.FirstField(mSysUserTenant.SysUserTenant, []string{"id", "identity"},
// model2.NewWhere("tenant_id", c.TenantID), model2.NewWhere("uid", c.UID)); err != nil {
// return nil, err
//} else if !isExist {
// return nil, nil
//}
//if mSysUserTenant.Identity == model2.SysUserTenantIdentityForSystemAdmin {
// return menu2.MenuForTenant(mSysMenu, c.TenantID)
//}
//return menu2.MenuForUser(mSysMenu, c.TenantID, c.UID)
return nil, nil
if c.IsAdmin {
if c.TenantID > 0 {
return menu.MenuForTenant(mSysMenu, c.TenantID, model2.NewWhereIn("m.kind", kinds))
}
return menu.MenuForSystem(mSysMenu, model2.NewWhereIn("kind", kinds))
}
return menu.MenuForUser(mSysMenu, c.TenantID, c.UID, model2.NewWhereIn("m.kind", kinds))
}
func NewMenu() MenuHandle {

View File

@ -11,7 +11,7 @@ type SysMenu struct {
}
type SysMenuScene struct {
ID uint64 `json:"id"`
model.Model
*model.SysMenuBasic
SceneID uint64 `json:"scene_id"` // 场景(租户,角色)
}
@ -36,21 +36,71 @@ func (m *SysMenu) SystemMenu(where ...*model.ModelWhere) ([]*model.SysMenu, erro
out := make([]*model.SysMenu, 0)
db := orm.GetDB().Table(m.TableName()).
Where("status = ? AND is_deleted = ?", model.SysMenuStatusForNormal, model.DeleteStatusForNot)
Where("is_deleted = ?", model.DeleteStatusForNot)
if len(where) > 0 {
for _, wo := range where {
db = db.Where(wo.Condition, wo.Value)
}
}
if err := db.Order("parent_id " + model.OrderModeToAsc).Order("sort " + model.OrderModeToDesc).Scan(&out).Error; err != nil {
if err := db.Order("parent_id " + model.OrderModeToAsc).Order("sort " + model.OrderModeToAsc).Scan(&out).Error; err != nil {
return nil, err
}
return out, nil
}
// TenantMenu 租户菜单
func (m *SysMenu) TenantMenu(tenantID uint64) ([]*SysMenuScene, error) {
func (m *SysMenu) TenantMenu(tenantID uint64, where ...*model.ModelWhere) ([]*model.SysMenu, error) {
mSysTenantMenu := NewSysTenantMenu()
out := make([]*model.SysMenu, 0)
db := orm.GetDB().Table(m.TableName()+" m").
Select("m.*").
Joins(fmt.Sprintf("RIGHT JOIN %s AS t_m ON m.id = t_m.menu_id AND t_m.tenant_id = %d AND t_m.is_deleted = %d",
mSysTenantMenu.TableName(), tenantID, model.DeleteStatusForNot)).
Where("m.is_deleted = ?", model.DeleteStatusForNot)
if len(where) > 0 {
for _, wo := range where {
db = db.Where(wo.Condition, wo.Value)
}
}
if err := db.Order("m.parent_id " + model.OrderModeToAsc).Order("m.sort " + model.OrderModeToAsc).Scan(&out).Error; err != nil {
return nil, err
}
return out, nil
}
// UserMenu 用户菜单
func (m *SysMenu) UserMenu(tenantID, uid uint64, where ...*model.ModelWhere) ([]*model.SysMenu, error) {
mSysUserRole := NewSysUserRole()
mSysRoleMenu := NewSysRoleMenu()
out := make([]*model.SysMenu, 0)
db := orm.GetDB().Table(mSysUserRole.TableName()+" AS u_r").
Select("m.id, m.parent_id, m.name, m.kind, m.link, m.component, m.icon, m.status, m.is_cache, m.is_hidden").
Joins(fmt.Sprintf("LEFT JOIN %s AS r_m ON u_r.role_id = r_m.id AND r_m.is_deletd = %d",
mSysRoleMenu.TableName(), model.DeleteStatusForNot)).
Joins(fmt.Sprintf("LEFT JOIN %s AS m ON r_m.menu_id = m.id AND m.status = %d AND m.is_deleted = %d",
m.TableName(), model.SysMenuStatusForNormal, model.DeleteStatusForNot)).
Where("u_r.tenant_id = ? AND u_r.uid = ? AND u_r.is_deleted = ?", tenantID, uid, model.DeleteStatusForNot)
if len(where) > 0 {
for _, wo := range where {
db = db.Where(wo.Condition, wo.Value)
}
}
if err := db.Order("m.parent_id " + model.OrderModeToAsc).Order("m.sort " + model.OrderModeToAsc).Scan(&out).Error; err != nil {
return nil, err
}
return out, nil
}
// TenantMenuChecked 租户选中菜单
func (m *SysMenu) TenantMenuChecked(tenantID uint64) ([]*SysMenuScene, error) {
mSysTenantMenu := NewSysTenantMenu()
out := make([]*SysMenuScene, 0)
@ -61,14 +111,14 @@ func (m *SysMenu) TenantMenu(tenantID uint64) ([]*SysMenuScene, error) {
mSysTenantMenu.TableName(), tenantID, model.DeleteStatusForNot)).
Where("m.status = ? AND m.is_deleted = ?", model.SysMenuStatusForNormal, model.DeleteStatusForNot)
if err := db.Order("m.parent_id " + model.OrderModeToAsc).Order("m.sort " + model.OrderModeToDesc).Scan(&out).Error; err != nil {
if err := db.Order("m.parent_id " + model.OrderModeToAsc).Order("m.sort " + model.OrderModeToAsc).Scan(&out).Error; err != nil {
return nil, err
}
return out, nil
}
// RoleMenu 角色菜单
func (m *SysMenu) RoleMenu(tenantID uint64, roleID uint64) ([]*SysMenuScene, error) {
// RoleMenuChecked 角色菜单
func (m *SysMenu) RoleMenuChecked(tenantID uint64, roleID uint64) ([]*SysMenuScene, error) {
mSysTenantMenu := NewSysTenantMenu()
mSysRoleMenu := NewSysRoleMenu()
@ -84,29 +134,7 @@ func (m *SysMenu) RoleMenu(tenantID uint64, roleID uint64) ([]*SysMenuScene, err
Where("m.status = ? AND m.is_deleted = ?", model.SysMenuStatusForNormal, model.DeleteStatusForNot).
Where("t_m.id > ?", 0)
if err := db.Order("m.parent_id " + model.OrderModeToAsc).Order("m.sort " + model.OrderModeToDesc).Scan(&out).Error; err != nil {
return nil, err
}
return out, nil
}
// UserMenu 用户菜单
func (m *SysMenu) UserMenu(tenantID, uid uint64) ([]*SysMenuScene, error) {
mSysUserRole := NewSysUserRole()
mSysRoleMenu := NewSysRoleMenu()
out := make([]*SysMenuScene, 0)
db := orm.GetDB().Table(mSysUserRole.TableName()+" AS u_r").
Select("m.id, m.parent_id, m.name, m.kind, m.link, m.component, m.icon").
Joins(fmt.Sprintf("LEFT JOIN %s AS r_m ON u_r.role_id = r_m.id AND r_m.is_deletd = %d",
mSysRoleMenu.TableName(), model.DeleteStatusForNot)).
Joins(fmt.Sprintf("LEFT JOIN %s AS m ON r_m.menu_id = m.id AND m.status = %d AND m.is_deleted = %d",
m.TableName(), model.SysMenuStatusForNormal, model.DeleteStatusForNot)).
Where("u_r.tenant_id = ? AND u_r.uid = ? AND u_r.is_deleted = ?", tenantID, uid, model.DeleteStatusForNot)
if err := db.Order("m.parent_id " + model.OrderModeToAsc).Order("m.sort " + model.OrderModeToDesc).Scan(&out).Error; err != nil {
if err := db.Order("m.parent_id " + model.OrderModeToAsc).Order("m.sort " + model.OrderModeToAsc).Scan(&out).Error; err != nil {
return nil, err
}
return out, nil

View File

@ -5,6 +5,7 @@ import (
"SciencesServer/serve/orm"
"SciencesServer/utils"
"errors"
"fmt"
"gorm.io/gorm"
)
@ -14,6 +15,17 @@ type SysUser struct {
*model.SysUser
}
type (
// SysUserInfo 用户信息
SysUserInfo struct {
*model.SysUser
DepartmentID uint64 `json:"-"`
DepartmentName string `json:"-"`
RoleIDs string `json:"-"`
RoleNames string `json:"-"`
}
)
func (m *SysUser) ValidatePassword(password string) bool {
return utils.HashCompare([]byte(m.Password), []byte(utils.Md5String(password, m.Salt)))
}
@ -38,6 +50,37 @@ func (m *SysUser) GetByAccountOrMobile(account string, tenantID uint64) (bool, e
return true, nil
}
// Users 用户信息
func (m *SysUser) Users(page, pageSize int, count *int64, where ...*model.ModelWhere) ([]*SysUserInfo, error) {
db := orm.GetDB().Table(m.TableName()+" AS u").
Select("u.id", "u.uuid", "u.account", "u.avatar", "u.name", "u.mobile", "u.gender",
"u.is_admin", "u.status", "u.created_at", "d.id AS department_id", "d.name AS department_name",
"u_r.role_ids", "u_r.role_names").
Joins(fmt.Sprintf("LEFT JOIN %s AS u_d ON u.uuid = u_d.uid AND u_d.is_deleted = %d",
model.NewSysUserDepartment().TableName(), model.DeleteStatusForNot)).
Joins(fmt.Sprintf("LEFT JOIN %s AS d ON u_d.department_id = d.id",
model.NewSysDepartment().TableName())).
Joins(fmt.Sprintf("LEFT JOIN (SELECT uid, GROUP_CONCAT(r.id SEPARATOR '&&') AS role_ids, GROUP_CONCAT(r.name SEPARATOR '&&') AS role_names "+
"FROM %s AS u LEFT JOIN %s AS r ON u.role_id = r.id WHERE u.is_deleted = %d GROUP BY u.uid) u_r ON u.uuid = u_r.uid",
model.NewSysUserRole().TableName(), model.NewSysRole().TableName(), model.DeleteStatusForNot)).
Where("u.is_deleted = ?", model.DeleteStatusForNot)
if len(where) > 0 {
for _, wo := range where {
db = db.Where(wo.Condition, wo.Value)
}
}
out := make([]*SysUserInfo, 0)
if err := db.Count(count).Error; err != nil {
return nil, err
}
if err := db.Order("u.id " + model.OrderModeToDesc).Offset((page - 1) * pageSize).Limit(pageSize).Scan(&out).Error; err != nil {
return nil, err
}
return out, nil
}
func NewSysUser() *SysUser {
return &SysUser{SysUser: model.NewSysUser()}
}

View File

@ -0,0 +1,11 @@
package model
import "SciencesServer/app/common/model"
type SysUserDepartment struct {
*model.SysUserDepartment
}
func NewSysUserDepartment() *SysUserDepartment {
return &SysUserDepartment{model.NewSysUserDepartment()}
}