Skip to content

Releases: LiuYuYang01/ThriveX-Server

V3.2.2 修复高危漏洞,务必尽快升级!!!

20 Mar 13:07

Choose a tag to compare

漏洞报告

感谢这位大佬的 Lssues:Bpple


漏洞 1:未授权 GET 导致敏感配置与存储信息泄露

基本信息

  • 风险等级:Critical
  • CWE:CWE-306
  • 影响范围:
    • GET /api/env_config/list
    • GET /api/env_config/name/{name}
    • GET /api/oss/getEnableOss
    • GET /api/oss/{id}
    • GET /api/file/dir
    • GET /api/file/list
    • GET /api/assistant/{id}

漏洞描述

项目对 /api/** 统一挂载了 JWT 拦截器,但拦截器对所有 GET 请求默认放行。结果是多个本应只对管理端开放的读取接口全部暴露给未登录用户,攻击者无需任何凭证即可直接读取环境配置、对象存储配置、本地路径信息以及文件目录元数据。

该问题不是单一接口遗漏鉴权,而是全局鉴权策略设计缺陷,因此影响面广、修复优先级高。

根因定位

  • blog/src/main/java/liuyuyang/net/common/interceptor/JwtTokenAdminInterceptor.java
    • 对所有 GET 请求直接放行
  • blog/src/main/java/liuyuyang/net/common/config/WebConfig.java
    • 拦截器应用于 /api/**
  • blog/src/main/java/liuyuyang/net/web/controller/EnvConfigController.java
    • 直接返回环境配置内容
  • blog/src/main/java/liuyuyang/net/web/controller/OssController.java
    • 直接返回当前启用的 OSS 配置
  • blog/src/main/java/liuyuyang/net/web/controller/FileController.java
    • 提供目录和文件清单枚举能力

本地复现

  1. 未携带任何 Authorization 请求以下接口:
GET /api/env_config/list HTTP/1.1
Host: 127.0.0.1:9003
  1. 服务端直接返回 200,并暴露环境配置内容:
{
  "code": 200,
  "message": "获取成功",
  "data": [
    {
      "id": 2,
      "name": "email",
      "value": {
        "host": "smtp.qq.com",
        "port": 465,
        "password": "",
        "username": "xxx@qq.com"
      }
    }
  ]
}
  1. 未登录继续访问 OSS 配置接口:
GET /api/oss/getEnableOss HTTP/1.1
Host: 127.0.0.1:9003
  1. 服务端直接返回 200,并暴露存储配置与本地路径信息:
{
  "code": 200,
  "message": "ok",
  "data": {
    "id": 1,
    "platform": "local",
    "secretKey": "",
    "endPoint": "/Users/yang/Desktop/收纳/项目/ThriveX/ThriveX-Server/",
    "domain": "localhost:9003/static/",
    "basePath": "upload/",
    "isEnable": 1
  }
}

漏洞 2:匿名友链提交结合 RSS 聚合可触发服务端 SSRF

基本信息

  • 风险等级:High
  • CWE:CWE-918
  • 影响接口:
    • POST /api/link
    • GET /api/rss/list

漏洞描述

系统允许未登录用户直接提交友链数据,其中 rss 字段可由客户端任意控制。随后,公开接口 GET /api/rss/list 会遍历数据库中的所有 link 记录,并对每条记录中的 rss 地址发起服务端 HTTP 请求并解析订阅内容。

代码未限制目标协议、域名、内网地址,也未过滤未审核数据,因此形成了一条完整的匿名 SSRF 链:

  1. 攻击者匿名写入恶意 rss 地址
  2. 任意人访问 /api/rss/list
  3. 服务端主动请求该恶意地址

根因定位

  • blog/src/main/java/liuyuyang/net/web/controller/LinkController.java
    • POST /api/link 标记为 @NoTokenRequired
  • blog/src/main/java/liuyuyang/net/web/service/impl/LinkServiceImpl.java
    • 匿名提交时直接 linkMapper.insert(link)
  • blog/src/main/java/liuyuyang/net/web/controller/RssController.java
    • GET /api/rss/list 对外公开
  • blog/src/main/java/liuyuyang/net/web/service/impl/RssServiceImpl.java
    • 直接 new URL(link.getRss()).openConnection()
    • 遍历 linkMapper.selectList(null),未限制审核状态

本地复现

  1. 在本地启动一个监听器,地址为 127.0.0.1:18080

  2. 匿名提交恶意友链:

POST /api/link HTTP/1.1
Host: 127.0.0.1:9003
Content-Type: application/json

{
  "title": "ssrf-proof-unique",
  "description": "unique ssrf proof",
  "email": "ssrf@example.com",
  "typeId": 6,
  "image": "http://127.0.0.1:18080/logo.png",
  "url": "https://example.com",
  "rss": "http://127.0.0.1:18080/never-called-1.xml",
  "auditStatus": 0,
  "order": 0,
  "createTime": "1760000002000"
}
  1. 服务端返回 200,数据库成功写入:
id=55
title=ssrf-proof-unique
rss=http://127.0.0.1:18080/never-called-1.xml
audit_status=0
  1. 随后请求公开 RSS 聚合接口:
GET /api/rss/list HTTP/1.1
Host: 127.0.0.1:9003
  1. 本地监听器收到来自服务端的请求日志:
hit /never-called-1.xml

该路径在测试过程中未被手工访问,说明命中来自应用对 /api/rss/list 的处理流程。

V3.2.1 修复上传接口未对文件类型限制的问题

14 Mar 14:51

Choose a tag to compare

3.2.0 移除所有 RBAC 权限 以及 相册相关代码

21 Dec 09:12

Choose a tag to compare

V3.1.5 集成多个 AI 大模型

05 Aug 15:28

Choose a tag to compare

更新说明

集成多个 AI 大模型,提供更高的自由度

image

旧版升级

assisant 表新增 url 字段

DROP TABLE IF EXISTS `assistant`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `assistant` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL COMMENT '助手名称',
  `key` varchar(500) NOT NULL COMMENT '密钥',
  `url` varchar(255) NOT NULL COMMENT 'API 地址',
  `model` varchar(255) NOT NULL COMMENT '模型',
  `is_default` tinyint NOT NULL DEFAULT '0' COMMENT '是否被启用',
  PRIMARY KEY (`id`),
  UNIQUE KEY `assistant_pk` (`name`),
  UNIQUE KEY `assistant_pk_2` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='助手管理';

运行命令

参数介绍:

java -jar blog.jar \
--PORT=端口号 \
--DB_INFO=数据库信息(localhost:3306/blog) \
--DB_USERNAME=数据库用户名 \
--DB_PASSWORD=数据库密码

示例:

java -jar blog.jar \
--PORT=9003 \
--DB_INFO=localhost:3306/test_thrive \
--DB_USERNAME=root \
--DB_PASSWORD=root

V3.1.4 解决助手列表敏感数据暴露问题

30 Jul 12:00

Choose a tag to compare

3.1.3 优化网站配置前后端代码

11 Jul 09:01

Choose a tag to compare

数据库变动

备份旧的 web_config 后删除掉,执行以下 sql

DROP TABLE IF EXISTS `web_config`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `web_config` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL COMMENT '配置项名称',
  `value` json NOT NULL COMMENT '配置项值',
  `notes` varchar(255) DEFAULT NULL COMMENT '配置备注',
  PRIMARY KEY (`id`),
  UNIQUE KEY `web_page1_pk_2` (`id`),
  UNIQUE KEY `web_page1_pk_3` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='网站配置';
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `web_config`
--

LOCK TABLES `web_config` WRITE;
/*!40000 ALTER TABLE `web_config` DISABLE KEYS */;
INSERT INTO `web_config` VALUES (1,'web','{\"icp\": \"豫ICP备2020031040号-1\", \"url\": \"https://liuyuyang.net/\", \"title\": \"ThriveX\", \"footer\": \"真诚邀请大家成为 ThriveX 博客管理系统的贡献者,一起参与项目开发,构建一个强大的博客管理系统!\", \"favicon\": \"https://res.liuyuyang.net/usr/images/favicon.ico\", \"keyword\": \"宇阳,刘宇阳,Thrive,前端,Python,Java,Thrive,ThriveX,ThriveX现代化博客管理系统\", \"subhead\": \"现代化博客管理系统\", \"create_time\": 1547568000000, \"description\": \"也许会是最好用的博客管理系统\"}','网站配置'),(2,'theme','{\"covers\": [\"https://bu.dusays.com/2023/11/10/654e2da1d80f8.jpg\", \"https://bu.dusays.com/2023/11/10/654e2d719d31c.jpg\", \"https://bu.dusays.com/2023/11/10/654e2cf92cd45.jpg\", \"https://bu.dusays.com/2023/11/10/654e2cf6055b0.jpg\", \"https://bu.dusays.com/2023/11/10/654e2db0889fe.jpg\", \"https://bu.dusays.com/2023/11/10/654e2d50015a9.jpg\", \"https://bu.dusays.com/2023/11/05/65473848ed863.jpg\", \"https://bu.dusays.com/2023/11/10/654e2c870e280.jpg\", \"https://bu.dusays.com/2023/11/10/654e2c717eb73.jpg\", \"https://bu.dusays.com/2023/11/10/654e2c5d75d5b.jpg\", \"https://bu.dusays.com/2023/11/10/654e2da27801e.jpg\", \"https://bu.dusays.com/2023/11/10/654e2d2a67517.jpg\", \"https://bu.dusays.com/2023/11/10/654e2cf47f17a.jpg\", \"https://bu.dusays.com/2023/11/05/65473848ed863.jpg\"], \"social\": [{\"url\": \"https://github.com/LiuYuYang01\", \"name\": \"GitHub\"}, {\"url\": \"https://gitee.com/liu_yu_yang666\", \"name\": \"Gitee\"}, {\"url\": \"https://juejin.cn/user/3083456627092078/posts\", \"name\": \"Juejin\"}, {\"url\": \"https://blog.csdn.net/haodian666?type=blog\", \"name\": \"CSDN\"}, {\"url\": \"http://wpa.qq.com/msgrd?v=3&uin=3311118881&site=qq&menu=yes\", \"name\": \"QQ\"}], \"dark_logo\": \"https://bu.dusays.com/2024/05/03/663481106dcfd.png\", \"light_logo\": \"https://bu.dusays.com/2024/05/03/663481106e2a4.png\", \"record_info\": \"🎯 梦想做一名技术顶尖的架构师,奈何学历太低!\", \"record_name\": \"👋 Liu 宇阳\", \"swiper_text\": [\"System.out.print(\\\"欢迎使用 ThriveX 博客管理系统!\\\");\", \"print(\\\"这是一个 Nextjs + Spring Boot 的产物\\\")\"], \"reco_article\": [\"1\", \"2\"], \"swiper_image\": \"https://bu.dusays.com/2024/04/24/6628990012b51.jpg\", \"right_sidebar\": [\"author\", \"hotArticle\", \"newComments\", \"randomArticle\"], \"is_article_layout\": \"classics\"}','主题配置');
/*!40000 ALTER TABLE `web_config` ENABLE KEYS */;
UNLOCK TABLES;

3.1.2 动态更改页面配置

09 Jul 05:01

Choose a tag to compare

执行以下 sql 并执行:

DROP TABLE IF EXISTS `page_config`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `page_config` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `value` json NOT NULL COMMENT '配置项',
  `notes` varchar(255) DEFAULT NULL COMMENT '配置备注',
  PRIMARY KEY (`id`),
  UNIQUE KEY `page_config_pk_2` (`id`),
  UNIQUE KEY `page_config_pk_3` (`id`),
  UNIQUE KEY `page_config_pk` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `page_config`
--

LOCK TABLES `page_config` WRITE;
/*!40000 ALTER TABLE `page_config` DISABLE KEYS */;
INSERT INTO `page_config` VALUES (1,'my','{\"goals\": [{\"value\": \"1、涨薪2k!!!\", \"status\": 3}, {\"value\": \"2、提高前端技术栈深度\", \"status\": 1}, {\"value\": \"3、提高后端技术栈深度与广度,往后端迁移\", \"status\": 1}, {\"value\": \"4、ThriveX 博客管理系统 ⭐️ 破千\", \"status\": 1}, {\"value\": \"5、ThriveX 最低要求保持周更\", \"status\": 1}, {\"value\": \"6、输出 30 篇高质量技术博客\", \"status\": 1}], \"project\": [{\"name\": \"ThriveX\", \"front\": {\"url\": \"https://github.com/LiuYuYang01/ThriveX-Blog\", \"technology\": \"NextJS、TypeScript、Zustand、TailwindCSS、Scss、Echarts\"}, \"images\": [\"https://bu.dusays.com/2024/09/17/66e9704b2b809.png\", \"https://bu.dusays.com/2024/09/17/66e97036dddcb.png\", \"https://bu.dusays.com/2024/09/17/66e97035726ae.png\", \"https://bu.dusays.com/2024/09/17/66e97031cd456.png\"], \"backend\": {\"url\": \"https://github.com/LiuYuYang01/ThriveX-Server\", \"technology\": \"Spring Boot、Mybatis Plus、MySQL、Redis、Qiniu、Socket.io、Swagger\"}, \"control\": {\"url\": \"https://github.com/LiuYuYang01/ThriveX-Admin\", \"technology\": \"React、Antd、TypeScript、Zustand、TailwindCSS、Echarts\"}, \"description\": \"🎉 ThriveX 相比旧版 Thrive 的核心改变是从 Vue 全面迁移到了 React 技术栈并采用了 Nextjs 服务端渲染技术进行全方面重构,对SEO方面有了显著的提高。并且还新增了很多额外的功能...\"}, {\"name\": \"Thrive\", \"front\": {\"url\": \"https://github.com/LiuYuYang01/Thrive_Blog\", \"technology\": \"Vue3、TypeScript、Pinia、Element-plus、Scss、Echarts 、highlight.js\"}, \"images\": [\"https://bu.dusays.com/2024/09/17/66e96cb4e8417.png\", \"https://bu.dusays.com/2024/09/17/66e96ca366600.png\", \"https://bu.dusays.com/2024/09/17/66e96ca781d49.png\", \"https://bu.dusays.com/2024/09/17/66e96c9e76c81.png\"], \"backend\": {\"url\": \"https://github.com/LiuYuYang01/Thrive_Server\", \"technology\": \"Python、Flask、SQLAlchemy、MySQL、Flask-JWT、Socket.io、Swagger\"}, \"control\": {\"url\": \"https://github.com/LiuYuYang01/Thrive_Admin\", \"technology\": \"Vue3、TypeScript、Pinia、Element-plus、Scss\"}, \"description\": \"🎉 Thrive 是一个简而不简单的现代化博客管理系统,专注于分享技术文章和知识,为技术爱好者和从业者提供一个分享、交流和学习的平台。用户可以在平台上发表自己的技术文章,或浏览其他用户分享的文章,并与他们进行讨论和互动。\"}, {\"name\": \"云上校园\", \"front\": {\"url\": \"\", \"technology\": \"微信小程序、Vant、Echarts、Autojs\"}, \"images\": [\"https://bu.dusays.com/2024/09/18/66ea606eb5aa1.png\", \"https://bu.dusays.com/2024/09/18/66ea605d89df7.png\", \"https://bu.dusays.com/2024/09/18/66ea605ca9f0d.jpg\"], \"backend\": {\"url\": \"\", \"technology\": \"Nodejs、Eggjs、Socket.io、MySQL\"}, \"control\": {\"url\": \"\", \"technology\": \"Vue2、Element UI、vue-element-admin\"}, \"description\": \"🎉 云上校园是一个现代化大学生社交平台,该项目的立意是为了打造一个完整的校园生态圈,使校园触手可及!\"}], \"info_one\": {\"name\": \"Liu YuYang\", \"notes\": \"不是修改这个哦,这段代码暂时先保留,勿删!!!\", \"avatar\": \"https://q.qlogo.cn/g?b=qq&nk=3311118881&s=640\", \"profession\": \"一名Web全栈开发工程师\", \"introduction\": \"我从小就对计算机技术有着无穷的兴趣,因此我的梦想是做一名技术顶尖的 架构师。所以我一直在朝着这个方向去努力、去坚持 直到梦想成真!\"}, \"info_two\": {\"author\": \"宇阳\", \"know_me\": \"https://liuyuyang.net/article/2227\", \"left_tags\": [\"🤖️ 数码科技爱好者\", \"🔍 分享与热心帮助\", \"💻 全栈开发工程师\"], \"avatar_url\": \"https://q.qlogo.cn/g?b=qq&nk=3311118881&s=640\", \"right_tags\": [\"源于热爱而发电 ✨\", \"开源项目作者 🥳\", \"热爱漫无边际 🎉\"]}, \"character\": [{\"color\": \"#4298b4\", \"text1\": \"内向\", \"text2\": \"外向\", \"value\": 54, \"content\": \"内向型的人往往更喜欢较少但深入和有意义的社交互动,通常更喜欢安静的环境。\"}, {\"color\": \"#e4ae3a\", \"text1\": \"现实\", \"text2\": \"有远见\", \"value\": 41, \"content\": \"有远见型的人非常富有想象力、思想开放并充满好奇心。他们重视原创性,专注于隐含的意义和遥远的可能性。\"}, {\"color\": \"#33a474\", \"text1\": \"感受\", \"text2\": \"理性分析\", \"value\": 41, \"content\": \"感受型的人重视情感表达和敏感性。他们非常重视同理心、社会和谐及合作。\"}, {\"color\": \"#88619a\", \"text1\": \"展望\", \"text2\": \"评判\", \"value\": 79, \"content\": \"评判型的人果断、周到,很有条理。他们重视清晰度、可预测性和封闭性,更喜欢结构和计划,而不是自发性。\"}, {\"color\": \"#f25e62\", \"text1\": \"起伏不定\", \"text2\": \"坚决\", \"value\": 78, \"content\": \"起伏不定型的人自我意识强,对压力敏感。他们在情绪上有一种紧迫感,往往以成功为导向,追求完美,渴望进步。\"}], \"info_style\": \"info_one\"}','关于我'),(2,'resume','{\"links\": {\"csdn\": \"https://thrive.blog.csdn.net\", \"github\": \"https://github.com/LiuYuYang01\", \"project\": \"https://liuyuyang.net/\"}, \"skills\": [\"熟练 HTML5、CSS3、Flex、Scss、TailwindCSS 能够精准还原 UI 设计师的产品原型图,实现产品级的复现\", \"熟练 TypeScript、JavaScript、jQuery、面向对象、闭包、原型链、WebApi、原生DOM\", \"熟练 Vue2 / 3 相关生态:Axios、Vuex、Pinia\", \"熟练 React18 相关生态:NextJS、Redux、Zustand、Ahooks、Motion\", \"熟练 Uniapp 完成多端适配 以及 原生微信小程序开发\", \"熟练 Echarts 数据可视化开发 且 能够根据业务需求进行自定义扩展\", \"熟练 Ant Design、NextUI、Element UI、Vant、Naive UI、Bootstrap 等多种组件库的使用\", \"熟悉 NodeJS 相关生态:Express、NextJS、NestJS、Prisma\", \"熟悉 Python Flask 及 SQLAlchemy 对象映射(ORM)框架\", \"熟悉 Electron 跨平台桌面应用开发框架\", \"了解 Remix 全栈开发框架\", \"了解 WebPack、Vite 等打包构建工具\", \"熟悉 Spring Boot、Spring MVC、Mybatis Plus 等主流框架\", \"熟练 MySQL 关系型数据库,具备手写 SQL 及复杂查询的能力\", \"了解 Spring Cloud 微服务框架及常用的组件 Nacos、OpenFeign、Gateway\", \"熟悉 Linux 常用命令以及 Nginx 基本配置\", \"熟悉 Docker 基本命令、容器编排、镜像构建,并熟练使用可视化工具如:宝塔、1Panel 等,并有项目部署上线的经验\"], \"projects\": [{\"name\": \"ThriveX CMS 建站管理系统\", \"role\": \"全栈开发(NextJS + Spring Boot)\", \"links\": {\"api\": \"https://api.liuyuyang.net/doc.html\", \"docs\": \"https://docs.liuyuyang.net/\", \"preview\": \"https://liuyuyang.net/\", \"website\": \"https://thrivex.liuyuyang.net/\"}, \"period\": \"2023.03-至今\", \"techStack\": {\"backend\": \"Spring Boot、Mybatis Plus、MySQL、Qiniu、Swagger、Python、Flask、SQLalchemy\", \"frontend\": \"React、NextJS、TypeScript、Zustand、TailwindCSS、Scss、Next UI、Antd UI、Echarts、React Hook Form、Ahooks、百度统计API、高德地图API、Vue3、Pinia、Element UI\", \"deployment\": \"采用 Docker Compose 一键部署、采用 Nginx 实现反向代理、SSL 证书等\"}, \"highlights\": [\"【AI】采用科大讯飞AI大模型实现文章续写、优化、总结、智能问答\", \"【权限】RBAC 权限管理,动态路由、按钮权限、多用户登录\", \"【地图】采用 高德地图实现旅游足迹可视化等功能\", \"【安全】限制异地登录 及 以及多设备登录同一账号\", \"【交互】采用 TailwindCSS 实现白天、昼夜主题切换效果\", \"【适配】采用 TailwindCSS 媒体查询实现手机、平板、电脑三端适配\", \"【可视化】采用 百度统计API + Echarts 实现数据可视化\", \"【SEO】采用 NextJS 服务端渲染技术进行 SEO 优化,在 Lighthouse 中评分 100%\", \"【文件系统】同时兼容阿里云、腾讯云、华为云、七牛云、百度云等对象存储\", \"【一键部署】采用 Docker Compose 脚本实现前端、控制端、后端、数据库一键部署\", \"【自动化部署】利用 Vercel 实现高效的持续集成与自动化部署\"], \"description\": \"ThriveX 是一个年轻、高颜值、全开源、永不收费的现代化 CMS 管理系统,项目组成是前端、控制端、后端,采用前后端分离开发式,是一个 NextJS + Spring Boot 的产物。\", \"achievements\": [\"一个人完成产品、UI、前端、控制端、后端、数据库、测试 以及 项目部署上线\", \"项目代码全开源,截止目前在 GitHub 已经有 1867 条 Commit 记录,收获 700+ Star,156+ Fork\", \"目前已有多数用户在使用该系统,粉丝群已超千名用户\"], \"repositories\": {\"admin\": \"https://github.com/LiuYuYang01/ThriveX-Admin\", \"backend\": \"https://github.com/LiuYuYang01/ThriveX-Server\", \"frontend\": \"https://github.com/LiuYuYang01/ThriveX-Blog\"}}, {\"name\": \"XX支付平台 \", \"role\": \"前端开发工程师\", \"links\": {\"docs\": \"https://\", \"website\": \"https://\", \"dashboard\": \"https://\"}, \"period\": \"2024.12-至今\", \"techStack\": \"React、TypeScript、Zustand、TailwindCSS、Scss、Antd UI、Echarts、React Hook Form、Ahooks、百度统计API\", \"description\": [\"点点易付专注打造一站式支付解决方案,通过安全可靠的支付通道和高效便捷的服务,助力全球商户拓展国际市场,实现业务全球化\", \"简化中国企业在跨境收单的繁琐流程,提供一站式服务,从账户申请到交易处理全程支持\"], \"achievements\": \"结果令老板满意,完成涨薪 60%,并赠与 5 万元一次性奖金\"}, {\"name\": \"Shopify 跨境电商结账页\", \"role\": \"前端开发工程师\", \"period\": \"2024.07-2024.09\", \"challenges\": \"商品的最终价格需要根据多种因素决定,如商品单价、运费、税费、运费险等不同的条件进行计算,而且还要通过同一套代码完成单页面布局和多页面布局,整体的逻辑相对复杂\", \"achievements\": \"结果令老板满意,完成涨薪 25%\", \"responsibilities\": [\"主导 jQuery 项目全面迁移至 React 生态,提高项目代码规范及可维护性\", \"负责组件库架构设计,保证组件库可扩展性、易用性\", \"使用 React-i18next 完成八国语言一键切换\", \"集成 Sentry 实现前端监控,快速排查线上项目疑难杂症\"]}, {\"name\": \"云上校园\", \"role\": \"全栈开发(小程序 + Eggjs)\", \"period\": \"2022.12-2023.05\", \"techStack\": \"微信小程序、Vant、Vue2、Element UI、Echarts、Nodejs(Eggjs)、MySQL、Socket.io\", \"highlights\": [\"通过 Echarts 搭配百度统计API实现数据可视化\", \"微信登录、登录状态检测\", \"实时通讯聊天室:支持私聊、群聊、表情、图片聊天记录存储\"], \"description\": \"云上校园是一个专注提升大学校园生活质量与便利性的平台,打造一个集信息传播、学习辅助、就业赚取、维权举报、科技体验于一体的综合服务平台。\", \"achievements\": \"上海市第十五届计算机应用能力大赛三等奖\"}], \"education\": {\"major\": \"软件工程\", \"degree\": \"本科\", \"period\": \"2021-2026\", \"school\": \"上海开放大学\", \"achievements\": [\"上海市计算机应用能力大赛三等奖\", \"上海开放大学创新项目奖\", \"二等奖学金\", \"计算机软件著作权\"]}, \"advantages\": [\"上海市第十五届计算机应用能力大赛 三等奖、创新项目奖\", \"GitHub 开源项目作者(ThriveX CMS 建站系统)Star 900+\", \"ThriveX CMS 建站系统 计算机软件著作权(申请中)\", \"具备项目从 0 到 1 部署上线的经验:https://liuyuyang.net/\", \"利用业余时间持续输出技术文章,目前在 CSDN 累计拥有 1700+ 粉丝\", \"熟练 Spring Boot 以及 Express、Flask 等多种后端开发语言 对前后端接口联调过程中的问题能够进行清晰定位\", \"能够独当一面,从 0 到 1 构建前端项目 且 具备完整项目设计、研发、部署、全链路问题排查能力\"], \"personalInfo\": {\"age\": \"22岁\", \"name\": \"刘宇阳\", \"title\": \"前端开发工程师\", \"avatar\": \"https://q1.qlogo.cn/g?b=qq&nk=3311118881&s=640\", \"contact\": {\"email\": \"liuyuyang1024@yeah.net\", \"phone\": \"1778811xxxx\", \"github\": \"https://github.com/LiuYuYang01\"}, \"location\": \"郑州\"}, \"workExperience\": [{\"period\": \"2024.07-至今\", \"company\": \"宁波 XXXX 数字科技有限公司\", \"position\": \"前端负责人\", \"responsibilities\": [\"带领前端团队优化日常项目的开发与落地,并承担重点项目开发与上线\", \"在项目紧急情况下,由我负责前端的设计与实现,在经过 3 个月的 996 加班后,如期完成了项目的高质量上线。最终结果令老板满意,奖励一次性 5 万元奖金。在半年内完成涨薪 100%\"]}, {\"period\": \"2024.05-2024.06\", \"company\": \"成都 XX 科技有限公司\", \"position\": \"前端开发工程师\", \"responsibilities\": [\"负责公司内部 Todo 系统开发与改进,采用 Electron 桌面软件开发框架\"]}]}','我的简历'),(3,'equipment','{\"list\": [{\"items\": [{\"name\": \"MacBook Air M4\", \"image\": \"https://res.liuyuyang.net/thrive/equipment/MacBook%20Air%20M4.jpg\", \"price\": 8757, \"de...
Read more

3.1.1 完成修改管理员用户名功能

08 Jul 11:11

Choose a tag to compare

完成修改管理员用户名功能

3.1.0 移除运行时非必要的环境变量

04 Jul 04:49

Choose a tag to compare

更新说明

移除运行时非必要的环境变量,这样就不用每次更改环境变量而重启服务,全部在控制端进行实时操作

数据库更改

thrivex 改成你的数据库名称,然后执行 sql 语句

-- 指定使用 thrivex 数据库
USE thrivex;

-- 1. 重命名 config 表为 web_config
RENAME TABLE config TO web_config;

-- 2. 创建新的 env_config 表
DROP TABLE IF EXISTS env_config;
CREATE TABLE env_config (
  id int NOT NULL AUTO_INCREMENT,
  name varchar(255) DEFAULT NULL,
  value json NOT NULL COMMENT '配置项',
  notes varchar(255) NOT NULL COMMENT '配置备注',
  PRIMARY KEY (id),
  UNIQUE KEY env_config_pk_2 (id),
  UNIQUE KEY env_config_pk (name)
) ENGINE=InnoDB AUTO_INCREMENT=45 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

-- 3. 插入初始数据到 env_config 表
LOCK TABLES env_config WRITE;
INSERT INTO env_config VALUES 
  (1,'baidu_statis','{"site_id": 0, "access_token": ""}','百度统计配置'),
  (2,'email','{"host": "smtp.qq.com", "port": 465, "password": "", "username": ""}','邮件发送配置'),
  (3,'gaode_map','{"key_code": "", "security_code": ""}','高德地图配置'),
  (4,'gaode_coordinate','{"key": ""}','高德地图坐标配置');
UNLOCK TABLES;

-- 4. 创建 route 表
DROP TABLE IF EXISTS route;
CREATE TABLE route (
  id int NOT NULL AUTO_INCREMENT,
  path varchar(100) NOT NULL COMMENT '路由路径',
  description varchar(255) NOT NULL COMMENT '路由描述',
  PRIMARY KEY (id),
  UNIQUE KEY routes_pk_2 (id),
  UNIQUE KEY routes_pk (id)
) ENGINE=InnoDB AUTO_INCREMENT=34 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

-- 5. 插入初始数据到 route 表
LOCK TABLES route WRITE;
INSERT INTO route VALUES 
  (1,'/','仪表盘'),(2,'/create','创作'),(5,'/setup','系统'),(6,'/article','文章管理'),
  (7,'/tag','标签管理'),(8,'/comment','评论管理'),(9,'/cate','分类管理'),(10,'/web','网站管理'),
  (11,'/swiper','轮播图管理'),(12,'/user','用户管理'),(13,'/role','角色管理'),(14,'/rss','订阅中心'),
  (15,'/chart','文件系统'),(17,'/iter','更新日志'),(20,'/route','路由管理'),(21,'/file','文件管理'),
  (23,'/footprint','足迹管理'),(24,'/work','工作台'),(25,'/wall','留言管理'),(26,'/draft','草稿箱'),
  (27,'/recycle','回收站'),(28,'/record','说说管理'),(29,'/create_record','闪念'),(30,'/storage','存储管理'),
  (31,'/album','相册管理'),(32,'/assistant','助手管理'),(33,'/config','环境配置');
UNLOCK TABLES;

运行命令

参数介绍:

java -jar blog.jar \
--PORT=端口号 \
--DB_INFO=数据库信息(localhost:3306/blog) \
--DB_USERNAME=数据库用户名 \
--DB_PASSWORD=数据库密码

示例:

java -jar blog.jar \
--PORT=9003 \
--DB_INFO=localhost:3306/test_thrive \
--DB_USERNAME=root \
--DB_PASSWORD=root

3.0.3 解决已知问题

27 Jun 04:34

Choose a tag to compare

解决已知问题