vue -前端传递对象到springboot后端,跳转页面并传递参数

由于对前端不是特别熟, vue也就学了一周,javascript也就是简单学了一两天,做个人博客的时候遇到一些不常用的方法,记一下笔记。

1. 构建对象,利用axios传递到后,跳转页面并传参

首先构建axios函数将对象传递到后端,由于是分页数据,需要在data对象里包含多个参数:

 //条件分页查询
 export const findPage = (params) => {
  return axios({
    method: 'post',
    url: `/findPage`,
    data: {
      sortView: "commentNum",  //暂时写死,按浏览量排序
      direction: "desc",       //暂时写死,倒序
      pageSize: params.pageSize,     //单页行数
      pageNum: params.currentPage,   //第几页
      title: params.title,           //查询的文章名称,后台会用模糊查询该名称
      categoryId:params.categoryId   //文章类别id,  后台会用精确查询该类别id  
      
   },

  })
}

在side.vue中使用该函数

<script>
//引入该函数
import {findPage} from '@/api/article'
export default {
   data(){
    return{
      routerList:[],
      tags: [],
      currentPage:1,   //当前显示页数
      pageSize:5, //单页条数
        
    }
  }, 
  methods:{
  	//点击某tag触发该函数,并传递categoryId
	 clickTag(categoryId){
        console.log(categoryId);
        //创建对象
        function Params(pageSize, currentPage,title,categoryId){
            this.pageSize = pageSize;
            this.currentPage = currentPage;
            this.title = title;
            this.categoryId = categoryId;
         }
         //显示第1页5条数据,不查询title,故令title=null
         var params = new Params(5,1,null,categoryId);

         findPage(params).then(res=>{
            //保存传递回来的结果数据
            this.routerList = res.content;
         })
         //通过路由跳转到“/articleList” ,同时传递categoryId
         this.$router.push({path: '/articleList', query: {categoryId: categoryId},})
     },
  },
  
}
</script>

在javascript中构建对象的方法有三种,我用的是构造函数的方法,其他方法都可以试一下,这里跳转页面并传递参数用的是 r o u t e r , router, routerrouter的用法详见我的博客。

路径“/articleList”对应的页面是ArticleList.vue,在该页面接收参数categoryId,这里设置一个监听

  watch:{
    //监听路由变化
    $route(to,from){
      if(to.query.categoryId!=null){
      	//将传递过来的categoryId保存起来
        this.categoryId=to.query.categoryId;
      }
      
    }

2. 后端springboot接收传递的对象

由于axios传递的对象都是json格式,所以需要注释@RequestBody

    @PostMapping("api/findPage")
    public Object findPage(@RequestBody JSONObject param) {
        //取出content,由于是json字符串,所以取出来都是String类型
        String sortView = param.getString("sortView");
        String direction = param.getString("direction");
        String pageSize = param.getString("pageSize");
        String pageNum = param.getString("pageNum");
        String title = param.getString("title");
        String categoryId = param.getString("categoryId");

		//这里用到了查询类ArticleQuery封装参数
        ArticleQuery aq=new ArticleQuery();
        aq.setSortView(sortView);
        aq.setDirection(direction);
        aq.setPageSize(Integer.valueOf(pageSize));
        aq.setPageNum(Integer.valueOf(pageNum));

        //判断title是否为null
        if (!StringUtils.isEmpty(title)) {
            aq.setTitle(title);
        }

        //判断categoryId是否为null
        if (!StringUtils.isEmpty(categoryId)) {
            aq.setCategoryId(Long.valueOf(categoryId));
        }

        //查询条件
        aq.setTitle(title);
        return articleService.findPage(aq);
    }

这里url为"api/findPage"是因为要解决跨域问题,跨域问题的解决见我的博客。

3.数组的简单用法

javascript中数组的用法,做一个简单笔记,我需要给传回来的行数据都加一列type,这个type只有5种类型,所以我采用轮循的方式添加,具体操作如下:

  queryAllCategory().then(res=>{
         console.log("========全部类别=========")
         //一共有5种类型
         var type=['','success','info','danger','warning'];
         var length=res.length;
         // 这里设置一个空数组,接收json
         var array = new Array();
         for( var i=0;i<5;i++){
            let name=res[i].name;
            let categoryId=res[i].categoryId;
            //采用轮循的方式赋值,i取余
            let tag=type[i%length];
            //创建一个json对象接收name,categoryId,tag三种参数
            var obj = {};
            obj['name'] = name;
            obj['categoryId'] = categoryId;
            obj['tag']=tag
            //将json对象压入空数组
            array.push(obj);
         }
         //保存该数组
         this.tags=array;

      })

3.总结

这里涉及到了javasrcipt中对象的创建vue中页面间跳转与传参,数组的用法,只是做一个笔记,巩固前端的知识!

<think>好的,我现在需要解决用户的问题:使用Vue3、Axios、Spring Boot和MyBatis实现登录后显示用户名的功能。首先,我得理清楚前后端的交互流程,以及每个部分需要做什么。 用户提到了登录成功后显示用户名,这通常涉及前端发送登录请求,后端验证用户信息,返回成功状态和用户数据,前端存储用户信息(比如用户名),然后在页面上显示出来。根据用户提供的引用内容,特别是引用[3]中的登录功能实现,后端Controller处理登录请求,检查数据库中的用户是否存在。不过引用[3]返回的是简单的字符串,而这里需要返回更多数据,比如用户名,以便前端显示。 首先,后端的部分可能需要调整。原来的登录接口返回的是"success"或者错误信息,但为了前端能获取用户名,应该返回一个包含用户信息的JSON对象,比如包含用户名。因此,需要修改Controller层的返回值,使用@ResponseBody或者@RestController来返回JSON数据。 然后,数据库查询部分,可能需要不仅仅检查用户是否存在,还要获取用户名。在MyBatis的Mapper中,查询语句应该返回用户对象,包含id、name等字段。这样Service层可以获取用户信息返回给Controller。 前端方面,Vue3中使用Axios发送POST请求到登录接口,处理响应结果。如果登录成功,需要将用户名保存到前端的存储中,比如Vuex或者Pinia状态管理,或者本地存储(localStorage/sessionStorage),然后在页面中显示出来。例如,在导航栏或欢迎页面显示“欢迎,用户名”。 接下来,考虑各个层级的代码结构: 后端: 1. 数据库:用户表需要有username和password字段,可能还有id。 2. MyBatis Mapper:编写根据用户名和密码查询用户的方法,返回用户对象。 3. Service层:调用Mapper,如果查询到用户,则返回用户信息;否则返回null或抛出异常。 4. Controller层:接收前端来的用户名和密码,调用Service,返回包含状态码、消息和用户数据的JSON。 前端: 1. 登录表单:使用Vue3的响应式数据绑定用户名和密码。 2. Axios请求:发送登录请求到后端,携带表单数据。 3. 处理响应:成功时存储用户信息,跳转到主页或其他页面,显示用户名。 4. 状态管理:可能需要使用Pinia或Composition API来管理用户状态,以便在不同组件中访问用户名。 还需要考虑跨域问题,确保前端Vue3应用和后端Spring Boot服务能够通信,可能需要在后端配置CORS。 根据引用[2]中的Axios示例,前端在methods中定义登录方法,发送请求,在响应处理中获取数据。例如,在Vue3的setup函数中使用axios.post,然后存储返回的用户名。 关于安全性,密码不应该明文输,应该使用HTTPS,后端应对密码进行加密存储,比如使用BCrypt加密,但用户的问题可能暂时不涉及这些细节,所以示例代码可能简化处理。 可能的代码步骤: 后端- 创建User实体类,包含id、username、password等字段。 - UserMapper接口,定义selectByUsernameAndPassword方法。 - UserService调用Mapper,返回User对象- LoginController处理/login请求,返回JSON,如{code: 200, message: "success", data: {username: "张三"}}。 前端- 使用Vue3的ref绑定表单输入。 - 登录函数中,axios.post发送用户名和密码。 - 响应成功后,将用户名保存到localStorage或Pinia store。 - 在主页组件中读取存储的用户名显示。 现在需要检查各个引用中的内容是否有帮助。引用[3]的Controller返回字符串,需要调整为返回JSON。引用[2]中的Axios示例是Vue2的,需要调整为Vue3的语法,比如使用composition API。 另外,用户提到Vue3,所以可能需要使用<script setup>语法,以及reactive或ref来管理状态。例如,使用reactive来保存用户信息,登录成功后更新状态,在模板中显示。 最后,确保前后端数据格式一致,比如登录请求的参数是JSON还是表单数据,后端Controller的参数接收方式是否正确。例如,使用@RequestParam或者@RequestBody来处理前端传递的数据。 可能遇到的问题包括跨域配置,Axios的请求配置(如Content-Type),以及后端是否正确处理请求。需要测试接口,确保返回正确的数据格式。</think>### 解决方案:Vue3 + Axios + SpringBoot + MyBatis 登录后显示用户名 #### 一、后端实现(SpringBoot + MyBatis) 1. **数据库表结构** ```sql CREATE TABLE t_user ( id INT PRIMARY KEY, username VARCHAR(50), password VARCHAR(50) ); INSERT INTO t_user VALUES (1, '张三', '123456'); ``` 2. **实体类** ```java // User.java @Data public class User { private Integer id; private String username; private String password; } ``` 3. **Mapper接口** ```java // UserMapper.java @Mapper public interface UserMapper { @Select("SELECT * FROM t_user WHERE username=#{username} AND password=#{password}") User selectByLogin(@Param("username") String username, @Param("password") String password); } ``` 4. **Controller层** ```java // LoginController.java @RestController public class LoginController { @Autowired private UserMapper userMapper; @PostMapping("/login") public Map<String, Object> login(@RequestBody Map<String, String> params) { User user = userMapper.selectByLogin(params.get("username"), params.get("password")); if (user != null) { return Map.of("code", 200, "data", user.getUsername(), "msg", "登录成功"); } return Map.of("code", 401, "msg", "账号或密码错误"); } } ``` #### 二、前端实现(Vue3 + Axios) 1. **登录组件(Login.vue)** ```vue <script setup> import { ref } from 'vue'; import axios from 'axios'; import { useRouter } from 'vue-router'; const formData = ref({ username: '', password: '' }); const router = useRouter(); const handleLogin = async () => { try { const response = await axios.post('http://localhost:8080/login', formData.value); if (response.data.code === 200) { localStorage.setItem('username', response.data.data); router.push('/dashboard'); } } catch (error) { console.error('登录失败:', error); } }; </script> <template> <form @submit.prevent="handleLogin"> <input v-model="formData.username" placeholder="用户名"> <input v-model="formData.password" type="password" placeholder="密码"> <button type="submit">登录</button> </form> </template> ``` 2. **主页组件(Dashboard.vue)** ```vue <script setup> import { ref } from 'vue'; const username = ref(localStorage.getItem('username') || ''); </script> <template> <h1>欢迎回来,{{ username }}</h1> </template> ``` #### 三、关键配置 1. **跨域配置(SpringBoot)** ```java // WebConfig.java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("http://localhost:5173") // Vue3 默认端口 .allowedMethods("*"); } } ``` 2. **Axios全局配置(main.js)** ```javascript import { createApp } from 'vue' import App from './App.vue' import axios from 'axios' const app = createApp(App) app.config.globalProperties.$axios = axios.create({ baseURL: 'http://localhost:8080', timeout: 5000 }) app.mount('#app') ``` #### 四、流程说明 1. 用户提交登录表单时,前端通过`axios.post`发送请求到`/login`接口 2. 后端验证通过后返回用户名数据(示例中存储到`localStorage`) 3. 页面跳转至仪表盘页面,通过`localStorage.getItem`读取用户名显示[^3][^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值