springboot整合mybatis-plus模版

1.创建springboot项目

 Maven类型+Lombok依赖+Spring Web 依赖+MySQL Driver依赖

 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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>springBoot-Test</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springBoot-Test</name>
    <description>springBoot-Test</description>
    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.6.13</spring-boot.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <version>8.2.0</version>
            <scope>runtime</scope>
        </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>
        <!--导入Mybatis坐标-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.2</version>
        </dependency>
        <!--导入mybatis-plus坐标-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.1</version>
        </dependency>
        <!--导入数据库druid坐标-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.22</version>
        </dependency>
        <!--简略get,set方法-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.10</version>
        </dependency>
        <!--模版引擎-->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.3</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <mainClass>com.example.springboottest.SpringBootTestApplication</mainClass>
                    <skip>true</skip>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

2.idea建表()

1. 首先点击右侧的数据库->右击@localhost->点击新建->查询控制台
2. 选择在那个数据库建表  use  `数据库名` 
use `数据库名`;
create table `表名`(
    `id` INTEGER primary key auto_increment comment '主键id',
    `type` varchar(20) comment '书籍类型',
    `create_time` timestamp comment '创建时间',
    `update_time` timestamp comment '修改时间',
    `version` INTEGER comment '版本号'     (注意最后没有,)
)default charset = utf8 comment '书籍表';
​
insert into `表名`(`type`) 
    values
        ('科幻'),
        ('玄幻'),
        ('架空');
这里一连写入几个,不要写一个insert一个。

3.配置yml文件

spring:
    datasource:
        # 如果使用com.mysql.jdbc.Driver爆红,已经被弃用
        driver-class-name: com.mysql.cj.jdbc.Driver
        # 时区serverTimezone根据自己需要修改
        url: jdbc:mysql://127.0.0.1:3306/数据库名?autoReconnect=true&useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
        username: 用户名
        password: 密码
mybatis-plus:
    # 设置mybatis映射器(就是xml文件的路径)
    mapper-location: classpath:mapper/*.xml
    # 开启mybatis-plus运行日志 (建议开启)
    configuration:
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
        
如果密码忘记可以查看他的文章:
    https://www.cnblogs.com/murmansk/p/17648639.html          

4.目录结构如下

config层+controller层+dao层+mapper层+service层

简单了解一下结构:

Java(dao、service、controller)解释:

1.dao层:持久层(Repository 或 DAO:数据访问层) ​ *负责与数据库进行联络的一些任务都封装在此 ​ *dao层属于一种底层,比较基础的操作,具体到对于某个表的CRUD操作,也就是说某个dao一定是和数据库某一张表对应的。 ​ *mapper设计dao层的接口(属于dao层),然后在spring的配置文件中定义此接口的实现类。 ​ *建议只做原子操作

2.service层: 服务层 ​ *对一个或多个dao进行再次封装的事务控制。 ​ *service层负责逻辑应用,同样先设计接口,在设计其实现类,接着在设计spring的配置文件中配置其实现的关联。 ​ *封装service层业务逻辑有利于通用业务逻辑的独立性和重复利用性。程序显得非常简洁。

3.controller层:控制层 ​ * 控制层负责请求转发,接受页面传递过来的请求,传给service层处理,接到响应,再传给页面。

关系:控制层(controller)接受页面传递过来的参数,调用接口传递给中间层也就是业务层(service),业务层(service)调用持久层的接口(dao层:mapper),对数据库进行操作,返回操作结果,controller响应给页面。

5. CRUD操作

1.编写底层(实体类)

@Data   // 提供get、set、toString等方法
@AllArgsConstructor // 提供全参构造
@NoArgsConstructor // 提供无参构造
// 如果不使用这个依赖,默认映射(首字母小写)寻找表名,当实体类与
// 表名不一致会出现错误
@TableName("表名") 
public class BooK {
   @TableId(value = "id",type = IdType.AUTO) 
    // 设置主键并自增(这里只是告诉mybatis,表中还是要设置主键自增的)
    private Integer id;
   @TableField(value = "type")
    private String type;
  @TableField(value = "create_time",fill = FieldFill.INSERT)
    /* value: 指定java属性createTime对应数据库字段,代表一种映射
     fill: 表示在插入记录时,该字段应该被自动填充
    使用自动填充需要实现MetaObjectHandler 接口,并重写方法*/
    private Date createTime;
    @TableField
    (value = "update_time",fill = FieldFill.INSERT_UPDATE)
    // fill: 表示在插入和更新记录时,该字段自动更新
    private Date updateTime;
    @Version 
    // 乐观锁:当同时更新某个记录会保留第一个更新值
    private Integer version;
}

编写mapper: 直接继承BaseMapper,接口中封装了一系列 CRUD 常用操作

public interface BookMapper extends BaseMapper<实体类> {
}

我们需要在启动类添加MapperScan注解。指定mapper扫描路径,指定后就不用再mapper层写@Mapper注解(建议)

@SpringBootApplication
@MapperScan("com.example.mapper")
//sources root下的mapper路径 作用:自动注册映射器接口为spring Bean
public class SpringBootDemo1Application {
    public static void main(String[] args) {
 SpringApplication.run(SpringBootDemo1Application.class,args);
    }
}

2.编写业务层(service) IService内部进一步封装BaseMapper接口的方法,使用时可以通过mapper类,也可以通过service。

public interface BookService extends IService<实体类> { }

service实现类记得加@service注解

@Service
public class BookTestServiceImpl implements UserTestService{
    @Autowired // 根据类型找实现类bean
    private GameMapper gm;
    @Version 
    @TableField(fill = FieldFill.INSERT)
    private Integer version;
}

3.编写控制层(controller)

@RestController
@RequestMapping("book/test") // 映射路径
public class BookController {
    @Autowired
    private BookService bs;
}

无参,@RequestParam 和@PathVaiable的情况下使用GetMapping 如果传的参数是@RequestBody ,多参或者传对象的情况下使用@PostMapping注解

6.分页插件

1.配置分页插件 ​ 编写一个配置类,使用@Bean注解将其交给spring容器管理

@Configuration // 加入这个才能被spring扫描
@Component // 注入spring管理
public class MPConfig {
    /** 分页插件* */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2));
        return interceptor;
    }
}

2.定义一个包装类,保存分页所需要的数据

@Data 
@AllArgsConstructor 
@NoArgsConstructor 
public class GameFy {
    private Integer current; // 当前页
    private Integer size; // 每页记录量
    private Long total; // 记录总量
    private List<Game> game; // 记录信息
}

3.service层自定义接口

public interface BookService extends IService<Book> { 
    BookPage pagelist(Integer current,Integer size);
}

3.service实现类调用接口 ​ 编写分页代码:调用mybatis-plus提供的分页方法(selectPage),会将数据封装到Page对象中。

service实现类:

@Override
public BookPage pageList(Integer current,Integer size){
    BookPage bg = new BookPage();
    Page<Book> book = new Page<>(current,size);
    gm.selectPage(book,null);
     // 如果没有其他条件,用null 作用执行分页查询,并把结果返回给book
    bg.setCurrent(current);
    bg.setSize(size);
    bg.setTotal(book.getTotal());
    bg.setBook(book.getRecords());// 获取所需要的实体类数据
    return bg;
    
}

4.controller层:

@GetMapping("pagelist")
    public BookPage pageList(@RequestParam("current") Integer current,@RequestParam("size") Integer size){
        return bs.pageList(current,size);
    }

7.自动填充数据功能

比如:数据创建时间和修改时间。mybatis-plus支持自动填充这些字段的数据。 这个在上面已经提到过,只是不完善,下面给出完整步骤。

1.在实体类中使用@TableField注解(映射字段、condition预处理WHERE实体条件自定义运算规则)上面已经写过。

2.自定义类,实现MetaObjectHandler接口,并重写方法。 注意这里的Date():java.util不是sql

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    /*
    * 自定义填充内容,根据属性名去填充数据*/
    @Override
    public void insertFill(MetaObject metaObject) {
        this.strictInsertFill(metaObject,"create_time",Date.class, new Date()); // 插入数据时实现创建时间自动插入
        this.strictInsertFill(metaObject,"update_time",Date.class, new Date());// 插入数据时实现更新时间自动插入
    }
​
    @Override
    public void updateFill(MetaObject metaObject) {
        this.strictUpdateFill(metaObject,"update_time",Date.class, new Date()); // 更新数据时实现更新时间自动更新
    }
}

8.乐观锁功能

通过version实现(上面提到过) 实现思路: 1.取出数据时,获取当前version(默认为1) 2.更新数据时(version会递增),带上这个version 3.执行更新时,判断此时version是否等于之前的version 4.如果version不对,更新失败

配置乐观锁插件:

@Configuration
@Component  
public class MyConfig {
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
        return new OptimisticLockerInterceptor();
    }
}
​

2.定义一个数据库字段verison(上面已经做过) 3.使用@Version注解标注对应的实体类。通过@TableField进行数据自动填充

service实现类:
    @Version
    @TableField(fill = FieldFill.INSERT)
    private Integer version;

4.简单测试:

​
@Test
public void test() {
    Book book = gm.selectById(1);
    book.setType("tom");
    gm.updateById(book);
    book.setName("jarry");
    gm.updateById(book);
    
}
​

swagger-ui:接口测试

用于接口测试:前后端问题及时协商,尽早解决

1.添加Maven依赖:

<dependency>
   <groupId>io.springfox</groupId>
   <artifactId>springfox-swagger2</artifactId>
   <version>2.9.2</version>
</dependency>
<dependency>
   <groupId>io.springfox</groupId>
   <artifactId>springfox-swagger-ui</artifactId>
   <version>2.9.2</version>
</dependency>

2.配置swagger,编写配置类SwaggerConfig

@Configuration
@EnableSwagger2
public class SwaggerConfig{
}

yml文件:解决springboot和swagger冲突

spring:
    mvc:
        pathmatch:
            matching-strategy: ant_path_matcher

3.访问测试 :http://localhost:8080/swagger-ui.html ,(这个页面是自动生成的)可以看到swagger的界面;8080改成你自己的端口号

4.基本实现swagger

@Configuration // 配置类
@EnableSwagger2 // 开启swagger2的自动配置
public class SwaggerConfig {
    /*swagger2*/
    @Bean //配置docket以配置Swagger具体参数
    public Docket docket() {
        /*构建Docket通过select()方法配置扫描接口*/
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .enable(true) //配置是否启用Swagger,如果是false,在浏览器将无法访问
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.example.controller")) // controller路径
                // 配置如何通过path过滤,即这里只扫描请求以/kuang开头的接口
                //.paths(PathSelectors.ans("/kuang/**"))
                .build();
    }
    /*通过apiInfo()属性配置文档信息:*/
    private ApiInfo apiInfo(){
    //下面的这套配置就把原来的static代码块覆盖掉:联系人访问链接、联系人邮箱
        Contact contact = new Contact("***", "https://baidu.com/", "3153734397@qq.com");
        return new ApiInfo(
                "***的API文档",
                "学习使用swagger2",
                "v1.0",
                "https://baidu.com/", // 组织链接
                contact, // 联系人信息
                "Apache 2.0许可",
                "https://baidu.com",// 许可连接
                new ArrayList<>() // 扩展
        );
    }
    /*配置API分组,如果想多创几个分组,多写几个就可以*/
    @Bean
    public Docket docket1(){
        return new Docket(DocumentationType.SWAGGER_2).groupName("分组");
    }
    @Bean
    public Docket docket2(){
        return new Docket(DocumentationType.SWAGGER_2).groupName("学习");
    }
}
 

@Api:放在请求的类上,与@RestController并列,说明该类的作用 @Api(value = "订单模块") @RestController public class OrderController {

}

@ApiOperation:说明方法的作用 @ApiOperation(value = "查询所有信息")

@ApilmplicitParams、@ApilmpllicitParam: 说明参数的作用

@ApiOperation(value = "根据姓名模糊查询")
@ApiImplicitParam(name="username",value="用户名",required=true)
@GetMapping("likeName")
public List<Game> listName(@RequestParam("username") String username){
    return bs.LikeUserName(username);
}
​
    @ApiOperation(value = "分页信息")
    @ApiImplicitParams({ // paramType:以什么类型传递信息,目前是表单形式,注意如果发生错误,可能就是这里格式的问题
            @ApiImplicitParam(name="current",value="当前页",required=true),
            @ApiImplicitParam(name="size",value="每页记录数",required=true,paramType="query")
    })
    @GetMapping(path = "pagelist")
    public GameFy pageList(@RequestParam ("current") Integer current,@RequestParam ("size") Integer size){
        return bs.pagelist(current,size);
    }

@ApiResponses、@ApiResponse:方法返回值状态码的含义(必须一起使用)

@ApiResponses({ @ApiResponse(code = 200, message = "请求成功"), @ApiResponse(code = 400, message = "请求参数没填好"), @ApiResponse(code = 404, message = "请求路径没有或页面跳转路径不对") }) @GetMapping(path = "pagelist",produces = {"application/json"}) // 注意这里必须添加produces public Dto list(@RequestParam String userId) {}

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

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

相关文章

上门废品回收小程序,互联网回收拥有哪些特点?

随着社会的进步&#xff0c;人们的生活水平不断提高&#xff0c;产生的可回收物也在不断上升&#xff0c;每年垃圾站都能产生大量的可回收物&#xff0c;这也造成了资源的浪费。 目前&#xff0c;加快发展回收模式&#xff0c;提高我国回收效率成为了当下回收市场发展的重要方…

[笔试强训day04]

文章目录 WY22 Fibonacci数列NC242 单词搜索BC140 杨辉三角 WY22 Fibonacci数列 WY22 Fibonacci数列 #include<iostream> #include<cmath>using namespace std;int n;int main() {cin>>n;int a0,b1,c1;while(n>c){ab;bc;cab;}int ansmin(n-b,c-n);cout&l…

windows mysql8 安装后 提示密码不对,修改下密码认证方式就可以了

Windows上安装MySQL8后提示密码不对的问题可以通过以下步骤解决&#xff1a; 安装MySQL8 首先&#xff0c;你需要下载并安装MySQL8。你可以从MySQL官方网站下载符合你操作系统版本的安装包。 安装地址是&#xff1a;MySQL :: Download MySQL Installer 安装过程中&#xff…

ACRN Intel推出的虚拟机是啥样的?

前言 ACRN作为Intel为工控领域推出的一个小型化的虚拟机&#xff0c;它的特点主要有这么几个&#xff1a; 1.针对Intel的芯片做了非常强的优化 2.RT-VM实时虚拟机的实时性很好 3.CACHE缓存技术发挥的好 4.TCC技术 / 当然不是所有intel的芯片都支持&#xff0c;&#xff0c…

鸿蒙(HarmonyOS)性能优化实战-多线程共享内存

概述 在应用开发中&#xff0c;为了避免主线程阻塞&#xff0c;提高应用性能&#xff0c;需要将一些耗时操作放在子线程中执行。此时&#xff0c;子线程就需要访问主线程中的数据。ArkTS采用了基于消息通信的Actor并发模型&#xff0c;具有内存隔离的特性&#xff0c;所以跨线…

产品规划|如何从0到1规划设计一款产品?

我们要如何从0到1规划设计一款产品?在前期工作我们需要做什么呢?下面这篇文章就是关于此的相关内容,大家一起往下看多多了解了解吧! 一、什么是产品规划? 产品规划是一种策略,它设定了产品的价值和目标,并确定实施方案以实现这些目标。它考虑了产品的整个生命周期,基于…

[RTOS 学习记录] 工程管理工具make及makefile

[RTOS 学习记录] 工程管理工具make及makefile 这篇文章是我阅读《嵌入式实时操作系统μCOS-II原理及应用》后的读书笔记&#xff0c;记录目的是为了个人后续回顾复习使用。 前置内容&#xff1a; 开发工具 Borland C/C 3.1 精简版 文章目录 1 make 工具2 makefile 的内容结构3…

【学习笔记二十四】EWM补货策略和自动补货配置

一、EWM补货策略概述 1.计划补货 ①以联机或批处理模式启动 ②根据最大和最小数量计算补货 ③仅当库存量低于最低数量时才开始 ④四舍五入至最小补货数量的倍数 2.自动补货 ①在WT确认期间启动 ②根据最大和最小数量计算补货 ③只有当库存量低于最低数量时才开始 ④四舍…

Linux thermal框架介绍

RK3568温控 cat /sys/class/thermal/thermal_zone0/temp cat /sys/class/thermal/thermal_zone1/temp cat /sys/class/thermal/cooling_device0/cur_state cat /sys/class/thermal/cooling_device1/cur_state cat /sys/class/thermal/cooling_device2/cur_state thermal_zone…

翻页电子图书制作小技巧分享给你

当今社会&#xff0c;二维码已经成为了信息传递的重要方式之一&#xff0c;其在电子商务、广告营销、活动推广等领域广泛应用。而如何将二维码巧妙地融入电子画册中&#xff0c;制作出高端、具有吸引力的作品&#xff0c;成为了许多设计师和营销人员关注的焦点 但是很多人却不知…

ABeam×StartUp丨蓝因机器人访问ABeam旗下德硕管理咨询(深圳)新创部门,展开合作交流

近日&#xff0c;深圳蓝因机器人科技有限公司&#xff08;以下简称“蓝因机器人”&#xff09;创始人陈卜铭先生来访ABeam旗下德硕管理咨询&#xff08;深圳&#xff09;有限公司&#xff08;以下简称“ABeam-SZ”&#xff09;&#xff0c;与新创部门展开合作交流。 交流中&am…

六西格玛管理培训:我的转变与成长之旅

4月初&#xff0c;我参与了天行健咨询的六西格玛管理培训&#xff0c;这次经历不仅极大地提升了我的工作效率&#xff0c;还帮助我在工作中实现了卓越。现在&#xff0c;我想分享一些我在这次培训中的学习心得和实践经验&#xff0c;希望能对正在寻求提升绩效和卓越之路的大家有…

【无线通信】OQPSK

调制 sps 8; RolloffFactor 0.2; FilterSpanInSymbols 10;bits randi([0, 1], 224*8, 1); % 1792symbols bits*2 - 1; % 1792 re -symbols(2:2:end); % 896 im -symbols(1:2:end); % 896pFilterTx comm.RaisedCosineTransmitFilter(...Shape, Square root, ...Rollo…

MySQL主从结构搭建

说明&#xff1a;本文介绍如何搭建MySQL主从结构&#xff1b; 原理 主从复制原理如下&#xff1a; &#xff08;1&#xff09;master数据写入&#xff0c;更新binlog&#xff1b; &#xff08;2&#xff09;master创建一个dump线程向slave推送binlog&#xff1b; &#xff…

GoJudge环境部署本地调用云服务器部署go-judge判题机详细部署教程go-judge多语言支持

前言 本文基于go-judge项目搭建&#xff0c;由于go-judge官网项目GitHub - criyle/go-judge: Sandbox Server in REST / gRPC API. Based on Linux container technologies.&#xff0c;资料太少&#xff0c;而且只给了C语言的调用样例&#xff0c;无法知道其他常见语言比如&am…

Python基础06-日期和时间的操作方法

在Python中处理日期和时间是编程中常见的需求&#xff0c;无论是安排任务、记录日志还是分析数据。本文将介绍如何在Python中获取当前日期和时间、创建特定日期和时间、格式化日期和时间、解析字符串中的日期和时间、使用时间差、比较日期和时间、从日期/时间中提取组件、处理时…

uni-app开发canvas绘图画画,如何实现后退功能

在uni-app中使用canvas进行绘图时&#xff0c;实现后退功能通常意味着你需要保存用户的每一步操作&#xff0c;然后提供一个机制来撤销最近的步骤。下面是一个基本的实现思路&#xff1a; 保存绘图步骤&#xff1a; 每当用户在canvas上绘制时&#xff08;比如通过touchMove事件…

出海不出局 | 小游戏引爆高线市场,新竞争态势下的应用出海攻略

出海小游戏&#xff0c;出息了&#xff01; 根据 Sensor Tower 近期发布的“2024 年 3 月中国手游收入 TOP30”榜单&#xff0c;出海小游戏在榜单中成了亮眼的存在。 其中&#xff0c;《菇勇者传说》3 月海外收入环比增长 63%&#xff0c;斩获出海手游收入增长冠军&#xff0c…

学习经验分享【33】YOLOv5 / YOLOv7 / YOLOv8 / YOLOv9 / RTDETR 基于 Pyside6 的图形化界面

大论文可以写两章关于算法创新模型&#xff0c;最后一章可以写对前两章提出方法进行封装&#xff0c;利用PyQT5搭建YOLOv5可视化界面&#xff0c;并打包成exe程序&#xff0c;构建检测平台实现简单的应用。用来凑大论文的字数和工作量&#xff0c;是简单又快速的方法&#xff0…

《龙之谷》游戏(客户端+服务端+视频架设教程+工具),本人收集的8个版本,云盘下载

龙之谷这个游戏本人觉得挺好玩的。你们可以下载研究一下看看&#xff0c;有能力的话&#xff0c;可以提取服务端文件出来&#xff0c;做成外网&#xff0c;让大家一起玩。。。。 《龙之谷》游戏&#xff08;客户端服务端视频架设教程工具&#xff09;&#xff0c;本人收集的8个…