Compare commits
32 Commits
97ea3e4df0
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
48f04577dc | ||
|
|
2b118d7409 | ||
|
|
8d824d12cd | ||
|
|
26a6db037a | ||
|
|
26f2215955 | ||
|
|
e3bf2f6870 | ||
|
|
f90e7a6566 | ||
|
|
19635c9c76 | ||
|
|
3a2af24c94 | ||
|
|
9e59e1dbea | ||
|
|
6c7e911364 | ||
|
|
6ac8a8c824 | ||
|
|
b4d9e15a65 | ||
|
|
5e88779532 | ||
|
|
4738fb6c84 | ||
|
|
4b511285b9 | ||
|
|
d685a22b60 | ||
|
|
158270b3b0 | ||
|
|
9b88b06e4c | ||
| b5769edf7e | |||
| 2068733f0d | |||
|
|
9b37932b46 | ||
|
|
7959ed9943 | ||
|
|
cf637d29bb | ||
|
|
dc6e69ae00 | ||
|
|
4967356f22 | ||
|
|
1a0c14c683 | ||
|
|
a1bf9e1d4b | ||
|
|
7238aa9ca5 | ||
|
|
38a7c7956e | ||
|
|
89f79774ff | ||
|
|
87ace8cbe8 |
5
.dockerignore
Normal file
5
.dockerignore
Normal file
@@ -0,0 +1,5 @@
|
||||
node_modules
|
||||
dist
|
||||
src/.vuepress/dist
|
||||
.git
|
||||
*.log
|
||||
13
Dockerfile
Normal file
13
Dockerfile
Normal file
@@ -0,0 +1,13 @@
|
||||
FROM node:20-alpine AS build
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY package.json package-lock.json ./
|
||||
RUN npm ci
|
||||
|
||||
COPY . .
|
||||
RUN npm run docs:build
|
||||
|
||||
FROM nginx:1.25-alpine
|
||||
|
||||
COPY --from=build /app/src/.vuepress/dist /usr/share/nginx/html
|
||||
7
Makefile
Normal file
7
Makefile
Normal file
@@ -0,0 +1,7 @@
|
||||
.PHONY: up down
|
||||
|
||||
up:
|
||||
docker compose up -d --build
|
||||
|
||||
down:
|
||||
docker compose down
|
||||
18
README.md
18
README.md
@@ -42,6 +42,24 @@ npm run docs:build
|
||||
|
||||
构建产物将生成在 `src/.vuepress/dist` 目录
|
||||
|
||||
### Docker 部署
|
||||
|
||||
需要先安装 Docker 和 Docker Compose v2。
|
||||
|
||||
启动服务:
|
||||
|
||||
```bash
|
||||
make up
|
||||
```
|
||||
|
||||
访问 `http://localhost:51888/` 即可查看站点。
|
||||
|
||||
停止服务:
|
||||
|
||||
```bash
|
||||
make down
|
||||
```
|
||||
|
||||
### 清除缓存开发
|
||||
|
||||
```bash
|
||||
|
||||
8
docker-compose.yml
Normal file
8
docker-compose.yml
Normal file
@@ -0,0 +1,8 @@
|
||||
services:
|
||||
myblog:
|
||||
image: myblog:latest
|
||||
build:
|
||||
context: .
|
||||
ports:
|
||||
- '51888:80'
|
||||
restart: unless-stopped
|
||||
75
docs/superpowers/specs/2026-03-26-docker-deploy-design.md
Normal file
75
docs/superpowers/specs/2026-03-26-docker-deploy-design.md
Normal file
@@ -0,0 +1,75 @@
|
||||
# Docker deployment (make up/down)
|
||||
|
||||
## Context
|
||||
- Project: VuePress v2 static blog (Vite).
|
||||
- Goal: one-command production deployment and teardown via `make up` and `make down`.
|
||||
- Hosting: root path `/`.
|
||||
- Port mapping: host `6666` -> container `80`.
|
||||
|
||||
## Goals
|
||||
- Provide a reproducible, production-grade deployment using Docker.
|
||||
- Keep operator commands minimal (`make up`, `make down`).
|
||||
- Ensure build failures fail fast and are visible.
|
||||
|
||||
## Non-goals
|
||||
- No development-mode container (`vuepress-vite dev`).
|
||||
- No additional runtime dependencies besides Docker.
|
||||
- No advanced orchestration (k8s, swarm).
|
||||
|
||||
## Assumptions
|
||||
- Docker Engine and Docker Compose v2 are available on the host.
|
||||
- `package-lock.json` is present; builds use `npm ci`.
|
||||
|
||||
## Proposed architecture
|
||||
- Multi-stage Docker image:
|
||||
- Stage 1 (build): Node image installs dependencies and runs `docs:build`.
|
||||
- Stage 2 (run): Nginx serves the generated static files.
|
||||
- `docker-compose.yml` manages a single service (e.g., `myblog`).
|
||||
- `Makefile` wraps compose commands for consistent UX.
|
||||
|
||||
## Components
|
||||
### Dockerfile
|
||||
- Base images: `node:20-alpine` (build), `nginx:1.25-alpine` (run).
|
||||
- Stage 1:
|
||||
- Workdir set to app root.
|
||||
- Copy `package.json` + `package-lock.json`, run `npm ci`.
|
||||
- Copy source and run `npm run docs:build`.
|
||||
- Stage 2:
|
||||
- Copy `src/.vuepress/dist/` to `/usr/share/nginx/html`.
|
||||
- Use default Nginx config for root `/`.
|
||||
|
||||
### .dockerignore
|
||||
- Exclude: `node_modules`, `dist`, `src/.vuepress/dist`, `.git`, `*.log`.
|
||||
|
||||
### docker-compose.yml
|
||||
- Service name: `myblog`.
|
||||
- Build context: repository root.
|
||||
- Image name: `myblog:latest`.
|
||||
- Port mapping: `6666:80`.
|
||||
- Restart policy: `unless-stopped`.
|
||||
|
||||
### Makefile
|
||||
- `make up`: `docker compose up -d --build`.
|
||||
- `make down`: `docker compose down`.
|
||||
- Optional commands (if desired later): `make logs`, `make ps`, `make rebuild`.
|
||||
|
||||
## Runtime flow
|
||||
1. Operator runs `make up`.
|
||||
2. Docker builds image (install deps -> build static site).
|
||||
3. Nginx container starts and serves static files.
|
||||
4. Operator runs `make down` to stop and remove the service.
|
||||
|
||||
## Error handling
|
||||
- Build failures (dependency install or VuePress build) cause `make up` to fail and exit.
|
||||
- Compose output provides the error details for diagnosis.
|
||||
|
||||
## Verification
|
||||
- Access `http://<host>:6666/` and confirm the site loads.
|
||||
- Optional: `docker compose logs -f` for runtime inspection.
|
||||
|
||||
## Security / operations
|
||||
- No secrets are required.
|
||||
- Container only exposes HTTP on port 80 inside the compose network.
|
||||
|
||||
## Open questions
|
||||
- None. All required inputs confirmed (production mode, root path, port 6666).
|
||||
@@ -206,6 +206,28 @@ export default sidebar({
|
||||
text: "常用记录",
|
||||
icon: "mdi:star",
|
||||
link: "/work/常用.md",
|
||||
},
|
||||
{
|
||||
text: "待办事项",
|
||||
icon: "fa6-solid:list-check",
|
||||
collapsible: true,
|
||||
children: [
|
||||
{
|
||||
text: "待办首页",
|
||||
icon: "mdi:home-outline",
|
||||
link: "/work/todo/",
|
||||
},
|
||||
{
|
||||
text: "4月待办",
|
||||
icon: "mdi:calendar-month",
|
||||
link: "/work/todo/2026-04.md",
|
||||
},
|
||||
{
|
||||
text: "3月待办",
|
||||
icon: "mdi:calendar-month",
|
||||
link: "/work/todo/2026-03.md",
|
||||
},
|
||||
],
|
||||
}
|
||||
],
|
||||
"/apps/": [
|
||||
@@ -234,79 +256,88 @@ export default sidebar({
|
||||
"/ai/": [
|
||||
{
|
||||
text: "OpenCode",
|
||||
icon: "mdi:application-braces-outline",
|
||||
icon: "fa6-solid:code",
|
||||
collapsible: true,
|
||||
children: [
|
||||
{
|
||||
text: "opencode-cli",
|
||||
icon: "fa6-solid:terminal",
|
||||
link: "opencode.md",
|
||||
},
|
||||
{
|
||||
text: "opencode-tui",
|
||||
icon: "fa6-solid:desktop",
|
||||
link: "opencode-tui.md",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "Superpowers",
|
||||
icon: "mdi:rocket-launch-outline",
|
||||
icon: "fa6-solid:rocket",
|
||||
collapsible: true,
|
||||
prefix: "superpowers/",
|
||||
children: [
|
||||
{
|
||||
text: "superpowers-总览",
|
||||
icon: "fa6-solid:eye",
|
||||
link: "opencode-superpowers-overview.md",
|
||||
},
|
||||
{
|
||||
text: "superpowers",
|
||||
icon: "fa6-solid:bolt",
|
||||
link: "opencode-superpowers.md",
|
||||
},
|
||||
{
|
||||
text: "skills-使用方案汇总",
|
||||
icon: "fa6-solid:book",
|
||||
link: "opencode-skills-playbook.md",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "Claude Code",
|
||||
icon: "mdi:source-branch",
|
||||
icon: "fa6-solid:code-branch",
|
||||
collapsible: true,
|
||||
children: [
|
||||
{
|
||||
text: "多分支工作流实战总结(2026)",
|
||||
icon: "fa6-solid:code-merge",
|
||||
link: "claude-code-branch-workflow-2026.md",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "ChatGPT",
|
||||
icon: "mdi:chat-processing-outline",
|
||||
icon: "fa6-solid:comments",
|
||||
collapsible: true,
|
||||
children: [
|
||||
{
|
||||
text: "chatgpt-使用记录与实践",
|
||||
icon: "fa6-solid:message",
|
||||
link: "chatgpt.md",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "OpenClaw",
|
||||
icon: "mdi:robot-outline",
|
||||
icon: "fa6-solid:robot",
|
||||
collapsible: true,
|
||||
children: [
|
||||
{
|
||||
text: "openclaw-24h在线部署实战",
|
||||
icon: "fa6-solid:server",
|
||||
link: "openclaw.md",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "iFlow",
|
||||
icon: "mdi:sitemap-outline",
|
||||
icon: "fa6-solid:diagram-project",
|
||||
collapsible: true,
|
||||
children: [
|
||||
{
|
||||
text: "iflow-流程编排实践记录",
|
||||
icon: "fa6-solid:flow-chart",
|
||||
link: "iflow.md",
|
||||
},
|
||||
],
|
||||
|
||||
@@ -21,3 +21,102 @@
|
||||
.vp-navbar .auto-link .vp-icon {
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.todo-page {
|
||||
--todo-border: rgba(220, 20, 60, 0.2);
|
||||
--todo-accent: rgba(220, 20, 60, 0.08);
|
||||
--todo-card-bg: rgba(255, 255, 255, 0.85);
|
||||
|
||||
.theme-hope-content {
|
||||
h1 {
|
||||
margin-bottom: 0.8rem;
|
||||
font-size: clamp(1.9rem, 2.6vw, 2.3rem);
|
||||
letter-spacing: 0.02em;
|
||||
}
|
||||
|
||||
blockquote {
|
||||
margin: 0.9rem 0 1.2rem;
|
||||
padding: 0.85rem 1rem;
|
||||
border-radius: 0.8rem;
|
||||
border: 1px solid var(--todo-border);
|
||||
background: linear-gradient(135deg, var(--todo-accent), rgba(220, 20, 60, 0.03));
|
||||
|
||||
p {
|
||||
margin: 0;
|
||||
line-height: 1.6;
|
||||
}
|
||||
}
|
||||
|
||||
hr {
|
||||
margin: 1.6rem 0;
|
||||
opacity: 0.45;
|
||||
}
|
||||
|
||||
h2 {
|
||||
margin: 1.5rem 0 0.8rem;
|
||||
padding-left: 0.65rem;
|
||||
border-left: 4px solid #dc143c;
|
||||
font-size: clamp(1.2rem, 2.1vw, 1.45rem);
|
||||
}
|
||||
|
||||
h3 {
|
||||
margin: 0.85rem 0 0;
|
||||
padding: 0.85rem 1rem;
|
||||
border: 1px solid var(--todo-border);
|
||||
border-bottom: 0;
|
||||
border-radius: 0.85rem 0.85rem 0 0;
|
||||
background: var(--todo-card-bg);
|
||||
line-height: 1.4;
|
||||
|
||||
.header-anchor {
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
|
||||
h3 + ul {
|
||||
margin: 0 0 0.95rem;
|
||||
padding: 0.8rem 1rem 0.95rem 1.25rem;
|
||||
border: 1px solid var(--todo-border);
|
||||
border-top: 0;
|
||||
border-radius: 0 0 0.85rem 0.85rem;
|
||||
background: var(--todo-card-bg);
|
||||
box-shadow: 0 8px 18px -18px rgba(220, 20, 60, 0.55);
|
||||
|
||||
li {
|
||||
margin: 0.2rem 0;
|
||||
}
|
||||
}
|
||||
|
||||
details {
|
||||
margin-top: 0.6rem;
|
||||
border: 1px dashed var(--todo-border);
|
||||
border-radius: 0.8rem;
|
||||
padding: 0.5rem 0.75rem;
|
||||
background: rgba(220, 20, 60, 0.03);
|
||||
|
||||
summary {
|
||||
cursor: pointer;
|
||||
font-weight: 600;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
.todo-page .theme-hope-content {
|
||||
h2 {
|
||||
margin-top: 1.2rem;
|
||||
padding-left: 0.5rem;
|
||||
}
|
||||
|
||||
h3 {
|
||||
padding: 0.75rem 0.8rem;
|
||||
font-size: 1.02rem;
|
||||
}
|
||||
|
||||
h3 + ul {
|
||||
padding: 0.7rem 0.8rem 0.8rem 1.1rem;
|
||||
margin-bottom: 0.8rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,210 @@
|
||||
---
|
||||
title: VSCode 进阶:命令面板工作流与配置治理
|
||||
icon: simple-icons:visualstudiocode
|
||||
date: 2026-03-30
|
||||
category:
|
||||
- 开发工具
|
||||
- 前端
|
||||
tag:
|
||||
- VSCode
|
||||
- 命令面板
|
||||
- settings.json
|
||||
- keybindings.json
|
||||
- Windows
|
||||
- Linux
|
||||
---
|
||||
|
||||
# VSCode 进阶:命令面板工作流与配置治理
|
||||
|
||||
这篇是入门篇的下一步,目标是把 VSCode 从“会用”升级到“高效、可维护”。
|
||||
|
||||
重点只讲三块:
|
||||
|
||||
1. 命令面板的进阶工作流
|
||||
2. 配置文件分层治理(User / Workspace / Profile)
|
||||
3. 可复用的进阶 JSON 模板
|
||||
|
||||
<!-- more -->
|
||||
|
||||
## 1. 命令面板进阶:把常用动作变成肌肉记忆
|
||||
|
||||
命令面板入口不变:`Ctrl + Shift + P`(Windows / Linux)。
|
||||
|
||||
建议只记住下面这组高频命令:
|
||||
|
||||
1. `>Preferences: Open User Settings (JSON)`
|
||||
2. `>Preferences: Open Workspace Settings (JSON)`
|
||||
3. `>Preferences: Open Keyboard Shortcuts (JSON)`
|
||||
4. `>Tasks: Configure Task`
|
||||
5. `>Developer: Reload Window`
|
||||
6. `>Profiles: Create Profile`
|
||||
7. `>Extensions: Show Installed Extensions`
|
||||
|
||||
实战思路:遇到任何需求,先用命令面板搜“动词 + 目标”,比如 `open settings json`、`create profile`。
|
||||
|
||||
## 2. 配置治理模型:谁该放在哪里
|
||||
|
||||
### 2.1 User settings(全局)
|
||||
|
||||
- Windows: `%APPDATA%\\Code\\User\\settings.json`
|
||||
- Linux: `~/.config/Code/User/settings.json`
|
||||
|
||||
放“个人偏好”:字体、自动保存、终端默认 shell、编辑体验。
|
||||
|
||||
### 2.2 Workspace settings(项目)
|
||||
|
||||
- 项目路径:`.vscode/settings.json`
|
||||
|
||||
放“项目约束”:缩进、格式化策略、特定语言规则、排除目录。
|
||||
|
||||
### 2.3 Profile(场景)
|
||||
|
||||
Profile 适合“多工作模式”用户,例如:
|
||||
|
||||
- `Frontend`:前端开发扩展 + 偏好
|
||||
- `Backend`:后端开发扩展 + 偏好
|
||||
- `Minimal`:低干扰写作/阅读模式
|
||||
|
||||
建议:
|
||||
|
||||
- 固定偏好放 User
|
||||
- 项目规范放 Workspace
|
||||
- 场景差异放 Profile
|
||||
|
||||
## 3. keybindings.json:给命令面板加速
|
||||
|
||||
打开方式:
|
||||
|
||||
- `Ctrl + Shift + P`
|
||||
- 输入 `Open Keyboard Shortcuts (JSON)`
|
||||
|
||||
示例(Windows / Linux 通用):
|
||||
|
||||
```json
|
||||
[
|
||||
{
|
||||
"key": "ctrl+alt+r",
|
||||
"command": "workbench.action.reloadWindow"
|
||||
},
|
||||
{
|
||||
"key": "ctrl+alt+,",
|
||||
"command": "workbench.action.openSettingsJson"
|
||||
},
|
||||
{
|
||||
"key": "ctrl+alt+t",
|
||||
"command": "workbench.action.tasks.runTask"
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
注意:如果快捷键冲突,VSCode 会以后定义或更具体 `when` 条件为准。
|
||||
|
||||
## 4. 进阶 settings.json 模板(Windows + Linux)
|
||||
|
||||
下面模板建议放在 User 级,并按你环境微调:
|
||||
|
||||
```json
|
||||
{
|
||||
"editor.fontSize": 14,
|
||||
"editor.lineHeight": 1.7,
|
||||
"editor.tabSize": 2,
|
||||
"editor.wordWrap": "on",
|
||||
"editor.minimap.enabled": false,
|
||||
"editor.bracketPairColorization.enabled": true,
|
||||
|
||||
"files.autoSave": "onFocusChange",
|
||||
"files.trimTrailingWhitespace": true,
|
||||
"files.insertFinalNewline": true,
|
||||
"files.watcherExclude": {
|
||||
"**/.git/objects/**": true,
|
||||
"**/node_modules/**": true,
|
||||
"**/dist/**": true
|
||||
},
|
||||
|
||||
"editor.formatOnSave": true,
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
||||
"editor.codeActionsOnSave": {
|
||||
"source.fixAll": "explicit",
|
||||
"source.organizeImports": "explicit"
|
||||
},
|
||||
|
||||
"terminal.integrated.defaultProfile.windows": "PowerShell",
|
||||
"terminal.integrated.defaultProfile.linux": "bash",
|
||||
|
||||
"workbench.startupEditor": "none",
|
||||
"workbench.editor.enablePreview": false,
|
||||
"workbench.tree.indent": 16
|
||||
}
|
||||
```
|
||||
|
||||
如果你不用 Prettier,把 `editor.defaultFormatter` 改成你实际使用的扩展 ID。
|
||||
|
||||
## 5. Workspace 模板:把项目规范写死
|
||||
|
||||
建议每个项目都放一个最小 `.vscode/settings.json`:
|
||||
|
||||
```json
|
||||
{
|
||||
"editor.tabSize": 2,
|
||||
"editor.insertSpaces": true,
|
||||
"editor.detectIndentation": false,
|
||||
"files.eol": "\n"
|
||||
}
|
||||
```
|
||||
|
||||
这样团队成员打开项目时,基础编辑行为就能统一。
|
||||
|
||||
## 6. 命令面板 + Task:一键执行项目动作
|
||||
|
||||
进阶建议:把常用命令(如构建、测试)写进 Task,再通过命令面板触发。
|
||||
|
||||
`.vscode/tasks.json` 示例:
|
||||
|
||||
```json
|
||||
{
|
||||
"version": "2.0.0",
|
||||
"tasks": [
|
||||
{
|
||||
"label": "docs:build",
|
||||
"type": "shell",
|
||||
"command": "npm run docs:build",
|
||||
"group": "build",
|
||||
"problemMatcher": []
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
触发方式:
|
||||
|
||||
1. `Ctrl + Shift + P`
|
||||
2. 输入 `Run Task`
|
||||
3. 选择 `docs:build`
|
||||
|
||||
## 7. 常见坑与排查
|
||||
|
||||
### 7.1 改了配置却没生效
|
||||
|
||||
先执行 `Developer: Reload Window`,再验证。
|
||||
|
||||
### 7.2 User 和 Workspace 打架
|
||||
|
||||
按“项目优先”原则,检查 `.vscode/settings.json` 是否覆盖了 User。
|
||||
|
||||
### 7.3 JSON 报错
|
||||
|
||||
确保:
|
||||
|
||||
- 不要尾逗号
|
||||
- 全部键名和字符串使用双引号
|
||||
- 文件是合法 JSON(不是 JSONC 风格时不要写注释)
|
||||
|
||||
## 8. 进阶完成标准
|
||||
|
||||
- [ ] 能通过命令面板完成设置、任务、重载
|
||||
- [ ] 能区分 User / Workspace / Profile 三层职责
|
||||
- [ ] 有自己的 `keybindings.json` 高频快捷键
|
||||
- [ ] 有项目级 `.vscode/settings.json` 规范
|
||||
- [ ] 能用 `tasks.json` 一键触发常用命令
|
||||
|
||||
做到这 5 点,VSCode 就从“编辑器”变成你的“稳定开发操作台”。
|
||||
@@ -0,0 +1,180 @@
|
||||
---
|
||||
title: VSCode 使用入门:命令面板与 settings.json
|
||||
icon: simple-icons:visualstudiocode
|
||||
date: 2026-03-30
|
||||
category:
|
||||
- 开发工具
|
||||
- 前端
|
||||
tag:
|
||||
- VSCode
|
||||
- 命令面板
|
||||
- settings.json
|
||||
- Windows
|
||||
- Linux
|
||||
---
|
||||
|
||||
# VSCode 使用入门:命令面板与 settings.json
|
||||
|
||||
这是一篇极速 15 分钟上手指南,重点只讲三件事:
|
||||
|
||||
1. VSCode 的基本概念
|
||||
2. 命令面板怎么高频使用
|
||||
3. 不进图形化设置,直接改 `settings.json`
|
||||
|
||||
<!-- more -->
|
||||
|
||||
## 1. 先认识 4 个核心概念
|
||||
|
||||
### 1.1 编辑器 vs 工作区
|
||||
|
||||
- **编辑器**:你看到和编辑代码的窗口。
|
||||
- **工作区(Workspace)**:当前打开的项目(一个或多个文件夹)。
|
||||
|
||||
### 1.2 配置分层(最重要)
|
||||
|
||||
VSCode 的设置是分层生效的:
|
||||
|
||||
1. **默认设置(Default)**:VSCode 内置。
|
||||
2. **用户设置(User)**:你机器上的全局偏好。
|
||||
3. **工作区设置(Workspace)**:只对当前项目生效。
|
||||
|
||||
如果同一个键同时存在,通常是 `Workspace` 覆盖 `User`。
|
||||
|
||||
### 1.3 命令面板(Command Palette)
|
||||
|
||||
命令面板是 VSCode 的“统一入口”。
|
||||
|
||||
- Windows/Linux:`Ctrl + Shift + P`
|
||||
- 也可按 `F1`
|
||||
|
||||
你可以在这里执行几乎所有操作,包括打开 JSON 配置。
|
||||
|
||||
### 1.4 扩展不是“额外功能”,而是能力层
|
||||
|
||||
VSCode 本体很轻,很多语言能力来自扩展。
|
||||
但本篇先不讲扩展安装,先把命令面板和配置体系打通。
|
||||
|
||||
## 2. 命令面板:先会这 6 条命令
|
||||
|
||||
按 `Ctrl + Shift + P` 后直接输入:
|
||||
|
||||
1. `>` + `Reload Window`:重载窗口,配置变更后常用。
|
||||
2. `>Developer: Reload Window`:同上,完整命令名。
|
||||
3. `>Preferences: Open User Settings (JSON)`:打开全局配置。
|
||||
4. `>Preferences: Open Workspace Settings (JSON)`:打开项目配置。
|
||||
5. `>Preferences: Open Default Settings (JSON)`:查看默认值(只读参考)。
|
||||
6. `>Files: Auto Save`:快速切自动保存策略。
|
||||
|
||||
技巧:命令面板支持模糊搜索,你记不全命令名也能找到。
|
||||
|
||||
## 3. settings.json 到底放哪
|
||||
|
||||
### 3.1 用户配置(全局)
|
||||
|
||||
- Windows: `%APPDATA%\\Code\\User\\settings.json`
|
||||
- Linux: `~/.config/Code/User/settings.json`
|
||||
|
||||
建议:全局偏好(字体、自动保存、格式化默认行为)放这里。
|
||||
|
||||
### 3.2 工作区配置(项目级)
|
||||
|
||||
- 项目根目录:`.vscode/settings.json`
|
||||
|
||||
建议:和项目强相关的配置放这里(例如某项目缩进、格式化器、排除目录)。
|
||||
|
||||
## 4. 用命令面板打开 JSON 配置(不进图形设置)
|
||||
|
||||
### 4.1 打开用户配置
|
||||
|
||||
1. `Ctrl + Shift + P`
|
||||
2. 输入 `Open User Settings (JSON)`
|
||||
3. 回车
|
||||
|
||||
### 4.2 打开工作区配置
|
||||
|
||||
1. `Ctrl + Shift + P`
|
||||
2. 输入 `Open Workspace Settings (JSON)`
|
||||
3. 回车
|
||||
|
||||
如果项目里没有 `.vscode/settings.json`,VSCode 会帮你创建。
|
||||
|
||||
## 5. 可直接粘贴的入门模板
|
||||
|
||||
下面这份建议先放在 **User settings.json**,适用于 Windows + Linux。
|
||||
|
||||
```json
|
||||
{
|
||||
"editor.fontSize": 14,
|
||||
"editor.tabSize": 2,
|
||||
"editor.wordWrap": "on",
|
||||
"editor.minimap.enabled": false,
|
||||
|
||||
"files.autoSave": "onFocusChange",
|
||||
"files.trimTrailingWhitespace": true,
|
||||
"files.insertFinalNewline": true,
|
||||
|
||||
"editor.formatOnSave": true,
|
||||
"editor.codeActionsOnSave": {
|
||||
"source.fixAll": "explicit"
|
||||
},
|
||||
|
||||
"terminal.integrated.defaultProfile.windows": "PowerShell",
|
||||
"terminal.integrated.defaultProfile.linux": "bash",
|
||||
|
||||
"files.exclude": {
|
||||
"**/.DS_Store": true,
|
||||
"**/node_modules": true,
|
||||
"**/.git": false
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
说明:
|
||||
|
||||
- `formatOnSave` 依赖你安装并启用对应语言的格式化扩展。
|
||||
- `source.fixAll` 设为 `explicit` 更稳,避免每次保存都触发过多修复。
|
||||
- `terminal.integrated.defaultProfile.*` 按你的本机实际 shell 调整。
|
||||
|
||||
## 6. User 与 Workspace 怎么分
|
||||
|
||||
推荐这套规则:
|
||||
|
||||
- 放 `User`:你个人习惯,跨项目都想保留。
|
||||
- 放 `Workspace`:只在当前项目生效的规则。
|
||||
|
||||
示例:某项目要求 4 空格缩进,就写到该项目 `.vscode/settings.json`:
|
||||
|
||||
```json
|
||||
{
|
||||
"editor.tabSize": 4,
|
||||
"editor.insertSpaces": true
|
||||
}
|
||||
```
|
||||
|
||||
## 7. 常见问题(JSON 配置方式)
|
||||
|
||||
### 7.1 配置不生效
|
||||
|
||||
按 `Ctrl + Shift + P` 执行 `Developer: Reload Window`,再验证。
|
||||
|
||||
### 7.2 JSON 报错(逗号、引号)
|
||||
|
||||
`settings.json` 必须是合法 JSON。重点检查:
|
||||
|
||||
- 最后一项后面不要多逗号
|
||||
- 键名和字符串值要用双引号
|
||||
|
||||
### 7.3 不确定某个键该写什么
|
||||
|
||||
用命令面板打开 `Default Settings (JSON)` 搜索对应键,按默认文档写。
|
||||
|
||||
## 8. 15 分钟上手清单
|
||||
|
||||
- [ ] 会用 `Ctrl + Shift + P` 打开命令面板
|
||||
- [ ] 会打开 `User Settings (JSON)`
|
||||
- [ ] 会打开 `Workspace Settings (JSON)`
|
||||
- [ ] 能区分 User 与 Workspace 的生效范围
|
||||
- [ ] 粘贴并调整一份可用的 `settings.json`
|
||||
- [ ] 配置不生效时会执行 `Reload Window`
|
||||
|
||||
完成以上 6 项,你已经跨过 VSCode 入门阶段。
|
||||
104
src/programming/linux/Linux_Mint/scripts/expand_swap.sh
Executable file
104
src/programming/linux/Linux_Mint/scripts/expand_swap.sh
Executable file
@@ -0,0 +1,104 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Swap空间扩展脚本
|
||||
# 将 /swapfile 从 8GB 扩展到 24GB
|
||||
|
||||
set -e # 遇到错误立即退出
|
||||
|
||||
echo "=========================================="
|
||||
echo "Swap空间扩展脚本"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
|
||||
# 颜色定义
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
RED='\033[0;31m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# 检查是否有sudo权限
|
||||
if ! sudo -n true 2>/dev/null; then
|
||||
echo -e "${YELLOW}此脚本需要sudo权限,请输入密码${NC}"
|
||||
fi
|
||||
|
||||
echo "步骤 1/7: 显示当前swap状态"
|
||||
echo "----------------------------------------"
|
||||
swapon --show
|
||||
free -h
|
||||
echo ""
|
||||
|
||||
read -p "确认要继续吗?这将临时关闭swap空间 (y/n): " -n 1 -r
|
||||
echo ""
|
||||
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
||||
echo -e "${RED}操作已取消${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "步骤 2/7: 关闭现有 /swapfile"
|
||||
echo "----------------------------------------"
|
||||
sudo swapoff /swapfile
|
||||
echo -e "${GREEN}✓ 已关闭 /swapfile${NC}"
|
||||
echo ""
|
||||
|
||||
echo "步骤 3/7: 删除旧的 swapfile"
|
||||
echo "----------------------------------------"
|
||||
sudo rm /swapfile
|
||||
echo -e "${GREEN}✓ 已删除旧文件${NC}"
|
||||
echo ""
|
||||
|
||||
echo "步骤 4/7: 创建新的 24GB swapfile"
|
||||
echo "----------------------------------------"
|
||||
echo "使用 fallocate 快速创建(约需10-30秒)..."
|
||||
sudo fallocate -l 24G /swapfile
|
||||
echo -e "${GREEN}✓ 已创建 24GB swapfile${NC}"
|
||||
echo ""
|
||||
|
||||
echo "步骤 5/7: 设置文件权限"
|
||||
echo "----------------------------------------"
|
||||
sudo chmod 600 /swapfile
|
||||
echo -e "${GREEN}✓ 权限已设置为 600${NC}"
|
||||
echo ""
|
||||
|
||||
echo "步骤 6/7: 格式化为swap"
|
||||
echo "----------------------------------------"
|
||||
sudo mkswap /swapfile
|
||||
echo -e "${GREEN}✓ 格式化完成${NC}"
|
||||
echo ""
|
||||
|
||||
echo "步骤 7/7: 启用新的swapfile"
|
||||
echo "----------------------------------------"
|
||||
sudo swapon /swapfile
|
||||
echo -e "${GREEN}✓ 已启用新的swapfile${NC}"
|
||||
echo ""
|
||||
|
||||
echo "=========================================="
|
||||
echo "扩展完成!当前swap状态:"
|
||||
echo "=========================================="
|
||||
swapon --show
|
||||
echo ""
|
||||
free -h
|
||||
echo ""
|
||||
|
||||
# 检查 /etc/fstab 配置
|
||||
echo "----------------------------------------"
|
||||
echo "检查 /etc/fstab 配置..."
|
||||
echo "----------------------------------------"
|
||||
if grep -q "^/swapfile" /etc/fstab; then
|
||||
echo -e "${GREEN}✓ /etc/fstab 已包含 swapfile 配置${NC}"
|
||||
else
|
||||
echo -e "${YELLOW}⚠ /etc/fstab 中未找到 swapfile 配置${NC}"
|
||||
read -p "是否添加到 /etc/fstab 以确保重启后生效?(y/n): " -n 1 -r
|
||||
echo ""
|
||||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
|
||||
echo -e "${GREEN}✓ 已添加到 /etc/fstab${NC}"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo -e "${GREEN}所有操作完成!${NC}"
|
||||
echo "=========================================="
|
||||
echo "总Swap空间: ~31GB (24GB swapfile + 7.3GB zram)"
|
||||
echo ""
|
||||
166
src/programming/linux/Linux_Mint/scripts/optimize_memory_policy.sh
Executable file
166
src/programming/linux/Linux_Mint/scripts/optimize_memory_policy.sh
Executable file
@@ -0,0 +1,166 @@
|
||||
#!/bin/bash
|
||||
|
||||
# 内存策略优化脚本
|
||||
# 1. 调整 swappiness 到 40
|
||||
# 2. 安装并启用 earlyoom
|
||||
|
||||
set -e
|
||||
|
||||
echo "=========================================="
|
||||
echo "内存策略优化脚本"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
|
||||
# 颜色定义
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
RED='\033[0;31m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m'
|
||||
|
||||
# 检查sudo权限
|
||||
if ! sudo -n true 2>/dev/null; then
|
||||
echo -e "${YELLOW}此脚本需要sudo权限,请输入密码${NC}"
|
||||
fi
|
||||
|
||||
echo -e "${BLUE}优化项目:${NC}"
|
||||
echo "1. 调整 vm.swappiness 从 10 到 40"
|
||||
echo " - 更好地利用高性能zram"
|
||||
echo " - 释放更多物理内存给活跃进程"
|
||||
echo ""
|
||||
echo "2. 安装 earlyoom"
|
||||
echo " - 防止系统因内存耗尽而卡死"
|
||||
echo " - 内存不足时提前终止占用最多的进程"
|
||||
echo ""
|
||||
|
||||
read -p "确认要继续吗?(y/n): " -n 1 -r
|
||||
echo ""
|
||||
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
||||
echo -e "${RED}操作已取消${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo "优化 1/2: 调整 swappiness"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
|
||||
echo "当前 swappiness 值:"
|
||||
sysctl vm.swappiness
|
||||
echo ""
|
||||
|
||||
echo "步骤 1: 临时调整 swappiness 到 40"
|
||||
echo "----------------------------------------"
|
||||
sudo sysctl vm.swappiness=40
|
||||
echo -e "${GREEN}✓ 临时调整完成(立即生效)${NC}"
|
||||
echo ""
|
||||
|
||||
echo "步骤 2: 永久保存配置"
|
||||
echo "----------------------------------------"
|
||||
# 备份配置文件
|
||||
if [ -f /etc/sysctl.conf ]; then
|
||||
sudo cp /etc/sysctl.conf /etc/sysctl.conf.backup.$(date +%Y%m%d_%H%M%S)
|
||||
echo -e "${GREEN}✓ 已备份 /etc/sysctl.conf${NC}"
|
||||
fi
|
||||
|
||||
# 更新或添加 swappiness 配置
|
||||
if grep -q "^vm.swappiness" /etc/sysctl.conf; then
|
||||
sudo sed -i 's/^vm.swappiness=.*/vm.swappiness=40/' /etc/sysctl.conf
|
||||
echo -e "${GREEN}✓ 已更新 /etc/sysctl.conf 中的 swappiness${NC}"
|
||||
else
|
||||
echo "vm.swappiness=40" | sudo tee -a /etc/sysctl.conf > /dev/null
|
||||
echo -e "${GREEN}✓ 已添加 swappiness 配置到 /etc/sysctl.conf${NC}"
|
||||
fi
|
||||
echo ""
|
||||
|
||||
echo "验证配置:"
|
||||
sysctl vm.swappiness
|
||||
grep "vm.swappiness" /etc/sysctl.conf
|
||||
echo ""
|
||||
|
||||
echo "=========================================="
|
||||
echo "优化 2/2: 安装 earlyoom"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
|
||||
# 检查是否已安装
|
||||
if dpkg -l | grep -q "^ii.*earlyoom"; then
|
||||
echo -e "${YELLOW}⚠ earlyoom 已安装${NC}"
|
||||
ALREADY_INSTALLED=true
|
||||
else
|
||||
echo "步骤 1: 安装 earlyoom"
|
||||
echo "----------------------------------------"
|
||||
sudo apt update
|
||||
sudo apt install -y earlyoom
|
||||
echo -e "${GREEN}✓ earlyoom 安装完成${NC}"
|
||||
echo ""
|
||||
ALREADY_INSTALLED=false
|
||||
fi
|
||||
|
||||
echo "步骤 2: 配置 earlyoom"
|
||||
echo "----------------------------------------"
|
||||
|
||||
# 创建配置文件
|
||||
sudo tee /etc/default/earlyoom > /dev/null <<'EOF'
|
||||
# earlyoom configuration
|
||||
|
||||
# Minimum available memory (in percent)
|
||||
# Kill processes when available memory drops below this
|
||||
EARLYOOM_ARGS="-m 5 -s 10 --avoid '(^|/)(init|systemd|Xorg|sshd)$' --prefer '(^|/)(java|chrome|firefox|vmware)$'"
|
||||
|
||||
# -m 5: Kill when available memory < 5%
|
||||
# -s 10: Kill when swap free < 10%
|
||||
# --avoid: Never kill these critical processes
|
||||
# --prefer: Prefer to kill these memory-hungry processes
|
||||
EOF
|
||||
|
||||
echo -e "${GREEN}✓ 已配置 earlyoom${NC}"
|
||||
echo ""
|
||||
echo "配置内容:"
|
||||
cat /etc/default/earlyoom
|
||||
echo ""
|
||||
|
||||
echo "步骤 3: 启用并启动 earlyoom 服务"
|
||||
echo "----------------------------------------"
|
||||
sudo systemctl enable earlyoom
|
||||
sudo systemctl restart earlyoom
|
||||
sleep 1
|
||||
echo -e "${GREEN}✓ earlyoom 服务已启动${NC}"
|
||||
echo ""
|
||||
|
||||
echo "服务状态:"
|
||||
sudo systemctl status earlyoom --no-pager -l
|
||||
echo ""
|
||||
|
||||
echo "=========================================="
|
||||
echo -e "${GREEN}优化完成!${NC}"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
|
||||
echo -e "${BLUE}优化结果总结:${NC}"
|
||||
echo ""
|
||||
echo "1. ✅ swappiness 已调整到 40"
|
||||
echo " - 当前值: $(sysctl -n vm.swappiness)"
|
||||
echo " - 配置文件: /etc/sysctl.conf"
|
||||
echo " - 重启后自动生效"
|
||||
echo ""
|
||||
echo "2. ✅ earlyoom 已安装并运行"
|
||||
echo " - 服务状态: $(systemctl is-active earlyoom)"
|
||||
echo " - 内存阈值: 可用内存 < 5% 时触发"
|
||||
echo " - Swap阈值: 可用swap < 10% 时触发"
|
||||
echo ""
|
||||
|
||||
echo -e "${BLUE}当前内存状态:${NC}"
|
||||
free -h
|
||||
echo ""
|
||||
|
||||
echo -e "${BLUE}预期效果:${NC}"
|
||||
echo "✓ 系统会更积极地使用高性能zram"
|
||||
echo "✓ 物理内存得到更好的利用"
|
||||
echo "✓ 内存不足时earlyoom会提前介入"
|
||||
echo "✓ 避免系统因内存耗尽而卡死"
|
||||
echo ""
|
||||
|
||||
echo -e "${GREEN}所有优化已完成!${NC}"
|
||||
echo ""
|
||||
145
src/programming/linux/Linux_Mint/scripts/setup_zram_only.sh
Executable file
145
src/programming/linux/Linux_Mint/scripts/setup_zram_only.sh
Executable file
@@ -0,0 +1,145 @@
|
||||
#!/bin/bash
|
||||
|
||||
# 纯zram Swap配置脚本
|
||||
# 禁用文件swap,使用zram作为唯一swap
|
||||
|
||||
set -e
|
||||
|
||||
echo "=========================================="
|
||||
echo "纯zram Swap配置脚本"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
|
||||
# 颜色定义
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
RED='\033[0;31m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m'
|
||||
|
||||
# 检查sudo权限
|
||||
if ! sudo -n true 2>/dev/null; then
|
||||
echo -e "${YELLOW}此脚本需要sudo权限,请输入密码${NC}"
|
||||
fi
|
||||
|
||||
echo "当前swap状态:"
|
||||
echo "----------------------------------------"
|
||||
swapon --show
|
||||
free -h
|
||||
zramctl
|
||||
echo ""
|
||||
|
||||
echo -e "${BLUE}配置说明:${NC}"
|
||||
echo "- 将zram从25%提升到80%物理内存(约23GB)"
|
||||
echo "- 禁用文件swap (/swapfile)"
|
||||
echo "- 使用zstd压缩算法(压缩比约3-4倍)"
|
||||
echo "- 预计可用swap空间:70-90GB(压缩后)"
|
||||
echo ""
|
||||
|
||||
read -p "确认要继续吗?(y/n): " -n 1 -r
|
||||
echo ""
|
||||
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
||||
echo -e "${RED}操作已取消${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "步骤 1/6: 关闭所有swap"
|
||||
echo "----------------------------------------"
|
||||
sudo swapoff -a
|
||||
echo -e "${GREEN}✓ 已关闭所有swap${NC}"
|
||||
echo ""
|
||||
|
||||
echo "步骤 2/6: 备份zram配置"
|
||||
echo "----------------------------------------"
|
||||
sudo cp /etc/default/zramswap /etc/default/zramswap.backup.$(date +%Y%m%d_%H%M%S)
|
||||
echo -e "${GREEN}✓ 已备份到 /etc/default/zramswap.backup.*${NC}"
|
||||
echo ""
|
||||
|
||||
echo "步骤 3/6: 更新zram配置"
|
||||
echo "----------------------------------------"
|
||||
sudo tee /etc/default/zramswap > /dev/null <<'EOF'
|
||||
# Compression algorithm selection
|
||||
# zstd provides best compression ratio
|
||||
ALGO=zstd
|
||||
|
||||
# Use 80% of physical RAM for zram
|
||||
# With ~30GB RAM, this gives ~24GB zram
|
||||
# With 3-4x compression, effective swap: 70-90GB
|
||||
PERCENT=80
|
||||
|
||||
# Higher priority than file-based swap
|
||||
PRIORITY=100
|
||||
EOF
|
||||
echo -e "${GREEN}✓ 已更新配置:80% RAM, zstd算法${NC}"
|
||||
cat /etc/default/zramswap
|
||||
echo ""
|
||||
|
||||
echo "步骤 4/6: 重启zram服务"
|
||||
echo "----------------------------------------"
|
||||
sudo systemctl restart zramswap.service
|
||||
sleep 2
|
||||
echo -e "${GREEN}✓ zram服务已重启${NC}"
|
||||
echo ""
|
||||
|
||||
echo "步骤 5/6: 禁用文件swap"
|
||||
echo "----------------------------------------"
|
||||
if [ -f /swapfile ]; then
|
||||
# 从fstab中注释掉swapfile
|
||||
if grep -q "^/swapfile" /etc/fstab; then
|
||||
sudo sed -i.backup 's|^/swapfile|#/swapfile|' /etc/fstab
|
||||
echo -e "${GREEN}✓ 已在 /etc/fstab 中禁用 /swapfile${NC}"
|
||||
fi
|
||||
|
||||
read -p "是否删除 /swapfile 文件以释放磁盘空间?(y/n): " -n 1 -r
|
||||
echo ""
|
||||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||
sudo rm /swapfile
|
||||
echo -e "${GREEN}✓ 已删除 /swapfile (释放8GB磁盘空间)${NC}"
|
||||
else
|
||||
echo -e "${YELLOW}⚠ 保留 /swapfile 文件${NC}"
|
||||
fi
|
||||
else
|
||||
echo -e "${YELLOW}⚠ 未找到 /swapfile${NC}"
|
||||
fi
|
||||
echo ""
|
||||
|
||||
echo "步骤 6/6: 验证配置"
|
||||
echo "----------------------------------------"
|
||||
echo ""
|
||||
echo "Swap设备列表:"
|
||||
swapon --show
|
||||
echo ""
|
||||
echo "内存状态:"
|
||||
free -h
|
||||
echo ""
|
||||
echo "zram详细信息:"
|
||||
zramctl
|
||||
echo ""
|
||||
|
||||
# 计算压缩比
|
||||
ZRAM_INFO=$(zramctl --raw --noheadings)
|
||||
DISKSIZE=$(echo "$ZRAM_INFO" | awk '{print $3}')
|
||||
DATA=$(echo "$ZRAM_INFO" | awk '{print $4}')
|
||||
COMPR=$(echo "$ZRAM_INFO" | awk '{print $5}')
|
||||
|
||||
echo "=========================================="
|
||||
echo -e "${GREEN}配置完成!${NC}"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
echo -e "${BLUE}zram统计信息:${NC}"
|
||||
echo "- 分配大小: $DISKSIZE"
|
||||
echo "- 实际数据: $DATA"
|
||||
echo "- 压缩后: $COMPR"
|
||||
if [ ! -z "$DATA" ] && [ ! -z "$COMPR" ]; then
|
||||
echo "- 当前压缩比: 约 $(echo "$DATA $COMPR" | awk '{printf "%.1f", $1/$2}'):1"
|
||||
fi
|
||||
echo ""
|
||||
echo -e "${BLUE}优势:${NC}"
|
||||
echo "✓ 性能:内存级swap,比文件swap快100倍+"
|
||||
echo "✓ 寿命:无磁盘写入,延长SSD寿命"
|
||||
echo "✓ 容量:压缩后可提供70-90GB有效swap空间"
|
||||
echo "✓ 效率:zstd算法提供最佳压缩比"
|
||||
echo ""
|
||||
echo -e "${YELLOW}注意:重启后配置自动生效${NC}"
|
||||
echo ""
|
||||
209
src/programming/linux/Linux_Mint/xfce终端常用快捷指令.md
Normal file
209
src/programming/linux/Linux_Mint/xfce终端常用快捷指令.md
Normal file
@@ -0,0 +1,209 @@
|
||||
---
|
||||
title: Linux Mint XFCE 终端常用快捷指令完全指南
|
||||
icon: simple-icons:linuxmint
|
||||
date: 2026-03-30
|
||||
category:
|
||||
- Linux
|
||||
tag:
|
||||
- Linux Mint
|
||||
- XFCE
|
||||
- 终端
|
||||
- 快捷键
|
||||
- 效率提升
|
||||
---
|
||||
|
||||
# Linux Mint XFCE 终端常用快捷指令完全指南
|
||||
|
||||
XFCE 终端是 Linux Mint XFCE 桌面环境默认的命令行工具,熟练掌握其快捷键可以极大提升工作效率。本文整理了最实用的 XFCE 终端快捷键,涵盖导航、编辑、显示调整等各个方面,帮助你更高效地使用终端。
|
||||
|
||||
<!-- more -->
|
||||
|
||||
## 一、基础导航类快捷键
|
||||
|
||||
### 1.1 标签页管理
|
||||
|
||||
| 快捷键 | 功能描述 | 使用场景 |
|
||||
|--------|----------|----------|
|
||||
| `Ctrl+Shift+T` | 新建标签页 | 需要同时运行多个命令时 |
|
||||
| `Ctrl+PgUp` / `Ctrl+PgDown` | 切换到上一个/下一个标签页 | 在多个标签页间快速切换 |
|
||||
| `Alt+数字键` | 切换到指定序号标签页 | 直接跳转到特定标签页 |
|
||||
| `Ctrl+Shift+W` | 关闭当前标签页 | 清理不再需要的终端会话 |
|
||||
| `Ctrl+Shift+R` | 重命名当前标签页 | 为标签页设置描述性名称 |
|
||||
|
||||
### 1.2 窗口管理
|
||||
|
||||
| 快捷键 | 功能描述 | 使用场景 |
|
||||
|--------|----------|----------|
|
||||
| `Ctrl+Shift+N` | 新建终端窗口 | 需要独立的终端窗口 |
|
||||
| `Ctrl+Shift+O` | 水平分割窗口 | 同时查看或操作多个内容 |
|
||||
| `Ctrl+Shift+E` | 垂直分割窗口 | 并排对比或操作 |
|
||||
| `Ctrl+Shift+Q` | 关闭终端窗口 | 退出终端应用程序 |
|
||||
|
||||
### 1.3 滚动与导航
|
||||
|
||||
| 快捷键 | 功能描述 | 使用场景 |
|
||||
|--------|----------|----------|
|
||||
| `Shift+PgUp` / `Shift+PgDown` | 向上/向下滚动页面 | 查看历史输出内容 |
|
||||
| `Ctrl+Shift+K` | 清除终端内容 | 清理终端界面 |
|
||||
| `Ctrl+Shift+F` | 查找文本 | 在终端输出中搜索内容 |
|
||||
|
||||
## 二、编辑操作类快捷键
|
||||
|
||||
### 2.1 基础移动快捷键
|
||||
|
||||
| 快捷键 | 功能描述 | 使用场景 |
|
||||
|--------|----------|----------|
|
||||
| `Ctrl + A` | 回到行首 | 快速定位到命令开头修改 |
|
||||
| `Ctrl + E` | 回到行尾 | 快速定位到命令结尾补充参数 |
|
||||
| `Ctrl + B` / 左箭头 | 向左移动一个字符 | 字符级微调光标位置 |
|
||||
| `Ctrl + F` / 右箭头 | 向右移动一个字符 | 字符级微调光标位置 |
|
||||
| `Alt + B` | 向左移动一个单词 | 快速按单词跳转编辑长命令 |
|
||||
| `Alt + F` | 向右移动一个单词 | 快速按单词跳转编辑长命令 |
|
||||
| `Esc + B` | 向左移动一个单词 | Alt+B被终端菜单抢占时的替代方案 |
|
||||
| `Esc + F` | 向右移动一个单词 | Alt+F被终端菜单抢占时的替代方案 |
|
||||
|
||||
### 2.2 删除快捷键
|
||||
|
||||
| 快捷键 | 功能描述 | 使用场景 |
|
||||
|--------|----------|----------|
|
||||
| `Ctrl + U` | 删除到行首 | 快速清空当前输入的命令 |
|
||||
| `Ctrl + K` | 删除到行尾 | 删除光标后面不需要的内容 |
|
||||
| `Ctrl + W` | 删除前一个单词 | 快速删除最近输入的错误单词 |
|
||||
| `Ctrl + D` | 删除当前字符 | 删除光标下的字符 |
|
||||
| `Backspace` | 删除前一个字符 | 常规删除操作 |
|
||||
|
||||
### 2.3 历史命令操作
|
||||
|
||||
| 快捷键 | 功能描述 | 使用场景 |
|
||||
|--------|----------|----------|
|
||||
| `上/下箭头` | 浏览命令历史 | 重复执行之前的命令 |
|
||||
| `Ctrl + R` | 反向搜索历史命令 | 快速查找之前执行过的命令 |
|
||||
| `Ctrl + G` | 退出历史搜索模式 | 取消历史搜索返回正常输入 |
|
||||
|
||||
### 2.4 文本选择与操作
|
||||
|
||||
| 快捷键 | 功能描述 | 使用场景 |
|
||||
|--------|----------|----------|
|
||||
| `Ctrl+Shift+C` | 复制选中文本 | 复制终端中的命令或输出 |
|
||||
| `Ctrl+Shift+V` | 粘贴剪贴板内容 | 粘贴命令或文本到终端 |
|
||||
| `Ctrl+Shift+A` | 全选当前行 | 快速复制整行内容 |
|
||||
| `Ctrl+Shift+左/右箭头` | 按单词移动光标 | 快速编辑长命令 |
|
||||
|
||||
### 2.5 查找与替换
|
||||
|
||||
| 快捷键 | 功能描述 | 使用场景 |
|
||||
|--------|----------|----------|
|
||||
| `Ctrl+Shift+F` | 打开查找对话框 | 在终端内容中搜索文本 |
|
||||
| `F3` | 查找下一个匹配项 | 继续搜索相同内容 |
|
||||
| `Shift+F3` | 查找上一个匹配项 | 反向搜索匹配项 |
|
||||
|
||||
## 三、显示调整类快捷键
|
||||
|
||||
### 3.1 字体与缩放
|
||||
|
||||
| 快捷键 | 功能描述 | 使用场景 |
|
||||
|--------|----------|----------|
|
||||
| `Ctrl+加号 (+)` | 放大字体 | 改善可读性 |
|
||||
| `Ctrl+减号 (-)` | 缩小字体 | 显示更多内容 |
|
||||
| `Ctrl+0` | 重置字体大小 | 恢复默认设置 |
|
||||
|
||||
### 3.2 配色方案与透明度
|
||||
|
||||
| 快捷键 | 功能描述 | 使用场景 |
|
||||
|--------|----------|----------|
|
||||
| `F11` | 全屏切换 | 专注于终端操作 |
|
||||
| `Ctrl+Shift+I` | 切换光标形状 | 适应个人偏好 |
|
||||
| `Ctrl+Shift+G` | 切换全局菜单 | 节省屏幕空间 |
|
||||
|
||||
> 💡 **小贴士**:可以自定义配色方案,前往 "编辑" → "首选项" → "外观" 设置自己喜欢的主题颜色。
|
||||
|
||||
## 四、高级功能类快捷键
|
||||
|
||||
### 4.1 书签管理
|
||||
|
||||
| 快捷键 | 功能描述 | 使用场景 |
|
||||
|--------|----------|----------|
|
||||
| `Ctrl+Shift+B` | 添加当前目录为书签 | 快速访问常用目录 |
|
||||
| `Ctrl+B` | 打开书签管理器 | 跳转到已保存的书签 |
|
||||
| `F2` | 编辑当前标签页书签 | 更新书签信息 |
|
||||
|
||||
### 4.2 布局与多列显示
|
||||
|
||||
| 快捷键 | 功能描述 | 使用场景 |
|
||||
|--------|----------|----------|
|
||||
| `Ctrl+Shift+O` | 水平分割标签页 | 并排查看不同内容 |
|
||||
| `Ctrl+Shift+E` | 垂直分割标签页 | 对比或参考操作 |
|
||||
| `Ctrl+Shift+Q` | 关闭分割窗格 | 恢复单个视图 |
|
||||
|
||||
> 🎯 **高效技巧**:使用 `Ctrl+Shift+T` 新建标签页后,配合 `Alt+数字键` 快速切换,可以像使用浏览器一样高效管理多个终端会话。
|
||||
|
||||
## 五、自定义快捷键配置
|
||||
|
||||
### 5.1 修改快捷键配置文件
|
||||
|
||||
XFCE 终端的快捷键配置文件位于:
|
||||
`~/.config/xfce4/terminal/accels.scm`
|
||||
|
||||
可以通过编辑此文件来自定义快捷键:
|
||||
|
||||
```bash
|
||||
# 备份原配置文件
|
||||
cp ~/.config/xfce4/terminal/accels.scm ~/.config/xfce4/terminal/accels.scm.backup
|
||||
|
||||
# 编辑配置文件
|
||||
nano ~/.config/xfce4/terminal/accels.scm
|
||||
|
||||
# 示例:修改新建标签页快捷键为 Ctrl+T
|
||||
# 原内容: (gtk_accel_path "<Actions>/terminal-window/tab-new" "<Primary><Shift>t")
|
||||
# 修改为: (gtk_accel_path "<Actions>/terminal-window/tab-new" "<Primary>t")
|
||||
```
|
||||
|
||||
重启终端或按 `Ctrl+Shift+R` 重载配置使更改生效。
|
||||
|
||||
### 5.2 解决Alt快捷键被抢占问题
|
||||
|
||||
XFCE 终端默认会将 `Alt + 字母` 组合键作为菜单访问快捷键,会导致 Bash 的 `Alt + F`、`Alt + B` 等行编辑快捷键失效,可通过以下设置解决:
|
||||
|
||||
**推荐方案(禁用所有菜单访问键):**
|
||||
1. 打开终端 → **编辑** → **首选项**(Preferences)
|
||||
2. 切换到 **高级**(Advanced)标签
|
||||
3. **勾选**:**禁用所有菜单访问键**(Disable all menu access keys)
|
||||
|
||||
**效果:**
|
||||
- `Alt + F`、`Alt + B` 等 Bash 行编辑快捷键恢复正常
|
||||
- 同时会禁用 `Alt + F`(文件菜单)、`Alt + E`(编辑菜单)等菜单访问快捷键
|
||||
|
||||
**替代方案(不关闭菜单快捷键):**
|
||||
- 使用 `Esc + F` 代替 `Alt + F` 向右跳一个单词
|
||||
- 使用 `Esc + B` 代替 `Alt + B` 向左跳一个单词
|
||||
|
||||
> 💡 **记忆技巧**:
|
||||
> - `Ctrl` 系列快捷键:多用于**字符**级别操作(A=开头, E=结尾, B=后退, F=前进)
|
||||
> - `Alt` 系列快捷键:多用于**单词**级别操作(B=back, F=forward)
|
||||
> - `Esc` 可以代替 Alt(当 Alt 被系统/应用抢占时)
|
||||
|
||||
## 六、总结与推荐
|
||||
|
||||
### 6.1 最常用快捷键(强烈建议掌握)
|
||||
|
||||
1. **导航类**:
|
||||
- `Ctrl+Shift+T` - 新建标签页
|
||||
- `Ctrl+PgUp` / `Ctrl+PgDown` - 切换标签页
|
||||
- `Alt+数字键` - 直接跳转标签页
|
||||
|
||||
2. **编辑类**:
|
||||
- `Ctrl+Shift+C` / `Ctrl+Shift+V` - 复制粘贴
|
||||
- `Ctrl+R` - 搜索历史命令
|
||||
|
||||
3. **显示类**:
|
||||
- `Ctrl+加号/减号` - 字体缩放
|
||||
- `F11` - 全屏切换
|
||||
|
||||
### 6.2 学习建议
|
||||
|
||||
1. **循序渐进**:先掌握最常用的 5-10 个快捷键
|
||||
2. **结合实际**:在日常使用中刻意练习
|
||||
3. **定期复习**:创建自己的快捷键备忘清单
|
||||
4. **个性化**:根据个人习惯调整快捷键配置
|
||||
|
||||
> 📚 **扩展阅读**:可以通过 `man xfce4-terminal` 查看完整的官方手册,了解更多高级功能和配置选项。
|
||||
222
src/programming/linux/Linux_Mint/内存优化完全指南.md
Executable file
222
src/programming/linux/Linux_Mint/内存优化完全指南.md
Executable file
@@ -0,0 +1,222 @@
|
||||
---
|
||||
title: 内存优化完全指南
|
||||
icon: simple-icons:linuxmint
|
||||
date: 2026-03-20
|
||||
category:
|
||||
- Linux
|
||||
tag:
|
||||
- Linux Mint
|
||||
- 内存优化
|
||||
- 性能调优
|
||||
- zram
|
||||
- earlyoom
|
||||
---
|
||||
|
||||
# Linux Mint 内存优化完全指南
|
||||
|
||||
这篇记录一次真实的 Linux Mint 内存优化过程:从内存告急、Swap 打满,到切换纯 zram、调整内核策略、加上 OOM 保护,最终把系统稳定性和响应速度拉回到优秀状态。
|
||||
|
||||
<!-- more -->
|
||||
|
||||
## 一 问题背景
|
||||
|
||||
### 1.1 初始状态
|
||||
|
||||
排查时的核心数据:
|
||||
|
||||
- **物理内存**: 29GB
|
||||
- **已使用**: 25GB (86%)
|
||||
- **可用内存**: 3.5GB
|
||||
- **Swap**: 15GB,几乎耗尽
|
||||
|
||||
### 1.2 主要问题
|
||||
|
||||
| 问题 | 严重程度 | 影响 |
|
||||
|------|---------|------|
|
||||
| Swap 完全耗尽 | 🔴 严重 | 系统响应明显变慢 |
|
||||
| 可用内存过低 | 🔴 严重 | 高负载场景容易卡顿 |
|
||||
| 长时间残留会话 | 🟡 中等 | 持续吃内存、吃 CPU |
|
||||
| 文件 Swap | 🟡 中等 | 磁盘 IO 成为瓶颈 |
|
||||
|
||||
### 1.3 内存占用分析
|
||||
|
||||
常用定位命令:
|
||||
|
||||
```bash
|
||||
# 查看内存概览
|
||||
free -h
|
||||
|
||||
# 查看内存占用 TOP 10 进程
|
||||
ps aux --sort=-%mem | head -11
|
||||
```
|
||||
|
||||
观察到的主要内存占用:
|
||||
|
||||
- IntelliJ IDEA: 约 4.9GB
|
||||
- VMware 虚拟机: 约 4GB
|
||||
- 多个 IDE/AI 工具常驻进程
|
||||
- 多个 OpenCode 会话并行
|
||||
|
||||
---
|
||||
|
||||
## 二 优化流程
|
||||
|
||||
### 2.1 清理僵尸进程
|
||||
|
||||
#### 2.1.1 识别僵尸会话
|
||||
|
||||
判断标准:
|
||||
|
||||
- 进程对应终端显示 `(deleted)`
|
||||
- 运行时间很长,但无人交互
|
||||
- `w` / `who` 中找不到对应活跃终端
|
||||
|
||||
```bash
|
||||
# 看会话是否还挂着真实终端
|
||||
for pid in $(pgrep -f "\.opencode$"); do
|
||||
echo "=== PID: $pid ==="
|
||||
ps -p "$pid" -o pid,etime,%cpu,%mem,cmd --no-headers
|
||||
lsof -p "$pid" 2>/dev/null | grep -E "pts/|tty" | head -3
|
||||
echo
|
||||
done
|
||||
|
||||
# 优雅终止僵尸会话
|
||||
kill -15 <PID1> <PID2>
|
||||
```
|
||||
|
||||
清理后,可用内存和 Swap 都会明显回升。
|
||||
|
||||
---
|
||||
|
||||
### 2.2 从文件 Swap 切换到纯 zram
|
||||
|
||||
#### 2.2.1 为什么选 zram
|
||||
|
||||
性能差异(体感非常明显):
|
||||
|
||||
| 类型 | 速度 | 延迟 | 寿命影响 |
|
||||
|------|------|------|---------|
|
||||
| zram | 内存级 | <1ms | 无磁盘写入 |
|
||||
| 文件 Swap (SSD) | 磁盘级 | 10-100ms | 增加 SSD 写入 |
|
||||
| 文件 Swap (HDD) | 磁盘级 | 100-1000ms | 响应更慢 |
|
||||
|
||||
zram 的关键收益:
|
||||
|
||||
- 性能更高:比文件 Swap 快很多
|
||||
- 压缩率高:常见 3:1 到 4:1
|
||||
- 磁盘更友好:减少持续写入
|
||||
|
||||
#### 2.2.2 检查当前 zram
|
||||
|
||||
```bash
|
||||
zramctl
|
||||
swapon --show
|
||||
```
|
||||
|
||||
本文案例中,最终将 zram 配到物理内存的 80%,并保留 `zstd` 算法。
|
||||
|
||||
---
|
||||
|
||||
### 2.3 调整内存策略参数
|
||||
|
||||
#### 2.3.1 关键参数
|
||||
|
||||
```bash
|
||||
# 当前策略
|
||||
sysctl vm.swappiness
|
||||
sysctl vm.vfs_cache_pressure
|
||||
```
|
||||
|
||||
本文做的策略调整:
|
||||
|
||||
- `vm.swappiness=40`(默认 10 偏保守,zram 场景下可更积极)
|
||||
- 保持 `vfs_cache_pressure=100`
|
||||
|
||||
#### 2.3.2 增加 OOM 保护
|
||||
|
||||
安装并启用 earlyoom,避免内存耗尽导致系统“假死”:
|
||||
|
||||
```bash
|
||||
sudo apt update
|
||||
sudo apt install -y earlyoom
|
||||
sudo systemctl enable --now earlyoom
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 三 三个脚本(可复用)
|
||||
|
||||
为了复盘方便,把这次整理后的脚本放到博客目录:
|
||||
|
||||
- `src/programming/linux/Linux_Mint/scripts/setup_zram_only.sh`
|
||||
- `src/programming/linux/Linux_Mint/scripts/optimize_memory_policy.sh`
|
||||
- `src/programming/linux/Linux_Mint/scripts/expand_swap.sh`
|
||||
|
||||
### 3.1 setup_zram_only.sh
|
||||
|
||||
用途:禁用文件 Swap,启用纯 zram(80%)。
|
||||
|
||||
```bash
|
||||
./src/programming/linux/Linux_Mint/scripts/setup_zram_only.sh
|
||||
```
|
||||
|
||||
### 3.2 optimize_memory_policy.sh
|
||||
|
||||
用途:把 swappiness 调到 40,并安装 earlyoom。
|
||||
|
||||
```bash
|
||||
./src/programming/linux/Linux_Mint/scripts/optimize_memory_policy.sh
|
||||
```
|
||||
|
||||
### 3.3 expand_swap.sh
|
||||
|
||||
用途:保留文件 Swap 的场景下扩容到 24G(备用方案)。
|
||||
|
||||
```bash
|
||||
./src/programming/linux/Linux_Mint/scripts/expand_swap.sh
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 四 执行顺序建议
|
||||
|
||||
推荐顺序:
|
||||
|
||||
1. 先做僵尸进程清理(立刻见效)
|
||||
2. 再切换纯 zram(性能提升)
|
||||
3. 最后调策略和 OOM 保护(长期稳定)
|
||||
|
||||
---
|
||||
|
||||
## 五 验证清单
|
||||
|
||||
### 5.1 配置验证
|
||||
|
||||
```bash
|
||||
free -h
|
||||
swapon --show
|
||||
zramctl
|
||||
sysctl vm.swappiness
|
||||
systemctl is-active earlyoom
|
||||
```
|
||||
|
||||
### 5.2 目标状态
|
||||
|
||||
- 可用内存明显提升
|
||||
- Swap 不再长时间打满
|
||||
- zram 算法为 `zstd`
|
||||
- `vm.swappiness=40`
|
||||
- `earlyoom` 处于 `active`
|
||||
|
||||
---
|
||||
|
||||
## 六 本次优化结果
|
||||
|
||||
本文案例最终状态:
|
||||
|
||||
- 内存从高压恢复到健康余量
|
||||
- Swap 从几乎打满恢复到可控状态
|
||||
- 系统在多工具并行场景下更稳定
|
||||
- 交互延迟和卡顿体感明显改善
|
||||
|
||||
如果你也是 Linux Mint 开发机、工具常驻多、会话长时间运行,这一套流程可以直接复用。
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
title: Linux 应用安装与快捷方式
|
||||
icon: mdi:application-box
|
||||
icon: fa6-solid:box-open
|
||||
date: 2025-12-22
|
||||
category:
|
||||
- Linux 基础
|
||||
|
||||
BIN
src/work/assets/Snipaste_2026-03-27_15-12-26.png
Normal file
BIN
src/work/assets/Snipaste_2026-03-27_15-12-26.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 166 KiB |
177
src/work/todo/2026-03.md
Normal file
177
src/work/todo/2026-03.md
Normal file
@@ -0,0 +1,177 @@
|
||||
---
|
||||
icon: fa6-solid:list-check
|
||||
date: 2026-03-23
|
||||
pageClass: todo-page
|
||||
category:
|
||||
- 待办
|
||||
tag:
|
||||
- 任务清单
|
||||
title: 3月待办(2026-03)
|
||||
---
|
||||
|
||||
3月待办事项记录
|
||||
<!-- more -->
|
||||
|
||||
# 待办清单(2026-03)
|
||||
|
||||
> 最后更新: 2026-04-02
|
||||
> 统计: 已完成 17 项、已提交 0 项、待测试 0 项、部分完成 0 项、待确认 1 项、未开始 3 项、已取消 1 项
|
||||
|
||||
## 清单总览
|
||||
|
||||
- 当前优先: 13(待确认)、14(未开始)
|
||||
- 本周建议推进: 7、9、14(未开始)
|
||||
- 已归档完成: 1、2、3、4、5、8、10、11、12、15、16、17、18、19、20、21、22
|
||||
|
||||
## 状态说明
|
||||
|
||||
<Badge text="已完成" type="tip" /> <Badge text="已提交" type="tip" /> <Badge text="待测试" type="info" /> <Badge text="待提交" type="warning" /> <Badge text="部分完成" type="note" /> <Badge text="待确认" type="warning" /> <Badge text="未开始" type="danger" /> <Badge text="已取消" type="warning" />
|
||||
|
||||
---
|
||||
|
||||
## 当前优先
|
||||
|
||||
### 13. V2.00的250985版本是否同步至其他系统 <Badge text="待确认" type="warning" />
|
||||
|
||||
- **描述**: 待确认V2.00的250985版本是否需要同步至其他系统
|
||||
- **下一步**: 与产品/版本负责人确认同步范围和目标版本
|
||||
|
||||
---
|
||||
|
||||
## 待启动
|
||||
|
||||
### 7. [全部版本] WEB端重新开发实现C++开发的桌面端算法标记功能 <Badge text="未开始" type="danger" />
|
||||
|
||||
- **描述**: WEB端重新开发实现算法标记功能
|
||||
- **下一步**: 先产出交互方案和接口清单
|
||||
|
||||
### 9. [智能巡视-7950] V2.00所有版本同步至2024后问题修复 <Badge text="未开始" type="danger" />
|
||||
|
||||
- **描述**:
|
||||
- 最新的2024,未发送算法资源请求
|
||||
- 其余问题待测试
|
||||
- **下一步**: 先复现资源请求问题,再统一修复策略
|
||||
|
||||
### 14. [智慧场站-7050] 瀚高数据库适配验证 <Badge text="未开始" type="danger" />
|
||||
|
||||
- **创建日期**: 2026-03-23
|
||||
- **描述**: 验证7050系统对瀚高数据库的兼容性与适配结果,整理问题清单
|
||||
- **下一步**: 明确验证范围(安装、连接、读写、迁移脚本、性能基线)并安排验证
|
||||
|
||||
---
|
||||
|
||||
## 已完成归档
|
||||
|
||||
<details>
|
||||
<summary>展开查看已完成事项(12项)</summary>
|
||||
|
||||
### 1. 2.00适配的立即执行时间为空是否需要同步其他版本 <Badge text="已完成" type="tip" />
|
||||
|
||||
- **描述**: 已同步至3个版本完成
|
||||
|
||||
### 2. 静默监视中多个请求类型的问题 <Badge text="已完成" type="tip" />
|
||||
|
||||
- **描述**: 已完成并同步到3个版本
|
||||
|
||||
### 3. 7050历史三维打包问题 <Badge text="已完成" type="tip" />
|
||||
|
||||
- **描述**: 7050项目历史三维打包问题已修复,已完成并归档
|
||||
|
||||
### 4. 2.00修复的250941版本同步到7050 <Badge text="已完成" type="tip" />
|
||||
|
||||
- **描述**: 2.00版本修复的250941问题已同步到7050项目
|
||||
|
||||
### 5. 排查/alarm/silent/query/hisSilentAlarm/list的stationAlarmStatistics为空 <Badge text="已完成" type="tip" />
|
||||
|
||||
- **描述**: 已完成并和其他版本同步
|
||||
|
||||
### 10. [智慧场站-7050] 联动新需求开发 <Badge text="已完成" type="tip" />
|
||||
|
||||
- **描述**: 联动新需求开发已完成
|
||||
|
||||
### 11. [智能巡视-7950] 打包脚本调整 <Badge text="已完成" type="tip" />
|
||||
|
||||
- **描述**: 3个版本都已适配打包脚本,复制Common依赖目录
|
||||
|
||||
### 12. [智能巡视-7950] 超期逻辑和红外温度矩阵功能同步 <Badge text="已完成" type="tip" />
|
||||
|
||||
- **描述**: 红外温度矩阵功能已同步到V2.00版本,超期逻辑已同步
|
||||
- **完成情况**: 已完成,所有功能已同步
|
||||
|
||||
### 15. 调整了go打包脚本的taos依赖库获取位置 <Badge text="已完成" type="tip" />
|
||||
|
||||
- **完成日期**: 2026-03-23
|
||||
- **描述**: 已调整go打包脚本中taos依赖库的获取位置,并完成验证
|
||||
|
||||
### 17. [智能巡视-7950] getLatestHisTask接口查询方案调整 <Badge text="已完成" type="tip" />
|
||||
|
||||
- **创建日期**: 2026-03-26
|
||||
- **描述**: 调整`@RequestMapping(value = "/getLatestHisTask", method = RequestMethod.GET)`获取最新一条巡视任务及点位信息的查询策略,3个版本需同步
|
||||
- **方案调整**: 默认查询今天正在执行的任务;若不存在,则默认查询最新一条历史记录(3个版本同步)
|
||||
- **完成情况**: 已完成,3个版本已同步
|
||||
|
||||
### 18. [智慧场站-7050] 调整声纹模型模板必填项 <Badge text="已完成" type="tip" />
|
||||
|
||||
- **创建日期**: 2026-03-27
|
||||
- **描述**: 调整7050声纹模型模板必填项
|
||||
- **必填项**: 设备名称、设备编码、投运时间、设备IP、通信协议、通信端口
|
||||
- **完成情况**: 已完成
|
||||
|
||||
### 19. [智慧场站-7050] 删除点位时同步清理关联阈值告警 <Badge text="已完成" type="tip" />
|
||||
|
||||
- **创建日期**: 2026-03-27
|
||||
- **描述**: 删除点位时排查是否存在关联的阈值告警,如存在则需要同步删除
|
||||
- **完成情况**: 已完成,已梳理点位与阈值告警关联关系,实现删除点位时同步清理关联阈值告警功能
|
||||
- **需求截图**:
|
||||
|
||||

|
||||
|
||||
### 20. [智慧场站-7050] 录像回放权限问题修复 <Badge text="已完成" type="tip" />
|
||||
|
||||
- **创建日期**: 2026-03-27
|
||||
- **原话**:
|
||||
- 没有录像回放这个,这里是不是修改下,默认的更新后要有的,哪个现场不需要再给他取消,要不然其它正常的现场一更新程序,全给录像回放整没了
|
||||
- 给操作员配上录像回放权限后,admin登录咋没有录像回放的菜单
|
||||
- **完成情况**: 已完成
|
||||
- **备注**: 新站默认权限包含录像回放,老站需要手动配置下录像权限
|
||||
|
||||
### 16. [智能巡视-7950] 超期和终止任务增加结束时间(3个版本) <Badge text="已完成" type="tip" />
|
||||
|
||||
- **创建日期**: 2026-03-26
|
||||
- **描述**: 超期任务和终止任务都需要增加任务结束时间,且3个版本均需同步
|
||||
- **完成情况**: 已完成,3个版本数据库表结构和业务逻辑已同步更新
|
||||
|
||||
### 21. [智慧场站-7050] 反向联动菜单放出与联动开关灯实现 <Badge text="已完成" type="tip" />
|
||||
|
||||
- **创建日期**: 2026-03-27
|
||||
- **描述**: 反向联动菜单放出 + 反向联动实现联动开灯关灯
|
||||
- **完成情况**: 已完成,反向联动触发条件、开关灯联动逻辑与菜单权限配置已实现并验证
|
||||
|
||||
### 8. [智慧场站-7050] 完成贵州大唐机器人告警复检需求开发 <Badge text="已完成" type="tip" />
|
||||
|
||||
- **描述**: 7050项目机器人告警复检需求开发已完成,等待测试
|
||||
- **完成情况**: 已完成联调与回归测试,告警复检流程和边界场景验证通过
|
||||
|
||||
### 22. [全部版本] 优化服务调用失败异常反馈 <Badge text="已完成" type="tip" />
|
||||
|
||||
- **创建日期**: 2026-03-30
|
||||
- **描述**: 优化服务调用失败时的异常反馈机制,在日志中附带详细的错误信息,便于快速定位问题
|
||||
- **完成情况**: 已完成全版本优化,日志已在ServiceClientPool、ClientManager、BusClientInterceptor等关键类中增强了异常信息,包含服务名、方法名、参数、错误原因、调用链路等,可快速定位问题
|
||||
|
||||
</details>
|
||||
|
||||
---
|
||||
|
||||
## 已取消归档
|
||||
|
||||
<details>
|
||||
<summary>展开查看已取消事项(1项)</summary>
|
||||
|
||||
### 6. [智能巡视-7950] 巡视结果上报和确认功能优化 <Badge text="已取消" type="warning" />
|
||||
|
||||
- **描述**:
|
||||
- 巡视结果上报需要加确认状态、确认时间、是否告警
|
||||
- 巡视结果确认需要加告警相关信息
|
||||
- **处理结果**: 更新已取消,无需处理
|
||||
|
||||
</details>
|
||||
129
src/work/todo/2026-04.md
Normal file
129
src/work/todo/2026-04.md
Normal file
@@ -0,0 +1,129 @@
|
||||
---
|
||||
icon: fa6-solid:list-check
|
||||
date: 2026-04-01
|
||||
pageClass: todo-page
|
||||
category:
|
||||
- 待办
|
||||
tag:
|
||||
- 任务清单
|
||||
title: 4月待办(2026-04)
|
||||
---
|
||||
|
||||
4月待办事项记录
|
||||
<!-- more -->
|
||||
|
||||
# 待办清单(2026-04)
|
||||
|
||||
> 最后更新: 2026-04-02
|
||||
> 统计: 已完成 2 项、未开始 2 项
|
||||
|
||||
## 清单总览
|
||||
|
||||
- 当前优先: 2(未开始)
|
||||
|
||||
## 状态说明
|
||||
|
||||
<Badge text="已完成" type="tip" /> <Badge text="已提交" type="tip" /> <Badge text="待测试" type="info" /> <Badge text="待提交" type="warning" /> <Badge text="部分完成" type="note" /> <Badge text="待确认" type="warning" /> <Badge text="未开始" type="danger" /> <Badge text="已取消" type="warning" />
|
||||
|
||||
---
|
||||
|
||||
## 当前优先
|
||||
|
||||
### 1. 巡视报告配置异常需要修复 <Badge text="已完成" type="tip" />
|
||||
|
||||
- **描述**: 巡视报告配置异常,在这里设置筛选搜索修改设置之后,同一主设备下其它点的设置就变成空的了
|
||||
- **错误日志**:
|
||||
```
|
||||
2026-03-31 19:16:52.944 [TThreadPoolServer WorkerProcess-6] ERROR com.sunri.model.pipeline.DictatePipeline - DictatePipeline start, 处理异常 {}
|
||||
java.lang.IllegalStateException: Duplicate key PatrolReportDevicePointRecord(id=37327, mainDeviceId=2198, devicePointId=104250, reportSn=1, standardValue=正常)
|
||||
at java.util.stream.Collectors.lambda$throwingMerger$0(Collectors.java:133)
|
||||
at java.util.HashMap.merge(HashMap.java:1254)
|
||||
at java.util.stream.Collectors.lambda$toMap$58(Collectors.java:1320)
|
||||
at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
|
||||
at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1384)
|
||||
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
|
||||
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
|
||||
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
|
||||
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
|
||||
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:566)
|
||||
at com.sunri.model.supersysmodel.pipeline.PatrolReportDevicePointRecordPipeLine.handle(PatrolReportDevicePointRecordPipeLine.java:44)
|
||||
at com.sunri.model.supersysmodel.pipeline.ObjectVerifyPipeline.proceed(ObjectVerifyPipeline.java:35)
|
||||
at com.sunri.model.supersysmodel.pipeline.PatrolReportDevicePointRecordPipeLine.proceed(PatrolReportDevicePointRecordPipeLine.java:19)
|
||||
at com.sunri.model.pipeline.DictatePipeline.start(DictatePipeline.java:23)
|
||||
at com.sunri.model.pipeline.DictatePipeline.skip(DictatePipeline.java:43)
|
||||
at com.sunri.model.pipeline.DictatePipeline.start(DictatePipeline.java:32)
|
||||
at com.sunri.model.pipeline.DictatePipeline.skip(DictatePipeline.java:43)
|
||||
at com.sunri.model.pipeline.DictatePipeline.start(DictatePipeline.java:32)
|
||||
at com.sunri.model.pipeline.DictatePipeline.skip(DictatePipeline.java:43)
|
||||
at com.sunri.model.pipeline.DictatePipeline.start(DictatePipeline.java:32)
|
||||
at com.sunri.model.pipeline.DictatePipeline.skip(DictatePipeline.java:43)
|
||||
at com.sunri.model.pipeline.DictatePipeline.start(DictatePipeline.java:32)
|
||||
at com.sunri.model.pipeline.DictatePipeline.skip(DictatePipeline.java:43)
|
||||
at com.sunri.model.pipeline.DictatePipeline.start(DictatePipeline.java:32)
|
||||
at com.sunri.model.pipeline.DictatePipeline.skip(DictatePipeline.java:43)
|
||||
at com.sunri.model.pipeline.DictatePipeline.start(DictatePipeline.java:32)
|
||||
at com.sunri.model.pipeline.DictatePipeline.skip(DictatePipeline.java:43)
|
||||
at com.sunri.model.pipeline.DictatePipeline.start(DictatePipeline.java:32)
|
||||
at com.sunri.model.pipeline.DictatePipeline.skip(DictatePipeline.java:43)
|
||||
at com.sunri.model.pipeline.DictatePipeline.start(DictatePipeline.java:32)
|
||||
at com.sunri.model.pipeline.DictatePipeline.skip(DictatePipeline.java:43)
|
||||
at com.sunri.model.pipeline.DictatePipeline.start(DictatePipeline.java:32)
|
||||
at com.sunri.model.pipeline.DictatePipeline.skip(DictatePipeline.java:43)
|
||||
at com.sunri.model.pipeline.DictatePipeline.start(DictatePipeline.java:32)
|
||||
at com.sunri.model.pipeline.DictatePipeline.skip(DictatePipeline.java:43)
|
||||
at com.sunri.model.pipeline.DictatePipeline.start(DictatePipeline.java:32)
|
||||
at com.sunri.model.supersysmodel.pipeline.DevicePointManager.pointImport(DevicePointManager.java:62)
|
||||
at com.sunri.model.supersysmodel.SuperSysModelConfiguration.readExcelBytes(SuperSysModelConfiguration.java:2419)
|
||||
at com.sunri.model.supersysmodel.SuperSysModelConfiguration.devicePointImport(SuperSysModelConfiguration.java:2495)
|
||||
at com.sunri.service.impl.supersysmodel.SuperSysModelServiceImpl.devicePointImport(SuperSysModelServiceImpl.java:172)
|
||||
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
|
||||
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
|
||||
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
|
||||
at java.lang.reflect.Method.invoke(Method.java:498)
|
||||
at com.sunri.server.mapper.handler.ByteArrayMethodHandler.proceed(ByteArrayMethodHandler.java:108)
|
||||
at com.sunri.pipeline.Pipeline.start(Pipeline.java:26)
|
||||
at com.sunri.pipeline.Pipeline.skip(Pipeline.java:43)
|
||||
at com.sunri.pipeline.Pipeline.start(Pipeline.java:32)
|
||||
at com.sunri.server.dispatch.Func.proceed(Func.java:152)
|
||||
at com.sunri.server.service.impl.RequestServiceImpl.doExec(RequestServiceImpl.java:43)
|
||||
at com.sunri.server.message.handler.RequestHandler.proceed(RequestHandler.java:30)
|
||||
at com.sunri.pipeline.Pipeline.start(Pipeline.java:26)
|
||||
at com.sunri.pipeline.Pipeline.skip(Pipeline.java:43)
|
||||
at com.sunri.pipeline.Pipeline.start(Pipeline.java:32)
|
||||
at com.sunri.server.processor.ServerProcessor.doExec(ServerProcessor.java:36)
|
||||
at com.sunri.server.service.RequestService$Processor$doExec.getResult(RequestService.java:155)
|
||||
at com.sunri.server.service.RequestService$Processor$doExec.getResult(RequestService.java:135)
|
||||
at org.apache.thrift.ProcessFunction.process(ProcessFunction.java:38)
|
||||
at org.apache.thrift.TBaseProcessor.process(TBaseProcessor.java:38)
|
||||
at com.sunri.server.processor.ServerProcessorFactory$RequestServiceProcessor.process(ServerProcessorFactory.java:74)
|
||||
at org.apache.thrift.TMultiplexedProcessor.process(TMultiplexedProcessor.java:138)
|
||||
at org.apache.thrift.server.TThreadPoolServer$WorkerProcess.run(TThreadPoolServer.java:250)
|
||||
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
|
||||
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
|
||||
at java.lang.Thread.run(Thread.java:748)
|
||||
2026-03-31 19:16:52.945 [TThreadPoolServer WorkerProcess-6] INFO com.sunri.model.pipeline.DictatePipeline - [流水线完成] PatrolReportDevicePointRecordPipeLine 处理耗时: 34ms
|
||||
```
|
||||
- **完成方案**:
|
||||
1. 后端:将 PatrolReportDevicePointRecordPipeLine 的去重与处理维度统一改为 devicePointId 全局唯一(跨主设备同点位仅保留最大 id 并删除其余),再基于保留记录更新/插入以彻底避免 Duplicate key。
|
||||
2. 前端:修复筛选搜索修改设置后同主设备下其他点位配置为空的显示问题
|
||||
- **完成情况**: 前后端均已修复并验证,同一主设备下多点位配置保存和显示正常
|
||||
|
||||
### 2. 与姬工讨论上海导出五通报表的问题 <Badge text="未开始" type="danger" />
|
||||
|
||||
- **描述**: 姬工安排讨论上海项目导出五通报表相关需求与问题
|
||||
- **下一步**:
|
||||
1. 提前梳理现有报表导出功能逻辑
|
||||
2. 预约时间与姬工同步讨论细节
|
||||
|
||||
### 3. 修复现场linx80 excel打开失败问题 <Badge text="已完成" type="tip" />
|
||||
|
||||
- **描述**: 现场linx80设备导出的Excel文件打开失败
|
||||
- **完成情况**: 经排查为现场系统软件版本过低导致,无需修复,建议升级系统软件版本即可解决
|
||||
|
||||
### 4. 告警阈值xml导入限制同一个点位统一各类型只能有一条记录 <Badge text="未开始" type="danger" />
|
||||
|
||||
- **描述**: 韩磊要求新增告警阈值xml导入限制,同一个点位各类型阈值只能有一条记录
|
||||
- **下一步**:
|
||||
1. 梳理现有告警阈值xml导入逻辑
|
||||
2. 新增同点位同类型阈值重复校验
|
||||
3. 验证导入功能正常且限制生效
|
||||
15
src/work/todo/README.md
Normal file
15
src/work/todo/README.md
Normal file
@@ -0,0 +1,15 @@
|
||||
---
|
||||
icon: mdi:checklist
|
||||
category:
|
||||
- 待办
|
||||
tag:
|
||||
- 任务清单
|
||||
title: 待办事项
|
||||
---
|
||||
|
||||
按月份维护待办事项。
|
||||
|
||||
## 月度清单
|
||||
|
||||
- [4月待办(2026-04)](./2026-04.md)
|
||||
- [3月待办(2026-03)](./2026-03.md)
|
||||
13
src/work/待办事项.md
Normal file
13
src/work/待办事项.md
Normal file
@@ -0,0 +1,13 @@
|
||||
---
|
||||
icon: mdi:checklist
|
||||
category:
|
||||
- 待办
|
||||
tag:
|
||||
- 任务清单
|
||||
title: 待办事项
|
||||
---
|
||||
|
||||
待办事项已按月份维护。
|
||||
|
||||
- 待办首页:[/work/todo/](/work/todo/)
|
||||
- 3月待办:[/work/todo/2026-03.md](/work/todo/2026-03.md)
|
||||
Reference in New Issue
Block a user