Merge branch 'x/sqlx' into x/sqlc

r/paopao-ce-pro
Michael Li 2 years ago
commit 651d779ece
No known key found for this signature in database

@ -73,7 +73,7 @@ generate: gen-mir gen-grpc
.PHONY: gen-mir
gen-mir:
@go generate mirc/main.go
@go generate mirc/gen.go
@go fmt ./auto/api/...
.PHONY: gen-grpc

@ -246,8 +246,18 @@ docker compose up --build
> 注意:默认提供的 docker-compose.yaml 初衷是搭建本机开发调试环境,如果需要产品部署供外网访问,请自行调优配置参数或使用其他方式部署。
### API 文档
* `config.yaml` 添加 `Docs:OpenAPI` 功能项:
### 开发文档
#### Docs文档说明
`docs`目录提供了各种开发文档,包括:
* [deploy](docs/deploy/) - paopao-ce部署文档
* [discuss](docs/discuss/) - 开发相关的问题交流论述文档
* [openapi](docs/openapi/) - paopao-ce后端导出API文档
* [proposal](docs/proposal/) - paopao-ce功能特性提按文档
> 比如关于paopao-ce的设计定位可以参考[docs/proposal/001-关于paopao-ce的设计定位](docs/proposal/001-关于paopao-ce的设计定位.md)简要阐述了paopao-ce是如何定位自身的。
#### API文档
开发者可以在本地开启`Docs`服务浏览后端导出的API服务接口文档。
* `config.yaml` 添加 `Docs` 功能项:
```yaml
...
Features:
@ -260,7 +270,7 @@ Features:
```sh
make run TAGS='docs'
# visit http://127.0.0.1:8008/docs/openapi
# visit http://127.0.0.1:8011/docs/openapi
```
### 配置说明
@ -354,9 +364,9 @@ release/paopao-ce --no-default-features --features sqlite3,localoss,loggerfile,r
|`LoggerFile` | 日志 | 稳定 | 使用文件写日志 |
|`LoggerZinc` | 日志 | 稳定(推荐) | 使用[Zinc](https://github.com/zinclabs/zinc)写日志 |
|`LoggerMeili` | 日志 | 内测 | 使用[Meilisearch](https://github.com/meilisearch/meilisearch)写日志 |
|`Friendship` | 关系模式 | 内测(默认) | 弱关系好友模式,类似微信朋友圈 |
|`Followship` | 关系模式 | WIP | 关注者模式类似Twitter的Follow模式 |
|`Lightship` | 关系模式 | 内测 | 开放模式,所有推文都公开可见 |
|[`Friendship`](docs/proposal/002-关于Friendship功能项的设计.md) | 关系模式 | 内测 | 弱关系好友模式,类似微信朋友圈 |
|[`Followship`](docs/proposal/003-关于Followship功能项的设计.md) | 关系模式 | WIP | 关注者模式类似Twitter的Follow模式 |
|[`Lightship`](docs/proposal/011-关于Lightship功能项的设计.md) | 关系模式 | 内测(默认) | 开放模式,所有推文都公开可见 |
|`Alipay` | 支付 | 稳定 | 开启基于[支付宝开放平台](https://open.alipay.com/)的钱包功能 |
|`Sms` | 短信验证 | 稳定 | 开启短信验证码功能,用于手机绑定验证手机是否注册者的;功能如果没有开启,手机绑定时任意短信验证码都可以绑定手机 |
|`Docs:OpenAPI` | 开发文档 | 稳定 | 开启openapi文档功能提供web api文档说明(visit http://127.0.0.1:8008/docs/openapi) |

@ -1,4 +1,6 @@
// Code generated by go-mir. DO NOT EDIT.
// versions:
// - mir v3.0.1
package v1

@ -1,4 +1,6 @@
// Code generated by go-mir. DO NOT EDIT.
// versions:
// - mir v3.0.1
package v1

@ -1,4 +1,6 @@
// Code generated by go-mir. DO NOT EDIT.
// versions:
// - mir v3.0.1
package v1

@ -1,4 +1,6 @@
// Code generated by go-mir. DO NOT EDIT.
// versions:
// - mir v3.0.1
package v1

@ -1,4 +1,6 @@
// Code generated by go-mir. DO NOT EDIT.
// versions:
// - mir v3.0.1
package v1

@ -1,4 +1,6 @@
// Code generated by go-mir. DO NOT EDIT.
// versions:
// - mir v3.0.1
package v1

@ -1,4 +1,6 @@
// Code generated by go-mir. DO NOT EDIT.
// versions:
// - mir v3.0.1
package v1

@ -1,4 +1,6 @@
// Code generated by go-mir. DO NOT EDIT.
// versions:
// - mir v3.0.1
package v1

@ -1,4 +1,6 @@
// Code generated by go-mir. DO NOT EDIT.
// versions:
// - mir v3.0.1
package v1

@ -1,4 +1,6 @@
// Code generated by go-mir. DO NOT EDIT.
// versions:
// - mir v3.0.1
package v1

@ -1,4 +1,6 @@
// Code generated by go-mir. DO NOT EDIT.
// versions:
// - mir v3.0.1
package v1

@ -1,4 +1,6 @@
// Code generated by go-mir. DO NOT EDIT.
// versions:
// - mir v3.0.1
package v1

@ -1,4 +1,6 @@
// Code generated by go-mir. DO NOT EDIT.
// versions:
// - mir v3.0.1
package v1

@ -56,13 +56,15 @@ release/paopao-ce --no-default-features --features sqlite3,localoss,loggerfile,r
目前支持的功能集合:
| 功能项 | 类别 | 状态 | 备注 |
| ----- | ----- | ----- | ----- |
|`OldWeb` | 子服务 | 稳定(默认) | 开启旧的Web服务 |
|`Web` | 子服务 | WIP | 开启Web服务|
|`Web` | 子服务 | 内测 | 开启Web服务|
|`Admin` | 子服务 | WIP | 开启Admin后台运维服务|
|`SpaceX` | 子服务 | WIP | 开启SpaceX服务|
|`Bot` | 子服务 | WIP | 开启Bot服务|
|`NativeOBS` | 子服务 | WIP | 开启NativeOBS服务|
|`Deprecated:Web` | 子服务 | 稳定 | Deprecated(关闭) OldWeb服务|
|`Docs` | 子服务 | WIP | 开启开发者文档服务|
|`Frontend:Web` | 子服务 | 稳定 | 开启独立前端服务|
|`Frontend:EmbedWeb` | 子服务 | 稳定 | 开启内嵌于后端Web API服务中的前端服务|
|`Deprecated:Web` | 子服务 | 稳定 | 开启旧的Web服务|
|`Gorm` | 数据库 | 稳定(默认) | 使用[gorm](https://github.com/go-gorm/gorm)作为数据库的ORM默认使用 `Gorm` + `MySQL`组合|
|`Sqlx`| 数据库 | WIP | 使用[sqlx](https://github.com/jmoiron/sqlx)作为数据库的ORM|
|`MySQL`| 数据库 | 稳定(默认) | 使用MySQL作为数据库|
@ -77,7 +79,7 @@ release/paopao-ce --no-default-features --features sqlite3,localoss,loggerfile,r
|`OSS:Retention` | 对象存储 | 内测 |基于对象存储系统的对象过期自动删除特性实现 先创建临时对象再持久化的功能|
|`OSS:TempDir` | 对象存储 | 内测 |基于对象存储系统的对象拷贝/移动特性实现 先创建临时对象再持久化的功能|
|`Redis` | 缓存 | 稳定 | Redis缓存功能 |
|`SimpleCacheIndex` | 缓存 | 稳定 | 提供简单的 广场推文列表 的缓存功能 |
|`SimpleCacheIndex` | 缓存 | Deprecated | 提供简单的 广场推文列表 的缓存功能 |
|`BigCacheIndex` | 缓存 | 稳定(推荐) | 使用[BigCache](https://github.com/allegro/bigcache)缓存 广场推文列表,缓存每个用户每一页,简单做到千人千面 |
|`Zinc` | 搜索 | 稳定(推荐) | 基于[Zinc](https://github.com/zinclabs/zinc)搜索引擎提供推文搜索服务 |
|`Meili` | 搜索 | 稳定(推荐) | 基于[Meilisearch](https://github.com/meilisearch/meilisearch)搜索引擎提供推文搜索服务 |
@ -85,11 +87,64 @@ release/paopao-ce --no-default-features --features sqlite3,localoss,loggerfile,r
|`LoggerFile` | 日志 | 稳定 | 使用文件写日志 |
|`LoggerZinc` | 日志 | 稳定(推荐) | 使用[Zinc](https://github.com/zinclabs/zinc)写日志 |
|`LoggerMeili` | 日志 | 内测 | 使用[Meilisearch](https://github.com/meilisearch/meilisearch)写日志 |
|`Friendship` | 关系模式 | 内测(默认) | 弱关系好友模式,类似微信朋友圈 |
|`Followship` | 关系模式 | WIP | 关注者模式类似Twitter的Follow模式 |
|[`Friendship`](../../docs/proposal/002-关于Friendship功能项的设计.md) | 关系模式 | 内测 | 弱关系好友模式,类似微信朋友圈 |
|[`Followship`](../../docs/proposal/003-关于Followship功能项的设计.md) | 关系模式 | WIP | 关注者模式类似Twitter的Follow模式 |
|[`Lightship`](../../docs/proposal/011-关于Lightship功能项的设计.md) | 关系模式 | 内测(默认) | 开放模式,所有推文都公开可见 |
|`Alipay` | 支付 | 稳定 | 开启基于[支付宝开放平台](https://open.alipay.com/)的钱包功能 |
|`Sms` | 短信验证 | 稳定 | 开启短信验证码功能,用于手机绑定验证手机是否注册者的;功能如果没有开启,手机绑定时任意短信验证码都可以绑定手机 |
|`Docs:OpenAPI` | 开发文档 | 稳定 | 开启openapi文档功能提供web api文档说明(visit http://127.0.0.1:8008/docs/openapi) |
|`PhoneBind` | 其他 | 稳定 | 手机绑定功能 |
> 功能项状态详情参考 [features-status](../../../features-status.md).
### 按需添加自定义配置
paopao-ce提供了按需添加配置的机制paopao-ce在internal/conf/config.yaml中内嵌了一份完整的默认配置内嵌的默认配置与自定义配置config.yaml在paopao-ce启动时自动进行了配置项合并自定义的配置(./config.yaml或者./custom/config.yaml)中只需要自定义 运行时 声明Features 的相应配置即可。比如只运行Web 子服务config.yaml可以只包含如下配置(其他配置使用默认值):
```yaml
# file: config.yaml
Features:
Default: ["Sqlite3", "Zinc", "LocalOSS", "BigCacheIndex", "Web"]
WebServer: # Web服务
HttpIp: 0.0.0.0
HttpPort: 8010
ReadTimeout: 60
WriteTimeout: 60
LocalOSS: # 本地文件OSS存储配置
SavePath: data/paopao-ce/oss
Secure: True
Bucket: paopao
Domain: api.paopao.info
Zinc: # Zinc搜索配置
Host: 127.0.0.1:4080
Index: paopao-data
User: admin
Password: admin
Secure: False
```
部署paopao-ce实例时可以按需自定义配置运行时所需的配置项 多个实例部署可以使用不同配置项组合,运行不同的子服务,再通过一个统一的 Proxy(Nginx或云端proxy) 将请求桥接到具体的paopao-ce部署实例。
### 多服务同端口运行
paopao-ce提供的机制是各个子服务(gRPC/RESTful API服务)可以在一个独立端口提供业务服务也可以多个同类型的子服务RESTful API服务 或者 gRPC 服务)共享同一个端口提供服务,比如 Web/Admin/Bot 三个子服务在8010端口提供服务, 只需要配置三个子服务的HttpIp/HttpPort为相同值即可:
```yaml
# file: config.yaml
Features:
Default: ["Sqlite3", "Zinc", "LocalOSS", "BigCacheIndex", "Web", "Admin", "Bot"]
WebServer: # Web服务
HttpIp: 0.0.0.0
HttpPort: 8010
ReadTimeout: 60
WriteTimeout: 60
AdminServer: # Admin后台运维服务
HttpIp: 0.0.0.0
HttpPort: 8010
ReadTimeout: 60
WriteTimeout: 60
BotServer: # Bot服务
HttpIp: 0.0.0.0
HttpPort: 8010
ReadTimeout: 60
WriteTimeout: 60
...
```

@ -1,6 +1,6 @@
| 编号 | 作者 | 发表时间 | 变更时间 | 版本 | 状态 |
| ----- | ----- | ----- | ----- | ----- | ----- |
| 001| 北野 | 2022-11-04 | 2022-12-19 | v1.0 | 提议 |
| 001| 北野 | 2022-11-04 | 2023-01-13 | v1.1 | 提议 |
## 概述
paopao-ce是一个清新文艺的微社区提供类似Twiter/微博的推文分享服务。paopao-ce的运营形态有点类似WordPress只不过WordPress是使用PHP语言开发的博客平台提供的是博客服务而paopao-ce提供的是类似Twitter的推文分享服务。paopao-ce 让 **个人或小组织** 可以快速、方便的部署一个提供**推文分享服务**的小站点,在有限范围内形成一个友善的社交小圈子微社区。
@ -37,6 +37,10 @@ paopao-ce目前支持Redis作为缓存存储引擎提供缓存服务请参考
paopao-ce在代码实现上采用 **单体架构模式、分层设计、功能模块化**,架构设计上可能略显保守,但是在使用新技术上却非常积极,比如搜索引擎就采用了近来新星[Zinc](https://github.com/zinclabs/zinc) /[Meilisearch](https://github.com/meilisearch/meilisearch)同时也不排斥各种云端服务包括阿里云、腾讯云、华为云的对象存储服务、关系数据库服务等。paopao-ce始终秉持着 **包容并蓄、能用就上、去繁就简** 的架构思维,努力打造一个能 **稳定运行、代码清晰、功能可扩展** 的开源项目。
![](.assets/006-01.png)
## 从技术探索角度思考
IT世界是非常激动人心的新技术层出不穷在各自领域大展身手、大放异彩。作为开发者的我们首要目标当然是以产品为核心不断的优化服务体验也不吝啬于新技术的采用以达到更好的产品服务质量。新技术或者某种技术本身是需要一个环境来支撑其运行、演进脱离实际环境的技术演进犹如纸上谈兵实际效果是存疑的。开发者在研究一项(新)技术时首先当然是知其然了解其功能特性、适用场景再而知其所以然深入了解其设计原理、知悉其存在的局限等进而知其不以为然通过实践找到技术的最适合场景、知悉其不适合的场景或与其他技术配合使用扬长避短发挥各自的最佳效力以解决具体的事务。这些都是技术探索的通用流程可以看出一项技术的探索从陌生到一知半解再到了如指掌需要一个漫长的过程以及一个技术探索的环境。有些技术的探索确实需要一个具体的环境才能更好的研究与实践比如OBS、Search、Recommended discovery亦或各种云服务的使用、k8s的服务部署等都需要一个具体的环境来进行技术探索。可以说以需求驱动的技术探索也更能推进技术本身的不断演进。
说这么多这就引出了本节所要说的一个观点了paopao-ce不仅仅是作为一个提供推文分享服务的产品也能作为一些技术的探索环境。比如OBS(对象存储服务)、推文搜索服务、推文/用户推荐发现服务、广场推文消息流服务等,都可以作为相应技术领域的技术探索环境,从实践中去检验技术的有效性,更好的推进技术的学习、实践、演进。作为开发者/学习者,也能在理论学习与实际环境中实践(新)技术找到一个平衡,更好、更快的掌握一项(新)技术这也是paopao-ce的另一价值所在。**路漫漫其修远兮,吾将上下而求索**,用我们开发者的话来说,带着 **上下文(环境/需求)** 去探索(新)技术,或能事半功倍、得心应手。
## 从人文角度思考
现在的互联网世界已经非常精彩各种社交媒体平台琳琅满目使用体验也非常友好。每个社交平台都有自己的运营方式都有自己的核心用户群体也有自己的产品灵魂都在不断的进行生态演进。比如Twitter、微博都已经从最初的推文分享服务演进到一个成熟的传媒平台注册用户非常庞大日均访问PV也是一个惊人的数字这就注定了平台的运营思维是多维度考量均衡的结果只能做到让用户群体的大多数人用户体验友好并不能满足所有人的需求。大平台有大平台的运营模式小站点有小站点的维系空间。对于类似Twitter这样的推文分享服务paopao-ce提供一种小站点部署模式采用类似WordPress的运维模式**个人/小组织** 能快速、便捷的拥有一个提供推文分享服务的小站点,以填补那些在大平台下难以享受到的用户体验,享受小圈子内的自由空间。
@ -71,3 +75,6 @@ paopao-ce在代码实现上采用 **单体架构模式、分层设计、功能
#### v1.0(2022-12-19) - 北野
* 补充部分内容
#### v1.1(2023-01-13) - 北野
* 补充 从技术探索角度思考 描述

@ -63,7 +63,9 @@ RESTful服务与gRPC服务各自有擅长的场景在合适的场景使用最
### 更新记录
#### v0.0(2022-11-23) - 北野
* 初始文档, 先占个位置
#### v0.1(2022-12-23) - 北野
* 添加部分内容
#### v1.0(2023-01-01) - 北野
* 添加部分内容

@ -42,5 +42,6 @@ Features:
### 更新记录
#### v1.0(2022-12-14) - 北野
* 初始文档
#### v1.1(2022-01-09) - 北野
* 添加参考实现PR信息

@ -0,0 +1,28 @@
| 编号 | 作者 | 发表时间 | 变更时间 | 版本 | 状态 |
| ----- | ----- | ----- | ----- | ----- | ----- |
| 012| 北野 | 2023-01-13 | 2023-01-13 | v0.0 | 提议 |
### 概述
目前的Web前端运行时配置是通过编译时配置[.env](../../web/.env)进行静态配置虽然能满足简单的功能需求但是非常不灵活。本提按提议一种由paopao-ce后端服务控制的前端运行时配置获取机制让前端更灵活的依据运行时配置提供产品服务。
### 场景
前端依据paopao-ce后端服务提供的运行时配置按需提供产品服务也可以扩展到按用户喜好自定义的配置提供产品服务比如用户设置的语言、Theme、功能特性等。
### 需求
* 前端依据运行时配置提供业务服务 - 前端
* 前端在启动时从paopao-ce后端服务获取运行时配置 - 前端/后端
* 用户可以自定义前端运行时配置如语言、Theme、功能特性等 - 前端/后端
* 用户自定义的前端运行时配置可以 创建/更新 - 前端/后端
* 后端服务提供默认前端运行时配置 - 后端
### 方案
TODO
### 疑问
1. 为什么要提供这种机制?
TODO
### 更新记录
#### v0.0(2023-01-13) - 北野
* 初始文档, 先占个位置

@ -0,0 +1,21 @@
| 编号 | 作者 | 发表时间 | 变更时间 | 版本 | 状态 |
| ----- | ----- | ----- | ----- | ----- | ----- |
| 013| 北野 | 2023-01-13 | 2023-01-13 | v0.0 | 提议 |
### 概述
目前paopao-ce前端/后端 都使用中文提供业务服务暂时还没有提供国际化i18n机制提供国际化的业务服务。本提按提议提过在前端/后端中引入i8n机制以提供国际化业务服务。 本提按建立在[012-优化前端运行时配置获取机制的设计](012-优化前端运行时配置获取机制的设计.md)基础之上。
### 需求
* 提供i18n机制以实现业务服务的国际化 - 前端/后端
### 方案
TODO
### 疑问
1. 为什么要提供这种机制?
TODO
### 更新记录
#### v0.0(2023-01-13) - 北野
* 初始文档, 先占个位置

@ -139,16 +139,16 @@
* [x] 业务逻辑实现
#### 关系模式:
* `Friendship` 弱关系好友模式,类似微信朋友圈(目前状态: 开发阶段);
* [x] 提按文档
* `Friendship` 弱关系好友模式,类似微信朋友圈(目前状态: 内测);
* [x] [提按文档](docs/proposal/002-关于Friendship功能项的设计.md)
* [x] 接口定义
* [x] 业务逻辑实现
* `Followship` 关注者模式类似Twitter的Follow模式(目前状态: WIP);
* [ ] 提按文档
* [ ] [提按文档](docs/proposal/003-关于Followship功能项的设计.md)
* [ ] 接口定义
* [ ] 业务逻辑实现
* `Lightship` 开放模式,所有推文都公开可见(目前状态: WIP);
* [x] 提按文档
* `Lightship` 开放模式,所有推文都公开可见(目前状态: 内测、默认);
* [x] [提按文档](docs/proposal/011-关于Lightship功能项的设计.md)
* [x] 接口定义
* [x] 业务逻辑实现

@ -6,7 +6,7 @@ require (
github.com/Masterminds/semver/v3 v3.1.1
github.com/afocus/captcha v0.0.0-20191010092841-4bd1f21c8868
github.com/alimy/cfg v0.3.0
github.com/alimy/mir/v3 v3.0.0
github.com/alimy/mir/v3 v3.0.1
github.com/aliyun/aliyun-oss-go-sdk v2.2.2+incompatible
github.com/allegro/bigcache/v3 v3.0.2
github.com/bytedance/sonic v1.5.0

@ -147,8 +147,8 @@ github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:C
github.com/alexflint/go-filemutex v1.1.0/go.mod h1:7P4iRhttt/nUvUOrYIhcpMzv2G6CY9UnI16Z+UJqRyk=
github.com/alimy/cfg v0.3.0 h1:9xgA0QWVCPSq9fFNRcYahVCAX22IL9ts2wrTQPfAStY=
github.com/alimy/cfg v0.3.0/go.mod h1:rOxbasTH2srl6StAjNF5Vyi8bfrdkl3fLGmOYtSw81c=
github.com/alimy/mir/v3 v3.0.0 h1:bUcT+SLs/BYHIuHzTCbYnxnEwbYDSCDJULU5a1YZDes=
github.com/alimy/mir/v3 v3.0.0/go.mod h1:ybhT2ijOiDn0lLwWzIY6vXdv+uzZrctS7VFfczcXBWU=
github.com/alimy/mir/v3 v3.0.1 h1:70J/KMiEUDjpXfE2myqJ9aw408rshHdTKcN5yH74xqM=
github.com/alimy/mir/v3 v3.0.1/go.mod h1:ybhT2ijOiDn0lLwWzIY6vXdv+uzZrctS7VFfczcXBWU=
github.com/aliyun/aliyun-oss-go-sdk v2.2.2+incompatible h1:9gWa46nstkJ9miBReJcN8Gq34cBFbzSpQZVVT9N09TM=
github.com/aliyun/aliyun-oss-go-sdk v2.2.2+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8=
github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM=

@ -0,0 +1,2 @@
### Timeline(Timeline Message Flow System
广场时间线消息流系统模块, 目前还没实现,先占个位置~

@ -0,0 +1,5 @@
// Copyright 2023 ROC. All rights reserved.
// Use of this source code is governed by a MIT style
// license that can be found in the LICENSE file.
package timeline

@ -0,0 +1,2 @@
### xDS(Recommended Discovery System
推荐发现系统模块,目前还没实现,先占个位置~

@ -0,0 +1,5 @@
// Copyright 2023 ROC. All rights reserved.
// Use of this source code is governed by a MIT style
// license that can be found in the LICENSE file.
package xds

@ -2,6 +2,9 @@
// Use of this source code is governed by a MIT style
// license that can be found in the LICENSE file.
//go:build generate
// +build generate
package main
import (
@ -17,7 +20,7 @@ import (
_ "github.com/rocboss/paopao-ce/mirc/web/v1"
)
//go:generate go run main.go
//go:generate go run $GOFILE
func main() {
log.Println("generate code start")
opts := Options{
Loading…
Cancel
Save