Web学习0到1
学习心得
目录
一、项目规划设计 1
二、项目实现和管理 3
三、技术栈和学习技巧 6
四、登录认证的理解 7
五、能源系统项目实践 8
六、中间件和底层原理 9
七、项目部署 10
八、踩过的坑 11
九、学习总结 12
一、项目规划设计
课程之初,老师没有直接让我们编写代码,而是先讲解软件项目开发的完整流程,并教授UML图的绘制方法。这与我之前的想法截然不同,原来在正式编码之前,还有如此多的准备工作需要完成。
我们使用ProcessOn在线画图工具,绘制了用例图、ER图和泳道图。
用例图尤为重要,它帮助我们明确系统中有哪些参与者,以及每个参与者能够执行的功能。参与者与用例之间存在关联关系,用例之间也包含包含关系、扩展关系和泛化关系。包含关系是指基础用例必须执行被包含的用例,例如修改用户信息时必须先验证身份;扩展关系是可选的附加行为,例如普通登录可以扩展出验证码登录;泛化关系则是继承关系,高级管理员继承普通管理员的所有功能。
ER图用于数据库设计,首先分析系统中的实体,确定每个实体的属性和主键,然后分析实体之间的关系,是一对一、一对多还是多对多。例如在赛克能源系统中,部门实体具有分组ID、分组名称、分组层级等属性。
这一阶段虽然不涉及代码编写,但对整个项目的影响却非常深远。先理清思路再动手,后续的编码工作会顺畅很多。
二、项目实现和管理
随后我们开始编写代码,从最小系统入手,这是我认为最有效的学习方法。先搭建一个可以运行的简单项目,再逐步添加功能。
1. 最小系统架构
最小系统的结构非常清晰,采用SpringBoot经典的分层架构:
src/
main/
java/com/lzpu/
MiniApplication.java 启动类
controller/ 控制器层,接收请求
entity/ 实体类,对应数据库表
mapper/ 数据访问层,写SQL
service/ 业务层,处理逻辑
resources/
application.yaml 配置文件
test/ 测试代码
pom.xml Maven依赖配置
2. 从底层往上层学
学习顺序是先学习Mapper层,再学习Service层,最后学习Controller层。这样每一层都可以独立测试,出现问题时也更容易定位。
Mapper层使用MyBatis,有注解和XML两种方式。注解方式简单直观,适合简单的SQL语句;XML方式适合复杂查询,例如多表联查。MyBatis是一个ORM框架,能够自动将Java对象与数据库表进行映射,避免了编写繁琐的JDBC代码。
Service层负责处理业务逻辑,可以注入多个Mapper。例如查询用户及其课程信息时,就可以同时注入UserMapper和CourseMapper。
Controller层负责接收前端请求,调用Service层,并返回数据给前端。我们采用RESTful API风格,GET用于查询,POST用于新增,PUT用于修改,DELETE用于删除,URL设计清晰明了。
3. 测试驱动开发
每完成一层代码,我都会使用JUnit 5进行测试。在测试类上添加@SpringBootTest注解,可以启动Spring上下文。使用@Autowired注入要测试的类。配合@Transactional和@Rollback注解,测试完成后会自动回滚数据,不会污染数据库。
这个习惯非常重要,能够及早发现问题,后续修改代码时也更加放心,因为有测试作为保障。
三、技术栈和学习技巧
这学期学习了许多技术:
后端:SpringBoot 2.7.6、MyBatis、MyBatis-Plus、MySQL 8.0、Redis、JWT、MD5、Maven
前端:Vue.js、HTML、CSS、JavaScript
部署:阿里云服务器、宝塔面板、Nginx
在学习这些技术的过程中,我总结了几个实用的技巧:
1. 不要一开始就纠结于细节,先学会使用,能跑通流程再说,后续再深入理解原理。
2. 遇到问题时先查看错误信息,推测可能的原因,查阅文档,最后再请教老师。自己思考解决的问题印象会更加深刻。
3. 老师提供的代码示例一定要自己动手敲一遍,不能只看不动手,只有实际操作才会知道哪里有坑。
4. 善用工具,例如用Postman测试接口,用Navicat连接数据库,使用IDEA的快捷键提高开发效率。
四、登录认证的理解
JWT、Redis、MD5这三者配合实现登录认证,我对它们的理解比较透彻:
MD5仅负责密码加密,用户注册时将密码通过MD5加密后存入数据库,登录时将用户输入的密码MD5加密后与数据库中的密码进行比对,防止数据库泄露导致密码明文暴露。
JWT负责生成身份令牌,将用户ID、用户名等信息加密成一串字符串,前端每次请求都携带这个token,后端解析验证身份。JWT自身包含信息,无需每次都查询数据库,但签发后无法主动作废。
Redis负责管理登录状态,将生成的token存入其中,并设置过期时间。这样可以实现强制用户下线的功能,例如用户修改密码后使旧token失效,也可以控制同一账号在多地登录。
登录流程:用户输入密码,使用MD5加密后比对验证身份,验证通过后将用户信息放入JWT生成token,将token存入Redis,最后将token返回给前端。
五、能源系统项目实践
后来我们完成了赛克能源系统,将前面所学的知识都应用其中。功能包括登录注册、部门管理、设备管理、能源统计、数据展示。
阶段考核要求完成部门CRUD功能,确保Web服务器成功启动,数据库表成功创建。我按照分层架构,先编写Department实体类,再编写DepartmentMapper,然后是DepartmentService,最后是DepartmentController,每完成一层就进行测试,最终顺利通过考核。
通过这个项目,我感觉之前学习的知识点都串联起来了,知道了如何在实际项目中应用这些知识。
六、中间件和底层原理
课程后期还学习了使用纯Java命令行连接数据库,使用Socket和ServerSocket实现简单的Web服务器,模拟SpringBoot的MVC架构。这让我对框架的底层原理有了一定的理解,原来SpringBoot为我们做了这么多工作。
我们还学习了JSON、JWT、Redis与Key-Value的对比:
JSON是纯文本数据格式,用于存储结构化数据,跨语言通用。
JWT是带签名的JSON令牌,专门用于身份认证。
Redis是内存型Key-Value数据库,读写速度极快,适合存储缓存、session、token等数据。
七、项目部署
课程最后学习了部署,分为本地部署和阿里云部署。
本地部署步骤:
1. 启动MySQL服务,导入SQL文件
2. 启动Redis
3. Maven打包:mvn clean package -DskipTests
4. 启动后端:java -jar ems.jar
5. 前端打包:npm run build,然后npm run serve
阿里云部署需要先购买服务器,安装宝塔面板,开放8081、9763、3306、6379这些端口。然后在宝塔面板中一键安装Nginx、MySQL 8.0、Redis、Java环境。
后端使用nohup java -jar在后台运行,这样关闭终端后程序仍能继续运行。前端使用Nginx代理,配置try_files $uri $uri/ /index.html解决Vue history模式下刷新页面出现404的问题。
八、踩过的坑
这学期遇到了很多问题,印象深刻的有:
1. 数据库连接失败:项目刚启动时一直报数据库连接错误,检查了半天配置文件,才发现application.yml里把数据库密码写错了。这个小插曲让我养成了写完配置文件后仔细检查一遍的习惯。
2. JWT验证问题:登录功能调试时,token经常失效。后来发现是过期时间设得太短,而且前端和后端的签名密钥有细微差别。解决后我明白了,安全配置的每一个细节都不能马虎。
3. 跨域问题:前端页面能正常显示,但调用后端API时被浏览器拦截。最后通过在Controller上添加@CrossOrigin注解,或者在Nginx配置中添加跨域头解决了这个问题。
4. 端口被占用:有时候重启项目会发现端口还被占用,需要用netstat命令找到进程ID并杀掉。后来我学会了在开发工具中配置端口自动检测功能。
5. 部署后访问问题:项目部署到阿里云后,前端一直访问不了后端。检查了防火墙规则、端口开放情况,最后发现是后端配置文件中的地址还是localhost,改成服务器IP后才正常。
九、学习总结
回顾这学期的学习,我认为最重要的不是记住了多少API,而是了解了一个Web项目从0到1的完整开发流程,掌握了遇到问题时如何查找资料、分析解决的方法。这一学期的学习,从最小系统到能源系统,从本地部署到云端部署,我走完整了整个流程,收获颇丰。
项目运行访问效果

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)