{"hits":[{"lvl2":"2026-01-16 08:55:00.0","created_unix":1768524900000,"id":52,"lvl0":"【使用必看】AI 辅助上手","content":"AI 正在以前所未有的速度重塑软件工程。无论是阅读源码、排查问题还是理解架构，AI 工具都能大幅压缩你的学习曲线。**能让 AI 做的事，就让 AI 做** —— 这不只是效率问题，而是它在很多场景下确实比人工更快、更准。\n\n强烈建议订阅 **[Claude Code](https://claude.ai/code)** 或 **[CodeX](https://chatgpt.com/)** 等 AI 编程工具，或通过中转站的方式接入使用。在本地项目目录中直接与 AI 对话，是理解 PIGX 源码最高效的方式之一。\n\n推荐工具：\n\n- **[CodeX](https://chatgpt.com/)** — OpenAI 官方 CLI，终端中直接与源码对话\n\n- **[Claude Code](https://claude.ai/code)** — Anthropic 官方 CLI，终端中直接与源码对话\n\n\n## PIG Docs Skill 安装\n\nPIG 官方 AI Skill — 在 Claude Code 或其他 Vibe Coding IDE 中，通过 /pigdoc 指令即可智能检索 PIG 文档、获取代码示例，让 AI 真正理解你的框架\n\n\n```\nnpx skills add https://github.com/lltx/skills --skill pigdoc\n```\n\n![skill 安装](https://minio.pigx.vip/oss/202604/pigdocskills.gif)\n\n**典型使用场景：**\n\n- 理解某个模块的整体架构：`pigx-upms 的权限体系是怎么设计的？`\n- 追踪代码调用链：`登录请求从 Gateway 到 Auth 服务的完整流程是什么？`\n- 排查配置问题：`Nacos 配置加载的优先级顺序是什么？`\n- 快速定位文件：`处理用户角色绑定的 Service 在哪里？`\n\n## skill 使用\n\n### 代码阅读\n\n```\n/pigdoc 网关路由文件在哪里?\n```\n\n![AI 加持下了解PIGX](https://minio.pigx.vip/oss/202604/demo.gif)\n\n\n### 开发目录推荐\n\n在AI加持下，不再按技术栈划分技术岗位，所有工程师统一称为 Agent 工程师。任务分配也不再基于你是前端、后端还是算法，而是基于产品目标和项目结果。\n\n所以作为全栈开发，要同时熟悉前后端代码，建议在本地项目目录结构如下：\n\n```\nVSCODE\n├── pigx   (IDEA 后端继续打开)\n├── pigx-ui\n└── AGENTS.md/CLAUDE.md\n```\n\n![笔者的开发目录示意图](https://minio.pigx.vip/oss/202604/aRdldy.png)","url":"/doc/pigx/quick-start/index"},{"lvl2":"2026-01-16 08:55:00.0","created_unix":1768524900000,"id":56,"lvl0":"系统快速上手部署 👍","content":"<Video title=\"视频：基础开发环境安装\"><iframe width=\"100%\" height=\"500\" src=\"https://player.dogecloud.com/web/player.html?vcode=8ccd3929d9263404&userId=11471&autoPlay=false&inFrame=true\" title=\"本地部署视频教程\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"true\"></iframe></Video>\n<Video title=\"视频：微服务版代码部署\"><iframe width=\"100%\" height=\"500\" src=\"https://player.dogecloud.com/web/player.html?vcode=3c74c3af5012bf42&userId=11471&autoPlay=false&inFrame=true\" title=\"本地部署视频教程\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"true\"></iframe></Video>\n\n<Warning title=\"写在最前\">\n**无论您是多年编程的高级工程师，还是刚刚入门的实习生，部署请完全参考本文档操作。**\n</Warning>\n\n## 环境说明\n\n<Tip title=\"软件下载\">\n[pig4cloud 基础环境软件百度网盘批量下载 「提取密码 8888」](https://pan.baidu.com/s/12pgv8iVr82RHd9IN8p6YBQ?pwd=8888)\n</Tip>\n\n| 软件  | 版本         | 备注                                                                                                             |\n| ----- | ------------ | ---------------------------------------------------------------------------------------------------------------- |\n| jdk   | 17 | 支持 Java 21                                                                          |\n| mysql | 8            | [要求设置数据库大小写不敏感 lower_case_table_names = 1](https://blog.csdn.net/fdipzone/article/details/73692929) |\n| redis | 7+         |                                                                                                                  |\n| node  | 18/20/22        | 使用偶数版LTS版本  最高  22.9.0                                                                                                 |\n| maven | 3.8+         |                                                                                                                  |\n| IDEA  | 2023+        | [需要安装 lombok 插件 ](https://blog.csdn.net/wochunyang/article/details/81736354)                               |\n\n## 项目下载\n\n```bash\ngit clone https://git.pig4cloud.com/pig/pigx.git\n```\n\n## 一、检查 IDEA 环境\n\n<Accordion title=\"开发环境环境检查，不会的同学点这里！\">\n\n**请使用 IDEA 2023 以上版本**\n\n1. 设置 JAVA17 开发环境\n   - 进入 `File → Settings → Build, Execution, Deployment → Compiler → Java Compiler`\n   - 将 **Project Bytecode Version** 设置为 `17`\n\n<img src=\"https://minio.pigx.top/oss/202309/1695452559.png\" alt=\"设置 JAVA17 编译环境\" width=\"100%\" />\n\n2. 设置全局编译环境\n\n<img src=\"https://minio.pigx.top/oss/202309/1695452716.png\" alt=\"全局编译环境设置\" width=\"100%\" />\n\n3. 设置模块的编译环境\n   - 在 `File → Project Structure → Modules` 中，选中需要调整的模块\n   - 将 **Language Level** 设置为 `17`（对应 Java SE 17）\n\n<img src=\"https://minio.pigx.top/oss/202309/1695452601.png\" alt=\"设置模块编译环境\" width=\"100%\" />\n\n</Accordion>\n\n<Tip title=\"Maven 配置步骤\">\n如下图所示：① 点击 IDEA 右侧 Maven 面板； ② 勾选 cloud profile； ③ 点击 Maven Reload ；\n</Tip>\n\n<img src=\"https://minio.pigx.top/oss/202405/1715785671.png\" alt=\"Maven 配置界面\" width=\"100%\" />\n\n## 二、配置数据库\n\n**参数说明**\n\n```bash\n版本： mysql5.7.8+\n默认字符集: utf8mb4\n默认排序规则: utf8mb4_general_ci\n\n# 要求设置数据库大小写不敏感 https://blog.csdn.net/fdipzone/article/details/73692929\nlower_case_table_names = 1\n```\n\n**数据库脚本说明**\n\n```bash\n-- 建库语句\nsource db/1schema.sql;\n-- 核心数据库\nsource db/2pigxx.sql;\n-- 工作流相关数据库\nsource db/3pigxx_flow.sql;\n-- 定时任务相关数据库\nsource db/4pigxx_job.sql;\n-- 微信公众号相关数据库\nsource db/5pigxx_mp.sql;\n-- 配置中心数据库\nsource db/6pigxx_config.sql;\n-- 支付模块数据库\nsource db/7pigxx_pay.sql;\n-- 代码生成模块数据库\nsource db/8pigxx_codegen.sql;\n-- 报表设计数据库\nsource db/99pigxx_bi.sql;\n-- APP模块数据库\nsource db/999pigxx_app.sql;\n-- 【特别说明】大屏设计器：pigxx_report，自动创建表没有 DML SQL\n```\n\n**关于系统账号密码说明**\n\n| 系统                    | 作用               | 账号密码          |\n| ----------------------- | ------------------ | ----------------- |\n| pigx-ui                 | 用户登录           | admin/123456      |\n| pigx-register           | nacos 注册配置中心 | nacos/nacos       |\n| pigx-sentinel-dashboard | sentinel 流量保护  | sentinel/sentinel |\n| pigx-monitor            | 服务监控           | pigx/pigx         |\n| pigx-bi-platform        | 报表设计平台       | pigx/pigx         |\n\n## 三、配置本地 hosts\n\n<Tip title=\"hosts 配置要求\">\n必须按此步骤配置,禁止修改代码中配置成固定 IP [win 配置方法](https://www.jb51.net/os/win10/395409.html) | [mac 配置方法](https://www.jianshu.com/p/752211238c1b) | [懒人建议: 使用 switchhost 快速切换 host](https://cloud.tencent.com/developer/article/1408956)\n<u>梯子、VPN 等软件会导致 hosts 配置失效，请关闭！</u>\n</Tip>\n\n```bash\n127.0.0.1 pigx-register\n127.0.0.1 pigx-gateway\n127.0.0.1 pigx-redis\n127.0.0.1 pigx-xxl\n127.0.0.1 pigx-mysql\n127.0.0.1 pigx-sentinel\n127.0.0.1 pigx-monitor\n127.0.0.1 pigx-seata\n```\n\n## 四、配置修改\n\n**① nacos 数据源修改**\n\n```yaml\n# pigx/pigx-register/src/main/resources/application.properties\n# 数据源相关配置修改正确的密码\ndb.user=用户\ndb.password=密码\n```\n\n**② 启动 PigxNacosApplication**\n\n```bash\npigx/pigx-register/src/main/java/com/alibaba/nacos/PigxNacosApplication.java\n```\n\n**③ 浏览器访问** `http://127.0.0.1:18080 (pigx 5.9+)`  默认账号密码（nacos/nacos）\n\n**④ 编辑 【浏览器 Nacos 中】<mark><u>application-dev.yml 修改 redis 配置</u></mark>**\n\n```yaml\nspring:\n  data:\n    redis:\n      password: #有密码就改,没密码删除此属性\n```\n\n<img src=\"https://minio.pigx.top/oss/202310/1697020422.png\" alt=\"Nacos 配置界面\" width=\"100%\" />\n\n**⑤ 编辑【浏览器 Nacos 中】 修改<mark><u>数据库</u></mark>配置**\n\n| 序号 | 配置文件名称                    | 备注                                     |\n| ---- | ------------------------------- | ---------------------------------------- |\n| 1    | pigx-upms-biz-dev.yml           | 修改数据库链接信息、文件上传本地路径信息 |\n| 2    | pigx-codegen-dev.yml            | 修改数据库链接信息                       |\n| 3    | pigx-pay-platform-dev.yml       | 修改数据库链接信息                       |\n| 4    | pigx-flow-biz-dev.yml    | 修改数据库链接信息                       |\n| 5    | pigx-mp-platform-dev.yml        | 修改数据库链接信息                       |\n| 6    | pigx-daemon-elastic-job-dev.yml | 修改数据库链接信息                       |\n| 7    | pigx-daemon-quartz-dev.yml      | 修改数据库链接信息                       |\n| 8    | pigx-report-platform-dev.yml      | 修改数据库链接信息、文件上传存储路径                       |\n\n```yaml\nspring:\n  datasource:\n    username: ${MYSQL-USER:root} #只需要修改此处用户名密码 ， 冒号后边部分\n    password: ${MYSQL-PWD:root} #只需要修改此处用户名密码， 冒号后边部分\n    url: jdbc:mysql://${MYSQL-HOST:pigx-mysql}:${MYSQL-PORT:3306}/.... #酌情修改此处端口， 冒号后边部分\n```\n\n\n## 五、启动顺序（基础模块）\n\n```bash\n1.pigx-register/PigxNacosApplication.java\n2.pigx-upms-biz/PigxAdminApplication   [注意启动完毕输出路由初始化完毕再去启动其他模块]\n3.pigx-auth/PigxAuthApplication\n4.pigx-gateway/PigxGatewayApplication\n```\n\n<Accordion title=\"以上服务为核心基础服务，其他服务按需启动。\">\nIDEA Service 面板可能显示不全 SpringBoot 的 Main 启动类，直接按上边模块去根目录找 Main 方法启动即可。\n</Accordion>\n\n## 六、启动前端\n\n<Warning title=\"Node 版本要求\">\nNode 版本必须使用 18，如遇 install 失败，请删除 node_modules 文件夹，尝试重新 npm install\n</Warning>\n\n```bash\n# 查看 node 版本\nnode -v\n\n# 高版本执行切换至 18\nn 18.20.4\n\n# 下载前端源码\ngit clone https://git.pig4cloud.com/pig/pigx-ui.git\n\n# 安装前端依赖\nnpm install --registry=https://registry.npmmirror.com\n\n# 启动\nnpm run dev\n```\n\n## 常见问题\n\n<Tip title=\"问题排查建议\">\n工单系统搜索可以解决大部分问题，注意使用关键词搜索。新建工单时请提供日志、截图、复现步骤。\n- [常见问题列表 参考私服工单](https://git.pig4cloud.com/pig/pigx/issues?q=&type=all&sort=&state=closed&labels=77&milestone=0&assignee=0)\n</Tip>\n\n\n\n<img src=\"https://minio.pigx.top/oss/1657674058.jpg\" alt=\"工单系统搜索界面\" width=\"100%\" />","url":"/doc/pigx/quick-start/pigx-deploy"},{"lvl2":"2026-01-16 08:55:00.0","created_unix":1768524900000,"id":61,"lvl0":"新增微服务完成 CRUD 👍","content":"<Video><iframe width=\"100%\" height=\"500\" src=\"https://player.dogecloud.com/web/player.html?vcode=0ed3ff3ce275d604&userId=11471&autoPlay=false&inFrame=true\" title=\"本地部署视频教程\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"true\"></iframe></Video>\n\n<Warning title=\"项目初始化注意事项\">\n- 请务必按照本文档的 **包名** 和 **项目名** 进行初始化，其他内容请了解 **feign、mybatis** 的包扫描规则。\n- 根据上述文档生成初始化 demo 项目，如果使用 IDEA，请直接使用图形化界面；其他开发工具请使用 mvn 命令行。\n- 生成 demo 项目时，请注意 `archetype` 和 `pigx` 的版本需一致。\n</Warning>\n\n<img src=\"https://minio.pigx.top/oss/202307/1688310872.jpg\" alt=\"Archetype 生成流程示意图\" width=\"50%\" />\n\n## 1. 使用 pigx archetype 初始化项目\n\n### 1.1 编译 pigx 项目\n\n<Tip title=\"编译前置条件\">\n请先完整编译一次 PIGX 服务端项目，以确保所有依赖包正确安装。\n这是为了避免在执行 Maven Archetype 时出现 \"找不到包\" 的错误。\n</Tip>\n\n```bash\ncd pigx/\nmvn clean install\n```\n\n### 1.2 执行 archetype 生成\n\n<Tabs>\n<Tab title=\"Windows\">\n```bash\n# 直接在win + R CMD小黑屏里面执行，不要使用 powershell 或者其他终端\nmvn org.apache.maven.plugins:maven-archetype-plugin:3.1.0:generate ^\n      -Dproject=pigx ^\n      -DjavaVersion=17 ^\n      -DgroupId=com.pig4cloud ^\n      -DartifactId=demo ^\n      -Dversion=5.12.0 ^\n      -DarchetypeGroupId=com.pig4cloud.archetype ^\n      -DarchetypeArtifactId=pigx-gen ^\n      -DarchetypeVersion=5.12.0 ^\n      -DarchetypeCatalog=local\n```\n</Tab>\n<Tab title=\"MAC\">\n```bash\nmvn org.apache.maven.plugins:maven-archetype-plugin:3.1.0:generate \\\n      -Dproject=pigx \\\n      -DjavaVersion=17 \\\n      -DgroupId=com.pig4cloud \\\n      -DartifactId=demo \\\n      -Dversion=5.12.0 \\\n      -DarchetypeGroupId=com.pig4cloud.archetype \\\n      -DarchetypeArtifactId=pigx-gen \\\n      -DarchetypeVersion=5.12.0 \\\n      -DarchetypeCatalog=local\n```\n</Tab>\n</Tabs>\n\n\n| 参数                      | 值                       | 备注                    |\n|-------------------------|-------------------------|-----------------------|\n| `-Dproject`             | `pigx`                  | 项目名称，**专属版本需要修改**     |\n| `-DjavaVersion`         | `17`                    | 使用Java版本，只有17一个选项   |\n| `-DgroupId`             | `com.pig4cloud`         | 项目包名前缀 ，**专属版本需要修改**  |\n| `-DartifactId`          | `demo`                 | 新增模块名称   ，不要带特殊字              |\n| `-Dversion`             | `5.12.0`                 | 项目版本号                 |\n| `-DarchetypeGroupId`    | `com.pig4cloud.archetype` | 【固定值】，专属版本**不**需要修改   |\n| `-DarchetypeArtifactId` | `pigx-gen`              | 【固定值】，专属版本**不**需要修改   |\n| `-DarchetypeVersion`    | `5.12.0`                   | 【固定值】，archetype版本 |\n| `-DarchetypeCatalog`    | `local`                 | 【固定值】local            |\n\n### 1.3 生成的项目结构如下\n\n```bash\ndemo\n  ├── README.md\n  ├── demo-api     # api 模块主要存放 实体、feign 调用接口\n  │   ├── pom.xml\n  │   └── src\n  ├── demo-biz    # biz 模块主要存放 controller、业务service、mapper\n  │   ├── pom.xml\n  │   └── src\n  └── pom.xml\n```\n\n## 2. 创建库表\n\n```sql\n-- 创建测试库\ncreate database `pigxx_demo` default character set utf8mb4 collate utf8mb4_general_ci;\n\nUSE pigxx_demo;\n\nSET NAMES utf8mb4;\nSET FOREIGN_KEY_CHECKS = 0;\n\n-- 创建测试表\nDROP TABLE IF EXISTS `demo`;\nCREATE TABLE `demo` (\n  `id` bigint NOT NULL COMMENT '编号',\n  `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '用户名',\n  `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '密码',\n  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '0' COMMENT '删除标记',\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='demo 表';\n```\n\n## 3. 代码生成\n\n### 3.1 数据源新增\n\n```text\njdbc:mysql://pigx-mysql:3306/pigxx_demo?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true\n```\n\n<img src=\"https://minio.pigx.vip/oss/202507/kBOc12.png\" alt=\"数据源配置界面\" width=\"100%\" />\n\n### 3.2 生成代码\n\n<Tip title=\"包名和模块名\">\n选择数据源生成代码时，请注意包名称和模块名称。\n</Tip>\n\n<img src=\"https://minio.pigx.top/oss/202310/1697019662.png\" alt=\"代码生成配置界面\" width=\"100%\" />\n\n- 代码生成的包结构如下\n\n```\n├── demo_menu.sql   # 新增模块对应的菜单 SQL\n├── pigx            # 后端代码包含增删改查代码\n│   └── src\n└── pigx-ui         # 前端代码包含页面\n    └── src\n```\n\n### 3.3 菜单维护\n\n<Tabs>\n<Tab title=\"自动维护菜单\">\n当代码生成基础信息中配置此功能的【所属菜单】时，会自动维护相关的菜单和按钮，**不需要手动执行SQL脚本。**\n\n<img src=\"https://minio.pigx.top/oss/202408/1723989187.png\" alt=\"自动维护菜单配置\" width=\"100%\" />\n</Tab>\n<Tab title=\"手动维护菜单\">\n执行代码生成包（3.2 中的 demo_menu.sql）中的 SQL 脚本（在 **pigxx 数据库**）。\n\n<img src=\"https://minio.pigx.top/oss/202312/1701610364.png\" alt=\"手动维护菜单\" width=\"100%\" />\n</Tab>\n</Tabs>\n\n## 4. 配置动态路由\n\n<Tabs>\n<Tab title=\"自动创建路由\">\n同步路由设置为自动创建，则会自动创建一条【/demo】的网关路由，存在则跳过，不需要手动维护。\n\n<img src=\"https://minio.pigx.top/oss/202408/1723988979.png\" alt=\"自动创建路由配置\" width=\"100%\" />\n</Tab>\n<Tab title=\"手动添加路由\">\n同步路由设置为手动添加。\n\n<img src=\"https://minio.pigx.top/oss/202408/1723988669.png\" alt=\"手动添加路由设置\" width=\"100%\" />\n\n进入 \"基础工具\" > \"路由管理\"，添加 demo-biz 对应的路由规则。\n\n<img src=\"https://minio.pigx.top/oss/202507/O6B0yj.png\" alt=\"路由管理界面\" width=\"100%\" />\n</Tab>\n</Tabs>\n\n## 5. 角色分配权限\n\n<Warning title=\"关键步骤\">\n给角色分配权限（角色管理 > 权限）。在重新启动前端并**重新登录**后，请强制刷新浏览器，查看 demo 功能是否生效。\n</Warning>\n\n<img src=\"https://minio.pigx.top/oss/202310/1697018891.png\" alt=\"角色权限分配界面\" width=\"100%\" />\n","url":"/doc/pigx/quick-start/pigx-new-app"},{"lvl2":"2026-01-16 08:55:00.0","created_unix":1768524900000,"id":64,"lvl0":"系统账号密码说明 👍","content":"<Warning title=\"安全提示\">\n以下为系统默认账号密码，仅供开发和测试环境使用。生产环境部署前，请务必修改所有默认密码，避免安全风险。\n</Warning>\n\n## 前端默认登录\n\n| 访问地址       | 用户名 | 密码   | 说明 |\n| -------------- | ------ | ------ | ---- |\n| http://ip:8888 | admin  | 123456 | 系统管理员账号 |\n\n## pigx-register 注册配置中心\n\n| 访问地址        | 用户名 | 密码  | 说明 |\n| --------------- | ------ | ----- | ---- |\n| http://ip:18080 | nacos  | nacos | Nacos 配置中心 |\n\n## pigx-monitor 监控模块\n\n| 访问地址       | 用户名 | 密码 | 说明 |\n| -------------- | ------ | ---- | ---- |\n| http://ip:5001 | pigx   | pigx | Spring Boot Admin 监控 |\n\n## pigx-xxl-job-admin 定时任务管理台\n\n| 访问地址                     | 用户名 | 密码   | 说明 |\n| ---------------------------- | ------ | ------ | ---- |\n| http://ip:9080/xxl-job-admin | admin  | 123456 | XXL-Job 任务调度平台 |\n\n## pigx-sentinel 管理台\n\n| 访问地址       | 用户名   | 密码     | 说明 |\n| -------------- | -------- | -------- | ---- |\n| http://ip:5020 | sentinel | sentinel | Sentinel 流量控制 |\n\n<Tip title=\"修改密码\">\n首次登录后，建议立即修改默认密码。各模块的密码修改方式请参考对应的官方文档。\n</Tip>","url":"/doc/pigx/quick-start/pigx-deploy-account"},{"lvl2":"2026-01-16 08:55:00.0","created_unix":1768524900000,"id":67,"lvl0":"【进阶】单体版本部署","content":"<Video><iframe width=\"100%\" height=\"500\" src=\"https://player.dogecloud.com/web/player.html?vcode=53be3611dba549d0&userId=11471&autoPlay=false&inFrame=true\" title=\"本地部署视频教程\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"true\"></iframe></Video>\n\n<Warning title=\"重要说明\">\nPIGX 有且仅有一套代码，同时支持微服务与单体架构运行方式，注意看如下文档！\n</Warning>\n\n## 一、服务端代码运行\n\n### ① 下载源代码\n\n```bash\ngit clone https://git.pig4cloud.com/pig/pigx.git\n```\n\n### ② 设置 Maven boot Profile\n\n<Tip title=\"Maven Profile 配置步骤\">\n如下图：① 点击 IDEA 右侧 Maven 面板； ② 勾选 boot profile； ③ 点击 Maven reload ；直至 ④ 处 被识别为正确的蓝色 Maven module。 （如编译报错，请多次执行 ③ Maven reload）\n</Tip>\n\n<img src=\"https://minio.pigx.top/oss/202405/1715785257.png\" alt=\"Maven Profile 配置界面\" width=\"100%\" />\n\n### ③ 初始化数据库\n\n**数据库脚本说明**\n\n```bash\nsource db/0pigxx_boot.sql\n```\n\n### ④ 修改代码中的数据库和 Redis 连接信息\n\n```bash\n# pigx-boot/application-dev.yml\n├── pigx-boot\n│   ├── src\n│   │   └── main\n│   │       └── resources\n│   │           ├── application-dev.yml\n```\n\n<img src=\"https://minio.pigx.top/oss/1662380660.png\" alt=\"配置文件位置\" width=\"100%\" />\n\n### ⑤ 运行服务端\n\n<img src=\"https://minio.pigx.top/oss/202405/1715785415.png\" alt=\"运行服务端\" width=\"100%\" />\n\n## 二、前端代码运行\n\n### ① 下载源代码\n\n```bash\ngit clone https://git.pig4cloud.com/pig/pigx-ui.git\n```\n\n### ② 指定前端架构\n\n<Warning title=\"前端架构设置为单体\">\n请务必检查前端 `.env` 文件中的 `VITE_IS_MICRO` 配置，需设置为 `false`。\n</Warning>\n\n```bash\nVITE_IS_MICRO=false\n```\n\n<img src=\"https://minio.pigx.top/oss/202304/1681179463.png\" alt=\"前端架构配置\" width=\"100%\" />\n\n### ③ 安装前端依赖\n\n<Warning title=\"Node 版本要求\">\nNode 版本必须使用 18，如遇 install 失败，请删除 node_modules 文件夹，尝试重新 npm install\n</Warning>\n\n```bash\n# 查看 node 版本\nnode -v\n\n# 高版本执行切换至 18\nn 18.20.4\n```\n\n```bash\n# 下载前端源码\ngit clone https://git.pig4cloud.com/pig/pigx-ui.git\n\n# 安装前端依赖\nnpm install --registry=https://registry.npmmirror.com\n\n# 启动\nnpm run dev\n```\n\n## 必看：单体和微服务版本区别\n\n### 关键差异说明\n\n<danger title=\"请求路径差异\">\n**单体版本所有请求统一使用 `/admin` 前缀（context-path）**\n- 登录端点：`http://pigx-gateway:9999/admin/oauth2/token`\n- 接口文档：`http://pigx-gateway:9999/admin/doc.html`\n- **路径变更示例**：微服务版本的 `/pay/order/save` 在单体版本中变更为 `/admin/order/save`\n</danger>\n\n### 功能支持差异\n\n单体版本不支持以下功能：\n\n- ❌ 大屏设计器（[参考文档](https://docs.pig4cloud.com/pig#/doc/pigx/use/pigx-datav)）\n- ❌ 报表设计器（[参考文档](https://docs.pig4cloud.com/pig#/doc/pigx/use/pigx-report-jimu)）\n- ❌ 路由管理、服务监控、流量监控等微服务概念服务\n\n### 配置文件说明\n\n<tip title=\"配置文件加载规则\">\n单体版本配置文件加载规则与微服务版本有所不同，需要将所有的配置项配置在 `pigx-boot` 目录的本地文件中。\n</tip>\n\n| 文件名 | 作用 |\n|-------|------|\n| `application.yml` | 通用配置文件（正常情况下不需要改动） |\n| `application-dev.yml` | 开发环境配置文件（redis, mysql） |","url":"/doc/pigx/quick-start/pigx-boot-deploy"},{"lvl2":"2026-01-16 08:55:00.0","created_unix":1768524900000,"id":71,"lvl0":"【进阶】单体版本CRUD","content":"<Video><iframe width=\"100%\" height=\"500\" src=\"https://player.dogecloud.com/web/player.html?vcode=53be3611dba549d0&userId=11471&autoPlay=false&inFrame=true\" title=\"本地部署视频教程\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"true\"></iframe></Video>\n\n## 1. 使用 pigx archetype 初始化项目\n\n### 1.1 执行 archetype 生成\n<Tabs>\n  <Tab title=\"Windows\">\n```shell\n# 直接在win + R CMD小黑屏里面执行，不要使用 powershell 或者其他终端\nmvn org.apache.maven.plugins:maven-archetype-plugin:3.1.0:generate ^\n      -Dproject=pigx ^\n      -DjavaVersion=17 ^\n      -DgroupId=com.pig4cloud ^\n      -DartifactId=demo ^\n      -Dversion=5.12.0 ^\n      -DarchetypeGroupId=com.pig4cloud.archetype ^\n      -DarchetypeArtifactId=pigx-gen ^\n      -DarchetypeVersion=5.12.0 ^\n      -DarchetypeCatalog=local\n```\n  </Tab>\n  <Tab title=\"MAC\">\n```shell\nmvn org.apache.maven.plugins:maven-archetype-plugin:3.1.0:generate \\\n      -Dproject=pigx \\\n      -DjavaVersion=17 \\\n      -DgroupId=com.pig4cloud \\\n      -DartifactId=demo \\\n      -Dversion=5.12.0 \\\n      -DarchetypeGroupId=com.pig4cloud.archetype \\\n      -DarchetypeArtifactId=pigx-gen \\\n      -DarchetypeVersion=5.12.0 \\\n      -DarchetypeCatalog=local\n```\n  </Tab>\n</Tabs>\n\n\n| 参数                      | 值                       | 备注                    |\n|-------------------------|-------------------------|-----------------------|\n| `-Dproject`             | `pigx`                  | 项目名称，**专属版本需要修改**     |\n| `-DjavaVersion`         | `17`                    | 使用Java版本，只有17一个选项   |\n| `-DgroupId`             | `com.pig4cloud`         | 项目包名前缀 ，**专属版本需要修改**  |\n| `-DartifactId`          | `demo`                 | 新增模块名称 , 不要带特殊字                |\n| `-Dversion`             | `5.12.0`                 | 项目版本号                 |\n| `-DarchetypeGroupId`    | `com.pig4cloud.archetype` | 【固定值】，专属版本**不**需要修改   |\n| `-DarchetypeArtifactId` | `pigx-gen`              | 【固定值】，专属版本**不**需要修改   |\n| `-DarchetypeVersion`    | `5.12.0`                   | 【固定值】，archetype版本 |\n| `-DarchetypeCatalog`    | `local`                 | 【固定值】local            |\n\n### 1.2 生成的项目结构如下\n\n```bash\ndemo\n  ├── README.md\n  ├── demo-api     # api 模块主要存放 实体、feign 调用接口\n  │   ├── pom.xml\n  │   └── src\n  ├── demo-biz    # biz 模块主要存放 controller、业务service、mapper\n  │   ├── pom.xml\n  │   └── src\n  └── pom.xml\n```\n\n### 1.3 pigx-boot/pom.xml 新增 demo module 依赖\n\n<Warning title=\"模块依赖顺序\">\n新增的 demo-biz 模块必须放在 pigx-auth 模块之后，否则无法进行鉴权。\n</Warning>\n\n- ① pigx-boot/pom.xml\n\n- ② 注意引入 demo-biz 在 pigx-auth 依赖之后\n\n- ③ Maven reload\n\n<img src=\"https://minio.pigx.top/oss/202406/1717580585.png\" alt=\"模块依赖配置\" width=\"100%\" />\n\n## 2. 创建库表\n\n```sql\n-- 使用单体版本的核心库，pigxx_boot 库\nUSE pigxx_boot;\n\nSET NAMES utf8mb4;\nSET FOREIGN_KEY_CHECKS = 0;\n\n-- 创建测试表\nDROP TABLE IF EXISTS `demo`;\nCREATE TABLE `demo` (\n  `id` bigint NOT NULL COMMENT '编号',\n  `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '用户名',\n  `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '密码',\n  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '0' COMMENT '删除标记',\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='demo 表';\n```\n\n## 3. 代码生成\n\n### 3.1 数据源新增\n\n```yaml\njdbc:mysql://pigx-mysql:3306/pigxx_boot?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true\n```\n\n<img src=\"https://minio.pigx.top/oss/202307/1688311202.png\" alt=\"数据源配置\" width=\"100%\" />\n\n### 3.2 生成代码\n\n<Tip title=\"配置注意事项\">\n选择数据源生成代码时，请注意包名称和模块名称。\n</Tip>\n\n<img src=\"https://minio.pigx.top/oss/202410/1728047595.png\" alt=\"代码生成配置\" width=\"100%\" />\n\n### 3.3 菜单维护\n\n<Tabs>\n<Tab title=\"自动维护菜单\">\n当代码生成基础信息中配置此功能的【所属菜单】时，会自动维护相关的菜单和按钮，不需要手动执行SQL脚本。\n<img src=\"https://minio.pigx.top/oss/202408/1723989187.png\" alt=\"自动维护菜单\" width=\"100%\" />\n</Tab>\n<Tab title=\"手动维护菜单\">\n<Tip title=\"执行SQL脚本\">\n执行代码生成包（3.2 中的 demo_menu.sql）中的 SQL 脚本（在 pigxx 数据库）。\n</Tip>\n<img src=\"https://minio.pigx.top/oss/202312/1701610364.png\" alt=\"手动维护菜单\" width=\"100%\" />\n</Tab>\n</Tabs>\n\n## 4. 角色分配权限\n\n<Warning title=\"重要步骤\">\n给角色分配权限（角色管理 > 权限）。在重新启动前端并重新登录后，请强制刷新浏览器，查看 demo 功能是否生效。\n</Warning>\n\n<img src=\"https://minio.pigx.top/oss/202310/1697018891.png\" alt=\"角色分配权限\" width=\"100%\" />","url":"/doc/pigx/quick-start/pigx-boot-new-app"},{"lvl2":"2026-01-16 08:55:00.0","created_unix":1768524900000,"id":74,"lvl0":"【进阶】移动端小程序部署","content":"<Video><iframe width=\"100%\" height=\"500\" src=\"https://player.dogecloud.com/web/player.html?vcode=ab863e75f74cbddc&userId=11471&autoPlay=false&inFrame=true\" title=\"本地部署视频教程\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"true\"></iframe></Video>\n\n## 文档说明\n\n- 前端基于 [uniapp](https://zh.uniapp.dcloud.io/)，并使用 uviewui [组件使用文档](https://v1.uviewui.com/components/intro.html) 进行扩展，支持 uviewui vue3.0 [vk-uview-ui](https://gitee.com/vk-uni/vk-uview-ui)。\n\n- 样式上支持 tailwindcss，[无需书写 CSS，只需书写 HTML 代码就可快速构建美观的网站](https://www.tailwindcss.cn/)。\n\n## 准备工作\n\n### 下载微信开发工具\n\n- [下载微信开发者工具](https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html)\n\n### 配置小程序 APPID/AppSecret\n\n- 获取微信小程序配置信息\n\n<img src=\"https://minio.pigx.top/oss/202306/1687532116.png\" alt=\"微信小程序配置\" width=\"100%\" />\n\n- 在 APP 密钥管理中添加相应的小程序配置信息\n\n<img src=\"https://minio.pigx.top/oss/202306/1687532173.png\" alt=\"APP 密钥管理\" width=\"100%\" />\n\n## ① 下载 PIGX 移动端并安装依赖\n\n```bash\ngit clone https://git.pig4cloud.com/big/pigx-app.git\ncd pigx-app\nnpm install  --registry=https://registry.npmmirror.com\n```\n\n## ② 开发工具导入项目\n\n- 配置相应的服务端架构，并设置 pigx 网关地址\n\n<img src=\"https://minio.pigx.vip/oss/202508/F0l20M.png\" alt=\"服务端架构配置\" width=\"100%\" />\n\n- 修改 src/manifest.json 文件的 APPID\n\n<img src=\"https://minio.pigx.top/oss/202306/1687531695.png\" alt=\"配置 APPID\" width=\"100%\" />\n\n- 执行以下命令以编译项目源码\n\n```bash\nnpm run dev:mp-weixin\n```\n\n## ③ 微信开发者工具导入\n\n选择项目并导入 pigx-app/dist/dev/mp-weixin 目录\n\n<img src=\"https://minio.pigx.top/oss/202601/iSboFL.png\" alt=\"导入项目\" width=\"100%\" />\n\n<Warning title=\"开发环境配置\">\n注意在开发环境中配置不校验合法域名。\n</Warning>\n\n<img src=\"https://minio.pigx.top/oss/202306/1687533749.png\" alt=\"不校验合法域名\" width=\"100%\" />\n\n## ④ 部署发布\n\n- 在微信开发者工具顶部点击 \"上传至微信小程序官方后台\"，然后提交官方审核\n\n<img src=\"https://minio.pigx.top/oss/202306/1687589632.png\" alt=\"上传小程序\" width=\"100%\" />\n\n- 等待微信官方审核完毕后，在微信小程序官方后台点击 \"全量发布\"\n\n<Tip title=\"域名配置\">\n注意在开发管理中维护正确的 pigx-ui 域名。\n</Tip>\n\n<img src=\"https://minio.pigx.top/oss/202306/1687589559.png\" alt=\"域名配置\" width=\"100%\" />\n\n## C 端登录流程说明\n\n<Tip title=\"场景说明\">\n小程序对接的是 C 端用户（app_user 表），而非 B 端管理员用户（sys_user 表）。本节仅提供 Token 发放和小程序登录的对接方向，实际开发需根据业务自行实现前端页面和后端逻辑。\n</Tip>\n\n小程序用户登录基于 OAuth2 密码模式，通过携带特殊请求头 `HEADER_TOC: Y` 区分 C 端用户，认证服务会路由到专属的用户详情服务加载 `app_user` 数据。\n\n```mermaid\nflowchart LR\n  A[小程序端] -->|POST /oauth2/token\\n携带 HEADER_TOC: Y| B[pigx-auth 认证服务]\n  B -->|根据请求头判断用户类型| C[PigxTocDefaultUserDetailsServiceImpl]\n  C -->|Feign 调用| D[pigx-app-server\\n/appuser/info/username]\n  D -->|查询 app_user 表| E[返回 AppUserInfo]\n  E --> C\n  C -->|构造 AppUser\\nUserTypeEnum.TOC| B\n  B -->|签发 Token| A\n  A -->|携带 Token 访问业务接口| F[pigx-gateway 网关]\n  F --> G[pigx-app-server 业务接口]\n```\n\n### 关键设计\n\n**用户表区分**\n\n| 用户类型 | 数据表 | 使用场景 |\n| --- | --- | --- |\n| B 端管理员 | `sys_user` | PC 管理后台登录 |\n| C 端用户 | `app_user` | 移动端小程序登录 |\n\n**TOC 路由标识**\n\n请求头 `HEADER_TOC: Y` 是区分 C 端登录的核心标识。认证服务通过该请求头决定使用 `PigxTocDefaultUserDetailsServiceImpl` 加载用户，最终构造 `UserTypeEnum.TOC` 类型的 `AppUser`。\n\n<img src=\"https://minio.pigx.vip/oss/202603/51vpvm.png\" alt=\".env 配置示例\" width=\"100%\" />\n\n`.env` 文件中 `VITE_APP_TOC` 默认值为 `true`，表示请求 C 端（`app_user`）用户体系。若需对接 B 端（`sys_user`）管理员用户，将该值修改为 `false` 即可，认证服务会自动路由到对应的用户详情服务。\n\n<Warning title=\"业务扩展说明\">\nPIGX 提供的是 Token 发放和用户加载的基础框架。微信小程序的 code 换取 openid、绑定手机号等业务逻辑需根据实际需求自行实现，对接路径参考 app_user 表的 wx_openid 字段。\n</Warning>","url":"/doc/pigx/quick-start/pigx-front-uniapp"},{"lvl2":"2026-01-16 08:55:00.0","created_unix":1768524900000,"id":77,"lvl0":"【进阶】移动端 H5 部署","content":"<Video><iframe width=\"100%\" height=\"500\" src=\"https://player.dogecloud.com/web/player.html?vcode=8a738add235a72c7&userId=11471&autoPlay=false&inFrame=true\" title=\"本地部署视频教程\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"true\"></iframe></Video>\n\n\n## ① 下载 PIGX 移动端并安装依赖\n\n```bash\ngit clone https://git.pig4cloud.com/big/pigx-app.git\ncd pigx-app\nnpm install  --registry=https://registry.npmmirror.com\n```\n\n## ② 导入项目到开发工具\n\n- 配置相应的服务端架构，并设置 pigx 网关地址，以及开启 H5 模式\n\n<img src=\"https://minio.pigx.vip/oss/202508/ugzJlN.png\" alt=\"H5 模式配置\" width=\"100%\" />\n\n- 执行以下命令编译项目源码\n\n```bash\nnpm run dev:h5\n```\n\n<Tip title=\"默认账号密码\">\n默认用户密码为 app_user 数据：appuser/123456\n</Tip>\n\n## ③ NGINX 部署发布\n\n### 构建生产资源\n\n```bash\nnpm run build:h5\n```\n\n<img src=\"https://minio.pigx.top/oss/202306/1687841914.png\" alt=\"构建产物\" width=\"100%\" />\n\n```bash\n├── assets\n├── index.html\n└── static\n```\n\n### 配置生产环境中的 nginx\n\n```sh\nserver {\n    listen 28080;\n    server_name localhost;\n\n    # 将上述步骤构建的产物放在 /path/mobile/index.html，注意在 path 下新建 mobile路径\n    root /path/;\n\n    location ^~/api/ {\n        proxy_pass http://pigx-gateway:9999/; #注意/后缀\n        proxy_connect_timeout 60s;\n        proxy_read_timeout 120s;\n        proxy_send_timeout 120s;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header X-Forwarded-Proto http;\n        proxy_http_version 1.1;\n        proxy_set_header Upgrade $http_upgrade;\n        proxy_set_header Connection \"upgrade\";\n        proxy_set_header Host $http_host;\n    }\n\n    # 转发H5 请求后端静态资源的请求\n    location /mobile/api/ {\n        proxy_pass http://pigx-gateway:9999/; #注意/后缀\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header X-Forwarded-Proto http;\n        proxy_http_version 1.1;\n    }\n\n   location / {\n      try_files $uri $uri/ /mobile/index.html;\n   }\n}\n```","url":"/doc/pigx/quick-start/pigx-front-h5"},{"lvl2":"2026-01-16 08:55:00.0","created_unix":1768524900000,"id":80,"lvl0":"【进阶】移动端应用打包","content":"<Video><iframe width=\"100%\" height=\"500\" src=\"https://player.dogecloud.com/web/player.html?vcode=b4434809df6ce592&userId=11471&autoPlay=false&inFrame=true\" title=\"本地部署视频教程\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"true\"></iframe></Video>\n\n<Tip title=\"版本说明\">\n本文适用于 v5.6 版本，目前仅对安卓版本提供了初步支持，IOS 版本未测试。\n</Tip>\n\n## 前置条件：配置应用开启跨域\n\n- 请确保后端服务已经开启跨域支持，否则 APP 将无法正常访问后端服务\n\n- 跨域配置参考文档：[服务配置 CORS 跨域](https://docs.pig4cloud.com/pig#/doc/pigx/back-end/pigx-gateway-cors)\n\n## 下载 PIGX 移动端应用并安装依赖\n\n```bash\ngit clone https://git.pig4cloud.com/big/pigx-app.git\ncd pigx-app\nnpm install --registry=https://registry.npmmirror.com\n```\n\n<Tip title=\"依赖安装\">\n推荐使用国内镜像源加速依赖安装，如果安装失败可以尝试删除 `node_modules` 目录和 `package-lock.json` 文件后重新安装。\n</Tip>\n\n## 安装 HbuilderX 开发工具\n\n- 下载 [HbuilderX](https://hx.dcloud.net.cn/Tutorial/install/windows) 并安装\n\n- 导入 `pigx-app` 至 HbuilderX，并进行以下配置修改\n\n<img src=\"https://minio.pigx.top/oss/202311/1700822178.png\" alt=\"HbuilderX 配置\" width=\"100%\" />\n\n<Tip title=\"配置修改\">\n在 HbuilderX 中打开项目后，需要根据实际的后端服务地址修改配置文件中的 API 接口地址。\n</Tip>\n\n## 运行调试\n\n<Warning title=\"设备连接\">\n运行调试前，请确保通过 USB 连接安卓手机至电脑，并开启手机的 USB 调试模式。\n</Warning>\n\n- 在 HbuilderX 中，选择 **运行** > **运行到手机或模拟器** > **运行到 Android App 基座**\n\n- 等待编译完成后，应用会自动安装到连接的安卓设备上\n\n<img src=\"https://minio.pigx.top/oss/202311/1700822213.png\" alt=\"运行调试配置\" width=\"100%\" />\n\n## 特别说明 - 苹果 M 系列芯片运行\n\n<Warning title=\"M 系列芯片\">\n如果使用苹果 M1 芯片的电脑进行调试开发，需要进行以下特殊配置。\n</Warning>\n\n安装完依赖 `npm install` 后，找到 `esbuild` 目录中的 `darwin-arm64`，复制一份并重命名为 `darwin-x64`，否则将在后续调试中报错。\n\n```bash\n# 进入 esbuild 目录\ncd node_modules/@esbuild\n\n# 复制 darwin-arm64 并重命名为 darwin-x64\ncp -r darwin-arm64 darwin-x64\n```","url":"/doc/pigx/quick-start/pigx-front-app"},{"lvl2":"2026-01-16 08:55:00.0","created_unix":1768524900000,"id":82,"lvl0":"【运行】运行快照版本","content":"<Warning title=\"快照版本说明\">\n快照（SNAPSHOT）是一种特殊的版本，指定了某个当前的开发进度的副本。通过提前运行快照版本体验下个版本的相关的功能和功能特性。  \n快照版本仅供测试使用，不建议在正式环境使用。\n</Warning>\n\n## 下载源码\n\n```bash\ngit clone https://git.pig4cloud.com/pig/pigx.git -b dev\n\n# 前端\ngit clone https://git.pig4cloud.com/pig/pigx-ui.git -b dev\n```\n\n## 微服务模式运行\n\n<img src=\"https://minio.pigx.top/oss/202404/1713838469.png\" alt=\"微服务模式配置\" width=\"100%\" />\n\n- ① IDEA 导入源码后，点开右侧 Maven 面板\n\n- ② 勾选 cloud profile\n\n- ③ 选择 pigx 整个模块\n\n- ④ 执行 Maven reload\n\n部署运行参考：[系统快速上手部署](/data/doc/pigx/quick-start/pigx-deploy.html)\n\n## 单体模式运行\n\n<img src=\"https://minio.pigx.top/oss/202404/1713838699.png\" alt=\"单体模式配置\" width=\"100%\" />\n\n- ① IDEA 导入源码后，点开右侧 Maven 面板\n\n- ② 勾选 boot profile\n\n- ③ 选择 pigx 整个模块\n\n- ④ 执行 Maven reload 至 ⑤ pigx-boot 显示为 Maven module\n\n### 数据库初始化\n\n- ① 创建 pigxx_boot 数据库\n\n```sql\n-- pigx 核心表\ncreate database `pigxx_boot` default character set utf8mb4 collate utf8mb4_general_ci;\n```\n\n- ② 将原有的数据库 SQL ，在 pigx-boot 数据库执行\n\n<Tip title=\"数据库架构说明\">\n单体模式下，所有 module 公用一个 pigx-boot 数据库，微服务模式下，一个微服务对应一个数据库。\n</Tip>\n\n<img src=\"https://minio.pigx.top/oss/202404/1713839039.png\" alt=\"数据库初始化\" width=\"100%\" />\n\n### 配置修改启动\n\n<img src=\"https://minio.pigx.top/oss/202404/1713839192.png\" alt=\"配置修改\" width=\"100%\" />\n\n- 修改 pigx-boot/application-dev.yml 对应的数据库和 redis 链接信息\n\n- 运行 pigx-boot/PigxBootApplication 启动单体模式","url":"/doc/pigx/quick-start/pigx-snapshot"},{"lvl2":"2026-01-16 08:55:00.0","created_unix":1768524900000,"id":85,"lvl0":"浏览器兼容性","content":"## 浏览器支持情况\n\n| 浏览器 | Edge | Firefox | Chrome | Safari |\n| :----: | :--: | :-----: | :----: | :----: |\n| Logo | ![](https://cdn.jsdelivr.net/npm/@browser-logos/edge/edge_32x32.png) | ![](https://cdn.jsdelivr.net/npm/@browser-logos/firefox/firefox_32x32.png) | ![](https://cdn.jsdelivr.net/npm/@browser-logos/chrome/chrome_32x32.png) | ![](https://cdn.jsdelivr.net/npm/@browser-logos/safari/safari_32x32.png) |\n| 最低版本 | >=88 | >=78 | >=87 | >=13 |\n\n## 特别说明\n\n> **注意**：由于 [Vue3](https://v3.cn.vuejs.org/guide/introduction.html) 不再支持 IE11，故而 [ElementPlus](https://element-plus.gitee.io/zh-CN/guide/design.html) 也不支持 IE11 及之前版本。","url":"/doc/pigx/front-end/pigx-front-compatible"},{"lvl2":"2026-01-16 08:55:00.0","created_unix":1768524900000,"id":88,"lvl0":"前端配置项说明","content":"## 主题配置文件\n\n前端主题配置文件位于 `src/stores/themeConfig.ts`，用于管理全局主题、布局、界面显示等配置。\n\n<Warning title=\"配置修改后生效\">\n- 1、需要每次都清理 `window.localStorage` 浏览器永久缓存\n- 2、或者点击布局配置最底部 `一键恢复默认` 按钮即可看到效果\n</Warning>\n\n<Tabs>\n  <Tab title=\"新版\">自 V5.12.1 起，网站 Logo、网站标题、备案/版权信息、隐私提示以及登录页相关开关优先在网站配置的图形化界面中维护。![](https://minio.pigx.vip/oss/202604/x0QYvm.png)</Tab>\n  <Tab title=\"旧版\">本文保留 `themeConfig.ts` 的本地配置说明，适用于未接入网站配置中心的历史版本或需要自定义布局主题的场景。</Tab>\n</Tabs>\n\n## 配置项详细说明\n\n| 配置项 | 默认值 | 描述 |\n| --- | --- | --- |\n| isDrawer | false | 是否开启布局配置抽屉 |\n| primary | #2E5CF6 | 全局主题默认 primary 主题颜色 |\n| isDark | false | 是否开启深色模式 |\n| topBar | #ffffff | 顶栏设置默认顶栏导航背景颜色 |\n| topBarColor | #606266 | 顶栏设置默认顶栏导航字体颜色 |\n| isTopBarColorGradual | false | 顶栏设置是否开启顶栏背景颜色渐变 |\n| menuBar | #FFFFFF | 菜单设置默认菜单导航背景颜色 |\n| menuBarColor | #505968 | 菜单设置默认菜单导航字体颜色 |\n| menuBarActiveColor | rgba(242... | 菜单设置默认菜单高亮背景色 |\n| isMenuBarColorGradual | false | 菜单设置是否开启菜单背景颜色渐变 |\n| columnsMenuBar | #545c64 | 分栏设置默认分栏菜单背景颜色 |\n| columnsMenuBarColor | #e6e6e6 | 分栏设置默认分栏菜单字体颜色 |\n| isColumnsMenuBarColorGradual | false | 分栏设置是否开启分栏菜单背景颜色渐变 |\n| isColumnsMenuHoverPreload | false | 分栏设置是否开启分栏菜单鼠标悬停预加载(预览菜单) |\n| isCollapse | false | 界面设置是否开启菜单水平折叠效果 |\n| isUniqueOpened | true | 界面设置是否开启菜单手风琴效果 |\n| isFixedHeader | false | 界面设置是否开启固定 Header |\n| isFixedHeaderChange | false | 初始化变量，用于更新菜单 el-scrollbar 的高度，请勿删除 |\n| isClassicSplitMenu | false | 界面设置是否开启经典布局分割菜单（仅经典布局生效） |\n| isLockScreen | false | 界面设置是否开启自动锁屏 |\n| lockScreenTime | 30 | 界面设置开启自动锁屏倒计时(s/秒) |\n| isShowLogo | true | 界面显示是否开启侧边栏 Logo |\n| isShowLogoChange | false | 初始化变量，用于 el-scrollbar 的高度更新，请勿删除 |\n| isBreadcrumb | true | 界面显示是否开启 Breadcrumb，强制经典、横向布局不显示 |\n| isTagsview | true | 界面显示是否开启 Tagsview |\n| isBreadcrumbIcon | false | 界面显示是否开启 Breadcrumb 图标 |\n| isTagsviewIcon | false | 界面显示是否开启 Tagsview 图标 |\n| isCacheTagsView | true | 界面显示是否开启 TagsView 缓存 |\n| isSortableTagsView | true | 界面显示是否开启 TagsView 拖拽 |\n| isShareTagsView | false | 界面显示是否开启 TagsView 共用 |\n| isFooter | true | 界面显示是否开启 Footer 底部版权信息 |\n| isGrayscale | false | 界面显示是否开启灰色模式 |\n| isInvert | false | 界面显示是否开启色弱模式 |\n| isWartermark | true | 界面显示是否开启水印 |\n| wartermarkText | PigX | 界面显示水印文案 |\n| quickLinkNum | 12 | 首页快捷导航数量上限 |\n| tagsStyle | tags-style-five | 其它设置 Tagsview 风格，默认 tags-style-five |\n| animation | slide-right | 其它设置主页面切换动画，默认 slide-right |\n| columnsAsideStyle | columns-round | 其它设置分栏高亮风格，默认 columns-round |\n| columnsAsideLayout | columns-vertical | 其它设置分栏布局风格，默认 columns-horizontal |\n| layout | defaults | 布局设置，默认 defaults |\n| isRequestRoutes | true | 后端控制路由是否开启 |\n| globalTitle | PIGX ADMIN | 全局网站标题 / 副标题-网站主标题（菜单导航、浏览器当前网页标题、登录 form 顶部右侧） |\n| globalViceTitle | PigX 快速开发框架 | 全局网站标题 / 副标题-网站副标题（登录左侧底部页顶部文字） |\n| globalViceTitleMsg | 专注、免费、开源、维护、解疑 | 全局网站标题 / 副标题-网站副标题（登录页顶部文字） |\n| globalI18n | zh-cn | 全局网站标题 / 副标题-默认初始语言，可选值\"<zh-cn / en / zh-tw>\" |\n| globalComponentSize | 'default' | 全局网站标题 / 副标题-默认全局组件大小，可选值\"<large / 'default' / small>\" |\n| footerAuthor | ©2023 pig4cloud.com | 全局网站标题 / 副标题-footer 页面作者 |\n\n<Tip title=\"配置分类\">\n配置项按功能分为：主题颜色、菜单设置、界面设置、界面显示、其它设置、布局设置等类别。\n</Tip>\n\n## 重要配置项说明\n\n### 主题颜色配置\n\n- **primary** - 全局主题色，影响按钮、链接等元素的颜色\n- **isDark** - 深色模式开关，适配暗黑主题\n\n<Tip title=\"主题色自定义\">\n修改 primary 颜色后，系统会自动生成相应的浅色和深色变体，无需手动配置。\n</Tip>\n\n### 菜单和顶栏配置\n\n- **menuBar** / **topBar** - 菜单和顶栏的背景颜色\n- **menuBarColor** / **topBarColor** - 菜单和顶栏的字体颜色\n- **isMenuBarColorGradual** / **isTopBarColorGradual** - 是否开启渐变背景\n\n### 界面设置\n\n- **isCollapse** - 菜单折叠开关\n- **isUniqueOpened** - 手风琴模式，同时只展开一个菜单\n- **isFixedHeader** - 固定顶栏，滚动时顶栏不动\n- **isLockScreen** - 自动锁屏功能\n- **lockScreenTime** - 自动锁屏倒计时（秒）\n\n<Warning title=\"手风琴模式\">\n开启手风琴模式后，同时只能展开一个菜单项，关闭其他已展开的菜单。\n</Warning>\n\n### TagsView 配置\n\n- **isTagsview** - 是否显示标签页\n- **isCacheTagsView** - 是否缓存标签页内容\n- **isSortableTagsView** - 是否允许拖拽排序\n- **isShareTagsView** - 是否共用详情页标签\n\n<Tip title=\"TagsView 共用说明\">\n开启共用模式后，详情页在 tagsView 只会出现一个；关闭后会出现多个详情页标签。\n</Tip>\n\n### 布局和样式\n\n- **layout** - 布局类型（defaults、classic、transverse、columns）\n- **tagsStyle** - 标签页风格\n- **animation** - 页面切换动画\n- **columnsAsideStyle** - 分栏高亮风格\n\n### 水印配置\n\n- **isWartermark** - 是否开启水印\n- **wartermarkText** - 水印文案内容\n\n<Danger title=\"生产环境水印\">\n生产环境建议开启水印功能，可有效防止信息泄露和截图传播。\n</Danger>\n\n## 图形化配置\n\n<Tip title=\"可视化配置\">\n可通过界面操作方式进行配置，点击左上角图标打开布局配置抽屉。\n所有配置项都可以通过界面可视化操作，实时预览效果，无需修改代码。\n</Tip>\n\n\n<img src=\"https://minio.pigx.top/oss/202304/1681738432.png\" alt=\"布局配置界面\" width=\"50%\" />\n","url":"/doc/pigx/front-end/pigx-front-config-setting"},{"lvl2":"2026-01-16 08:55:00.0","created_unix":1768524900000,"id":91,"lvl0":"前端ENV环境配置","content":"## 环境变量配置\n\n前端项目使用 Vite 的环境变量配置系统，通过 `.env` 文件管理不同环境的配置项。\n\n<Tip title=\"配置文件位置\">\n环境变量配置文件位于项目根目录，包括 `.env`、`.env.development`、`.env.development.local`、`.env.local` 等文件。\n</Tip>\n\n<Tabs>\n  <Tab title=\"新版\">自 V5.12.1 起，站点相关配置优先通过网站配置的图形化界面维护，包括网站 Logo、网站标题、备案/版权信息、隐私提示、Clarity ID、验证码模式、前端注册、国际化切换、亮暗模式、反调试保护、钉钉导入和企业微信导入等。</Tab>\n  <Tab title=\"旧版\">未接入网站配置中心的版本，仍按本文通过 `.env` 方式维护相关变量。</Tab>\n</Tabs>\n\n## 配置项说明\n\n| 配置项 | 值 | 描述 |\n| --- | --- | --- |\n| **VITE_IS_MICRO** | `true` | 是否是微服务架构（重要），因为单体和微服务版本共用一套前端 |\n| **VITE_GLOBAL_TITLE** | `'PIGX ADMIN'` | 旧版网站主标题配置，新版请在网站配置中维护 |\n| **VITE_FOOTER_TITLE** | `'©2024 pig4cloud.com'` | 旧版页脚信息配置，新版请在网站配置中维护 |\n| **VITE_PUBLIC_PATH** | `/` | 前端访问前缀 |\n| **VITE_API_URL** | `/api` | 后端请求前缀 |\n| **VITE_ADMIN_PROXY_PATH** | `http://localhost:9999` | ADMIN 服务地址 |\n| **VITE_PWD_ENC_KEY** | `'pigxpigxpigxpigx'` | 前端加密密钥（16位，具体参考文档前端报文加密） |\n| **VITE_OAUTH2_PASSWORD_CLIENT** | `'pig:pig'` | OAUTH2 密码模式客户端信息 |\n| **VITE_OAUTH2_MOBILE_CLIENT** | `'app:app'` | OAUTH2 短信客户端信息 |\n| **VITE_OAUTH2_SOCIAL_CLIENT** | `'social:social'` | OAUTH2 社交登录客户端信息 |\n| **VITE_VERIFY_ENABLE** | `true` | 旧版前端验证码开关，新版请在网站配置中选择验证码模式 |\n| **VITE_VERIFY_IMAGE_ENABLE** | `false` | 旧版前端图形验证码开关，新版请在网站配置中选择验证码模式 |\n| **VITE_WEBSOCKET_ENABLE** | `false` | 是否开启 WebSocket 消息接收 |\n| **VITE_REGISTER_ENABLE** | `true` | 旧版注册开关，新版请在网站配置中维护前端注册 |\n| **VITE_AUTO_TENANT** | `false` | 是否开启租户自动选择（根据租户域名） |\n| **VITE_I18N_ENABLE** | `true` | 旧版登录页多语言切换开关，新版请在网站配置中维护国际化切换 |\n| **VITE_DARK_MODE_ENABLE** | `true` | 旧版登录页暗黑模式切换开关，新版请在网站配置中维护亮暗模式 |\n| **VITE_ENABLE_ANTI_DEBUG** | `false` | 旧版反调试开关，新版请在网站配置中维护反调试保护 |\n| **VITE_ANTI_DEBUG_KEY** | `pig` | 旧版反调试绕过参数值，新版请在网站配置中维护绕过密钥（URL中 `?ddtk=参数值`） |\n| **VITE_GRAY_VERSION** | 无 | 对应灰度路由的 header Version |\n| **VITE_API_ENC_ENABLED** | `false` | 是否开启请求加解密 |\n| **VITE_SM4_ENC_KEY** | 无 | SM4 请求加解密密钥，配置后自动使用 SM4（要求32位） |\n| **VITE_SYNC_DINGTALK_ENABLED** | `false` | 旧版钉钉同步功能开关，新版请在网站配置中维护钉钉导入 |\n| **VITE_SYNC_WECHAT_ENABLED** | `false` | 旧版企微同步功能开关，新版请在网站配置中维护企业微信导入 |\n| **VITE_CUSTOM_HOMEPAGE_ENABLE** | `false` | 是否开启自定义首页功能（v5.11） |\n\n<Tip title=\"网站配置覆盖范围\">\nLogo、网站标题、备案/版权信息、隐私提示和 Clarity ID 等站点信息也已经迁移到网站配置的图形化界面中维护。\n</Tip>\n\n<Warning title=\"旧版配置修改后生效\">\n修改 `VITE_GLOBAL_TITLE` 或 `VITE_FOOTER_TITLE` 等配置项后，需要清空浏览器 localStorage 缓存才能生效。\n</Warning>\n\n## 环境文件说明\n\n- `.env` - 所有环境的基础配置\n- `.env.development` - 开发环境配置\n- `.env.development.local` - 本地开发环境配置（优先级最高，不纳入版本控制）\n- `.env.local` - 本地环境配置（不纳入版本控制）\n\n<Tip title=\"环境变量加载优先级\">\nVite 会按照优先级加载环境变量，`.env.development.local` > `.env.development` > `.env.local` > `.env`。\n</Tip>\n\n## 常见配置示例\n\n### 微服务模式配置\n\n```bash\nVITE_IS_MICRO=true\nVITE_ADMIN_PROXY_PATH=http://localhost:9999\n```\n\n### 单体模式配置\n\n```bash\nVITE_IS_MICRO=false\nVITE_ADMIN_PROXY_PATH=http://localhost:8080\n```\n\n### 开启验证码\n\n```bash\nVITE_VERIFY_ENABLE=true\nVITE_VERIFY_IMAGE_ENABLE=true\n```\n\n<Danger title=\"密钥安全\">\n`VITE_PWD_ENC_KEY` 为 AES 前端加密密钥，生产环境请务必修改为自定义值，长度必须为 16 位。使用 SM4 时请配置 `VITE_SM4_ENC_KEY`，密钥必须为 32 位 HEX 字符串。\n</Danger>\n","url":"/doc/pigx/front-end/pigx-front-env-config"},{"lvl2":"2026-01-16 08:55:00.0","created_unix":1768524900000,"id":95,"lvl0":"前端目录结构","content":"## 项目目录结构\n\n前端项目采用 Vite + Vue3 + TypeScript 技术栈，目录结构清晰，便于开发和维护。\n\n```bash\n├── src/                          # 源代码目录\n│   ├── api/                      # API 接口定义\n│   ├── assets/                   # 静态资源\n│   ├── components/               # 公共组件\n│   ├── directive/                # Vue 自定义指令\n│   ├── hooks/                    # Vue Composition API hooks\n│   ├── i18n/                     # 国际化相关\n│   ├── layout/                   # 布局组件\n│   ├── locales/                  # 语言包\n│   ├── router/                   # Vue Router 配置\n│   ├── stores/                   # Pinia 状态管理\n│   ├── theme/                    # 主题相关\n│   ├── types/                    # TypeScript 类型定义\n│   ├── utils/                    # 工具函数\n│   ├── views/                    # 页面组件\n│   ├── App.vue                   # 根组件\n│   └── main.ts                   # 应用入口文件\n├── public/                       # 公共静态资源\n├── docker/                       # Docker 相关配置\n├── index.html                    # HTML 入口文件\n├── vite.config.ts                # Vite 配置\n├── tsconfig.json                 # TypeScript 配置\n├── tailwind.config.js            # Tailwind CSS 配置\n├── postcss.config.js             # PostCSS 配置\n├── package.json                  # 项目依赖配置\n├── .env                          # 环境变量\n├── .env.development              # 开发环境变量\n├── .env.development.local        # 本地开发环境变量\n├── .env.local                    # 本地环境变量\n├── .eslintrc.js                  # ESLint 配置\n└── .prettierrc.js                # Prettier 配置\n```\n\n## 核心目录说明\n\n### api 目录\n\n存放所有 API 接口定义，按功能模块划分。\n\n<Tip title=\"接口管理规范\">\n建议按照后端模块划分文件，如 `user.ts`、`role.ts` 等，每个文件导出对应的接口方法。\n</Tip>\n\n### components 目录\n\n存放全局公共组件，可在任意页面中复用。\n\n### layout 目录\n\n存放布局相关组件，包括菜单栏、顶栏、标签页、主内容区等。\n\n<Warning title=\"布局配置修改\">\n清空浏览器永久缓存或者点击 `布局配置 -> 一键恢复默认`，前提是修改了 `/src/stores/themeConfig.ts` 配置文件内容。添加或者修改功能，请前往 `/src/layout/navBars/breadcrumb/setings.vue` 组件位置修改。\n</Warning>\n\n### stores 目录\n\n使用 Pinia 进行状态管理，按功能模块划分 store。\n\n### theme 目录\n\n存放主题相关样式文件，支持自定义全局主题。\n\n### views 目录\n\n存放页面组件，按功能模块划分目录。\n\n## 布局说明\n\n<Warning title=\"布局配置方式\">\n可视化操作：左上角 `icon` 图标点击打开布局配置，所有配置功能都在这个里面。\n代码操作：修改 `/src/stores/themeConfig.ts` 文件。\n</Warning>\n\n包含：`菜单栏`、`顶栏`、`tagsView 标签页`、`主内容区`。\n\n## 全局主题\n\n### 目录结构\n\n```ts\n├── theme (页面样式)\n  ├── common (基础样式)\n  │  ├── transition.scss (页面过渡动画)\n  │  └── var.scss (全局主题样式，用于全局改变样式)\n  │\n  ├── media (媒体查询)\n  │  ├── chart.scss (大数据图表)\n  │  ├── cityLinkage.scss (Cascader 级联选择器城市选择)\n  │  ├── dialog.scss (弹窗)\n  │  ├── error.scss (404、401界面)\n  │  ├── form.scss (表单)\n  │  ├── home.scss (首页)\n  │  ├── index.scss (媒体查询定义主样式)\n  │  ├── layout.scss (框架布局)\n  │  ├── login.scss (登录界面)\n  │  ├── media.scss (媒体查询主出口)\n  │  ├── pagination.scss (分页)\n  │  ├── personal.scss (个人中心)\n  │  ├── scrollbar.scss (页面滚动条)\n  │  └── tagsView.scss (tagsView 标签页)\n  │\n  ├── mixins (scss混入)\n  │  ├── element-mixins.scss (定义重置的element plus混入复用样式)\n  │  ├── function.scss (全局主题颜色调用混入函数)\n  │  └── mixins.scss (定义一些常用的全局混入样式)\n  │\n  ├── app.scss (页面主样式，用于重置浏览器默认样式)\n  ├── base.scss (基础样式、过渡动画引入等)\n  ├── dark.scss (深色主题)\n  ├── element.scss (重置的element plus样式，用于改变主题)\n  ├── iconSelector.scss (图标选择器)\n  ├── index.scss (页面样式主出口)\n  ├── loading.scss (loading样式)\n  ├── other.scss (其它样式)\n  └── waves.scss (按钮波浪样式)\n```\n\n### scss 部分函数说明\n\n#### scss @mixin\n\n定义：[scss 官方中文文档](https://www.sass.hk/docs/)，具体请查阅官方文档。使用方法：\n\n```scss\n/* Button 按钮\n------------------------------- */\n@mixin Button($main, $c1, $c2) {\n  color: set-color($main);\n  background: set-color($c1);\n  border-color: set-color($c2);\n}\n```\n\n页面中使用，先引入，然后在 `css` 类中通过 `@include` 使用：\n\n```scss\n@import \"mixins/element-mixins.scss\";\n\n// default\n.el-button--default:hover,\n.el-button--default:focus {\n  @include Button(primary, primary-light-8, primary-light-6);\n}\n```\n\n#### scss @function\n\n定义函数：\n\n```scss\n/* 颜色调用函数\n------------------------------- */\n@function set-color($key) {\n  @return var(--color-#{$key});\n}\n```\n\n不理解？请看这个 `css3 :root` [CSS var() 函数](https://www.runoob.com/cssref/func-var.html)：\n\n```scss\n/* 定义一个名为 \"--main-bg-color\" 的属性，然后使用 var() 函数调用该属性： */\n:root {\n  --main-bg-color: red;\n}\n\n#div1 {\n  background-color: var(--main-bg-color);\n}\n\n#div2 {\n  background-color: var(--main-bg-color);\n}\n```\n\n#### 为什么不使用这种写法放进 :root 中？\n\n<Warning title=\"scss 嵌套限制\">\n因为 scss 不支持这种嵌套 `mix(var(--color-primary), var(--color-success), 10%)`，lighten / darken / saturate / desaturate 等，从而无法用 `document.documentElement.style.setProperty('--color-primary', 'blue');` 改变样式。\n</Warning>\n\n```scss\n$colors: (\n  primary: #409eff,\n  success: #67c23a,\n  info: #909399,\n  warning: #e6a23c,\n  danger: #f56c6c\n)\n\n:root {\n  @each $key, $value in $colors {\n    --color-#{$key}: #{$value};\n  }\n}\n```\n\n### 自定义全局主题\n\n#### 实现方法\n\n以下方法不晓得会不会影响页面渲染性能：\n\n- 1、定义全局 :root 初始变量，路径：`src/theme/common/var.scss`\n- 2、编写覆盖 element plus 的样式：路径：`src/theme/element.scss`\n- 3、页面通过 `document.documentElement.style.setProperty` 方法改变 `:root` 中的值\n\n#### 具体实现\n\n<Warning title=\"实现步骤说明\">\n第 1 第 2 步就不介绍了，直接去路径去看就懂了。接下来我们讲讲第 3 步：\n</Warning>\n\n通过 `document.documentElement.style.setProperty` 改变颜色值 [setProperty 文档](https://developer.mozilla.org/zh-CN/docs/Web/API/CSSStyleDeclaration/setProperty)：\n\n```html\n<script setup>\n  import { reactive } from \"vue\";\n\n  // 定义变量内容\n  const state = reactive({\n    color: \"\",\n  });\n\n  // 改变主题颜色\n  const onColorChange = () => {\n    // 设置颜色\n    document.documentElement.style.setProperty(\"--color-primary\", state.color);\n    // 设置颜色变浅\n    document.documentElement.style.setProperty(\n      \"--color-primary-light-1\",\n      getLightColor(state.color1, 0.1)\n    );\n  };\n</script>\n```\n\ngetLightColor 颜色变浅方法，路径在：`src/utils/theme.ts`\n\n```ts\n// 变浅颜色值，level为加深的程度，限0-1之间\nexport function getLightColor(color: any, level: number) {\n  let reg = /^#?[0-9A-Fa-f]{6}$/;\n  if (!reg.test(color)) return ElMessage.warning(\"输入错误的hex颜色值\");\n  let rgb = hexToRgb(color);\n  for (let i = 0; i < 3; i++)\n    rgb[i] = Math.floor((255 - rgb[i]) * level + rgb[i]);\n  return rgbToHex(rgb[0], rgb[1], rgb[2]);\n}\n```\n\n到此就完成了主题的全局变色了。\n\n<Tip title=\"主题变色原理\">\n总的来说，就是通过重新定义 `css` 样式，用来覆盖 [element-plus](https://element-plus.gitee.io/#/zh-CN/component/changelog) 默认的样式，从而实现全局主题变色。其它方法实现全局主题，请自行 [百度一下](https://www.baidu.com/)。\n</Tip>\n\n### 框架中实现例子\n\n#### 全局主题改变时\n\n主题改变时，会调用 `onColorPickerChange` 方法进行重新的覆盖 css `:root` 定义的变量的值：\n\n```ts\nconst onColorPickerChange = (color: string) => {\n  document.documentElement.style.setProperty(\n    color,\n    getThemeConfig.value[color]\n  );\n};\n```\n\n拿到的值会赋值给根节点上 `html`，`document.documentElement.style`。刷新的时再设置 `document.documentElement.style.cssText = Local.get('themeConfigStyle');`，防止数据丢失。\n\n#### 更改主题配置文件路径\n\n修改后不生效，请注意看下列文件顶部文字注释。\n\nvue3.x：`/src/stores/themeConfig.ts`\n\n<Warning title=\"配置生效方式\">\n1、需要每次都清理 `window.localStorage` 浏览器永久缓存\n2、或者点击布局配置最底部 `一键恢复默认` 按钮即可看到效果\n</Warning>\n\n## 菜单 / 顶栏\n\n### 顶栏\n\n文件路径：`/@/layout/navBars/breadcrumb`\n\n**顶栏背景、顶栏默认字体颜色、顶栏背景渐变**\n\n功能说明：`设置顶栏的背景颜色、字体颜色、背景渐变`\n\n### 菜单\n\n文件路径：[/@/layout/navMenu](https://gitee.com/lyt-top/vue-next-admin/tree/master/src/layout/navMenu)\n\n**菜单背景、菜单默认字体颜色、菜单背景渐变、菜单字体背景高亮**\n\n功能说明：`设置菜单的背景颜色、字体颜色、背景渐变、字体高亮背景色（颜色跟随全局主题(primary)）`\n\n### 分栏\n\n文件路径：`/@/layout/component/columnsAside.vue`\n\n**分栏菜单背景、分栏菜单默认字体颜色、分栏菜单背景渐变**\n\n功能说明：`设置分栏菜单的背景颜色、字体颜色、背景渐变`\n\n## 界面设置\n\n### 菜单设置\n\n文件路径：[/@/layout/navMenu](https://gitee.com/lyt-top/vue-next-admin/tree/master/src/layout/navMenu)\n\n**菜单水平折叠、菜单手风琴、经典布局分割菜单**\n\n功能说明：`菜单水平折叠、手风琴（开启一个展开）、经典布局分割菜单（顶级在顶栏处，子级在菜单栏）`\n\n### 固定 Header\n\n文件路径：[/@/layout/main](https://gitee.com/lyt-top/vue-next-admin/tree/master/src/layout/main)\n\n**固定 Header**\n\n功能说明：`固定 Header（主内容区滚动，顶栏不跟随滚动）`\n\n### 锁屏\n\n文件路径：[/@/layout/lockScreen](https://gitee.com/lyt-top/vue-next-admin/tree/master/src/layout/lockScreen)\n\n**开启锁屏、自动锁屏(s/秒)**\n\n功能说明：`开启锁屏（类似于电脑屏保）、自动锁屏(s/秒)`\n\n## 界面显示\n\n### 侧边栏 Logo\n\n文件路径：[/@/layout/logo](https://gitee.com/lyt-top/vue-next-admin/tree/master/src/layout/logo)\n\n**侧边栏 Logo**\n\n功能说明：`显示/隐藏侧边栏 Logo`\n\n### Breadcrumb 面包屑\n\n文件路径：`/@/layout/navBars/Breadcrumb/breadcrumb.vue`\n\n**开启 Breadcrumb、开启 Breadcrumb 图标**\n\n功能说明：`开启 Breadcrumb、Breadcrumb 图标`\n\n### Tagsview 标签页\n\n文件路径：[/@/layout/navBars/tagsView](https://gitee.com/lyt-top/vue-next-admin/tree/master/src/layout/navBars/tagsView)\n\n**开启 Tagsview、开启 Tagsview 图标、开启 TagsView 缓存、开启 TagsView 拖拽、开启 TagsView 共用**\n\n功能说明：`开启 Tagsview、Tagsview 图标、TagsView 缓存、TagsView 拖拽、TagsView 共用（共用详情界面：tagsView只会出现一个；非共用详情界面：tagsView会出现多个）`\n\n### Footer 版权\n\n文件路径：[/@/layout/footer](https://gitee.com/lyt-top/vue-next-admin/tree/master/src/layout/footer)\n\n**开启 Footer 版权**\n\n功能说明：`显示/隐藏底部版权`\n\n### 颜色模式\n\n文件路径：`/@/layout/navBars/breadcrumb/setings.vue`\n\n**灰色模式、色弱模式、深色模式**\n\n功能说明：`开启灰色模式、色弱模式、深色模式`\n\n### 前端水印\n\n文件路径：`/@/utils/wartermark.ts`\n\n**开启水印、水印文案**\n\n功能说明：`开启开启水印、设置水印文案`，可通过修改前端配置项解决。\n\n## 其它设置\n\n<Warning title=\"配置查找方法\">\n可使用 el-option 的 `value` 值去对应的 `文件路径` 里搜索查看。\n</Warning>\n\n### Tagsview 风格\n\n文件路径：[/@/layout/navBars/tagsView](https://gitee.com/lyt-top/vue-next-admin/tree/master/src/layout/navBars/tagsView)\n\n需注意 `value` 值需与定义的 `css 类名` 一致：\n\n```html\n<el-select v-model=\"getThemeConfig.tagsStyle\">\n  <el-option label=\"风格1\" value=\"tags-style-one\"></el-option>\n  <el-option label=\"风格2\" value=\"tags-style-two\"></el-option>\n  <el-option label=\"风格3\" value=\"tags-style-three\"></el-option>\n  <el-option label=\"风格4\" value=\"tags-style-four\"></el-option>\n  <!-- 新增的风格 -->\n  <el-option label=\"风格xx\" value=\"tags-style-xxx\"></el-option>\n  <!-- 继续添加 -->\n  ...\n</el-select>\n```\n\n### 主页面切换动画\n\n文件路径：`/@/theme/common/transition.scss`，内置 `slide-right`、`slide-left`、`opacitys` 切换风格。\n\n你可能需要了解 [进入过渡 & 离开过渡](https://v3.cn.vuejs.org/guide/transitions-enterleave.html)。新增动画时，需要在 `/@/layout/navBars/breadcrumb/setings.vue` 其它设置中添加如下：\n\n```html\n<el-select v-model=\"getThemeConfig.animation\">\n  <el-option label=\"slide-right\" value=\"slide-right\"></el-option>\n  <el-option label=\"slide-left\" value=\"slide-left\"></el-option>\n  <el-option label=\"opacitys\" value=\"opacitys\"></el-option>\n  <!-- 新增的动画名 -->\n  <el-option label=\"xxx\" value=\"xxx\"></el-option>\n  <!-- 继续添加 -->\n  ...\n</el-select>\n```\n\n### 分栏高亮风格\n\n文件路径：`/@/layout/component/columnsAside.vue`\n\n需注意 `value` 值需与定义的 `css 类名` 一致：\n\n```html\n<el-select v-model=\"getThemeConfig.columnsAsideStyle\">\n  <el-option label=\"圆角\" value=\"columns-round\"></el-option>\n  <el-option label=\"卡片\" value=\"columns-card\"></el-option>\n  <!-- 新增的高亮风格 -->\n  <el-option label=\"xxx\" value=\"xxx\"></el-option>\n  <!-- 继续添加 -->\n  ...\n</el-select>\n```\n\n### 分栏布局风格\n\n文件路径：`/@/layout/component/columnsAside.vue`\n\n需注意 `value` 值需与定义的 `css 类名` 一致：\n\n```html\n<el-select v-model=\"getThemeConfig.columnsAsideLayout\">\n  <el-option label=\"水平\" value=\"columns-horizontal\"></el-option>\n  <el-option label=\"垂直\" value=\"columns-vertical\"></el-option>\n  <!-- 新增的分栏布局风格 -->\n  <el-option label=\"xxx\" value=\"xxx\"></el-option>\n  <!-- 继续添加 -->\n  ...\n</el-select>\n```\n\n## 布局切换\n\n此项目包含四个布局：默认、经典、横向、分栏。\n","url":"/doc/pigx/front-end/pigx-front-config"},{"lvl2":"2026-01-16 08:55:00.0","created_unix":1768524900000,"id":98,"lvl0":"前端首页组件开发","content":"## 首页组件开发\n\n自定义首页组件开发，可以在首页展示自定义的业务组件或数据展示卡片。\n\n<img src=\"https://minio.pigx.top/oss/202403/1711008130.png\" alt=\"首页组件示例\" width=\"100%\" />\n\n## 开发组件\n\n在 `src/views/home/widgets/components` 目录下创建组件文件。\n\n<img src=\"https://minio.pigx.top/oss/202403/1711008491.png\" alt=\"组件目录结构\" width=\"100%\" />\n\n<Tip title=\"组件命名规范\">\n建议使用小写字母和连字符命名组件文件，如 `test-demo.vue`，保持命名规范和统一。\n</Tip>\n\n### 组件示例\n\n创建一个简单的组件文件 `test-demo.vue`：\n\n```html\n<template>\n  <div class=\"widget-card\">\n    <h3>自定义组件标题</h3>\n    <p>这里是组件内容</p>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\n// 组件逻辑代码\n</script>\n\n<style scoped>\n.widget-card {\n  padding: 20px;\n  background: #fff;\n  border-radius: 4px;\n}\n</style>\n```\n\n## 挂载组件\n\n在 `src/views/home/widgets/index.vue` 中挂载组件，将 `myGrid` 数组增加上一步创建的组件文件名称。\n\n```javascript\nconst myGrid = [\n  'test-demo',\n];\n```\n\n<img src=\"https://minio.pigx.top/oss/202403/1711008679.png\" alt=\"挂载组件配置\" width=\"100%\" />\n\n<Warning title=\"组件名称一致性\">\n确保 `myGrid` 数组中的组件名称与实际创建的组件文件名称完全一致，否则组件无法正常加载。\n</Warning>\n\n## 完整示例\n\n### 创建组件\n\n```html\n<template>\n  <div class=\"custom-widget\">\n    <div class=\"widget-header\">\n      <h3>数据统计</h3>\n    </div>\n    <div class=\"widget-content\">\n      <div class=\"stat-item\">\n        <span class=\"label\">今日访问</span>\n        <span class=\"value\">1,234</span>\n      </div>\n      <div class=\"stat-item\">\n        <span class=\"label\">总用户数</span>\n        <span class=\"value\">5,678</span>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, onMounted } from 'vue';\n\nconst stats = ref({\n  todayVisit: 0,\n  totalUsers: 0,\n});\n\nonMounted(() => {\n  // 获取统计数据\n  fetchStats();\n});\n\nconst fetchStats = async () => {\n  // API 调用逻辑\n};\n</script>\n\n<style scoped>\n.custom-widget {\n  padding: 20px;\n  background: #fff;\n  border-radius: 8px;\n  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n}\n\n.widget-header {\n  margin-bottom: 16px;\n}\n\n.stat-item {\n  display: flex;\n  justify-content: space-between;\n  padding: 12px 0;\n  border-bottom: 1px solid #eee;\n}\n\n.stat-item:last-child {\n  border-bottom: none;\n}\n</style>\n```\n\n### 注册组件\n\n在 `src/views/home/widgets/index.vue` 中注册：\n\n```javascript\nconst myGrid = [\n  'test-demo',\n  'custom-widget', // 新增的组件\n];\n```\n\n<Tip title=\"组件动态加载\">\n组件会自动动态加载，无需手动 import，框架会根据组件名称自动引入对应的组件文件。\n</Tip>\n\n## 注意事项\n\n<Warning title=\"组件开发规范\">\n- 组件文件必须放在 `src/views/home/widgets/components` 目录下\n- 组件名称使用小写字母和连字符（kebab-case）\n- 组件必须是 Vue 单文件组件（.vue 文件）\n- 确保组件在 `myGrid` 数组中正确注册\n</Warning>\n\n## 组件布局\n\n首页组件支持网格布局，可以通过配置调整组件的大小和位置。\n\n<Tip title=\"响应式布局\">\n首页组件支持响应式布局，会自动适配不同屏幕尺寸，在移动端和桌面端都能良好展示。\n</Tip>\n","url":"/doc/pigx/front-end/pigx-front-home-diy"},{"lvl2":"2026-01-16 08:55:00.0","created_unix":1768524900000,"id":100,"lvl0":"前端国际化配置","content":"框架内置中文简体和英文两种语言，支持前端和后端双重配置方式，满足不同场景的国际化需求。\n\n<Tabs>\n  <Tab title=\"新版\">自 V5.12.1 起，登录页 `国际化切换` 开关建议在网站配置的图形化界面中维护；本文主要说明国际化内容本身的配置方式和代码用法。</Tab>\n  <Tab title=\"旧版\">未接入网站配置中心的版本，登录页语言切换入口仍按历史前端配置方式控制，文中的 i18n 目录结构和代码写法保持不变。</Tab>\n</Tabs>\n\n## 多国语言配置\n\n### 前端配置国际化\n\n页面国际化数据建议放在同级目录的 `i18n` 文件夹中。`/@/i18n` 目录为框架内置，为了便于后续升级，请勿直接在此目录中添加自定义配置。\n\n<img src=\"https://minio.pigx.top/oss/202304/1681629726.png\" alt=\"前端国际化目录结构\" width=\"100%\" />\n\n<Warning title=\"目录规范\">\n自定义国际化文件应放在页面同级目录的 i18n 文件夹中，不要修改框架内置的 `/@/i18n` 目录。\n</Warning>\n\n### 后端配置国际化\n\n后端国际化配置与前端 i18n 配置的 TypeScript 文件格式相同，可以通过后台的国际化管理模块进行配置和使用。\n\n<img src=\"https://minio.pigx.top/oss/202304/1682143507.png\" alt=\"后端国际化管理界面\" width=\"100%\" />\n\n<Tip title=\"配置方式\">\n支持通过后台管理界面动态配置国际化内容，无需修改代码即可更新翻译文本。\n</Tip>\n\n## 国际化使用\n\n### 在 Vue 模板中使用\n\n在 `.vue` 文件的模板中，使用 `$t('xxx.xxx')` 语法：\n\n```html\n<el-button>\n  <span>{{ $t('message.account.accountBtnText') }}</span>\n</el-button>\n\n<el-divider content-position=\"left\">\n  {{ $t('message.layout.oneTitle') }}\n</el-divider>\n```\n\n### 在 TypeScript 中使用\n\n在 `.ts` 文件中，使用 `i18n.global.t(xxx)` 语法：\n\n```ts\nimport { i18n } from '/@/i18n/index';\n\nconst webTitle = i18n.global.t(router.currentRoute.value.meta.title as any);\n```\n\n### 在 setup 中使用\n\n在组件的 `setup` 函数中，使用 `t(xxx)` 语法：\n\n```ts\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { useI18n } from 'vue-i18n';\n\nexport default defineComponent({\n  name: 'xxx',\n  setup() {\n    const { t } = useI18n();\n\n    // 使用，xxx 为变量\n    return {\n      title: t(xxx)\n    };\n  }\n})\n</script>\n```\n\n<Tip title=\"使用场景\">\n根据不同的使用场景选择合适的方式：模板中使用 `$t()`，TypeScript 中使用 `i18n.global.t()`，setup 中使用 `useI18n()` 获取 `t` 函数。\n</Tip>\n\n## 框架其他国际化\n\n### 菜单国际化\n\n<img src=\"https://minio.pigx.vip/oss/202510/FC7lef.png\" alt=\"菜单国际化示例\" width=\"100%\" />\n\n菜单国际化配置位于 `/@/layout/navMenu`，读取 `/@/router/route.ts` 中的 `meta.title` 字段。格式为 `message.router.xxx`，需要提前在后台的国际化管理模块中维护中文菜单和英文菜单的对应关系。\n\n<Warning title=\"配置要求\">\n菜单的国际化键值必须在后台国际化管理模块中预先配置，否则会显示为键名。\n</Warning>\n\n### 浏览器标题国际化\n\n浏览器标题国际化通过 `/@/utils/other.ts` 中的 `useTitle` 方法实现，使用时调用 `other.useTitle()`。\n\n```ts\n/**\n * 设置浏览器标题国际化\n * @method const title = useTitle(); => title()\n */\nexport function useTitle() {\n  const stores = useThemeConfig(pinia);\n  const { themeConfig } = storeToRefs(stores);\n  nextTick(() => {\n    let webTitle = '';\n    let globalTitle: string = themeConfig.value.globalTitle;\n    const { path, meta } = router.currentRoute.value;\n    if (path === '/login') {\n      webTitle = <string>meta.title;\n    } else {\n      webTitle = setTagsViewNameI18n(router.currentRoute.value);\n    }\n    document.title = `${webTitle} - ${globalTitle}` || globalTitle;\n  });\n}\n```\n\n### 顶栏国际化\n\n顶栏组件位于 `/@/layout/navBars/breadcrumb`，包含面包屑、组件大小、语言切换、菜单搜索、布局配置、消息、全屏切换、用户下拉菜单等功能。基本都使用 `$t(xxx.xxx.xxx)` 语法。\n\n```html\n<div>{{ $t(v.meta.title) }}</div>\n```\n\n### 布局配置国际化\n\n布局配置组件位于 `/@/layout/navBars/breadcrumb/setings.vue`，国际化数据在 `/@/i18n/lang` 中的 `layout` 对象。基本使用 `$t('message.layout.xxx')` 语法。\n\n```html\n<div class=\"layout-breadcrumb-seting-bar-flex-label\">\n  {{ $t('message.layout.twoMenuBar') }}\n</div>\n```\n\n### 页面国际化\n\n页面中基本使用 `$t('message.xxx.xxx')` 语法进行国际化。\n\n<Success title=\"最佳实践\">\n建议将页面相关的国际化配置统一放在页面同级目录的 i18n 文件夹中，便于维护和管理。\n</Success>\n","url":"/doc/pigx/front-end/pigx-front-i18n"},{"lvl2":"2026-01-16 08:55:00.0","created_unix":1768524900000,"id":103,"lvl0":"前端字体图标配置","content":"框架支持三种图标使用方式：Element Plus 内置图标、阿里巴巴在线图标库、本地 SVG 图标，满足不同场景的图标需求。\n\n## Element Plus 图标\n\nElement Plus 提供了丰富的内置图标，可以直接在项目中使用。\n\n### 使用方式\n\n访问 [Element Plus 图标库](https://element-plus.org/zh-CN/component/icon.html) 选择所需图标，使用 `<el-icon>` 组件包裹图标组件。\n\n```html\n<el-input\n  type=\"text\"\n  :placeholder=\"$t('message.account.accountPlaceholder1')\"\n  v-model=\"ruleForm.userName\"\n  clearable\n  autocomplete=\"off\"\n>\n  <template #prefix>\n    <el-icon class=\"el-input__icon\"><ele-User /></el-icon>\n  </template>\n</el-input>\n```\n\n<Tip title=\"图标选择\">\nElement Plus 图标库提供了常用的基础图标，适合快速开发和保持统一风格。\n</Tip>\n\n## 本地 SVG 图标\n\n本地 SVG 图标适合离线部署、私有图标管理和需要跟随项目一起版本控制的场景。\n\n### 使用前说明\n\n- 项目会自动读取 `pigx-ui/src/assets/icons/` 目录下的 `.svg` 文件\n- 支持在 `icons` 目录下继续按业务创建子目录\n- 图标引用名只取文件名，不包含目录名\n\n<Tip title=\"适用场景\">\n需要离线访问、自定义品牌图标，或希望图标资源跟随代码一起管理时，优先使用本地 SVG 图标。\n</Tip>\n\n### 配置本地图标\n\n1. 访问 [iconfont 官网](https://www.iconfont.cn/) 或其他图标来源，下载所需的 `.svg` 文件\n2. 将图标文件放到 `pigx-ui/src/assets/icons/` 目录中\n3. 新增、删除或重命名图标后，重启前端项目，让图标重新注册\n\n<Warning title=\"命名规则\">\n组件通过 `local-文件名` 的方式引用图标。例如 `gitee.svg` 对应 `local-gitee`，`ai/db.svg` 对应 `local-db`。由于目录名不会参与生成图标名，不同目录下不要放置同名 SVG 文件。\n</Warning>\n\n### 菜单图标选择器\n\n放在本地目录中的 SVG 图标，会自动出现在菜单图标选择器的 `local` 分组中，并根据文件名顺序加载。\n\n<img src=\"https://minio.pigx.vip/oss/202604/o9zDLV.png\" alt=\"菜单图标选择器\" width=\"100%\" />\n\n### 使用本地图标\n\n使用 `local-` 前缀加文件名加载本地图标：\n\n```vue\n<SvgIcon name=\"local-gitee\" :size=\"30\" />\n<SvgIcon name=\"local-db\" :size=\"24\" color=\"#2970ff\" />\n```\n\n## 阿里巴巴在线图标\n\n阿里巴巴图标库提供了海量的图标资源，支持在线引用和自定义图标集。\n\n### 创建图标项目\n\n1. 访问 [iconfont 官网](https://www.iconfont.cn/) 并登录\n2. 创建新项目，设置 `FontClass/Symbol 前缀` 为 `icon`，`Font Family` 为 `iconfont`\n3. 添加所需图标到项目，生成在线链接\n\n### 配置在线链接\n\n在 `/@/utils/setIconfont.ts` 文件的 `cssCdnUrlList` 数组中添加生成的在线链接。\n\n```ts\n// 字体图标 URL\nconst cssCdnUrlList: Array<string> = [\n  '//at.alicdn.com/t/font_2298093_y6u00apwst.css',\n  '//netdna.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css',\n];\n```\n\n<Warning title=\"链接更新\">\n每次在 iconfont 项目中添加或删除图标后，需要重新生成链接并更新配置文件。\n</Warning>\n\n### 在界面中使用\n\n不同的图标库需要添加对应的前缀：\n\n<Warning title=\"前缀规则\">\niconfont（阿里巴巴素材库）需要添加 `iconfont` 前缀，如：`iconfont xitongshezhi`；font-awesome 需要添加 `fa` 前缀，如：`fa xitongshezhi`。\n</Warning>\n\n```html\n<!-- 使用 i 标签 -->\n<i class=\"iconfont xitongshezhi\"></i>\n<!-- <i class=\"fa xitongshezhi\"></i> -->\n\n<!-- 使用 SvgIcon 组件 -->\n<SvgIcon name=\"iconfont xitongshezhi\"></SvgIcon>\n<!-- <SvgIcon name=\"fa xitongshezhi\"></SvgIcon> -->\n```\n\n## SvgIcon 组件使用\n\n`SvgIcon` 组件提供了统一的图标使用接口，支持局部注册和全局注册两种方式。\n\n### 局部注册\n\n在单个组件中使用时，需要先导入 `SvgIcon` 组件：\n\n```html\n<!-- 页面上使用 -->\n<SvgIcon :name=\"item.meta.icon\" />\n\n<script setup lang=\"ts\" name=\"xxx\">\n  import SvgIcon from '/@/components/svgIcon/index.vue';\n</script>\n```\n\n### 全局注册\n\n框架中使用全局注册方式，在 `/@/utils/other.ts` 的 `elSvg` 方法中注册：\n\n```ts\n// 全局注册\nimport SvgIcon from '/@/components/svgIcon/index.vue';\napp.component('SvgIcon', SvgIcon);\n```\n\n注册后可以直接在页面中使用：\n\n```html\n<!-- 基础使用 -->\n<SvgIcon :name=\"item.meta.icon\" />\n\n<!-- 自定义大小和颜色 -->\n<SvgIcon name=\"ele-Aim\" :size=\"14\" color=\"#333333\" />\n```\n\n<Tip title=\"组件优势\">\n使用 `SvgIcon` 组件可以统一管理图标，支持动态切换、自定义样式，代码更简洁易维护。\n</Tip>\n\n## 自定义引入本地图标\n\n除了使用 `SvgIcon` 组件，也可以通过传统方式引入图标：\n\n```html\n<!-- 使用 i 标签 -->\n<i class=\"iconfont xitongshezhi\"></i>\n\n<!-- 使用 SvgIcon 组件 -->\n<SvgIcon name=\"iconfont xitongshezhi\"></SvgIcon>\n```\n\n## 进阶：阿里巴巴图标库离线使用\n\n为了提高系统的稳定性和加载速度，可以将阿里巴巴在线图标库转换为本地离线使用。\n\n### 下载图标资源包\n\n[点击下载 PIGX-UI 依赖的阿里巴巴图标](https://minio.pigx.vip/oss/202501/1737972483.zip)\n\n### 创建本地图标目录\n\n```bash\nmkdir -p pigx-ui/public/assets/iconfont\n```\n\n### 复制资源文件\n\n将下载的资源包中的以下文件复制到 `public/assets/iconfont/` 目录：\n\n- iconfont.css\n- iconfont.ttf\n- iconfont.woff\n- iconfont.woff2\n\n### 修改配置文件\n\n修改 `src/utils/setIconfont.ts` 文件中的图标引用路径：\n\n```typescript\nconst cssCdnUrlList: Array<string> = [\n  '/assets/iconfont/iconfont.css', // 本地图标文件\n  '/assets/styles/font-awesome.min.css',\n];\n```\n\n### 验证\n\n1. 启动项目\n2. 检查图标是否正常显示\n3. 在断网情况下验证图标是否仍然可用\n\n<Warning title=\"文件路径\">\n确保复制的文件名与代码中引用的路径完全一致。如果后续需要添加新图标，重复以上步骤更新本地图标文件即可。\n</Warning>\n\n<Success title=\"离线优势\">\n离线部署可以避免外部 CDN 服务不可用的风险，提升系统稳定性和加载速度，特别适合内网环境部署。\n</Success>\n","url":"/doc/pigx/front-end/pigx-front-icon-new"},{"lvl2":"2026-01-16 08:55:00.0","created_unix":1768524900000,"id":106,"lvl0":"前端图表功能","content":"## 组件预览\n\n<img src=\"https://minio.pigx.top/oss/202311/1700887610.png\" alt=\"图表组件示例\" width=\"100%\" />\n\nVue Echarts 是一个 Vue.js 的 ECharts 图表组件，对 EChart 进行了封装，简化了 Echart 图表的使用。\n\npigx-ui 默认引入了 vue-echarts，业务代码中可以非常方便地使用相关的 EChart 图表组件，例如日志管理等页面。\n\n## 快速使用\n\n### 步骤 1：获取图表配置\n\n访问 [ECharts 官网](https://echarts.apache.org/examples/zh/index.html#chart-type-bar)，选择目标类型的图表组件，获取图表的 option 配置 JSON。\n\n<img src=\"https://minio.pigx.top/oss/202311/1700888098.png\" alt=\"ECharts 官网示例\" width=\"100%\" />\n\n### 步骤 2：生成 Vue 代码\n\n访问 [vue-echarts 代码生成器](https://vue-echarts.dev/#codegen)，粘贴从 ECharts 官网复制的 option 配置，生成 Vue 代码。\n\n<img src=\"https://minio.pigx.top/oss/202311/1700888283.png\" alt=\"vue-echarts 代码生成器\" width=\"100%\" />\n\n<Tip title=\"代码生成器\">\nvue-echarts 官方提供的代码生成器可以自动将 ECharts option 转换为 Vue 组件代码，大大简化开发流程。\n</Tip>\n\n## 业务页面使用\n\n将代码生成器生成的代码复制到业务页面中即可使用：\n\n```html\n<template>\n  <v-chart class=\"h-80 w-full\" :option=\"option\" />\n</template>\n\n<script setup lang=\"ts\" name=\"demo-chart\">\n// 直接复制 vue-echart codegen 生成的 vue 代码部分\nimport { use, reactive } from 'echarts/core';\nimport { BarChart } from 'echarts/charts';\nimport { GridComponent } from 'echarts/components';\nimport { CanvasRenderer } from 'echarts/renderers';\n\nuse([\n  GridComponent,\n  BarChart,\n  CanvasRenderer\n]);\n\n// 定义 option 配置\nconst option = reactive({\n  xAxis: {\n    type: 'category',\n    data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']\n  },\n  yAxis: {\n    type: 'value'\n  },\n  series: [\n    {\n      data: [120, 200, 150, 80, 70, 110, 130],\n      type: 'bar'\n    }\n  ]\n});\n</script>\n```\n\n<Warning title=\"按需引入\">\n为了减小打包体积，vue-echarts 采用按需引入的方式。需要使用哪些图表类型或组件，就在代码中 import 相应的模块。\n</Warning>\n\n## 图表类型\n\n### 柱状图\n\n```html\n<script setup lang=\"ts\">\nimport { BarChart } from 'echarts/charts';\nimport { GridComponent, TooltipComponent } from 'echarts/components';\n\nuse([\n  GridComponent,\n  TooltipComponent,\n  BarChart,\n  CanvasRenderer\n]);\n</script>\n```\n\n### 折线图\n\n```html\n<script setup lang=\"ts\">\nimport { LineChart } from 'echarts/charts';\nimport { GridComponent, TooltipComponent } from 'echarts/components';\n\nuse([\n  GridComponent,\n  TooltipComponent,\n  LineChart,\n  CanvasRenderer\n]);\n</script>\n```\n\n### 饼图\n\n```html\n<script setup lang=\"ts\">\nimport { PieChart } from 'echarts/charts';\nimport { TitleComponent, TooltipComponent, LegendComponent } from 'echarts/components';\n\nuse([\n  TitleComponent,\n  TooltipComponent,\n  LegendComponent,\n  PieChart,\n  CanvasRenderer\n]);\n</script>\n```\n\n## 动态数据更新\n\n使用 reactive 或 ref 定义 option，可以实现图表数据的动态更新：\n\n```html\n<template>\n  <v-chart class=\"h-80 w-full\" :option=\"option\" />\n</template>\n\n<script setup lang=\"ts\">\nimport { reactive } from 'vue';\nimport { use } from 'echarts/core';\nimport { BarChart } from 'echarts/charts';\nimport { GridComponent } from 'echarts/components';\nimport { CanvasRenderer } from 'echarts/renderers';\n\nuse([GridComponent, BarChart, CanvasRenderer]);\n\nconst option = reactive({\n  xAxis: {\n    type: 'category',\n    data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']\n  },\n  yAxis: {\n    type: 'value'\n  },\n  series: [\n    {\n      data: [120, 200, 150, 80, 70, 110, 130],\n      type: 'bar'\n    }\n  ]\n});\n\n// 动态更新数据\nconst updateData = () => {\n  option.series[0].data = [150, 230, 224, 218, 135, 147, 260];\n};\n</script>\n```\n\n<Success title=\"响应式更新\">\n使用 reactive 定义的 option 具有响应式特性，修改数据后图表会自动重新渲染。\n</Success>\n\n## 图表样式配置\n\n### 设置图表尺寸\n\n通过 class 或 style 设置图表容器的尺寸：\n\n```html\n<template>\n  <!-- 使用 Tailwind CSS 类名 -->\n  <v-chart class=\"h-96 w-full\" :option=\"option\" />\n\n  <!-- 或使用 style -->\n  <v-chart style=\"height: 400px; width: 100%;\" :option=\"option\" />\n</template>\n```\n\n### 主题配置\n\n可以通过 theme 属性设置图表主题：\n\n```html\n<template>\n  <v-chart :option=\"option\" theme=\"dark\" />\n</template>\n```\n\n## 响应式图表\n\n图表会自动响应容器尺寸的变化，无需手动调用 resize 方法。\n\n```html\n<template>\n  <div class=\"chart-container\">\n    <v-chart class=\"h-full w-full\" :option=\"option\" />\n  </div>\n</template>\n\n<style scoped>\n.chart-container {\n  height: 100%;\n  min-height: 300px;\n}\n</style>\n```\n\n<Tip title=\"自动响应\">\nvue-echarts 内置了 ResizeObserver，可以自动监听容器尺寸变化并调整图表大小，无需手动处理。\n</Tip>\n\n## 常用组件引入\n\n以下是常用的 ECharts 组件模块：\n\n```ts\n// 图表类型\nimport {\n  BarChart,      // 柱状图\n  LineChart,     // 折线图\n  PieChart,      // 饼图\n  ScatterChart,  // 散点图\n  RadarChart,    // 雷达图\n  MapChart,      // 地图\n  TreeChart,     // 树图\n  GraphChart,    // 关系图\n  GaugeChart,    // 仪表盘\n  FunnelChart,   // 漏斗图\n  ParallelChart, // 平行坐标\n  SankeyChart,   // 桑基图\n  BoxplotChart,  // 箱线图\n  CandlestickChart, // K线图\n  EffectScatterChart, // 涟漪散点图\n  LinesChart,    // 路径图\n  HeatmapChart,  // 热力图\n  PictorialBarChart, // 象形柱图\n  ThemeRiverChart, // 主题河流图\n  SunburstChart, // 旭日图\n  CustomChart    // 自定义系列\n} from 'echarts/charts';\n\n// 组件\nimport {\n  GridComponent,        // 网格\n  PolarComponent,       // 极坐标系\n  GeoComponent,         // 地理坐标系\n  TooltipComponent,     // 提示框\n  LegendComponent,      // 图例\n  TitleComponent,       // 标题\n  ToolboxComponent,     // 工具栏\n  DataZoomComponent,    // 数据区域缩放\n  VisualMapComponent,   // 视觉映射\n  TimelineComponent,    // 时间线\n  CalendarComponent,    // 日历\n  GraphicComponent,     // 图形元素\n  MarkPointComponent,   // 标注点\n  MarkLineComponent,    // 标注线\n  MarkAreaComponent,    // 标注区域\n  DatasetComponent,     // 数据集\n  TransformComponent,   // 数据转换\n  AriaComponent,        // 无障碍\n  ParallelComponent,    // 平行坐标系\n  RadarComponent,       // 雷达坐标系\n  SingleAxisComponent,  // 单轴\n  BrushComponent,       // 刷选\n} from 'echarts/components';\n\n// 渲染器\nimport { CanvasRenderer } from 'echarts/renderers';\n// 或使用 SVG 渲染器\n// import { SVGRenderer } from 'echarts/renderers';\n```\n\n<Warning title=\"模块引入\">\n使用图表前必须先通过 use() 函数注册所需的组件和渲染器，否则图表无法正常显示。\n</Warning>\n","url":"/doc/pigx/front-end/pigx-front-charts"},{"lvl2":"2026-01-16 08:55:00.0","created_unix":1768524900000,"id":110,"lvl0":"前端权限管理","content":"## 组件方式\n\n组件位置：`/@/components/auth`，您可能需要了解 [插槽 slot](https://v3.cn.vuejs.org/guide/component-slots.html)\n\n### 单个权限验证\n\n<Tip title=\"权限判断逻辑\">\n组件使用 `some` 方法进行权限验证，根据实际需求可以自行修改判断逻辑。\n</Tip>\n\n```html {23-25}\n<template>\n  <slot v-if=\"getUserAuthBtnList\" />\n</template>\n\n<script setup lang=\"ts\" name=\"auth\">\n  import { computed } from \"vue\";\n  import { storeToRefs } from \"pinia\";\n  import { useUserInfo } from \"/@/stores/userInfo\";\n\n  // 定义父组件传过来的值\n  const props = defineProps({\n    value: {\n      type: String,\n      default: () => \"\",\n    },\n  });\n\n  // 定义变量内容\n  const stores = useUserInfo();\n  const { userInfos } = storeToRefs(stores);\n\n  // 获取 pinia 中的用户权限\n  const getUserAuthBtnList = computed(() => {\n    return userInfos.value.authBtnList.some((v: string) => v === props.value);\n  });\n</script>\n```\n\n**页面中使用：**\n\n```html {3,8}\n<template>\n  <!-- 使用 -->\n  <Auth :value=\"'btn.add'\" />\n</template>\n\n<script setup lang=\"ts\" name=\"xxx\">\n  // 局部引入\n  import Auth from \"/@/components/auth/auth.vue\";\n</script>\n```\n\n### 多个权限验证（满足一个）\n\n当需要验证多个权限时，只要满足其中一个权限即可显示组件。\n\n```html {3,9,14}\n<template>\n  <!-- 使用 -->\n  <Auths :value=\"['btn.addsss', 'btn.edit', 'btn.delsss', 'btn.linksss']\" />\n</template>\n\n<script lang=\"ts\">\n  import { defineComponent } from \"vue\";\n  // 局部引入\n  import Auths from \"/@/components/auth/auths.vue\";\n\n  export default defineComponent({\n    name: \"xxxx\",\n    // 局部注册\n    components: { Auths },\n  });\n</script>\n```\n\n### 多个权限验证（全部满足）\n\n当需要验证多个权限时，必须全部满足才能显示组件。\n\n```html {3,9,14}\n<template>\n  <!-- 使用 -->\n  <AuthAll :value=\"['btn.add', 'btn.edit', 'btn.del', 'btn.link']\" />\n</template>\n\n<script lang=\"ts\">\n  import { defineComponent } from \"vue\";\n  // 局部引入\n  import AuthAll from \"/@/components/auth/authAll.vue\";\n\n  export default defineComponent({\n    name: \"xxxx\",\n    // 局部注册\n    components: { AuthAll },\n  });\n</script>\n```\n\n## 指令方式\n\n<Tip title=\"Vue 自定义指令\">\n指令位置：`/@/directive/authDirective.ts`，您可能需要了解 [自定义指令 directive](https://v3.cn.vuejs.org/guide/custom-directive.html)\n</Tip>\n\n### 单个权限验证\n\n使用 `v-auth` 指令进行单个权限验证。\n\n```html\n<div v-auth=\"'btn.add'\">\n  <el-button>新增</el-button>\n</div>\n\n<div v-auth=\"'btn.edit'\">\n  <el-button>编辑</el-button>\n</div>\n\n<div v-auth=\"'btn.del'\">\n  <el-button>删除</el-button>\n</div>\n\n<div v-auth=\"'btn.link'\">\n  <el-button>跳转</el-button>\n</div>\n```\n\n### 多个权限验证（满足一个）\n\n使用 `v-auths` 指令进行多个权限验证，满足其中一个即可显示。\n\n```html\n<div v-auths=\"['btn.addsss', 'btn.edit', 'btn.delsss', 'btn.linksss']\">\n  <el-button>新增</el-button>\n</div>\n\n<div v-auths=\"['btn.add', 'btn.edit', 'btn.del', 'btn.link']\">\n  <el-button>编辑</el-button>\n</div>\n```\n\n### 多个权限验证（全部满足）\n\n使用 `v-auth-all` 指令进行多个权限验证，必须全部满足才能显示。\n\n```html\n<div v-auth-all=\"['btn.add', 'btn.edit', 'btn.del', 'btn.link']\">\n  <el-button>新增</el-button>\n</div>\n\n<div v-auth-all=\"['btn.add', 'btn.edit', 'btn.del', 'btn.link']\">\n  <el-button>编辑</el-button>\n</div>\n```\n\n## 函数方式\n\n<Tip title=\"方法内权限判断\">\n方法位置：`/@/utils/authFunction.ts`，用于在方法逻辑中进行权限判断。\n</Tip>\n\n### 基本使用\n\n导入权限验证函数，在方法中进行权限判断。\n\n```ts\n<script lang=\"ts\" setup>\nimport { ElMessage } from 'element-plus';\nimport { auth, auths, authAll } from '/@/utils/authFunction';\n\n// 单个权限验证\nconst onAuthClick = () => {\n  if (!auth('btn.add')) ElMessage.error('抱歉，您没有权限！');\n  else ElMessage.success('恭喜，您有权限！');\n};\n// 多个权限验证，满足一个则为 true\nconst onAuthsClick = () => {\n  if (!auths(['btn.add', 'btn.edit'])) ElMessage.error('抱歉，您没有权限！');\n  else ElMessage.success('恭喜，您有权限！');\n};\n// 多个权限验证，全部满足则为 true\nconst onAuthAllClick = () => {\n  if (!authAll(['btn.add', 'btn.edit')) ElMessage.error('抱歉，您没有权限！');\n  else ElMessage.success('恭喜，您有权限！');\n};\n</script>\n```\n\n### 在模板中使用\n\n也可以在模板中结合 `v-if` 指令使用。\n\n```html\nimport { auth } from '/@/utils/authFunction';\n<div v-if=\"auth('sys_file_del')\">...</div>\n```","url":"/doc/pigx/front-end/pigx-front-permission"},{"lvl2":"2026-01-16 08:55:00.0","created_unix":1768524900000,"id":113,"lvl0":"前端数据状态管理","content":"## Pinia 状态管理\n\n<Tip title=\"状态管理方案\">\n框架使用 Pinia 进行数据状态管理，代码位置：`/src/stores`。详细信息请参考 [Pinia 官网](https://pinia.vuejs.org/)\n</Tip>\n\n<Warning title=\"历史版本说明\">\n旧版本使用 Vuex Module 模块化管理，相关文档：[Vuex 3.x 官网](https://v3.vuex.vuejs.org/zh/)\n</Warning>\n\n## 全局引入\n\n页面模块已做全局自动引入，代码位置：`/@/store/index.ts`。\n\n<Tip title=\"Vite 动态导入\">\n使用 [import.meta.globEager](https://vitejs.cn/guide/features.html#glob-import) 实现模块的自动导入。\n</Tip>\n\n```typescript\nconst modulesFiles = import.meta.globEager(\"./modules/*.ts\");\nconst pathList: string[] = [];\n\nfor (const path in modulesFiles) {\n  pathList.push(path);\n}\n\nconst modules = pathList.reduce(\n  (modules: { [x: string]: any }, modulePath: string) => {\n    const moduleName = modulePath.replace(/^./modules/(.*).w+$/, \"$1\");\n    const value = modulesFiles[modulePath];\n    modules[moduleName] = value.default;\n    return modules;\n  },\n  {}\n);\n```\n\n## 定义接口\n\n### Interface 定义\n\n在 `/@/store/interface/index.ts` 中定义数据结构接口，例如路由缓存列表 `KeepAliveNamesState`：\n\n```typescript\n// 路由缓存列表\nexport interface KeepAliveNamesState {\n  keepAliveNames: Array<string>;\n}\n```\n\n### Interface 使用\n\n在 `/@/store/modules/` 目录下新增模块文件，例如 `keepAliveNames.ts`。\n\n<Tip title=\"模块命名空间\">\n需要开启 `namespaced: true`，文件名称即为模块名称。详见 [Vuex Module 命名空间](https://next.vuex.vuejs.org/zh/guide/modules.html#命名空间)\n</Tip>\n\n```typescript {3,5}\nimport { Module } from \"vuex\";\n// 此处加上 `.ts` 后缀报错，具体原因不详\nimport { KeepAliveNamesState, RootStateTypes } from \"/@/store/interface/index\";\n\nconst keepAliveNamesModule: Module<KeepAliveNamesState, RootStateTypes> = {\n  namespaced: true,\n  state: {\n    keepAliveNames: [],\n  },\n  mutations: {\n    // 设置路由缓存（name字段）\n    getCacheKeepAlive(state: any, data: Array<string>) {\n      state.keepAliveNames = data;\n    },\n  },\n  actions: {\n    // 设置路由缓存（name字段）\n    async setCacheKeepAlive({ commit }, data: Array<string>) {\n      commit(\"getCacheKeepAlive\", data);\n    },\n  },\n};\n\nexport default keepAliveNamesModule;\n```\n\n## 定义模块\n\n在 `/@/store/modules/` 目录下新增模块文件（如 `keepAliveNames.ts`），并定义 `mutations`、`actions` 方法。\n\n## 使用模块\n\n### 在 TypeScript 中使用\n\n在 `.ts` 文件中导入 store 并使用 dispatch 或 commit 方法。\n\n```typescript\nimport { store } from \"/@/store/index.ts\";\n\n// dispatch\nstore.dispatch(\"keepAliveNames/setCacheKeepAlive\", cacheList);\n\n// 或者 commit\n// store.commit(\"keepAliveNames/getCacheKeepAlive\", cacheList);\n```\n\n### 在 Vue 组件中使用\n\n在 `.vue` 文件中通过 `useStore` 访问状态管理。\n\n```html {7,11,14}\n<template>\n  <div v-if=\"getThemeConfig.isLockScreen\">在 .vue 中使用</div>\n</template>\n\n<script lang=\"ts\">\n  import { computed, defineComponent } from \"vue\";\n  import { useStore } from \"/@/store/index\";\n  export default defineComponent({\n    name: \"app\",\n    setup() {\n      const store = useStore();\n      // 获取布局配置信息\n      const getThemeConfig = computed(() => {\n        return store.state.themeConfig.themeConfig;\n      });\n    },\n  });\n</script>\n```","url":"/doc/pigx/front-end/pigx-front-pinia"}],"query":"","processingTimeMs":0,"limit":20,"offset":0,"estimatedTotalHits":187}