Skip to content

Commit e460fb6

Browse files
committed
使用Hive实现聊天历史、配置持久化存储
1 parent de57074 commit e460fb6

16 files changed

+868
-130
lines changed

lib/controller/chat.dart

+5-13
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,28 @@
11
import 'package:chat_all/controller/sidebar.dart';
22
import 'package:get/get.dart';
3-
import 'package:uuid/uuid.dart';
43

54
import '../model/message.dart';
65

7-
var uuid = Uuid();
8-
96
class ChatPageController extends GetxController {
10-
HistoryMessage historyMessages = Get.find<SidebarPageController>().histories.last;
11-
12-
@override
13-
void onInit() {
14-
super.onInit();
15-
}
7+
HistoryMessage currHistoryMessage = Get.find<SidebarPageController>().histories.last;
168

179
void updateMessageContent(int index, String content) {
18-
historyMessages.messages[index].content = content;
10+
currHistoryMessage.messages[index].content = content;
1911
update();
2012
}
2113

2214
void addMessage(Message message) {
23-
historyMessages.messages.add(message);
15+
currHistoryMessage.messages.add(message);
2416
update();
2517
}
2618

2719
void reloadHistory() {
28-
historyMessages = Get.find<SidebarPageController>().histories.last;
20+
currHistoryMessage = Get.find<SidebarPageController>().histories.last;
2921
update();
3022
}
3123

3224
void setHistory(HistoryMessage history) {
33-
historyMessages = history;
25+
currHistoryMessage = history;
3426
update();
3527
}
3628
}

lib/controller/setting.dart

+38-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11

2+
import 'dart:developer';
23
import 'dart:ui';
34

45
import 'package:adaptive_theme/adaptive_theme.dart';
6+
import 'package:chat_all/db/setting_database.dart';
57
import 'package:get/get.dart';
68

79
class SettingPageController extends GetxController {
@@ -10,7 +12,7 @@ class SettingPageController extends GetxController {
1012
// 语言
1113
final language = Get.deviceLocale.obs;
1214
// api设置
13-
final api = "https://api.mnzdna.xyz".obs;
15+
final api = "https://api.openai.com".obs;
1416
final key = "".obs;
1517
// 对话配置
1618
final chatModel = "gpt-3.5-turbo".obs;
@@ -21,10 +23,29 @@ class SettingPageController extends GetxController {
2123
final disabledSystemPrompt = true.obs;
2224
final topP = 0.5.obs;
2325

26+
final db = SettingDatabase();
27+
28+
@override
29+
void onInit() {
30+
themeMode.value = db.getThemeMode();
31+
language.value = db.getLanguage();
32+
api.value = db.getApi()??api.value;
33+
key.value = db.getKey()??key.value;
34+
chatModel.value = db.getChatModel()??chatModel.value;
35+
temperature.value = db.getTemperature()??temperature.value;
36+
presencePenalty.value = db.getPresencePenalty()??presencePenalty.value;
37+
frequencyPenalty.value = db.getFrequencyPenalty()??frequencyPenalty.value;
38+
historyLength.value = db.getHistoryLength()??historyLength.value;
39+
disabledSystemPrompt.value = db.getDisabledSystemPrompt()??disabledSystemPrompt.value;
40+
topP.value = db.getTopP()??topP.value;
41+
setLanguage(language.value!);
42+
super.onInit();
43+
}
2444

2545
void setLanguage(Locale locale){
2646
language.value = locale;
2747
Get.updateLocale(locale);
48+
update();
2849
}
2950

3051
void reset() {
@@ -39,8 +60,23 @@ class SettingPageController extends GetxController {
3960

4061
@override
4162
void onClose() {
42-
// 配置存储到数据库中
63+
super.onClose();
64+
saveSettingInfo();
65+
}
4366

67+
void saveSettingInfo(){
68+
db.saveThemeMode(themeMode.value);
69+
db.saveLanguage(language.value!);
70+
db.saveApi(api.value);
71+
db.saveKey(key.value);
72+
db.saveChatModel(chatModel.value);
73+
db.saveTemperature(temperature.value);
74+
db.savePresencePenalty(presencePenalty.value);
75+
db.saveFrequencyPenalty(frequencyPenalty.value);
76+
db.saveHistoryLength(historyLength.value);
77+
db.saveDisabledSystemPrompt(disabledSystemPrompt.value);
78+
db.saveTopP(topP.value);
79+
log("配置信息存储完成");
4480
}
4581
}
4682

lib/controller/sidebar.dart

+29-10
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,27 @@
1+
import 'package:chat_all/db/message_database.dart';
12
import 'package:chat_all/model/message.dart';
23
import 'package:get/get.dart';
34
import 'package:uuid/uuid.dart';
45

56
class SidebarPageController extends GetxController {
67

7-
final histories = <HistoryMessage>[].obs;
88
final defaultOverview = "default_history_chat_overview".tr;
9+
final histories = <HistoryMessage>[HistoryMessage(id: Uuid().v1(), title: "default_history_chat_overview".tr, messages: [], createTime: DateTime.now())].obs;
10+
911
final choice = 0.obs;
1012

13+
final db = MessageDatabase();
14+
1115
@override
1216
void onInit() {
1317
super.onInit();
14-
15-
histories.add(
16-
HistoryMessage(
17-
id: const Uuid().v1(), title: defaultOverview, messages: [], createTime: DateTime.now())
18-
);
18+
var storeHistories = db.readAll();
19+
histories.clear();
20+
histories.addAll(storeHistories);
21+
if(histories.isEmpty){
22+
newHistory();
23+
}
24+
update();
1925
}
2026

2127
void setChoice(int index){
@@ -25,6 +31,7 @@ class SidebarPageController extends GetxController {
2531

2632
void addHistory(HistoryMessage historyMessage) {
2733
histories.add(historyMessage);
34+
db.addHistoryMessage(historyMessage);
2835
update();
2936
}
3037

@@ -41,21 +48,22 @@ class SidebarPageController extends GetxController {
4148
if (!hasHistory) {
4249
histories.add(historyMessage);
4350
}
51+
db.updateHistoryMessage(historyMessage);
4452
update();
4553
}
4654

4755
void deleteHistory(int index) {
56+
db.deleteHistoryMessage(histories[index].id);
4857
histories.removeAt(index);
4958
if (histories.isEmpty) {
50-
histories.add(HistoryMessage(
51-
id: const Uuid().v1(), title: defaultOverview, messages: [], createTime: DateTime.now()));
59+
newHistory();
5260
}
5361
update();
5462
}
5563

5664
void newHistory() {
57-
58-
histories.add(HistoryMessage(
65+
choice.value = 0;
66+
addHistory(HistoryMessage(
5967
id: const Uuid().v1(), title: defaultOverview, messages: [], createTime: DateTime.now()));
6068
update();
6169
}
@@ -64,7 +72,18 @@ class SidebarPageController extends GetxController {
6472
histories.clear();
6573
newHistory();
6674
choice.value = 0;
75+
db.clearHistoryMessage();
6776
update();
6877
}
6978

79+
@override
80+
void onClose() {
81+
db.saveHistory(histories);
82+
super.onClose();
83+
}
84+
85+
void saveAll() {
86+
db.saveHistory(histories);
87+
}
88+
7089
}

lib/db/boxes.dart

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import 'package:hive/hive.dart';
2+
3+
late Box historyBox;
4+
late Box settingBox;

lib/db/message_database.dart

+83
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
2+
import 'package:chat_all/db/boxes.dart';
3+
import 'package:chat_all/model/message.dart';
4+
5+
/**
6+
* key-value
7+
* key_histories 存储所有的HistoryMessage
8+
*/
9+
class MessageDatabase {
10+
11+
// 单例对象
12+
static final MessageDatabase _instance = MessageDatabase._internal();
13+
14+
// 私有构造函数
15+
MessageDatabase._internal();
16+
17+
// 工厂构造函数,用于返回单例对象
18+
factory MessageDatabase() {
19+
return _instance;
20+
}
21+
22+
// 读取所有的history
23+
List<HistoryMessage> readAll(){
24+
var values = historyBox.get("key_histories");
25+
26+
List<HistoryMessage> histories = [];
27+
if(values == null){
28+
return histories;
29+
}
30+
for (var element in values) {
31+
histories.add(HistoryMessage(id: element.id, title: element.title, messages: element.messages, createTime: element.createTime));
32+
}
33+
print(histories);
34+
return histories;
35+
36+
}
37+
38+
// 添加HistoryMessage
39+
void addHistoryMessage(HistoryMessage message){
40+
var histories = readAll();
41+
histories.add(message);
42+
historyBox.put("key_histories", histories);
43+
}
44+
45+
// 删除HistoryMessage
46+
void deleteHistoryMessage(String id){
47+
var histories = readAll();
48+
int len = histories.length;
49+
int deleteIndex = 0;
50+
while(deleteIndex < len && histories[deleteIndex].id != id) {
51+
deleteIndex++;
52+
}
53+
if(deleteIndex == len) return;
54+
histories.removeAt(deleteIndex);
55+
historyBox.put("key_histories", histories);
56+
}
57+
58+
// 清空HistoryMessage
59+
void clearHistoryMessage(){
60+
var histories = readAll();
61+
histories.clear();
62+
historyBox.put("key_histories", histories);
63+
}
64+
65+
// 更新某个HistoryMessage
66+
void updateHistoryMessage(HistoryMessage historyMessage) {
67+
var histories = readAll();
68+
int len = histories.length;
69+
int updateIndex = 0;
70+
while(updateIndex < len && histories[updateIndex].id != historyMessage.id){
71+
updateIndex++;
72+
}
73+
if(updateIndex == len)return;
74+
histories[updateIndex] = historyMessage;
75+
historyBox.put("key_histories", histories);
76+
}
77+
78+
// 保存
79+
void saveHistory(List<HistoryMessage> histories){
80+
historyBox.put("key_histories", histories);
81+
}
82+
83+
}

0 commit comments

Comments
 (0)