ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

JSP智慧热力管理系统开发实战:从数据库设计到部署全解析

JSP智慧热力管理系统开发实战:从数据库设计到部署全解析 手头刚交付一个JSP智慧热力管理服务系统的项目内部代号382tv整套流程——从需求梳理、数据库设计、代码开发、本地调试到服务器部署——都完完整整走了一遍。很多做JavaWeb的人一听到“智慧热力”觉得很高大上实际上拆开看就是一个典型的管理信息系统加实时数据展示核心难点不在业务多复杂而在数据量大怎么处理、部署环境怎么兼容、老技术栈怎么和新工具配合。这篇文章就把这个项目从零到一的关键过程整理出来包括开发环境怎么搭、数据库怎么建、核心功能怎么写、调试部署时踩了哪些坑给同样在做JSP课程设计、毕业设计或者实际商用热力管理系统的朋友一个可参考的完整路径。项目源码、数据库脚本、部署文档这些我都是配套整理好的所以这篇更侧重讲清楚“为什么要这么做”和“实操中真正会遇到什么”。1. 项目整体设计与思路拆解1.1 这套系统到底在管什么供热行业的管理对象很明确热源、热力站、一次管网、二次管网、用户端。传统做法是各站自己抄表、自己记录出了问题靠人工巡查数据分散在Excel甚至纸面上。智慧热力管理系统的目标就是把分散的数据集中到一个平台里统一监控、统一调度、统一告警。具体到382tv这个项目业务上分四块基础数据维护热力站信息、设备台账、用户信息、换热站与用户的隶属关系。实时数据监控通过采集接口接收温度、压力、流量、热量等参数页面实时刷新展示。告警与工单数据越限自动告警生成工单派发给运维人员处理完回填结果闭环。统计分析报表按日、按周、按供暖季统计供热参数趋势、能耗数据、工单完成率。功能听起来不复杂但组合起来就是一个完整的管理闭环。我在设计时最看重的是“数据链路是否畅通”——采集数据进来之后能不能实时展示、告警能不能及时触达、工单能不能追溯。很多类似项目表面功能都有但数据流一断就变成摆设。1.2 为什么选JSP而不是前后端分离这个项目选型的时候确实有人问为什么不直接用Spring Boot加Vue前后端分离。说实话如果是新做一个长期演进的大型平台我肯定推荐前后端分离。但这个项目的实际情况是供热企业信息科现有的业务系统多数还是传统JavaWeb架构运维人员最熟悉的就是JSP直接改页面后续维护也是他们自己来。纯JSP方案部署简单一个Tomcat打完War包扔上去就行不涉及Node环境、跨域配置、前端构建这些额外环节。再一个考量是交付速度。JSP加Servlet加JDBC这套技术栈本身就是为这种场景设计的模板页面直接在服务端渲染数据通过EL表达式和JSTL标签取出来开发效率比前后端分离要快不少。尤其是报表这类页面服务端渲染直接拼HTML表格省掉一堆Ajax接口和JSON解析。至于Spring Boot也不是完全排斥。像382tv这种中大型项目完全用纯Servlet写会有点吃力所以我采用的是主流折中方案核心框架用Spring加Spring MVC视图层保留JSP数据访问用MyBatis。这样既保留了JSP维护简单的优势又获得了Spring的IoC和事务管理能力。这个组合在传统行业项目里非常主流招聘也好招人维护也好找人。1.3 模块划分与技术选型细节模块划分直接决定工程结构我按业务边界拆成了六个功能域模块主要功能关键表用户与权限登录认证、角色区分、菜单权限admin_user, sys_role站点管理热力站档案、设备台账heat_station, device_info数据监控实时参数展示、历史曲线realtime_data, history_data告警中心告警规则、告警记录、通知alarm_rule, alarm_record工单管理工单创建、派发、处理、回访work_order, order_log报表统计能耗统计、温度趋势、工单报表视图汇总表技术栈细节如下JDK用的1.8这是Tomcat 8/9配合最稳定的版本Spring 5.x、Spring MVC 5.x、MyBatis 3.5数据库MySQL 5.7连接池用Druid前端就是JSP加jQuery加EChartsECharts拿来画实时曲线和报表图非常省力。服务器这边Tomcat 8.5本地开发用IDEA生产环境是CentOS 7。2. 开发环境搭建与工程结构配置2.1 版本配套决定了后续能不能省心开发环境这块我吃过亏最早图省事下了个高版本JDK17结果Tomcat 8.5直接跑不起来报了一堆module相关的错误。后来才换成JDK 8u202一切都正常。所以第一步千万别图新老项目就用老配套这是铁律。推荐的开发环境组合JDK 1.8Oracle JDK或OpenJDK都行建议8u202之后版本IntelliJ IDEA 2020以上社区版就够用Tomcat 8.5.x不要用Tomcat 10包名从javax改成jakarta老项目直接炸Maven 3.6.xMySQL 5.78.0也能用但驱动和时区配置要额外注意Navicat或Workbench管理数据库这里特别提醒一点网上很多JSP教程用的还是Eclipse而你现在用IDEA的话工程结构略有不同。IDEA里面新建项目选Maven Archetype时填的是maven-archetype-webapp创建完成后需要自己补上java目录并标记为Sources RootIDEA不会自动建。很多新手卡在“新建的JSP项目一直找不到源码目录”就是这个原因。2.2 工程目录怎么组织才不乱382tv的工程结构我是按Maven标准布局来的同时照顾了JSP项目的传统习惯heat-manage/ ├── pom.xml ├── sql/ # 数据库初始化脚本 │ ├── 01_schema.sql │ └── 02_init_data.sql └── src/main/ ├── java/com/heat/ │ ├── controller/ # Spring MVC控制器 │ ├── service/ # 业务逻辑接口与实现 │ ├── mapper/ # MyBatis数据访问 │ ├── entity/ # 实体类 │ ├── filter/ # 登录拦截、编码过滤器 │ └── util/ # 工具类 ├── resources/ │ ├── jdbc.properties │ ├── mybatis-config.xml │ └── spring/ │ ├── spring-mvc.xml │ └── spring-mybatis.xml └── webapp/ ├── WEB-INF/ │ ├── web.xml │ └── views/ # JSP页面 ├── static/ # js、css、images └── index.jsp这种结构的好处是分层清晰页面统一放在WEB-INF/views下面外部直接访问不了JSP所有的入口都走Controller权限控制就好做了。2.3 环境初始化实操记录环境搭建的实操流程我记一下照着做基本不会出大问题安装JDK配置JAVA_HOME、PATH命令行执行java -version确认版本是1.8。安装Maven配置本地仓库路径修改settings.xml加阿里云镜像不然下载依赖能让人等到怀疑人生。用IDEA打开pom.xml导入项目等依赖下载完成。安装MySQL初始化一个heat_manage数据库字符集指定utf8mb4。执行sql目录下的01_schema.sql和02_init_data.sql把表结构和初始数据导入。在IDEA中配置TomcatRun - Edit Configurations - 新增Tomcat ServerDeployment里把war包或exploded工程加上Application context设为/。启动Tomcat浏览器访问http://localhost:8080/看到登录页就说明环境通了。说实话第6步是大多数人第一次做JSP项目最容易懵的地方。IDEA默认的配置入口藏得比较深而且选war exploded模式才能支持JSP热更新改完页面不用重启。直接选war模式的话每改一个JSP都要重新打包调试效率极低。3. 数据库设计与连接池配置3.1 核心表结构拆解与设计思路数据库是这套系统的地基。我当时设计时不只是建几张表了事而是认真考虑了数据写入频率、查询模式和后续的扩展性。这里把最重要的几张表拿出来说说。用户表比较简单核心字段就是用户名、密码MD5加盐之后存储、角色、状态。角色这块我用了简单的int字段区分管理员、调度员、运维人员没引入复杂的RBAC因为业务角色就三类做成表关联反而过度设计。核心的是实时数据表和热力站表。热力站表长这样CREATE TABLE heat_station ( id BIGINT PRIMARY KEY AUTO_INCREMENT, station_code VARCHAR(32) NOT NULL COMMENT 站编号, station_name VARCHAR(64) NOT NULL COMMENT 站名称, address VARCHAR(128), longitude DECIMAL(10,6), latitude DECIMAL(10,6), device_count INT DEFAULT 0 COMMENT 设备数量, manager VARCHAR(32) COMMENT 负责人, phone VARCHAR(20), status TINYINT DEFAULT 1 COMMENT 1正常 0停运, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, UNIQUE KEY uk_station_code (station_code) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT热力站基础信息表;实时数据表是数据量最大的表每个热力站可能有几十个采集点采集周期可能到分钟级甚至秒级一天就能产生几百上千万条记录。如果只建一张普通表三个月后查询就会慢到无法接受。所以我在这张表上做了一些特别的处理后面专门讲。3.2 实时数据表的分区与索引优化realtime_data这张表我一开始用的普通单表设计结果测下来一个月的数据就能跑到几千万行带时间范围的查询慢得离谱。后来做了两个关键优化第一是表分区。按采集时间做RANGE分区每个月一个分区写入的时候MySQL自动路由到对应分区查询带上时间条件也能直接做分区裁剪速度快了一个数量级。CREATE TABLE realtime_data ( id BIGINT AUTO_INCREMENT, station_id BIGINT NOT NULL, device_id BIGINT NOT NULL, param_type VARCHAR(16) NOT NULL COMMENT 参数类型TEMP/PRESSURE/FLOW/HEAT, param_value DECIMAL(10,2) NOT NULL, collect_time DATETIME NOT NULL, PRIMARY KEY (id, collect_time), KEY idx_station_time (station_id, collect_time) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 PARTITION BY RANGE (YEAR(collect_time)*100 MONTH(collect_time)) ( PARTITION p202401 VALUES LESS THAN (202402), PARTITION p202402 VALUES LESS THAN (202403), PARTITION p202403 VALUES LESS THAN (202404) );第二是索引策略。查询最频繁的模式是“按热力站时间段找数据”所以建了联合索引(station_id, collect_time)。注意我没在param_type上单独建索引因为它的区分度很低查询时配合联合索引就够了多建反而浪费写性能。注意MySQL分区表的查询必须把分区键放在WHERE条件里才能生效。如果你写SQL时漏了collect_time条件查询会扫描所有分区性能比不分区的表还差。3.3 连接池用Druid而不是默认的数据源这块直接用了阿里巴巴的Druid连接池。选它的原因很简单自带监控页面、SQL执行统计、慢SQL告警排查性能问题的时候简直救命。配置在jdbc.properties加上spring-mybatis.xml里jdbc.drivercom.mysql.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/heat_manage?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai jdbc.usernameroot jdbc.passwordyourpasswordbean iddataSource classcom.alibaba.druid.pool.DruidDataSource init-methodinit destroy-methodclose property namedriverClassName value${jdbc.driver}/ property nameurl value${jdbc.url}/ property nameusername value${jdbc.username}/ property namepassword value${jdbc.password}/ property nameinitialSize value5/ property nameminIdle value5/ property namemaxActive value50/ property namemaxWait value60000/ property namevalidationQuery valueSELECT 1/ property nametestWhileIdle valuetrue/ /bean连接池参数不是越大越好。我之前犯过一个错误把maxActive设成200结果流量一上来数据库直接被连接打爆。后来根据实际并发量调整系统同时在线用户大概50人以内实时数据写入是单独线程批量处理所以maxActive给到50就完全够。连接池的动态扩容机制会自动应对高峰不需要盲目调大。4. 核心功能实现与关键代码讲解4.1 登录认证与权限过滤的实现细节登录这块用的是传统Session方案配合Filter做拦截。Controller里校验用户名密码成功后把用户对象放进SessionFilter里检查请求路径未登录的直接重定向到登录页。这里有一个很容易被忽略的细节JSP页面的静态资源CSS、JS也要放行不然登录页本身会因为样式文件被拦截而变得乱七八糟。我在Filter里放行了/static/*、/login、/login.jsp这几个路径。public class LoginFilter implements Filter { private static final ListString WHITE_LIST Arrays.asList( /login, /login.jsp, /static, /captcha ); public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) { HttpServletRequest request (HttpServletRequest) req; HttpServletResponse response (HttpServletResponse) resp; HttpSession session request.getSession(); String path request.getRequestURI(); boolean isWhitePath WHITE_LIST.stream().anyMatch(path::startsWith); if (isWhitePath || session.getAttribute(loginUser) ! null) { chain.doFilter(req, resp); } else { response.sendRedirect(request.getContextPath() /login.jsp); } } }角色权限这里我是分两层控制的Filter只负责登录校验具体页面上的功能按钮用自定义标签判断角色管理员能看到删除和配置按钮普通运维人员只能看和操作工单。这种粗粒度的权限在实际项目中够用不需要搞得跟Spring Security那么重。4.2 实时数据监控页面怎么做到秒级刷新实时监控页面算是这个系统的门面。要求是进入页面后数据每隔几秒自动刷新不需要手动点刷新。有两条路一是JSP里用meta http-equivrefresh content5做整页刷新简单粗暴但用户体验差整个页面闪烁查询量也大二是用Ajax定时轮询局部刷新这也是我最终选的方式。思路是页面加载时先用JSP渲染第一版数据之后用jQuery的setInterval每5秒发起一次Ajax请求到/monitor/realtime接口返回JSON数据后用ECharts更新曲线图用DOM操作更新表格中的数据。function loadRealtimeData() { $.ajax({ url: /monitor/realtime, type: GET, dataType: json, success: function (data) { // 更新表格 $(#tempValue).text(data.supplyTemp.toFixed(1)); $(#backTemp).text(data.returnTemp.toFixed(1)); // 更新曲线图 tempChart.setOption({ series: [{ data: data.trendData }] }); }, error: function () { // 网络异常时保留旧数据不要清空展示 } }); } setInterval(loadRealtimeData, 5000);这里有一个ajax的坑要特别说明IE浏览器对缓存的处理和Chrome不一样同一个GET请求如果URL不变IE会直接返回缓存结果导致数据一直不更新。解决方式是在URL后面加一个时间戳参数url: /monitor/realtime?t new Date().getTime()这是老项目里对付缓存的经典办法。4.3 告警判断与工单闭环逻辑告警模块的核心是一张告警规则表和一段定时扫描逻辑。规则表里配置了参数类型、上限值、下限值、关联热力站。定时任务是每两分钟扫描一次实时数据表发现超限就插入告警记录同时根据优先级决定是否生成工单。告警和工单的关联逻辑要特别注意防重复。如果某站温度超限持续一个小时扫描任务跑了30次不能生成30个工单。我在这里的处理方式是当该热力站同一参数类型存在“未处理”状态的告警时新告警只更新原记录的持续时长不重复插入。等处理完成后后续再超限才允许生成新工单。工单状态流转我是硬编码的待派发 - 处理中 - 已处理 - 已回访每个状态变更都会插入一条操作日志记录操作人和时间。这在后续做统计报表时非常关键不然你不知道工单到底花了多久才处理完。4.4 报表统计与导出Excel的实现报表模块最开始我只做了页面展示后来业务方提出要导出Excel好往集团汇报。导出功能用Apache POI实现核心就是查出数据后写入Workbook再通过HttpServletResponse把文件流传给浏览器。RequestMapping(/report/export) public void export(HttpServletResponse response) throws IOException { ListHeatReportVO list reportService.getMonthlyReport(month); XSSFWorkbook workbook new XSSFWorkbook(); XSSFSheet sheet workbook.createSheet(月报); // 创建表头、填充数据 Row header sheet.createRow(0); header.createCell(0).setCellValue(热力站); header.createCell(1).setCellValue(供温均值); header.createCell(2).setCellValue(回温均值); header.createCell(3).setCellValue(累计热量); // ... 填充数据行 response.setContentType(application/vnd.openxmlformats-officedocument.spreadsheetml.sheet); response.setHeader(Content-Disposition, attachment;filenameheat_report_ month .xlsx); workbook.write(response.getOutputStream()); workbook.close(); }导出时最容易出问题的是两件事文件名中文乱码以及数据量大导致的内存溢出。文件名我用了URLEncoder编码服务端对中文文件名做一次编码就能兼容各浏览器。数据量大时建议使用SXSSFWorkbook而不是XSSFWorkbook后者把所有行都放内存几万行就会OOM前者是流式写入内存占用直接降一个数量级。5. 调试部署全流程实操5.1 IDEA本地调试配置细节本地调试是我觉得整个流程里最需要耐心的一步因为问题不是出在代码里而是出在IDE和Tomcat的配合上。IDEA配置Tomcat的路径菜单在Run - Edit Configurations - 左上角号 - Tomcat Server - Local。关键设置三处Server标签页的Application server指向本机Tomcat安装目录。Deployment标签页点选Artifact注意选war exploded格式这样改了JSP不用重启。启动后浏览器自动打开的地址设置成http://localhost:8080/。配置好之后启动第一次经常遇到端口占用。解决方式是lsof -i :8080找出占用进程PID然后杀掉或者直接在Tomcat配置里把端口改成8081看个人习惯。调试模式这块IDEA的断点调试对JSP也有效但在JSP页面上打断点不如在Controller和Service层打断点直观。我建议在Controller的方法入口打断点然后通过页面操作触发请求这样就能完整跟踪请求处理链路。我在接前端页面和后台数据时就是这么排查的效率比加System.out高得多。5.2 Maven打包和War包生成本地调试没问题之后需要打成War包部署到生产服务器。打包命令很简单mvn clean package -Dmaven.test.skiptrue打包完成之后在target目录下会生成heat-manage.war。这里有一个Maven插件的坑pom.xml里如果不配置maven-war-plugin的failOnMissingWebXml属性IDEA自动生成的工程在打包时会报缺少web.xml的错误虽然新版Servlet支持注解代替web.xml但传统JSP项目还是保留web.xml更稳妥。plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-war-plugin/artifactId version3.3.2/version configuration failOnMissingWebXmlfalse/failOnMissingWebXml /configuration /plugin5.3 Linux服务器部署完整步骤生产环境是CentOS 7部署流程我整理成了标准操作清单安装JDK 8yum install -y java-1.8.0-openjdk-devel装完验证java -version。安装MySQL 5.7用官方yum源安装初始化mysql_secure_installation设置root密码和远程访问权限。上传war包到Tomcat的webapps目录Tomcat会自动解压部署。修改数据库连接配置生产环境的jdbc.properties里的数据库地址、账号、密码换成实际的。创建数据库并导入数据mysql -uroot -p 01_schema.sql再执行02_init_data.sql。启动Tomcat/usr/local/tomcat/bin/startup.sh注意用nohup方式确保后台运行。查看启动日志tail -f /usr/local/tomcat/logs/catalina.out确认Deployment of web application directory has finished。这里有一点可以说得再细一些——jdbc.properties放在src/main/resources里会被打进war包生产环境想改数据库密码就得解压war包重新打包非常麻烦。我的做法是把config目录放在Tomcat的conf路径下Spring配置里用context-param指定外部配置文件的路径让配置和代码分离。这样改配置只需要改服务器上的文件不用重新打包。5.4 部署后的功能验证清单部署完成后别急着宣称上线了先把下面这些核心链路依次验证一遍每一环都通了才算完登录页能打开账号密码正确能进系统错误密码有提示监控页面数据能加载曲线能绘制5秒自动刷新正常造一条超限数据能触发告警并生成工单工单能派发、能处理、能回访日志记录完整报表页面数据与数据库查询一致导出Excel文件能正常打开且中文不乱码这个清单来自我多次部署踩坑后的总结。有好几次觉得一切正常了结果生产环境因为数据库服务器地址没改对页面报500因为时区配置问题数据显示全是NaN不得不重新来一遍。验证清单能把这些低级失误提前拦截住。6. 常见问题与排查技巧实录6.1 数据库连接与驱动问题这类问题在部署现场出现频率最高。典型报错是Communications link failure或者Access denied for user排查思路从外往内来一遍首先确认数据库账号密码在命令行能连上mysql -h服务器IP -u用户名 -p密码这一步能排除账号密码问题。然后确认数据库端口对外可达telnet 服务器IP 3306连不上就去查防火墙和安全组策略。再确认MySQL配置允许远程访问use mysql; select host, user from user;如果host是localhost需要改成%或指定IP。最后检查MySQL 8.0的时区问题驱动连接串必须加serverTimezoneAsia/Shanghai不然JDBC驱动会报The server time zone value错误。数据库驱动版本也容易出问题。MySQL 5.7用mysql-connector-java的5.1.x版本没问题但换成MySQL 8.0后必须用8.0.x驱动两者兼容性有坑。我一般建议在pom.xml里固定版本避免Maven解析到不兼容的版本。6.2 中文乱码问题全链路排查中文乱码是JSP项目的高频问题一次乱码可能有多个环节同时出了问题。系统性地排查要覆盖四个位置第一个是数据库表字符集必须是utf8mb4。如果你建表时没指定MySQL会用数据库默认字符集很多老环境默认是latin1数据存进去的时候就变乱码了这种问题从根上就很难救。第二个是JDBC连接串要有characterEncodingutf8这样从数据库读出来的中文才能正确转成Java字符串。第三个是JSP页面本身% page contentTypetext/html;charsetUTF-8 languagejava %这一行必须写而且页面文件本身要保存为UTF-8编码。IDEA右下角能看到文件编码如果不是UTF-8就转一下。第四个是请求参数接收。POST请求的中文参数在Spring MVC里一般没问题但GET请求的中文参数依赖于Tomcat的URI编码设置需要在server.xml里给Connector加URIEncodingUTF-8。排查方法有个小技巧用curl -I或者浏览器的开发者工具看响应头里的Content-Type是否包含charsetUTF-8如果没有说明是Tomcat的Response编码配置缺失需要检查web.xml里加requestCharacterEncoding和responseCharacterEncoding两个filter。6.3 部署到Linux后常见的404和500本地环境调试通过部署到Linux上却出问题这不一定是代码的事而是环境差异导致的。404的排查先看war包是否真的解压了。Tomcat启动后会生成一个和war包同名的目录如果没生成可能是war包损坏或者权限不对。再看访问路径是否有大小写问题Linux文件系统是区分大小写的heat-manage和Heat-Manage是两个完全不同的路径。还要检查应用上下文路径如果war包叫heat.war访问地址就应该是http://IP:8080/heat/而不是直接根路径。500错误最常见的原因是三件套数据库没导数据表里没有初始数据业务查询空指针。配置文件里的数据库密码和生产环境不一致MyBatis初始化时直接报错。Spring容器初始化时检查到缺失的Bean依赖日志里能看到BeanCreationException。遇到500先别急着改代码第一步永远是回头看Tomcat日志catalina.out异常栈信息会把问题定位到具体哪一行。我见过太多同事上来就猜原因最后发现只是数据库没启动。6.4 那些容易被忽略的环境坑最后说几个环境相关的隐性坑都是我真实遇到过的。第一个是Linux服务器时区问题。很多云服务器默认时区是UTC数据库存的时间字段按UTC存页面展示按北京时间取数据就会差8小时。部署时必须执行timedatectl set-timezone Asia/Shanghai确认date命令显示的时区正确之后再启动服务。第二个是Tomcat内存配置。默认的JVM堆内存可能只有256MB监控数据量一大就OOM。修改catalina.sh里的JAVA_OPTS建议-Xms512m -Xmx1024m如果服务器内存充足可以再调高。第三个是数据库连接池耗尽。系统跑一段时间后所有连接都被占满表现为页面请求卡住然后报连接超时。常见原因是代码里获取连接后没有释放或者查询慢SQL把连接池占满。用Druid的监控页面能直接看到活跃连接数随时间变化的曲线配合慢SQL统计找到病根通常就是一条没走索引的大查询。第四个是文件权限。Linux下上传的war包如果是root用户操作的Tomcat可能因为权限问题无法写入日志或者无法解压部署文件。一般建议用专用用户运行Tomcatwar包也使用该用户上传。7. 项目源码管理与其他交付物说明源码管理这块用了Gitee私有仓库分支策略很简单master放稳定版本dev放开发分支每次功能完成合并master。项目里除了Java源码我习惯把完整交付清单一起维护全部Java、JSP源码文件sql目录下带初始化数据的数据库脚本项目依赖清单和版本说明IDEA运行配置说明Tomcat配置、JDK配置部署文档包含服务器初始化步骤、环境变量、常见问题resources目录下的环境配置模板区分开发和生产的注释说明这里单独说一个经验数据库脚本一定要带初始化数据。很多项目交付的时候只有建表语句没有初始数据导致用户拿到手登录都过不去。我在02_init_data.sql里把管理员账号、基础角色、默认热力站信息都放进去了拿过去导入就能直接启动系统体验完全不同。初始管理员账号统一是admin密码是admin123部署后第一时间提醒对方修改密码这也是安全运维的常规动作。再一个值得说的是版本管理习惯。我在每个功能模块完成时都会提交一次提交信息里写明做了什么改动。这个习惯在多人协作或者自己回溯问题时特别重要尤其是上线前突然发现某个功能不对可以通过git log快速定位到是哪次提交引入的问题而不是一行行翻代码找原因。这套系统从开发到交付整体工作量大概在一个月左右。现在回头看最花时间的不是写业务代码而是配置调试和数据链路打通。如果你也在做JSP相关项目建议把精力重点放在数据库设计、环境版本搭配和部署这几块把这些基础工作做扎实了业务代码反而很快。最后再分享一个小技巧遇到JSP页面渲染出来的数据和预期不符不要直接看页面先打开浏览器的开发者工具Network面板看接口返回的原始JSON和HTTP状态码数据链路哪一环出问题一眼就能看出来。这比盲目改代码要高效十倍。
返回列表