user.go 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. package api
  2. import (
  3. "copter-train/log"
  4. "copter-train/utils"
  5. "errors"
  6. "time"
  7. "copter-train/db/model"
  8. "copter-train/db/repo"
  9. "github.com/gin-gonic/gin"
  10. "go.mongodb.org/mongo-driver/bson"
  11. "go.mongodb.org/mongo-driver/bson/primitive"
  12. )
  13. type UserLoginPasswordReq struct {
  14. LoginName string `json:"loginName"`
  15. Password string `json:"password"`
  16. Role string `json:"role"`
  17. }
  18. func UserLoginPassword(c *gin.Context, apictx *ApiSession) (interface{}, error) {
  19. var form UserLoginPasswordReq
  20. err := c.ShouldBindJSON(&form)
  21. if err != nil {
  22. return nil, err
  23. }
  24. // 查找用户:根据longinName/password/role是否在roles中
  25. user := &model.User{}
  26. found, err := repo.RepoSeachDoc(apictx.CreateRepoCtx(), &repo.DocSearchOptions{
  27. CollectName: repo.CollectionUser,
  28. Query: repo.Map{
  29. "loginName": form.LoginName,
  30. "password": utils.UtilMd5(form.Password),
  31. "roles": bson.M{"$elemMatch": bson.M{"$eq": form.Role}},
  32. },
  33. }, user)
  34. if err != nil {
  35. return nil, err
  36. }
  37. if !found {
  38. return nil, errors.New("账号/密码/角色不正确")
  39. }
  40. jwtU := &JWTUser{ID: user.GetID()}
  41. token, _, err := apictx.Svc.JWT.JwtCreateToken(jwtU)
  42. if err != nil {
  43. return nil, err
  44. }
  45. // 前端返回处理
  46. user.Password = ""
  47. out := map[string]interface{}{
  48. "token": token,
  49. "user": user,
  50. }
  51. return out, nil
  52. }
  53. func CreateUser(c *gin.Context, apictx *ApiSession) (interface{}, error) {
  54. // 验证是否为管理员
  55. isAdmin, err := IsAdmin(c, apictx)
  56. if err != nil {
  57. return nil, err
  58. }
  59. if !isAdmin {
  60. return nil, errors.New("没有权限")
  61. }
  62. user := &model.User{}
  63. err = c.ShouldBindJSON(&user)
  64. if err != nil {
  65. log.Error(err)
  66. return nil, err
  67. }
  68. // 验证登录名是否存在
  69. found, err := repo.RepoSeachDoc(apictx.CreateRepoCtx(), &repo.DocSearchOptions{
  70. CollectName: repo.CollectionUser,
  71. Query: repo.Map{"loginName": user.LoginName},
  72. }, user)
  73. if err != nil {
  74. return nil, err
  75. }
  76. if found {
  77. return nil, errors.New("该账号已存在")
  78. }
  79. // student,teacher,admin
  80. if len(user.Roles) < 1 {
  81. user.Roles = []string{"student"}
  82. }
  83. user.Password = UtilMd5(user.Password)
  84. user.CreateTime = time.Now()
  85. user.UpdateTime = time.Now()
  86. return repo.RepoAddDoc(apictx.CreateRepoCtx(), repo.CollectionUser, &user)
  87. }
  88. func DeleteUser(c *gin.Context, apictx *ApiSession) (interface{}, error) {
  89. // 验证是否为管理员
  90. isAdmin, err := IsAdmin(c, apictx)
  91. if err != nil {
  92. return nil, err
  93. }
  94. if !isAdmin {
  95. return nil, errors.New("没有权限")
  96. }
  97. _id := c.Param("id")
  98. id, _ := primitive.ObjectIDFromHex(_id)
  99. if id.IsZero() {
  100. return nil, errors.New("id错误")
  101. }
  102. return repo.RepoDeleteDoc(apictx.CreateRepoCtx(), repo.CollectionUser, _id)
  103. }
  104. func UserList(c *gin.Context, apictx *ApiSession) (interface{}, error) {
  105. // 验证是否为管理员
  106. isStudent, err := IsStudent(c, apictx)
  107. if err != nil {
  108. return nil, err
  109. }
  110. if isStudent {
  111. return nil, errors.New("没有权限")
  112. }
  113. page, size, query := UtilQueryPageSize(c)
  114. role := c.Query("role")
  115. if len(role) > 0 {
  116. query["roles"] = bson.M{"$elemMatch": bson.M{"$eq": role}}
  117. }
  118. return repo.RepoPageSearch(apictx.CreateRepoCtx(), &repo.PageSearchOptions{
  119. CollectName: repo.CollectionUser,
  120. Page: page,
  121. Size: size,
  122. Query: query,
  123. Project: []string{"nid", "name", "loginName", "avatar", "roles", "createTime", "updateTime"},
  124. })
  125. }
  126. func UserDetail(c *gin.Context, apictx *ApiSession) (interface{}, error) {
  127. // 验证是否为管理员
  128. isAdmin, err := IsAdmin(c, apictx)
  129. if err != nil {
  130. return nil, err
  131. }
  132. if !isAdmin {
  133. return nil, errors.New("没有权限")
  134. }
  135. _id := c.Param("id")
  136. id, _ := primitive.ObjectIDFromHex(_id)
  137. if id.IsZero() {
  138. return nil, errors.New("id错误")
  139. }
  140. return GetUserById(apictx, _id)
  141. }
  142. func UpdateUser(c *gin.Context, apictx *ApiSession) (interface{}, error) {
  143. // 验证是否为管理员
  144. isAdmin, err := IsAdmin(c, apictx)
  145. if err != nil {
  146. return nil, err
  147. }
  148. if !isAdmin {
  149. return nil, errors.New("没有权限")
  150. }
  151. user := &model.User{}
  152. err = c.ShouldBindJSON(&user)
  153. if err != nil {
  154. log.Error(err)
  155. return nil, err
  156. }
  157. if user.Id.IsZero() {
  158. return nil, errors.New("id错误")
  159. }
  160. return repo.RepoUpdateSetDoc(apictx.CreateRepoCtx(), repo.CollectionUser, user.Id.Hex(), user)
  161. }
  162. // 获取自己的信息
  163. func UserProfile(c *gin.Context, apictx *ApiSession) (interface{}, error) {
  164. return GetUserById(apictx, apictx.User.ID)
  165. }
  166. // 根据id获取用户信息
  167. func GetUserById(apictx *ApiSession, id string) (*model.User, error) {
  168. user := &model.User{}
  169. found, err := repo.RepoSeachDoc(apictx.CreateRepoCtx(), &repo.DocSearchOptions{
  170. CollectName: repo.CollectionUser,
  171. Query: repo.Map{"_id": id},
  172. }, user)
  173. if err != nil {
  174. log.Error(err)
  175. return nil, err
  176. }
  177. if !found {
  178. return nil, errors.New("未找到该数据")
  179. }
  180. user.Password = ""
  181. return user, nil
  182. }
  183. // 是否是管理员
  184. func IsAdmin(c *gin.Context, apictx *ApiSession) (bool, error) {
  185. user, err := GetUserById(apictx, apictx.User.ID)
  186. if err != nil {
  187. return false, err
  188. }
  189. for _, v := range user.Roles {
  190. if v == "admin" {
  191. return true, nil
  192. }
  193. }
  194. return false, nil
  195. }
  196. // 是否是老师
  197. func IsTeacher(c *gin.Context, apictx *ApiSession) (bool, error) {
  198. user, err := GetUserById(apictx, apictx.User.ID)
  199. if err != nil {
  200. return false, err
  201. }
  202. for _, v := range user.Roles {
  203. if v == "teacher" {
  204. return true, nil
  205. }
  206. }
  207. return false, nil
  208. }
  209. // 是否是学生
  210. func IsStudent(c *gin.Context, apictx *ApiSession) (bool, error) {
  211. user, err := GetUserById(apictx, apictx.User.ID)
  212. if err != nil {
  213. return false, err
  214. }
  215. for _, v := range user.Roles {
  216. if v == "student" {
  217. return true, nil
  218. }
  219. }
  220. return false, nil
  221. }