【前后端的那些事】前后端环境搭建+树形结构表格实现

文章目录

    • 1. 前后端项目环境搭建
    • 2. table-tree
      • 2.1 后端准备
      • 2.2 前端准备

前言:最近写项目,发现了一些很有意思的功能,想写文章,录视频把这些内容记录下。但这些功能太零碎,如果为每个功能都单独搭建一个项目,这明显不合适。于是我想,就搭建一个项目,把那些我想将的小功能全部整合到一起。实现搭一次环境,处处使用。

本文主要实现一下两个功能

  1. 前后端项目搭建
  2. 表格展示树形数据

已录制视频
b站视频链接

1. 前后端项目环境搭建

前端:pure-admin-thin + renren-fast-vue

后端:springboot 2.7.5 + renren-fast

前端

  • 克隆pure-admin-thin

    git clone https://github.com/pure-admin/pure-admin-thin.git
    
  • 安装前端依赖

    pnpm i
    
  • 运行前端项目

    pnpm run dev
    

后端

  • 构建springboot项目

  • pom.xml

        <properties>
            <java.version>1.8</java.version>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
            <mybatisplus.version>3.3.1</mybatisplus.version>
            <mysql.version>8.0.28</mysql.version>
            <mssql.version>4.0</mssql.version>
            <oracle.version>11.2.0.3</oracle.version>
            <druid.version>1.1.13</druid.version>
            <quartz.version>2.3.0</quartz.version>
            <commons.lang.version>2.6</commons.lang.version>
            <commons.fileupload.version>1.2.2</commons.fileupload.version>
            <commons.io.version>2.5</commons.io.version>
            <commons.codec.version>1.10</commons.codec.version>
            <commons.configuration.version>1.10</commons.configuration.version>
            <shiro.version>1.9.0</shiro.version>
            <jwt.version>0.7.0</jwt.version>
            <kaptcha.version>0.0.9</kaptcha.version>
            <qiniu.version>7.2.23</qiniu.version>
            <aliyun.oss.version>2.8.3</aliyun.oss.version>
            <qcloud.cos.version>4.4</qcloud.cos.version>
            <swagger.version>2.7.0</swagger.version>
            <joda.time.version>2.9.9</joda.time.version>
            <gson.version>2.8.5</gson.version>
            <hutool.version>4.1.1</hutool.version>
            <lombok.version>1.18.4</lombok.version>
        </properties>
    
    
        <dependencies>
            <dependency>
                <groupId>com.fasterxml.jackson.datatype</groupId>
                <artifactId>jackson-datatype-jsr310</artifactId>
            </dependency>
    
            <!--日志-->
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-classic</artifactId>
            </dependency>
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-access</artifactId>
            </dependency>
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-core</artifactId>
            </dependency>
            <dependency>
                <groupId>commons-dbcp</groupId>
                <artifactId>commons-dbcp</artifactId>
                <version>1.4</version>
            </dependency>
    
            <dependency>
                <groupId>com.auth0</groupId>
                <artifactId>java-jwt</artifactId>
                <version>3.2.0</version>
            </dependency>
    
            <dependency>
                <groupId>com.aliyun</groupId>
                <artifactId>dysmsapi20170525</artifactId>
                <version>2.0.23</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-validation</artifactId>
            </dependency>
            <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
                <version>2.11.0</version>
            </dependency>
            <dependency>
                <groupId>javax.annotation</groupId>
                <artifactId>javax.annotation-api</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-jdbc</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-thymeleaf</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>${mybatisplus.version}</version>
                <exclusions>
                    <exclusion>
                        <groupId>com.baomidou</groupId>
                        <artifactId>mybatis-plus-generator</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <dependency>
                <groupId>org.apache.shiro</groupId>
                <artifactId>shiro-core</artifactId>
                <version>${shiro.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.shiro</groupId>
                <artifactId>shiro-spring</artifactId>
                <version>${shiro.version}</version>
            </dependency>
            <dependency>
                <groupId>io.jsonwebtoken</groupId>
                <artifactId>jjwt</artifactId>
                <version>${jwt.version}</version>
            </dependency>
            <dependency>
                <groupId>com.github.axet</groupId>
                <artifactId>kaptcha</artifactId>
                <version>${kaptcha.version}</version>
            </dependency>
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger2</artifactId>
                <version>${swagger.version}</version>
            </dependency>
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger-ui</artifactId>
                <version>${swagger.version}</version>
            </dependency>
            <dependency>
                <groupId>com.qiniu</groupId>
                <artifactId>qiniu-java-sdk</artifactId>
                <version>${qiniu.version}</version>
            </dependency>
            <dependency>
                <groupId>com.aliyun.oss</groupId>
                <artifactId>aliyun-sdk-oss</artifactId>
                <version>${aliyun.oss.version}</version>
            </dependency>
            <dependency>
                <groupId>com.qcloud</groupId>
                <artifactId>cos_api</artifactId>
                <version>${qcloud.cos.version}</version>
                <exclusions>
                    <exclusion>
                        <groupId>org.slf4j</groupId>
                        <artifactId>slf4j-log4j12</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <dependency>
                <groupId>joda-time</groupId>
                <artifactId>joda-time</artifactId>
                <version>${joda.time.version}</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.79</version>
            </dependency>
            <dependency>
                <groupId>com.google.code.gson</groupId>
                <artifactId>gson</artifactId>
                <version>${gson.version}</version>
            </dependency>
            <dependency>
                <groupId>cn.hutool</groupId>
                <artifactId>hutool-all</artifactId>
                <version>${hutool.version}</version>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
            </dependency>
            <dependency>
                <groupId>commons-lang</groupId>
                <artifactId>commons-lang</artifactId>
                <version>${commons.lang.version}</version>
            </dependency>
            <dependency>
                <groupId>org.aspectj</groupId>
                <artifactId>aspectjweaver</artifactId>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
                <version>2.7.5</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-redis -->
            <dependency>
                <groupId>org.springframework.data</groupId>
                <artifactId>spring-data-redis</artifactId>
                <version>2.7.5</version>
            </dependency>
    
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>javax.servlet-api</artifactId>
                <version>3.1.0</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid-spring-boot-starter</artifactId>
                <version>1.2.13</version>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>io.minio</groupId>
                <artifactId>minio</artifactId>
                <version>8.2.2</version>
            </dependency>
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <configuration>
                        <excludes>
                            <exclude>
                                <groupId>org.projectlombok</groupId>
                                <artifactId>lombok</artifactId>
                            </exclude>
                        </excludes>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    
  • yml

    # Tomcat
    server:
      tomcat:
        uri-encoding: UTF-8
        max-threads: 1000
        min-spare-threads: 30
      port: 9006
    #  connection-timeout: 5000ms
      servlet:
        context-path: /api_demo
    
    spring:
      datasource:
        type: com.alibaba.druid.pool.DruidDataSource
        druid:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
          username: root
          password: root
          initial-size: 10
          max-active: 100
          min-idle: 10
          max-wait: 60000
          pool-prepared-statements: true
          max-pool-prepared-statement-per-connection-size: 20
          time-between-eviction-runs-millis: 60000
          min-evictable-idle-time-millis: 300000
          #Oracle需要打开注释
          #validation-query: SELECT 1 FROM DUAL
          test-while-idle: true
          test-on-borrow: false
          test-on-return: false
          stat-view-servlet:
            enabled: true
            url-pattern: /druid/*
            #login-username: admin
            #login-password: admin
          filter:
            stat:
              log-slow-sql: true
              slow-sql-millis: 1000
              merge-sql: false
            wall:
              config:
                multi-statement-allow: true
      # 环境 dev|test|prod
      profiles:
        active: dev
      # jackson时间格式化
      jackson:
        time-zone: GMT+8
        date-format: yyyy-MM-dd HH:mm:ss
      servlet:
        multipart:
          max-file-size: 100MB
          max-request-size: 100MB
          enabled: true
      redis:
        open: false  # 是否开启redis缓存  true开启   false关闭
        database: 0
        host: localhost
        port: 6379
        #    password: 123456   # 密码(默认为空)
        timeout: 6000ms  # 连接超时时长(毫秒)
        jedis:
          pool:
            max-active: 1000  # 连接池最大连接数(使用负值表示没有限制)
            max-wait: -1ms      # 连接池最大阻塞等待时间(使用负值表示没有限制)
            max-idle: 10      # 连接池中的最大空闲连接
            min-idle: 5       # 连接池中的最小空闲连接
      mvc:
        throw-exception-if-no-handler-found: true
        pathmatch:
          matching-strategy: ANT_PATH_MATCHER
    #  resources:
    #    add-mappings: false
    
    
    #mybatis
    mybatis-plus:
      logging:
        level:
          #      org.springframework: warn
          org.apache.ibatis.logging: debug
      #      com.tmxk.municipal.**.dao: debug
      mapper-locations: classpath*:/mapper/**/*.xml
      #实体扫描,多个package用逗号或者分号分隔
      typeAliasesPackage: io.renren.modules.*.entity
      global-config:
        #数据库相关配置
        db-config:
          #主键类型  AUTO:"数据库ID自增", INPUT:"用户输入ID", ID_WORKER:"全局唯一ID (数字类型唯一ID)", UUID:"全局唯一ID UUID";
          #      id-type: ASSIGN_ID
          id-type: AUTO
          logic-delete-value: 0
          logic-not-delete-value: 1
        banner: false
      #原生配置
      configuration:
        map-underscore-to-camel-case: true
        cache-enabled: false
        call-setters-on-nulls: true
        jdbc-type-for-null: 'null'
        log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl
    
    
    renren:
      redis:
        open: false
      shiro:
        redis: false
      # APP模块,是通过jwt认证的,如果要使用APP模块,则需要修改【加密秘钥】
      jwt:
        # 加密秘钥
        secret: f4e2e52034348f86b67cde581c0f9eb5[www.renren.io]
        # token有效时长,7天,单位秒
        expire: 604800
        header: token
    
    

    2. table-tree

效果图

在这里插入图片描述
后端项目结构
在这里插入图片描述

2.1 后端准备

  • 数据表创建

    DROP TABLE IF EXISTS `tb_unit`;
    CREATE TABLE `tb_unit`  (
      `id` int NOT NULL AUTO_INCREMENT COMMENT '主键',
      `unit` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_croatian_ci NULL DEFAULT NULL COMMENT '单位名称',
      `pid` int NULL DEFAULT NULL COMMENT '父id',
      PRIMARY KEY (`id`) USING BTREE
    ) ENGINE = InnoDB AUTO_INCREMENT = 9 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_croatian_ci COMMENT = '用户所属单位设置表' ROW_FORMAT = Dynamic;
    
    SET FOREIGN_KEY_CHECKS = 1;
    
    
  • common模块

    • R【通用返回类】

      /**
       * 返回数据
       *
       * @author Mark sunlightcs@gmail.com
       */
      public class R extends HashMap<String, Object> {
      	private static final long serialVersionUID = 1L;
      
          public static String data = "data";
      
          public R() {
      		put("code", 0);
      		put("msg", "success");
      	}
      	
      	public static R error() {
      		return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, "未知异常,请联系管理员");
      	}
      
      	public static R error(ErrorCode code) {
      		return error(code.getErrorCode(), code.getMsg());
      	}
      
      	public static R error(String msg) {
      		return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, msg);
      	}
      	
      	public static R error(int code, String msg) {
      		R r = new R();
      		r.put("code", code);
      		r.put("msg", msg);
      		return r;
      	}
      
      	public static R ok(String msg) {
      		R r = new R();
      		r.put("msg", msg);
      		return r;
      	}
      	
      	public static R ok(Map<String, Object> map) {
      		R r = new R();
      		r.putAll(map);
      		return r;
      	}
      	
      	public static R ok() {
      		return new R();
      	}
      
      	public R put(String key, Object value) {
      		super.put(key, value);
      		return this;
      	}
      }
      
      
    • ErrorCode

      public enum ErrorCode {
          MANAGER_NOT_FOUND(412001, "主管未设置或不存在"),
          MANAGER_NOT_EQUAL(412002, "主管id不一致, 维修设施信息和维修工单的负责主管不一致"),
          INSTALLREPAIR_STATE_NOT_CORRECT(412003, "维修信息状态(status)错误,用户新上传的维修信息状态应为0(等待维修)"),
          INSTALLREPAIR_ISREPAIR_NOT_CORRECT(412004, "维修信息是否需要维修字段设置错误,允许的状态有0(不需要维修),1(需要维修),2(审核中)"),
          STATUS_NOT_FOUND(412005, "维修信息状态设置错误,允许的状态有0(等待维修),1(正在维修),2(维修完成)"),
          SMS_SEND_FAIL(412006, "短信发送错误, 请联系管理员"),
          SYSTEM_ERROR(412007, "服务器异常"),
          USER_NOT_FOUND(412008, "用户不存在"),
          DATA_ERROR(412009, "数据异常,服务器未接收到数据或传输数据为空"),
          NOT_CONTAIN_SPECIAL_CHAR(412010, "填写字符串信息不应该包含特殊字符"),
          PASSWORD_TO_SHORT(412011, "密码过短,不该小于6位"),
          REGISTER_ERROR(412012, "注册失败"),
          PASSWORD_NOT_EQUAL(412013, "两次密码不一致"),
          USERNAME_DUPLICATE(412014, "用户名已存在"),
          NOT_LOGIN(412015, "未登录"),
          INVALID_SESSION_KEY(412016, "sessionKey异常,请重试"),
          DECRYPTION_ERROR(412017, "用户信息解密异常,请重试"),
          NOT_MANAGER(412018, "您不是主管,请通过普通用户方式登录或者联系管理员升级为主管"),
          SESSIONID_INVALID(412019, "sessionId有误,服务器中不存在"),
          NOT_NULL_MARK(412020, "mark为空"),
          CODE_ERROR(412021, "code错误"),
          APPEALS_LACK_PROPERTY(412022, "appeals缺少property作为区分三表的标志"),
          APPEALS_WRONG_PROPERTY(412023, "appeals的property错误"),
          LOGIN_TIMEOUT(412024, "登录超时"),
          NO_WORKER_REPAIR(412025, "本条记录没有工人负责,请先设置负责工人"),
          WORKER_HAD_FOUND(412026, "本条记录已有负责的工人,请勿重复设置"),
          WORKER_NOT_EXIST(412027, "工人不存在"),
          VISIT_TOO_FREQUENCY(412028, "您的访问过于频繁,被系统认定为机器人,请稍后访问"),
          THINGS_DATA_LENGTH_INVALID(412029, "微信订阅消息的thing.DATA类型数据长度不能大于20"),
          REAPEAT_ORDER(412030, "重复下单"),
          REAPEAT_RECE_ORDER(412031, "重复接单"),
          REAPEAT_UPLOAD(412032, "重复提交");
      
          /**
           * 错误码
           */
          private int errorCode;
      
          /**
           * 错误信息
           */
          private String msg;
      
          ErrorCode() {}
      
          ErrorCode(int errorCode, String msg) {
              this.errorCode = errorCode;
              this.msg = msg;
          }
      
          public int getErrorCode() {
              return errorCode;
          }
      
          public String getMsg() {
              return msg;
          }
      }
      
  • entity

    package com.fgbg.demo.entity;
    
    import com.baomidou.mybatisplus.annotation.IdType;
    import com.baomidou.mybatisplus.annotation.TableField;
    import com.baomidou.mybatisplus.annotation.TableId;
    import com.baomidou.mybatisplus.annotation.TableName;
    import java.io.Serializable;
    import java.util.List;
    
    import lombok.Data;
    
    /**
     * 用户所属单位设置表
     * @TableName tb_unit
     */
    @TableName(value ="tb_unit")
    @Data
    public class TbUnit implements Serializable {
        /**
         * 主键
         */
        @TableId(type = IdType.AUTO)
        private Integer id;
    
        /**
         * 单位名称
         */
        private String unit;
    
        /**
         * 父id
         */
        private Integer pid;
    
        @TableField(exist = false)
        private List<TbUnit> children;
    
        @TableField(exist = false)
        private static final long serialVersionUID = 1L;
    }
    
  • controller

        @RequestMapping("/list")
        public R list() {
            List<TbUnit> list = unitService.listAll();
            /*----
            {
                code: 0,
                msg: 'xxx',
                data: [A, B, C, D, E, F, G, H]
            }
            ---*/
            return R.ok().put("data", list);
        }
    
  • service【核心逻辑】

        /**
         * 查询所有的unit数据, 并返回树形结构
         *
         * @return
         */
        @Override
        public List<TbUnit> listAll() {
            // 查询所有数据
            List<TbUnit> list = this.list();
            // 建立map映射(id->index)
            HashMap<Integer, Integer> map = new HashMap<>();
            for (int index = 0; index < list.size(); index++) {
                Integer id = list.get(index).getId();
                map.put(id, index);
            }
            // ...
            for (int i = 0; i < list.size(); i++) {
                TbUnit node = list.get(i);
                Integer pid = node.getPid();
                // 有父亲
                if (pid != null) {
                    // 找到pid的父亲, 并把当前节点(node)添加到父亲节点的children里面
                    Integer indexParent = map.get(pid);
                    // 获取父亲节点
                    TbUnit parent = list.get(indexParent);
                    if (parent.getChildren() == null) {
                        parent.setChildren(new ArrayList<>());
                    }
                    // 向父亲节点的children字段添加当前node
                    parent.getChildren().add(node);
                }
            }
            // 过滤出一级节点
            List<TbUnit> ans = list.stream().filter(e -> e.getPid() == null).collect(Collectors.toList());
            return ans;
        }
    
  • 返回的json数据

    {
      "msg": "success",
      "code": 0,
      "data": [
        {
          "id": 9,
          "unit": "浙江省",
          "pid": null,
          "children": [
            {
              "id": 10,
              "unit": "杭州市",
              "pid": 9,
              "children": [
                {
                  "id": 11,
                  "unit": "滨江区",
                  "pid": 10,
                  "children": null
                },
                {
                  "id": 12,
                  "unit": "余杭区",
                  "pid": 10,
                  "children": null
                }
              ]
            },
            {
              "id": 13,
              "unit": "宁波市",
              "pid": 9,
              "children": null
            },
            {
              "id": 14,
              "unit": "温州市",
              "pid": 9,
              "children": null
            }
          ]
        }
      ]
    }
    

    2.2 前端准备

  • /src/api/tree.ts

    import { http } from "@/utils/http";
    import { R, baseUrlApi } from "./utils";
    
    export class UnitEntity {
      id: Number;
      unit: String;
      pid: Number;
      children: Array<UnitEntity>;
    }
    
    /** 获取全部的unit数据 */
    export const getData = () => {
      return http.request<R<Array<UnitEntity>>>("get", baseUrlApi("unit/list"));
    };
    
  • /src/api/utils.ts

    export const baseUrlApi = (url: string) => `/api_demo/${url}`;
    
    /** 后端返回通用数据类型 */
    export type R<T> = {
      code: Number;
      msg: String;
      data: T;
    };
    
    /** 同步休眠函数, 参数为毫秒 */
    export const sleep = (ms: number): Promise<void> => {
      return new Promise(resolve => setTimeout(resolve, ms));
    };
    
    /** 分页数据类型 */
    export type PageUtils<T> = {
      /** 总记录数 */
      totalCount: number;
      /** 每页记录数 */
      pageSize: number;
      /** 总页数 */
      totalPage: number;
      /** 当前页数 */
      currPage: number;
      /** 列表数据 */
      list: Array<T>;
    };
    
    export const getStoreUser = () => {
      const res = sessionStorage.getItem("user-info");
      // const res = sessionStorage.getItem("user-info");
      console.log(res);
      return JSON.parse(res);
    };
    
  • /src/views/welecome/index.vue

 <script setup lang="ts">
 import { ref, onMounted } from "vue";
 import { UnitEntity, getData } from "@/api/tree.ts";
 defineOptions({
   name: "Welcome"
 });
 
 const tableData = ref<Array<UnitEntity>>();
 
 onMounted(() => {
   getData().then(res => {
     console.log(res);
     if (res.code === 0) {
       tableData.value = res.data;
     }
   });
 });
 </script>
 
 <template>
   <el-table
     :data="tableData"
     style="width: 100%; margin-bottom: 20px"
     row-key="id"
     border
     default-expand-all
   >
     <el-table-column prop="id" label="序号" sortable />
     <el-table-column prop="unit" label="单位" sortable />
     <el-table-column
       fixed="right"
       header-align="center"
       align="center"
       width="150"
       label="操作"
     >
       <template v-slot="scope">
         <el-button
           type="text"
           size="small"
           @click="addOrUpdateHandle(scope.row.id)"
           >修改</el-button
         >
       </template>
     </el-table-column>
   </el-table>
 </template>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

NAND SCA接口对性能影响有多大?

在多LUN场景下&#xff0c;SCA接口尤其有助于提高随机读取性能。通过合理安排读取命令和等待时间&#xff08;如tR&#xff09;&#xff0c;SCA接口可以在一个LUN完成读取后立即开始另一个LUN的读取操作&#xff0c;而无需等待整个DQ总线空闲&#xff0c;从而减少了延迟和提高了…

选中图层为什么不能建立3D模型---模大狮模型网

在Photoshop CC 2021(也就是PS6)中&#xff0c;要将选中的图层转换为3D模型&#xff0c;需要满足以下几个条件&#xff1a; 图层类型支持&#xff1a;只有特定类型的图层可以被转换为3D模型。通常&#xff0c;普通的像素图层、矢量图层和形状图层都可以进行转换。但是&#xff…

网络层协议及IP编址与IP路由基础华为ICT网络赛道

目录 4.网络层协议及IP编址 4.1.网络层协议 4.2.IPv4地址介绍 4.3.子网划分 4.4.ICMP协议 4.5.IPv4地址配置及基本应用 5.IP路由基础 5.1.路由概述 5.2.静态路由 5.3.动态路由 5.4.路由高阶特性 4.网络层协议及IP编址 4.1.网络层协议 IPv4(Internet Protocol Versi…

Tomcat性能优化学习

Tomcat 服务器是一个开源的轻量级Web应用服务器&#xff0c;在中小型系统和并发量小的场合下被普遍使用&#xff0c;是开发和调试Servlet、JSP 程序的首选。相信大家对于 Tomcat 已经是非常熟悉了&#xff0c;本篇将介绍tomcat的常见优化。那么为什么要对tomcat进行优化呢。因为…

大数据毕业设计:房屋数据分析可视化系统 预测算法 可视化 商品房数据 Flask框架(源码+讲解视频)✅

毕业设计&#xff1a;2023-2024年计算机专业毕业设计选题汇总&#xff08;建议收藏&#xff09; 毕业设计&#xff1a;2023-2024年最新最全计算机专业毕设选题推荐汇总 &#x1f345;感兴趣的可以先收藏起来&#xff0c;点赞、关注不迷路&#xff0c;大家在毕设选题&#xff…

从vue小白到高手,从一个内容管理网站开始实战开发第八天,登录功能后台功能设计--业务逻辑层基础接口和基础服务实现

上一篇我们介绍了项目后续要使用到的工具类,关于工具类的创建可以查看 从vue小白到高手,从一个内容管理网站开始实战开发第七天,登录功能后台功能设计--通用分页、枚举以及相关工具类-CSDN博客文章浏览阅读2次。本次内容主要介绍了项目后续用到的部分工具类,这些工具类,在…

HDFS WebHDFS 读写文件分析及HTTP Chunk Transfer Coding相关问题探究

文章目录 前言需要回答的问题DataNode端基于Netty的WebHDFS Service的实现 基于重定向的文件写入流程写入一个大文件时WebHDFS和Hadoop Native的块分布差异 基于重定向的数据读取流程尝试读取一个小文件尝试读取一个大文件 读写过程中的Chunk Transfer-Encoding支持写文件使用C…

Java多线程:初识多线程!左手画方,右手画圆

&#x1f451;专栏内容&#xff1a;Java⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、线程与进程二、创建线程方法1、继承Thread类2、实现Runnable接口3、两者区别4、举个栗子5、简洁写法Ⅰ、Thread匿名内部类写…

Django(七)

Django(六) 4.编辑用户 点击编辑&#xff0c;跳转到编辑页面&#xff08;将编辑行的ID携带过去&#xff09;。编辑页面&#xff08;默认数据&#xff0c;根据ID获取并设置到页面中&#xff09;提交&#xff1a; 错误提示数据校验在数据库更新 user_edit.html {% exte…

php 字符串常用函数

目录 1.一些常用函数 2.代码示例 1.一些常用函数 函数名描述trim()删除字符串两端空行或其它预定义符rtrim()删除字符串右边空行或其它预定义符ltrim()删除字符串左边空行或其它预定义符dirname()返回路径中的目录部分str_split()把字符串分割到数组里explode()使用一个字符串…

2024,传统鞋服的“高端梦”该醒了

文 | 螳螂观察 作者 | 图霖 “一千块都不要的波司登&#xff0c;宝贝们还不冲吗&#xff1f;” 入夜&#xff0c;一位身着羽绒服的美女主播在灯火通明的直播间正声嘶力竭地反复呐喊。 一群不知是托还是真实消费者的用户在评论区敲出自己的身高体重&#xff0c;想从主播那得…

给定n个字符串s[1...n], 求有多少个数对(i, j), 满足i < j 且 s[i] + s[j] == s[j] + s[i]?

题目 思路&#xff1a; 对于字符串a&#xff0c;b, (a.size() < b.size()), 考虑对字符串b满足什么条件&#xff1a; 由1、3可知a是b的前后缀&#xff0c;由2知b有一个周期是3&#xff0c;即a.size()&#xff0c;所以b是用多个a拼接而成的&#xff0c;有因为a是b的前后缀&…

基于Java SSM框架实现雁门关风景区宣传网站项目【项目源码】计算机毕业设计

基于java的SSM框架实现雁门关风景区宣传网站演示 Java技术 Java技术它是一个容易让人学会和使用的一门服务器语言。它在编程的过程当中只需要很少的知识就能建立起一个真正的交互站点。对于这个教程来说它并不需要你完全去了解这种语言&#xff0c;只要能快速融入web站点就可以…

基于博弈树的开源五子棋AI教程[3 极大极小搜索]

基于博弈树的开源五子棋AI教程[3 极大极小搜索] 引子极大极小搜索原理alpha-beta剪枝负极大搜索尾记 引子 极大极小搜索是博弈树搜索中最常用的算法&#xff0c;广泛应用于各类零和游戏中&#xff0c;例如象棋&#xff0c;围棋等棋类游戏。算法思想也是合乎人类的思考逻辑的&a…

【100个 Unity实用技能】☀️ | UGUI中 判断屏幕中某个坐标点的位置是否在指定UI区域内

&#x1f3ac; 博客主页&#xff1a;https://xiaoy.blog.csdn.net &#x1f3a5; 本文由 呆呆敲代码的小Y 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f384; 学习专栏推荐&#xff1a;Unity系统学习专栏 &#x1f332; 游戏制作专栏推荐&#xff1a;游戏制作 &…

MySQL的事务机制

一、事务机制简述 事务机制,避免写入直接操作数据文件&#xff1b;利用日志来实现间接写入&#xff0c;与事务有关的, redo日志与undo日志&#xff1b;sql语句操作记录复制到undo日志然后增删改查操作的结果会记录在redo日志&#xff0c;如果操作没有什么问题就把数据同步到数…

C语言基础语法跟练 day3

31、不使用累计乘法的基础上&#xff0c;通过移位运算&#xff08;<<&#xff09;实现2的n次方的计算。 #include <stdio.h> int main() {int i 0;scanf("%d",&i);printf("%d",1<<i);return 0; } 32、问题&#xff1a;一年约有 3.…

C++基础算法之枚举

星光不问赶路人 岁月不负有心人 &#x1f3a5;烟雨长虹&#xff0c;孤鹜齐飞的个人主页 &#x1f525;个人专栏 期待小伙伴们的支持与关注&#xff01;&#xff01;&#xff01; 目录 枚举算法的简介 枚举算法的运用 #特别数的和 题目描述# 输入描述# 输入输出样例# #找到最多…

Linux下安装JET2

0. 说明&#xff1a; JET2是一个基于Joint Evolutionary Trees的利用序列和结构信息预测蛋白质界面的软件&#xff0c;详情见: http://www.lcqb.upmc.fr/JET2/JET2.html&#xff0c;http://www.lgm.upmc.fr/JET/JET.html 和 https://doi.org/10.1371/journal.pcbi.1004580 本…

2024年前端面试中JavaScript的30个高频面试题之中级知识

基础知识 高级知识 13. 什么是闭包?闭包的用例有哪些? 闭包是一个功能,它允许函数捕获定义该函数的环境(或保留对作用域中变量的访问)即使在该作用域已经关闭后。 我们可以说闭包是函数和词法环境的组合,其中定义了该函数。 换句话说,闭包为函数提供了访问自己的作用域、…