V0.31.1.250619_alpha:bug修复及README重写

This commit is contained in:
jinchao 2025-06-19 14:32:04 +08:00
parent 33eca177ce
commit 1adab540b7
3 changed files with 243 additions and 89 deletions

Binary file not shown.

View File

@ -1,33 +1,68 @@
# XNSim 登录系统 # XNSim 门户网站
这是一个与 C++动态库集成的登录系统,用于 XNSim 项目 一个基于 Node.js 的现代化门户系统,集成了 C++ 动态库认证功能,专为 XNSim 项目设计
## 功能特点 ## 📋 目录
- [功能特点](#功能特点)
- [系统架构](#系统架构)
- [环境要求](#环境要求)
- [快速开始](#快速开始)
- [API 文档](#api-文档)
- [权限管理](#权限管理)
- [技术栈](#技术栈)
- [常见问题](#常见问题)
## ✨ 功能特点
### 🔐 认证系统
- 美观的响应式登录界面 - 美观的响应式登录界面
- 根据操作系统自动选择动态库类型和命名规则: - 跨平台动态库支持Windows/Linux
- Windows: `login.dll` - 基于权限级别的用户角色管理
- Linux: `liblogin.so`(符合 Linux 动态库命名规范) - 记住登录状态功能
- 支持基于权限级别的用户角色系统
- 使用 Node.js 作为后端服务
- 接口配置管理功能:
- 支持添加、编辑、删除接口
- 支持从 Excel 文件导入接口配置
- 支持按构型、ATA 章节、结构体名等条件筛选
- 支持分页显示和批量操作
## 环境要求 ### 🔧 接口配置管理
- Node.js 14.x 或更高版本 - 完整的 CRUD 操作支持
- 环境变量 `XNCore` 指向动态库所在的根目录(系统会在该目录的 lib 子目录中查找动态库) - Excel 文件批量导入功能
- MySQL 数据库(用于存储接口配置数据) - 多维度筛选构型、ATA 章节、结构体名等)
- 分页显示和批量操作
- 数据验证和错误处理
## 安装步骤 ### 📊 系统监控
1. 确保已设置环境变量 `XNCore`,指向包含动态库的根目录 - 实时数据监控
- 系统日志管理
- 用户行为追踪
- 性能指标展示
## 🏗️ 系统架构
```
XNSimPortal/
├── assets/ # 静态资源文件
├── components/ # 前端组件
├── routes/ # API 路由
├── utils/ # 工具函数
├── server.js # 主服务器文件
└── main.html # 主页面
```
## 📋 环境要求
### 必需软件
- **Node.js**: 14.x 或更高版本
- **SQLite**: 5.7 或更高版本
- **操作系统**: Windows 10+ / Linux / macOS
### 环境变量
必须设置 `XNCore` 环境变量,指向 XNSim 安装根目录:
```bash ```bash
# Linux/Mac # Linux/macOS
export XNCore=/path/to/xncore/directory export XNCore=/path/to/xncore/directory
# Windows (CMD) # Windows (CMD)
@ -37,118 +72,237 @@ set XNCore=C:\path\to\xncore\directory
$env:XNCore = "C:\path\to\xncore\directory" $env:XNCore = "C:\path\to\xncore\directory"
``` ```
2. 确保在 `$XNCore/lib` 目录下存在相应的动态库文件: ### 动态库文件
- Windows: `login.dll` 确保在 `$XNCore/lib` 目录下存在相应动态库:
- Linux: `liblogin.so`
3. 安装依赖 | 操作系统 | 文件名 | 说明 |
| -------- | ------------- | ------------------ |
| Windows | `login.dll` | Windows 动态链接库 |
| Linux | `liblogin.so` | Linux 共享对象库 |
## 🚀 快速开始
### 1. 克隆项目
```bash
git clone <repository-url>
cd XNSimPortal
```
### 2. 安装依赖
```bash ```bash
npm install npm install
``` ```
4. 配置数据库连接 ### 3. 配置数据库
在项目根目录创建 `.env` 文件,添加以下配置: 创建 `.env` 文件并配置数据库连接
```env ```env
DB_HOST=localhost DB_HOST=localhost
DB_USER=your_username DB_USER=your_username
DB_PASSWORD=your_password DB_PASSWORD=your_password
DB_NAME=xnsim_db DB_NAME=xnsim_db
DB_PORT=3306
``` ```
5. 启动服务器 ### 4. 启动服务
```bash ```bash
npm start npm start
``` ```
6. 访问 http://localhost:3000 打开登录页面 ### 5. 访问应用
## 登录 API 打开浏览器访问http://localhost:3000
登录系统通过调用 `/api/login` 接口与 C++动态库交互。API 接收以下参数: ## 📚 API 文档
- `username`: 用户名 ### 认证 API
- `password`: 密码
- `remember`: 是否记住用户(布尔值)
API 响应包含以下信息: #### 用户登录
- `success`: 登录是否成功(布尔值) ```http
- `message`: 登录结果消息 POST /api/login
- `permissionLevel`: 用户权限级别(整数,仅在登录成功时返回) Content-Type: application/json
- `role`: 用户角色描述(字符串,仅在登录成功时返回)
## 接口配置 API {
"username": "string",
"password": "string",
"remember": boolean
}
```
### 接口列表 **响应示例:**
- 路径: `/api/interface/list` ```json
- 方法: `GET` {
- 响应: 返回所有接口配置数据 "success": true,
"message": "登录成功",
"permissionLevel": 3,
"role": "管理员"
}
```
### 添加接口 ### 接口配置 API
- 路径: `/api/interface/add` #### 获取接口列表
- 方法: `POST`
- 请求体: 包含接口配置信息的 JSON 对象
### 更新接口 ```http
GET /api/interface/list?page=1&limit=10&filter=...
```
- 路径: `/api/interface/update` #### 添加接口
- 方法: `PUT`
- 请求体: 包含当前数据和原始数据的 JSON 对象
### 删除接口 ```http
POST /api/interface/add
Content-Type: application/json
- 路径: `/api/interface/delete` {
- 方法: `DELETE` "configuration": "string",
- 参数: 通过查询字符串传递接口标识信息 "ataChapter": "string",
"structName": "string",
"interfaceName": "string",
"dataType": "string",
"arraySize": "string",
"description": "string"
}
```
### 导入接口 #### 更新接口
- 路径: `/api/interface/import` ```http
- 方法: `POST` PUT /api/interface/update
- 请求体: 包含导入数据的 JSON 对象 Content-Type: application/json
### 获取导入模板 {
"currentData": {...},
"originalData": {...}
}
```
- 路径: `/api/interface/template` #### 删除接口
- 方法: `GET`
- 响应: 返回 Excel 模板文件
## 权限级别 ```http
DELETE /api/interface/delete?id=123
```
系统支持以下权限级别: #### 导入接口配置
- 0: 访客 ```http
- 1: 普通用户 POST /api/interface/import
- 2: 高级用户 Content-Type: application/json
- 3: 管理员
- 4: 超级管理员
## 技术栈 {
"data": [...]
}
```
- 前端: HTML, CSS, JavaScript, Web Components #### 下载导入模板
- 后端: Node.js, Express
- 数据库: MySQL
- 外部库:
- ffi-napi (用于调用 C++动态库)
- xlsx (用于处理 Excel 文件)
## 注意事项 ```http
GET /api/interface/template
```
## 🔐 权限管理
系统采用五级权限体系:
| 级别 | 角色 | 权限描述 |
| ---- | ---------- | ---------------- |
| 0 | 访客 | 仅可查看公开信息 |
| 1 | 普通用户 | 基础功能访问权限 |
| 2 | 高级用户 | 扩展功能访问权限 |
| 3 | 管理员 | 系统管理权限 |
| 4 | 超级管理员 | 完全系统控制权限 |
## 🛠️ 技术栈
### 前端
- **HTML5** - 语义化标记
- **CSS3** - 样式和动画
- **JavaScript ES6+** - 交互逻辑
- **Web Components** - 组件化开发
### 后端
- **Node.js** - 运行时环境
- **Express.js** - Web 框架
- **MySQL** - 关系型数据库
### 核心库
- **ffi-napi** - C++ 动态库调用
- **xlsx** - Excel 文件处理
- **mysql2** - 数据库驱动
## ❓ 常见问题
### Q: 动态库加载失败怎么办?
A: 请检查:
1. `XNCore` 环境变量是否正确设置
2. 动态库文件是否存在于 `$XNCore/lib` 目录
3. 动态库是否包含 `Login_validateUser` 导出函数
### Q: 数据库连接失败?
A: 请确认:
1. MySQL 服务是否正在运行
2. `.env` 文件中的数据库配置是否正确
3. 数据库用户是否有足够权限
### Q: 接口配置导入失败?
A: 请检查:
1. Excel 文件格式是否符合模板要求
2. 必填字段是否完整
3. 数据格式是否符合验证规则
## 📝 开发规范
### 代码风格
- 使用 ES6+ 语法
- 遵循 JavaScript 标准规范
- 添加适当的注释和文档
### 数据验证
- 确保动态库是由 C++编写的,并且包含`Login_validateUser`导出函数(对应 Login 类的 validateUser 静态方法)
- `Login_validateUser`函数接受两个字符串参数(用户名和密码),并返回整数表示权限级别(负值表示登录失败)
- 系统会根据操作系统类型在`$XNCore/lib`目录下查找相应类型的动态库,并遵循各操作系统的命名规范
- 接口配置数据需要遵循以下规则:
- 接口名称必须符合 C++ 命名规范 - 接口名称必须符合 C++ 命名规范
- 数组大小必须大于 1第二维可以为 0 - 数组大小必须大于 1
- 必填字段包括构型、ATA 章节、接口结构体名、接口名称、数据类型 - 必填字段不能为空
## 更新计划 ## 🔄 更新日志
1. 添加接口配置从 IDL 文件导入的功能 ### v0.31.0.250619_alpha (当前版本)
- ✅ 基础登录认证功能
- ✅ 接口配置管理
- ✅ Excel 导入导出
- ✅ 权限管理系统
### 计划功能
- 🔄 IDL 文件导入支持
- 🔄 实时数据监控
- 🔄 用户行为分析
- 🔄 API 文档自动生成
## 📞 支持
如有问题或建议,请通过以下方式联系:
- 提交 Issue
- 发送邮件至技术支持
- 查看项目 Wiki
---
**注意**: 本系统需要正确配置 C++ 动态库才能正常工作。确保动态库包含 `Login_validateUser` 函数,该函数接受用户名和密码参数,返回权限级别(负值表示失败)。

View File

@ -5,8 +5,8 @@ const path = require('path');
const fs = require('fs'); const fs = require('fs');
const { parseICDFile } = require('../utils/icd-parser'); const { parseICDFile } = require('../utils/icd-parser');
// 确保uploads目录存在 // 确保upload目录存在
const uploadsDir = path.join(__dirname, '..', 'uploads'); const uploadsDir = path.join(__dirname, '..', 'upload');
if (!fs.existsSync(uploadsDir)) { if (!fs.existsSync(uploadsDir)) {
fs.mkdirSync(uploadsDir, { recursive: true }); fs.mkdirSync(uploadsDir, { recursive: true });
} }