# 项目管理模块 - RMDC-project-management

1. 单个k8s-namespace作为一个项目
2. 本模块是rmdc项目的核心模块

## 项目权限
1. 项目的权限颗粒度
   1. 查看权限
      1. 用户可以查看自己拥有权限的所有项目的列表
      2. 超级管理员能够查看全部内容
      3. 数据权限，分配权限需要精细到项目详情的特定模块
   2. 新建（创建）权限
      1. 只有超级管理员可以创建项目信息填写工单
   3. 修改（编辑）权限
      1. 项目详情填写人，自动具备修改权限
      2. 由于有工单系统
         1. 用户不能直接修改项目信息,只能发起修改工单
         2. 具备查看权限的用户具备修改权限
         3. 超级管理员可以查看全部项目信息，具备修改权限
   4. 删除权限
      1. 非超级管理员用户不具备删除权限
   5. 导出权限
      1. 具有查看权限的用户可以导出项目信息
2. 项目创建权限
   1. 项目创建只能由超级管理员进行
   2. 项目有唯一字段（项目名称 namespace命名空间），需要判定数据库是否存在该项目
3. 用户/管理
   1. 用户端能够查看部分内容
   2. 超级管理员能够查看全部内容
   3. 管理员能够查看部分内容
      1. 管理员可以授权自己拥有权限的内容给普通用户
   4. 访问控制列表（ACL）由管理员授权，遵循项目的颗粒度进行授权

### 项目权限管理分配页面
1. 只有超级管理员可以访问
2. 后端接口只有超级管理员具备权限
   1. 权限检验
   2. 审计日志记录
3. 超级管理员可以为特定用户分配项目权限
   1. 分配权限只有查看权限，编辑权限（通过工单系统审批）
   2. 分配权限可以按照项目颗粒度进行分配
   3. 分配权限可以按照用户颗粒度进行分配
   4. 分配权限需要精细到 项目详情的特定模块（数据权限）
      1. 项目基本信息模块
      2. 部署业务模块
      3. 部署环境模块
      4. 部署中间件模块
      5. 项目授权模块（只有超级管理员具备权限）
4. 用户系统使用 rmdc-user-auth 的用户系统
5. 权限分配管理 使用 rmdc-user-auth 模块
6. 权限分配需要记录审计日志
7. 审计日志使用 rmdc-audit-log 模块


## 项目管理的生命周期
1. 项目创建
   1. 超级管理员填写项目基本信息，分派给项目填写人
      1. 项目处于 未发布状态（草稿状态）
   2. 项目填写人填写项目信息
   3. 项目填写人提交项目信息给超级管理员审核
   4. 超级管理员审核项目信息
   5. 超级管理员审批通过之后
      1. 项目信息作为master主分支
      2. 项目处于已发布状态
2. 项目编辑
   1. 非超级管理员用户可以编辑项目信息
   2. 非超级管理员用户可以发起修改工单
      1. 项目对于 非超级管理员用户 处于编辑状态
   3. 非超级管理员用户可以在超级管理员审批之前 撤销修改工单
      1. 项目对于 非超级管理员用户 处于已发布状态
   4. 超级管理员审批通过之后
      1. 项目对于 非超级管理员用户 处于已发布状态
   5. 超级管理员审批拒绝之后
      1. 项目对于 非超级管理员用户 处于编辑状态
3. 项目删除
   1. 只有超级管理员 可以修改项目状态为删除状态
   2. 项目采用软删除的策略

### 项目详情页面与项目详情工单之间的关系
1. 项目详情工单分为如下的两种
   1. 项目创建时候，项目详情的填写工单
   2. 项目正常过程中，项目详情的编辑工单
2. 项目详情工单和项目详情页面之间需要互相能够跳转
   1. 项目详情填写工单是唯一的，只能同时存在一个项目详情填写工单
   2. 超级管理员的项目详情编辑工单不是唯一的，可以同时存在多个项目详情编辑工单
   3. 对于非超级管理员，项目详情编辑工单是唯一的，只能同时存在一个项目详情编辑工单
3. 超级管理员的非正式发布状态的项目详情页面，只能跳转至一个项目详情填写工单
4. 超级管理员的正式发布状态的项目详情页面，可以跳转至多个项目详情编辑工单

## 项目查看
1. 所有项目页面
   1. 用户可以查看自己拥有权限的所有项目的列表
   2. 支持列表显示，卡片显示
   3. 点击项目之后，进入项目详情页面
2. 项目详情页面
   1. 展示项目概览信息
   2. 具备查看权限，可以进行页面信息修改提交,发起修改工单,修改工单需要超级管理员审核
   3. 项目信息导出
      1. 支持按照YAML格式模板 导出项目信息
3. 项目模块详情页面 
   1. 部署业务信息、部署环境信息、部署中间件信息属于特定模块
   2. 作为TAB页签显示各个模块
   3. 授权信息页面
      1. 只有超级管理员可以访问
      2. 后端接口只有超级管理员具备权限
         1. 权限检验
         2. 审计日志记录
      3. 具体功能详见 项目授权管理

### 项目详情页面
1. 查看状态
   1. 默认状态
   2. 项目详情页面有导出按钮，点击之后可以导出项目的详情
   3. 项目详情页面的字段具备快捷粘贴的功能
2. 编辑状态
   1. 项目详情页面显示编辑按钮，点击之后进入编辑状态
   2. 编辑状态没有导出按钮
   3. 编辑状态具备 保存草稿 提交审核 放弃编辑的按钮
   4. 保存草稿按钮，触发项目详情的草稿保存功能，保存至数据库中
   5. 项目详情的编辑草稿 应该与非超级管理员用户产生关联
   6. 编辑状态，应该能够类似GIT DIFF显示草稿与正式版本的差异
      1. 在编辑页面，需要定期获取最新的版本
   7. 放弃编辑按钮，触发项目详情的草稿删除功能，删除数据库中的草稿，退出编辑状态
   8. 提交审核按钮，触发项目详情的草稿提交审核功能，可以复用项目详情填写工单流程（TODO 考虑与rmdc-work-procedure模块进行整合）
   9. 字段校验
      1. IP地址字段
         1. 公网IP地址 内网IP地址 如果不为空值，需要进行IP校验
         2. IP的空值处理，前端显示默认空值填充为 无
      2. 命名空间字段
         1. 前端创建项目时候，命名空间名称必须符合RFC 1123 DNS标签规范，具体要求包括：
            1. 不能超过253个字符
            2. 只能包含小写字母、数字以及'-'和'.'字符
            3. 必须以字母开头
            4. 必须以字母数字结尾
         2. 前端显示默认空值填充为 无
   10. 密码字段
      1. 项目填写人 需要填写密码字段
      2. 数据库加密存储，应该使用项目的TierOneScret进行加密
   11. 部署人姓名
      1. 非超级管理员也可以通过用户接口查找到系统中的用户 /api/user
      2. 部署人姓名字段，用于显示部署人姓名
3. 超级管理员页面的项目详情页面
   1. 超级管理员的项目详情页面，默认显示主线版本分支的内容
   2. 超级管理员可以直接修改项目的master主分支，直接修改入库，不需要工单审批
   3. 超级管理员的项目详情页面，具备查看所有版本的功能
      1. 超级管理员可以查看所有版本的项目详情
      2. 可以查看页面的修订历史，类似GIT的历史提交记录
      3. 每一个版本可以查看到 修改的内容
   4. 超级管理员的项目详情页面，可以跳转至工单详情页面
      1. 超级管理员可以跳转至工单详情页面，查看与此项目关联的工单内容
   5. 超级管理员的项目详情页面，可以查看到授权信息模块的内容
4. 非超级管理员左侧导航栏 显示 项目管理
   1. 默认展示其具备的全部访问权限的项目列表
      1. 支持列表、卡片显示
   2. 点击项目可以进入项目详情页面

## 项目创建

### 项目创建的流程说明
1. 项目详情展示与填写类似于GIT的分支
2. 项目查看，是由超级管理员审核维护的master主分支
4. 项目创建流程，超级管理员分配一个用户进行项目信息登记
5. 当项目初始信息被登记完成，超级管理员审批通过之后，项目信息作为初始的master主分支
6. 项目编辑，是每个用户都具备的临时分支（每个用户都具备草稿），然后提交审核合并入master主分支（需要被超级管理员审核）

### 项目信息登记页面
1. 项目创建只能由超级管理员进行
   1. 填写必要的信息，不需要考虑空值
   2. 考虑到数据库字段限制, 数据库不为空字段,填充默认值
2. 项目创建中,需要按照管理权限，分配给特定的用户进行信息登记
   1. 特定用户填写时候, 前端自动过滤掉默认值
3. 支持草稿功能，项目信息填写比较耗时，需要支持草稿功能
4. 必填字段
   1. 填满才可以提交项目信
   2. 不填满只能保存草稿
5. 信息审核
   1. 普通用户填写项目信息之后,需要超级管理员审核修改项目信息认证

### 项目详情填写审批工单
1. 详情见 rmdc-work-procedure
2. 当前阶段已经实现

### 项目详情填写页面
1. 复用 项目详情页面 的编辑状态

#### 特殊字段说明
1. 前端创建项目时候，命名空间名称必须符合RFC 1123 DNS标签规范，具体要求包括：
   1. 不能超过253个字符
   2. 只能包含小写字母、数字以及'-'和'.'字符
   3. 必须以字母开头
   4. 必须以字母数字结尾
2. 省份和城市字段 请参照[3-china-province-city.md](3-china-province-city.md)解析
   1. 后端和前端都应该维护一份枚举表
   2. 前端项目创建时，后端应该校验相应的省份和城市
   3. 前端应该实现级联选择

#### 项目基本信息结构体
1. 项目名称
2. 命名空间（唯一）
3. 项目ID project_id （唯一）
4. 省份 （枚举 中国的省份是固定的）
5. 城市（枚举 中国的城市是固定的）
6. 行业组人员
7. 行业组人员电话
8. 项目性质 （科研、测试、试用、市场化、二级平台）
9. 项目信息认证 (草稿,正式)
   1. 由超级管理员修改
10. 部署业务结构体
11. 部署环境结构体
12. 部署中间件结构体

#### 项目部署业务结构体
1. 部署人姓名
2. 部署人电话
3. 部署开始时间
4. 部署完成时间
5. 部署系统的版本
6. 部署系统（business老行业平台 fly-control新飞控平台 supervisor监管平台）
7. 业务主要入口
8. 系统超级管理员用户
9. 系统超级管理员密码（需要加密存储）

#### 项目部署环境结构体
1. 主机信息结构体 （与rmdc-watchdog-common中保持一致）
   1. 此部分信息理论来自 rmdc-watchdog -> rmdc-exchange-hub 上报
   2. 新增字段
      1. 公网IP
      2. 能够访问公网
      3. SSH端口
      4. SSH用户名
      5. SSH密码 （需要加密存储）
      6. 主机角色（master worker storage）
2. 网络环境 （完全内网、单主机公网、全访问公网）
3. 主要公网IP地址
4. 域名URL
5. 是否开启SSL
6. 主机管理方式（堡垒机、白名单、）
7. 管理后台URL
8. 管理后台用户名
9. 管理后台密码（需要加密存储）
10. 主机台数
11. 主机CPU总数
12. 主机CPU型号
13. 主机内存总大小
14. 主机存储总大小

#### 项目部署中间件结构体
1. MySQL结构体
2. Redis结构体
3. EMQX结构体
4. MINIO结构体
5. InfluxDB结构体
6. Nacos结构体
7. K8S Dashboard结构体
8. 上述结构体的字段均有如下字段
   1. 公网IP
   2. 公网端口
   3. 内网IP
   4. 内网端口
   5. k8s访问地址
   6. k8s访问端口
   7. 超级管理员用户名
   8. 超级管理员密码 （需要加密存储）


#### 项目授权信息结构体
1. 项目一级TOTP授权密钥
2. 一级授权允许时间偏移
3. 开启TOTP验证
4. 项目二级TOTP授权密钥
5. 是否开启授权
6. 授权类型: permanent/time
7. 授权有效期(天)
8. 授权时间
9. 撤销授权时间

## 项目授权功能
1. 集成之前 rmdc-wathchdog-center部分的功能
2. 需要与 rmdc-exchange-hub rmdc-watchdog 交互
1. 只有SuperAdmin具备此权限
2. 接收来自 rmdc-exchange-hub 关于项目注册的信息
    1. 项目注册实际来自rmdc-watchdog
    2. 项目信息应该持久化保存
3. 能够对全部项目进行授权
    1. 正常情况是从rmdc-exchange-hub接收的注册项目
    2. 处理来自 rmdc-exchange-hub 的授权信息
    3. 调用RMDC-watchdog-center的授权接口
    4. 存储项目的授权文件信息
    5. 授权时间也可以进行管理
4. 有特殊的项目,无法访问公网
    1. 可以手动添加离线项目的相关信息
    2. 可以离线进行项目授权
5. 能够取消对一个项目的授权
    1. 同样是通过rmdc-exchange-hub的在线方式
    2. 可以离线取消项目授权

