Coder Social home page Coder Social logo

enraged-dun-cookie-development-team / ceobe-canteen-serve Goto Github PK

View Code? Open in Web Editor NEW
21.0 1.0 3.0 11.91 MB

快来帮小刻找找蜜饼吧,小刻要饿昏啦

License: GNU Affero General Public License v3.0

Rust 97.56% Python 2.31% Dockerfile 0.13%
arknights ceobe mongodb rust sea-orm actix-web

ceobe-canteen-serve's Introduction

Ceobe-Canteen-Serve

启动配置文件

启动配置文件支持 *.toml,*.json,*.yaml 可以将配置不同部分分布在不同的文件中(不推荐)

  • 配置项介绍

    所属分组 名称 必须 类型 说明 补充
    database/db scheme String 数据库的 scheme,如 mysql
    database/db username String 数据库的 用户名
    database/db password String 数据库的 密码
    database/db host String 数据库的 host 默认为 localhost
    database/db port u16 数据库的 port 默认为3306
    database/db name String 使用的数据库名称
    database/db max_conn u32 数据库的最大连接数
    database/db min_conn u32 数据库的最小连接数
    database/db logger bool 是否开始数据库操作日志 默认关闭
    logger/log to_stdout bool 同时将日志输出到 Stdout 默认为 true
    logger/log to_file String 同时将日志输出的文件 有值将会同时将日志输出到指定文件
    logger/log level off 或者
    error或者
    warm 或者
    info 或者
    debug 或者
    trace
    日志输出过滤等级
    resp_result/ rresult body String 响应成功时的响应体字段名称
    resp_result/ rresult err-msg String 响应失败时异常字段名称
    resp_result/ rresult fix-field bool 响应体固定字段 如果无需该字段值将为null
    resp_result/ rresult bool-status Option<String> 使用一个 bool 类型标记响应成功与否 该字段缺省表示不使用
    resp_result/ rresult body-extra-err Option<String> 额外的异常信息在响应体中字段 该字段缺省表示不使用
    resp_result/ rresult header-extra-err Option<String> 额外的异常信息在响应头中的字段名称 该字段缺省表示不使用
    mongodb/ mongo username String Mongodb 进行数据库连接使用的用户 该用户需要完整 Admin 权限
    mongodb/ mongo password String Mongodb 进行数据库连接使用的用户密码
    mongodb/ mongo host String Mongodb 进行数据库连接使用的 host 默认为localhost
    mongodb/ mongo port String Mongodb 进行数据库连接使用的端口 默认为27017
    mongodb/ mongo db_name String Mongodb 进行数据库连接使用的数据库
    user_auth/ auth jwt/jwt-key String 用户鉴权使用的Jwt密钥 最大长度不超过 32 位。过长部分将会被截断,过短部分将会被随机数填充
    user_auth/ auth header/header_name String 获取 token 的 Header 默认为Token
    user_auth/ auth mob_header String 获取 mob_id 的 Header 默认为mob-id
    admin_user/ user username String 默认后台第一个最高权限用户名
    admin_user/ user password String 默认后台第一个最高权限密码
    http_listen/ http host IpAddr http 监听的 host 默认为127.0.0.1
    http_listen/ http port u16 http 监听的 port 默认为8000
    qiniu/ qiniu_secret access_key String 七牛云的 Access Key
    qiniu/ qiniu_secret secret_key String 七牛云的 Secret Key
    qiniu/ qiniu_secret bucket String 所有要使用的 Bucket(篮子) 必填
    redis password String Redis 进行数据库连接使用的用户密码
    redis host String Redis 进行数据库连接使用的 host 默认为localhost
    redis port u16 Redis 进行数据库连接使用的端口 默认为6379
    redis db u8 Redis 进行数据库连接使用的数据库 默认为0
  • Toml

    [db]
    scheme="mysql"
    username="<db_user>"
    password="<db_pwd>"
    
    host="localhost"
    port=3306
    
    name="mansion_data"
    max_conn=16
    min_conn=2
    
    logger=true
    
    [log]
    level = "debug"
    to_file = "./logout.log"
    to_stdout = true
    
    [rresult]
    body = "body"
    err-msg = "e-msg"
    fix-field = false
    bool-status = "is-ok"
    body-extra-err = "status"
    
    [mongo]
    username = "<db-user>"
    password = "<db-pwd>"
    db_name = "ceobe-canteen"
    host = "localhost"
  • Yaml

    log:
      to_file: ./logout.log
      level: info
  • Json

    {
      "db": {
        "password": "pwd",
        "name": "name"
      }
    }

异常

  • 前缀类型说明

    前缀 说明
    F 服务器异常
    D 数据库异常
    G MongoDb 异常
    I IO 过程异常
    P 数据转换时异常
    C 数据校验异常
    S 资源查找异常
    M 数据未变更
    A 权限认证异常
    Q 七牛云上传异常
    L 日志报告异常
  • 服务异常

    前缀 异常码 httpCode 说明
    F 0001 500 服务器发生未预期 Panic
    F 0002 500 管道发生未预期关闭
  • Io 异常

    前缀 异常码 httpCode 说明
    I 0001 500 std::io::Error
    I 0002 500 core::fmt::Error
  • 类型转换异常

    前缀 异常码 httpCode 说明
    P 0001 400 Url 转化异常
    P 0002 400 数字转换异常
    P 0003 400 jwt 转换异常
    P 0004 400 日期转换异常
    P 0005 500 字符串编码异常
    P 0006 400 http 请求头内容解析异常
    P 0007 500 非法 Http 请求头内容
  • 数据校验异常

    前缀 异常码 httpCode 说明
    C 0001 400 范围检查未通过
    C 0002 400 饼学大厦 id 格式不是 {int}.{int}
    C 0003 400 错误的 Fraction 值范围(0~5)
    C 0004 400 Json 序列化/反序列化异常
    C 0005 400 Path 数据加载异常
    C 0006 400 未知的预期确信度等级
    C 0007 400 Query 加载异常
    C 0008 409 饼学大厦的 Id 已经存在
    C 0009 400 BV 号格式错误
    C 000A 400 版本号格式错误
    C 000B 409 版本号已经被使用
    C 000C 400 Bincode 序列化/反序列化异常
    C 000D 500 存在多个可用的资源全可用的记录
    C 000E 400 预期为 0 值取得非 0 值
    C 000F 400 获取MultiPart异常
    C 0010 400 解析MultiPart异常
    C 0011 400 MultiPart Field 不存在
    C 0012 500 平台下存在数据源,无法删除平台
    C 0013 400 未找到平台
    C 0014 400 {origin} 无法被 {RHS} 整除,余数{rem}
    C 0015 400 Json 对象不符合预期
  • 数据库异常(SeaOrm)

    前缀 异常码 httpCode 说明
    D 0001 500 数据库连接失败
    D 0002 500 数据库请求操作失败
    D 0003 500 数据库查询失败
    D 0004 500 数据库记录不存在
    D 0005 500 数据库 CustomError
    D 0006 500 数据库类型转换失败
    D 0007 500 数据库类型序列化失败
    D 0008 500 数据库 Migrate 失败
  • 数据库异常(MongoDb)

    前缀 异常码 httpCode 说明
    G 0001 500 非法参数
    G 0002 500 权限不足
    G 0003 500 Bson反序列化失败
    G 0004 500 Bson序列化失败
    G 0005 500 Bson序列化失败
    G 0006 500 写冲突
    G 0007 500 指令错误
    G 0008 500 DNS处理异常
    G 0009 500 网络异常
    G 0010 500 Io 异常
    G 0011 500 非法响应
    G 0012 500 客户端无法选择数据库服务
    G 0013 500 客户端未提供 Session
    G 0014 500 非法 TLS 配置
    G 0015 500 写入异常
    G 0016 500 事务异常
    G 0017 500 服务不可用异常
    G 0018 500 数据库不存在
    G 0019 500 数据库中集合不存在
  • Redis 异常

    前缀 异常码 httpCode 说明
    R 0001 500 无效响应
    R 0002 500 权限不足
    R 0003 500 类型不匹配
    R 0004 500 脚本执行终止
    R 0005 500 正在加载转储,无法响应
    R 0006 500 请求脚本不存在
    R 0007 500 给客户端的参数错误
    R 0008 500 键移动到不同的节点
    R 0009 500 密钥移动到不同节点且访问
    R 0010 500 需要重试请求
    R 0011 500 redis 集群关闭
    R 0012 500 一个请求跨越多个槽
    R 0013 500 集群主机不可用
    R 0014 500 redis 错误不是系统本身的错误
    R 0015 500 在执行之前在客户端上识别出的错误
    R 0016 500 扩展错误
    R 0017 500 尝试写入只读服务器
  • 数据未变更

    前缀 异常码 httpCode 说明
    M 0001 304 Ceobe 在当前提供时间戳下无更新
  • 资源查找异常

    前缀 异常码 httpCode 说明
    S 0001 404 指定饼学大厦未找到
    S 0002 404 不存在的路由
    S 0003 500 发起请求时出现异常
    S 0004 404 版本号不存在
    S 0005 404 暂没有版本信息
    S 0006 500 不存在可用的资源全可用的记录
  • 权限认证异常

    前缀 异常码 httpCode 说明
    A 0001 401 缺少 Token 字段
    A 0002 401 权限不足
    A 0003 404 Token 对应信息不存在
    A 0004 401 密码错误
    A 0005 500 密码处理错误
    A 0006 401 Token 失效
    A 0007 404 用户不存在
    A 0008 400 用户已经被使用
    A 0009 400 密码未更改
    A 000A 500 缺少用户鉴权中间件
  • 七牛云上传异常

    前缀 异常码 httpCode 说明
    Q 0001 500 上传七牛云时出现异常
  • 日志报告异常

    前缀 异常码 httpCode 说明
    L 0001 500 与Grpc服务端建立连接失败
    L 0002 500 Grpc service 返回异常响应
    L 0003 500 发送日志时收到失败响应

ceobe-canteen-serve's People

Contributors

azidecupric avatar felinae98 avatar goodjooy avatar phidialam avatar yun-shan avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

ceobe-canteen-serve's Issues

屎山爆破计划

由于长时间维护,复杂的多个功能区合在一起。导致当前项目虽然已经具备了发布1.0的完整功能,但是代码本身质量依旧存疑。因此这里提出对于Rust端源码的大型重构。

首先,在开始重构前,希望能够提供全套的单元测试与集成测试,以确保在重构之后也能确认功能正确。

  • 占位符:添加 XXX 单元测试/集成测试,测试XXX 功能运作正常
  • 这里添加关于添加、修改、更新单元测试的 pull request

接下来,关于当前整个项目具有的缺陷,也许不同的人具有不同的看法,因此,可以在这里进行讨论。不管是新的issue 或者 在discussions 中发表

  • 占位符

最后,开始重构吧。需要知道每一个pull request 对应的 issue

  • PR [ ]:完成Issue [ ] 内容要求的XXX 部分/全部
  • 这里列出所有PR 与 issue 关系,并添加引用

管理员鉴权模块重构

现状

在当前状态下,鉴权功能由以下几个部分共同提供

  • libs\crypto_str : 提供密码的加密和验证抽象
  • src\middleware\authorize: 提供鉴权中间件
  • src\utils\user_authorize: 提供鉴权相关的功能支持,包括用户权限分级、鉴权配置初始化内容
  • persisitence\dao\admin : 定义管理员相关的数据库操作
  • persistence\sql-models\src\admin_user : 定义管理相关的数据库模型

其中数据库相关的定义与操作已经集成到 persistence 即持久化模块中。
但是其他部分的功能,却分散在四处

解决

同时,由于鉴权模块由以下几个部分组成

  • 中间件: 用于挂载在特定handle/router 下,以提供鉴权功能
  • Extractor: 通过 Extension 中转,为handler 提供获取已鉴权用户的信息功能

看起来,鉴权模块似乎可以归入中间件当中,但是个人认为用户鉴权是具有特殊功能的组件,应该独立模块。

当前的鉴权相关的依赖树大概如下

┌──────────────────────────┐          ┌────────────┐
│                          │          │            │
│ presisitence/model_admin │          │ crypto_str │
│                          │          │            │
└───────┬────────┬─────────┘          └───┬────────┘
        │        │                        │
        │    ┌───┼────────────────────────┘
        │    │   │
        │    │   └────────────────┐
        │    │                    │
        │    │      ┌─────────┐   │   ┌─────────┐
        │    │      │         │   │   │         │
  ┌─────▼────▼──────▼──┐   ┌──┴───▼───▼─┐   ┌───┴────────┐
  │                    │   │            │   │            │
  │ handlers/user_auth │   │ middleware │   │ validation │
  │                    │   │            │   │            │
  └────────────────────┘   └────────────┘   └────────────┘

handlers/user_auth 部分创建用户时会使用crypto_str 中的加密算法供 presisitence/model_admin 相关接口使用。
middleware 鉴权时,会先使用 Validation 获取请求中的用户token, 然后使用presisitence/model_admin 获取对应用户信息,并比对密码版本,进行鉴权。

能否将鉴权部分合并到一起,成为一个crate,将以上的依赖关系改成下面这样

                                 ┌──────────────────┐
                                 │    Authorize     │
                                 │  ┌────────────┐  │
┌──────────────────────────┐     │  │            │  │
│                          │     │  │ validation │  │
│ presisitence/model_admin │     │  │            │  │
│                          │     │  └────────────┘  │
└───────┬──────────────────┘     │                  │
        │                        │  ┌────────────┐  │
        │                        │  │            │  │
        │       ┌────────────────┤  │ middleware │  │
        │       │                │  │            │  │
        │       │                │  └────────────┘  │
  ┌─────▼───────▼──────┐         │                  │
  │                    │         │  ┌────────────┐  │
  │ handlers/user_auth │         │  │            │  │
  │                    │         │  │ crypto_str │  │
  └────────────────────┘         │  │            │  │
                                 │  └────────────┘  │
                                 │                  │
                                 │                  │
                                 └──────────────────┘

将鉴权相关的代码进行一定包装,统一暴露给handlers,同时从跟项目中独立出来,便于后续的serve 代码迁移工作

还可以对密码加密流程提供一定包装,简化密码加密过程(raw -> md5 ->...)

屎山爆破计划

由于长时间维护,复杂的多个功能区合在一起。导致当前项目虽然已经具备了发布1.0的完整功能,但是代码本身质量依旧存疑。因此这里提出对于Rust端源码的大型重构。

首先,在开始重构前,希望能够提供全套的单元测试与集成测试,以确保在重构之后也能确认功能正确。

  • 占位符:添加 XXX 单元测试/集成测试,测试XXX 功能运作正常
  • 这里添加关于添加、修改、更新单元测试的 pull request

接下来,关于当前整个项目具有的缺陷,也许不同的人具有不同的看法,因此,可以在这里进行讨论。不管是新的issue 或者 在discussions 中发表

最后,开始重构吧。需要知道每一个pull request 对应的 issue

  • PR [ ]:完成Issue [ ] 内容要求的XXX 部分/全部
  • 这里列出所有PR 与 issue 关系,并添加引用

关于前后端“同名不同模”的结构优化

在当前项目中,存在大量的由于前后台的结构不同带来的相同的数据却有着不同的具体结构的情况存在,在很多时候,都需要同时使用2种类似的struct来区分前后端。

在当前情况下,“同名不同模” 有以下的一些问题

  • 命名困难:为了区分模型使用位置,使得模型需要在类型名称中进行区分
  • 冗余代码:相近的类型带来了相近的代码,这使得代码出现大量重复。

改进想法:

  • 使用基于定制trait + 辅助宏的方式对这些代码改进

trait方面

  • ViewModelTrait trait提供关联类型FrontendBackend, 用于分别定位到具体的前端\后端响应模型
  • IntoFrontendTryIntoFrontend 用于从ViewModelTrait 转换到前台类型
  • IntoBackendTryIntoBackend 用于从ViewModelTrait 转换到后台类型

宏方面
提供一个派生宏,提供ViewModelTrait 的自动派生

  • field参数:
    • backend(ignore) / frontend(ignore)/ignore 后端/前端/双端忽视这个字段
    • backend(conv(ty=, err=, conv=)) / frontend(conv(ty=, err=, conv=)) /conv(ty=, err=, conv=) 后台/前台/两者都 提供类型转换,如果给定err将会实现TryIntoXXX, 否则实现IntoXXX

类型转换为 `ActiveModel` 过于冗余

现状

当前情况下

  • Checked 转换为 ActiveModel
  • Checked 更新作用于 ActiveModel
  • Model 转换为 View
    都会带来要将整个Model 的每一个field 手动遍历一次,有一定冗余与重复

如以下接口,就存在比较大重复,并当代码增长后不易于阅读

impl IntoActiveModel<ActiveModel> for CeobeOperationAppVersion {
    fn into_active_model(self) -> ActiveModel {
        let CeobeOperationAppVersion {
            version,
            force,
            last_force_version,
            description,
        } = self;
        let now = get_now_naive_date_time();
        ActiveModel {
            version: Set(version),
            force: Set(force),
            last_force_version: Set(last_force_version),
            description: Set(description),
            create_at: Set(now),
            modify_at: Set(now),
            ..Default::default()
        }
    }
}

希望的改进方式

通过一组 derive macro 提供以上功能的自动派生

  • DeriveToActiveModel attr: model_conv
    • attr[container]
      • target: 转换/更新的目标model
      • preprocessing optional: 在转换前执行的一个或多个操作,可以要求获取0个或者多个原类型field 所有权
        • var_name optional: 预处理的返回结果的变量名称
        • process: 预处理本身,为一个函数
        • update_skip | update_only optional: 当更新时忽略这个预处理过程 | 只有更新时执行
        • requires optional: 需要获取原类型的参数,顺序为process 参数顺序
          • name : 需要的field 名称
          • onwner| mut_ref optional: 默认为获取不可变引用,可以通过指定为 onwner(所有权) 或者 mut-ref(可变引用)被获取所有权的field 会自动ignore
          • require_self optional: processing 需要 &self, 可以指定为 mut 以获得可变引用
      • default_non_exist optional: 不存在的colume 使用default 填充
      • generate_fields k-v pair optional: 生成的fields, 来自于preprocessing
    • attr[field]
      • rename optional: 默认情况,field IdentActiveModel 一致,可以通过该attr 更改指定field
      • project optional: 对原始类型进行转换
      • ignore optional: 视为该field 不存在
      • condition_set optional: 使用条件赋值,当条件满足将Set ,否则无修改(into 使用默认, update 不更改)
        • condition: 判定函数,第一个参数为 该field 原始值所有权,后续参数可以通过requires 定义
        • requires optional : 需要的参数,只能来自 preprocessing 结果,只能获取不可变引用
  • DeriveUpdateActiveModel attr: model_conv 与 DeriveToActiveModel` 使用相同参数,但是生成Update 代码
  • DeriveViewFromModel attr: model_conv 与 DeriveToActiveModel` 使用相同参数,但是生成Model -> View 代码

可能的代码样例

use Model::ActiveModel
#[derive(DeriveToActiveModel,DeriveUpdateActiveModel)]
#[model_conv(
    preprocessing(
       var_name="now",
       update_skip
       process = “get_now_naive_date_time”,
    ),
    preprocessing(
       update_only
       process = “|this|this.now_update(),
       require_self="mut"
    ),
    default_non_exist,
    generate_fields(
        access_time = "now"
    )
)]
struct Checked {
    #[model_conv(
    rename=“foo_name”
    )]
    foo: int,
    #[model_conv(
    project=“Into<String>::into”
    )]
    bar: Version,
}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.