You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

173 lines
6.6 KiB

import Dexie from 'dexie';
export type ChatTable = 'prompts' | 'modelslabel' | 'modelslist' | 'chatuser' | 'chatmsg' | 'systemChatRecord' | 'workbenchChatRecord' | 'workbenchChatUser' | 'workbenchSessionList' | 'groupSessionList' | 'workbenchGroupChatRecord' | 'workbenchGroupUserList' | 'workbenchGroupInviteMessage';
export const dbInit: any = new Dexie('GodoOSDatabase');
dbInit.version(1).stores({
// ai助手
prompts: '++id,lang,action,prompt,name,ext,isdef,createdAt,[action+lang]',
// 模型标签
modelslabel: '++id,name,zhdesc,endesc,family,chanel,models,action,engine',
// 模型列表
modelslist: '++id,model,label,action,status,params,type,isdef,info,created_at',
// 用户列表
workbenchChatUser: '++id,ip,userName,chatId,avatar,mobile,phone,nickName,isOnline,updatedAt,createdAt',
// 会话列表
workbenchSessionList: '++id,avatar,chatId,username,nickname,userId,toUserId,previewMessage,messages,time,createdAt',
// 聊天记录
workbenchChatRecord: '++id,[toUserId+userId], [userId+toUserId],toUserId,messages,messageType,time,createdAt,userInfo',
// 群组会话列表
groupSessionList: '++id,groupId,chatId,name,message,previewMessage,avatar,createdAt',
// 群组聊天记录
workbenchGroupChatRecord: '++id,chatId,userId,to_groupid,messageType,userInfo,message,time,type,createdAt',
// 群用户列表
workbenchGroupUserList: '++id, group_id, createdAt, userIdArray',
// 群组邀请信息消息
workbenchGroupInviteMessage: '++id, group_id,userId, message, createdAt',
//系统聊天记录表
systemChatRecord: '++id,chatId,message,time,createdAt',
// 用户列表
chatuser: '++id,ip,hostname,userName,avatar,mobile,nickName,isOnline,updatedAt,createdAt',
chatmsg: '++id,toUserId,targetIp,senderInfo,reciperInfo,previewMessage,content,type,status,isRead,isMe,readAt,createdAt',
}).upgrade((tx: {
workbenchSessionList: any;
workbenchChatUser: any;
workbenchGroupChatRecord: any;
workbenchGroupUserList: any;
workbenchGroupInviteMessage: any;
groupSessionList: any;
workbenchChatRecord: any;
systemChatRecord: any;
}) => {
// 手动添加索引
tx.groupSessionList.addIndex('chatId', (obj: { chatId: any; }) => obj.chatId);
tx.workbenchSessionList.addIndex('chatId', (obj: { chatId: any; }) => obj.chatId);
tx.workbenchChatRecord.addIndex('toUserId', (obj: { toUserId: any; }) => obj.toUserId);
tx.systemChatRecord.addIndex('chatId', (obj: { chatId: any; }) => obj.chatId);
// 添加复合索引
tx.workbenchChatRecord.addIndex('[toUserId+userId]', (obj: { toUserId: any; userId: any; }) => [obj.toUserId, obj.userId]);
tx.workbenchGroupChatRecord.addIndex('chatId', (obj: { chatId: any; }) => obj.chatId);
tx.workbenchGroupUserList.addIndex('group_id', (obj: { group_id: any; }) => obj.group_id);
tx.workbenchGroupInviteMessage.addIndex('group_id', (obj: { group_id: any; }) => obj.group_id);
});
export const db = {
async getMaxId(tableName: ChatTable) {
const data = await dbInit[tableName].orderBy('id').reverse().first()
if (!data) {
return 0
} else {
return data.id
}
},
async getInsertId(tableName: ChatTable) {
const id: any = await this.getMaxId(tableName)
return id + 1
},
async getPage(tableName: ChatTable, page?: number, size?: number) {
page = (!page || page < 1) ? 1 : page
size = size ? size : 10
const offset = (page - 1) * size
return dbInit[tableName]
.orderBy("id")
.reverse()
.offset(offset)
.limit(size)
.toArray();
},
async getAll(tableName: ChatTable) {
return dbInit[tableName].toArray()
},
async count(tableName: ChatTable) {
return dbInit[tableName].count()
},
async countSearch(tableName: ChatTable, whereObj?: any) {
return dbInit[tableName].where(whereObj).count()
},
async pageSearch(tableName: ChatTable, page?: number, size?: number, whereObj?: any) {
page = (!page || page < 1) ? 1 : page
size = size ? size : 10
const offset = (page - 1) * size
//console.log(whereObj)
return dbInit[tableName]
.where(whereObj)
.reverse()
.offset(offset)
.limit(size)
.toArray();
},
async filter(tableName: ChatTable, filterFunc: any) {
return dbInit[tableName].filter(filterFunc).toArray()
},
table(tableName: ChatTable) {
return dbInit[tableName]
},
async getOne(tableName: ChatTable, Id: number) {
return dbInit[tableName].get(Id)
},
async getRow(tableName: ChatTable, fieldName: string, val: any) {
return dbInit[tableName].where(fieldName).equals(val).first()
},
async get(tableName: ChatTable, whereObj: any) {
//console.log(whereObj)
try {
const data = await dbInit[tableName].where(whereObj).first()
//console.log(data)
return data ? data : false
} catch (error) {
return false
}
},
async rows(tableName: ChatTable, whereObj: any) {
return dbInit[tableName].where(whereObj).toArray()
},
async field(tableName: ChatTable, whereObj: any, field: string) {
const data = await this.get(tableName, whereObj)
return data ? data[field] : false
},
async getValue(tableName: ChatTable, fieldName: string, val: any, fName: string) {
const row = await this.getRow(tableName, fieldName, val);
return row[fName]
},
// 写一个根据id数组的in方法
async getByIds(tableName: ChatTable, ids: string[]) {
return dbInit[tableName].where("id").anyOf(ids).toArray()
},
async getByField(tableName: ChatTable, fieldName: string, val: any) {
return dbInit[tableName].where(fieldName).equals(val).toArray()
},
async addOne(tableName: ChatTable, data: any) {
return dbInit[tableName].add(data)
},
async addAll(tableName: ChatTable, data: any) {
return dbInit[tableName].bulkAdd(data)
},
async update(tableName: ChatTable, Id?: number, updates?: any) {
return dbInit[tableName].update(Id, updates)
},
async modify(tableName: ChatTable, fieldName: string, val: any, updates: any) {
return dbInit[tableName].where(fieldName).equals(val).modify(updates)
},
async delete(tableName: ChatTable, Id?: number) {
return dbInit[tableName].delete(Id)
},
async deleteByField(tableName: ChatTable, fieldName: string, val: any) {
return dbInit[tableName].where(fieldName).equals(val).delete()
},
// 根据whereObj条件删除
async deleteByWhere(tableName: ChatTable, whereObj: any) {
return dbInit[tableName].where(whereObj).delete()
},
// 获取创建时间最近的记录
async getLatest(tableName: ChatTable, fieldName: string, val: any) {
return dbInit[tableName].where(fieldName).equals(val).reverse().first()
},
async clear(tableName: ChatTable) {
return dbInit[tableName].clear()
},
}