# show-project **Repository Path**: unihao/show-project ## Basic Information - **Project Name**: show-project - **Description**: 开源项目集 · 个人开源项目展示站 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-10-05 - **Last Updated**: 2026-10-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 开源项目集 · 个人开源项目展示站 聚合展示个人开源项目的轻量网站。一期已实现:首页、项目列表与搜索筛选、项目详情、Agent Skills 展示、后台登录、项目/分类/Skill 管理、封面上传与富文本编辑。 **技术栈**:Vue 3 + Vite + Element Plus + Pinia / Express 5 + `node:sqlite` + JWT + multer。 **开源协议**:MIT,见 [LICENSE](./LICENSE)。 数据落在一个 SQLite 文件里,靠 Node 内置的 `node:sqlite` 访问 —— 全项目**没有任何需要编译的原生依赖**,不需要安装 MySQL,`npm install` 就能跑起来。 --- ## 快速开始 前置:Node.js **≥ 23.4**(已在 v24.16.0 验证)。低于此版本 `node:sqlite` 需要额外启动参数。 ```bash npm install # 安装依赖 npm run dev # 同时启动后端(3001) 与 前端(5173) ``` 打开 http://localhost:5173 首次启动会自动建库、建表并播种初始数据,**无需任何手工配置**。默认管理员: | 用户名 | 密码 | |---|---| | `admin` | `admin123` | > **首次登录后请立刻修改密码**:后台右上角 → 修改密码。(服务端启动时会检查是否仍是默认口令并打印告警。) ## 管理后台入口 前台刻意**不放置**后台入口链接,需要自己敲地址进入: ``` 开发:http://localhost:5173/#/admin/login 生产:http://localhost:3001/#/admin/login (换成你的域名) ``` 两个注意点: 1. 本项目是 **hash 路由**,`#` 不能漏。写成 `/admin/login` 会被服务端 SPA fallback 打回首页,看起来像"点了没反应"。 2. 已登录状态下访问登录页会自动跳进后台,反之未登录访问 `/#/admin/projects` 会被拦到登录页,登录成功后回到原来要去的地方。 后台里可以管理项目、分类和 Agent Skills。「新建项目」按钮在项目列表页右上角,不在侧栏菜单。 ## 常用命令 | 命令 | 说明 | |---|---| | `npm run dev` | 并行启动后端(3001) 与前端开发服务器(5173),前端 `/api` 自动代理到后端 | | `npm run build` | 构建前端产物到 `client/dist` | | `npm start` | 生产模式启动 Express,托管 `client/dist` 并提供 REST API,单进程监听 3001 | | `npm test` | 运行后端测试(`node:test`,使用内存数据库,不污染真实数据文件) | | `npm run dev:server` / `npm run dev:client` | 只启动后端 / 只启动前端 | ## 环境变量 复制到项目根目录的 `.env` 后按需修改(可参考 `server/.env.example`)。**全部变量都有默认值,不配置也能正常启动**。 | 变量 | 默认值 | 说明 | |---|---|---| | `PORT` | `3001` | 服务监听端口 | | `JWT_SECRET` | 随机生成 | JWT 签名密钥。不设置时每次服务重启都会生成新的,导致已登录用户被强制登出,**生产环境务必固定** | | `DB_FILE` | `server/data/app.db` | SQLite 数据文件路径 | | `ADMIN_DEFAULT_PASSWORD` | `admin123` | 首次迁移时创建的默认管理员口令 | | `LOGIN_LIMIT` | `20` | 登录接口限流(15 分钟内每 IP 次数)。生产建议调到 `5` | | `API_LIMIT` | `300` | 全接口限流(15 分钟内每 IP 次数) | | `UPLOAD_LIMIT` | `30` | 上传接口限流(1 小时内每 IP 次数) | | `NODE_ENV` | 空(开发态) | 设为 `production` 后进入生产态,见下方「演示数据」 | | `SEED_DEMO` | 跟随 `NODE_ENV` | 强制开关演示数据:`1` 写入 / `0` 跳过,优先级高于 `NODE_ENV` | ## 目录结构 ``` server/ Express REST API src/config.js 配置(环境敏感项做成惰性 getter,便于测试) src/db/ 连接、schema.sql、迁移与种子数据(幂等) src/services/ 业务逻辑,唯一触达数据库的一层 src/controllers/ 取参 → 调 service → 统一响应 src/routes/ 路由,公开路由与 /admin 路由分离 src/middleware/ 鉴权、限流、上传、错误兜底 src/utils/ 密码哈希、富文本清洗、slug、统一响应、日志 data/app.db SQLite 数据文件(已被 git 忽略) uploads/ 上传图片(已被 git 忽略) client/ Vue3 前端 src/views/front/ 首页、项目列表、详情 src/views/admin/ 登录、项目列表、项目编辑、分类管理 src/api/ axios 封装与各模块接口 docs/superpowers/ 设计与实施文档 ``` ## 安全说明 - 密码用 bcrypt 哈希存储,永不明文落库或返回前端。 - 富文本入库前经过白名单清洗,剥离 `