面向建模阶段 BIM 工程师的问题管理平台 —— 单团队私有化部署,并提供 API / MCP 接口,让 AI 能批量化处理问题。
状态:开发中。 第一版(MVP)目标 = 7 个页面 · 14 张表 · 58 个接口端点;当前数据层与设计文档已就绪,接口按批次实现中。
| 层 | 选型 |
|---|---|
| 框架 | Nuxt 4(全栈 + SPA,ssr: false) |
| 界面 | Nuxt UI v4 |
| 数据库 | SQLite(默认,零配置) · MySQL(多人共用同一开发库时用) |
| ORM | Drizzle ORM —— 走 Node 内置 node:sqlite |
| 鉴权 | nuxt-auth-utils(sealed 加密 Cookie 会话) |
| 运行时 | Node.js 22 + pnpm 11 |
为什么刻意不引任何原生依赖:使用与部署这个平台的人是 BIM 工程师,不是运维 —— 装不上 = 平台等于不存在。所以禁用一切需要本地编译的模块(如 better-sqlite3),SQLite 一律走 Node 内置的 node:sqlite。
前置:Node.js ≥ 22 + pnpm 11。全程零原生依赖,不需要编译工具链。
# 1 · 克隆 + 依赖
git clone <仓库地址> && cd bim-issue-platform
pnpm install
# 2 · 配置(.env 已在 .gitignore 中,不会入库)
cp .env.example .env
⚠️ 然后手改 .env 两行(.env.example 是按内部 MySQL 开发库写的模板,默认值不适合单机试用):
DATABASE_CLIENT=sqlite # ← 必须改成 sqlite
NUXT_SESSION_PASSWORD=<一个 ≥32 字符的随机串> # ← 替换占位符
# 生成随机串:node -e "console.log(require('crypto').randomBytes(32).toString('base64url'))"
# 3 · 建库 —— 建表后自动创建默认管理员(admin / admin5555,幂等)
pnpm db:init # SQLite 建到 data/bim_issue.db(该目录不入库,克隆后本来就没有)
# 3b · (可选)灌演示数据:6 个角色账号 + 4 个虚构项目 + 预置问题
pnpm db:seed-demo # 先加 -- --dry-run 可预览;演示账号口令统一 Demo@2026
# 💡 仓库自带演示库 data/bim_issue_demo.db(已灌好上面的数据)——
# 想直接带数据试跑:在 .env 加 DATABASE_FILE=./data/bim_issue_demo.db,跳过第 3/3b 步
# 4 · 起服务
pnpm dev # http://localhost:5555
# 5 · 登录
# 默认管理员:admin / admin5555(库里已有平台管理员则跳过创建)
# ⚠️ 首次登录后请立即改密。忘记口令:pnpm user:create --username admin --reset-password
# 想自定义首个管理员(换账号名 / 口令):用下面这条,交互式录入、口令不回显
pnpm user:create
多人共用一个 MySQL 开发库(内部同学):
.env保留DATABASE_CLIENT=mysql并填好DATABASE_HOST/NAME/USERNAME/PASSWORD,建库改用pnpm db:init:mysql,其余步骤相同。
| 命令 | 作用 |
|---|---|
pnpm dev · build · preview |
开发 / 构建 / 预览 |
pnpm lint · typecheck |
代码规范 / 类型检查 |
pnpm db:generate[:mysql] |
由 schema.ts 生成迁移 SQL |
pnpm db:migrate |
执行迁移 |
pnpm db:check |
对拍四份表结构定义(改了表结构必跑) |
pnpm db:seed-tags |
给项目补灌 41 项标准分类(--project <ID> / --all / --dry-run;只补缺、不改不删) |
pnpm user:create |
建账号 / 重置口令(--reset-password 改已存在账号的口令);--dry-run 可先看会做什么 |
pnpm doc:check |
全项目禁用字符自检 |
pnpm check:all |
一次跑完:类型检查 + 代码规范 + 禁用字符 + 表结构对拍 |
用 git 钩子做本地门禁(配置在 .githooks/,仓库已设 core.hooksPath):
| 时机 | 跑什么 | 耗时 |
|---|---|---|
提交前 pre-commit |
禁用字符自检 + 四份表结构定义对拍 | 秒级 |
推送前 pre-push |
类型检查 + 代码规范 + 上面两项(即 pnpm check:all) |
数十秒 ~ 2 分钟 |
想手动跑完整检查:pnpm check:all。紧急情况下可以 git commit --no-verify / git push --no-verify 跳过(不推荐)。
为什么不用云 CI? Gitee Go 的 Node 构建插件基础镜像是 CentOS 7.6、Node 最高约 15 ~ 17,而本项目要求 Node 20+(Nuxt 4)与 22(
node:sqlite)—— 跑不起来。故把门禁放在本地:效果等效,而且比云 CI 拦得更早(提交时就拦,不用等推上去)。
⚠️ 改了
server/database/schema*.ts的写法后,务必跑一次pnpm db:check。 该脚本用文本解析读schema.ts,对写法敏感 —— 已知踩点:(t) => [...]这种回调若被改写成别的形式,索引会被静默漏读(表现为「整表索引凭空消失」)。脚本已放宽为兼容(t) =>与t =>两种写法,但新增写法仍可能不被识别。
单仓库、多角色并行开发,故目录所有权先划清:
| 目录 | 归属 | 权限 |
|---|---|---|
app/(页面 / 组件 / 组合式函数 / 工具) |
前端 | 只由前端改 |
server/(接口 / 鉴权 / 数据库) |
后端 | 只由后端改 |
shared/ |
前后端共用 | 只能新建、不能删除 |
scripts/ |
待定 | —— |
审查方对整个仓库只读:审查意见只写进自己新建的 Markdown 文件,不改任何既有文件。
设计文档统一放在 docs/(根目录只留本 README)—— 接口字段 / 错误码 / 路径一律以《接口契约》为唯一事实来源:
文档(docs/ 下) |
内容 |
|---|---|
1_需求与进度.md |
决策日志(只追加) |
2_业务规则.md |
权限矩阵 · 状态机 · 事务与一致性 |
3_数据库设计.md |
表结构(真源是 server/database/schema.ts) |
4_页面设计.md |
页面 / 交互 / 路由 |
5_1前端架构.md |
目录所有权 · 取数 · 判权 · 状态管理 |
5_2前端现状与待办.md |
前端进度与待办(前端负责人维护) |
6_1接口清单.md |
58 端点速查 + 实现状态核对 |
6_2接口契约.md |
前后端并行开发的唯一接口依据 |
7_1评审建议.md |
历次评审结论 |
7_2校审建议.md |
审查人意见(审查人维护) |
8_演示账号清单.md |
演示账号与演示项目角色矩阵 |
数据库ER图.drawio |
实体关系图(用 draw.io / VS Code Draw.io 插件打开;唯一有效版本) |
技术栈版本文档/ |
依赖官方文档快照(nuxt / vue / drizzle / nuxt-ui / zod / vueuse …,约 14 MB),离线查阅用。⚠️ 第三方文档,仅内部使用 —— 仓库转公开前必须删除该目录(门禁已排除,不参与 lint 与字符自检) |
文档改过名(2026-09-23):原先 7 份文档在根目录、文件名前缀为
BIM问题管理平台_。老文档里的历史记录仍可能用旧名,对照关系:BIM问题管理平台_需求与进度.md→docs/1_需求与进度.md·_业务规则→2_业务规则·_数据库设计→3_数据库设计·_页面设计→4_页面设计·_前端架构→5_1前端架构·_接口契约→6_2接口契约·_评审建议→7_1评审建议·ER图-2.drawio→docs/数据库ER图.drawio。
01-介绍 - 02-入门 - 03-配置 - 04-用户指南 - 05-架构 - 06-数据库 - 07-API - 08-开发 - 09-设计决策
LICENSE)