SpringBoot+Vue 简单小文章项目开发全过程

news2024/9/24 11:24:46

文章目录

  • 一、项目介绍
  • 二、需求设计
  • 三、数据库设计
  • 四、项目构建
    • 项目技术选型:
    • 构建项目说明:
      • 项目架构
      • maven
      • MySQL
      • Redis
  • 五、项目开发:
    • 项目开发思路:
    • 项目开发过程:
      • 1. 导入文件包/新建项目
      • 2. 新建子模块:
        • common模块
        • pojo模块
        • server模块
      • 3. 明确需求,开始开发
      • 4. server模块配置,让项目跑起来:
      • 5. 项目开发开始
      • 6. SpringBoot操作数据库配置
      • 7. 开发功能
      • 8. 增删改查功能开发
      • 9. 登录注册功能开发
      • 10. AOP权限校验
      • 11.前端相关
        • vue.config.js
        • main.js
        • 页面向后端发送请求:
  • 六、总结

一、项目介绍

这是个简单的项目,大概功能就是一个简单的记事本吧,发布文章,查看文章,登录注册。
项目仓库链接:仓库
接下来的文章最好是参考仓库里的代码来读,不要跟着文章敲。文章里面不会手把手带你敲的。

二、需求设计

就是登录注册,文章增删改查吧。

三、数据库设计

很简单得设计了一下,就三张表。一张用户表,一张分类表,一张文章表。
用户表:
id,username,password,name,email,role
分类表:
id,name
文章表:
id,title,content,category_id,user_id

四、项目构建

项目技术选型:

我们这个项目太简单了,就用用SpringBoot来构建项目。

构建项目说明:

项目架构

在这里插入图片描述
我们的项目主要就是3个模块,
common公用模块,公用的东西都在里面。(common模块的东西是照抄苍穹外卖的)
pojo数据模块,很多数据相关的东西就在这里面,比如说数据实体类什么的。
server服务模块,这个模块就是负责提供各种服务了。

maven

maven是一款为Java项目提供构建依赖管理支持的工具。
我们的项目会有很多依赖,这些依赖就得依靠maven了。
而依赖的东西添加的话就可以在pom.xml文件里面加。

MySQL

关系型数据库。所谓的数据持久化,就是将数据存起来,一般就是将数据存在本地。我们前面的数据库设计就是针对的MySQL数据库的设计。

Redis

非关系型数据库。KV存储结构。

五、项目开发:

项目开发思路:

一个字,抄。
要自己写项目,首先你的要去B站找个项目,先抄着,学里面的思路,跟着敲里面的代码,慢慢理解里面代码的功能,不然你想在0基础的情况下从0开始自己写个?做梦!
我前面的那个SpringBoot开发记录就是个例子。我就打算自己写,但是自己不是那么了解流程,不知道自己该做什么,导致我频频出错,项目开发进度贼迟缓,最后这个项目就逐渐搁浅了。是个败笔!
这个项目的开发是我在完成80%苍穹外卖后开始进行的。整个项目的基础文件也是拿的苍穹外卖的。

项目开发过程:

1. 导入文件包/新建项目

其实这一步很简单的,我们只需要新建一个目录(文件夹),然后用IDEA打开这个目录,再在里面复制粘贴我们的总pom.xml文件就行了。当然你也可以新建一个项目,再打开项目中的pom.xml文件,将我们的pom.xml文件的内容复制粘贴上
其实我们的这些pom.xml文件也都是苍穹外卖的,你要是照着敲过一次项目,那么你就会对这个流程有一个深刻的了解。
总pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <artifactId>spring-boot-starter-parent</artifactId>
        <groupId>org.springframework.boot</groupId>
        <version>2.7.3</version>
    </parent>
    <artifactId>CodeHome</artifactId>
    
    <groupId>com.codehome</groupId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>
    <properties>
        <mybatis.spring>2.2.0</mybatis.spring>
        <druid>1.2.1</druid>
        <pagehelper>1.3.0</pagehelper>
        <lombok>1.18.20</lombok>

        <fastjson>1.2.76</fastjson>
        <commons.lang>2.6</commons.lang>
        <aliyun.sdk.oss>3.10.2</aliyun.sdk.oss>
        <knife4j>3.0.2</knife4j>
        <aspectj>1.9.4</aspectj>
        <jjwt>0.9.1</jjwt>
        <jaxb-api>2.3.1</jaxb-api>
        <poi>3.16</poi>
        <spring-boot-starter-mail>2.7.3</spring-boot-starter-mail>
    </properties>
    <dependencyManagement>
        <dependencies>
            <!-- mybatis依赖 -->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>${mybatis.spring}</version>
            </dependency>

            <!-- lombok依赖 -->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok}</version>
            </dependency>

            <!-- fastjson依赖 -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>${fastjson}</version>
            </dependency>

            <!-- commons-lang依赖 -->
            <dependency>
                <groupId>commons-lang</groupId>
                <artifactId>commons-lang</artifactId>
                <version>${commons.lang}</version>
            </dependency>

            <!-- druid依赖 -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid-spring-boot-starter</artifactId>
                <version>${druid}</version>
            </dependency>

            <!-- pagehelper依赖 -->
            <dependency>
                <groupId>com.github.pagehelper</groupId>
                <artifactId>pagehelper-spring-boot-starter</artifactId>
                <version>${pagehelper}</version>
            </dependency>

            <!-- knife4j依赖 -->
            <dependency>
                <groupId>com.github.xiaoymin</groupId>
                <artifactId>knife4j-spring-boot-starter</artifactId>
                <version>${knife4j}</version>
            </dependency>


            <!-- aspectj依赖 --><dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>${aspectj}</version>
        </dependency>

            <dependency>
                <groupId>org.aspectj</groupId>
                <artifactId>aspectjweaver</artifactId>
                <version>${aspectj}</version>
            </dependency>

            <dependency>
                <groupId>io.jsonwebtoken</groupId>
                <artifactId>jjwt</artifactId>
                <version>${jjwt}</version>
            </dependency>

            <dependency>
                <groupId>com.aliyun.oss</groupId>
                <artifactId>aliyun-sdk-oss</artifactId>
                <version>${aliyun.sdk.oss}</version>
            </dependency>

            <dependency>
                <groupId>javax.xml.bind</groupId>
                <artifactId>jaxb-api</artifactId>
                <version>${jaxb-api}</version>
            </dependency>

            <!-- poi -->
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi</artifactId>
                <version>${poi}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>${poi}</version>
            </dependency>
            <!--微信支付-->
            <dependency>
                <groupId>com.github.wechatpay-apiv3</groupId>
                <artifactId>wechatpay-apache-httpclient</artifactId>
                <version>0.4.8</version>
            </dependency>

            <!--邮箱服务-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-mail</artifactId>
                <version>${spring-boot-starter-mail}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

</project>

2. 新建子模块:

在这里插入图片描述
在这里插入图片描述

common模块

这个模块的文件我就是照搬苍穹外卖的了。这个一个公共模块,里面的东西都还是很通用的。

pojo模块

这个模块的作用就是放项目涉及到的一些实体类。按规范来的话分为dto(查询实体类,前端传过来的数据类),entity(实体类,对应数据库里的表的实体类),vo(返回实体类,返回给前端的数据类)。按照实际情况设置。

server模块

这个就是我们的功能模块了。后端的功能就在这个模块里使用。

3. 明确需求,开始开发

按照我们前面的需求设计和数据库来整。
先看数据库:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
看到数据库是这样的了,我们就可以开始写pojo模块的entity部分:
entity的类要和表里的字段对应
Category类:

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Category {
    private Integer id;
    private String name;
}

Paper类:

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Paper {
    private Integer id;
    private String title;
    private String content;
    private Integer categoryId;
    private Long userId;
}

Users:

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Users implements Serializable {
    private Long id;
    private String username;
    private String password;
    private String name;
    private String email;
    private Integer role;
}

好了entity实体类就好了。

4. server模块配置,让项目跑起来:

进行配置:

  1. pom.xml文件:
    老规矩了。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.codehome</groupId>
        <artifactId>CodeHome</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <groupId>com.codehome.server</groupId>
    <artifactId>server</artifactId>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>

        <!--springboot 启动依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <scope>compile</scope>
        </dependency>

        <!-- mysql和mybatis相关依赖 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
        </dependency>


        <!--redis相关依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <optional>true</optional>
        </dependency>

        <!--分页查询依赖-->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
        </dependency>

        <!--lombok相关依赖-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <!--swagger相关依赖-->
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
        </dependency>

        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
        </dependency>

        <!-- poi -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
        </dependency>

        <!--邮箱服务-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>
        <dependency>
            <groupId>com.codehome.common</groupId>
            <artifactId>common</artifactId>
            <version>1.0-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.codehome.pojo</groupId>
            <artifactId>pojo</artifactId>
            <version>1.0-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
    <packaging>jar</packaging>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <!--这里写上main方法所在类的路径-->
                <configuration>
                    <mainClass>com.codehome.server.CodeHomeApplication</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>
  1. yml文件配置
    yml文件
# 配置项目的端口
server:
  port: 8083 

启动类:

@SpringBootApplication
@Slf4j
@ComponentScan(basePackages = {"com.codehome.server","com.codehome.common","com.codehome.pojo"})
public class CodeHomeApplication {
    public static void main(String[] args) {
        SpringApplication.run(CodeHomeApplication.class, args);
        log.info("代码芝士,启动!");
    }
}

配置类:

/**
 * 配置类,注册web层相关组件
 */
@Configuration
@Slf4j
public class WebMvcConfiguration extends WebMvcConfigurationSupport {
    /**
     * 通过knife4j生成接口文档
     * @return
     */
    @Bean
    public Docket docket() {
        ApiInfo apiInfo = new ApiInfoBuilder()
                .title("代码芝士后端接口文档")
                .version("1.0")
                .description("代码芝士后端接口文档")
                .build();
        Docket docket = new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo)
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.codehome.server.controller"))
                .paths(PathSelectors.any())
                .build();
        return docket;
    }

    /**
     * 设置静态资源映射
     * @param registry
     */
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
    }

    /**
     * 消息转换器
     */
    protected void extendMessageConverters(List<HttpMessageConverter<?>> converters){
        log.info("开始扩展消息转换器");
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        converter.setObjectMapper(new JacksonObjectMapper());

        converters.add(0,converter);
    }
}

这样基础就实现了。项目应该就可以跑起来了。

5. 项目开发开始

开发server模块。
这里就要讲一讲controller层,service层,mapper层。
controller层:
controller层里放Controller类,通俗的来讲,Controller类的作用就是接收前端请求数据和返回信息的。
如这样:
我们在前端就可以通过向http://localhost:8083/api/paper/add发送带参数的Post请求来实现添加文章功能。
在这里插入图片描述

service层:
这个层主要负责的就是业务功能的实现了。写接口,实现接口。
在这里插入图片描述
mapper层:
这个层负责操作数据库里的内容。
在这里插入图片描述

6. SpringBoot操作数据库配置

Spring操作数据库一般可以通过MyBatis,MyBatisPlus来。
这里我们就需要进行一些配置了。
1.在pom.xml文件里配置。前面复制粘贴已经整好了。
2.在yml文件里配置:

spring:
  datasource:
    druid:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://127.0.0.1:3306/codehomebase?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
      username: root # 这里用你自己的账号密码
      password: 123456
 mybatis:
  #mapper配置文件
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.codehome.pojo.entity
  configuration:
    #开启驼峰命名
    map-underscore-to-camel-case: true

配置完成后,应该怎么操作数据库呢?
很简单,我们可以整一个Mapper类
在这里插入图片描述
像这样就可以操作数据库了。具体内容可以看后面。

7. 开发功能

首先我们再看看我们的后端需求有哪些:
在这里插入图片描述
一般都是先进行登录注册功能的开发,但老实说,登录注册还是有点难度的,我们就先从文章的增删改查开始开发。

8. 增删改查功能开发

首先我们就要在controller层创建对应的controller类:
在这里插入图片描述
然后就是在service层创建对应的service接口,以及serviceImpl实现类:
在这里插入图片描述
在这里插入图片描述
再然后就是在mapper层创建Mapper类了:
在这里插入图片描述
建好后,项目结构大概是这样的:
在这里插入图片描述
开发CategoryController类:
这里就讲个大概,详情请看源码。
在类名上面:
@RestController是controller层必须加的注解
@RequestMapping("/***")就是请求路径的写法

在类中各个方法上面:
@PostMapping("/add")这个就是请求方式,有PostMapping,GetMapping,PutMapping等等

这里的@Api,@ApiOperation是接口文档相关的东西,详情可以查看
接口文档

@RestController
@RequestMapping("/api/category")
@Api(tags = "分类管理")
public class CategoryController {
    @Autowired  //自动装配注解
    public CategoryService categoryService;

    @PostMapping("/add")
    @ApiOperation("保存分类数据")
    public Result add(@RequestBody CategoryDTO categoryDTO){
        Category category  = Category.builder()
                .name(categoryDTO.getName())
                .build();
        categoryService.save(category);
        return Result.success("新建成功");
    }

顺承下去,CategoryController有了后就得要去写CategoryService接口,在CategoryServiceImpl类中实现它们的功能。
在这里插入图片描述
大概就是这样,要注意加上@Service注解:
在这里插入图片描述
然后就开发mapper层的CategoryMapper:
关于Mapper,我们可以直接在上面写注解,也可以使用xml文件

@Mapper
public interface CategoryMapper {
    @Select("select * from category where name = #{name}")
    Category getCategoryByName(String name);


    void insert(Category category);

    @Delete("delete from category where id = #{id}")
    void deleteById(Integer id);

    void update(Category category);

    @Select("select * from category where id = #{id}")
    Category getById(Integer id);

    @Select("select * from category")
    List<Category> list();
}

在这里插入图片描述
有了上面的这些解释,大家就可以想想文章增删改查怎么写了。基本上都一样,大差不差的。

9. 登录注册功能开发

这里就得要参考登陆注册功能开发

10. AOP权限校验

参考AOP简单的权限校验

11.前端相关

这就很简单了,前端的内容无非就是向后端发送请求得到返回数据,更加返回的数据再在页面上进行渲染显示。
vue需要配置的部分:

vue.config.js
const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
  transpileDependencies: true,
  lintOnSave: false,
  devServer: {
    proxy: {
      '/api': {
        target: 'http://localhost:8083/api/',
        changeOrigin: true,
        pathRewrite: {
          '^/api': ''
        }
      }
    }
  },

})

main.js
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import axios from 'axios'

const app = createApp(App);


const axiosInstance = axios.create({
    baseURL: '/api' // 代理前缀,对应vue.config.js中的配置
});

app.config.globalProperties.$axios = axiosInstance;

app.use(store).use(router).mount('#app')

页面向后端发送请求:

        // 获取数据
        const getData = async () => {
            const token = localStorage.getItem('token');
            try {
            	//以下就是一个带token的请求的发送方式
                const res = await axios.get('/api/category/list', {
                    headers: {
                        token: `${token}`,
                    }
                });
                console.log(paperData.value);
            } catch (error) {
                alert("权限不足")
            }
        }

在这里插入图片描述

六、总结

大概就是这样了。总之就是要多抄,多总结。总结下来的东西才是你自己的。加油!
在这里插入图片描述

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

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

相关文章

数据采集与预处理【大数据导论】

各位大佬好 &#xff0c;这里是阿川的博客&#xff0c;祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 数据采集与预处理前 必看 【大数据导论】—大数据序…

Linux 中的特殊文件权限:SUID、GUID 和 Sticky

注&#xff1a; 机翻&#xff0c;未校。 Special File Permissions in Linux: SUID, GUID and Sticky Bit You see an s instead of x in the file permissions? Linux has some special file permissions called SUID, GUID and Sticky Bit. Know more about them. 在文件权…

了解MVCC

概念 MVCC&#xff0c;全称Multi-Version Concurrency Control&#xff0c;即多版本并发控制&#xff0c;是一种并发控制的方法&#xff0c;维护一个数据的多个版本&#xff0c;使得读写操作没有冲突&#xff0c;快照读为MySQL实现MVCC提供了一个非阻塞读功能。MVCC的具体实现…

C++新手入门学习教程(完整版)

以下教程覆盖了 C 学习的各个方面&#xff0c;适合初学者循序渐进地学习。学习过程中&#xff0c;建议初学者多做练习和项目&#xff0c;以加深对理论知识的理解。希望这个教程能为你提供一个清晰的学习路径。 目录 第一章&#xff1a;C 简介 1.1 C 的历史与演变 1.2 C 的特…

低代码: 系统开发准备之确定一般开发流程,需求分析,技术架构

概述 低代码系统开发之前&#xff0c;我们首先要进行一些准备我们首先知道我们软件开发的一般流程同时&#xff0c;我们还要知道&#xff0c;我们整个系统平台的需求如何之后&#xff0c;我们要基于需求进行设计&#xff0c;包含UI设计与系统架构设计 一般开发流程 系统开发…

数据库典型例题1-画ER图

1.question: solution: 2.画图步骤&#xff1a; 1.圈实体 2.写出实体间关系&#xff0c;确定实体画图位置 3.圈出每个实体的属性 4.画图&#xff0c;注意特殊实体和属性 3.注意点 <1 弱实体 弱实体&#xff1a;一个实体必须依赖于另一个实体存在---->实体双线菱形弱…

centos Python3.6升级3.8

CentOS系统上升级Python3.6到3.8版本。 步骤 1. 更新系统 在开始升级Python之前&#xff0c;首先需要确保系统是最新的。可以使用以下命令更新CentOS系统&#xff1a; sudo yum update 2. 安装依赖项 升级Python之前&#xff0c;需要安装一些依赖项。运行以下命令安装这些依赖…

Common Lisp精解【1】

文章目录 概述什么是 Common Lisp概念历史 应用领域1. 人工智能2. 自然语言处理3. 数据分析4. 系统编程5. Web开发6. 教育与研究7. 其他领域 基础 参考文献 概述 以下内容来自文心一言的自动生成 什么是 Common Lisp Common Lisp&#xff08;缩写为CL&#xff09;是Lisp编程语…

Unity使用Modbus协议

最近一直在工业领域干活&#xff0c;学习下Modbus协议&#xff0c;这里做个记录&#xff0c;理解不对的地方希望大佬指出修正。 一、先上测试工具和Unity脚本。 1.测试工具使用的 Modsim32 2.Unity测试脚本如下 /* 0x01&#xff1a;读线圈 0x05&#xff1a;写单个线圈 0x0F…

计算机组成原理 —— 指令流水线影响因素分类

计算机组成原理 —— 指令流水线影响因素分类 结构冒险结构冒险的原因 数据冒险&#xff08;同步&#xff09;数据旁路的原理数据旁路的类型数据旁路的例子 控制冒险控制冒险的类型控制冒险的例子解决控制冒险的方法示例分析分支预测的策略 超标量和超流水超标量&#xff08;Su…

关于计算机的思考

本文是《Python入门经典以解决计算问题为导向的Python编程实践》一书中第一部分“关于计算机的思考”的笔记&#xff0c;后附上思维导图。 关于计算机的思考 一、为什么要研究计算机科学1、重要性2、“计算机科学”更强调计算而不是编程3、从”通过编程解决问题“的思路出发&a…

RPC通信的简单流程

远程调用者假设需要调用Login方法&#xff0c;将调用的信息通过muduo库&#xff0c;同时进行了序列化和反序列化&#xff0c;发送到Rpcprovider上&#xff0c;RpcProvider通过对象和方法表来确定需要调用哪个服务对象的哪个方法。 UserRpcServiceRpc和UseRpcServiceRpcStub是继…

去中心化社交:探讨Facebook在区块链平台上的实践

随着区块链技术的崛起&#xff0c;社交平台也面临着前所未有的变革。作为全球最大的社交平台之一&#xff0c;Facebook&#xff08;现名Meta Platforms&#xff09;正在积极探索如何将区块链技术融入其平台&#xff0c;以引领去中心化社交的新时代。本文将从不同角度探讨Facebo…

leaflet.motion台风路径动画绘制

在气象领域中&#xff0c;对台风的准确可视化呈现对于灾害预警和防范具有重要意义。本文将深入探讨一段使用 JavaScript 实现台风可视化功能的代码。原本只是简单的绘制台风的路径&#xff0c;但是后面的需求要求显示台风各个历史节点的动画绘制&#xff0c;于是难度增加了&…

《安全历史第4讲——从古代驿站体系看软件安全管控》

在古代&#xff0c;车、马都很慢&#xff0c;信息传递很不顺畅&#xff0c;中央的政令又是如何传达至地方的呢&#xff1f;实际上&#xff0c;很多朝代都有专门的驿站制度&#xff0c;可以保障全国各地的信息传递&#xff0c;对于维护统治和稳定有着关键作用。 若将国家比作一个…

OZON刚需产品哪些好卖,OZON刚需热卖产品

OZON平台上的刚需热卖产品涵盖了多个领域&#xff0c;这些产品通常能够满足消费者的基本需求或提升生活品质。以下是一些在OZON平台上表现良好的刚需热卖产品类别及其特点&#xff01; OZON刚需热卖产品地址&#xff1a;D。DDqbt。COm/74rDTop1 防蚊修复网 Скотч сет…

二次注入(2018网鼎杯comment)

一、2018网鼎杯comment 该题主要考察二次注入 1.二次注入概念&#xff1a; 攻击者构造恶意的数据并存储在数据库后&#xff0c;恶意数据被读取并进入到SQL查询语句所导致的注入。防御者可能在用户输入恶意数据时对其中的特殊字符进行了转义处理&#xff0c;但在恶意数据插入…

【LeetCode Cookbook(C++ 描述)】一刷二叉树之递归遍历(DFS)(上)

目录 二叉树的实现LeetCode #144&#xff1a;Binary Tree Preorder Traversal 二叉树的前序遍历递归解法「遍历」思路「分而治之」思路更多例子&#xff1a;求二叉树最大深度 迭代解法Morris 遍历 LeetCode #94&#xff1a;Binary Tree Inorder Traversal 二叉树的中序遍历迭代…

亲民且友好的Top期刊,最快46天录用!

本期小编解析一本超亲民超友好的Top期刊&#xff0c;发文量大&#xff0c;编辑处理速度极快&#xff08;近期案例46天录用&#xff09;&#xff0c;毕业有高分区发文要求的小伙伴&#xff0c;赶紧码住这一本神刊&#xff01; 期刊简介 Knowledge-Based Systems (KBS) 出版社 …

AI智能测评应用平台项目分享

大家好&#xff0c;我是程序媛雪儿&#xff0c;今天咱们聊个我新学的项目&#xff0c;AI智能评测应用平台系统。 咱们先了解一下这个系统是干嘛的。 一、业务分析 大致业务流程是应用制作者在创建应用页面填写应用信息&#xff0c;依次添加题目和评分规则生成测评应用&#xff…