Vue+Springboot综合程序设计后端部分实现(含跨越访问)

Posted 小哈里

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vue+Springboot综合程序设计后端部分实现(含跨越访问)相关的知识,希望对你有一定的参考价值。

文章目录

1、功能展示

大致分为用户管理,商品管理,收藏管理,购物车管理,订单管理五个模块。






2、前端部分:VueAPI

Vue 使用 axios 库进行网络请求,登录成功后将用户信息存储到localstorage中,供每次使用时调用,退出时清空信息。

import axios from "axios";
axios(
    headers: 'Content-Type':'application/json',
    method: 'post',
    url: 'http://xxxx:9090/user/login',
    data: JSON.stringify(
        username: this.username,
        password: this.password,
    ),
).then(function(return_data)
    const res = return_data.data;
    console.log(res)
    if(res.message == "success")
        _this.$message(
            message: "登录成功",
            type: "success",
        );
        //登录成功后存储用户信息
        localStorage.setItem("access", JSON.stringify(res));
        that.$router.push(path:'/wode');
    else
        _this.$message.error(
            message: "登录失败,用户名或密码错误",
        );
    
)

将请求获得的信息通过Data返回到Temple中

export default 
    data()
        var shopping = JSON.parse(window.localStorage.getItem("shopping"))
        return 
            list: shopping, //XX数据
        
    ,
    methods: 
        onSubmit() console.log(6); ,  //XX函数
    ,
    mounted ()   this.getdatas()  //每次启动时执行
;

Temple中支持调用data的数据和methods函数

通过v-for遍历list,在页面中访问list的数据, @click调用函数

<div id="box2-1"  v-for="(item,index) in list" :key="index">
    <p id="box2-11">item.dianpu</p>
    <van-button id="del" @click="onClickDel(item.name,item.dianpu)">删除</van-button>
    <img v-bind:src="item.photo" alt="jumi" width="80" height="80" id="box2-12">
    <p id="box2-13">item.name</p>
    <p id="box2-14">item.jieshao</p>
    <p id="box2-15">¥item.price</p>
    </el-input-number>
</div>

配置浏览器跨越访问,请求服务端的API

//vue.config.js
const  defineConfig  = require('@vue/cli-service')
module.exports = defineConfig(
	transpileDependencies: true,
	devServer: 
		allowedHosts: "all",
		port:9999,
		proxy:    
            '/api':     
                target: "http://xxxxx.cn",
                changOrigin: true,   //接口跨域
                pathRewrite:  '^/api': '/' 
			
		
	
)

3、后端部分:Springboot

使用的技术栈

Spring Boot,mysql,MyBatis,Spring Security,Redis

开发工具:

  • 云服务器 CentOS 7.9 位于腾讯云上海(公网展示)

  • 云数据库 RDS Mysql 8.0 位于阿里云杭州(部署时无需迁移数据库)

  • 本地使用 Navicat连接远程数据库并在本地进行开发和测试

  • API测试成功后将后端项目打包为jar部署到服务器上

  • API接口管理与测试采用eolink

  • 后端开发使用IntelliJ IDEA和 JDK1.8 进行

业务逻辑实现

  • 采用Springboot三层架构
  • Controller层实现业务控制,提供API接口访问
  • Service层实现业务逻辑,比如订单的创建,用户的认证和判断。
  • Dao层实现数据持久化,与MyBatis的mapper一对一绑定,完成数据库CURD操作。
  • entity层维护数据库表的实体类,并且其他三层中调用。
//Controller层
@Controller
public class OrderController 
    // 订单服务
    @Autowired
    private OrderDao orderDao;
    @Autowired
    private ShoppingService shoppingService;

    // 获取指定用户的订单
    @GetMapping("/getorder")
    @ResponseBody
    public List<Order> getorder(@RequestParam("username") String username) 
        return orderDao.getorder(username);
    

    // 从购物车创建订单并删除商品
    @PostMapping("/makeorder")
    @ResponseBody
    public boolean makeorder(@RequestBody Map<String,Object> params) 
        String username = params.get("username").toString();
        return shoppingService.makeorder(username);
    


// Service层
@Service
public class ThingServiceImpl implements ThingService 
    @Autowired
    private ThingDao thingDao;

    @Override
    public List<Thing> getthings() 
        return thingDao.getthings();
    

    @Override
    public List<Thing> searchthings(String name)
        return thingDao.searchthings("%"+name+"%");
    

    @Override
    public  Thing idsget(int ids)
        return thingDao.idsget(ids);
    


// Dao层
@Repository
public interface ThingDao 
    // 获取全部的商品
    List<Thing> getthings();

    // 搜索包含对应名称的商品
    List<Thing> searchthings(@Param("name") String name);

    // 查询唯一商品名称
    Thing querythings(@Param("name") String name);

    // 根据ids获取商品
    Thing idsget(@Param("ids") int ids);



// MyBatis
<!--绑定一个对应的Dao/Map接口-->
<mapper namespace="com.farm.dao.OrderDao">
    <!--获取指定用户的订单-->
    <select id="getorder" resultType="com.farm.entity.Order">
        select orderid, username, mess, price, photo from orders
        where username = #username
    </select>

    <!--获取最大的用户id-->
    <select id="getnewid" resultType="java.lang.Integer">
        select MAX(orderid) from orders limit 1
    </select>

    <!--从购物车创建订单-->
    <insert id="makeorder" >
        insert into orders(orderid, username, mess, price, photo)
        values(#orderid,#username,#mess, #price, #photo)
    </insert>

</mapper>


安全验证的实现

  • 采用Spring Security的JSON Web Token (JWT)插件进行认证与授权,在信息安全上有一定保证。
  • 采用Redis数据库进行token验证,提高性能并减少计算量。
  • 用户登录时生成token签名,并存储在Redis中,每次操作前检查redis中是否存在对应token。
// JWT 工具类
public static String createJWT(String jwtSec, long ttlMillis, String username) 
    // 指定签名的时候使用的签名算法,也就是header那部分
    SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
    long nowMillis = System.currentTimeMillis();
    Date now = new Date(nowMillis);

    // 创建payload的私有声明
    Map<String, Object> claims = new HashMap<String, Object>();
    claims.put("username", username);

    // 添加payload声明
    // 设置jwt的body
    JwtBuilder builder = Jwts.builder()
        .setClaims(claims)
        .setId(UUID.randomUUID().toString())
        .setIssuedAt(now)
        .setSubject(username)
        .signWith(signatureAlgorithm, jwtSec.getBytes(StandardCharsets.UTF_8));
    if (ttlMillis >= 0) 
        long expMillis = nowMillis + ttlMillis;
        Date exp = new Date(expMillis);
        // 设置过期时间
        builder.setExpiration(exp);
    
    return builder.compact();



//redis 工具类
//指定缓存失效时间
public boolean expire(String key, long time) 
    try 
        if (time > 0) 
            redisTemplate.expire(key, time, TimeUnit.SECONDS);
        
        return true;
     catch (Exception e) 
        e.printStackTrace();
        return false;
    

//删除缓存
public void del(String... key) 
    if (key != null && key.length > 0) 
        if (key.length == 1) 
            redisTemplate.delete(key[0]);
         else 
            redisTemplate.delete(Arrays.asList(key));
        
    

//缓存获取
public Object get(String key) 
    return key == null ? null : redisTemplate.opsForValue().get(key);

//普通缓存放入并设置时间
public boolean set(String key, Object value, long time) 
    try 
        if (time > 0) 
            redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
         else 
            set(key, value);
        
        return true;
     catch (Exception e) 
        e.printStackTrace();
        return false;
    

常见的API报错码

400: 语法无效, 如JSON参数不对。
415: 不支持其有效载荷的格式, 如没放请求头。
403: 资源不可用, 服务器拒绝处理,如目录访问错。
500: 内部错误,后端代码实现问题。
404: 请求不存在,如服务器没有对应API。

以上是关于Vue+Springboot综合程序设计后端部分实现(含跨越访问)的主要内容,如果未能解决你的问题,请参考以下文章

登录综合案例01,前端使用vue+elementui+axios 后端 springboot+mybatis-plus+swagger2

登录综合案例03,分配角色,分配权限,前端使用vue+elementui+axios 后端 springboot+mybatis-plus+swagger2

登录综合案例02,退出完善,菜单权限,以及遇到的一些问题,前端使用vue+elementui+axios 后端 springboot+mybatis-plus+swagger2,

计算机毕业设计之java+springboot基于vue的学生综合测评系统

java计算机毕业设计springboot+vue燕京理工学院学生综合服务系统

还不会做毕业设计?-学生信息管理系统(springboot+vue前后端分离实)详细设计和实现