refactor: 项目架构重构 - 目录标准化 + 清理冗余
- 目录重命名: backend/wdkj-server/ → server/, frontend/ai-dimension/ → client/ - 删除 20+ 冗余文件(WDKJ 旧脚本、Windows 脚本、过时文档、设计稿) - 更新 package.json 元数据(移除 wdkj 命名) - 完善三级 .gitignore(根 + server + client) - 重写 README.md 和 CHANGELOG.md - 工具脚本移至 scripts/
@@ -1,5 +1,26 @@
|
||||
node_modules
|
||||
dist
|
||||
pnpm-lock.yaml
|
||||
# Dependencies
|
||||
node_modules/
|
||||
|
||||
# Build output
|
||||
dist/
|
||||
*.zip
|
||||
|
||||
# Environment & Secrets
|
||||
.env
|
||||
.env.local
|
||||
.env.*.local
|
||||
server/.env
|
||||
|
||||
# Logs
|
||||
logs/
|
||||
*.log
|
||||
|
||||
# OS
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
|
||||
# IDE
|
||||
.idea/
|
||||
.vscode/
|
||||
*.swp
|
||||
*.swo
|
||||
@@ -0,0 +1,37 @@
|
||||
# Changelog
|
||||
|
||||
## v1.1.0(2026-07-10)
|
||||
|
||||
### 项目重构
|
||||
- 项目从「维度空间(WDKJ)」全面改造为「宇之然AI维度」
|
||||
- 目录结构优化:`backend/wdkj-server/` → `server/`,`frontend/ai-dimension/` → `client/`
|
||||
- 删除过时文档和 WDKJ 遗留代码(拼音模块、画廊、BGM、22 个文件)
|
||||
- 数据库清理:删除 9 个旧集合(galleries/bgms/pinyin* 等)
|
||||
|
||||
### 后端
|
||||
- AI Chat system prompt 改为 5 个 AI 维度专业 prompt
|
||||
- 新增趋势接口 `GET /api/trend` + Trend 模型 + 自动更新 cron
|
||||
- 新增知识搜索接口 `GET /api/knowledge/search?q=xxx`
|
||||
- 成就系统重构:AI 主题成就(知识探索/收藏/AI 问答/社交)
|
||||
- 商品定价改为 Pro ¥19.9/月,VIP ¥39.9/月
|
||||
- 更新 35 条 AI 知识条目 + 12 条趋势数据
|
||||
- SSL 证书续期(有效期至 2026-10-07)
|
||||
- 排行榜改为公开访问
|
||||
|
||||
### 前端
|
||||
- 16 个完整页面(首页/维度详情/知识详情/AI问答/趋势/个人中心/登录/支付/收藏/进度/成就/排行榜/搜索/设置/反馈/资讯详情)
|
||||
- 暗色/亮色双主题系统,CSS 自定义属性体系
|
||||
- tabBar 跟随主题动态变色
|
||||
- 全局错误处理,空状态和失败降级
|
||||
- 文案优化:去掉技术黑话,增加语气助词
|
||||
|
||||
### 构建
|
||||
- 微信小程序构建通过(代码包 312KB)
|
||||
- H5 构建通过,全页面可用
|
||||
- 开发版 1.1.2 已上传微信公众平台
|
||||
|
||||
---
|
||||
|
||||
## v1.0.0(原始 WDKJ 版本)
|
||||
- 初始「维度空间」微信小程序,几何空间主题
|
||||
- 基础用户系统、知识库、AI 问答、微信支付
|
||||
@@ -1,54 +1,101 @@
|
||||
# 宇之然AI维度 — 项目管理
|
||||
# 宇之然AI维度(Yuzhiran AI Dimension)
|
||||
|
||||
> AI 知识探索社区 — 用 5 个维度系统化理解人工智能
|
||||
|
||||
| | 维度 | 内容方向 |
|
||||
|---|------|---------|
|
||||
| 🌌 | **AI 起源** | 图灵测试→达特茅斯→深蓝→AlphaGo→GPT |
|
||||
| 🚀 | **AI 发展** | 深度学习→Transformer→MoE→多模态→Agent |
|
||||
| 🔭 | **AI 当前** | 模型对比、开源/闭源生态、具身智能 |
|
||||
| 🛠️ | **AI 学习** | 提示词工程→RAG→微调→工具链→入门教程 |
|
||||
| 📡 | **AI 趋势** | 每日资讯、产品动态、论文快报 |
|
||||
|
||||
## 项目结构
|
||||
|
||||
## 目录结构
|
||||
```
|
||||
yuzhiran-ai-dimension/
|
||||
├── backend/ # 后端源码(从线上复制)
|
||||
│ └── wdkj-server/ # Node.js Express 项目
|
||||
│ └── src/ # 49 个源文件
|
||||
├── frontend/ # 前端项目(待创建)
|
||||
│ └── (uni-app 项目)
|
||||
├── design/
|
||||
│ └── ui-mockup.html # 移动端 UI 设计稿
|
||||
└── docs/
|
||||
├── product-plan.md # 产品规划文档
|
||||
└── api-assessment.md # API 评估与改造计划
|
||||
ai-dimension/
|
||||
├── server/ # 后端 API(Node.js + Express + MongoDB)
|
||||
│ ├── src/
|
||||
│ │ ├── index.js # 入口
|
||||
│ │ ├── config/ # 数据库配置
|
||||
│ │ ├── middleware/ # 认证中间件
|
||||
│ │ ├── models/ # Mongoose 数据模型
|
||||
│ │ ├── routes/ # API 路由(auth/knowledge/aiChat/trend/user/payment/feedback/admin)
|
||||
│ │ ├── scripts/ # 数据脚本(趋势更新/商品定价/内容填充)
|
||||
│ │ └── utils/ # 工具(日志/响应/微信支付)
|
||||
│ ├── tests/ # Jest 测试
|
||||
│ └── package.json # npm 依赖
|
||||
├── client/ # 前端(uni-app 微信小程序 + H5)
|
||||
│ ├── src/
|
||||
│ │ ├── pages/ # 16 个页面
|
||||
│ │ ├── components/ # 公共组件(DimCard / NewsCard)
|
||||
│ │ ├── stores/ # Pinia 状态管理(user/knowledge/chat)
|
||||
│ │ ├── utils/ # 工具(API封装/维度配置/错误处理)
|
||||
│ │ ├── styles/ # 主题系统(theme.scss)
|
||||
│ │ └── static/ # 图标资源
|
||||
│ ├── pages.json # 路由配置
|
||||
│ ├── manifest.json # 小程序配置
|
||||
│ └── package.json # pnpm 依赖
|
||||
├── scripts/ # 项目工具
|
||||
│ └── upload-wx.js # 微信开发者工具上传脚本
|
||||
└── package.json # 根 workspace
|
||||
```
|
||||
|
||||
## 开发任务清单
|
||||
## 技术栈
|
||||
|
||||
### 阶段一:内容填充(1-2天)
|
||||
- [ ] 用管理后台给 Knowledge 库批量填充 AI 内容
|
||||
- dim1 AI 起源:10 篇
|
||||
- dim2 AI 发展:10 篇
|
||||
- dim3 AI 当前:10 篇
|
||||
- dim4 AI 学习:15 篇
|
||||
- dim5 AI 趋势:cron 自动推送
|
||||
- [ ] 修改 AIModel 配置,对接云帆网关
|
||||
| 层 | 技术 |
|
||||
|---|------|
|
||||
| 前端框架 | uni-app 3(Vue 3 + Vite + Pinia) |
|
||||
| 跨端 | 微信小程序 + H5 |
|
||||
| UI 主题 | 宇宙深空暗色/亮色双主题,CSS 自定义属性 |
|
||||
| 后端 | Node.js + Express |
|
||||
| 数据库 | MongoDB(Mongoose 8) |
|
||||
| 认证 | JWT + 微信登录 |
|
||||
| 支付 | 微信支付(V3 API) |
|
||||
| AI 问答 | 多模型适配(AIModel 配置) |
|
||||
|
||||
### 阶段二:后端改造(1天)
|
||||
- [ ] 改 AI Chat system prompt → AI 主题
|
||||
- [ ] 新增趋势资讯接口
|
||||
- [ ] 改商品数据(Pro/VIP 定价)
|
||||
## 快速开始
|
||||
|
||||
### 阶段三:前端开发(uni-app 全新,1-2周)
|
||||
- [ ] 初始化 uni-app 项目
|
||||
- [ ] 首页:5 维度卡片 + 今日快讯
|
||||
- [ ] 维度详情页:知识列表 + 问答
|
||||
- [ ] AI 问答页:对话界面 + 配额管理
|
||||
- [ ] 趋势页:资讯流
|
||||
- [ ] 个人中心:进度/收藏/订阅
|
||||
- [ ] 微信登录集成
|
||||
### 后端
|
||||
|
||||
### 阶段四:上架更新(1-3天)
|
||||
- [ ] 改小程序名:宇之然AI维度
|
||||
- [ ] 简称:AI维度
|
||||
- [ ] 提审微信更新
|
||||
```bash
|
||||
cd server
|
||||
cp .env.example .env # 编辑数据库连接等配置
|
||||
npm install
|
||||
npm run dev # 开发模式(nodemon)
|
||||
npm start # 生产模式
|
||||
```
|
||||
|
||||
## 命名与品牌
|
||||
- 微信小程序全名:宇之然AI维度
|
||||
- 微信小程序简称:AI维度
|
||||
- 小程序 appid:wxdad62baf4ccd09e3
|
||||
- 后端主域名:wdkj.yuzhiran.com.cn → :3001
|
||||
- 管理后台:wdkjadmin.yzrcloud.cn
|
||||
- H5 地址:www.wdkj.yuzhiran.com.cn/h5/
|
||||
### 前端
|
||||
|
||||
```bash
|
||||
cd client
|
||||
pnpm install
|
||||
pnpm dev:h5 # H5 开发
|
||||
pnpm build:mp-weixin # 构建微信小程序
|
||||
pnpm build:h5 # 构建 H5
|
||||
```
|
||||
|
||||
## API 概览
|
||||
|
||||
| 端点 | 说明 |
|
||||
|------|------|
|
||||
| `POST /api/auth/login` | 微信/H5登录 |
|
||||
| `GET /api/knowledge` | 知识列表(按维度筛选) |
|
||||
| `GET /api/knowledge/search` | 知识搜索 |
|
||||
| `POST /api/ai-chat/ask` | AI问答 |
|
||||
| `GET /api/trend` | 趋势资讯 |
|
||||
| `POST /api/payment/create-order` | 创建支付订单 |
|
||||
| `GET /api/user/progress` | 学习进度 |
|
||||
| `GET /api/user/achievements` | 成就列表 |
|
||||
| `GET /api/user/leaderboard` | 排行榜 |
|
||||
|
||||
## 部署
|
||||
|
||||
线上服务:`yzr-wdkj.service`(systemd),端口 3001,反向代理至 `wdkj.yuzhiran.com.cn`。
|
||||
|
||||
趋势数据由 Hermes cron 每日 8:00 自动更新。
|
||||
|
||||
## 版本
|
||||
|
||||
v1.1.0 — 详见 [CHANGELOG.md](./CHANGELOG.md)
|
||||
@@ -1,263 +0,0 @@
|
||||
# 宇之然·星辰绘线 - 后端服务
|
||||
|
||||
## 项目简介
|
||||
|
||||
这是宇之然·星辰绘线项目的后端服务,提供 RESTful API 接口,支持微信小程序和后台管理系统。
|
||||
# 1. 查找占用指定端口的进程ID
|
||||
netstat -tunlp | grep :3001
|
||||
# 2. 根据进程ID kill进程
|
||||
kill -9 进程ID
|
||||
|
||||
## 技术栈
|
||||
|
||||
- **运行时**: Node.js 18+
|
||||
- **框架**: Express.js 4.18
|
||||
- **数据库**: MongoDB (Mongoose ODM)
|
||||
- **认证**: JWT
|
||||
- **安全**: Helmet, CORS, Rate Limit
|
||||
|
||||
## 项目结构
|
||||
|
||||
```
|
||||
wdkj-server/
|
||||
├── src/
|
||||
│ ├── config/ # 配置文件
|
||||
│ │ └── database.js # 数据库连接
|
||||
│ ├── middleware/ # 中间件
|
||||
│ │ └── auth.js # 认证中间件
|
||||
│ ├── models/ # 数据模型
|
||||
│ │ ├── User.js # 用户模型
|
||||
│ │ ├── Order.js # 订单模型
|
||||
│ │ ├── Gallery.js # 画廊模型
|
||||
│ │ ├── Knowledge.js # 知识库模型
|
||||
│ │ ├── ShopItem.js # 商品模型
|
||||
│ │ ├── Admin.js # 管理员模型
|
||||
│ │ └── AdminLog.js # 操作日志模型
|
||||
│ ├── routes/ # 路由
|
||||
│ │ ├── auth.js # 认证路由
|
||||
│ │ ├── user.js # 用户路由
|
||||
│ │ ├── payment.js # 支付路由
|
||||
│ │ ├── gallery.js # 画廊路由
|
||||
│ │ ├── knowledge.js # 知识库路由
|
||||
│ │ ├── admin.js # 管理后台路由
|
||||
│ │ └── index.js # 路由汇总
|
||||
│ ├── utils/ # 工具函数
|
||||
│ │ ├── response.js # 统一响应
|
||||
│ │ ├── logger.js # 日志工具
|
||||
│ │ └── weixin.js # 微信API工具
|
||||
│ └── index.js # 主入口
|
||||
├── logs/ # 日志目录
|
||||
├── .env # 环境变量
|
||||
├── package.json # 项目配置
|
||||
└── README.md # 项目说明
|
||||
```
|
||||
|
||||
## 快速开始
|
||||
|
||||
### 1. 安装依赖
|
||||
|
||||
```bash
|
||||
cd wdkj-server
|
||||
npm install
|
||||
```
|
||||
|
||||
### 2. 配置环境变量
|
||||
|
||||
复制 `.env.example` 为 `.env` 并修改配置:
|
||||
|
||||
```env
|
||||
# 服务配置
|
||||
PORT=3000
|
||||
NODE_ENV=development
|
||||
|
||||
# MongoDB 配置
|
||||
MONGODB_URI=mongodb://wdkj123:wdkj123@192.168.136.130:27017/wdkj?authSource=wdkj
|
||||
|
||||
# JWT 配置
|
||||
JWT_SECRET=your_secret_key_here
|
||||
JWT_EXPIRE=7d
|
||||
|
||||
# 微信小程序配置
|
||||
WX_APPID=wxdad62baf4ccd09e3
|
||||
WX_SECRET=your_wx_app_secret
|
||||
|
||||
# 微信支付配置
|
||||
WX_PAY_MCH_ID=1108945993
|
||||
WX_PAY_API_KEY=your_apiv3_key
|
||||
```
|
||||
|
||||
### 3. 启动服务
|
||||
|
||||
```bash
|
||||
# 开发环境
|
||||
npm run dev
|
||||
|
||||
# 生产环境
|
||||
npm start
|
||||
```
|
||||
|
||||
### 4. 验证服务
|
||||
|
||||
访问健康检查接口:
|
||||
|
||||
```bash
|
||||
curl http://localhost:3000/health
|
||||
```
|
||||
|
||||
## API 文档
|
||||
|
||||
### 认证相关
|
||||
|
||||
- `POST /api/auth/login` - 小程序登录
|
||||
- `POST /api/auth/admin/login` - 管理员登录
|
||||
- `GET /api/auth/me` - 获取当前用户信息
|
||||
|
||||
### 用户相关
|
||||
|
||||
- `GET /api/user/progress` - 获取用户进度
|
||||
- `POST /api/user/progress` - 保存用户进度
|
||||
- `GET /api/user/leaderboard` - 获取排行榜
|
||||
|
||||
### 支付相关
|
||||
|
||||
- `POST /api/payment/create-order` - 创建订单
|
||||
- `POST /api/payment/callback` - 支付回调
|
||||
- `POST /api/payment/verify` - 验证支付
|
||||
- `GET /api/payment/products` - 获取商品列表
|
||||
|
||||
### 画廊相关
|
||||
|
||||
- `GET /api/gallery` - 获取作品列表
|
||||
- `POST /api/gallery` - 上传作品
|
||||
- `GET /api/gallery/:id` - 获取作品详情
|
||||
- `POST /api/gallery/:id/like` - 点赞作品
|
||||
|
||||
### 知识库相关
|
||||
|
||||
- `GET /api/knowledge` - 获取知识列表
|
||||
- `GET /api/knowledge/:id` - 获取知识详情
|
||||
- `POST /api/knowledge/:id/collect` - 收藏知识
|
||||
- `GET /api/knowledge/:dim/questions` - 获取问答
|
||||
|
||||
### 管理后台
|
||||
|
||||
- `GET /api/admin/dashboard` - 获取仪表盘数据
|
||||
- `GET /api/admin/users` - 获取用户列表
|
||||
- `GET /api/admin/users/:id` - 获取用户详情
|
||||
- `GET /api/admin/knowledge` - 获取知识列表
|
||||
- `POST /api/admin/knowledge` - 创建/更新知识
|
||||
- `POST /api/admin/knowledge/review` - 审核知识
|
||||
- `GET /api/admin/gallery` - 获取画廊作品
|
||||
- `POST /api/admin/gallery/review` - 审核作品
|
||||
- `GET /api/admin/orders` - 获取订单列表
|
||||
- `GET /api/admin/shop` - 获取商品列表
|
||||
- `POST /api/admin/shop` - 保存商品
|
||||
- `GET /api/admin/logs` - 获取操作日志
|
||||
|
||||
## 数据库初始化
|
||||
|
||||
首次启动服务时,需要初始化管理员账户:
|
||||
|
||||
```javascript
|
||||
// 可以创建一个初始化脚本
|
||||
const Admin = require('./src/models/Admin')
|
||||
|
||||
async function initAdmin() {
|
||||
const admin = new Admin({
|
||||
username: 'admin',
|
||||
password: 'admin123456',
|
||||
email: 'admin@wdkj.com',
|
||||
role: 'super_admin',
|
||||
permissions: ['*']
|
||||
})
|
||||
await admin.save()
|
||||
}
|
||||
```
|
||||
|
||||
## 开发指南
|
||||
|
||||
### 代码规范
|
||||
|
||||
- 使用 ES6+ 语法
|
||||
- 异步操作使用 async/await
|
||||
- 错误统一通过 ApiResponse 处理
|
||||
- 所有操作记录日志
|
||||
|
||||
### 日志系统
|
||||
|
||||
日志级别:
|
||||
- `debug`: 调试信息
|
||||
- `info`: 常规信息
|
||||
- `warn`: 警告信息
|
||||
- `error`: 错误信息
|
||||
|
||||
使用示例:
|
||||
|
||||
```javascript
|
||||
const logger = require('./utils/logger')
|
||||
|
||||
logger.info('用户登录', { openid: 'xxx' })
|
||||
logger.error('数据库错误', error)
|
||||
```
|
||||
|
||||
### 权限系统
|
||||
|
||||
角色权限矩阵:
|
||||
|
||||
| 角色 | 权限范围 |
|
||||
|------|----------|
|
||||
| super_admin | 所有权限 (*) |
|
||||
| content_manager | 知识库、画廊、用户查看 |
|
||||
| shop_manager | 商品、订单、用户查看 |
|
||||
| viewer | 仪表盘、分析、用户查看 |
|
||||
|
||||
## 生产部署
|
||||
|
||||
### 使用 PM2
|
||||
|
||||
```bash
|
||||
# 安装 PM2
|
||||
npm install -g pm2
|
||||
|
||||
# 启动服务
|
||||
pm2 start src/index.js --name wdkj-server
|
||||
|
||||
# 查看状态
|
||||
pm2 status
|
||||
|
||||
# 查看日志
|
||||
pm2 logs wdkj-server
|
||||
```
|
||||
|
||||
### 使用 Docker
|
||||
|
||||
创建 `Dockerfile`:
|
||||
|
||||
```dockerfile
|
||||
FROM node:18-alpine
|
||||
WORKDIR /app
|
||||
COPY package*.json ./
|
||||
RUN npm ci --only=production
|
||||
COPY . .
|
||||
EXPOSE 3000
|
||||
CMD ["npm", "start"]
|
||||
```
|
||||
|
||||
构建并运行:
|
||||
|
||||
```bash
|
||||
docker build -t wdkj-server .
|
||||
docker run -p 3000:3000 -d wdkj-server
|
||||
```
|
||||
|
||||
## 注意事项
|
||||
|
||||
1. **安全**: 生产环境必须修改 JWT_SECRET
|
||||
2. **数据库**: 确保 MongoDB 已正确配置访问权限
|
||||
3. **支付**: 微信支付需要真实的商户证书和密钥
|
||||
4. **日志**: 生产环境会自动写入日志文件
|
||||
5. **限流**: 已配置 API 请求频率限制
|
||||
|
||||
## 许可证
|
||||
|
||||
MIT License
|
||||
@@ -1,25 +0,0 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIENDCCAxygAwIBAgIUYUzuDMy950xrnuZnUV3V4gBjtKQwDQYJKoZIhvcNAQEL
|
||||
BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT
|
||||
FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg
|
||||
Q0EwHhcNMjYwMzI0MDYzNTUxWhcNMzEwMzIzMDYzNTUxWjCBjTETMBEGA1UEAwwK
|
||||
MTEwODk0NTk5MzEbMBkGA1UECgwS5b6u5L+h5ZWG5oi357O757ufMTkwNwYDVQQL
|
||||
DDDljJfkuqzlrofkuYvnhLbnp5HmioDkuK3lv4PvvIjkuKrkvZPlt6XllYbmiLfv
|
||||
vIkxCzAJBgNVBAYTAkNOMREwDwYDVQQHDAhTaGVuWmhlbjCCASIwDQYJKoZIhvcN
|
||||
AQEBBQADggEPADCCAQoCggEBANKG2DnPUqF4kP/IErd0z7MejTXhfRT/9shGgNUm
|
||||
SFQmK5Vb7owQyFORj5Y22r5Xa+g7t0Wjwmc8jjIFiIIUickf9IHedDzpclK6nPcf
|
||||
whgEQ5YolA0yRSujlBdpDKxiZED/OdiF+oRNW3Orl4dC2eb/+yCvjr9IgXRwnn4l
|
||||
ODP8DQ4/xW6JnQhyy+yQ4vydhkK1G1aaqS3kQAyQopgwcGif1e9Wo6JI1c+1MF98
|
||||
4KNLEVABg9sH2yRMYSsspyvJfdu+FA9oZT5LXGjSrdyaq7t8cESqRzhQMLvRcZ3o
|
||||
QSbY9EE9Xy0dt9URS7ZdK53MwoRpnQsUSwpWT8r07f9sM1ECAwEAAaOBuTCBtjAJ
|
||||
BgNVHRMEAjAAMAsGA1UdDwQEAwID+DCBmwYDVR0fBIGTMIGQMIGNoIGKoIGHhoGE
|
||||
aHR0cDovL2V2Y2EuaXRydXMuY29tLmNuL3B1YmxpYy9pdHJ1c2NybD9DQT0xQkQ0
|
||||
MjIwRTUwREJDMDRCMDZBRDM5NzU0OTg0NkMwMUMzRThFQkQyJnNnPUhBQ0M0NzFC
|
||||
NjU0MjJFMTJCMjdBOUQzM0E4N0FEMUNERjU5MjZFMTQwMzcxMA0GCSqGSIb3DQEB
|
||||
CwUAA4IBAQCXQjHcCkJh/Wr3qvi5q3yBXA/zUchZOtBh220dGdEvR+L+9s9i7aGf
|
||||
legNT0+E1AakD/W6TC25pL7oK3QmyjdW+JGdNtfVh5v+uUNu333mRPre5Bj94cfJ
|
||||
9W7EHgfzEi3MJ3HXBclh7pCyxl6FRXXXj7STeBetVH0njvYRV6nOl7wobW77lE5N
|
||||
JkUYPVPPd5pbS3BSpykBS4zxtaBK2MtzhhELonAbzib2z0edlwlGoJD0BFAr7BGT
|
||||
00mM95Hz5I3W4UgHvv+mDlOMjBAwCtaDSSCoJDhiaxs/WEru4jSqY4aiKEsVrtAQ
|
||||
zcR9dNa21f+uzO6/oziswYstXOkzeVoc
|
||||
-----END CERTIFICATE-----
|
||||
@@ -1,28 +0,0 @@
|
||||
-----BEGIN PRIVATE KEY-----
|
||||
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDShtg5z1KheJD/
|
||||
yBK3dM+zHo014X0U//bIRoDVJkhUJiuVW+6MEMhTkY+WNtq+V2voO7dFo8JnPI4y
|
||||
BYiCFInJH/SB3nQ86XJSupz3H8IYBEOWKJQNMkUro5QXaQysYmRA/znYhfqETVtz
|
||||
q5eHQtnm//sgr46/SIF0cJ5+JTgz/A0OP8VuiZ0IcsvskOL8nYZCtRtWmqkt5EAM
|
||||
kKKYMHBon9XvVqOiSNXPtTBffOCjSxFQAYPbB9skTGErLKcryX3bvhQPaGU+S1xo
|
||||
0q3cmqu7fHBEqkc4UDC70XGd6EEm2PRBPV8tHbfVEUu2XSudzMKEaZ0LFEsKVk/K
|
||||
9O3/bDNRAgMBAAECggEBAJdPgZMzNmGFpTmhlAo1M566o6WJNnxkZ/uT6L7J8AxD
|
||||
Duofk/kpisG9ieTd8iQB8zWLzfKIe431kQHUxkMv/cQHapX4y7SH2LorE+vt8HOQ
|
||||
hP8klRxS+DIgNK0KvKgdY47voaTEzsROUR92wcbevnxvmQ/p/f/vXdPRqahimd2J
|
||||
yZhIizb+H/d9ua5co5icVcupknK+mBna5uDqa/hoYPNVXmvzF4I1bZFeylN3v9CE
|
||||
3YQt3qZ9OPPHl4zTQWkx7c2c+ELzOC9xWanUhfw41vtuv3hreZBZp9+jJpP5z9P7
|
||||
Rr1LCom7RtDNW0Py18p7GX3jAmjLoIehfqnIdjN0aU0CgYEA9ermlfZAP4W2MH+v
|
||||
t97xlXn6JWBC9Mwlu7xqEJlfrdk8c/z5krBOoc+11WZoUZdtMlho1R8l4qn4GWUG
|
||||
VbAQJm/M2kdMVTmDWnx/2DiCrqH07mjxf6UgX1kUwiBU4YZTI+qWSV9tzf7mXtpD
|
||||
mupOnRInA9urvGocUgThllaCXasCgYEA2yh9McFKrkUZ6v9HFXekLWTjpVV2xXYU
|
||||
4l7UJS8oMHMrIftP4O6EAvkOH6ZP1Ip61KQACfe0j0TiiXrLvpNXmxEe9gfaWTZY
|
||||
OjYeGy0sdJQ8ByXzsaguPDI20qMn56nluDRWgh9JqIUB5ZYSE84wh9hhEJdJEi0a
|
||||
uQVQusxZ3vMCgYBQcGa+dM8tOBKRKKMUtPM23rBJG4SrSD+regUDqveWCTHyCrSk
|
||||
G9GMskGbLSVAUxTf2/VmiQq+arSBsf7xdmbB+935JEs+sVJa/dBfrJRqhQV2GpOs
|
||||
GhpNtfjJSwQYxPRbEjfYhkOHlzJJooFsoenXDQIADBHPzrG2zmvv3hpEgwKBgDAd
|
||||
L38g5HhmC06gRMbdwVmF8MR3gt/PEL6x+vk+5R/d6PZI6jyDoM/WRdeE97m9vUG5
|
||||
z5hgnW9mvCVapChuyKjulVGGX9V+LNh60Rk+Tag6cwNOvbWfKqdkjsynrTcbAafz
|
||||
NZrTq6Qnr0bsL4PRnK32PzkZPZ2T8W31UMfx3TkpAoGBANuTZsojCvyL1ZfcB4P8
|
||||
Cf+Xv6CU5165DE+q+Sj3/HDrmDnDD9J4B0TlXj1803dydz4ZsC2BJqmCDXQGFI09
|
||||
FbQV3AIGE4XI2GWIC9f4+0W1FfAUp0Y2I5p7OMl4eN7RKh0PHCajN5pM534cZ0k/
|
||||
TQHNwOuaI56juLP4TIMKDPGk
|
||||
-----END PRIVATE KEY-----
|
||||
@@ -1,9 +0,0 @@
|
||||
-----BEGIN PUBLIC KEY-----
|
||||
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzK+YibPERKTi8CaO+Yq
|
||||
meTdJmaTqHTS/XBbnRmZgQmudwPIfybp1E+wPKixcBrw/qaj6Ewfoo+6eh++aUVw
|
||||
ImiQcmYrF+4IgpaTJMfYwYgyeig8XlGlwNNngWPZ7g+7Q7FZUjMYJ4ITq2IHCyWR
|
||||
IhQfPY9auZdBAndtcX9flDdUAzur2EDYVNYMlFMxt2wGnBGfXitsZefWdvRq5IA1
|
||||
N8zCxfCRvN9GFBjtjQXKeUmPwxLmcqKuA3fRz/THjq0oeggQK9PNQmtZgUD8nKE7
|
||||
cils+CFpkLK+a34iFIA2QHygL6itReyV7O47MD4gYYW+aCmp/L0FUcdISJtaCZ2T
|
||||
9QIDAQAB
|
||||
-----END PUBLIC KEY-----
|
||||
@@ -1,19 +0,0 @@
|
||||
@echo off
|
||||
echo ========================================
|
||||
echo 运行单元测试和集成测试
|
||||
echo ========================================
|
||||
echo.
|
||||
|
||||
cd %~dp0
|
||||
|
||||
echo [1/3] 设置测试环境...
|
||||
set NODE_ENV=test
|
||||
|
||||
echo [2/3] 运行测试...
|
||||
call npm test
|
||||
|
||||
echo.
|
||||
echo [3/3] 生成测试报告...
|
||||
echo 测试完成!
|
||||
|
||||
pause
|
||||
@@ -1,37 +0,0 @@
|
||||
@echo off
|
||||
echo ========================================
|
||||
echo MongoDB 用户创建工具
|
||||
echo ========================================
|
||||
echo.
|
||||
echo 请在 MongoDB 服务器上执行以下命令:
|
||||
echo.
|
||||
echo 1. 连接到 MongoDB:
|
||||
echo mongo --host 192.168.136.130 --port 27017
|
||||
echo.
|
||||
echo 2. 切换到 admin 数据库:
|
||||
echo use admin
|
||||
echo.
|
||||
echo 3. 创建管理员用户(如果还没有):
|
||||
echo db.createUser({
|
||||
echo user: "admin",
|
||||
echo pwd: "admin123",
|
||||
echo roles: ["root"]
|
||||
echo })
|
||||
echo.
|
||||
echo 4. 切换到 wdkj 数据库:
|
||||
echo use wdkj
|
||||
echo.
|
||||
echo 5. 创建 wdkj 用户:
|
||||
echo db.createUser({
|
||||
echo user: "wdkj123",
|
||||
echo pwd: "wdkj123",
|
||||
echo roles: [
|
||||
echo { role: "readWrite", db: "wdkj" }
|
||||
echo ]
|
||||
echo })
|
||||
echo.
|
||||
echo 6. 验证用户:
|
||||
echo db.auth("wdkj123", "wdkj123")
|
||||
echo.
|
||||
echo ========================================
|
||||
pause
|
||||
@@ -1,36 +0,0 @@
|
||||
/**
|
||||
* 快速修复BGM URL - 使用测试音频
|
||||
*/
|
||||
|
||||
const mongoose = require('mongoose')
|
||||
require('dotenv').config()
|
||||
|
||||
const { BGM } = require('../src/models')
|
||||
|
||||
// 免费的测试音频URL (SoundHelix - 可商用)
|
||||
const TEST_AUDIO_URL = 'https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3'
|
||||
|
||||
async function fixBGMUrls() {
|
||||
try {
|
||||
await mongoose.connect(process.env.MONGODB_URI || 'mongodb://localhost:27017/yuzhiran')
|
||||
console.log('✅ 数据库连接成功')
|
||||
|
||||
// 更新所有BGM的URL为测试音频
|
||||
const result = await BGM.updateMany(
|
||||
{},
|
||||
{ url: TEST_AUDIO_URL }
|
||||
)
|
||||
|
||||
console.log(`✅ 已更新 ${result.modifiedCount} 条BGM记录`)
|
||||
console.log(` 新URL: ${TEST_AUDIO_URL}`)
|
||||
console.log('\n💡 现在可以测试BGM播放功能了')
|
||||
console.log('⚠️ 注意: 这是测试音频,生产环境请替换为正式音乐')
|
||||
|
||||
} catch (error) {
|
||||
console.error('❌ 更新失败:', error)
|
||||
} finally {
|
||||
await mongoose.disconnect()
|
||||
}
|
||||
}
|
||||
|
||||
fixBGMUrls()
|
||||
@@ -1,171 +0,0 @@
|
||||
/**
|
||||
* BGM音效初始化脚本
|
||||
* 为每个维度添加示例背景音乐
|
||||
*/
|
||||
|
||||
const mongoose = require('mongoose')
|
||||
require('dotenv').config()
|
||||
|
||||
// 导入模型
|
||||
const { BGM } = require('../src/models')
|
||||
|
||||
// 示例BGM数据(实际使用时需要替换为真实的音频URL)
|
||||
const sampleBGMs = [
|
||||
// 一维 - 线性旋律
|
||||
{
|
||||
name: '星光轨迹',
|
||||
dimension: 1,
|
||||
url: 'https://example.com/bgm/dim1_starlight.mp3',
|
||||
duration: 120,
|
||||
loop: true,
|
||||
volume: 0.4,
|
||||
sortOrder: 1,
|
||||
description: '轻柔的线性旋律,适合一维空间的探索',
|
||||
isActive: true
|
||||
},
|
||||
{
|
||||
name: '弦之舞',
|
||||
dimension: 1,
|
||||
url: 'https://example.com/bgm/dim1_string_dance.mp3',
|
||||
duration: 95,
|
||||
loop: true,
|
||||
volume: 0.45,
|
||||
sortOrder: 2,
|
||||
description: '活泼的弦乐节奏',
|
||||
isActive: true
|
||||
},
|
||||
|
||||
// 二维 - 平面和声
|
||||
{
|
||||
name: '星座幻想',
|
||||
dimension: 2,
|
||||
url: 'https://example.com/bgm/dim2_constellation.mp3',
|
||||
duration: 150,
|
||||
loop: true,
|
||||
volume: 0.5,
|
||||
sortOrder: 1,
|
||||
description: '梦幻的星空音乐,配合二维星座绘制',
|
||||
isActive: true
|
||||
},
|
||||
{
|
||||
name: '几何韵律',
|
||||
dimension: 2,
|
||||
url: 'https://example.com/bgm/dim2_geometry.mp3',
|
||||
duration: 110,
|
||||
loop: true,
|
||||
volume: 0.48,
|
||||
sortOrder: 2,
|
||||
description: '轻快的几何节奏',
|
||||
isActive: true
|
||||
},
|
||||
|
||||
// 三维 - 立体环绕
|
||||
{
|
||||
name: '立方体回响',
|
||||
dimension: 3,
|
||||
url: 'https://example.com/bgm/dim3_cube_echo.mp3',
|
||||
duration: 180,
|
||||
loop: true,
|
||||
volume: 0.5,
|
||||
sortOrder: 1,
|
||||
description: '空间感强烈的立体音效',
|
||||
isActive: true
|
||||
},
|
||||
{
|
||||
name: '多维共振',
|
||||
dimension: 3,
|
||||
url: 'https://example.com/bgm/dim3_resonance.mp3',
|
||||
duration: 140,
|
||||
loop: true,
|
||||
volume: 0.52,
|
||||
sortOrder: 2,
|
||||
description: '富有层次感的三维音效',
|
||||
isActive: true
|
||||
},
|
||||
|
||||
// 四维 - 时间流动
|
||||
{
|
||||
name: '时空涟漪',
|
||||
dimension: 4,
|
||||
url: 'https://example.com/bgm/dim4_spacetime.mp3',
|
||||
duration: 200,
|
||||
loop: true,
|
||||
volume: 0.45,
|
||||
sortOrder: 1,
|
||||
description: '神秘的四维时空音乐',
|
||||
isActive: true
|
||||
},
|
||||
{
|
||||
name: '超立方漫游',
|
||||
dimension: 4,
|
||||
url: 'https://example.com/bgm/dim4_tesseract.mp3',
|
||||
duration: 165,
|
||||
loop: true,
|
||||
volume: 0.47,
|
||||
sortOrder: 2,
|
||||
description: '穿越维度的奇妙旅程',
|
||||
isActive: true
|
||||
},
|
||||
|
||||
// 五维 - 高维混沌
|
||||
{
|
||||
name: '思维风暴',
|
||||
dimension: 5,
|
||||
url: 'https://example.com/bgm/dim5_thought_storm.mp3',
|
||||
duration: 220,
|
||||
loop: true,
|
||||
volume: 0.5,
|
||||
sortOrder: 1,
|
||||
description: '复杂而迷人的高维音效',
|
||||
isActive: true
|
||||
},
|
||||
{
|
||||
name: '量子纠缠',
|
||||
dimension: 5,
|
||||
url: 'https://example.com/bgm/dim5_quantum.mp3',
|
||||
duration: 190,
|
||||
loop: true,
|
||||
volume: 0.48,
|
||||
sortOrder: 2,
|
||||
description: '微观世界的奇妙声音',
|
||||
isActive: true
|
||||
}
|
||||
]
|
||||
|
||||
async function initBGM() {
|
||||
try {
|
||||
// 连接数据库
|
||||
await mongoose.connect(process.env.MONGODB_URI || 'mongodb://localhost:27017/yuzhiran')
|
||||
console.log('✅ 数据库连接成功')
|
||||
|
||||
// 检查是否已有BGM数据
|
||||
const existingCount = await BGM.countDocuments()
|
||||
if (existingCount > 0) {
|
||||
console.log(`⚠️ 数据库中已有 ${existingCount} 条BGM记录,跳过初始化`)
|
||||
await mongoose.disconnect()
|
||||
return
|
||||
}
|
||||
|
||||
// 插入示例数据
|
||||
const result = await BGM.insertMany(sampleBGMs)
|
||||
console.log(`✅ 成功初始化 ${result.length} 条BGM记录`)
|
||||
|
||||
// 按维度统计
|
||||
for (let dim = 1; dim <= 5; dim++) {
|
||||
const count = await BGM.countDocuments({ dimension: dim })
|
||||
console.log(` 维度${dim}: ${count} 首`)
|
||||
}
|
||||
|
||||
console.log('\n🎵 BGM初始化完成!')
|
||||
console.log('💡 提示:请在后台管理系统中上传真实的音频文件并更新URL')
|
||||
|
||||
} catch (error) {
|
||||
console.error('❌ BGM初始化失败:', error)
|
||||
} finally {
|
||||
await mongoose.disconnect()
|
||||
console.log('数据库连接已关闭')
|
||||
}
|
||||
}
|
||||
|
||||
// 执行初始化
|
||||
initBGM()
|
||||
@@ -1,218 +0,0 @@
|
||||
require('dotenv').config({ path: require('path').resolve(__dirname, '../.env') })
|
||||
const mongoose = require('mongoose')
|
||||
const { Admin, ShopItem, Knowledge, Gallery } = require('../src/models')
|
||||
|
||||
/**
|
||||
* 数据库初始化脚本
|
||||
*/
|
||||
async function initDatabase() {
|
||||
try {
|
||||
// 连接数据库
|
||||
const mongoURI = process.env.MONGODB_URI
|
||||
await mongoose.connect(mongoURI)
|
||||
console.log('✅ 数据库连接成功')
|
||||
|
||||
// 1. 创建超级管理员
|
||||
console.log('\n📋 创建超级管理员...')
|
||||
const existingAdmin = await Admin.findOne({ username: 'admin' })
|
||||
|
||||
if (!existingAdmin) {
|
||||
const admin = new Admin({
|
||||
username: process.env.ADMIN_USERNAME || 'admin',
|
||||
password: process.env.ADMIN_PASSWORD || 'admin123456',
|
||||
email: process.env.ADMIN_EMAIL || 'admin@wdkj.com',
|
||||
realName: '超级管理员',
|
||||
role: 'super_admin',
|
||||
permissions: ['*'],
|
||||
status: 'active'
|
||||
})
|
||||
await admin.save()
|
||||
console.log('✅ 超级管理员创建成功')
|
||||
console.log(` 用户名: ${admin.username}`)
|
||||
console.log(` 密码: ${process.env.ADMIN_PASSWORD || 'admin123456'}`)
|
||||
} else {
|
||||
console.log('⚠️ 管理员账户已存在')
|
||||
}
|
||||
|
||||
// 2. 初始化商品
|
||||
console.log('\n📋 初始化商品...')
|
||||
const products = [
|
||||
{
|
||||
itemId: 'skin_quantum',
|
||||
name: '量子线皮肤',
|
||||
description: '一维世界专属皮肤,让你的线条闪耀量子光芒',
|
||||
price: 6,
|
||||
type: 'skin',
|
||||
status: 'active',
|
||||
sortOrder: 1
|
||||
},
|
||||
{
|
||||
itemId: 'skin_hologram',
|
||||
name: '全息面皮肤',
|
||||
description: '二维世界专属皮肤,让你的图形绽放全息色彩',
|
||||
price: 18,
|
||||
type: 'skin',
|
||||
status: 'active',
|
||||
sortOrder: 2
|
||||
},
|
||||
{
|
||||
itemId: 'skin_nebula',
|
||||
name: '星云体皮肤',
|
||||
description: '三维世界专属皮肤,让你的立方体流光溢彩',
|
||||
price: 30,
|
||||
type: 'skin',
|
||||
status: 'active',
|
||||
sortOrder: 3
|
||||
},
|
||||
{
|
||||
itemId: 'no_ads',
|
||||
name: '永久去广告',
|
||||
description: '一键去除所有广告,享受纯净的维度探索之旅。',
|
||||
price: 1200,
|
||||
type: 'ad_free',
|
||||
status: 'active',
|
||||
sortOrder: 4
|
||||
},
|
||||
{
|
||||
itemId: 'monthly_sub',
|
||||
name: '星云月卡',
|
||||
description: '尊享月度特权:全皮肤免费用、得分翻倍、专属身份标识。',
|
||||
price: 1800,
|
||||
type: 'vip',
|
||||
duration: 30,
|
||||
status: 'active',
|
||||
sortOrder: 5
|
||||
}
|
||||
]
|
||||
|
||||
for (const product of products) {
|
||||
const existing = await ShopItem.findOne({ itemId: product.itemId })
|
||||
if (!existing) {
|
||||
await ShopItem.create(product)
|
||||
console.log(` ✅ ${product.name} 创建成功`)
|
||||
} else {
|
||||
console.log(` ⚠️ ${product.name} 已存在`)
|
||||
}
|
||||
}
|
||||
|
||||
// 3. 初始化知识库示例
|
||||
console.log('\n📋 初始化知识库示例...')
|
||||
const knowledgeList = [
|
||||
{
|
||||
title: '什么是维度?',
|
||||
content: '维度是描述空间独立方向的参数。零维是点,一维是线,二维是面,三维是体。',
|
||||
dim: 1,
|
||||
category: 'concept',
|
||||
tags: ['基础概念', '维度'],
|
||||
status: 'approved',
|
||||
sortOrder: 1
|
||||
},
|
||||
{
|
||||
title: '一维世界:线的宇宙',
|
||||
content: '一维世界只有长度这一个维度,就像一条无限延伸的直线。生活在一维世界的生物只能前进或后退。',
|
||||
dim: 1,
|
||||
category: 'concept',
|
||||
tags: ['一维', '线'],
|
||||
status: 'approved',
|
||||
sortOrder: 2
|
||||
},
|
||||
{
|
||||
title: '二维世界:平面王国',
|
||||
content: '二维世界有长度和宽度两个维度,就像一张无限大的纸。平面国中的生物可以在平面上自由移动。',
|
||||
dim: 2,
|
||||
category: 'concept',
|
||||
tags: ['二维', '平面'],
|
||||
status: 'approved',
|
||||
sortOrder: 1
|
||||
},
|
||||
{
|
||||
title: '三维世界:立体空间',
|
||||
content: '三维世界有长度、宽度和高度三个维度,这正是我们生活的世界。我们可以前后、左右、上下移动。',
|
||||
dim: 3,
|
||||
category: 'concept',
|
||||
tags: ['三维', '立体'],
|
||||
status: 'approved',
|
||||
sortOrder: 1
|
||||
}
|
||||
]
|
||||
|
||||
for (const knowledge of knowledgeList) {
|
||||
const existing = await Knowledge.findOne({ title: knowledge.title })
|
||||
if (!existing) {
|
||||
await Knowledge.create(knowledge)
|
||||
console.log(` ✅ ${knowledge.title} 创建成功`)
|
||||
} else {
|
||||
console.log(` ⚠️ ${knowledge.title} 已存在`)
|
||||
}
|
||||
}
|
||||
|
||||
// 4. 初始化画廊示例作品
|
||||
console.log('\n📋 初始化画廊示例作品...')
|
||||
const galleryWorks = [
|
||||
{
|
||||
title: '一维·星点轨迹',
|
||||
description: '在一维世界中,点动成线。这是我探索宇宙起点的轨迹记录。',
|
||||
imageData: '/static/images/gallery_demo_dim1.png',
|
||||
dim: 1,
|
||||
openid: 'system_admin',
|
||||
authorName: '系统管理员',
|
||||
authorAvatar: '/static/images/default_avatar.png',
|
||||
likeCount: 128,
|
||||
tags: ['一维', '轨迹', '起点'],
|
||||
status: 'approved',
|
||||
createdAt: new Date()
|
||||
},
|
||||
{
|
||||
title: '二维·星座图腾',
|
||||
description: '连接星体,绘制出属于我的平面王国图腾。',
|
||||
imageData: '/static/images/gallery_demo_dim2.png',
|
||||
dim: 2,
|
||||
openid: 'system_admin',
|
||||
authorName: '星辰旅者',
|
||||
authorAvatar: '/static/images/default_avatar.png',
|
||||
likeCount: 96,
|
||||
tags: ['二维', '星座', '图腾'],
|
||||
status: 'approved',
|
||||
createdAt: new Date()
|
||||
},
|
||||
{
|
||||
title: '三维·流光立方',
|
||||
description: '旋转的立方体展现了立体几何的魅力,色彩在空间中流动。',
|
||||
imageData: '/static/images/gallery_demo_dim3.png',
|
||||
dim: 3,
|
||||
openid: 'system_admin',
|
||||
authorName: '维度探索者',
|
||||
authorAvatar: '/static/images/default_avatar.png',
|
||||
likeCount: 215,
|
||||
tags: ['三维', '立方体', '流光'],
|
||||
status: 'approved',
|
||||
createdAt: new Date()
|
||||
}
|
||||
]
|
||||
|
||||
for (const work of galleryWorks) {
|
||||
const existing = await Gallery.findOne({ title: work.title })
|
||||
if (!existing) {
|
||||
await Gallery.create(work)
|
||||
console.log(` ✅ ${work.title} 创建成功`)
|
||||
} else {
|
||||
console.log(` ⚠️ ${work.title} 已存在`)
|
||||
}
|
||||
}
|
||||
|
||||
console.log('\n✅ 数据库初始化完成!')
|
||||
console.log('\n📝 管理员登录信息:')
|
||||
console.log(` 用户名: ${process.env.ADMIN_USERNAME || 'admin'}`)
|
||||
console.log(` 密码: ${process.env.ADMIN_PASSWORD || 'admin123456'}`)
|
||||
|
||||
} catch (error) {
|
||||
console.error('❌ 初始化失败:', error)
|
||||
} finally {
|
||||
await mongoose.connection.close()
|
||||
console.log('\n🔌 数据库连接已关闭')
|
||||
process.exit(0)
|
||||
}
|
||||
}
|
||||
|
||||
// 执行初始化
|
||||
initDatabase()
|
||||
@@ -1,182 +0,0 @@
|
||||
/**
|
||||
* 初始化知识数据脚本
|
||||
* 用于填充测试知识内容
|
||||
*/
|
||||
|
||||
const mongoose = require('mongoose')
|
||||
require('dotenv').config()
|
||||
|
||||
// 导入知识模型
|
||||
const Knowledge = require('../src/models/Knowledge')
|
||||
|
||||
// 测试知识数据
|
||||
const testKnowledgeData = [
|
||||
// 一维知识
|
||||
{
|
||||
title: '一维空间的基本概念',
|
||||
content: '一维空间是数学中最简单的空间形式,它只有长度这一个维度。在物理学中,一维空间可以用来描述直线运动,比如物体在直线上来回运动。一维空间的特点是所有点都在同一条直线上,没有宽度和高度。',
|
||||
dim: 1,
|
||||
category: 'concept',
|
||||
tags: ['一维', '空间', '数学'],
|
||||
status: 'approved',
|
||||
isPremium: false,
|
||||
requiredPoints: 0,
|
||||
price: 0
|
||||
},
|
||||
{
|
||||
title: '一维空间的数学表示',
|
||||
content: '在数学中,一维空间通常用实数轴来表示。实数轴上的每个点对应一个实数,点与点之间的距离就是它们对应实数的差的绝对值。一维空间中的向量只有一个分量,可以用一个实数来表示。',
|
||||
dim: 1,
|
||||
category: 'application',
|
||||
tags: ['一维', '数学', '实数轴'],
|
||||
status: 'approved',
|
||||
isPremium: false,
|
||||
requiredPoints: 0,
|
||||
price: 0
|
||||
},
|
||||
|
||||
// 二维知识
|
||||
{
|
||||
title: '二维空间的几何特性',
|
||||
content: '二维空间具有两个维度:长度和宽度。在二维空间中,我们可以定义平面几何图形,如点、线、三角形、圆形等。二维空间中的每个点可以用两个坐标(x, y)来表示。',
|
||||
dim: 2,
|
||||
category: 'concept',
|
||||
tags: ['二维', '几何', '平面'],
|
||||
status: 'approved',
|
||||
isPremium: false,
|
||||
requiredPoints: 10,
|
||||
price: 0
|
||||
},
|
||||
{
|
||||
title: '二维坐标系的应用',
|
||||
content: '二维坐标系在计算机图形学、地理信息系统、工程设计等领域有广泛应用。笛卡尔坐标系是最常见的二维坐标系,它使用相互垂直的x轴和y轴来定位平面上的点。',
|
||||
dim: 2,
|
||||
category: 'application',
|
||||
tags: ['二维', '坐标系', '应用'],
|
||||
status: 'approved',
|
||||
isPremium: false,
|
||||
requiredPoints: 20,
|
||||
price: 0
|
||||
},
|
||||
|
||||
// 三维知识
|
||||
{
|
||||
title: '理解三维空间',
|
||||
content: '三维空间是我们最熟悉的空间形式,它具有长度、宽度和高度三个维度。在三维空间中,物体具有体积,可以定义立体几何图形如立方体、球体、圆柱体等。',
|
||||
dim: 3,
|
||||
category: 'concept',
|
||||
tags: ['三维', '空间', '立体'],
|
||||
status: 'approved',
|
||||
isPremium: false,
|
||||
requiredPoints: 30,
|
||||
price: 0
|
||||
},
|
||||
{
|
||||
title: '三维建模技术',
|
||||
content: '三维建模技术在动画制作、游戏开发、建筑设计等领域有重要应用。常见的三维建模方法包括多边形建模、NURBS建模、体素建模等。',
|
||||
dim: 3,
|
||||
category: 'application',
|
||||
tags: ['三维', '建模', '技术'],
|
||||
status: 'approved',
|
||||
isPremium: false,
|
||||
requiredPoints: 40,
|
||||
price: 0
|
||||
},
|
||||
|
||||
// 四维知识(付费内容)
|
||||
{
|
||||
title: '四维时空的概念',
|
||||
content: '四维时空是爱因斯坦相对论中的核心概念,它将三维空间与时间维度结合。在四维时空中,事件的发生不仅取决于空间位置,还取决于时间点。四维时空的几何特性由闵可夫斯基度规描述。',
|
||||
dim: 4,
|
||||
category: 'concept',
|
||||
tags: ['四维', '时空', '相对论'],
|
||||
status: 'approved',
|
||||
isPremium: true,
|
||||
requiredPoints: 0,
|
||||
price: 9.9
|
||||
},
|
||||
{
|
||||
title: '四维空间的可视化',
|
||||
content: '由于人类无法直接感知四维空间,科学家们开发了多种可视化技术。常见的方法包括投影法、切片法、颜色编码法等,帮助我们理解高维空间的特性。',
|
||||
dim: 4,
|
||||
category: 'application',
|
||||
tags: ['四维', '可视化', '高维'],
|
||||
status: 'approved',
|
||||
isPremium: true,
|
||||
requiredPoints: 0,
|
||||
price: 12.9
|
||||
},
|
||||
|
||||
// 五维知识(高级付费内容)
|
||||
{
|
||||
title: '五维空间的物理意义',
|
||||
content: '五维空间理论在弦理论和卡鲁扎-克莱因理论中有重要应用。在五维空间中,除了三维空间和一维时间外,还可能存在额外的紧致维度。这些理论试图统一引力与其他基本力。',
|
||||
dim: 5,
|
||||
category: 'concept',
|
||||
tags: ['五维', '弦理论', '统一理论'],
|
||||
status: 'approved',
|
||||
isPremium: true,
|
||||
requiredPoints: 0,
|
||||
price: 19.9
|
||||
},
|
||||
{
|
||||
title: '高维空间的数学基础',
|
||||
content: '高维空间的数学研究涉及线性代数、微分几何、拓扑学等多个领域。n维空间中的点可以用n个坐标表示,距离和角度等概念可以通过推广低维空间的定义来建立。',
|
||||
dim: 5,
|
||||
category: 'application',
|
||||
tags: ['高维', '数学', '几何'],
|
||||
status: 'approved',
|
||||
isPremium: true,
|
||||
requiredPoints: 0,
|
||||
price: 24.9
|
||||
}
|
||||
]
|
||||
|
||||
async function initKnowledgeData() {
|
||||
try {
|
||||
// 连接数据库
|
||||
await mongoose.connect(process.env.MONGODB_URI, {
|
||||
useNewUrlParser: true,
|
||||
useUnifiedTopology: true
|
||||
})
|
||||
|
||||
console.log('✅ 数据库连接成功')
|
||||
|
||||
// 清空现有知识数据(可选)
|
||||
await Knowledge.deleteMany({})
|
||||
console.log('✅ 已清空现有知识数据')
|
||||
|
||||
// 插入测试数据
|
||||
const inserted = await Knowledge.insertMany(testKnowledgeData)
|
||||
console.log(`✅ 成功插入 ${inserted.length} 条知识数据`)
|
||||
|
||||
// 显示插入的数据统计
|
||||
const dimCounts = {}
|
||||
inserted.forEach(item => {
|
||||
dimCounts[item.dim] = (dimCounts[item.dim] || 0) + 1
|
||||
})
|
||||
|
||||
console.log('📊 知识数据统计:')
|
||||
Object.keys(dimCounts).sort().forEach(dim => {
|
||||
console.log(` ${dim}维知识: ${dimCounts[dim]} 条`)
|
||||
})
|
||||
|
||||
const premiumCount = inserted.filter(item => item.isPremium).length
|
||||
const freeCount = inserted.length - premiumCount
|
||||
console.log(` 💰 付费内容: ${premiumCount} 条`)
|
||||
console.log(` 🆓 免费内容: ${freeCount} 条`)
|
||||
|
||||
} catch (error) {
|
||||
console.error('❌ 初始化知识数据失败:', error)
|
||||
} finally {
|
||||
await mongoose.connection.close()
|
||||
console.log('🔚 数据库连接已关闭')
|
||||
}
|
||||
}
|
||||
|
||||
// 执行初始化
|
||||
if (require.main === module) {
|
||||
initKnowledgeData()
|
||||
}
|
||||
|
||||
module.exports = { initKnowledgeData }
|
||||
@@ -1,241 +0,0 @@
|
||||
/**
|
||||
* 拼音探索模块初始化数据脚本
|
||||
* 创建拼音内容、成就等基础数据
|
||||
*/
|
||||
|
||||
require('dotenv').config({ path: './.env' });
|
||||
const mongoose = require('mongoose');
|
||||
const { PinyinContent, PinyinAchievement } = require('../src/models/pinyin');
|
||||
const connectDB = require('../src/config/database');
|
||||
|
||||
// 声母数据
|
||||
const initials = [
|
||||
{ symbol: 'b', name: '玻', order: 1 },
|
||||
{ symbol: 'p', name: '坡', order: 2 },
|
||||
{ symbol: 'm', name: '摸', order: 3 },
|
||||
{ symbol: 'f', name: '佛', order: 4 },
|
||||
{ symbol: 'd', name: '得', order: 5 },
|
||||
{ symbol: 't', name: '特', order: 6 },
|
||||
{ symbol: 'n', name: '讷', order: 7 },
|
||||
{ symbol: 'l', name: '勒', order: 8 },
|
||||
{ symbol: 'g', name: '哥', order: 9 },
|
||||
{ symbol: 'k', name: '科', order: 10 },
|
||||
{ symbol: 'h', name: '喝', order: 11 },
|
||||
{ symbol: 'j', name: '基', order: 12 },
|
||||
{ symbol: 'q', name: '期', order: 13 },
|
||||
{ symbol: 'x', name: '希', order: 14 },
|
||||
{ symbol: 'zh', name: '知', order: 15 },
|
||||
{ symbol: 'ch', name: '蚩', order: 16 },
|
||||
{ symbol: 'sh', name: '诗', order: 17 },
|
||||
{ symbol: 'r', name: '日', order: 18 },
|
||||
{ symbol: 'z', name: '资', order: 19 },
|
||||
{ symbol: 'c', name: '雌', order: 20 },
|
||||
{ symbol: 's', name: '思', order: 21 },
|
||||
{ symbol: 'y', name: '医', order: 22 },
|
||||
{ symbol: 'w', name: '巫', order: 23 }
|
||||
];
|
||||
|
||||
// 韵母数据
|
||||
const finals = [
|
||||
// 单韵母
|
||||
{ symbol: 'a', name: '啊', order: 1 },
|
||||
{ symbol: 'o', name: '喔', order: 2 },
|
||||
{ symbol: 'e', name: '鹅', order: 3 },
|
||||
{ symbol: 'i', name: '衣', order: 4 },
|
||||
{ symbol: 'u', name: '乌', order: 5 },
|
||||
{ symbol: 'ü', name: '迂', order: 6 },
|
||||
// 复韵母
|
||||
{ symbol: 'ai', name: '哀', order: 7 },
|
||||
{ symbol: 'ei', name: '诶', order: 8 },
|
||||
{ symbol: 'ui', name: '威', order: 9 },
|
||||
{ symbol: 'ao', name: '熬', order: 10 },
|
||||
{ symbol: 'ou', name: '欧', order: 11 },
|
||||
{ symbol: 'iu', name: '优', order: 12 },
|
||||
{ symbol: 'ie', name: '耶', order: 13 },
|
||||
{ symbol: 'üe', name: '约', order: 14 },
|
||||
{ symbol: 'er', name: '儿', order: 15 },
|
||||
// 前鼻韵母
|
||||
{ symbol: 'an', name: '安', order: 16 },
|
||||
{ symbol: 'en', name: '恩', order: 17 },
|
||||
{ symbol: 'in', name: '因', order: 18 },
|
||||
{ symbol: 'un', name: '温', order: 19 },
|
||||
{ symbol: 'ün', name: '晕', order: 20 },
|
||||
// 后鼻韵母
|
||||
{ symbol: 'ang', name: '昂', order: 21 },
|
||||
{ symbol: 'eng', name: '亨', order: 22 },
|
||||
{ symbol: 'ing', name: '英', order: 23 },
|
||||
{ symbol: 'ong', name: '雍', order: 24 }
|
||||
];
|
||||
|
||||
// 整体认读音节
|
||||
const overalls = [
|
||||
{ symbol: 'zhi', name: '织', order: 1 },
|
||||
{ symbol: 'chi', name: '吃', order: 2 },
|
||||
{ symbol: 'shi', name: '诗', order: 3 },
|
||||
{ symbol: 'ri', name: '日', order: 4 },
|
||||
{ symbol: 'zi', name: '资', order: 5 },
|
||||
{ symbol: 'ci', name: '雌', order: 6 },
|
||||
{ symbol: 'si', name: '思', order: 7 },
|
||||
{ symbol: 'yi', name: '衣', order: 8 },
|
||||
{ symbol: 'wu', name: '乌', order: 9 },
|
||||
{ symbol: 'yu', name: '迂', order: 10 },
|
||||
{ symbol: 'ye', name: '耶', order: 11 },
|
||||
{ symbol: 'yue', name: '约', order: 12 },
|
||||
{ symbol: 'yuan', name: '冤', order: 13 },
|
||||
{ symbol: 'yin', name: '因', order: 14 },
|
||||
{ symbol: 'yun', name: '晕', order: 15 },
|
||||
{ symbol: 'ying', name: '英', order: 16 }
|
||||
];
|
||||
|
||||
// 成就数据
|
||||
const achievements = [
|
||||
// 探索类成就
|
||||
{ code: 'first_explore', name: '初次探索', description: '完成首次拼音探索', type: 'explore', condition: { type: 'explore_count', value: 1 } },
|
||||
{ code: 'explorer_5', name: '初级探索者', description: '探索5个拼音', type: 'explore', condition: { type: 'explore_count', value: 5 } },
|
||||
{ code: 'explorer_10', name: '中级探索者', description: '探索10个拼音', type: 'explore', condition: { type: 'explore_count', value: 10 } },
|
||||
{ code: 'explorer_23', name: '声母专家', description: '探索所有声母', type: 'explore', condition: { type: 'explore_count', value: 23 } },
|
||||
{ code: 'explorer_47', name: '拼音达人', description: '探索47个拼音', type: 'explore', condition: { type: 'explore_count', value: 47 } },
|
||||
{ code: 'explorer_all', name: '拼音大师', description: '探索所有拼音', type: 'explore', condition: { type: 'explore_count', value: 63 } },
|
||||
|
||||
// 收集类成就
|
||||
{ code: 'first_stone', name: '第一颗能量石', description: '收集第一颗能量石', type: 'collection', condition: { type: 'collect_count', value: 1 } },
|
||||
{ code: 'collector_5', name: '能量收集者', description: '收集5颗能量石', type: 'collection', condition: { type: 'collect_count', value: 5 } },
|
||||
{ code: 'collector_10', name: '能量守护者', description: '收集10颗能量石', type: 'collection', condition: { type: 'collect_count', value: 10 } },
|
||||
{ code: 'collector_23', name: '声母守护者', description: '收集所有声母能量石', type: 'collection', condition: { type: 'collect_count', value: 23 } },
|
||||
{ code: 'collector_all', name: '能量大师', description: '收集所有能量石', type: 'collection', condition: { type: 'collect_count', value: 63 } },
|
||||
|
||||
// 连续探索成就
|
||||
{ code: 'streak_3', name: '坚持3天', description: '连续探索3天', type: 'streak', condition: { type: 'streak_days', value: 3 } },
|
||||
{ code: 'streak_7', name: '坚持一周', description: '连续探索7天', type: 'streak', condition: { type: 'streak_days', value: 7 } },
|
||||
{ code: 'streak_30', name: '坚持一个月', description: '连续探索30天', type: 'streak', condition: { type: 'streak_days', value: 30 } }
|
||||
];
|
||||
|
||||
async function initPinyinContents() {
|
||||
console.log('开始初始化拼音内容...');
|
||||
|
||||
// 初始化声母
|
||||
for (const item of initials) {
|
||||
await PinyinContent.findOneAndUpdate(
|
||||
{ symbol: item.symbol },
|
||||
{
|
||||
symbol: item.symbol,
|
||||
type: 'initial',
|
||||
name: item.name,
|
||||
order: item.order,
|
||||
isFree: item.order <= 5, // 前5个免费
|
||||
status: 'active',
|
||||
pronunciation: `${item.name}的音`,
|
||||
exploreAreas: {
|
||||
audio: true,
|
||||
mouth: true,
|
||||
speak: true,
|
||||
write: true,
|
||||
game: true,
|
||||
words: true
|
||||
}
|
||||
},
|
||||
{ upsert: true, new: true }
|
||||
);
|
||||
}
|
||||
console.log(`✅ 已初始化 ${initials.length} 个声母`);
|
||||
|
||||
// 初始化韵母
|
||||
for (const item of finals) {
|
||||
await PinyinContent.findOneAndUpdate(
|
||||
{ symbol: item.symbol },
|
||||
{
|
||||
symbol: item.symbol,
|
||||
type: 'final',
|
||||
name: item.name,
|
||||
order: item.order,
|
||||
isFree: false, // 韵母需要解锁
|
||||
status: 'active',
|
||||
pronunciation: `${item.name}的音`,
|
||||
exploreAreas: {
|
||||
audio: true,
|
||||
mouth: true,
|
||||
speak: true,
|
||||
write: true,
|
||||
game: true,
|
||||
words: true
|
||||
}
|
||||
},
|
||||
{ upsert: true, new: true }
|
||||
);
|
||||
}
|
||||
console.log(`✅ 已初始化 ${finals.length} 个韵母`);
|
||||
|
||||
// 初始化整体认读音节
|
||||
for (const item of overalls) {
|
||||
await PinyinContent.findOneAndUpdate(
|
||||
{ symbol: item.symbol },
|
||||
{
|
||||
symbol: item.symbol,
|
||||
type: 'overall',
|
||||
name: item.name,
|
||||
order: item.order,
|
||||
isFree: false, // 整体认读需要解锁
|
||||
status: 'active',
|
||||
pronunciation: `${item.name}的音`,
|
||||
exploreAreas: {
|
||||
audio: true,
|
||||
mouth: true,
|
||||
speak: true,
|
||||
write: true,
|
||||
game: true,
|
||||
words: true
|
||||
}
|
||||
},
|
||||
{ upsert: true, new: true }
|
||||
);
|
||||
}
|
||||
console.log(`✅ 已初始化 ${overalls.length} 个整体认读音节`);
|
||||
}
|
||||
|
||||
async function initAchievements() {
|
||||
console.log('开始初始化成就...');
|
||||
|
||||
for (let i = 0; i < achievements.length; i++) {
|
||||
const item = achievements[i];
|
||||
await PinyinAchievement.findOneAndUpdate(
|
||||
{ code: item.code },
|
||||
{
|
||||
code: item.code,
|
||||
name: item.name,
|
||||
description: item.description,
|
||||
type: item.type,
|
||||
condition: item.condition,
|
||||
order: i + 1,
|
||||
isActive: true,
|
||||
reward: {
|
||||
type: 'stone',
|
||||
value: 1
|
||||
}
|
||||
},
|
||||
{ upsert: true, new: true }
|
||||
);
|
||||
}
|
||||
console.log(`✅ 已初始化 ${achievements.length} 个成就`);
|
||||
}
|
||||
|
||||
async function main() {
|
||||
try {
|
||||
// 连接数据库
|
||||
await connectDB();
|
||||
console.log('数据库连接成功');
|
||||
|
||||
// 初始化拼音内容
|
||||
await initPinyinContents();
|
||||
|
||||
// 初始化成就
|
||||
await initAchievements();
|
||||
|
||||
console.log('\n✨ 数据初始化完成!');
|
||||
process.exit(0);
|
||||
} catch (error) {
|
||||
console.error('初始化失败:', error);
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
main();
|
||||
@@ -0,0 +1,4 @@
|
||||
node_modules/
|
||||
dist/
|
||||
*.log
|
||||
.DS_Store
|
||||
|
Before Width: | Height: | Size: 351 B After Width: | Height: | Size: 351 B |
|
Before Width: | Height: | Size: 339 B After Width: | Height: | Size: 339 B |
|
Before Width: | Height: | Size: 173 B After Width: | Height: | Size: 173 B |
|
Before Width: | Height: | Size: 170 B After Width: | Height: | Size: 170 B |
|
Before Width: | Height: | Size: 204 B After Width: | Height: | Size: 204 B |
|
Before Width: | Height: | Size: 198 B After Width: | Height: | Size: 198 B |
|
Before Width: | Height: | Size: 244 B After Width: | Height: | Size: 244 B |
|
Before Width: | Height: | Size: 235 B After Width: | Height: | Size: 235 B |
@@ -1,856 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>宇之然AI维度 - UI 设计稿 v2</title>
|
||||
<style>
|
||||
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||||
body {
|
||||
background: #050508;
|
||||
font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Display', 'Segoe UI', sans-serif;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
justify-content: center;
|
||||
gap: 32px;
|
||||
padding: 40px;
|
||||
}
|
||||
|
||||
/* === Phone Frame === */
|
||||
.phone {
|
||||
width: 375px;
|
||||
background: radial-gradient(ellipse at 50% 0%, #0f0a1a 0%, #08080f 60%, #050508 100%);
|
||||
border-radius: 44px;
|
||||
overflow: hidden;
|
||||
box-shadow:
|
||||
0 0 80px rgba(100, 50, 200, 0.08),
|
||||
0 20px 60px rgba(0,0,0,0.9);
|
||||
border: 1px solid rgba(255,255,255,0.06);
|
||||
position: relative;
|
||||
}
|
||||
/* Subtle cosmic glow */
|
||||
.phone::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: -120px;
|
||||
left: -80px;
|
||||
width: 300px;
|
||||
height: 300px;
|
||||
background: radial-gradient(circle, rgba(124,77,255,0.06) 0%, transparent 70%);
|
||||
pointer-events: none;
|
||||
}
|
||||
.phone::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
bottom: -80px;
|
||||
right: -60px;
|
||||
width: 250px;
|
||||
height: 250px;
|
||||
background: radial-gradient(circle, rgba(0,188,212,0.04) 0%, transparent 70%);
|
||||
pointer-events: none;
|
||||
}
|
||||
.phone-content { padding: 0 20px; position: relative; z-index: 1; }
|
||||
|
||||
/* === Status Bar === */
|
||||
.status-bar { display: flex; justify-content: space-between; padding: 14px 20px 10px; color: rgba(255,255,255,0.4); font-size: 12px; font-weight: 600; }
|
||||
.status-bar .time { color: rgba(255,255,255,0.7); }
|
||||
.status-icons { display: flex; gap: 6px; align-items: center; }
|
||||
.status-icons span { font-size: 12px; }
|
||||
|
||||
/* === Header === */
|
||||
.header { display: flex; justify-content: space-between; align-items: center; padding: 6px 0 20px; }
|
||||
.header .brand { display: flex; align-items: center; gap: 10px; }
|
||||
.header .brand-icon {
|
||||
width: 36px; height: 36px; border-radius: 10px;
|
||||
background: linear-gradient(135deg, rgba(124,77,255,0.3), rgba(0,188,212,0.2));
|
||||
border: 1px solid rgba(124,77,255,0.2);
|
||||
display: flex; align-items: center; justify-content: center;
|
||||
font-size: 18px;
|
||||
box-shadow: 0 0 20px rgba(124,77,255,0.1);
|
||||
}
|
||||
.header .brand-text h1 { font-size: 20px; color: #fff; font-weight: 700; letter-spacing: 1px; }
|
||||
.header .brand-text .subtitle { font-size: 10px; color: rgba(255,255,255,0.3); letter-spacing: 2px; text-transform: uppercase; }
|
||||
.header-actions { display: flex; gap: 10px; }
|
||||
.header-actions .icon {
|
||||
width: 36px; height: 36px; border-radius: 50%;
|
||||
background: rgba(255,255,255,0.04);
|
||||
border: 1px solid rgba(255,255,255,0.06);
|
||||
display: flex; align-items: center; justify-content: center;
|
||||
color: rgba(255,255,255,0.5); font-size: 15px; cursor: pointer;
|
||||
transition: all 0.2s;
|
||||
}
|
||||
.header-actions .icon:hover { background: rgba(255,255,255,0.08); border-color: rgba(255,255,255,0.12); }
|
||||
|
||||
/* === Greeting === */
|
||||
.greeting { margin-bottom: 20px; }
|
||||
.greeting h2 { color: #fff; font-size: 26px; font-weight: 700; }
|
||||
.greeting h2 span { background: linear-gradient(135deg, #b388ff, #7c4dff); -webkit-background-clip: text; -webkit-text-fill-color: transparent; }
|
||||
.greeting p { color: rgba(255,255,255,0.3); font-size: 13px; margin-top: 4px; }
|
||||
|
||||
/* === Search Bar === */
|
||||
.search-bar {
|
||||
background: rgba(255,255,255,0.04);
|
||||
border: 1px solid rgba(255,255,255,0.06);
|
||||
border-radius: 14px;
|
||||
padding: 12px 16px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
margin-bottom: 24px;
|
||||
backdrop-filter: blur(10px);
|
||||
-webkit-backdrop-filter: blur(10px);
|
||||
}
|
||||
.search-bar span { color: rgba(255,255,255,0.2); font-size: 14px; }
|
||||
.search-bar .icon { color: rgba(255,255,255,0.2); }
|
||||
|
||||
/* === Section Header === */
|
||||
.section-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 14px; }
|
||||
.section-header h2 { color: #fff; font-size: 17px; font-weight: 600; letter-spacing: 0.5px; }
|
||||
.section-header .more { color: rgba(255,255,255,0.25); font-size: 12px; cursor: pointer; transition: color 0.2s; }
|
||||
.section-header .more:hover { color: rgba(255,255,255,0.5); }
|
||||
|
||||
/* === Dimensions Grid === */
|
||||
.dim-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin-bottom: 28px; }
|
||||
.dim-card {
|
||||
border-radius: 18px;
|
||||
padding: 20px 16px;
|
||||
border: 1px solid rgba(255,255,255,0.06);
|
||||
cursor: pointer;
|
||||
transition: all 0.3s ease;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
backdrop-filter: blur(10px);
|
||||
-webkit-backdrop-filter: blur(10px);
|
||||
}
|
||||
.dim-card:hover {
|
||||
border-color: rgba(255,255,255,0.15);
|
||||
transform: translateY(-2px);
|
||||
}
|
||||
.dim-card .dim-glow {
|
||||
position: absolute;
|
||||
top: -50%;
|
||||
left: -50%;
|
||||
width: 200%;
|
||||
height: 200%;
|
||||
pointer-events: none;
|
||||
opacity: 0.3;
|
||||
}
|
||||
.dim-card .dim-icon {
|
||||
width: 42px; height: 42px; border-radius: 12px;
|
||||
display: flex; align-items: center; justify-content: center;
|
||||
font-size: 20px; margin-bottom: 14px;
|
||||
position: relative;
|
||||
}
|
||||
.dim-card .dim-name { color: #fff; font-size: 15px; font-weight: 600; margin-bottom: 4px; letter-spacing: 0.5px; }
|
||||
.dim-card .dim-desc { color: rgba(255,255,255,0.3); font-size: 11px; line-height: 1.5; }
|
||||
.dim-card .dim-count { color: rgba(255,255,255,0.15); font-size: 10px; margin-top: 10px; }
|
||||
.dim-card.full { grid-column: 1 / -1; }
|
||||
|
||||
/* Color variants with glassmorphism backgrounds */
|
||||
.dim-card.origin { background: linear-gradient(135deg, rgba(124,77,255,0.08), rgba(124,77,255,0.02)); }
|
||||
.dim-icon.origin { background: linear-gradient(135deg, rgba(124,77,255,0.25), rgba(124,77,255,0.1)); color: #b388ff; box-shadow: 0 0 20px rgba(124,77,255,0.1); }
|
||||
|
||||
.dim-card.dev { background: linear-gradient(135deg, rgba(0,188,212,0.08), rgba(0,188,212,0.02)); }
|
||||
.dim-icon.dev { background: linear-gradient(135deg, rgba(0,188,212,0.25), rgba(0,188,212,0.1)); color: #4dd0e1; box-shadow: 0 0 20px rgba(0,188,212,0.1); }
|
||||
|
||||
.dim-card.current { background: linear-gradient(135deg, rgba(0,200,150,0.08), rgba(0,200,150,0.02)); }
|
||||
.dim-icon.current { background: linear-gradient(135deg, rgba(0,200,150,0.25), rgba(0,200,150,0.1)); color: #4db6ac; box-shadow: 0 0 20px rgba(0,200,150,0.1); }
|
||||
|
||||
.dim-card.learn { background: linear-gradient(135deg, rgba(255,193,7,0.08), rgba(255,193,7,0.02)); }
|
||||
.dim-icon.learn { background: linear-gradient(135deg, rgba(255,193,7,0.25), rgba(255,193,7,0.1)); color: #ffd54f; box-shadow: 0 0 20px rgba(255,193,7,0.1); }
|
||||
|
||||
.dim-card.trend { background: linear-gradient(135deg, rgba(239,83,80,0.08), rgba(239,83,80,0.02)); }
|
||||
.dim-icon.trend { background: linear-gradient(135deg, rgba(239,83,80,0.25), rgba(239,83,80,0.1)); color: #ef5350; box-shadow: 0 0 20px rgba(239,83,80,0.1); }
|
||||
|
||||
/* === News Cards === */
|
||||
.news-card {
|
||||
border-radius: 14px;
|
||||
padding: 14px 16px;
|
||||
margin-bottom: 10px;
|
||||
background: rgba(255,255,255,0.03);
|
||||
border: 1px solid rgba(255,255,255,0.05);
|
||||
cursor: pointer;
|
||||
transition: all 0.3s ease;
|
||||
backdrop-filter: blur(10px);
|
||||
-webkit-backdrop-filter: blur(10px);
|
||||
}
|
||||
.news-card:hover { background: rgba(255,255,255,0.05); border-color: rgba(255,255,255,0.1); }
|
||||
.news-card .news-tag { display: inline-block; font-size: 10px; padding: 2px 10px; border-radius: 6px; margin-bottom: 8px; font-weight: 500; }
|
||||
.news-card .news-tag.hot { background: rgba(239,83,80,0.15); color: #ef5350; }
|
||||
.news-card .news-tag.new { background: rgba(0,188,212,0.15); color: #4dd0e1; }
|
||||
.news-card .news-tag.pick { background: rgba(124,77,255,0.15); color: #b388ff; }
|
||||
.news-card .news-title { color: rgba(255,255,255,0.85); font-size: 13px; line-height: 1.5; margin-bottom: 8px; font-weight: 500; }
|
||||
.news-card .news-meta { color: rgba(255,255,255,0.2); font-size: 10px; display: flex; gap: 16px; }
|
||||
|
||||
/* === Bottom Nav === */
|
||||
.bottom-nav {
|
||||
display: flex;
|
||||
justify-content: space-around;
|
||||
padding: 8px 0 22px;
|
||||
background: rgba(255,255,255,0.02);
|
||||
border-top: 1px solid rgba(255,255,255,0.04);
|
||||
margin-top: 12px;
|
||||
backdrop-filter: blur(20px);
|
||||
-webkit-backdrop-filter: blur(20px);
|
||||
}
|
||||
.nav-item {
|
||||
text-align: center;
|
||||
color: rgba(255,255,255,0.2);
|
||||
font-size: 10px;
|
||||
cursor: pointer;
|
||||
padding: 4px 12px;
|
||||
border-radius: 8px;
|
||||
transition: all 0.2s;
|
||||
}
|
||||
.nav-item .nav-icon { font-size: 20px; margin-bottom: 2px; display: block; }
|
||||
.nav-item.active { color: #b388ff; }
|
||||
.nav-item.active .nav-icon { color: #b388ff; }
|
||||
.nav-item.active { background: rgba(124,77,255,0.08); }
|
||||
|
||||
/* ============ PAGE 2: Knowledge List ============ */
|
||||
.back-btn {
|
||||
color: rgba(255,255,255,0.4);
|
||||
font-size: 14px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
cursor: pointer;
|
||||
padding: 10px 0 14px;
|
||||
transition: color 0.2s;
|
||||
}
|
||||
.back-btn:hover { color: rgba(255,255,255,0.7); }
|
||||
|
||||
.dim-banner {
|
||||
border-radius: 18px;
|
||||
padding: 24px 20px;
|
||||
margin-bottom: 20px;
|
||||
background: linear-gradient(135deg, rgba(124,77,255,0.1), rgba(0,0,0,0.3));
|
||||
border: 1px solid rgba(124,77,255,0.12);
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
}
|
||||
.dim-banner::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: -60px;
|
||||
right: -40px;
|
||||
width: 180px;
|
||||
height: 180px;
|
||||
background: radial-gradient(circle, rgba(124,77,255,0.08) 0%, transparent 70%);
|
||||
pointer-events: none;
|
||||
}
|
||||
.dim-banner h2 { color: #fff; font-size: 22px; margin-bottom: 6px; }
|
||||
.dim-banner p { color: rgba(255,255,255,0.4); font-size: 12px; line-height: 1.6; }
|
||||
.dim-banner .progress-track { height: 3px; background: rgba(255,255,255,0.06); border-radius: 2px; margin-top: 16px; overflow: hidden; }
|
||||
.dim-banner .progress-track .fill { height: 100%; width: 35%; background: linear-gradient(90deg, #b388ff, #7c4dff); border-radius: 2px; }
|
||||
.dim-banner .progress-label { color: rgba(255,255,255,0.2); font-size: 11px; margin-top: 8px; }
|
||||
|
||||
.knowledge-item {
|
||||
border-radius: 14px;
|
||||
padding: 16px;
|
||||
margin-bottom: 10px;
|
||||
background: rgba(255,255,255,0.03);
|
||||
border: 1px solid rgba(255,255,255,0.05);
|
||||
cursor: pointer;
|
||||
display: flex;
|
||||
gap: 14px;
|
||||
align-items: flex-start;
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
.knowledge-item:hover { background: rgba(255,255,255,0.05); border-color: rgba(255,255,255,0.1); }
|
||||
.knowledge-item .k-icon {
|
||||
width: 44px; height: 44px; border-radius: 12px;
|
||||
flex-shrink: 0; display: flex; align-items: center; justify-content: center;
|
||||
font-size: 18px;
|
||||
border: 1px solid rgba(255,255,255,0.06);
|
||||
}
|
||||
.knowledge-item .k-info { flex: 1; }
|
||||
.knowledge-item .k-title { color: rgba(255,255,255,0.85); font-size: 14px; font-weight: 500; margin-bottom: 4px; }
|
||||
.knowledge-item .k-desc { color: rgba(255,255,255,0.3); font-size: 11px; line-height: 1.5; margin-bottom: 8px; }
|
||||
.knowledge-item .k-meta { display: flex; gap: 12px; color: rgba(255,255,255,0.15); font-size: 10px; align-items: center; }
|
||||
.knowledge-item .k-badge { font-size: 10px; padding: 2px 10px; border-radius: 6px; font-weight: 500; }
|
||||
.k-badge.free { background: rgba(76,175,80,0.12); color: #66bb6a; }
|
||||
.k-badge.pro { background: rgba(255,152,0,0.12); color: #ffa726; }
|
||||
|
||||
/* ============ PAGE 3: AI Chat ============ */
|
||||
.chat-header { display: flex; align-items: center; gap: 12px; padding: 10px 0 20px; }
|
||||
.chat-avatar {
|
||||
width: 42px; height: 42px; border-radius: 14px;
|
||||
background: linear-gradient(135deg, rgba(124,77,255,0.3), rgba(0,188,212,0.2));
|
||||
border: 1px solid rgba(124,77,255,0.15);
|
||||
display: flex; align-items: center; justify-content: center;
|
||||
color: #fff; font-size: 18px;
|
||||
box-shadow: 0 0 20px rgba(124,77,255,0.1);
|
||||
}
|
||||
.chat-header .chat-info h3 { color: #fff; font-size: 16px; font-weight: 600; }
|
||||
.chat-header .chat-info span { color: rgba(255,255,255,0.3); font-size: 11px; }
|
||||
.chat-quota {
|
||||
margin-left: auto;
|
||||
background: rgba(124,77,255,0.1);
|
||||
border: 1px solid rgba(124,77,255,0.15);
|
||||
border-radius: 20px;
|
||||
padding: 6px 14px;
|
||||
color: #b388ff;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.chat-msg { display: flex; gap: 10px; margin-bottom: 16px; }
|
||||
.chat-msg.ai { }
|
||||
.chat-msg.user { flex-direction: row-reverse; }
|
||||
.chat-msg .bubble {
|
||||
max-width: 82%;
|
||||
padding: 12px 16px;
|
||||
border-radius: 16px;
|
||||
font-size: 13px;
|
||||
line-height: 1.6;
|
||||
}
|
||||
.chat-msg.ai .bubble {
|
||||
background: rgba(255,255,255,0.04);
|
||||
border: 1px solid rgba(255,255,255,0.06);
|
||||
color: rgba(255,255,255,0.8);
|
||||
border-bottom-left-radius: 4px;
|
||||
}
|
||||
.chat-msg.user .bubble {
|
||||
background: linear-gradient(135deg, rgba(124,77,255,0.3), rgba(124,77,255,0.15));
|
||||
border: 1px solid rgba(124,77,255,0.15);
|
||||
color: #fff;
|
||||
border-bottom-right-radius: 4px;
|
||||
}
|
||||
.chat-msg .time { font-size: 10px; color: rgba(255,255,255,0.15); padding-top: 4px; }
|
||||
.chat-msg.ai .time { padding-left: 52px; }
|
||||
.chat-msg.user .time { text-align: right; }
|
||||
|
||||
.chat-input {
|
||||
background: rgba(255,255,255,0.04);
|
||||
border: 1px solid rgba(255,255,255,0.06);
|
||||
border-radius: 14px;
|
||||
padding: 10px 14px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
margin-top: 8px;
|
||||
backdrop-filter: blur(10px);
|
||||
-webkit-backdrop-filter: blur(10px);
|
||||
}
|
||||
.chat-input input {
|
||||
flex: 1;
|
||||
background: none;
|
||||
border: none;
|
||||
outline: none;
|
||||
color: rgba(255,255,255,0.8);
|
||||
font-size: 14px;
|
||||
}
|
||||
.chat-input input::placeholder { color: rgba(255,255,255,0.2); }
|
||||
.chat-input .send-btn {
|
||||
width: 36px; height: 36px; border-radius: 50%;
|
||||
background: linear-gradient(135deg, #7c4dff, #b388ff);
|
||||
display: flex; align-items: center; justify-content: center;
|
||||
color: #fff; cursor: pointer;
|
||||
box-shadow: 0 0 20px rgba(124,77,255,0.2);
|
||||
transition: all 0.2s;
|
||||
}
|
||||
.chat-input .send-btn:hover { transform: scale(1.05); box-shadow: 0 0 30px rgba(124,77,255,0.3); }
|
||||
|
||||
/* ============ PAGE 4: Profile ============ */
|
||||
.profile-card { text-align: center; padding: 20px 0 24px; }
|
||||
.profile-avatar {
|
||||
width: 72px; height: 72px; border-radius: 50%;
|
||||
background: linear-gradient(135deg, rgba(124,77,255,0.3), rgba(0,188,212,0.15));
|
||||
border: 2px solid rgba(124,77,255,0.2);
|
||||
margin: 0 auto 14px;
|
||||
display: flex; align-items: center; justify-content: center;
|
||||
font-size: 32px;
|
||||
box-shadow: 0 0 40px rgba(124,77,255,0.1);
|
||||
}
|
||||
.profile-card h3 { color: #fff; font-size: 18px; font-weight: 600; }
|
||||
.profile-card .level { color: rgba(255,255,255,0.3); font-size: 12px; margin-top: 4px; }
|
||||
|
||||
.plan-card {
|
||||
border-radius: 18px;
|
||||
padding: 20px;
|
||||
margin-bottom: 24px;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
background: linear-gradient(135deg, rgba(124,77,255,0.08), rgba(0,0,0,0.2));
|
||||
border: 1px solid rgba(124,77,255,0.12);
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
}
|
||||
.plan-card::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: -40px;
|
||||
right: -20px;
|
||||
width: 120px;
|
||||
height: 120px;
|
||||
background: radial-gradient(circle, rgba(124,77,255,0.06) 0%, transparent 70%);
|
||||
}
|
||||
.plan-card .plan-info h3 { color: #fff; font-size: 16px; font-weight: 600; }
|
||||
.plan-card .plan-info p { color: rgba(255,255,255,0.3); font-size: 12px; margin-top: 4px; }
|
||||
.plan-card .plan-btn {
|
||||
background: linear-gradient(135deg, #7c4dff, #b388ff);
|
||||
border: none;
|
||||
padding: 10px 22px;
|
||||
border-radius: 20px;
|
||||
color: #fff;
|
||||
font-size: 13px;
|
||||
cursor: pointer;
|
||||
font-weight: 500;
|
||||
box-shadow: 0 0 20px rgba(124,77,255,0.2);
|
||||
transition: all 0.2s;
|
||||
}
|
||||
.plan-card .plan-btn:hover { transform: scale(1.02); box-shadow: 0 0 30px rgba(124,77,255,0.3); }
|
||||
|
||||
.menu-item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 14px;
|
||||
padding: 14px 0;
|
||||
border-bottom: 1px solid rgba(255,255,255,0.04);
|
||||
cursor: pointer;
|
||||
transition: all 0.2s;
|
||||
}
|
||||
.menu-item:hover { padding-left: 4px; }
|
||||
.menu-item .m-icon {
|
||||
width: 34px; height: 34px; border-radius: 10px;
|
||||
display: flex; align-items: center; justify-content: center;
|
||||
font-size: 16px;
|
||||
border: 1px solid rgba(255,255,255,0.06);
|
||||
}
|
||||
.menu-item .m-label { color: rgba(255,255,255,0.7); font-size: 14px; flex: 1; }
|
||||
.menu-item .m-arrow { color: rgba(255,255,255,0.15); font-size: 14px; }
|
||||
.menu-item .m-badge {
|
||||
font-size: 10px; padding: 2px 10px; border-radius: 10px;
|
||||
background: rgba(239,83,80,0.12); color: #ef5350;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
/* ============ PAGE 5: Trend Feed ============ */
|
||||
.filter-bar { display: flex; gap: 8px; margin-bottom: 18px; overflow-x: auto; padding-bottom: 4px; }
|
||||
.filter-bar::-webkit-scrollbar { display: none; }
|
||||
.filter-tag {
|
||||
padding: 6px 16px;
|
||||
border-radius: 20px;
|
||||
font-size: 12px;
|
||||
white-space: nowrap;
|
||||
cursor: pointer;
|
||||
transition: all 0.2s;
|
||||
border: 1px solid rgba(255,255,255,0.06);
|
||||
}
|
||||
.filter-tag.active { background: rgba(124,77,255,0.2); color: #b388ff; border-color: rgba(124,77,255,0.2); }
|
||||
.filter-tag:not(.active) { background: rgba(255,255,255,0.03); color: rgba(255,255,255,0.3); }
|
||||
.filter-tag:hover { border-color: rgba(255,255,255,0.15); }
|
||||
|
||||
.trend-card {
|
||||
border-radius: 14px;
|
||||
padding: 14px 16px;
|
||||
margin-bottom: 10px;
|
||||
background: rgba(255,255,255,0.03);
|
||||
cursor: pointer;
|
||||
transition: all 0.3s ease;
|
||||
position: relative;
|
||||
}
|
||||
.trend-card:hover { background: rgba(255,255,255,0.05); }
|
||||
.trend-card .trend-marker {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 14px;
|
||||
bottom: 14px;
|
||||
width: 3px;
|
||||
border-radius: 2px;
|
||||
}
|
||||
.trend-card .trend-content { padding-left: 14px; }
|
||||
.trend-card .trend-tag { display: inline-block; font-size: 10px; padding: 2px 10px; border-radius: 6px; margin-bottom: 8px; font-weight: 500; }
|
||||
.trend-card .trend-title { color: rgba(255,255,255,0.85); font-size: 13px; line-height: 1.5; margin-bottom: 6px; font-weight: 500; }
|
||||
.trend-card .trend-source { color: rgba(255,255,255,0.2); font-size: 10px; }
|
||||
|
||||
/* ============ Common ============ */
|
||||
::-webkit-scrollbar { display: none; }
|
||||
.label { color: rgba(255,255,255,0.2); font-size: 11px; text-align: center; padding: 12px 0; }
|
||||
.screen-label { text-align: center; color: rgba(255,255,255,0.15); font-size: 11px; padding: 16px 0 4px; letter-spacing: 2px; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<!-- ============ SCREEN 1: HOME ============ -->
|
||||
<div class="phone">
|
||||
<div class="screen-label">首页 — 5 维度入口 + 今日快讯</div>
|
||||
<div class="status-bar">
|
||||
<span class="time">9:41</span>
|
||||
<div class="status-icons"><span>📶</span><span>📶</span><span>🔋</span></div>
|
||||
</div>
|
||||
<div class="phone-content">
|
||||
<!-- Header -->
|
||||
<div class="header">
|
||||
<div class="brand">
|
||||
<div class="brand-icon">✦</div>
|
||||
<div class="brand-text">
|
||||
<h1>AI 维度</h1>
|
||||
<div class="subtitle">宇之然 · 探索</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="header-actions">
|
||||
<div class="icon">🔔</div>
|
||||
<div class="icon">👤</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Greeting -->
|
||||
<div class="greeting">
|
||||
<h2>探索 <span>人工智能</span></h2>
|
||||
<p>从 5 个维度,系统理解 AI 的过去、现在与未来</p>
|
||||
</div>
|
||||
|
||||
<!-- Search -->
|
||||
<div class="search-bar">
|
||||
<span class="icon">🔍</span>
|
||||
<span>搜索 AI 知识...</span>
|
||||
</div>
|
||||
|
||||
<!-- 5 Dimensions - Glassmorphism Grid -->
|
||||
<div class="section-header">
|
||||
<h2>✦ 五个维度</h2>
|
||||
</div>
|
||||
<div class="dim-grid">
|
||||
<div class="dim-card origin">
|
||||
<div class="dim-icon origin">🌅</div>
|
||||
<div class="dim-name">AI 起源</div>
|
||||
<div class="dim-desc">从图灵到达特茅斯,追溯 70 年</div>
|
||||
<div class="dim-count">12 篇 · 4 个问答</div>
|
||||
</div>
|
||||
<div class="dim-card dev">
|
||||
<div class="dim-icon dev">📈</div>
|
||||
<div class="dim-name">AI 发展</div>
|
||||
<div class="dim-desc">深度学习·Transformer·MoE</div>
|
||||
<div class="dim-count">18 篇 · 6 个问答</div>
|
||||
</div>
|
||||
<div class="dim-card current">
|
||||
<div class="dim-icon current">🌐</div>
|
||||
<div class="dim-name">AI 当前</div>
|
||||
<div class="dim-desc">大模型格局·Agent·具身智能</div>
|
||||
<div class="dim-count">15 篇 · 5 个问答</div>
|
||||
</div>
|
||||
<div class="dim-card learn">
|
||||
<div class="dim-icon learn">🛠</div>
|
||||
<div class="dim-name">AI 学习</div>
|
||||
<div class="dim-desc">提示词·RAG·微调·工具链</div>
|
||||
<div class="dim-count">20 篇 · 8 个问答</div>
|
||||
</div>
|
||||
<div class="dim-card trend full">
|
||||
<div class="dim-icon trend">🔥</div>
|
||||
<div class="dim-name">AI 趋势</div>
|
||||
<div class="dim-desc">每日资讯 · 产品动态 · 论文快报</div>
|
||||
<div class="dim-count">今日已更新 8 条</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Today's News -->
|
||||
<div class="section-header">
|
||||
<h2>📡 今日快讯</h2>
|
||||
<span class="more">查看全部 →</span>
|
||||
</div>
|
||||
<div class="news-card">
|
||||
<span class="news-tag hot">🔥 热门</span>
|
||||
<div class="news-title">DeepSeek 被曝自研推理芯片,降低对英伟达依赖</div>
|
||||
<div class="news-meta"><span>量子位</span><span>2 小时前</span></div>
|
||||
</div>
|
||||
<div class="news-card">
|
||||
<span class="news-tag new">🚀 最新</span>
|
||||
<div class="news-title">蚂蚁灵波开源 LingBot-World 2.0,世界模型首次实现小时级实时生成</div>
|
||||
<div class="news-meta"><span>量子位</span><span>4 小时前</span></div>
|
||||
</div>
|
||||
<div class="news-card">
|
||||
<span class="news-tag pick">📌 精选</span>
|
||||
<div class="news-title">阿里获 ACL 2026 最佳资源论文奖,揭示 Agent 结构性缺陷</div>
|
||||
<div class="news-meta"><span>机器之心</span><span>6 小时前</span></div>
|
||||
</div>
|
||||
|
||||
<!-- Bottom Nav -->
|
||||
<div class="bottom-nav">
|
||||
<div class="nav-item active"><span class="nav-icon">✦</span>探索</div>
|
||||
<div class="nav-item"><span class="nav-icon">💬</span>问答</div>
|
||||
<div class="nav-item"><span class="nav-icon">📋</span>路径</div>
|
||||
<div class="nav-item"><span class="nav-icon">👤</span>我的</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ============ SCREEN 2: DIMENSION DETAIL ============ -->
|
||||
<div class="phone">
|
||||
<div class="screen-label">维度详情 — AI 起源内容列表</div>
|
||||
<div class="status-bar">
|
||||
<span class="time">9:41</span>
|
||||
<div class="status-icons"><span>📶</span><span>📶</span><span>🔋</span></div>
|
||||
</div>
|
||||
<div class="phone-content">
|
||||
<!-- Back -->
|
||||
<div class="back-btn">← 返回</div>
|
||||
|
||||
<!-- Banner -->
|
||||
<div class="dim-banner">
|
||||
<h2>🌅 AI 起源</h2>
|
||||
<p>从 1950 年图灵测试到 2026 年通用人工智能,追溯人工智能 70 年演进之路,理解每一次技术跃迁背后的思想革命</p>
|
||||
<div class="progress-track"><div class="fill"></div></div>
|
||||
<div class="progress-label">探索进度 35% · 已读 4/12 篇</div>
|
||||
</div>
|
||||
|
||||
<!-- Knowledge List -->
|
||||
<div class="knowledge-item">
|
||||
<div class="k-icon" style="background:rgba(124,77,255,0.1);color:#b388ff;border-color:rgba(124,77,255,0.1);">📜</div>
|
||||
<div class="k-info">
|
||||
<div class="k-title">图灵测试:人工智能的哲学起点</div>
|
||||
<div class="k-desc">1950 年,艾伦·图灵提出"机器能思考吗?"</div>
|
||||
<div class="k-meta">
|
||||
<span>📖 5 分钟</span>
|
||||
<span>⭐ 已收藏</span>
|
||||
<span class="k-badge free">免费</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="knowledge-item">
|
||||
<div class="k-icon" style="background:rgba(0,188,212,0.1);color:#4dd0e1;border-color:rgba(0,188,212,0.1);">🏛</div>
|
||||
<div class="k-info">
|
||||
<div class="k-title">达特茅斯会议:AI 的诞生时刻</div>
|
||||
<div class="k-desc">1956 年,一群科学家正式命名了"人工智能"</div>
|
||||
<div class="k-meta">
|
||||
<span>📖 8 分钟</span>
|
||||
<span>🔖 12 人收藏</span>
|
||||
<span class="k-badge free">免费</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="knowledge-item">
|
||||
<div class="k-icon" style="background:rgba(255,193,7,0.1);color:#ffd54f;border-color:rgba(255,193,7,0.1);">♟</div>
|
||||
<div class="k-info">
|
||||
<div class="k-title">深蓝 vs 卡斯帕罗夫:AI 的第一次胜利</div>
|
||||
<div class="k-desc">1997 年,IBM 深蓝首次击败国际象棋世界冠军</div>
|
||||
<div class="k-meta">
|
||||
<span>📖 6 分钟</span>
|
||||
<span>🔖 8 人收藏</span>
|
||||
<span class="k-badge free">免费</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="knowledge-item">
|
||||
<div class="k-icon" style="background:rgba(0,200,150,0.1);color:#4db6ac;border-color:rgba(0,200,150,0.1);">🧠</div>
|
||||
<div class="k-info">
|
||||
<div class="k-title">AlphaGo 与深度学习革命</div>
|
||||
<div class="k-desc">2016 年,AI 攻克围棋——人类智力最后的堡垒</div>
|
||||
<div class="k-meta">
|
||||
<span>📖 10 分钟</span>
|
||||
<span>🔖 15 人收藏</span>
|
||||
<span class="k-badge pro">Pro</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="knowledge-item">
|
||||
<div class="k-icon" style="background:rgba(239,83,80,0.1);color:#ef5350;border-color:rgba(239,83,80,0.1);">⚡</div>
|
||||
<div class="k-info">
|
||||
<div class="k-title">从 GPT 到 AGI:大模型时代</div>
|
||||
<div class="k-desc">2018-2026,Transformer 如何改变一切</div>
|
||||
<div class="k-meta">
|
||||
<span>📖 12 分钟</span>
|
||||
<span>🔖 20 人收藏</span>
|
||||
<span class="k-badge pro">Pro</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ============ SCREEN 3: AI CHAT ============ -->
|
||||
<div class="phone">
|
||||
<div class="screen-label">AI 问答 — 沉浸式对话</div>
|
||||
<div class="status-bar">
|
||||
<span class="time">9:41</span>
|
||||
<div class="status-icons"><span>📶</span><span>📶</span><span>🔋</span></div>
|
||||
</div>
|
||||
<div class="phone-content">
|
||||
<!-- Chat Header -->
|
||||
<div class="chat-header">
|
||||
<div class="chat-avatar">∞</div>
|
||||
<div class="chat-info">
|
||||
<h3>AI 助手</h3>
|
||||
<span>DeepSeek V4 · 在线</span>
|
||||
</div>
|
||||
<div class="chat-quota">剩余 5 次</div>
|
||||
</div>
|
||||
|
||||
<!-- Messages -->
|
||||
<div class="chat-msg ai">
|
||||
<div class="chat-avatar" style="width:32px;height:32px;font-size:14px;border-radius:10px;flex-shrink:0;">∞</div>
|
||||
<div>
|
||||
<div class="bubble">你好!我是 AI 维度助手,你可以问我任何关于人工智能的问题,比如:</div>
|
||||
<div class="time">AI 助手</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="chat-msg ai">
|
||||
<div class="chat-avatar" style="width:32px;height:32px;font-size:14px;border-radius:10px;flex-shrink:0;visibility:hidden;">∞</div>
|
||||
<div>
|
||||
<div class="bubble">💡 "Transformer 的核心原理是什么?"<br>💡 "RAG 和微调有什么区别?"<br>💡 "2026 年最值得关注的 AI 趋势?"</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="chat-msg user">
|
||||
<div>
|
||||
<div class="bubble">Transformer 的核心原理是什么?</div>
|
||||
<div class="time">刚刚</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="chat-msg ai">
|
||||
<div class="chat-avatar" style="width:32px;height:32px;font-size:14px;border-radius:10px;flex-shrink:0;">∞</div>
|
||||
<div>
|
||||
<div class="bubble">Transformer 的核心是 **自注意力机制(Self-Attention)**。它让模型在处理每个词时,能同时关注句子中所有词的关系,而不是像 RNN 那样逐个处理。</div>
|
||||
<div class="time">AI 助手</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="chat-msg ai">
|
||||
<div class="chat-avatar" style="width:32px;height:32px;font-size:14px;border-radius:10px;flex-shrink:0;visibility:hidden;">∞</div>
|
||||
<div>
|
||||
<div class="bubble">简单说:Transformer = 自注意力 + 多头机制 + 位置编码。2017 年由 Google 提出后,直接催生了 GPT、BERT 等所有现代大模型。</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Input -->
|
||||
<div class="chat-input">
|
||||
<span style="color:rgba(255,255,255,0.2);cursor:pointer;">➕</span>
|
||||
<input type="text" placeholder="输入你的 AI 问题..." />
|
||||
<div class="send-btn">➤</div>
|
||||
</div>
|
||||
|
||||
<!-- Bottom Nav -->
|
||||
<div class="bottom-nav" style="margin-top:12px;">
|
||||
<div class="nav-item"><span class="nav-icon">✦</span>探索</div>
|
||||
<div class="nav-item active"><span class="nav-icon">💬</span>问答</div>
|
||||
<div class="nav-item"><span class="nav-icon">📋</span>路径</div>
|
||||
<div class="nav-item"><span class="nav-icon">👤</span>我的</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ============ SCREEN 4: PROFILE ============ -->
|
||||
<div class="phone">
|
||||
<div class="screen-label">个人中心 — 进度与订阅</div>
|
||||
<div class="status-bar">
|
||||
<span class="time">9:41</span>
|
||||
<div class="status-icons"><span>📶</span><span>📶</span><span>🔋</span></div>
|
||||
</div>
|
||||
<div class="phone-content">
|
||||
<!-- Profile -->
|
||||
<div class="profile-card">
|
||||
<div class="profile-avatar">🧑</div>
|
||||
<h3>星辰旅者</h3>
|
||||
<div class="level">Lv.5 · 维度学徒 · 已探索 12 篇文章</div>
|
||||
</div>
|
||||
|
||||
<!-- Plan -->
|
||||
<div class="plan-card">
|
||||
<div class="plan-info">
|
||||
<h3>✦ 免费版</h3>
|
||||
<p>每日 5 次 AI 问答 · 解锁全部知识</p>
|
||||
</div>
|
||||
<div class="plan-btn">升级 Pro</div>
|
||||
</div>
|
||||
|
||||
<!-- Menu -->
|
||||
<div class="menu-item">
|
||||
<div class="m-icon" style="background:rgba(124,77,255,0.1);color:#b388ff;border-color:rgba(124,77,255,0.1);">📚</div>
|
||||
<span class="m-label">我的收藏</span>
|
||||
<span class="m-arrow">→</span>
|
||||
</div>
|
||||
<div class="menu-item">
|
||||
<div class="m-icon" style="background:rgba(0,188,212,0.1);color:#4dd0e1;border-color:rgba(0,188,212,0.1);">📊</div>
|
||||
<span class="m-label">学习进度</span>
|
||||
<span class="m-arrow">→</span>
|
||||
</div>
|
||||
<div class="menu-item">
|
||||
<div class="m-icon" style="background:rgba(0,200,150,0.1);color:#4db6ac;border-color:rgba(0,200,150,0.1);">🏆</div>
|
||||
<span class="m-label">成就</span>
|
||||
<span class="m-badge">3 项未解锁</span>
|
||||
<span class="m-arrow">→</span>
|
||||
</div>
|
||||
<div class="menu-item">
|
||||
<div class="m-icon" style="background:rgba(255,193,7,0.1);color:#ffd54f;border-color:rgba(255,193,7,0.1);">📅</div>
|
||||
<span class="m-label">每日签到</span>
|
||||
<span class="m-arrow">→</span>
|
||||
</div>
|
||||
<div class="menu-item">
|
||||
<div class="m-icon" style="background:rgba(239,83,80,0.1);color:#ef5350;border-color:rgba(239,83,80,0.1);">⚙️</div>
|
||||
<span class="m-label">设置</span>
|
||||
<span class="m-arrow">→</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ============ SCREEN 5: TREND FEED ============ -->
|
||||
<div class="phone">
|
||||
<div class="screen-label">AI 趋势 — 资讯流</div>
|
||||
<div class="status-bar">
|
||||
<span class="time">9:41</span>
|
||||
<div class="status-icons"><span>📶</span><span>📶</span><span>🔋</span></div>
|
||||
</div>
|
||||
<div class="phone-content">
|
||||
<div class="back-btn">← 返回</div>
|
||||
<div class="section-header" style="margin-bottom:2px;">
|
||||
<h2>🔥 AI 趋势</h2>
|
||||
<span class="more">订阅</span>
|
||||
</div>
|
||||
<p style="color:rgba(255,255,255,0.3);font-size:12px;margin-bottom:16px;">每日追踪 AI 前沿动态,不错过每一个重要时刻</p>
|
||||
|
||||
<!-- Filter -->
|
||||
<div class="filter-bar">
|
||||
<span class="filter-tag active">全部</span>
|
||||
<span class="filter-tag">🚀 产品</span>
|
||||
<span class="filter-tag">📄 论文</span>
|
||||
<span class="filter-tag">🔧 工具</span>
|
||||
<span class="filter-tag">🏢 公司</span>
|
||||
</div>
|
||||
|
||||
<!-- Trend Cards -->
|
||||
<div class="trend-card" style="border:1px solid rgba(239,83,80,0.08);">
|
||||
<div class="trend-marker" style="background:linear-gradient(180deg, #ef5350, #ff8a80);"></div>
|
||||
<div class="trend-content">
|
||||
<span class="trend-tag" style="background:rgba(239,83,80,0.12);color:#ef5350;">🔥 热门</span>
|
||||
<div class="trend-title">DeepSeek 秘密造芯:推理芯片项目已启动一年</div>
|
||||
<div class="trend-source">路透社 · 2026-07-10</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="trend-card" style="border:1px solid rgba(0,188,212,0.08);">
|
||||
<div class="trend-marker" style="background:linear-gradient(180deg, #4dd0e1, #80deea);"></div>
|
||||
<div class="trend-content">
|
||||
<span class="trend-tag" style="background:rgba(0,188,212,0.12);color:#4dd0e1;">🚀 产品</span>
|
||||
<div class="trend-title">蚂蚁灵波开源 LingBot-World 2.0,世界模型首次实现小时级实时生成</div>
|
||||
<div class="trend-source">量子位 · 2026-07-09</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="trend-card" style="border:1px solid rgba(0,200,150,0.08);">
|
||||
<div class="trend-marker" style="background:linear-gradient(180deg, #4db6ac, #80cbc4);"></div>
|
||||
<div class="trend-content">
|
||||
<span class="trend-tag" style="background:rgba(0,200,150,0.12);color:#4db6ac;">📄 论文</span>
|
||||
<div class="trend-title">阿里获 ACL 2026 最佳资源论文奖,揭示 Agent 结构性缺陷</div>
|
||||
<div class="trend-source">机器之心 · 2026-07-09</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="trend-card" style="border:1px solid rgba(255,193,7,0.08);">
|
||||
<div class="trend-marker" style="background:linear-gradient(180deg, #ffd54f, #ffe082);"></div>
|
||||
<div class="trend-content">
|
||||
<span class="trend-tag" style="background:rgba(255,193,7,0.12);color:#ffd54f;">🔧 工具</span>
|
||||
<div class="trend-title">腾讯混元 Hy3 正式上线,Agent 任务解决率跃升至 90%</div>
|
||||
<div class="trend-source">腾讯云 · 2026-07-09</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="trend-card" style="border:1px solid rgba(124,77,255,0.08);">
|
||||
<div class="trend-marker" style="background:linear-gradient(180deg, #b388ff, #d1c4e9);"></div>
|
||||
<div class="trend-content">
|
||||
<span class="trend-tag" style="background:rgba(124,77,255,0.12);color:#b388ff;">📌 精选</span>
|
||||
<div class="trend-title">WAIC 2026 倒计时:7月17日上海开幕,1100+企业参展</div>
|
||||
<div class="trend-source">量子位 · 2026-07-09</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="label">宇之然AI维度 · 2026 Design v2 · 暗色宇宙玻璃拟态</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,58 +0,0 @@
|
||||
# 后端 API 评估与改造计划
|
||||
|
||||
## 现有 API 与新前端映射
|
||||
|
||||
### ✅ 可直接复用
|
||||
|
||||
| 前端功能 | 后端 API | 改造量 |
|
||||
|---------|---------|--------|
|
||||
| 微信登录 | `POST /api/auth/login` | ✅ 零改动 |
|
||||
| H5 注册/登录 | `POST /api/auth/user/register` / `POST /api/auth/user/login` | ✅ 零改动 |
|
||||
| 获取用户信息 | `GET /api/auth/me` | ✅ 零改动 |
|
||||
| 知识列表(按维度) | `GET /api/knowledge?dim=1&category=concept` | ✅ 零改动,改数据即可 |
|
||||
| 知识详情 | `GET /api/knowledge/:id` | ✅ 零改动 |
|
||||
| 收藏/取消收藏 | `POST /api/knowledge/:id/collect` / `DELETE /api/knowledge/collect/:id` | ✅ 零改动 |
|
||||
| AI 问答 | `POST /api/ai-chat/ask` | ⚠️ 改 system prompt(从几何→AI) |
|
||||
| 问答配额 | `GET /api/ai-chat/quota` | ✅ 零改动 |
|
||||
| 分享获得次数 | `POST /api/ai-chat/share-gain` | ✅ 零改动 |
|
||||
| 创建订单 | `POST /api/payment/create-order` | ✅ 零改动 |
|
||||
| 商品列表 | `GET /api/payment/products` | ✅ 改商品数据 |
|
||||
| 提交反馈 | `POST /api/feedback` | ✅ 零改动 |
|
||||
| 上传作品 | `POST /api/gallery` | ⚠️ 改为 AI 作品展示 |
|
||||
| 作品列表 | `GET /api/gallery` | ✅ 零改动 |
|
||||
|
||||
### ⚠️ 需改造
|
||||
|
||||
| API | 改动内容 | 工作量 |
|
||||
|-----|---------|--------|
|
||||
| `POST /api/ai-chat/ask` | `getSystemPromptByDimension()` 函数 — 从几何 prompt 改为 AI 主题 prompt | 改 1 个函数 |
|
||||
| `GET /api/user/progress` | 原为几何探索进度,改为 AI 学习进度 | 前端改字段名即可 |
|
||||
| `POST /api/user/progress` | 同上 | 前端改字段名即可 |
|
||||
|
||||
### ❌ 移除或降级
|
||||
|
||||
| API | 处理方式 |
|
||||
|-----|---------|
|
||||
| `GET /api/pinyin/*` (4 个路由) | 前端不调用即可,后端保留兼容 |
|
||||
| `GET /api/bgm` | 可作为可选功能保留(背景白噪音) |
|
||||
| `GET /api/share` | 保留,用于分享激励 |
|
||||
|
||||
## 需要新增的 API
|
||||
|
||||
| 新 API | 说明 | 工作量 |
|
||||
|--------|------|--------|
|
||||
| `GET /api/trends` | AI 趋势资讯列表(接入 Hermes cron 的新闻数据) | 新建 model + route,1天 |
|
||||
| `GET /api/tools` | AI 工具导航列表 | 简单 CRUD,小时级 |
|
||||
|
||||
## 改造总结
|
||||
|
||||
**后端改造成本极低,95% 的 API 可以直接用。**
|
||||
- 主要改 1 个函数(AI Chat system prompt)
|
||||
- 新增 1-2 个接口(趋势、工具)
|
||||
- 其余全部零改动
|
||||
|
||||
## 数据库改造
|
||||
- 无需改 schema
|
||||
- Knowledge 表已有 `dim`, `category`, `sections`, `tags`, `isPremium` 等字段
|
||||
- 只需填充 AI 内容数据
|
||||
- AIChatQuota 表可以直接用(原 5 次免费 → 改为 10 次免费)
|
||||
@@ -1,91 +0,0 @@
|
||||
# 宇之然AI维度 - 产品规划文档
|
||||
|
||||
## 产品定位
|
||||
**AI 知识探索社区** — 不是教育平台,不是课程网站,而是一个帮助普通人系统化理解 AI 的互动工具。
|
||||
|
||||
## 目标用户
|
||||
- AI 小白/转行者:想学 AI 但不知从哪开始
|
||||
- 程序员转型:需要 RAG/Agent/微调实操知识
|
||||
- 职场人:想了解 AI 趋势,不被淘汰
|
||||
- AI 爱好者:追踪最新工具和产品动态
|
||||
|
||||
## 核心架构 — 5 个 AI 维度
|
||||
|
||||
| 维度 | 原名 | 改造为 | 内容方向 | 更新频率 |
|
||||
|------|------|--------|---------|---------|
|
||||
| dim1 | 长度探索 | **AI 起源** | 图灵测试→达特茅斯→深蓝→AlphaGo→GPT | 一次填充 |
|
||||
| dim2 | 面积探索 | **AI 发展** | 深度学习→Transformer→MoE→多模态→Agent | 一次填充 |
|
||||
| dim3 | 立体探索 | **AI 当前** | 各模型对比、开源/闭源生态、具身智能 | 季度更新 |
|
||||
| dim4 | 事件探索 | **AI 学习** | 提示词工程→RAG→微调→工具链→入门教程 | 月更新 |
|
||||
| dim5 | 思想探索 | **AI 趋势** | 每日资讯、产品动态、论文快报 | **每日更新** |
|
||||
|
||||
## 功能模块
|
||||
|
||||
### 1. 知识探索(核心)
|
||||
- 5 个维度的结构化 AI 知识
|
||||
- 每篇文章支持:内容阅读 + 问答测验 + 收藏
|
||||
- 来源:管理后台录入 + AI 辅助生成
|
||||
|
||||
### 2. AI 问答(增值)
|
||||
- 用户可就任意 AI 问题提问
|
||||
- 免费用户每日 5 次,Pro 用户无限
|
||||
- 已对接云帆网关 AI 能力
|
||||
|
||||
### 3. 趋势跟踪(差异化)
|
||||
- 每日 AI 新闻速报(来自 Hermes cron)
|
||||
- 热门工具推荐
|
||||
- 产品动态
|
||||
|
||||
### 4. 学习路径(Pro 功能)
|
||||
- 从"AI 小白 → 能上手用 AI 工具"的引导路径
|
||||
- 推荐知识模块和里程碑
|
||||
|
||||
### 5. AI 工具箱(扩展)
|
||||
- 常用 AI 工具导航
|
||||
- 提示词模板库(Pro)
|
||||
|
||||
## 盈利模式
|
||||
| 层 | 内容 | 定价 |
|
||||
|----|------|------|
|
||||
| 免费 | 5 维度知识浏览 + 每日 5 次 AI 问答 | ¥0 |
|
||||
| Pro | 无限 AI 问答 + 趋势跟踪 + 提示词库 | ¥19.9/月 |
|
||||
| VIP | Pro + 学习路径 + 工具教程 | ¥39.9/月 |
|
||||
|
||||
## 技术架构
|
||||
```
|
||||
┌─────────────────────────────────┐
|
||||
│ 微信小程序 (uni-app) │
|
||||
│ ┌─────┬──────┬──────┬──────┐ │
|
||||
│ │首页 │维度页│AI问答│趋势 │ │
|
||||
│ └──┬──┴──┬───┴──┬───┴──┬───┘ │
|
||||
│ │知识 │聊天 │资讯 │工具 │
|
||||
└─────┼─────┼──────┼──────┼───────┘
|
||||
│ │ │ │
|
||||
▼ ▼ ▼ ▼
|
||||
┌─────────────────────────────────┐
|
||||
│ Node.js Express API (:3001) │
|
||||
│ /api/knowledge /api/ai-chat │
|
||||
│ /api/auth /api/gallery │
|
||||
│ /api/user /api/payment │
|
||||
└──────────────┬──────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────┐
|
||||
│ MongoDB (wdkj 库) │
|
||||
│ Knowledge / User / AIChatQuota │
|
||||
│ Order / Gallery / Feedback │
|
||||
└─────────────────────────────────┘
|
||||
```
|
||||
|
||||
## 后端改造清单
|
||||
- [ ] 修改 AI Chat 的 system prompt(从几何→AI 主题)
|
||||
- [ ] 新增趋势资讯接口(接入 cron 数据)
|
||||
- [ ] Knowledge 分类增加 category(适配 AI 维度)
|
||||
- [ ] 可选:移除拼音模块路由
|
||||
|
||||
## 前端开发(uni-app 全新)
|
||||
- [ ] 首页:5 维度入口 + 今日 AI 快讯
|
||||
- [ ] 维度页:知识列表 + 问答测验
|
||||
- [ ] AI 问答页:对话界面
|
||||
- [ ] 趋势页:资讯流
|
||||
- [ ] 个人中心:进度/收藏/订阅
|
||||
@@ -1,8 +0,0 @@
|
||||
allowBuilds:
|
||||
'@parcel/watcher': set this to true or false
|
||||
core-js: set this to true or false
|
||||
core-js-pure: set this to true or false
|
||||
esbuild: set this to true or false
|
||||
vue-demi: set this to true or false
|
||||
minimumReleaseAgeExclude:
|
||||
- '@dcloudio/uni-mp-weixin@2.0.2-5010520260709001'
|
||||
@@ -1,5 +1,17 @@
|
||||
{
|
||||
"devDependencies": {
|
||||
"miniprogram-ci": "^2.1.31"
|
||||
}
|
||||
"name": "ai-dimension",
|
||||
"version": "1.1.0",
|
||||
"private": true,
|
||||
"description": "宇之然AI维度 - AI知识探索社区(微信小程序 + H5)",
|
||||
"scripts": {
|
||||
"server:start": "cd server && npm start",
|
||||
"server:dev": "cd server && npm run dev",
|
||||
"client:dev:mp": "cd client && pnpm dev:mp-weixin",
|
||||
"client:build:mp": "cd client && pnpm build:mp-weixin",
|
||||
"client:dev:h5": "cd client && pnpm dev:h5",
|
||||
"client:build:h5": "cd client && pnpm build:h5"
|
||||
},
|
||||
"devDependencies": {
|
||||
"miniprogram-ci": "^2.1.31"
|
||||
}
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
allowBuilds:
|
||||
'@parcel/watcher': set this to true or false
|
||||
'@swc/core': set this to true or false
|
||||
less: set this to true or false
|
||||
protobufjs: set this to true or false
|
||||
@@ -1,5 +1,6 @@
|
||||
node_modules/
|
||||
.env
|
||||
logs/
|
||||
certs/
|
||||
*.log
|
||||
.DS_Store
|
||||
@@ -1,19 +1,14 @@
|
||||
{
|
||||
"name": "wdkj-server",
|
||||
"version": "1.0.0",
|
||||
"description": "宇之然-空间探索 - 后端服务",
|
||||
"name": "ai-dimension-server",
|
||||
"version": "1.1.0",
|
||||
"description": "宇之然AI维度 - 后端API服务",
|
||||
"main": "src/index.js",
|
||||
"scripts": {
|
||||
"start": "node src/index.js",
|
||||
"dev": "nodemon src/index.js",
|
||||
"test": "jest"
|
||||
},
|
||||
"keywords": [
|
||||
"wechat",
|
||||
"miniprogram",
|
||||
"geometry",
|
||||
"education"
|
||||
],
|
||||
"keywords": ["wechat", "miniprogram", "ai", "education"],
|
||||
"author": "宇之然团队",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||