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

管理100个小程序-很难吗

20公里的徒步-真难


群里的伙伴发起了一场天目山20公里徒步的活动,想着14公里都轻松拿捏了,思考了30秒后,就借着春风带着老婆孩子就出发了。一开始溪流清澈见底,小桥流水没有人家;青山郁郁葱葱,枯藤老树没有乌鸦,微风习习,鸟语花香,好不惬意。大有我看青山多妩媚,料青山见我应如是的舒坦,但是,但是没多一会儿画风突变了,爬过一座山还有数不尽的山,关键还一山更比一山高。响午温度升高,加之水资源极度匮乏(因为没有人家,划重点: 徒步一定要多带水),小宝先哭为敬了。好在睡意过去后,又坚强的跑了起来,一直用他的格言激励自己:放弃很多简单,坚持很难,我要坚持。大宝一直在在前面跟着大队伍,想想也是克服了极大的困难,他一直在山顶殷切的期盼着我们,当我们出现视野里时,又高兴的喊着爸爸,妈妈,小宝加油。或许大宝还是蛮优秀的,只是有时对大宝可能过于严厉了些。最后,大家都是笑着走过了最难的路。
在这里插入图片描述

走到16公里的地方,天已经黑了,已经到大路了,是不是20公里也不重要了,大家开心的找了家饭店,酣畅淋漓的吃喝了一顿,途中的跌倒与艰难全都成了豪爽的谈资,第二天大家都还可以自豪的说全身酸痛不已。
在这里插入图片描述

流量来了-心动了


领略了天目山的秀丽风景,回归正题。书接上文,之前捣鼓了一个小程序,没有想到日活居然过1000了,日新增200+,活跃用户次日留存超40%…
在这里插入图片描述

看着这些数据,陷入了沉思,思绪竟然来到了明朝末年(估计最近读《明朝那些事儿》魔怔了吧),农民起义纷争的年代,自己化身高迎祥、李自成、张献忠,手握数万雄兵,但不知所措…思绪一阵乱飞后得到这样一个结论:一个小程序1000,100个小程序就是10万(10万日活广告费真是不得了)- 构建小程序矩阵,构建100个程序,小程序就是雄兵,去攻城略地。

这事儿只有开头简单


有了目标,一口气又注册了5个小程序,备案,各种配置,上传,提交审核,发布…一套动作下来,虽是幸苦,总算是5个小程序都上架了,但是心中总有点不得劲儿的感觉,又说不出是哪里出了问题。还没等回过劲儿,发现程序有bug, 又吭哧吭哧一个个修改,上传,提交审核,发布…这会儿明白问题在哪里了:机械重复。光明白还没用,因为又有bug了,又是全套流程要做完。更多严重的问题是:这个过程又中注册了5个新小程序…应了那句老话:万事开头难,开头后更难。看着10个小程序要机械的重复发布,我没有崩溃,也没有去重复了,去捣鼓自动化了,解放双手才是正确的路。虽然只是解决了代码上传的问题,已是一个巨大的进步。

提前在 key目录下添加小程序代码上传密钥文件格式 private.wx0d8d56e152eb16xx.key

const fileExists = require('file-exists');const del = require('del');
const child_process = require('child_process');
const ci = require('miniprogram-ci');const gulp = require('gulp');const less = require('gulp-less');
const uglify = require('gulp-uglify');
const cleanCSS = require('gulp-clean-css');
const rename = require('gulp-rename');
const gulpif = require('gulp-if');
const replace = require('gulp-replace');
const alias = require('gulp-path-alias');
const autoprefixer = require('gulp-autoprefixer');const pkg = require('./package.json');
let projectConfig = require('./project.config.json');
const buildPath = path.join(__dirname, 'dist/');const argv = require('minimist')(process.argv.slice(1));
const appId = argv["appId"];
if (appId){console.log('set appId  = ',appId);projectConfig['appid'] = appId;
}const env = process.env.NODE_ENV
console.log("evn=", env)
const isPro = env === 'production';
console.log("isPro=", isPro)
const branchName = child_process.execSync('git symbolic-ref --short HEAD', {encoding: 'utf8',
});const paths = {styles: {src: ['src/**/*.less'],dest: buildPath,},images: {src: 'src/images/**/*.{png,jpg,jpeg,svg,gif}',dest: buildPath,},scripts: {src: 'src/**/*.js',dest: buildPath,},copy: {src: ['src/**','!src/**/*.less','!src/**/*.js','package.json',],dest: buildPath,},
};// 删除构建
function clean() {return del([buildPath]);
}function log() {const data = Array.prototype.slice.call(arguments);console.log(data);
}// 任务处理函数
function styles() {return gulp.src(paths.styles.src, { base: 'src' }).pipe(alias({paths: {'@': path.resolve(__dirname, './src/'),},})).pipe(less()).pipe(autoprefixer()).pipe(gulpif(isPro, cleanCSS())).pipe(rename((path) => (path.extname = '.wxss'))).pipe(gulp.dest(paths.styles.dest));
}function scripts() {return (gulp.src(paths.scripts.src, { base: 'src' }).pipe(alias({paths: {'@': path.resolve(__dirname, './src/'), // src 目录},}))// .pipe(babel({ presets: ['@babel/env'], 'plugins': [] })).pipe(replace('%ENV%', process.env.NODE_ENV)) // 环境变量静态替换.pipe(replace('%VERSION%', pkg.version)).pipe(gulpif(isPro, uglify())).pipe(gulp.dest(paths.scripts.dest)));
}// 不需要处理的文件直接复制过去
function copy() {return gulp.src(paths.copy.src).pipe(gulp.dest(paths.copy.dest));
}function watchFiles() {const w1 = gulp.watch(paths.styles.src, styles).on('unlink', function (file) {log(file + ' is deleted');const filePath = file.replace(/src\\/, 'dist\\');del([filePath]);});const w2 = gulp.watch(paths.scripts.src, scripts).on('unlink', function (file) {log(file + ' is deleted');const filePath = file.replace(/src\\/, 'dist\\');del([filePath]);});const w3 = gulp.watch(paths.copy.src, copy).on('unlink', function (file) {log(file + ' is deleted');const filePath = file.replace(/src\\/, 'dist\\');del([filePath]);});return Promise.all([w1, w2, w3]);
}/*** 小程序ci相关函数*/
let project = {};const keyFile = fileExists.sync(`./key/private.${appId}.key`);
if (keyFile) {project = new ci.Project({appid: appId,type: 'miniProgram',projectPath: './dist',privateKeyPath: `./key/private.${appId}.key`,});
}
async function npmBuild() {await ci.packNpmManually({packageJsonPath: './package.json',miniprogramNpmDistDir: './src/',});
}
const envLabels = {'production': '正式环境','development': '测试环境','pre': '预发环境',
};// 机器人代号,有效范围[1-30]
const robotMap = {'development': 1,'production': 2,'pre': 3,
}async function mpUpload() {log('mpUpload appid',appId);if (!appId) {console.log('\x1b[35m%s\x1b[0m', `
════════════════════════════════════════════════════════════════════════
⚡【${envLabels[env]}】小程序打包失败,请先执行 export APPID=你的appid 命令,设置appid
════════════════════════════════════════════════════════════════════════`);return false;}projectConfig['appid'] = appId;log('projectConfig appid',projectConfig.appid);const uploadResult = await ci.upload({project,version: pkg.version,desc: `【${envLabels[env]}】${pkg.description}`,setting: {es7: true,es6: true,minifyJS: true,minifyWXML: true,minifyWXSS: true,minify: true,autoPrefixWXSS: true,},robot: robotMap[env],onProgressUpdate: console.log,});console.log('[uploadResult:]', uploadResult);console.log('\x1b[35m%s\x1b[0m', `
════════════════════════════════════════════════════════════════════════
🚀【${envLabels[env]}】小程序打包已完成,可以去发布了https://mp.weixin.qq.com/
════════════════════════════════════════════════════════════════════════`);
}async function preview() {const previewResult = await ci.preview({project,desc: `【${envLabels[env]}】${pkg.description}`, // 此备注将显示在“小程序助手”开发版列表中qrcodeFormat: 'image',qrcodeOutputDest: './preview.jpg',setting: {es7: true,es6: true,minifyJS: true,minifyWXML: true,minifyWXSS: true,minify: true,autoPrefixWXSS: true,},robot: robotMap[env],onProgressUpdate: console.log,// pagePath: 'pages/index/index', // 预览页面// searchQuery: 'a=1&b=2',  // 预览参数 [注意!]这里的`&`字符在命令行中应写成转义字符`\&`});console.log('[previewResult:]', previewResult);console.log('\x1b[35m%s\x1b[0m', `
════════════════════════════════════════════════════════════════════════
🚀【${envLabels[env] || '测试环境'}】小程序预览已完成,可以去小程序助手中查看了
════════════════════════════════════════════════════════════════════════`);
}
exports.watch = watchFiles;
exports.preview = preview;
// ci 自动构建npm
exports.npm = npmBuild;
exports.upload = mpUpload;exports.default = gulp.series(styles, scripts, copy, watchFiles);exports.build = gulp.series(clean, styles, scripts, copy);

再写个python 处理批量的问题

import subprocess
# 指定的目录
directory = '/Users/jijunjian/wealth'commandList = ['npm run deploy:pro -- --appId=wx7f4984150494f817','npm run deploy:pro -- --appId=wx1e8e9dc2e337b821','npm run deploy:pro -- --appId=wx7493b6cfe63e360e','npm run deploy:pro -- --appId=wx7c7c8a0e9e242133','npm run deploy:pro -- --appId=wxfc6898107cb428a7','npm run deploy:pro -- --appId=wx4fc01c82126749bc','npm run deploy:pro -- --appId=wx842b1d5e54ddff47'
]
index = 0;
# 要执行的shell命令
for i in commandList:# 使用subprocess.run来执行命令,cwd参数指定工作目录result = subprocess.run(i, cwd=directory, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)# 打印命令的输出和错误信息print(result.stdout)  # 命令的输出print(result.stderr)  # 命令的错误信息index += 1
print("一共:%s" % index)

虽然没有完全解决重复的问题,10万日活还在远远的招手,小程序还得继续注册,但这事儿还在心里萌芽着。

日活上来了,重复还在继续


为了解决若干小程序界面一样的问题,可能会被下线,又风风火火的做了多个模板。维护变得愈发难了,难是发一次版本都会成为一次浩大的工程。如果更新20个程序,必须要登陆20次mp后台,选账号都会成为一个难点,见图可知。

在这里插入图片描述

苦不堪言时,终于想起了之前参加微信生态线下交流时,一个同学提到的服务商模式,之前觉得接入成本也挺高,就放下了,现在已是非常时期,抽出一个周末开始了摸索。

拨云见日,终觅良方


注册开放平台,创建第三方平台应用,绑定小程序,上传草稿箱,设置普通模板,提交审核,上线… 2天时间终于摸索得7788了。几乎所有操作都可以通过接口完成,比如设置域名,设置隐私,提交审核,甚至上线…有了接口就可以配置自动化了,直接使用apifox的编排能力,60分钟搞定配置。这一套下来,直接节省了90%的工作。

在这里插入图片描述

管理100小程序真不难了

有了上面的一套配置,配合模板库,对应不同的版本。发布变得非常轻松,根本不用登陆MP后台,轻松管理100个小程序,甚至可以说多多益善。这个过程大概经历了一个月,回头来看,也许正是困难让我们更强大。恰巧最近在读老舍先生的《骆驼祥子》,连在地府都可以当个好鬼儿的祥子,却没能够从苦难中强大起来,着实可惜了。最后来一张效果图,接口自动化提交审核,发布;统一的平台管理所有的小程序,管理100个小程序就是这么简单。有兴趣的朋友可以体验下
官方不让放二维码,只能放一个链接了。

相关文章:

管理100个小程序-很难吗

20公里的徒步-真难 群里的伙伴发起了一场天目山20公里徒步的活动,想着14公里都轻松拿捏了,思考了30秒后,就借着春风带着老婆孩子就出发了。一开始溪流清澈见底,小桥流水没有人家;青山郁郁葱葱,枯藤老树没有…...

算法恢复训练-Part01-数组

注:参考的某算法训练营的计划 核心注意点 在 Golang(和大多数主流语言,如 C/C)中,二维数组按行访问的效率更高。因为它符合 Go 的内存连续存储结构,能提高 CPU Cache 命中率,减少内存跳跃带来…...

软件黑盒与白盒测试详解

黑盒测试与白盒测试的核心对比 一、定义与核心目标 黑盒测试 定义:将程序视为“黑盒”,仅通过输入和输出验证功能是否符合需求规格,不关注内部代码逻辑。目标:确保功能完整性、输入输出正确性及用户体验,例如验证购物车…...

本文通俗简介-优雅草星云物联网AI智控系统软件介绍-星云智控是做什么用途的??-优雅草卓伊凡

本文通俗简介-优雅草星云物联网AI智控系统软件介绍-星云智控是做什么用途的??-优雅草卓伊凡 星云智控:物联网设备实时监控的革新力量 一、引言 在科技飞速发展的当下,物联网技术的广泛应用使得各类设备的实时监控与管理变得愈发…...

达梦统计信息收集情况检查

查询达梦某个对象上是否有统计信息 select id,T_TOTAL,N_SMAPLE,N_DISTINCT,N_NULL,BLEVEL,N_LEAF_PAGES,N_LEAF_USED_PAGES,LAST_GATHERED from sysstats where id IN (select id from sysobjects where upper(name)upper(&objname));可能有系统对象,可以增加…...

【MQ篇】RabbitMQ之发布订阅模式!

目录 引言一、 回顾:简单模式与工作队列模式的局限 😔二、 发布/订阅模式详解:消息的“广播站” 📻三、 RabbitMQ 中的交换机类型:不同的“广播方式” 📻四、 Java (Spring Boot) 代码实战Fanout 模式的完整…...

如何批量为多张图片(JPG、PNG、BMP、WEBP 等格式)添加自定义水印保护

「鹰迅批量处理工具箱」提供了强大的批量水印添加功能,支持常见的图片格式,如 JPG、JPEG、PNG、BMP、GIF、WEBP 等。用户不仅可以选择添加文字水印或图片水印,还能自定义设置水印的样式、位置和透明度等参数,操作简单而高效&#…...

LeetCode每日一题4.23

题目 问题分析 计算每个数字的数位和:对于从 1 到 n 的每个整数,计算其十进制表示下的数位和。 分组:将数位和相等的数字放到同一个组中。 统计每个组的数字数目:统计每个组中有多少个数字。 找到并列最多的组:返回数…...

Kafka简介

简介 基本概念 Kafka是分布式发布 - 订阅消息系统,最初由LinkedIn开发,后成为Apache项目一部分,可类比为放鸡蛋的篮子,生产者产蛋放入,消费者从中取蛋 。 消息系统 优势:分布式系统,易扩展&am…...

大数据利器:Kafka与Spark的深度探索

在大数据领域,Kafka和Spark都是极为重要的工具。今天就来和大家分享一下我在学习和使用它们过程中的心得。 Kafka作为分布式消息系统,优势显著。它吞吐量高、延迟低,能每秒处理几十万条消息,延迟最低仅几毫秒;可扩展性…...

使用logrotate实现日志轮转

logrotate 是一个强大的 Linux 工具,用于自动化管理日志文件的轮转、压缩、删除和归档。它能有效防止日志文件无限增长,节省磁盘空间,同时保持日志的可追溯性。以下是详细讲解 logrotate 的用法,涵盖安装、配置、测试、自动化、常…...

第52讲:农业AI + 区块链——迈向可信、智能、透明的未来农业

目录 一、为什么农业需要“AI+区块链”? 二、核心应用场景解读 1. 农产品溯源系统 2. 农业信贷与保险精准评估 3. 农业碳足迹追踪与碳汇交易 三、案例实战分享:智能溯源 + 区块链合约 四、面临挑战与展望 五、总结 在数字农业时代,“AI” 和 “区块链” 是两股不容忽…...

视频智能分析平台EasyCVR无线监控:全流程安装指南与功能应用解析

在当今数字化安防时代,无线监控系统的安装与调试对于保障各类场所的安全至关重要。本文将结合EasyCVR视频监控的强大功能,为您详细阐述监控系统安装过程中的关键步骤和注意事项,帮助您打造一个高效、可靠的监控解决方案。 一、调试物资准备与…...

Spring Cloud Eureka 与 Nacos 深度解析:从架构到对比

一、Eureka:经典微服务注册中心 (一)核心定位与特性 Spring Cloud Eureka 是 Netflix 开源的服务注册与发现组件,在微服务架构中扮演 "大脑" 角色,负责服务的注册、发现与状态管理。其核心优势在于通过心跳…...

深入详解Java中的@PostConstruct注解:实现简洁而高效初始化操作

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C、C#等开发语言,熟悉Java常用开…...

【Unity笔记】Unity 编辑器扩展:一键查找场景中组件引用关系(含完整源码)(组件引用查找工具实现笔记)

摘要: 本文介绍了如何在 Unity 编辑器中开发一款实用的编辑器扩展工具 —— ComponentReferenceFinder,用于查找场景中对某个自定义组件的引用关系。该工具特别适用于大型项目、多人协作或引入外部插件后,快速定位组件间的耦合关系。 本文从需…...

实体店的小程序转型之路:拥抱新零售的密码-中小企实战运营和营销工作室博客

实体店的小程序转型之路:拥抱新零售的密码-中小企实战运营和营销工作室博客 在当今数字化浪潮的冲击下,实体店面临着前所未有的挑战,但小程序的出现为实体店转型新零售带来了新的曙光。先来看一组惊人的数据,据相关统计&#xff…...

Mysql安装与备份配置分析

若之前存有msqyl的数据缓存,建议用以下命令将数据文件删除干净 mysql-server:主程序 mysql:客户端工具 mysql-devel:开发库 mysql-libs:共享库文件 /var/lib/mysql:数据目录 /etc/my.cnf : 主配置文件 …...

Android APP 爬虫操作

工具 夜神模拟器、charles、mitm 等 mitm的使用参考:Mitmproxy对Android进行抓包(真机)_mitmproxy 安卓-CSDN博客 charles的使用参考:【全网最详细】手把手教学Charles抓包工具详细自学教程,完整版安装教程,详细介绍…...

与Ubuntu相关命令

windows将文件传输到Ubuntu 传输文件夹或文件 scp -r 本地文件夹或文件 ubuntu用户名IP地址:要传输到的文件夹路径 例如: scp -r .\04.py gao192.168.248.129:/home/gao 如果传输文件也可以去掉-r 安装软件 sudo apt-get update 更新软件包列表 sudo apt insta…...

Unity常用内置变换矩阵

Unity引擎提供了一系列内置的变换矩阵,这些矩阵在着色器中用于处理物体、摄像机和光照的坐标变换,是游戏开发中不可或缺的工具。它们帮助开发者在顶点着色器和片段着色器中实现坐标转换、光照计算等功能。 主要变换矩阵类型 模型矩阵 (Model Matrix) /…...

算法题-图论

图的表示 207.课程表 127.单词接龙 图的遍历 DFS 递归。。。 200.岛屿数量 239.矩阵中的最长递增路径 BFS 102.二叉树的层序遍历 看到最短,首先想到的是BFS 542.01矩阵 207.课程表 127.单词接龙 拓扑排序 对于一个有向无环图G进行拓扑排序,是将G中…...

Java 8(Ubuntu 18.04.6 LTS)安装笔记

一、前言 本文与【MySQL 8(Ubuntu 18.04.6 LTS)安装笔记】同批次:先搭建数据库,再安装JVM,后面肯定就是部署Web应用了——典型的单机部署,真可谓“麻雀虽小五脏俱全”。 二、准备 (1&#xff…...

unity编辑器的json验证及格式化

UNITY编辑器的json格式化和验证工具资源-CSDN文库https://download.csdn.net/download/qq_38655924/90676188?spm1001.2014.3001.5501 反复去别的网站验证json太麻烦了 用这个工具能方便点 # Unity JSON工具 这是一个Unity编辑器扩展,用于验证、格式化和压缩JSO…...

C语言中小写字母转大写字母

一、题目引入 这一题运行结果是什么? 二、代码分析 在这个代码中 首先 -> 定义了一个字符数组空间内存是80 里面存储的是字符串123abcdEFG*& 接着 -> 定义了一个整型变量j 后面的循环会用到 然后 -> 使用了<stdio.h>中的库函数puts(ch)原样打印…...

深度学习--卷积神经网络调整学习率

文章目录 前言一、学习率1、什么学习率2、什么是调整学习率3、目的 二、调整方法1、有序调整1&#xff09;有序调整StepLR(等间隔调整学习率)2&#xff09;有序调整MultiStepLR(多间隔调整学习率)3&#xff09;有序调整ExponentialLR (指数衰减调整学习率)4&#xff09;有序调整…...

桥接模式:分离抽象与实现的独立进化

桥接模式&#xff1a;分离抽象与实现的独立进化 一、模式核心&#xff1a;解耦抽象与实现的多层变化 在软件设计中&#xff0c;当抽象&#xff08;如 “手机品牌”&#xff09;和实现&#xff08;如 “操作系统”&#xff09;都可能独立变化时&#xff0c;使用多层继承会导致…...

配置kafka与spark连接

一、配置kafka 首先进到software目录当中&#xff0c;如下图所示&#xff1a; 安装包上传/解压/重命名/解压过后的目录如下图所示&#xff1a; 修改配置&#xff1a; cd config vi server.properties 全部修改语句如下所示&#xff08;以node01为样例&#xff09;&#xff1…...

WebXR教学 05 项目3 太空飞船小游戏

准备工作 自动创建 package.json 文件 npm init -y 安装Three.js 3D 图形库&#xff0c;安装现代前端构建工具Vite&#xff08;用于开发/打包&#xff09; npm install three vite 启动 Vite 开发服务器&#xff08;推荐&#xff09;&#xff08;正式项目开发&#xff09; …...

【leetcode】3524 求出数组的X值1

题目链接 题目描述 给你一个正整数数组 nums 和一个正整数 k。 你可以对数组执行一次操作&#xff1a;移除不重叠的前缀和后缀&#xff08;可以为空&#xff09;&#xff0c;留下一个连续非空子数组。 对于每一种留下的子数组&#xff0c;计算&#xff1a; (该子数组的乘积…...

配电室安全用电漏电保护装置的安全用电措施

配电室作为电力分配与控制的关键场所&#xff0c;其安全用电装置的重要性不言而喻。 防触电、防漏电、防火灾、安全防护、保障生命财产&#xff1b; 当用电设备发生短路、过载或漏电等异常时能迅速切断电源&#xff0c;精准定位问题。及时报警&#xff0c;防止触电 在配电室中…...

数据库-基本概述 和 SQL 语言

标题目录 基本概述DB和DBMS关系数据库库与表的概念表库 数据库在项目中的角色如何操作数据库 SQL 语言SQL 分类DDL 语言数据库操作创建数据库查看数据库删除数据库切换数据库 表的操作创建表查看表修改表名删除表修改表结构 DML 语言插入数据修改数据删除数据 基本概述 DB和DB…...

C语言中的递归1.0

一、递归函数概念引入 简单来说就是自己调用自己 递归函数满足的两个条件: 1.每次调用函数本身,必须一次又一次接近最终结果 2.必须有停止条件 二、代码展示 用递归求1到4的和 代码如下 三、代码分析 首先进入main主函数入口 int sum getsum(4); 就这个具体题目来看 我…...

解锁webpack:对html、css、js及图片资源的抽离打包处理

面试被问到webpack&#xff0c;可别只知道说 HtmlWebpackPlugin 了哇。 前期准备 安装依赖 npm init -y npm install webpack webpack-cli --save-dev配置打包命令 // package.json {"scripts": {// ... 其他配置信息"build": "webpack --mode pr…...

[特殊字符] 大模型对话风格微调项目实战——模型篇 [特殊字符]✨

&#x1f4dc; 目录 &#x1f3af; 背景介绍 &#x1f50d; 这篇文章的任务 &#x1f916; 模型选型 &#x1f4ca; 模型评测 ⚙️ 模型训练 &#x1f504; 模型转换 &#x1f9ea; 模型训练效果评估 &#x1f389; 总结 &#x1f3af; 背景介绍 本文是《大模型对话风…...

lerobot[act解析]

ACT是具身智能模仿学习中重要的一个算法&#xff0c;本文会先从这个算法是是什么&#xff0c;这个算法如何工作的&#xff0c;到这个算法为什么有效&#xff0c;也就是what->how->why的这么一个顺序来进行解析 ACT 是什么&#xff1f;&#xff08;What&#xff09; 核心…...

使用Python创建带边框样式的Word表格

引言 在生成Word文档时&#xff0c;表格的边框样式是提升专业度的重要细节。本文将通过一个实例&#xff0c;展示如何使用python-docx库为表格添加上下边框加粗和内部边框隐藏的复杂样式。代码将实现以下效果&#xff1a; 表格位于页面底部表格首行和末行的上下边框加粗隐藏内…...

GPLT-2025年第十届团体程序设计天梯赛总决赛题解(共计266分)

今天偶然发现天梯赛的代码还保存着&#xff0c;于是决定写下这篇题解&#xff0c;也算是复盘一下了 L1本来是打算写的稳妥点&#xff0c;最后在L1-6又想省时间&#xff0c;又忘记了insert&#xff0c;replace这些方法怎么用&#xff0c;也不想花时间写一个文件测试&#xff0c…...

基于SpringBoot的课程管理系统

前言 今天给大家分享一个基于SpringBoot的课程管理系统。 1 系统介绍 课程管理系统是一种专门为学校设计的软件系统&#xff0c;旨在帮助学校高效地管理和组织各类课程信息。 该系统通常包括学生、教师和管理员三大角色。 他们可以通过系统进行选课、查看课程表、考试、进…...

新品发布 | 6 秒全谱成像,VIX-N320 内置推扫式高光谱相机重磅发布

深圳市中达瑞和科技有限公司正式发布全新一代VIX-N320内置推扫式可见光近红外高光谱相机&#xff0c;一款集高速成像、高精度光谱分析与便携性于一体的革命性产品。以突破性技术重新定义光谱成像效率与精度&#xff0c;开启智能感知新纪元。作为国内唯一同时掌握凝采式、推扫式…...

手写深拷贝函数

在 JavaScript 中&#xff0c;深拷贝是指创建一个对象或数组的完全独立副本&#xff0c;包括其嵌套的对象或数组。这意味着修改副本不会影响原始对象。 以下是手写一个通用的深拷贝函数的实现&#xff1a; 深拷贝函数实现 function deepClone(target, map new WeakMap()) {//…...

智能电网第3期 | 配电房巡检机器人通信升级方案

随着电力系统智能化发展&#xff0c;配电房巡检机器人是保障电力设备安全稳定运行的重要工具&#xff0c;其通信稳定性关乎巡检效率与质量。配电房巡检智能化升级面临着多项挑战&#xff1a; 电磁干扰大&#xff1a;配电房电气设备密集&#xff0c;电磁干扰强&#xff0c;易造成…...

阿里云 AI 搜索开放平台:RAG智能化工作流助力 AI 搜索

——已获知乎作者【小小将】授权转载 最近AI圈的变化可谓是日新月异&#xff0c;随着大模型的技术突飞猛进&#xff0c;大模型的能力日益增强。这些都驱动着我们的搜索技术快速演进到了下一代&#xff0c;也就是 AI 搜索的技术。大模型的快速发展不仅重塑了搜索技术的基础&…...

同z科技面经

同z科技-2025-4-23 1.自我介绍 个人信息 校园经历 实习经历 项目经历 个人技能掌握 目前学习技术 2.封装缓存工具类怎么封装的 先介绍使用缓存的问题 解决的逻辑 封装的逻辑 应用 缓存穿透&#xff1a; 缓存雪崩&#xff1a; 缓存击穿&#xff1a; https://www…...

制作一款打飞机游戏19:碰撞检测

在这一章中&#xff0c;我们致力于解决碰撞检测问题&#xff0c;但它并不如我们所愿工作。 碰撞检测问题 今天我想解决的是碰撞检测问题&#xff0c;这个令人畏惧的碰撞检测。我理解&#xff0c;这里有很多复杂的if语句&#xff0c;但我们可以做到。 不过&#xff0c;在此之…...

python后端程序部署到服务器 Ubuntu并配合 Vue 前端页面运行

将 PyCharm 研发的 Web 后端系统程序部署到 Ubuntu 24.04 服务器并配合 Vue 前端页面运行&#xff0c;可按以下步骤操作&#xff1a; 1. 服务器环境准备 在开始部署之前&#xff0c;需要在 Ubuntu 24.04 服务器上安装必要的软件。 # 更新系统软件包 sudo apt update sudo ap…...

9N60-ASEMI无人机专用功率器件9N60

编辑&#xff1a;LL 9N60-ASEMI无人机专用功率器件9N60 型号&#xff1a;9N60 品牌&#xff1a;ASEMI 封装&#xff1a;TO-220F 最大漏源电流&#xff1a;9A 漏源击穿电压&#xff1a;600V 批号&#xff1a;最新 RDS&#xff08;ON&#xff09;Max&#xff1a;1.00Ω …...

Java单例模式详解:实现线程安全的全局访问点

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 一、什么是单例模式&#xff1f; 单例模式&#xff08;Singleton Pattern&#xff09;是一种创建型设计模式&#xff0c;它保证一个类仅有一个实例&#xff…...

【无人机】无人机光流模块Optical Flow设置(三),光流测距一体传感器的配置。凌启科技的光流测距一体模块的测试。

目录 1、光流测距一体模块的配置&#xff0c;详细步骤 1.1、连接 1.2、上位机使用 1.3、切换为PX4协议 2、适配PX4飞控&#xff0c;QGC上参数配置 2.0、安装连接 2.1、串口配置&#xff1a; 2.2、启用光流辅助功能 2.3、启用测距辅助功能 2.4、高度参考设置 2.5、重…...

电路中的DGND、GROUND、GROUND_REF的区别,VREF、VCC、VDD、VEE和VSS的区别?

目录 1 DGND、GROUND、GROUND_REF的区别 1.1 DGND&#xff08;Digital Ground&#xff09; 1.2 GROUND&#xff08;Ground&#xff09; 1.3 GROUND_REF&#xff08;Ground Reference&#xff09; 1.4 区别 2 VREF、VCC、VDD、VEE和VSS的区别 2.1 VREF&#xff08;Refere…...