第三节   后台布局搭建,代码可以人工智能来写,但是环境初步搭建需要我们先建起来,所以以下记录快带搭建的过程,

思路:

后台首页的搭建 第一   用到了element——UI 自带的页面布局组件,它就可以自动生成布局,左侧菜单用了了 <el-menu菜单

点击菜单高度是系统自带的,然后子菜单是写在 <el-menu-item-group>下面,每个菜单点击跳转的路由用的是to = 语法,详细请参看以下

以下代码为人工智能生成,经自己审核,参考代码为b站视视的部份文档
路由文件部份:
我们在写一面代码需要搞好环境,还需需要使用 Vue Router。以下是一个使用 Vue Router 的示例,展示了如何在点击菜单项时导航到不同的路由。
首先,确保您已经安装了 Vue Router 并在项目中进行了配置。以下是一个简单的 Vue Router 配置示文 件路由文件示例:// router.js
import Vue from 'vue';
import Router from 'vue-router';
Vue.use(Router);
export default new Router({
routes: [
{
path: '/',
name: 'Home',
component: () => import('@/views/Home.vue'),
},
{
path: '/admin',
name: 'Admin',
component: () => import('@/views/Admin.vue'),
},
{
path: '/user',
name: 'User',
component: () => import('@/views/User.vue'),
},
{
path: '/info',
name: 'Info',
component: () => import('@/views/Info.vue'),
},
],
}); 接下来,我们来解决左侧菜单的点击跳转,在我们的 Vue 组件中使用 `router-link` 来包裹菜单项,以便在点击时导航到对应的路由。
以下是示列的代码:顺便请注意看二级菜单在那儿,看看二级菜单的写法, ```html<template>
<div id="app">
<el-container>
<el-header style="background-color: #409EFF;">
<img src="@/assets/logo.png" alt="" style="width: 40px; position: relative; top: 10px;">
<span style="font-size: 20px; margin-left: 15px; color: white;">手拉手带小自做毕设</span>
</el-header>
<el-container>
<el-aside style="overflow: hidden; min-height: 100vh; background-color: #545c64; width: 250px;">
<el-menu
default-active="1"
background-color="#545c64"
text-color="#fff"
active-text-color="#ffd04b">
<router-link to="/">
<el-menu-item index="1">
<i class="el-icon-s-home"></i>
<span slot="title">系统首页</span>
</el-menu-item>
</router-link>
<el-submenu index="2">
<template slot="title">
<i class="el-icon-location"></i>
<span>用户管理</span>
</template>
<el-menu-item-group>
<router-link to="/admin">
<el-menu-item index="2-1">管理员信息</el-menu-item>
</router-link>
<router-link to="/user">
<el-menu-item index="2-2">用户信息</el-menu-item>
</router-link>
</el-menu-item-group>
</el-submenu>
<el-submenu index="3">
<template slot="title">
<i class="el-icon-location"></i>
<span>信息管理</span>
</template>
<el-menu-item-group>
<router-link to="/info">
<el-menu-item index="3-1">xxx信息</el-menu-item>
</router-link>
<router-link to="/info">
<el-menu-item index="3-2">yyy信息</el-menu-item>
</router-link>
</el-menu-item-group>
</el-submenu>
</el-menu>
</el-aside>
<el-main>
<!-- 主要内容区域 -->
<router-view/>
</el-main>
</el-container>
</el-container>
</div>
</template> 

  修改组件的样式,需要强制修改属性,比如

<style>
.el-menu
border-right: none !important;
</style>

  element-UI 的菜单加入路由模式  可以简化使用路由:

<el-container>
<el-aside style="overflow: hidden; min-height: 100vh; background-color: #545c64; width: 250px">
<el-menu :default-active="$route.path" router background-color="#545c64" text-color="#fff" active-text-color="#ffd04b">
<el-menu-item index="/"><i class="el-icon-s-promotion"></i><span slot="title">系统首页</span></el-menu-item>
<el-submenu index="2">
<template slot="title"><i class="el-icon-location"></i><span>用户管理</span></template>
<el-menu-item-group>
<el-menu-item index="/admiral">管理员信息</el-menu-item>
<el-menu-item index="/user">用户信息</el-menu-item>
</el-menu-item-group>
</el-submenu>
<el-submenu index="3">
<!-- submenu items here -->
</el-submenu>
</el-menu>
</el-aside>
</el-container>

  第二部份微信登陆部分,,以下二个方法可以单独用

方法一: uni_gtUserInfo   获取用户信息,这个方法好像可以直接使用

方法二   uni.login   这个方法主要获取微信的code

methods: {
wxLogin() {
// 调用 uni.getUserInfo 方法获取用户信息
uni.getUserInfo({
desc: '登录的数据', // 描述信息,用于说明为什么需要获取用户信息
success(ures) { // 获取用户信息成功后的回调函数
console.log(ures, '返回的用户信息'); // 打印用户信息
// 调用 uni.login 方法进行微信登录
uni.login({
success(lres) { // 登录成功后的回调函数
console.log(lres, '请求微信登录返回的数据'); // 打印登录返回的数据
let params = { code: lres.code }; // 从登录返回的数据中获取 code 参数
// 调用 loginByWechat 方法进行微信一键登录
loginByWechat(params).then(res => {
console.log(res, '微信一键登录返回的数据'); // 打印一键登录返回的数据
});
}
});
}
});
}
}

  第三部份  uniapp 请封装,

public class HutoolDemo f
public static void main(string[] args){/1 读取文件内容
string content = Fileutil.readutfgstring("example.txt");
System.out.println(content);
/1 写入文件内容
Fileutil.writeutfgstring("Hello, Hutool!","output.txt");
/1 复制文件
Fileutil.copy("source.txt","target.txt",true);

  

  1. 初始化请求配置:设置全局请求配置,包括根域名、跨域请求相关配置等。

    uni.$u.http.setConfig((config) => {
    // config 为默认全局配置
    // config.baseURL = 'http://uat.banlu.xuexiluxian.cn'; // 根域名 // 设置跨域请求相关配置
    config.withCredentials = true; // 允许携带凭证(如 cookies)
    config.headers['Access-Control-Allow-Origin'] = '*'; // 允许任何域名访问 return config;
    });
      1. 请求拦截器:在请求发送之前对请求进行处理,可以进行异步操作。

        uni.$u.http.interceptors.response.use(
        async (response) => {
        // 对响应成功做点什么,可以使用 async/await
        const data = response.data;
        return data;
        },
        (response) => {
        // 对响应错误做点什么(statusCode 1 == 200)
        return Promise.reject(response);
        }
        );

          使用示例:

        const http = uni.$u.http;
        
        // 商品分页
        export const goodsPage = (data) => http.get('/mall/goods/page', { params: data }); // 商品分类树
        export const categoryTree = (data) => http.get('/mall/category/tree', { params: data }); // 商品分类列表
        export const categoryList = (data) => http.get(`/mall/category/list/${data}`);
      2. 统一异常处理,可以解决有类他是无返回修值,但是我们又要返回的的时候可以用到自定定异常和统一异常

        @ControllerAdvice(basePackages = "com.example.controller")
        public class GlobalExceptionHandler {
        private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class); // 统一处理异常
        @ExceptionHandler(Exception.class)
        @ResponseBody
        public Result error(HttpServletRequest request, Exception e) {
        logger.error("异常信息:", e); // 打印异常信息
        return Result.error("系统异常"); // 返回错误信息
        } // 处理自定义异常
        @ExceptionHandler(CustomException.class)
        @ResponseBody
        public Result customError(HttpServletRequest request, CustomException e) {
        return Result.error(e.getMsg()); // 返回自定义异常的错误信息
        }
        } 
        自定义异常
        package com.example.exception;
        
        public class CustomException extends RuntimeException {
        private String msg; public CustomException(String msg) {
        this.msg = msg;
        } public String getMsg() {
        return msg;
        } public void setMsg(String msg) {
        this.msg = msg;
        }
        }

          

      3.   请求封装

        const request = axios.create({
        baseURL: "http://localhost:8080",
        timeout: 5000,
        }); // request 拦截器
        // 可以在请求发送前对请求进行一些处理,比如统一加 token,对请求数据进行加密等
        request.interceptors.request.use(
        (config) => {
        config.headers["Content-Type"] = "application/json;charset=utf-8";
        // config.headers["token"] = user.token; // 设置请求头
        return config;
        },
        (error) => {
        return Promise.reject(error);
        }
        ); // response 拦截器
        // 可以在接口响应后统一处理结果,比如对返回的数据进行解密等
        request.interceptors.response.use(
        (response) => {
        // response.data 即为后端返回的数据
        let res = response.data;
        // 兼容服务端返回的字符串形式数据
        if (typeof res === "string") {
        res = res ? JSON.parse(res) : res;
        }
        return res;
        },
        (error) => {
        console.log("err" + error); // for debug
        return Promise.reject(error);
        }
        );

          

    后端登陆示例:

    public void add(Admin admin) {
    // 1. 用户名一定要有,否则不让新增(后面需要用户名登录)
    if (admin.getName() == null || "".equals(admin.getName())) {
    throw new CustomException("用户名不能为空");
    } // 2. 进行重复性判断,同一名字的管理员不允许重复新增:只要根据用户名去数据库查询一下就可以了
    Admin user = adminDao.findByName(admin.getName());
    if (user != null) {
    // 说明已经有了,这里我们就要提示前台不允许新增了
    throw new CustomException("该用户名已存在,请更换用户名");
    } // 初始化一个密码
    if (admin.getPassword() == null) {
    admin.setPassword("123456");
    } adminDao.insertSelective(admin);
    } public void update(Admin admin) {
    adminDao.updateByPrimaryKeySelective(admin);
    }

      

    cn.hutool是一个 Java 工具类库,它提供了许多实用的工具类和方法,以帮助简化 Java 开发过程.。这个库包含许多常用的功能,如文件操作、日期处理、加密解密、JSON 处理等。以下是一些使用示例:
    1.引入依赖
    在 Maven 项目的 pom.xml 文件中添加以下依赖:

    public class HutoolDemo {
    public static void main(string[] args){/1 读取文件内容
    string content = Fileutil.readutfgstring("example.txt");
    System.out.println(content);
    /1 写入文件内容
    Fileutil.writeutfgstring("Hello, Hutool!","output.txt");
    /1 复制文件
    Fileutil.copy("source.txt","target.txt",true);

      

  2. JWT 使用,新建一个类 
    import javax.annotation.PostConstruct;
    import javax.annotation.Resource;
    import javax.servlet.http.HttpServletRequest;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Component;
    import org.springframework.web.context.request.RequestContextHolder;
    import org.springframework.web.context.request.ServletRequestAttributes;
    import com.auth0.jwt.JWT;
    import com.auth0.jwt.algorithms.Algorithm;
    import java.util.Date;
    import cn.hutool.core.date.DateUtil; @Component
    public class JwtTokenUtils {
    private static AdminService staticAdminService;
    private static final Logger log = LoggerFactory.getLogger(JwtTokenUtils.class); @Resource
    private AdminService adminService; @PostConstruct
    public void setUserService() {
    staticAdminService = adminService;
    } // 生成 token
    public static String genToken(String adminId, String sign) {
    return JWT.create()
    .withAudience(adminId) // 将 user id 保存到 token 里面,作为承载
    .withExpiresAt(DateUtil.offsetHour(new Date(), 2)) // 2 小时后 token 过期
    .sign(Algorithm.HMAC256(sign)); // 以 password 作为 token 的密钥
    } // 获取当前登录的用户信息
    public static Admin getCurrentUser() {
    String token = null;
    try {
    HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
    token = request.getHeader("token");
    if (StrUtil.isBlank(token)) {
    token = request.getParameter("token");
    if (StrUtil.isBlank(token)) {
    log.error("获取当前登录的 token 失败,token: {}", token);
    return null;
    }
    } // 解析 token,获取用户的 id
    String adminId = JWT.decode(token).getAudience().get(0);
    return staticAdminService.findByById(Integer.valueOf(adminId));
    } catch (Exception e) {
    log.error("获取当前登录的管理员信息失败,token: {}", token, e);
    return null;
    }
    }
    }

      

  3.   如果出现跨域头错误,后端加上配置   CorsConfig 类:

    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.cors.CorsConfiguration;
    import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
    import org.springframework.web.filter.CorsFilter; @Configuration
    public class CorsConfig { @Bean
    public CorsFilter corsFilter() {
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    CorsConfiguration corsConfiguration = new CorsConfiguration();
    corsConfiguration.addAllowedOrigin("*"); // 1. 设置允许访问的源地址
    corsConfiguration.addAllowedHeader("*"); // 2. 设置允许访问的源请求头
    corsConfiguration.addAllowedMethod("*"); // 3. 设置允许访问的源请求方法
    source.registerCorsConfiguration("/**", corsConfiguration); // 4. 对所有接口配置跨域设置
    return new CorsFilter(source);
    }
    }

      

      

jwt redis,微信登陆知识复习 uniapp 请求封装,统一异常处理 相关, HutoolDemo工具介绍)的更多相关文章

  1. uni-app中封装统一请求函数

    封装统一请求函数有利于项目的维护 整体功能简单实用,但小编遇到一个巨坑,项目中在vue文件使用跳转方法,url参数输入 "/" 后工具提示的路径为 "/pages/log ...

  2. uni-app 请求封装

    1.创建一个http.js ​ const baseUrl = 'http://192.168.1.188:8080'; const httpRequest = (opts, data) => ...

  3. 微信小程序HTTP接口请求封装

    1.方法封装(新建文件夹util,工具文件,在文件夹下创建request.js文件,用于对方法封装)request.js: var app = getApp(); //项目URL相同部分,减轻代码量, ...

  4. SpringBoot + JWT + Redis 开源知识社区系统

    「Java学习+面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识.准备 Java 面试,首选 JavaGuide!:https://javaguide.cn/ 你好,我是 Guide!这 ...

  5. 基于Shiro,JWT实现微信小程序登录完整例子

    小程序官方流程图如下,官方地址 : https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html ...

  6. Spring Security 解析(六) —— 基于JWT的单点登陆(SSO)开发及原理解析

    Spring Security 解析(六) -- 基于JWT的单点登陆(SSO)开发及原理解析   在学习Spring Cloud 时,遇到了授权服务oauth 相关内容时,总是一知半解,因此决定先把 ...

  7. springboot+jwt实现token登陆权限认证

    一 前言 此篇文章的内容也是学习不久,终于到周末有时间码一篇文章分享知识追寻者的粉丝们,学完本篇文章,读者将对token类的登陆认证流程有个全面的了解,可以动态搭建自己的登陆认证过程:对小项目而已是个 ...

  8. springSecurity + jwt + redis 前后端分离用户认证和授权

    记录一下使用springSecurity搭建用户认证和授权的代码... 技术栈使用springSecurity + redis + JWT + mybatisPlus 部分代码来自:https://b ...

  9. Android调用微信登陆、分享、支付

    前言:用了微信sdk各种痛苦,感觉比qq sdk调用麻烦多了,回调过于麻烦,还必须要在指定包名下的actvity进行回调,所以我在这里写一篇博客,有这个需求的朋友可以借鉴一下,以后自己别的项目有用到也 ...

  10. 微信小程序之微信登陆 —— 微信小程序教程系列(20)

    简介: 微信登陆,在新建一个微信小程序Hello World项目的时候,就可以看到项目中出现了我们的微信头像,其实这个Hello World项目,就有一个简化版的微信登陆.只不过是,还没有写入到咱们自 ...

随机推荐

  1. 公司es扩容kibana添加密码访问

    准备工作 基础优化[部署好的es无需操作,新server操作] setenforce 0 getenforce sed -i 's#^SELINUX=.*$#SELINUX=disabled#g' / ...

  2. wrk压测工具安装和使用

    wrk压测工具安装: mkdir wrk git clone https://github.com/wg/wrk.git cd wrk/ cp wrk /usr/sbin/ wrk压测工具使用 使用方 ...

  3. 在 Flask 项目中配置 Session:简明指南

    在 Flask 项目中配置 Session:简明指南 本文介绍如何在 Flask 项目中配置会话 1. Flask 内置会话 Flask 自带会话管理功能,使用客户端 Cookie 存储会话数据.默认 ...

  4. itest(爱测试) 开源接口测试,敏捷测试管理平台10.1.0发布

    一:itest work 简介 itest work 开源敏捷测试管理,包含极简的任务管理,测试管理,缺陷管理,测试环境管理,接口测试,接口Mock,还有压测 ,又有丰富的统计分析,8合1工作站.可按 ...

  5. idea 使用 mvn clean package 报错 Could not create local repository at

    使用 mac 版本的 idea 打包使用打包命令 mvn clean package 总是报错: [ERROR] Could not create local repository at /Repos ...

  6. (九)selenium实现12306模拟登录

    登陆的唯一困难在于验证码的识别,此处使用第三方平台超级鹰进行验证码识别. from selenium import webdriver import time from PIL import Imag ...

  7. OAuth + Security - 4 - 客户端信息存储数据库

    PS:此文章为系列文章,建议从第一篇开始阅读. 在之前的所有配置中,我们的客户端信息和授权码模式下的授权码任然还是存储在数据库中的,这样就不利于我们后期的扩展,所以在正式的生成环境中,我们一般将其存储 ...

  8. 算法金 | 一个强大的算法模型,GP !!

    大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 高斯过程算法是一种强大的非参数机器学习方法,广泛应用于回归.分类和优化等任务中.其核心 ...

  9. app备案

    最近app要求备案,使用阿里云备案 安卓可以上传apk获取信息,那么ios怎么弄呢 https://zhuanlan.zhihu.com/p/660738854?utm_id=0 查看的时候需要使用m ...

  10. 3D捕鱼大富翁源码分析

    ​ 今天接受了一个捕鱼的源码,技术栈采用: 客户端:Unity 服务端:Java 数据库:mysql 缓存:redis 先来几张成品图 ​编辑​编辑 ​编辑​编辑 ​编辑 在代码中看到有腾讯推广渠道, ...