范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

基于SpringBoot的项目以及功能实现

  1.项目介绍
  这是一个简单的项目练习,用于掌握新学习的SpringBoot技术。  项目操作界面
  技术栈
  Vue3+ElementPlus+Axios+MyBatisPlus+SpringBoot 前后端分离
  前后端分离开发,前端主体框架 Vue3 + 后端基础框架 SpringBoot  前端技术栈:Vue3+Axios+ElementPlus  后端技术栈:Spring Boot + MyBatisPlus  数据库-MySQL  项目的依赖管理-Maven  分页-MyBatis Plus 的分页插件  2.功能01-搭建Vue前端工程2.1代码实现
  以下过程,前面在讲解SSM_VUE项目时已经安装过了,包括整个vue项目的创建过程、项目结构,具体看SSM整合day02的功能01实现的笔记 先下载node.js LTS 并安装node.js的npm,用于管理前端项目包依赖  创建Vue项目(需要联网)  1)创建项目,指令  vue create <项目名>  2)选择 Manually select features  3)用空格键选择Bebel、Router、Vuex  4)选择3.x  5)Use history mode for router? 输入Y,回车  6)Where do you prefer placing config for Babel, ESLint, etc.? 选择In package. json  7)Save this as a preset for future projects? (y/N) 是否要保存当前的设置,根据你意思随意选择,如果选择了的话会有 Save preset as: 让你命名当前保存的设置  8)最后回车  9)创建完毕的显示结果如下  使用idea打开刚创建的vue项目,并配置项目启动  1)点击配置Configuration,配置npm方式启动项目  2)选择serve,其他保持默认,保存  3)点击运行,即可在提示的地址访问项目  停止项目,安装element-plus插件,在项目中运行指令  npm install element-plus --save  在vue.config.js中修改项目的端口,防止端口占用  module.exports = {    devServer: {        port: 10000//启动端口    }}3.功能02-创建项目基础界面
  这个功能步骤在ssm整合框架day01-功能02中也有详细描述,这里不再赘述 3.1需求分析
  页面原型:
  3.2思路分析
  使用vue3+ElementPlus完成  3.3代码实现
  (1)修改Home.vue,引入表单、搜索框、按钮组件  
  (2)删除HelloWorld.vue组件
  (3)创建components/Header.vue
  (4)创建全局的global.css(src/assets/css/global.css),以后有全局样式可以放在这里  * {    margin: 0;    padding: 0;    box-sizing: border-box;}
  (5)修改src/main.js,引入global.css,同时引入ElementPlus,顺便国际化  import {createApp} from "vue"import App from "./App.vue"import router from "./router"import store from "./store"//引入cssimport "@/assets/css/global.css" //引入ElementPlusimport ElementPlus from "element-plus"import "element-plus/dist/index.css"//国际化import zhCn from "element-plus/es/locale/lang/zh-cn" createApp(App).use(store).use(router).use(ElementPlus, {locale: zhCn}).mount("#app")
  (6)Header.vue,引入ElementPlus组件的下拉框  
  (7)创建侧边栏组件Aside.vue,引入导航菜单组件  
  (8)在App.vue将页面分成三部分  
  (9)项目的基本页面如下:
  4.功能03-创建SpringBoot后端项目4.1需求分析
  项目前后端分离情况如下:分成两个子项目(前端和后端),现在来完成后端的子项目创建。  4.2代码实现
  (1)创建maven项目,引入需要的依赖      spring-boot-starter-parent    org.springframework.boot    2.5.3                 org.springframework.boot        spring-boot-starter-web        2.5.3                    mysql        mysql-connector-java        8.0.26                    org.springframework.boot        spring-boot-configuration-processor                    org.projectlombok        lombok                    org.springframework.boot        spring-boot-starter-test                    com.alibaba        druid        1.1.17                    com.baomidou        mybatis-plus-boot-starter        3.4.3    
  (2)application.yml中配置port和配置DB连接信息  server:  port: 9090spring:  datasource:    driver-class-name: com.mysql.cj.jdbc.Driver    url: jdbc:mysql://localhost:3306/springboot_furn?useSSL=true&useUnicode=true&characterEncoding=UTF-8    username: root    password: 123456
  (3)主程序  @SpringBootApplicationpublic class Application {    public static void main(String[] args) {        SpringApplication.run(Application.class, args);    }}
  测试启动,运行成功:
  (4)配置数据源  package com.li.furn.config; import com.alibaba.druid.pool.DruidDataSource;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration; import javax.sql.DataSource; /** * @author 李 * @version 1.0 */@Configurationpublic class DruidInitConfig {    @ConfigurationProperties("spring.datasource")    @Bean    public DataSource getDataSource(){        DruidDataSource druidDataSource = new DruidDataSource();        return druidDataSource;    }}5.功能04-添加家居信息5.1需求分析
  在前端点击添加家居,弹出一个对话框,可以让我们填写家居的数据,填完之后点击确定,可以将数据发送到后端,然后保存到数据库表中。  5.2思路分析完成后台代码从mapper->service->controller,并第每层代码进行测试,到controller这一层,使用postman发送http请求完成测试。  完成前台代码,使用axios发送json数据给后台,实现添加家居信息  5.3代码实现5.3.1创建数据库和表-- 创建数据库DROP DATABASE IF EXISTS springboot_furn;CREATE DATABASE springboot_furn;USE springboot_furn; -- 创建表CREATE TABLE furn(`id` INT(11) PRIMARY KEY AUTO_INCREMENT,#id`name` VARCHAR(64) NOT NULL,#家居名`maker` VARCHAR(64) NOT NULL,#厂商`price` DECIMAL(11,2) NOT NULL,#价格`sales` INT(11) NOT NULL,#销量`stock` INT(11) NOT NULL#库存)CHARSET=utf8;
  5.3.2工具类
  (2)创建 com/li/furn/util/Result.java,该工具类用于返回结果(json 格式)  package com.li.furn.util; /** * @author 李 * @version 1.0 */public class Result {    private String code;//状态码 200-success 400-fail    private String msg;//状态说明    private T data;//返回的数据,使用泛型     public Result() {    }     public Result(T data) {        this.data = data;    }     //返回需要的result对象,表示成功    public static Result success() {        Result result = new Result<>();        result.setCode("200");        result.setMsg("success");        return result;    }     //返回成功的result对象,表示成功,同时携带数据    //如果需要在static方法中使用泛型,需要在static关键字后添加    public static  Result success(T data) {        Result result = new Result<>(data);        result.setCode("200");        result.setMsg("success");        return result;    }     //返回需要的result对象-表示失败    //因为失败的原因有很多中,因此直接将其作为参数传进来    public static Result error(String code, String msg) {        Result result = new Result<>();        result.setCode(code);        result.setMsg(msg);        return result;    }     //返回成功的result对象,表示失败,同时携带数据    public static  Result error(String code, String msg, T data) {        Result result = new Result<>(data);        result.setCode(code);        result.setMsg(msg);        return result;    }     public String getCode() {        return code;    }     public void setCode(String code) {        this.code = code;    }     public String getMsg() {        return msg;    }     public void setMsg(String msg) {        this.msg = msg;    }     public T getData() {        return data;    }     public void setData(T data) {        this.data = data;    }}5.3.3bean层
  创建furn表映射的bean--Furn.java  package com.li.furn.bean; import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor; /** * @author 李 * @version 1.0 */@Data@NoArgsConstructor@AllArgsConstructorpublic class Furn {    private Integer id;    private String name;    private String maker;    private double price;    private Integer sales;    private Integer stock;}5.3.4mapper层
  创建funMapper.java接口  package com.li.furn.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;import com.li.furn.bean.Furn;import org.apache.ibatis.annotations.Mapper; /** * @author 李 * @version 1.0 * 如果是MyBatisPlus,FurnMapper接口可以通过mp提供的BaseMapper接口来扩展功能 *///@Mapper 这里如果没有添加mapper注解,可以在主程序中指定扫描public interface FurnMapper extends BaseMapper {}
  如果使用@MapperScan(basePackages = "xxx") ,需要指定到确切的包
  测试FurnMapper接口  package com.li.furn; import com.li.furn.bean.Furn;import com.li.furn.mapper.FurnMapper;import org.junit.jupiter.api.Test;import org.springframework.boot.test.context.SpringBootTest; import javax.annotation.Resource; /** * @author 李 * @version 1.0 *///注意,测试时,如果测试的类和对应源码中的类的包名不同,需要手动指定@SpringBootTestpublic class FurnMapperTest {    //装配FurnMapper对象(实际上是该接口的代理对象)    @Resource    private FurnMapper furnMapper;     @Test    public void furnMapperTest() {        Furn furn = furnMapper.selectById(1);        System.out.println("furn=" + furn);    }}
  测试结果:
  5.3.5service层
  FurnService接口:  package com.li.furn.service; import com.baomidou.mybatisplus.extension.service.IService;import com.li.furn.bean.Furn; /** * @author 李 * @version 1.0 */ public interface FurnService extends IService {}
  FurnServiceImpl实现类:  package com.li.furn.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;import com.li.furn.bean.Furn;import com.li.furn.mapper.FurnMapper;import com.li.furn.service.FurnService;import org.springframework.stereotype.Service; /** * @author 李 * @version 1.0 */@Servicepublic class FurnServiceImpl        extends ServiceImpl        implements FurnService {}
  service层测试:测试成功  package com.li.furn;...    @SpringBootTestpublic class ApplicationTest {    @Resource    private FurnService furnService;     @Test    public void furnServiceTest() {        List furns = furnService.list();        for (Furn furn : furns) {            System.out.println("furn=" + furn);        }    }}
  5.3.6controller层
  注意:如果是以表单形式提交数据,则不需要在参数前添加@RequestBody注解;如果使用了@RequestBody注解,要注意测试时,向后端发送的数据是json格式(Content-Type)。 package com.li.furn.controller; import com.li.furn.bean.Furn;import com.li.furn.service.FurnService;import com.li.furn.util.Result;import lombok.extern.slf4j.Slf4j;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; /** * @author 李 * @version 1.0 * 因为当前项目为前后端分离,在默认情况下,前端发出请求 * 后端返回json数据,为了方便,我们就在类上使用@RestController */@RestController//ResponseBody+Controller@Slf4jpublic class FurnController {    @Resource    private FurnService furnService;     /**     * 完成添加添加家居信息的功能     *     * 1.因为前端发送的数据通常也是使用json格式的,     * 因此使用 @RequestBody 将前端提交的 json数据,封装成 Javabean 对象     * 2.如果前端是以表单形式提交的,则不能使用 @RequestBody     *     * @param furn     * @return     */    @PostMapping("/save")    public Result save(@RequestBody Furn furn) {        log.info("furn={}", furn);        furnService.save(furn);        return Result.success();//返回成功数据    }}
  postman进行测试:(注意Headers中的Content-Type属性要指定为"application/json",否则会出错)
  测试结果:
  数据库显示插入成功:
  5.3.7解决id自增长问题
  furn表的id字段被设计为自增长,但是当实际插入数据时,如果没有给定id的值,底层执行的时候将会报错:  org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: Could not set property "id" of "class com.li.furn.bean.Furn" with value "1640682391397732353" Cause: java.lang.IllegalArgumentException: argument type mismatch
  这是因为底层没有获取到自增长字段的值。我们可以使用@TableId来解决,该注解可以标识表的主键,并且如果指定的是自增主键,会将自增主键值返回到实体类中。
  Mybatis中需要使用 useGeneratedKeys,keyProperty,keyColumn 设置自增主键值的回返,在实体类对象中获取即可。在MybatisPlus中在进行数据新增时,在新增成功后,会自动的将自增的主键值返回到实体类对象中,前提是需要在实体类中使用@TableId表明主键字段,并且为自增类型。
  5.3.8前端代码
  (1)在前端项目中安装axios,用于发送ajax请求给后台:  npm i axios -S
  (2)创建工具文件src/utils/request.js,用于创建axios request对象  //引入axios// 如果在启动前端项目,提示找不到axios,把光标放在import axios from "axios" 的 "axios" 上// 会有一个修复提示,导入 axios,点击导入即可正常使用import axios from "axios";//通过axios创建对象-request对象,用于发送请求到后端const request = axios.create({    timeout: 5000}) //对request拦截器的处理//1.可以对请求做统一的处理//2.比如统一地加入token,Content-Type等request.interceptors.request.use(    config => {        config.headers["Content-Type"] = "application/json;charset=uft-8";        return config;    },    error => {        return Promise.reject(error)    }) //导出request对象export default request;
  (3)在Home.vue中添加表单,添加添加按钮,可以出现添加家居的对话框:代码略
  (4)解决跨域问题
  浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一不同,都是跨域。在前后端分离的模式下,前后端的域名是不一致的,此时就会发生跨域访问问题。在请求的过程中我们要想回去数据一般都post/get请求,所以跨域问题出现。
  解决跨域问题的方案很多,这里在vue.config.js文件中修改跨域配置来解决:
  const {defineConfig} = require("@vue/cli-service")module.exports = defineConfig({    transpileDependencies: true})module.exports = {    devServer: {        port: 10000,//启动端口        proxy: {//设置代理            "api/": {//设置拦截器 拦截器格式(斜杠+拦截器名字)                target: "http://localhost:9090",//目标地址(后端地址)                changeOrigin: true,//是否设置同源,实现跨域                pathRewrite: {//路径重写                    "/api": ""//选择忽略拦截器里面的单词                }            }        }    }}
  注意,设置之后需要重新启动前端项目。
  注意两点问题:  一定要确定 request.post("/api/save") 替换后是项目后台服务对应提供的API接口url,否则报404错误  当执行跨域请求时,如果浏览器仍然提示   http://localhost:9090/api/xxx

moto成新卷王,骁龙888Plus12512GB,价格只要2499元谁才是2022年的卷王之王,最近随着红米K50系列,以及真我GTNeo3的预热,让我们看到两大厂商的诚意,目标都是要冲着卷王来的。但是万万没想到半路杀出来一个Moto,以超高的性价红米K50K50Pro参数及价格红米K50Pro处理器天机9000屏幕6。67英寸AMOLED柔性直屏刷新率120Hz触控采样率480Hz扬声器立体双扬声器散热VC液冷散热运行内存LPDDR5UFS3。1电池容量涨价了!比亚迪追随特斯拉脚步,提高汽车价格特斯拉最近的涨价引起了很多关注,但涨价并非特斯拉独有。其他人也渐渐开始涨价。最近,中国最大的电动汽车制造商比亚迪也宣布了价格上涨(针对新订单)。3月16日,比亚迪插电式电动汽车价格油价调整消息今天3月18号,调整后各地929598汽油价格2022年第五次国内成品油价格调整刚刚结束,此次成品油零售限价落地后,92号汽油价格上调0。58元升,95号汽油价格上调0。62元升0号柴油价格上调0。61元升。这一轮油价调整经过黑洞的最深处是什么?是不是时间的尽头,学者给出不一样的结论文科学普查馆编辑科学普查馆如果黑洞进入太阳系我们的地球还会存在吗?如果一个比太阳系大30倍的黑洞来到太阳系会不会把整个太阳系给吸进去?黑洞的内部是什么地方呢?如果两个黑洞撞在一起会欧洲暂停火星探测器任务,切断与俄罗斯的联系欧洲航天局(ESA)一致投票决定暂停与俄罗斯的联合火星任务。该任务原定于今年晚些时候发射到这颗红色星球,但这次发射现在被无限期地搁置了。3月17日欧洲航天局理事会表示,由于自2月2没火箭用?欧空局火星车发射前却暂停了!俄将独立探索火星相信大家都还记得,在2020年7月那个火星探测器发射窗口有3个火星探测器先后发射升空,其中阿联酋的希望号探测器率先启程,我们的天问一号火星探测器紧随其后,美国的毅力号火星车最后发射欧俄火星探测器项目停泊艺术家的印象机器人漫游车旨在寻找火星上的生命决定已经作出。欧洲的火星探测器今年不会飞往这颗红色星球。由于乌克兰战争,欧洲航天局(Esa)成员国周四正式投票决定暂停与俄罗斯的联合任务科学家成功操纵暗态量子态,量子位存储时间提升500倍澎湃新闻记者王蕙蓉近日,科学家首次在超导量子电路中,成功操纵一种被称为暗态的量子态。暗态的鲁棒性(Robust,可意译为稳健性)约为单个超导量子电路的500倍,可用于量子模拟和量子性能与功耗兼顾,全新一代骁龙8移动平台手机成旗舰智能机模板用户在手机的选择上,一直受到性能与功耗的困扰。性能较高的手机往往功耗也十分夸张,如何平衡性能与功耗,是厂家首要考虑问题。但高通发布的全新一代骁龙8移动平台,凭借最新的4nm工艺技术陪伴成长,可以送孩子一些好玩的小游戏第一教育推出班主任系列,邀请沪上多所学校的班主任为家长们的带娃工作支招。游戏是孩子成长中绕不开的话题。游戏教育,也顺应孩子天性的发展。老师或者家长应该如何引导,让孩子从游戏中获益?
小体量有大作为山东众城保安服务有限公司锐意改革创新发展纪实中小企业能办大事。秉持着这样的理念,近年来,山东众城保安服务有限公司(以下简称山东众城)锐意改革奋发进取,在促进增长保障就业市场开拓科技创新等方面发挥了国有企业的重要作用。曾经,山大量玩家被封10年,拍卖行紧急关闭恭喜DNF拿下抖音热搜榜第八这两天的DNF可谓动静不小,一年一度的嘉年华将在26号来临,嘉年华的重要性不言而喻,明年的内容框架基本上就看这次嘉年华。史诗之路,巴卡妮,各种活动接踵而至,另外还有11。20极攻3三国杀为了土豪玩家的体验感,又一项针对穷人玩家的新功能出现大家好,我是戎马定半生。在游戏中,土豪玩家和穷人玩家一直是对立面,土豪玩家通过充钱体验快感,而这快乐是建立在穷人玩家身上。本以为卡牌游戏会平衡些,但三国杀移动版却出乎意料。近期,三游戏内外没钱无所谓,老大哥会出手,心灵终结拉丁同盟载具虽然国家穷,没法发展高科技,但是作为苏俄最忠诚的小弟,拉丁同盟还是将自己所剩不多的资金投入到军队,在有限的条件下,尽可能攒出有足够战斗力的部队,而老大哥也不吝啬提供自己已经被淘汰的网易与暴雪分手,游戏停服后,玩家虚拟财产怎么办?近日,网易与暴雪停止合作一事引起热议,大家最关心的,还是那我游戏里的钱怎么办啊?。游戏停服后,如何妥善处理玩家在游戏中虚拟财产的相关权益?本篇文章将从专业的角度为您解惑。作者张浩淼小鹏启动副业50亿元下场造电池?来源盖世汽车徐珊珊天眼查显示,广州鹏博汽车科技有限公司(以下简称鹏博汽车科技)于近日成立,法定代表人夏珩,注册资本50亿元。经营范围涵盖工程和技术研究和试验发展,汽车零部件及配件制新能源汽车国补退出倒计时,果断出手还是再等等?财政补贴政策一直被视为是推动新能源汽车产业发展的最重要的一环,事实也的确如此。2010年,国内启动新能源汽车补贴政策,接下来12年的新能源汽车产业高速发展我们都有目共睹。中国一跃成刀片电池八合一总成,能保证海豚的续航吗新能源车,比亚迪是专业的,相比秦宋唐等王朝系列,比亚迪又打造了一个全新的海洋系列,而海豚(图片配置询价),就是海洋系列的首款车型。第一次见到海豚的时候,觉得这就是一辆小型纯电动车,久立特材5。4亿押宝永兴材料暴赚39亿落袋投资收益12个月或兑现18亿长江商报消息长江商报记者蔡嘉久立特材(002318。SZ)点石成金,三年前的一笔投资,不仅助力永兴材料(002756。SZ)产业转型成功,也让自己获得不菲的投资收益。日前,久立特材七星瓢虫斑点样耐高压固态纳米材料研制成功SERS基底的扫描电子显微镜图像(表面银纳米颗粒分布形似七星瓢虫背部图案)。海洋所供图日前,中科院海洋研究所和中科院物理研究所合作,制备出类似七星瓢虫斑点样的银纳米颗粒的表面增强拉已飞233。1亿公里的飞船,最后传回一张照片,让人类重新审视自己综述世界是怎样的?这个问题萦绕人类心头已久,说它是世纪谜题都不为过。从古至今,从我们的祖先到我们这一代人类,关于这个问题的答案也都不一样。在古代,受到认识条件与认识水平的限制,地心