基于Vue+ELement搭建动态树与数据表格实现分页模糊查询

news2024/11/23 13:06:25

🎉🎉欢迎来到我的CSDN主页!🎉🎉

🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚

🌟推荐给大家我的专栏《ELement》。🎯🎯

👉点击这里,就可以查看我的主页啦!👇👇

Java方文山的个人主页

🎁如果感觉还不错的话请给我点赞吧!🎁🎁

💖期待你的加入,一起学习,一起进步!💖💖

请添加图片描述

目录

一、前言

二、左侧动态树实现

2.1.后台数据接口定义

2.2.前端导航菜单绑定

2.3.根据数据渲染页面

2.4.动态路由实现

三、右侧内容数据表格

3.1.根据文档搭建页面

3.2.实现模糊查询

四、分页实现


一、前言

在上一篇博文我们搭建了首页导航和左侧菜单,但是我们的左侧菜单是死数据今天我们就来把死的变成活的,并且完成右侧内容的书籍数据表格的展示与分页效果,话不多说上代码!!

二、左侧动态树实现

2.1.后台数据接口定义

首先我们将后端的代码写好Controller层代码

package com.zking.ssm.controller;

import com.zking.ssm.model.Module;
import com.zking.ssm.model.RoleModule;
import com.zking.ssm.model.TreeNode;
import com.zking.ssm.service.IModuleService;
import com.zking.ssm.util.JsonResponseBody;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.List;

@Controller
@RequestMapping("/module")
public class ModuleController {

    @Autowired
    private IModuleService moduleService;

    @RequestMapping("/queryRootNode")
    @ResponseBody
    public JsonResponseBody<List<Module>> queryRootNode(){
        try {
            List<Module> modules = moduleService.queryRootNode(-1);
            return new JsonResponseBody<>("OK",true,0,modules);
        } catch (Exception e) {
            e.printStackTrace();
            return new JsonResponseBody<>("初始化首页菜单错误",false,0,null);
        }
    }

    @RequestMapping("/queryElementTree")
    @ResponseBody
    public JsonResponseBody<List<TreeNode>> queryElementTree(){
        try {
            List<TreeNode> modules = moduleService.queryTreeNode(-1);
            return new JsonResponseBody<>("OK",true,0,modules);
        } catch (Exception e) {
            e.printStackTrace();
            return new JsonResponseBody<>("初始化ElementUI的Tree组件错误",false,0,null);
        }
    }

    @RequestMapping("/addRoleModule")
    @ResponseBody
    public JsonResponseBody<?> addRoleModule(RoleModule roleModule){
        try {
            moduleService.addRoleModule(roleModule);
            return new JsonResponseBody<>("新增角色权限成功",true,0,null);
        } catch (Exception e) {
            e.printStackTrace();
            return new JsonResponseBody<>("新增角色权限失败",false,0,null);
        }
    }

    @RequestMapping("/queryModuleByRoleId")
    @ResponseBody
    public JsonResponseBody<List<String>> queryModuleByRoleId(RoleModule roleModule){
        try {
            List<String> modules = moduleService.queryModuleByRoleId(roleModule);
            return new JsonResponseBody<>("OK",true,0,modules);
        } catch (Exception e) {
            e.printStackTrace();
            return new JsonResponseBody<>("获取角色权限失败",false,0,null);
        }
    }
}

由此我们可知后端查询的树形菜单的接口为:http://localhost:8080/ssm/module/queryRootNode

2.2.前端导航菜单绑定

数据有了我们只用考虑怎么通过Vue拿到数据以及展示数据就可以了。

找到src下面的api目录下的action.js文件添加下列接口

  'SYSTEM_USER_MODULE': '/module/queryRootNode', //左侧菜单

 在LeftNav.vue中的钩子函数内编写方法去到后端拿取数据赋予变量

created() {
      this.$root.Bus.$on('aaa', r => {
        this.collapsed = r;
      });
      //加载页面先去后端拿数据
      let url = this.axios.urls.SYSTEM_USER_MODULE;
      this.axios.get(url, {}).then(r => {
        this.menus=r.data.rows
      }).catch(e => {

      })

    }

并在data中定义变量 menus:[]

 menus:[]

2.3.根据数据渲染页面

去到我们ELement查找相应的代码进行cv,下面是我找好的你们直接用,我们现在只需要将后端获取到的数据在上面的代码中进行遍历即可。

        <!-- 左侧菜单内容-->
      <el-submenu v-for="m in menus" :index="'ind_'+m.id" :key="'key_'+m.id">
        <template slot="title">
          <i :class="m.icon"></i>
          <span>{{m.text}}</span>
        </template>
        <el-menu-item  v-for="ms in m.modules" :index="ms.url" :key="'key_'+ms.id">
          <i :class="ms.icon"></i>
          <span>{{ms.text}}</span>
        </el-menu-item>
      </el-submenu>

效果展示:

2.4.动态路由实现

我们点击下方的子菜单肯定会显示右侧白框里面的内容,所以我们需要实现动态路由

①实现路由跳转及当前项的设置

<el-menu router :default-active="$route.path">
	<el-menu-item index="/company/userManager">用户管理</el-menu-item>
</el-menu>

注意事项:

①要实现路由跳转,先要在el-menu标签上添加router属性,然后只要在每个el-menu-item标签内的index属性设置一下url即可实现点击el-menu-item实现路由跳转。

②导航当前项,在el-menu标签中绑定 :default-active="$route.path",注意是绑定属性,不要忘了加“:”,当$route.path等于el-menu-item标签中的index属性值时则该item为当前项。

③el-submenu标签中的url属性不能为空,且不能相同,否则会导致多个节点收缩/折叠效果相同的问题。

②生成相对应的Vue文件

根据我们点击子菜单所显示的层级关系进行Vue组件的编写,下面以书本管理下面的新增书本为例

AddBook.Vue

<template>
  <h1>新增书本</h1>
</template>

<script>
</script>

<style>
</style>

③配置路由与路由路径的关系 

index.js

import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'
import AppMain from '@/components/AppMain'
import LeftNav from '@/components/LeftNav'
import TopNav from '@/components/TopNav'

import Login from '@/views/Login'
import Registered from '@/views/Registered'
import AddBook from '@/views/book/AddBook'
import BookList from '@/views/book/BookList'


Vue.use(Router)

export default new Router({
  routes: [{
    path: '/',
    name: 'Login',
    component: Login
  }, {
    path: '/Registered',
    name: 'Registered',
    component: Registered
  }, {
    path: '/AppMain',
    name: 'AppMain',
    component: AppMain,
    children: [{
      path: '/LeftNav',
      name: 'LeftNav',
      component: LeftNav
    }, {
      path: '/TopNav',
      name: 'TopNav',
      component: TopNav
    }, {
      path: '/book/AddBook',
      name: 'AddBook',
      component: AddBook
    }, {
      path: '/book/BookList',
      name: 'BookList',
      component: BookList
    }]
  }]
})

④将组件渲染到页面上

在AppMain.js中显示组件就需要加上<router-view></router-view>

<template>
  <el-container class="main-container">
    <el-aside v-bind:class="asideClass">
      <LeftNav></LeftNav>
    </el-aside>
    <el-container>
      <el-header class="main-header">
        <TopNav></TopNav>
      </el-header>
      <el-main class="main-center">
        <router-view></router-view>
      </el-main>
    </el-container>
  </el-container>
</template>

<script>
  // 导入组件
  import TopNav from '@/components/TopNav.vue'
  import LeftNav from '@/components/LeftNav.vue'

  // 导出模块
  export default {
    components: {
      TopNav,LeftNav
    },data() {
      return {
        asideClass: "main-aside"
      }
    },
    created(){
      this.$root.Bus.$on('aaa',r=>{
        this.asideClass=r ? 'main-aside-collapsed':'main-aside';
      });
    }
  };
</script>
<style scoped>
  .main-container {
    height: 100%;
    width: 100%;
    box-sizing: border-box;
  }

  .main-aside-collapsed {
    /* 在CSS中,通过对某一样式声明! important ,可以更改默认的CSS样式优先级规则,使该条样式属性声明具有最高优先级 */
    width: 64px !important;
    height: 100%;
    background-color: #334157;
    margin: 0px;
  }

  .main-aside {
    width: 240px !important;
    height: 100%;
    background-color: #334157;
    margin: 0px;
  }

  .main-header,
  .main-center {
    padding: 0px;
    border-left: 2px solid #333;
  }
</style>

效果演示:

三、右侧内容数据表格

3.1.根据文档搭建页面

首先我们分析一下,我们右侧有那些内容?然后去到我们ELementUI官网查找相对应的案例代码,我们首先需要一个form表单提供我们输入书籍名称进行模糊查询,还需要数据表格展示数据,其次就是底部的分页条来完成分页效果,知道了需求我们直接去找案例代码即可。

AddBook.js

<template>
  <div>
    <!--搜索栏-->
    <el-form :inline="true" class="form-search" style="padding: 30px;">
      <el-form-item label="书本名称">
        <el-input v-model="bookname" placeholder="请输入书本名称"></el-input>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" icon="el-icon-search" @click="query(1)">查询</el-button>
      </el-form-item>
    </el-form>

    <!-- 数据表格-->
    <el-table :data="tableData" style="width: 100%" :row-class-name="tableRowClassName">
      <el-table-column prop="id" label="编号" width="180">
      </el-table-column>
      <el-table-column prop="bookname" label="书籍名称" width="180">
      </el-table-column>
      <el-table-column prop="price" label="书籍价格" width="180">
      </el-table-column>
      <el-table-column prop="booktype" label="书籍类别" width="180">
      </el-table-column>
    </el-table>

    <!-- 分页栏-->
    <div class="block">
      <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="currentPage4"
        :page-sizes="[100, 200, 300, 400]" :page-size="100" layout="total, sizes, prev, pager, next, jumper"
        :total="400">
      </el-pagination>
    </div>

  </div>
</template>




<script>
  export default {
    data() {
      return {
        bookname: "",
        tableData: []
      }
    },
    methods: {

    }
  }
</script>



<style>
  .el-table .warning-row {
    background: oldlace;
  }

  .el-table .success-row {
    background: #f0f9eb;
  }
</style>

这样我们的基本内容就搭建完成了 

3.2.实现模糊查询

和前面一样我们先去后端将接口定义好

package com.zking.ssm.controller;

import com.zking.ssm.model.Book;
import com.zking.ssm.service.IBookService;
import com.zking.ssm.util.JsonResponseBody;
import com.zking.ssm.util.PageBean;
import com.zking.ssm.vo.BookFileVo;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.List;
import java.util.Map;

@Controller
@RequestMapping("/book")
public class BookController {

    @Autowired
    private IBookService bookService;

    @RequestMapping("/addBook")
    @ResponseBody
    public JsonResponseBody<?> addBook(Book book){
        try {
            bookService.insert(book);
            return new JsonResponseBody<>("新增书本成功",true,0,null);
        } catch (Exception e) {
            e.printStackTrace();
            return new JsonResponseBody<>("新增书本失败",false,0,null);
        }
    }

    @RequestMapping("/editBook")
    @ResponseBody
    public JsonResponseBody<?> editBook(Book book){
        try {
            bookService.updateByPrimaryKey(book);
            return new JsonResponseBody<>("编辑书本成功",true,0,null);
        } catch (Exception e) {
            e.printStackTrace();
            return new JsonResponseBody<>("编辑书本失败",false,0,null);
        }
    }

    @RequestMapping("/delBook")
    @ResponseBody
    public JsonResponseBody<?> delBook(Book book){
        try {
            bookService.deleteByPrimaryKey(book.getId());
            return new JsonResponseBody<>("删除书本成功",true,0,null);
        } catch (Exception e) {
            e.printStackTrace();
            return new JsonResponseBody<>("删除书本失败",false,0,null);
        }
    }

    @RequestMapping("/queryBookPager")
    @ResponseBody
    public JsonResponseBody<List<Book>> queryBookPager(Book book, HttpServletRequest req){
        try {
            PageBean pageBean=new PageBean();
            pageBean.setRequest(req);
            List<Book> books = bookService.queryBookPager(book, pageBean);
            return new JsonResponseBody<>("OK",true,pageBean.getTotal(),books);
        } catch (Exception e) {
            e.printStackTrace();
            return new JsonResponseBody<>("分页查询书本失败",false,0,null);
        }
    }

    @RequestMapping("/queryBookCharts")
    @ResponseBody
    public JsonResponseBody<?> queryBookCharts(){
        try{
            Map<String, Object> charts = bookService.queryBookCharts();
            return new JsonResponseBody<>("OK",true,0,charts);
        }catch (Exception e){
            e.printStackTrace();
            return new JsonResponseBody<>("查询统计分析数据失败",false,0,null);
        }
    }

    @RequestMapping("/upload")
    @ResponseBody
    public JsonResponseBody<?> upload(BookFileVo bookFileVo){
        try {
            MultipartFile bookFile = bookFileVo.getBookFile();
            System.out.println(bookFileVo);
            System.out.println(bookFile.getContentType());
            System.out.println(bookFile.getOriginalFilename());
            return new JsonResponseBody<>("上传成功",true,0,null);
        } catch (Exception e) {
            e.printStackTrace();
            return new JsonResponseBody<>("上传失败",false,0,null);
        }
    }

    @RequestMapping("/download")
    public void download(HttpServletRequest request, HttpServletResponse response){
        try {
            String relativePath = "uploads/1.jpg";
            String absolutePath = request.getRealPath(relativePath);
            InputStream is = new FileInputStream(new File(absolutePath));
            OutputStream out = response.getOutputStream();
            response.setContentType("application/octet-stream");
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("1.jpg", "UTF-8"));
            byte[] by = new byte[1024];
            int len = -1;
            while (-1 != (len = is.read(by))) {
                out.write(by);
            }
            is.close();
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @RequestMapping("/downloadUrl")
    public void downloadUrl(HttpServletRequest request, HttpServletResponse response){
        String relativePath = "uploads/1.jpg";
        String absolutePath = request.getRealPath(relativePath);
        InputStream is = null;
        OutputStream out = null;

        try {
            is = new FileInputStream(new File(absolutePath));
            // 设置Content-Disposition
            response.setHeader("Content-Disposition",
                    "attachment;filename=" + URLEncoder.encode("1.jpg", "UTF-8"));
            out = response.getOutputStream();
            IOUtils.copy(is, out);
            response.flushBuffer();
            System.out.println("完成");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            IOUtils.closeQuietly(is);
            IOUtils.closeQuietly(out);
        }
    }
}

 由此我们可知后端查询书籍的接口为:http://localhost:8080/ssm/book/queryBookPager

 action.js文件添加下列接口

'BOOK_LIST': '/book/queryBookPager', //书籍查询

 在AddBook.vue中的钩子函数内编写方法去到后端拿取数据赋予变量

 created() {
      //加载页面先去后端拿数据
      let params={
        bookname:this.bookname
      }
      let url = this.axios.urls.BOOK_LIST;
      this.axios.get(url, {params:params}).then(r => {
        console.log(r)
        this.tableData = r.data.rows
      }).catch(e => {

      })

    }

由于不止我们初始页面需要用到这个方法模糊查询也要所以我们将该代码进行封装让它有复用性

    methods: {
      //封装查询方法
      list(params) {
        let url = this.axios.urls.BOOK_LIST;
        this.axios.get(url, {
          params: params
        }).then(r => {
          console.log(r)
          this.tableData = r.data.rows
        }).catch(e => {

        })
      },
      //模糊查询方法
      query() {
        let params = {
          bookname: this.bookname
        }
        this.list(params)
      }
    },
    created() {
      //加载页面先去后端拿数据
      let params = {
        bookname: this.bookname
      }
      this.list()

    }

效果展示:

四、分页实现

更改我们的分页栏代码并定义变量,编写分页栏中自带的两个方法,一个是页码发生变化会触发一个是页数发生改变会触发。

<!-- 分页栏-->
    <div class="block">
      <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="page"
        :page-sizes="[10, 20, 30, 40]" :page-size="rows" layout="total, sizes, prev, pager, next, jumper"
        :total="total">
      </el-pagination>
    </div>
<script>
  export default {
    data() {
      return {
        bookname: "",
        tableData: [],
        rows: 10,
        page: 1,
        total: 0,

      }
    },
    methods: {
      //封装查询方法
      list(params) {
        let url = this.axios.urls.BOOK_LIST;
        this.axios.get(url, {
          params: params
        }).then(r => {
          console.log(r)
          this.tableData = r.data.rows
          this.total = r.data.total
        }).catch(e => {

        })
      },
      //模糊查询方法
      query() {
        let params = {
          bookname: this.bookname
        }
        this.list(params)
      },
      //当页发生变化会触发
      handleSizeChange(r) {
        let params = {
          bookname: this.bookname,
          rows: this.rows,
          rows: r
        }
        this.list(params)
      },
      //当前页数发生变化会触发
      handleCurrentChange(p) {
        let params = {
          bookname: this.bookname,
          rows: this.rows,
          page: p
        }
        this.list(params)
      }

    },
    created() {
      //加载页面先去后端拿数据
      let params = {
        bookname: this.bookname
      }
      this.list()

    }

  }
</script>

效果展示:

请添加图片描述

到这里我的分享就结束了,欢迎到评论区探讨交流!!

💖如果觉得有用的话还请点个赞吧 💖

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

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

相关文章

self-XSS漏洞SRC挖掘

本文由掌控安全学院 - 一朵花花酱 投稿 Markdown是一种轻量级标记语言&#xff0c;创始人为约翰格鲁伯&#xff08;John Gruber&#xff09;。它允许人们使用易读易写的纯文本格式编写文档&#xff0c;然后转换成有效的 XHTML&#xff08;或者HTML&#xff09;文档。这种语言吸…

MySQL数据库基本操作--DDL

文章目录 1. DDL2. 对数据库的常用操作3. 对表结构的常用操作数据类型数值类型字符串类型日期类型 基本操作修改表结构格式 1. DDL DDL(Data Definition Language)&#xff0c;数据定义语言&#xff0c;该语言部分包括以下内容&#xff1a; 对数据库的常用操作对表结构的常用…

我与南非的三次邂逅

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 卷圈 运营 / SandLiu 卷圈 监制 / 姝琦 产品统筹 / bobo 场地支持 / 声湃轩天津录音间 特别感谢 / 南非旅游局、日光派对 本期节目中&#xff0c;我们邀请了一位特别的嘉宾索导&#xff0c;她将带领我们走进南非&…

ide unknown command (empty parse result): / 问题及解决方案

vs studio端口冲突了 在属性 web 修改端口号就能解决 搞定

18661 2020 金属卤化物灯 钪钠系列 性能要求 学习记录

声明 本文是学习GB-T 18661-2020 金属卤化物灯 钪钠系列 性能要求. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了钪钠系列金属卤化物灯的分类与命名、主要尺寸、基本参数、技术要求、试验方法、检 验规则、标志、包装、运输和…

CSS详细基础(六)边框样式

本期是CSS基础的最后一篇~ 目录 一.border属性 二.边框属性复合写法 三.CSS修改表格标签 四.内边距属性 五.外边距属性 六.其他杂例 1.盒子元素水平居中 2.清除网页内外元素边距 3.外边距的合并与塌陷 4.padding不会撑大盒子的情况 七.综合案例——新浪导航栏仿真 …

微信小程序写一个将图片对象转成base64字符串的函数

这个我只能比较遗憾的说 小程序中大部分操作文件的API都是异步的 所以这个函数 我们还是要异步返回 其实大家肯定也都喜欢同步的 imageToBase64(image) {return new Promise((resolve, reject) > {const filePath image.path;// 获取图片文件大小wx.getFileInfo({filePath…

马尔萨斯《人口原理》读后

200 多年前的书&#xff0c;很多人都说旧的东西过时了&#xff0c;但我觉得它只是被修正了&#xff0c;内核并不过时。毕竟&#xff0c;静态存量分析这本身就不符合现实&#xff0c;用现在的话说&#xff0c;建模就错了&#xff0c;但马尔萨斯的理论核心并不仅仅是一个模型&…

IO流 之 缓冲流(字节缓冲流和字符缓冲流)

缓冲流对原始流进行了包装&#xff0c;以提高原始流读写数据的性能。 字节缓冲流&#xff08;BufferedInputStream和BufferedOutputStream&#xff09; 字节缓冲流在内存中提供了一个默认为8kb的区域&#xff0c;用于缓冲&#xff0c;当流开始时&#xff0c;先读取一个8kb的内…

【Orange Pi】Orange Pi5 Plus 安装记录

官网&#xff1a;Orange Pi - Orangepi 主控芯片&#xff1a;Rockchip RK3588(8nm LP制程&#xff09;NPU&#xff1a;内嵌的 NPU 支持INT4/INT8/INT16/FP16混合运算&#xff0c;算力高达 6Top支持的操作系统&#xff1a; Orangepi OS&#xff08;Droid&#xff09;Orangepi O…

[JAVAee]MyBatis

目录 MyBatis简介 MyBatis的准备工作 框架的添加 连接数据库字符串的配置 MyBatis中XML路径的配置 ​编辑 MyBatis的使用 各层的实现 进行数据库操作 增加操作 拓展 修改操作 删除操作 查询操作 结果映射 单表查询 多表查询 like模糊查询 动态SQL / MyBa…

【超详细】Wireshark教程----Wireshark 分析ICMP报文数据试验

一&#xff0c;试验环境搭建 1-1 试验环境示例图 1-2 环境准备 两台kali主机&#xff08;虚拟机&#xff09; kali2022 192.168.220.129/24 kali2022 192.168.220.3/27 1-2-1 网关配置&#xff1a; 编辑-------- 虚拟网路编辑器 更改设置进来以后 &#xff0c;先选择N…

[Linux]Git

文章摘于GitHub博主geeeeeeeeek 文章目录 1.1 Git 简易指南创建新仓库工作流添加与提交推送改动 1.2 创建代码仓库git init用法讨论裸仓库 例子 git clone用法讨论仓库间协作 例子用法讨论栗子 1.3 保存你的更改git add用法讨论缓存区 栗子 git commit用法讨论记录快照&#xf…

数据统计-EXCEL中常用函数及操作

最近经常需要做一些数据统计工作&#xff0c;整理下EXCEL常用的函数及操作&#xff0c;总结及分享出来&#xff0c;后续会不断更新。 一、VLOOKUP函数 同表查询&#xff1a;VLOOKUP(A2,$A:$G,1,0) 跨表查询&#xff1a; VLOOKUP(A2,Sheet2!$A:$G,1,0) 跨工作薄&#xff1a; 跨…

GD32F10x的输出模式

1. 单片机型号的识别。 2. GPIO的输出模式。 1. 开漏模式 2.推挽模式 3.复用开漏模式 4.复用推挽模式。 开漏模式&#xff1a;&#xff08;写入位设置&#xff0c;输出数据寄存器来控制MOS&#xff09; 只有N-MOS管导通。PMOS不导通。 当N-MOS的栅极为0&#xff0c;N-MOS管…

Windows 下安装和配置 Redis (详细图文)

目录 下载 Redis安装 Redis配置 Redis修改密码(可选)配置环境变量注册系统服务 Redis 桌面管理工具附&#xff1a;开源项目微服务商城项目前后端分离项目 下载 Redis 访问 Redis 下载地址&#xff1a;https://github.com/tporadowski/redis/releases 下载 Redis 时&#xff0c…

unity 鼠标标记 左键长按生成标记右键长按清除标记,对象转化为子物体

linerender的标记参考 unity linerenderer在Game窗口中任意画线_游戏内编辑linerender-CSDN博客 让生成的标记转化为ARMarks游戏对象的子物体 LineMark.cs using System.Collections; using System.Collections.Generic; using UnityEngine;public class LineMark : MonoBeh…

二十二,加上各种贴图

使用pbr的各种贴图&#xff0c;albedo,金属度&#xff0c;ao,法线&#xff0c;粗糙度&#xff0c;可以更好的控制各个片元 1&#xff0c;先加上纹理坐标 texCoords->push_back(osg::Vec2(xSegment, ySegment)); geom->setVertexAttribArray(3, texCoords, osg::Array::BI…

【每日一题】花期内花的数目+【差分数组】+【二分枚举】

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;差分数组方法二&#xff1a;二分查找 写在最后 Tag 【差分数组】【二分查找】【数组】【2023-09-28】 题目来源 2251. 花期内花的数目 题目解读 每朵花都有自己的花期&#xff0c;有些花的花期会有重叠&#xff0c;也…

Turf处理等压线

Turf是一个用于空间分析的JavaScript库。它包括传统的空间操作、用于创建GeoJSON数据的辅助函数以及数据分类和统计工具。Turf可以作为客户端插件添加到您的网站&#xff0c;也可以使用Node.js在服务器端运行Turf。 Turf是一个模块化的js类库&#xff0c;所有的模块都是在packa…