部署公网可访问的 AList

AList 支持多个存储提供商,包括本地存储、阿里云盘、OneDrive、Google Drive 等,且易于拓展。支持以 WebDAV 协议访问。 本文介绍如何使用免费资源部署一个可以在公开网络使用的 AList。 1. 注册 TiDB 云服务账号 地址:https://tidbcloud.com/signup 官方文档:https://docs.pingcap.com/zh/tidb/stable/dev-guide-build-cluster-in-cloud(只需要创建好 alist 数据库,拿到配置信息即可) 2. 创建 alist 数据库 如图,在 Chat2Query 中粘贴代码 CREATE DATABASE alist,然后点击右上角的 Run 执行。 复制数据库地址、用户名和密码(注意保存): 点击目标集群名称,进入集群概览页面,然后点击右上角的 Connect 按钮,弹出连接对话框。 在对话框中,选择你需要的连接方式和操作系统并保存对应的连接字符串。下面连接到集群的步骤将以 MySQL 客户端为例。 点击 Generate Password 生成随机密码。生成的密码不会再次显示,因此请将密码妥善保存。如果没有设置 root 密码,你将无法连接到集群。 3. 注册 Koyeb 容器部署服务账号 使用 GitHub 注册:https://app.koyeb.com/auth/signup 使用邮箱注册:https://app.koyeb.com/auth/signup?method=email 4. 配置 Koyeb alist 项目 创建 Web Service 项目 使用 Docker 镜像部署: ...

2024 年 三月 21 日 · 1 分钟 · 142 字 · K.T

拥抱孤独的自由:个人感情观与未来生活展望

想写此文很久了,迟迟没有动笔的原因,虚伪一点的说法是人在不断成长,阅历逐渐丰富,思想也在不断发生变化,过早发布不足以表达完整成熟的内心想法,真实的原因就是懒惰、拖延。 现在的我想保持单身,不代表以后还是这样想,更不是想改变他人的想法。 我是一个做足准备才会行动的人,可婚恋这件事,我可能一辈子也准备不好。 思想性格 一个人的思想就像可以自我净化调和的染缸,不断吸收各种染料,混成专属这人的一种颜色。我是个畏手畏脚、谨慎敏感的人,过度关注自己,想得太多,做得太少,朱颜翠发而多愁善感,锦瑟年华却老气横秋。 以我小时候的观念来看,结婚就是和一人相依相伴,白头到老,共度余生。后来逐渐意识到永远相爱这件事如同大海捞针,面对一无所知的未来,承诺永远爱一个人好像有些不可理喻。心动是出于动物本能的,是短暂的,不能指望对方永远爱自己,也无法承诺一生只爱一人。相爱时在一起,不爱了自然就该分开。两个“合适”的人就是在新鲜感消散的时候出于双方需求和责任感依然坚定地选择彼此。我的人生观念遭到自我意识的剧烈冲击,二十多年建立的认知开始崩坏瓦解,然后重塑,再不断安慰自己去接受。 伟大的人类事业和未知的浩瀚宇宙使我激情澎湃,文学、艺术、音乐、影视、人工智能、机械飞升……让我对未来的每一天保持期待。精神世界丰富繁华,现实生活却了无生趣。我深谙千里之行始于足下之理,却又缺乏充实现实生活的欲望,粗茶淡饭,得过且过。 我需要独立的生活和思考空间,我喜欢独处,更倾向于按照自己的节奏自在闲适地生活。如果跟喜欢的人在一起,我会害怕暴露自己的缺点,担心自己各方面做得不够好。对我来说,分寸感比亲密无间更重要,所以我更需要的不是爱人,而是挚友。爱情如泉,奔涌淋漓,干涸沉寂;友情如池,点滴存取,江湖救急。对喜欢的人会有占有欲和控制欲,而朋友的相处模式就自在很多。我希望互相欣赏的人在相处时云淡风轻而延绵不尽,不是短暂的激情过后,又相忘于江湖。 再者,我不是一个乐观的人,不太能共情别人的幸福喜悦,特别能共情别人的痛苦悲伤,不在一起的时时刻刻我都会对所爱之人担忧,这会使我非常煎熬。婚姻不仅仅是身边多一个人,还要共享一份人间疾苦。我不喜欢被打扰,也不在他人身上寄托希望。人生这么多苦难,承担一个人的就够辛苦了,不如自私一点,放空自己,让生活过得尽量简单,才不会远愁近虑,杞人忧天。 原生家庭 我出生在传统的农村家庭,父母虽然通情达理,对我的教育也还算成功,但其实文化程度并不高,我踩在他们肩上看过太多外面的世界,接受了完全不一样的思想教育。事实上我完全理解他们,在他们的经历见闻和生活背景下,已经做得足够好,而且还在不断进步。我从小和他们在一起生活,可以接受和容忍他们的不足,但如果带来一个完全不在这种环境下成长的人与他们共处,还需要付出很多努力去调和,我没有充足的信心。 现实 婚姻是彩礼嫁妆,生活是柴米油盐,“没有物质的爱情,就是一盘散沙”。我现在还没有让自己和爱的人一起安稳幸福的经济实力,虽然抱有一丝希望,但眼下看来也遥遥无期。喜欢是占有,爱是放手。如果对方可以追求更好的生活,没有理由束缚在自己的身边。我虽然在努力创造更好的生活条件,但也没有必要为了组建一个家庭累死累活。人各有志,尽力而为。 憧憬 随着人们了解世界的途径越来越便捷,见过的美好的人和事越来越多,对实际生活中的人便越来越难心动。“喜欢”不过是一场或急或缓的自我心理暗示,我好像越来越难以实现这样的暗示了。遇不到合适的人就单着,遇到合适的就谈一辈子恋爱。 我不是在找一个合法伴侣,或是一个贤妻良母,一个孝顺儿媳。而是一个知己,一个挚友,一个可以相互理解、相互陪伴、共同抵御未来风险的人。但这并不意味着我们必须从事相同的行业、有着共同的爱好、处于一致的社交圈。我们都应该有独立的人格、独到的见解、独特的品味。只需要在彼此内心有对方专属的位置,尊重欣赏,共同进步。哪怕新鲜感消散,即使遭遇变故,也不离不弃,如亲人般继续去爱,去陪伴,去度过漫长且枯燥的生活。 幸福就是少想自己缺少什么,多想自己拥有什么。享受单身可以比很多人幸福,如果不用谈恋爱、不用结婚生子,完全为自己而活,人生还是很美好的。生活不止是未来,也是过去和现在,是每时每刻。看透一些事情以后,虽然还不能做到六根清净,但是好像真的没什么物欲了。想去做自己认为有意义的、让世间更美好的事。想云游四海,探索世界,见证奇迹,看看住在不同地方的人;想整理思绪,修身养性,把酒言欢,回归简单朴实的生活。 可能面临的疑问 “一个人不害怕孤独吗?” 孤独源自内心,和周围有多少人没有关系,如果选择一个不合适的人,同床异梦,才是真正的孤独。如果两个人相爱一生,对方却不得不先你离世,反而要面临跌入谷底般的孤独。不恋不婚,平淡如水,虽然要牺牲可能的快乐,却也能躲避潜在的痛苦。孤独是人类情感的终极状态,坦然接受孤独吧。 “生病时怎么办?不生孩子自己以后老了怎么办?” 当人类不再需要考虑生育,恋爱才真正迈向自由。我时常庆幸自己是个男儿身,不用面临怀胎和分娩之苦,自然也不希望所爱之人遭受这样的折磨。 “养儿防老”的观念在社会经济不发达、生产力水平低下的时候很实际,但在当今和未来社会不一定。如果没有足够的经济实力,一年里和父母相处不了几天,又要考虑孩子的教育和就业,老人真正被关心照顾的时候已是迟暮。这个世界缺了谁依然会转,我的基因也没有一定要延续下去的必要。 如果不要孩子,可以宽裕地生活,关照家人,更多地投资在身心健康和享乐上。自己老的时候科技发展成什么样不一定,但大概率医疗和养老保障水平会提高,和如今社会的儿女照料不好比较,应该也不至于特别糟。如果世界真的会变糟,又何必带孩子出来受苦呢?这个世界还不够好,有多少人因为苦难常希望没来过这个世界,我们实现不了,不如帮孩子实现了。 “你想太多了太悲观了,这个世界上肯定有欣赏你理解你支持你、愿意跟你共度一生的人。” 我当然希望如此,毕竟,哪有人喜欢孤独,只是害怕失望。

2024 年 一月 7 日 · 1 分钟 · 26 字 · K.T

Java 参数校验:只能从指定的值中取其一

有时候参数校验的需求是只允许从指定的几个数据中选用一个,否则抛出异常。 如果是 String 类型的可以用 @Pattern 注解写正则表达式,例如: @Pattern(regexp = "^(CENTURIES|YEARS|MONTHS|DAYS)$", message = "持续时间单位错误") private String durationUnit; 数字类型可以通过自定义注解 + 校验规则。 OneOf.java @Target({FIELD, PARAMETER}) @Retention(RUNTIME) @Constraint(validatedBy = OneOfValidator.class) @Documented @Repeatable(List.class) public @interface OneOf { String message() default "Invalid parameter"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; // 用 double 接收可用值,兼容整数和小数 double[] value(); @Target({FIELD, PARAMETER}) @Retention(RUNTIME) @Documented @interface List { OneOf[] value(); } } OneOfValidator.java ...

2022 年 十一月 17 日 · 1 分钟 · 115 字 · K.T

Nacos 元数据增加启动日期、版本号和 PID

Spring Cloud 项目下 Nacos 默认的元数据只有 preserved.register.source=SPRING_CLOUD 这一项,可以通过增加配置项手动添加想要的数据,方便追溯一些启动相关的信息。 比如:启动日期、文件版本号(因为打成 jar 包时 maven 插件会将文件名自动命名为 xxx-{version}.jar,所以这里是获取的 jar 文件路径)和 PID。 代码如下: @Configuration public class NacosConfig { /** * Nacos 元数据配置 * * @return */ @Bean @ConditionalOnNacosDiscoveryEnabled public NacosDiscoveryProperties nacosDiscoveryProperties() { NacosDiscoveryProperties nacosDiscoveryProperties = new NacosDiscoveryProperties(); Map<String, String> metadata = nacosDiscoveryProperties.getMetadata(); // 启动时间 metadata.put("boot.startup.time", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(System.currentTimeMillis())); // 文件路径 // String.valueOf 代替 toString 避免空指针 metadata.put("boot.path", String.valueOf(new ApplicationHome(this.getClass()).getSource())); // PID metadata.put("boot.pid", new ApplicationPid().toString()); return nacosDiscoveryProperties; } } Nacos 控制台的实例可以看到类似如下的元数据: ...

2022 年 九月 19 日 · 1 分钟 · 78 字 · K.T

Spring Boot 带附件的邮件发送配置

虽然 Spring Boot 提供了邮件相关的功能,但在缺少部分配置的情况下或多或少会有一些问题,如附件的文件名乱码、文件格式等问题。本文提供统一解决这类问题的配置。 Maven 依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> 1. 配置文件 以 QQ 邮箱为例: spring: mail: host: smtp.qq.com port: 465 username: [email protected] # 发送邮箱账户 password: exmaplepassword # 申请的授权码 properties: mail: smtp: socketFactory: port: 465 class: javax.net.ssl.SSLSocketFactory ssl: enable: true starttls: enable: true required: true 2. 封装统一工具类 /** * @author Kytrun * @version 1.0 * @date 2022/07/25 16:14 */ @RequiredArgsConstructor @Component public class MailUtil { private final JavaMailSender mailSender; @Value("${spring.mail.username}") private String mailFrom; // 长文件名不截断 static { System.getProperties().setProperty("mail.mime.splitlongparameters", "false"); } /** * 发送纯文字邮件 * * @param to 收件地址 * @param subject 主题 * @param text 内容 */ public void send(String to, String subject, String text) { SimpleMailMessage mailMessage = new SimpleMailMessage(); mailMessage.setTo(to); mailMessage.setSubject(subject); mailMessage.setSentDate(new Date()); mailMessage.setText(text); mailMessage.setFrom(mailFrom); mailSender.send(mailMessage); } /** * 发送带多个附件的邮件 * * @param to 收件地址 * @param subject 主题 * @param text 文字内容 * @param fileList 文件列表 * @throws MessagingException * @throws UnsupportedEncodingException */ public void send(String to, String subject, String text, List<MultipartFile> fileList) throws MessagingException, UnsupportedEncodingException { MimeMessage mimeMessage = mailSender.createMimeMessage(); MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true); messageHelper.setFrom(mailFrom); messageHelper.setTo(to); messageHelper.setSubject(subject); messageHelper.setText(text); if (fileList != null && !fileList.isEmpty()) { for (MultipartFile file : fileList) { String fileName = file.getOriginalFilename() == null ? "文件" : file.getOriginalFilename(); //解决中文附件名的问题 fileName = MimeUtility.encodeText(fileName); messageHelper.addAttachment(fileName, file); } } mailSender.send(mimeMessage); } }

2022 年 七月 25 日 · 1 分钟 · 208 字 · K.T

Spring Cloud Feign 去除全局包装、统一异常处理

2022 年关于 Spring Cloud 服务间调用组件 Feign 配置的总结。 Maven 依赖: <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> 1. 全局响应包装的拆解 一般来说,我们服务接口响应内容都有一层全局的包装,比如: { "code": 0, "message": "成功", "data": { ... } } 在服务间调用时如果在每个 Feign 的接口处定义同样的类比如 Result<XxVO> 再 getData() 不是不行,但是比较繁琐,而且在获取想要的数据前可能需要根据 code、message 判断得到的结果是否正确。通过自定义 decoder 可以比较好地解决前一个问题: // 注入 Jackson 的 ObjectMapper,如果不喜欢 Lombok 可以自行修改 @RequiredArgsConstructor public class UnwrapDecoder implements Decoder { private final ObjectMapper objectMapper; @SneakyThrows @Override public Object decode(Response response, Type type) { Reader reader = response.body().asReader(Charset.defaultCharset()); Result<?> result = objectMapper.readValue(reader, Result.class); // 根据 code 判断操作是否成功 if (ResultCode.isSuccess(result.getCode())) { Object data = result.getData(); JavaType javaType = TypeFactory.defaultInstance().constructType(type); return objectMapper.convertValue(data, javaType); } // 若不成功,抛出业务异常,注意此处的异常会在 DecodeException 中被捕获,后文会处理 throw new BusinessException(result.getCode(), result.getMessage()); } } 使用方式: ...

2022 年 七月 13 日 · 2 分钟 · 266 字 · K.T

这七年

今天是 2022 年 1 月 1 日,在这里回顾一下 2015 年高考到现在的 7 年时光。 1. 备战高考 2015 年,我在四川省绵阳市三台中学准备高考,因为学校的严格管理加自身平时也还算自律,没有什么太多的值得回忆的,好像除了在紧张忙碌的学业之余唯有玩 K 歌软件了,那时常常在周末宿舍空无一人时见缝插针地录几首,然后缩在宿舍走廊的尽头连上仅仅一格信号的 WiFi 上传、听别人的歌、评论互动之类的。 对于我来说高考应该是人生中第二次“千军万马过独木桥”,第一次当然是中考。我从来就没有考虑过复读之类的事情,我认为复读再上大学就相当于少活了一年,以至于后来虽然考的还行但是因为把所有的志愿都填的信息技术、电子之类的且没有勾选任何的调剂而落榜了。好在恰逢重庆理工大学两江国际学院收的人数不够,而这个新开设的学院是中韩合作办学的第一年,只开设“计算机科学与技术”和“电子信息科学与技术”两个专业。我理所当然地填报了,本来收到录取消息的时候还很高兴,但当得知一年 2.8 万的学费的时候把自己关进屋里狠狠哭了一场。可是无论如何,我还是进到了 IT 领域,我认为这是我人生的必然。感谢父母培育之恩。 2. 步入大学 进到大学首先面临的是全英文教学的艰苦岁月了,除了思政和体育课,其他几乎所有基础课程和专业课程都是全英文。上完第一节全英文高数课之后向室友和家长哭诉,然后直接办理退学那位大学同学的形象在我脑海中依然深刻。 一堂口语课七八个人,和外教聊各种与英语本身几乎没什么关系的趣事,我无人能敌的猜谜语技能,课堂上各种小游戏、角色扮演…… 还有和蔼可亲而不失严肃认真的韩国教授、温柔的辅导员姐,每天晚上的托福培训…… 现在回想,那时候的老师、同学和时光还是挺美好的。 我依然没有放弃音乐相关的业余爱好。获得人生中第一台电脑之后,在一个国庆假期凭着激情快速学习音频编辑,然后买录音设备,仍然在课余躲在宿舍录歌,那是我为数不多的娱乐活动,甚至超过了主业。沉浸在音乐世界放飞自我的无数个夜晚,感谢隔壁宿舍同学的不杀之恩。 2016 年 - 2017 年是大二,这一年好像和大一的差别不大,该去往韩国交换或者留学的同学都还在。仅仅是确认了自己不可能出国而逐渐降低自身对英语的要求。录音混音的技能逐渐成熟,开始有了较高质量的翻唱作品,后来也收获过小一两千的粉丝数。还有每次编程大作业的拖延与熬夜,考试前的临时抱佛脚…… 2018 年左右大三这年,厉害的同学去了国外深造,而我自己的专业能力乏善可陈,逐渐开始有了危机感。嗓子也有了一些变化,没有以前那么青涩和稚嫩,也唱不了很多难度一般的歌曲,后来发现唱《叶塞尼亚》这样的低音歌曲好像还不错。日积月累的伏案混音造成了颈椎对我的反抗,时间稍长就会疼痛。在音乐圈子里积累的朋友的帮助下,我实现了发表一首原创歌曲的梦想之后逐渐放下了音乐,暂停吧,该为自己的未来考虑了。 2019 年,大四,和其他学院不太一样,我们仍然有好几门课程,完全没有去企业实习的经历。我拿了驾照,考过了四六级,无一门挂科记录,最后还算体面的毕业了。因为学院人少且地理位置偏僻,来校招的企业单位寥寥无几,所幸的是最后还是去了一所在当时来说还算满意的公司,我和几位同学从重庆来到了离我家更近的地方——成都。 3. 开始就业 在公司环境下技术能力的提升是飞快的,起初我做的是前端,那时因为上司的原因最早接触的是 Ext JS,现在看来这似乎是一个不太明智的选型,没过多久我们就换到了 jQuery + Layui。而且这段时间天天坐一个半小时的公交去很远的地方上班,现在想想仍然心累。持续了几个月之后,终于可以只需要 10 分钟通勤时间正常地到公司上班了。虽然我对前端的理解日益深刻,但我也由前端转为 Java 后端了,还好,这次学的 Spring Cloud。 这一年我逐渐接触到了开源社区,为了解决自己在工作生活中的问题,也开始自己做一些前端相关的作品发布在 GitHub 上。 2020 年 - 2021 年 8 月,这将近两年的时间里凭借和同事的交流以及自己的学习积累,算是后端入门了。公司给自己带来的技术提升不算特别大,可最终我也算十多个后端开发人员当中的头部选手了,偶尔参与架构的调整设计,帮助一些新来的同事等。 从高中以来我一直梦想着能够开发出好用的手机 APP,于是我一直关注着移动端跨平台开发技术,了解 React Native 和 Flutter 的区别,学习 VUE 和 UNI-APP。平时自己做点 demo,不过目前没有成熟的产品上线,但一直思考着该如何做点真正有用的软件。 ...

2022 年 一月 1 日 · 1 分钟 · 91 字 · K.T

Spring Cloud 不停机更新 – shell 脚本

本文简单介绍关于 Spring Cloud 技术栈的对外无感知的优雅停机、更新和重启,仅通过一些微服务组件和 shell 脚本实现,不依赖容器技术。 1. 实现原理 实现对外透明的优雅更新的基本原理就是在原服务没有停机的时候启动一个新的进程,通过负载均衡让访问可以到达两个节点,然后将旧的服务“优雅”地下线,其本质是不接收新的请求,同时将正在处理中的请求完成,然后停机,之后的请求全部路由到新的服务上。 2. 服务架构 实现以上方案主要依靠 Spring Gateway 和 Nacos。 Spring Gateway 聚合内部的服务接口向外暴露,所有服务注册在 Nacos 上,在 Spring Gateway 上配置好 Nacos 使其动态路由到具体的服务而非写死 IP 和端口。 3. 具体细节 首先,优雅下线的配置是最简单的,在 Spring Boot 的配置文件中添加 server: shutdown: graceful (Spring Boot 2.3+ 支持) 然后在停机时用 kill 命令就可以了,配置了优雅下线后会关闭各种连接、释放资源并主动从 Nacos 中注销。需要特别注意的是不能使用 kill -9 强制杀进程。 然后,因为需要能够在同一时间内运行两个服务,所以我们需要给它们指定不同的端口,一种较为简单的方式是在配置文件中将 server.port 配置为 0,这样启动时就会在本机没有占用的端口中随机使用一个,但缺点是无法指定端口的范围,因而我使用的是另一种方式,即在 shell 脚本中寻找一个端口然后在 jar 包的启动参数中指定。 shell 编写的大体思路是: 找到一个在指定范围内没被占用的端口,开启新的服务。 找到旧版本的进程然后 kill 关闭。 按道理说这样就行了,但是我在实际测试中发现在旧服务关闭的短暂时间内会有 Gateway 仍然路由到旧服务然后报错的情况,当前的解决方案是在关闭服务前先调用 Nacos 的 API 将旧实例从中注销,过一段时间后再杀掉进程,还需要一段时间考察。 ...

2021 年 十二月 28 日 · 2 分钟 · 356 字 · K.T

使用 preload 资源预加载

如果有前后关联的异步 XHR 请求通常会在回调函数中按顺序先后加载,但这样会比较耗时,所以我们有 Promise.all() 来并行请求,最后再处理。 在编写小型前端项目尽可能考虑兼容且不依赖第三方库时,可以使用在 html 的 <head> 中添加 <link> 通过 rel="preload" 进行内容预加载。 <link> 元素的 rel 属性的属性值 preload 能够让你在你的 HTML 页面中 <head>元素内部书写一些声明式的资源获取请求,可以指明哪些资源是在页面加载完成后即刻需要的。对于这种即刻需要的资源,你可能希望在页面加载的生命周期的早期阶段就开始获取,在浏览器的主渲染机制介入前就进行预加载。这一机制使得资源可以更早的得到加载并可用,且更不易阻塞页面的初步渲染,进而提升性能。 –引用自 MDN 简单来说,就是添加这种特定的 head 后我们就可以在文档加载后就提前请求一部分内容,留待之后的网络请求直接使用,不需要额外的处理。 串行请求: 并行请求: 为了动态的添加 “preload”,还可以通过 js 代码实时写入到 DOM 中,以下是我封装的函数。 function preload(url) { var preloadLink = document.createElement('link') preloadLink.href = url preloadLink.rel = 'preload' preloadLink.as = 'fetch' preloadLink.crossOrigin = 'anonymous' document.head.appendChild(preloadLink) }

2020 年 九月 19 日 · 1 分钟 · 57 字 · K.T

Spring Boot 打包为 exe 安装文件

在工作中可能会遇到单机使用的 Java Web 项目。从可移植性、可扩展性、学习成本等各方面来看,使用 Spring Boot 搭建都是一个不错的选择,而且如果后期调整为云部署也是非常容易。 虽然 Spring Boot 天然支持打成 jar 包,但是对于用户来说,启动方式还是不够“优雅”。如果封装为一个独立的安装包,有快捷方式,双击运行,那么体验就更接近 APP 了。 在调研了多种方式后,使用以下的方案是我认为还算 OK 的一种,遂记录下来。 创建一个文件夹,放入 jar 包和 jre 文件夹; 这里有两种方式,我是直接将 jre 一起打包,也可以独立安装 Java。 编写一个 bat 批处理文件,内容如下: @echo off start jre1.8.0_251\bin\java.exe -jar swagx-0.0.1-SNAPSHOT.jar explorer http://localhost:8080 其中 jre1.8.0_251\bin\java.exe 为 Java 的路径,swagx-0.0.1-SNAPSHOT.jar 为 jar 的文件名称,http://localhost:8080 为项目启动主页,也可以添加静态 html 文件等,启动时改为 index.html 之类的。 然后将 bat 文件放入目录,建议命名为应用名称; 使用 Inno Setup 软件打包,网上教程很多; 注意执行文件选择 bat 脚本: 在文件夹中放入 .ico 格式的图标文件,在 Inno Setup 生成的代码中添加图标配置: ...

2020 年 七月 6 日 · 1 分钟 · 69 字 · K.T