backstage_service.go 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  1. /*
  2. * @description:登陆相关数据操作
  3. * @Author: CP
  4. * @Date: 2020-09-02 09:56:28
  5. * @FilePath: \construction_management\services\backstage_service.go
  6. */
  7. package services
  8. import (
  9. "errors"
  10. "log"
  11. "net/http"
  12. "net/url"
  13. "strconv"
  14. "time"
  15. "github.com/kataras/iris/v12"
  16. "go.mod/comm"
  17. "go.mod/conf"
  18. "go.mod/dao"
  19. "go.mod/datasource"
  20. "go.mod/lib"
  21. "go.mod/models"
  22. "go.mod/web/viewmodels"
  23. )
  24. // 定义项目用户Service接口
  25. type BackstageService interface {
  26. ValidRuleLogin(ctx iris.Context) (viewmodels.StaffCld, error)
  27. ValidCldStaff(loginData viewmodels.StaffCld, writer http.ResponseWriter) (*viewmodels.ResultCld, error)
  28. ValidRuleProject(ctx iris.Context) (viewmodels.Project, error)
  29. ValidRuleProjectAdd(ctx iris.Context) (viewmodels.Project, error)
  30. ValidRuleProjectSave(ctx iris.Context) (viewmodels.Project, error)
  31. ValidRuleAccountAdd(ctx iris.Context) (viewmodels.ProjectAccount, error)
  32. ValidRuleAccountSync(ctx iris.Context) (viewmodels.Project, error)
  33. ValidRuleAccountSave(ctx iris.Context) (viewmodels.ProjectAccount, error)
  34. ValidRuleAccountEnable(ctx iris.Context) (viewmodels.ProjectAccount, error)
  35. ValidRuleAccountPassword(ctx iris.Context) (viewmodels.ProjectAccount, error)
  36. GetCldByCategoryId(categoryId string) (map[string]interface{}, error)
  37. Out(ctx iris.Context) error
  38. }
  39. // 返回service操作类
  40. type backstageService struct {
  41. // projectAccountDao *dao.ProjectAccountDao
  42. managerDao *dao.ManagerDao
  43. }
  44. // 创建项目用户service
  45. func NewBackstageService() BackstageService {
  46. return &backstageService{
  47. // projectAccountDao: dao.NewProjectAccountDao(datasource.InstanceDbMaster()),
  48. managerDao: dao.NewManagerDao(datasource.InstanceDbMaster()),
  49. }
  50. }
  51. // 登陆验证
  52. func (s *backstageService) ValidRuleLogin(ctx iris.Context) (viewmodels.StaffCld, error) {
  53. loginVaild := viewmodels.StaffCld{}
  54. err := ctx.ReadJSON(&loginVaild)
  55. if err != nil {
  56. log.Println("ReadForm转换异常, error=", err)
  57. return loginVaild, err
  58. }
  59. err = loginVaild.ValidateLogin()
  60. if err != nil {
  61. log.Println("登录验证, error=", err)
  62. return loginVaild, err
  63. }
  64. return loginVaild, nil
  65. }
  66. // 验证项目
  67. func (s *backstageService) ValidRuleProject(ctx iris.Context) (viewmodels.Project, error) {
  68. projectVaild := viewmodels.Project{}
  69. err := ctx.ReadForm(&projectVaild)
  70. if err != nil {
  71. log.Println("ReadForm转换异常, error=", err)
  72. return projectVaild, err
  73. }
  74. err = projectVaild.ValidateId()
  75. if err != nil {
  76. log.Println("验证项目, error=", err)
  77. return projectVaild, err
  78. }
  79. return projectVaild, nil
  80. }
  81. // 验证项目
  82. func (s *backstageService) ValidRuleProjectAdd(ctx iris.Context) (viewmodels.Project, error) {
  83. projectVaild := viewmodels.Project{}
  84. err := ctx.ReadJSON(&projectVaild)
  85. if err != nil {
  86. log.Println("ReadForm转换异常, error=", err)
  87. return projectVaild, err
  88. }
  89. err = projectVaild.ValidateAdd()
  90. if err != nil {
  91. log.Println("添加项目验证, error=", err)
  92. return projectVaild, err
  93. }
  94. return projectVaild, nil
  95. }
  96. // 验证账号同步的接口
  97. func (s *backstageService) ValidRuleAccountSync(ctx iris.Context) (viewmodels.Project, error) {
  98. projectVaild := viewmodels.Project{}
  99. err := ctx.ReadJSON(&projectVaild)
  100. if err != nil {
  101. log.Println("ReadForm转换异常, error=", err)
  102. return projectVaild, err
  103. }
  104. err = projectVaild.ValidateSync()
  105. if err != nil {
  106. log.Println("添加项目验证, error=", err)
  107. return projectVaild, err
  108. }
  109. return projectVaild, nil
  110. }
  111. // 项目保存
  112. func (s *backstageService) ValidRuleProjectSave(ctx iris.Context) (viewmodels.Project, error) {
  113. projectVaild := viewmodels.Project{}
  114. err := ctx.ReadJSON(&projectVaild)
  115. if err != nil {
  116. log.Println("ReadForm转换异常, error=", err)
  117. return projectVaild, err
  118. }
  119. err = projectVaild.ValidateSave()
  120. if err != nil {
  121. log.Println("添加项目验证, error=", err)
  122. return projectVaild, err
  123. }
  124. return projectVaild, nil
  125. }
  126. // 验证账号新增
  127. func (s *backstageService) ValidRuleAccountAdd(ctx iris.Context) (viewmodels.ProjectAccount, error) {
  128. projectVaild := viewmodels.ProjectAccount{}
  129. err := ctx.ReadJSON(&projectVaild)
  130. if err != nil {
  131. log.Println("ReadForm转换异常, error=", err)
  132. return projectVaild, err
  133. }
  134. err = projectVaild.ValidateAddBs()
  135. if err != nil {
  136. log.Println("添加账号验证, error=", err)
  137. return projectVaild, err
  138. }
  139. return projectVaild, nil
  140. }
  141. // 验证账号编辑
  142. func (s *backstageService) ValidRuleAccountSave(ctx iris.Context) (viewmodels.ProjectAccount, error) {
  143. projectVaild := viewmodels.ProjectAccount{}
  144. err := ctx.ReadJSON(&projectVaild)
  145. if err != nil {
  146. log.Println("ReadForm转换异常, error=", err)
  147. return projectVaild, err
  148. }
  149. err = projectVaild.ValidateSaveBs()
  150. if err != nil {
  151. log.Println("编辑账号验证, error=", err)
  152. return projectVaild, err
  153. }
  154. return projectVaild, nil
  155. }
  156. // 验证账号启用
  157. func (s *backstageService) ValidRuleAccountEnable(ctx iris.Context) (viewmodels.ProjectAccount, error) {
  158. accounttVaild := viewmodels.ProjectAccount{}
  159. err := ctx.ReadForm(&accounttVaild)
  160. if err != nil {
  161. log.Println("ReadForm转换异常, error=", err)
  162. return accounttVaild, err
  163. }
  164. err = accounttVaild.ValidateEnableBs()
  165. if err != nil {
  166. log.Println("编辑账号验证, error=", err)
  167. return accounttVaild, err
  168. }
  169. return accounttVaild, nil
  170. }
  171. // 验证账号启用
  172. func (s *backstageService) ValidRuleAccountPassword(ctx iris.Context) (viewmodels.ProjectAccount, error) {
  173. accounttVaild := viewmodels.ProjectAccount{}
  174. err := ctx.ReadForm(&accounttVaild)
  175. if err != nil {
  176. log.Println("ReadForm转换异常, error=", err)
  177. return accounttVaild, err
  178. }
  179. err = accounttVaild.ValidatePasswordBs()
  180. if err != nil {
  181. log.Println("账号密码验证, error=", err)
  182. return accounttVaild, err
  183. }
  184. return accounttVaild, nil
  185. }
  186. // 验证项目用户登陆相关
  187. func (s *backstageService) ValidCldStaff(loginData viewmodels.StaffCld, writer http.ResponseWriter) (*viewmodels.ResultCld, error) {
  188. // 1.cld账号写入管理员表
  189. managerData := s.managerDao.GetUserName(loginData.StaffName)
  190. // result := &lib.Result{}
  191. // 1.验证CLD账号密码
  192. cld := lib.NewCld()
  193. result, err := cld.LoginValid(loginData)
  194. if managerData.Id != 0 && managerData.IsAdmin == 1 && managerData.Username == "admin" {
  195. result.Data.UserName = "admin"
  196. result.Data.Category = "admin"
  197. managerData.CanLogin = 1
  198. if !(managerData.Username == loginData.StaffName && managerData.Password == loginData.Password) {
  199. return nil, errors.New("账号或者密码不正确")
  200. }
  201. } else {
  202. if err != nil {
  203. return nil, err
  204. }
  205. if result.Code != 0 {
  206. return nil, errors.New(result.Msg)
  207. }
  208. if managerData.Id == 0 {
  209. // 写入管理表
  210. manager := &models.CmManager{}
  211. manager.Username = result.Data.UserName
  212. manager.CreateTime = time.Now()
  213. manager.UpdateTime = time.Now()
  214. manager.LastLogin = time.Now()
  215. manager.Category = result.Data.Category
  216. manager.Office = result.Data.CategoryId
  217. manager.Telephone = result.Data.Telephone
  218. manager.Email = result.Data.Email
  219. manager.Qq = result.Data.Qq
  220. manager.Fixedphone = result.Data.Fixedphone
  221. manager.Position = result.Data.Position
  222. manager.CanLogin = 1
  223. sid, _ := strconv.Atoi(result.Data.Sid)
  224. manager.StaffId = sid
  225. if result.Data.Category == "总部" {
  226. manager.IsAdmin = 1
  227. } else {
  228. groupDao := dao.NewGroupDao(datasource.InstanceDbMaster())
  229. groups, _ := groupDao.GetAll()
  230. // 拿最后一个当默认值
  231. if len(groups) != 0 {
  232. manager.GroupId = groups[len(groups)-1].Id
  233. }
  234. }
  235. err = s.managerDao.Create(manager)
  236. if err != nil {
  237. return nil, err
  238. }
  239. }
  240. }
  241. // 2-1
  242. // if managerData.CanLogin == 0 {
  243. // return nil, errors.New("不允许登陆")
  244. // }
  245. // 3.写入登录态
  246. // 加密用户标识
  247. identity, err := comm.AesEncrypt(result.Data.UserName, conf.CookieSecret)
  248. if err != nil {
  249. return nil, err
  250. }
  251. // 加密项目标识
  252. category, err := comm.AesEncrypt(result.Data.Category, conf.CookieSecret)
  253. if err != nil {
  254. return nil, err
  255. }
  256. digitalToken := comm.CreateSign(conf.CookieSecret + identity)
  257. // 设置cookie
  258. maxAge := 60 * 60 * 24 * 7
  259. params := url.Values{}
  260. params.Add("identity", identity)
  261. params.Add("attachedIdentity", category)
  262. params.Add("digitalToken", digitalToken)
  263. params.Add("manager", strconv.Itoa(managerData.IsAdmin))
  264. c := &http.Cookie{
  265. Name: "cmBackstage",
  266. Value: params.Encode(),
  267. Path: "/",
  268. MaxAge: maxAge,
  269. HttpOnly: true,
  270. }
  271. http.SetCookie(writer, c)
  272. // staffCld := &viewmodels.StaffCld{}
  273. // staffCld.Category = result.Data.Category
  274. // staffCld.StaffName = result.Data.UserName
  275. return &result.Data, nil
  276. }
  277. // 登出
  278. func (s *backstageService) Out(ctx iris.Context) error {
  279. // 移除cookie
  280. ctx.RemoveCookie("cmBackstage")
  281. return nil
  282. }
  283. // 获得cld办事处和员工 列表
  284. func (s *backstageService) GetCldByCategoryId(categoryId string) (map[string]interface{}, error) {
  285. cld := lib.NewCld()
  286. result, err := cld.GetList(categoryId)
  287. if err != nil {
  288. return nil, err
  289. }
  290. if result["code"].(float64) != 0 {
  291. return nil, errors.New(result["code"].(string))
  292. }
  293. return result, nil
  294. }