前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >这么巧,这个项目我也做过

这么巧,这个项目我也做过

作者头像
灬沙师弟
发布2024-04-10 09:59:40
730
发布2024-04-10 09:59:40
举报
文章被收录于专栏:Java面试教程Java面试教程

大家好,我是小面!

最近,网络上有好多播放量巨大的免费编程项目教程,很多初学编程的同学也可能都看过,这就导致了刚毕业的同学可能写在简历上的内容都差不多。

接下来,网络上就有了下面这张图:

那么这些 热门 项目到底怎么样?是否还值得我们去学习?我们又该怎么去学习呢?接下来,我就带大家盘一盘

从今天开始,小面会不定期地带大家学习和鉴定一些网络热门编程项目,希望能帮大家更快地选择适合自己的项目,少走弯路~

项目介绍

这是一个完整的前后端全栈外卖项目,包括用户前台 APP 和管理员后台。

用户前台 APP:

管理员后台:

使用技术

用到的基本都是主流技术,没有冷门的~

前端:

  • 原生 HTML
  • 渐进式 Vue
  • Axios
  • Element UI

后端:

  • Spring Boot,springmvc
代码语言:javascript
复制
<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>
  • MyBatis Plus
代码语言:javascript
复制
dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.2</version>
</dependency>
  • lombok注解方代码生成
代码语言:javascript
复制
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.20</version>
</dependency>
  • fastjson序列化库
代码语言:javascript
复制
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.76</version>
</dependency>
  • commons lang工具类
代码语言:javascript
复制
<dependency>
    <groupId>commons-lang</groupId>
    <artifactId>commons-lang</artifactId>
    <version>2.6</version>
</dependency>
  • mysql数据库
代码语言:javascript
复制
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>
  • 德鲁伊(Druid)数据库连接池
代码语言:javascript
复制
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.23</version>
</dependency>
  • spring data+redis+spring cache完成缓存
代码语言:javascript
复制
<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>
  • sharding-jdbc完成分库分表
代码语言:javascript
复制
<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
    <version>4.1.1</version>
</dependency>
  • Knife4j进行接口文档生成
代码语言:javascript
复制
<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处理类,这里有个细节,发现增删改查,使用请求方式不一样的

代码语言:javascript
复制
@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,也没有自己写的方法

这一段就基本符合我们企业开发中讲到的业务逻辑了

这个项目的业务逻辑还是比较简单的,和我们实际的企业开发差距很大

最后还实现了一个短信发送工具类,然后这里也没有限制短信发送频率之类的

代码语言:javascript
复制
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的话,都是完完全全初始化一个新的工程

测试包

最后 我们来看下这个测试包

这里就显示的有一点点单薄了,就只写了一个测试类,我建议大家多写测试类,养成测试的好习惯

优点

  • 该项目基本上把企业开发需要用到的主流基本技术都用到了
  • 目录结构规范,接口设计遵循 Restful 规范

从学习的角度上来讲,这是一个不错的项目,还是很值得做的。

不足

  • 该项目前后端没有完全分离开来,使用引入 js 的方式来渐进式 Vue写法 而不是独立的 Vue 前端工程
  • 该项目的业务逻辑并不复杂,而且最最关键的是没有自定义 的SQL 代码,无法通过这个项目提升自己的数据库应用能力
  • 该项目中没有遇到重难点问题、也没有特别的亮点,算中规中矩吧,所以想要凭这个项目进大厂的话,我觉得还有难度的。

学习建议

学完了 SpringMvc + Spring Boot 就可以学习该项目了,很适合你学完一堆技术之后,通过该项目来做一个整合应用练练手。

如果你已经学过项目中用到的技术了,只想做完这个项目,直接看源码,几天就能掌握了,没必要从头到尾看完一套视频。

另外,同类技术栈或业务逻辑的项目做 1 - 2 个就够了,不要一直停留在这种项目,止步不前 。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-03-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java面试教程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 项目介绍
  • 使用技术
  • 项目分析
    • 运行
      • 后端代码
        • 前端代码
          • 测试包
            • 优点
              • 不足
              • 学习建议
              相关产品与服务
              短信
              腾讯云短信(Short Message Service,SMS)可为广大企业级用户提供稳定可靠,安全合规的短信触达服务。用户可快速接入,调用 API / SDK 或者通过控制台即可发送,支持发送验证码、通知类短信和营销短信。国内验证短信秒级触达,99%到达率;国际/港澳台短信覆盖全球200+国家/地区,全球多服务站点,稳定可靠。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档