谷粒学院开发(三):统一日志、异常及前端准备工作

news2025/1/11 17:53:36

特定异常处理

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)  // 指定出现什么异常会被处理
    @ResponseBody  // 为了能够返回数据
    public R error(Exception e) {
        e.printStackTrace();
        return R.error().message("执行了全局异常处理");
    }

    // 特定异常处理
    @ExceptionHandler(ArithmeticException.class)  // 指定出现什么异常会被处理
    @ResponseBody  // 为了能够返回数据
    public R error(ArithmeticException e) {
        e.printStackTrace();
        return R.error().message("执行了ArithmeticException异常处理");
    }
}

自定义异常处理

  1. 创建自定义异常类继承RuntimeException,写异常属性

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class GuliException extends RuntimeException{
        @ApiModelProperty("异常状态码")
        private Integer code;
        @ApiModelProperty("异常信息")
        private String msg;
    }
    
  2. 添加异常处理方法

    @ExceptionHandler(GuliException.class)  // 指定出现什么异常会被处理
    @ResponseBody  // 为了能够返回数据
    public R error(GuliException e) {
        e.printStackTrace();
        return R.error().code(e.getCode()).message(e.getMsg());
    }
    
  3. 在需要抛出异常的地方抛出

    try {
        int i = 10/0;
    } catch(Exception e) {
        throw new GuliException(20001, "自定义异常");
    }
    

统一日志处理

日志级别

在springboot配置文件中配置

# 设置日志级别, ERROR, WARN, INFO, DEBUG, ALL, 越靠后显示内容越多
logging.level.root=INFO

把日志输出到文件中

使用Logback工具

  1. 把之前在properties文件里面添加的所有日志相关的内容全部删掉

    # 设置日志级别, ERROR, WARN, INFO, DEBUG, ALL, 越靠后显示内容越多
    #logging.level.root=INFO
    # mybatis日志
    #mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
    
  2. resources中创建logback-spring.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration  scan="true" scanPeriod="10 seconds">
        <!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
        <!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
        <!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
        <!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
    
        <contextName>logback</contextName>
        <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
        <property name="log.path" value="D:/guli_1010/edu" />
    
        <!-- 彩色日志 -->
        <!-- 配置格式变量:CONSOLE_LOG_PATTERN 彩色日志格式 -->
        <!-- magenta:洋红 -->
        <!-- boldMagenta:粗红-->
        <!-- cyan:青色 -->
        <!-- white:白色 -->
        <!-- magenta:洋红 -->
        <property name="CONSOLE_LOG_PATTERN"
                  value="%yellow(%date{yyyy-MM-dd HH:mm:ss}) |%highlight(%-5level) |%blue(%thread) |%blue(%file:%line) |%green(%logger) |%cyan(%msg%n)"/>
    
    
        <!--输出到控制台-->
        <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
            <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
            <!-- 例如:如果此处配置了INFO级别,则后面其他位置即使配置了DEBUG级别的日志,也不会被输出 -->
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>INFO</level>
            </filter>
            <encoder>
                <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
                <!-- 设置字符集 -->
                <charset>UTF-8</charset>
            </encoder>
        </appender>
    
    
        <!--输出到文件-->
    
        <!-- 时间滚动输出 level为 INFO 日志 -->
        <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!-- 正在记录的日志文件的路径及文件名 -->
            <file>${log.path}/log_info.log</file>
            <!--日志文件输出格式-->
            <encoder>
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
                <charset>UTF-8</charset>
            </encoder>
            <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!-- 每天日志归档路径以及格式 -->
                <fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
                <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <maxFileSize>100MB</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
                <!--日志文件保留天数-->
                <maxHistory>15</maxHistory>
            </rollingPolicy>
            <!-- 此日志文件只记录info级别的 -->
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>INFO</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
        </appender>
    
        <!-- 时间滚动输出 level为 WARN 日志 -->
        <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!-- 正在记录的日志文件的路径及文件名 -->
            <file>${log.path}/log_warn.log</file>
            <!--日志文件输出格式-->
            <encoder>
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
                <charset>UTF-8</charset> <!-- 此处设置字符集 -->
            </encoder>
            <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
                <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <maxFileSize>100MB</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
                <!--日志文件保留天数-->
                <maxHistory>15</maxHistory>
            </rollingPolicy>
            <!-- 此日志文件只记录warn级别的 -->
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>warn</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
        </appender>
    
    
        <!-- 时间滚动输出 level为 ERROR 日志 -->
        <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!-- 正在记录的日志文件的路径及文件名 -->
            <file>${log.path}/log_error.log</file>
            <!--日志文件输出格式-->
            <encoder>
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
                <charset>UTF-8</charset> <!-- 此处设置字符集 -->
            </encoder>
            <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
                <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <maxFileSize>100MB</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
                <!--日志文件保留天数-->
                <maxHistory>15</maxHistory>
            </rollingPolicy>
            <!-- 此日志文件只记录ERROR级别的 -->
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>ERROR</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
        </appender>
    
        <!--
            <logger>用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender>。
            <logger>仅有一个name属性,
            一个可选的level和一个可选的addtivity属性。
            name:用来指定受此logger约束的某一个包或者具体的某一个类。
            level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
                  如果未设置此属性,那么当前logger将会继承上级的级别。
        -->
        <!--
            使用mybatis的时候,sql语句是debug下才会打印,而这里我们只配置了info,所以想要查看sql语句的话,有以下两种操作:
            第一种把<root level="INFO">改成<root level="DEBUG">这样就会打印sql,不过这样日志那边会出现很多其他消息
            第二种就是单独给mapper下目录配置DEBUG模式,代码如下,这样配置sql语句会打印,其他还是正常DEBUG级别:
         -->
        <!--开发环境:打印控制台-->
        <springProfile name="dev">
            <!--可以输出项目中的debug日志,包括mybatis的sql日志-->
            <logger name="com.liuscoding.edu.mapper" level="DEBUG" additivity="false"/>
    
            <!--
                root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
                level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,默认是DEBUG
                可以包含零个或多个appender元素。
            -->
            <root level="INFO">
                <appender-ref ref="CONSOLE" />
                <appender-ref ref="INFO_FILE" />
                <appender-ref ref="WARN_FILE" />
                <appender-ref ref="ERROR_FILE" />
            </root>
        </springProfile>
    
    
        <!--生产环境:输出到文件-->
        <springProfile name="pro">
    
            <root level="INFO">
                <appender-ref ref="CONSOLE" />
                <appender-ref ref="DEBUG_FILE" />
                <appender-ref ref="INFO_FILE" />
                <appender-ref ref="ERROR_FILE" />
                <appender-ref ref="WARN_FILE" />
            </root>
        </springProfile>
    
    </configuration>
    

将异常信息输出到文件中

  1. 在异常处理类加上注解 @Slf4j

    @ControllerAdvice
    @Slf4j
    public class GlobalExceptionHandler {
    
  2. 在具体执行异常处理函数里面输出日志

    @ExceptionHandler(GuliException.class)  // 指定出现什么异常会被处理
    @ResponseBody  // 为了能够返回数据
    public R error(GuliException e) {
        log.error(e.getMsg());  // 这里是输出日志的
        e.printStackTrace();
        return R.error().code(e.getCode()).message(e.getMsg());
    }
    

前端技术

VSCode安装下面的插件

image-20230310083740145

创建工作区

前端代码卸载工作区里

  1. 在本地创建空文件夹
  2. 使用vscode大概空文件夹
  3. 选择 文件=>将工作区另存为 把这个工作区保存到刚刚的空文件夹里面

Vue

Vue入门案例

  1. 创建html页面,vscode 中使用 ! 可以快速生成

  2. 引入vue的js文件,类似于jquery

    <script src="vue.min.js"></script>
    
  3. 在html页面创建div标签,添加id属性

    <div id="app"></div>
    
  4. 编写vue代码,固定的结构

    <script>
        // 创建一个vue对象
        new Vue({
            el: '#app',  // 绑定vue作用的范围
            data: {  // 定义页面中显示的模型数据
                message: 'Hello Vue!'
            }
        })
    </script>
    
  5. 使用插值表达式
    获取data里面定义的值 {{名称}}
    image-20230310100248450

抽取代码片段

抽取页面基本结构,方便之后的工程使用

{
	"vue htm": {
		"scope": "html",
		"prefix": "vuehtml",
		"body": [
			"<!DOCTYPE html>",
			"<html lang=\"en\">",
			"",
			"<head>",
			"    <meta charset=\"UTF-8\">",
			"    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">",
			"    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">",
			"    <title>Document</title>",
			"</head>",
			"",
			"<body>",
			"    <div id=\"app\">",
			"",
			"    </div>",
			"    <script src=\"vue.min.js\"></script>",
			"    <script>",
			"        new Vue({",
			"            el: '#app',",
			"            data: {",
			"                $1",
			"            }",
			"        })",
			"    </script>",
			"</body>",
			"</html>"
		]
	}
}

axios

  1. 不是vue里面的一部分,但是经常和vue一起使用,用来实现ajax操作。

  2. 使用axios应用场景
    image-20230310151430507

  3. axios的使用

    • 创建html页面,引入js文件,包含两个js文件:vue和axios

      <script src="vue.min.js"></script>
      <script src="axios.min.js"></script>
      
    • 编写axios代码

      1. 构造json文件,用于后面请求数据
        image-20230310152149502

      2. 发送ajax请求文件,得到数据在页面显示

        new Vue({
            el: '#app',
            data: {  // 定义变量和初始值
                userList: []  // 定义变量,空数组
            },
            created() {  // 页面渲染之前执行
                // 调用定义的方法
                this.getUserList()
            },
            methods: {  // 编写具体的方法
                // 创建方法,查询所有用户数据
                getUserList() {
                    // 使用axios发送ajax请求
                    // axios.提交方式("请求接口路径").then(箭头函数).catch(箭头函数)
                    axios.get("data.json")
                        .then(response => {  // response就是请求后返回的数据
                            console.log('***'+response)
                        })  // 请求成功执行then方法
                        .catch(error => {
                        })  // 请求失败执行catch方法
                }
            }
        })
        
new Vue({
    el: '#app',
    data: {  // 定义变量和初始值
        userList: []  // 定义变量,空数组
    },
    created() {  // 页面渲染之前执行
        // 调用定义的方法
        this.getUserList()
    },
    methods: {  // 编写具体的方法
        // 创建方法,查询所有用户数据
        getUserList() {
            // 使用axios发送ajax请求
            // axios.提交方式("请求接口路径").then(箭头函数).catch(箭头函数)
            axios.get("data.json")
                .then(response => {  // response就是请求后返回的数据
                    // console.log(response)
                    // console.log(response.data.data.items)
                    this.userList = response.data.data.items
                })  // 请求成功执行then方法
                .catch(error => {
                })  // 请求失败执行catch方法
        }
    }
})
<!-- 把userList里的数据进行显示 -->
<table border="1">
    <tr v-for="(user,index) in userList">
        <td>{{index}}</td>
        <td>{{user.name}}</td>
        <td>{{user.age}}</td>
    </tr>
</table>

element-ui

饿了么出品的基于Vue.js的后台组件

https://element.eleme.cn/#/zh-CN/

Node.js

  1. 什么是Node.js
    不需要浏览器,直接使用nodejs运行JavaScript代码

  2. 模拟服务器效果,比如tomcat

    const http = require('http');
    
    http.createServer(function (request, response) {
        // 发送HTTP头部
        // HTTP 状态值200 : OK
        // 内容类型: text/plain
        response.writeHead(200, {'Content-Type':'text/plain'});
        response.end('Hello Server');
    }).listen(8888);
    
    console.log('Server running at http://127.0.0.1:8888/');
    
  3. 使用nodejs执行JavaScript代码

    console.log("hello nodejs")
    

使用node命令执行js文件即可。

npm

后端中,maven用来构建项目,管理jar依赖,联网下载依赖
相当于前端的maven,管理前端js依赖,联网下载js依赖,比如jquery

演示npm具体操作

  1. npm项目初始化
    使用命令 npm init
    项目初始化之后会生成一个文件 package.json 类似于后端的 pom.xml

  2. npm下载js依赖
    使用命令 npm install 依赖名称
    设置成淘宝的镜像

    # 配置镜像地址
    npm config set registry https://registry.npm.taobao.org
    
    # 查看npm配置信息
    npm config list
    

babel

转码器,把es6代码转换成es5代码,提高代码的浏览器兼容性。

安装babel工具

npm install --global babel-cli

创建es6代码

let input = [1, 2, 3]
// 将数组的每个元素 +1
input = input.map(item => item + 1)
console.log(input)

配置.babelrc

是Babel的配置文件,存放在项目的根目录下,用来设置转码规则和插件,基本格式如下

{
    "presets": ["es2015"],
    "plugins": []
}

安装es2015转码器

npm install --save-dev babel-preset-es2015

使用命令转码

  • 根据文件转码
babel 源文件路径 -o 目标文件路径
  • 根据文件夹转码
babel 源文件夹 -d 目标文件夹

转换过来的js文件与源文件同名

模块化

是什么

  • 开发后端接口的时候,开发controller service mapper,controller注入service,service注入mapper
    后端中类与类之间的调用称为后端模块化操作
  • 前端模块化,在前端中,js与js之间的调用称为模块化

es5实现模块化

01.js

// 创建方法

const sum = function(a,b){
    return parseInt(a) + parseInt(b)
}
const subtract = function(a,b){
    return parseInt(a) - parseInt(b)
}

// 设置哪些方法可以被其他js调用
module.exports = {
    sum: sum,
    subtract: subtract
}

02.js

// 调用01.js方法

const m = require('./01.js')

const res1 = m.sum(1, 2);
const res2 = m.subtract(2, 1);

console.log(res1)
console.log(res2)

es6实现模块化

如果es6的模块化不能在nodejs中运行,则需要使用babel转换成es5之后才能运行

01.js

// 定义方法,设置哪些方法可以被其他js调用

export function getList() {
    console.log('获取数据列表');
}

export function save() {
    console.log('保存')
}

// 简化: 可以输出多个函数
// 使用这个之后,上面的函数无法输出
export default {
    test() {
        console.log('test')
    },
    test2() {
        console.log('test2')
    },
    getList() {
        console.log('获取数据列表');
    },
    save() {
        console.log('保存')
    }
}

02.js

// 引入01.js,调用01.js的方法

import { getList, save } from "./01.js";

getList()
save()

02.js写法2

import m from './01.js'

m.test();
m.getList();

webpack

前端资源加载/打包工具。可以根据依赖关系将多种js、css、less文件转换成一个静态文件,减少页面请求。

image-20230311082837746

  1. 安装webpack工具

    npm install -g webpack webpack-cli
    
  2. 初始化项目

    npm init -y
    
  3. 新建一个文件夹,创建三个js文件

    // common.js
    exports.info = function (str) {
        document.write(str)  // 浏览器中输出
    }
    
    // utils.js
    exports.add = function (a, b) {
        return a + b
    }
    
    // main.js
    const common = require('./common.js')
    const utils = require('./utils.js')
    
    common.info('hello common' + utils.add(1, 2))
    
  4. 创建webpack配置文件,配置打包信息
    image-20230311084630236

    const path = require("path"); //Node.js内置模块 
    module.exports = {
        entry: './src/main.js', //配置入口文件 
        output: {
            path: path.resolve(__dirname, './dist'), //输出路径,__dirname:当前文件所在路 
            filename: 'bundle.js' //输出文件
        }
    }
    
  5. 使用命令执行打包工作

    webpack  # 有黄色警告
    webpack --mode=development  # 没有警告, 可以设置production或development
    

打包css

  1. 创建css文件,写样式内容

    body {
        background-color: red;
    }
    
  2. 在main.js中引入css文件

    // 引入css文件
    require('./style.css')
    
  3. 安装style-loader 和 css-loader
    webpack本身只能处理JavaScript模块,如果要处理其他类型的文件,就需要使用loader进行转换

    npm install --save-dev style-loader css-loader
    
  4. 修改webpack.config.js

    const path = require("path"); //Node.js内置模块 
    module.exports = {
        entry: './src/main.js', //配置入口文件 
        output: {
            path: path.resolve(__dirname, './dist'), //输出路径,__dirname:当前文件所在路 
            filename: 'bundle.js' //输出文件
        },
        module: {
            rules: [
                {
                    test: /\.css$/,  // 打包规则应用到.css结尾的文件上
                    use: ['style-loader','css-loader']
                }
            ]
    
        }
    }
    

搭建项目前端页面环境

选取一个模版(框架)进行环境搭建,这里选取vue-admin-template

  1. 解压压缩文件到工作区
  2. 通过vscode终端打开解压的文件夹,进行依赖安装
    通过配置文件加载依赖,使用命令npm install ,报错的话可以加上 --legacy-peer-deps 参数
  3. 启动下载好的项目
    命令 npm run dev

前端页面环境说明

  1. 前端框架入口
    image-20230311101307965

  2. 前端页面环境使用框架(模版),主要基于两种技术实现出来
    vue-admin-template模版 = vue + element-ui

  3. build目录
    放项目构件的脚本文件

  4. config目录
    index.js中把useEslint: true,值改为false
    接口的地址在另外两个js文件中修改,这两个文件分别对应 npm run devnpm run prod
    image-20230311102009438

  5. src目录
    image-20230311102442907

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

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

相关文章

Linux--磁盘存储管理 分区工具 fdisk 分区实操 详解~

上一篇文章介绍了 fdisk 的各个菜单功能&#xff0c;这篇&#xff0c;我们直接实操 管理磁盘 fdisk :分区 &#xff1a; 我们上一篇文章里讲过&#xff0c;上篇文章的 磁盘 /dev/nvme0n1 空间已经满了因此 &#xff0c; 又重新添加了一块儿硬盘~&#xff01;&#xff01;>&g…

传统图像处理之颜色特征

博主简介 博主是一名大二学生&#xff0c;主攻人工智能研究。感谢让我们在CSDN相遇&#xff0c;博主致力于在这里分享关于人工智能&#xff0c;c&#xff0c;Python&#xff0c;爬虫等方面知识的分享。 如果有需要的小伙伴可以关注博主&#xff0c;博主会继续更新的&#xff0c…

UML时序图速查——架构设计必备技能

目录 一、时序图概述 二、时序图元素 1. Actor&#xff08;角色&#xff09;& Object&#xff08;对象&#xff09; 2. Lifeline&#xff08;生命线&#xff09; 3. Message&#xff08;消息&#xff09; 4. Combined Fragment&#xff08;组合片段&#xff09; 5. …

【Linux】多线程---线程控制

进程在前面已经讲过了&#xff0c;所以这次我们来讨论一下多线程。前言&#xff1a;线程的背景进程是Linux中资源及事物管理的基本单位&#xff0c;是系统进行资源分配和调度的一个独立单位。但是实现进程间通信需要借助操作系统中专门的通信机制&#xff0c;但是只这些机制将占…

java并发入门(一)共享模型—Synchronized、Wait/Notify、pack/unpack

一、共享模型—管程 1、共享存在的问题 1.1 共享变量案例 package com.yyds.juc.monitor;import lombok.extern.slf4j.Slf4j;Slf4j(topic "c.MTest1") public class MTest1 {static int counter 0;public static void main(String[] args) throws InterruptedEx…

如何科学管理技术团队的研发交付速率?

每当提及「研发效能」&#xff0c;我们都在谈论什么&#xff1f; 研发效能管理要在保证质量的前提下&#xff0c;思考如何更快地向客户交付价值。在管理实践中&#xff0c;效能度量涉及三大维度&#xff1a;交付速率、交付质量、交付价值。 技术团队对内如何优化开发流程&…

STM32实战项目-基本定时器

前言&#xff1a; 通过基本定时器TIM6&#xff0c;让三个LED灯每间隔1s闪烁一次。 目录 1.基本定时器参数配置 1.1框图分析 1.2参数配置 2.软件程序 2.1整体框架 2.2定时器结构体 2.3定时器回调函数 1.基本定时器参数配置 1.1框图分析 TIM6作为基本定时器 它是挂载…

【Linux】-- 线程池

目录 铺垫 内存 线程的角度 线程池 基本代码结构 对于线程池的生产消费的完善 初步实现线程池生产消费 结合日志完善线程池 铺垫 内存 &#xff08;以STL处理方式&#xff0c;引入提供效率的一种思想&#xff09; 通过进行C语言与C语言的学习中&#xff0c;平时我们使…

C语言 深度剖析数据在内存中的存储(2)

本次博客是继上次博客&#xff0c;继续向下剖析数据在内存当中的存储。练习浮点型在内存中的存储练习代码1&#xff1a;int main() {char a -1;signed char b-1;unsigned char c-1;printf("a%d,b%d,c%d",a,b,c);return 0; }1.在本题中首先我们要知道的是%d打印的是有…

【数据结构之树】——什么是树,树的特点,树的相关概念和表示方法以及在实际的应用。

文章目录一、1.树是什么&#xff1f;2.树的特点二、树的相关概念三、树的表示方法1.常规方法表示树2.使用左孩子右兄弟表示法3. 使用顺序表来存储父亲节点的下标三、树在实际的应用总结一、1.树是什么&#xff1f; 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n&…

MatCap模拟光照效果实现

大家好&#xff0c;我是阿赵 之前介绍过各种光照模型的实现方法。那些光照模型的实现虽然有算法上的不同&#xff0c;但基本上都是灯光方向和法线方向的计算得出的明暗结果。 下面介绍一种叫做MatCap的模拟光照效果&#xff0c;这种方式计算非常简单&#xff0c;脱离灯光的计算…

javaWeb核心05-FilterListenerAjax(Axios)json

文章目录Filter&Listener&Ajax1&#xff0c;Filter1.1 Filter概述1.2 Filter快速入门1.2.1 开发步骤1.2.2 代码演示1.3 Filter执行流程1.4 Filter拦截路径配置1.5 过滤器链1.5.1 概述1.5.2 代码演示1.5.3 问题1.6 案例1.6.1 需求1.6.2 分析1.6.3 代码实现1.6.3.1 创建F…

Linux 安装 nginx 详细教程

文章目录Linux 安装 nginx 详细步骤①安装依赖包②下载并解压安装包③安装 nginx④启动 nginx 服务⑤配置 nginx.conf提示&#xff1a;以下是本篇文章正文内容&#xff0c;Linux 系列学习将会持续更新 Linux 安装 nginx 详细步骤 ①安装依赖包 下载模块依赖性 Nginx 需要依赖…

resp无法连接Redis服务的解决方法

在保证Windows主机和Linux虚拟机能够相互ping通的前提下&#xff0c;resp仍无法连接到Linux上的redis服务&#xff0c;那么需要考虑以下原因&#xff1a; Linux防火墙问题&#xff0c;Linux未关闭防火墙&#xff0c;或防火墙未放通6379/tcp端口&#xff1b;redis配置问题&#…

Project ERROR: Unknown module(s) in QT: webenginewidgets

Qt系列文章目录 文章目录Qt系列文章目录前言一、问题定位二、解决方法1.引入WebEngine库2.重新打开工程3. 解决办法&#xff1a;运行结果前言 最近项目中需要用到&#xff1a;Qt中使用cesium三维引擎库&#xff0c;涉及到Qt和和JavaScript之间通信&#xff0c;工程源码报错&am…

202109-3 CCF 脉冲神经网络 66分题解 + 解题思路 + 解题过程

解题思路 根据题意&#xff0c;脉冲源的阈值大于随机数时&#xff0c;会向其所有出点发送脉冲 神经元当v>30时&#xff0c;会向其所有出点发送脉冲&#xff0c;unordered_map <int, vector > ne; //存储神经元/脉冲源的所有出点集合vector 所有脉冲会有一定的延迟&am…

opencv-图像操作

访问和修改像素值 我们先加载一个彩色图像&#xff1a; import cv2img cv2.imread(b.png) print(img)########### 打印结果 ########### [[[243 243 243][243 243 243][243 243 243]...[243 243 243][243 243 243][243 243 243]][[243 243 243][243 243 243][243 243 243].…

每天五分钟机器学习:你理解贝叶斯公式吗?

本文重点 贝叶斯算法是机器学习算法中非常经典的算法,也是非常古老的一个算法,但是它至今仍然发挥着重大的作用,本节课程及其以后的专栏将会对贝叶斯算法来做一个简单的介绍。 贝叶斯公式 贝叶斯公式是由联合概率推导而来 其中p(Y|X)称为后验概率,P(Y)称为先验概率…

mysql navicat忘记密码

mysql忘记密码是常用的事情&#xff0c;那么如何解决它呢&#xff1f;1、首先将MySQL的服务关闭&#xff0c;两种方法&#xff1a;&#xff08;1&#xff09;打开命令行cmd输入net stop mysql命令即可关闭MySQL服务。&#xff08;2&#xff09;打开任务管理器&#xff0c;找到服…

【观察】亚信科技:“飞轮效应”背后的数智化创新“延长线”

著名管理学家吉姆柯林斯在《从优秀到卓越》一书中提出“飞轮效应”&#xff0c;它指的是为了使静止的飞轮转动起来&#xff0c;一开始必须使很大的力气&#xff0c;每转一圈都很费力&#xff0c;但达到某一临界点后&#xff0c;飞轮的重力和冲力就会成为推动力的一部分&#xf…