front.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527
  1. package front
  2. import (
  3. qu "app.yhyue.com/moapp/jybase/common"
  4. "app.yhyue.com/moapp/jybase/encrypt"
  5. "app.yhyue.com/moapp/jybase/go-xweb/xweb"
  6. "app.yhyue.com/moapp/jybase/mongodb"
  7. "app.yhyue.com/moapp/jybase/sms"
  8. "github.com/dchest/captcha"
  9. "github.com/gorilla/sessions"
  10. "go.mongodb.org/mongo-driver/bson"
  11. "go.mongodb.org/mongo-driver/bson/primitive"
  12. "log"
  13. "regexp"
  14. . "seplatform/util"
  15. "strconv"
  16. "time"
  17. )
  18. var UserMenu map[string][]map[string]interface{} //存储菜单
  19. func init() {
  20. UserMenu = make(map[string][]map[string]interface{})
  21. }
  22. type Front struct {
  23. *xweb.Action
  24. login xweb.Mapper `xweb:"/"` //登录页面
  25. code xweb.Mapper `xweb:"/code"` //获取图片验证码
  26. sendVerifyCode xweb.Mapper `xweb:"/sendVerifyCode"` //获取手机验证码
  27. chooseEnt xweb.Mapper `xweb:"/chooseEnt"` //选择企业
  28. index xweb.Mapper `xweb:"/front/index"` //index页面
  29. logout xweb.Mapper `xweb:"/front/logout"` //注销
  30. updatePwd xweb.Mapper `xweb:"/front/updatepwd"` //更新密码
  31. //user
  32. user xweb.Mapper `xweb:"/front/user"` //查所有用户
  33. userDel xweb.Mapper `xweb:"/front/user/del"` //删除用户
  34. userSave xweb.Mapper `xweb:"/front/user/save"` //保存用户
  35. //menu
  36. menu xweb.Mapper `xweb:"/front/menu"` //查一级菜单
  37. menuSave xweb.Mapper `xweb:"/front/menu/save"` //保存一级菜单
  38. menuDel xweb.Mapper `xweb:"/front/menu/del"` //删除一级菜单
  39. menuSecond xweb.Mapper `xweb:"/front/menuSecond"` //查二级菜单
  40. menuSecondSave xweb.Mapper `xweb:"/front/menuSecond/save"` //保存二级菜单
  41. menuSecondDel xweb.Mapper `xweb:"/front/menuSecond/del"` //删除二级菜单
  42. personalMenu xweb.Mapper `xweb:"/front/personalMenu"`
  43. //role
  44. roleManager xweb.Mapper `xweb:"/front/role"` //角色权限管理
  45. roleNew xweb.Mapper `xweb:"/front/role/save"` //新增角色
  46. roleEdit xweb.Mapper `xweb:"/front/role/edit/(.*)"` //角色权限查看
  47. roleFirst xweb.Mapper `xweb:"/front/role/first"` //一级权限的查看
  48. roleSecond xweb.Mapper `xweb:"/front/role/second"` //二级权限的查看
  49. roleSave xweb.Mapper `xweb:"/front/role/edit/save"` //权限编辑保存
  50. roleDel xweb.Mapper `xweb:"/front/role/edit/del"` //权限编辑删除
  51. roleSecondEdit xweb.Mapper `xweb:"/front/role/second/edit"` //二级权限编辑
  52. }
  53. var store = sessions.NewCookieStore([]byte("jianyu_secret20210422"))
  54. func (f *Front) Login() {
  55. defer qu.Catch()
  56. if f.Method() == "POST" {
  57. // 1. 验证参数有效性
  58. phone := f.GetString("phone")
  59. phoneCode := f.GetString("phoneCode")
  60. reg := regexp.MustCompile("^1([3456789])\\d{9}$")
  61. log.Println(phone)
  62. log.Println(phoneCode)
  63. if !reg.MatchString(phone) {
  64. f.ServeJson(map[string]interface{}{
  65. "code": 0,
  66. "status": false,
  67. "message": "手机号格式有误",
  68. })
  69. return
  70. }
  71. if phoneCode == "" {
  72. f.ServeJson(map[string]interface{}{
  73. "code": 0,
  74. "status": false,
  75. "message": "短信验证码不能为空",
  76. })
  77. return
  78. }
  79. // 2. 验证短信验证码
  80. session, err := store.Get(f.Request, "dataTagLoginPhoneCode")
  81. if err != nil {
  82. f.ServeJson(map[string]interface{}{
  83. "code": 0,
  84. "status": false,
  85. "message": "验证码比对失败",
  86. })
  87. log.Println("phone-session2获取失败")
  88. return
  89. }
  90. realPhoneCode := qu.ObjToString(session.Values["code"])
  91. sessionPhone := qu.ObjToString(session.Values["phone"])
  92. if sessionPhone == "" {
  93. log.Printf("短信验证码过期-%s \n", phone)
  94. f.ServeJson(map[string]interface{}{
  95. "code": 0,
  96. "status": false,
  97. "message": "短信验证码过期",
  98. })
  99. return
  100. }
  101. if phoneCode != realPhoneCode || phone != sessionPhone {
  102. log.Println("短信验证码错误")
  103. f.ServeJson(map[string]interface{}{
  104. "code": 0,
  105. "status": false,
  106. "message": "短信验证码错误",
  107. })
  108. return
  109. }
  110. // 清理验证过的验证码
  111. session.Values["code"] = ""
  112. session.Values["phone"] = ""
  113. if err := session.Save(f.Request, f.ResponseWriter); err != nil {
  114. log.Println("session1清理出错,短信验证码")
  115. }
  116. log.Println("验证码验证通过")
  117. // 3. 验证用户导出权限 确认认用户是否有数据导出权限
  118. loginUser := JyMysql.SelectBySql("select id, name,ent_id,phone,export_power,name from entniche_user where phone=? and export_power=1", phone)
  119. if loginUser == nil || len(*loginUser) == 0 {
  120. log.Println("该用户无数据导出权限")
  121. f.ServeJson(map[string]interface{}{
  122. "code": 0,
  123. "status": false,
  124. "message": "无权限",
  125. })
  126. return
  127. }
  128. // 4. 如果用户在多个企业并且都有剑鱼库里都有数据导出权限,则返回去让用户选择企业
  129. if len(*loginUser) > 1 {
  130. f.SetSession("user", map[string]interface{}{
  131. "phone": phone,
  132. })
  133. f.ServeJson(map[string]interface{}{
  134. "code": 1,
  135. "status": true,
  136. "message": "",
  137. })
  138. return
  139. }
  140. LoginCheck(f, int((*loginUser)[0]["ent_id"].(int64)), (*loginUser)[0], phone)
  141. return
  142. } else {
  143. f.Render("login.html")
  144. }
  145. }
  146. func (f *Front) ChooseEnt() {
  147. defer qu.Catch()
  148. // 选择企业页面
  149. tempSession := f.GetSession("user")
  150. if tempSession == nil || tempSession == "" {
  151. f.Redirect("/", 302)
  152. return
  153. }
  154. info := tempSession.(map[string]interface{})
  155. if info["phone"] == "" || info["phone"] == nil {
  156. f.Redirect("/", 302)
  157. return
  158. }
  159. if f.Method() == "POST" {
  160. entId := f.GetString("ent_id")
  161. log.Println(entId)
  162. // 2. 确认该手机号有数据导出权限
  163. loginUser := JyMysql.SelectBySql("select id, name,ent_id,phone,export_power,name from entniche_user where phone=? and export_power=1 and ent_id=?", info["phone"], qu.IntAll(entId))
  164. if loginUser == nil || len(*loginUser) == 0 {
  165. f.ServeJson(map[string]interface{}{
  166. "code": 0,
  167. "status": false,
  168. "message": "无权限",
  169. })
  170. return
  171. }
  172. LoginCheck(f, qu.IntAll(entId), (*loginUser)[0], info["phone"].(string))
  173. return
  174. } else { // get 请求时铺企业页面
  175. // 查询 企业信息 name ent_id
  176. rs := JyMysql.SelectBySql("select a.ent_id, b.name ent_name from entniche_user a, entniche_info b WHERE a.phone =? and export_power=1 and a.ent_id=b.id", info["phone"])
  177. f.T["ent_info"] = rs
  178. f.Render("choose_ent.html", &f.T)
  179. }
  180. }
  181. func (f *Front) Index() {
  182. defer qu.Catch()
  183. f.Render("index.html")
  184. }
  185. func (f *Front) Logout() {
  186. f.DelSession("user")
  187. f.Redirect("/")
  188. }
  189. func (f *Front) UpdatePwd() {
  190. defer qu.Catch()
  191. id := f.GetString("id")
  192. password := f.GetString("pwd")
  193. set := bson.M{
  194. "$set": bson.M{
  195. "s_pwd": encrypt.SE.EncodeString(password),
  196. },
  197. }
  198. if Mgo.UpdateById("user", id, set) {
  199. sessionuser := f.GetSession("user").(map[string]interface{})
  200. sessionuser["pwd"] = password
  201. f.SetSession("user", sessionuser)
  202. }
  203. }
  204. func (f *Front) User() {
  205. defer qu.Catch()
  206. role, _ := Mgo.Find("role", nil, nil, nil, false, -1, -1)
  207. roleMap := make(map[string]string)
  208. for _, v := range *role {
  209. level := qu.ObjToString(v["level"])
  210. if level != "" {
  211. roleMap[level] = qu.ObjToString(v["name"])
  212. }
  213. }
  214. if f.Method() == "POST" {
  215. query := bson.M{
  216. "s_role": bson.M{
  217. "$ne": "0",
  218. },
  219. }
  220. data, _ := Mgo.Find("user", query, `{"_id":1}`, nil, false, -1, -1)
  221. for _, d := range *data {
  222. d["s_pwd"] = encrypt.SE.DecodeString(qu.ObjToString(d["s_pwd"]))
  223. d["role_name"] = roleMap[qu.ObjToString(d["s_role"])]
  224. }
  225. f.ServeJson(map[string]interface{}{
  226. "data": data,
  227. })
  228. } else {
  229. f.T["role"] = roleMap
  230. f.Render("com/user.html", &f.T)
  231. }
  232. }
  233. func (f *Front) UserDel() {
  234. defer qu.Catch()
  235. _id := f.GetString("_id")
  236. query := bson.M{
  237. "_id": mongodb.StringTOBsonId(_id),
  238. }
  239. b := Mgo.Del("user", query)
  240. f.ServeJson(map[string]interface{}{
  241. "rep": b,
  242. })
  243. }
  244. func (f *Front) UserSave() {
  245. _id := f.GetString("_id")
  246. role := f.GetString("role")
  247. name := f.GetString("name")
  248. email := f.GetString("email")
  249. pwd := f.GetString("pwd")
  250. set := bson.M{
  251. "$set": bson.M{
  252. "s_role": role,
  253. "s_name": name,
  254. "s_email": email,
  255. "s_pwd": encrypt.SE.EncodeString(pwd),
  256. "i_comeintime": time.Now().Unix(),
  257. },
  258. }
  259. query := bson.M{
  260. "_id": mongodb.StringTOBsonId(_id),
  261. }
  262. if _id == "" {
  263. query = bson.M{
  264. "_id": primitive.NewObjectID(),
  265. }
  266. }
  267. b := Mgo.Update("user", query, set, true, false)
  268. //b := Mgo.UpdateById("user", _id, set)
  269. f.ServeJson(map[string]interface{}{
  270. "rep": b,
  271. })
  272. }
  273. func (f *Front) PersonalMenu() {
  274. user := f.GetSession("user").(map[string]interface{})
  275. list := UserMenu[qu.ObjToString(user["email"])]
  276. f.ServeJson(map[string]interface{}{
  277. "data": list,
  278. })
  279. }
  280. func GetUserMenu(role string) []map[string]interface{} {
  281. var list []map[string]interface{}
  282. maps := map[string]interface{}{
  283. "delete": false,
  284. }
  285. if role != "0" {
  286. maps["role."+role] = true
  287. }
  288. data, _ := Mgo.Find("menu_first", maps, nil, nil, false, -1, -1)
  289. for _, d := range *data {
  290. _id := d["_id"]
  291. maps = map[string]interface{}{
  292. "delete": false,
  293. "s_pid": mongodb.BsonIdToSId(_id),
  294. }
  295. if role != "0" {
  296. maps["role."+role] = true
  297. }
  298. secdatas, _ := Mgo.Find("menu_second", maps, nil, nil, false, -1, -1)
  299. secmenumap := map[string]interface{}{}
  300. for index, secdata := range *secdatas {
  301. secmenumap[strconv.Itoa(index+1)] = secdata
  302. }
  303. if len(secmenumap) != 0 {
  304. d["secondmenu"] = secmenumap
  305. }
  306. list = append(list, d)
  307. }
  308. return list
  309. }
  310. // 获取图片验证码
  311. func (f *Front) Code() {
  312. id := captcha.NewLen(4)
  313. //r := &http.Request{}
  314. f.Request.Header.Add("Cache-Control", "no-cache, no-store, must-revalidate")
  315. f.Request.Header.Add("Pragma", "no-cache")
  316. f.Request.Header.Add("Expires", "0")
  317. f.Request.Header.Add("Content-Type", "image/png")
  318. w := f.ResponseWriter
  319. session, err := store.Get(f.Request, "dataTagLoginImgCode")
  320. if err != nil {
  321. log.Println("session1获取失败")
  322. return
  323. }
  324. session.Values["dataTagLoginImgCode"] = id
  325. session.Options.MaxAge = 60
  326. if err := session.Save(f.Request, w); err != nil {
  327. log.Println("session1保存错误,验证码 ", id)
  328. }
  329. err2 := captcha.WriteImage(w, id, 90, 30)
  330. if err2 != nil {
  331. log.Println("生成图片验证码错误,验证码 ", id)
  332. }
  333. return
  334. }
  335. // 发送手机验证码接口
  336. func (f *Front) SendVerifyCode() {
  337. if f.Method() == "POST" {
  338. //1. 验证参数有效性
  339. phone := f.GetString("phone")
  340. imgCode := f.GetString("imgCode")
  341. reg := regexp.MustCompile("^1(3|4|5|6|7|8|9)\\d{9}$")
  342. if !reg.MatchString(phone) {
  343. f.ServeJson(map[string]interface{}{
  344. "code": 0,
  345. "status": false,
  346. "message": "手机号格式有误",
  347. })
  348. return
  349. }
  350. //2. 验证图片验证码
  351. session, err := store.Get(f.Request, "dataTagLoginImgCode")
  352. if err != nil {
  353. log.Printf("图片验证码session获取失败-%s \n", phone)
  354. f.ServeJson(map[string]interface{}{
  355. "code": 0,
  356. "status": false,
  357. "message": "获取失败",
  358. })
  359. return
  360. }
  361. code := qu.ObjToString(session.Values["dataTagLoginImgCode"])
  362. if code == "" {
  363. log.Printf("图片验证码过期-%s \n", phone)
  364. f.ServeJson(map[string]interface{}{
  365. "code": 0,
  366. "status": false,
  367. "message": "图片验证码过期",
  368. })
  369. return
  370. }
  371. if !captcha.VerifyString(code, imgCode) {
  372. log.Printf("图片验证码错误-%s \n", phone)
  373. f.ServeJson(map[string]interface{}{
  374. "code": 0,
  375. "status": false,
  376. "message": "图片验证码错误",
  377. })
  378. return
  379. }
  380. //3. 验证手机号是否存在
  381. user := JyMysql.SelectBySql("select * from entniche_user where phone=? and export_power=1", phone)
  382. // 确认用户是否存在
  383. if len(*user) == 0 || ((*user)[0])["phone"] != phone {
  384. log.Println("没有数据导出权限")
  385. f.ServeJson(map[string]interface{}{
  386. "code": 0,
  387. "status": false,
  388. "message": "无权限",
  389. })
  390. return
  391. }
  392. //4. 发送验证码
  393. SendPhoneCode(f, phone)
  394. f.ServeJson(map[string]interface{}{
  395. "code": 0,
  396. "status": true,
  397. "message": "发送成功",
  398. })
  399. return
  400. } else {
  401. f.ServeJson(map[string]interface{}{
  402. "code": 0,
  403. "status": false,
  404. "message": "无效的请求方式",
  405. })
  406. }
  407. }
  408. // 发送手机验证码方法
  409. func SendPhoneCode(f *Front, phone string) {
  410. r := f.Request
  411. w := f.ResponseWriter
  412. session, err := store.Get(r, "dataTagLoginPhoneCode")
  413. if err != nil {
  414. log.Println("phone-session1获取失败")
  415. return
  416. }
  417. lastSentTime := qu.Int64All(session.Values["identCodeTime"])
  418. //60秒之内不允许重复发
  419. if lastSentTime > 0 && time.Now().Unix()-lastSentTime <= 60 {
  420. }
  421. s_ranNum := qu.GetRandom(6) //生成随机数
  422. session.Values["code"] = s_ranNum
  423. session.Values["phone"] = phone
  424. session.Values["identCodeTime"] = time.Now().Unix()
  425. session.Options.MaxAge = 300
  426. if err := session.Save(r, w); err != nil {
  427. log.Println("session1保存错误,验证码")
  428. }
  429. //发送短信
  430. // param := map[string]string{"code": s_ranNum}
  431. log.Println("短信验证码", phone, s_ranNum)
  432. // SendSMS("2828060", phone, param)
  433. SendSMS("jypro186.jy360.cn:932", phone, s_ranNum)
  434. }
  435. func SendSMS(address, mobile string, params ...string) {
  436. sms.SendSms(address, "01", mobile, params...)
  437. }
  438. func LoginCheck(f *Front, entId int, loginUser map[string]interface{}, userPhone string) {
  439. // 1. 确认该企业有使用该系统的权限 查询配置文件appid 确认是否有使用该系统的权限
  440. query2 := bson.M{
  441. "ent_id": entId,
  442. }
  443. log.Println(entId)
  444. isExist, _ := Mgo.FindOne("datatag_export_config", query2)
  445. log.Println(isExist)
  446. if isExist == nil || len(*isExist) == 0 {
  447. f.ServeJson(map[string]interface{}{
  448. "code": 0,
  449. "status": false,
  450. "message": "该企业无权限",
  451. })
  452. return
  453. }
  454. // 3. 查询企业管理员信息及手机号
  455. entInfo := JyMysql.SelectBySql("select phone,name from entniche_info WHERE id = ?", entId)
  456. if entInfo == nil || len(*entInfo) == 0 {
  457. f.ServeJson(map[string]interface{}{
  458. "code": 0,
  459. "status": false,
  460. "message": "企业信息查询失败",
  461. })
  462. return
  463. }
  464. // 4. mongo库查询与之关联的企业appid
  465. query := bson.M{
  466. "phone": (*entInfo)[0]["phone"],
  467. "username": (*entInfo)[0]["name"],
  468. }
  469. entMgoInfo, ok := MgoCus.FindOne("user", query)
  470. if !ok || entMgoInfo == nil || len(*entMgoInfo) == 0 {
  471. // 企业信息查询失败
  472. f.ServeJson(map[string]interface{}{
  473. "code": 0,
  474. "status": false,
  475. "message": "appid查询失败",
  476. })
  477. return
  478. }
  479. // 5. 确认用户角色
  480. var role int // 角色 1 管理员 3 普通用户
  481. if userPhone != qu.ObjToString((*entInfo)[0]["phone"]) {
  482. role = 3
  483. } else {
  484. role = 1
  485. }
  486. // 确认用户角色 存session
  487. f.SetSession("user", map[string]interface{}{
  488. "name": loginUser["name"],
  489. "phone": userPhone,
  490. "role": role,
  491. "appid": (*entMgoInfo)["appid"],
  492. "ent_id": qu.IntAll(entId),
  493. "id": qu.IntAll(loginUser["id"]),
  494. })
  495. // 返回
  496. f.ServeJson(map[string]interface{}{
  497. "code": 0,
  498. "status": true,
  499. "role": role,
  500. "message": "",
  501. })
  502. }