userinfo.go 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576
  1. package bo
  2. import (
  3. "crypto/md5"
  4. "errors"
  5. "fmt"
  6. "log"
  7. "regexp"
  8. "rtzh_elec_temperature/enum"
  9. "rtzh_elec_temperature/global"
  10. "rtzh_elec_temperature/logger"
  11. "rtzh_elec_temperature/tools"
  12. "strconv"
  13. "strings"
  14. "sync"
  15. "time"
  16. "github.com/astaxie/beego/orm"
  17. _ "github.com/astaxie/beego/orm"
  18. )
  19. type T_data_usersession struct {
  20. Sessionid string `orm:"pk"`
  21. Userid int
  22. Lastdt int64
  23. }
  24. type T_data_role_func struct {
  25. Id int `orm:"pk"`
  26. Roleid int
  27. Funccodeid int
  28. }
  29. func init() {
  30. orm.RegisterModel(new(T_data_usersession))
  31. orm.RegisterModel(new(T_data_role_func))
  32. }
  33. var tokenSync sync.RWMutex
  34. //缓存token对应的用户信息
  35. var CacheUserByToken = map[string]interface{}{}
  36. //登录信息记录
  37. var LoginInfo = sync.Map{}
  38. //保存角色-功能
  39. func SaveRoleFunc(roleid int, funclist []string, userinfo map[string]interface{}) error {
  40. o := orm.NewOrm()
  41. sql := "delete from t_data_role_func where roleid=?"
  42. _, err := o.Raw(sql, roleid).Exec()
  43. if err != nil {
  44. log.Println(err)
  45. return err
  46. }
  47. for _, item := range funclist {
  48. intitem, _ := strconv.Atoi(item)
  49. obj := T_data_role_func{Roleid: roleid, Funccodeid: intitem}
  50. _, err = o.Insert(&obj)
  51. if err != nil {
  52. log.Println(err)
  53. }
  54. }
  55. dblog := new(SystemLog)
  56. dblog.UserInfo = userinfo
  57. dblog.Audittype = enum.AuditType_admin_system_userrole
  58. dblog.Logtype = enum.LogType_bind
  59. dblog.Eventtype = enum.OptEventType_Bus
  60. dblog.Eventlevel = enum.OptEventLevel_Hight
  61. if err != nil {
  62. dblog.Description = fmt.Sprintf("角色%d权限分配失败:%s", roleid, err.Error())
  63. dblog.Fail2()
  64. return err
  65. }
  66. dblog.Description = fmt.Sprintf("角色%d权限分配成功", roleid)
  67. dblog.Success2()
  68. return nil
  69. }
  70. func GetRoleFunc(roleid int) (data []orm.Params, err error) {
  71. o := orm.NewOrm()
  72. lst := []orm.Params{}
  73. sql := "select a.*,b.code,b.name,b.parentcode from t_data_role_func a,global_const_code b where a.funccodeid=b.id and a.roleid=?"
  74. _, err = o.Raw(sql, roleid).Values(&lst)
  75. return lst, err
  76. }
  77. func GetUserFunc(userid int) (data interface{}, err error) {
  78. o := orm.NewOrm()
  79. lst := []orm.Params{}
  80. checkSuperSql := "select 1 from t_data_user where id=? and role=(select id from global_const_code where code='role_superadmin')"
  81. _, err = o.Raw(checkSuperSql, userid).Values(&lst)
  82. if len(lst) > 0 {
  83. //超级管理员,返回所有功能菜单
  84. para := map[string]interface{}{"code": "all"}
  85. return []interface{}{para}, nil
  86. }
  87. sql := "select b.code,b.name,case when substr(b.code,1,8)='pl_menu_' then (select code from global_const_code where parentcode=b.code and name='url') else '' end url from t_data_role_func a,global_const_code b,t_data_user c where a.roleid=c.role and a.funccodeid=b.id and c.id=?"
  88. _, err = o.Raw(sql, userid).Values(&lst)
  89. return lst, err
  90. }
  91. func GetSessionInfo(sessionid string) (userinfo T_data_usersession, err error) {
  92. o := orm.NewOrm()
  93. obj := T_data_usersession{Sessionid: sessionid}
  94. err = o.Read(&obj)
  95. if err != nil {
  96. return T_data_usersession{}, err
  97. }
  98. userinfo.Sessionid = obj.Sessionid
  99. userinfo.Userid = obj.Userid
  100. userinfo.Lastdt = obj.Lastdt
  101. return obj, nil
  102. }
  103. func RemoveSession(sessionid string) error {
  104. if sessionid == "" {
  105. return nil
  106. }
  107. o := orm.NewOrm()
  108. obj := T_data_usersession{Sessionid: sessionid}
  109. _, err := o.Delete(&obj)
  110. global.GoCahce.Delete(sessionid)
  111. return err
  112. }
  113. //session续期。超时10分钟则自动过期,需要重新登录认证
  114. func UpdateSession(sessionid string) error {
  115. if _, has := global.GoCahce.Get(sessionid); has {
  116. return nil
  117. }
  118. uinfo, err := GetSessionInfo(sessionid)
  119. if err != nil {
  120. return err
  121. }
  122. lastdt := uinfo.Lastdt
  123. //fmt.Println(uinfo)
  124. //fmt.Println(time.Now().Unix())
  125. if global.SessionTimeout > 0 {
  126. if (time.Now().Unix() - lastdt) > int64(global.SessionTimeout) {
  127. return errors.New("session超时")
  128. }
  129. }
  130. global.GoCahce.Set(sessionid, uinfo, 30*time.Second)
  131. uid := uinfo.Userid
  132. return SetSession(sessionid, strconv.Itoa(uid))
  133. }
  134. func SetSession(sessionid string, userid string) error {
  135. o := orm.NewOrm()
  136. uid, _ := strconv.Atoi(userid)
  137. obj := T_data_usersession{Sessionid: sessionid, Userid: uid, Lastdt: time.Now().Unix()}
  138. u, er := GetSessionInfo(sessionid)
  139. if er != nil && er != orm.ErrNoRows {
  140. return er
  141. }
  142. if u.Sessionid != "" {
  143. _, er = o.Update(&obj)
  144. } else {
  145. _, er = o.Insert(&obj)
  146. }
  147. return nil
  148. }
  149. //根据token返回当前登录用户信息
  150. func GetUserInfoByToken(token string) (info map[string]interface{}, err error) {
  151. tokenSync.Lock()
  152. if v, ok := CacheUserByToken[token]; ok {
  153. tokenSync.Unlock()
  154. return v.(map[string]interface{}), nil
  155. }
  156. tokenSync.Unlock()
  157. o := orm.NewOrm()
  158. sql := "select a.*,b.name,b.account,b.role from t_data_usersession a,t_data_user b where a.userid=b.id and a.sessionid=?"
  159. obj := []orm.Params{}
  160. _, dberr := o.Raw(sql, token).Values(&obj)
  161. if dberr != nil {
  162. return nil, dberr
  163. }
  164. if len(obj) == 0 {
  165. return nil, nil
  166. }
  167. returninfo := make(map[string]interface{})
  168. for k, v := range obj[0] {
  169. returninfo[k] = v
  170. }
  171. tokenSync.Lock()
  172. //检查缓存长度,key过大则清除一次
  173. if len(CacheUserByToken) > 1000 {
  174. CacheUserByToken = make(map[string]interface{})
  175. }
  176. CacheUserByToken[token] = returninfo
  177. tokenSync.Unlock()
  178. return returninfo, nil
  179. }
  180. func CacheLoginFialInfo(key string) {
  181. if info, ok := LoginInfo.Load(key); ok {
  182. //失败次数
  183. info2 := info.(map[string]interface{})
  184. failcount := info2["count"].(int)
  185. info2["count"] = failcount + 1
  186. info2["lasttime"] = time.Now().Unix()
  187. } else {
  188. LoginInfo.Store(key, map[string]interface{}{"count": 1, "lasttime": time.Now().Unix()})
  189. }
  190. }
  191. //加载全局参数
  192. func LoadGlobalParam() {
  193. v, err := GetSysParamValue("session_timeout", "600")
  194. if err != nil {
  195. tools.Log("加载Session超时时长参数失败:" + err.Error())
  196. return
  197. }
  198. global.SessionTimeout, _ = strconv.Atoi(v)
  199. }
  200. //加载并检查系统管理员帐号
  201. func CheckSystemUser() (exists bool, err error) {
  202. o := orm.NewOrm()
  203. data := []orm.Params{}
  204. result := false
  205. sqlCommandText := "select 1 from t_data_user where account=?;"
  206. _, dbError := o.Raw(sqlCommandText, "Administrator").Values(&data)
  207. if dbError == nil {
  208. if len(data) == 0 {
  209. parameter := map[string]interface{}{}
  210. parameter["userid"] = "0"
  211. parameter["username"] = "Administrator"
  212. parameter["account"] = "Administrator"
  213. parameter["password"] = "administrator@123"
  214. parameter["role"] = 1
  215. parameter["memo"] = "系统超级管理员"
  216. result, dbError = CreateUser(parameter)
  217. if dbError != nil {
  218. return false, dbError
  219. } else {
  220. result = true
  221. }
  222. } else {
  223. result = true
  224. }
  225. }
  226. return result, dbError
  227. }
  228. func UserLogin(account string, pwd string) (userinfo map[string]interface{}, err error) {
  229. o := orm.NewOrm()
  230. data := []orm.Params{}
  231. var result = map[string]interface{}{}
  232. has := md5.Sum([]byte(pwd))
  233. pwd = fmt.Sprintf("%x", has)
  234. sqlCommandText := "select a.*,b.name userrole,b.code rolecode from t_data_user a left join global_const_code b on a.role=b.id where a.account=? and a.pwd=?"
  235. _, dbError := o.Raw(sqlCommandText, account, pwd).Values(&data)
  236. if dbError == nil {
  237. if len(data) > 0 {
  238. //判断密码是否过期
  239. pwd_expire := tools.IsEmpty(data[0]["pwd_expire"])
  240. if tools.IsEmpty(data[0]["rolecode"]) != "role_superadmin" && pwd_expire != "" && pwd_expire != "1970-01-01 00:00:00" {
  241. //判断是否过期
  242. expireDate, _ := time.Parse("2006-01-02 15:04:05", pwd_expire)
  243. if expireDate.Unix() < time.Now().Unix() {
  244. logger.Logger.Debug(data)
  245. return result, errors.New("您的密码已过期,请联系管理员更新后重试!")
  246. }
  247. }
  248. LoginInfo.Store(account, map[string]interface{}{"count": 1, "lasttime": time.Now().Unix()})
  249. result["userid"] = tools.IsEmpty(data[0]["id"])
  250. result["name"] = tools.IsEmpty(data[0]["name"])
  251. result["role"] = tools.IsEmpty(data[0]["role"])
  252. result["bind_ips"] = tools.IsEmpty(data[0]["bind_ips"])
  253. result["datelimit_start"] = tools.IsEmpty(data[0]["datelimit_start"])
  254. result["datelimit_end"] = tools.IsEmpty(data[0]["datelimit_end"])
  255. result["rolename"] = tools.IsEmpty(data[0]["userrole"])
  256. return result, nil
  257. } else {
  258. CacheLoginFialInfo(account)
  259. return result, errors.New("用户帐号或密码错误!")
  260. }
  261. } else {
  262. return result, dbError
  263. }
  264. }
  265. //创建用户信息
  266. func CreateUser(parameter map[string]interface{}, userinfo ...map[string]interface{}) (status bool, errs error) {
  267. userData := T_data_user{}
  268. o := orm.NewOrm()
  269. var paramvalues = []interface{}{}
  270. var userid int
  271. var Account string
  272. var modify_password = true
  273. //sqlCommandText := ""
  274. if userId, ok2 := parameter["userid"]; ok2 && tools.IsEmpty(userId) != "" {
  275. userid, _ = strconv.Atoi(userId.(string))
  276. userData.Id = userid
  277. o.Read(&userData)
  278. }
  279. dblog := new(SystemLog)
  280. dblog.Audittype = enum.AuditType_admin_system_user
  281. dblog.Logtype = enum.LogType_Insert
  282. dblog.Eventtype = enum.OptEventType_Bus
  283. dblog.Eventlevel = enum.OptEventLevel_Hight
  284. if len(userinfo) > 0 {
  285. dblog.UserInfo = userinfo[0]
  286. userData.Createuser, _ = strconv.Atoi(tools.IsEmpty(userinfo[0]["userid"]))
  287. } else {
  288. dblog.UserInfo = map[string]interface{}{"name": "", "ip": "127.0.0.1"}
  289. }
  290. if username, ok2 := parameter["username"]; ok2 {
  291. if tools.IsEmpty(username) != "" {
  292. paramvalues = append(paramvalues, username)
  293. } else {
  294. dblog.Description = fmt.Sprintf("保存用户信息失败|%s,错误:%s", "", "用户姓名为空")
  295. dblog.Fail2()
  296. return false, errors.New("用户姓名字段不允许为空!")
  297. }
  298. userData.Name = tools.IsEmpty(username)
  299. } else {
  300. return false, errors.New("请传入用户姓名参数!")
  301. }
  302. if account, ok2 := parameter["account"]; ok2 {
  303. if tools.IsEmpty(account) != "" {
  304. paramvalues = append(paramvalues, account)
  305. } else {
  306. dblog.Description = fmt.Sprintf("保存用户信息失败|%s,错误:%s", parameter["username"], "用户帐号为空")
  307. dblog.Fail2()
  308. return false, errors.New("用户帐号字段不允许为空!")
  309. }
  310. userData.Account = tools.IsEmpty(account)
  311. } else {
  312. dblog.Description = fmt.Sprintf("保存用户信息失败|%s,错误:%s", parameter["username"], "未设置用户帐号")
  313. dblog.Fail2()
  314. return false, errors.New("请传入用户帐号参数!")
  315. }
  316. if password, ok2 := parameter["password"]; ok2 {
  317. passwordStr := tools.IsEmpty(password)
  318. if passwordStr != "" {
  319. if len(passwordStr) > 20 {
  320. password = tools.OriginalCode(password)
  321. }
  322. //密码规则校验
  323. rule, _ := GetSysParamValue("user_pwd_rule", "simple")
  324. if rule == "simple" {
  325. if len(passwordStr) < 6 || len(passwordStr) > 32 {
  326. dblog.Description = fmt.Sprintf("保存用户信息失败|%s,错误:%s", parameter["username"], "用户帐号密码长度只能为6-32位字符")
  327. dblog.Fail2()
  328. return false, errors.New("用户帐号密码长度只能为6-32位字符!")
  329. }
  330. } else {
  331. if len(passwordStr) < 8 || len(passwordStr) > 32 {
  332. dblog.Description = fmt.Sprintf("保存用户信息失败|%s,错误:%s", parameter["username"], "用户帐号密码长度只能为8-32位字符")
  333. dblog.Fail2()
  334. return false, errors.New("用户帐号密码长度只能为8-32位字符!")
  335. }
  336. reg1, _ := regexp.Compile("[A-Z]")
  337. reg2, _ := regexp.Compile("[a-z]")
  338. reg3, _ := regexp.Compile("[0-9]")
  339. reg4, _ := regexp.Compile(`[~!@#$%^&*()_\-+=<>?:"{}|,.\/;'\\[\]·~!@#¥%&*]`)
  340. if !reg1.MatchString(passwordStr) || !reg2.MatchString(passwordStr) || !reg3.MatchString(passwordStr) || !reg4.MatchString(passwordStr) {
  341. dblog.Description = fmt.Sprintf("保存用户信息失败|%s,错误:%s", parameter["username"], "用户帐号密码长度只能为8-32位字符且由大小写字母、数字和特殊字符组成")
  342. dblog.Fail2()
  343. return false, errors.New("用户帐号密码长度只能为8-32位字符且由大小写字母、数字和特殊字符组成!")
  344. }
  345. }
  346. has := md5.Sum([]byte(passwordStr))
  347. password = fmt.Sprintf("%x", has)
  348. paramvalues = append(paramvalues, password)
  349. modify_password = true
  350. userData.Pwd = tools.IsEmpty(password)
  351. } else if userid == 0 {
  352. dblog.Description = fmt.Sprintf("保存用户信息失败|%s,错误:%s", parameter["username"], "帐号密码为空")
  353. dblog.Fail2()
  354. return false, errors.New("用户帐号密码不允许为空!")
  355. } else {
  356. modify_password = false
  357. }
  358. } else {
  359. dblog.Description = fmt.Sprintf("保存用户信息失败|%s,错误:%s", parameter["username"], "未设置帐号密码")
  360. dblog.Fail2()
  361. return false, errors.New("请传入用户密码参数!")
  362. }
  363. if memo, ok2 := parameter["memo"]; ok2 {
  364. paramvalues = append(paramvalues, memo)
  365. userData.Memo = tools.IsEmpty(memo)
  366. } else {
  367. paramvalues = append(paramvalues, "")
  368. }
  369. if role, ok2 := parameter["role"]; ok2 {
  370. paramvalues = append(paramvalues, role)
  371. userData.Role, _ = strconv.Atoi(tools.IsEmpty(role))
  372. } else {
  373. paramvalues = append(paramvalues, 0)
  374. }
  375. if mbphone, ok2 := parameter["mobilephone"]; ok2 {
  376. paramvalues = append(paramvalues, mbphone)
  377. userData.Mobilephone = tools.IsEmpty(mbphone)
  378. } else {
  379. paramvalues = append(paramvalues, "")
  380. }
  381. if ips, ok2 := parameter["bind_ips"]; ok2 {
  382. paramvalues = append(paramvalues, ips)
  383. userData.BindIps = tools.IsEmpty(ips)
  384. } else {
  385. paramvalues = append(paramvalues, "")
  386. }
  387. //判断用户是否存在
  388. message := existsUser(userid, Account)
  389. if message != nil {
  390. dblog.Description = fmt.Sprintf("保存用户信息失败|%s,错误:%s", parameter["username"], message)
  391. dblog.Fail2()
  392. return false, message
  393. }
  394. if modify_password {
  395. //密码过期时间:单位天
  396. pwd_expire_day, _ := GetSysParamValue("user_pwd_expire_day", "60")
  397. pwd_expire_date := ""
  398. if pwd_expire_day == "0" {
  399. //永不过期
  400. pwd_expire_date = "1970-01-01 00:00:00"
  401. } else {
  402. pwd_expire_dayInt, _ := strconv.Atoi(pwd_expire_day)
  403. pwd_expire_dayInt = pwd_expire_dayInt * 24
  404. d, _ := time.ParseDuration(strconv.Itoa(pwd_expire_dayInt) + "h")
  405. pwd_expire_date = time.Now().Add(d).Format("2006-01-02 15:04:05")
  406. }
  407. paramvalues = append(paramvalues, pwd_expire_date)
  408. userData.PwdExpire = pwd_expire_date
  409. }
  410. if v, ok2 := parameter["datelimit_start"]; ok2 {
  411. userData.DatelimitStart = tools.IsEmpty(v)
  412. }
  413. if v, ok2 := parameter["datelimit_end"]; ok2 {
  414. userData.DatelimitEnd = tools.IsEmpty(v)
  415. }
  416. var err error
  417. if userid > 0 {
  418. //判断修改用户信息时是否修改了密码
  419. /*if modify_password {
  420. sqlCommandText = "update t_data_user set name=?,account=?,pwd=?,memo=?,role=?,mobilephone=?,bind_ips=?,pwd_expire=? where id=?"
  421. } else {
  422. sqlCommandText = "update t_data_user set name=?,account=?,memo=?,role=?,mobilephone=?,bind_ips=? where id=?"
  423. }
  424. paramvalues = append(paramvalues, userid)
  425. */
  426. _, err = o.Update(&userData)
  427. } else {
  428. //sqlCommandText = "insert into t_data_user(name,account,pwd,memo,role,mobilephone,bind_ips,pwd_expire)values(?,?,?,?,?,?,?);"
  429. _, err = o.Insert(&userData)
  430. }
  431. //_, err := o.Raw(sqlCommandText, paramvalues).Exec()
  432. if err != nil {
  433. logger.Logger.Error(err)
  434. dblog.Description = fmt.Sprintf("保存用户信息失败|%s,错误:%s", parameter["username"], err.Error())
  435. dblog.Fail2()
  436. return false, err
  437. } else {
  438. dblog.Description = fmt.Sprintf("保存用户信息成功|%s", parameter["username"])
  439. dblog.Success2()
  440. return true, nil
  441. }
  442. }
  443. //初始化用户表
  444. func InitUser() (status bool, errs error) {
  445. o := orm.NewOrm()
  446. sqlCommandText := "delete from t_data_user where name!=?"
  447. _, err := o.Raw(sqlCommandText, "Rtelec").Exec()
  448. if err != nil {
  449. return false, err
  450. } else {
  451. o.Raw("delete from t_data_usersession").Exec()
  452. return true, nil
  453. }
  454. }
  455. //删除用户
  456. func DelUser(userId string, userinfo map[string]interface{}) (status bool, errs error) {
  457. dblog := new(SystemLog)
  458. dblog.UserInfo = userinfo
  459. dblog.Audittype = enum.AuditType_admin_system_user
  460. dblog.Logtype = enum.LogType_Delete
  461. dblog.Eventtype = enum.OptEventType_Bus
  462. dblog.Eventlevel = enum.OptEventLevel_Hight
  463. o := orm.NewOrm()
  464. sqlCommandText := "delete from t_data_user where id=?"
  465. _, err := o.Raw(sqlCommandText, userId).Exec()
  466. if err != nil {
  467. dblog.Description = fmt.Sprintf("删除用户%s失败,错误:%s", userId, err.Error())
  468. dblog.Fail2()
  469. return false, err
  470. } else {
  471. //删除该用户的关联区域信息
  472. usArea := new(UserAreaRelationObject)
  473. usArea.UserInfo = userinfo
  474. usArea.Model.Userid, _ = strconv.Atoi(userId)
  475. usArea.Delete()
  476. dblog.Description = fmt.Sprintf("删除用户%s成功", userId)
  477. dblog.Success2()
  478. return true, nil
  479. }
  480. }
  481. func existsUser(userId int, account string) error {
  482. ts := []orm.Params{}
  483. o := orm.NewOrm()
  484. var parameter = []interface{}{}
  485. sqlCommandText := ""
  486. if userId > 0 {
  487. sqlCommandText = "select 1 from t_data_user where account=? and id!=?"
  488. parameter = append(parameter, account, userId)
  489. } else {
  490. sqlCommandText = "select 1 from t_data_user where account=? "
  491. parameter = append(parameter, account)
  492. }
  493. _, err := o.Raw(sqlCommandText, parameter).Values(&ts)
  494. if err != nil {
  495. return err
  496. }
  497. if len(ts) > 0 {
  498. return errors.New("已存在用户帐号:" + account)
  499. } else {
  500. return nil
  501. }
  502. }
  503. func SearchUserInfo(area_id, name, role_id string, pageIndex, pageSize int, userinfo map[string]interface{}) ([]orm.Params, int, error) {
  504. dblog := new(SystemLog)
  505. dblog.UserInfo = userinfo
  506. dblog.Audittype = enum.AuditType_admin_system_user
  507. dblog.Logtype = enum.LogType_Query
  508. dblog.Eventtype = enum.OptEventType_Bus
  509. dblog.Eventlevel = enum.OptEventLevel_Low
  510. o := orm.NewOrm()
  511. var sqlCommandText, totalSql string
  512. sqlCommandText = "select a.*,b.name rolename,b.code rolecode,(select ifnull(count(1),0) from t_relation_user_area where userid=a.id and areaid>0)area_count from t_data_user a left join global_const_code b on a.role=b.id where "
  513. sqlWhere := []string{"1=1"}
  514. sqlParamer := []interface{}{}
  515. sqlWhere = append(sqlWhere, " not EXISTS (select 1 from global_const_code where a.role=id and code='role_superadmin')")
  516. var limit = " limit " + strconv.Itoa((pageIndex-1)*pageSize) + "," + strconv.Itoa(pageSize)
  517. if role_id != "" {
  518. sqlWhere = append(sqlWhere, " a.role=?")
  519. sqlParamer = append(sqlParamer, role_id)
  520. }
  521. if name != "" {
  522. sqlWhere = append(sqlWhere, " a.name like ?")
  523. sqlParamer = append(sqlParamer, "%"+name+"%")
  524. }
  525. if area_id != "" {
  526. sqlWhere = append(sqlWhere, " EXISTS(select 1 from t_relation_user_area ua where a.id=ua.userid and ua.areaid=?)")
  527. sqlParamer = append(sqlParamer, area_id)
  528. }
  529. sqlCommandText += strings.Join(sqlWhere, " and ")
  530. sqlCommandText += " order by a.id desc " + limit
  531. totalSql = "select count(1) number from t_data_user a where " + strings.Join(sqlWhere, " and ")
  532. var tableData []orm.Params
  533. var number int
  534. _, err := o.Raw(sqlCommandText, sqlParamer).Values(&tableData)
  535. dblog.Description = fmt.Sprintf("SQL:%s,参数:%+v", sqlCommandText, sqlParamer)
  536. if err == nil {
  537. dblog.Success2()
  538. var totalData []orm.Params
  539. _, err = o.Raw(totalSql, sqlParamer).Values(&totalData)
  540. if err == nil {
  541. number, _ = strconv.Atoi(totalData[0]["number"].(string))
  542. }
  543. } else {
  544. logger.Logger.Error(err, dblog.Description)
  545. dblog.Fail2()
  546. }
  547. return tableData, number, err
  548. }