第3组 · 范与恒 · 第1次评审详情 - sebestp/coursewise GitHub Wiki

范与恒 · 第1次评审详情(第3组 · 组员)

基本信息

  • 报告期次:第1次 | 报告日期:2026-10-08 | 项目组号:第3组 | 项目名称:在线购物系统

工作任务与成果物

  • 已完成工作:前端技术选型预研:方案对比后确定 Vue 3 技术栈(Vite / Router / Pinia / Axios / Element Plus),完成页面规划、可复现的环境搭建步骤与学习笔记
  • 成果物:前端技术选型说明 / 学习笔记

成果物 · 前端技术选型说明 / 学习笔记

前端技术选型说明 / 学习笔记
  • 项目名称:在线购物系统
  • 项目组号:第 3 组
  • 负责人(完成人):范与恒
  • 版本:v1
  • 日期:2026-10-08
1. 目标与约束
  • 支撑需求规格说明书中的全部页面:买家端 4 类页面(免注册)与卖家端 4 类页面(登录后后台)。
  • 团队以 Java / HTML 基础为主,要求框架学习曲线平缓、生态成熟、中文资料丰富。
  • 仅做 Web 端,不做 App / 小程序;目标浏览器为 Chrome、Edge 最近两个大版本。
  • 迭代 2 内必须产出可运行的前端骨架,并与后端并行联调。
2. 候选方案对比
维度 Vue 3 React 18 原生 JS + Bootstrap
学习曲线 平缓,模板接近 HTML 较陡,需理解 JSX 与 Hooks 规则 最低,但无组件化能力
组件化 / 复用 SFC 单文件组件,天然组件化 函数组件 + Hooks 无,页面靠复制粘贴
状态管理 Pinia,API 简单、官方维护 Redux Toolkit,概念较多 无统一方案
组件库 Element Plus、Ant Design Vue Ant Design、MUI Bootstrap 样式集
构建工具 Vite(官方推荐,秒级热更新) Vite 同样可用 手工或简单打包
中文资料 丰富 丰富 丰富
与本项目匹配度 高:表单校验、表格、消息提示开箱即用 高,但上手成本更大 低:排队 / 状态机类交互很快失控

结论:选择 Vue 3。 原生方案在"排队、状态机、口令查询"这类交互页面下维护成本会快速上升,排除;React 同样能胜任,但团队上手更慢,迭代 2 时间内风险更大。

3. 确定的技术栈
技术 版本 用途
Vue 3.4+ 视图框架,使用 Composition API + <script setup>
Vite 5+ 构建与开发服务器,热更新快,开发期 /api 反向代理到后端
Vue Router 4 买家端 / 卖家端路由,路由守卫拦截未登录访问
Pinia 2 卖家登录态等全局状态
Axios 1.x HTTP 请求,统一封装错误处理
Element Plus 2.x 组件库:表单校验、表格、对话框、消息提示
Node.js 18 LTS+ 运行环境
4. 选型理由(要点)
  1. Vue 模板语法与 HTML 接近,配合 Element Plus,登录、发布商品、意向人列表等页面可快速成型。
  2. Pinia 是 Vue 官方状态方案,登录态存取逻辑简单,与组合式 API 风格一致。
  3. Vite 启动与热更新快,开发效率高;生产构建基于 Rollup,产物可直接部署。
  4. Element Plus 的 el-form 自带规则校验,需求中的必填、手机号格式、价格校验在前端即可完成第一层拦截(后端仍须二次校验)。
  5. Vue 默认对插值做 HTML 转义,商品名称 / 描述默认不存在 XSS 注入问题(不使用 v-html)。
5. 我的选型验证实践(已完成)

本章节说明我在选型过程中实际动手做了什么,而非照搬官方文档。所有验证均在本地完成,可复现。

5.1 跑通脚手架与依赖安装
  • 用 npm create vite@latest 创建 Vue 3 工程,确认 Vite 5 在 Node 18 环境下可正常启动,开发服务器热更新延迟 < 1s。
  • 安装 vue-router@4 pinia axios element-plus,确认四者版本兼容,无 peer dependency 冲突。
  • 验证 npm run build 可正常产出 dist 目录,初始包体积约 140KB(gzip 后)。
5.2 写了一个购买表单 Demo 验证表单校验能力
  • 用 Element Plus 的 el-form + el-form-item 实现了「姓名 + 电话」表单,配置必填规则与手机号正则(/^1\d{10}$/)。
  • 实际验证:空提交触发必填提示、输入非 11 位数字触发格式提示、正确输入后校验通过。
  • 结论:需求中 US-03 / US-04 的表单校验可完全由前端第一层拦截,无需后端往返。
5.3 写了路由守卫 Demo 验证未登录拦截
  • 配置 /seller/admin 为 requiresAuth: true,用 router.beforeEach 判断 Pinia 中的 loggedIn 状态。
  • 实际验证:未登录直接访问 /seller/admin 自动跳转到 /seller/login;登录后可正常进入。
  • 结论:卖家后台的访问控制在前端即可实现,与后端会话配合。
5.4 写了 Axios 封装与代理验证
  • 封装 Axios 实例,统一 baseURL: '/api',响应拦截器处理 401 跳转登录。
  • 在 vite.config.js 中配置 /api 代理到 http://127.0.0.1:8000,用一个 mock 接口验证代理转发正常,无跨域问题。
5.5 验证结论
  • Vue 3 + Vite + Element Plus 的组合能覆盖本项目全部前端需求,开发体验顺畅,包体积可接受。
  • 上述 Demo 代码已作为骨架工程的基础,迭代 2 将直接在此基础上扩展真实页面。
6. 目录结构规划
onlineshop-web/
├── index.html
├── vite.config.js
├── package.json
└── src/
    ├── main.js                入口:挂载 Router、Pinia、Element Plus
    ├── App.vue
    ├── api/                   接口按模块封装
    │   ├── seller.js          登录、改密码
    │   ├── product.js         发布商品、查状态、历史
    │   └── intent.js          提交意向、查位次、改信息、撤销
    ├── router/index.js        路由表与登录守卫
    ├── stores/seller.js       卖家登录态
    ├── utils/http.js          Axios 实例与拦截器
    ├── components/            公共组件:ProductCard、StatusTag、CodeBox
    └── views/
        ├── buyer/             Home、BuyForm、Done、Query
        └── seller/            Login、Admin、Publish、History
7. 路由与页面规划(对照需求)
路由 页面 对应需求
/ 商品主页:在售信息或「商品交易中」提示 UC-01 / US-01、US-02
/buy 购买表单:姓名 + 电话、必填校验 UC-02 / US-03、US-04
/done/:code 结果页:当场展示唯一口令码 US-05
/query 口令查询:位次 / 状态、改信息、撤销 UC-03、UC-04、UC-05
/seller/login 卖家登录 UC-06
/seller/admin 后台首页:商品状态 + 意向人列表(需登录) UC-08 / US-15、US-16
/seller/publish 发布商品:必填提示、单件在售提示 UC-07 / US-13、US-14
/seller/history 历史商品:倒序、意向人明细(需登录) UC-11
8. 核心知识点记录(实践中整理)
8.1 Composition API
  • ref:包装基本类型,模板中直接用,脚本中通过 .value 取值。
  • reactive:包装对象;computed 派生值;watch 监听变化。
  • 组件通信用 props 接收、emit 抛出事件;<script setup> 下用 defineProps / defineEmits 声明。
8.2 路由与登录守卫
import { createRouter, createWebHistory } from 'vue-router'
import { useSellerStore } from '@/stores/seller'

const routes = [
  { path: '/', component: () => import('@/views/buyer/Home.vue') },
  { path: '/buy', component: () => import('@/views/buyer/BuyForm.vue') },
  { path: '/done/:code', component: () => import('@/views/buyer/Done.vue') },
  { path: '/query', component: () => import('@/views/buyer/Query.vue') },
  { path: '/seller/login', component: () => import('@/views/seller/Login.vue') },
  {
    path: '/seller/admin',
    component: () => import('@/views/seller/Admin.vue'),
    meta: { requiresAuth: true },
  },
]

const router = createRouter({ history: createWebHistory(), routes })

router.beforeEach((to) => {
  if (to.meta.requiresAuth && !useSellerStore().loggedIn) {
    return '/seller/login'
  }
})

export default router
8.3 Pinia 登录态
import { defineStore } from 'pinia'

export const useSellerStore = defineStore('seller', {
  state: () => ({ loggedIn: false, username: '' }),
  actions: {
    setLogin(username) {
      this.loggedIn = true
      this.username = username
    },
    logout() {
      this.loggedIn = false
      this.username = ''
    },
  },
})

登录以后端会话 Cookie 为准,Pinia 仅镜像状态;刷新页面时先调用 /api/seller/me 校验,避免状态丢失。

8.4 Axios 封装
import axios from 'axios'

const http = axios.create({ baseURL: '/api', timeout: 8000 })

http.interceptors.response.use(
  (res) => res.data,
  (err) => {
    if (err.response?.status === 401) {
      location.href = '/seller/login'
    }
    return Promise.reject(err)
  }
)

export default http
8.5 Element Plus 表单与校验
<el-form ref="formRef" :model="form" :rules="rules">
  <el-form-item label="姓名" prop="name">
    <el-input v-model="form.name" placeholder="请填写姓名" />
  </el-form-item>
  <el-form-item label="电话" prop="phone">
    <el-input v-model="form.phone" placeholder="请填写 11 位手机号" />
  </el-form-item>
  <el-button type="primary" @click="submit">提交购买意向</el-button>
</el-form>
const form = { name: '', phone: '' }
const rules = {
  name: [{ required: true, message: '请填写姓名', trigger: 'blur' }],
  phone: [
    { required: true, message: '请填写联系电话', trigger: 'blur' },
    { pattern: /^1\d{10}$/, message: '请输入 11 位手机号', trigger: 'blur' },
  ],
}
8.6 开发期代理(vite.config.js)
export default {
  server: {
    proxy: {
      '/api': 'http://127.0.0.1:8000',
    },
  },
}

前端请求 /api/... 时由 Vite 转发到后端,开发期不存在跨域问题。

9. 环境搭建步骤(可复现)
##### 1. 确认 Node 版本 >= 18
node -v

##### 2. 使用 Vite 脚手架创建工程
npm create vite@latest onlineshop-web -- --template vue
cd onlineshop-web

##### 3. 安装依赖与配套库
npm install
npm install vue-router@4 pinia axios element-plus

##### 4. 启动开发服务器
npm run dev

##### 5. 生产构建,产物在 dist/
npm run build
10. 风险与对策
风险 对策
Element Plus 全量引入包体积偏大 使用 unplugin-vue-components 按需引入
刷新后 Pinia 登录态丢失 应用启动时调用 /api/seller/me 与后端会话对齐
商品描述中的 XSS 依赖 Vue 默认转义,禁止 v-html
口令查询被频繁刷新 前端查询按钮加 loading / 防抖;后端限流(与李帆约定)
前后端接口字段不一致 以需求规格说明书与接口约定文档为准,Axios 层统一错误提示
11. 迭代 2 我的交付承诺
  1. 可运行的前端骨架工程(路由、目录、Axios 封装齐全)。
  2. 卖家登录页:表单、错误提示、登录成功跳转后台。
  3. 发布商品页:必填校验、价格校验、单件在售时的提示。
  4. 配合叶文锦完成上述页面的手工测试与缺陷修复。
12. 参考资料

教师点评

(评审后填写)

⚠️ **GitHub.com Fallback** ⚠️