公司动态

SpringBoot+Vue驾校管理系统开发实战:从数据库设计到部署上线

📅 2026/8/31 11:29:08
SpringBoot+Vue驾校管理系统开发实战:从数据库设计到部署上线
简介这是一套面向计算机专业本科生及Java全栈初学者的驾校管理类毕业设计实战资源基于主流前后端分离架构解决传统驾培机构学员管理、教练排班、科目预约与数据统计等核心业务场景。资源包共1044个文件含243个Java后端逻辑文件、162个SVG图标与80个HTML页面、86个Vue组件及53个CSS样式文件覆盖完整前后端工程结构另含数据库SQL脚本、Navicat建库说明、Tomcat部署脚本.bat、Maven配置及开发环境配置指南压缩包仅17.47MB轻量易导入。目前已有350人学习下载资源经严格调试支持一键运行后台访问localhost:8080/项目名/admin/dist/index.html前台路径清晰可选。所有代码模块命名规范含IndexMain.vue、update-password.vue等典型页面配套3个部署批处理脚本install/run/build与.bak备份文件便于理解开发迭代过程是掌握SpringBootVue整合开发与真实业务落地的高实用性参考范例。 做驾校管理系统这个项目之前我其实纠结过一阵子。市面上毕业设计和课程设计常见的选题无非就是商城、博客、外卖这些驾校管理这个方向看着冷门但仔细一拆解它背后的业务逻辑其实覆盖了一个后台管理系统该有的所有核心能力——角色权限、学员管理、预约排课、考试进度跟踪、财务报表。我花了大概三周时间把整个项目完整落地从数据库设计到前后端联调再到部署上线这期间踩了不少坑也沉淀出一些值得记录的思路。这篇博文我就把整个项目的技术拆解、核心实现和部署经验完整写出来希望能给正在做类似管理系统或者正在选毕业设计题目的朋友一些参考。1. 驾校管理系统整体设计与需求拆解1.1 核心业务场景梳理驾校管理系统的本质是一个典型的多角色、多流程的业务管理系统。它的核心场景不只是管理员对学员信息的增删改查更关键的是要处理驾校日常运营中一整套业务流程——学员从报名建档开始到科目一、二、三、四的学习和考试再到最终拿证中间还穿插着教练分配、车辆安排、约课排课、考试成绩录入、缴费记录跟踪等多个环节。在设计之初我梳理出了四类核心角色系统管理员、教练、学员以及财务人员这个角色在多数项目中会和管理员合并但我在表结构里单独预留了权限位。每个角色登录系统之后看到的界面、能操作的功能必须有明确的边界。比如教练角色只需要看到自己的课程安排和学员列表不应该有权限去修改系统配置学员角色更多是查看自己的学习进度、约课记录和考试安排。这套系统适合谁来参考三类人——第一是正在做毕业设计或课程设计的学生这类管理系统题目中规中矩答辩时业务逻辑讲得清楚技术点也覆盖全面第二是刚学完SpringBoot和Vue想找个完整项目练手的前端或后端开发者通过这个项目能把前后端分离开发的整个链路串起来第三是想快速搭建驾校行业基础管理工具的创业者或小型驾校直接基于源码二次开发能省不少精力。1.2 技术选型背后的考量这个项目选择SpringBoot Vue MySQL这套组合并不是跟风而是基于三个维度的实际考量。第一个维度是生态成熟度。SpringBoot作为Java后端的主流框架自带约定优于配置的特性内置Tomcat、自动装配、Spring Security集成等能力能让我把精力集中在业务逻辑而不是繁琐的XML配置上。Vue在前端框架里属于学习曲线相对平缓、文档完善、社区活跃度极高的选择配合Element UI组件库能很快搭出一套像样的管理后台界面。MySQL则是在数据量不大的中小型系统里最稳妥的关系型数据库部署简单、资料丰富、出问题能很快搜到解决方案。第二个维度是自己和团队的技术熟练度。做项目最怕的不是技术不够新而是选了一堆自己没把握的技术栈最后在调试上耗掉大量时间。SpringBoot和Vue都是我自己用得比较顺手的工具MySQL从建表到优化也都熟所以开发效率有保障。第三个维度是部署成本和运维难度。这套组合的部署链路非常标准——前端打包成静态文件扔到Nginx后端打jar包直接java -jar运行数据库用Navicat或命令行导入SQL即可。没有复杂的中间件依赖也没有需要额外维护的独立服务整个部署过程我在后面章节会详细展开。1.3 系统功能模块规划按照驾校业务特点我将系统拆成了七个核心功能模块模块核心功能涉及角色学员管理学员信息建档、档案维护、状态流转管理员、教练教练管理教练信息维护、车辆分配、教学科目分配管理员课程/预约管理学员约课、排课、课程记录管理员、教练、学员考试管理四大科目考试报名、成绩录入、进度追踪管理员、教练缴费管理报名费、补考费、培训费记录管理员、财务公告管理驾校公告发布、学员通知管理员系统管理用户管理、角色权限、操作日志管理员这里要说一下模块划分的心得。早期我做过一个版本把功能粒度划得特别细结果前端路由和后端接口膨胀得非常厉害维护成本直线上升。后来我按照角色-流程的维度重新收敛比如把学员状态变更和报名管理合并进学员管理模块把约课和排课合入课程预约模块整个系统的结构清晰了很多。做管理系统模块粒度不是越细越好而是要符合业务直觉让使用系统的人能很快找到自己要用的功能。2. 数据库设计驾校业务的基石2.1 核心表结构解析数据库设计是整个项目的重中之重。我的经验是管理系统的表结构设计不能只考虑当前功能要预判业务可能的演进方向。驾校管理系统的核心表我设计了九张用户表、角色表、用户角色关联表、学员信息表、教练信息表、课程预约表、考试记录表、缴费记录表和公告表。用户表是统一登录入口包含用户ID、用户名、密码这里用的是BCrypt加密不是明文、手机号、状态字段。学生和教练同时都是用户通过用户角色关联表做多对多映射这样后续如果一个账号需要同时具备教练和学员身份确实有人练车的同时也在做兼职教练系统也能支撑。学员信息表是业务核心我设计了这些关键字段学员编号业务编号区别于用户ID、姓名、性别、身份证号、联系电话、报名时间、驾照类型C1/C2/B2等、当前科目进度、所属教练ID、状态在读/暂停/结业/退学。这里有个细节——科目进度字段我用了int类型用1、2、3、4分别代表科目一到科目四这样在业务层做进度流转判断时只需要比较大小简洁高效。课程预约表也是高频操作的表字段包括预约ID、学员ID、教练ID、预约日期、时间段上午/下午、状态待确认/已确认/已完成/已取消。时间段的表述我没有用时间戳范围而是用一个枚举值原因是在驾校约课场景里时间段是固定划分的不需要精确到几点几分这个设计在后续做冲突检测时能省掉很多麻烦的区间重叠判断逻辑。2.2 关键字段和关联关系的设计思路在设计表关联关系时有几个点值得展开讲讲。第一个是用户表与学员表、教练表的关系。很多初学设计的人会把用户信息和业务信息全塞在一张表里这种做法短期看着简单但一旦身份证号、手机号这类敏感信息需要脱敏展示或者一个用户身份对应多条业务记录时表结构就会变得臃肿。我采用的是主用户表 业务扩展表的模式——用户表只管登录认证和基础信息学员表和教练表通过外键关联到用户表各自挂着业务专属字段。这样在权限校验时拿用户ID去查业务表非常高效。第二个是约课冲突检测。教练的一个时间段只能安排一位学员这个规则我并不只是在前端做了校验而是在数据库层面用了一条核心SQL加上Java代码双重保障。数据库层面我在课程预约表上建了一个唯一索引索引字段是教练ID、预约日期、时间段这样即使并发请求同时打到后端数据库也会拒绝重复插入。后端代码里再加一次业务判断给出友好的错误提示。这种数据库兜底 应用层提示的组合拳在实际生产环境里非常实用。第三个是软删除设计。所有业务表我都加了一个deleted字段默认值为0。删除操作在代码层面执行的是UPDATE而不是DELETE。这么做不是因为高深的理论而是驾校业务里有实际需求——比如误删了某条缴费记录如果走物理删除财务对账的时候就找不回数据了软删除则能随时恢复同时审计操作日志也更方便。代价是每次查询都要记得带上deleted 0的条件我在MyBatis的XML里将所有通用查询条件做成了公共SQL片段避免到处漏写。2.3 初始化数据准备数据库脚本里除了建表语句我还预置了一批初始化数据主要分三类。第一类是角色数据和基础用户。系统内置了超级管理员账号以及一个演示用的用户、教练、学员账号方便前后端联调和答辩演示。这里有个细节初始密码全部通过BCrypt加密后再写入SQL脚本而不是明文。有同学为了省事直接在INSERT语句里写明文密码结果项目交上去安全这一项就被打了低分得不偿失。第二类是驾校基础配置数据。比如C1、C2、B2等等驾类型字典科目一到科目四的考试项目字典车辆信息表的基础数据教练的默认工时等等。虽然系统里有很多字典类型是代码里硬编码的但我还是建议把核心业务枚举数据通过数据字典表维护。理由很简单——驾校的收费标准、科目名称这类数据随时可能调整如果每次改动都要改代码重新发版运维效率会非常低。第三类是模拟业务数据。为了方便前端页面联调我往各个业务表里灌了一些演示数据包括十来个学员、三位教练、几十条预约记录和部分考试缴费流水。这些数据能让你一打开系统就能看到功能效果而不需要自己手动一条条录入。发布到生产环境前我会把演示数据清理干净只保留必要的初始数据。3. 后端实现SpringBoot主流程搭建3.1 项目初始化与统一响应封装后端项目我用Spring Initializr初始化Java版本选的1.8不要选太高版本SpringBoot 2.7.x对JDK8支持最稳定后面部署到服务器也少很多麻烦SpringBoot版本用的2.7.14依赖引入Spring Web、MyBatis、MySQL Driver、Lombok、Spring Security用于密码加密登录鉴权我用的JWT方案没有直接启用Security的完整过滤器链。项目结构按controller - service - mapper三层来分包同时额外增加了config、common、entity、dto、vo这几个包。common包里我放了一个统一的响应类所有接口都返回这个结构Data public class ResultT { private Integer code; // 200成功500失败401未授权 private String message; private T data; public static T ResultT success(T data) { ResultT result new Result(); result.setCode(200); result.setMessage(success); result.setData(data); return result; } public static T ResultT error(String message) { ResultT result new Result(); result.setCode(500); result.setMessage(message); return result; } }这个封装看起来简单实际联调时省了非常多事。前端拿到响应只需要判断code是不是200再取data渲染即可。如果不统一响应结构前端每个接口都要单独处理错误情况代码会冗余得没法看。JWT鉴权我用的是jjwt库。登录接口校验用户名密码后签发一个有效期24小时的token返回给前端。前端把token存在localStorage里每次请求在axios拦截器中带上Authorization请求头。后端有个拦截器统一校验token未登录或token失效时直接返回401状态码前端收到401后自动跳转到登录页。到期时间选了24小时是综合考虑使用体验和安全性的结果——太短的话学员频繁要重新登录太长了信息泄露风险会增高。3.2 核心业务接口的实现逻辑驾校管理系统里最有代表性的业务接口我觉得是学员约课这个操作。学员在前端选好教练、日期和时间段后前端调用预约接口后端处理逻辑按这个顺序执行校验token拿到当前登录用户ID查出学员信息校验学员状态如果是暂停或退学状态直接拒绝预约校验所选时间段是否已经被占用查询数据库count记录开启事务插入预约记录状态设为待确认将预约信息写入操作日志表。这段逻辑每一步都有对应的异常分支任何一步失败都会返回具体的错误原因给前端。这里我特别加了一个体会——预约这种涉及并发写操作的业务一定要开事务而且事务要放在最外层调用处不能散落在service内部。我之前犯过一个错把两个写操作各放在一个事务里结果第一条插入成功、第二条插入失败时数据库里残留了一条脏数据排查了很久才找到原因。考试管理模块的设计也值得一提。科目考试记录表保存了学员各科目的考试成绩和考试时间前端学员端通过接口计算出当前所处科目并展示进度条。进度计算的逻辑是取学员的当前科目进度字段值如果为1就是科目一阶段以此类推。当科目考试通过后管理员在后台修改学员的科目进度字段学员端刷新后能看到进度条往前推了一格。这个交互虽然简单但非常直观答辩演示时效果也很好。3.3 文件上传与图片管理驾校管理系统里涉及图片的地方主要是学员身份证照片、驾驶证照片和教练头像。我用的方案是本地存储——在项目配置里指定一个上传目录然后用Spring的MultipartFile接收文件保存到服务器指定路径同时把访问路径存入数据库。upload: path: /data/upload/ url-prefix: /files/为了避免文件名冲突我用了UUID作为新文件名同时保留原文件扩展名。这里要重点提醒一个坑——本地存储的访问路径在后端里要配置一个资源映射器否则前端通过URL访问图片时会报404Configuration public class WebConfig implements WebMvcConfigurer { Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler(/files/**) .addResourceMapping(/data/upload/); } }当时我在这块踩了个坑映射路径配置错了导致前端能上传图片但无法回显排查了半天才发现是映射路径少了末尾的斜杠。这种小问题最磨人心态好在一顿排查后也算长记性了。3.4 SQL注入与安全防护细节说一个很多同学容易忽视的点——SQL注入。虽然MyBatis的#{}占位符能防住大部分注入但如果有人图省事直接用${}拼接排序字段或表名一样会出问题。我在项目中做了一件事所有动态排序相关的参数在前端传过来后后端要先白名单校验字段名和排序方向不在允许列表里的值直接拒绝。同时在MySQL数据库账号配置上业务账号只给了该有的增删改查权限没有给DROP、GRANT这类高权限操作这样即使应用被攻破数据库层面的损失也被控制在最小范围。还有一个细节是密码策略。除了BCrypt加密存储我还加了一个简单的密码强度校验——长度必须8-20位且包含字母和数字。虽然在管理系统里这种强度的校验不算严格但能挡住很大比例的简单暴力破解。安全这块不求一步到位但基本的要求该有还是要有。4. 前端实现Vue管理后台的搭建4.1 前端工程化与路由设计前端我用Vue CLI创建项目Vue版本是2.6如果你新开项目也可以直接上Vue 3但Vue 2配合Element UI的成熟度最高做管理系统类项目最省心。UI组件库选的Element UI状态管理用的VuexHTTP请求用的axios。路由设计上我采用整体路由 动态菜单的方式。整体路由里定义登录页、404页和主框架页主框架页内部根据角色权限动态渲染菜单和子路由。菜单的配置数据存放在前端路由表里通过路由的meta字段标识该菜单可见的角色列表。{ path: /student, component: () import(/views/student/StudentList.vue), meta: { title: 学员管理, roles: [admin, coach], icon: el-icon-user } }路由守卫里做的是核心权限校验——每次路由跳转前检查当前用户角色是否在目标路由的meta.roles列表里不在则拦截并跳转403页面。这套方案实现简单代码量不大却很好地满足了驾校系统不同角色看到不同菜单栏的需求。4.2 登录流程与token管理登录页是整套系统的门面。用户输入用户名密码后前端调用后端登录接口拿到token和用户信息后做三件事把token存localStorage把用户信息存入Vuex同时同步到sessionStorage刷新页面时重新拉取然后根据角色跳转到对应首页。这里有个实用经验——页面刷新后Vuex的状态会丢失所以我在main.js的初始化阶段做了个重新登录校验的逻辑如果localStorage有token就调用后端getUserInfo接口重新获取用户信息并写入Vuex如果请求返回401说明token已过期直接清空本地数据并跳转登录页。这个体验细节很关键不然用户刷新一次页面就得重新登录一次非常影响试用的感受。axios拦截器也是在这阶段一起配置的。请求拦截器统一添加token响应拦截器统一处理错误码包括数据加载失败、权限不足、token过期等情况的全局提示。这么一封装各个业务组件里写异步请求时只需要关注数据本身错误处理交给拦截器即可。4.3 核心页面组件与数据交互管理后台最常用到的组件形态是表格 弹窗表单 分页的组合。以学员管理页面为例左侧是筛选区按姓名、手机号、科目进度筛选中间区域是学员列表表格列包括学员编号、姓名、联系方式、所报驾照类型、当前科目、状态、操作按钮右侧或底部是分页器。表格数据加载走的是标准的list分页接口请求参数包括pageNum、pageSize、keyword、subject等。后端返回的数据结构是{ code: 200, message: success, data: { total: 58, list: [...] } }前端拿到total做分页总量展示list渲染表格行数据。新增和编辑功能复用同一个弹窗表单通过一个dialogVisible和editingId两个变量控制。这个模式在整套系统的多个模块中被反复使用抽象出来之后新增一个管理页面的开发成本能压缩到一小时以内。约课排课页面相对复杂一些前端需要渲染一个教练 × 日期 × 时间段的表格每个格子显示预约状态空闲/已约/不可约。学员点击空闲格子弹出确认框确认后提交后端。这个页面的核心计算是时间段状态判断——我把预约接口返回的数据映射成一个Mapkey是教练ID 日期 时间段value是预约状态前端渲染时直接用这个Map查询每个格子的状态时间复杂度是O(1)代码写起来也非常清爽。5. 部署上线从本地到服务器5.1 环境准备与数据库导入部署到Linux服务器我这里用的是CentOS 7系统之前要把本地的环境问题提前想清楚。我整理了一套部署清单照着操作基本不会出错在服务器上安装JDK 1.8配置JAVA_HOME环境变量安装MySQL 5.7设置root密码创建业务数据库导入数据库脚本脚本文件在项目根目录的sql文件夹下安装Nginx配置前端静态资源目录。数据库导入这个步骤要特别提醒如果你本地的MySQL版本和服务器不一致导出的SQL文件很可能出现编码问题。我建议导出时把字符集显式指定为utf8mb4在服务器端导入前先执行set names utf8mb4;。曾经有次没注意导入后中文全部变成了问号折腾了一下午才找到是字符集的问题。5.2 前后端打包与环境配置后端打包前要先把application.yml里的数据库连接地址改成服务器的实际地址。这里建议把数据库连接串分离出来放到application-prod.yml里部署时通过Spring Boot的--spring.profiles.activeprod参数指定使用生产环境配置。好处是本地开发和线上环境互不影响切换环境只需要改一下启动参数不用反复改动核心配置文件。mvn clean package -DskipTests java -jar driving-school-system.jar --spring.profiles.activeprod后端打包成功后在target目录下会生成一个jar包我通常把它放到/opt/app/目录下然后用nohup java -jar命令后台启动。如果要更专业一点可以写一个systemd服务文件让jar包随服务器自启动崩溃后还能自动重启。我用的是后者说实话部署一次到位后面反而省了不少事。前端打包相对简单npm run build打包产物在dist目录下把这个目录的内容全部上传到服务器的指定目录比如/usr/share/nginx/html再修改Nginx配置指向这个目录即可。5.3 Nginx配置要点Nginx在这里承担两个工作一是托管前端静态资源二是反向代理后端接口。我采用的配置是前端页面访问80端口接口请求通过/api前缀转发到后端的8080端口。server { listen 80; server_name your-domain.com; # 前端静态资源 location / { root /usr/share/nginx/html; index index.html; try_files $uri $uri/ /index.html; # 前端路由history模式必须配置 } # 接口反向代理 location /api/ { proxy_pass http://127.0.0.1:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } # 上传文件访问 location /files/ { alias /data/upload/; } }这里有几个容易犯错的地方。第一个是try_files $uri $uri/ /index.html;必须加否则前端用history模式路由时刷新子页面会报404。第二个是proxy_pass http://127.0.0.1:8080/;末尾的斜杠不能丢丢了之后接口路径会多出一层/api后端路由匹配不上所有请求直接404。第三个是上传文件目录的alias配置要确保/data/upload/目录存在且有读写权限否则图片上传会静默失败。5.4 部署验证与性能基础调优部署完成后我会按流程做一轮冒烟测试先访问前端页面确认能正常加载用管理员账号登录创建一条测试学员记录给学员分配教练再模拟一次约课操作最后查看操作日志是否生成。这轮走完整个系统的主要链路就算通了。性能方面的基础优化我做的主要是MySQL连接池配置和JVM启动参数。连接池用HikariCPSpringBoot默认自带把最大连接数调到了50并对常用查询字段建立了索引——比如学员表的手机号字段、预约表的教练ID日期组合字段。JVM参数根据服务器内存大小调了堆内存初始值和最大值避免默认参数导致内存分配过大或过小。这些调整对几百人使用的小型驾校系统来说已经足够用了。6. 常见问题与排查技巧实录6.1 启动失败类问题这类问题在环境配置阶段最常遇到我把几个典型的踩坑记录整理成了一份速查表也算是给后来者排雷现象可能原因排查方法后端启动报数据库连接失败数据库地址错误/账号密码错误检查application.yml配置用命令行直接连接测试MySQL启动后立刻消失配置了错误的my.ini参数查看错误日志重点看datadir路径是否存在端口被占用8080端口已被其他进程占用netstat -tunlpMaven依赖下载失败网络问题/镜像源问题配置阿里云镜像源清空本地仓库缓存后重试前端启动卡在90%npm install依赖不完整删除node_modules后重新执行npm install启动失败的排查思路其实很统一——先看有没有明显的组件没装或者配置错了再看日志里的关键报错信息。我一直强调一个习惯日志是最忠实的排错伙伴遇到问题第一反应应该去看日志而不是盲目改代码。很多同学遇到启动失败就慌四处问人其实日志里写得清清楚楚。6.2 页面访问与数据交互问题前端能打开但接口报错这个问题在前后端联调阶段出现的频率最高。最常见的场景是前端请求后端的接口地址不通要么报404要么报跨域错误。跨域问题在开发环境我用Vue CLI的proxy配置解决在生产环境用Nginx反向代理解决。这里重点说一下生产环境的Nginx反向代理如果按照我上面写的配置前端请求的/api/login会转发到后端的/login跨域自然不存在。但如果proxy_pass配置写错比如末尾少了一个斜杠请求就会卡在404这个我之前已经踩过反复提醒不嫌多。另外还有一个常见问题是登录后页面刷新就跳回登录页。上面我提到在main.js初始化阶段做重新拉取用户信息的逻辑如果你的项目没有做这一步刷新丢状态是无法避免的。解决思路就一条——把用户状态的恢复逻辑放到应用初始化阶段的异步流程中而不是依赖Vuex的持久化。6.3 部署环境问题部署环节的问题更接近真实生产环境的问题我在实际部署时遇到过三个印象深的问题这里分享一下。第一个是服务器内存不足导致jar包启动失败。因为同时跑了MySQL、Nginx、Redis和jar包一台2G内存的服务器确实紧张。解决方法是把MySQL的innodb_buffer_pool_size调低JVM堆内存调小然后给服务器加了一点点swap空间。对于小项目来说优化资源占用比直接升级服务器配置更实际。第二个是前端改了代码但浏览器还显示旧页面。这个大多是浏览器缓存在作祟Nginx上配置Cache-Control: no-cache能解决大部分展示问题。同时对前端打包产物开启gzip压缩能让页面加载速度快不少尤其是第一次访问时的体验会明显提升。第三个是图片上传到服务器后页面无法访问。原因是上传目录在Nginx的alias路径配置里没有正确匹配或者上传目录的权限不够。服务器的目录权限问题很隐蔽建议上传目录直接设置成chmod -R 755然后在浏览器里直接访问一个上传后的图片URL测试Nginx的静态文件托管配置是否生效。7. 个人实操总结与扩展建议整个项目从设计到部署跑通我最大的收获不是某个具体的技术点而是把业务需求 → 数据库设计 → 后端接口 → 前端页面 → 部署上线这条完整链路走了一遍。这三周时间里我整理了一份约80页的文档包含开发笔记、接口文档、部署手册和答辩要点后期回看这笔沉淀的价值远超项目本身。如果你打算基于这个项目继续扩展有四个方向我推荐选择一是给约课模块增加微信公众号消息通知学员预约成功后通过模板消息推送提醒二是增加学员端的独立微信小程序让学员随时随地查看进度和约课三是引入在线模拟考试模块学员在系统里刷科目一和科目四的题库四是做一套基于ECharts的运营数据看板让驾校管理者能直观看到学员增长趋势、科目通过率和营收情况。这四个方向的技术栈都能在现有基础上自然延伸难度也循序渐进适合作为二期迭代。最后说一个我在实际开发中慢慢养成的习惯不要急着写代码先把表设计清楚、把接口文档写出来、把前端页面的数据流走通再开始动手填充业务逻辑。好的设计和充分的准备至少能省掉三分之一的返工时间。这个管理系统做了三周第一周全部花在设计上后面两周编码和联调非常顺利几乎没有大的改动。做管理系统项目慢就是快这个道理我算是深有体会了。本文还有配套的精品资源点击获取