《程序猿入职必会(9) · 用代码生成器快速开发》
📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗
🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数,欢迎多多交流。👍
文章目录
- 写在前面的话
- 代码生成器简介
- 常见代码生成器
- 自定义能力说明
- 实战效果说明
- 总结陈词
写在前面的话
本系列博文已连载到第九篇,看过前面几篇系列文章,应该发现了,博主在创建完教师信息表后,若干前后端核心代码基本都使用代码生成器生成,手敲代码却是甚少,本篇文章就介绍一下,如何在日常工作借助代码生成器快速开发。
关联文章:
《程序猿入职必会(1) · 搭建拥有数据交互的 SpringBoot 》
《程序猿入职必会(2) · 搭建具备前端展示效果的 Vue》
《程序猿入职必会(3) · SpringBoot 各层功能完善 》
《程序猿入职必会(4) · Vue 完成 CURD 案例 》
《程序猿入职必会(5) · CURD 页面细节规范 》
《程序猿入职必会(6) · 返回结果统一封装》
《程序猿入职必会(7) · 前端请求工具封装》
《程序猿入职必会(8) · 整合 Knife4j 接口文档》
代码生成器简介
代码生成器是一种开发工具,可以帮助开发者快速生成重复性高的代码,从而极大地提高开发效率,尤其是在需要重复生成相似代码的场景中。
日常开发过程中,重复性工作最大的,无非是各个业务表对应的各层业务代码,都有各自的基础增删改查业务,这其中涉及的前后端代码,基本代码都相似,也就是程序猿日常的拧螺丝
工作。
通常在软件公司中,针对前后端开发,都有封装相关核心框架,相应的,各层业务代码也都有相应规约,比如后端 Spring 开发常见的 Controller、Service、Mapper、Entity、SqlXml,前端 Vue 开发常见的 Page.vue、Api.js。因此,一款优秀的代码生成器应该具备与框架结合的能力,即模板自定义功能。
常见代码生成器
先列举一些常见的代码生成器产品。
**1. MyBatis Generator **
简介:MyBatis Generator 是一个用于生成 MyBatis 和 MyBatis 相关代码的工具,这是 MyBatis 官方提供的代码生成器,主要用于生成 MyBatis 的 Mapper 接口和 XML 文件。它支持自定义模板,可以很好地与 Spring Boot 集成。
特点:
- 支持 XML 和注解配置。
- 可以生成实体类、Mapper 接口、XML 映射文件等。
- 可以通过自定义模板来适应公司的代码风格。
适用场景:适合使用 MyBatis 的项目,尤其是需要快速生成数据库操作代码的场景。
2. JHipster
简介:JHipster 是一个开发平台,用于生成、开发和部署 Spring Boot + Angular/React/Vue 的 Web 应用程序,一个全栈式代码生成器,可以生成完整的 Web 应用程序,包括前后端代码。
特点:
- 提供了丰富的生成选项,可以生成完整的应用程序架构。
- 支持自定义生成模板。
- 集成了多种前端框架和后端技术。
适用场景:适合需要快速搭建全栈应用的项目。
3. Spring Roo
简介:Spring Roo 是一个快速开发框架,能够通过命令行生成 Spring 应用程序的代码。提供了一个命令行界面,可以快速生成CRUD操作、数据库访问层等。
特点:
- 支持快速生成 Spring MVC、Spring Data JPA 等代码。
- 可以通过自定义模板来适应特定需求。
适用场景:适合使用 Spring 技术栈的项目。
4. Rapid-Generator(√)
简介:Rapid-Generator 是一个轻量级的代码生成器,支持多种模板引擎(如 FreeMarker、Velocity)。这是一个非常强大的代码生成器工具,可以根据数据库表结构自动生成 CRUD 代码、DTO、Mapper 等,它支持自定义模板,可以很好地与 Spring Boot、MyBatis 等框架集成,使用起来非常方便,是很多公司的首选。
特点:
- 提供了简单易用的命令行界面。
- 支持自定义模板,可以根据公司需求进行调整。
- 适合快速生成 CRUD 代码。
适用场景:适合需要快速生成代码的项目,尤其是 CRUD 操作。
- CodeSmith
简介:CodeSmith 是一个强大的代码生成器,支持多种编程语言和框架。这是一个强大的代码生成工具,支持多种编程语言和数据库。它提供了强大的模板功能,用户可以创建复杂的代码模板来生成代码。
特点:
- 提供了丰富的模板库,可以根据需要进行自定义。
- 支持与多种数据库和 ORM 框架集成。
适用场景:适合需要生成大量重复代码的项目。
6. Yeoman
简介:Yeoman 是一个前端工具,能够生成项目的骨架代码。一个基于 Node.js 的生成工具,可以用于生成各种类型的项目,包括前端和后端项目。
特点:
- 提供了丰富的生成器,可以快速生成前端项目结构。
- 支持自定义生成器。
适用场景:适合前端开发,尤其是需要快速搭建项目的场景。
自定义能力说明
大多数代码生成器允许你自定义模板。这通常是必要的,因为每个公司的框架和编码规范都有所不同。自定义模板可以确保生成的代码符合你的特定需求。模板通常使用模板引擎(如Freemarker或Velocity)来编写,它们允许你以编程方式创建代码结构,并根据数据库模型动态填充内容。
实战效果说明
Tips:上面介绍了若干代码生成器,都是优秀的产品,其实也没必要去纠结使用哪个,能解决自己的需要即可。
选择合适的代码生成器主要取决于你的项目需求、技术栈以及团队的开发习惯。无论选择哪个工具,通常都需要根据公司的代码规范和框架进行模板的自定义,以确保生成的代码符合团队的标准。
博主的项目采用 Rapid-Generator ,它是一个不错的选择,尤其是在需要快速生成 CRUD 代码的场景中。
【确定要生成的文件范围】
要生成的文件包含但不限于:controller、service、mapper、xml、entity、api.js、page.vue
【编辑模板思路】
要快速生成上面一系列的代码,核心就是模板制作。
先以控制层代码做一个示例说明,下方是模板示例。
- 先根据自身框架,手写实现一个业务表对应的增删改查逻辑,包括前后端,包装功能可用;
- 将对应代码贴到模板文件中,将动态部分用相关变量替换;
- 创建表后,测试生成效果;
<#assign className = table.className>
<#assign classNameLower = className?uncap_first>
<#assign table_chn = table.remarks>
<#assign pkColumn = table.pkColumn>
<#assign pkColumnName = table.pkColumn.columnName>
<#assign pkColumnNameLower = table.pkColumn.columnNameLower>
package ${basepackage}.web<#if nextPackageFileUrl != "">.${nextPackageFileUrl}</#if>;import ${basepackage}.common.utils.IdUtils;
import ${basepackage}.common.web.anno.Required;
import ${basepackage}.common.base.BaseController;
import ${basepackage}.common.vo.PageInfo;
import ${basepackage}.entity<#if nextPackageFileUrl != "">.${nextPackageFileUrl}</#if>.${className};
import ${basepackage}.service<#if nextPackageFileUrl != "">.${nextPackageFileUrl}</#if>.${className}Service;
import com.lw.sbdemo2.common.web.anno.ResultController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.Date;
import java.util.List;/*** <p>标题: ${table_chn}服务 - 请求控制层</p>* <p>描述: </p>* <p>版权: Copyright (c) ${now?string('yyyy')}</p>* <p>公司: 山人行工作室</p>** @version: 1.0* @author: ${author}* @date ${now?date}*/
@ResultController
@Api(value = "${className}Controller", tags = {"${table_chn}服务"})
@RequestMapping(value = "/<#if nextPackageApiUrl != "">${nextPackageApiUrl}/</#if>${classNameLower}")
public class ${className}Controller extends BaseController {/*** ${table_chn}服务*/@Autowiredprivate ${className}Service ${classNameLower}Service;@ApiOperation(value = "获取${table_chn}列表")@GetMapping("")public List<${className}> findList(${className} ${classNameLower}) {return ${classNameLower}Service.findList(${classNameLower});}@ApiOperation(value = "获取${table_chn}列表(分页)", response = PageInfo.class)@ApiImplicitParams({@ApiImplicitParam(name = "query", value = "关键词", dataType = "string"),@ApiImplicitParam(name = "pageNum", value = "当前页码", required = true, dataType = "int"),})@GetMapping(value = "/page")public PageInfo<${className}> page(String query, @Required("pageNum") PageInfo pageInfo, ${className} ${classNameLower}) {return ${classNameLower}Service.findListPage(query, pageInfo, ${classNameLower});}@ApiOperation(value = "获取${table_chn}详细信息", notes = "根据url的id来获取${table_chn}详细信息")@ApiImplicitParam(name = "id", value = "${table_chn}ID", required = true, dataType = "String")@GetMapping("/{id}")public ${className} get(@PathVariable String id) {return ${classNameLower}Service.getById(id);}@ApiOperation(value = "创建${table_chn}")@PostMapping("/insert")public void insert(${className} ${classNameLower}) {<#list table.columns as column><#if column.sqlName == 'CREATED_TIME'>${classNameLower}.setCreatedTime(new Date());</#if></#list>${classNameLower}.set${pkColumnName}(IdUtils.uuid());${classNameLower}Service.insert(${classNameLower});}@ApiOperation(value = "更新${table_chn}详细信息")@ApiImplicitParams({@ApiImplicitParam(name = "id", value = "${table_chn}ID", required = true, paramType = "query", dataType = "String")})@PostMapping("/update")public void update(${className} ${classNameLower}) {<#list table.columns as column><#if column.sqlName == 'MODIFIED_TIME'>${classNameLower}.setModifiedTime(new Date());</#if></#list>${classNameLower}Service.update(${classNameLower});}@ApiOperation(value = "删除${table_chn}", notes = "删除${table_chn}")@ApiImplicitParam(name = "id", value = "${table_chn}ID", required = true, paramType = "query", dataType = "String")@PostMapping("/delete")public void delete${className}(${className} ${classNameLower}) {${classNameLower}Service.delete(${classNameLower});}}
【修改配置文件】
调整 generator.xml 配置文件,配置代码生成器相关属性。
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties><!-- 包路径前缀com.zoe.optimus.service.模块名 --><entry key="basepackage">com.lw.sbdemo2</entry><!-- 项目模块名 已basepackage的模块名一致 --><entry key="m_eng"></entry><!-- 该表所在的包名称 用于文件路径--><entry key="nextPackageFileUrl"></entry><!-- 该表所在的包名称 用于api路径 --><entry key="nextPackageApiUrl"></entry><!-- 该表所在的包名称 用于bean别名 --><entry key="nextPackageBean"></entry><!-- 是否是字典 1;是,0:不是 --><entry key="is_dict">0</entry><!-- 显示在java文件里的中文名字 --><entry key="table_chn">床头卡信息表</entry><!-- 显示在java文件里的author --><entry key="author">ZhanShen</entry><entry key="namespace">WEB-INF/template</entry><entry key="outRoot">.\generator-output</entry> <!-- 数据库类型映射 --><entry key="java_typemapping.java.sql.Timestamp">java.util.Date</entry><entry key="java_typemapping.java.sql.Date">java.util.Date</entry><entry key="java_typemapping.java.sql.Time">java.util.Date</entry> <entry key="java_typemapping.java.lang.Byte">Integer</entry><entry key="java_typemapping.java.lang.Short">Integer</entry><entry key="java_typemapping.java.math.BigDecimal">Long</entry><entry key="java_typemapping.java.sql.Clob">String</entry><entry key="java_typemapping.java.sql.Blob">byte[]</entry><!-- Mysql --><entry key="jdbc_url"></entry><entry key="jdbc_driver"></entry><entry key="jdbc_username"></entry><entry key="jdbc_password"></entry></properties>
【生成演示】
进入主目录,输入cmd,打开命令窗口
输入相关的表,输入:gen 表名
,即可生成相应代码,拷贝到项目中即可。
理想成果是文件导入后,直接可用,不用调整任何代码。
总结陈词
此篇文章介绍了代码生成器
的基础运用,仅供学习参考。
选择合适的代码生成器需要据公司框架、业务需求和团队的技术水平进行综合考虑,建议根据实际情况选择合适的代码生成器,并进行必要的自定义和测试。
💗 后续会逐步分享企业实际开发中的实战经验,有需要交流的可以联系博主。
相关文章:
《程序猿入职必会(9) · 用代码生成器快速开发》
📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…...
数据结构--平衡二叉树
目录 一. 前言 二. 平衡二叉树的调整 一. 前言 平衡二叉树又称AVL树(Adelson-Velskii and Landis)。 一棵平衡树可以是空树也可以是具有下列性质的二叉排序树(所以二叉平衡树首先得是二叉排序树): 1)左子…...
2020C题 中小微企业的信贷决策论文分析复现笔记
比赛题目: 在实际中,由于中小微企业规模相对较小,也缺少抵押资产,因此银行通常是依据信贷政策、企业的交易票据信息和上下游企业的影响力,向实力强、供求关系稳定的企业提供贷款,并可以对信誉高、信贷风险…...
*算法训练(leetcode)第四十一天 | 739. 每日温度、496. 下一个更大元素 I、503. 下一个更大元素 II
刷题记录 *739. 每日温度496. 下一个更大元素 I解法一(暴力搜)解法二(用map) 503. 下一个更大元素 II解法一(拼接两个数组)解法二(下标取余) *739. 每日温度 leetcode题目地址 单调…...
Flink开发语言使用Java还是Scala合适?
目录 1. Flink简介 1.1 什么是Apache Flink? 1.2 Flink的核心组件 2. Java与Scala在Flink开发中的比较 2.1 语言特性对比 2.2 开发体验对比 3. 实际开发中的应用 3.1 使用Java进行Flink开发 3.2 使用Scala进行Flink开发 4. 关键性能和优化 4.1 性能对比 …...
基于ESP32的掌上网关智能家居控制设备:集成MQTT、后端Node.js、MongoDB、React(代码示例)
一、项目概述 本项目旨在设计并实现一个基于ESP32的掌上网关智能家居控制设备。该设备可以作为智能家居系统的核心控制单元,实现对家庭中各种智能设备的集中管理和控制。用户可以通过手机APP或Web界面远程操控家中的智能灯、空调、窗帘等设备,还可以设置自动化场景和定时任务,…...
周鸿祎哈佛演讲摘要:大模型创业要抓住中国机会
时间:2024/04/13(美东时间) 地点:美国波士顿哈佛大学 *演讲语言为中文,“因为我的英文就比are you OK 的水平高一点点”。 1、无论你是一个创业者,还是一个企业家,最重要的一点说要跟用户保持接触,要去聊天,跟用户对话…...
车联网的汽车测试技术:深度解析与技术前沿
目录 一、概念 一、测试内容的深度解析 二、测试技术与工具的前沿探索 三、测试标准与规范的国际化视野 四、测试案例与成果的创新实践 二、数据处理与分析方面测试 一、测试目标 二、测试内容 三、测试方法与工具 四、测试标准与规范 三、举例说明 四、代码 一、…...
Terraform中的for_each和count
通过Terraform创建云主机时,在某些业务场景下,一个机器需要挂载多个云盘,一般云厂商都是单独创建云主机和云硬盘然后通过attachment的资源去挂载,因此我们的模板大致如下: resource "tencentcloud_instance"…...
vue 动态增删行,并form表单校验(附v2\v3)
Vue3 组件用的 ant 可以换成你们用,主要是form校验 前端代码 <a-formref"formRef":model"formData":label-col-props"{ span: 5 }":wrapper-col-props"{ span: 17 }"><a-row><a-form-itemlabel"角色…...
C#基础——泛型
泛型 C# 中的泛型是一种强大的编程特性,它允许你编写类型安全且灵活的代码。泛型允许你定义类、结构体、接口、方法和委托,而不必在编译时指定具体的数据类型。相反,你可以使用类型参数来定义泛型类型或方法,然后在使用时指定具体…...
MySQL学习——程序开发工具
Program Development Utilities(程序开发工具)是一系列辅助程序员在软件开发过程中提高效率和质量的工具。这些工具涵盖了从代码编辑、编译、调试到测试、性能分析等多个方面。 本文介绍一些在开发MySQL程序时可能很有用的实用程序。 在shell脚本中&am…...
【多线程-从零开始-伍】volatile关键字和内存可见性问题
volatile 关键字 import java.util.Scanner; public class Demo2 { private static int n 0; public static void main(String[] args) { Thread t1 new Thread(() -> { while(n 0){ //啥都不写 } System.out.println("t1 线程结束循环"); }, "…...
段页式存储-系统架构师(三十七)
1、一个完整的系统需要从不同的角度进行描述,下图属于软件架构设计中的(),用于()视图来描述软件系统。 问题1 A对象图 B时序图 C构件图 D类图 问题2 A进程 B开发 C物理 D逻辑 解析: 从…...
高频JMeter软件测试面试题
近期,有很多粉丝在催更关于Jmeter的面试题,索性抽空整理了一波,以下是一些高频JMeter面试题,拿走不谢~ 一、JMeter的工作原理 JMeter就像一群将请求发送到目标服务器的用户一样,它收集来自目标服务器的响应以及其他统计…...
QT 安装指南
简介 Qt 是一个跨平台的应用程序开发框架,被广泛应用于桌面、移动设备和嵌入式系统等领域。本文将详细介绍如何在 Windows 操作系统上安装 Qt 5.14.2 版本(这个版本较为稳定适用)。 安装前准备 操作系统: 确保您的计算机运行的是 Windows 10 或更高版本。硬件要求…...
【反序列化漏洞】serial靶机详解
一、安装靶机 首先创建新的虚拟机。 然后选择客户机版本为Ubuntu 64位。 然后选择使用现有磁盘,选择下载的vmdk磁盘文件即可。剩下的都是默认 二、信息收集 发现主机192.168.204.143 访问 扫描端口nmap -A 192.168.204.143 -p-,发现只有ssh:22和http:8…...
C# 下的限定符运算详解(全部,任意,包含)与示例
文章目录 1.限定符概述2. 全部限定符运算(All)3. 任意限定符运算(Any)4. 包含限定符运算(Contains)总结 当我们在C#编程中需要进行条件判断或集合操作时,限定符(qualifiersÿ…...
PHP教育培训小程序系统源码
🚀【学习新纪元】解锁教育培训小程序的无限可能✨ 📚 引言:教育培训新风尚,小程序来引领! Hey小伙伴们,是不是还在为找不到合适的学习资源而烦恼?或是厌倦了传统教育模式的单调?今…...
人工智能系统测试中,A/B测试的流程、技术方法与策略
模型的迭代和优化是推动人工智能技术进步的核心动力。如何准确地评估模型更新前后的性能提升,是人工智能测试中的一个难点。A/B测试,作为一项科学且客观的测试方法,在此过程中发挥着至关重要的作用。本文我们继续为大家介绍人工智能系统测试方…...
C++笔试练习笔记【5】:最小花费爬楼梯(有题目链接) 初识动态规划
文章目录 题目思路代码 动态规划简介**一、什么是动态规划****二、动态规划的应用场景****三、动态规划的基本步骤****四、动态规划的优缺点** 题目 题目链接:https://www.nowcoder.com/practice/9b969a3ec20149e3b870b256ad40844e?tpld230&tpld39751&ru/…...
Unity 协同程序
Unity 协同程序 Unity 2022.3 官方协同程序文档 部分内容如下 协同程序允许您将任务分散到多帧中执行。在Unity中,协程是一种可以暂停执行并将控制权返回给Unity的方法,但随后在它离开的地方继续执行。 在大多数情况下,当您调用一个方法时…...
2024杭电多校06——1005交通管控
补题点这里 大意 一个操作杆可以对k个红绿灯进行操作,操作杆上的一个字符对应一个红绿灯,操作包括,-,0,问每种组合方案有多少种组合方式 : red->green->yellow->red -:green->red->yellow->green 可以用一个三进制数表示每个灯的状态…...
人工智能时代,程序员如何保持核心竞争力
随着人工智能(AI)技术的快速发展,许多人开始担心 AI 会取代传统程序员的工作。然而,AI 的崛起不仅带来了挑战,也带来了前所未有的机遇。作为程序员,我们应该如何在这个新时代保持核心竞争力呢?本…...
如何把STM32的调试口设置为普通的IO口?
目录 一、背景 二、STM32的调试方式选择 三、关闭所有的JTAG和SWD调试功能 3.1 仅关闭JTAG调试功能 四、关闭JTAG和SWD调试方式后如何更新程序以及仿真 4.1 关闭JTAG如何更新程序 4.2 关闭JTAG及SWD调试功能后的补救措施 一、背景 最近有一个项目用到了STM32F103RB系列单…...
大模型之大模型技术生态
本文作为大模型综述第四篇,介绍语言大模型技术生态。 随着大模型技术的快速发展,大模型的生态体系也在快速构建。典型的大模型平台如 ChatGPT、文心一言、讯飞星火等提供如 APP、网页版、 API 接口等多种形式的开放服务,并通过开放插件机制、Function Call 等实现大模型外部…...
电燃灶(电焰灶)、燃气灶、电磁炉,谁更契合中国人的烹饪习惯?
中国人的烹饪文化源远流长,丰富多样的烹饪方式和独特的口味需求造就了对炉灶的严格要求。在现代厨房中,电燃灶(电焰灶)、燃气灶和电磁炉成为了常见的选择。那么,究竟哪一种更适合中国人的烹饪习惯呢? 一、明…...
引导Kim生产学习计划
参考文章写prompt生产学习计划 https://waytoagi.feishu.cn/wiki/AgqOwLxsHib7LckWcN9cmhMLnkb Instruction: 请制定一份适合职场C学习的计划 Context: C是图像工程师不可或缺的技术,需要用在图像的前处理,部署,后处理等部分。 I…...
多人在线像素涂鸦网页源码
多人在线像素涂鸦网页源码node.js项目,100100的像素格画布,可供多人在线涂鸦,画布内容实时刷新。 源码下载:多人在线像素涂鸦网页源码.zip 包含完整搭建教程 仍有不完善的地方: 1.没有限制一分钟内的涂鸦次数,这会…...
神奇的TypeScript -- 进阶篇之实用工具类型
系列文章目录 神奇的TypeScript – 基础篇 文章目录 系列文章目录前言一、运算符和分布式联合类型二、实用工具类型1. 修改已有的类型属性:Partial|Required|Readonly1.1 用法1.2 代码示例1.3 手动实现一个Partial 2. 选择或剔除类型中的属性…...
工业5G路由器驱动矿山无人值守及井下监控数据传输
矿山行业作为国民经济发展的重要组成部分,其生产效率和安全性一直被广泛关注着。随着信息技术的飞速发展,矿山数字化转型已成为必然趋势。矿山井下环境复杂,传统的人工巡检和监控方式存在效率低、成本高、安全隐患大等问题。 由于户外矿山和…...
Windows图形界面(GUI)-MFC-C/C++ - CSliderCtrl
公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 目录 CSliderCtrl 创建滑动条 设置滑动条属性 成员函数 消息处理 注意事项 示例代码 CSliderCtrl 创建滑动条 在对话框编辑器中,从工具箱中拖拽一个Slider Control到对话框…...
ViP-LLaVA: Making Large Multimodal Models Understand Arbitrary Visual Prompts
发表时间:cvpr2024 论文链接:https://readpaper.com/pdf-annotate/note?pdfId2357936887983293952¬eId2426262228488986112 作者单位:University of Wisconsin–Madison Motivation:现在的多模态模型都关注整张图像的理…...
beeline -e 执行SQL中有双引号
一、问题 beeline -e 执行SQL中有双引号 害怕执行报错 --简单示例 beeline -e "select * from table_name where col1 "abc"" 二、解决方法 1.替换sql中的双引号为单引号 --简单示例 beeline -e "select * from table_name where col1 abc"…...
TikTok運營環境搭建:使用靜態住宅IP
Tik Tok作為一款在全球範圍內流行的短視頻平臺,目前跨境電商也將Tik Tok作為行銷的主要陣地,越來越多的用戶和企業開始關注如何優化其使用體驗和行銷效果。而Tik Tok作為行銷工具使用對網路環境要求較高,很多用戶在運營帳號時會出現限流、帳號…...
sqlserver跟踪sql导出
文章目录 sqlserver跟踪sql导出打开跟踪窗口登录到数据库服务器新增跟踪,配置跟踪属性导出sql脚本 sqlserver跟踪sql导出 打开跟踪窗口,登录到数据库服务器,新增跟踪,配置跟踪属性,确定,业务数据操作&…...
Linux安全与高级应用(三)深入探索MySQL数据库:安装、管理与安全实践
文章目录 深入探索MySQL数据库:安装、管理与安全实践MySQL数据库简介MySQL的安装与配置编译安装MySQL配置MySQL服务 MySQL数据库的基本操作数据库的创建与删除表的创建与管理数据记录的增删改查 MySQL用户管理与权限设置MySQL数据库的备份与恢复数据库备份数据库恢复…...
el-input输入数字,带有千分位
封装组件 <template><el-inputchange"changenum"input"onTxtInput"blur"blurInput"v-model"inputnum1"placeholder"请输入数字"clearable:disabled"disablednum"></el-input> </template&g…...
行为型设计模式3:模板方法/备忘录/解释器/迭代器
设计模式:模板方法/备忘录/解释器/迭代器 (qq.com)...
测试用例等级划分
基本等级(Level 1或P0):这类用例设计系统基本功能,执行失败会导致多处重要功能无法运行。例如,单表维护中的增加功能、最平常的业务使用等,这些是发生概率较高的功能用例。这类用例在每一…...
正则表达式 贪婪与非贪婪匹配
目录 一. 回顾二. 遇到的问题三. 分析四. 解决4.1 转换为非贪婪模式匹配4.2 提高匹配的精度 一. 回顾 我们在正则表达式 分组与非捕获组这篇文章中,有如下分组匹配案例 <select name"fruit_console"><option value"apple" selected&…...
LVS-DR模式集群:案例与概念
DR模式(直接路由) 概念 Direct Routing,简称DR模式采用半开放式的网络结构,与TUN模式的结构类似,但内网服务器并不是分散在各地,而是与调度器位于同一个物理网络负载调度器与内网服务器通过本地网络连接&a…...
小试牛刀-Telebot区块链游戏机器人(TS升级)
目录 1.编写目的 2.为什么使用TypeScript实现? 3.实现功能 3.1 AI图片生成 3.2 签到 3.3 邀请 3.4 WalletConnect连接 4.功能实现详解 4.1 AI图片生成 4.2 签到 4.3 邀请 4.4 WalletConnect连接 5.功能截图 6.问题整理 Welcome to Code Blocks blog 本篇文章主…...
使用SpringBoot+Vue3开发项目(2)---- 设计文章分类的相关接口及页面
目录 一.所用技术栈: 二.后端开发: 1.文章分类列表渲染: 2.新增文章分类: 3.编辑文章分类: 4.删除文章分类 : 5.完整三层架构后端代码: (1)Controller层:…...
django电商易购系统-计算机毕业设计源码61059
目 录 1 绪论 1.1选题背景 1.2研究意义 1.3论文结构与章节安排 2 电商易购系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据流程 3.3.2 业务流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析 2.5本章小结 3 电商易购系统总…...
uniapp video播放视频 悬浮在屏幕无法滑动
背景: 在uniapp中,需要使用<video></video>标签进行播放动态src的视频。 1.在开发的时候,运行到浏览器,vedio标签正常;(使用HbuildX运行,运行 -->运行到浏览器)。 2.但是在打包成原生App&am…...
day22(mysql数据库主从搭建)
上午: 1、为mysql添加开机启动chkconfig 2、编辑配置文件my.cnf 3、修改环境变量 4、mysql角色授权 角色不生效 在配置文件中不添加activate_all_roles_on_loginon glibc安装,my.cnf在项目目录之下 rpm安装,my.cnf文件在/etc/my.cnf 5、自…...
C++——多态经典案例(三)计算器
案例:使用多态实现一个简单的计算器,计算两个数的加减乘除结果 分析:定义一个抽象类AbstractCalc ,其内部定义一个纯虚函数getResult,用于得到计算结果 定义加减乘除四个类,分别继承这个抽象类AbstractCal…...
超声波清洗机怎么选?超声波眼镜清洗机选择哪个牌子比较好?
对于许多近视的人来说,眼镜是至关重要的,因为它们帮助人们清晰地看到远处的物体。虽然很多人会定期擦拭和保养眼镜,但不少人对正确的清洁方法并不十分了解。那么,眼镜脏了该如何彻底清洁?如何确保在保养过程中不会划伤…...
24. 两两交换链表中的节点(Java)
目录 题目描述:示例 :代码实现: 题目描述: 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换&am…...