一、应用架构设计
本应用采用分层架构设计,确保代码可维护性和可扩展性:
1.1 整体架构层次
-
表现层:ArkUI界面组件,负责数据展示和用户交互
-
业务逻辑层:处理数据库连接、查询逻辑和数据处理
-
网络层:管理WiFi连接和HTTP通信
-
数据层:远程SQL数据库接口和本地缓存管理
1.2 技术栈选择
-
开发语言:ArkTS(TypeScript的超集)
-
UI框架:ArkUI声明式开发范式
-
网络通信:@ohos.net.http模块
-
权限管理:@ohos.abilityAccessCtrl
-
设备能力:@ohos.wifiManager管理WiFi连接
二、核心代码实现
2.1 权限配置(module.json5)
{
"module": {
"requestPermissions": [
{
"name": "ohos.permission.INTERNET",
"reason": "访问远程数据库需要网络权限"
},
{
"name": "ohos.permission.GET_NETWORK_INFO",
"reason": "检测网络连接状态"
},
{
"name": "ohos.permission.GET_WIFI_INFO",
"reason": "检查WiFi连接状态"
}
]
}
}
2.2 数据库连接管理器(核心代码)
import http from '@ohos.net.http';
import wifi from '@ohos.wifi';
export class RemoteDBManager {
private httpRequest: http.HttpRequest;
private apiEndpoint: string = 'http://your-server.com/api/query';
// 执行SQL查询
async executeQuery(sql: string): Promise<any> {
// 1. 检查WiFi连接
const wifiInfo = await wifi.getLinkedInfo();
if (!wifiInfo || wifiInfo.ssid === '') {
throw new Error('请连接WiFi网络');
}
// 2. 构建请求参数
let requestBody = {
sql: sql,
timestamp: new Date().getTime()
};
// 3. 发送HTTP请求
let httpRequestOptions = {
method: http.RequestMethod.POST,
extraData: JSON.stringify(requestBody),
header: { 'Content-Type': 'application/json' },
connectTimeout: 10000,
readTimeout: 10000
};
try {
const response = await this.httpRequest.request(
this.apiEndpoint,
httpRequestOptions
);
if (response.responseCode === 200) {
return JSON.parse(response.result.toString());
} else {
throw new Error(`查询失败: ${response.responseCode}`);
}
} catch (error) {
console.error('数据库查询异常:', error);
throw error;
}
}
// 查询特定字段
async querySpecificFields(
tableName: string,
fields: string[],
condition?: string
): Promise<any[]> {
let sql = `SELECT {fields.join(', ')} FROM {tableName}`;
if (condition) {
sql += ` WHERE ${condition}`;
}
const result = await this.executeQuery(sql);
return result.data || [];
}
}
2.3 主界面UI组件
@Entry
@Component
struct DatabaseQueryPage {
@State queryResult: any[] = [];
@State sqlStatement: string = '';
@State isLoading: boolean = false;
@State connectionStatus: string = '未连接';
private dbManager: RemoteDBManager = new RemoteDBManager();
// 执行查询
async handleQuery() {
if (!this.sqlStatement.trim()) {
return;
}
this.isLoading = true;
this.connectionStatus = '查询中...';
try {
const result = await this.dbManager.executeQuery(this.sqlStatement);
this.queryResult = result.data || [];
this.connectionStatus = '查询成功';
} catch (error) {
this.connectionStatus = '查询失败';
console.error(error);
} finally {
this.isLoading = false;
}
}
// 构建UI界面
build() {
Column({ space: 20 }) {
// 连接状态显示
Text(this.connectionStatus)
.fontSize(16)
.fontColor(this.connectionStatus === '查询成功' ? '#00ff00' : '#ff0000')
// SQL输入区域
TextArea({ text: this.sqlStatement })
.placeholder('输入SQL查询语句,如: SELECT name, age FROM users')
.height(100)
.width('90%')
.onChange((value: string) => {
this.sqlStatement = value;
})
// 查询按钮
Button('执行查询')
.width('80%')
.height(40)
.enabled(!this.isLoading && this.sqlStatement.trim().length > 0)
.onClick(() => this.handleQuery())
// 加载指示器
if (this.isLoading) {
LoadingProgress()
.width(30)
.height(30)
}
// 结果显示区域
if (this.queryResult.length > 0) {
List({ space: 10 }) {
ForEach(this.queryResult, (item: any, index: number) => {
ListItem() {
Column({ space: 5 }) {
ForEach(Object.keys(item), (key: string) => {
Row({ space: 10 }) {
Text(`${key}:`)
.fontWeight(FontWeight.Bold)
.fontColor('#333333')
Text(`${item[key]}`)
.fontColor('#666666')
}
})
}
.padding(10)
.borderRadius(10)
.backgroundColor('#f5f5f5')
}
})
}
.height('60%')
.width('100%')
}
}
.padding(20)
.width('100%')
.height('100%')
}
}
2.4 服务器端API中间件示例(Node.js)
// 服务器API,作为数据库访问中间层
const express = require('express');
const mysql = require('mysql2/promise');
const app = express();
app.use(express.json());
// 数据库连接池
const pool = mysql.createPool({
host: 'localhost',
user: 'username',
password: 'password',
database: 'your_database',
waitForConnections: true,
connectionLimit: 10
});
// 查询接口
app.post('/api/query', async (req, res) => {
try {
const { sql } = req.body;
// 安全性检查:限制查询类型
if (!sql.trim().toUpperCase().startsWith('SELECT')) {
return res.status(400).json({
error: '只支持SELECT查询'
});
}
// 执行查询
const [rows] = await pool.execute(sql);
res.json({
success: true,
data: rows,
timestamp: new Date().toISOString(),
rowCount: rows.length
});
} catch (error) {
console.error('数据库错误:', error);
res.status(500).json({
success: false,
error: error.message
});
}
});
app.listen(3000, () => {
console.log('API服务器运行在端口3000');
});
三、关键实现要点
3.1 安全性考虑
-
使用HTTPS加密通信
-
SQL参数化查询防止注入攻击
-
服务器端验证和权限控制
-
敏感信息本地加密存储
3.2 性能优化
-
实现查询结果分页加载
-
添加本地数据缓存机制
-
使用连接池管理数据库连接
-
超时和重试机制
3.3 错误处理
-
网络异常处理
-
数据库连接失败重试
-
用户友好的错误提示
-
离线状态检测
3.4 用户体验
-
显示实时连接状态
-
查询进度指示器
-
结果数据格式化显示
-
历史查询记录功能
四、部署和测试建议
-
环境配置
-
确保OpenHarmony API版本≥3.2
-
配置正确的网络权限
-
准备测试数据库服务器
-
-
测试流程
-
单元测试:数据库连接逻辑
-
集成测试:完整查询流程
-
性能测试:大数据量查询
-
兼容性测试:不同网络环境
-
-
注意事项
-
生产环境使用HTTPS
-
数据库连接信息加密存储
-
定期更新依赖库版本
-
实现自动重连机制
-