IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 京淘(二)---- 用户登录、左侧菜单拉取、用户状态修改、新增 -> 正文阅读

[JavaScript知识库]京淘(二)---- 用户登录、左侧菜单拉取、用户状态修改、新增

目录

一、用户登录实现

1)用户数据存储

1、业务说明

2、Session?

3.Cookie

二、系统首页跳转

1)系统首页跳转说明

1、JS实现页面跳转

?三、左侧菜单获取

1)项目介绍

1、表设计说明

2、编辑Rights的POJO

3、构建层级代码结构

4、关于端口号说明

2)实现左侧菜单

1、编辑页面JS

2、 接口文档说明

3、编辑RightsController

4、编辑RightsServiceImpl

3)左侧菜单的跳转说明

1、编辑路由机制

2、?ElementUI 基本用法

四、用户管理实现

1)用户管理后台搭建

1、表设计

2、User的POJO设计

3、页面调用JS

4、用户查询的业务接口文档(以MP方式实现分页查询? API调用)

5、封装PageResult

6、编辑UserController

7、编辑UserServiceImpl

9、编辑配置类

10、分页效果图

2)用户状态修改?

1、业务接口文档

2、页面JS

?3、编辑UserController

3)用户新增

1、用户JS分析

2、业务接口文档

3、编辑UserController

4、编辑UserService


一、用户登录实现

1)用户数据存储

1、业务说明

根据登录需求,后台服务器返回SysResult对象,其中data表示 token的记录.
规则: 服务器返回的响应的数据应该采用一种特殊的方式进行保存.否则用户的数据将会丢失.

{status: 200, msg: "服务器处理成功", data: "4edf7d1fbe2f4b14bc7227c85b4998b3"}

2、Session?

1. Session 是会话控制
2. Session可以用户存储数据
3.?Session生命周期整个会话?在会话期间数据有效, 如果会话窗口关闭 则数据清除.
4. Session数据存储在浏览器的内存中(前端的)

3.Cookie

1. Cookie 是一个文本文件
2. Cookie 存储的是用户信息 (加密数据 更加安全)
3. Cookie 保存到用户的计算机终端中?可以临时/永久的存储信息.

?

?

二、系统首页跳转

1)系统首页跳转说明

1、JS实现页面跳转

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2)路由导航守卫

//配置路由对象
const router = new VueRouter({
  routes
})

/* 配置路由导航守卫 控制权限
  1.to 要跳转的网址
  2.from 请求从哪里来
  3.next 回调函数  放行/跳转
 */
router.beforeEach((to,from,next) => {
  //1.如果用户访问 /login  请求应该放行 终止程序
  if(to.path === '/login') {
    return next()
  }

  //2.如果用户访问不是login 则需要校验是否登录 检查是否有token
  let token = window.sessionStorage.getItem('token')
  if(token !== null && token.length > 0){
    return next()
  }else {
    //没有token 应该跳转到登录页面 "/login"
    return next("/login")
  }
})

?

?

?三、左侧菜单获取

1)项目介绍

1、表设计说明

说明: 如果查询所有的一级菜单 则parent_id = 0
如果查询二级菜单信息 则parent_id = 1级菜单的ID
如果查询三级菜单信息 则parent_id= 2级菜单的ID

2、编辑Rights的POJO

3、构建层级代码结构

在这里插入图片描述

4、关于端口号说明

8000端口: VUE UI vue客户端管理器所有占用的端口.
8080端口: jtadmin 脚手架项目启动时占用的端口号
8091端口: 后台SpringBoot业务系统的端口号

2)实现左侧菜单

1、编辑页面JS

说明:当页面访问时,根据生命周期函数,调用getMenuList()方法.从后台的服务器获取菜单列表信息. JS如下.

在这里插入图片描述

2、 接口文档说明

说明: 左侧菜单需要获取2级菜单信息.
二级菜单封装到一级菜单的children属性中.

在这里插入图片描述

3、编辑RightsController

@RestController
@CrossOrigin
@RequestMapping("/rights")
public class RightsController {

    @Autowired
    private RightsService rightsService;

    //demo测试 获取全部列表信息
    @RequestMapping("/getAll")
    public List<Rights> getAll(){

        return rightsService.getAll();
    }

    /**
     * 需求: 查询2级菜单结构,并且封装为List集合
     * URL: /rights/getRightsList
     * 参数: 暂时没有
     * 请求类型: get
     * 返回值: SysResult对象(list集合)
     */
    @GetMapping("/getRightsList")
    public SysResult getRightsList(){

        List<Rights> rightsList = rightsService.getRightsList();
        return SysResult.success(rightsList);
    }

}

4、编辑RightsServiceImpl

@Service
public class RightsServiceImpl implements RightsService{

    @Autowired
    private RightsMapper rightsMapper;


    @Override
    public List<Rights> getAll() {
        //查询全部不需要条件
        return rightsMapper.selectList(null);
    }

    /**
     * 需求: 查询2级菜单信息.
     * 步骤:
     *      1.查询一级菜单信息 parent_id = 0
     *      2.查询二级菜单信息 parent_id = 一级菜单ID
     *      3.将二级菜单封装到一级菜单中.
     *  查询方式:
     *          1.利用java循环实现2级封装.
     *          2.利用Mybatis的封装的方式实现查询 resultMap 自己练习
     * @return
     */
    @Override
    public List<Rights> getRightsList() {
        QueryWrapper queryWrapper = new QueryWrapper();
        queryWrapper.eq("parent_id",0);
        List<Rights> oneList = rightsMapper.selectList(queryWrapper);
        //分析: 1级和2级有各自的对应的关系. 拿到当前的一级查询自己的二级菜单.
        for (Rights oneRights : oneList){
            //应该先清空原有条件
            queryWrapper.clear();
            //根据一级id查询二级信息.
            queryWrapper.eq("parent_id",oneRights.getId());
            List<Rights> twoList = rightsMapper.selectList(queryWrapper);
            //实现父子关系的封装
            oneRights.setChildren(twoList);
        }
        return oneList;
    }
}

3)左侧菜单的跳转说明

1、编辑路由机制

根据路由嵌套的规则,通过children属性 实现组件嵌套.最终实现课堂页面效果.

在这里插入图片描述

需求: 当用户默认跳转到home时,应该默认展现 Welcome的组件 关键语法:重定向机制

在这里插入图片描述

2、?ElementUI 基本用法

<template>
  <div>
    <h1>elementUI 入门案例 方便大家后续学习</h1>

    <!-- 1.面包屑导航
       elementUI 提供的组件 Breadcrumb
                           BreadcrumbItem
         2.引入组件         element.js  import  Vue.use
     -->
    <el-breadcrumb separator-class="el-icon-arrow-right">
      <el-breadcrumb-item :to="{ path: '/elementUI' }">UI页面</el-breadcrumb-item>
      <el-breadcrumb-item>ElementUI工具API</el-breadcrumb-item>
      <el-breadcrumb-item>入门案例</el-breadcrumb-item>
    </el-breadcrumb>

    <!-- 2. 定义卡片视图 -->
    <el-card class="box-card hwCard">

        <!-- 4. 栅格: 将一行固定划分为24块 可以调整每块所占的大小   -->
        <el-row gutter="15">
          <el-col :span="8">
              <!-- 3.引入input框 -->
              <el-input placeholder="请输入内容" v-model="input3" class="input-with-select">
                  <el-button slot="append" icon="el-icon-search"></el-button>
              </el-input>
          </el-col>
          <el-col :span="4">
              <el-button type="primary" round @click="showDialog" >点击按钮</el-button>
          </el-col>
        </el-row>

        <!-- 5.弹出框操作
          title="弹出框的标题元素"
          :visible.sync="dialogVisible"  控制弹出框是否展现 true/false
        -->
        <el-dialog
          title="弹出框效果展现"
          :visible.sync="dialogVisible"
          width="70%">

          <!-- 6.表单提交  ref="为表单定义一个ID"
            model 是elementUI中特定的属性   负责绑定数据
          -->
          <el-form ref="form" :model="addUser" label-width="80px">
            <el-form-item label="用户名">
              <el-input v-model="addUser.username"></el-input>
            </el-form-item>
            <el-form-item label="密码">
              <el-input v-model="addUser.password" type="password"></el-input>
            </el-form-item>
          </el-form>



          <span slot="footer" class="dialog-footer">
            <el-button @click="dialogVisible = false">取 消</el-button>
            <el-button type="primary" @click="dialogVisible = false">确 定</el-button>
          </span>
        </el-dialog>
    </el-card>


  </div>
</template>

<script>
//对外声明 当前组件的属性export default 将组件交给VUE对象管理
export default {
  data(){
    return {
      dialogVisible: false,
      //form表单中的数据有多个所以采用对象
      addUser: {
          username: '',
          password: ''
      }
    }
  },
  methods: {
    //添加点击事件
    showDialog(){
       //点击展现弹出框???
       this.dialogVisible = true
    }
  }
}
</script>

<style lang="less" scoped>

  .hwCard {
    width: 100%;
    height: 500px;
  }
</style>

四、用户管理实现

1)用户管理后台搭建

1、表设计

2、User的POJO设计

3、页面调用JS

生命周期函数:

getUserList()函数定义:在这里插入图片描述

4、用户查询的业务接口文档(以MP方式实现分页查询? API调用)

5、封装PageResult

说明:该对象主要的作用,封装分页后的结果,其中的数据需要在业务层 赋值,最后由SysResult对象 ,携带返回值?给用户

@Data
@Accessors(chain = true)
public class PageResult {
    private String  query;   //用户查询的数据
    private Integer pageNum; //页数
    private Integer pageSize;//每页的条数
    private Long    total;   //总记录数
    private Object  rows;    //分页后的结果
}

6、编辑UserController

 /**
     * 业务: 实现用户列表的分页查询
     * 类型: GET
     * URL:  /user/list
     * 参数:  PageResult对象进行接收  传递了3个参数
     * 返回值: SysResult对象(PageResult对象) 返回5个
     */
    @GetMapping("/list")
    public SysResult getUserList(PageResult pageResult){//3个

        //通过业务处理 获取总数/分页后的结果
        pageResult = userService.getUserList(pageResult);
        return SysResult.success(pageResult); //5个
    }

7、编辑UserServiceImpl

 /**
     * 以MP的方式分页查询
     * 需求:
     *  1.分页查询 List<user>
     *  2.获取记录总数   封装pageResult对象
     *
     * @param pageResult
     * @return
     */
    @Override
    public PageResult getUserList(PageResult pageResult) {
        //第一部分 实现数据的封装!!!
        int pageNum = pageResult.getPageNum();  //获取页面
        int pageSize = pageResult.getPageSize();//获取条件
        //参数1: page分页对象
        Page<User> page = new Page(pageNum,pageSize);
        //参数2: 分页的查询条件  username模糊查询
        //问题:  如果用户没有传递query  like关键字  拼接参数
        //动态拼接: 传参拼接like  condition:true 拼接like条件
        //         false 不拼接 like关键字
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        //判断用户是否传参  如果传参 返回true   反之 返回false
        boolean flag = StringUtils.hasLength(pageResult.getQuery());
        queryWrapper.like(flag,"username",pageResult.getQuery());

        //规则: page2个参数 根据分页查询返回 total/分页后的记录 4个参数
        page = userMapper.selectPage(page,queryWrapper);
        //根据分页对象,获取想要的结果
        List<User> userList = page.getRecords();
        long total = page.getTotal();
        pageResult.setTotal(total).setRows(userList);
        return pageResult;
    }

9、编辑配置类

包路径: com.jt.config
说明: MP如果需要进行分页的查询 ,则必须添加配置类.否则分页不能正常执行.
关于配置类的说明:
SpringBoot整合第三方框架时,提供了配置类的机制, 通过这种机制,第三方框架可以实现定制化的对象的创建.

//1.表示这个类 是一个配置类  目的: 封装对象-交给Spring容器管理
@Configuration
public class MybatisPlusConfig {

    // @Bean 将方法的返回值对象,交给Spring容器管理
    //MP分页机制  Mysql分页语句/Oracle分页语句  为了实现功能复用 需要手动配置
    //根据数据库类型不同 之后动态的生成Sql  MP才能调用分页对象
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        //定义分页拦截器对象
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MARIADB));
        return interceptor;
    }

}

10、分页效果图

在这里插入图片描述

2)用户状态修改?

1、业务接口文档

说明: 用户通过开关 控制 状态 true/false 在数据库中 存储true 用1, 存储false 用0

在这里插入图片描述

2、页面JS

在这里插入图片描述

?发起Ajax请求:

async updateStatus(user){
         //实现用户状态修改  注意使用模版字符串  ES6中提出的新用法 ${key}
        //const {data: result} = await this.$http.put('/user/status/'+user.id+'/'+user.status)
        const {data: result} = await this.$http.put(`/user/status/${user.id}/${user.status}`)
        if(result.status !== 200) return this.$message.error("用户状态修改失败!")
        this.$message.success("用户状态修改成功!")
      },

?3、编辑UserController

3)用户新增

1、用户JS分析

在这里插入图片描述

2、业务接口文档

3、编辑UserController

4、编辑UserService

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-09-14 13:14:30  更:2021-09-14 13:16:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 19:25:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码