大家好,我是小面!
最近,网络上有好多播放量巨大的免费编程项目教程,很多初学编程的同学也可能都看过,这就导致了刚毕业的同学可能写在简历上的内容都差不多。
接下来,网络上就有了下面这张图:
那么这些 热门 项目到底怎么样?是否还值得我们去学习?我们又该怎么去学习呢?接下来,我就带大家盘一盘
从今天开始,小面会不定期地带大家学习和鉴定一些网络热门编程项目,希望能帮大家更快地选择适合自己的项目,少走弯路~
这是一个完整的前后端全栈外卖项目,包括用户前台 APP 和管理员后台。
用户前台 APP:
管理员后台:
用到的基本都是主流技术,没有冷门的~
前端:
后端:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<scope>compile</scope>
</dependency>
dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.76</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.23</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.1.1</version>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
部署:前后端不分离 jar 包部署或者 Nginx 部署前端
项目的定位是入门级教学项目,代码并不复杂,学过 Spring Boot 的同学应该可以快速上手:
项目代码
我们看到resource下有front和backend两个目录,分别对应网站的前台和后台,很明显这个项目是前后端不分离的
可以发现前端,除了使用三件套之外,还使用了vue.js、element-ui、axios请求库,这个技术可谓是相当的主流啊
好 下面我们试着在本地运行项目 首次执行项目前,我们要在自己的mysql数据库中执行初始化数据脚本,它会自动为我们建表并插入默认数据
我们打开resource目录下的application.yml配置, 把这个数据库的配置,还有缓存的配置改成我们自己本地的
接下来进入我们的主应用类,直接点击运行
可以看到项目启动成功了,感觉这个项目运行起来还是很方便的
接下来在地址栏输入http://localhost:8080/front/index.html
就可以访问网站的前台了,我们可以后台获取验证码,来完成用户登录
登录成功
输入http://localhost:8080/backend/访问管理后台
登录之后可以进行员工管理,分离管理,菜品管理,套餐管理,感觉功能还是比较完整的
下面再看看这个功能的代码写的怎么样 先看后端,感觉整个目录还是比较规范的
然后我们看一些代码细节 首先项目使用自定义业务异常类(CustomException)
并且配合了这个全局异常处理类(GlobalExceptionHandler),更加规范的管理异常
BaseContext,他是干啥的?
发现这里使用了ThreadLocal来封装我们的登录用户信息,这样我们只要在单个线程内多次获取用户信息的时候,就不用反复的从数据库或redis查询,直接从这个内存变量中去取就可以了
然后MyMetaObjectHandler这个类 做了什么呢?
我们插入数据的时候会自动从我们刚刚的这个ThreadLocal变量中取出当前用户的信息,填充给这个对象
这个R,这是一种我们请求的通用返回包装类,就是每个请求,除了我们本来的数据之外,还要额外返回状态码,以及一些错误信息
config里面mybatis配置,redis序列号啦,
还有springmvc的一些静态资源映射(支持访问前端页面)
然后controller处理类,这里有个细节,发现增删改查,使用请求方式不一样的
@Autowired
private AddressBookService addressBookService;
/**
* 保存地址/自定义方法
* @param addressBook 地址
* @return 地址
*/
@PostMapping
public R<AddressBook> addressBookSave(@RequestBody AddressBook addressBook) {
return addressBookService.addressBookSave(addressBook);
}
/**
* 更新地址/mp方法
* @param addressBook 地址
* @return 地址
*/
@PutMapping
public R<String> addressBookUpdate(@RequestBody AddressBook addressBook) {
addressBookService.updateById(addressBook);
return R.success("更新成功~");
}
/**
* 删除地址/mp方法
* @param ids id
* @return 信息
*/
@DeleteMapping
public R<String> addressBookDelete(Long ids) {
addressBookService.removeById(ids);
return R.success("地址删除成功~");
}
/**
* 设置默认地址/自定义方法
* @param addressBook 地址
* @return 地址
*/
@PutMapping("default")
public R<AddressBook> addressBookSetDefault(@RequestBody AddressBook addressBook) {
return addressBookService.addressBookSetDefault(addressBook);
}
/**
* 查询地址/mp方法
* @param id id
* @return 地址
*/
@GetMapping("/{id}")
public R<AddressBook> get(@PathVariable Long id) {
AddressBook addressBook = addressBookService.getById(id);
return addressBook != null ? R.success(addressBook) : R.error("没有找到该对象");
}
这里使用了一个restfulApi的写法,也是我们企业开发中常用的一种接口设计规范把>
对于套餐这类项目,经常被用户反复访问的高频数据,这里也用到了缓存来,其实就是用了spring cache的几个注解来更新缓存,查询缓存等等
filter:使用了传统的servlet来实现一个web拦截器,支持用户在访问这些请求的时候会自动判断一下是否有登录
mapper:除了继承于mybatisplus的baseMapper意外,其他一干二净,这说明什么?
这说明这个项目并没有用到复杂的sql,你看resources里面连这个mapper目录都没有,都没有自己写的sql
看到这里,我大概理解为什么这么多同学觉得自己sql能力差了这压根都不用自己写sql啊
业务逻辑层:这个类也是继承了通用的service,也没有自己写的方法
这一段就基本符合我们企业开发中讲到的业务逻辑了
这个项目的业务逻辑还是比较简单的,和我们实际的企业开发差距很大
最后还实现了一个短信发送工具类,然后这里也没有限制短信发送频率之类的
public class SMSUtils {
/**
* 发送短信
* @param signName 签名
* @param templateCode 模板
* @param phoneNumbers 手机号
* @param param 参数
*/
public static void sendMessage(String signName, String templateCode,String phoneNumbers,String param){
DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "", "");
IAcsClient client = new DefaultAcsClient(profile);
SendSmsRequest request = new SendSmsRequest();
request.setSysRegionId("cn-hangzhou");
request.setPhoneNumbers(phoneNumbers);
request.setSignName(signName);
request.setTemplateCode(templateCode);
request.setTemplateParam("{\"code\":\""+param+"\"}");
try {
SendSmsResponse response = client.getAcsResponse(request);
System.out.println("短信发送成功");
}catch (ClientException e) {
e.printStackTrace();
}
}
}
我估计在实际开发中,这么写你的赔光光 后台大概就这样了
前端我们简单看下吧
可以看到目录还是比较清晰的
request.js主要封装的一个自己写的axios,配置了全局的请求拦截器,响应拦截器
然后再api里存放所有的接口,看这个代码,写的还是比较工整的
单此处前端页面可能有点过时了,这个地方还是用的渐进式的Vue写法
也不能说过时吧,一般我们用vue的话,都是完完全全初始化一个新的工程
最后 我们来看下这个测试包
这里就显示的有一点点单薄了,就只写了一个测试类,我建议大家多写测试类,养成测试的好习惯
从学习的角度上来讲,这是一个不错的项目,还是很值得做的。
学完了 SpringMvc + Spring Boot 就可以学习该项目了,很适合你学完一堆技术之后,通过该项目来做一个整合应用练练手。
如果你已经学过项目中用到的技术了,只想做完这个项目,直接看源码,几天就能掌握了,没必要从头到尾看完一套视频。
另外,同类技术栈或业务逻辑的项目做 1 - 2 个就够了,不要一直停留在这种项目,止步不前 。