smart-doc 文档生成器实战

news2024/11/17 15:51:10

文章目录

  • 一、部署
  • 二、代码演示
    • 1.类、方法注解
    • 2.执行、生成html 或 markdown文档
  • 三、参考文档


一、部署

1.基于SprinBoot项目,加入pom.xml加入依赖
<build>
        <plugins>
            <!-- 打包跳过测试 -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            
            <plugin>
                <groupId>com.github.shalousun</groupId>
                <artifactId>smart-doc-maven-plugin</artifactId>
                <version>2.6.1</version>
                <configuration>
                    <!--指定生成文档使用的配置文件-->
                    <configFile>./src/main/resources/smart-doc.json</configFile>
                    <excludes>
                        <exclude>com.merak.automation:automation-workflow-service</exclude>
                    </excludes>
                </configuration>
                <executions>
                    <execution>
                        <!--不需要在编译项目时自动生成文档可注释phase-->
                        <phase>compile</phase>
                        <goals>
                            <goal>html</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
           
        </plugins>
    </build>

提示:
如果项目采用是Mvn 多module化设计,可通过下述方式排除其它module的依赖与关联 :

 <excludes>
      <exclude>groupId值:merak-hyper-automation-common值</exclude>
   </excludes>

2.指定生成文档使用的配置文件
./src/main/resources/smart-doc.json文件内容:

{
  "serverUrl": "http://127.0.0.1/automation-workflow/",
  "isStrict": false,
  "allInOne": true,
  "outPath": "src/main/resources/static/doc",
  "projectName": "数字员工API开发文档",
  "packageFilters": "com.merak.hyper.automation.workflow.biz.ThirdpartyInterfaceControl",
  "coverOld": true,
  "style": "xt256",
  "showAuthor": false,
  "allInOneDocFileName": "hyper.html",
  "requestExample": "true",
  "responseExample": "true",
  "revisionLogs": [
    {
      "version": "1.0",
      "revisionTime": "2022-12-12 10:30",
      "status": "add",
      "author": "merak",
      "remarks": "desc"
    }
  ]
}

提示:
“packageFilters”:Controller接口对应的package目录,多个用;隔开,也支持正则式如:com.alibaba:.*

二、代码演示

1.类、方法注解

配置packageFilters参数指定的Controller业务类ThirdpartyInterfaceControl:

......
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 *
 * 数字员工第三方(外部)接入接口
 *
 * @apiNote 数字员工第三方(外部)接入接口
 * @tag 数字员工第三方(外部)接入接口
 */
@CrossOrigin(maxAge = 3600)
@RestController
@RequestMapping("/api")
public class ThirdpartyInterfaceControl extends BaseController {
    public static final Logger log = LoggerFactory.getLogger(ThirdpartyInterfaceControl.class);
    @Autowired
    private ExecRecServiceIm execRecServiceIm;
    @Autowired
    private WorkflowServiceIm workflowServiceIm;
    /**
     *
     * 云纳管-创建流程关联任务接口
     * @apiNote 云纳管接口-创建任务
     * @param wfId 流程Id
     * @param appAuthVo 应用系统接入对象
     * @return
     * @response
     * {
     *   "code":200,
     *   "data":{
     *  	"id":"1593831683682377730"  #任务ID
     *   }
     *   "msg":"操作成功"
     * }
     */
    @CrossOrigin
    @PostMapping("/cloudnanotubes/{wfId}")
    public AjaxResult addCloudNanotubes(@PathVariable("wfId") String wfId,
                                        @RequestBody @Valid AppAuthVo appAuthVo) {
        String recPkId = execRecServiceIm.addCloudNanotubes(wfId,appAuthVo);
        if( "".equals(recPkId) ){
            return toAjax(false);
        }
        else{
            Map<String,String> map = new HashMap<>();
            map.put("id",recPkId);
            return AjaxResult.success(map);
        }
    }

    /**
     *
     * 云纳管-同步任务结果接口
     * @apiNote 通过任务ID,反馈任务执行的结果(执行整体结果,支持5种日志)
     * @param syncTaskExecuteRecordsVo
     * @return
     * @response
     * {
     *   "code":200,
     *   "msg":"操作成功"
     * }
     */
    @CrossOrigin
    @PostMapping("/cloudnanotubes/synctaskresult")
    public AjaxResult syncTaskResult(@RequestBody @Valid RecordsVo syncTaskExecuteRecordsVo) {
        return toAjax(execRecServiceIm.syncTaskResult(syncTaskExecuteRecordsVo));
    }

    /**
     * 云执行-发起任务
     * @apiNote 通过流程ID+调用者身份触发一次任务并返回触发结果(触发反馈、任务ID)
     * @param wfId 流程Id
     * @param appAuthVo 应用系统接入对象
     * @return com.merak.hyper.automation.common.core.domain.AjaxResult
     * @response
     * {
     *   "code":200,
     *   "data":{
     *  	"id":"1593831683682377730"  #任务ID
     *   }
     *   "msg":"操作成功"
     * }
     */
    @CrossOrigin
    @PostMapping("/cloudnanotubes/cloudtaskstart/{wfId}")
    public AjaxResult cloudtaskstart(@PathVariable("wfId") String wfId,
                                     @RequestBody @Valid AppAuthVo appAuthVo) {
        String recPkId = workflowServiceIm.cloudTaskStart(wfId,appAuthVo);
        if( "".equals(recPkId) ){
            return toAjax(false);
        }
        else{
            Map<String,String> map = new HashMap<>();
            map.put("id",recPkId);
            return AjaxResult.success(map);
        }
    }

    /**
     *
     * 云执行-查询流程
     * @apiNote 通过流程ID查询流程相关信息(名称、描述、所属部门、单次节省时间、所属部门、所属场景、运行设备数量等)
     * @param wfId 流程Id
     * @return: com.merak.hyper.automation.common.core.domain.AjaxResult
     * @response
     * {
     *   "code":200,
     *   "data":{
     *       "object": "any object"
     *   }
     *   "msg":"操作成功"
     * }
     */
    @CrossOrigin
    @GetMapping("/cloudnanotubes/cloudworkflow")
    public AjaxResult queryCloudWorkflow(@RequestParam("wfId") String wfId) {
        BusWorkflow busWorkflow = workflowServiceIm.queryCloudWorkflow(wfId);
        if( null == busWorkflow ){
            return toAjax(false);
        }
        else{
            return AjaxResult.success(busWorkflow);
        }
    }

    /**
     *
     * 云执行-查询任务(支持批量)
     * @apiNote 1 任务ID+调用者身份查询相关任务信息(任务ID、创建时间、执行时长、执行状态等)
     *          2 调用者身份+时间查询相关任务信息(任务ID、创建时间、执行时长、执行状态等)
     * @param appId 身份认证appId
     * @param appSecret 身份认证appSecret
     * @param id 任务ID
     * @param startTime 任务查询开始时间,格式:yyyy-mm-dd HH:mm:ss
     * @param endTime 任务查询终止时间,格式:yyyy-mm-dd HH:mm:ss
     * @return com.merak.hyper.automation.common.core.page.TableDataInfo
     * @author merak
     */
    @CrossOrigin
    @GetMapping("/cloudnanotubes/cloudtask")
    public TableDataInfo cloudtaskList(@RequestParam(name = "appId") String appId,
                                   @RequestParam(name = "appSecret") String appSecret,
                                   @RequestParam(name = "id",required = false) String id,
                                   @RequestParam(name = "startTime",required = false) Date startTime,
                                   @RequestParam(name = "endTime",required = false) Date endTime) {
        startPage(1, 200);
        List<BusWorkflowExecRecords> list = execRecServiceIm.cloudtaskList(appId,appSecret,id,startTime,endTime);
        return getDataTable(list);
    }
}

参数类AppAuthVo:

package com.merak.hyper.automation.common.core.vo.SyncTaskExecute;

import javax.validation.constraints.NotBlank;

/**
 * @author chenjun
 * @version 1.0
 */
public class AppAuthVo {

    /**
     * 身份认证appId
     */
    @NotBlank(message = "身份认证appId不能为空")
    private String appId;
    /**
     * 身份认证appSecret
     */
    @NotBlank(message = "身份认证appSecret不能为空")
    private String appSecret;
    ....get set....
}

参数类RecordsVo:

package com.merak.hyper.automation.common.core.vo.SyncTaskExecute;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.Date;

/**
 * @author chenjun
 * @version 1.0
 * @ClassName: SyncTaskExecuteRecordsVo
 * @description: 云纳管同步任务结果vo:通过任务ID,反馈任务执行的结果(执行整体结果,支持5种日志)
 */
public class RecordsVo {
    /**
     * 任务ID
     */
    @NotBlank(message = "任务ID不能为空")
    private String id;//流程执行记录id-任务ID
    /**
     * 执行开始时间:格式yyyy-mm-dd HH:mm:ss
     */
    private Date startTime;//开始执行时间 2022-22-11 11:00:01
    /**
     * 执行终止时间:格式yyyy-mm-dd HH:mm:ss
     */
    private Date endTime;
    /**
     * 执行状态
     * [0:失败,1:完成 ,2:进行中,3:失败,执行中断, 4:失败,业务异常,5:等待,6:终止]
     *@mock 1
     */
    @NotNull(message = "执行状态不能为空")
    private Integer executeState;
    /**
     * 执行日志类型
     * [1:日志步骤 ,2:日志结果,3:业务截图, 4:业务数据,5:业务附件]
     *@mock 1 #或1,2 或1,...5 或1,2,3,4,5
     */
    @NotBlank(message = "执行日志类型不能为空")
    private String busType;//1,2,3,4,5",

    /**
     * 日志步骤对象,busType = 1时有效
     */
    private StepLog recordsteplog;
    /**
     * 日志结果对象,busType = 2时有效
     */
    private Recordsresultlog recordsresultlog;
    /**
     * 业务截图对象,busType = 3时有效
     */
    private Recordspicturelog recordspicturelog;
    /**
     * 业务数据对象,busType = 4时有效
     */
    private Recordsbusinsslog recordsbusinsslog;
    /**
     * 业务附件对象,busType = 5时有效
     */
    private Recordsattachment recordsattachment;

    ....get set....
}

Recordsresultlog类:

package com.merak.hyper.automation.common.core.vo.SyncTaskExecute;

/**
 * @author chenjun
 * @version 1.0
 */
public class Recordsresultlog {
    /**
     * 日志结果内容
     *@mock 巡检业务正常完成
     */
    private String resultLog;
    /**
     * 执行结果 [success:成功;error:失败;]
     *@mock success
     */
    private String executeResult;
    ...set. get.....
}

2.执行、生成html 或 markdown文档

idea—打开Maven容器—选择项目(需要生成文档目标项目)—Lifecycle(clean->install)—Plugins(smart-doc),如下图:
在这里插入图片描述

执行成功后,打开 **.html 或 *.html.md 首页文件
在这里插入图片描述
效果如图:
在这里插入图片描述

三、参考文档

smart-doc
官方文档:入门与使用
1.smart-doc.json 配置参数

{
  "outPath": "C:\\api", // 接口文档输出地址
  "serverUrl": "http://127.0.0.1:8090"// 请求路径
}




// 详细配置,按需设置
{
  "serverUrl": "http://127.0.0.1", //服务器地址,非必须。导出postman建议设置成http://{{server}}方便直接在postman直接设置环境变量
  "pathPrefix": "", //设置path前缀,非必须。如配置Servlet ContextPath 。@since 2.2.3
  "isStrict": false, //是否开启严格模式
  "allInOne": true,  //是否将文档合并到一个文件中,一般推荐为true
  "outPath": "D://md2", //指定文档的输出路径
  "coverOld": true,  //是否覆盖旧的文件,主要用于mardown文件覆盖
  "createDebugPage": true,//@since 2.0.0 smart-doc支持创建可以测试的html页面,仅在AllInOne模式中起作用。
  "packageFilters": "",//controller包过滤,多个包用英文逗号隔开,2.2.2开始需要采用正则:com.test.controller.*
  "md5EncryptedHtmlName": false,//只有每个controller生成一个html文件是才使用
  "style":"xt256", //基于highlight.js的代码高设置,可选值很多可查看码云wiki,喜欢配色统一简洁的同学可以不设置
  "projectName": "smart-doc",//配置自己的项目名称
  "skipTransientField": true,//目前未实现
  "sortByTitle":false,//接口标题排序,默认为false,@since 1.8.7版本开始
  "showAuthor":true,//是否显示接口作者名称,默认是true,不想显示可关闭
  "requestFieldToUnderline":true,//自动将驼峰入参字段在文档中转为下划线格式,//@since 1.8.7版本开始
  "responseFieldToUnderline":true,//自动将驼峰入参字段在文档中转为下划线格式,//@since 1.8.7版本开始
  "inlineEnum":true,//设置为true会将枚举详情展示到参数表中,默认关闭,//@since 1.8.8版本开始
  "recursionLimit":7,//设置允许递归执行的次数用于避免一些对象解析卡主,默认是7,正常为3次以内,//@since 1.8.8版本开始
  "allInOneDocFileName":"index.html",//自定义设置输出文档名称, @since 1.9.0
  "requestExample":"true",//是否将请求示例展示在文档中,默认true,@since 1.9.0
  "responseExample":"true",//是否将响应示例展示在文档中,默认为true,@since 1.9.0
  "requestParamsTable": true, //是否将请求参数表展示在文档中,默认true,@since 2.2.5
  "responseParamsTable": true //是否将响应参数表展示在文档中, 默认true,@since 2.2.5
  "urlSuffix":".do",//支持SpringMVC旧项目的url后缀,@since 2.1.0
  "displayActualType":false,//配置true会在注释栏自动显示泛型的真实类型短类名,@since 1.9.6
@since 2.0.9
  "openUrl": "http://localhost:7700/api",//torna平台地址,填写自己的私有化部署地址@since 2.0.9
  "debugEnvName":"测试环境", //torna环境名称
  "debugEnvUrl":"http://127.0.0.1",//推送torna配置接口服务地址
  "tornaDebug":false,//启用会推送日志
  "ignoreRequestParams":[ //忽略请求参数对象,把不想生成文档的参数对象屏蔽掉,@since 1.9.2
     "org.springframework.ui.ModelMap"
   ],
  "dataDictionaries": [{ //配置数据字典,没有需求可以不设置
      "title": "http状态码字典", //数据字典的名称
      "enumClassName": "com.power.common.enums.HttpCodeEnum", //数据字典枚举类名称
      "codeField": "code",//数据字典字典码对应的字段名称
      "descField": "message"//数据字典对象的描述信息字典
  }],
  "errorCodeDictionaries": [{ //错误码列表,没有需求可以不设置
    "title": "title",
    "enumClassName": "com.power.common.enums.HttpCodeEnum", //错误码枚举类
    "codeField": "code",//错误码的code码字段名称
    "descField": "message"//错误码的描述信息对应的字段名
  }],
  "revisionLogs": [{ //文档变更记录,非必须
      "version": "1.0", //文档版本号
      "revisionTime": "2020-12-31 10:30", //文档修订时间
      "status": "update", //变更操作状态,一般为:创建、更新等
      "author": "author", //文档变更作者
      "remarks": "desc" //变更描述
    }
  ],
  "customResponseFields": [{ //自定义添加字段和注释,一般用户处理第三方jar包库,非必须
      "name": "code",//覆盖响应码字段
      "desc": "响应代码",//覆盖响应码的字段注释
      "ownerClassName": "org.springframework.data.domain.Pageable", //指定你要添加注释的类名
      "ignore":true, //设置true会被自动忽略掉不会出现在文档中
      "value": "00000"//设置响应码的值
  }],
  "customRequestFields": [{ //自定义请求体的注释,@since 2.1.3,非必须
       "name":"code", //属性名
       "desc":"状态码", //描述
       "ownerClassName":"com.xxx.constant.entity.Result", //属性对应的类全路径
       "value":"200", //默认值或者mock值
       "required":true, //是否必填
       "ignore":false //是否忽略
  }],
  "requestHeaders": [{ //设置请求头,没有需求可以不设置
      "name": "token",//请求头名称
      "type": "string",//请求头类型
      "desc": "desc",//请求头描述信息
      "value":"token请求头的值",//不设置默认null
      "required": false,//是否必须
      "since": "-",//什么版本添加的改请求头
      "pathPatterns": "/app/test/**",//请看https://gitee.com/smart-doc-team/smart-doc/wikis/请求头高级配置?sort_id=4178978
      "excludePathPatterns":"/app/page/**"//请看https://gitee.com/smart-doc-team/smart-doc/wikis/请求头高级配置?sort_id=4178978
  },{
      "name": "appkey",//请求头
      "type": "string",//请求头类型
      "desc": "desc",//请求头描述信息
      "value":"appkey请求头的值",//不设置默认null
      "required": false,//是否必须
      "pathPatterns": "/test/add,/testConstants/1.0",//正则表达式过滤请求头,url匹配上才会添加该请求头,多个正则用分号隔开
      "since": "-"//什么版本添加的改请求头
  }],
  "requestParams": [ //公共请求参数(通过拦截器处理的场景),@since 2.2.3,没有需求请不要设置
    {
      "name": "configPathParam",//请求头名称
      "type": "string",//请求头类型
      "desc": "desc",//请求头描述信息
      "paramIn": "path",
      "value":"testPath",//不设置默认null
      "required": false,//是否必须
      "since": "-",//什么版本添加的改请求头
      "pathPatterns": "*",//正则表达式过滤请求头
      "excludePathPatterns":"/app/page/**" //参考请求头中的用法
    },
    {
      "name": "configQueryParam",//请求头名称
      "type": "string",//请求头类型
      "desc": "desc",//请求头描述信息
      "paramIn": "query",
      "value":"testQuery",//不设置默认null
      "required": false,//是否必须
      "since": "-",//什么版本添加的改请求头
      "pathPatterns": "*",//正则表达式过滤请求头
      "excludePathPatterns":"/app/page/**"
    }
  ],
  "rpcApiDependencies":[{ // 项目开放的dubbo api接口模块依赖,配置后输出到文档方便使用者集成
        "artifactId":"SpringBoot2-Dubbo-Api",
        "groupId":"com.demo",
        "version":"1.0.0"
   }],
  "rpcConsumerConfig": "src/main/resources/consumer-example.conf",//文档中添加dubbo consumer集成配置,用于方便集成方可以快速集成
  "apiObjectReplacements": [{ // 自smart-doc 1.8.5开始你可以使用自定义类覆盖其他类做文档渲染,非必须
      "className": "org.springframework.data.domain.Pageable",
      "replacementClassName": "com.power.doc.model.PageRequestDto" //自定义的PageRequestDto替换Pageable做文档渲染
  }],
  "apiConstants": [{//从1.8.9开始配置自己的常量类,smart-doc在解析到常量时自动替换为具体的值,非必须
        "constantsClassName": "com.power.doc.constants.RequestParamConstant"
  }],
  "responseBodyAdvice":{ //自smart-doc 1.9.8起,非必须项,ResponseBodyAdvice统一返回设置(不要随便配置根据项目的技术来配置),可用ignoreResponseBodyAdvice tag来忽略
          "className":"com.power.common.model.CommonResult" //通用响应体
  },
  "requestBodyAdvice":{ 自smart-doc 2.1.4 起,支持设置RequestBodyAdvice统一请求包装类,非必须
         "className":"com.power.common.model.CommonResult"
  },
  "groups": [ // @since 2.2.5, 对不同的controller进行分组
    {
      "name": "测试分组",
      "apis": "com.power.doc.controller.app.*"
    }
  ]
}

2.smart-doc自定义注释tag
smart-doc的实现初衷是通过使用javadoc文档注释来去除注解式的侵入, 因此smart-doc每增加一个功能首先都是去考虑javadoc原生的tag, 下面对smart-doc使用的一些javadoc的注释tag做介绍。
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

[附源码]计算机毕业设计高校学生宿舍管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis MavenVue等等组成&#xff0c;B/S模式…

若依微服务版登录流程源码分析2

接上篇&#xff0c;后端接收到“/code”请求并将其转发至ValidateCodeHandler处理 生成验证码 进入ValidateCodeServiceImpl#createCaptcha 这块代码比较简单&#xff0c;就不多赘述 /** * 生成验证码 */ Override public AjaxResult createCaptcha() throws IOException, C…

VM 找不到虚拟磁盘 000001.vmdk 一种排查思路

报错内容“ 找不到文件: E:\win10\Windows 10 x64-000001.vmdk 开启此虚拟机需要用到此文件。如果移动了此文件&#xff0c;请提供它的新位置。 ” 它明明就在哪里&#xff0c;却提示找不到&#xff01;气死 这个时候可以打开“vmware.log” 查看报错内容。 比如我的核心报…

从零开始学Java之Java到底是个啥?

全文大约 【 5000】 字&#xff0c;不说废话&#xff0c;只讲可以让你学到技术、明白原理的纯干货&#xff01;文章带有丰富案例及配图、视频&#xff0c;只为让你更好的理解和运用文中的技术概念&#xff0c;给你带来具有足够启迪的教程...... -----------------------------…

基础数据结构链表

链表是一种常见的基础数据结构&#xff0c;结构体指针在这里得到了充分的利用。链表可以动态的进行存储分配&#xff0c;也就是说&#xff0c;链表是一个功能极为强大的数组&#xff0c;他可以在节点中定义多种数据类型&#xff0c;还可以根据需要随意增添&#xff0c;删除&…

论文速递:带重力约束的点云配准(Gravity-constrained point cloud registration)

标题&#xff1a;Gravity-constrained point cloud registration 作者&#xff1a;Vladim ́ır Kubelka, Maxime Vaidis and Franc ̧ois Pomerleau&#xff0c;加拿大拉瓦尔大学 来源&#xff1a;IROS 2022 摘要 视觉和激光SLAM算法从IMU中获益良多。高频率的IMU数据弥补了…

嵌入式:ARM的流水线技术

三级流水线ARM的组织 ARM的3级流水线介绍 到ARM7为止的ARM处理器使用的简单3级流水线分别为 取指级 &#xff1a;读取指令。译码级 &#xff1a;对指令进行译码。占有“译码逻辑”&#xff0c;不占有“数据路径”。执行级 &#xff1a;指令占有“数据路径”&#xff0c;寄存…

拼搏别样的未来,中国社科院与美国杜兰大学金融管理硕士项目助力你的人生旅程

你憧憬中的未来是什么样子呢&#xff1f;我们的人生路程充满了众多可能性&#xff0c;只要努力就会收获自己的别样人生。我们的人生不是单一的色彩&#xff0c;它是五彩斑斓、精彩纷呈的。在每一个阶段的我们所拥有当时的状态并不能代表永远&#xff0c;随着我们的拼搏与奋斗&a…

2022全年度空调十大热门品牌销量榜单

今年空调的销售得到明显改善&#xff0c;尤其是今年夏天全国多地最高气温同比明显提升&#xff0c;且高温的强度和持续时间还具有一定的极端性。随着气温的骤升&#xff0c;空调市场也迅速升温&#xff0c;各终端销售量出现明显增长。 根据鲸参谋数据统计&#xff0c;今年京东平…

“美亚杯”第五届中国电子数据取证大赛答案解析(个人赛)

A C D 分区5为系统分区 A 1073741824*458.29492085140520.96 E A A E D B 无答案 C 搜索各选项&#xff0c;C项搜不到 B C E 使用火绒剑查看进程调用的动态链接库 C 仿真得 B 内存大小为3G&#xff0c;在系统盘根目录过滤大小在2-8G之间的文件 D Win10时间线信息存放的数…

代码随想录算法训练营第六天| 哈希表理论基础 ,242.有效的字母异位词 , 349. 两个数组的交集 ,202. 快乐数,1. 两数之和

代码随想录算法训练营第六天| 哈希表理论基础 &#xff0c;242.有效的字母异位词 &#xff0c; 349. 两个数组的交集 &#xff0c;202. 快乐数&#xff0c;1. 两数之和 哈希表理论基础 建议&#xff1a;大家要了解哈希表的内部实现原理&#xff0c;哈希函数&#xff0c;哈希碰…

PAT 乙级 1078字符串压缩与解压 python

题目 思路&#xff1a; 生成两个函数&#xff1a;压缩与解压 在压缩中利用flag保留前一个字符串 再利用count统计重复出现字母的个数 如果目前遍历到的字母和flag相同&#xff0c;则count1 反之&#xff0c;说明重复结束 在解压中&#xff0c;如果遇到数字&#xff0c;表示需…

一文带你了解 K8s 是如何部署应用的

通过部署一个 Nginx 服务/实例来简单介绍 K8s 部署一个应用的流程。 1、创建 deployment 资源 kubectl create deployment nginx --imagenginx kubectl expose deployment nginx --port80 --typeNodePort2、查看 deployment 资源 kubectl get deployment3、查看节点上的 pod…

安全需求分析

汽车制造业 MES系统 DNC系统 生产 安全域1 管理层 工控安全隔离装置 交换机 安全配置核查系统 HMI 历史数据库 运行监控系统 实时数据库 打印机 过程 安全域2 监控层 工控漏洞扫描系统 安全交换机 工控安全审计系统 工控入侵检测系统 工程师站 A 操作员站 A 实时数据库A 操作员…

【菜鸡读论文】Margin-Mix: Semi-Supervised Learning for Face Expression Recognition

【菜鸡读论文】Margin-Mix: Semi-Supervised Learning for Face Expression Recognition 感觉最近的每天都在见证历史&#xff0c;上海现在也开始全面放开了&#xff0c;很多高校都已经开始遣返了。小伙伴们都回到家了吗&#xff1f; 上周周末太懒了&#xff0c;就没有更新论…

一文教你在SpringBoot中使用Thymeleaf

一文教你在SpringBoot中使用Thymeleaf1.快速使用Thymeleaf2.Thymeleaf快速入门案例3.Thymeleaf基本语法each遍历其他语法1.快速使用Thymeleaf 首先导入Maven依赖&#xff1a; <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-thym…

怎么在图片加文字边框?这些方法值得你收藏

当我们在拍完照片以后&#xff0c;一般都会为它进行后期的编辑修图&#xff0c;因此在图片上面添加一些文字信息和边框是必不可少的&#xff0c;这样不仅能使图片变得更加精致&#xff0c;还可以增加它的信息量。那你们知道怎么给图片加上边框和文字吗&#xff1f;别着急&#…

uniapp实战仿写网易云音乐(一)—底部工具栏以及首页轮播图swiper的实现

文章目录前言首页导航栏公共样式的配置首页轮播图最后前言 从本篇文章开始记录uniapp实战仿写网易云音乐项目的过程&#xff0c;主要会写一下关键步骤和难点&#xff0c;本专栏会保持持续更新&#xff0c;并在最后送上源码&#xff0c;感兴趣的可以订阅本专栏。本篇主要实现的…

【C++11多线程】获取异步任务的结果:future、shared_future

文章目录1.std::future1.1 get()1.2 valid()1.3 share()1.4 wait_for()1.4.1 std::future_status::timeout1.4.2 std::future_status::ready1.4.3 std::future_status::deferred2.std::shared_future3.参考资料1.std::future std::future 是个类模板&#xff0c;其源码如下所示…

[附源码]Python计算机毕业设计大学生志愿者管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…