SSM项目
创始人
2025-05-31 18:43:29
0

创建一个vue工程:

cmd: vue create 项目名

npm run serve:访问vue工程

在终端安装路由: yarn add vue-router@4

创建一个路由文件夹,在文件夹下创建一个index.js文件:

//导入用来创建路由和确认路由模式的两个方法
import { createRouter,createWebHistory } from "vue-router";
/*** 定义路由信息*/
const routes=[];
//创建路由实例并传递routes配置
//我们在这里使用的是html5的路由模式,url中不带有#,部署项目的时候需要注意
const router=createRouter({history:createWebHistory(),routes,
})
//全局的路由守卫
router.beforeEach((to,from)=>{console.log(to);console.log(from);return true;
})
//将路由实例暴露
export default router

在main.js文件下全局安装(挂载)路由组件

import { createApp } from 'vue'
import App from './App.vue'
import router  from '@/router'let app=createApp(App);
app.use(router).mount('#app')

终端安装响应式数据:yarn add vuex

创建响应式数据目录store

在store文件夹下创建modules,在modules下创建user.js

在store文件夹下创建actions.js文件,用来实现异步操作的响应式数据

getters.js通过计算可以得到的一些数据

mutations.js基本的函数,无法实现异步操作

index.js主实例,创建vuex的实例

import {createStore} from "vuex"
import user from '@/store/modules/user'
import actions from '@/store/actions'
import mutations from '@/store/mutations'const store=createStore({modules:{user},actions,mutations,
});
export default store

然后需要去main.js中引入,全局安装vuex组件

import { createApp } from 'vue'
import App from './App.vue'
import router  from '@/router'
import store from '@/store'let app=createApp(App);
//全局安装(挂载)路由组件
//全局安装了VUEX组件
app.use(router).use(store).mount('#app')

引入axios,前后端需要发送请求:

创建一个api文件夹,所有与后端交互的都需要放置在api文件夹下

创建一个index.js文件:

import axios from 'axios'//创建axios实例
const request=axios.create({//axios中请求配置有baseURL选项,表示URL的公共部分baseURL:'http://localhost:8088',//超时时间:毫秒timeout:10000,//设置请求头Content-Type,规定前后端的交互使用jsonheaders:{'Content-Type':'application/json;charset=utf-8'},
});export default request

创建一个user.js(使用get请求,参数是params,使用post请求,参数是data):

import request from '@/api'//查询用户列表
export function listUser(query){return request({url:"/user",method:"get",params:query});
}
//新增用户
export function addUser(data){return request({url:"user",method:"post",data:data});
}

进入主页面APP.VUE里,创建钩子函数测试:

将listUser解构出来:

import { listUser } from '@/api/user';

创建一个钩子函数:

  mounted(){listUser().then(res=>{console.log(res);})}

启动服务:yarn serve

搭建终端:yarn add element-plus

在main.js中挂载ElementPlus:

import { createApp } from 'vue'
import App from './App.vue'
import router  from '@/router'
import store from '@/store'
import ElementPlus from 'element-plus'
//引入elementplus中的css样式
import 'element-plus/dist/index.css'let app=createApp(App);
//全局安装(挂载)路由组件
//全局安装了VUEX组件
//全局安装了ElementPlus组件
app.use(router).use(store).use(ElementPlus).mount('#app')

基于Vue3,面向设计师和开发师的组件库:

https://element-plus.gitee.io/zh-CN/component/button.html

后端工程的创建:修改打包方式

war

前后端的交互:

前后端交互会出现跨越性问题,需要添加一个注解:CrossOrigin(这种解决跨域问题的方式比较冒险)

vu自带一种代理,这种代理是可以解决跨域问题的。

在vue.config.js中配置一台代理主机:

const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({transpileDependencies: true,lintOnSave:false,//配置一台代理主机devServer:{port:80,proxy:"http://localhost:8088/"}
})

在api文件夹下的index.js修改url: baseURL:'http://localhost:80/ssm_back',

注意:这里的80是代理主机的端口号

需要将前后端界面路径对应起来。

案例:登录

创建一个登录界面:



在assets目录下创建一个文件夹style用来配置css样式

/*给当前网页进行一些初始化配置*/
html,
body{width: 100%;height: 100%;padding: 0;margin: 0;
}
#app{height: 100%;
}

当打开一个页面需要去处理一些请求响应,需要使用mounted钩子函数

打开一个页面,就要跳转到路由路径

  mounted(){this.$router.push({name:"login"})}

权限管理:

RBAC权限系统管理

RBAC模型:

Role-Based-Access-Control:谁是什么角色,有什么权限

分成3个基本部分:

  1. 用户

  1. 角色

  1. 权限

User(用户):每个用户都有唯一的UUID,赋予不同的角色

Role(角色):不同的角色有不同的权限

Permission(权限):访问权限

用户-角色:映射关系

角色-权限:映射关系

举例:

admin--管理员

  1. 创建用户

  1. 冻结用户

  1. 修改个人信息

  1. 查看个人简介

张三----普通用户

  1. 修改个人信息

  1. 查看个人简介

导入jedis依赖

redis.clientsjedis4.0.1

在application.xml中配置jedispool



minIdle:最小的存活数 maxIdle:最大存活数 maxTotal:总数

所有的局部数据变量用基本数据类型

整合redis:

如何使用jedisPool?

在redis里取放东西:

创建一个core包:

创建一个CustomObjectMapper.java类:

package com.jsoft.core;import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;import java.text.SimpleDateFormat;
import java.util.TimeZone;public class CustomObjectMapper extends ObjectMapper {public CustomObjectMapper() {super();//去掉默认的时间戳格式configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);//设置为东八区setTimeZone(TimeZone.getTimeZone("GMT+8"));//设置日期转换yyyy-MM-dd HH:mm:sssetDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));// 设置输入:禁止把POJO中值为null的字段映射到json字符串中configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false);// 空值不序列化setSerializationInclusion(JsonInclude.Include.NON_NULL);// 反序列化时,属性不存在的兼容处理getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);// 序列化枚举是以toString()来输出,默认false,即默认以name()来输出configure(SerializationFeature.WRITE_ENUMS_USING_TO_STRING, true);}
}

在core包下创建RedisTemplate类:

package com.jsoft.core;import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.exceptions.JedisException;import javax.annotation.Resource;@Component
@Slf4j
public class RedisTemplate {@Resourceprivate JedisPool jedisPool;@Resourceprivate  CustomObjectMapper customObjectMapper;/*** 向redis中保存字符串类型的数据* @param key redis中的key值* @param value redis中的value值* @param expire* @return*/public String set(String key, String value,long expire){Jedis jedis=jedisPool.getResource();String result=null;//设置key,value的时候同时设置过期时间的方法:setextry {result=jedis.setex(key,expire,value);} catch (JedisException e) {log.error("redis execution error",e);jedisPool.returnResource(jedis);//将连接归还}finally {jedisPool.returnResource(jedis);}return result;}/*** 根据给定的key值去redis查询对应的value* @param key* @return*/public String get(String key){Jedis jedis=jedisPool.getResource();String result=null;try {result=jedis.get(key);}catch (JedisException e) {log.error("redis execution error",e);jedisPool.returnResource(jedis);//将连接归还}finally {jedisPool.returnResource(jedis);}return  result;}/*** 将对象以序列化的方式存在与redis中,实际上就是以json格式保存到redis* @param key* @param value* @param expire* @return*/public String setObject(String key, Object value,long expire){//获取连接Jedis jedis=jedisPool.getResource();String result=null;try{//序列化的方法String jsonValue = customObjectMapper.writeValueAsString(value);if(expire<=0){result=jedis.set(key,jsonValue);}else{jedis.setex(key,expire,jsonValue);}}catch (JedisException | JsonProcessingException e) {log.error("redis execution error",e);jedisPool.returnResource(jedis);//将连接归还}finally {jedisPool.returnResource(jedis);}return  result;}//获取redis,TypeReference是Mybatis提供的类型依赖器,根据类型封装对象public  T getObject(String key, TypeReference typeReference){//获取连接Jedis jedis=jedisPool.getResource();T t=null;try{String result= jedis.get(key);t = customObjectMapper.readValue(result, typeReference);}catch (JedisException | JsonProcessingException e) {log.error("redis execution error",e);jedisPool.returnResource(jedis);//将连接归还}finally {jedisPool.returnResource(jedis);}return t;}
}

测试:

package com.jsoft.controller;import com.fasterxml.jackson.core.type.TypeReference;
import com.jsoft.core.RedisTemplate;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;
import java.util.Arrays;
import java.util.List;@RestController
@Slf4j
public class TestController {@Resourceprivate RedisTemplate redisTemplate;@GetMapping("test")public String test(){redisTemplate.setObject("map", Arrays.asList("aaa","bbb","ccc"),1000000000L);List map = redisTemplate.getObject("map", new TypeReference>() {});log.info("******************");log.info(map.toString());return  "hello ssm";}
}

UUID:token令牌。

引入依赖JSR303,可以用来限制实体类中的一些属性:

org.hibernate.validatorhibernate-validator6.1.7.Final
    @NotNull@Size(min=5,max=15,message="用户名的长度应该在5-15之间")private String nickName;

使用@Validated注解绑定JSR303

public ResponseEntity login(@RequestBody @Validated YdyhUser ydyhUser, BindingResult bingingResult) {//处理不合法的数据LoginUser loginUser=UserService.login(ydyhUser);}

导入UserAgent依赖,可以获取到浏览器版本信息以及操作系统的相关信息

eu.bitwalkerUserAgentUtils1.21

想获取当前的请求对象:

  //获取request对象
HttpServletRequest request=
((ServletRequestAttributes)(Objects.requireNonNull(RequestContextHolder.getRequestAttributes()))).getRequest();

根据网络IP地址查端口号:

whois.pconline.com.cn

    //测试使用java来发送HTTP请求public static void main(String[] args) {RestTemplate restTemplate=new RestTemplate();ResponseEntity forEntity = restTemplate.getForEntity("https://whois.pconline.com.cn/ipJson.jsp?ip=111.111.111.111&json=true",String.class);System.out.println(forEntity.getBody());}

相关内容

热门资讯

A股玻尿酸巨头出手!2700字... 医美龙头巨子生物“成分争议”风波持续发酵。日前,美妆博主大嘴博士(香港大学化学博士郝宇)发文,质疑巨...
计算机组成原理实验1---运算...     本实验为哈尔滨工业大学计算机组成原理实验,实验内容均为个人完成,...
3 ROS1通讯编程提高(1) 3 ROS1通讯编程提高3.1 使用VS Code编译ROS13.1.1 VS Code的安装和配置...
前端-session、jwt 目录:   (1)session (2&#x...
前端学习第三阶段-第4章 jQ... 4-1 jQuery介绍及常用API导读 01-jQuery入门导读 02-JavaScri...
EL表达式JSTL标签库 EL表达式     EL:Expression Language 表达式语言     ...
数字温湿度传感器DHT11模块... 模块实例https://blog.csdn.net/qq_38393591/article/deta...
【内网安全】 隧道搭建穿透上线... 文章目录内网穿透-Ngrok-入门-上线1、服务端配置:2、客户端连接服务端ÿ...
【Spring Cloud A... 文章目录前言Metadata元数据ClassMetadataSpring中常见的一些元注解Nacos...
React篇-关于React的... 一.简介1.介绍用于构建用户界面的 JavaScript 库2.创建项目(1)手动创建Documen...
win7 Pro 英文版添加中... win7pro x64英文版添加中文语言包1、下载语言包,并解压成lp.cab,复制到...
Android开发-Andro... 01  Android UI 1.1  UI 用户界面(User Interface,...
基于springboot教师人... 基于springboot教师人事档案管理系统【源码+论文】 开发语言:Jav...
编写软件界面的方式 本文重点解决如下问题:编写软件的界面有哪几种方式?通常情形下࿰...
keil调试专题篇 调试的前提是需要连接调试器比如STLINK。 然后点击菜单或者快捷图标均可进入调试模式。 如果前面...
GO语言小锤硬磕十三、数组与切... 数组用来保存一组相同类型的数据,go语言数组也分一维数组和多维数组。 直接上代码看一下...
三级数据库备考--数据库应用系... 1.数据库应用系统设计包括概念设计、逻辑设计、物理设计3个步骤,每个步骤的设计活动按照...
prometheus数据持久化... https://segmentfault.com/a/1190000015710814 promet...
孩子用什么样的灯对眼睛没有伤害... 现代社会高速发展,越来越多的人开始重视身体健康,尤其是很多家长ÿ...
微软Bing GPT支持AI绘... 我想要一张图片:大象、珊瑚、火山、云朵我想要一张图片:亚特兰蒂斯...