Private
Public Access
1
0

重构:文件系统模块化架构,优化应用启动流程

This commit is contained in:
2026-01-28 00:28:54 +08:00
parent 4a9b25a505
commit 8c577f70e7
123 changed files with 32030 additions and 967 deletions

View File

@@ -0,0 +1,111 @@
# Go Desk 任务规划
## 阶段一:项目初始化
- [x] 安装 Wails CLI 和验证环境
- [x] 创建项目结构
- [x] 配置 `wails.json` 使用 `web` 目录
- [x] 初始化前端项目结构
- [x] 安装 Arco Design Vue 依赖
- [x] 安装 Go 依赖GORM、MySQL 驱动)
## 阶段二:基础框架搭建
- [x] 配置前端构建工具Vite
- [x] 集成 Arco Design Vue
- [x] 设置全局样式和主题
- [x] 创建基础布局组件(查询区域 + 表格区域)
- [x] 配置数据库连接MySQL lab_dev
## 阶段三:数据库连接和模型
- [x] 创建数据库连接模块(参考 ops-kit
- [x] 定义 MemberInfo 结构体(参考 ops-kit/internal/model/member_info.go
- [x] 实现数据库连接池配置
- [x] 测试数据库连接
## 阶段四:后端接口开发
- [x] 实现 Go 后端基础结构app.go
- [x] 实现用户查询方法QueryUsers
- [x] 支持关键字搜索(姓名、账号、电话)
- [x] 支持状态筛选
- [ ] 支持角色筛选(关联查询)- 待完善
- [x] 支持机构筛选(关联查询)
- [x] 支持分页limit/offset
- [x] 支持排序
- [ ] 实现关联查询(机构名称、角色名称)- 待完善
- [x] 错误处理和日志记录
## 阶段五:前端界面开发
- [x] 创建用户查询页面组件
- [x] 实现查询表单(关键字、状态、角色、机构)
- [x] 实现数据表格展示Arco Table
- [x] 实现分页组件
- [x] 实现状态标签显示
- [x] 实现前端调用后端方法
- [x] 测试前后端通信
## 阶段六:功能完善和优化
- [ ] 完善查询功能
- [ ] 优化界面交互
- [ ] 添加加载状态提示
- [ ] 错误提示优化
- [ ] 性能优化(查询优化、分页优化)
## 阶段七:测试与打包
- [x] 功能测试(查询、筛选、分页)
- [x] 数据库连接测试(测试服连接成功)
- [x] 前后端通信测试
- [x] 打包构建Windows
- [x] 验证打包后的应用运行
## 阶段八:设备调用测试功能
- [ ] 系统信息获取CPU、内存、磁盘、系统信息
- [ ] 文件系统操作(读取、写入、列出目录、创建、删除)
- [ ] 环境变量获取
- [ ] 打开文件/目录功能
- [ ] 前端测试界面实现
- [ ] 错误处理和权限验证
## 阶段九:更新升级功能
- [ ] 版本定义和管理
- [ ] 版本检查接口实现
- [ ] 下载更新包功能
- [ ] 下载进度显示
- [ ] 文件替换和自动重启
- [ ] 前端更新提示界面
- [ ] 错误处理和回滚机制
## 阶段十:后续功能(可选)
- [ ] 用户修改功能
- [ ] 用户新增功能
- [ ] 用户删除功能
- [ ] 数据导出功能
## 技术要点
### 代码规范
- Go 方法参数不超过 3 个
- 代码风格保持简洁,便于维护
- 使用 Arco 基础样式,避免过度自定义
- 注意资源嵌入和构建流程
### 数据库相关
- 使用 GORM 连接 MySQL
- 数据库lab_dev
-member_info主表、organ_info机构表、sys_member_role角色关联表
- 连接配置localhost:3306, root/123456
### 参考实现
- 前端参考:`lab-admin/src/views/member/index.vue`
- 后端参考:`lab-api/src/main/java/cn/casehub/member/MemberService.java`
- 数据模型:`ops-kit/internal/model/member_info.go`
- 数据库连接:`ops-kit/internal/database/db.go`

View File

@@ -0,0 +1,150 @@
# Go Desk 启动指南
## 前置条件
1. Go v1.25.4 已安装
2. Node.js 和 npm 已安装
3. MySQL 数据库 lab_dev 已启动
## 安装 Wails CLI
```bash
go install github.com/wailsapp/wails/v2/cmd/wails@latest
```
**如果 `wails` 命令找不到**
1. 获取 GOPATH
```bash
go env GOPATH
```
2. 使用完整路径运行(假设 GOPATH 是 `D:\Go\go-workspace`
```bash
D:\Go\go-workspace\bin\wails.exe dev
```
3. 或添加到 PATH 环境变量(永久解决):
- 将 `%GOPATH%\bin` 添加到系统 PATH
- 重新打开终端
## 首次启动步骤
### 1. 安装 Go 依赖
```bash
cd go-desk
go mod tidy
```
### 2. 安装前端依赖
```bash
cd web
npm install
```
### 3. 构建前端(必须)
```bash
npm run build
```
这会生成 `web/dist` 目录,包含前端构建产物。
### 4. 开发模式运行
```bash
# 回到项目根目录
cd ..
# 启动 Wails 开发服务器
wails dev
```
## 开发流程
### 修改前端代码后
```bash
cd web
npm run build
cd ..
wails dev
```
### 修改后端代码后
直接重启 `wails dev` 即可。
## 常见问题
### 问题1找不到 web/dist 目录
**解决**:需要先构建前端
```bash
cd web
npm run build
```
### 问题2数据库连接失败
**检查**
1. 测试服 MySQL 是否可访问外网IP: 39.99.243.191:3306
2. 数据库 lab_dev 是否存在
3. 用户名密码是否正确root/Lake@2019
4. 网络连接是否正常可能需要VPN或白名单
### 问题3前端调用后端方法失败
**检查**
1. 确保 `main.go` 中正确设置了 `Services: []interface{}{app}`
2. 前端调用方式:`window.go.main.App.QueryUsers(...)`
3. 检查浏览器控制台错误信息
### 问题4wails 命令找不到
**解决**
- 使用完整路径:`%GOPATH%\bin\wails.exe`
- 或添加到 PATH 环境变量
## 构建发布版本
### 1. 确保前端已构建
```bash
cd web
npm run build
cd ..
```
### 2. 执行构建
```bash
# 构建当前平台Windows
wails build
# 或明确指定平台
wails build -platform windows/amd64
```
### 3. 构建产物
构建成功后可执行文件位于123
```
build/bin/go-desk.exe
```
### 4. 运行打包后的应用
直接双击 `build/bin/go-desk.exe` 运行,或使用命令行:
```bash
build\bin\go-desk.exe
```
**注意事项**
- 打包后的应用是独立的可执行文件,包含所有前端资源
- 首次运行需要确保 MySQL 数据库 `lab_dev` 可访问
- 数据库连接信息硬编码在代码中localhost:3306, root/123456
- 如需分发,确保目标机器有 MySQL 数据库或修改为远程数据库连接

View File

@@ -0,0 +1,292 @@
# 基于 Wails 的桌面程序搭建
## 技术栈
- Go v1.25.4
- Wails v2
- Arco Design Vue
- Vue 3
## 环境准备
### 1. 安装 Wails CLI
```bash
go install github.com/wailsapp/wails/v2/cmd/wails@latest
```
### 2. 验证安装
```bash
wails version
```
## 项目初始化
### 1. 创建项目
```bash
wails init -n go-desk -t vanilla
```
### 2. 项目结构
```
go-desk/
├── app.go # 应用逻辑,暴露给前端的方法
├── main.go # 程序入口,初始化 Wails 应用
├── wails.json # Wails 配置文件
├── go.mod # Go 模块依赖
├── go.sum # Go 依赖校验
├── web/ # 前端代码目录
│ ├── package.json # 前端依赖配置
│ ├── package-lock.json # 依赖锁定文件
│ ├── vite.config.js # Vite 构建配置
│ ├── index.html # HTML 入口文件
│ ├── src/
│ │ ├── main.js # Vue 应用入口
│ │ ├── App.vue # 根组件
│ │ └── style.css # 全局样式
│ └── dist/ # 构建产物(构建后生成)
│ ├── index.html
│ ├── assets/
│ └── ...
├── build/ # 构建资源目录
│ ├── appicon.png # 应用图标
│ └── windows/ # Windows 构建资源(可选)
│ └── icon.ico
└── build/bin/ # 编译后的可执行文件(构建后生成)
└── go-desk.exe # Windows 可执行文件
```
**目录说明:**
- `app.go`: 定义应用结构体和方法,供前端调用
- `main.go`: 程序入口,配置窗口、资源等
- `web/`: 前端 Vue 项目,使用 Vite 构建
- `web/dist/`: 前端构建产物,会被嵌入到 Go 二进制文件
- `build/`: 应用图标等构建资源
## 配置调整
### 1. 配置 Wails 使用 web 目录
如果使用 `web` 作为前端目录(而非默认的 `frontend`),需要在 `wails.json` 中配置:
```json
{
"frontend": {
"dir": "web"
}
}
```
### 2. 安装 Arco Design Vue
```bash
cd web
npm install --save @arco-design/web-vue
```
### 3. 修改 `web/src/main.js`
```javascript
import { createApp } from 'vue'
import ArcoVue from '@arco-design/web-vue'
import '@arco-design/web-vue/dist/arco.css'
import './style.css'
import App from './App.vue'
const app = createApp(App)
app.use(ArcoVue)
app.mount('#app')
```
### 4. 修改 `web/src/App.vue`
```vue
<template>
<a-layout class="layout">
<a-layout-header>
<div class="header-content">
<h2>Go Desk Demo</h2>
</div>
</a-layout-header>
<a-layout-content class="content">
<a-card>
<template #title>欢迎</template>
<p>这是一个基于 Wails + Arco-Vue 的最小 Demo</p>
<a-button type="primary" @click="handleClick">点击测试</a-button>
<p v-if="message">{{ message }}</p>
</a-card>
</a-layout-content>
</a-layout>
</template>
<script>
export default {
name: 'App',
data() {
return {
message: ''
}
},
methods: {
async handleClick() {
// 调用 Go 后端方法
if (window.go && window.go.main && window.go.main.Greet) {
try {
const result = await window.go.main.Greet('World')
this.message = result
} catch (error) {
this.message = '调用失败: ' + error.message
}
} else {
this.message = 'Go 后端未就绪'
}
}
}
}
</script>
<style>
.layout {
height: 100vh;
display: flex;
flex-direction: column;
}
.header-content {
display: flex;
align-items: center;
height: 100%;
padding: 0 20px;
color: var(--color-text-1);
}
.content {
padding: 20px;
flex: 1;
overflow: auto;
}
</style>
```
### 5. 修改 `app.go` - Go 后端
```go
package main
import (
"context"
"fmt"
)
// App struct
type App struct {
ctx context.Context
}
// NewApp creates a new App application struct
func NewApp() *App {
return &App{}
}
// startup is called when the app starts. The context is saved
// so we can call the runtime methods
func (a *App) startup(ctx context.Context) {
a.ctx = ctx
}
// Greet returns a greeting for the given name
func (a *App) Greet(name string) string {
return fmt.Sprintf("Hello %s, It's show time!", name)
}
```
### 6. 修改 `main.go`
```go
package main
import (
"context"
"embed"
"github.com/wailsapp/wails/v2"
"github.com/wailsapp/wails/v2/pkg/options"
"github.com/wailsapp/wails/v2/pkg/options/assetserver"
)
//go:embed all:web/dist
var assets embed.FS
func main() {
// Create an instance of the app structure
app := NewApp()
// Create application with options
err := wails.Run(&options.App{
Title: "Go Desk",
Width: 1024,
Height: 768,
AssetServer: &assetserver.Options{
Assets: assets,
},
BackgroundColour: &options.RGBA{R: 27, G: 38, B: 54, A: 1},
OnStartup: app.startup,
})
if err != nil {
println("Error:", err.Error())
}
}
```
## 开发运行
### 1. 开发模式
```bash
# 终端1启动前端开发服务器
cd web
npm run dev
# 终端2启动 Wails 开发模式
wails dev
```
### 2. 构建前端
```bash
cd web
npm run build
```
### 3. 构建应用
```bash
# 构建当前平台
wails build
# 构建 Windows
wails build -platform windows/amd64
# 构建 macOS
wails build -platform darwin/amd64
# 构建 Linux
wails build -platform linux/amd64
```
## 注意事项
1. **前端构建**:每次修改前端代码后需要重新构建 `npm run build`Wails 会使用 `web/dist` 目录
2. **Go 方法暴露**:在 `app.go` 中定义的方法会自动暴露给前端,通过 `window.go.main.MethodName` 调用
3. **热重载**开发模式下Go 代码修改需要重启 `wails dev`,前端代码修改需要重新构建
4. **资源嵌入**:使用 `//go:embed` 将前端构建产物嵌入到 Go 二进制文件中
## 参考
- [Wails 官方文档](https://wails.io/docs/)
- [Arco Design Vue](https://arco.design/vue/docs/start)

View File

@@ -0,0 +1,250 @@
# Go Desk 更新升级功能设计
> **文档版本**v1.0
> **创建时间**2025-01-XX
> **维护者**JueChen
> **状态**:设计阶段
## 1. 功能概述
实现应用的自动更新升级功能,包括版本检查、下载更新包、自动替换和重启应用。
## 2. 功能需求
### 2.1 核心功能
- [ ] 版本检查:启动时或手动检查最新版本
- [ ] 版本对比:比较当前版本与最新版本
- [ ] 更新提示:发现新版本时提示用户
- [ ] 下载更新:后台下载更新包(支持进度显示)
- [ ] 自动替换:下载完成后自动替换旧版本
- [ ] 自动重启:替换完成后自动重启应用
### 2.2 版本管理
- **当前版本**:从代码中定义(如 `const Version = "1.0.0"`
- **版本格式**:语义化版本(如 `1.0.0`, `1.0.1`
- **版本检查**从服务器获取最新版本信息JSON 格式)
### 2.3 更新流程
```
应用启动
检查更新(可选,后台进行)
发现新版本?
↓ 是
显示更新提示
用户确认更新
下载更新包(显示进度)
下载完成
关闭当前应用
替换旧版本文件
启动新版本
完成
```
## 3. 技术实现
### 3.1 版本信息结构
```go
type VersionInfo struct {
Version string `json:"version"` // 版本号,如 "1.0.1"
DownloadURL string `json:"download_url"` // 下载地址
ReleaseNotes string `json:"release_notes"` // 更新说明
Size int64 `json:"size"` // 文件大小(字节)
MD5 string `json:"md5"` // 文件 MD5 校验
}
```
### 3.2 版本检查接口
**接口地址**`https://your-server.com/api/version/check`
**请求**
```json
{
"current_version": "1.0.0",
"platform": "windows"
}
```
**响应**
```json
{
"has_update": true,
"latest_version": "1.0.1",
"download_url": "https://your-server.com/releases/go-desk-1.0.1.exe",
"release_notes": "修复了若干问题",
"size": 13765632,
"md5": "abc123..."
}
```
### 3.3 Go 后端实现
#### 3.3.1 版本定义
```go
// app.go 或 version.go
const AppVersion = "1.0.0"
```
#### 3.3.2 更新检查方法
```go
// CheckUpdate 检查更新
func (a *App) CheckUpdate() (map[string]interface{}, error)
```
#### 3.3.3 下载更新方法
```go
// DownloadUpdate 下载更新包
func (a *App) DownloadUpdate(downloadURL string, progressCallback func(int)) error
```
#### 3.3.4 应用更新方法
```go
// ApplyUpdate 应用更新(替换文件并重启)
func (a *App) ApplyUpdate(updateFilePath string) error
```
### 3.4 前端实现
#### 3.4.1 更新检查组件
- 启动时自动检查(可选)
- 手动检查按钮
- 更新提示对话框
- 下载进度显示
#### 3.4.2 界面元素
- 版本号显示
- 更新提示对话框Arco Modal
- 下载进度条Arco Progress
- 更新说明展示
## 4. 实现细节
### 4.1 版本比较
使用语义化版本比较:
- 格式:`主版本号.次版本号.修订号`(如 `1.0.0`
- 比较逻辑:逐级比较版本号
### 4.2 文件下载
- 使用 Go 标准库 `net/http` 下载
- 支持进度回调
- 支持断点续传(可选)
- 下载到临时目录(如 `%TEMP%/go-desk-update.exe`
### 4.3 文件替换Windows
**方案1使用批处理脚本**
1. 下载完成后,生成批处理脚本
2. 脚本内容:等待进程结束 → 替换文件 → 启动新版本 → 删除脚本
3. 启动脚本后退出当前应用
**方案2使用 Go 实现**
1. 创建更新助手程序
2. 主程序退出前启动助手程序
3. 助手程序等待主程序退出后替换文件并重启
### 4.4 错误处理
- 网络错误:提示检查网络连接
- 下载失败:支持重试
- 文件校验失败:重新下载
- 替换失败:提示手动更新
## 5. 文件结构
```
go-desk/
├── internal/
│ └── update/
│ ├── update.go # 更新核心逻辑
│ ├── version.go # 版本管理
│ └── download.go # 下载功能
├── app.go # 添加更新相关方法
└── version.go # 版本常量定义
```
## 6. 配置项
### 6.1 更新服务器配置
```go
const (
UpdateCheckURL = "https://your-server.com/api/version/check"
UpdateInterval = 24 * time.Hour // 检查间隔
)
```
### 6.2 可选配置
- 是否自动检查更新
- 检查更新间隔
- 更新服务器地址
## 7. 安全考虑
1. **HTTPS 连接**:版本检查和下载使用 HTTPS
2. **文件校验**:下载后验证 MD5/SHA256
3. **权限检查**:确保有写入权限
4. **回滚机制**:更新失败时保留旧版本
## 8. 用户体验
1. **非阻塞**:更新检查在后台进行,不阻塞应用启动
2. **可取消**:用户可以选择稍后更新
3. **进度显示**:下载时显示进度条
4. **友好提示**:清晰的更新说明和操作指引
## 9. 开发优先级
### 阶段一:基础功能
- [ ] 版本定义和比较
- [ ] 版本检查接口
- [ ] 简单的更新提示
### 阶段二:下载功能
- [ ] 文件下载实现
- [ ] 进度显示
- [ ] 错误处理
### 阶段三:自动更新
- [ ] 文件替换逻辑
- [ ] 自动重启
- [ ] 完整测试
## 10. 注意事项
1. **Windows 文件锁定**:需要先关闭应用才能替换
2. **权限问题**:确保有写入应用目录的权限
3. **网络超时**:设置合理的超时时间
4. **更新失败处理**:保留旧版本,不破坏现有功能
## 11. 参考实现
- Electron 的 auto-updater 机制
- Wails 社区更新方案
- Go 应用更新最佳实践
---
**下一步**:根据此设计文档开始实现更新功能。

View File

@@ -0,0 +1,321 @@
# Go Desk 设备调用测试功能设计
> **文档版本**v1.0
> **创建时间**2025-01-XX
> **维护者**JueChen
> **状态**:设计阶段
## 1. 功能概述
实现系统资源访问和设备调用测试功能,验证 Wails 应用与系统资源的交互能力。
## 2. 功能需求
### 2.1 系统信息获取
- [ ] CPU 信息:核心数、使用率、型号
- [ ] 内存信息:总内存、已用内存、可用内存
- [ ] 磁盘信息:磁盘列表、总容量、已用容量、可用容量
- [ ] 系统信息:操作系统、架构、主机名
- [ ] 网络信息IP 地址、网络接口列表
### 2.2 文件系统操作
- [ ] 读取文件:读取指定路径的文件内容
- [ ] 写入文件:写入内容到指定文件
- [ ] 列出目录:获取目录下的文件和文件夹列表
- [ ] 创建目录:创建新目录
- [ ] 删除文件/目录:删除指定路径的文件或目录
- [ ] 文件信息:获取文件大小、修改时间、权限等
### 2.3 系统操作
- [ ] 环境变量:读取系统环境变量
- [ ] 执行命令:执行系统命令(可选,需谨慎)
- [ ] 打开文件/目录:使用系统默认程序打开
- [ ] 文件选择对话框:选择文件或目录
### 2.4 进程信息
- [ ] 进程列表:获取当前运行的进程列表
- [ ] 进程详情:获取指定进程的详细信息
## 3. 技术实现
### 3.1 Go 后端实现
#### 3.1.1 系统信息模块
```go
// internal/system/system.go
package system
// GetSystemInfo 获取系统信息
func GetSystemInfo() (map[string]interface{}, error)
// GetCPUInfo 获取 CPU 信息
func GetCPUInfo() (map[string]interface{}, error)
// GetMemoryInfo 获取内存信息
func GetMemoryInfo() (map[string]interface{}, error)
// GetDiskInfo 获取磁盘信息
func GetDiskInfo() ([]map[string]interface{}, error)
```
#### 3.1.2 文件系统模块
```go
// internal/filesystem/fs.go
package filesystem
// ReadFile 读取文件
func ReadFile(path string) (string, error)
// WriteFile 写入文件
func WriteFile(path, content string) error
// ListDir 列出目录
func ListDir(path string) ([]map[string]interface{}, error)
// CreateDir 创建目录
func CreateDir(path string) error
// DeletePath 删除文件或目录
func DeletePath(path string) error
// GetFileInfo 获取文件信息
func GetFileInfo(path string) (map[string]interface{}, error)
```
#### 3.1.3 App 方法暴露
```go
// app.go 中添加方法
// GetSystemInfo 获取系统信息
func (a *App) GetSystemInfo() (map[string]interface{}, error)
// GetCPUInfo 获取 CPU 信息
func (a *App) GetCPUInfo() (map[string]interface{}, error)
// GetMemoryInfo 获取内存信息
func (a *App) GetMemoryInfo() (map[string]interface{}, error)
// GetDiskInfo 获取磁盘信息
func (a *App) GetDiskInfo() ([]map[string]interface{}, error)
// ReadFile 读取文件
func (a *App) ReadFile(path string) (string, error)
// WriteFile 写入文件
func (a *App) WriteFile(path, content string) error
// ListDir 列出目录
func (a *App) ListDir(path string) ([]map[string]interface{}, error)
// CreateDir 创建目录
func (a *App) CreateDir(path string) error
// DeletePath 删除文件或目录
func (a *App) DeletePath(path string) error
// GetFileInfo 获取文件信息
func (a *App) GetFileInfo(path string) (map[string]interface{}, error)
// GetEnvVars 获取环境变量
func (a *App) GetEnvVars() (map[string]string, error)
// OpenPath 打开文件或目录
func (a *App) OpenPath(path string) error
```
### 3.2 前端实现
#### 3.2.1 系统信息展示
- 系统信息卡片Arco Card
- 实时刷新按钮
- 信息表格展示
#### 3.2.2 文件系统操作界面
- 文件浏览器组件
- 路径输入框
- 操作按钮(读取、写入、删除等)
- 文件内容编辑器(文本区域)
#### 3.2.3 测试页面布局
```
┌─────────────────────────────────────┐
│ 系统信息测试 │
├─────────────────────────────────────┤
│ [刷新] │
│ ┌─────────┬─────────┬─────────┐ │
│ │ CPU │ 内存 │ 磁盘 │ │
│ └─────────┴─────────┴─────────┘ │
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
│ 文件系统测试 │
├─────────────────────────────────────┤
│ 路径: [________________] [浏览] │
│ ┌───────────────────────────────┐ │
│ │ 文件列表 │ │
│ │ - file1.txt │ │
│ │ - folder1/ │ │
│ └───────────────────────────────┘ │
│ [读取] [写入] [删除] [创建目录] │
└─────────────────────────────────────┘
```
## 4. 依赖库
### 4.1 Go 依赖
```go
// 系统信息
github.com/shirou/gopsutil/v3/cpu
github.com/shirou/gopsutil/v3/mem
github.com/shirou/gopsutil/v3/disk
github.com/shirou/gopsutil/v3/host
// 文件操作
os
path/filepath
io/ioutil
// 系统操作
os/exec
runtime
```
### 4.2 安装命令
```bash
go get github.com/shirou/gopsutil/v3/cpu
go get github.com/shirou/gopsutil/v3/mem
go get github.com/shirou/gopsutil/v3/disk
go get github.com/shirou/gopsutil/v3/host
```
## 5. 实现细节
### 5.1 系统信息获取
**CPU 信息**
- 使用 `gopsutil/cpu` 获取 CPU 核心数、使用率
- 使用 `runtime.NumCPU()` 获取逻辑核心数
**内存信息**
- 使用 `gopsutil/mem` 获取内存统计
- 转换为 MB/GB 单位显示
**磁盘信息**
- 使用 `gopsutil/disk` 获取磁盘分区和使用情况
- 过滤系统盘和可访问盘
**系统信息**
- 使用 `gopsutil/host` 获取主机信息
- 使用 `runtime.GOOS``runtime.GOARCH` 获取平台信息
### 5.2 文件系统操作
**路径安全**
- 验证路径合法性
- 防止路径遍历攻击
- 限制操作范围(可选)
**错误处理**
- 文件不存在
- 权限不足
- 路径无效
**文件编码**
- 文本文件使用 UTF-8
- 二进制文件提示用户
### 5.3 跨平台兼容
- Windows使用 `os/exec` 执行系统命令
- Linux/Mac使用相应的系统调用
- 路径分隔符:使用 `filepath.Join` 处理
## 6. 文件结构
```
go-desk/
├── internal/
│ ├── system/
│ │ └── system.go # 系统信息获取
│ └── filesystem/
│ └── fs.go # 文件系统操作
├── app.go # 添加系统调用方法
└── web/src/
└── components/
├── SystemInfo.vue # 系统信息组件
└── FileSystem.vue # 文件系统组件
```
## 7. 安全考虑
1. **路径验证**:防止路径遍历攻击
2. **权限检查**:确保有足够的权限执行操作
3. **操作限制**:限制危险操作(如删除系统文件)
4. **输入验证**:验证所有用户输入
5. **错误信息**:不暴露敏感系统信息
## 8. 测试用例
### 8.1 系统信息测试
- [ ] 获取 CPU 信息成功
- [ ] 获取内存信息成功
- [ ] 获取磁盘信息成功
- [ ] 信息格式正确
### 8.2 文件系统测试
- [ ] 读取文件成功
- [ ] 写入文件成功
- [ ] 列出目录成功
- [ ] 创建目录成功
- [ ] 删除文件成功
- [ ] 路径验证有效
- [ ] 错误处理正确
## 9. 开发优先级
### 阶段一:基础系统信息
- [ ] CPU 信息获取
- [ ] 内存信息获取
- [ ] 系统基本信息
### 阶段二:文件系统基础操作
- [ ] 读取文件
- [ ] 列出目录
- [ ] 文件信息获取
### 阶段三:文件系统完整操作
- [ ] 写入文件
- [ ] 创建目录
- [ ] 删除文件/目录
### 阶段四:高级功能
- [ ] 磁盘信息
- [ ] 网络信息
- [ ] 环境变量
- [ ] 打开文件/目录
## 10. 注意事项
1. **性能**:系统信息获取可能较慢,考虑异步调用
2. **权限**:某些操作需要管理员权限
3. **跨平台**:不同平台的行为可能不同
4. **错误处理**:完善的错误提示和日志记录
---
**下一步**:根据此设计文档开始实现设备调用测试功能。

View File

@@ -0,0 +1,247 @@
# Go Desk 需求文档
> **文档版本**v1.0
> **创建时间**2025-12-29
> **维护者**JueChen
> **状态**:已确定
## 1. 产品概述
### 1.1 产品定位
Go Desk 是基于 Wails 框架开发的桌面应用程序,用于**测试验证技术栈**。通过实现用户查询功能,验证以下技术能力:
- 打包和构建流程
- 前后端交互机制
- 与系统资源交互(数据库连接、文件操作等)
- 跨平台桌面应用开发
### 1.2 技术栈
- **后端**Go v1.25.4
- **框架**Wails v2
- **前端**Vue 3 + Arco Design Vue
- **构建工具**Vite
- **数据库**MySQL (lab_dev)
## 2. 功能需求
### 2.1 核心功能:用户查询展示
#### 功能描述
从 MySQL 数据库 `lab_dev``member_info` 表中查询用户信息,并在桌面应用中展示。参考 `lab-admin``lab-api` 中的用户管理功能。
#### 数据表结构
- **表名**`member_info`
- **主要字段**
- `memberid`用户ID主键
- `membername`:姓名
- `account`:账号
- `contactphone`:联系电话
- `organid`所属机构ID
- `organname`:所属机构名称(需关联查询)
- `role`:角色(需关联 `sys_member_role` 表获取角色名称)
- `status`状态1-正常2-停用3-删除)
- `createtime`:创建时间
- `updatetime`:修改时间
#### 查询功能
- [ ] 用户列表展示(表格形式)
- [ ] 关键字搜索(支持姓名、账号、电话模糊查询)
- [ ] 状态筛选(全部/正常/停用/已删除)
- [ ] 角色筛选(需关联查询角色表)
- [ ] 机构筛选(需关联查询机构表)
- [ ] 分页显示
- [ ] 排序功能按创建时间、用户ID等
#### 展示字段
- [ ] 编号memberid
- [ ] 姓名membername
- [ ] 账号account
- [ ] 联系电话contactphone
- [ ] 所属机构organname
- [ ] 角色(角色名称,需关联查询)
- [ ] 状态(状态标签显示)
- [ ] 创建时间createtime
- [ ] 修改时间updatetime
#### 界面要求
- [ ] 使用 Arco Design Vue 组件库
- [ ] 查询表单(关键字、状态、角色、机构筛选)
- [ ] 数据表格展示
- [ ] 分页组件
- [ ] 状态标签(正常-绿色,停用-橙色,删除-灰色)
### 2.2 基础功能
- [x] 应用启动和窗口管理
- [x] 前后端通信机制
- [x] 数据库连接MySQL lab_dev
- [ ] 错误处理和日志记录
- [ ] 数据库连接配置管理
### 2.3 界面需求
- [ ] 主界面布局(查询区域 + 表格区域)
- [ ] 使用 Arco 基础样式,避免过度自定义
- [ ] 响应式布局适配
## 3. 非功能需求
### 3.1 性能要求
- [ ] 启动时间:< 3秒
- [ ] 查询响应:< 500ms
- [ ] 内存占用:< 200MB
### 3.2 兼容性要求
- [ ] Windows 10/11优先
- [ ] macOS后续考虑
- [ ] Linux后续考虑
### 3.3 用户体验要求
- [ ] 界面简洁易用
- [ ] 查询操作流畅
- [ ] 错误提示友好
- [ ] 加载状态提示
## 4. 数据需求
### 4.1 数据库连接
- **数据库**MySQL
- **数据库名**lab_dev
- **连接信息**
- Host: localhost
- Port: 3306
- User: root
- Password: 123456
- **连接池配置**
- MaxOpenConns: 25
- MaxIdleConns: 5
- ConnMaxLifetime: 300秒
### 4.2 数据查询
- [ ] 直接查询 `member_info`
- [ ] 关联查询机构表获取机构名称
- [ ] 关联查询 `sys_member_role` 表获取角色信息
- [ ] 支持分页查询limit/offset
- [ ] 支持排序(按字段排序)
### 4.3 数据交互
- [ ] 前端通过 `window.go.main` 调用 Go 方法
- [ ] Go 方法返回 JSON 格式数据
- [ ] 查询参数:关键字、状态、角色、机构、分页信息
- [ ] 返回数据:用户列表、总数
## 5. 开发优先级
### 阶段一最小可用版本MVP
- [x] 项目初始化和框架搭建
- [ ] 数据库连接配置
- [ ] Go 后端:用户查询接口
- [ ] 前端:用户列表展示
- [ ] 基础查询功能(关键字搜索)
### 阶段二:功能完善
- [ ] 筛选功能(状态、角色、机构)
- [ ] 分页功能
- [ ] 排序功能
- [ ] 关联查询(机构名称、角色名称)
- [ ] 界面优化
### 阶段三:增强功能(后续考虑)
- [ ] 用户修改功能
- [ ] 用户新增功能
- [ ] 用户删除功能
- [ ] 数据导出功能
- [ ] 性能优化
## 6. 技术实现要点
### 6.1 Go 后端
- 使用 GORM 连接 MySQL
- 定义 `MemberInfo` 结构体(参考 `ops-kit/internal/model/member_info.go`
- 实现查询方法,参数不超过 3 个
- 返回 JSON 格式数据
### 6.2 前端
- 使用 Arco Design Vue 组件
- 表格组件:`a-table`
- 查询表单:`a-form` + `a-input` + `a-select`
- 分页组件:`a-pagination`
### 6.3 数据库查询
- 基础查询:`SELECT * FROM member_info WHERE ...`
- 关联查询机构:`LEFT JOIN organ_info ON member_info.organid = organ_info.organid`
- 关联查询角色:`LEFT JOIN sys_member_role ON member_info.memberid = sys_member_role.memberid`
## 7. 参考实现
- **前端参考**`lab-admin/src/views/member/index.vue`
- **后端参考**`lab-api/src/main/java/cn/casehub/member/MemberService.java`
- **数据模型参考**`ops-kit/internal/model/member_info.go`
- **数据库连接参考**`ops-kit/internal/database/db.go`
## 8. 项目定位说明
### 8.1 应用用途
**测试验证技术栈** - 通过实际项目验证 Wails + Go + Arco-Vue 技术栈的可行性
### 8.2 目标用户
**开发者自己** - 技术型验证项目,用于学习和验证技术能力
### 8.3 核心验证点
1. **打包构建**:验证 Wails 的打包和构建流程
2. **前后端交互**:验证 Go 后端与 Vue 前端的通信机制
3. **系统资源交互**:验证数据库连接、文件操作等系统资源访问能力
4. **跨平台能力**:验证 Windows/macOS/Linux 平台兼容性
### 8.4 数据来源
- **数据库**MySQL lab_dev本地数据库
- **数据表**member_info用户表
- **连接方式**:直接连接,无需外部服务
### 8.5 离线能力
- 支持离线使用(连接本地数据库)
- 不依赖网络服务
### 8.6 更新机制评估
**复杂度评估**:中等复杂度,实现难度不高
**实现方式**
1. **简单方案**(推荐用于验证):
- 应用启动时检查版本号(从配置文件或服务器获取)
- 提示用户有新版本,引导手动下载更新
- **复杂度**:低,实现简单
2. **完整方案**(如需自动更新):
- 版本检查:启动时请求服务器获取最新版本信息
- 下载更新后台下载更新包zip/exe
- 自动替换:下载完成后替换旧版本,重启应用
- **复杂度**:中等,需要处理:
- 版本管理(版本号对比)
- 文件下载(断点续传、进度显示)
- 文件替换Windows 需要关闭进程后替换)
- 错误处理(下载失败、替换失败等)
**推荐**
- **当前阶段**:暂不实现自动更新,手动更新即可
- **后续考虑**:如需实现,建议使用第三方库(如 `wails-updater` 或自行实现简单版本检查)
**参考实现**
- Wails 社区有相关更新方案示例
- 可以参考 Electron 的更新机制设计思路
---
**当前阶段**:实现用户查询展示功能,修改维护功能后续考虑。