開發個人Go-ChatGPT–4 用戶管理
先看下我的目錄結構,可以根據個人愛好,進行重構
|-- Dockerfile
|-- LICENSE
|-- common
| |-- callmodel
| | |-- gemma.go
| | `-- models.go
| |-- consts
| | |-- code.go
| | |-- common.go
| | |-- config.go
| | `-- consts.go
| |-- cryptx
| | `-- crypt.go
| |-- curlhttp
| | `-- curl.go
| |-- database
| | |-- common.go
| | |-- connect.go
| | |-- dao.go
| | |-- ormLogx.go
| | |-- redisClient.go
| | `-- redisDao.go
| |-- go.mod
| |-- go.sum
| |-- jwtx
| | `-- jwt.go
| |-- middleware
| | `-- static.go
| |-- model
| | |-- chat.sql
| | |-- chatmodel.go
| | |-- chatmodel_client.go
| | |-- prompt.sql
| | |-- promptmodel.go
| | |-- promptmodel_client.go
| | |-- readMe.md
| | |-- user.sql
| | |-- usermodel.go
| | `-- usermodel_client.go
| `-- utils
| `-- utils.go
|-- docker-compose.yaml
|-- nginx
| `-- conf.d
| `-- default.conf
|-- readme.md
`-- service|-- chat| |-- api| `-- rpc`-- user|-- api`-- rpc
4.1 生成 user model 模型
-
創建 sql 文件
OpenUI 前端
需要的字段,不可缺少。mysql
服務需提前創建openui
庫,user
tableCREATE TABLE `user` (`id` bigint unsigned NOT NULL AUTO_INCREMENT,`name` varchar(255) NOT NULL DEFAULT '' COMMENT '用戶姓名',`email` varchar(255) NOT NULL DEFAULT '' COMMENT '用戶電話',`password` varchar(255) NOT NULL DEFAULT '' COMMENT '用戶密碼',`role` varchar(264) NOT NULL DEFAULT '' COMMENT '用戶角色',`profile_image_url` varchar(255) NOT NULL DEFAULT '' COMMENT '用戶頭像',`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP,`update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (`id`),UNIQUE KEY `idx_email_unique` (`email`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-
運行模板生成命令
model
文件放置在通用目錄,和go-zero
官方案例不同goctl model mysql ddl -src ./model/user.sql -dir ./model -c
4.2 生成 user api 服務
前綴,路由,傳參,響應不可變,否則 openui調用失敗
-
創建
user.api
文件type (// 用戶登錄LoginRequest {Email string `json:"email"`Password string `json:"password"`}LoginResponse {Id int64 `json:"id"`Name string `json:"name"`Role string `json:"role"`ProfileImageUrl string `json:"profile_image_url"`Token string `json:"token"`}// 用戶登錄// 用戶注冊RegisterRequest {Name string `json:"name"`Email string `json:"email"`Password string `json:"password"`ProfileImageUrl string `json:"profile_image_url"`}RegisterResponse {Id int64 `json:"id"`Name string `json:"name"`Token string `json:"token"`}// 用戶注冊// 用戶信息UserInfoResponse {Id int64 `json:"id"`Name string `json:"name"`Email string `json:"email"`Role string `json:"role"`ProfileImageUrl string `json:" profile_image_url"`} // 用戶信息 )@server (prefix: /api/v1 ) service User {@handler Loginpost /auths/signin (LoginRequest) returns (LoginResponse)@handler Registerpost /auths/signup (RegisterRequest) returns (RegisterResponse) }@server (jwt: Authprefix: /api/v1 ) service User {@handler UserInfoget /auths returns (UserInfoResponse) }
-
運行模板生成命令
goctl api go -api ./api/user.api -dir ./api
4.3 生成 user rpc 服務
-
創建
user.proto
文件syntax = "proto3";package userclient;option go_package = "./user";// 用戶登錄 message LoginRequest {string Email = 1;string Password = 2; } message LoginResponse {int64 Id = 1;string Name = 2;string Token = 3;string Role = 4;string ProfileImageUrl = 5; } // 用戶登錄// 用戶注冊 message RegisterRequest {string Name = 1;string Email = 2;string Password = 3;string ProfileImageUrl = 4; } message RegisterResponse {int64 Id = 1;string Name = 2;string Token = 3; } // 用戶注冊// 用戶信息 message UserInfoRequest {int64 Id = 1; } message UserInfoResponse {int64 Id = 1;string Name = 2;string Email = 3;string Role = 4;string ProfileImageUrl = 5; } // 用戶信息service User {rpc Login(LoginRequest) returns(LoginResponse);rpc Register(RegisterRequest) returns(RegisterResponse);rpc UserInfo(UserInfoRequest) returns(UserInfoResponse); }
-
運行模板生成命令
goctl rpc protoc ./rpc/user.proto --go_out=./rpc/types --go-grpc_out=./rpc/types --zrpc_out=./rpc
4.3 配置文件
-
rpc/etc
Name: user.rpc ListenOn: 0.0.0.0:9001Etcd:Hosts:- xxxxxxxxxxxxxxxxxxxxxxxxx:2379Key: user.rpcTimeout: 0Mysql:Host: xxxxxxxxxxxxxxPort: 3306DbName: openuiUser: xxxxxxPassword: "xxxxxxxxxxxxxxxxxxxxxxxxx"DBZone: "TS"Charset: utf8mb4MaxIdle: 10MaxOpen: 100LogMode: trueLoc: Asia/ShanghaiDebug: trueTablePrefix: "v1_"MaxLifetime: 300# redis 支持選擇db, 不使用go-zero官方庫 CacheRedis:Name: "openui"Nettype: "tcp"Address: "redis:6379"Auth: ""DB: 0Salt: ********************#日志配置 LogConf:ServiceName: user.rpcMode: fileTimeFormat: 2006-01-02 15:04:05.000Path: logsLevel: infoCompress: trueStat: false # 不記錄CPU、內存等信息KeepDays: 10MaxBackups: 2
-
api/etc
Name: user.rpc ListenOn: 0.0.0.0:9001Etcd:Hosts:- xxxxxxxxxxxxxxxxxxxxxxxxx:2379Key: user.rpcTimeout: 0Mysql:Host: xxxxxxxxxxxxxxPort: 3306DbName: openuiUser: xxxxxxPassword: "xxxxxxxxxxxxxxxxxxxxxxxxx"DBZone: "TS"Charset: utf8mb4MaxIdle: 10MaxOpen: 100LogMode: trueLoc: Asia/ShanghaiDebug: trueTablePrefix: "v1_"MaxLifetime: 300 # redis 支持選擇db, 不使用go-zero官方庫 CacheRedis:Name: "openui"Nettype: "tcp"Address: "redis:6379"Auth: ""DB: 0Salt: *****************#日志配置 LogConf:ServiceName: user.rpcMode: fileTimeFormat: 2006-01-02 15:04:05.000Path: logsLevel: infoCompress: trueStat: false # 不記錄CPU、內存等信息KeepDays: 10MaxBackups: 2
4.4 業務處理
- 業務處理就不過多描述了,具體處理流程可以看相應文件的實現
項目地址
jackwillsmith/openui-svelte-build (github.com)
GitHub - jackwillsmith/openui-backend-go: openui-backend-go