Repository files navigation

SkillGo

SkillGo·技能到家是一个面向本地生活服务、活动执行和即时履约场景的前后端一体化演示项目。项目提供技能者展示、需求发布、订单履约跟踪、聊天沟通、评价与信用分、AI 客服、LBS 热区展示以及管理员后台,适合课程设计、原型演示、功能验证和二次开发。

本仓库当前同时包含:

  • React + Vite 前端应用
  • Node.js + Express 后端 API
  • SQLite 本地数据库
  • Node:test + supertest 接口测试

项目亮点

  • 首页集成 3D 地球、热区地图、标签云、即时订单播报和 Flash Squad Lab 编队模块
  • 技能广场支持按标签、地点、专长快速筛选,并可直接发起联系
  • 发布需求后会自动匹配技能者,并生成完整的订单详情与履约节点
  • 订单详情支持双向评价,评价结果会实时影响双方信用分
  • 聊天中心支持一对一会话,后端会去重重复会话
  • AI 客服可读取数据库内容回答平台问题,支持管理员自定义 API 地址、Key、模型和系统提示词
  • AI 客服在上游模型不可用时会自动回退到常见可用模型
  • 管理后台支持首页文案、用户、技能者、订单流程和 AI 配置管理
  • 支持深色 / 浅色主题切换

技术栈

前端

  • React 18
  • Vite 5
  • TypeScript
  • React Router DOM 6
  • Framer Motion
  • Three.js

后端

  • Node.js ESM
  • Express 4
  • SQLite + sqlite3

测试

  • Node:test
  • supertest

主要功能

1. 首页

首页不是简单的静态落地页,而是一个带业务状态的总览面板,包含:

  • Hero 区域和平台核心指标
  • EarthGlobe 3D 视图,展示技能者点位和订单履约点位
  • LbsExplorer 热区地图,接入高德 JS API 2.0,失败时自动降级为静态热区模式
  • 标签云和即时订单动态
  • Flash Squad Lab 任务编队器,根据最新需求和技能者数据生成“主力位 + 支持位 + 执行建议”
  • 最新雇佣需求列表
  • 右下角快捷入口,包括聊天、发布需求、AI 客服等

2. 技能广场与技能者主页

  • /providers 展示技能者卡片列表
  • 支持按关键词搜索名称、专长、地点、标签
  • 技能卡片支持一键联系
  • /providers/:id 展示技能者详情页
  • 详情页使用 ProfileMirror 聚合展示信用分、近期评价和技能档案

3. 发布需求与自动匹配

  • /requests/new 支持创建新需求
  • 表单字段包括雇佣者、需求主题、服务地点、预算、期望时间、优先标签
  • 提交后后端自动匹配一个技能者并生成订单详情
  • 订单会自动带出履约流程节点

4. 订单详情、履约和评价体系

  • /requests/:id 展示订单概览、匹配技能者、履约时间线
  • 同时展示雇佣者与服务者的信用分
  • 支持双向评价
  • 每次评价都会实时回写到被评价人的信用分
  • 技能者主页会同步显示近期评价和信用信息

5. 聊天中心

  • /chat 支持雇佣者和技能者一对一沟通
  • 通过技能卡片“一键联系”进入会话
  • 后端会对相同双方的直接会话做幂等处理
  • 仓库启动时也会尝试合并历史上重复生成的会话

6. AI 客服

  • /ai-support 提供对话式 AI 客服
  • AI 会读取数据库中的技能者、订单和站点配置上下文来回答问题
  • 管理员可配置:
    • API URL
    • API Key
    • 模型名
    • System Prompt
  • 支持只填写基础地址,例如 https://api.openai.com/v1,后端会自动补成 /chat/completions
  • 支持清空会话
  • 支持显示当前登录昵称;未登录时显示“我”
  • 当前配置模型不可用时,后端会自动回退尝试:
    • gpt-4o-mini
    • gpt-4.1-mini
    • gpt-4.1

7. 管理后台

  • /admin 仅管理员可见
  • 提供分区式控制台,包含:
    • 概览
    • 首页配置
    • 新增雇佣者 / 技能者
    • 用户管理
    • 技能者管理
    • 订单与流程管理
    • AI 配置管理

页面与路由

路由说明
/首页总览
/login登录 / 注册
/providers技能广场
/providers/:id技能者详情页
/requests/new发布需求
/requests/:id订单详情、履约、评价
/chat聊天中心
/ai-supportAI 客服
/admin管理后台

项目结构

SkillGo/
├─ public/ # 静态资源
├─ server/
│ ├─ data/ # SQLite 数据库默认目录
│ ├─ tests/ # 后端接口测试
│ ├─ app.js # Express 应用与 API 路由
│ ├─ db.js # 数据库、种子数据、Repository
│ └─ index.js # 后端启动入口
├─ src/
│ ├─ components/ # 通用 UI 组件
│ ├─ data/ # 前端兜底数据
│ ├─ hooks/ # Auth/useAsyncData 等 hooks
│ ├─ layouts/ # 首页/详情页布局组件
│ ├─ pages/ # 路由页面
│ ├─ services/ # API 请求封装
│ ├─ styles/ # 全局样式
│ ├─ types/ # TypeScript 类型定义
│ ├─ App.tsx # 路由注册
│ └─ main.tsx # 前端入口
├─ .storybook/ # Storybook 配置
├─ package.json
├─ vite.config.ts
└─ README.md

环境要求

建议环境:

  • Node.js 20+,最低建议 18+
  • npm 9+

项目使用了:

  • ESM
  • 顶层 await
  • 原生 fetch

因此不建议使用过旧的 Node 版本。

快速开始

1. 安装依赖

npm install

2. 可选:配置本地地图环境变量

在项目根目录创建 .env.local

VITE_AMAP_KEY=你的高德 Web Key
VITE_AMAP_SECURITY_JS_CODE=你的高德安全密钥

如果不配置,地图模块会自动退化为静态热区模式,页面仍可正常使用。

3. 启动后端

npm run dev:server

默认监听:

  • API: http://localhost:3001

4. 启动前端

npm run dev

默认监听:

  • Vite 开发端口: http://localhost:4173

5. 同时启动前后端

npm run dev:full

环境变量

前端变量

变量名说明默认值
VITE_AMAP_KEY高德地图 Web Key
VITE_AMAP_SECURITY_JS_CODE高德地图安全密钥

后端变量

变量名说明默认值
PORT后端服务端口3001
SKILLGO_DB_PATHSQLite 数据库文件路径server/data/skillgo.db

默认账号

项目内置了演示账号,登录页也会直接提示:

角色账号密码
高级管理员adminadmin123
雇佣者customercustomer123
技能者provider-erprovider123

同时前端也支持注册:

  • customer
  • provider

注册成功后会自动登录。

默认演示数据

首次启动后端时会自动创建数据库并写入种子数据,包括:

  • 技能者
  • 雇佣需求
  • 首页站点内容
  • 管理员与普通用户账号
  • AI 设置默认值

当前默认数据量大致为:

  • 10+ 技能者
  • 10+ 雇佣需求

重要的数据持久化说明

当前仓库更偏“演示 / 课程项目”模式,数据库种子在启动时会重复执行。

这意味着:

  • 内置的首页文案、内置用户、内置技能者、内置订单会在启动时被种子数据重新 upsert
  • 你在后台修改这些“内置演示数据”后,重启服务可能被种子覆盖
  • AI 设置表使用 ON CONFLICT DO NOTHING,管理员保存后的 AI 配置会保留
  • 聊天消息、评价记录、运行中新创建的数据会写入 SQLite 文件中

如果你准备把项目用于长期运行,建议下一步把“只在数据库首次创建时 seed”改成更标准的迁移/初始化模式。

可用脚本

命令说明
npm run dev启动前端开发服务器
npm run dev:server启动后端 API
npm run dev:full同时启动前后端
npm run build构建前端生产包
npm run preview预览前端构建产物
npm run start启动后端生产服务
npm run test:server运行后端接口测试
npm run storybook启动 Storybook
npm run build-storybook构建 Storybook

API 概览

以下为主要接口分组。

认证

  • POST /api/auth/login
  • POST /api/auth/register
  • GET /api/auth/me

面板与技能者

  • GET /api/dashboard
  • GET /api/providers
  • GET /api/providers/:id

需求与订单

  • GET /api/requests
  • GET /api/requests/:id
  • POST /api/requests
  • POST /api/requests/:id/reviews

聊天

  • GET /api/chat/conversations
  • POST /api/chat/conversations
  • GET /api/chat/conversations/:id/messages
  • POST /api/chat/conversations/:id/messages

AI 客服

  • GET /api/ai/settings
  • PUT /api/ai/settings
  • POST /api/ai/support

管理后台

  • GET /api/admin/snapshot
  • PUT /api/admin/site-content
  • POST /api/admin/users
  • PUT /api/admin/users/:id
  • DELETE /api/admin/users/:id
  • POST /api/admin/providers
  • PUT /api/admin/providers/:id
  • DELETE /api/admin/providers/:id
  • PUT /api/admin/requests/:id
  • DELETE /api/admin/requests/:id

核心业务规则

1. 评价与信用分

  • 评分必须是 1 到 5 的整数
  • 评论内容必填,最多 280 字
  • 评价成功后会立即更新被评价人的信用分
  • 订单详情页与技能者详情页会同步展示最新评价信息

2. 聊天会话去重

  • 同一对用户直接发起会话时,后端会复用已有会话
  • 仓库启动时也会尝试合并重复的历史直聊会话

3. AI 客服上下文

AI 客服不会只做纯文本聊天,而是会在请求时读取数据库上下文,主要包括:

  • 相关技能者
  • 相关订单
  • 平台站点配置

如果 AI 上游返回的是不支持当前模型的错误,后端会自动回退常见模型,并在全部失败时给出更友好的中文提示。

4. 地图降级策略

若高德地图 SDK 加载失败、Key 不可用、域名未加白名单或运行时不可用:

  • 页面会显示静态热区模式
  • 不会阻塞首页其余业务功能

测试说明

运行:

npm run test:server

当前后端测试覆盖了以下核心场景:

  • 仪表盘和种子数据可用
  • 发布需求能自动生成订单详情和履约事件
  • 同一对用户创建聊天会话保持幂等
  • 评价会回写信用分
  • AI 配置保存成功
  • AI 请求可带数据库上下文
  • AI 模型不可用时可自动回退
  • 所有回退模型不可用时返回友好提示
  • 仓库启动时可合并重复会话
  • 管理员可新增雇佣者与技能者
  • 请求表单校验有效

生产部署

推荐部署方式

推荐采用“前端静态站点 + Node API + Nginx 反向代理 + SQLite”的方式。

原因:

  • 前端构建产物是 dist
  • 后端 npm run start 只启动 API,不负责托管前端静态文件
  • 前端生产请求使用相对路径 /api
  • 因此生产环境需要 Web 服务器将 /api 代理到 Node 服务

通用部署步骤

  1. 安装依赖
npm install
  1. 配置生产环境变量
# 前端
VITE_AMAP_KEY=你的高德 Key
VITE_AMAP_SECURITY_JS_CODE=你的高德安全密钥
# 后端
PORT=3001
SKILLGO_DB_PATH=/your/path/skillgo.db
  1. 构建前端
npm run build
  1. 启动后端
npm run start
  1. 用 Nginx 托管 dist,并将 /api 反代到后端

Nginx 配置示例

location / {try_files$uri$uri/ /index.html;}location /api/ {proxy_passhttp://127.0.0.1:3001;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}

宝塔部署建议

如果你使用宝塔面板,推荐按下面方式部署:

  1. 安装 Nginx
  2. 安装 Node.js 管理器PM2 管理器
  3. 上传项目到服务器
  4. 执行:
cd /www/wwwroot/SkillGo
npm install
npm run build
  1. 在宝塔创建 Node 项目
  • 项目目录:项目根目录
  • 启动命令:npm run start
  • 端口:3001
  1. 配置后端环境变量
PORT=3001
SKILLGO_DB_PATH=/www/wwwroot/skillgo-data/skillgo.db
  1. 新建网站,根目录指向:
/www/wwwroot/SkillGo/dist
  1. 在站点 Nginx 配置里加入上面的 //api/ 规则

  2. 如果要启用地图:

  • 到高德开放平台配置正式域名白名单
  • 填写 VITE_AMAP_KEY
  • 填写 VITE_AMAP_SECURITY_JS_CODE

常见问题

1. 首页地图只显示静态热区

通常是以下原因之一:

  • 未配置 VITE_AMAP_KEY
  • 未配置 VITE_AMAP_SECURITY_JS_CODE
  • 高德控制台域名白名单未配置
  • 当前网络无法加载高德 SDK

2. 生产环境页面能打开,但接口 404

通常说明:

  • Nginx 没有把 /api 反代到 Node 服务
  • 或后端没有启动成功

3. AI 客服提示模型不可用

请检查管理员后台中的模型名是否为渠道真实支持的名称。当前系统会优先尝试管理员填写的模型,并在失败时自动回退常见模型。

4. npm run start 之后前端页面打不开

这是正常的。npm run start 只启动后端 API,不会直接提供 Vite 打包后的前端静态资源。生产环境需要 Nginx 或其他静态服务器托管 dist

5. Windows 终端看到中文乱码

如果你在 Windows PowerShell / CMD 中看到中文乱码,通常是终端编码问题,不一定代表源码本身损坏。建议使用 UTF-8 终端或 Windows Terminal,并确认编辑器以 UTF-8 保存文件。

6. 后台修改的数据重启后丢失

请先确认你修改的是不是“内置种子数据”。当前种子逻辑会在启动时重复 upsert 一部分演示数据,详见上方“重要的数据持久化说明”。

后续优化建议

如果你准备把这个项目从课程演示继续推进到更正式的应用,建议优先做这些改造:

  • 将数据库 seed 改成只在首次初始化时执行
  • 为后端补充迁移脚本
  • 将 SQLite 切换为 MySQL / PostgreSQL
  • 将鉴权改为更完整的会话或 JWT 体系
  • 为聊天加入轮询或 WebSocket
  • 为 AI 客服增加模型列表与健康检测
  • 增加 CI、Lint、格式化和端到端测试

License

本项目包含 LICENSE 文件,请按仓库中的许可证使用。

About

SkillGo · AI-driven local service matching platform with real-time chat, smart recommendations, credit scoring, and LBS visualization. Full-stack demo with React + Node.js.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

SkillGo

SkillGo·技能到家是一个面向本地生活服务、活动执行和即时履约场景的前后端一体化演示项目。项目提供技能者展示、需求发布、订单履约跟踪、聊天沟通、评价与信用分、AI 客服、LBS 热区展示以及管理员后台,适合课程设计、原型演示、功能验证和二次开发。

本仓库当前同时包含:

  • React + Vite 前端应用
  • Node.js + Express 后端 API
  • SQLite 本地数据库
  • Node:test + supertest 接口测试

项目亮点

  • 首页集成 3D 地球、热区地图、标签云、即时订单播报和 Flash Squad Lab 编队模块
  • 技能广场支持按标签、地点、专长快速筛选,并可直接发起联系
  • 发布需求后会自动匹配技能者,并生成完整的订单详情与履约节点
  • 订单详情支持双向评价,评价结果会实时影响双方信用分
  • 聊天中心支持一对一会话,后端会去重重复会话
  • AI 客服可读取数据库内容回答平台问题,支持管理员自定义 API 地址、Key、模型和系统提示词
  • AI 客服在上游模型不可用时会自动回退到常见可用模型
  • 管理后台支持首页文案、用户、技能者、订单流程和 AI 配置管理
  • 支持深色 / 浅色主题切换

技术栈

前端

  • React 18
  • Vite 5
  • TypeScript
  • React Router DOM 6
  • Framer Motion
  • Three.js

后端

  • Node.js ESM
  • Express 4
  • SQLite + sqlite3

测试

  • Node:test
  • supertest

主要功能

1. 首页

首页不是简单的静态落地页,而是一个带业务状态的总览面板,包含:

  • Hero 区域和平台核心指标
  • EarthGlobe 3D 视图,展示技能者点位和订单履约点位
  • LbsExplorer 热区地图,接入高德 JS API 2.0,失败时自动降级为静态热区模式
  • 标签云和即时订单动态
  • Flash Squad Lab 任务编队器,根据最新需求和技能者数据生成“主力位 + 支持位 + 执行建议”
  • 最新雇佣需求列表
  • 右下角快捷入口,包括聊天、发布需求、AI 客服等

2. 技能广场与技能者主页

  • /providers 展示技能者卡片列表
  • 支持按关键词搜索名称、专长、地点、标签
  • 技能卡片支持一键联系
  • /providers/:id 展示技能者详情页
  • 详情页使用 ProfileMirror 聚合展示信用分、近期评价和技能档案

3. 发布需求与自动匹配

  • /requests/new 支持创建新需求
  • 表单字段包括雇佣者、需求主题、服务地点、预算、期望时间、优先标签
  • 提交后后端自动匹配一个技能者并生成订单详情
  • 订单会自动带出履约流程节点

4. 订单详情、履约和评价体系

  • /requests/:id 展示订单概览、匹配技能者、履约时间线
  • 同时展示雇佣者与服务者的信用分
  • 支持双向评价
  • 每次评价都会实时回写到被评价人的信用分
  • 技能者主页会同步显示近期评价和信用信息

5. 聊天中心

  • /chat 支持雇佣者和技能者一对一沟通
  • 通过技能卡片“一键联系”进入会话
  • 后端会对相同双方的直接会话做幂等处理
  • 仓库启动时也会尝试合并历史上重复生成的会话

6. AI 客服

  • /ai-support 提供对话式 AI 客服
  • AI 会读取数据库中的技能者、订单和站点配置上下文来回答问题
  • 管理员可配置:
    • API URL
    • API Key
    • 模型名
    • System Prompt
  • 支持只填写基础地址,例如 https://api.openai.com/v1,后端会自动补成 /chat/completions
  • 支持清空会话
  • 支持显示当前登录昵称;未登录时显示“我”
  • 当前配置模型不可用时,后端会自动回退尝试:
    • gpt-4o-mini
    • gpt-4.1-mini
    • gpt-4.1

7. 管理后台

  • /admin 仅管理员可见
  • 提供分区式控制台,包含:
    • 概览
    • 首页配置
    • 新增雇佣者 / 技能者
    • 用户管理
    • 技能者管理
    • 订单与流程管理
    • AI 配置管理

页面与路由

路由说明
/首页总览
/login登录 / 注册
/providers技能广场
/providers/:id技能者详情页
/requests/new发布需求
/requests/:id订单详情、履约、评价
/chat聊天中心
/ai-supportAI 客服
/admin管理后台

项目结构

SkillGo/
├─ public/ # 静态资源
├─ server/
│ ├─ data/ # SQLite 数据库默认目录
│ ├─ tests/ # 后端接口测试
│ ├─ app.js # Express 应用与 API 路由
│ ├─ db.js # 数据库、种子数据、Repository
│ └─ index.js # 后端启动入口
├─ src/
│ ├─ components/ # 通用 UI 组件
│ ├─ data/ # 前端兜底数据
│ ├─ hooks/ # Auth/useAsyncData 等 hooks
│ ├─ layouts/ # 首页/详情页布局组件
│ ├─ pages/ # 路由页面
│ ├─ services/ # API 请求封装
│ ├─ styles/ # 全局样式
│ ├─ types/ # TypeScript 类型定义
│ ├─ App.tsx # 路由注册
│ └─ main.tsx # 前端入口
├─ .storybook/ # Storybook 配置
├─ package.json
├─ vite.config.ts
└─ README.md

环境要求

建议环境:

  • Node.js 20+,最低建议 18+
  • npm 9+

项目使用了:

  • ESM
  • 顶层 await
  • 原生 fetch

因此不建议使用过旧的 Node 版本。

快速开始

1. 安装依赖

npm install

2. 可选:配置本地地图环境变量

在项目根目录创建 .env.local

VITE_AMAP_KEY=你的高德 Web Key
VITE_AMAP_SECURITY_JS_CODE=你的高德安全密钥

如果不配置,地图模块会自动退化为静态热区模式,页面仍可正常使用。

3. 启动后端

npm run dev:server

默认监听:

  • API: http://localhost:3001

4. 启动前端

npm run dev

默认监听:

  • Vite 开发端口: http://localhost:4173

5. 同时启动前后端

npm run dev:full

环境变量

前端变量

变量名说明默认值
VITE_AMAP_KEY高德地图 Web Key
VITE_AMAP_SECURITY_JS_CODE高德地图安全密钥

后端变量

变量名说明默认值
PORT后端服务端口3001
SKILLGO_DB_PATHSQLite 数据库文件路径server/data/skillgo.db

默认账号

项目内置了演示账号,登录页也会直接提示:

角色账号密码
高级管理员adminadmin123
雇佣者customercustomer123
技能者provider-erprovider123

同时前端也支持注册:

  • customer
  • provider

注册成功后会自动登录。

默认演示数据

首次启动后端时会自动创建数据库并写入种子数据,包括:

  • 技能者
  • 雇佣需求
  • 首页站点内容
  • 管理员与普通用户账号
  • AI 设置默认值

当前默认数据量大致为:

  • 10+ 技能者
  • 10+ 雇佣需求

重要的数据持久化说明

当前仓库更偏“演示 / 课程项目”模式,数据库种子在启动时会重复执行。

这意味着:

  • 内置的首页文案、内置用户、内置技能者、内置订单会在启动时被种子数据重新 upsert
  • 你在后台修改这些“内置演示数据”后,重启服务可能被种子覆盖
  • AI 设置表使用 ON CONFLICT DO NOTHING,管理员保存后的 AI 配置会保留
  • 聊天消息、评价记录、运行中新创建的数据会写入 SQLite 文件中

如果你准备把项目用于长期运行,建议下一步把“只在数据库首次创建时 seed”改成更标准的迁移/初始化模式。

可用脚本

命令说明
npm run dev启动前端开发服务器
npm run dev:server启动后端 API
npm run dev:full同时启动前后端
npm run build构建前端生产包
npm run preview预览前端构建产物
npm run start启动后端生产服务
npm run test:server运行后端接口测试
npm run storybook启动 Storybook
npm run build-storybook构建 Storybook

API 概览

以下为主要接口分组。

认证

  • POST /api/auth/login
  • POST /api/auth/register
  • GET /api/auth/me

面板与技能者

  • GET /api/dashboard
  • GET /api/providers
  • GET /api/providers/:id

需求与订单

  • GET /api/requests
  • GET /api/requests/:id
  • POST /api/requests
  • POST /api/requests/:id/reviews

聊天

  • GET /api/chat/conversations
  • POST /api/chat/conversations
  • GET /api/chat/conversations/:id/messages
  • POST /api/chat/conversations/:id/messages

AI 客服

  • GET /api/ai/settings
  • PUT /api/ai/settings
  • POST /api/ai/support

管理后台

  • GET /api/admin/snapshot
  • PUT /api/admin/site-content
  • POST /api/admin/users
  • PUT /api/admin/users/:id
  • DELETE /api/admin/users/:id
  • POST /api/admin/providers
  • PUT /api/admin/providers/:id
  • DELETE /api/admin/providers/:id
  • PUT /api/admin/requests/:id
  • DELETE /api/admin/requests/:id

核心业务规则

1. 评价与信用分

  • 评分必须是 1 到 5 的整数
  • 评论内容必填,最多 280 字
  • 评价成功后会立即更新被评价人的信用分
  • 订单详情页与技能者详情页会同步展示最新评价信息

2. 聊天会话去重

  • 同一对用户直接发起会话时,后端会复用已有会话
  • 仓库启动时也会尝试合并重复的历史直聊会话

3. AI 客服上下文

AI 客服不会只做纯文本聊天,而是会在请求时读取数据库上下文,主要包括:

  • 相关技能者
  • 相关订单
  • 平台站点配置

如果 AI 上游返回的是不支持当前模型的错误,后端会自动回退常见模型,并在全部失败时给出更友好的中文提示。

4. 地图降级策略

若高德地图 SDK 加载失败、Key 不可用、域名未加白名单或运行时不可用:

  • 页面会显示静态热区模式
  • 不会阻塞首页其余业务功能

测试说明

运行:

npm run test:server

当前后端测试覆盖了以下核心场景:

  • 仪表盘和种子数据可用
  • 发布需求能自动生成订单详情和履约事件
  • 同一对用户创建聊天会话保持幂等
  • 评价会回写信用分
  • AI 配置保存成功
  • AI 请求可带数据库上下文
  • AI 模型不可用时可自动回退
  • 所有回退模型不可用时返回友好提示
  • 仓库启动时可合并重复会话
  • 管理员可新增雇佣者与技能者
  • 请求表单校验有效

生产部署

推荐部署方式

推荐采用“前端静态站点 + Node API + Nginx 反向代理 + SQLite”的方式。

原因:

  • 前端构建产物是 dist
  • 后端 npm run start 只启动 API,不负责托管前端静态文件
  • 前端生产请求使用相对路径 /api
  • 因此生产环境需要 Web 服务器将 /api 代理到 Node 服务

通用部署步骤

  1. 安装依赖
npm install
  1. 配置生产环境变量
# 前端
VITE_AMAP_KEY=你的高德 Key
VITE_AMAP_SECURITY_JS_CODE=你的高德安全密钥
# 后端
PORT=3001
SKILLGO_DB_PATH=/your/path/skillgo.db
  1. 构建前端
npm run build
  1. 启动后端
npm run start
  1. 用 Nginx 托管 dist,并将 /api 反代到后端

Nginx 配置示例

location / {try_files$uri$uri/ /index.html;}location /api/ {proxy_passhttp://127.0.0.1:3001;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}

宝塔部署建议

如果你使用宝塔面板,推荐按下面方式部署:

  1. 安装 Nginx
  2. 安装 Node.js 管理器PM2 管理器
  3. 上传项目到服务器
  4. 执行:
cd /www/wwwroot/SkillGo
npm install
npm run build
  1. 在宝塔创建 Node 项目
  • 项目目录:项目根目录
  • 启动命令:npm run start
  • 端口:3001
  1. 配置后端环境变量
PORT=3001
SKILLGO_DB_PATH=/www/wwwroot/skillgo-data/skillgo.db
  1. 新建网站,根目录指向:
/www/wwwroot/SkillGo/dist
  1. 在站点 Nginx 配置里加入上面的 //api/ 规则

  2. 如果要启用地图:

  • 到高德开放平台配置正式域名白名单
  • 填写 VITE_AMAP_KEY
  • 填写 VITE_AMAP_SECURITY_JS_CODE

常见问题

1. 首页地图只显示静态热区

通常是以下原因之一:

  • 未配置 VITE_AMAP_KEY
  • 未配置 VITE_AMAP_SECURITY_JS_CODE
  • 高德控制台域名白名单未配置
  • 当前网络无法加载高德 SDK

2. 生产环境页面能打开,但接口 404

通常说明:

  • Nginx 没有把 /api 反代到 Node 服务
  • 或后端没有启动成功

3. AI 客服提示模型不可用

请检查管理员后台中的模型名是否为渠道真实支持的名称。当前系统会优先尝试管理员填写的模型,并在失败时自动回退常见模型。

4. npm run start 之后前端页面打不开

这是正常的。npm run start 只启动后端 API,不会直接提供 Vite 打包后的前端静态资源。生产环境需要 Nginx 或其他静态服务器托管 dist

5. Windows 终端看到中文乱码

如果你在 Windows PowerShell / CMD 中看到中文乱码,通常是终端编码问题,不一定代表源码本身损坏。建议使用 UTF-8 终端或 Windows Terminal,并确认编辑器以 UTF-8 保存文件。

6. 后台修改的数据重启后丢失

请先确认你修改的是不是“内置种子数据”。当前种子逻辑会在启动时重复 upsert 一部分演示数据,详见上方“重要的数据持久化说明”。

后续优化建议

如果你准备把这个项目从课程演示继续推进到更正式的应用,建议优先做这些改造:

  • 将数据库 seed 改成只在首次初始化时执行
  • 为后端补充迁移脚本
  • 将 SQLite 切换为 MySQL / PostgreSQL
  • 将鉴权改为更完整的会话或 JWT 体系
  • 为聊天加入轮询或 WebSocket
  • 为 AI 客服增加模型列表与健康检测
  • 增加 CI、Lint、格式化和端到端测试

License

本项目包含 LICENSE 文件,请按仓库中的许可证使用。

About

SkillGo · AI-driven local service matching platform with real-time chat, smart recommendations, credit scoring, and LBS visualization. Full-stack demo with React + Node.js.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

SkillGo

SkillGo·技能到家是一个面向本地生活服务、活动执行和即时履约场景的前后端一体化演示项目。项目提供技能者展示、需求发布、订单履约跟踪、聊天沟通、评价与信用分、AI 客服、LBS 热区展示以及管理员后台,适合课程设计、原型演示、功能验证和二次开发。

本仓库当前同时包含:

  • React + Vite 前端应用
  • Node.js + Express 后端 API
  • SQLite 本地数据库
  • Node:test + supertest 接口测试

项目亮点

  • 首页集成 3D 地球、热区地图、标签云、即时订单播报和 Flash Squad Lab 编队模块
  • 技能广场支持按标签、地点、专长快速筛选,并可直接发起联系
  • 发布需求后会自动匹配技能者,并生成完整的订单详情与履约节点
  • 订单详情支持双向评价,评价结果会实时影响双方信用分
  • 聊天中心支持一对一会话,后端会去重重复会话
  • AI 客服可读取数据库内容回答平台问题,支持管理员自定义 API 地址、Key、模型和系统提示词
  • AI 客服在上游模型不可用时会自动回退到常见可用模型
  • 管理后台支持首页文案、用户、技能者、订单流程和 AI 配置管理
  • 支持深色 / 浅色主题切换

技术栈

前端

  • React 18
  • Vite 5
  • TypeScript
  • React Router DOM 6
  • Framer Motion
  • Three.js

后端

  • Node.js ESM
  • Express 4
  • SQLite + sqlite3

测试

  • Node:test
  • supertest

主要功能

1. 首页

首页不是简单的静态落地页,而是一个带业务状态的总览面板,包含:

  • Hero 区域和平台核心指标
  • EarthGlobe 3D 视图,展示技能者点位和订单履约点位
  • LbsExplorer 热区地图,接入高德 JS API 2.0,失败时自动降级为静态热区模式
  • 标签云和即时订单动态
  • Flash Squad Lab 任务编队器,根据最新需求和技能者数据生成“主力位 + 支持位 + 执行建议”
  • 最新雇佣需求列表
  • 右下角快捷入口,包括聊天、发布需求、AI 客服等

2. 技能广场与技能者主页

  • /providers 展示技能者卡片列表
  • 支持按关键词搜索名称、专长、地点、标签
  • 技能卡片支持一键联系
  • /providers/:id 展示技能者详情页
  • 详情页使用 ProfileMirror 聚合展示信用分、近期评价和技能档案

3. 发布需求与自动匹配

  • /requests/new 支持创建新需求
  • 表单字段包括雇佣者、需求主题、服务地点、预算、期望时间、优先标签
  • 提交后后端自动匹配一个技能者并生成订单详情
  • 订单会自动带出履约流程节点

4. 订单详情、履约和评价体系

  • /requests/:id 展示订单概览、匹配技能者、履约时间线
  • 同时展示雇佣者与服务者的信用分
  • 支持双向评价
  • 每次评价都会实时回写到被评价人的信用分
  • 技能者主页会同步显示近期评价和信用信息

5. 聊天中心

  • /chat 支持雇佣者和技能者一对一沟通
  • 通过技能卡片“一键联系”进入会话
  • 后端会对相同双方的直接会话做幂等处理
  • 仓库启动时也会尝试合并历史上重复生成的会话

6. AI 客服

  • /ai-support 提供对话式 AI 客服
  • AI 会读取数据库中的技能者、订单和站点配置上下文来回答问题
  • 管理员可配置:
    • API URL
    • API Key
    • 模型名
    • System Prompt
  • 支持只填写基础地址,例如 https://api.openai.com/v1,后端会自动补成 /chat/completions
  • 支持清空会话
  • 支持显示当前登录昵称;未登录时显示“我”
  • 当前配置模型不可用时,后端会自动回退尝试:
    • gpt-4o-mini
    • gpt-4.1-mini
    • gpt-4.1

7. 管理后台

  • /admin 仅管理员可见
  • 提供分区式控制台,包含:
    • 概览
    • 首页配置
    • 新增雇佣者 / 技能者
    • 用户管理
    • 技能者管理
    • 订单与流程管理
    • AI 配置管理

页面与路由

路由说明
/首页总览
/login登录 / 注册
/providers技能广场
/providers/:id技能者详情页
/requests/new发布需求
/requests/:id订单详情、履约、评价
/chat聊天中心
/ai-supportAI 客服
/admin管理后台

项目结构

SkillGo/
├─ public/ # 静态资源
├─ server/
│ ├─ data/ # SQLite 数据库默认目录
│ ├─ tests/ # 后端接口测试
│ ├─ app.js # Express 应用与 API 路由
│ ├─ db.js # 数据库、种子数据、Repository
│ └─ index.js # 后端启动入口
├─ src/
│ ├─ components/ # 通用 UI 组件
│ ├─ data/ # 前端兜底数据
│ ├─ hooks/ # Auth/useAsyncData 等 hooks
│ ├─ layouts/ # 首页/详情页布局组件
│ ├─ pages/ # 路由页面
│ ├─ services/ # API 请求封装
│ ├─ styles/ # 全局样式
│ ├─ types/ # TypeScript 类型定义
│ ├─ App.tsx # 路由注册
│ └─ main.tsx # 前端入口
├─ .storybook/ # Storybook 配置
├─ package.json
├─ vite.config.ts
└─ README.md

环境要求

建议环境:

  • Node.js 20+,最低建议 18+
  • npm 9+

项目使用了:

  • ESM
  • 顶层 await
  • 原生 fetch

因此不建议使用过旧的 Node 版本。

快速开始

1. 安装依赖

npm install

2. 可选:配置本地地图环境变量

在项目根目录创建 .env.local

VITE_AMAP_KEY=你的高德 Web Key
VITE_AMAP_SECURITY_JS_CODE=你的高德安全密钥

如果不配置,地图模块会自动退化为静态热区模式,页面仍可正常使用。

3. 启动后端

npm run dev:server

默认监听:

  • API: http://localhost:3001

4. 启动前端

npm run dev

默认监听:

  • Vite 开发端口: http://localhost:4173

5. 同时启动前后端

npm run dev:full

环境变量

前端变量

变量名说明默认值
VITE_AMAP_KEY高德地图 Web Key
VITE_AMAP_SECURITY_JS_CODE高德地图安全密钥

后端变量

变量名说明默认值
PORT后端服务端口3001
SKILLGO_DB_PATHSQLite 数据库文件路径server/data/skillgo.db

默认账号

项目内置了演示账号,登录页也会直接提示:

角色账号密码
高级管理员adminadmin123
雇佣者customercustomer123
技能者provider-erprovider123

同时前端也支持注册:

  • customer
  • provider

注册成功后会自动登录。

默认演示数据

首次启动后端时会自动创建数据库并写入种子数据,包括:

  • 技能者
  • 雇佣需求
  • 首页站点内容
  • 管理员与普通用户账号
  • AI 设置默认值

当前默认数据量大致为:

  • 10+ 技能者
  • 10+ 雇佣需求

重要的数据持久化说明

当前仓库更偏“演示 / 课程项目”模式,数据库种子在启动时会重复执行。

这意味着:

  • 内置的首页文案、内置用户、内置技能者、内置订单会在启动时被种子数据重新 upsert
  • 你在后台修改这些“内置演示数据”后,重启服务可能被种子覆盖
  • AI 设置表使用 ON CONFLICT DO NOTHING,管理员保存后的 AI 配置会保留
  • 聊天消息、评价记录、运行中新创建的数据会写入 SQLite 文件中

如果你准备把项目用于长期运行,建议下一步把“只在数据库首次创建时 seed”改成更标准的迁移/初始化模式。

可用脚本

命令说明
npm run dev启动前端开发服务器
npm run dev:server启动后端 API
npm run dev:full同时启动前后端
npm run build构建前端生产包
npm run preview预览前端构建产物
npm run start启动后端生产服务
npm run test:server运行后端接口测试
npm run storybook启动 Storybook
npm run build-storybook构建 Storybook

API 概览

以下为主要接口分组。

认证

  • POST /api/auth/login
  • POST /api/auth/register
  • GET /api/auth/me

面板与技能者

  • GET /api/dashboard
  • GET /api/providers
  • GET /api/providers/:id

需求与订单

  • GET /api/requests
  • GET /api/requests/:id
  • POST /api/requests
  • POST /api/requests/:id/reviews

聊天

  • GET /api/chat/conversations
  • POST /api/chat/conversations
  • GET /api/chat/conversations/:id/messages
  • POST /api/chat/conversations/:id/messages

AI 客服

  • GET /api/ai/settings
  • PUT /api/ai/settings
  • POST /api/ai/support

管理后台

  • GET /api/admin/snapshot
  • PUT /api/admin/site-content
  • POST /api/admin/users
  • PUT /api/admin/users/:id
  • DELETE /api/admin/users/:id
  • POST /api/admin/providers
  • PUT /api/admin/providers/:id
  • DELETE /api/admin/providers/:id
  • PUT /api/admin/requests/:id
  • DELETE /api/admin/requests/:id

核心业务规则

1. 评价与信用分

  • 评分必须是 1 到 5 的整数
  • 评论内容必填,最多 280 字
  • 评价成功后会立即更新被评价人的信用分
  • 订单详情页与技能者详情页会同步展示最新评价信息

2. 聊天会话去重

  • 同一对用户直接发起会话时,后端会复用已有会话
  • 仓库启动时也会尝试合并重复的历史直聊会话

3. AI 客服上下文

AI 客服不会只做纯文本聊天,而是会在请求时读取数据库上下文,主要包括:

  • 相关技能者
  • 相关订单
  • 平台站点配置

如果 AI 上游返回的是不支持当前模型的错误,后端会自动回退常见模型,并在全部失败时给出更友好的中文提示。

4. 地图降级策略

若高德地图 SDK 加载失败、Key 不可用、域名未加白名单或运行时不可用:

  • 页面会显示静态热区模式
  • 不会阻塞首页其余业务功能

测试说明

运行:

npm run test:server

当前后端测试覆盖了以下核心场景:

  • 仪表盘和种子数据可用
  • 发布需求能自动生成订单详情和履约事件
  • 同一对用户创建聊天会话保持幂等
  • 评价会回写信用分
  • AI 配置保存成功
  • AI 请求可带数据库上下文
  • AI 模型不可用时可自动回退
  • 所有回退模型不可用时返回友好提示
  • 仓库启动时可合并重复会话
  • 管理员可新增雇佣者与技能者
  • 请求表单校验有效

生产部署

推荐部署方式

推荐采用“前端静态站点 + Node API + Nginx 反向代理 + SQLite”的方式。

原因:

  • 前端构建产物是 dist
  • 后端 npm run start 只启动 API,不负责托管前端静态文件
  • 前端生产请求使用相对路径 /api
  • 因此生产环境需要 Web 服务器将 /api 代理到 Node 服务

通用部署步骤

  1. 安装依赖
npm install
  1. 配置生产环境变量
# 前端
VITE_AMAP_KEY=你的高德 Key
VITE_AMAP_SECURITY_JS_CODE=你的高德安全密钥
# 后端
PORT=3001
SKILLGO_DB_PATH=/your/path/skillgo.db
  1. 构建前端
npm run build
  1. 启动后端
npm run start
  1. 用 Nginx 托管 dist,并将 /api 反代到后端

Nginx 配置示例

location / {try_files$uri$uri/ /index.html;}location /api/ {proxy_passhttp://127.0.0.1:3001;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}

宝塔部署建议

如果你使用宝塔面板,推荐按下面方式部署:

  1. 安装 Nginx
  2. 安装 Node.js 管理器PM2 管理器
  3. 上传项目到服务器
  4. 执行:
cd /www/wwwroot/SkillGo
npm install
npm run build
  1. 在宝塔创建 Node 项目
  • 项目目录:项目根目录
  • 启动命令:npm run start
  • 端口:3001
  1. 配置后端环境变量
PORT=3001
SKILLGO_DB_PATH=/www/wwwroot/skillgo-data/skillgo.db
  1. 新建网站,根目录指向:
/www/wwwroot/SkillGo/dist
  1. 在站点 Nginx 配置里加入上面的 //api/ 规则

  2. 如果要启用地图:

  • 到高德开放平台配置正式域名白名单
  • 填写 VITE_AMAP_KEY
  • 填写 VITE_AMAP_SECURITY_JS_CODE

常见问题

1. 首页地图只显示静态热区

通常是以下原因之一:

  • 未配置 VITE_AMAP_KEY
  • 未配置 VITE_AMAP_SECURITY_JS_CODE
  • 高德控制台域名白名单未配置
  • 当前网络无法加载高德 SDK

2. 生产环境页面能打开,但接口 404

通常说明:

  • Nginx 没有把 /api 反代到 Node 服务
  • 或后端没有启动成功

3. AI 客服提示模型不可用

请检查管理员后台中的模型名是否为渠道真实支持的名称。当前系统会优先尝试管理员填写的模型,并在失败时自动回退常见模型。

4. npm run start 之后前端页面打不开

这是正常的。npm run start 只启动后端 API,不会直接提供 Vite 打包后的前端静态资源。生产环境需要 Nginx 或其他静态服务器托管 dist

5. Windows 终端看到中文乱码

如果你在 Windows PowerShell / CMD 中看到中文乱码,通常是终端编码问题,不一定代表源码本身损坏。建议使用 UTF-8 终端或 Windows Terminal,并确认编辑器以 UTF-8 保存文件。

6. 后台修改的数据重启后丢失

请先确认你修改的是不是“内置种子数据”。当前种子逻辑会在启动时重复 upsert 一部分演示数据,详见上方“重要的数据持久化说明”。

后续优化建议

如果你准备把这个项目从课程演示继续推进到更正式的应用,建议优先做这些改造:

  • 将数据库 seed 改成只在首次初始化时执行
  • 为后端补充迁移脚本
  • 将 SQLite 切换为 MySQL / PostgreSQL
  • 将鉴权改为更完整的会话或 JWT 体系
  • 为聊天加入轮询或 WebSocket
  • 为 AI 客服增加模型列表与健康检测
  • 增加 CI、Lint、格式化和端到端测试

License

本项目包含 LICENSE 文件,请按仓库中的许可证使用。

About

SkillGo · AI-driven local service matching platform with real-time chat, smart recommendations, credit scoring, and LBS visualization. Full-stack demo with React + Node.js.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

SkillGo

SkillGo·技能到家是一个面向本地生活服务、活动执行和即时履约场景的前后端一体化演示项目。项目提供技能者展示、需求发布、订单履约跟踪、聊天沟通、评价与信用分、AI 客服、LBS 热区展示以及管理员后台,适合课程设计、原型演示、功能验证和二次开发。

本仓库当前同时包含:

  • React + Vite 前端应用
  • Node.js + Express 后端 API
  • SQLite 本地数据库
  • Node:test + supertest 接口测试

项目亮点

  • 首页集成 3D 地球、热区地图、标签云、即时订单播报和 Flash Squad Lab 编队模块
  • 技能广场支持按标签、地点、专长快速筛选,并可直接发起联系
  • 发布需求后会自动匹配技能者,并生成完整的订单详情与履约节点
  • 订单详情支持双向评价,评价结果会实时影响双方信用分
  • 聊天中心支持一对一会话,后端会去重重复会话
  • AI 客服可读取数据库内容回答平台问题,支持管理员自定义 API 地址、Key、模型和系统提示词
  • AI 客服在上游模型不可用时会自动回退到常见可用模型
  • 管理后台支持首页文案、用户、技能者、订单流程和 AI 配置管理
  • 支持深色 / 浅色主题切换

技术栈

前端

  • React 18
  • Vite 5
  • TypeScript
  • React Router DOM 6
  • Framer Motion
  • Three.js

后端

  • Node.js ESM
  • Express 4
  • SQLite + sqlite3

测试

  • Node:test
  • supertest

主要功能

1. 首页

首页不是简单的静态落地页,而是一个带业务状态的总览面板,包含:

  • Hero 区域和平台核心指标
  • EarthGlobe 3D 视图,展示技能者点位和订单履约点位
  • LbsExplorer 热区地图,接入高德 JS API 2.0,失败时自动降级为静态热区模式
  • 标签云和即时订单动态
  • Flash Squad Lab 任务编队器,根据最新需求和技能者数据生成“主力位 + 支持位 + 执行建议”
  • 最新雇佣需求列表
  • 右下角快捷入口,包括聊天、发布需求、AI 客服等

2. 技能广场与技能者主页

  • /providers 展示技能者卡片列表
  • 支持按关键词搜索名称、专长、地点、标签
  • 技能卡片支持一键联系
  • /providers/:id 展示技能者详情页
  • 详情页使用 ProfileMirror 聚合展示信用分、近期评价和技能档案

3. 发布需求与自动匹配

  • /requests/new 支持创建新需求
  • 表单字段包括雇佣者、需求主题、服务地点、预算、期望时间、优先标签
  • 提交后后端自动匹配一个技能者并生成订单详情
  • 订单会自动带出履约流程节点

4. 订单详情、履约和评价体系

  • /requests/:id 展示订单概览、匹配技能者、履约时间线
  • 同时展示雇佣者与服务者的信用分
  • 支持双向评价
  • 每次评价都会实时回写到被评价人的信用分
  • 技能者主页会同步显示近期评价和信用信息

5. 聊天中心

  • /chat 支持雇佣者和技能者一对一沟通
  • 通过技能卡片“一键联系”进入会话
  • 后端会对相同双方的直接会话做幂等处理
  • 仓库启动时也会尝试合并历史上重复生成的会话

6. AI 客服

  • /ai-support 提供对话式 AI 客服
  • AI 会读取数据库中的技能者、订单和站点配置上下文来回答问题
  • 管理员可配置:
    • API URL
    • API Key
    • 模型名
    • System Prompt
  • 支持只填写基础地址,例如 https://api.openai.com/v1,后端会自动补成 /chat/completions
  • 支持清空会话
  • 支持显示当前登录昵称;未登录时显示“我”
  • 当前配置模型不可用时,后端会自动回退尝试:
    • gpt-4o-mini
    • gpt-4.1-mini
    • gpt-4.1

7. 管理后台

  • /admin 仅管理员可见
  • 提供分区式控制台,包含:
    • 概览
    • 首页配置
    • 新增雇佣者 / 技能者
    • 用户管理
    • 技能者管理
    • 订单与流程管理
    • AI 配置管理

页面与路由

路由说明
/首页总览
/login登录 / 注册
/providers技能广场
/providers/:id技能者详情页
/requests/new发布需求
/requests/:id订单详情、履约、评价
/chat聊天中心
/ai-supportAI 客服
/admin管理后台

项目结构

SkillGo/
├─ public/ # 静态资源
├─ server/
│ ├─ data/ # SQLite 数据库默认目录
│ ├─ tests/ # 后端接口测试
│ ├─ app.js # Express 应用与 API 路由
│ ├─ db.js # 数据库、种子数据、Repository
│ └─ index.js # 后端启动入口
├─ src/
│ ├─ components/ # 通用 UI 组件
│ ├─ data/ # 前端兜底数据
│ ├─ hooks/ # Auth/useAsyncData 等 hooks
│ ├─ layouts/ # 首页/详情页布局组件
│ ├─ pages/ # 路由页面
│ ├─ services/ # API 请求封装
│ ├─ styles/ # 全局样式
│ ├─ types/ # TypeScript 类型定义
│ ├─ App.tsx # 路由注册
│ └─ main.tsx # 前端入口
├─ .storybook/ # Storybook 配置
├─ package.json
├─ vite.config.ts
└─ README.md

环境要求

建议环境:

  • Node.js 20+,最低建议 18+
  • npm 9+

项目使用了:

  • ESM
  • 顶层 await
  • 原生 fetch

因此不建议使用过旧的 Node 版本。

快速开始

1. 安装依赖

npm install

2. 可选:配置本地地图环境变量

在项目根目录创建 .env.local

VITE_AMAP_KEY=你的高德 Web Key
VITE_AMAP_SECURITY_JS_CODE=你的高德安全密钥

如果不配置,地图模块会自动退化为静态热区模式,页面仍可正常使用。

3. 启动后端

npm run dev:server

默认监听:

  • API: http://localhost:3001

4. 启动前端

npm run dev

默认监听:

  • Vite 开发端口: http://localhost:4173

5. 同时启动前后端

npm run dev:full

环境变量

前端变量

变量名说明默认值
VITE_AMAP_KEY高德地图 Web Key
VITE_AMAP_SECURITY_JS_CODE高德地图安全密钥

后端变量

变量名说明默认值
PORT后端服务端口3001
SKILLGO_DB_PATHSQLite 数据库文件路径server/data/skillgo.db

默认账号

项目内置了演示账号,登录页也会直接提示:

角色账号密码
高级管理员adminadmin123
雇佣者customercustomer123
技能者provider-erprovider123

同时前端也支持注册:

  • customer
  • provider

注册成功后会自动登录。

默认演示数据

首次启动后端时会自动创建数据库并写入种子数据,包括:

  • 技能者
  • 雇佣需求
  • 首页站点内容
  • 管理员与普通用户账号
  • AI 设置默认值

当前默认数据量大致为:

  • 10+ 技能者
  • 10+ 雇佣需求

重要的数据持久化说明

当前仓库更偏“演示 / 课程项目”模式,数据库种子在启动时会重复执行。

这意味着:

  • 内置的首页文案、内置用户、内置技能者、内置订单会在启动时被种子数据重新 upsert
  • 你在后台修改这些“内置演示数据”后,重启服务可能被种子覆盖
  • AI 设置表使用 ON CONFLICT DO NOTHING,管理员保存后的 AI 配置会保留
  • 聊天消息、评价记录、运行中新创建的数据会写入 SQLite 文件中

如果你准备把项目用于长期运行,建议下一步把“只在数据库首次创建时 seed”改成更标准的迁移/初始化模式。

可用脚本

命令说明
npm run dev启动前端开发服务器
npm run dev:server启动后端 API
npm run dev:full同时启动前后端
npm run build构建前端生产包
npm run preview预览前端构建产物
npm run start启动后端生产服务
npm run test:server运行后端接口测试
npm run storybook启动 Storybook
npm run build-storybook构建 Storybook

API 概览

以下为主要接口分组。

认证

  • POST /api/auth/login
  • POST /api/auth/register
  • GET /api/auth/me

面板与技能者

  • GET /api/dashboard
  • GET /api/providers
  • GET /api/providers/:id

需求与订单

  • GET /api/requests
  • GET /api/requests/:id
  • POST /api/requests
  • POST /api/requests/:id/reviews

聊天

  • GET /api/chat/conversations
  • POST /api/chat/conversations
  • GET /api/chat/conversations/:id/messages
  • POST /api/chat/conversations/:id/messages

AI 客服

  • GET /api/ai/settings
  • PUT /api/ai/settings
  • POST /api/ai/support

管理后台

  • GET /api/admin/snapshot
  • PUT /api/admin/site-content
  • POST /api/admin/users
  • PUT /api/admin/users/:id
  • DELETE /api/admin/users/:id
  • POST /api/admin/providers
  • PUT /api/admin/providers/:id
  • DELETE /api/admin/providers/:id
  • PUT /api/admin/requests/:id
  • DELETE /api/admin/requests/:id

核心业务规则

1. 评价与信用分

  • 评分必须是 1 到 5 的整数
  • 评论内容必填,最多 280 字
  • 评价成功后会立即更新被评价人的信用分
  • 订单详情页与技能者详情页会同步展示最新评价信息

2. 聊天会话去重

  • 同一对用户直接发起会话时,后端会复用已有会话
  • 仓库启动时也会尝试合并重复的历史直聊会话

3. AI 客服上下文

AI 客服不会只做纯文本聊天,而是会在请求时读取数据库上下文,主要包括:

  • 相关技能者
  • 相关订单
  • 平台站点配置

如果 AI 上游返回的是不支持当前模型的错误,后端会自动回退常见模型,并在全部失败时给出更友好的中文提示。

4. 地图降级策略

若高德地图 SDK 加载失败、Key 不可用、域名未加白名单或运行时不可用:

  • 页面会显示静态热区模式
  • 不会阻塞首页其余业务功能

测试说明

运行:

npm run test:server

当前后端测试覆盖了以下核心场景:

  • 仪表盘和种子数据可用
  • 发布需求能自动生成订单详情和履约事件
  • 同一对用户创建聊天会话保持幂等
  • 评价会回写信用分
  • AI 配置保存成功
  • AI 请求可带数据库上下文
  • AI 模型不可用时可自动回退
  • 所有回退模型不可用时返回友好提示
  • 仓库启动时可合并重复会话
  • 管理员可新增雇佣者与技能者
  • 请求表单校验有效

生产部署

推荐部署方式

推荐采用“前端静态站点 + Node API + Nginx 反向代理 + SQLite”的方式。

原因:

  • 前端构建产物是 dist
  • 后端 npm run start 只启动 API,不负责托管前端静态文件
  • 前端生产请求使用相对路径 /api
  • 因此生产环境需要 Web 服务器将 /api 代理到 Node 服务

通用部署步骤

  1. 安装依赖
npm install
  1. 配置生产环境变量
# 前端
VITE_AMAP_KEY=你的高德 Key
VITE_AMAP_SECURITY_JS_CODE=你的高德安全密钥
# 后端
PORT=3001
SKILLGO_DB_PATH=/your/path/skillgo.db
  1. 构建前端
npm run build
  1. 启动后端
npm run start
  1. 用 Nginx 托管 dist,并将 /api 反代到后端

Nginx 配置示例

location / {try_files$uri$uri/ /index.html;}location /api/ {proxy_passhttp://127.0.0.1:3001;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}

宝塔部署建议

如果你使用宝塔面板,推荐按下面方式部署:

  1. 安装 Nginx
  2. 安装 Node.js 管理器PM2 管理器
  3. 上传项目到服务器
  4. 执行:
cd /www/wwwroot/SkillGo
npm install
npm run build
  1. 在宝塔创建 Node 项目
  • 项目目录:项目根目录
  • 启动命令:npm run start
  • 端口:3001
  1. 配置后端环境变量
PORT=3001
SKILLGO_DB_PATH=/www/wwwroot/skillgo-data/skillgo.db
  1. 新建网站,根目录指向:
/www/wwwroot/SkillGo/dist
  1. 在站点 Nginx 配置里加入上面的 //api/ 规则

  2. 如果要启用地图:

  • 到高德开放平台配置正式域名白名单
  • 填写 VITE_AMAP_KEY
  • 填写 VITE_AMAP_SECURITY_JS_CODE

常见问题

1. 首页地图只显示静态热区

通常是以下原因之一:

  • 未配置 VITE_AMAP_KEY
  • 未配置 VITE_AMAP_SECURITY_JS_CODE
  • 高德控制台域名白名单未配置
  • 当前网络无法加载高德 SDK

2. 生产环境页面能打开,但接口 404

通常说明:

  • Nginx 没有把 /api 反代到 Node 服务
  • 或后端没有启动成功

3. AI 客服提示模型不可用

请检查管理员后台中的模型名是否为渠道真实支持的名称。当前系统会优先尝试管理员填写的模型,并在失败时自动回退常见模型。

4. npm run start 之后前端页面打不开

这是正常的。npm run start 只启动后端 API,不会直接提供 Vite 打包后的前端静态资源。生产环境需要 Nginx 或其他静态服务器托管 dist

5. Windows 终端看到中文乱码

如果你在 Windows PowerShell / CMD 中看到中文乱码,通常是终端编码问题,不一定代表源码本身损坏。建议使用 UTF-8 终端或 Windows Terminal,并确认编辑器以 UTF-8 保存文件。

6. 后台修改的数据重启后丢失

请先确认你修改的是不是“内置种子数据”。当前种子逻辑会在启动时重复 upsert 一部分演示数据,详见上方“重要的数据持久化说明”。

后续优化建议

如果你准备把这个项目从课程演示继续推进到更正式的应用,建议优先做这些改造:

  • 将数据库 seed 改成只在首次初始化时执行
  • 为后端补充迁移脚本
  • 将 SQLite 切换为 MySQL / PostgreSQL
  • 将鉴权改为更完整的会话或 JWT 体系
  • 为聊天加入轮询或 WebSocket
  • 为 AI 客服增加模型列表与健康检测
  • 增加 CI、Lint、格式化和端到端测试

License

本项目包含 LICENSE 文件,请按仓库中的许可证使用。

About

SkillGo · AI-driven local service matching platform with real-time chat, smart recommendations, credit scoring, and LBS visualization. Full-stack demo with React + Node.js.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

SkillGo

SkillGo·技能到家是一个面向本地生活服务、活动执行和即时履约场景的前后端一体化演示项目。项目提供技能者展示、需求发布、订单履约跟踪、聊天沟通、评价与信用分、AI 客服、LBS 热区展示以及管理员后台,适合课程设计、原型演示、功能验证和二次开发。

本仓库当前同时包含:

  • React + Vite 前端应用
  • Node.js + Express 后端 API
  • SQLite 本地数据库
  • Node:test + supertest 接口测试

项目亮点

  • 首页集成 3D 地球、热区地图、标签云、即时订单播报和 Flash Squad Lab 编队模块
  • 技能广场支持按标签、地点、专长快速筛选,并可直接发起联系
  • 发布需求后会自动匹配技能者,并生成完整的订单详情与履约节点
  • 订单详情支持双向评价,评价结果会实时影响双方信用分
  • 聊天中心支持一对一会话,后端会去重重复会话
  • AI 客服可读取数据库内容回答平台问题,支持管理员自定义 API 地址、Key、模型和系统提示词
  • AI 客服在上游模型不可用时会自动回退到常见可用模型
  • 管理后台支持首页文案、用户、技能者、订单流程和 AI 配置管理
  • 支持深色 / 浅色主题切换

技术栈

前端

  • React 18
  • Vite 5
  • TypeScript
  • React Router DOM 6
  • Framer Motion
  • Three.js

后端

  • Node.js ESM
  • Express 4
  • SQLite + sqlite3

测试

  • Node:test
  • supertest

主要功能

1. 首页

首页不是简单的静态落地页,而是一个带业务状态的总览面板,包含:

  • Hero 区域和平台核心指标
  • EarthGlobe 3D 视图,展示技能者点位和订单履约点位
  • LbsExplorer 热区地图,接入高德 JS API 2.0,失败时自动降级为静态热区模式
  • 标签云和即时订单动态
  • Flash Squad Lab 任务编队器,根据最新需求和技能者数据生成“主力位 + 支持位 + 执行建议”
  • 最新雇佣需求列表
  • 右下角快捷入口,包括聊天、发布需求、AI 客服等

2. 技能广场与技能者主页

  • /providers 展示技能者卡片列表
  • 支持按关键词搜索名称、专长、地点、标签
  • 技能卡片支持一键联系
  • /providers/:id 展示技能者详情页
  • 详情页使用 ProfileMirror 聚合展示信用分、近期评价和技能档案

3. 发布需求与自动匹配

  • /requests/new 支持创建新需求
  • 表单字段包括雇佣者、需求主题、服务地点、预算、期望时间、优先标签
  • 提交后后端自动匹配一个技能者并生成订单详情
  • 订单会自动带出履约流程节点

4. 订单详情、履约和评价体系

  • /requests/:id 展示订单概览、匹配技能者、履约时间线
  • 同时展示雇佣者与服务者的信用分
  • 支持双向评价
  • 每次评价都会实时回写到被评价人的信用分
  • 技能者主页会同步显示近期评价和信用信息

5. 聊天中心

  • /chat 支持雇佣者和技能者一对一沟通
  • 通过技能卡片“一键联系”进入会话
  • 后端会对相同双方的直接会话做幂等处理
  • 仓库启动时也会尝试合并历史上重复生成的会话

6. AI 客服

  • /ai-support 提供对话式 AI 客服
  • AI 会读取数据库中的技能者、订单和站点配置上下文来回答问题
  • 管理员可配置:
    • API URL
    • API Key
    • 模型名
    • System Prompt
  • 支持只填写基础地址,例如 https://api.openai.com/v1,后端会自动补成 /chat/completions
  • 支持清空会话
  • 支持显示当前登录昵称;未登录时显示“我”
  • 当前配置模型不可用时,后端会自动回退尝试:
    • gpt-4o-mini
    • gpt-4.1-mini
    • gpt-4.1

7. 管理后台

  • /admin 仅管理员可见
  • 提供分区式控制台,包含:
    • 概览
    • 首页配置
    • 新增雇佣者 / 技能者
    • 用户管理
    • 技能者管理
    • 订单与流程管理
    • AI 配置管理

页面与路由

路由说明
/首页总览
/login登录 / 注册
/providers技能广场
/providers/:id技能者详情页
/requests/new发布需求
/requests/:id订单详情、履约、评价
/chat聊天中心
/ai-supportAI 客服
/admin管理后台

项目结构

SkillGo/
├─ public/ # 静态资源
├─ server/
│ ├─ data/ # SQLite 数据库默认目录
│ ├─ tests/ # 后端接口测试
│ ├─ app.js # Express 应用与 API 路由
│ ├─ db.js # 数据库、种子数据、Repository
│ └─ index.js # 后端启动入口
├─ src/
│ ├─ components/ # 通用 UI 组件
│ ├─ data/ # 前端兜底数据
│ ├─ hooks/ # Auth/useAsyncData 等 hooks
│ ├─ layouts/ # 首页/详情页布局组件
│ ├─ pages/ # 路由页面
│ ├─ services/ # API 请求封装
│ ├─ styles/ # 全局样式
│ ├─ types/ # TypeScript 类型定义
│ ├─ App.tsx # 路由注册
│ └─ main.tsx # 前端入口
├─ .storybook/ # Storybook 配置
├─ package.json
├─ vite.config.ts
└─ README.md

环境要求

建议环境:

  • Node.js 20+,最低建议 18+
  • npm 9+

项目使用了:

  • ESM
  • 顶层 await
  • 原生 fetch

因此不建议使用过旧的 Node 版本。

快速开始

1. 安装依赖

npm install

2. 可选:配置本地地图环境变量

在项目根目录创建 .env.local

VITE_AMAP_KEY=你的高德 Web Key
VITE_AMAP_SECURITY_JS_CODE=你的高德安全密钥

如果不配置,地图模块会自动退化为静态热区模式,页面仍可正常使用。

3. 启动后端

npm run dev:server

默认监听:

  • API: http://localhost:3001

4. 启动前端

npm run dev

默认监听:

  • Vite 开发端口: http://localhost:4173

5. 同时启动前后端

npm run dev:full

环境变量

前端变量

变量名说明默认值
VITE_AMAP_KEY高德地图 Web Key
VITE_AMAP_SECURITY_JS_CODE高德地图安全密钥

后端变量

变量名说明默认值
PORT后端服务端口3001
SKILLGO_DB_PATHSQLite 数据库文件路径server/data/skillgo.db

默认账号

项目内置了演示账号,登录页也会直接提示:

角色账号密码
高级管理员adminadmin123
雇佣者customercustomer123
技能者provider-erprovider123

同时前端也支持注册:

  • customer
  • provider

注册成功后会自动登录。

默认演示数据

首次启动后端时会自动创建数据库并写入种子数据,包括:

  • 技能者
  • 雇佣需求
  • 首页站点内容
  • 管理员与普通用户账号
  • AI 设置默认值

当前默认数据量大致为:

  • 10+ 技能者
  • 10+ 雇佣需求

重要的数据持久化说明

当前仓库更偏“演示 / 课程项目”模式,数据库种子在启动时会重复执行。

这意味着:

  • 内置的首页文案、内置用户、内置技能者、内置订单会在启动时被种子数据重新 upsert
  • 你在后台修改这些“内置演示数据”后,重启服务可能被种子覆盖
  • AI 设置表使用 ON CONFLICT DO NOTHING,管理员保存后的 AI 配置会保留
  • 聊天消息、评价记录、运行中新创建的数据会写入 SQLite 文件中

如果你准备把项目用于长期运行,建议下一步把“只在数据库首次创建时 seed”改成更标准的迁移/初始化模式。

可用脚本

命令说明
npm run dev启动前端开发服务器
npm run dev:server启动后端 API
npm run dev:full同时启动前后端
npm run build构建前端生产包
npm run preview预览前端构建产物
npm run start启动后端生产服务
npm run test:server运行后端接口测试
npm run storybook启动 Storybook
npm run build-storybook构建 Storybook

API 概览

以下为主要接口分组。

认证

  • POST /api/auth/login
  • POST /api/auth/register
  • GET /api/auth/me

面板与技能者

  • GET /api/dashboard
  • GET /api/providers
  • GET /api/providers/:id

需求与订单

  • GET /api/requests
  • GET /api/requests/:id
  • POST /api/requests
  • POST /api/requests/:id/reviews

聊天

  • GET /api/chat/conversations
  • POST /api/chat/conversations
  • GET /api/chat/conversations/:id/messages
  • POST /api/chat/conversations/:id/messages

AI 客服

  • GET /api/ai/settings
  • PUT /api/ai/settings
  • POST /api/ai/support

管理后台

  • GET /api/admin/snapshot
  • PUT /api/admin/site-content
  • POST /api/admin/users
  • PUT /api/admin/users/:id
  • DELETE /api/admin/users/:id
  • POST /api/admin/providers
  • PUT /api/admin/providers/:id
  • DELETE /api/admin/providers/:id
  • PUT /api/admin/requests/:id
  • DELETE /api/admin/requests/:id

核心业务规则

1. 评价与信用分

  • 评分必须是 1 到 5 的整数
  • 评论内容必填,最多 280 字
  • 评价成功后会立即更新被评价人的信用分
  • 订单详情页与技能者详情页会同步展示最新评价信息

2. 聊天会话去重

  • 同一对用户直接发起会话时,后端会复用已有会话
  • 仓库启动时也会尝试合并重复的历史直聊会话

3. AI 客服上下文

AI 客服不会只做纯文本聊天,而是会在请求时读取数据库上下文,主要包括:

  • 相关技能者
  • 相关订单
  • 平台站点配置

如果 AI 上游返回的是不支持当前模型的错误,后端会自动回退常见模型,并在全部失败时给出更友好的中文提示。

4. 地图降级策略

若高德地图 SDK 加载失败、Key 不可用、域名未加白名单或运行时不可用:

  • 页面会显示静态热区模式
  • 不会阻塞首页其余业务功能

测试说明

运行:

npm run test:server

当前后端测试覆盖了以下核心场景:

  • 仪表盘和种子数据可用
  • 发布需求能自动生成订单详情和履约事件
  • 同一对用户创建聊天会话保持幂等
  • 评价会回写信用分
  • AI 配置保存成功
  • AI 请求可带数据库上下文
  • AI 模型不可用时可自动回退
  • 所有回退模型不可用时返回友好提示
  • 仓库启动时可合并重复会话
  • 管理员可新增雇佣者与技能者
  • 请求表单校验有效

生产部署

推荐部署方式

推荐采用“前端静态站点 + Node API + Nginx 反向代理 + SQLite”的方式。

原因:

  • 前端构建产物是 dist
  • 后端 npm run start 只启动 API,不负责托管前端静态文件
  • 前端生产请求使用相对路径 /api
  • 因此生产环境需要 Web 服务器将 /api 代理到 Node 服务

通用部署步骤

  1. 安装依赖
npm install
  1. 配置生产环境变量
# 前端
VITE_AMAP_KEY=你的高德 Key
VITE_AMAP_SECURITY_JS_CODE=你的高德安全密钥
# 后端
PORT=3001
SKILLGO_DB_PATH=/your/path/skillgo.db
  1. 构建前端
npm run build
  1. 启动后端
npm run start
  1. 用 Nginx 托管 dist,并将 /api 反代到后端

Nginx 配置示例

location / {try_files$uri$uri/ /index.html;}location /api/ {proxy_passhttp://127.0.0.1:3001;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}

宝塔部署建议

如果你使用宝塔面板,推荐按下面方式部署:

  1. 安装 Nginx
  2. 安装 Node.js 管理器PM2 管理器
  3. 上传项目到服务器
  4. 执行:
cd /www/wwwroot/SkillGo
npm install
npm run build
  1. 在宝塔创建 Node 项目
  • 项目目录:项目根目录
  • 启动命令:npm run start
  • 端口:3001
  1. 配置后端环境变量
PORT=3001
SKILLGO_DB_PATH=/www/wwwroot/skillgo-data/skillgo.db
  1. 新建网站,根目录指向:
/www/wwwroot/SkillGo/dist
  1. 在站点 Nginx 配置里加入上面的 //api/ 规则

  2. 如果要启用地图:

  • 到高德开放平台配置正式域名白名单
  • 填写 VITE_AMAP_KEY
  • 填写 VITE_AMAP_SECURITY_JS_CODE

常见问题

1. 首页地图只显示静态热区

通常是以下原因之一:

  • 未配置 VITE_AMAP_KEY
  • 未配置 VITE_AMAP_SECURITY_JS_CODE
  • 高德控制台域名白名单未配置
  • 当前网络无法加载高德 SDK

2. 生产环境页面能打开,但接口 404

通常说明:

  • Nginx 没有把 /api 反代到 Node 服务
  • 或后端没有启动成功

3. AI 客服提示模型不可用

请检查管理员后台中的模型名是否为渠道真实支持的名称。当前系统会优先尝试管理员填写的模型,并在失败时自动回退常见模型。

4. npm run start 之后前端页面打不开

这是正常的。npm run start 只启动后端 API,不会直接提供 Vite 打包后的前端静态资源。生产环境需要 Nginx 或其他静态服务器托管 dist

5. Windows 终端看到中文乱码

如果你在 Windows PowerShell / CMD 中看到中文乱码,通常是终端编码问题,不一定代表源码本身损坏。建议使用 UTF-8 终端或 Windows Terminal,并确认编辑器以 UTF-8 保存文件。

6. 后台修改的数据重启后丢失

请先确认你修改的是不是“内置种子数据”。当前种子逻辑会在启动时重复 upsert 一部分演示数据,详见上方“重要的数据持久化说明”。

后续优化建议

如果你准备把这个项目从课程演示继续推进到更正式的应用,建议优先做这些改造:

  • 将数据库 seed 改成只在首次初始化时执行
  • 为后端补充迁移脚本
  • 将 SQLite 切换为 MySQL / PostgreSQL
  • 将鉴权改为更完整的会话或 JWT 体系
  • 为聊天加入轮询或 WebSocket
  • 为 AI 客服增加模型列表与健康检测
  • 增加 CI、Lint、格式化和端到端测试

License

本项目包含 LICENSE 文件,请按仓库中的许可证使用。

About

SkillGo · AI-driven local service matching platform with real-time chat, smart recommendations, credit scoring, and LBS visualization. Full-stack demo with React + Node.js.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

SkillGo

SkillGo·技能到家是一个面向本地生活服务、活动执行和即时履约场景的前后端一体化演示项目。项目提供技能者展示、需求发布、订单履约跟踪、聊天沟通、评价与信用分、AI 客服、LBS 热区展示以及管理员后台,适合课程设计、原型演示、功能验证和二次开发。

本仓库当前同时包含:

  • React + Vite 前端应用
  • Node.js + Express 后端 API
  • SQLite 本地数据库
  • Node:test + supertest 接口测试

项目亮点

  • 首页集成 3D 地球、热区地图、标签云、即时订单播报和 Flash Squad Lab 编队模块
  • 技能广场支持按标签、地点、专长快速筛选,并可直接发起联系
  • 发布需求后会自动匹配技能者,并生成完整的订单详情与履约节点
  • 订单详情支持双向评价,评价结果会实时影响双方信用分
  • 聊天中心支持一对一会话,后端会去重重复会话
  • AI 客服可读取数据库内容回答平台问题,支持管理员自定义 API 地址、Key、模型和系统提示词
  • AI 客服在上游模型不可用时会自动回退到常见可用模型
  • 管理后台支持首页文案、用户、技能者、订单流程和 AI 配置管理
  • 支持深色 / 浅色主题切换

技术栈

前端

  • React 18
  • Vite 5
  • TypeScript
  • React Router DOM 6
  • Framer Motion
  • Three.js

后端

  • Node.js ESM
  • Express 4
  • SQLite + sqlite3

测试

  • Node:test
  • supertest

主要功能

1. 首页

首页不是简单的静态落地页,而是一个带业务状态的总览面板,包含:

  • Hero 区域和平台核心指标
  • EarthGlobe 3D 视图,展示技能者点位和订单履约点位
  • LbsExplorer 热区地图,接入高德 JS API 2.0,失败时自动降级为静态热区模式
  • 标签云和即时订单动态
  • Flash Squad Lab 任务编队器,根据最新需求和技能者数据生成“主力位 + 支持位 + 执行建议”
  • 最新雇佣需求列表
  • 右下角快捷入口,包括聊天、发布需求、AI 客服等

2. 技能广场与技能者主页

  • /providers 展示技能者卡片列表
  • 支持按关键词搜索名称、专长、地点、标签
  • 技能卡片支持一键联系
  • /providers/:id 展示技能者详情页
  • 详情页使用 ProfileMirror 聚合展示信用分、近期评价和技能档案

3. 发布需求与自动匹配

  • /requests/new 支持创建新需求
  • 表单字段包括雇佣者、需求主题、服务地点、预算、期望时间、优先标签
  • 提交后后端自动匹配一个技能者并生成订单详情
  • 订单会自动带出履约流程节点

4. 订单详情、履约和评价体系

  • /requests/:id 展示订单概览、匹配技能者、履约时间线
  • 同时展示雇佣者与服务者的信用分
  • 支持双向评价
  • 每次评价都会实时回写到被评价人的信用分
  • 技能者主页会同步显示近期评价和信用信息

5. 聊天中心

  • /chat 支持雇佣者和技能者一对一沟通
  • 通过技能卡片“一键联系”进入会话
  • 后端会对相同双方的直接会话做幂等处理
  • 仓库启动时也会尝试合并历史上重复生成的会话

6. AI 客服

  • /ai-support 提供对话式 AI 客服
  • AI 会读取数据库中的技能者、订单和站点配置上下文来回答问题
  • 管理员可配置:
    • API URL
    • API Key
    • 模型名
    • System Prompt
  • 支持只填写基础地址,例如 https://api.openai.com/v1,后端会自动补成 /chat/completions
  • 支持清空会话
  • 支持显示当前登录昵称;未登录时显示“我”
  • 当前配置模型不可用时,后端会自动回退尝试:
    • gpt-4o-mini
    • gpt-4.1-mini
    • gpt-4.1

7. 管理后台

  • /admin 仅管理员可见
  • 提供分区式控制台,包含:
    • 概览
    • 首页配置
    • 新增雇佣者 / 技能者
    • 用户管理
    • 技能者管理
    • 订单与流程管理
    • AI 配置管理

页面与路由

路由说明
/首页总览
/login登录 / 注册
/providers技能广场
/providers/:id技能者详情页
/requests/new发布需求
/requests/:id订单详情、履约、评价
/chat聊天中心
/ai-supportAI 客服
/admin管理后台

项目结构

SkillGo/
├─ public/ # 静态资源
├─ server/
│ ├─ data/ # SQLite 数据库默认目录
│ ├─ tests/ # 后端接口测试
│ ├─ app.js # Express 应用与 API 路由
│ ├─ db.js # 数据库、种子数据、Repository
│ └─ index.js # 后端启动入口
├─ src/
│ ├─ components/ # 通用 UI 组件
│ ├─ data/ # 前端兜底数据
│ ├─ hooks/ # Auth/useAsyncData 等 hooks
│ ├─ layouts/ # 首页/详情页布局组件
│ ├─ pages/ # 路由页面
│ ├─ services/ # API 请求封装
│ ├─ styles/ # 全局样式
│ ├─ types/ # TypeScript 类型定义
│ ├─ App.tsx # 路由注册
│ └─ main.tsx # 前端入口
├─ .storybook/ # Storybook 配置
├─ package.json
├─ vite.config.ts
└─ README.md

环境要求

建议环境:

  • Node.js 20+,最低建议 18+
  • npm 9+

项目使用了:

  • ESM
  • 顶层 await
  • 原生 fetch

因此不建议使用过旧的 Node 版本。

快速开始

1. 安装依赖

npm install

2. 可选:配置本地地图环境变量

在项目根目录创建 .env.local

VITE_AMAP_KEY=你的高德 Web Key
VITE_AMAP_SECURITY_JS_CODE=你的高德安全密钥

如果不配置,地图模块会自动退化为静态热区模式,页面仍可正常使用。

3. 启动后端

npm run dev:server

默认监听:

  • API: http://localhost:3001

4. 启动前端

npm run dev

默认监听:

  • Vite 开发端口: http://localhost:4173

5. 同时启动前后端

npm run dev:full

环境变量

前端变量

变量名说明默认值
VITE_AMAP_KEY高德地图 Web Key
VITE_AMAP_SECURITY_JS_CODE高德地图安全密钥

后端变量

变量名说明默认值
PORT后端服务端口3001
SKILLGO_DB_PATHSQLite 数据库文件路径server/data/skillgo.db

默认账号

项目内置了演示账号,登录页也会直接提示:

角色账号密码
高级管理员adminadmin123
雇佣者customercustomer123
技能者provider-erprovider123

同时前端也支持注册:

  • customer
  • provider

注册成功后会自动登录。

默认演示数据

首次启动后端时会自动创建数据库并写入种子数据,包括:

  • 技能者
  • 雇佣需求
  • 首页站点内容
  • 管理员与普通用户账号
  • AI 设置默认值

当前默认数据量大致为:

  • 10+ 技能者
  • 10+ 雇佣需求

重要的数据持久化说明

当前仓库更偏“演示 / 课程项目”模式,数据库种子在启动时会重复执行。

这意味着:

  • 内置的首页文案、内置用户、内置技能者、内置订单会在启动时被种子数据重新 upsert
  • 你在后台修改这些“内置演示数据”后,重启服务可能被种子覆盖
  • AI 设置表使用 ON CONFLICT DO NOTHING,管理员保存后的 AI 配置会保留
  • 聊天消息、评价记录、运行中新创建的数据会写入 SQLite 文件中

如果你准备把项目用于长期运行,建议下一步把“只在数据库首次创建时 seed”改成更标准的迁移/初始化模式。

可用脚本

命令说明
npm run dev启动前端开发服务器
npm run dev:server启动后端 API
npm run dev:full同时启动前后端
npm run build构建前端生产包
npm run preview预览前端构建产物
npm run start启动后端生产服务
npm run test:server运行后端接口测试
npm run storybook启动 Storybook
npm run build-storybook构建 Storybook

API 概览

以下为主要接口分组。

认证

  • POST /api/auth/login
  • POST /api/auth/register
  • GET /api/auth/me

面板与技能者

  • GET /api/dashboard
  • GET /api/providers
  • GET /api/providers/:id

需求与订单

  • GET /api/requests
  • GET /api/requests/:id
  • POST /api/requests
  • POST /api/requests/:id/reviews

聊天

  • GET /api/chat/conversations
  • POST /api/chat/conversations
  • GET /api/chat/conversations/:id/messages
  • POST /api/chat/conversations/:id/messages

AI 客服

  • GET /api/ai/settings
  • PUT /api/ai/settings
  • POST /api/ai/support

管理后台

  • GET /api/admin/snapshot
  • PUT /api/admin/site-content
  • POST /api/admin/users
  • PUT /api/admin/users/:id
  • DELETE /api/admin/users/:id
  • POST /api/admin/providers
  • PUT /api/admin/providers/:id
  • DELETE /api/admin/providers/:id
  • PUT /api/admin/requests/:id
  • DELETE /api/admin/requests/:id

核心业务规则

1. 评价与信用分

  • 评分必须是 1 到 5 的整数
  • 评论内容必填,最多 280 字
  • 评价成功后会立即更新被评价人的信用分
  • 订单详情页与技能者详情页会同步展示最新评价信息

2. 聊天会话去重

  • 同一对用户直接发起会话时,后端会复用已有会话
  • 仓库启动时也会尝试合并重复的历史直聊会话

3. AI 客服上下文

AI 客服不会只做纯文本聊天,而是会在请求时读取数据库上下文,主要包括:

  • 相关技能者
  • 相关订单
  • 平台站点配置

如果 AI 上游返回的是不支持当前模型的错误,后端会自动回退常见模型,并在全部失败时给出更友好的中文提示。

4. 地图降级策略

若高德地图 SDK 加载失败、Key 不可用、域名未加白名单或运行时不可用:

  • 页面会显示静态热区模式
  • 不会阻塞首页其余业务功能

测试说明

运行:

npm run test:server

当前后端测试覆盖了以下核心场景:

  • 仪表盘和种子数据可用
  • 发布需求能自动生成订单详情和履约事件
  • 同一对用户创建聊天会话保持幂等
  • 评价会回写信用分
  • AI 配置保存成功
  • AI 请求可带数据库上下文
  • AI 模型不可用时可自动回退
  • 所有回退模型不可用时返回友好提示
  • 仓库启动时可合并重复会话
  • 管理员可新增雇佣者与技能者
  • 请求表单校验有效

生产部署

推荐部署方式

推荐采用“前端静态站点 + Node API + Nginx 反向代理 + SQLite”的方式。

原因:

  • 前端构建产物是 dist
  • 后端 npm run start 只启动 API,不负责托管前端静态文件
  • 前端生产请求使用相对路径 /api
  • 因此生产环境需要 Web 服务器将 /api 代理到 Node 服务

通用部署步骤

  1. 安装依赖
npm install
  1. 配置生产环境变量
# 前端
VITE_AMAP_KEY=你的高德 Key
VITE_AMAP_SECURITY_JS_CODE=你的高德安全密钥
# 后端
PORT=3001
SKILLGO_DB_PATH=/your/path/skillgo.db
  1. 构建前端
npm run build
  1. 启动后端
npm run start
  1. 用 Nginx 托管 dist,并将 /api 反代到后端

Nginx 配置示例

location / {try_files$uri$uri/ /index.html;}location /api/ {proxy_passhttp://127.0.0.1:3001;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}

宝塔部署建议

如果你使用宝塔面板,推荐按下面方式部署:

  1. 安装 Nginx
  2. 安装 Node.js 管理器PM2 管理器
  3. 上传项目到服务器
  4. 执行:
cd /www/wwwroot/SkillGo
npm install
npm run build
  1. 在宝塔创建 Node 项目
  • 项目目录:项目根目录
  • 启动命令:npm run start
  • 端口:3001
  1. 配置后端环境变量
PORT=3001
SKILLGO_DB_PATH=/www/wwwroot/skillgo-data/skillgo.db
  1. 新建网站,根目录指向:
/www/wwwroot/SkillGo/dist
  1. 在站点 Nginx 配置里加入上面的 //api/ 规则

  2. 如果要启用地图:

  • 到高德开放平台配置正式域名白名单
  • 填写 VITE_AMAP_KEY
  • 填写 VITE_AMAP_SECURITY_JS_CODE

常见问题

1. 首页地图只显示静态热区

通常是以下原因之一:

  • 未配置 VITE_AMAP_KEY
  • 未配置 VITE_AMAP_SECURITY_JS_CODE
  • 高德控制台域名白名单未配置
  • 当前网络无法加载高德 SDK

2. 生产环境页面能打开,但接口 404

通常说明:

  • Nginx 没有把 /api 反代到 Node 服务
  • 或后端没有启动成功

3. AI 客服提示模型不可用

请检查管理员后台中的模型名是否为渠道真实支持的名称。当前系统会优先尝试管理员填写的模型,并在失败时自动回退常见模型。

4. npm run start 之后前端页面打不开

这是正常的。npm run start 只启动后端 API,不会直接提供 Vite 打包后的前端静态资源。生产环境需要 Nginx 或其他静态服务器托管 dist

5. Windows 终端看到中文乱码

如果你在 Windows PowerShell / CMD 中看到中文乱码,通常是终端编码问题,不一定代表源码本身损坏。建议使用 UTF-8 终端或 Windows Terminal,并确认编辑器以 UTF-8 保存文件。

6. 后台修改的数据重启后丢失

请先确认你修改的是不是“内置种子数据”。当前种子逻辑会在启动时重复 upsert 一部分演示数据,详见上方“重要的数据持久化说明”。

后续优化建议

如果你准备把这个项目从课程演示继续推进到更正式的应用,建议优先做这些改造:

  • 将数据库 seed 改成只在首次初始化时执行
  • 为后端补充迁移脚本
  • 将 SQLite 切换为 MySQL / PostgreSQL
  • 将鉴权改为更完整的会话或 JWT 体系
  • 为聊天加入轮询或 WebSocket
  • 为 AI 客服增加模型列表与健康检测
  • 增加 CI、Lint、格式化和端到端测试

License

本项目包含 LICENSE 文件,请按仓库中的许可证使用。

About

SkillGo · AI-driven local service matching platform with real-time chat, smart recommendations, credit scoring, and LBS visualization. Full-stack demo with React + Node.js.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

SkillGo

SkillGo·技能到家是一个面向本地生活服务、活动执行和即时履约场景的前后端一体化演示项目。项目提供技能者展示、需求发布、订单履约跟踪、聊天沟通、评价与信用分、AI 客服、LBS 热区展示以及管理员后台,适合课程设计、原型演示、功能验证和二次开发。

本仓库当前同时包含:

  • React + Vite 前端应用
  • Node.js + Express 后端 API
  • SQLite 本地数据库
  • Node:test + supertest 接口测试

项目亮点

  • 首页集成 3D 地球、热区地图、标签云、即时订单播报和 Flash Squad Lab 编队模块
  • 技能广场支持按标签、地点、专长快速筛选,并可直接发起联系
  • 发布需求后会自动匹配技能者,并生成完整的订单详情与履约节点
  • 订单详情支持双向评价,评价结果会实时影响双方信用分
  • 聊天中心支持一对一会话,后端会去重重复会话
  • AI 客服可读取数据库内容回答平台问题,支持管理员自定义 API 地址、Key、模型和系统提示词
  • AI 客服在上游模型不可用时会自动回退到常见可用模型
  • 管理后台支持首页文案、用户、技能者、订单流程和 AI 配置管理
  • 支持深色 / 浅色主题切换

技术栈

前端

  • React 18
  • Vite 5
  • TypeScript
  • React Router DOM 6
  • Framer Motion
  • Three.js

后端

  • Node.js ESM
  • Express 4
  • SQLite + sqlite3

测试

  • Node:test
  • supertest

主要功能

1. 首页

首页不是简单的静态落地页,而是一个带业务状态的总览面板,包含:

  • Hero 区域和平台核心指标
  • EarthGlobe 3D 视图,展示技能者点位和订单履约点位
  • LbsExplorer 热区地图,接入高德 JS API 2.0,失败时自动降级为静态热区模式
  • 标签云和即时订单动态
  • Flash Squad Lab 任务编队器,根据最新需求和技能者数据生成“主力位 + 支持位 + 执行建议”
  • 最新雇佣需求列表
  • 右下角快捷入口,包括聊天、发布需求、AI 客服等

2. 技能广场与技能者主页

  • /providers 展示技能者卡片列表
  • 支持按关键词搜索名称、专长、地点、标签
  • 技能卡片支持一键联系
  • /providers/:id 展示技能者详情页
  • 详情页使用 ProfileMirror 聚合展示信用分、近期评价和技能档案

3. 发布需求与自动匹配

  • /requests/new 支持创建新需求
  • 表单字段包括雇佣者、需求主题、服务地点、预算、期望时间、优先标签
  • 提交后后端自动匹配一个技能者并生成订单详情
  • 订单会自动带出履约流程节点

4. 订单详情、履约和评价体系

  • /requests/:id 展示订单概览、匹配技能者、履约时间线
  • 同时展示雇佣者与服务者的信用分
  • 支持双向评价
  • 每次评价都会实时回写到被评价人的信用分
  • 技能者主页会同步显示近期评价和信用信息

5. 聊天中心

  • /chat 支持雇佣者和技能者一对一沟通
  • 通过技能卡片“一键联系”进入会话
  • 后端会对相同双方的直接会话做幂等处理
  • 仓库启动时也会尝试合并历史上重复生成的会话

6. AI 客服

  • /ai-support 提供对话式 AI 客服
  • AI 会读取数据库中的技能者、订单和站点配置上下文来回答问题
  • 管理员可配置:
    • API URL
    • API Key
    • 模型名
    • System Prompt
  • 支持只填写基础地址,例如 https://api.openai.com/v1,后端会自动补成 /chat/completions
  • 支持清空会话
  • 支持显示当前登录昵称;未登录时显示“我”
  • 当前配置模型不可用时,后端会自动回退尝试:
    • gpt-4o-mini
    • gpt-4.1-mini
    • gpt-4.1

7. 管理后台

  • /admin 仅管理员可见
  • 提供分区式控制台,包含:
    • 概览
    • 首页配置
    • 新增雇佣者 / 技能者
    • 用户管理
    • 技能者管理
    • 订单与流程管理
    • AI 配置管理

页面与路由

路由说明
/首页总览
/login登录 / 注册
/providers技能广场
/providers/:id技能者详情页
/requests/new发布需求
/requests/:id订单详情、履约、评价
/chat聊天中心
/ai-supportAI 客服
/admin管理后台

项目结构

SkillGo/
├─ public/ # 静态资源
├─ server/
│ ├─ data/ # SQLite 数据库默认目录
│ ├─ tests/ # 后端接口测试
│ ├─ app.js # Express 应用与 API 路由
│ ├─ db.js # 数据库、种子数据、Repository
│ └─ index.js # 后端启动入口
├─ src/
│ ├─ components/ # 通用 UI 组件
│ ├─ data/ # 前端兜底数据
│ ├─ hooks/ # Auth/useAsyncData 等 hooks
│ ├─ layouts/ # 首页/详情页布局组件
│ ├─ pages/ # 路由页面
│ ├─ services/ # API 请求封装
│ ├─ styles/ # 全局样式
│ ├─ types/ # TypeScript 类型定义
│ ├─ App.tsx # 路由注册
│ └─ main.tsx # 前端入口
├─ .storybook/ # Storybook 配置
├─ package.json
├─ vite.config.ts
└─ README.md

环境要求

建议环境:

  • Node.js 20+,最低建议 18+
  • npm 9+

项目使用了:

  • ESM
  • 顶层 await
  • 原生 fetch

因此不建议使用过旧的 Node 版本。

快速开始

1. 安装依赖

npm install

2. 可选:配置本地地图环境变量

在项目根目录创建 .env.local

VITE_AMAP_KEY=你的高德 Web Key
VITE_AMAP_SECURITY_JS_CODE=你的高德安全密钥

如果不配置,地图模块会自动退化为静态热区模式,页面仍可正常使用。

3. 启动后端

npm run dev:server

默认监听:

  • API: http://localhost:3001

4. 启动前端

npm run dev

默认监听:

  • Vite 开发端口: http://localhost:4173

5. 同时启动前后端

npm run dev:full

环境变量

前端变量

变量名说明默认值
VITE_AMAP_KEY高德地图 Web Key
VITE_AMAP_SECURITY_JS_CODE高德地图安全密钥

后端变量

变量名说明默认值
PORT后端服务端口3001
SKILLGO_DB_PATHSQLite 数据库文件路径server/data/skillgo.db

默认账号

项目内置了演示账号,登录页也会直接提示:

角色账号密码
高级管理员adminadmin123
雇佣者customercustomer123
技能者provider-erprovider123

同时前端也支持注册:

  • customer
  • provider

注册成功后会自动登录。

默认演示数据

首次启动后端时会自动创建数据库并写入种子数据,包括:

  • 技能者
  • 雇佣需求
  • 首页站点内容
  • 管理员与普通用户账号
  • AI 设置默认值

当前默认数据量大致为:

  • 10+ 技能者
  • 10+ 雇佣需求

重要的数据持久化说明

当前仓库更偏“演示 / 课程项目”模式,数据库种子在启动时会重复执行。

这意味着:

  • 内置的首页文案、内置用户、内置技能者、内置订单会在启动时被种子数据重新 upsert
  • 你在后台修改这些“内置演示数据”后,重启服务可能被种子覆盖
  • AI 设置表使用 ON CONFLICT DO NOTHING,管理员保存后的 AI 配置会保留
  • 聊天消息、评价记录、运行中新创建的数据会写入 SQLite 文件中

如果你准备把项目用于长期运行,建议下一步把“只在数据库首次创建时 seed”改成更标准的迁移/初始化模式。

可用脚本

命令说明
npm run dev启动前端开发服务器
npm run dev:server启动后端 API
npm run dev:full同时启动前后端
npm run build构建前端生产包
npm run preview预览前端构建产物
npm run start启动后端生产服务
npm run test:server运行后端接口测试
npm run storybook启动 Storybook
npm run build-storybook构建 Storybook

API 概览

以下为主要接口分组。

认证

  • POST /api/auth/login
  • POST /api/auth/register
  • GET /api/auth/me

面板与技能者

  • GET /api/dashboard
  • GET /api/providers
  • GET /api/providers/:id

需求与订单

  • GET /api/requests
  • GET /api/requests/:id
  • POST /api/requests
  • POST /api/requests/:id/reviews

聊天

  • GET /api/chat/conversations
  • POST /api/chat/conversations
  • GET /api/chat/conversations/:id/messages
  • POST /api/chat/conversations/:id/messages

AI 客服

  • GET /api/ai/settings
  • PUT /api/ai/settings
  • POST /api/ai/support

管理后台

  • GET /api/admin/snapshot
  • PUT /api/admin/site-content
  • POST /api/admin/users
  • PUT /api/admin/users/:id
  • DELETE /api/admin/users/:id
  • POST /api/admin/providers
  • PUT /api/admin/providers/:id
  • DELETE /api/admin/providers/:id
  • PUT /api/admin/requests/:id
  • DELETE /api/admin/requests/:id

核心业务规则

1. 评价与信用分

  • 评分必须是 1 到 5 的整数
  • 评论内容必填,最多 280 字
  • 评价成功后会立即更新被评价人的信用分
  • 订单详情页与技能者详情页会同步展示最新评价信息

2. 聊天会话去重

  • 同一对用户直接发起会话时,后端会复用已有会话
  • 仓库启动时也会尝试合并重复的历史直聊会话

3. AI 客服上下文

AI 客服不会只做纯文本聊天,而是会在请求时读取数据库上下文,主要包括:

  • 相关技能者
  • 相关订单
  • 平台站点配置

如果 AI 上游返回的是不支持当前模型的错误,后端会自动回退常见模型,并在全部失败时给出更友好的中文提示。

4. 地图降级策略

若高德地图 SDK 加载失败、Key 不可用、域名未加白名单或运行时不可用:

  • 页面会显示静态热区模式
  • 不会阻塞首页其余业务功能

测试说明

运行:

npm run test:server

当前后端测试覆盖了以下核心场景:

  • 仪表盘和种子数据可用
  • 发布需求能自动生成订单详情和履约事件
  • 同一对用户创建聊天会话保持幂等
  • 评价会回写信用分
  • AI 配置保存成功
  • AI 请求可带数据库上下文
  • AI 模型不可用时可自动回退
  • 所有回退模型不可用时返回友好提示
  • 仓库启动时可合并重复会话
  • 管理员可新增雇佣者与技能者
  • 请求表单校验有效

生产部署

推荐部署方式

推荐采用“前端静态站点 + Node API + Nginx 反向代理 + SQLite”的方式。

原因:

  • 前端构建产物是 dist
  • 后端 npm run start 只启动 API,不负责托管前端静态文件
  • 前端生产请求使用相对路径 /api
  • 因此生产环境需要 Web 服务器将 /api 代理到 Node 服务

通用部署步骤

  1. 安装依赖
npm install
  1. 配置生产环境变量
# 前端
VITE_AMAP_KEY=你的高德 Key
VITE_AMAP_SECURITY_JS_CODE=你的高德安全密钥
# 后端
PORT=3001
SKILLGO_DB_PATH=/your/path/skillgo.db
  1. 构建前端
npm run build
  1. 启动后端
npm run start
  1. 用 Nginx 托管 dist,并将 /api 反代到后端

Nginx 配置示例

location / {try_files$uri$uri/ /index.html;}location /api/ {proxy_passhttp://127.0.0.1:3001;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}

宝塔部署建议

如果你使用宝塔面板,推荐按下面方式部署:

  1. 安装 Nginx
  2. 安装 Node.js 管理器PM2 管理器
  3. 上传项目到服务器
  4. 执行:
cd /www/wwwroot/SkillGo
npm install
npm run build
  1. 在宝塔创建 Node 项目
  • 项目目录:项目根目录
  • 启动命令:npm run start
  • 端口:3001
  1. 配置后端环境变量
PORT=3001
SKILLGO_DB_PATH=/www/wwwroot/skillgo-data/skillgo.db
  1. 新建网站,根目录指向:
/www/wwwroot/SkillGo/dist
  1. 在站点 Nginx 配置里加入上面的 //api/ 规则

  2. 如果要启用地图:

  • 到高德开放平台配置正式域名白名单
  • 填写 VITE_AMAP_KEY
  • 填写 VITE_AMAP_SECURITY_JS_CODE

常见问题

1. 首页地图只显示静态热区

通常是以下原因之一:

  • 未配置 VITE_AMAP_KEY
  • 未配置 VITE_AMAP_SECURITY_JS_CODE
  • 高德控制台域名白名单未配置
  • 当前网络无法加载高德 SDK

2. 生产环境页面能打开,但接口 404

通常说明:

  • Nginx 没有把 /api 反代到 Node 服务
  • 或后端没有启动成功

3. AI 客服提示模型不可用

请检查管理员后台中的模型名是否为渠道真实支持的名称。当前系统会优先尝试管理员填写的模型,并在失败时自动回退常见模型。

4. npm run start 之后前端页面打不开

这是正常的。npm run start 只启动后端 API,不会直接提供 Vite 打包后的前端静态资源。生产环境需要 Nginx 或其他静态服务器托管 dist

5. Windows 终端看到中文乱码

如果你在 Windows PowerShell / CMD 中看到中文乱码,通常是终端编码问题,不一定代表源码本身损坏。建议使用 UTF-8 终端或 Windows Terminal,并确认编辑器以 UTF-8 保存文件。

6. 后台修改的数据重启后丢失

请先确认你修改的是不是“内置种子数据”。当前种子逻辑会在启动时重复 upsert 一部分演示数据,详见上方“重要的数据持久化说明”。

后续优化建议

如果你准备把这个项目从课程演示继续推进到更正式的应用,建议优先做这些改造:

  • 将数据库 seed 改成只在首次初始化时执行
  • 为后端补充迁移脚本
  • 将 SQLite 切换为 MySQL / PostgreSQL
  • 将鉴权改为更完整的会话或 JWT 体系
  • 为聊天加入轮询或 WebSocket
  • 为 AI 客服增加模型列表与健康检测
  • 增加 CI、Lint、格式化和端到端测试

License

本项目包含 LICENSE 文件,请按仓库中的许可证使用。

About

SkillGo · AI-driven local service matching platform with real-time chat, smart recommendations, credit scoring, and LBS visualization. Full-stack demo with React + Node.js.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

SkillGo

SkillGo·技能到家是一个面向本地生活服务、活动执行和即时履约场景的前后端一体化演示项目。项目提供技能者展示、需求发布、订单履约跟踪、聊天沟通、评价与信用分、AI 客服、LBS 热区展示以及管理员后台,适合课程设计、原型演示、功能验证和二次开发。

本仓库当前同时包含:

  • React + Vite 前端应用
  • Node.js + Express 后端 API
  • SQLite 本地数据库
  • Node:test + supertest 接口测试

项目亮点

  • 首页集成 3D 地球、热区地图、标签云、即时订单播报和 Flash Squad Lab 编队模块
  • 技能广场支持按标签、地点、专长快速筛选,并可直接发起联系
  • 发布需求后会自动匹配技能者,并生成完整的订单详情与履约节点
  • 订单详情支持双向评价,评价结果会实时影响双方信用分
  • 聊天中心支持一对一会话,后端会去重重复会话
  • AI 客服可读取数据库内容回答平台问题,支持管理员自定义 API 地址、Key、模型和系统提示词
  • AI 客服在上游模型不可用时会自动回退到常见可用模型
  • 管理后台支持首页文案、用户、技能者、订单流程和 AI 配置管理
  • 支持深色 / 浅色主题切换

技术栈

前端

  • React 18
  • Vite 5
  • TypeScript
  • React Router DOM 6
  • Framer Motion
  • Three.js

后端

  • Node.js ESM
  • Express 4
  • SQLite + sqlite3

测试

  • Node:test
  • supertest

主要功能

1. 首页

首页不是简单的静态落地页,而是一个带业务状态的总览面板,包含:

  • Hero 区域和平台核心指标
  • EarthGlobe 3D 视图,展示技能者点位和订单履约点位
  • LbsExplorer 热区地图,接入高德 JS API 2.0,失败时自动降级为静态热区模式
  • 标签云和即时订单动态
  • Flash Squad Lab 任务编队器,根据最新需求和技能者数据生成“主力位 + 支持位 + 执行建议”
  • 最新雇佣需求列表
  • 右下角快捷入口,包括聊天、发布需求、AI 客服等

2. 技能广场与技能者主页

  • /providers 展示技能者卡片列表
  • 支持按关键词搜索名称、专长、地点、标签
  • 技能卡片支持一键联系
  • /providers/:id 展示技能者详情页
  • 详情页使用 ProfileMirror 聚合展示信用分、近期评价和技能档案

3. 发布需求与自动匹配

  • /requests/new 支持创建新需求
  • 表单字段包括雇佣者、需求主题、服务地点、预算、期望时间、优先标签
  • 提交后后端自动匹配一个技能者并生成订单详情
  • 订单会自动带出履约流程节点

4. 订单详情、履约和评价体系

  • /requests/:id 展示订单概览、匹配技能者、履约时间线
  • 同时展示雇佣者与服务者的信用分
  • 支持双向评价
  • 每次评价都会实时回写到被评价人的信用分
  • 技能者主页会同步显示近期评价和信用信息

5. 聊天中心

  • /chat 支持雇佣者和技能者一对一沟通
  • 通过技能卡片“一键联系”进入会话
  • 后端会对相同双方的直接会话做幂等处理
  • 仓库启动时也会尝试合并历史上重复生成的会话

6. AI 客服

  • /ai-support 提供对话式 AI 客服
  • AI 会读取数据库中的技能者、订单和站点配置上下文来回答问题
  • 管理员可配置:
    • API URL
    • API Key
    • 模型名
    • System Prompt
  • 支持只填写基础地址,例如 https://api.openai.com/v1,后端会自动补成 /chat/completions
  • 支持清空会话
  • 支持显示当前登录昵称;未登录时显示“我”
  • 当前配置模型不可用时,后端会自动回退尝试:
    • gpt-4o-mini
    • gpt-4.1-mini
    • gpt-4.1

7. 管理后台

  • /admin 仅管理员可见
  • 提供分区式控制台,包含:
    • 概览
    • 首页配置
    • 新增雇佣者 / 技能者
    • 用户管理
    • 技能者管理
    • 订单与流程管理
    • AI 配置管理

页面与路由

路由说明
/首页总览
/login登录 / 注册
/providers技能广场
/providers/:id技能者详情页
/requests/new发布需求
/requests/:id订单详情、履约、评价
/chat聊天中心
/ai-supportAI 客服
/admin管理后台

项目结构

SkillGo/
├─ public/ # 静态资源
├─ server/
│ ├─ data/ # SQLite 数据库默认目录
│ ├─ tests/ # 后端接口测试
│ ├─ app.js # Express 应用与 API 路由
│ ├─ db.js # 数据库、种子数据、Repository
│ └─ index.js # 后端启动入口
├─ src/
│ ├─ components/ # 通用 UI 组件
│ ├─ data/ # 前端兜底数据
│ ├─ hooks/ # Auth/useAsyncData 等 hooks
│ ├─ layouts/ # 首页/详情页布局组件
│ ├─ pages/ # 路由页面
│ ├─ services/ # API 请求封装
│ ├─ styles/ # 全局样式
│ ├─ types/ # TypeScript 类型定义
│ ├─ App.tsx # 路由注册
│ └─ main.tsx # 前端入口
├─ .storybook/ # Storybook 配置
├─ package.json
├─ vite.config.ts
└─ README.md

环境要求

建议环境:

  • Node.js 20+,最低建议 18+
  • npm 9+

项目使用了:

  • ESM
  • 顶层 await
  • 原生 fetch

因此不建议使用过旧的 Node 版本。

快速开始

1. 安装依赖

npm install

2. 可选:配置本地地图环境变量

在项目根目录创建 .env.local

VITE_AMAP_KEY=你的高德 Web Key
VITE_AMAP_SECURITY_JS_CODE=你的高德安全密钥

如果不配置,地图模块会自动退化为静态热区模式,页面仍可正常使用。

3. 启动后端

npm run dev:server

默认监听:

  • API: http://localhost:3001

4. 启动前端

npm run dev

默认监听:

  • Vite 开发端口: http://localhost:4173

5. 同时启动前后端

npm run dev:full

环境变量

前端变量

变量名说明默认值
VITE_AMAP_KEY高德地图 Web Key
VITE_AMAP_SECURITY_JS_CODE高德地图安全密钥

后端变量

变量名说明默认值
PORT后端服务端口3001
SKILLGO_DB_PATHSQLite 数据库文件路径server/data/skillgo.db

默认账号

项目内置了演示账号,登录页也会直接提示:

角色账号密码
高级管理员adminadmin123
雇佣者customercustomer123
技能者provider-erprovider123

同时前端也支持注册:

  • customer
  • provider

注册成功后会自动登录。

默认演示数据

首次启动后端时会自动创建数据库并写入种子数据,包括:

  • 技能者
  • 雇佣需求
  • 首页站点内容
  • 管理员与普通用户账号
  • AI 设置默认值

当前默认数据量大致为:

  • 10+ 技能者
  • 10+ 雇佣需求

重要的数据持久化说明

当前仓库更偏“演示 / 课程项目”模式,数据库种子在启动时会重复执行。

这意味着:

  • 内置的首页文案、内置用户、内置技能者、内置订单会在启动时被种子数据重新 upsert
  • 你在后台修改这些“内置演示数据”后,重启服务可能被种子覆盖
  • AI 设置表使用 ON CONFLICT DO NOTHING,管理员保存后的 AI 配置会保留
  • 聊天消息、评价记录、运行中新创建的数据会写入 SQLite 文件中

如果你准备把项目用于长期运行,建议下一步把“只在数据库首次创建时 seed”改成更标准的迁移/初始化模式。

可用脚本

命令说明
npm run dev启动前端开发服务器
npm run dev:server启动后端 API
npm run dev:full同时启动前后端
npm run build构建前端生产包
npm run preview预览前端构建产物
npm run start启动后端生产服务
npm run test:server运行后端接口测试
npm run storybook启动 Storybook
npm run build-storybook构建 Storybook

API 概览

以下为主要接口分组。

认证

  • POST /api/auth/login
  • POST /api/auth/register
  • GET /api/auth/me

面板与技能者

  • GET /api/dashboard
  • GET /api/providers
  • GET /api/providers/:id

需求与订单

  • GET /api/requests
  • GET /api/requests/:id
  • POST /api/requests
  • POST /api/requests/:id/reviews

聊天

  • GET /api/chat/conversations
  • POST /api/chat/conversations
  • GET /api/chat/conversations/:id/messages
  • POST /api/chat/conversations/:id/messages

AI 客服

  • GET /api/ai/settings
  • PUT /api/ai/settings
  • POST /api/ai/support

管理后台

  • GET /api/admin/snapshot
  • PUT /api/admin/site-content
  • POST /api/admin/users
  • PUT /api/admin/users/:id
  • DELETE /api/admin/users/:id
  • POST /api/admin/providers
  • PUT /api/admin/providers/:id
  • DELETE /api/admin/providers/:id
  • PUT /api/admin/requests/:id
  • DELETE /api/admin/requests/:id

核心业务规则

1. 评价与信用分

  • 评分必须是 1 到 5 的整数
  • 评论内容必填,最多 280 字
  • 评价成功后会立即更新被评价人的信用分
  • 订单详情页与技能者详情页会同步展示最新评价信息

2. 聊天会话去重

  • 同一对用户直接发起会话时,后端会复用已有会话
  • 仓库启动时也会尝试合并重复的历史直聊会话

3. AI 客服上下文

AI 客服不会只做纯文本聊天,而是会在请求时读取数据库上下文,主要包括:

  • 相关技能者
  • 相关订单
  • 平台站点配置

如果 AI 上游返回的是不支持当前模型的错误,后端会自动回退常见模型,并在全部失败时给出更友好的中文提示。

4. 地图降级策略

若高德地图 SDK 加载失败、Key 不可用、域名未加白名单或运行时不可用:

  • 页面会显示静态热区模式
  • 不会阻塞首页其余业务功能

测试说明

运行:

npm run test:server

当前后端测试覆盖了以下核心场景:

  • 仪表盘和种子数据可用
  • 发布需求能自动生成订单详情和履约事件
  • 同一对用户创建聊天会话保持幂等
  • 评价会回写信用分
  • AI 配置保存成功
  • AI 请求可带数据库上下文
  • AI 模型不可用时可自动回退
  • 所有回退模型不可用时返回友好提示
  • 仓库启动时可合并重复会话
  • 管理员可新增雇佣者与技能者
  • 请求表单校验有效

生产部署

推荐部署方式

推荐采用“前端静态站点 + Node API + Nginx 反向代理 + SQLite”的方式。

原因:

  • 前端构建产物是 dist
  • 后端 npm run start 只启动 API,不负责托管前端静态文件
  • 前端生产请求使用相对路径 /api
  • 因此生产环境需要 Web 服务器将 /api 代理到 Node 服务

通用部署步骤

  1. 安装依赖
npm install
  1. 配置生产环境变量
# 前端
VITE_AMAP_KEY=你的高德 Key
VITE_AMAP_SECURITY_JS_CODE=你的高德安全密钥
# 后端
PORT=3001
SKILLGO_DB_PATH=/your/path/skillgo.db
  1. 构建前端
npm run build
  1. 启动后端
npm run start
  1. 用 Nginx 托管 dist,并将 /api 反代到后端

Nginx 配置示例

location / {try_files$uri$uri/ /index.html;}location /api/ {proxy_passhttp://127.0.0.1:3001;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}

宝塔部署建议

如果你使用宝塔面板,推荐按下面方式部署:

  1. 安装 Nginx
  2. 安装 Node.js 管理器PM2 管理器
  3. 上传项目到服务器
  4. 执行:
cd /www/wwwroot/SkillGo
npm install
npm run build
  1. 在宝塔创建 Node 项目
  • 项目目录:项目根目录
  • 启动命令:npm run start
  • 端口:3001
  1. 配置后端环境变量
PORT=3001
SKILLGO_DB_PATH=/www/wwwroot/skillgo-data/skillgo.db
  1. 新建网站,根目录指向:
/www/wwwroot/SkillGo/dist
  1. 在站点 Nginx 配置里加入上面的 //api/ 规则

  2. 如果要启用地图:

  • 到高德开放平台配置正式域名白名单
  • 填写 VITE_AMAP_KEY
  • 填写 VITE_AMAP_SECURITY_JS_CODE

常见问题

1. 首页地图只显示静态热区

通常是以下原因之一:

  • 未配置 VITE_AMAP_KEY
  • 未配置 VITE_AMAP_SECURITY_JS_CODE
  • 高德控制台域名白名单未配置
  • 当前网络无法加载高德 SDK

2. 生产环境页面能打开,但接口 404

通常说明:

  • Nginx 没有把 /api 反代到 Node 服务
  • 或后端没有启动成功

3. AI 客服提示模型不可用

请检查管理员后台中的模型名是否为渠道真实支持的名称。当前系统会优先尝试管理员填写的模型,并在失败时自动回退常见模型。

4. npm run start 之后前端页面打不开

这是正常的。npm run start 只启动后端 API,不会直接提供 Vite 打包后的前端静态资源。生产环境需要 Nginx 或其他静态服务器托管 dist

5. Windows 终端看到中文乱码

如果你在 Windows PowerShell / CMD 中看到中文乱码,通常是终端编码问题,不一定代表源码本身损坏。建议使用 UTF-8 终端或 Windows Terminal,并确认编辑器以 UTF-8 保存文件。

6. 后台修改的数据重启后丢失

请先确认你修改的是不是“内置种子数据”。当前种子逻辑会在启动时重复 upsert 一部分演示数据,详见上方“重要的数据持久化说明”。

后续优化建议

如果你准备把这个项目从课程演示继续推进到更正式的应用,建议优先做这些改造:

  • 将数据库 seed 改成只在首次初始化时执行
  • 为后端补充迁移脚本
  • 将 SQLite 切换为 MySQL / PostgreSQL
  • 将鉴权改为更完整的会话或 JWT 体系
  • 为聊天加入轮询或 WebSocket
  • 为 AI 客服增加模型列表与健康检测
  • 增加 CI、Lint、格式化和端到端测试

License

本项目包含 LICENSE 文件,请按仓库中的许可证使用。

About

SkillGo · AI-driven local service matching platform with real-time chat, smart recommendations, credit scoring, and LBS visualization. Full-stack demo with React + Node.js.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages