Appearance
常见问题
本文档引用文件
- README.md
- package.json
- codegen/package.json
- deno/package.json
- pc/package.json
- uni/package.json
- codegen/src/config.ts
- deno/graphql.config.js
- pc/graphql.config.js
- uni/graphql.config.js
目录
环境配置
本项目采用多模块架构,包含 codegen
、deno
(后端)、pc
(前端管理界面)、uni
(移动端)等子项目,均通过 pnpm 进行包管理。
如何正确安装依赖?
根据 package.json
中的 postinstall
脚本,项目在安装依赖后会自动为各子项目执行 pnpm install
。
解决方案:
- 确保已安装 pnpm(推荐使用
npm install -g pnpm
) - 在项目根目录执行:
bash
npm install
该命令会触发根目录的 postinstall
钩子,自动为 deno
、pc
、uni
三个子项目安装依赖。
常见问题:
- 若提示
only-allow pnpm
错误,请使用pnpm install
替代npm install
- 若出现编译依赖问题(如
ssh2
),请确保系统已安装 Python、C++ 构建工具
Section sources
如何配置开发环境变量?
项目使用 .env
文件管理环境变量。各子项目需在各自目录下创建 .env
文件。
关键环境变量示例:
env
# deno/.env
DB_HOST=localhost
DB_PORT=3306
DB_USER=root
DB_PASS=password
DB_NAME=nest_db
GRAPHQL_PATH=/graphql
Section sources
代码生成
本项目核心特性是可增量更新的代码生成器,解决了传统代码生成器覆盖修改代码的问题。
代码生成器如何工作?
根据 README.md
描述,代码生成器利用 git diff
和 git apply
技术实现增量更新:
- 首次生成代码后,手动修改部分文件
- 再次运行代码生成器时,系统会:
- 记录已生成代码的原始版本
- 比对当前代码与原始版本的差异(
git diff
) - 生成新代码后,将之前的修改合并进来(
git apply
)
- 实现"生成代码 + 手动开发"的无缝结合
命令:
bash
npm run codegen
Section sources
如何添加新的数据表并生成代码?
- 在
codegen/src/tables
目录下创建表定义文件(如my_table.ts
) - 定义表结构:
ts
export const my_table = {
name: 'my_table',
columns: [
{ name: 'id', type: 'uuid', primaryKey: true },
{ name: 'name', type: 'string', length: 100 }
]
};
- 运行代码生成:
bash
npm run codegen
- 系统将自动生成:
- Deno 后端:DAO、Model、Resolver、Service
- PC 前端:Vue 页面、路由、API 调用
- UniApp 移动端:页面和 API
Section sources
API调用
项目采用 GraphQL 作为主要 API 通信协议,前后端均通过 GraphQL 进行数据交互。
如何调用 GraphQL API?
前端调用示例(PC 项目):
ts
// src/utils/graphql.ts
import { request } from 'graphql-request';
const API_URL = '/graphql';
export const gqlQuery = (query, variables = {}) => {
return request(API_URL, query, variables);
};
// 使用示例
const GET_USERS = `query GetUsers($page: Int) {
usr_page(page: $page, size: 20) {
records {
id
name
email
}
total
}
}`;
gqlQuery(GET_USERS, { page: 1 }).then(data => {
console.log(data.usr_page.records);
});
自动生成的 API 文件:
pc/src/components/Api.ts
pc/src/layout/Api.ts
uni/src/pages/[[table]]/Api.ts
Section sources
如何添加新的 GraphQL 查询?
- 在
deno/src
相应模块中修改 Resolver - 或通过代码生成器自动创建
- 运行
npm run gqlgen
生成 TypeScript 类型:
bash
npm run gqlgen
该命令会根据 GraphQL Schema 自动生成前端可用的 TypeScript 类型。
Section sources
权限控制
系统提供多层次的权限管理机制。
字段级权限如何配置?
通过 npmFieldPermit
工具生成字段权限配置:
bash
npm run field_permit
该命令分析代码中的字段使用情况,生成 field_permit
相关配置,实现字段级别的读写控制。
相关文件:
deno/gen/base/field_permit/*
pc/src/store/field_permit.ts
菜单权限如何扫描?
使用 permit_scan.js
工具自动扫描前端路由和组件中的权限标识:
bash
npm run permit
该工具会:
- 扫描
pc/src/views
目录下的所有 Vue 文件 - 提取权限标识(如
@permit("user:create")
) - 生成权限配置供后端验证
Section sources
部署发布
如何构建生产环境版本?
后端(Deno):
bash
npm run build-prod
该命令调用 deno run -A ./lib/script/build.ts --target linux --env prod
,使用 Deno 打包为可执行文件。
前端(PC):
bash
cd pc && npm run build-prod
使用 Vite 构建生产版本,输出到 dist
目录。
发布到服务器:
bash
npm run publish
调用 deno/lib/script/publish.js
,通过 SSH 将构建产物部署到目标服务器。
Section sources
数据库相关
如何初始化数据库?
bash
npm run initdb
该命令执行 codegen/src/util/npmInitDB.ts
,根据表定义自动创建数据库表结构。
如何导入 CSV 数据?
bash
npm run importCsv
执行 npmImportCsv.ts
脚本,将 CSV 文件数据导入指定数据表。
如何修改数据库字符集?
bash
npm run db_charset
执行 npmDbCharset.ts
脚本,统一数据库字符集为 UTF8MB4。
Section sources
- package.json
- codegen/src/util/npmInitDB.ts
- codegen/src/util/npmImportCsv.ts
- codegen/src/util/npmDbCharset.ts
性能优化
如何提升构建性能?
- 增加 Node.js 内存限制:在
package.json
的构建脚本中设置NODE_OPTIONS=--max-old-space-size=4096
- 使用增量构建:Vite 和 Deno 均支持快速热重载
- 依赖预构建:pnpm 的
onlyBuiltDependencies
配置确保关键依赖预构建
json
// pc/package.json
"pnpm": {
"onlyBuiltDependencies": [
"@parcel/watcher",
"esbuild",
"vue-demi"
]
}
GraphQL 查询优化
- 避免过度获取:只请求需要的字段
- 使用分页:大数据集使用
page
和size
参数 - 启用缓存:对静态数据启用 Redis 或内存缓存
Section sources
安全问题
密码如何加密?
使用 npmPassword.ts
工具生成加密密码:
bash
npm run pwd
系统采用 MD5 + 盐值 的方式存储密码,实际项目中建议升级为 bcrypt 或 Argon2。
如何生成加密密钥?
bash
npm run db_gen_crypto_key
该命令生成用于数据加密的密钥,存储在数据库中,用于敏感字段的加密存储。
Section sources
故障排除
数据库连接失败
可能原因:
- 数据库服务未启动
- 连接参数错误(host、port、user、pass)
- 防火墙阻止连接
解决方案:
- 检查
deno/.env
文件中的数据库配置 - 使用 MySQL 客户端测试连接
- 确认数据库允许远程连接
GraphQL 查询返回空数据
- 检查 Resolver 中的数据库查询逻辑
- 确认用户具有相应数据权限
- 查看后端日志是否有错误信息
代码生成器不生效
- 确认
codegen
目录下的表定义文件语法正确 - 检查是否有 TypeScript 编译错误
- 确认
__out__
目录有写入权限
前端无法加载
- 确认
pc
项目的依赖已正确安装 - 检查 Vite 配置是否正确
- 查看浏览器控制台是否有 JavaScript 错误
Section sources