func (c *LoginController) User() {
var (
user models.CLogin
err error
result map[string]interface{}
login []orm.Params
role []orm.Params
roleSession []orm.Params
menu []orm.Params
)
timeStart := time.Now().UnixNano()/1e6
result = make(map[string]interface{})
sessionData := c.GetSession("user")
if nil != sessionData {
user = sessionData.(models.CLogin)
} else {
c.ReturnError(-3001, "用户信息获取失败")
return
}
login, err = models.GetUserInfo(user.LoginId)
if err == nil {
tempLogin := login[0]
for key := range tempLogin {
result[key] = tempLogin[key]
}
}
role, err = models.GetRole(user.RoleId)
if err == nil {
result["role"] = role[0]
}
roleSession, err = models.GetRoleSession(user.RoleId)
if err == nil {
result["role_session"] = roleSession
} else {
fmt.Println("获取role_session失败:", err)
}
menu, err = models.GetMenu()
byteJson, _ := json.Marshal(menu)
tempData := make([]models.CPower, 0)
menuData := make([]models.CPower, 0)
err = json.Unmarshal(byteJson, &tempData)
if err != nil {
fmt.Println("获取 menu 失败:", err)
}
for key := range tempData {
if menu[key]["level"] == "1" {
menuData = append(menuData, tempData[key])
}
}
for keyMenu := range menuData {
childData := make([]models.CPower, 0)
for key := range tempData {
if menuData[keyMenu].Id == tempData[key].Pid {
childData = append(childData, tempData[key])
menuData[keyMenu].Child = childData
}
}
}
result["menu"] = menuData
timeEnd := time.Now().UnixNano()/1e6
logs.Info("timeEnd-timeStart", timeEnd-timeStart)
c.ReturnSuccess("请求成功", result, timeEnd-timeStart)
}
这里延续的是登录接口的实现方式,这里主要看下数据库的写法。在models文件夹下面创建user.go文件。添加了时间,方便后续的改写做对比。性能不强求,先看用法,我们再来分析。
func LoginInfo(loginId string) (CLogin, error) {
var (
err error
user CLogin
)
o := orm.NewOrm()
user = CLogin{LoginId: loginId}
err = o.Read(&user, "LoginId")
return user, err
}
func GetUserInfo(loginId string) ([]orm.Params, error) {
var (
err error
)
o := orm.NewOrm()
var maps []orm.Params
_, err = o.Raw("select l.* from c_login as l join c_roles as r on l.role_id=r.id where l.LoginId=?", loginId).Values(&maps)
return maps, err
}
func GetRole(roleId int) ([]orm.Params, error) {
var (
err error
maps []orm.Params
)
o := orm.NewOrm()
_, err = o.Raw("select * from c_roles where id=?", roleId).Values(&maps)
return maps, err
}
func GetRoleSession(roleId int) ([]orm.Params, error) {
var (
err error
maps []orm.Params
)
o := orm.NewOrm()
_, err = o.Raw("select p.id,p.url,p.name, p.code,1 as checked from c_role_power as r join c_power as p on r.pid = p.id where r.rid=?", roleId).Values(&maps)
return maps, err
}
func GetMenu() ([]orm.Params, error) {
var (
err error
maps []orm.Params
)
o := orm.NewOrm()
_, err = o.Raw("select id,level,pid,name,url,icon,path,code from c_power where id>?", 0).Values(&maps)
return maps, err
}
func LoginInfoFromId(id int) (*CLogin, error) {
var (
err error
use CLogin
)
o := orm.NewOrm()
querySetter := o.QueryTable("c_login")
querySetter = querySetter.Filter("id", id)
err = querySetter.One(&use)
return &use, err
}
这是前面准备工作中的内容,直接照抄就可以了。切记,使用到的表记得注册。涉及到的结构体必须要使用前先注册,否则会报错gob: name not registered for interface
gob.Register(models.CLogin{})
这边笔者的请求时间大概是:180毫秒。不同环境时间不同,只要存在唯一变量就行了。