a
This commit is contained in:
@@ -0,0 +1,254 @@
|
||||
# 应用配置详解
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [config.ini](file://config.ini)
|
||||
- [Install/Geomative Studio/config.ini](file://Install/Geomative Studio/config.ini)
|
||||
- [Release/config.ini](file://Release/config.ini)
|
||||
- [cpp/Main/GeoMative.cpp](file://cpp/Main/GeoMative.cpp)
|
||||
- [cpp/Views/DailLogin.cpp](file://cpp/Views/DailLogin.cpp)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [配置文件结构](#配置文件结构)
|
||||
3. [核心配置节分析](#核心配置节分析)
|
||||
4. [多环境配置示例](#多环境配置示例)
|
||||
5. [配置加载优先级](#配置加载优先级)
|
||||
6. [配置维护最佳实践](#配置维护最佳实践)
|
||||
7. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
GeomativeStudio是一款专业的地球物理数据处理软件,其行为和功能通过`config.ini`配置文件进行控制。本文档深入解析该配置文件的结构与各项参数的具体含义,涵盖用户界面、数据传输、设备连接、用户认证及跨孔测量等关键配置。通过分析代码实现,我们将揭示配置参数如何影响系统行为,并提供实际应用场景下的配置建议。
|
||||
|
||||
## 配置文件结构
|
||||
GeomativeStudio的`config.ini`文件采用标准的INI文件格式,由多个节(section)组成,每个节包含若干键值对(key-value pairs)。配置文件定义了软件的用户界面语言、数据传输设置、导出格式、远程设备连接信息、用户认证凭据以及跨孔测量参数等核心功能。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[config.ini] --> B[UI]
|
||||
A --> C[TRANSFER_INFO]
|
||||
A --> D[EXPORT_DATA]
|
||||
A --> E[ONLINE_DEVICE]
|
||||
A --> F[USER_INFO]
|
||||
A --> G[CROSS_HOLE_CFG]
|
||||
B --> B1[Language]
|
||||
C --> C1[Url]
|
||||
C --> C2[HomePage]
|
||||
D --> D1[2dDataExpStyle]
|
||||
E --> E1[RemoteType]
|
||||
E --> E2[IP]
|
||||
E --> E3[Port]
|
||||
F --> F1[UserID]
|
||||
F --> F2[UserPwd]
|
||||
G --> G1[Number]
|
||||
G --> G2[CFG_1...CFG_N]
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [config.ini](file://config.ini)
|
||||
|
||||
## 核心配置节分析
|
||||
|
||||
### [UI] 节:界面语言控制
|
||||
`[UI]`节中的`Language`参数控制软件界面的显示语言。
|
||||
|
||||
- **Language=1**:表示界面语言为中文
|
||||
- **Language=2**:表示界面语言为英文
|
||||
|
||||
该参数在软件启动时被读取,并通过`WM_CHANGE_LANGUAGE`消息通知主窗口切换语言。代码实现中,系统会根据当前线程的区域设置(LCID)和配置值共同决定最终的语言显示。
|
||||
|
||||
```cpp
|
||||
int iLanguage = GetPrivateProfileInt(_T("UI"), _T("Language"), 0, _T("./config.ini"));
|
||||
if (LANG_ZHCN == iLanguage && (LANG_CHINESE_SIMPLIFIED == PRIMARYLANGID(LANGIDFROMLCID(lcidNew))))
|
||||
{
|
||||
WritePrivateProfileString(_T("UI"), _T("Language"), _T("1"), _T("./config.ini"));
|
||||
m_pMainWnd->SendMessage(WM_CHANGE_LANGUAGE, (WPARAM)LANG_ZHCN, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
WritePrivateProfileString(_T("UI"), _T("Language"), _T("2"), _T("./config.ini"));
|
||||
m_pMainWnd->SendMessage(WM_CHANGE_LANGUAGE, (WPARAM)LANG_ENUS, 0);
|
||||
}
|
||||
```
|
||||
|
||||
**Section sources**
|
||||
- [config.ini](file://config.ini#L1-L3)
|
||||
- [cpp/Main/GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L446-L458)
|
||||
|
||||
### [TRANSFER_INFO] 节:数据传输与系统更新
|
||||
`[TRANSFER_INFO]`节定义了软件的数据传输和系统更新相关URL。
|
||||
|
||||
- **Url**:系统更新服务器地址,用于检查和下载软件更新
|
||||
- **HomePage**:公司主页URL,可能用于用户引导或信息展示
|
||||
|
||||
这些参数在`GetCfgUrl()`函数中被读取,如果获取失败,系统会弹出错误提示。该配置支持软件的在线升级功能,确保用户能够及时获取最新版本。
|
||||
|
||||
```cpp
|
||||
::GetPrivateProfileString(_T("TRANSFER_INFO"), _T("Url"),_T("NULL"), chUrl, 150,_T("./config.ini"));
|
||||
::GetPrivateProfileString(_T("TRANSFER_INFO"), _T("HomePage"),_T("NULL"), chHomePage, 150,_T("./config.ini"));
|
||||
```
|
||||
|
||||
**Section sources**
|
||||
- [config.ini](file://config.ini#L4-L7)
|
||||
- [cpp/Main/GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L1116-L1135)
|
||||
|
||||
### [EXPORT_DATA] 节:导出数据格式
|
||||
`[EXPORT_DATA]`节中的`2dDataExpStyle`参数控制二维数据的导出格式。
|
||||
|
||||
- **2dDataExpStyle=0**:表示一种特定的二维数据导出样式
|
||||
|
||||
该参数在软件初始化时被读取,影响数据导出模块的行为。不同的值可能对应不同的文件格式、坐标系统或数据组织方式。
|
||||
|
||||
```cpp
|
||||
m_i2dDataExpStyle = GetPrivateProfileInt(_T("EXPORT_DATA"), _T("2dDataExpStyle"), 0, _T("./config.ini"));
|
||||
```
|
||||
|
||||
**Section sources**
|
||||
- [config.ini](file://config.ini#L8-L10)
|
||||
- [cpp/Main/GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L624)
|
||||
|
||||
### [ONLINE_DEVICE] 节:远程设备连接
|
||||
`[ONLINE_DEVICE]`节配置了与远程设备的网络连接参数。
|
||||
|
||||
- **RemoteType**:传输模式,如USB、云端或WiFi
|
||||
- **IP**:远程服务器或设备的IP地址
|
||||
- **Port**:通信端口号
|
||||
|
||||
在软件启动时,如果选择云端或WiFi模式,系统会读取这些参数并尝试建立网络连接。如果IP或端口配置错误,会弹出相应的错误提示。
|
||||
|
||||
```cpp
|
||||
char chIP[30]="NULL";
|
||||
GetPrivateProfileString(_T("ONLINE_DEVICE"),_T("IP"), "NULL",chIP, sizeof(chIP),_T("./config.ini"));
|
||||
WORD wPort = GetPrivateProfileInt(_T("ONLINE_DEVICE"), _T("Port"), 0, _T("./config.ini"));
|
||||
```
|
||||
|
||||
**Section sources**
|
||||
- [config.ini](file://config.ini#L11-L15)
|
||||
- [cpp/Main/GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L492-L502)
|
||||
|
||||
### [USER_INFO] 节:用户认证机制
|
||||
`[USER_INFO]`节包含用户认证相关的信息。
|
||||
|
||||
- **UserID**:用户的唯一标识符
|
||||
- **UserPwd**:用户密码,存储在单独的`[USER_Pwd]`节中
|
||||
- **UserSave**:是否保存用户凭据
|
||||
- **UserAuto**:是否自动登录
|
||||
|
||||
用户在登录界面输入凭据后,如果选择保存,系统会将用户名和密码写回配置文件。认证机制通过`DailLogin`对话框实现,确保只有授权用户才能访问系统。
|
||||
|
||||
```cpp
|
||||
WritePrivateProfileString(_T("USER_INFO"), _T("UserID"), csID, _T("./config.ini"));
|
||||
WritePrivateProfileString(_T("USER_Pwd"), _T("UserPwd"), csPwd, _T("./config.ini"));
|
||||
```
|
||||
|
||||
**Section sources**
|
||||
- [config.ini](file://config.ini#L25-L38)
|
||||
- [cpp/Views/DailLogin.cpp](file://cpp/Views/DailLogin.cpp#L137-L140)
|
||||
|
||||
### [CROSS_HOLE_CFG] 节:跨孔测量参数
|
||||
`[CROSS_HOLE_CFG]`节定义了跨孔测量的相关物理参数。
|
||||
|
||||
- **Number**:配置组的数量
|
||||
- **CFG_1...CFG_N**:每个配置组的具体参数
|
||||
- **Name**:配置名称
|
||||
- **FirstPoleDep**:第一电极深度(单位:米)
|
||||
- **HoleSpace**:孔间距(单位:米)
|
||||
|
||||
这些参数通过`GeCrossHoleCfg()`函数解析,用于地质勘探中的跨孔电阻率成像。系统会根据配置数量循环读取每个`CFG_X`节的参数,并存储在内存映射中供后续处理使用。
|
||||
|
||||
```cpp
|
||||
int iNumber = ::GetPrivateProfileInt(_T("CROSS_HOLE_CFG"), _T("Number"),255,_T("./config.ini"));
|
||||
for (int i = 1; i <= iNumber; i++)
|
||||
{
|
||||
if (!ParserSigCrossHole(i))
|
||||
{
|
||||
bRes = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Section sources**
|
||||
- [config.ini](file://config.ini#L39-L73)
|
||||
- [cpp/Main/GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L1182-L1221)
|
||||
|
||||
## 多环境配置示例
|
||||
|
||||
### 开发环境配置
|
||||
```ini
|
||||
[UI]
|
||||
Language=1
|
||||
|
||||
[TRANSFER_INFO]
|
||||
Url=http://dev.update.geomative.com/Upgrade/software/V2.0
|
||||
HomePage=http://dev.geomative.com/
|
||||
|
||||
[ONLINE_DEVICE]
|
||||
RemoteType=2
|
||||
IP=192.168.1.100
|
||||
Port=8769
|
||||
```
|
||||
|
||||
### 测试环境配置
|
||||
```ini
|
||||
[UI]
|
||||
Language=2
|
||||
|
||||
[TRANSFER_INFO]
|
||||
Url=http://test.update.geomative.com/Upgrade/software/V2.0
|
||||
HomePage=http://test.geomative.com/
|
||||
|
||||
[ONLINE_DEVICE]
|
||||
RemoteType=2
|
||||
IP=10.0.0.50
|
||||
Port=8769
|
||||
```
|
||||
|
||||
### 生产环境配置
|
||||
```ini
|
||||
[UI]
|
||||
Language=1
|
||||
|
||||
[TRANSFER_INFO]
|
||||
Url=http://update.geomative.com/Upgrade/software/V2.0
|
||||
HomePage=http://www.geomative.com/
|
||||
|
||||
[ONLINE_DEVICE]
|
||||
RemoteType=2
|
||||
IP=120.31.131.181
|
||||
Port=8769
|
||||
```
|
||||
|
||||
## 配置加载优先级
|
||||
GeomativeStudio遵循特定的配置文件加载优先级:
|
||||
|
||||
1. **根目录优先**:位于软件根目录的`config.ini`具有最高优先级
|
||||
2. **安装目录次之**:`Install/Geomative Studio/`目录下的配置文件作为备选
|
||||
3. **运行时动态更新**:某些配置(如用户凭据)可在运行时修改并立即生效
|
||||
|
||||
这种设计允许用户在不同环境中灵活切换配置,同时确保关键设置不会被意外覆盖。例如,`Release/config.ini`中的`Language=2`会覆盖安装目录中相同文件的设置。
|
||||
|
||||
## 配置维护最佳实践
|
||||
|
||||
### 参数修改后的生效机制
|
||||
- **重启生效**:大多数配置需要重启软件才能生效
|
||||
- **即时生效**:用户界面语言等少数配置可在运行时动态切换
|
||||
- **验证机制**:关键参数(如IP地址)在读取后会进行有效性验证
|
||||
|
||||
### 常见配置错误排查方法
|
||||
1. **连接失败**:检查`ONLINE_DEVICE`节的IP和Port是否正确
|
||||
2. **语言不切换**:确认`UI`节的`Language`值是否为1或2
|
||||
3. **更新失败**:验证`TRANSFER_INFO`中的URL是否可访问
|
||||
4. **认证失败**:检查`USER_INFO`和`USER_Pwd`节的凭据是否正确
|
||||
5. **跨孔数据异常**:核对`CROSS_HOLE_CFG`中各孔的间距和深度设置
|
||||
|
||||
建议在修改配置前备份原文件,并在修改后通过日志文件(位于`LOG/`目录)验证配置是否正确加载。
|
||||
|
||||
**Section sources**
|
||||
- [config.ini](file://config.ini)
|
||||
- [Release/config.ini](file://Release/config.ini)
|
||||
- [Install/Geomative Studio/config.ini](file://Install/Geomative Studio/config.ini)
|
||||
|
||||
## 结论
|
||||
GeomativeStudio的`config.ini`文件是控制系统行为的核心组件。通过深入分析其结构和参数含义,我们可以更好地理解软件的工作机制,并根据实际需求进行定制化配置。遵循最佳实践进行配置维护,可以确保系统的稳定运行和高效管理。
|
||||
@@ -0,0 +1,238 @@
|
||||
# 版本与数据库配置
|
||||
|
||||
<cite>
|
||||
**本文档中引用的文件**
|
||||
- [version_info.txt](file://version_info.txt)
|
||||
- [database_modify.xml](file://database_modify.xml)
|
||||
- [DB\数据库字段修改记录.txt](file://DB/数据库字段修改记录.txt)
|
||||
- [cpp\Operator\UpdateDataBase.cpp](file://cpp/Operator/UpdateDataBase.cpp)
|
||||
- [h\UpdateDataBase.h](file://h/UpdateDataBase.h)
|
||||
- [cpp\Tools\checkupdate.cpp](file://cpp/Tools/checkupdate.cpp)
|
||||
- [h\checkupdate.h](file://h/checkupdate.h)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [版本控制机制](#版本控制机制)
|
||||
2. [数据库变更管理](#数据库变更管理)
|
||||
3. [XML与文本格式对比](#xml与文本格式对比)
|
||||
4. [系统升级流程](#系统升级流程)
|
||||
5. [部署与维护建议](#部署与维护建议)
|
||||
|
||||
## 版本控制机制
|
||||
|
||||
`version_info.txt` 文件是系统版本控制的核心元数据文件,其主要作用是存储当前软件的版本信息,支持自动更新功能。该文件位于安装目录中,其内容结构简单,仅包含一个版本号字段。
|
||||
|
||||
根据文件内容分析,当前版本号为 `2.4.1`。该版本号在系统启动时被读取,并与服务器端的最新版本进行比对,以判断是否需要执行更新操作。
|
||||
|
||||
版本比对逻辑主要在 `checkupdate.cpp` 文件中实现。系统通过 `GetGeoMativeVersion()` 函数从可执行文件的资源中提取版本信息,并通过 HTTP 请求从服务器获取最新的版本号(`GeomativeVersion.txt`)。如果本地版本低于服务器版本,则触发更新流程。
|
||||
|
||||
版本控制流程如下:
|
||||
1. 系统启动时读取 `version_info.txt` 中的版本号
|
||||
2. 通过 HTTP 请求获取服务器端最新版本号
|
||||
3. 比较本地与远程版本号
|
||||
4. 若本地版本较旧,则提示用户更新或自动下载更新包
|
||||
5. 更新完成后,更新本地版本信息
|
||||
|
||||
该机制确保了软件能够及时获取最新功能和安全补丁,同时避免了不必要的更新操作。
|
||||
|
||||
**本节来源**
|
||||
- [version_info.txt](file://version_info.txt)
|
||||
- [cpp\Tools\checkupdate.cpp](file://cpp/Tools/checkupdate.cpp)
|
||||
- [h\checkupdate.h](file://h/checkupdate.h)
|
||||
|
||||
## 数据库变更管理
|
||||
|
||||
`database_modify.xml` 文件是数据库结构变更管理的核心配置文件,采用 XML 格式存储数据库的变更历史。该文件详细记录了数据库表结构的增删改操作,包括字段属性、主键、索引、外键等元数据信息。
|
||||
|
||||
### XML结构分析
|
||||
|
||||
该文件采用分层结构,根节点为 `current_version`,包含当前版本号。其子节点 `pre_version` 记录了历史版本的变更信息。每个 `pre_version` 节点包含一个 `value` 属性,表示该版本号。
|
||||
|
||||
在 `pre_version` 节点下,`table` 元素表示对数据库表的操作,其 `modify_type` 属性定义了操作类型:
|
||||
- `1`: 增加表
|
||||
- `2`: 删除表
|
||||
- `3`: 修改表
|
||||
|
||||
`column` 元素描述了字段的详细属性:
|
||||
- `name`: 字段名称
|
||||
- `is_primary_key`: 是否为主键
|
||||
- `value_type`: 字段类型(1:text, 2:Memo, 3:Byte, 4:Integer, 5:Long, 6:Single, 7:Double, 8:Currency, 9:AutoNumber, 10:Date/Time, 11:Yes/No)
|
||||
- `attribute_value`: 字段长度(仅对文本类型有效)
|
||||
- `index`: 索引类型(0:无索引, 1:允许重复, 2:不允许重复)
|
||||
- `is_foreign_key`: 是否为外键
|
||||
- `is_empty`: 是否允许为空
|
||||
- `is_compress`: 是否压缩
|
||||
|
||||
### 变更执行流程
|
||||
|
||||
数据库变更的执行由 `UpdateDataBase.cpp` 中的 `CUpdateDataBase` 类负责。其工作流程如下:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[启动系统] --> B{是否存在database_modify.xml?}
|
||||
B --> |否| C[无需更新数据库]
|
||||
B --> |是| D[解析XML文件]
|
||||
D --> E[获取当前数据库版本]
|
||||
E --> F[查找匹配的pre_version]
|
||||
F --> G[提取变更指令]
|
||||
G --> H{遍历变更指令}
|
||||
H --> I[增加表]
|
||||
H --> J[删除表]
|
||||
H --> K[修改表]
|
||||
I --> L[生成CREATE TABLE语句]
|
||||
J --> M[生成DROP TABLE语句]
|
||||
K --> N[生成ALTER TABLE语句]
|
||||
L --> O[执行SQL]
|
||||
M --> O
|
||||
N --> O
|
||||
O --> P[更新versioninfo表]
|
||||
P --> Q[完成数据库更新]
|
||||
```
|
||||
|
||||
**图示来源**
|
||||
- [database_modify.xml](file://database_modify.xml)
|
||||
- [cpp\Operator\UpdateDataBase.cpp](file://cpp/Operator/UpdateDataBase.cpp)
|
||||
- [h\UpdateDataBase.h](file://h/UpdateDataBase.h)
|
||||
|
||||
当系统检测到数据库需要更新时,会按照以下步骤执行:
|
||||
1. 读取 `database_modify.xml` 文件
|
||||
2. 解析当前版本号,查找对应的变更记录
|
||||
3. 根据 `modify_type` 执行相应的数据库操作
|
||||
4. 更新数据库中的 `versioninfo` 表,记录新的版本号
|
||||
5. 记录更新日志到 `LOG\update_db.log`
|
||||
|
||||
**本节来源**
|
||||
- [database_modify.xml](file://database_modify.xml)
|
||||
- [cpp\Operator\UpdateDataBase.cpp](file://cpp/Operator/UpdateDataBase.cpp)
|
||||
- [h\UpdateDataBase.h](file://h/UpdateDataBase.h)
|
||||
|
||||
## XML与文本格式对比
|
||||
|
||||
系统中存在两种数据库变更记录格式:结构化的 XML 格式和纯文本格式。`database_modify.xml` 采用 XML 格式,而 `DB\数据库字段修改记录.txt` 则采用纯文本格式。
|
||||
|
||||
### 文本格式分析
|
||||
|
||||
纯文本格式的变更记录位于 `DB\数据库字段修改记录.txt` 文件中,其内容为人工编写的变更日志,按时间顺序记录了数据库的变更历史。例如:
|
||||
|
||||
```
|
||||
2015年6月2日---
|
||||
1:td2dcon增加字段bUse,用于标记该条记录是否有效
|
||||
2:td3dcon增加字段bUse,用于标记该条记录是否有效
|
||||
3: td1dcon增加字段bUse,用于标记该条记录是否有效
|
||||
```
|
||||
|
||||
这种格式的优点是易于人类阅读和编写,但存在以下局限性:
|
||||
- 缺乏结构化,难以自动化解析
|
||||
- 没有标准化的字段类型定义
|
||||
- 无法精确描述索引、外键等复杂约束
|
||||
- 容易出现格式不一致的问题
|
||||
|
||||
### XML格式优势
|
||||
|
||||
相比之下,`database_modify.xml` 的 XML 格式具有显著优势:
|
||||
|
||||
1. **结构化存储**:采用标准化的标签和属性,便于程序解析和处理
|
||||
2. **自动化处理**:可以直接映射到数据库操作指令,实现自动化迁移
|
||||
3. **完整性**:包含完整的字段属性定义,包括数据类型、长度、约束等
|
||||
4. **可验证性**:可以通过 XML Schema 进行格式验证
|
||||
5. **版本控制**:支持多版本变更记录的嵌套管理
|
||||
|
||||
XML 格式特别适合在自动化部署和持续集成环境中使用,能够确保数据库结构变更的准确性和一致性。
|
||||
|
||||
**本节来源**
|
||||
- [database_modify.xml](file://database_modify.xml)
|
||||
- [DB\数据库字段修改记录.txt](file://DB/数据库字段修改记录.txt)
|
||||
|
||||
## 系统升级流程
|
||||
|
||||
当系统需要进行数据库结构升级时,会依据 `version_info.txt` 和 `database_modify.xml` 两个文件执行完整的迁移流程。
|
||||
|
||||
### 升级触发条件
|
||||
|
||||
系统在启动时会检查以下条件来决定是否需要升级:
|
||||
1. 本地版本号与服务器版本号不一致
|
||||
2. 数据库版本号与 `database_modify.xml` 中的版本号不一致
|
||||
3. 存在未应用的 `pre_version` 变更记录
|
||||
|
||||
### 升级执行过程
|
||||
|
||||
升级过程由 `CUpdateDataBase` 类的 `ParserUpdateDBXml()` 方法驱动,其核心逻辑如下:
|
||||
|
||||
1. **版本比对**:比较 `m_strCurVer`(当前版本)与 XML 中的 `current_version` 值
|
||||
2. **变更查找**:遍历 `pre_version` 节点,找到与当前数据库版本匹配的变更记录
|
||||
3. **指令解析**:根据 `modify_type` 解析表结构变更指令
|
||||
4. **SQL生成**:将 XML 指令转换为具体的 SQL 语句
|
||||
5. **事务执行**:在数据库事务中执行所有变更操作
|
||||
6. **版本更新**:更新 `versioninfo` 表中的版本号
|
||||
|
||||
### 实际案例
|
||||
|
||||
假设系统从版本 `1.1.1` 升级到 `1.1.2`,需要在 `test` 表中添加新字段。`database_modify.xml` 中的配置如下:
|
||||
|
||||
```xml
|
||||
<table name="test" modify_type="1">
|
||||
<column name="id" is_primary_key="1" value_type="9" attribute_value="1"/>
|
||||
<column name="col1" value_type="2" attribute_value="20" is_empty="1" is_compress="1"/>
|
||||
<column name="col2" value_type="5" is_foreign_key="0" refer_table_name="FK_test" refer_table_col="fk1"/>
|
||||
<column name="col3" value_type="5" index="2"/>
|
||||
</table>
|
||||
```
|
||||
|
||||
系统将生成以下 SQL 语句并执行:
|
||||
```sql
|
||||
CREATE TABLE test (
|
||||
id counter primary key,
|
||||
col1 text(20) with compression null,
|
||||
col2 integer,
|
||||
col3 integer
|
||||
);
|
||||
CREATE UNIQUE INDEX iCol3 ON test (col3);
|
||||
ALTER TABLE test ADD CONSTRAINT FK_col2 FOREIGN KEY (col2) REFERENCES FK_test(fk1) ON UPDATE CASCADE ON DELETE CASCADE;
|
||||
```
|
||||
|
||||
此过程确保了数据库结构变更的原子性和一致性。
|
||||
|
||||
**本节来源**
|
||||
- [version_info.txt](file://version_info.txt)
|
||||
- [database_modify.xml](file://database_modify.xml)
|
||||
- [cpp\Operator\UpdateDataBase.cpp](file://cpp/Operator/UpdateDataBase.cpp)
|
||||
|
||||
## 部署与维护建议
|
||||
|
||||
`version_info.txt` 和 `database_modify.xml` 作为关键的元数据文件,在部署、备份和故障恢复中扮演着重要角色。
|
||||
|
||||
### 部署注意事项
|
||||
|
||||
1. **文件完整性**:确保两个文件在部署包中完整存在
|
||||
2. **版本同步**:确保 `version_info.txt` 中的版本号与实际软件版本一致
|
||||
3. **权限设置**:确保应用程序有读写这两个文件的权限
|
||||
4. **路径正确**:确认文件位于正确的安装目录中
|
||||
|
||||
### 备份策略
|
||||
|
||||
建议将这两个文件纳入常规备份范围:
|
||||
- `version_info.txt`:记录当前系统状态,便于版本追溯
|
||||
- `database_modify.xml`:包含数据库变更历史,是数据恢复的关键
|
||||
|
||||
### 故障恢复
|
||||
|
||||
当系统出现故障时,这两个文件可帮助快速恢复:
|
||||
1. 通过 `version_info.txt` 确定系统版本
|
||||
2. 通过 `database_modify.xml` 重建数据库结构
|
||||
3. 按照变更历史逐步恢复数据
|
||||
|
||||
### 维护建议
|
||||
|
||||
为确保文件的准确性和完整性,建议:
|
||||
1. **变更审计**:每次数据库结构变更都必须更新 `database_modify.xml`
|
||||
2. **版本递增**:每次发布新版本都必须更新 `version_info.txt`
|
||||
3. **格式验证**:使用 XML 验证工具确保 `database_modify.xml` 的格式正确
|
||||
4. **文档同步**:保持 XML 文件与数据库实际结构的一致性
|
||||
5. **测试验证**:在测试环境中验证变更脚本的正确性
|
||||
|
||||
通过严格维护这两个元数据文件,可以确保系统的稳定运行和可维护性。
|
||||
|
||||
**本节来源**
|
||||
- [version_info.txt](file://version_info.txt)
|
||||
- [database_modify.xml](file://database_modify.xml)
|
||||
- [cpp\Operator\UpdateDataBase.cpp](file://cpp/Operator/UpdateDataBase.cpp)
|
||||
@@ -0,0 +1,352 @@
|
||||
# 配置说明
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [config.ini](file://config.ini)
|
||||
- [Install\Geomative Studio\config.ini](file://Install/Geomative Studio/config.ini)
|
||||
- [database_modify.xml](file://database_modify.xml)
|
||||
- [version_info.txt](file://version_info.txt)
|
||||
- [cpp\Main\GeoMative.cpp](file://cpp/Main/GeoMative.cpp)
|
||||
- [cpp\Tools\checkupdate.cpp](file://cpp/Tools/checkupdate.cpp)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [项目结构](#项目结构)
|
||||
2. [核心配置文件分析](#核心配置文件分析)
|
||||
3. [配置加载与优先级](#配置加载与优先级)
|
||||
4. [版本管理与更新机制](#版本管理与更新机制)
|
||||
5. [数据库变更管理](#数据库变更管理)
|
||||
6. [配置最佳实践](#配置最佳实践)
|
||||
|
||||
## 项目结构
|
||||
|
||||
GeomativeStudio项目的目录结构清晰地分为多个功能区域,包括缓存、数据库、安装包、日志、发布版本和源代码等。项目根目录下的`config.ini`文件是主要的配置文件,而`Install`目录下也包含了一个`config.ini`副本,用于安装过程中的配置。
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
A[GeomativeStudio] --> B[CACHE]
|
||||
A --> C[DB]
|
||||
A --> D[Install]
|
||||
A --> E[LOG]
|
||||
A --> F[Release]
|
||||
A --> G[cpp]
|
||||
A --> H[h]
|
||||
A --> I[res]
|
||||
A --> J[tools]
|
||||
A --> K[config.ini]
|
||||
A --> L[database_modify.xml]
|
||||
A --> M[version_info.txt]
|
||||
D --> N[GD_10]
|
||||
D --> O[Geomative Studio]
|
||||
O --> P[LOG]
|
||||
O --> Q[tools]
|
||||
O --> R[config.ini]
|
||||
O --> S[database_modify.xml]
|
||||
O --> T[version_info.txt]
|
||||
F --> U[DB]
|
||||
F --> V[config.ini]
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [config.ini](file://config.ini)
|
||||
- [Install\Geomative Studio\config.ini](file://Install/Geomative Studio/config.ini)
|
||||
- [database_modify.xml](file://database_modify.xml)
|
||||
- [version_info.txt](file://version_info.txt)
|
||||
|
||||
**Section sources**
|
||||
- [config.ini](file://config.ini)
|
||||
- [Install\Geomative Studio\config.ini](file://Install/Geomative Studio/config.ini)
|
||||
- [database_modify.xml](file://database_modify.xml)
|
||||
- [version_info.txt](file://version_info.txt)
|
||||
|
||||
## 核心配置文件分析
|
||||
|
||||
### UI配置节
|
||||
|
||||
[UI]配置节主要控制用户界面的语言设置。Language参数决定了应用程序的显示语言。
|
||||
|
||||
- **Language**: 语言设置参数,值为1表示中文,2表示英文。该参数在程序启动时被读取,并通过`WM_CHANGE_LANGUAGE`消息通知主窗口切换语言。
|
||||
|
||||
```ini
|
||||
[UI]
|
||||
Language=1
|
||||
```
|
||||
|
||||
**Section sources**
|
||||
- [config.ini](file://config.ini#L1-L3)
|
||||
- [cpp\Main\GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L447-L458)
|
||||
|
||||
### 传输信息配置节
|
||||
|
||||
[TRANSFER_INFO]配置节定义了软件更新和主页的URL地址。
|
||||
|
||||
- **Url**: 自动更新服务器的URL地址,用于检查和下载新版本。
|
||||
- **HomePage**: 公司官方网站地址,用于用户访问更多信息。
|
||||
|
||||
```ini
|
||||
[TRANSFER_INFO]
|
||||
Url=http://update.geomative.com/Upgrade/software/V2.0
|
||||
HomePage=http://www.geomative.com/
|
||||
```
|
||||
|
||||
**Section sources**
|
||||
- [config.ini](file://config.ini#L4-L7)
|
||||
- [cpp\Main\GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L1116-L1135)
|
||||
|
||||
### 数据导出配置节
|
||||
|
||||
[EXPORT_DATA]配置节控制数据导出的样式设置。
|
||||
|
||||
- **2dDataExpStyle**: 二维数据导出样式,值为0表示默认样式。
|
||||
|
||||
```ini
|
||||
[EXPORT_DATA]
|
||||
2dDataExpStyle=0
|
||||
```
|
||||
|
||||
**Section sources**
|
||||
- [config.ini](file://config.ini#L8-L10)
|
||||
|
||||
### 在线设备配置节
|
||||
|
||||
[ONLINE_DEVICE]配置节定义了远程设备连接的网络参数。
|
||||
|
||||
- **RemoteType**: 远程传输类型,值为2表示云传输模式。
|
||||
- **IP**: 远程服务器IP地址。
|
||||
- **Port**: 远程服务器端口号。
|
||||
|
||||
```ini
|
||||
[ONLINE_DEVICE]
|
||||
RemoteType=2
|
||||
IP=120.31.131.181
|
||||
Port=8769
|
||||
```
|
||||
|
||||
**Section sources**
|
||||
- [config.ini](file://config.ini#L11-L15)
|
||||
- [cpp\Main\GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L492-L500)
|
||||
|
||||
### 用户信息配置节
|
||||
|
||||
[USER_INFO]、[USER_Pwd]、[USER_Save]和[USER_Auto]配置节共同管理用户认证信息。
|
||||
|
||||
- **UserID**: 用户ID,用于身份识别。
|
||||
- **UserPwd**: 用户密码,用于身份验证。
|
||||
- **UserSave**: 是否保存密码,1表示保存,0表示不保存。
|
||||
- **UserAuto**: 是否自动登录,1表示自动登录,0表示手动登录。
|
||||
|
||||
```ini
|
||||
[USER_INFO]
|
||||
UserID=12345637
|
||||
|
||||
[USER_Pwd]
|
||||
UserPwd=123456
|
||||
|
||||
[USER_Save]
|
||||
UserSave=1
|
||||
|
||||
[USER_Auto]
|
||||
UserAuto=0
|
||||
```
|
||||
|
||||
**Section sources**
|
||||
- [config.ini](file://config.ini#L25-L38)
|
||||
- [cpp\Main\GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L434-L442)
|
||||
- [cpp\Views\DailLogin.cpp](file://cpp/Views/DailLogin.cpp#L19-L30)
|
||||
|
||||
### 跨孔测量配置节
|
||||
|
||||
[CROSS_HOLE_CFG]配置节定义了跨孔测量的配置组,包含多个CFG_n子节。
|
||||
|
||||
- **Number**: 配置组数量,表示有多少个CFG_n配置节。
|
||||
- **CFG_n**: 每个配置组包含Name、FirstPoleDep和HoleSpace三个参数。
|
||||
|
||||
```ini
|
||||
[CROSS_HOLE_CFG]
|
||||
Number=6
|
||||
|
||||
[CFG_1]
|
||||
Name=1_2
|
||||
FirstPoleDep=1
|
||||
HoleSpace=2.66
|
||||
|
||||
[CFG_2]
|
||||
Name=1_3
|
||||
FirstPoleDep=1
|
||||
HoleSpace=2.78
|
||||
```
|
||||
|
||||
**Section sources**
|
||||
- [config.ini](file://config.ini#L39-L73)
|
||||
- [cpp\Main\GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L1138-L1221)
|
||||
|
||||
## 配置加载与优先级
|
||||
|
||||
GeomativeStudio的配置加载遵循特定的优先级规则。根目录下的`config.ini`文件优先于安装目录中的副本。程序启动时,会从根目录的`config.ini`文件中读取配置信息。
|
||||
|
||||
配置加载过程如下:
|
||||
1. 程序启动时,首先读取`config.ini`文件中的各种配置参数。
|
||||
2. 使用Windows API `GetPrivateProfileString`和`GetPrivateProfileInt`函数读取INI文件中的字符串和整数参数。
|
||||
3. 对于跨孔测量配置,程序会先读取`[CROSS_HOLE_CFG]`节的`Number`参数,然后循环读取每个`[CFG_n]`节的配置。
|
||||
4. 如果配置文件中缺少必要的参数,程序会记录错误日志并可能显示错误消息。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant App as 应用程序
|
||||
participant Config as config.ini
|
||||
participant Memory as 内存
|
||||
App->>Config : 读取Language参数
|
||||
Config-->>App : 返回1(中文)
|
||||
App->>Memory : 设置语言为中文
|
||||
App->>Config : 读取Transfer_Info
|
||||
Config-->>App : 返回URL和主页
|
||||
App->>Config : 读取Online_Device
|
||||
Config-->>App : 返回IP和端口
|
||||
App->>Config : 读取Cross_Hole_Cfg
|
||||
Config-->>App : 返回配置数量
|
||||
loop 每个CFG_n配置
|
||||
App->>Config : 读取CFG_n参数
|
||||
Config-->>App : 返回Name, FirstPoleDep, HoleSpace
|
||||
App->>Memory : 存储配置
|
||||
end
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [config.ini](file://config.ini)
|
||||
- [cpp\Main\GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L433-L624)
|
||||
|
||||
**Section sources**
|
||||
- [config.ini](file://config.ini)
|
||||
- [cpp\Main\GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L433-L624)
|
||||
|
||||
## 版本管理与更新机制
|
||||
|
||||
### version_info.txt文件
|
||||
|
||||
`version_info.txt`文件用于存储软件的版本信息,支持自动更新功能。
|
||||
|
||||
```txt
|
||||
geomative_version=2.4.1
|
||||
```
|
||||
|
||||
该文件包含一个简单的键值对,`geomative_version`表示当前软件版本。在自动更新过程中,程序会读取此文件的版本号,并与服务器上的最新版本进行比较,以决定是否需要更新。
|
||||
|
||||
**Section sources**
|
||||
- [version_info.txt](file://version_info.txt)
|
||||
- [cpp\Tools\checkupdate.cpp](file://cpp/Tools/checkupdate.cpp#L833-L867)
|
||||
|
||||
### 自动更新流程
|
||||
|
||||
自动更新流程如下:
|
||||
1. 程序启动时读取`version_info.txt`中的当前版本号。
|
||||
2. 从`config.ini`中获取更新服务器URL。
|
||||
3. 连接到更新服务器,获取最新版本信息。
|
||||
4. 比较本地版本和服务器版本,如果服务器版本更高,则提示用户更新。
|
||||
5. 下载并安装新版本。
|
||||
|
||||
## 数据库变更管理
|
||||
|
||||
### database_modify.xml文件
|
||||
|
||||
`database_modify.xml`文件记录了数据库结构的变更历史,用于数据库版本控制和迁移。
|
||||
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<current_version value = "1.1.2">
|
||||
<pre_version value = "1.1.2">
|
||||
<!-- modify_type值含义 1 : 增加表 2 : 删除表 3 : 修改表 -->
|
||||
|
||||
<!-- 列的属性在这里只为名称,主键,值的属性,索引信息,外键,和是否为空,其中是否压缩.
|
||||
其中 vallue_type的值域 1: text 最多255个字节 2: Memo 最多65535个字节 3: Byte
|
||||
4: Integer 5: Long 6: Single 7: Double 8:Currency 9 AutoNumber 10: Date/Time
|
||||
11: Yes/No 12 : Ole Object 13: Hyperlink 暂时不支持Lookup Wizard
|
||||
其中在1,2 中,attribute_value表示的是字符的长度,其他值时,attribute_value没有含义。
|
||||
index值得含义: 0 : 表示没有索引, 1: 有索引并允许重复 2: 有索引不允许重复
|
||||
is_primary_key, index, is_foreign_key,is_empty, is_compress默认值为0 -->
|
||||
<table name = "test" modify_type= "1" >
|
||||
<column name = "id" is_primary_key = "1" value_type = "9" attribute_value="1" is_foreign_key = "0" is_empty="0" is_compress="0"/>
|
||||
<column name = "col1" value_type = "2" attribute_value="20" is_empty="1" is_compress="1"/>
|
||||
<column name = "col2" value_type = "5" attribute_value="30" is_foreign_key = "0" refer_table_name="FK_test" refer_table_col="fk1"/>
|
||||
<column name = "col3" value_type = "5" index ="2" />
|
||||
</table>
|
||||
</pre_version>
|
||||
</current_version>
|
||||
```
|
||||
|
||||
该XML文件的结构说明:
|
||||
- **current_version**: 当前数据库版本号。
|
||||
- **pre_version**: 前一版本号。
|
||||
- **table**: 表示一个数据库表的变更。
|
||||
- `name`: 表名
|
||||
- `modify_type`: 变更类型,1表示新增,2表示删除,3表示修改
|
||||
- **column**: 表示表中的一列。
|
||||
- `name`: 列名
|
||||
- `value_type`: 数据类型
|
||||
- `is_primary_key`: 是否为主键
|
||||
- `index`: 索引类型
|
||||
|
||||
**Section sources**
|
||||
- [database_modify.xml](file://database_modify.xml)
|
||||
- [cpp\ProblemZone\Device.cpp](file://cpp/ProblemZone/Device.cpp#L1144-L1202)
|
||||
|
||||
## 配置最佳实践
|
||||
|
||||
### 敏感信息保护
|
||||
|
||||
1. **密码保护**: 避免在配置文件中明文存储敏感密码,建议使用加密存储或环境变量。
|
||||
2. **用户ID管理**: 用户ID不应包含敏感信息,建议使用随机生成的唯一标识符。
|
||||
3. **配置文件权限**: 确保配置文件的访问权限受到限制,防止未授权访问。
|
||||
|
||||
### 多环境配置管理
|
||||
|
||||
1. **开发/生产分离**: 为不同环境(开发、测试、生产)维护不同的配置文件。
|
||||
2. **配置模板**: 使用模板文件,通过脚本生成特定环境的配置。
|
||||
3. **环境变量**: 将环境特定的配置(如数据库连接、API密钥)通过环境变量注入。
|
||||
|
||||
### 跨孔测量参数设置
|
||||
|
||||
正确设置跨孔测量参数的示例:
|
||||
|
||||
```ini
|
||||
[CROSS_HOLE_CFG]
|
||||
Number=3
|
||||
|
||||
[CFG_1]
|
||||
Name=A_B
|
||||
FirstPoleDep=1.5
|
||||
HoleSpace=3.0
|
||||
|
||||
[CFG_2]
|
||||
Name=A_C
|
||||
FirstPoleDep=1.5
|
||||
HoleSpace=4.5
|
||||
|
||||
[CFG_3]
|
||||
Name=B_C
|
||||
FirstPoleDep=1.5
|
||||
HoleSpace=3.8
|
||||
```
|
||||
|
||||
关键参数说明:
|
||||
- **FirstPoleDep**: 第一电极深度,单位为米,表示测量起始深度。
|
||||
- **HoleSpace**: 孔间距,单位为米,表示两个测量孔之间的距离。
|
||||
|
||||
### 网络通信参数设置
|
||||
|
||||
正确设置网络通信参数的示例:
|
||||
|
||||
```ini
|
||||
[ONLINE_DEVICE]
|
||||
RemoteType=2
|
||||
IP=192.168.1.100
|
||||
Port=8769
|
||||
|
||||
[TRANSFER_INFO]
|
||||
Url=http://your-update-server.com/Upgrade/software/V2.0
|
||||
HomePage=http://your-company.com/
|
||||
```
|
||||
|
||||
注意事项:
|
||||
1. 确保IP地址和端口号正确无误。
|
||||
2. 更新服务器URL应使用HTTPS以保证安全。
|
||||
3. 在防火墙设置中开放指定端口。
|
||||
Reference in New Issue
Block a user