userinfo.go 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649
  1. package bo
  2. import (
  3. "crypto/md5"
  4. "errors"
  5. "fmt"
  6. "log"
  7. "regexp"
  8. "scd_check_tools/global"
  9. "scd_check_tools/logger"
  10. "scd_check_tools/models/enum"
  11. "scd_check_tools/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 = sync.Map{}
  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.SetUserInfo(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 := orm.Params{"code": "all"}
  85. return []orm.Params{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. global.GoCahce.Delete(sessionid + "_userinfo")
  112. global.GoCahce.Delete(sessionid + "_apis")
  113. return err
  114. }
  115. //session续期。超时10分钟则自动过期,需要重新登录认证
  116. func UpdateSession(sessionid string) error {
  117. if _, has := global.GoCahce.Get(sessionid); has {
  118. return nil
  119. }
  120. uinfo, err := GetSessionInfo(sessionid)
  121. if err != nil {
  122. return err
  123. }
  124. lastdt := uinfo.Lastdt
  125. //fmt.Println(uinfo)
  126. //fmt.Println(time.Now().Unix())
  127. if global.SessionTimeout > 0 {
  128. if (time.Now().Unix() - lastdt) > int64(global.SessionTimeout) {
  129. return errors.New("session超时")
  130. }
  131. }
  132. global.GoCahce.Set(sessionid, uinfo, 30*time.Second)
  133. uid := uinfo.Userid
  134. return SetSession(sessionid, strconv.Itoa(uid))
  135. }
  136. func SetSession(sessionid string, userid string) error {
  137. o := orm.NewOrm()
  138. uid, _ := strconv.Atoi(userid)
  139. obj := T_data_usersession{Sessionid: sessionid, Userid: uid, Lastdt: time.Now().Unix()}
  140. u, er := GetSessionInfo(sessionid)
  141. if er != nil && er != orm.ErrNoRows {
  142. return er
  143. }
  144. if u.Sessionid != "" {
  145. _, er = o.Update(&obj)
  146. } else {
  147. //清空该用户原来的token
  148. oldtokens := []orm.Params{}
  149. o.Raw("select sessionid from t_data_usersession where userid=?", userid).Values(&oldtokens)
  150. if len(oldtokens) > 0 {
  151. for _, row := range oldtokens {
  152. key := tools.IsEmpty(row["sessionid"]) + "_apis"
  153. global.GoCahce.Delete(key)
  154. global.GoCahce.Delete(tools.IsEmpty(row["sessionid"]) + "_userinfo")
  155. }
  156. o.Raw("delete from t_data_usersession where userid=?", userid).Exec()
  157. }
  158. _, er = o.Insert(&obj)
  159. if er != nil {
  160. logger.Logger.Error(er)
  161. } else {
  162. //加载该token的接口权限
  163. go func(token, userid string) {
  164. useridint, _ := strconv.Atoi(userid)
  165. funcs, _ := GetUserFunc(useridint)
  166. if funcs != nil {
  167. fl := funcs.([]orm.Params)
  168. funcmap := map[string]bool{}
  169. for _, r := range fl {
  170. funcmap[tools.IsEmpty(r["code"])] = true
  171. }
  172. global.GoCahce.Set(token+"_apis", funcmap, -1)
  173. }
  174. }(sessionid, userid)
  175. }
  176. }
  177. return er
  178. }
  179. //判断当前token是否具有指定的某个接口权限
  180. func HasApiAccess(sessionid, apipath string) bool {
  181. key := sessionid + "_apis"
  182. if v, h := global.GoCahce.Get(key); h {
  183. v1 := v.(map[string]bool)
  184. if v1["all"] {
  185. //拥有所有权限的用户
  186. return true
  187. }
  188. if v1[apipath] {
  189. return true
  190. } else {
  191. //检查当前接口是否在授权列表中,如果不在授权列表中,表示该接口不需要授权访问
  192. _, h := global.ApiDocCache.Load(fmt.Sprintf("apidoc_%s", apipath))
  193. return !h
  194. }
  195. } else {
  196. return false
  197. }
  198. return false
  199. }
  200. //根据token返回当前登录用户信息
  201. func GetUserInfoByToken(token string) (info map[string]interface{}, err error) {
  202. key := token + "_userinfo"
  203. tokenSync.Lock()
  204. defer tokenSync.Unlock()
  205. if v, ok := global.GoCahce.Get(key); ok {
  206. newObj := make(map[string]interface{}) //拷贝一个新对象
  207. for k, v := range v.(map[string]interface{}) {
  208. newObj[k] = v
  209. }
  210. return newObj, nil
  211. }
  212. o := orm.NewOrm()
  213. 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=?"
  214. obj := []orm.Params{}
  215. _, dberr := o.Raw(sql, token).Values(&obj)
  216. if dberr != nil {
  217. return nil, dberr
  218. }
  219. if len(obj) == 0 {
  220. return nil, nil
  221. }
  222. returninfo := make(map[string]interface{})
  223. for k, v := range obj[0] {
  224. returninfo[k] = v
  225. }
  226. global.GoCahce.Set(key, returninfo, 30*time.Minute)
  227. return returninfo, nil
  228. }
  229. func CacheLoginFialInfo(key string) {
  230. if info, ok := LoginInfo.Load(key); ok {
  231. //失败次数
  232. info2 := info.(map[string]interface{})
  233. failcount := info2["count"].(int)
  234. info2["count"] = failcount + 1
  235. info2["lasttime"] = time.Now().Unix()
  236. } else {
  237. LoginInfo.Store(key, map[string]interface{}{"count": 1, "lasttime": time.Now().Unix()})
  238. }
  239. }
  240. //加载全局参数
  241. func LoadGlobalParam() {
  242. v, err := GetSysParamValue("session_timeout", "600")
  243. if err != nil {
  244. tools.Log("加载Session超时时长参数失败:" + err.Error())
  245. return
  246. }
  247. global.SessionTimeout, _ = strconv.Atoi(v)
  248. }
  249. //加载并检查系统管理员帐号
  250. func CheckSystemUser() (exists bool, err error) {
  251. o := orm.NewOrm()
  252. data := []orm.Params{}
  253. result := false
  254. sqlCommandText := "select 1 from t_data_user where account=?;"
  255. _, dbError := o.Raw(sqlCommandText, "Administrator").Values(&data)
  256. if dbError == nil {
  257. if len(data) == 0 {
  258. //获取超级管理员角色ID
  259. key := "global_code_pl_role_coderole_superadmin"
  260. v, _ := global.GoCahce.Get(key)
  261. parameter := map[string]interface{}{}
  262. parameter["userid"] = "0"
  263. parameter["username"] = "Administrator"
  264. parameter["account"] = "Administrator"
  265. parameter["password"] = "Administrator@123"
  266. if v == nil {
  267. parameter["role"] = 1
  268. } else {
  269. v1 := v.(orm.Params)
  270. parameter["role"], _ = strconv.Atoi(tools.IsEmpty(v1["id"]))
  271. }
  272. parameter["memo"] = "系统超级管理员"
  273. result, dbError = CreateUser(parameter)
  274. if dbError != nil {
  275. return false, dbError
  276. } else {
  277. result = true
  278. }
  279. } else {
  280. result = true
  281. }
  282. }
  283. return result, dbError
  284. }
  285. func UserLogin(account string, pwd string) (userinfo map[string]interface{}, err error) {
  286. o := orm.NewOrm()
  287. data := []orm.Params{}
  288. var result = map[string]interface{}{}
  289. has := md5.Sum([]byte(pwd))
  290. pwd = fmt.Sprintf("%x", has)
  291. 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=?"
  292. _, dbError := o.Raw(sqlCommandText, account, pwd).Values(&data)
  293. if dbError == nil {
  294. if len(data) > 0 {
  295. //判断密码是否过期
  296. pwd_expire := tools.IsEmpty(data[0]["pwd_expire"])
  297. if tools.IsEmpty(data[0]["rolecode"]) != "role_superadmin" && pwd_expire != "" && pwd_expire != "1970-01-01 00:00:00" {
  298. //判断是否过期
  299. expireDate, _ := time.Parse("2006-01-02 15:04:05", pwd_expire)
  300. if expireDate.Unix() < time.Now().Unix() {
  301. logger.Logger.Debug(data)
  302. return result, errors.New("您的密码已过期,请联系管理员更新后重试!")
  303. }
  304. }
  305. LoginInfo.Store(account, map[string]interface{}{"count": 1, "lasttime": time.Now().Unix()})
  306. result["userid"] = tools.IsEmpty(data[0]["id"])
  307. result["name"] = tools.IsEmpty(data[0]["name"])
  308. result["role"] = tools.IsEmpty(data[0]["role"])
  309. result["bind_ips"] = tools.IsEmpty(data[0]["bind_ips"])
  310. result["datelimit_start"] = tools.IsEmpty(data[0]["datelimit_start"])
  311. result["datelimit_end"] = tools.IsEmpty(data[0]["datelimit_end"])
  312. result["rolename"] = tools.IsEmpty(data[0]["userrole"])
  313. return result, nil
  314. } else {
  315. CacheLoginFialInfo(account)
  316. return result, errors.New("用户帐号" + account + "或密码" + pwd + "错误!")
  317. }
  318. } else {
  319. return result, dbError
  320. }
  321. }
  322. //创建用户信息
  323. func CreateUser(parameter map[string]interface{}, userinfo ...map[string]interface{}) (status bool, errs error) {
  324. userData := T_data_user{}
  325. o := orm.NewOrm()
  326. var paramvalues = []interface{}{}
  327. var userid int
  328. var Account string
  329. var modify_password = true
  330. //sqlCommandText := ""
  331. if userId, ok2 := parameter["userid"]; ok2 && tools.IsEmpty(userId) != "" {
  332. userid, _ = strconv.Atoi(userId.(string))
  333. userData.Id = userid
  334. o.Read(&userData)
  335. }
  336. dblog := new(SystemLog)
  337. dblog.Audittype = enum.AuditType_admin_system_user
  338. dblog.Logtype = enum.LogType_Insert
  339. dblog.Eventtype = enum.OptEventType_Bus
  340. dblog.Eventlevel = enum.OptEventLevel_Hight
  341. if len(userinfo) > 0 {
  342. dblog.SetUserInfo(userinfo[0])
  343. userData.Createuser, _ = strconv.Atoi(tools.IsEmpty(userinfo[0]["userid"]))
  344. } else {
  345. dblog.SetUserInfo(map[string]interface{}{"name": "", "ip": "127.0.0.1"})
  346. }
  347. if username, ok2 := parameter["username"]; ok2 {
  348. if tools.IsEmpty(username) != "" {
  349. paramvalues = append(paramvalues, username)
  350. } else {
  351. dblog.Description = fmt.Sprintf("保存用户信息失败|%s,错误:%s", "", "用户姓名为空")
  352. dblog.Fail2()
  353. return false, errors.New("用户姓名字段不允许为空!")
  354. }
  355. userData.Name = tools.IsEmpty(username)
  356. } else {
  357. return false, errors.New("请传入用户姓名参数!")
  358. }
  359. if account, ok2 := parameter["account"]; ok2 {
  360. if tools.IsEmpty(account) != "" {
  361. paramvalues = append(paramvalues, account)
  362. } else {
  363. dblog.Description = fmt.Sprintf("保存用户信息失败|%s,错误:%s", parameter["username"], "用户帐号为空")
  364. dblog.Fail2()
  365. return false, errors.New("用户帐号字段不允许为空!")
  366. }
  367. userData.Account = tools.IsEmpty(account)
  368. } else {
  369. dblog.Description = fmt.Sprintf("保存用户信息失败|%s,错误:%s", parameter["username"], "未设置用户帐号")
  370. dblog.Fail2()
  371. return false, errors.New("请传入用户帐号参数!")
  372. }
  373. if password, ok2 := parameter["password"]; ok2 {
  374. passwordStr := tools.IsEmpty(password)
  375. if passwordStr != "" {
  376. if len(passwordStr) > 32 {
  377. passwordStr = tools.OriginalCode(passwordStr)
  378. }
  379. //密码规则校验
  380. check, msg := PwdRuleCheck(passwordStr)
  381. if !check {
  382. dblog.Description = fmt.Sprintf("保存用户信息失败|%s,错误:%s", parameter["username"], msg)
  383. dblog.Fail2()
  384. return false, errors.New(msg)
  385. }
  386. has := md5.Sum([]byte(passwordStr))
  387. password = fmt.Sprintf("%x", has)
  388. paramvalues = append(paramvalues, password)
  389. modify_password = true
  390. userData.Pwd = tools.IsEmpty(password)
  391. } else if userid == 0 {
  392. dblog.Description = fmt.Sprintf("保存用户信息失败|%s,错误:%s", parameter["username"], "帐号密码为空")
  393. dblog.Fail2()
  394. return false, errors.New("用户帐号密码不允许为空!")
  395. } else {
  396. modify_password = false
  397. }
  398. } else {
  399. dblog.Description = fmt.Sprintf("保存用户信息失败|%s,错误:%s", parameter["username"], "未设置帐号密码")
  400. dblog.Fail2()
  401. return false, errors.New("请传入用户密码参数!")
  402. }
  403. if memo, ok2 := parameter["memo"]; ok2 {
  404. paramvalues = append(paramvalues, memo)
  405. userData.Memo = tools.IsEmpty(memo)
  406. } else {
  407. paramvalues = append(paramvalues, "")
  408. }
  409. if role, ok2 := parameter["role"]; ok2 {
  410. paramvalues = append(paramvalues, role)
  411. userData.Role, _ = strconv.Atoi(tools.IsEmpty(role))
  412. } else {
  413. paramvalues = append(paramvalues, 0)
  414. }
  415. if mbphone, ok2 := parameter["mobilephone"]; ok2 {
  416. paramvalues = append(paramvalues, mbphone)
  417. userData.Mobilephone = tools.IsEmpty(mbphone)
  418. } else {
  419. paramvalues = append(paramvalues, "")
  420. }
  421. if ips, ok2 := parameter["bind_ips"]; ok2 {
  422. paramvalues = append(paramvalues, ips)
  423. userData.BindIps = tools.IsEmpty(ips)
  424. if userData.BindIps != "" && !tools.VerifyIPFormat(userData.BindIps) {
  425. dblog.Description = fmt.Sprintf("保存用户信息失败|%s,错误:%s", parameter["username"], "无效的ip或者ip段")
  426. dblog.Fail2()
  427. return false, errors.New("无效的ip或者ip段!")
  428. }
  429. } else {
  430. paramvalues = append(paramvalues, "")
  431. }
  432. //判断用户是否存在
  433. message := existsUser(userid, Account)
  434. if message != nil {
  435. dblog.Description = fmt.Sprintf("保存用户信息失败|%s,错误:%s", parameter["username"], message)
  436. dblog.Fail2()
  437. return false, message
  438. }
  439. if v, ok2 := parameter["datelimit_start"]; ok2 {
  440. userData.DatelimitStart = tools.IsEmpty(v)
  441. }
  442. if v, ok2 := parameter["datelimit_end"]; ok2 {
  443. userData.DatelimitEnd = tools.IsEmpty(v)
  444. }
  445. if modify_password || userData.DatelimitEnd != "" {
  446. //密码过期时间:单位天
  447. pwd_expire_day, _ := GetSysParamValue("user_pwd_expire_day", "60")
  448. pwd_expire_date := ""
  449. if pwd_expire_day == "0" {
  450. //永不过期
  451. pwd_expire_date = "1970-01-01 00:00:00"
  452. } else if userData.DatelimitEnd != "" {
  453. pwd_expire_date = userData.DatelimitEnd
  454. } else {
  455. pwd_expire_dayInt, _ := strconv.Atoi(pwd_expire_day)
  456. pwd_expire_dayInt = pwd_expire_dayInt * 24
  457. d, _ := time.ParseDuration(strconv.Itoa(pwd_expire_dayInt) + "h")
  458. pwd_expire_date = time.Now().Add(d).Format("2006-01-02 15:04:05")
  459. }
  460. paramvalues = append(paramvalues, pwd_expire_date)
  461. userData.PwdExpire = pwd_expire_date
  462. }
  463. var err error
  464. if userid > 0 {
  465. //判断修改用户信息时是否修改了密码
  466. /*if modify_password {
  467. sqlCommandText = "update t_data_user set name=?,account=?,pwd=?,memo=?,role=?,mobilephone=?,bind_ips=?,pwd_expire=? where id=?"
  468. } else {
  469. sqlCommandText = "update t_data_user set name=?,account=?,memo=?,role=?,mobilephone=?,bind_ips=? where id=?"
  470. }
  471. paramvalues = append(paramvalues, userid)
  472. */
  473. _, err = o.Update(&userData)
  474. } else {
  475. userData.Createtime = tools.NowTime()
  476. //sqlCommandText = "insert into t_data_user(name,account,pwd,memo,role,mobilephone,bind_ips,pwd_expire)values(?,?,?,?,?,?,?);"
  477. _, err = o.Insert(&userData)
  478. }
  479. //_, err := o.Raw(sqlCommandText, paramvalues).Exec()
  480. if err != nil {
  481. logger.Logger.Error(err)
  482. dblog.Description = fmt.Sprintf("保存用户信息失败|%s,错误:%s", parameter["username"], err.Error())
  483. dblog.Fail2()
  484. return false, err
  485. } else {
  486. dblog.Description = fmt.Sprintf("保存用户信息成功|%s", parameter["username"])
  487. dblog.Success2()
  488. return true, nil
  489. }
  490. }
  491. //密码规则检查
  492. func PwdRuleCheck(passwordStr string) (bool, string) {
  493. //密码规则校验
  494. rule, _ := GetSysParamValue("user_pwd_rule", "simple")
  495. if rule == "simple" {
  496. if len(passwordStr) < 6 || len(passwordStr) > 32 {
  497. return false, "用户帐号密码长度只能为6-32位字符!"
  498. }
  499. } else {
  500. if len(passwordStr) < 8 || len(passwordStr) > 32 {
  501. return false, "用户帐号密码长度只能为8-32位字符!"
  502. }
  503. reg1, _ := regexp.Compile("[A-Z]")
  504. reg2, _ := regexp.Compile("[a-z]")
  505. reg3, _ := regexp.Compile("[0-9]")
  506. reg4, _ := regexp.Compile(`[~!@#$%^&*()_\-+=<>?:"{}|,.\/;'\\[\]·~!@#¥%&*]`)
  507. if !reg1.MatchString(passwordStr) || !reg2.MatchString(passwordStr) || !reg3.MatchString(passwordStr) || !reg4.MatchString(passwordStr) {
  508. return false, "用户帐号密码长度只能为8-32位字符且由大小写字母、数字和特殊字符组成!"
  509. }
  510. }
  511. return true, ""
  512. }
  513. //初始化用户表
  514. func InitUser() (status bool, errs error) {
  515. o := orm.NewOrm()
  516. sqlCommandText := "delete from t_data_user where name!=?"
  517. _, err := o.Raw(sqlCommandText, "Rtelec").Exec()
  518. if err != nil {
  519. return false, err
  520. } else {
  521. o.Raw("delete from t_data_usersession").Exec()
  522. return true, nil
  523. }
  524. }
  525. //删除用户
  526. func DelUser(userId string, userinfo map[string]interface{}) (status bool, errs error) {
  527. dblog := new(SystemLog)
  528. dblog.SetUserInfo(userinfo)
  529. dblog.Audittype = enum.AuditType_admin_system_user
  530. dblog.Logtype = enum.LogType_Delete
  531. dblog.Eventtype = enum.OptEventType_Bus
  532. dblog.Eventlevel = enum.OptEventLevel_Hight
  533. o := orm.NewOrm()
  534. sqlCommandText := "delete from t_data_user where id=?"
  535. _, err := o.Raw(sqlCommandText, userId).Exec()
  536. if err != nil {
  537. dblog.Description = fmt.Sprintf("删除用户%s失败,错误:%s", userId, err.Error())
  538. dblog.Fail2()
  539. return false, err
  540. } else {
  541. //删除该用户的关联区域信息
  542. usArea := new(UserAreaRelationObject)
  543. usArea.SetUserInfo(userinfo)
  544. usArea.Model.Userid, _ = strconv.Atoi(userId)
  545. usArea.Delete()
  546. dblog.Description = fmt.Sprintf("删除用户%s成功", userId)
  547. dblog.Success2()
  548. return true, nil
  549. }
  550. }
  551. func existsUser(userId int, account string) error {
  552. ts := []orm.Params{}
  553. o := orm.NewOrm()
  554. var parameter = []interface{}{}
  555. sqlCommandText := ""
  556. if userId > 0 {
  557. sqlCommandText = "select 1 from t_data_user where account=? and id!=?"
  558. parameter = append(parameter, account, userId)
  559. } else {
  560. sqlCommandText = "select 1 from t_data_user where account=? "
  561. parameter = append(parameter, account)
  562. }
  563. _, err := o.Raw(sqlCommandText, parameter).Values(&ts)
  564. if err != nil {
  565. return err
  566. }
  567. if len(ts) > 0 {
  568. return errors.New("已存在用户帐号:" + account)
  569. } else {
  570. return nil
  571. }
  572. }
  573. func SearchUserInfo(area_id, name, role_id string, pageIndex, pageSize int, userinfo map[string]interface{}) ([]orm.Params, int, error) {
  574. dblog := new(SystemLog)
  575. dblog.SetUserInfo(userinfo)
  576. dblog.Audittype = enum.AuditType_admin_system_user
  577. dblog.Logtype = enum.LogType_Query
  578. dblog.Eventtype = enum.OptEventType_Bus
  579. dblog.Eventlevel = enum.OptEventLevel_Low
  580. o := orm.NewOrm()
  581. var sqlCommandText, totalSql string
  582. 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 "
  583. sqlWhere := []string{"1=1"}
  584. sqlParamer := []interface{}{}
  585. sqlWhere = append(sqlWhere, " not EXISTS (select 1 from global_const_code where a.role=id and code='role_superadmin')")
  586. var limit = " limit " + strconv.Itoa((pageIndex-1)*pageSize) + "," + strconv.Itoa(pageSize)
  587. if role_id != "" {
  588. sqlWhere = append(sqlWhere, " a.role=?")
  589. sqlParamer = append(sqlParamer, role_id)
  590. }
  591. if name != "" {
  592. sqlWhere = append(sqlWhere, " a.name like ?")
  593. sqlParamer = append(sqlParamer, "%"+name+"%")
  594. }
  595. if area_id != "" {
  596. sqlWhere = append(sqlWhere, " EXISTS(select 1 from t_relation_user_area ua where a.id=ua.userid and ua.areaid=?)")
  597. sqlParamer = append(sqlParamer, area_id)
  598. }
  599. sqlCommandText += strings.Join(sqlWhere, " and ")
  600. sqlCommandText += " order by a.id desc " + limit
  601. totalSql = "select count(1) number from t_data_user a where " + strings.Join(sqlWhere, " and ")
  602. var tableData []orm.Params
  603. var number int
  604. _, err := o.Raw(sqlCommandText, sqlParamer).Values(&tableData)
  605. dblog.Description = fmt.Sprintf("SQL:%s,参数:%+v", sqlCommandText, sqlParamer)
  606. if err == nil {
  607. dblog.Success2()
  608. var totalData []orm.Params
  609. _, err = o.Raw(totalSql, sqlParamer).Values(&totalData)
  610. if err == nil {
  611. number, _ = strconv.Atoi(totalData[0]["number"].(string))
  612. }
  613. } else {
  614. logger.Logger.Error(err, dblog.Description)
  615. dblog.Fail2()
  616. }
  617. return tableData, number, err
  618. }