论坛系统公共组件部分

news2024/11/27 11:48:48

1.在Java⽬录下创建包,在Resources⽬录下创建⽂件夹,结构如下

├─java # java⽂件区

│   └─com

│        └─example

│                └─demo

│                       ├─common # 公共类

│                       ├─config # 配置类

│                       ├─controller # 控制器层类

│                       ├─dao # 数据库访问类

│                       ├─exception # ⾃定义异常类

│                       ├─interceptor # ⾃定义拦截器类

│                       ├─model # 数据库实体对应模型类

│                       ├─services # 业务服务层接⼝

│                       │ └─impl # 业务服务层接⼝实现类

│                       └─utils # 输助⼯具类

|

|

└─resources # 资源⽂件区

        ├─mapper # 数据库与模型映射⽂件

        │    └─extension # 扩展数据库与模型映射⽂件,⾃定义业务⽅法

        ├─mybatis # Mybatis Generator 配置⽂件

        ├─static # 静态⽂件

        └─templates # 模板⽂件

2.创建generatorConfig.xml

在src/main/resources下创建mybatis⽬录,在mybatis⽬录下创建generatorConfig.xml文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>
    <!-- 驱动包路径,location中路径替换成自己本地路径 -->
    <classPathEntry location="C:\Users\20278\.m2\repository\mysql\mysql-connector-java\5.1.49\mysql-connector-java-5.1.49.jar"/>

    <context id="DB2Tables" targetRuntime="MyBatis3">
        <!-- 禁用自动生成的注释 -->
        <commentGenerator>
            <property name="suppressAllComments" value="true"/>
            <property name="suppressDate" value="true"/>
        </commentGenerator>

        <!-- 连接配置 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://127.0.0.1:3306/java_forum?characterEncoding=utf8&amp;useSSL=false"
                        userId="root"
                        password="123456">
        </jdbcConnection>

        <javaTypeResolver>
            <!-- 小数统一转为BigDecimal -->
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <!-- 实体类生成位置 -->
        <javaModelGenerator targetPackage="com.example.demo.model" targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>

        <!-- mapper.xml生成位置 -->
        <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>

        <!-- DAO类生成位置 -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.example.demo.dao"
                             targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>

        <!-- 配置生成表与实例, 只需要修改表名tableName, 与对应类名domainObjectName 即可-->
        <table tableName="t_article" domainObjectName="Article" enableSelectByExample="false"
               enableDeleteByExample="false" enableDeleteByPrimaryKey="false" enableCountByExample="false"
               enableUpdateByExample="false">
            <!-- 类的属性用数据库中的真实字段名做为属性名, 不指定这个属性会自动转换 _ 为驼峰命名规则-->
            <property name="useActualColumnNames" value="true"/>
        </table>
        <table tableName="t_article_reply" domainObjectName="ArticleReply" enableSelectByExample="false"
               enableDeleteByExample="false" enableDeleteByPrimaryKey="false" enableCountByExample="false"
               enableUpdateByExample="false">
            <property name="useActualColumnNames" value="true"/>
        </table>
        <table tableName="t_board" domainObjectName="Board" enableSelectByExample="false" enableDeleteByExample="false"
               enableDeleteByPrimaryKey="false" enableCountByExample="false" enableUpdateByExample="false">
            <property name="useActualColumnNames" value="true"/>
        </table>
        <table tableName="t_message" domainObjectName="Message" enableSelectByExample="false"
               enableDeleteByExample="false" enableDeleteByPrimaryKey="false" enableCountByExample="false"
               enableUpdateByExample="false">
            <property name="useActualColumnNames" value="true"/>
        </table>
        <table tableName="t_user" domainObjectName="User" enableSelectByExample="false" enableDeleteByExample="false"
               enableDeleteByPrimaryKey="false" enableCountByExample="false" enableUpdateByExample="false">
            <property name="useActualColumnNames" value="true"/>
        </table>
    </context>
</generatorConfiguration>

3.运⾏插件⽣成⽂件

    1)在src/main/resources下创建mapper⽬录

    2)点下下图重新加载Maven项⽬,在Plugins节点下出现mybatis-generator,双击运⾏,在对应的⽬录下⽣成相应的类与映射⽂件,如下图所⽰:

4.在 Insert 标签中添加获取主键值的选项

<!-- useGeneratedKeys = true -->
<!-- keyProperty = 主键字段--> 
<!-- 当插⼊⼀条数据后,可以通过user.getId()获取到⾃动⽣成的Id值,如果⽅法中需要⽴即获取Id值,加⼊这个配置 --> 
 <insert id="insert" parameterType="com.example.demo.model.Article" useGeneratedKeys="true" keyProperty="id">

5.添加@Mapper注解

dao包下的每个xxxMapper.java加⼊@Mapper注解

package com.example.demo.dao;

import com.example.demo.model.Article;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

@Mapper
public interface ArticleMapper {
    int insert(Article row);

    int insertSelective(Article row);

    Article selectByPrimaryKey(Long id);

    int updateByPrimaryKeySelective(Article row);

    int updateByPrimaryKeyWithBLOBs(Article row);

    int updateByPrimaryKey(Article row);
}

6.config包下新建MybatisConfig类,指定Mybatis的扫路径

package com.example.demo.config;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Configuration;

// 配置类
@Configuration
// 指定Mybatis的扫描路径
@MapperScan("com.example.demo.dao")
public class MybatisConfig {
}

7.编写公共代码

    1)定义状态码

     对执⾏业务处理逻辑过程中可能出现的成功与失败状态做针对性描述,⽤枚举定义状态码,先定义⼀部分,业务中遇到新的问题再添加

     在com.example.demo.common包下创建枚举类型命名为ResultCode

package com.example.demo.common;

//枚举类型
public enum ResultCode {
    SUCCESS                   (0, "操作成功"),
    FAILED                    (1000, "操作失败"),
    FAILED_UNAUTHORIZED       (1001, "未授权"),
    FAILED_PARAMS_VALIDATE    (1002, "参数校验失败"),
    FAILED_FORBIDDEN          (1003, "禁止访问"),
    FAILED_CREATE             (1004, "新增失败"),
    FAILED_NOT_EXISTS         (1005, "资源不存在"),
    FAILED_USER_EXISTS        (1101, "用户已存在"),
    FAILED_USER_NOT_EXISTS    (1102, "用户不存在"),
    FAILED_LOGIN              (1103, "用户名或密码错误"),
    FAILED_USER_BANNED        (1104, "您已被禁言, 请联系管理员, 并重新登录."),
    FAILED_TWO_PWD_NOT_SAME   (1105, "两次输入的密码不一致"),

    FAILED_BOARD_NOT_EXISTS   (1201, "版块不存在"),

    FAILED_ARTICLE_NOT_EXISTS (1301, "帖子不存在"),
    FAILED_ARTICLE_STATE      (1302, "帖子状态异常"),
    ERROR_SERVICES            (2000, "服务器内部错误"),
    ERROR_IS_NULL             (2001, "IS NULL.");
    //状态码
    int code;
    //错误描述
    String message;

    ResultCode(int code, String message) {
        this.code = code;
        this.message = message;
    }
    public int getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }

    @Override
    public String toString() {
        return "code = " + code + ",message = " + message + ".";
    }

}

      2)定义返回结果

            系统实现前后端分离,统⼀返回JSON格式的字符串,需要定义⼀个类,其中包含状态码,描述信息,返回的结果数据  

            a.在com.example.demo.common包下创建AppResult类

            b.属性加⼊@JsonInclude(JsonInclude.Include.ALWAYS)表⽰⽆论是否为空必须序列化

package com.example.demo.common;

import com.fasterxml.jackson.annotation.JsonInclude;

public class AppResult<T> {

    //自定义状态码
    @JsonInclude(JsonInclude.Include.ALWAYS)
    private int code;
    //描述信息
    @JsonInclude(JsonInclude.Include.ALWAYS)
    private String message;
    //具体返回的数据
    @JsonInclude(JsonInclude.Include.ALWAYS)
    private T data;

    //构造方法
    public AppResult(int code, String message) {
        this.code = code;
        this.message = message;
    }

    public AppResult(int code, String message, T data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }

    //成功方法,泛型方法
    /**
     *
     * @param message  描述信息
     * @param data  具体的数据
     * @return
     * @param <T>
     */
    public static <T> AppResult<T> success(String message,T data){
        return new AppResult<>(ResultCode.SUCCESS.code,message,data);
    }

    public static <T> AppResult<T> success(String message){
        return new AppResult<>(ResultCode.SUCCESS.code,message,null);
    }

    public static <T> AppResult<T> success(T data){
        return new AppResult<>(ResultCode.SUCCESS.getCode(),ResultCode.SUCCESS.getMessage(),data);
    }

    public static AppResult success(){
        return  new AppResult(ResultCode.SUCCESS.getCode(),ResultCode.SUCCESS.getMessage(),null);
    }

    //失败方法
    public static AppResult failed(){
        return new AppResult(ResultCode.FAILED.getCode(),ResultCode.FAILED.getMessage());
    }

    public static AppResult failed(String message){
        return new AppResult(ResultCode.FAILED.getCode(),message);
    }

    public static AppResult failed(ResultCode resultCode){
        return new AppResult(resultCode.getCode(), resultCode.getMessage());
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}

        3)⾃定义异常

              创建⼀个异常类,加⼊状态码与状态描述属性

               在com.example.demo.exception包下创建ApplicationException

package com.example.demo.exception;

import com.example.demo.common.AppResult;
import com.example.demo.common.ResultCode;

public class ApplicationException extends RuntimeException{
    //自定义的异常描述
    private AppResult errorResult;

    public ApplicationException(AppResult appResult) {
        //构造异常中的Message属性
        super(appResult.getMessage());
        //自定义的错误描述
        this.errorResult = appResult;
    }

    public ApplicationException(String message) {
        super(message);
        //根据异常描述构建返回对象
        this.errorResult = new AppResult((ResultCode.FAILED.getCode()),message);
    }

    //指定异常
    public ApplicationException(Throwable cause){
        super(cause);
    }

    //自定义异常描述,异常信息
    public ApplicationException(String message,Throwable cause){
        super(message,cause);
    }

    public AppResult getErrorResult() {
        return errorResult;
    }

    public void setErrorResult(AppResult errorResult) {
        this.errorResult = errorResult;
    }
}

       4)全局异常处理

               使⽤@ControllerAdvice+@ExceptionHandler注解实现统⼀异常处理

               @ControllerAdvice表⽰控制器通知类

               在com.example.demo.exception包下创建GlobalExceptionHandler

package com.example.demo.exception;


import com.example.demo.common.AppResult;
import com.example.demo.common.ResultCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {

    //捕获自己的ApplicationException异常
    //以body形式返回
    @ResponseBody
    @ExceptionHandler(ApplicationException.class)
    public AppResult handleApplicationException(ApplicationException e){
        //打印异常,上传线上要注释掉
        e.printStackTrace();
        //记录日志
        log.error(e.getMessage());
        //获取异常信息
        if(e.getErrorResult() != null){
            //返回异常类中记录的状态
            return e.getErrorResult();
        }
        //默认返回异常信息
        return AppResult.failed(e.getMessage());
    }

    /**
     * 处理全部未捕获的其他异常
     * @param e
     * @return
     */

    @ResponseBody
    @ExceptionHandler(Exception.class)
    public AppResult handleException(Exception e){
        //打印异常
        e.printStackTrace();
        //记录日志
        log.error(e.getMessage());
        if(e.getMessage() == null){
            return AppResult.failed(ResultCode.ERROR_SERVICES);
        }
        //默认返回异常信息
        return AppResult.failed(e.getMessage());
    }

}

 8.登录拦截器

      在interceptor包下创建LoginInterceptor

      

package com.example.demo.interceptor;

import com.example.demo.config.AppConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@Component
public class LoginInterceptor implements HandlerInterceptor {

    //从配置文件中获取默认登陆页的URL
    @Value("${java_forum.login.url")
    private String defaultURL;

    /**
     * 请求的前置处理
     * @param request
     * @param response
     * @param handler
     * @return true 校验成功,继续请求流程  <br/>false 中断请求流程
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //获取session,并做已登录用户信息的校验
        HttpSession session = request.getSession(false);
        if(session != null && session.getAttribute(AppConfig.USER_SESSION_KEY) != null){
            //校验通过
            return true;
        }

        //保证跳转页面的路径正确性
        if(!defaultURL.startsWith("/")){
            defaultURL = "/" + defaultURL;
        }
        //校验未通过,跳转到登录页面
        response.sendRedirect(defaultURL);
        //中止请求

        return false;
    }
}

      在interceptor包下创建AppInterceptorConfigurer

    

package com.example.demo.interceptor;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import javax.annotation.Resource;

@Configuration
public class AppInterceptorConfigurer implements WebMvcConfigurer {

    @Resource
    private LoginInterceptor loginInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 添加登录拦截器
        registry.addInterceptor(loginInterceptor)       // 添加用户登录拦截器
                .addPathPatterns("/**")                 // 拦截所有请求
                .excludePathPatterns("/sign-in.html")   // 排除登录HTML
                .excludePathPatterns("/sign-up.html")   // 排除注册HTML
                .excludePathPatterns("/user/login")     // 排除登录api接口
                .excludePathPatterns("/user/register")  // 排除注册api接口
                .excludePathPatterns("/user/logout")    // 排除退出api接口
                .excludePathPatterns("/swagger*/**")    // 排除登录swagger下所有
                .excludePathPatterns("/v3*/**")         // 排除登录v3下所有,与swagger相关
                .excludePathPatterns("/dist/**")        // 排除所有静态文件
                .excludePathPatterns("/image/**")
                .excludePathPatterns("/**.ico")
                .excludePathPatterns("/js/**");
    }
}

9.实现API⾃动⽣成

   使⽤Springfox Swagger⽣成API,并导⼊Postman,完成API单元测试

10.编写配置类

     在com.example.demo.config包下新建SwaggerConfig.java

package com.example.demo.config;
import org.springframework.boot.actuate.autoconfigure.endpoint.web.CorsEndpointProperties;
import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties;
import org.springframework.boot.actuate.autoconfigure.web.server.ManagementPortType;
import org.springframework.boot.actuate.endpoint.ExposableEndpoint;
import org.springframework.boot.actuate.endpoint.web.*;
import org.springframework.boot.actuate.endpoint.web.annotation.ControllerEndpointsSupplier;
import org.springframework.boot.actuate.endpoint.web.annotation.ServletEndpointsSupplier;
import org.springframework.boot.actuate.endpoint.web.servlet.WebMvcEndpointHandlerMapping;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.util.StringUtils;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.oas.annotations.EnableOpenApi;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

/**
 * Swagger配置类
 *
 * @Author 比特就业课
 */
// 配置类
@Configuration
// 开启Springfox-Swagger
@EnableOpenApi
public class SwaggerConfig {

    /**
     * Springfox-Swagger基本配置
     * @return
     */
    @Bean
    public Docket createApi() {
        Docket docket = new Docket(DocumentationType.OAS_30)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.example.demo.Controller"))
                .paths(PathSelectors.any())
                .build();
        return docket;

    }

    // 配置API基本信息
    private ApiInfo apiInfo() {
        ApiInfo apiInfo = new ApiInfoBuilder()
                .title("论坛系统API")
                .description("论坛系统前后端分离API测试")
                .contact(new Contact("Tech", "https://gitee.com/tanjiawe/java_forum", "tjiawen2024@yeah.net"))
                .version("1.0")
                .build();
        return apiInfo;
    }

    /**
     * 解决SpringBoot 6.0以上与Swagger 3.0.0 不兼容的问题
     * 复制即可
     **/
    @Bean
    public WebMvcEndpointHandlerMapping webEndpointServletHandlerMapping(WebEndpointsSupplier webEndpointsSupplier,
                                                                         ServletEndpointsSupplier servletEndpointsSupplier,
                                                                         ControllerEndpointsSupplier controllerEndpointsSupplier,
                                                                         EndpointMediaTypes endpointMediaTypes, CorsEndpointProperties corsProperties,
                                                                         WebEndpointProperties webEndpointProperties, Environment environment) {
        List<ExposableEndpoint<?>> allEndpoints = new ArrayList();
        Collection<ExposableWebEndpoint> webEndpoints = webEndpointsSupplier.getEndpoints();
        allEndpoints.addAll(webEndpoints);
        allEndpoints.addAll(servletEndpointsSupplier.getEndpoints());
        allEndpoints.addAll(controllerEndpointsSupplier.getEndpoints());
        String basePath = webEndpointProperties.getBasePath();
        EndpointMapping endpointMapping = new EndpointMapping(basePath);
        boolean shouldRegisterLinksMapping = this.shouldRegisterLinksMapping(webEndpointProperties, environment,
                basePath);
        return new WebMvcEndpointHandlerMapping(endpointMapping, webEndpoints, endpointMediaTypes,
                corsProperties.toCorsConfiguration(), new EndpointLinksResolver(allEndpoints, basePath),
                shouldRegisterLinksMapping, null);
    }

    private boolean shouldRegisterLinksMapping(WebEndpointProperties webEndpointProperties, Environment environment,
                                               String basePath) {
        return webEndpointProperties.getDiscovery().isEnabled() && (StringUtils.hasText(basePath)
                || ManagementPortType.get(environment).equals(ManagementPortType.DIFFERENT));
    }

}

11.创建MD5加密⼯具类

        项⽬中使⽤commons-codec,它是Apache提供的⽤于摘要运算、编码解码的⼯具包。常⻅的编码解码⼯具Base64、MD5、Hex、SHA1、DES等。

        在com.example.demo.utils包下创建MD5Utils类,代码如下:

package com.example.demo.utils;

import org.apache.commons.codec.digest.DigestUtils;

public class MD5Utils {
    /**
     * //返回一个用MD5加密后的字符串
     * @param str 原始字符串
     * @return
     */
    public static String md5(String str){
        return DigestUtils.md5Hex(str);
    }

    /**
     * 明文加盐生成最终的密文
     * @param str 要加密的明文
     * @param salt 盐
     * @return 密文
     */
    public static String md5Salt(String str, String salt){
        //先对明文进行MD5加密
        String s = DigestUtils.md5Hex(str);
        //加密后的原文与盐拼接在一起之后再进行一次MD5加密
        String ciphertext = DigestUtils.md5Hex(s + salt);
        //返回密文
        return ciphertext;
    }
}

12.创建⽣成UUID⼯具类

        在com.example.demo.utils包下创建UUIDUtils类,代码如下:

package com.example.demo.utils;

import java.util.UUID;

public class UUIDUtils {

    /**
     * 生成一个UUID
     * @return
     */
    public static String UUID_36(){
        return UUID.randomUUID().toString();
    }

    /**
     * 生成一个32位的UUID
     * @return
     */
    public static String UUID_32(){
        return UUID.randomUUID().toString().replace("-","");
    }
}

13.创建字符串⼯具类

         在com.example,demo.utils包下创建StringUtils类,代码如下:

package com.example.demo.utils;

public class StringUtils {
    /**
     * 校验字符串是否为空
     * @param value 待校验的字符串
     * @return true空,<br/>false非空
     */
    public static boolean isEmpty(String value){
        if(value == null ||value.isEmpty()){
            return true;
        }
        return false;
    }
}

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

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

相关文章

DBeaver新建Elasticsearch连接报错Error downloading driver libraries解决方案

1.软件版本背景 DBeaver Ultimate 22.1.0 elasticsearch 7.10 可能因DBeaver的版本不同&#xff0c;导致页面略有差异&#xff0c;请自行脑补&#xff01; 2.新建数据库&#xff08;Elasticsearch&#xff09;连接 点击新建数据库连接按钮 选择Elasticsearch 填写相关配置…

javaScript:节点操作

目录 前言 常用的节点操作 innerHTML 的两个弊端&#xff08;补充&#xff09; createElement(标签名)使用dom方法创建一个元素 父元素.appendChild(子元素) 添加到父元素 注意 指定插入 父元素.insertBefore(要添加的元素&#xff0c;父元素中的指定子元素) 注意&…

Android Studio 汉化

一、汉化&#xff1a; 查看版本号&#xff0c;查看Android Studio版本&#xff0c;根据版本下载对应的汉化包。例如我的是223。 下载汉化包&#xff1a; 中文语言包下载地址 找到对应的版本 回到Android Studio 1、进入设置 2、从磁盘安装插件 3、选择下载好的包点击OK 4、…

kibana设置ILM

kibana设置ILM 1. 背景 kibana version: v7.9.3 2. 设置ILM 2.1 创建索引生命周期策略 2.1.1 热阶段 首先需要先创建索引生命周期策略&#xff0c;在索引模板中可以引用创建好的索引生命周期策略。 策略名称&#xff1a; 引用该策略是需要用&#xff0c;例如设置为&#…

【LeetCode75】第四十七题 迷宫中离入口最近的出口

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目给我们一个数组形式的地图&#xff0c;让我们找出离入口最近的出口&#xff0c;出口就是地图的边界。 那么这道题可以使用DFS也可以…

Vue+elementUI 导出word打印

import JSZipUtils from "jszip-utils"; import JSZip from "pizzip"; import Docxtemplater from "docxtemplater"; npm安装以上依赖 首先维护个word模板 导出方法 //导出wordskipOutWord(row) {var printData rowconst data JSON.parse(JS…

作品集(陆续上传中)

智能家居---不断完善中 家居-CSDN直播 家居 语音刷抖音 --- 基于串口和adb 基于守护进程的语音刷抖音-CSDN直播 基于守护进程的语音刷抖音 海天一色项目 --- 船舶靠港零碳排加热器 FTP云盘 --- 多进程和socket FTP云盘-CSDN直播 FTP云盘

JS 删除数组中的第一项和最后一项

JS 删除数组中的第一项和最后一项 需求分析 需求 JS 删除数组中的第一项和最后一项 分析 删除数组第一个元素 array.shift() /* 1. shift() 方法用于把数组的第一个元素从其中删除。 2. 返回值&#xff1a; 被删除的元素&#xff08;即数组原来的第一个元素的值&#xff09;。…

Unity——LitJSON的安装

一、LitJSON介绍 特点 LitJSON是一个轻量级的C# JSON库&#xff0c;用于在Unity游戏开发中进行JSON数据的序列化和反序列化操作。它提供了简单而高效的接口&#xff0c;帮助开发者处理JSON数据。 以下是LitJSON库的一些主要特点和功能&#xff1a; 1. 高性能&#xff1a;Lit…

死锁是什么?死锁的字节码指令了解?

用幽默浅显的言语来说死锁 半生&#xff1a;我已经拿到了机考的第一名&#xff0c;就差笔试第一名了 小一&#xff1a;我已经拿到了笔试的第一名&#xff0c;就差机考第一名了 面试官&#xff1a;我很看好你俩&#xff0c;继续"干", 同时拿到2个的第一名才能拿到offe…

华为云云服务器评测|基于云服务器的minio部署手册

华为云云服务器评测|基于云服务器的minio部署手册 【软件安装版本】【集群安装&#xff08;是&#xff09;&#xff08;否&#xff09;】 版本 创建人 修改人 创建时间 备注 1.0 jz jz 2023.9.2 minio华为云耀服务器 一. 部署规划与架构 1. 规…

降低LLM的幻觉风险:实用策略与技术

一、前言 近年来&#xff0c;大语言模型的快速发展为构建更智能和更人性化的AI系统提供了很多可能性。像GPT-3.5、GPT-4、Bard、Claude 2和LLaMa 2等大语言模型 (LLM) 在个人助理或聊天机器人应用领域展示了强大的潜力&#xff0c;可以生成流畅而令人惊叹的响应来回答用户的问…

新学期第一篇博客

文章目录 一、加入QQ群&#xff08;一&#xff09;QQ群号&#xff08;二&#xff09;加群要求 二、加入云班课三、使用思维导图&#xff08;一&#xff09;下载XMind软件&#xff08;二&#xff09;安装XMind软件&#xff08;三&#xff09;创建思维导图1、选择模板&#xff08…

【C++】拷贝对象时,编译器的偷偷优化

你知道吗&#xff1f;对于连续的”构造拷贝构造“&#xff0c;编译器其实是会默默做出优化的。&#x1f47b; 如果你不知道这个知识点的话&#xff0c;那下面这道笔试题就要失分了&#x1f635;。 本篇分享一个关于编译器优化的小知识&#xff0c;看完本篇&#xff0c;你就能…

阿里云服务器退款规则_退款政策全解析

阿里云退款政策全解析&#xff0c;阿里云退款分为五天无理由全额退和非全额退订两种&#xff0c;阿里云百科以云服务器为例&#xff0c;阿里云服务器包年包月支持五天无理由全额退订&#xff0c;可申请无理由全额退款&#xff0c;如果是按量付费的云服务器直接释放资源即可。阿…

C++ Primer Plus 第六章笔记

目录 if 语句 if else语句 if else if else结构 逻辑运算符--&&,||和! cctype字符函数库 条件运算符&#xff08;三目运算符) switch语句 continue和break语句 基本文件输入/输出 总结&#xff1a;本文主要介绍了分支语句和if判断语句&#xff0c;运算符和简…

vue 浏览器记住密码后,自动填充账号密码错位

亲测有效&#xff01;&#xff01;! 遇到的场景&#xff1a; 浏览器记住密码后&#xff0c;登录时自动填充账号密码&#xff0c;由于登录时只需要这两个字段所以没问题&#xff0c;见图一&#xff0c;但注册时&#xff0c;账号密码不在一处&#xff0c;见图二 原本账号应该在…

浅谈JVM内存模型与GC垃圾回收

目录 1. 摘要 2. JVM 简单介绍 3. 线程私有的有哪些&#xff1f; 4. 线程共享的有哪些&#xff1f; 5. JVM 栈中程序是如何操作数据的&#xff1f; 6. 内存泄露是什么意思&#xff1f; 7. 堆内存的分配规则 8. 垃圾回收算法 8.1 垃圾回收机制简单概括 8.2 标记清理算法…

UNIAPP之js/nvue混淆探索

因项目需要对UNIAPP的js混淆做了一些调研 混淆教程: https://uniapp.dcloud.net.cn/tutorial/app-sec-confusion.html 按照教程配置进行打包正式包进行混淆 下载正式包将 .ipa改为.zip 解压获取到HBuilder.app 右键显示包内容 获取到混淆的key 不同时间进行打包混淆同一文…

谷器数据被认证为全国信标委软工分委会全权成员单位

8月23日&#xff0c;全国信息技术标准化技术委员会软件与系统工程分技术委员会&#xff08;简称&#xff1a;全国信标委软工分委会&#xff0c;SAC/TC28/SC7&#xff09;批准通过新一批成员单位&#xff0c;北京谷器数据科技有限公司被成功授牌为全权成员单位。 全国信标委软件…