Explorar o código

增加自动创建 fastgpt 租户功能

boweniac hai 1 día
pai
achega
c1bf814477
Modificáronse 41 ficheiros con 1441 adicións e 44 borrados
  1. 2 1
      desc/all.api
  2. 101 0
      desc/wechat/department.api
  3. 11 0
      desc/wechat/fastgpt.api
  4. 27 16
      etc/wechat.yaml
  5. 7 0
      go.mod
  6. 15 4
      go.sum
  7. 1 0
      internal/config/config.go
  8. 44 0
      internal/handler/department/create_department_handler.go
  9. 44 0
      internal/handler/department/delete_department_handler.go
  10. 44 0
      internal/handler/department/get_department_by_id_handler.go
  11. 44 0
      internal/handler/department/get_department_list_handler.go
  12. 44 0
      internal/handler/department/update_department_handler.go
  13. 44 0
      internal/handler/fastgpt/create_fastgpt_handler.go
  14. 42 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. 41 4
      internal/logic/fastgpt/set_token_logic.go
  22. 23 19
      internal/svc/service_context.go
  23. 6 0
      internal/types/mongo.go
  24. 79 0
      internal/types/types.go
  25. 21 0
      mongo_model/allmodel.go
  26. 12 0
      mongo_model/team_members/error.go
  27. 25 0
      mongo_model/team_members/teammembersmodel.go
  28. 73 0
      mongo_model/team_members/teammembersmodelgen.go
  29. 19 0
      mongo_model/team_members/teammemberstypes.go
  30. 12 0
      mongo_model/teams/error.go
  31. 25 0
      mongo_model/teams/teamsmodel.go
  32. 73 0
      mongo_model/teams/teamsmodelgen.go
  33. 18 0
      mongo_model/teams/teamstypes.go
  34. 12 0
      mongo_model/users/error.go
  35. 27 0
      mongo_model/users/usersmodel.go
  36. 70 0
      mongo_model/users/usersmodelgen.go
  37. 16 0
      mongo_model/users/userstypes.go
  38. 12 0
      teams/error.go
  39. 25 0
      teams/teamsmodel.go
  40. 76 0
      teams/teamsmodelgen.go
  41. 14 0
      teams/teamstypes.go

+ 2 - 1
desc/all.api

@@ -42,4 +42,5 @@ import "./wechat/credit_usage.api"
 import "./wechat/pay_recharge.api"
 import "./wechat/whatsapp.api"
 import "./wechat/whatsapp_channel.api"
-import "./wechat/fastgpt.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)
+}

+ 11 - 0
desc/wechat/fastgpt.api

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

+ 27 - 16
etc/wechat.yaml

@@ -6,8 +6,8 @@ Timeout: 30000
 Mode: "dev"
 
 Auth:
-  AccessSecret: jS6VKDtsJf3z1n2VKDtsJf3z1n2
-  AccessExpire: 2592000
+  AccessSecret: LnQD46hBde0AgFXBer8ZZZe3FgC
+  AccessExpire: 259200
 
 CROSConf:
   Address: '*'
@@ -25,8 +25,8 @@ Log:
 
 DatabaseConf:
   Type: mysql
-  Host: mysql-server
-  Port: 3306
+  Host: localhost
+  Port: 3307
   DBName: wechat
   Username: root
   Password: simple-admin.
@@ -37,17 +37,17 @@ DatabaseConf:
 CoreRpc:
   # Target: k8s://default/core-rpc-svc:9101
   Endpoints:
-    - core-rpc:9101
+    - localhost:9101
   Enabled: true
 
 RedisConf:
-  Host: redis-server:6379
+  Host: localhost:6380
 
 CasbinDatabaseConf:
   Type: mysql
-  Host: mysql-server
-  Port: 3306
-  DBName: wechat_admin
+  Host: localhost
+  Port: 3307
+  DBName: wechat-admin
   Username: root
   Password: simple-admin.
   MaxOpenConn: 100
@@ -70,7 +70,7 @@ CasbinConf:
 Miniprogram:
   Appid: wx1452f34bba8fe718
   Secret: 171fdab212fdde0d51b59fa59c9ee070
-  Redisaddr: redis-server:6379
+  redisaddr: scrm-redis:6379
 
 Aliyun:
   ACCESS_KEY_ID: LTAI5tSJwCQyuaxXR3UxfnWw
@@ -79,17 +79,28 @@ Aliyun:
   OSS_ROLEARN: acs:ram::1317798064750399:role/ramoss
 
 Fastgpt:
-  BASE_URL: https://newapi.gkscrm.com/v1
+  BASE_URL: http://new-api.gkscrm.com/v1
   API_KEY: sk-ZQRNypQOC8ID5WbpCdF263C58dF44271842e86D408Bb3848
 
 Xiaoice:
   SubscriptionKey: ccaa5a6ff70f4393a934e69b9ace31bb
   GptbotsAuthorization: app-hQL7oVq57McK5VBHlsMfhtUD
 
-WeChatWs:
+OpenAI:
+  BaseUrl: https://api.openai.com/v1
+  ApiKey: sk-ZQRNypQOC8ID5WbpCdF263C58dF44271842e86D408Bb3848
+
+WebSocket:
   -
-    Url: ws://chat.gkscrm.com:13088
-    Appid: default
+    Type: wecom
+    Name: default
+    Url: ws://wecom.gkscrm.com:15088
+
+FastgptMongoConf:
+  Url: mongodb://myusername:mypassword@47.251.25.21:27017/?connect=direct
+  DBName: fastgpt
+
+WeChatWs:
   -
-    Url: ws://chat.gkscrm.com:13088
-    Appid: wechat
+    Url: ws://chat.gkscrm.com:15088
+    Appid: wechat

+ 7 - 0
go.mod

@@ -27,6 +27,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
@@ -75,6 +76,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
@@ -105,6 +107,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
@@ -121,6 +124,10 @@ require (
 	github.com/refraction-networking/utls v1.6.3 // indirect
 	github.com/spaolacci/murmur3 v1.1.0 // 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 - 4
go.sum

@@ -265,6 +265,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=
@@ -447,7 +449,6 @@ github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Ky
 github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
 github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
 github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
-github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0=
 github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
 github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
 github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU=
@@ -472,6 +473,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=
@@ -481,7 +484,6 @@ github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLA
 github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78=
 github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
 github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
-github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
 github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
 github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
@@ -580,8 +582,6 @@ github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkU
 github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0=
 github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
 github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo=
-github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I=
-github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0=
 github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
 github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
@@ -618,7 +618,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=
@@ -636,6 +644,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=
@@ -689,6 +699,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

@@ -22,4 +22,5 @@ type Config struct {
 	CoreRpc            zrpc.RpcClientConf
 	Xiaoice            types.Xiaoice
 	WeChatWs           []types.WsConfig
+	FastgptMongoConf   types.MongoDB
 }

+ 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)
+		}
+	}
+}

+ 42 - 0
internal/handler/routes.go

@@ -1,4 +1,6 @@
 // Code generated by goctl. DO NOT EDIT.
+// goctls v1.10.1
+
 package handler
 
 import (
@@ -28,6 +30,7 @@ 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"
@@ -2046,6 +2049,45 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
 				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
+}

+ 41 - 4
internal/logic/fastgpt/set_token_logic.go

@@ -5,12 +5,14 @@ import (
 	"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"
-
-	"github.com/zeromicro/go-zero/core/logx"
 )
 
 type SetTokenLogic struct {
@@ -30,10 +32,18 @@ func NewSetTokenLogic(ctx context.Context, svcCtx *svc.ServiceContext, rw http.R
 }
 
 func (l *SetTokenLogic) SetToken(username string) (resp *types.BaseMsgResp, err error) {
-	token, err := l.getToken(username)
+	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, err
+		return nil, fmt.Errorf("invalid token")
 	}
+	//if err != nil {
+	//	return nil, err
+	//}
 	// 创建一个新的 Cookie
 	cookie := &http.Cookie{
 		Name:     "fastgpt_token",
@@ -110,3 +120,30 @@ func (l *SetTokenLogic) getToken(username string) (string, error) {
 
 	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
+}

+ 23 - 19
internal/svc/service_context.go

@@ -1,19 +1,18 @@
 package svc
 
 import (
+	"github.com/casbin/casbin/v2"
 	"github.com/redis/go-redis/v9"
-	"wechat-api/internal/config"
-	"wechat-api/internal/middleware"
-	"wechat-api/internal/pkg/wechat_ws"
-
 	"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"
+	"wechat-api/internal/config"
+	"wechat-api/internal/middleware"
+	"wechat-api/internal/pkg/wechat_ws"
+	mongo_model "wechat-api/mongo_model"
 )
 
 type ServiceContext struct {
@@ -25,6 +24,7 @@ type ServiceContext struct {
 	CoreRpc     coreclient.Core
 	Rds         redis.UniversalClient
 	WechatWs    map[string]*wechat_ws.WechatWsClient
+	MongoModel  *mongo_model.AllMongoModel
 }
 
 func NewServiceContext(c config.Config) *ServiceContext {
@@ -39,22 +39,25 @@ func NewServiceContext(c config.Config) *ServiceContext {
 		ent.Debug(), // debug mode
 	)
 
+	// 初始化 MongoDB 客户端
+	all_mongo_model := mongo_model.SetupMongoModel(c.FastgptMongoConf.Url, c.FastgptMongoConf.DBName)
+
 	coreRpc := coreclient.NewCore(zrpc.NewClientIfEnable(c.CoreRpc))
 
 	// 初始化微信ws客户端
 	// todo 现在配置是从 config.yaml中读取的,后续需要改成从数据库中读取,以便匹配不同的微信号
 	var wsClients map[string]*wechat_ws.WechatWsClient
-	for _, ws := range c.WeChatWs {
-		client, err := wechat_ws.NewWechatWsClient(ws.Url, ws.Appid)
-		if err != nil {
-			logx.Error(err)
-			continue
-		}
-		go client.WritePump()
-		go client.ReadPump(nil)
-
-		wsClients[ws.Appid] = client
-	}
+	//for _, ws := range c.WeChatWs {
+	//	client, err := wechat_ws.NewWechatWsClient(ws.Url, ws.Appid)
+	//	if err != nil {
+	//		logx.Error(err)
+	//		continue
+	//	}
+	//	go client.WritePump()
+	//	go client.ReadPump(nil)
+	//
+	//	wsClients[ws.Appid] = client
+	//}
 
 	return &ServiceContext{
 		Config:      c,
@@ -64,5 +67,6 @@ func NewServiceContext(c config.Config) *ServiceContext {
 		CoreRpc:     coreRpc,
 		Rds:         rds,
 		WechatWs:    wsClients,
+		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"`
+}

+ 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"`
+}

+ 12 - 0
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
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.
+func NewTeamsModel(url, db, collection string) TeamsModel {
+	conn := mon.MustNewModel(url, db, collection)
+	return &customTeamsModel{
+		defaultTeamsModel: newDefaultTeamsModel(conn),
+	}
+}

+ 76 - 0
teams/teamsmodelgen.go

@@ -0,0 +1,76 @@
+// 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.CreateAt = time.Now()
+		data.UpdateAt = 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) {
+	data.UpdateAt = time.Now()
+
+	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
+}

+ 14 - 0
teams/teamstypes.go

@@ -0,0 +1,14 @@
+package model
+
+import (
+	"time"
+
+	"go.mongodb.org/mongo-driver/bson/primitive"
+)
+
+type Teams struct {
+	ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"`
+	// TODO: Fill your own fields
+	UpdateAt time.Time `bson:"updateAt,omitempty" json:"updateAt,omitempty"`
+	CreateAt time.Time `bson:"createAt,omitempty" json:"createAt,omitempty"`
+}