Files
anytunnel/at-api/user.go
T
2019-08-08 17:13:34 +08:00

387 lines
9.4 KiB
Go

package main
import (
"anytunnel/at-web/app/utils"
"net/http"
"time"
"github.com/julienschmidt/httprouter"
"github.com/snail007/go-activerecord/mysql"
)
const DEFAULT_USER_ROLE = 1
const MODE_BASE = "0"
const MODE_SENIOR = "1"
const MODE_SPECIAL = "2"
type User struct{}
func NewUser() *User {
return &User{}
}
//get user by user_id
//method : GET
//params : user_id
func (this *User) GetUserByUserId(responseWrite http.ResponseWriter, request *http.Request, params httprouter.Params) {
userId := request.FormValue("user_id")
if userId == "" {
jsonError(responseWrite, "user_id is not empty!", nil)
return
}
db := G.DB()
var rs *mysql.ResultSet
rs, err := db.Query(db.AR().From("user").Where(map[string]interface{}{
"user_id": userId,
}).Limit(0, 1))
if err != nil {
jsonError(responseWrite, err.Error(), nil)
return
}
jsonSuccess(responseWrite, "ok", rs.Row())
}
//get user by name
//method : GET
//params : username
func (this *User) GetUserByName(responseWrite http.ResponseWriter, request *http.Request, params httprouter.Params) {
username := request.FormValue("username")
if username == "" {
jsonError(responseWrite, "username is not empty!", nil)
return
}
db := G.DB()
var rs *mysql.ResultSet
rs, err := db.Query(db.AR().From("user").Where(map[string]interface{}{
"username": username,
}).Limit(0, 1))
if err != nil {
jsonError(responseWrite, err.Error(), nil)
return
}
jsonSuccess(responseWrite, "ok", rs.Row())
}
//get user by email
//method : GET
//params : email
func (this *User) GetUserByEmail(responseWrite http.ResponseWriter, request *http.Request, params httprouter.Params) {
email := request.FormValue("email")
if email == "" {
jsonError(responseWrite, "email is not empty!", nil)
return
}
db := G.DB()
var rs *mysql.ResultSet
rs, err := db.Query(db.AR().From("user").Where(map[string]interface{}{
"email": email,
}).Limit(0, 1))
if err != nil {
jsonError(responseWrite, err.Error(), nil)
return
}
jsonSuccess(responseWrite, "ok", rs.Row())
}
//create user
//method : POST
//params : username, password, email
func (this *User) Create(responseWrite http.ResponseWriter, request *http.Request, params httprouter.Params) {
username := request.PostFormValue("username")
password := request.PostFormValue("password")
email := request.PostFormValue("email")
nickname := request.PostFormValue("nickname")
if username == "" {
jsonError(responseWrite, "用户名不能为空!", nil)
return
}
if password == "" {
jsonError(responseWrite, "密码不能为空!", nil)
}
if email == "" {
jsonError(responseWrite, "邮箱不能为空!", nil)
}
//验证用户名是否存在
db := G.DB()
var rs *mysql.ResultSet
rs, err := db.Query(db.AR().From("user").Where(map[string]interface{}{
"username": username,
}).Limit(0, 1))
if err != nil {
jsonError(responseWrite, err.Error(), nil)
return
}
if len(rs.Row()) > 0 {
jsonError(responseWrite, "抱歉, 用户名已经存在", nil)
return
}
//验证邮箱是否存在
rs, err = db.Query(db.AR().From("user").Where(map[string]interface{}{
"email": email,
}).Limit(0, 1))
if err != nil {
jsonError(responseWrite, err.Error(), nil)
return
}
if len(rs.Row()) > 0 {
jsonError(responseWrite, "抱歉,邮箱已经被注册", nil)
return
}
//添加用户
userValues := map[string]interface{}{
"username": username,
"password": utils.NewEncrypt().Md5Encode(password),
"email": email,
"nickname": nickname,
"is_active": 0,
"is_forbidden": 0,
"create_time": time.Now().Unix(),
"update_time": time.Now().Unix(),
}
rs, err = db.Exec(db.AR().Insert("user", userValues))
if err != nil {
jsonError(responseWrite, err.Error(), nil)
return
}
userId := rs.LastInsertId
userValues["user_id"] = userId
//创建用户和角色对应关系
userRole := map[string]interface{}{
"role_id": DEFAULT_USER_ROLE,
"user_id": userId,
"create_time": time.Now().Unix(),
"update_time": time.Now().Unix(),
}
rs, err = db.Exec(db.AR().Insert("user_role", userRole))
if err != nil {
jsonError(responseWrite, err.Error(), nil)
return
}
jsonSuccess(responseWrite, "创建成功", userValues)
}
//update user
//method : POST
//params : nickname, password, email
func (this *User) Update(responseWrite http.ResponseWriter, request *http.Request, params httprouter.Params) {
userId := request.PostFormValue("user_id")
password := request.PostFormValue("password")
nickname := request.PostFormValue("nickname")
if userId == "" {
jsonError(responseWrite, "user_id error!", nil)
return
}
userValue := map[string]interface{}{}
if password != "" {
userValue["password"] = utils.NewEncrypt().Md5Encode(password)
}
if nickname != "" {
userValue["nickname"] = nickname
}
userValue["update_time"] = time.Now().Unix()
db := G.DB()
rs, err := db.Exec(db.AR().Update("user", userValue, map[string]interface{}{
"user_id": userId,
}))
if err != nil {
jsonError(responseWrite, err.Error(), nil)
return
}
id := rs.LastInsertId
jsonSuccess(responseWrite, "修改成功", id)
}
//get roles By user_id
//method : GET
//params : user_id
//return : roles
func (this *User) GetRolesByUserId(responseWrite http.ResponseWriter, request *http.Request, params httprouter.Params) {
userId := request.FormValue("user_id")
if userId == "" {
jsonError(responseWrite, "user_id is not empty!", nil)
return
}
db := G.DB()
var rs *mysql.ResultSet
//查找用户角色对应关系
rs, err := db.Query(db.AR().From("user_role").Where(map[string]interface{}{
"user_id": userId,
}))
if err != nil {
jsonError(responseWrite, err.Error(), nil)
return
}
userRoles := rs.Rows()
roleIds := []string{}
for _, userRole := range userRoles {
roleIds = append(roleIds, userRole["role_id"])
}
//根据roleIds查找角色
rs, err = db.Query(db.AR().From("role").Where(map[string]interface{}{
"role_id": roleIds,
}))
if err != nil {
jsonError(responseWrite, err.Error(), nil)
return
}
roles := rs.Rows()
jsonSuccess(responseWrite, "ok", roles)
}
//user cluster list
//method : GET
//params : user_id
//return : cluster region
func (this *User) Cluster(responseWrite http.ResponseWriter, request *http.Request, params httprouter.Params) {
userId := request.FormValue("user_id")
mode := request.FormValue("mode")
if userId == "" {
jsonError(responseWrite, "user_id 错误!", nil)
return
}
if(mode == "") {
mode = "0"
}
//查找用户角色对应关系
db := G.DB()
var rs *mysql.ResultSet
rs, err := db.Query(db.AR().From("user_role").Where(map[string]interface{}{
"user_id": userId,
}))
if err != nil {
jsonError(responseWrite, err.Error(), nil)
return
}
if rs.Len() == 0 {
jsonError(responseWrite, "user_id no role", nil)
return
}
userRoles := rs.Rows()
roleIds := []string{}
for _, userRole := range userRoles {
roleIds = append(roleIds, userRole["role_id"])
}
//查找角色地区对应关系
rs, err = db.Query(db.AR().From("role_region").Where(map[string]interface{}{
"role_id": roleIds,
}))
if err != nil {
jsonError(responseWrite, err.Error(), nil)
return
}
if rs.Len() == 0 {
jsonError(responseWrite, "该角色没有可选地区", nil)
return
}
roleRegions := rs.Rows()
regionIds := []string{}
for _, roleRegion := range roleRegions {
regionIds = append(regionIds, roleRegion["region_id"])
}
//查找所有的地区
rs, err = db.Query(db.AR().From("region").Where(map[string]interface{}{
"region_id": regionIds,
"is_delete": 0,
}))
if err != nil {
jsonError(responseWrite, err.Error(), nil)
return
}
if rs.Len() == 0 {
jsonError(responseWrite, "no region", nil)
return
}
regions := rs.Rows()
onlineClusterIds := []string{}
//基础模式,需要查找系统server在线的cluster
//特殊模式,需要查找系统的client在线的cluster
if(mode == MODE_BASE || mode == MODE_SPECIAL) {
cs_type := "client"
if(mode == MODE_BASE) {
cs_type = "server"
}
rs, err = db.Query(db.AR().From("online").Where(map[string]interface{}{
"user_id": 0,
"cs_type": cs_type,
}))
if err != nil {
jsonError(responseWrite, err.Error(), nil)
return
}
if(len(rs.Rows()) > 0) {
for _, online := range rs.Rows() {
onlineClusterIds = append(onlineClusterIds, online["cluster_id"])
}
}
}
//组合数据
regionClusters := map[string][]map[string]interface{}{}
for _, region := range regions {
//查找父级的地区
rs, err = db.Query(db.AR().From("region").Where(map[string]interface{}{
"region_id": region["parent_id"],
"is_delete": 0,
}))
if err != nil {
jsonError(responseWrite, err.Error(), nil)
return
}
if(rs.Len() == 0) {
continue
}
firstRegionName := rs.Row()["name"]
regionCluster := map[string]interface{}{
"region_id" : region["region_id"],
"name" : region["name"],
"clusters": []map[string]string{},
}
whereMap := map[string]interface{}{
"region_id": region["region_id"],
"is_disable": 0,
"is_delete": 0,
}
//基础模式和特殊模式需要同时满足在线的cluster条件
if(mode == MODE_SPECIAL || mode == MODE_BASE) {
whereMap["cluster_id"] = onlineClusterIds
}
//查找满足地区的cluster
rs, err = db.Query(db.AR().From("cluster").Where(whereMap))
if(err != nil) {
jsonError(responseWrite, err.Error(), nil)
return
}
if(rs.Len() == 0) {
continue
}
clusters := rs.Rows()
regionCluster["clusters"] = clusters
regionClusters[firstRegionName] = append(regionClusters[firstRegionName], regionCluster)
}
jsonSuccess(responseWrite, "", regionClusters)
}