Просмотр исходного кода

Merge branch 'feature/fastgpt'

* feature/fastgpt:
  增加自动创建 fastgpt 租户功能
  实现种 cookie 接口
  个微ws连接

# Conflicts:
#	etc/wechat.yaml
#	internal/config/config.go
#	internal/pkg/wechat_ws/test/main.go
#	internal/pkg/wechat_ws/type.go
#	internal/pkg/wechat_ws/wechat_ws_client.go
#	internal/svc/service_context.go
boweniac 7 часов назад
Родитель
Сommit
f8b2cc1633
39 измененных файлов с 1447 добавлено и 5 удалено
  1. 3 1
      desc/all.api
  2. 101 0
      desc/wechat/department.api
  3. 24 0
      desc/wechat/fastgpt.api
  4. 7 0
      go.mod
  5. 15 0
      go.sum
  6. 1 0
      internal/config/config.go
  7. 44 0
      internal/handler/department/create_department_handler.go
  8. 44 0
      internal/handler/department/delete_department_handler.go
  9. 44 0
      internal/handler/department/get_department_by_id_handler.go
  10. 44 0
      internal/handler/department/get_department_list_handler.go
  11. 44 0
      internal/handler/department/update_department_handler.go
  12. 44 0
      internal/handler/fastgpt/create_fastgpt_handler.go
  13. 32 0
      internal/handler/fastgpt/set_token_handler.go
  14. 53 0
      internal/handler/routes.go
  15. 96 0
      internal/logic/department/create_department_logic.go
  16. 29 0
      internal/logic/department/delete_department_logic.go
  17. 29 0
      internal/logic/department/get_department_by_id_logic.go
  18. 29 0
      internal/logic/department/get_department_list_logic.go
  19. 29 0
      internal/logic/department/update_department_logic.go
  20. 80 0
      internal/logic/fastgpt/create_fastgpt_logic.go
  21. 149 0
      internal/logic/fastgpt/set_token_logic.go
  22. 1 0
      internal/pkg/wechat_ws/test/main.go
  23. 11 4
      internal/svc/service_context.go
  24. 6 0
      internal/types/mongo.go
  25. 79 0
      internal/types/types.go
  26. 6 0
      internal/types/ws.go
  27. 21 0
      mongo_model/allmodel.go
  28. 12 0
      mongo_model/team_members/error.go
  29. 25 0
      mongo_model/team_members/teammembersmodel.go
  30. 73 0
      mongo_model/team_members/teammembersmodelgen.go
  31. 19 0
      mongo_model/team_members/teammemberstypes.go
  32. 12 0
      mongo_model/teams/error.go
  33. 25 0
      mongo_model/teams/teamsmodel.go
  34. 73 0
      mongo_model/teams/teamsmodelgen.go
  35. 18 0
      mongo_model/teams/teamstypes.go
  36. 12 0
      mongo_model/users/error.go
  37. 27 0
      mongo_model/users/usersmodel.go
  38. 70 0
      mongo_model/users/usersmodelgen.go
  39. 16 0
      mongo_model/users/userstypes.go

+ 3 - 1
desc/all.api

@@ -41,4 +41,6 @@ import "./wechat/credit_balance.api"
 import "./wechat/credit_usage.api"
 import "./wechat/pay_recharge.api"
 import "./wechat/whatsapp.api"
-import "./wechat/whatsapp_channel.api"
+import "./wechat/whatsapp_channel.api"
+import "./wechat/fastgpt.api"
+import "./wechat/department.api"

+ 101 - 0
desc/wechat/department.api

@@ -0,0 +1,101 @@
+import "../base.api"
+
+type (
+    // The response data of department information | 部门信息
+    DepartmentInfo {
+        BaseIDInfo
+
+        // Translated Name | 展示名称
+        Trans string `json:"trans,optional"`
+
+        // Status | 状态
+        Status *uint32 `json:"status,optional" validate:"omitempty,lt=20"`
+
+        // Sort | 排序
+        Sort *uint32 `json:"sort,optional" validate:"omitempty,lt=10000"`
+
+        // Name | 部门名称
+        Name *string `json:"name,optional" validate:"omitempty,min=1,max=50"`
+
+        // Ancestors | 父级部门列表
+        Ancestors *string `json:"ancestors,optional" validate:"omitempty,max=200"`
+
+        // Leader | 部门负责人
+        Leader *string `json:"leader,optional" validate:"omitempty,max=20"`
+
+        // Phone | 电话号码
+        Phone *string `json:"phone,optional" validate:"omitempty,max=18"`
+
+        // Email | 邮箱
+        Email *string `json:"email,optional" validate:"omitempty,max=70"`
+
+        // Remark | 备注
+        Remark *string `json:"remark,optional" validate:"omitempty,max=200"`
+
+        // ParentId | 父级 ID
+        ParentId *uint64 `json:"parentId,optional"`
+    }
+
+    // The response data of department list | 部门列表数据
+    DepartmentListResp {
+        BaseDataInfo
+
+        // Department list data | 部门列表数据
+        Data DepartmentListInfo `json:"data"`
+    }
+
+    // Department list data | 部门列表数据
+    DepartmentListInfo {
+        BaseListInfo
+
+        // The API list data | 部门列表数据
+        Data  []DepartmentInfo  `json:"data"`
+    }
+
+    // Get department list request params | 部门列表请求参数
+    DepartmentListReq {
+        PageInfo
+
+        // Name | 部门名称
+        Name *string `json:"name,optional" validate:"omitempty,max=50"`
+
+        // Leader | 部门负责人
+        Leader *string `json:"leader,optional" validate:"omitempty,max=20"`
+    }
+
+    // Department information response | 部门信息返回体
+    DepartmentInfoResp {
+        BaseDataInfo
+
+        // Department information | 部门数据
+        Data DepartmentInfo `json:"data"`
+    }
+)
+
+@server(
+    jwt: Auth
+    group: department
+    middleware: Authority
+)
+
+service Wechat {
+    // Create department information | 创建部门
+    @handler createDepartment
+    post /department/create (DepartmentInfo) returns (BaseMsgResp)
+
+    // Update department information | 更新部门
+    @handler updateDepartment
+    post /department/update (DepartmentInfo) returns (BaseMsgResp)
+
+    // Delete department information | 删除部门信息
+    @handler deleteDepartment
+    post /department/delete (IDsReq) returns (BaseMsgResp)
+
+    // Get department list | 获取部门列表
+    @handler getDepartmentList
+    post /department/list (DepartmentListReq) returns (DepartmentListResp)
+
+    // Get Department by ID | 通过ID获取部门
+    @handler getDepartmentById
+    post /department (IDReq) returns (DepartmentInfoResp)
+}

+ 24 - 0
desc/wechat/fastgpt.api

@@ -0,0 +1,24 @@
+import "../base.api"
+
+type (
+    CreateInfo {
+        // Translated Name | 展示名称
+        UserName string `json:"username"`
+
+        // Name | 部门名称
+        Title *string `json:"title"`
+    }
+)
+
+@server(
+    group: fastgpt
+)
+
+service Wechat {
+    @handler setToken
+    get /api/fastgpt/set_token () returns (BaseMsgResp)
+
+    // 创建 fastgpt 租户
+    @handler CreateFastgpt
+    post /api/fastgpt/create (CreateInfo) returns (BaseMsgResp)
+}

+ 7 - 0
go.mod

@@ -30,6 +30,7 @@ require (
 	github.com/suyuan32/simple-admin-common v1.3.11
 	github.com/suyuan32/simple-admin-core v1.3.11
 	github.com/zeromicro/go-zero v1.6.3
+	go.mongodb.org/mongo-driver v1.14.0
 	golang.org/x/crypto v0.27.0
 	golang.org/x/text v0.18.0
 	google.golang.org/protobuf v1.35.2
@@ -82,6 +83,7 @@ require (
 	github.com/gogo/protobuf v1.3.2 // indirect
 	github.com/golang/mock v1.6.0 // indirect
 	github.com/golang/protobuf v1.5.4 // indirect
+	github.com/golang/snappy v0.0.4 // indirect
 	github.com/google/gnostic-models v0.6.8 // indirect
 	github.com/google/go-cmp v0.6.0 // indirect
 	github.com/google/gofuzz v1.2.0 // indirect
@@ -114,6 +116,7 @@ require (
 	github.com/mitchellh/go-wordwrap v1.0.1 // indirect
 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
 	github.com/modern-go/reflect2 v1.0.2 // indirect
+	github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect
 	github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
 	github.com/nicksnyder/go-i18n/v2 v2.4.0 // indirect
 	github.com/onsi/ginkgo/v2 v2.17.1 // indirect
@@ -134,6 +137,10 @@ require (
 	github.com/tidwall/pretty v1.2.1 // indirect
 	github.com/tidwall/sjson v1.2.5 // indirect
 	github.com/tjfoc/gmsm v1.4.1 // indirect
+	github.com/xdg-go/pbkdf2 v1.0.0 // indirect
+	github.com/xdg-go/scram v1.1.2 // indirect
+	github.com/xdg-go/stringprep v1.0.4 // indirect
+	github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a // indirect
 	github.com/zclconf/go-cty v1.14.3 // indirect
 	go.etcd.io/etcd/api/v3 v3.5.12 // indirect
 	go.etcd.io/etcd/client/pkg/v3 v3.5.12 // indirect

+ 15 - 0
go.sum

@@ -273,6 +273,8 @@ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaS
 github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
 github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
 github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
+github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
+github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I=
@@ -493,6 +495,8 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN
 github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
 github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
 github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
+github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0=
+github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
 github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
 github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
 github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
@@ -649,7 +653,15 @@ github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1
 github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo=
 github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs=
 github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
+github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
+github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
+github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY=
+github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4=
+github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8=
+github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM=
 github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
+github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a h1:fZHgsYlfvtyqToslyjUt3VOPF4J7aK/3MPcK7xp3PDk=
+github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a/go.mod h1:ul22v+Nro/R083muKhosV54bj5niojjWZvU8xrevuH4=
 github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.1.30/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
@@ -667,6 +679,8 @@ go.etcd.io/etcd/client/pkg/v3 v3.5.12 h1:EYDL6pWwyOsylrQyLp2w+HkQ46ATiOvoEdMarin
 go.etcd.io/etcd/client/pkg/v3 v3.5.12/go.mod h1:seTzl2d9APP8R5Y2hFL3NVlD6qC/dOT+3kvrqPyTas4=
 go.etcd.io/etcd/client/v3 v3.5.12 h1:v5lCPXn1pf1Uu3M4laUE2hp/geOTc5uPcYYsNe1lDxg=
 go.etcd.io/etcd/client/v3 v3.5.12/go.mod h1:tSbBCakoWmmddL+BKVAJHa9km+O/E+bumDe9mSbPiqw=
+go.mongodb.org/mongo-driver v1.14.0 h1:P98w8egYRjYe3XDjxhYJagTokP/H6HzlsnojRgZRd80=
+go.mongodb.org/mongo-driver v1.14.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c=
 go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
 go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
 go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
@@ -720,6 +734,7 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U
 golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20191219195013-becbf705a915/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=

+ 1 - 0
internal/config/config.go

@@ -21,6 +21,7 @@ type Config struct {
 	Aliyun             types.Aliyun
 	CoreRpc            zrpc.RpcClientConf
 	Xiaoice            types.Xiaoice
+	FastgptMongoConf   types.MongoDB
 	WebSocket          []types.WebSocketConfig
 	OpenAI             types.OpenAI
 }

+ 44 - 0
internal/handler/department/create_department_handler.go

@@ -0,0 +1,44 @@
+package department
+
+import (
+	"net/http"
+
+	"github.com/zeromicro/go-zero/rest/httpx"
+
+	"wechat-api/internal/logic/department"
+	"wechat-api/internal/svc"
+	"wechat-api/internal/types"
+)
+
+// swagger:route post /department/create department CreateDepartment
+//
+// Create department information | 创建部门
+//
+// Create department information | 创建部门
+//
+// Parameters:
+//  + name: body
+//    require: true
+//    in: body
+//    type: DepartmentInfo
+//
+// Responses:
+//  200: BaseMsgResp
+
+func CreateDepartmentHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.DepartmentInfo
+		if err := httpx.Parse(r, &req, true); err != nil {
+			httpx.ErrorCtx(r.Context(), w, err)
+			return
+		}
+
+		l := department.NewCreateDepartmentLogic(r.Context(), svcCtx)
+		resp, err := l.CreateDepartment(&req)
+		if err != nil {
+			httpx.ErrorCtx(r.Context(), w, err)
+		} else {
+			httpx.OkJsonCtx(r.Context(), w, resp)
+		}
+	}
+}

+ 44 - 0
internal/handler/department/delete_department_handler.go

@@ -0,0 +1,44 @@
+package department
+
+import (
+	"net/http"
+
+	"github.com/zeromicro/go-zero/rest/httpx"
+
+	"wechat-api/internal/logic/department"
+	"wechat-api/internal/svc"
+	"wechat-api/internal/types"
+)
+
+// swagger:route post /department/delete department DeleteDepartment
+//
+// Delete department information | 删除部门信息
+//
+// Delete department information | 删除部门信息
+//
+// Parameters:
+//  + name: body
+//    require: true
+//    in: body
+//    type: IDsReq
+//
+// Responses:
+//  200: BaseMsgResp
+
+func DeleteDepartmentHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.IDsReq
+		if err := httpx.Parse(r, &req, true); err != nil {
+			httpx.ErrorCtx(r.Context(), w, err)
+			return
+		}
+
+		l := department.NewDeleteDepartmentLogic(r.Context(), svcCtx)
+		resp, err := l.DeleteDepartment(&req)
+		if err != nil {
+			httpx.ErrorCtx(r.Context(), w, err)
+		} else {
+			httpx.OkJsonCtx(r.Context(), w, resp)
+		}
+	}
+}

+ 44 - 0
internal/handler/department/get_department_by_id_handler.go

@@ -0,0 +1,44 @@
+package department
+
+import (
+	"net/http"
+
+	"github.com/zeromicro/go-zero/rest/httpx"
+
+	"wechat-api/internal/logic/department"
+	"wechat-api/internal/svc"
+	"wechat-api/internal/types"
+)
+
+// swagger:route post /department department GetDepartmentById
+//
+// Get Department by ID | 通过ID获取部门
+//
+// Get Department by ID | 通过ID获取部门
+//
+// Parameters:
+//  + name: body
+//    require: true
+//    in: body
+//    type: IDReq
+//
+// Responses:
+//  200: DepartmentInfoResp
+
+func GetDepartmentByIdHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.IDReq
+		if err := httpx.Parse(r, &req, true); err != nil {
+			httpx.ErrorCtx(r.Context(), w, err)
+			return
+		}
+
+		l := department.NewGetDepartmentByIdLogic(r.Context(), svcCtx)
+		resp, err := l.GetDepartmentById(&req)
+		if err != nil {
+			httpx.ErrorCtx(r.Context(), w, err)
+		} else {
+			httpx.OkJsonCtx(r.Context(), w, resp)
+		}
+	}
+}

+ 44 - 0
internal/handler/department/get_department_list_handler.go

@@ -0,0 +1,44 @@
+package department
+
+import (
+	"net/http"
+
+	"github.com/zeromicro/go-zero/rest/httpx"
+
+	"wechat-api/internal/logic/department"
+	"wechat-api/internal/svc"
+	"wechat-api/internal/types"
+)
+
+// swagger:route post /department/list department GetDepartmentList
+//
+// Get department list | 获取部门列表
+//
+// Get department list | 获取部门列表
+//
+// Parameters:
+//  + name: body
+//    require: true
+//    in: body
+//    type: DepartmentListReq
+//
+// Responses:
+//  200: DepartmentListResp
+
+func GetDepartmentListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.DepartmentListReq
+		if err := httpx.Parse(r, &req, true); err != nil {
+			httpx.ErrorCtx(r.Context(), w, err)
+			return
+		}
+
+		l := department.NewGetDepartmentListLogic(r.Context(), svcCtx)
+		resp, err := l.GetDepartmentList(&req)
+		if err != nil {
+			httpx.ErrorCtx(r.Context(), w, err)
+		} else {
+			httpx.OkJsonCtx(r.Context(), w, resp)
+		}
+	}
+}

+ 44 - 0
internal/handler/department/update_department_handler.go

@@ -0,0 +1,44 @@
+package department
+
+import (
+	"net/http"
+
+	"github.com/zeromicro/go-zero/rest/httpx"
+
+	"wechat-api/internal/logic/department"
+	"wechat-api/internal/svc"
+	"wechat-api/internal/types"
+)
+
+// swagger:route post /department/update department UpdateDepartment
+//
+// Update department information | 更新部门
+//
+// Update department information | 更新部门
+//
+// Parameters:
+//  + name: body
+//    require: true
+//    in: body
+//    type: DepartmentInfo
+//
+// Responses:
+//  200: BaseMsgResp
+
+func UpdateDepartmentHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.DepartmentInfo
+		if err := httpx.Parse(r, &req, true); err != nil {
+			httpx.ErrorCtx(r.Context(), w, err)
+			return
+		}
+
+		l := department.NewUpdateDepartmentLogic(r.Context(), svcCtx)
+		resp, err := l.UpdateDepartment(&req)
+		if err != nil {
+			httpx.ErrorCtx(r.Context(), w, err)
+		} else {
+			httpx.OkJsonCtx(r.Context(), w, resp)
+		}
+	}
+}

+ 44 - 0
internal/handler/fastgpt/create_fastgpt_handler.go

@@ -0,0 +1,44 @@
+package fastgpt
+
+import (
+	"net/http"
+
+	"github.com/zeromicro/go-zero/rest/httpx"
+
+	"wechat-api/internal/logic/fastgpt"
+	"wechat-api/internal/svc"
+	"wechat-api/internal/types"
+)
+
+// swagger:route post /api/fastgpt/create fastgpt CreateFastgpt
+//
+// 创建 fastgpt 租户
+//
+// 创建 fastgpt 租户
+//
+// Parameters:
+//  + name: body
+//    require: true
+//    in: body
+//    type: CreateInfo
+//
+// Responses:
+//  200: BaseMsgResp
+
+func CreateFastgptHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.CreateInfo
+		if err := httpx.Parse(r, &req, true); err != nil {
+			httpx.ErrorCtx(r.Context(), w, err)
+			return
+		}
+
+		l := fastgpt.NewCreateFastgptLogic(r.Context(), svcCtx)
+		resp, err := l.CreateFastgpt(&req)
+		if err != nil {
+			httpx.ErrorCtx(r.Context(), w, err)
+		} else {
+			httpx.OkJsonCtx(r.Context(), w, resp)
+		}
+	}
+}

+ 32 - 0
internal/handler/fastgpt/set_token_handler.go

@@ -0,0 +1,32 @@
+package fastgpt
+
+import (
+	"net/http"
+
+	"github.com/zeromicro/go-zero/rest/httpx"
+
+	"wechat-api/internal/logic/fastgpt"
+	"wechat-api/internal/svc"
+)
+
+// swagger:route get /api/fastgpt/set_token fastgpt SetToken
+//
+
+//
+
+//
+// Responses:
+//  200: BaseMsgResp
+
+func SetTokenHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		username := r.URL.Query().Get("username")
+		l := fastgpt.NewSetTokenLogic(r.Context(), svcCtx, w)
+		resp, err := l.SetToken(username)
+		if err != nil {
+			httpx.ErrorCtx(r.Context(), w, err)
+		} else {
+			httpx.OkJsonCtx(r.Context(), w, resp)
+		}
+	}
+}

+ 53 - 0
internal/handler/routes.go

@@ -1,4 +1,6 @@
 // Code generated by goctl. DO NOT EDIT.
+// goctls v1.10.1
+
 package handler
 
 import (
@@ -28,8 +30,10 @@ import (
 	credit_balance "wechat-api/internal/handler/credit_balance"
 	credit_usage "wechat-api/internal/handler/credit_usage"
 	dashboard "wechat-api/internal/handler/dashboard"
+	department "wechat-api/internal/handler/department"
 	employee "wechat-api/internal/handler/employee"
 	employee_config "wechat-api/internal/handler/employee_config"
+	fastgpt "wechat-api/internal/handler/fastgpt"
 	label "wechat-api/internal/handler/label"
 	label_relationship "wechat-api/internal/handler/label_relationship"
 	label_tagging "wechat-api/internal/handler/label_tagging"
@@ -2037,4 +2041,53 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
 		),
 		rest.WithJwt(serverCtx.Config.Auth.AccessSecret),
 	)
+
+	server.AddRoutes(
+		[]rest.Route{
+			{
+				Method:  http.MethodGet,
+				Path:    "/api/fastgpt/set_token",
+				Handler: fastgpt.SetTokenHandler(serverCtx),
+			},
+			{
+				Method:  http.MethodPost,
+				Path:    "/api/fastgpt/create",
+				Handler: fastgpt.CreateFastgptHandler(serverCtx),
+			},
+		},
+	)
+
+	server.AddRoutes(
+		rest.WithMiddlewares(
+			[]rest.Middleware{serverCtx.Authority},
+			[]rest.Route{
+				{
+					Method:  http.MethodPost,
+					Path:    "/department/create",
+					Handler: department.CreateDepartmentHandler(serverCtx),
+				},
+				{
+					Method:  http.MethodPost,
+					Path:    "/department/update",
+					Handler: department.UpdateDepartmentHandler(serverCtx),
+				},
+				{
+					Method:  http.MethodPost,
+					Path:    "/department/delete",
+					Handler: department.DeleteDepartmentHandler(serverCtx),
+				},
+				{
+					Method:  http.MethodPost,
+					Path:    "/department/list",
+					Handler: department.GetDepartmentListHandler(serverCtx),
+				},
+				{
+					Method:  http.MethodPost,
+					Path:    "/department",
+					Handler: department.GetDepartmentByIdHandler(serverCtx),
+				},
+			}...,
+		),
+		rest.WithJwt(serverCtx.Config.Auth.AccessSecret),
+	)
 }

+ 96 - 0
internal/logic/department/create_department_logic.go

@@ -0,0 +1,96 @@
+package department
+
+import (
+	"context"
+	"fmt"
+	"github.com/suyuan32/simple-admin-common/msg/errormsg"
+	"github.com/suyuan32/simple-admin-core/rpc/types/core"
+	"github.com/zeromicro/go-zero/core/errorx"
+	"time"
+	"wechat-api/internal/svc"
+	"wechat-api/internal/types"
+	team_members "wechat-api/mongo_model/team_members"
+	teams "wechat-api/mongo_model/teams"
+	users "wechat-api/mongo_model/users"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type CreateDepartmentLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewCreateDepartmentLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CreateDepartmentLogic {
+	return &CreateDepartmentLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx}
+}
+
+func (l *CreateDepartmentLogic) CreateDepartment(req *types.DepartmentInfo) (resp *types.BaseMsgResp, err error) {
+	department_info, err := l.svcCtx.CoreRpc.CreateDepartment(l.ctx, &core.DepartmentInfo{
+		Id:        req.Id,
+		Sort:      req.Sort,
+		Name:      req.Name,
+		Ancestors: req.Ancestors,
+		Leader:    req.Leader,
+		Phone:     req.Phone,
+		Email:     req.Email,
+		Remark:    req.Remark,
+		ParentId:  req.ParentId,
+	})
+	if err != nil {
+		return nil, err
+	}
+
+	//创建 fastgpt 用户
+	user_info := &users.Users{
+		Status:        "active",
+		Username:      fmt.Sprintf("%d", department_info.Id),
+		Password:      "838b0ad79fa89e8b3a0cfdc6eab90ac24d20e30ca862855b93a4c736f8cdfedf",
+		Avatar:        "/icon/human.svg",
+		Balance:       int32(200000),
+		PromotionRate: int32(15),
+		Timezone:      "Asia/Shanghai",
+	}
+	err = l.svcCtx.MongoModel.UsersModel.Insert(context.TODO(), user_info)
+	if err != nil {
+		return nil, errorx.NewInvalidArgumentError("fastgpt create failed " + err.Error())
+	}
+
+	// 创建团队
+	teams_info := &teams.Teams{
+		Name:              *req.Name,
+		OwnerID:           user_info.ID,
+		DefaultPermission: int32(0),
+		Avatar:            "/icon/logo.svg",
+		CreateTime:        time.Date(2024, 7, 10, 12, 0, 18, 197000000, time.UTC),
+		Balance:           int32(999900000),
+	}
+
+	err = l.svcCtx.MongoModel.TeamsModel.Insert(context.TODO(), teams_info)
+	if err != nil {
+		return nil, errorx.NewInvalidArgumentError("fastgpt create failed " + err.Error())
+	}
+
+	// 创建团队关系
+	team_members_info := &team_members.TeamMembers{
+		TeamID:      teams_info.ID,
+		UserID:      user_info.ID,
+		Name:        "Owner",
+		Role:        "owner",
+		Status:      "active",
+		CreateTime:  time.Date(2024, 7, 10, 12, 0, 18, 197000000, time.UTC),
+		DefaultTeam: true,
+		Version:     int32(0),
+	}
+
+	err = l.svcCtx.MongoModel.TeamMembersModel.Insert(context.TODO(), team_members_info)
+	if err != nil {
+		return nil, errorx.NewInvalidArgumentError("fastgpt create failed " + err.Error())
+	}
+
+	return &types.BaseMsgResp{Msg: errormsg.Success}, nil
+}

+ 29 - 0
internal/logic/department/delete_department_logic.go

@@ -0,0 +1,29 @@
+package department
+
+import (
+	"context"
+
+	"wechat-api/internal/svc"
+	"wechat-api/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type DeleteDepartmentLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewDeleteDepartmentLogic(ctx context.Context, svcCtx *svc.ServiceContext) *DeleteDepartmentLogic {
+	return &DeleteDepartmentLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx}
+}
+
+func (l *DeleteDepartmentLogic) DeleteDepartment(req *types.IDsReq) (resp *types.BaseMsgResp, err error) {
+	// todo: add your logic here and delete this line
+
+	return
+}

+ 29 - 0
internal/logic/department/get_department_by_id_logic.go

@@ -0,0 +1,29 @@
+package department
+
+import (
+	"context"
+
+	"wechat-api/internal/svc"
+	"wechat-api/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type GetDepartmentByIdLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewGetDepartmentByIdLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetDepartmentByIdLogic {
+	return &GetDepartmentByIdLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx}
+}
+
+func (l *GetDepartmentByIdLogic) GetDepartmentById(req *types.IDReq) (resp *types.DepartmentInfoResp, err error) {
+	// todo: add your logic here and delete this line
+
+	return
+}

+ 29 - 0
internal/logic/department/get_department_list_logic.go

@@ -0,0 +1,29 @@
+package department
+
+import (
+	"context"
+
+	"wechat-api/internal/svc"
+	"wechat-api/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type GetDepartmentListLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewGetDepartmentListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetDepartmentListLogic {
+	return &GetDepartmentListLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx}
+}
+
+func (l *GetDepartmentListLogic) GetDepartmentList(req *types.DepartmentListReq) (resp *types.DepartmentListResp, err error) {
+	// todo: add your logic here and delete this line
+
+	return
+}

+ 29 - 0
internal/logic/department/update_department_logic.go

@@ -0,0 +1,29 @@
+package department
+
+import (
+	"context"
+
+	"wechat-api/internal/svc"
+	"wechat-api/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type UpdateDepartmentLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewUpdateDepartmentLogic(ctx context.Context, svcCtx *svc.ServiceContext) *UpdateDepartmentLogic {
+	return &UpdateDepartmentLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx}
+}
+
+func (l *UpdateDepartmentLogic) UpdateDepartment(req *types.DepartmentInfo) (resp *types.BaseMsgResp, err error) {
+	// todo: add your logic here and delete this line
+
+	return
+}

+ 80 - 0
internal/logic/fastgpt/create_fastgpt_logic.go

@@ -0,0 +1,80 @@
+package fastgpt
+
+import (
+	"context"
+	"github.com/suyuan32/simple-admin-common/msg/errormsg"
+	"github.com/zeromicro/go-zero/core/errorx"
+	"time"
+	team_members "wechat-api/mongo_model/team_members"
+	teams "wechat-api/mongo_model/teams"
+	users "wechat-api/mongo_model/users"
+
+	"wechat-api/internal/svc"
+	"wechat-api/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type CreateFastgptLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewCreateFastgptLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CreateFastgptLogic {
+	return &CreateFastgptLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx}
+}
+
+func (l *CreateFastgptLogic) CreateFastgpt(req *types.CreateInfo) (resp *types.BaseMsgResp, err error) {
+	//创建 fastgpt 用户
+	user_info := &users.Users{
+		Status:        "active",
+		Username:      req.UserName,
+		Password:      "838b0ad79fa89e8b3a0cfdc6eab90ac24d20e30ca862855b93a4c736f8cdfedf",
+		Avatar:        "/icon/human.svg",
+		Balance:       int32(200000),
+		PromotionRate: int32(15),
+		Timezone:      "Asia/Shanghai",
+	}
+	err = l.svcCtx.MongoModel.UsersModel.Insert(context.TODO(), user_info)
+	if err != nil {
+		return nil, errorx.NewInvalidArgumentError("fastgpt create failed " + err.Error())
+	}
+
+	// 创建团队
+	teams_info := &teams.Teams{
+		Name:              *req.Title,
+		OwnerID:           user_info.ID,
+		DefaultPermission: int32(0),
+		Avatar:            "/icon/logo.svg",
+		CreateTime:        time.Date(2024, 7, 10, 12, 0, 18, 197000000, time.UTC),
+		Balance:           int32(999900000),
+	}
+
+	err = l.svcCtx.MongoModel.TeamsModel.Insert(context.TODO(), teams_info)
+	if err != nil {
+		return nil, errorx.NewInvalidArgumentError("fastgpt create failed " + err.Error())
+	}
+
+	// 创建团队关系
+	team_members_info := &team_members.TeamMembers{
+		TeamID:      teams_info.ID,
+		UserID:      user_info.ID,
+		Name:        "Owner",
+		Role:        "owner",
+		Status:      "active",
+		CreateTime:  time.Date(2024, 7, 10, 12, 0, 18, 197000000, time.UTC),
+		DefaultTeam: true,
+		Version:     int32(0),
+	}
+
+	err = l.svcCtx.MongoModel.TeamMembersModel.Insert(context.TODO(), team_members_info)
+	if err != nil {
+		return nil, errorx.NewInvalidArgumentError("fastgpt create failed " + err.Error())
+	}
+
+	return &types.BaseMsgResp{Msg: errormsg.Success}, nil
+}

+ 149 - 0
internal/logic/fastgpt/set_token_logic.go

@@ -0,0 +1,149 @@
+package fastgpt
+
+import (
+	"bytes"
+	"context"
+	"encoding/json"
+	"fmt"
+	"github.com/golang-jwt/jwt/v5"
+	"github.com/suyuan32/simple-admin-core/rpc/types/core"
+	"net/http"
+	"strconv"
+
+	"github.com/zeromicro/go-zero/core/logx"
+	"wechat-api/internal/svc"
+	"wechat-api/internal/types"
+)
+
+type SetTokenLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+	rw     http.ResponseWriter
+}
+
+func NewSetTokenLogic(ctx context.Context, svcCtx *svc.ServiceContext, rw http.ResponseWriter) *SetTokenLogic {
+	return &SetTokenLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+		rw:     rw,
+	}
+}
+
+func (l *SetTokenLogic) SetToken(username string) (resp *types.BaseMsgResp, err error) {
+	claims, err := ParseJWT(username, l.svcCtx.Config.Auth.AccessSecret)
+	if err != nil {
+		return nil, fmt.Errorf("invalid token")
+	}
+	data, err := l.svcCtx.CoreRpc.GetUserById(context.TODO(), &core.UUIDReq{Id: claims.UserId})
+	token, err := l.getToken(strconv.FormatUint(*data.DepartmentId, 10))
+	if err != nil {
+		return nil, fmt.Errorf("invalid token")
+	}
+	//if err != nil {
+	//	return nil, err
+	//}
+	// 创建一个新的 Cookie
+	cookie := &http.Cookie{
+		Name:     "fastgpt_token",
+		Value:    token, // 假设 req.Token 是你要设置的 Cookie 值
+		Domain:   ".gkscrm.com",
+		SameSite: http.SameSiteNoneMode,
+		Secure:   true, // 如果 SameSite 设置为 None,必须设置 Secure 为 true
+		HttpOnly: false,
+		Path:     "/",
+	}
+
+	// 设置 Cookie 到响应中
+	http.SetCookie(l.rw, cookie)
+
+	// 返回响应消息
+	resp = &types.BaseMsgResp{
+		Code: 0,
+		Msg:  "Cookie set successfully",
+	}
+
+	return
+}
+
+func (l *SetTokenLogic) getToken(username string) (string, error) {
+	// 设置请求的 URL 和请求体
+	url := "https://agent.gkscrm.com/api/support/user/account/loginByPassword"
+	payload := map[string]string{
+		"username": username,
+		"password": "578fd6dfa3f71a8fadf5dc60d0e7115881db4c36504f83c4a0f4422107162c36",
+	}
+
+	// 将请求体编码为 JSON
+	jsonPayload, err := json.Marshal(payload)
+	if err != nil {
+		return "", err
+	}
+
+	// 创建 HTTP 请求
+	req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonPayload))
+	if err != nil {
+		return "", err
+	}
+	req.Header.Set("Content-Type", "application/json")
+
+	// 发送请求
+	client := &http.Client{}
+	resp, err := client.Do(req)
+	if err != nil {
+		return "", err
+	}
+	defer resp.Body.Close()
+
+	// 检查响应状态码
+	if resp.StatusCode != http.StatusOK {
+		return "", fmt.Errorf("failed to login, status code: %d", resp.StatusCode)
+	}
+
+	// 解析响应体
+	var response map[string]interface{}
+	err = json.NewDecoder(resp.Body).Decode(&response)
+	if err != nil {
+		return "", err
+	}
+
+	// 提取 token
+	data, ok := response["data"].(map[string]interface{})
+	if !ok {
+		return "", fmt.Errorf("invalid response format")
+	}
+	token, ok := data["token"].(string)
+	if !ok {
+		return "", fmt.Errorf("token not found in response")
+	}
+
+	return token, nil
+}
+
+type Claims struct {
+	RoleId string `json:"roleId"`
+	UserId string `json:"userId"`
+	jwt.RegisteredClaims
+}
+
+func ParseJWT(tokenString, accessSecret string) (*Claims, error) {
+	claims := &Claims{}
+
+	token, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) {
+		if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
+			return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
+		}
+		return []byte(accessSecret), nil
+	})
+
+	if err != nil {
+		return nil, fmt.Errorf("invalid token")
+	}
+
+	if !token.Valid {
+		return nil, fmt.Errorf("invalid token")
+	}
+
+	return claims, nil
+}

+ 1 - 0
internal/pkg/wechat_ws/test/main.go

@@ -24,6 +24,7 @@ func main() {
 
 	go client.WritePump()
 
+	//client.SendMsg([]byte(`{"msgType":"text","message":"你好"}`))
 	client.SendMsg([]byte(`{
     "MsgType": "TalkToFriendTask",
     "Content": {

+ 11 - 4
internal/svc/service_context.go

@@ -2,6 +2,7 @@ package svc
 
 import (
 	"github.com/bwmarrin/snowflake"
+	"github.com/casbin/casbin/v2"
 	"github.com/redis/go-redis/v9"
 	"github.com/zeromicro/go-zero/core/collection"
 	"gorm.io/gorm"
@@ -14,12 +15,11 @@ import (
 
 	"github.com/suyuan32/simple-admin-core/rpc/coreclient"
 	"github.com/zeromicro/go-zero/core/logx"
-	"wechat-api/ent"
-	_ "wechat-api/ent/runtime"
-
-	"github.com/casbin/casbin/v2"
 	"github.com/zeromicro/go-zero/rest"
 	"github.com/zeromicro/go-zero/zrpc"
+	"wechat-api/ent"
+	_ "wechat-api/ent/runtime"
+	mongo_model "wechat-api/mongo_model"
 )
 
 type ServiceContext struct {
@@ -35,6 +35,7 @@ type ServiceContext struct {
 	WechatWs    map[string]*wechat_ws.WechatWsClient
 	Cache       *collection.Cache
 	NodeID      *snowflake.Node
+	MongoModel  *mongo_model.AllMongoModel
 }
 
 func NewServiceContext(c config.Config) *ServiceContext {
@@ -49,6 +50,9 @@ func NewServiceContext(c config.Config) *ServiceContext {
 		ent.Debug(), // debug mode
 	)
 
+	// 初始化 MongoDB 客户端
+	all_mongo_model := mongo_model.SetupMongoModel(c.FastgptMongoConf.Url, c.FastgptMongoConf.DBName)
+
 	// gorm 数据库连接
 	wechatDb, err := database.InitWechatDB(c.DatabaseConf, c.Mode)
 	if err != nil {
@@ -59,6 +63,8 @@ func NewServiceContext(c config.Config) *ServiceContext {
 
 	coreRpc := coreclient.NewCore(zrpc.NewClientIfEnable(c.CoreRpc))
 
+	// 初始化微信ws客户端
+	// todo 现在配置是从 config.yaml中读取的,后续需要改成从数据库中读取,以便匹配不同的微信号
 	wechatWs := make(map[string]*wechat_ws.WechatWsClient)
 
 	for _, ws := range c.WebSocket {
@@ -99,5 +105,6 @@ func NewServiceContext(c config.Config) *ServiceContext {
 		WechatWs:    wechatWs,
 		Cache:       cache,
 		NodeID:      node,
+		MongoModel:  all_mongo_model,
 	}
 }

+ 6 - 0
internal/types/mongo.go

@@ -0,0 +1,6 @@
+package types
+
+type MongoDB struct {
+	Url    string `json:",env=MONGO_URL"`
+	DBName string `json:",default=simple_admin,env=MONGO_DBNAME"`
+}

+ 79 - 0
internal/types/types.go

@@ -4017,3 +4017,82 @@ type WhatsappChannelInfoResp struct {
 	// WhatsappChannel information | WhatsappChannel数据
 	Data WhatsappChannelInfo `json:"data"`
 }
+
+// swagger:model CreateInfo
+type CreateInfo struct {
+	// Translated Name | 展示名称
+	UserName string `json:"username"`
+	// Name | 部门名称
+	Title *string `json:"title"`
+}
+
+// The response data of department information | 部门信息
+// swagger:model DepartmentInfo
+type DepartmentInfo struct {
+	BaseIDInfo
+	// Translated Name | 展示名称
+	Trans string `json:"trans,optional"`
+	// Status | 状态
+	// max : 20
+	Status *uint32 `json:"status,optional" validate:"omitempty,lt=20"`
+	// Sort | 排序
+	// max : 10000
+	Sort *uint32 `json:"sort,optional" validate:"omitempty,lt=10000"`
+	// Name | 部门名称
+	// min length : 1
+	// max length : 50
+	Name *string `json:"name,optional" validate:"omitempty,min=1,max=50"`
+	// Ancestors | 父级部门列表
+	// max length : 200
+	Ancestors *string `json:"ancestors,optional" validate:"omitempty,max=200"`
+	// Leader | 部门负责人
+	// max length : 20
+	Leader *string `json:"leader,optional" validate:"omitempty,max=20"`
+	// Phone | 电话号码
+	// max length : 18
+	Phone *string `json:"phone,optional" validate:"omitempty,max=18"`
+	// Email | 邮箱
+	// max length : 70
+	Email *string `json:"email,optional" validate:"omitempty,max=70"`
+	// Remark | 备注
+	// max length : 200
+	Remark *string `json:"remark,optional" validate:"omitempty,max=200"`
+	// ParentId | 父级 ID
+	ParentId *uint64 `json:"parentId,optional"`
+}
+
+// The response data of department list | 部门列表数据
+// swagger:model DepartmentListResp
+type DepartmentListResp struct {
+	BaseDataInfo
+	// Department list data | 部门列表数据
+	Data DepartmentListInfo `json:"data"`
+}
+
+// Department list data | 部门列表数据
+// swagger:model DepartmentListInfo
+type DepartmentListInfo struct {
+	BaseListInfo
+	// The API list data | 部门列表数据
+	Data []DepartmentInfo `json:"data"`
+}
+
+// Get department list request params | 部门列表请求参数
+// swagger:model DepartmentListReq
+type DepartmentListReq struct {
+	PageInfo
+	// Name | 部门名称
+	// max length : 50
+	Name *string `json:"name,optional" validate:"omitempty,max=50"`
+	// Leader | 部门负责人
+	// max length : 20
+	Leader *string `json:"leader,optional" validate:"omitempty,max=20"`
+}
+
+// Department information response | 部门信息返回体
+// swagger:model DepartmentInfoResp
+type DepartmentInfoResp struct {
+	BaseDataInfo
+	// Department information | 部门数据
+	Data DepartmentInfo `json:"data"`
+}

+ 6 - 0
internal/types/ws.go

@@ -0,0 +1,6 @@
+package types
+
+type WsConfig struct {
+	Url   string
+	Appid string
+}

+ 21 - 0
mongo_model/allmodel.go

@@ -0,0 +1,21 @@
+package mongo_model
+
+import (
+	team_members "wechat-api/mongo_model/team_members"
+	teams "wechat-api/mongo_model/teams"
+	users "wechat-api/mongo_model/users"
+)
+
+type AllMongoModel struct {
+	UsersModel       users.UsersModel
+	TeamsModel       teams.TeamsModel
+	TeamMembersModel team_members.TeamMembersModel
+}
+
+func SetupMongoModel(url, db string) *AllMongoModel {
+	return &AllMongoModel{
+		UsersModel:       users.NewUsersModel(url, db, "users"),
+		TeamsModel:       teams.NewTeamsModel(url, db, "teams"),
+		TeamMembersModel: team_members.NewTeamMembersModel(url, db, "team_members"),
+	}
+}

+ 12 - 0
mongo_model/team_members/error.go

@@ -0,0 +1,12 @@
+package model
+
+import (
+	"errors"
+
+	"github.com/zeromicro/go-zero/core/stores/mon"
+)
+
+var (
+	ErrNotFound        = mon.ErrNotFound
+	ErrInvalidObjectId = errors.New("invalid objectId")
+)

+ 25 - 0
mongo_model/team_members/teammembersmodel.go

@@ -0,0 +1,25 @@
+package model
+
+import "github.com/zeromicro/go-zero/core/stores/mon"
+
+var _ TeamMembersModel = (*customTeamMembersModel)(nil)
+
+type (
+	// TeamMembersModel is an interface to be customized, add more methods here,
+	// and implement the added methods in customTeamMembersModel.
+	TeamMembersModel interface {
+		teamMembersModel
+	}
+
+	customTeamMembersModel struct {
+		*defaultTeamMembersModel
+	}
+)
+
+// NewTeamMembersModel returns a model for the mongo_model.
+func NewTeamMembersModel(url, db, collection string) TeamMembersModel {
+	conn := mon.MustNewModel(url, db, collection)
+	return &customTeamMembersModel{
+		defaultTeamMembersModel: newDefaultTeamMembersModel(conn),
+	}
+}

+ 73 - 0
mongo_model/team_members/teammembersmodelgen.go

@@ -0,0 +1,73 @@
+// Code generated by goctl. DO NOT EDIT.
+// goctl 1.8.1
+
+package model
+
+import (
+	"context"
+	"time"
+
+	"github.com/zeromicro/go-zero/core/stores/mon"
+	"go.mongodb.org/mongo-driver/bson"
+	"go.mongodb.org/mongo-driver/bson/primitive"
+	"go.mongodb.org/mongo-driver/mongo"
+)
+
+type teamMembersModel interface {
+	Insert(ctx context.Context, data *TeamMembers) error
+	FindOne(ctx context.Context, id string) (*TeamMembers, error)
+	Update(ctx context.Context, data *TeamMembers) (*mongo.UpdateResult, error)
+	Delete(ctx context.Context, id string) (int64, error)
+}
+
+type defaultTeamMembersModel struct {
+	conn *mon.Model
+}
+
+func newDefaultTeamMembersModel(conn *mon.Model) *defaultTeamMembersModel {
+	return &defaultTeamMembersModel{conn: conn}
+}
+
+func (m *defaultTeamMembersModel) Insert(ctx context.Context, data *TeamMembers) error {
+	if data.ID.IsZero() {
+		data.ID = primitive.NewObjectID()
+		data.CreateTime = time.Now()
+	}
+
+	_, err := m.conn.InsertOne(ctx, data)
+	return err
+}
+
+func (m *defaultTeamMembersModel) FindOne(ctx context.Context, id string) (*TeamMembers, error) {
+	oid, err := primitive.ObjectIDFromHex(id)
+	if err != nil {
+		return nil, ErrInvalidObjectId
+	}
+
+	var data TeamMembers
+
+	err = m.conn.FindOne(ctx, &data, bson.M{"_id": oid})
+	switch err {
+	case nil:
+		return &data, nil
+	case mon.ErrNotFound:
+		return nil, ErrNotFound
+	default:
+		return nil, err
+	}
+}
+
+func (m *defaultTeamMembersModel) Update(ctx context.Context, data *TeamMembers) (*mongo.UpdateResult, error) {
+	res, err := m.conn.UpdateOne(ctx, bson.M{"_id": data.ID}, bson.M{"$set": data})
+	return res, err
+}
+
+func (m *defaultTeamMembersModel) Delete(ctx context.Context, id string) (int64, error) {
+	oid, err := primitive.ObjectIDFromHex(id)
+	if err != nil {
+		return 0, ErrInvalidObjectId
+	}
+
+	res, err := m.conn.DeleteOne(ctx, bson.M{"_id": oid})
+	return res, err
+}

+ 19 - 0
mongo_model/team_members/teammemberstypes.go

@@ -0,0 +1,19 @@
+package model
+
+import (
+	"time"
+
+	"go.mongodb.org/mongo-driver/bson/primitive"
+)
+
+type TeamMembers struct {
+	ID          primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"`
+	TeamID      primitive.ObjectID `bson:"teamId,omitempty" json:"teamId,omitempty"`
+	UserID      primitive.ObjectID `bson:"userId,omitempty" json:"userId,omitempty"`
+	Name        string             `bson:"name,omitempty" json:"name,omitempty"`
+	Role        string             `bson:"role,omitempty" json:"role,omitempty"`
+	Status      string             `bson:"status,omitempty" json:"status,omitempty"`
+	CreateTime  time.Time          `bson:"createTime,omitempty" json:"createTime,omitempty"`
+	DefaultTeam bool               `bson:"defaultTeam,omitempty" json:"defaultTeam,omitempty"`
+	Version     int32              `bson:"__v,omitempty" json:"version,omitempty"`
+}

+ 12 - 0
mongo_model/teams/error.go

@@ -0,0 +1,12 @@
+package model
+
+import (
+	"errors"
+
+	"github.com/zeromicro/go-zero/core/stores/mon"
+)
+
+var (
+	ErrNotFound        = mon.ErrNotFound
+	ErrInvalidObjectId = errors.New("invalid objectId")
+)

+ 25 - 0
mongo_model/teams/teamsmodel.go

@@ -0,0 +1,25 @@
+package model
+
+import "github.com/zeromicro/go-zero/core/stores/mon"
+
+var _ TeamsModel = (*customTeamsModel)(nil)
+
+type (
+	// TeamsModel is an interface to be customized, add more methods here,
+	// and implement the added methods in customTeamsModel.
+	TeamsModel interface {
+		teamsModel
+	}
+
+	customTeamsModel struct {
+		*defaultTeamsModel
+	}
+)
+
+// NewTeamsModel returns a model for the mongo_model.
+func NewTeamsModel(url, db, collection string) TeamsModel {
+	conn := mon.MustNewModel(url, db, collection)
+	return &customTeamsModel{
+		defaultTeamsModel: newDefaultTeamsModel(conn),
+	}
+}

+ 73 - 0
mongo_model/teams/teamsmodelgen.go

@@ -0,0 +1,73 @@
+// Code generated by goctl. DO NOT EDIT.
+// goctl 1.8.1
+
+package model
+
+import (
+	"context"
+	"time"
+
+	"github.com/zeromicro/go-zero/core/stores/mon"
+	"go.mongodb.org/mongo-driver/bson"
+	"go.mongodb.org/mongo-driver/bson/primitive"
+	"go.mongodb.org/mongo-driver/mongo"
+)
+
+type teamsModel interface {
+	Insert(ctx context.Context, data *Teams) error
+	FindOne(ctx context.Context, id string) (*Teams, error)
+	Update(ctx context.Context, data *Teams) (*mongo.UpdateResult, error)
+	Delete(ctx context.Context, id string) (int64, error)
+}
+
+type defaultTeamsModel struct {
+	conn *mon.Model
+}
+
+func newDefaultTeamsModel(conn *mon.Model) *defaultTeamsModel {
+	return &defaultTeamsModel{conn: conn}
+}
+
+func (m *defaultTeamsModel) Insert(ctx context.Context, data *Teams) error {
+	if data.ID.IsZero() {
+		data.ID = primitive.NewObjectID()
+		data.CreateTime = time.Now()
+	}
+
+	_, err := m.conn.InsertOne(ctx, data)
+	return err
+}
+
+func (m *defaultTeamsModel) FindOne(ctx context.Context, id string) (*Teams, error) {
+	oid, err := primitive.ObjectIDFromHex(id)
+	if err != nil {
+		return nil, ErrInvalidObjectId
+	}
+
+	var data Teams
+
+	err = m.conn.FindOne(ctx, &data, bson.M{"_id": oid})
+	switch err {
+	case nil:
+		return &data, nil
+	case mon.ErrNotFound:
+		return nil, ErrNotFound
+	default:
+		return nil, err
+	}
+}
+
+func (m *defaultTeamsModel) Update(ctx context.Context, data *Teams) (*mongo.UpdateResult, error) {
+	res, err := m.conn.UpdateOne(ctx, bson.M{"_id": data.ID}, bson.M{"$set": data})
+	return res, err
+}
+
+func (m *defaultTeamsModel) Delete(ctx context.Context, id string) (int64, error) {
+	oid, err := primitive.ObjectIDFromHex(id)
+	if err != nil {
+		return 0, ErrInvalidObjectId
+	}
+
+	res, err := m.conn.DeleteOne(ctx, bson.M{"_id": oid})
+	return res, err
+}

+ 18 - 0
mongo_model/teams/teamstypes.go

@@ -0,0 +1,18 @@
+package model
+
+import (
+	"time"
+
+	"go.mongodb.org/mongo-driver/bson/primitive"
+)
+
+type Teams struct {
+	ID                primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"`
+	Name              string             `bson:"name" json:"name"`
+	OwnerID           primitive.ObjectID `bson:"ownerId" json:"ownerId"`
+	DefaultPermission int32              `bson:"defaultPermission" json:"defaultPermission"`
+	Avatar            string             `bson:"avatar" json:"avatar"`
+	CreateTime        time.Time          `bson:"createTime" json:"createTime"`
+	Balance           int32              `bson:"balance" json:"balance"`
+	Version           int32              `bson:"__v" json:"version"`
+}

+ 12 - 0
mongo_model/users/error.go

@@ -0,0 +1,12 @@
+package model
+
+import (
+	"errors"
+
+	"github.com/zeromicro/go-zero/core/stores/mon"
+)
+
+var (
+	ErrNotFound        = mon.ErrNotFound
+	ErrInvalidObjectId = errors.New("invalid objectId")
+)

+ 27 - 0
mongo_model/users/usersmodel.go

@@ -0,0 +1,27 @@
+package model
+
+import (
+	"github.com/zeromicro/go-zero/core/stores/mon"
+)
+
+var _ UsersModel = (*customUsersModel)(nil)
+
+type (
+	// UsersModel is an interface to be customized, add more methods here,
+	// and implement the added methods in customUsersModel.
+	UsersModel interface {
+		usersModel
+	}
+
+	customUsersModel struct {
+		*defaultUsersModel
+	}
+)
+
+// NewUsersModel returns a model for the mongo_model.
+func NewUsersModel(url, db, collection string) UsersModel {
+	conn := mon.MustNewModel(url, db, collection)
+	return &customUsersModel{
+		defaultUsersModel: newDefaultUsersModel(conn),
+	}
+}

+ 70 - 0
mongo_model/users/usersmodelgen.go

@@ -0,0 +1,70 @@
+// Code generated by goctl. DO NOT EDIT.
+// goctl 1.8.1
+
+package model
+
+import (
+	"context"
+	"github.com/zeromicro/go-zero/core/stores/mon"
+	"go.mongodb.org/mongo-driver/bson"
+	"go.mongodb.org/mongo-driver/bson/primitive"
+	"go.mongodb.org/mongo-driver/mongo"
+)
+
+type usersModel interface {
+	Insert(ctx context.Context, data *Users) error
+	FindOne(ctx context.Context, id string) (*Users, error)
+	Update(ctx context.Context, data *Users) (*mongo.UpdateResult, error)
+	Delete(ctx context.Context, id string) (int64, error)
+}
+
+type defaultUsersModel struct {
+	conn *mon.Model
+}
+
+func newDefaultUsersModel(conn *mon.Model) *defaultUsersModel {
+	return &defaultUsersModel{conn: conn}
+}
+
+func (m *defaultUsersModel) Insert(ctx context.Context, data *Users) error {
+	if data.ID.IsZero() {
+		data.ID = primitive.NewObjectID()
+	}
+
+	_, err := m.conn.InsertOne(ctx, data)
+	return err
+}
+
+func (m *defaultUsersModel) FindOne(ctx context.Context, id string) (*Users, error) {
+	oid, err := primitive.ObjectIDFromHex(id)
+	if err != nil {
+		return nil, ErrInvalidObjectId
+	}
+
+	var data Users
+
+	err = m.conn.FindOne(ctx, &data, bson.M{"_id": oid})
+	switch err {
+	case nil:
+		return &data, nil
+	case mon.ErrNotFound:
+		return nil, ErrNotFound
+	default:
+		return nil, err
+	}
+}
+
+func (m *defaultUsersModel) Update(ctx context.Context, data *Users) (*mongo.UpdateResult, error) {
+	res, err := m.conn.UpdateOne(ctx, bson.M{"_id": data.ID}, bson.M{"$set": data})
+	return res, err
+}
+
+func (m *defaultUsersModel) Delete(ctx context.Context, id string) (int64, error) {
+	oid, err := primitive.ObjectIDFromHex(id)
+	if err != nil {
+		return 0, ErrInvalidObjectId
+	}
+
+	res, err := m.conn.DeleteOne(ctx, bson.M{"_id": oid})
+	return res, err
+}

+ 16 - 0
mongo_model/users/userstypes.go

@@ -0,0 +1,16 @@
+package model
+
+import (
+	"go.mongodb.org/mongo-driver/bson/primitive"
+)
+
+type Users struct {
+	ID            primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"`
+	Status        string             `bson:"status" json:"status"`
+	Username      string             `bson:"username" json:"username"`
+	Password      string             `bson:"password" json:"password"`
+	Avatar        string             `bson:"avatar" json:"avatar"`
+	Balance       int32              `bson:"balance" json:"balance"`
+	PromotionRate int32              `bson:"promotionRate" json:"promotionRate"`
+	Timezone      string             `bson:"timezone" json:"timezone"`
+}