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

news2024/11/15 14:04:14

文章目录

      • 1、功能展示
      • 2、前端部分:VueAPI
      • 3、后端部分: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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/141532.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在Unity中实现MVC模式?

MVC是什么&#xff1f; ​ MVC即Model View Controller&#xff0c;是模型(model)【数据层】&#xff0d;视图(view)【表现层】&#xff0d;控制器(controller)【逻辑层】的缩写。主要应用于网站开发&#xff0c;在游戏开发方面&#xff0c;因为不同游戏的需求、功能不尽相同&…

数字化转型迫在眉睫,企业应该如何面对?

火热的数字化转型&#xff0c;在国企、央企公布数字化转型规划后&#xff0c;进一步向各行各业开始扩散&#xff0c;吸引了很多对于数字化并不熟悉的企业。这些企业大多没有一个确定的目标&#xff0c;只是想要让企业完成转型改革&#xff0c;所以对于怎样做没有什么好的规划。…

Unity3d C#实现基于SocketIOUnity的与后端(node.js为例)Socket通信功能(含工程)

#前言 该功能主要是项目上的需求&#xff0c;按后端的需求就是我们通过SocketIO进行通信&#xff0c;之前游戏通信功能大多是基于原始的Socket进行封装&#xff0c;需要对包体进行设计&#xff0c;还需要粘包拆包等系列操作&#xff0c;属实有点麻烦。这次尝试了SocketIOUnity的…

Exynos_4412——RTC实验

目录 一、ADC小作业 二、RTC简介 三、Exynos_4412下的RTC控制器 四、RTC中的寄存器 五、RTC编程 六、RTC小作业 一、ADC小作业 电压在1501mv~1800mv时&#xff0c;LED2、LED3、LED4、LED5点亮 电压在1001mv~1500mv时&#xff0c;LED2、LED3、LED4点亮 电压在501mv~1000m…

什么是芯片老化测试?芯片老化测试系统NSAT-2000解决方案

随着半导体电子技术的进步&#xff0c;老化测试已成为保证产品质量的关键流程。除了半导体元件外&#xff0c;PCB、IC 和处理器部件也都需要在老化条件下进行测试。本篇文章纳米软件Namisoft小编将带大家分享一下关于芯片老化测试系统的相关知识。 一、什么是芯片老化测试&…

开发工具篇第十二讲:常用开发库 - Lombok工具库详解

开发工具篇第十二讲&#xff1a;常用开发库 - Lombok工具库详解 Lombok是一款非常实用Java工具&#xff0c;可用来帮助开发人员消除Java的冗长代码&#xff0c;尤其是对于简单的Java对象&#xff08;POJO&#xff09;。实际上我并不推荐使用Lombok&#xff08;不主动使用它&…

CANoe测试TC8

OPEN联盟发布的TC8是目前行业内关于车载以太网的标准测试规范之一。 CANoe环境需要硬件和软件: 硬件是CANoe设备&#xff0c;用来连接电脑和DUT&#xff0c;TC8测试的是以太&#xff0c;那么CANoe设备必须支持以太才行&#xff0c;目前VN5640以上都是支持的。 软件需要安装CANo…

对git rebase 和git merge的理解

一、是什么 在使用 git 进行版本管理的项目中&#xff0c;当完成一个特性的开发并将其合并到 master 分支时&#xff0c;会有两种方式&#xff1a; git mergegit rebase git rebase 与 git merge都有相同的作用&#xff0c;都是将一个分支的提交合并到另一分支上&#xff0c;…

物联网技术在地下综合管廊智能化建设中的应用实例分析

摘 要:物联网是21世纪传感技术、通信技术、信息技术的应用大集成利用物联网技术实现地下综合管廊的智能化管理符合经济和城市规划发展的需要分析了物联网技术的特点及地下综合管廊建设中物联网技术的应用并结合物联网技术在地下综合管廊建设的应用实例对物联网技术在地下综合…

Qt扫盲-Windows任务栏使用总结

Qt扫盲-Windows任务栏使用总结一、概述二、覆盖图标和进度指示器三、跳转列表四、缩略图工具栏一、概述 任务栏为用户提供了访问桌面上打开的应用程序的权限。Windows自动在任务栏上创建用于访问应用程序窗口的按钮。 从 Windows 7到Windows10 都有效果。就是在任务栏上的一个…

基于springboot框架个人博客管理系统

一、项目简介 本项目是一套基于springboot框架实现的个人博客管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&a…

头歌:UDP Ping程序实现 客户端创建UDP套接字

头歌平台&#xff1a;头歌实践教学平台 (educoder.net)创建数据包套接字套接字 Socket 实质上提供了主机间进程通信的连接点。进程通信之前&#xff0c;双方首先必须各自创建一个连接点,否则是没有办法建立联系并相互通信的。一个完整的 Socket {协议,本地地址,本地端口,远程地…

在 React 中使用 i18next

1. 安装依赖 npm i i18next react-i18next i18next-browser-languagedetectori18next 提供了翻译的基本能力。react-i18next 是 i18next 的一个插件&#xff0c;用来降低 react 的使用成本。i18next-browser-languagedetector 是用来检测浏览器语言的插件。 2. 在src下创建i18…

.net core 中使用confluent kafka构建生产者

创建.net 6 API安装依赖包 创建kafka生产者 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Confluent.Kafka; using Confluent.Kafka.Admin; using KafkaHelper.Config; using Microsoft.Exte…

Cuk拓扑产生负压

1、基础拓扑的输入输出电流连续情况 1>Buck电路 图中绿色波形为输入端的电流&#xff08;测的图中MOS上的电流&#xff09;&#xff0c;蓝色的输出端的电流&#xff08;图中电感L4的电流&#xff09;&#xff0c;可以看出输入端电流不连续&#xff0c;输出端电流连续。 2&…

Revit中项目特别大如何将项目完整的体现在图纸中?

一、Revit中项目特别大如何将项目完整的体现在图纸中? 遇到项目特别大&#xff0c;在一张图纸是放置不下时&#xff0c;如图1所示&#xff0c;怎样才能将项目完整的体现在图纸当中? 在遇到特别大的项目可能会在图纸中放不下&#xff0c;在这种情况下我们要用拼接线来处理。在…

【JavaEE】SSM框架

文章目录一、Spring1、Spring相关概念1.1 Spring Framework系统架构1.2 核心概念(lOC、lOC容器、Bean、DI)2、入门案例2.1 IOC入门案例2.2 DI入门案例3、lOC相关内容3.1 bean配置3.2 bean实例化3.3 bean的生命周期3.3.1 控制bean生命周期执行的方法3.3.2 bean销毁时机4、DI相关…

AI智能分析在智慧电厂的典型应用

电力供应是整个社会生产、人民生活的基本保证之一。智慧电力作为城市智能化发展的客观需求&#xff0c;是智慧城市的重要基础&#xff0c;也是智慧城市建设的一项重要内容。 智慧能源用最前沿技术淋漓尽致地表达着对未来能源发展趋势的理解与实践。智慧电力将多项创新成果应用于…

【前端】Vue项目:旅游App-(6)city:隐藏TabBar的2种方法

文章目录目标过程与代码方法1&#xff1a;通过路由隐藏方法2&#xff1a;用样式隐藏对方法2封装总代码修改的文件common.cssindex.jscity.vue目标 city页是点击上篇“广州”位置所跳转的页面。此页面要隐藏TabBar。 过程与代码 city页要隐藏TabBar。我们这里有两种隐藏的方法…

【Effective Objective - C】—— 读书笔记(五)

【Effective Objective - C】—— 读书笔记&#xff08;五&#xff09; 内存管理 文章目录【Effective Objective - C】—— 读书笔记&#xff08;五&#xff09;内存管理29.理解引用计数引用计数工作原理属性存取方法中的内存管理自动释放池保留环要点30.以ARC简化引用计数使…