feat 建表
This commit is contained in:
32
src/service/index.ts
Normal file
32
src/service/index.ts
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
import DB from '@/utils/sqlite'
|
||||||
|
|
||||||
|
import { projectTableSql } from './project'
|
||||||
|
import { rtkTrackTableSql } from './rtkTrack'
|
||||||
|
import { warningRecordTableSql } from './warningRecord'
|
||||||
|
import { workRecordTableSql } from './workRecord'
|
||||||
|
|
||||||
|
export { projectTableSql } from './project'
|
||||||
|
export { rtkTrackTableSql } from './rtkTrack'
|
||||||
|
export { warningRecordTableSql } from './warningRecord'
|
||||||
|
export { workRecordTableSql } from './workRecord'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始化数据库表
|
||||||
|
*/
|
||||||
|
export async function initTables() {
|
||||||
|
const sqls = [
|
||||||
|
projectTableSql,
|
||||||
|
workRecordTableSql,
|
||||||
|
rtkTrackTableSql,
|
||||||
|
warningRecordTableSql,
|
||||||
|
]
|
||||||
|
|
||||||
|
try {
|
||||||
|
await DB.transaction(sqls)
|
||||||
|
console.log('数据库表初始化成功')
|
||||||
|
}
|
||||||
|
catch (err) {
|
||||||
|
console.error('数据库表初始化失败:', err)
|
||||||
|
throw err
|
||||||
|
}
|
||||||
|
}
|
||||||
16
src/service/project.ts
Normal file
16
src/service/project.ts
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
/**
|
||||||
|
* 项目信息表
|
||||||
|
* 字段说明:
|
||||||
|
* - id:项目唯一标识符
|
||||||
|
* - project_name:项目名称
|
||||||
|
* - project_type:项目类型
|
||||||
|
* - status:项目状态(默认值为 'offline')
|
||||||
|
*/
|
||||||
|
export const projectTableSql = `CREATE TABLE IF NOT EXISTS project (
|
||||||
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
project_name TEXT NOT NULL,
|
||||||
|
project_type TEXT,
|
||||||
|
status TEXT DEFAULT 'offline',
|
||||||
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||||
|
)`
|
||||||
24
src/service/rtkTrack.ts
Normal file
24
src/service/rtkTrack.ts
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
/**
|
||||||
|
* RTK 轨迹数据表
|
||||||
|
* 字段说明:
|
||||||
|
* - id:轨迹唯一标识符
|
||||||
|
* - work_record_id:作业记录 ID
|
||||||
|
* - timestamp:时间戳
|
||||||
|
* - latitude:纬度
|
||||||
|
* - longitude:经度
|
||||||
|
* - altitude:高度
|
||||||
|
* - speed:速度
|
||||||
|
* - heading:方向
|
||||||
|
*/
|
||||||
|
export const rtkTrackTableSql = `CREATE TABLE IF NOT EXISTS rtk_track (
|
||||||
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
work_record_id INTEGER,
|
||||||
|
timestamp DATETIME,
|
||||||
|
latitude REAL,
|
||||||
|
longitude REAL,
|
||||||
|
altitude REAL,
|
||||||
|
speed REAL,
|
||||||
|
heading REAL,
|
||||||
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
FOREIGN KEY (work_record_id) REFERENCES work_record(id)
|
||||||
|
)`
|
||||||
21
src/service/warningRecord.ts
Normal file
21
src/service/warningRecord.ts
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
/**
|
||||||
|
* 告警记录表
|
||||||
|
* 字段说明:
|
||||||
|
* - id:告警记录唯一标识符
|
||||||
|
* - project_id:项目 ID
|
||||||
|
* - warning_type:告警类型
|
||||||
|
* - warning_level:告警等级
|
||||||
|
* - message:告警信息
|
||||||
|
* - is_read:是否已读(0 表示未读,1 表示已读,默认值为 0)
|
||||||
|
* - created_at:创建时间(默认值为当前时间)
|
||||||
|
*/
|
||||||
|
export const warningRecordTableSql = `CREATE TABLE IF NOT EXISTS warning_record (
|
||||||
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
project_id INTEGER,
|
||||||
|
warning_type TEXT,
|
||||||
|
warning_level TEXT,
|
||||||
|
message TEXT,
|
||||||
|
is_read INTEGER DEFAULT 0,
|
||||||
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
FOREIGN KEY (project_id) REFERENCES project(id)
|
||||||
|
)`
|
||||||
30
src/service/workRecord.ts
Normal file
30
src/service/workRecord.ts
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
/**
|
||||||
|
* 作业记录表
|
||||||
|
* 字段说明:
|
||||||
|
* -id:作业记录唯一标识符
|
||||||
|
* -project_id:所属项目ID
|
||||||
|
* -start_time:作业开始时间
|
||||||
|
* -end_time:作业结束时间
|
||||||
|
* -speed:作业速度
|
||||||
|
* -frequency:作业频率
|
||||||
|
* -amplitude:作业振幅
|
||||||
|
* -compaction_value:压实度值
|
||||||
|
* -gps_lat:GPS纬度
|
||||||
|
* -gps_lng:GPS经度
|
||||||
|
* -created_at:记录创建时间(默认值为当前时间)
|
||||||
|
* -FOREIGN KEY (project_id) REFERENCES project(id):外键约束,关联到项目表中的id字段
|
||||||
|
*/
|
||||||
|
export const workRecordTableSql = `CREATE TABLE IF NOT EXISTS work_record (
|
||||||
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
project_id INTEGER,
|
||||||
|
start_time DATETIME,
|
||||||
|
end_time DATETIME,
|
||||||
|
speed REAL,
|
||||||
|
frequency REAL,
|
||||||
|
amplitude REAL,
|
||||||
|
compaction_value REAL,
|
||||||
|
gps_lat REAL,
|
||||||
|
gps_lng REAL,
|
||||||
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
FOREIGN KEY (project_id) REFERENCES project(id)
|
||||||
|
)`
|
||||||
@@ -5,112 +5,30 @@
|
|||||||
* ======================== 使用说明 ========================
|
* ======================== 使用说明 ========================
|
||||||
*
|
*
|
||||||
* ## 1. 导入
|
* ## 1. 导入
|
||||||
*
|
* import DB from '@/utils/sqlite'
|
||||||
* ```typescript
|
* import { initTables } from '@/service'
|
||||||
* import DB, { initTables } from '@/utils/sqlite'
|
|
||||||
* ```
|
|
||||||
*
|
*
|
||||||
* ## 2. 初始化数据库表
|
* ## 2. 初始化数据库表
|
||||||
*
|
|
||||||
* ```typescript
|
|
||||||
* // 首次使用或表结构变更时调用,仅需执行一次
|
* // 首次使用或表结构变更时调用,仅需执行一次
|
||||||
* await initTables()
|
* await initTables()
|
||||||
* ```
|
|
||||||
*
|
*
|
||||||
* ## 3. 插入数据(增)
|
* ## 3. 插入数据(增)
|
||||||
*
|
|
||||||
* ```typescript
|
|
||||||
* // 方式一:使用 insert 方法(推荐,自动拼接 SQL)
|
|
||||||
* await DB.insert('device', {
|
* await DB.insert('device', {
|
||||||
* device_name: '徐工XS65H #01',
|
* device_name: '徐工XS65H #01',
|
||||||
* device_type: '压路机',
|
* device_type: '压路机',
|
||||||
* status: 'online',
|
* status: 'online',
|
||||||
* })
|
* })
|
||||||
*
|
*
|
||||||
* // 方式二:使用原生 SQL
|
|
||||||
* await DB.executeSql(
|
|
||||||
* `INSERT INTO device (device_name, device_type, status)
|
|
||||||
* VALUES ('徐工XS65H #01', '压路机', 'online')`
|
|
||||||
* )
|
|
||||||
* ```
|
|
||||||
*
|
|
||||||
* ## 4. 删除数据(删)
|
* ## 4. 删除数据(删)
|
||||||
*
|
|
||||||
* ```typescript
|
|
||||||
* // 按条件删除
|
|
||||||
* await DB.delete('device', "id = 1")
|
* await DB.delete('device', "id = 1")
|
||||||
* // 删除所有
|
|
||||||
* await DB.delete('device')
|
|
||||||
* ```
|
|
||||||
*
|
*
|
||||||
* ## 5. 更新数据(改)
|
* ## 5. 更新数据(改)
|
||||||
*
|
* await DB.update('device', { status: 'offline' }, "id = 1")
|
||||||
* ```typescript
|
|
||||||
* await DB.update('device',
|
|
||||||
* { status: 'offline', updated_at: new Date().toISOString() },
|
|
||||||
* "id = 1"
|
|
||||||
* )
|
|
||||||
* ```
|
|
||||||
*
|
*
|
||||||
* ## 6. 查询数据(查)
|
* ## 6. 查询数据(查)
|
||||||
*
|
|
||||||
* ### 6.1 查询全部
|
|
||||||
* ```typescript
|
|
||||||
* const devices = await DB.select('device')
|
* const devices = await DB.select('device')
|
||||||
* ```
|
|
||||||
*
|
|
||||||
* ### 6.2 详细查询 —— 按 ID 查询单条
|
|
||||||
* ```typescript
|
|
||||||
* const device = await DB.selectById('device', 1)
|
* const device = await DB.selectById('device', 1)
|
||||||
* // 返回: { id: 1, device_name: '...', ... } 或 null
|
|
||||||
* ```
|
|
||||||
*
|
|
||||||
* ### 6.3 详细查询 —— 按字段精确匹配
|
|
||||||
* ```typescript
|
|
||||||
* const devices = await DB.selectByField('device', 'status', 'online')
|
|
||||||
* ```
|
|
||||||
*
|
|
||||||
* ### 6.4 模糊查询 —— LIKE 模糊匹配
|
|
||||||
* ```typescript
|
|
||||||
* // 按设备名称模糊查询
|
|
||||||
* const devices = await DB.selectLike('device', 'device_name', '徐工')
|
|
||||||
*
|
|
||||||
* // 指定返回字段的模糊查询
|
|
||||||
* const devices = await DB.selectLike('device', 'device_name', '徐工', 'id, device_name, status')
|
|
||||||
* ```
|
|
||||||
*
|
|
||||||
* ### 6.5 条件查询 —— 带排序和分页
|
|
||||||
* ```typescript
|
|
||||||
* const devices = await DB.select('device', '*', "status = 'online'", 'id DESC', 10)
|
|
||||||
* ```
|
|
||||||
*
|
|
||||||
* ### 6.6 计数查询
|
|
||||||
* ```typescript
|
|
||||||
* const count = await DB.count('device', "status = 'online'")
|
* const count = await DB.count('device', "status = 'online'")
|
||||||
* ```
|
|
||||||
*
|
|
||||||
* ### 6.7 原生 SQL 查询(复杂查询时使用)
|
|
||||||
* ```typescript
|
|
||||||
* const result = await DB.selectSql('SELECT * FROM device WHERE status = "online"')
|
|
||||||
* ```
|
|
||||||
*
|
|
||||||
* ## 7. 事务操作
|
|
||||||
*
|
|
||||||
* ```typescript
|
|
||||||
* await DB.transaction([
|
|
||||||
* "INSERT INTO device (device_name, device_type) VALUES ('设备A', '压路机')",
|
|
||||||
* "INSERT INTO work_record (device_id, speed) VALUES (1, 5.5)",
|
|
||||||
* ])
|
|
||||||
* ```
|
|
||||||
*
|
|
||||||
* ## 8. 其他
|
|
||||||
*
|
|
||||||
* ```typescript
|
|
||||||
* // 手动打开数据库
|
|
||||||
* await DB.open()
|
|
||||||
* // 手动关闭数据库
|
|
||||||
* await DB.close()
|
|
||||||
* ```
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const DB_NAME = 'road_roller'
|
const DB_NAME = 'road_roller'
|
||||||
@@ -254,10 +172,6 @@ class DB {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 插入一条记录
|
* 插入一条记录
|
||||||
* @param table 表名
|
|
||||||
* @param data 键值对数据对象
|
|
||||||
* @example
|
|
||||||
* await DB.insert('device', { device_name: '设备A', device_type: '压路机', status: 'online' })
|
|
||||||
*/
|
*/
|
||||||
static async insert(table: string, data: Record<string, any>): Promise<any> {
|
static async insert(table: string, data: Record<string, any>): Promise<any> {
|
||||||
const keys = Object.keys(data)
|
const keys = Object.keys(data)
|
||||||
@@ -268,11 +182,6 @@ class DB {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 更新记录
|
* 更新记录
|
||||||
* @param table 表名
|
|
||||||
* @param data 要更新的键值对
|
|
||||||
* @param where 条件子句(不含 WHERE 关键字),为空则更新全部
|
|
||||||
* @example
|
|
||||||
* await DB.update('device', { status: 'offline' }, "id = 1")
|
|
||||||
*/
|
*/
|
||||||
static async update(table: string, data: Record<string, any>, where?: string): Promise<any> {
|
static async update(table: string, data: Record<string, any>, where?: string): Promise<any> {
|
||||||
const sets = Object.keys(data).map(k => `${k} = ${escapeValue(data[k])}`)
|
const sets = Object.keys(data).map(k => `${k} = ${escapeValue(data[k])}`)
|
||||||
@@ -284,10 +193,6 @@ class DB {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 删除记录
|
* 删除记录
|
||||||
* @param table 表名
|
|
||||||
* @param where 条件子句(不含 WHERE 关键字),为空则删除全部
|
|
||||||
* @example
|
|
||||||
* await DB.delete('device', "id = 1")
|
|
||||||
*/
|
*/
|
||||||
static async delete(table: string, where?: string): Promise<any> {
|
static async delete(table: string, where?: string): Promise<any> {
|
||||||
let sql = `DELETE FROM ${table}`
|
let sql = `DELETE FROM ${table}`
|
||||||
@@ -298,13 +203,6 @@ class DB {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询记录
|
* 查询记录
|
||||||
* @param table 表名
|
|
||||||
* @param columns 返回字段,默认 '*'
|
|
||||||
* @param where 条件子句(不含 WHERE 关键字),可选
|
|
||||||
* @param orderBy 排序子句(不含 ORDER BY 关键字),可选
|
|
||||||
* @param limit 返回条数限制,可选
|
|
||||||
* @example
|
|
||||||
* const list = await DB.select('device', '*', "status = 'online'", 'id DESC', 10)
|
|
||||||
*/
|
*/
|
||||||
static async select(
|
static async select(
|
||||||
table: string,
|
table: string,
|
||||||
@@ -324,12 +222,7 @@ class DB {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 按 ID 查询单条记录(详细查询)
|
* 按 ID 查询单条记录
|
||||||
* @param table 表名
|
|
||||||
* @param id 主键值
|
|
||||||
* @returns 记录对象或 null
|
|
||||||
* @example
|
|
||||||
* const device = await DB.selectById('device', 1)
|
|
||||||
*/
|
*/
|
||||||
static async selectById(table: string, id: number | string): Promise<any> {
|
static async selectById(table: string, id: number | string): Promise<any> {
|
||||||
const result = await DB.select(
|
const result = await DB.select(
|
||||||
@@ -341,13 +234,7 @@ class DB {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 按字段精确匹配查询(详细查询)
|
* 按字段精确匹配查询
|
||||||
* @param table 表名
|
|
||||||
* @param field 字段名
|
|
||||||
* @param value 匹配值
|
|
||||||
* @param columns 返回字段,默认 '*'
|
|
||||||
* @example
|
|
||||||
* const devices = await DB.selectByField('device', 'status', 'online')
|
|
||||||
*/
|
*/
|
||||||
static async selectByField(
|
static async selectByField(
|
||||||
table: string,
|
table: string,
|
||||||
@@ -360,15 +247,6 @@ class DB {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 模糊查询(LIKE %keyword%)
|
* 模糊查询(LIKE %keyword%)
|
||||||
* @param table 表名
|
|
||||||
* @param field 要模糊匹配的字段名
|
|
||||||
* @param keyword 关键词
|
|
||||||
* @param columns 返回字段,默认 '*'
|
|
||||||
* @example
|
|
||||||
* // 按设备名称模糊查询
|
|
||||||
* const devices = await DB.selectLike('device', 'device_name', '徐工')
|
|
||||||
* // 指定返回字段
|
|
||||||
* const devices = await DB.selectLike('device', 'device_name', '徐工', 'id, device_name')
|
|
||||||
*/
|
*/
|
||||||
static async selectLike(
|
static async selectLike(
|
||||||
table: string,
|
table: string,
|
||||||
@@ -382,11 +260,6 @@ class DB {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 计数查询
|
* 计数查询
|
||||||
* @param table 表名
|
|
||||||
* @param where 条件子句(不含 WHERE 关键字),可选
|
|
||||||
* @returns 记录数量
|
|
||||||
* @example
|
|
||||||
* const count = await DB.count('device', "status = 'online'")
|
|
||||||
*/
|
*/
|
||||||
static async count(table: string, where?: string): Promise<number> {
|
static async count(table: string, where?: string): Promise<number> {
|
||||||
const result = await DB.select(table, 'COUNT(*) as total', where)
|
const result = await DB.select(table, 'COUNT(*) as total', where)
|
||||||
@@ -394,71 +267,6 @@ class DB {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 初始化数据库表
|
|
||||||
*/
|
|
||||||
export async function initTables() {
|
|
||||||
const sqls = [
|
|
||||||
// 项目信息表
|
|
||||||
`CREATE TABLE IF NOT EXISTS project (
|
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
||||||
project_name TEXT NOT NULL,
|
|
||||||
project_type TEXT,
|
|
||||||
status TEXT DEFAULT 'offline',
|
|
||||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
||||||
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
||||||
)`,
|
|
||||||
// 作业记录表
|
|
||||||
`CREATE TABLE IF NOT EXISTS work_record (
|
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
||||||
project_id INTEGER,
|
|
||||||
start_time DATETIME,
|
|
||||||
end_time DATETIME,
|
|
||||||
speed REAL,
|
|
||||||
frequency REAL,
|
|
||||||
amplitude REAL,
|
|
||||||
compaction_value REAL,
|
|
||||||
gps_lat REAL,
|
|
||||||
gps_lng REAL,
|
|
||||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
||||||
FOREIGN KEY (project_id) REFERENCES project(id)
|
|
||||||
)`,
|
|
||||||
// RTK 轨迹数据表
|
|
||||||
`CREATE TABLE IF NOT EXISTS rtk_track (
|
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
||||||
work_record_id INTEGER,
|
|
||||||
timestamp DATETIME,
|
|
||||||
latitude REAL,
|
|
||||||
longitude REAL,
|
|
||||||
altitude REAL,
|
|
||||||
speed REAL,
|
|
||||||
heading REAL,
|
|
||||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
||||||
FOREIGN KEY (work_record_id) REFERENCES work_record(id)
|
|
||||||
)`,
|
|
||||||
// 告警记录表
|
|
||||||
`CREATE TABLE IF NOT EXISTS warning_record (
|
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
||||||
project_id INTEGER,
|
|
||||||
warning_type TEXT,
|
|
||||||
warning_level TEXT,
|
|
||||||
message TEXT,
|
|
||||||
is_read INTEGER DEFAULT 0,
|
|
||||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
||||||
FOREIGN KEY (project_id) REFERENCES project(id)
|
|
||||||
)`,
|
|
||||||
]
|
|
||||||
|
|
||||||
try {
|
|
||||||
await DB.transaction(sqls)
|
|
||||||
console.log('数据库表初始化成功')
|
|
||||||
}
|
|
||||||
catch (err) {
|
|
||||||
console.error('数据库表初始化失败:', err)
|
|
||||||
throw err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 兼容旧版按需导出
|
// 兼容旧版按需导出
|
||||||
export const openDatabase = DB.open
|
export const openDatabase = DB.open
|
||||||
export const closeDatabase = DB.close
|
export const closeDatabase = DB.close
|
||||||
|
|||||||
Reference in New Issue
Block a user