# expertlott **Repository Path**: brenthub/expertlott ## Basic Information - **Project Name**: expertlott - **Description**: 评标专家抽取管理系统是一套面向招投标场景的合规化专家管理平台,满足《招标投标法》及政府采购相关规定对专家抽取的随机性、保密性要求。系统通过随机算法抽取专家、短信通知确认、自动重新抽取、智能风险预警等机制,实现抽取过程透明化、全程留痕可追溯。 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2026-04-20 - **Last Updated**: 2026-06-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 评标专家抽取管理系统 > 随机抽取 · 自动回避 · 全程留痕 · 智能预警 [![Go](https://img.shields.io/badge/Go-1.23-00ADD8?logo=go)](https://go.dev/) [![Vue](https://img.shields.io/badge/Vue-3.4-4FC08D?logo=vue.js)](https://vuejs.org/) [![License](https://img.shields.io/badge/License-Private-gray)]() ## 项目简介 评标专家抽取管理系统是一套面向招投标场景的**合规化专家管理平台**,满足《招标投标法》及政府采购相关规定对专家抽取的随机性、保密性要求。系统通过随机算法抽取专家、短信通知确认、自动重新抽取、智能风险预警等机制,实现抽取过程透明化、全程留痕可追溯。 ## 核心特性 | 特性 | 说明 | |------|------| | **随机抽取** | Fisher-Yates 洗牌算法,确保专家抽取的公平性与随机性 | | **自动回避** | 开标人员关联专家自动排除,避免利益冲突 | | **短信确认** | 阿里云短信通道自动通知专家,超时/拒绝自动重新抽取 | | **智能预警** | 实时风险检测(连续抽中、重复抽取次数、拒绝率等),WebSocket 实时推送 | | **国密加密** | SM4 加密存储身份证号、手机号等敏感信息 | | **RBAC 权限** | 四角色权限体系(管理员/开标人员/专家/审计人员),菜单+数据+字段三级隔离 | | **CAS 单点登录** | 支持 CAS 协议统一认证,兼容企业现有身份体系 | | **Docker 部署** | docker-compose 一键启动 MySQL + 后端 + 前端 | ## 角色权限 | 角色 | 核心职责 | 数据权限 | |:---|:---|:---| | **系统管理员** | 维护专家库、专业类型、用户管理 | 全平台数据(不含抽取操作) | | **评标专家** | 确认/拒绝参与评标、查看个人历史 | 仅个人相关数据 | | **开标人员** | 只读查看专家库、执行专家抽取、查看本人项目 | 全部专家库(只读)、本人开标项目 | | **审计人员** | 查看完整抽取记录、审计预警、配置预警规则、导出报表 | 全部项目记录(只读,敏感信息脱敏) | ## 技术栈 ### 后端 - **Go 1.23** + [Gin](https://github.com/gin-gonic/gin) — HTTP 框架 - [GORM](https://gorm.io/) — MySQL ORM - [JWT](https://github.com/golang-jwt/jwt/v5) — Token 认证 - [国密 SM4](https://github.com/tjfoc/gmsm) — 敏感数据加密 - [gorilla/websocket](https://github.com/gorilla/websocket) — 实时通信 - [excelize](https://github.com/xuri/excelize/v2) — Excel 导入导出 ### 前端 - **Vue 3** + Composition API + TypeScript - [Vite](https://vitejs.dev/) — 构建工具 - [Element Plus](https://element-plus.org/) — UI 组件库 - [Pinia](https://pinia.vuejs.org/) — 状态管理 - [Axios](https://axios-http.com/) — HTTP 客户端 - [ECharts](https://echarts.apache.org/) — 数据可视化 ### 基础设施 - **MySQL 8.0** — 关系型数据库 - **Nginx** — 前端托管 + API 反向代理 - **Docker + Docker Compose** — 容器化部署 ## 快速开始 ### 本地开发 #### 前置条件 - Go 1.23+ - Node.js 18+ - MySQL 8.0 #### 1. 克隆项目 ```bash git clone git@gitee.com:brenthub/expertlott.git cd expertlott ``` #### 2. 启动数据库 ```bash docker compose up -d mysql ``` #### 3. 启动后端 ```bash # 配置数据库连接(编辑 configs/config.yaml) # database: # host: 127.0.0.1 # port: 3306 # user: expertlott # password: expert123 # dbname: expertlott-v5 go run cmd/server/main.go # 后端运行在 http://localhost:8080 ``` #### 4. 启动前端 ```bash cd web npm install npm run dev # 前端运行在 http://localhost:3000,自动代理 API 到后端 ``` ### Docker 部署 ```bash # 配置环境变量(.env 文件) cp .env.example .env vim .env # 构建并启动 docker compose build docker compose up -d # 查看服务状态 docker compose ps # 日志 docker compose logs -f backend ``` 详细部署手册参见 [docs/2026-04-20-生产环境Docker部署手册.md](docs/2026-04-20-生产环境Docker部署手册.md) ## 项目结构 ``` expertlott/ ├── cmd/server/main.go # 后端入口 ├── configs/config.yaml # 配置文件 ├── internal/ │ ├── config/ # 配置加载 │ ├── dto/ # 请求/响应结构体 │ ├── handler/ # HTTP 处理函数 │ ├── middleware/ # 中间件(认证、RBAC、CORS) │ ├── model/ # GORM 模型定义 │ ├── pkg/ # 工具包(cas、sm4、sms、websocket) │ ├── repository/ # 数据访问层 │ ├── router/ # 路由注册 │ └── service/ # 业务逻辑层 ├── migrations/ # SQL 迁移脚本 ├── web/ # Vue 3 前端 │ ├── src/ │ │ ├── api/ # Axios 实例 │ │ ├── layouts/ # 布局组件 │ │ ├── router/ # 路由配置 │ │ ├── stores/ # Pinia 状态管理 │ │ └── views/ # 页面视图 │ │ ├── admin/ # 管理员视图 │ │ ├── bidder/ # 开标人员视图 │ │ ├── expert/ # 专家视图 │ │ └── audit/ # 审计人员视图 │ ├── Dockerfile │ └── nginx.conf ├── docker-compose.yml ├── Dockerfile # 后端容器 └── AGENTS.md # 代码库开发指南 ``` ## 核心业务流程 ``` [管理员] 维护专家库 → 新增/编辑专家、维护专业类型 ↓ [开标人员] 创建抽取任务 → 输入项目信息、专家人数、专业类型 ↓ [系统] 执行随机抽取 → 排除开标人员关联专家 ↓ [系统] 实时风险检测 → 是否触发预警规则? ├─ 是 → 生成预警 → 推送审计人员 └─ 否 → 继续 ↓ [系统] 发送短信通知专家 ↓ [专家] 确认/拒绝参与 ├─ 确认 → 生成最终记录 → 开标人员查看结果 └─ 拒绝/超时 → 自动重新抽取 → 重复风险检测 ``` ## 预警规则 系统内置 4 类预警规则,审计人员可自定义阈值: | 规则类型 | 说明 | 默认阈值 | |:---|:---|:---| | 专家连续抽中 | 某专家连续 N 个项目被抽中 | N=2 | | 重新抽取次数过多 | 单个项目重新抽取超过 N 次 | N=3 | | 回避率异常 | 专家拒绝/超时率超过 N% | N=50% | | 专业分布不均 | 某专业被抽中占比超过 N% | N=80% | ## 配置说明 关键配置项见 `configs/config.yaml` 或 `.env` 环境变量: | 配置项 | 说明 | 示例 | |:---|:---|:---| | `database.*` | MySQL 连接配置 | host, port, user, password, dbname | | `jwt.secret` | JWT 签名密钥 | 请修改为 256 位随机字符串 | | `cas.serverUrl` | CAS 服务器地址 | `https://cas.company.com` | | `encrypt.sm4Key` | SM4 加密密钥(32位十六进制) | `0123456789abcdef0123456789abcdef` | | `sms.aliyun.*` | 阿里云短信配置 | accessKeyId, accessKeySecret | > **安全提醒**: 生产环境请勿使用默认密钥,敏感信息请通过 `.env` 或环境变量管理,不要提交到版本控制。 ## 常用命令 ### 后端 ```bash go run cmd/server/main.go # 开发模式启动 go build -o server cmd/server/main.go # 构建二进制 go fmt ./... # 代码格式化 go test -v ./internal/... # 运行测试 ``` ### 前端 ```bash cd web && npm run dev # 开发服务器 cd web && npm run build # 类型检查 + 构建 cd web && npm run preview # 预览构建产物 ``` ### Docker ```bash docker compose up -d # 启动所有服务 docker compose down # 停止服务 docker compose logs -f backend # 查看后端日志 docker compose build --no-cache # 无缓存重新构建 ``` ### 数据备份 ```bash docker exec expertlott-mysql mysqldump -uexpertlott -pexpert123 expertlott-v5 > backup.sql ``` ## 文档 - [产品需求文档 (PRD)](docs/expertlott-prd.md) - [设计文档](docs/expertlott-design.md) - [生产环境 Docker 部署手册](docs/2026-04-20-生产环境Docker部署手册.md) ## 浏览器支持 | 浏览器 | 版本 | |:---|:---| | Chrome | 90+ | | Edge | 90+ | | Firefox | 88+ | | 最小分辨率 | 1366 × 768 |