当前位置: 首页 > news >正文

尚医通06:数据字典+EasyExcel+mongodb

内容介绍

1、数据字典列表前端

2、EasyExcel介绍、实例

3、数据字典导出接口、前端

4、数据字典导入接口、前端

5、数据字典添加redis缓存

6、MongoDB简介

7、MongoDB安装

8、MongoDB基本概念

数据字典列表前端

1、测试问题

1)报错日志

2)问题定位

URL错误

3)解决问题

2nginx

1)基本功能

反向代理、负载均衡、动静分离

2)安装

解压即可使用

3)启动

4)修改配置

server {

    listen 9001;

    server_name localhost;

    location ~/hosp/ {          

        proxy_pass http://localhost:8201;

    }

    location ~/cmn/ {          

        proxy_pass http://localhost:8202;

    }

}

重启服务或重新加载(nginx.exe -s reload)才可生效

5)测试访问后端接口

http://localhost:9001/admin/hosp/hospitalSet/findAll

6)改造前端

重启生效

EasyExcel介绍、实例

1、是什么

EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称。

2、为什么

没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。

3、准备工作

1cmn导入依赖

<dependencies><!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.1.1</version></dependency></dependencies>

2)创建目录、创建实体

@Datapublic class Stu {//设置表头名称
@ExcelProperty("学生编号")private int sno;//设置表头名称
@ExcelProperty("学生姓名")private String sname;}

4、实现写操作

public class WriterTest {public static void main(String[] args) {String fileName = "D:\\test\\230308\\a.xlsx";EasyExcel.write(fileName,Stu.class).sheet("学员信息").doWrite(data());}//循环设置要添加的数据,最终封装到list集合中
private static List<Stu> data() {List<Stu> list = new ArrayList<Stu>();for (int i = 0; i < 10; i++) {Stu data = new Stu();data.setSno(i);data.setSname("张三"+i);list.add(data);}return list;}}

5、实现读操作

1)改造实体

@Datapublic class Stu {//设置表头名称
@ExcelProperty(value = "学生编号",index = 0)private int sno;//设置表头名称
@ExcelProperty(value = "学生姓名",index = 1)private String sname;}

2)创建监听器

public class ExcelListener extends AnalysisEventListener<Stu> {@Overridepublic void invoke(Stu stu, AnalysisContext analysisContext) {//可以实现调用接口,数据入库
System.out.println("stu = " + stu);}//读取excel表头信息
@Overridepublic void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {System.out.println("表头信息:"+headMap);}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {}}

3)读数据实例

public class ReadTest {public static void main(String[] args) {String fileName = "D:\\test\\230308\\a.xlsx";EasyExcel.read(fileName,Stu.class,new ExcelListener()).sheet().doRead();}}

数据字典导出、前端

1、准备工作

1)确认依赖

2)确认对象

2、实现导出接口

1)分析接口

*参数:response

*返回值:无

2)实现controller

@ApiOperation(value="导出")@GetMapping(value = "/exportData")public void exportData(HttpServletResponse response) {dictService.exportData(response);}

3)实现service

//导出
@Overridepublic void exportData(HttpServletResponse response) {try {//1设置response参数
response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
String fileName = URLEncoder.encode("数据字典", "UTF-8");response.setHeader("Content-disposition", "attachment;filename="+ fileName + ".xlsx");//2查询数据字典表数据List<Dict>List<Dict> dictList = baseMapper.selectList(null);//3遍历集合List<Dict>转型List<DictEeVo>List<DictEeVo> dictEeVoList = new ArrayList<>();for (Dict dict : dictList) {DictEeVo dictEeVo = new DictEeVo();BeanUtils.copyProperties(dict,dictEeVo);dictEeVoList.add(dictEeVo);}//4调用工具方法导出数据
ServletOutputStream outputStream = response.getOutputStream();EasyExcel.write(outputStream,DictEeVo.class).sheet("数据字典").doWrite(dictEeVoList);} catch (IOException e) {throw new YyghException(20001,"导出失败");}}

3、对接前端

1)添加页面元素

<div class="el-toolbar"><div class="el-toolbar-body" style="justify-content: flex-start;"><el-button type="text" @click="exportData"><i class="fa fa-plus"/> 导出</el-button></div></div>(2)实现js方法//导出数据exportData(){window.open(`${process.env.VUE_APP_BASE_API}admin/cmn/dict/exportData`)}

3)测试

数据字典导入、前端

1数据字典导入接口

1)分析接口

*参数:file

*返回值:R.ok()

2)实现controller

@ApiOperation(value = "导入")@PostMapping("importData")public R importData(MultipartFile file) {dictService.importData(file);return R.ok();}

3)创建监听器

@Componentpublic class DictListener  extends AnalysisEventListener<DictEeVo> {@Autowiredprivate DictMapper dictMapper;//手动注入,使用有参构造
//private DictMapper dictMapper;@Overridepublic void invoke(DictEeVo dictEeVo, AnalysisContext analysisContext) {//1转化数据类型DictEeVo=DictDict dict = new Dict();BeanUtils.copyProperties(dictEeVo,dict);//2补充数据
dict.setIsDeleted(0);//3数据入库
dictMapper.insert(dict);}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {}}

4实现service

@Autowiredprivate DictListener dictListener;

//导入
@Overridepublic void importData(MultipartFile file) {try {InputStream inputStream = file.getInputStream();EasyExcel.read(inputStream,DictEeVo.class,dictListener).sheet().doRead();} catch (IOException e) {throw new YyghException(20001,"导入失败");}}

5)测试

2、对接前端

1)分析需求

2)查看组件

3)添加页面元素

<div class="el-toolbar">

      <div class="el-toolbar-body" style="justify-content: flex-start;">

        <el-button type="text" @click="exportData">

          <i class="fa fa-plus"/> 导出

        </el-button>

        <el-button type="text" @click="importData"><i class="fa fa-plus"/> 导入</el-button>

      </div>

    </div>

<el-dialog title="导入" :visible.sync="dialogImportVisible" width="480px">

      <el-form label-position="right" label-width="170px">

        <el-form-item label="文件">

          <el-upload

            :multiple="false"

            :on-success="onUploadSuccess"

            :action="BASE_URL+'admin/cmn/dict/importData'"

            class="upload-demo"

          >

            <el-button size="small" type="primary">点击上传</el-button>

            <div slot="tip" class="el-upload__tip">只能上传xls文件,且不超过500kb</div>

          </el-upload>

        </el-form-item>

      </el-form>

      <div slot="footer" class="dialog-footer">

        <el-button @click="dialogImportVisible = false">取消</el-button>

      </div>

    </el-dialog>

4)实现js

*属性

data() {

    return {

      list: [],

      dialogImportVisible: false, //对话框是否显示

      BASE_URL: process.env.VUE_APP_BASE_API //基础访问地址

    };

  },

……

*方法

//打开导入窗口

    importData() {

      this.dialogImportVisible = true;

    },

    //导入成功方法

    onUploadSuccess(response, file) {

      this.$message.success("上传成功");

      this.dialogImportVisible = false;

      this.getData();

    }

数据字典添加redis缓存

1redis回顾

2、准备工作

1)虚拟机

2)安装redis

3)检查配置

4)启动redis

3redis缓存访问机制

4、整合redis

1common_utils模块,添加redis依赖

<dependencies><!-- redis --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- spring2.X集成redis所需common-pool2--><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId><version>2.6.0</version></dependency></dependencies>

2common_utils模块,添加Redis配置类

@Configuration@EnableCachingpublic class RedisConfig {/*** 设置RedisTemplate规则
* @param redisConnectionFactory* @return*/@Beanpublic RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(redisConnectionFactory);Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);//解决查询缓存转换异常的问题
ObjectMapper om = new ObjectMapper();// 指定要序列化的域,field,getset,以及修饰符范围,ANY是都有包括privatepublicom.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);// 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(om);//序列号key valueredisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);redisTemplate.setHashKeySerializer(new StringRedisSerializer());redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);redisTemplate.afterPropertiesSet();return redisTemplate;}/*** 设置CacheManager缓存规则
* @param factory* @return*/@Beanpublic CacheManager cacheManager(RedisConnectionFactory factory) {RedisSerializer<String> redisSerializer = new StringRedisSerializer();Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);//解决查询缓存转换异常的问题
ObjectMapper om = new ObjectMapper();om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(om);// 配置序列化(解决乱码的问题),过期时间600
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofSeconds(600)).serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer)).serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer)).disableCachingNullValues();RedisCacheManager cacheManager = RedisCacheManager.builder(factory).cacheDefaults(config).build();return cacheManager;}}

3)在service_cmn模块添加redis配置

spring.redis.host=192.168.140.138spring.redis.port=6379spring.redis.database= 0spring.redis.timeout=1800000spring.redis.lettuce.pool.max-active=20spring.redis.lettuce.pool.max-wait=-1#最大阻塞等待时间(负数表示没限制)spring.redis.lettuce.pool.max-idle=5spring.redis.lettuce.pool.min-idle=0
 

(4)查询方法添加注解

@Override// redis k:v   k=dict::selectIndexList  v=List<Dict>@Cacheable(value = "dict", key = "'selectIndexList'")public List<Dict> findChildData(Long id) {//1拼写查询条件
LambdaQueryWrapper<Dict> wrapper = new LambdaQueryWrapper<>();wrapper.eq(Dict::getParentId,id);//2查询子数据集合
List<Dict> dictList = baseMapper.selectList(wrapper);//3遍历集合,确认是否有子数据
for (Dict dict : dictList) {boolean isChildren = this.isChildren(dict);dict.setHasChildren(isChildren);}return dictList;}

5、问题解决

1)问题描述

*一级数据可以走缓存

*二级数据加载不出来

2)问题定位

*二级数据查询需要查询数据库

*二级数据没有查询数据库,查询缓存获取一级数据

3)解决方案

让多次查询redis缓存的key不一样

//根据数据id查询子数据列表
@Override// redis k:v   k=dict::selectIndexList  v=List<Dict>@Cacheable(value = "dict", key = "'selectIndexList'+#id")public List<Dict> findChildData(Long id) {//1拼写查询条件
LambdaQueryWrapper<Dict> wrapper = new LambdaQueryWrapper<>();wrapper.eq(Dict::getParentId,id);//2查询子数据集合
List<Dict> dictList = baseMapper.selectList(wrapper);//3遍历集合,确认是否有子数据
for (Dict dict : dictList) {boolean isChildren = this.isChildren(dict);dict.setHasChildren(isChildren);}return dictList;}

4redis缓存写操作同步机制

MongoDB简介

1 NoSQL概述

2MongoDB是什么

MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。

MongoDB 是文档型NOSQL数据库

MongoDB安装

1、安装

1)确认docker服务

2)下载

docker pull mongo:latest

docker pull mongo:4.4.8

3)创建和启动容器

docker run -d --restart=always -p 27017:27017 --name mymongo -v /data/db:/data/db -d mongo:4.4.8

(4)进入容器

docker exec -it mymongo /bin/bash

5)进入mongo

mongo

新版本:mongosh

MongoDB概念介绍

1、与mysql对比

2、数据库(文件柜)

1Help查看命令提示

db.help();

2use test

如果数据库不存在,则创建数据库,否则切换到指定数据库

3 查询所有数据库

show dbs;

4)删除当前使用数据库

db.dropDatabase();

5)查看当前使用的数据库

db.getName();

6)显示当前db状态

db.stats();

7)当前db版本

db.version();

8 查看当前db的链接机器地址

db.getMongo();

3、集合(抽屉)

1、 创建一个集合(table)

db.createCollection( "user");

2、 得到指定名称的集合(table )

db.getCollection("user");

4、文档

文档是一组键值(key-value)对(即BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别

1)数据类型

相关文章:

尚医通06:数据字典+EasyExcel+mongodb

内容介绍 1、数据字典列表前端 2、EasyExcel介绍、实例 3、数据字典导出接口、前端 4、数据字典导入接口、前端 5、数据字典添加redis缓存 6、MongoDB简介 7、MongoDB安装 8、MongoDB基本概念 数据字典列表前端 1、测试问题 &#xff08;1&#xff09;报错日志 &am…...

【前端知识】React 基础巩固(三十二)——Redux的三大原则、使用流程及实践

React 基础巩固(三十二)——Redux的三大原则 一、Redux的三大原则 单一数据源 整个应用程序的state被存储在一颗object tree 中&#xff0c;并且这个object tree 只存储在一个store中&#xff1b;Redux并没有强制让我们不能创建多个Store&#xff0c;但是那样做不利于数据维护…...

[NLP]使用Alpaca-Lora基于llama模型进行微调教程

Stanford Alpaca 是在 LLaMA 整个模型上微调&#xff0c;即对预训练模型中的所有参数都进行微调&#xff08;full fine-tuning&#xff09;。但该方法对于硬件成本要求仍然偏高且训练低效。 [NLP]理解大型语言模型高效微调(PEFT) 因此&#xff0c; Alpaca-Lora 则是利用 Lora…...

Linux Shell 脚本编程学习之【第5章 文件的排序、合并与分割 (第四部分之cut命令) 】

第5章 文件的排序、合并与分割 &#xff08;第四部分之cut命令&#xff09; 4 cut 命令4.1 选项及其意义4.2 输出字符 &#xff08;-c&#xff09;4.3 改变分隔符&#xff08;-d&#xff09;和提取特定域&#xff08;-f&#xff09; 5 paste 命令5.1 paste 命令选项及其意义5.2…...

php-golang-rpc jsonrpc和php客户端tivoka/tivoka包实践

golang 代码&#xff1a; package main import ( "fmt" "net" "net/rpc" "net/rpc/jsonrpc" ) type App struct{} type Res struct { Code int json:"code" Msg string json:"msg" Data any json:"…...

flutter 打包iOS安装包

flutter iOS Xcode打包并导出ipa文件安装包 1、 Xcode配置 1、 启动打包 1、 等待打包 1、 打包完成、准备导出ipa 1、 选择模式 1、 选择配置文件 1、 导出 1、 选择导出位置 1、 得到ipa...

二进制重排

二进制重排作用 二进制重排的主要目的是将连续调用的函数连接到相邻的虚拟内存地址&#xff0c;这样在启动时可以减少缺页中断的发生&#xff0c;提升启动速度。目前网络上关于ios应用启动优化&#xff0c;通过XCode实现的版本比较多。MacOS上的应用也是通过clang进行编译的&am…...

【Linux后端服务器开发】MAC地址与其他重要协议

目录 一、以太网 二、MAC地址 三、MTU 四、ARP协议 五、DNS系统 六、ICMP协议 七、NAT技术 八、代理服务器 一、以太网 “以太网”不是一种具体的网路&#xff0c;而是一种技术标准&#xff1a;既包含了数据链路层的内容&#xff0c;也包含了一些物理层的内容&#xf…...

WebGPU入门

1. 引言 前序博客&#xff1a; CUDA入门WebGPUZKP&#xff1a;客户端证明 WebGPU——Draft 2023.7.17 由苹果、谷歌、Mozilla团队发起&#xff0c;当前处于草稿阶段&#xff0c;旨在成为W3C推荐标准。 WebGPU为 在图形处理单元&#xff08;GPU&#xff09;上执行诸如渲染和…...

React Dva项目中.roadhogrc.mock.js直接自动导入mock目录下所有文件方式

上文 React Dva项目中模仿网络请求数据方法 中&#xff0c;我们书写了Dva项目模拟后端数据的方式 但是 我们.roadhogrc.mock.js中的这个处理其实并不好用 我们还需要一个一个的引入 我们可以直接靠一段代码 import fs from fs; import path from path; const mock {} fs.re…...

跨境独立站如何应对恶意网络爬虫?

目录 跨境出海独立站纷纷成立 爬虫威胁跨境电商生存 如何有效识别爬虫&#xff1f; 技术反爬方案 防爬虫才能保发展 中国出海跨境电商业务&#xff0c;主要选择大平台开设店铺&#xff0c;例如&#xff0c;亚马逊、eBay、Walmart、AliExpress、Zalando等。随着业务的扩大&…...

C# SourceGenerator 源生成器初探

简介 注意&#xff1a; 坑极多。而且截至2023年&#xff0c;这个东西仅仅是半成品 利用SourceGenerator可以在编译结束前生成一些代码参与编译&#xff0c;比如编译时反射之类的&#xff0c;还有模板代码生成都很好用。 演示仓库传送门-Github-yueh0607 使用 1. 创建项目 …...

网络安全/信息安全—学习笔记

一、网络安全是什么 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面…...

【Visual Studio】无法打开包括文件: “dirent.h”: No such file or directory

VS2017/2019 无法打开包括文件: “dirent.h”: No such file or directory 1 “dirent.h”: No such file or directory 在windows下的VS2017/2019编译器中&#xff0c;发现无法打开“dirent.h”&#xff0c;主要是MSVC并没有实现这个头文件&#xff0c;但是在Linux这个头文件…...

asp.net MVC markdown编辑器

在 ASP.NET MVC 中&#xff0c;你可以使用一些第三方 Markdown 编辑器来让用户在网页上方便地编辑和预览 Markdown 内容。这些编辑器通常提供实时预览功能&#xff0c;将 Markdown 文本转换为实时渲染的 HTML&#xff0c;并支持编辑器工具栏来辅助用户编辑。 以下是一些流行的…...

论文浅尝 | 预训练Transformer用于跨领域知识图谱补全

笔记整理&#xff1a;汪俊杰&#xff0c;浙江大学硕士&#xff0c;研究方向为知识图谱 链接&#xff1a;https://arxiv.org/pdf/2303.15682.pdf 动机 传统的直推式(tranductive)或者归纳式(inductive)的知识图谱补全(KGC)模型都关注于域内(in-domain)数据&#xff0c;而比较少关…...

算法工程师-机器学习面试题总结(2)

线性回归 线性回归的基本思想是&#xff1f; 线性回归是一种用于建立和预测变量之间线性关系的统计模型。其基本思想是假设自变量&#xff08;输入&#xff09;和因变量&#xff08;输出&#xff09;之间存在线性关系&#xff0c;通过建立一个线性方程来拟合观测数据&#xff…...

低成本32位单片机空调内风机方案

空调内风机方案主控芯片采用低成本32位单片机MM32SPIN0230&#xff0c;内部集成了具有灵动特色的电机控制功能&#xff1a;高阶4路互补PWM、注入功能的高精度ADC、轨到轨运放、轮询比较器、32位针对霍尔传感器的捕获时钟、以及硬件除法器和DMA等电机算法加速引擎。 该方案具有…...

读发布!设计与部署稳定的分布式系统(第2版)笔记25_互联层之路由和服务

1. 控制请求数量 1.1. 这个世界可以随时摧毁我们的系统 1.1.1. 要么拒绝工作 1.1.2. 要么扩展容量 1.1.3. 没有人会在与世隔绝的环境中使用服务&#xff0c;现在的服务大多必须处理互联网规模的负载 1.2. 系统的每次失效&#xff0c;都源自某个等待队列 1.3. 每个请求都会…...

AI面试官:LINQ和Lambda表达式(二)

AI面试官&#xff1a;LINQ和Lambda表达式&#xff08;二&#xff09; 当面试官面对C#中关于LINQ和Lambda表达式的面试题时&#xff0c;通常会涉及这两个主题的基本概念、用法、实际应用以及与其他相关技术的对比等。以下是一些可能的面试题目&#xff0c;附带简要解答和相关案…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...