zwxi 1 year ago
parent
commit
c4e0c48cd6

+ 54 - 0
controllers/admin.go

@@ -0,0 +1,54 @@
+package controllers
+
+import (
+	"eta/eta_hub/models"
+	"eta/eta_hub/models/system"
+	"eta/eta_hub/utils"
+	"fmt"
+	"net/url"
+)
+
+// 系统用户
+type SysAdminController struct {
+	BaseAuthController
+}
+
+// Add
+// @Title 用户详情信息
+// @Description 用户详情信息
+// @Param	request	body system.SysuserAddReq true "type json string"
+// @Success 200 新增成功
+// @router /sysuser/check [get]
+func (this *SysAdminController) Detail() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var resp system.UserCheckResp
+	userCode := this.GetString("authCode")
+
+	// 解码字符串
+	userCode, err := url.QueryUnescape(userCode)
+	if err != nil {
+		fmt.Println("解码失败:", err)
+		return
+	}
+	adminName := utils.DesBase64Decrypt([]byte(userCode), utils.DesKeySalt)
+	admin, err := system.GetSysUserByAdminName(string(adminName))
+	if err != nil && err.Error() != utils.ErrNoRow(){
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败" + err.Error()
+		return
+	}
+
+	if admin != nil {
+		resp.IsUser = true
+		resp.AdminInfo = admin
+	}
+
+	br.Data = resp
+	br.Ret = 200
+	br.Msg = "获取成功"
+}
+

+ 138 - 2
controllers/report_approval.go → controllers/report.go

@@ -49,8 +49,8 @@ func (this *ReportController) List() {
 	keyword = strings.TrimSpace(keyword)
 	if keyword != "" {
 		kw := fmt.Sprint("%", keyword, "%")
-		condition += ` AND title LIKE ? `
-		pars = append(pars, kw)
+		condition += ` AND (title LIKE ? OR author LIKE ?) `
+		pars = append(pars, kw, kw)
 	}
 	state, _ := this.GetInt("State")
 	if state > 0 {
@@ -235,3 +235,139 @@ func (this *ReportController) Approve() {
 	br.Ret = 200
 	br.Msg = "审批成功"
 }
+
+// @Title 获取分类列表
+// @Description 获取分类列表
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   KeyWord   query   string  true       "检索关键词"
+// @Param   CompanyType   query   string  false       "产品类型,枚举值:'ficc','权益';不传默认返回全部"
+// @Param   HideDayWeek   query   int  false       "是否隐藏晨周报"
+// @Success 200 {object} models.Classify
+// @router /classify/list [get]
+func (this *ReportController) ListClassify() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+	keyWord := this.GetString("KeyWord")
+	//companyType := this.GetString("CompanyType")
+	companyType := ""
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+
+	startSize = utils.StartIndex(currentIndex, pageSize)
+	list, err := models.GetClassifyList(startSize, pageSize, keyWord, companyType)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	total, err := models.GetClassifyListCount(keyWord, companyType)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+
+	parentIds := make([]int, 0)
+	for i := range list {
+		parentIds = append(parentIds, list[i].Id)
+	}
+	parentIdLen := len(parentIds)
+	if parentIdLen == 0 {
+		resp := &models.ClassifyListResp{
+			List:   list,
+			Paging: paging.GetPaging(currentIndex, pageSize, 0),
+		}
+		br.Data = resp
+		br.Ret = 200
+		br.Msg = "获取成功"
+		return
+	}
+
+	// 获取一级分类-子目录列表
+	menuListMap := make(map[int][]*models.ClassifyMenu, 0)
+	var menuCond string
+	var menuPars []interface{}
+	menuCond += ` AND classify_id IN (` + utils.GetOrmInReplace(parentIdLen) + `)`
+	menuPars = append(menuPars, parentIds)
+	parentMenus, e := models.GetClassifyMenuList(menuCond, menuPars)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取一级分类子目录列表失败"
+		return
+	}
+	for i := range parentMenus {
+		if menuListMap[parentMenus[i].ClassifyId] == nil {
+			menuListMap[parentMenus[i].ClassifyId] = make([]*models.ClassifyMenu, 0)
+		}
+		menuListMap[parentMenus[i].ClassifyId] = append(menuListMap[parentMenus[i].ClassifyId], parentMenus[i])
+	}
+
+	// 获取子分类
+	children, e := models.GetClassifyChildByParentIds(parentIds, keyWord)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取子分类失败"
+		return
+	}
+	childrenIds := make([]int, 0)
+	for i := range children {
+		childrenIds = append(childrenIds, children[i].Id)
+	}
+	childrenIdsLen := len(childrenIds)
+
+	// 获取二级分类-子目录关联
+	relateMap := make(map[int]int, 0)
+	if childrenIdsLen > 0 {
+		var relateCond string
+		var relatePars []interface{}
+		relateCond += ` AND classify_id IN (` + utils.GetOrmInReplace(childrenIdsLen) + `)`
+		relatePars = append(relatePars, childrenIds)
+		relates, e := models.GetClassifyMenuRelationList(relateCond, relatePars)
+		if e != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取二级分类子目录关联失败, Err: " + e.Error()
+			return
+		}
+		for i := range relates {
+			relateMap[relates[i].ClassifyId] = relates[i].MenuId
+		}
+	}
+
+	// 二级分类
+	childrenMap := make(map[int][]*models.ClassifyItem, 0)
+	for i := range children {
+		if childrenMap[children[i].ParentId] == nil {
+			childrenMap[children[i].ParentId] = make([]*models.ClassifyItem, 0)
+		}
+		childrenMap[children[i].ParentId] = append(childrenMap[children[i].ParentId], &models.ClassifyItem{
+			Classify:       *children[i],
+			//ClassifyMenuId: relateMap[children[i].Id],
+		})
+	}
+
+	// 一级分类
+	for i := range list {
+		//list[i].ClassifyMenuList = menuListMap[list[i].Id]
+		list[i].Child = childrenMap[list[i].Id]
+	}
+
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	resp := new(models.ClassifyListResp)
+	resp.List = list
+	resp.Paging = page
+	br.Data = resp
+	br.Ret = 200
+	br.Msg = "获取成功"
+}

+ 0 - 0
controllers/smart_report_approval.go → controllers/smart_report.go


+ 98 - 0
models/classify.go

@@ -0,0 +1,98 @@
+package models
+
+import (
+	"eta/eta_hub/utils"
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"time"
+)
+
+type Classify struct {
+	Id                int       `orm:"column(id);pk"`
+	ClassifyName      string    `description:"分类名称"`
+	Sort              int       `json:"-"`
+	ParentId          int       `description:"父级分类id"`
+	CreateTime        time.Time `json:"-" description:"创建时间"`
+	ModifyTime        time.Time `json:"-" description:"修改时间"`
+	Abstract          string    `json:"-" description:"栏目简介"`
+	Descript          string    `json:"-" description:"分享描述"`
+	ReportAuthor      string    `json:"-" description:"栏目作者"`
+	AuthorDescript    string    `json:"-" description:"作者简介"`
+	ColumnImgUrl      string    `json:"-" description:"栏目配图"`
+	HeadImgUrl        string    `json:"-" description:"头部banner"`
+	AvatarImgUrl      string    `json:"-" description:"头像"`
+	ReportImgUrl      string    `json:"-" description:"报告配图"`
+	HomeImgUrl        string    `json:"-" description:"首页配图"`
+	ClassifyLabel     string    `description:"分类标签"`
+	ShowType          int       `json:"-" description:"展示类型:1-列表 2-专栏"`
+	HasTeleconference int       `json:"-" description:"是否有电话会:0-否 1-是"`
+	VipTitle          string    `json:"-" description:"研究员头衔"`
+	IsShow            int       `json:"-" description:"是否在小程序显示:1-显示 0-隐藏"`
+	YbFiccSort        int       `json:"-" description:"小程序FICC页排序"`
+	YbFiccIcon        string    `json:"-" description:"小程序FICC页icon"`
+	YbFiccPcIcon      string    `json:"-" description:"小程序PC端FICC页背景图"`
+	YbIconUrl         string    `json:"-" description:"小程序已购页icon"`
+	YbBgUrl           string    `json:"-" description:"小程序已购详情背景图"`
+	YbListImg         string    `json:"-" description:"小程序研报列表封面图"`
+	YbShareBgImg      string    `json:"-" description:"小程序研报详情分享背景图"`
+	YbRightBanner     string    `json:"-" description:"Pc端详情页,右侧,报告合集背景图"`
+	RelateTel         int       `json:"-" description:"是否在电话会中可选: 0-否; 1-是"`
+	RelateVideo       int       `json:"-" description:"是否在路演视频中可选: 0-否; 1-是"`
+	IsMassSend        int       `json:"-" description:"1:群发,0:非群发"`
+}
+
+type ClassifyListResp struct {
+	List   []*ClassifyList
+	Paging *paging.PagingItem `description:"分页数据"`
+}
+
+type ClassifyList struct {
+	Id                int       `orm:"column(id);pk"`
+	ClassifyName      string    `description:"分类名称"`
+	Sort              int       `description:"排序"`
+	ParentId          int       `description:"父级分类id"`
+	CreateTime        time.Time `json:"-" description:"创建时间"`
+	ModifyTime        time.Time `json:"-" description:"修改时间"`
+	Abstract          string    `description:"简介"`
+	Descript          string    `description:"描述"`
+	ClassifyLabel     string    `description:"分类标签"`
+	ShowType          int       `json:"-" description:"展示类型:1-列表 2-专栏"`
+	HasTeleconference int       `json:"-" description:"是否有电话会:0-否 1-是"`
+	IsShow            int       `json:"-" description:"是否在小程序显示:1-显示 0-隐藏"`
+	YbFiccSort        int       `json:"-" description:"小程序FICC页排序"`
+	YbFiccIcon        string    `json:"-" description:"小程序FICC页icon"`
+	YbFiccPcIcon      string    `json:"-" description:"小程序PC端FICC页背景图"`
+	YbIconUrl         string    `json:"-" description:"小程序已购页icon"`
+	YbBgUrl           string    `json:"-" description:"小程序已购详情背景图"`
+	YbListImg         string    `json:"-" description:"小程序研报列表封面图"`
+	YbShareBgImg      string    `json:"-" description:"小程序研报详情分享背景图"`
+	YbRightBanner     string    `json:"-" description:"Pc端详情页,右侧,报告合集背景图"`
+	RelateTel         int       `json:"-" description:"是否在电话会中可选: 0-否; 1-是"`
+	RelateVideo       int       `json:"-" description:"是否在路演视频中可选: 0-否; 1-是"`
+	Child             []*ClassifyItem
+	//ClassifyMenuList  []*ClassifyMenu
+}
+
+type ClassifyItem struct {
+	Classify
+}
+
+func GetClassifyChildByParentIds(parentId []int, keyWord string) (items []*Classify, err error) {
+	parentIdLen := len(parentId)
+	if parentIdLen == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("rddp")
+	sql := ``
+	pars := make([]interface{}, 0)
+	pars = append(pars, parentId)
+	if keyWord != "" {
+		sql = `SELECT * FROM classify WHERE parent_id IN (` + utils.GetOrmInReplace(parentIdLen) + `) AND classify_name LIKE ? ORDER BY create_time ASC `
+		pars = append(pars, utils.GetLikeKeyword(keyWord))
+	} else {
+		sql = `SELECT * FROM classify WHERE parent_id IN (` + utils.GetOrmInReplace(parentIdLen) + `) ORDER BY create_time ASC `
+	}
+	_, err = o.Raw(sql, pars...).QueryRows(&items)
+
+	return
+}

+ 26 - 0
models/classify_menu.go

@@ -0,0 +1,26 @@
+package models
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+// ClassifyMenu 报告分类-子目录表
+type ClassifyMenu struct {
+	MenuId     int       `orm:"column(menu_id);pk"`
+	MenuName   string    `description:"子目录名称"`
+	ClassifyId int       `description:"一级分类ID"`
+	Sort       int       `description:"排序"`
+	CreateTime time.Time `json:"-" description:"创建时间"`
+	ModifyTime time.Time `json:"-" description:"更新时间"`
+}
+
+// GetClassifyMenuList 获取子目录列表
+func GetClassifyMenuList(condition string, pars []interface{}) (list []*ClassifyMenu, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `SELECT * FROM classify_menu WHERE 1 = 1 `
+	sql += condition
+	sql += ` ORDER BY sort ASC, create_time ASC`
+	_, err = o.Raw(sql, pars).QueryRows(&list)
+	return
+}

+ 87 - 0
models/classify_menu_relation.go

@@ -0,0 +1,87 @@
+package models
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+// ClassifyMenuRelation 报告分类-子目录关联表
+type ClassifyMenuRelation struct {
+	Id         int       `orm:"column(id);pk"`
+	MenuId     int       `description:"子目录ID"`
+	ClassifyId int       `description:"二级分类ID"`
+	CreateTime time.Time `description:"创建时间"`
+}
+
+func (item *ClassifyMenuRelation) TableName() string {
+	return "classify_menu_relation"
+}
+
+func (item *ClassifyMenuRelation) Create() (err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	id, err := o.Insert(item)
+	if err != nil {
+		return
+	}
+	item.Id = int(id)
+	return
+}
+
+func (item *ClassifyMenuRelation) Update(cols []string) (err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	_, err = o.Update(item, cols...)
+	return
+}
+
+func (item *ClassifyMenuRelation) InsertMulti(items []*ClassifyMenuRelation) (err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	_, err = o.InsertMulti(len(items), items)
+	return
+}
+
+// GetClassifyMenuRelationList 获取子目录关联列表
+func GetClassifyMenuRelationList(condition string, pars []interface{}) (list []*ClassifyMenuRelation, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `SELECT * FROM classify_menu_relation WHERE 1 = 1 `
+	sql += condition
+	sql += ` ORDER BY create_time DESC`
+	_, err = o.Raw(sql, pars).QueryRows(&list)
+	return
+}
+
+// DeleteAndInsertClassifyMenuRelation 新增子目录关联
+func DeleteAndInsertClassifyMenuRelation(classifyId, menuId int) (err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	tx, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = tx.Rollback()
+		} else {
+			_ = tx.Commit()
+		}
+	}()
+
+	// 删除
+	sql := `DELETE FROM classify_menu_relation WHERE classify_id = ?`
+	if _, e := tx.Raw(sql, classifyId).Exec(); e != nil {
+		err = e
+		return
+	}
+
+	// 新增
+	if menuId > 0 {
+		relate := &ClassifyMenuRelation{
+			ClassifyId: classifyId,
+			MenuId:     menuId,
+			CreateTime: time.Now().Local(),
+		}
+		_, e := tx.Insert(relate)
+		if e != nil {
+			err = e
+		}
+	}
+	return
+}

+ 63 - 0
models/report.go

@@ -503,3 +503,66 @@ func (m *Report) UpdateReport(cols []string) (err error) {
 	_, err = o.Update(m, cols...)
 	return
 }
+
+// 获取分类列表
+func GetClassifyList(startSize, pageSize int, keyWord, companyType string) (items []*ClassifyList, err error) {
+	sql := ``
+	companyTypeSqlStr := ``
+	if companyType == "ficc" {
+		companyTypeSqlStr = " AND id != 40 AND parent_id != 40 "
+	} else if companyType == "权益" {
+		companyTypeSqlStr = " AND (id = 40 or parent_id = 40)  "
+	}
+	pars := make([]interface{}, 0)
+	if keyWord != "" {
+		sql = `SELECT * FROM (
+                   SELECT * FROM classify
+                   WHERE parent_id=0 ` + companyTypeSqlStr + `  AND classify_name LIKE ?
+                   UNION
+                   SELECT * FROM classify
+                   WHERE id IN( SELECT parent_id FROM classify
+                   WHERE parent_id>0 ` + companyTypeSqlStr + `  AND classify_name LIKE ? )
+                   )AS t
+                   ORDER BY sort ASC,create_time ASC
+                   LIMIT ?,? `
+		pars = utils.GetLikeKeywordPars(pars, keyWord, 2)
+	} else {
+		sql = `SELECT * FROM classify WHERE parent_id=0 ` + companyTypeSqlStr
+		sql += ` ORDER BY sort ASC, create_time ASC LIMIT ?,? `
+	}
+	pars = append(pars, startSize, pageSize)
+
+	o := orm.NewOrmUsingDB("rddp")
+	_, err = o.Raw(sql, pars...).QueryRows(&items)
+	return
+}
+
+func GetClassifyListCount(keyWord, companyType string) (count int, err error) {
+	sqlCount := ``
+
+	companyTypeSqlStr := ``
+	if companyType == "ficc" {
+		companyTypeSqlStr = " AND id != 40 AND parent_id != 40 "
+	} else if companyType == "权益" {
+		companyTypeSqlStr = " AND (id = 40 or parent_id = 40)  "
+	}
+
+	pars := make([]interface{}, 0)
+
+	if keyWord != "" {
+		sqlCount = `SELECT  COUNT(1) AS count FROM (
+               SELECT * FROM classify
+               WHERE parent_id=0 ` + companyTypeSqlStr + `  AND classify_name LIKE ?
+               UNION
+               SELECT * FROM classify
+               WHERE id IN(SELECT parent_id FROM classify
+               WHERE parent_id>0 ` + companyTypeSqlStr + `  AND classify_name LIKE ? )
+               )AS t `
+		pars = utils.GetLikeKeywordPars(pars, keyWord, 2)
+	} else {
+		sqlCount = `SELECT COUNT(1) AS count FROM classify WHERE parent_id=0 ` + companyTypeSqlStr
+	}
+	o := orm.NewOrmUsingDB("rddp")
+	err = o.Raw(sqlCount, pars...).QueryRow(&count)
+	return
+}

+ 104 - 0
models/system/sys_user.go

@@ -0,0 +1,104 @@
+package system
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type Admin struct {
+	AdminId                   int    `orm:"column(admin_id);pk" description:"系统用户id"`
+	AdminName                 string `description:"系统用户名称"`
+	AdminAvatar               string `description:"用户头像"`
+	RealName                  string `description:"系统用户姓名"`
+	Password                  string `json:"-"`
+	LastUpdatedPasswordTime   string `json:"-"`
+	Enabled                   int
+	Email                     string `description:"系统用户邮箱"`
+	LastLoginTime             string
+	CreatedTime               time.Time
+	LastUpdatedTime           string
+	Role                      string    `description:"系统用户角色"`
+	Mobile                    string    `description:"手机号"`
+	RoleType                  int       `description:"角色类型:1需要录入指标,0:不需要"`
+	RoleId                    int       `description:"角色ID"`
+	RoleName                  string    `description:"角色名称"`
+	RoleTypeCode              string    `description:"角色类型编码"`
+	DepartmentId              int       `description:"部门id"`
+	DepartmentName            string    `description:"部门名称"`
+	GroupId                   int       `description:"分组id"`
+	GroupName                 string    `description:"分组名称"`
+	Authority                 int       `description:"管理权限,0:无,1:部门负责人,2:小组负责人,或者ficc销售主管,3:超级管理员,4:ficc销售组长"`
+	Position                  string    `description:"职位"`
+	DisableTime               time.Time `description:"禁用时间"`
+	ChartPermission           int8      `description:"图表权限id"`
+	OpenId                    string    `description:"弘则部门公众号的openid"`
+	UnionId                   string    `description:"微信公众平台唯一标识"`
+	EdbPermission             int8      `description:"指标库操作权限,0:只能操作 自己的,1:所有指标可操作"`
+	MysteelChemicalPermission int8      `description:"钢联化工指标操作权限,0:只能操作 自己的,1:所有指标可操作"`
+	PredictEdbPermission      int8      `description:"预测指标库操作权限,0:只能操作 自己的,1:所有预测指标可操作"`
+	Province                  string    `description:"省"`
+	ProvinceCode              string    `description:"省编码"`
+	City                      string    `description:"市"`
+	CityCode                  string    `description:"市编码"`
+	EmployeeId                string    `description:"员工工号(钉钉/每刻报销)"`
+	TelAreaCode               string    `description:"手机区号"`
+}
+
+type AdminItem struct {
+	AdminId                   int    `orm:"column(admin_id);pk" description:"系统用户id"`
+	AdminName                 string `description:"系统用户名称"`
+	AdminAvatar               string `json:"-" description:"用户头像"`
+	RealName                  string `description:"系统用户姓名"`
+	Password                  string `json:"-"`
+	LastUpdatedPasswordTime   string `json:"-"`
+	Enabled                   int
+	Email                     string `description:"系统用户邮箱"`
+	LastLoginTime             string `json:"-"`
+	CreatedTime               string `json:"-"`
+	LastUpdatedTime           string `json:"-"`
+	Role                      string `description:"系统用户角色"`
+	Mobile                    string `description:"手机号"`
+	RoleType                  int    `json:"-" description:"角色类型:1需要录入指标,0:不需要"`
+	RoleId                    int    `json:"-" description:"角色ID"`
+	RoleName                  string `json:"-" description:"角色名称"`
+	RoleTypeCode              string `json:"-" description:"角色类型编码"`
+	DepartmentId              int    `description:"部门id"`
+	DepartmentName            string `description:"部门名称"`
+	GroupId                   int    `description:"分组id"`
+	GroupName                 string `description:"分组名称"`
+	Authority                 int    `json:"-" description:"管理权限,0:无,1:部门负责人,2:小组负责人,或者ficc销售主管,3:超级管理员,4:ficc销售组长"`
+	Position                  string `description:"职位"`
+	DisableTime               string `json:"-" description:"禁用时间"`
+	ChartPermission           int8   `json:"-" description:"图表权限id"`
+	OpenId                    string `json:"-" description:"弘则部门公众号的openid"`
+	UnionId                   string `json:"-" description:"微信公众平台唯一标识"`
+	EdbPermission             int8   `json:"-" description:"指标库操作权限,0:只能操作 自己的,1:所有指标可操作"`
+	MysteelChemicalPermission int8   `json:"-" description:"钢联化工指标操作权限,0:只能操作 自己的,1:所有指标可操作"`
+	PredictEdbPermission      int8   `json:"-" description:"预测指标库操作权限,0:只能操作 自己的,1:所有预测指标可操作"`
+	Province                  string `json:"-" description:"省"`
+	ProvinceCode              string `json:"-" description:"省编码"`
+	City                      string `json:"-" description:"市"`
+	CityCode                  string `json:"-" description:"市编码"`
+	EmployeeId                string `json:"-" description:"员工工号(钉钉/每刻报销)"`
+	TelAreaCode               string `description:"手机区号"`
+}
+
+// GetSysUserByAdminName 账号获取用户
+func GetSysUserByAdminName(adminName string) (item *AdminItem, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+				a.*, b.role_type_code
+			FROM
+				admin AS a
+			INNER JOIN sys_role AS b ON a.role_id = b.role_id
+			WHERE
+				a.admin_name = ?
+			LIMIT 1`
+	err = o.Raw(sql, adminName).QueryRow(&item)
+	return
+}
+
+type UserCheckResp struct {
+	IsUser    bool
+	AdminInfo *AdminItem
+}

+ 18 - 0
routers/commentsRouter.go

@@ -187,6 +187,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_hub/controllers:ReportController"] = append(beego.GlobalControllerRouter["eta/eta_hub/controllers:ReportController"],
+        beego.ControllerComments{
+            Method: "ListClassify",
+            Router: `/classify/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_hub/controllers:ReportController"] = append(beego.GlobalControllerRouter["eta/eta_hub/controllers:ReportController"],
         beego.ControllerComments{
             Method: "Detail",
@@ -277,6 +286,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_hub/controllers:SysAdminController"] = append(beego.GlobalControllerRouter["eta/eta_hub/controllers:SysAdminController"],
+        beego.ControllerComments{
+            Method: "Detail",
+            Router: `/sysuser/check`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_hub/controllers:TradeCommonController"] = append(beego.GlobalControllerRouter["eta/eta_hub/controllers:TradeCommonController"],
         beego.ControllerComments{
             Method: "CffexDataList",

+ 5 - 0
routers/router.go

@@ -68,6 +68,11 @@ func init() {
 				&controllers.TradeCommonController{},
 			),
 		),
+		web.NSNamespace("/admin",
+			web.NSInclude(
+				&controllers.SysAdminController{},
+			),
+		),
 	)
 	web.AddNamespace(ns)
 }

+ 4 - 0
utils/constants.go

@@ -153,3 +153,7 @@ const (
 const (
 	CACHE_CREATE_REPORT_IMGPDF_QUEUE = "eta_report:report_img_pdf_queue" // 生成报告长图PDF队列
 )
+
+const (
+	DesKeySalt    = "JMCqSoUrTAmyNNIRb0TtlrPk" // DesKey盐值
+)

+ 187 - 0
utils/des3.go

@@ -0,0 +1,187 @@
+// 加密工具类,用了3des和base64
+package utils
+
+import (
+	"bytes"
+	"crypto/cipher"
+	"crypto/des"
+	"encoding/base64"
+	"encoding/hex"
+	"errors"
+	"strings"
+)
+
+// des3 + base64 encrypt
+func DesBase64Encrypt(origData []byte, desKey string) []byte {
+	result, err := TripleDesEncrypt(origData, []byte(desKey))
+	if err != nil {
+		panic(any(err))
+	}
+	return []byte(base64.StdEncoding.EncodeToString(result))
+}
+
+func DesBase64Decrypt(crypted []byte, desKey string) []byte {
+	result, _ := base64.StdEncoding.DecodeString(string(crypted))
+	remain := len(result) % 8
+	if remain > 0 {
+		mod := 8 - remain
+		for i := 0; i < mod; i++ {
+			result = append(result, 0)
+		}
+	}
+	origData, err := TripleDesDecrypt(result, []byte(desKey))
+	if err != nil {
+		panic(any(err))
+	}
+	return origData
+}
+
+// 3DES加密
+func TripleDesEncrypt(origData, key []byte) ([]byte, error) {
+	block, err := des.NewTripleDESCipher(key)
+	if err != nil {
+		return nil, err
+	}
+	origData = PKCS5Padding(origData, block.BlockSize())
+	// origData = ZeroPadding(origData, block.BlockSize())
+	blockMode := cipher.NewCBCEncrypter(block, key[:8])
+	crypted := make([]byte, len(origData))
+	blockMode.CryptBlocks(crypted, origData)
+	return crypted, nil
+}
+
+// 3DES解密
+func TripleDesDecrypt(crypted, key []byte) ([]byte, error) {
+	block, err := des.NewTripleDESCipher(key)
+	if err != nil {
+		return nil, err
+	}
+	blockMode := cipher.NewCBCDecrypter(block, key[:8])
+	origData := make([]byte, len(crypted))
+	// origData := crypted
+	blockMode.CryptBlocks(origData, crypted)
+	origData = PKCS5UnPadding(origData)
+	// origData = ZeroUnPadding(origData)
+	return origData, nil
+}
+
+func ZeroPadding(ciphertext []byte, blockSize int) []byte {
+	padding := blockSize - len(ciphertext)%blockSize
+	padtext := bytes.Repeat([]byte{0}, padding)
+	return append(ciphertext, padtext...)
+}
+
+func ZeroUnPadding(origData []byte) []byte {
+	length := len(origData)
+	unpadding := int(origData[length-1])
+	return origData[:(length - unpadding)]
+}
+
+func PKCS5Padding(ciphertext []byte, blockSize int) []byte {
+	padding := blockSize - len(ciphertext)%blockSize
+	padtext := bytes.Repeat([]byte{byte(padding)}, padding)
+	return append(ciphertext, padtext...)
+}
+
+func PKCS5UnPadding(origData []byte) []byte {
+	length := len(origData)
+	// 去掉最后一个字节 unpadding 次
+	unpadding := int(origData[length-1])
+	return origData[:(length - unpadding)]
+}
+
+// DES加密
+func DesEncrypt(content string, key string) string {
+	contents := []byte(content)
+	keys := []byte(key)
+	block, err := des.NewCipher(keys)
+	if err != nil {
+		return ""
+	}
+	contents = PKCS5Padding(contents, block.BlockSize())
+	blockMode := cipher.NewCBCEncrypter(block, keys)
+	crypted := make([]byte, len(contents))
+	blockMode.CryptBlocks(crypted, contents)
+	return byteToHexString(crypted)
+}
+
+func byteToHexString(bytes []byte) string {
+	str := ""
+	for i := 0; i < len(bytes); i++ {
+		sTemp := hex.EncodeToString([]byte{bytes[i]})
+		if len(sTemp) < 2 {
+			str += string(0)
+		}
+		str += strings.ToUpper(sTemp)
+	}
+	return str
+}
+
+// DES解密
+func DesDecrypt(content string, key string) string {
+	contentBytes, err := hex.DecodeString(content)
+	if err != nil {
+		return "字符串转换16进制数组失败" + err.Error()
+	}
+	keys := []byte(key)
+	block, err := des.NewCipher(keys)
+	if err != nil {
+		return "解密失败" + err.Error()
+	}
+	blockMode := cipher.NewCBCDecrypter(block, keys)
+	origData := contentBytes
+	blockMode.CryptBlocks(origData, contentBytes)
+	origData = ZeroUnPadding(origData)
+	return string(origData)
+}
+
+// DES ECB PKCK5Padding
+func EntryptDesECB(data, key []byte) (string, error) {
+	if len(key) > 8 {
+		key = key[:8]
+	}
+	block, err := des.NewCipher(key)
+	if err != nil {
+		return "", errors.New("des.NewCipher " + err.Error())
+	}
+	bs := block.BlockSize()
+	data = PKCS5Padding(data, bs)
+	if len(data)%bs != 0 {
+		return "", errors.New("EntryptDesECB Need a multiple of the blocksize")
+	}
+	out := make([]byte, len(data))
+	dst := out
+	for len(data) > 0 {
+		block.Encrypt(dst, data[:bs])
+		data = data[bs:]
+		dst = dst[bs:]
+	}
+	return base64.StdEncoding.EncodeToString(out), nil
+}
+
+func DecryptDESECB(d string, key []byte) ([]byte, error) {
+	data, err := base64.StdEncoding.DecodeString(d)
+	if err != nil {
+		return nil, errors.New("decodebase64 " + err.Error())
+	}
+	if len(key) > 8 {
+		key = key[:8]
+	}
+	block, err := des.NewCipher(key)
+	if err != nil {
+		return nil, errors.New("des.NewCipher " + err.Error())
+	}
+	bs := block.BlockSize()
+	if len(data)%bs != 0 {
+		return nil, errors.New("DecryptDES crypto/cipher: input not full blocks")
+	}
+	out := make([]byte, len(data))
+	dst := out
+	for len(data) > 0 {
+		block.Decrypt(dst, data[:bs])
+		data = data[bs:]
+		dst = dst[bs:]
+	}
+	out = PKCS5UnPadding(out)
+	return out, nil
+}