# 盘古用户平台 - 基础数据模块前端开发文档 --- | 文档信息 | 内容 | | -------- | --------------------------- | | **文档版本** | V1.0 | | **项目名称** | 盘古用户平台(Pangu User Platform) | | **模块名称** | 基础数据管理-前端开发 | | **编写团队** | pangu | | **创建日期** | 2026-01-31 | --- ## 1. 开发环境要求 | 环境 | 版本要求 | 说明 | | -------- | --------- | --------- | | Node.js | ≥18.0.0 | 运行环境 | | npm | ≥9.0.0 | 包管理器 | | Vue | 3.5.x | 前端框架 | | Vite | 7.3.x | 构建工具 | | Element Plus | 2.13.x | UI组件库 | --- ## 2. 目录结构 ``` pangu-ui/src/ ├── api/ # API接口定义 │ ├── grade.js # 年级管理API │ ├── class.js # 班级管理API │ ├── subject.js # 学科管理API │ └── region.js # 区域管理API ├── mock/ # Mock数据 │ ├── grade.js # 年级Mock │ ├── class.js # 班级Mock │ ├── subject.js # 学科Mock │ └── region.js # 区域Mock ├── views/base/ # 页面组件 │ ├── grade/ │ │ └── index.vue # 年级管理页面 │ ├── class/ │ │ └── index.vue # 班级管理页面 │ ├── subject/ │ │ └── index.vue # 学科管理页面 │ └── region/ │ └── index.vue # 区域管理页面 └── router/ └── index.js # 路由配置 ``` --- ## 3. API接口定义 ### 3.1 年级管理API(api/grade.js) ```javascript /** * 年级管理API * @author pangu */ import request from '@/utils/request' /** * 获取年级分页列表 * @param {Object} params - 查询参数 * @param {string} params.gradeName - 年级名称(模糊查询) * @param {string} params.status - 状态(0正常 1停用) * @param {number} params.pageNum - 页码 * @param {number} params.pageSize - 每页条数 */ export function getGradeList(params) { return request({ url: '/api/grade/list', method: 'get', params }) } /** * 获取年级选项列表(下拉选择用) * @returns {Promise} 返回启用状态的年级列表 */ export function getGradeOptions() { return request({ url: '/api/grade/options', method: 'get' }) } /** * 获取年级详情 * @param {number} gradeId - 年级ID */ export function getGradeDetail(gradeId) { return request({ url: `/api/grade/${gradeId}`, method: 'get' }) } /** * 新增年级 * @param {Object} data - 年级数据 * @param {string} data.gradeName - 年级名称(必填) * @param {number} data.orderNum - 排序号 * @param {string} data.status - 状态 */ export function addGrade(data) { return request({ url: '/api/grade', method: 'post', data }) } /** * 修改年级 * @param {Object} data - 年级数据(含gradeId) */ export function updateGrade(data) { return request({ url: '/api/grade', method: 'put', data }) } /** * 删除年级 * @param {number} gradeId - 年级ID */ export function deleteGrade(gradeId) { return request({ url: `/api/grade/${gradeId}`, method: 'delete' }) } ``` ### 3.2 班级管理API(api/class.js) ```javascript /** * 班级管理API * @author pangu */ import request from '@/utils/request' /** * 获取班级分页列表 */ export function getClassList(params) { return request({ url: '/api/class/list', method: 'get', params }) } /** * 获取班级选项列表 */ export function getClassOptions() { return request({ url: '/api/class/options', method: 'get' }) } /** * 获取班级详情 */ export function getClassDetail(classId) { return request({ url: `/api/class/${classId}`, method: 'get' }) } /** * 新增班级 */ export function addClass(data) { return request({ url: '/api/class', method: 'post', data }) } /** * 修改班级 */ export function updateClass(data) { return request({ url: '/api/class', method: 'put', data }) } /** * 删除班级 */ export function deleteClass(classId) { return request({ url: `/api/class/${classId}`, method: 'delete' }) } ``` ### 3.3 学科管理API(api/subject.js) ```javascript /** * 学科管理API * @author pangu */ import request from '@/utils/request' /** * 获取学科分页列表 */ export function getSubjectList(params) { return request({ url: '/api/subject/list', method: 'get', params }) } /** * 获取学科选项列表 */ export function getSubjectOptions() { return request({ url: '/api/subject/options', method: 'get' }) } /** * 获取学科详情 */ export function getSubjectDetail(subjectId) { return request({ url: `/api/subject/${subjectId}`, method: 'get' }) } /** * 新增学科 */ export function addSubject(data) { return request({ url: '/api/subject', method: 'post', data }) } /** * 修改学科 */ export function updateSubject(data) { return request({ url: '/api/subject', method: 'put', data }) } /** * 删除学科 */ export function deleteSubject(subjectId) { return request({ url: `/api/subject/${subjectId}`, method: 'delete' }) } ``` ### 3.4 区域管理API(api/region.js) ```javascript /** * 区域管理API * @author pangu */ import request from '@/utils/request' /** * 获取区域树 * @returns {Promise} 返回树形结构的区域数据 */ export function getRegionTree() { return request({ url: '/api/region/tree', method: 'get' }) } /** * 获取区域详情 */ export function getRegionDetail(regionId) { return request({ url: `/api/region/${regionId}`, method: 'get' }) } /** * 新增区域 * @param {Object} data - 区域数据 * @param {number} data.parentId - 父区域ID(0为顶级) * @param {string} data.regionName - 区域名称 */ export function addRegion(data) { return request({ url: '/api/region', method: 'post', data }) } /** * 修改区域 */ export function updateRegion(data) { return request({ url: '/api/region', method: 'put', data }) } /** * 删除区域 */ export function deleteRegion(regionId) { return request({ url: `/api/region/${regionId}`, method: 'delete' }) } ``` --- ## 4. 页面组件开发 ### 4.1 年级管理页面(views/base/grade/index.vue) ```vue ``` ### 4.2 区域管理页面(views/base/region/index.vue) ```vue ``` --- ## 5. Mock数据配置 ### 5.1 年级Mock(mock/grade.js) ```javascript /** * 年级管理Mock数据 * @author pangu */ import Mock from 'mockjs' // 年级预置数据 const gradeData = [ { gradeId: 1, gradeName: '一年级', gradeCode: 'GRD001', orderNum: 1, status: '0', createTime: '2026-01-01 10:00:00' }, { gradeId: 2, gradeName: '二年级', gradeCode: 'GRD002', orderNum: 2, status: '0', createTime: '2026-01-01 10:00:00' }, { gradeId: 3, gradeName: '三年级', gradeCode: 'GRD003', orderNum: 3, status: '0', createTime: '2026-01-01 10:00:00' }, { gradeId: 4, gradeName: '四年级', gradeCode: 'GRD004', orderNum: 4, status: '0', createTime: '2026-01-01 10:00:00' }, { gradeId: 5, gradeName: '五年级', gradeCode: 'GRD005', orderNum: 5, status: '0', createTime: '2026-01-01 10:00:00' }, { gradeId: 6, gradeName: '六年级', gradeCode: 'GRD006', orderNum: 6, status: '0', createTime: '2026-01-01 10:00:00' }, { gradeId: 7, gradeName: '七年级', gradeCode: 'GRD007', orderNum: 7, status: '0', createTime: '2026-01-01 10:00:00' }, { gradeId: 8, gradeName: '八年级', gradeCode: 'GRD008', orderNum: 8, status: '0', createTime: '2026-01-01 10:00:00' }, { gradeId: 9, gradeName: '九年级', gradeCode: 'GRD009', orderNum: 9, status: '0', createTime: '2026-01-01 10:00:00' }, { gradeId: 10, gradeName: '高一', gradeCode: 'GRD010', orderNum: 10, status: '0', createTime: '2026-01-01 10:00:00' }, { gradeId: 11, gradeName: '高二', gradeCode: 'GRD011', orderNum: 11, status: '0', createTime: '2026-01-01 10:00:00' }, { gradeId: 12, gradeName: '高三', gradeCode: 'GRD012', orderNum: 12, status: '0', createTime: '2026-01-01 10:00:00' } ] // 获取年级列表 Mock.mock(/\/api\/grade\/list/, 'get', (options) => { const url = new URL('http://localhost' + options.url) const gradeName = url.searchParams.get('gradeName') || '' const status = url.searchParams.get('status') const pageNum = parseInt(url.searchParams.get('pageNum')) || 1 const pageSize = parseInt(url.searchParams.get('pageSize')) || 10 let list = gradeData.filter(item => { let match = true if (gradeName) { match = match && item.gradeName.includes(gradeName) } if (status !== null && status !== '') { match = match && item.status === status } return match }) const total = list.length const start = (pageNum - 1) * pageSize const rows = list.slice(start, start + pageSize) return { code: 200, msg: '查询成功', total, rows } }) // 获取年级选项 Mock.mock(/\/api\/grade\/options/, 'get', () => { return { code: 200, msg: '查询成功', data: gradeData.filter(item => item.status === '0').map(item => ({ gradeId: item.gradeId, gradeName: item.gradeName, gradeCode: item.gradeCode })) } }) // 新增年级 Mock.mock('/api/grade', 'post', () => { return { code: 200, msg: '新增成功' } }) // 修改年级 Mock.mock('/api/grade', 'put', () => { return { code: 200, msg: '修改成功' } }) // 删除年级 Mock.mock(/\/api\/grade\/\d+/, 'delete', () => { // 模拟被引用时的删除失败 // return { code: 500, msg: '该年级已被学校使用,不能删除' } return { code: 200, msg: '删除成功' } }) ``` ### 5.2 区域Mock(mock/region.js) ```javascript /** * 区域管理Mock数据 * @author pangu */ import Mock from 'mockjs' // 区域树形数据 const regionTree = [ { regionId: 1, parentId: 0, regionName: '湖北', regionCode: 'REG01', level: 1, orderNum: 1, createTime: '2026-01-01 10:00:00', children: [ { regionId: 11, parentId: 1, regionName: '武汉', regionCode: 'REG0101', level: 2, orderNum: 1, createTime: '2026-01-01 10:00:00', children: [ { regionId: 111, parentId: 11, regionName: '武昌区', regionCode: 'REG010101', level: 3, orderNum: 1, createTime: '2026-01-01 10:00:00' }, { regionId: 112, parentId: 11, regionName: '汉口区', regionCode: 'REG010102', level: 3, orderNum: 2, createTime: '2026-01-01 10:00:00' }, { regionId: 113, parentId: 11, regionName: '汉阳区', regionCode: 'REG010103', level: 3, orderNum: 3, createTime: '2026-01-01 10:00:00' }, { regionId: 114, parentId: 11, regionName: '江夏区', regionCode: 'REG010104', level: 3, orderNum: 4, createTime: '2026-01-01 10:00:00' }, { regionId: 115, parentId: 11, regionName: '新洲区', regionCode: 'REG010105', level: 3, orderNum: 5, createTime: '2026-01-01 10:00:00' }, { regionId: 116, parentId: 11, regionName: '黄陂区', regionCode: 'REG010106', level: 3, orderNum: 6, createTime: '2026-01-01 10:00:00' } ] }, { regionId: 12, parentId: 1, regionName: '黄冈', regionCode: 'REG0102', level: 2, orderNum: 2, createTime: '2026-01-01 10:00:00', children: [ { regionId: 121, parentId: 12, regionName: '黄州区', regionCode: 'REG010201', level: 3, orderNum: 1, createTime: '2026-01-01 10:00:00' }, { regionId: 122, parentId: 12, regionName: '红安县', regionCode: 'REG010202', level: 3, orderNum: 2, createTime: '2026-01-01 10:00:00' }, { regionId: 123, parentId: 12, regionName: '麻城市', regionCode: 'REG010203', level: 3, orderNum: 3, createTime: '2026-01-01 10:00:00' } ] } ] }, { regionId: 2, parentId: 0, regionName: '北京', regionCode: 'REG02', level: 1, orderNum: 2, createTime: '2026-01-01 10:00:00', children: [] }, { regionId: 3, parentId: 0, regionName: '香港', regionCode: 'REG03', level: 1, orderNum: 3, createTime: '2026-01-01 10:00:00', children: [] }, { regionId: 4, parentId: 0, regionName: '吉宁', regionCode: 'REG04', level: 1, orderNum: 4, createTime: '2026-01-01 10:00:00', children: [] } ] // 获取区域树 Mock.mock('/api/region/tree', 'get', () => { return { code: 200, msg: '查询成功', data: regionTree } }) // 新增区域 Mock.mock('/api/region', 'post', () => { return { code: 200, msg: '新增成功' } }) // 修改区域 Mock.mock('/api/region', 'put', () => { return { code: 200, msg: '修改成功' } }) // 删除区域 Mock.mock(/\/api\/region\/\d+/, 'delete', () => { return { code: 200, msg: '删除成功' } }) ``` --- ## 6. 路由配置 ```javascript // router/index.js import { createRouter, createWebHistory } from 'vue-router' import Layout from '@/layout/index.vue' const routes = [ // ... 其他路由 { path: '/base', component: Layout, redirect: '/base/grade', name: 'Base', meta: { title: '基础数据', icon: 'Setting' }, children: [ { path: 'grade', name: 'Grade', component: () => import('@/views/base/grade/index.vue'), meta: { title: '年级管理' } }, { path: 'class', name: 'Class', component: () => import('@/views/base/class/index.vue'), meta: { title: '班级管理' } }, { path: 'subject', name: 'Subject', component: () => import('@/views/base/subject/index.vue'), meta: { title: '学科管理' } }, { path: 'region', name: 'Region', component: () => import('@/views/base/region/index.vue'), meta: { title: '区域管理' } } ] } ] const router = createRouter({ history: createWebHistory(), routes }) export default router ``` --- ## 7. 开发检查清单 ### 7.1 年级管理 - [ ] API接口封装(api/grade.js) - [ ] Mock数据配置(mock/grade.js) - [ ] 页面组件开发(views/base/grade/index.vue) - [ ] 列表查询功能 - [ ] 分页功能 - [ ] 新增功能 - [ ] 编辑功能 - [ ] 删除功能(含删除确认) - [ ] 表单校验 ### 7.2 班级管理 - [ ] API接口封装 - [ ] Mock数据配置 - [ ] 页面组件开发 - [ ] CRUD功能 ### 7.3 学科管理 - [ ] API接口封装 - [ ] Mock数据配置 - [ ] 页面组件开发 - [ ] CRUD功能 ### 7.4 区域管理 - [ ] API接口封装 - [ ] Mock数据配置 - [ ] 页面组件开发(树形表格) - [ ] 展开/折叠全部功能 - [ ] 新增下级功能 - [ ] 删除前子级检查 ### 7.5 路由配置 - [ ] 基础数据菜单配置 - [ ] 四个子页面路由配置 --- *文档结束*