前端个人项目开发记录(3)

2 阅读12分钟

请问一下 目前项目已经完成了 首页 后台 大屏,目前还需要完成移动端h5页面,以及小程序,和桌面应用需要如何选择技术,我想改成vuejs框架来完成这些功能,后台使用nestjs来做单体服务 用户提出了一个新的技术栈规划需求:

  1. 已完成的功能

    • 首页(Next.js)
    • 后台管理系统(Next.js)
    • 智慧云端大屏(Next.js)
  2. 待完成的功能

    • 移动端 H5 页面
    • 小程序
    • 桌面应用
  3. 用户期望的技术栈

    • 前端:Vue.js 框架
    • 后端:NestJS 单体服务

这是一个技术咨询问题,用户希望我提供技术选型建议。我需要基于以下因素给出建议:

  • 项目现状(已有 Next.js 实现)
  • 多平台需求(H5、小程序、桌面应用)
  • 用户期望(Vue.js + NestJS)
  • 开发效率、维护成本、团队技能

让我提供一个全面的技术方案:

技术选型建议

1. 前端架构方案

方案A:统一 Vue.js + Uni-app(推荐)

  • H5、小程序统一使用 Uni-app:一套代码多端运行
  • 桌面应用使用 Electron:打包 H5 或独立开发
  • 优势:代码复用率高、开发效率高、维护成本低

方案B:分别开发

  • H5:Vue 3 + Vant
  • 小程序:Uni-app 或原生开发
  • 桌面应用:Electron + Vue 3 或 Tauri + Vue 3

2. 后端架构方案

NestJS 单体服务(推荐)

  • 使用 NestJS 构建统一的 RESTful API
  • 提供统一的认证、授权、数据管理
  • 为所有前端平台提供一致的接口

3. 渐进式迁移策略

由于现有项目是 Next.js,用户希望迁移到 Vue.js,我需要提供迁移策略。

让我给出一个详细的技术方案。 我理解您的情况。目前项目已有 Next.js 实现的官网、后台和大屏,现在需要扩展到移动端 H5、小程序和桌面应用,并且希望迁移到 Vue.js + NestJS 技术栈。

技术选型建议

整体架构方案

┌─────────────────────────────────────────────────────────────┐
│                      前端层(Vue.js 生态)                   │
├─────────────────────────────────────────────────────────────┤
│  官网(保留)  │  H5/小程序( Uni-app )  │  桌面应用  │
│   Next.js    │     Vue 3 + Vite     │   Electron   │
└─────────────────────────────────────────────────────────────┘
                              ↓
┌─────────────────────────────────────────────────────────────┐
│                 后端层(NestJS 单体服务)                    │
│         RESTful API + WebSocket + 定时任务                  │
└─────────────────────────────────────────────────────────────┘
                              ↓
┌─────────────────────────────────────────────────────────────┐
│                  数据层(PostgreSQL + Redis)                │
└─────────────────────────────────────────────────────────────┘

详细技术选型

1. 移动端 H5 + 小程序

推荐方案:Uni-app(强烈推荐)

优势

  • ✅ 一套代码同时发布到 H5、微信小程序、支付宝小程序等
  • ✅ 代码复用率高达 95%
  • ✅ 统一的开发体验和调试工具
  • ✅ 丰富的插件生态
  • ✅ 与 Vue 3 完美兼容

技术栈

- 框架:Vue 3 (Composition API)
- 构建工具:Vite
- UI 组件库:uView UI 或 NutUI
- 状态管理:Pinia
- 路由:Uni-app 内置路由
- HTTP:uni.request 或 axios
- TypeScript:全面支持

项目结构

mobile-app/
├── pages/              # 页面
│   ├── index/         # 首页
│   ├── resources/     # 资源列表
│   ├── detail/        # 资源详情
│   └── user/          # 用户中心
├── components/        # 组件
├── store/            # Pinia 状态管理
├── api/              # API 接口
├── utils/            # 工具函数
├── static/           # 静态资源
└── manifest.json     # 应用配置

2. 桌面应用

推荐方案:Electron + Vue 3

优势

  • ✅ 跨平台(Windows、macOS、Linux)
  • ✅ 可以直接复用 H5 代码
  • ✅ 原生能力访问(文件系统、通知等)
  • ✅ 打包体积可控

技术栈

- 框架:Vue 3 + Vite
- 桌面框架:Electron
- UI 组件库:Element Plus 或 Naive UI
- 状态管理:Pinia
- 路由:Vue Router
- 进程通信:IPC (Electron)

项目结构

desktop-app/
├── src/
│   ├── main/         # 主进程
│   │   ├── index.ts  # 主进程入口
│   │   └── ipc/      # IPC 通信处理
│   ├── renderer/     # 渲染进程(Vue 应用)
│   │   ├── App.vue
│   │   ├── main.ts
│   │   ├── views/
│   │   └── components/
│   └── preload/      # 预加载脚本
├── package.json
└── electron-builder.json  # 打包配置

替代方案:Tauri(更轻量)

  • 打包体积更小(~10MB vs Electron ~100MB)
  • 安全性更高
  • 但生态相对较小

3. 后端服务

推荐方案:NestJS 单体服务

技术栈

- 框架:NestJS (基于 Express/Fastify)
- 语言:TypeScript
- ORM:Prisma 或 TypeORM
- 数据库:PostgreSQL
- 缓存:Redis
- 认证:JWT + Passport
- 文档:Swagger/OpenAPI
- 验证:class-validator
- 配置:@nestjs/config
- 日志:Winston

项目结构

backend/
├── src/
│   ├── main.ts                 # 应用入口
│   ├── app.module.ts           # 根模块
│   ├── common/                 # 通用模块
│   │   ├── filters/           # 异常过滤器
│   │   ├── guards/            # 守卫
│   │   ├── interceptors/      # 拦截器
│   │   ├── pipes/             # 管道
│   │   └── decorators/        # 装饰器
│   ├── config/                # 配置
│   ├── modules/               # 业务模块
│   │   ├── auth/             # 认证模块
│   │   ├── users/            # 用户模块
│   │   ├── resources/        # 资源模块
│   │   ├── categories/       # 分类模块
│   │   ├── news/             # 资讯模块
│   │   ├── ads/              # 广告模块
│   │   ├── statistics/       # 统计模块
│   │   └── upload/           # 上传模块
│   ├── database/              # 数据库
│   │   └── migrations/
│   └── utils/                 # 工具
├── prisma/                    # Prisma Schema
│   └── schema.prisma
├── test/
└── package.json

迁移策略

阶段 1:后端迁移(优先)

  1. 搭建 NestJS 项目
nest new backend
cd backend
npm install @nestjs/config @nestjs/jwt @nestjs/passport passport passport-jwt
npm install prisma @prisma/client
npm install class-validator class-transformer
npm install @nestjs/swagger
  1. 数据库设计与迁移
  • 将现有数据库结构迁移到 Prisma Schema
  • 创建初始迁移文件
  • 导入现有数据
  1. API 开发
  • 用户认证 API
  • 资源管理 API
  • 统计数据 API
  • 文件上传 API

阶段 2:移动端开发

  1. 创建 Uni-app 项目
vue create -p dcloudio/uni-preset-vue mobile-app
cd mobile-app
npm install @dcloudio/uni-ui pinia axios
  1. 配置多端
  • H5 配置
  • 小程序配置
  • API 基础地址配置
  1. 页面开发
  • 首页(资源列表、搜索)
  • 资源详情页
  • 用户中心
  • 登录注册

阶段 3:桌面应用开发

  1. 创建 Electron 项目
npm create vite@latest desktop-app -- --template vue-ts
cd desktop-app
npm install electron electron-builder
npm install -D @types/electron
  1. 集成业务逻辑
  • 复用移动端组件或独立开发
  • 实现 IPC 通信
  • 添加原生功能(通知、托盘、自动更新)

阶段 4:官网迁移(可选)

如果决定将官网也迁移到 Vue 3:

  • 使用 Nuxt 3(Next.js 的 Vue 版本)
  • 保留 SEO 优势
  • 统一技术栈

API 设计规范

RESTful API 示例

# 用户认证
POST   /api/auth/register     # 注册
POST   /api/auth/login        # 登录
POST   /api/auth/logout       # 登出
POST   /api/auth/refresh      # 刷新令牌

# 用户管理
GET    /api/users/me          # 当前用户信息
PUT    /api/users/me          # 更新当前用户
GET    /api/users/:id         # 获取用户详情

# 资源管理
GET    /api/resources         # 资源列表(分页、筛选、排序)
GET    /api/resources/:id     # 资源详情
POST   /api/resources         # 创建资源
PUT    /api/resources/:id     # 更新资源
DELETE /api/resources/:id     # 删除资源

# 分类管理
GET    /api/categories        # 分类列表
GET    /api/categories/:id    # 分类详情

# 统计数据
GET    /api/statistics/dashboard    # 大屏数据
GET    /api/statistics/geo         # 地域统计
GET    /api/statistics/keywords    # 关键词统计
GET    /api/statistics/upload-download  # 上传下载统计

# 文件上传
POST   /api/upload/image      # 上传图片
POST   /api/upload/file       # 上传文件

关键技术实现

1. NestJS 认证实现

// auth/auth.module.ts
@Module({
  imports: [
    JwtModule.register({
      secret: process.env.JWT_SECRET,
      signOptions: { expiresIn: '7d' },
    }),
    PassportModule,
    UsersModule,
  ],
  providers: [
    AuthService,
    JwtStrategy,
    LocalStrategy,
  ],
  controllers: [AuthController],
  exports: [AuthService],
})
export class AuthModule {}

2. Uni-app 统一 API 调用

// api/request.ts
import axios from 'axios'

const request = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL,
  timeout: 10000,
})

// 请求拦截器
request.interceptors.request.use(
  config => {
    const token = uni.getStorageSync('token')
    if (token) {
      config.headers.Authorization = `Bearer ${token}`
    }
    return config
  },
  error => Promise.reject(error)
)

// 响应拦截器
request.interceptors.response.use(
  response => response.data,
  error => {
    if (error.response?.status === 401) {
      uni.redirectTo({ url: '/pages/login/index' })
    }
    return Promise.reject(error)
  }
)

export default request

3. Electron 主进程通信

// main/ipc/index.ts
import { ipcMain } from 'electron'

ipcMain.handle('app:get-version', () => {
  return app.getVersion()
})

ipcMain.handle('resources:download', async (event, resourceId: string) => {
  // 下载资源逻辑
  return { success: true, path: '/path/to/download' }
})

ipcMain.on('window:minimize', () => {
  mainWindow?.minimize()
})

ipcMain.on('window:maximize', () => {
  mainWindow?.maximize()
})

ipcMain.on('window:close', () => {
  mainWindow?.close()
})

部署方案

后端部署

# docker-compose.yml
version: '3.8'
services:
  backend:
    build: .
    ports:
      - "3000:3000"
    environment:
      - DATABASE_URL=postgresql://user:pass@db:5432/cloud
      - REDIS_URL=redis://redis:6379
      - JWT_SECRET=your-secret
    depends_on:
      - db
      - redis
  
  db:
    image: postgres:15
    volumes:
      - postgres_data:/var/lib/postgresql/data
  
  redis:
    image: redis:7-alpine

volumes:
  postgres_data:

H5 部署

  • 使用 Nginx 托管静态文件
  • 配置反向代理到后端 API
  • 启用 Gzip 压缩

小程序发布

  • 使用微信开发者工具
  • 提交审核
  • 发布到线上

桌面应用分发

  • Windows:.exe 安装包
  • macOS:.dmg 镜像
  • Linux:.AppImage

开发建议

1. 代码复用策略

shared/                      # 共享代码
├── types/                  # TypeScript 类型定义
├── constants/              # 常量
├── utils/                  # 工具函数
└── api/                    # API 接口定义

2. 统一设计规范

  • 使用 Tailwind CSS 或 UnoCSS
  • 统一色彩系统
  • 统一组件库风格

3. 状态管理

  • 移动端:Pinia
  • 桌面端:Pinia
  • 复用相同的 store 模块

4. 测试策略

  • 后端:Jest(单元测试 + 集成测试)
  • 前端:Vitest + Playwright

总结

推荐技术栈

  • 后端:NestJS + Prisma + PostgreSQL + Redis
  • 移动端 H5 + 小程序:Uni-app(Vue 3)
  • 桌面应用:Electron + Vue 3
  • 官网:保留 Next.js 或迁移到 Nuxt 3

优势

  • ✅ 统一后端服务,降低维护成本
  • ✅ Uni-app 实现一套代码多端运行
  • ✅ Vue 3 生态成熟,学习曲线平缓
  • ✅ TypeScript 全栈类型安全
  • ✅ 良好的开发体验和工具链

下一步

  1. 搭建 NestJS 后端项目
  2. 设计数据库 Schema
  3. 开发核心 API
  4. 创建 Uni-app 移动端项目
  5. 开发 Electron 桌面应用

需要我帮您开始搭建具体的项目结构吗?

明白了!你希望将这些功能需求从 PC 端设计转化为更适合移动端 H5 的功能设计方案。以下是我对这段提交记录中涉及的功能点进行的移动端适配转化,重点考虑移动端用户的交互习惯、屏幕尺寸限制以及性能优化需求。


📱 移动端 H5 功能需求转化方案

1. 首页资源展示页面

原始功能(PC):

  • 分类筛选、资源列表、搜索功能
  • 瀑布流布局(Masonry)
  • 响应式设计,支持桌面端和移动端

移动端适配设计:

  • 分类筛选
    • 改为底部固定导航栏(van-tabbar)或侧滑抽屉菜单(van-popup),方便单手操作。
    • 分类标签横向滑动展示(van-tabs),避免页面纵向过长。
  • 资源列表
    • 瀑布流布局适配移动端:卡片间距加大,确保点击热区足够大。
    • 每个资源卡片使用 van-card 组件,支持图片懒加载和点击跳转详情页。
  • 搜索功能
    • 搜索框固定在顶部(position: sticky),支持语音输入(调用原生录音 API)。
    • 搜索结果页支持下拉刷新(van-pull-refresh)和上拉加载更多(van-list)。

业务目标:

  • 提升移动端用户查找资源的效率。
  • 减少页面跳转次数,增强沉浸感。

2. 资源详情页面

原始功能(PC):

  • 预览图、下载链接、微信引流、分享功能

移动端适配设计:

  • 预览图展示
    • 使用 van-image-preview 支持手势缩放和滑动切换图片。
    • 图片懒加载优化,减少首屏加载时间。
  • 下载链接
    • 下载按钮固定在底部(position: fixed),使用醒目的 van-button 组件。
    • 微信引流改为浮窗引导(van-popup),用户可随时关闭。
  • 分享功能
    • 集成原生分享 API(如微信 JS-SDK),支持一键分享到朋友圈或好友。
    • 提供二维码下载选项(van-overlay 展示二维码)。

业务目标:

  • 提高资源下载转化率。
  • 增强社交传播能力。

3. 资讯、热点、广告模块

原始功能(PC):

  • 资讯列表、热点榜单、广告位、产品矩阵展示

移动端适配设计:

  • 资讯列表
    • 使用 van-cell 组件展示每条资讯,标题加粗,摘要文字缩小。
    • 支持左滑删除或收藏操作(van-swipe-cell)。
  • 热点榜单
    • 使用 van-tabs 实现横向切换,榜单内容垂直滚动。
    • 每条热点增加“查看更多”按钮,跳转至详情页。
  • 广告位
    • 使用 van-swipe 实现轮播广告,内容精简,避免干扰用户阅读。
    • 广告支持点击跳转 App Store 或展示二维码(van-overlay)。

业务目标:

  • 提升内容消费时长。
  • 增加广告曝光量和点击率。

4. 悬浮图标组件(FloatingIcons)

原始功能(PC):

  • 悬浮图标显示二维码卡片,支持扫码下载

移动端适配设计:

  • 图标布局
    • 固定在右下角(position: fixed),支持拖拽调整位置(通过 TouchEvent 实现)。
    • 图标数量减少至 3-4 个核心功能(如 iOS、Android、小程序)。
  • 二维码展示
    • 点击图标弹出二维码卡片(van-popup)。
    • 二维码支持保存到相册(调用原生 API)或复制链接。

业务目标:

  • 引导用户下载 App 或关注公众号。
  • 提升用户留存率。

5. WorkInProgress 组件

原始功能(PC):

  • 动态背景粒子效果、扫描线动画、进度条光效等

移动端适配设计:

  • 动画效果
    • 减少复杂动画,保留核心入场和悬停效果(使用 CSS Keyframes)。
    • 动画触发条件改为滚动触发动画(Intersection Observer)。
  • 卡片布局
    • 卡片高度适配屏幕宽度,避免内容被截断。
    • 进度条改为圆形进度环(van-circle),节省空间。

业务目标:

  • 展示平台发展进度,增强用户信任感。
  • 营造科技感和未来感。

6. 后台管理系统

原始功能(PC):

  • 内容管理、资源管理、通知公告、分页功能

移动端适配设计:

  • 登录流程
    • 登录页面使用 van-form 组件,支持表单校验。
    • 忘记密码功能改为弹窗形式(van-dialog),减少页面跳转。
  • 内容管理
    • 列表页使用 van-list 支持分页加载。
    • 新增内容时,表单字段分步骤填写(van-steps)。

业务目标:

  • 提高管理员操作效率。
  • 确保数据安全和权限控制。

7. 用户系统

原始功能(PC):

  • 登录/注册模态框、个人中心、设置项

移动端适配设计:

  • 注册/登录模态框
    • 使用 van-popup 实现全屏登录页,提升沉浸感。
    • 输入框自动聚焦,键盘弹起时页面自动上推。
  • 个人中心
    • 使用 van-cell-group 展示个人信息(头像、昵称、积分等)。
    • 设置项支持分类折叠(van-collapse),避免页面冗长。

业务目标:

  • 提升用户注册转化率。
  • 增强用户粘性和活跃度。

8. 性能与体验优化

技术实现:

  • 响应式设计
    • 使用 px2remvw/vh 单位适配不同屏幕尺寸。
    • 字体大小使用 rem 单位,确保一致性。
  • 性能优化
    • 图片压缩并使用 WebP 格式,提升加载速度。
    • 关键路径资源优先加载,非关键资源延迟加载。
  • 无障碍设计
    • 增加语音播报功能(调用原生 TTS API)。
    • 按钮和链接提供足够对比度,符合 WCAG 标准。

🧩 总结归纳

✅ 当前已完成的核心功能

  1. 基础框架搭建:Vue 3 + Vant + Vue CLI 项目初始化。
  2. 核心页面开发:首页、资源详情页、用户系统、后台管理。
  3. 交互优化:响应式设计、动画效果、组件封装。

🔜 待完善的方向

  1. 社交互动:引入点赞、收藏、评论等功能。
  2. 个性化推荐:基于用户行为优化推荐算法。
  3. 多端协同:打通移动端与其他终端的数据同步。
  4. 商业变现:探索广告投放和增值服务模式。

如果你需要进一步细化某个模块的技术实现或代码示例,可以告诉我具体需求,我会为你提供更详细的指导!