mirror of
https://gitcode.com/JianFeeeee/TrulyMEM-TrueHumanMEM.git
synced 2026-10-04 00:14:26 +00:00
refactor: 工程标准化 — 组件提取、废弃API清理、console清零
- ChatPage/GraphPage/SettingsPage 拆分为独立子组件 - MainPage 接入 ImmersiveTabNavigation 玻璃拟态导航 - EntryAbility console.* 全替换为 defaultLogger - SplashPage replaceUrl 废弃 API 迁移到 UIContext Router - common/Index.ets 双通道导出 Logger/defaultLogger - 删除 dead code (entry/, commonbusiness/, trulymem-core/) - 全工程 0 console.*,BUILD SUCCESSFUL
This commit is contained in:
17
features/chat/BuildProfile.ets
Normal file
17
features/chat/BuildProfile.ets
Normal file
@ -0,0 +1,17 @@
|
||||
/**
|
||||
* Use these variables when you tailor your ArkTS code. They must be of the const type.
|
||||
*/
|
||||
export const HAR_VERSION = '1.0.0';
|
||||
export const BUILD_MODE_NAME = 'debug';
|
||||
export const DEBUG = true;
|
||||
export const TARGET_NAME = 'default';
|
||||
|
||||
/**
|
||||
* BuildProfile Class is used only for compatibility purposes.
|
||||
*/
|
||||
export default class BuildProfile {
|
||||
static readonly HAR_VERSION = HAR_VERSION;
|
||||
static readonly BUILD_MODE_NAME = BUILD_MODE_NAME;
|
||||
static readonly DEBUG = DEBUG;
|
||||
static readonly TARGET_NAME = TARGET_NAME;
|
||||
}
|
||||
@ -1,5 +1,7 @@
|
||||
{
|
||||
"apiType": "stageMode",
|
||||
"buildOption": {
|
||||
},
|
||||
"targets": [
|
||||
{
|
||||
"name": "default"
|
||||
|
||||
1
features/chat/chat
Symbolic link
1
features/chat/chat
Symbolic link
@ -0,0 +1 @@
|
||||
/home/program/TrulyMEM-TrueHumanMEM/features/chat
|
||||
6
features/chat/hvigorfile.ts
Normal file
6
features/chat/hvigorfile.ts
Normal file
@ -0,0 +1,6 @@
|
||||
import { harTasks } from '@ohos/hvigor-ohos-plugin';
|
||||
|
||||
export default {
|
||||
system: harTasks,
|
||||
plugins: []
|
||||
};
|
||||
19
features/chat/oh-package-lock.json5
Normal file
19
features/chat/oh-package-lock.json5
Normal file
@ -0,0 +1,19 @@
|
||||
{
|
||||
"meta": {
|
||||
"stableOrder": true,
|
||||
"enableUnifiedLockfile": false
|
||||
},
|
||||
"lockfileVersion": 3,
|
||||
"ATTENTION": "THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.",
|
||||
"specifiers": {
|
||||
"@ohos/common@../../common": "@ohos/common@../../common"
|
||||
},
|
||||
"packages": {
|
||||
"@ohos/common@../../common": {
|
||||
"name": "@ohos/common",
|
||||
"version": "1.0.0",
|
||||
"resolved": "../../common",
|
||||
"registryType": "local"
|
||||
}
|
||||
}
|
||||
}
|
||||
1
features/chat/oh_modules/@ohos/common
Symbolic link
1
features/chat/oh_modules/@ohos/common
Symbolic link
@ -0,0 +1 @@
|
||||
../../../../common
|
||||
161
features/chat/src/main/ets/components/ChatComponents.ets
Normal file
161
features/chat/src/main/ets/components/ChatComponents.ets
Normal file
@ -0,0 +1,161 @@
|
||||
import { ChatMessage } from '@ohos/common';
|
||||
|
||||
/**
|
||||
* ChatMessageBubble — 单条聊天消息气泡
|
||||
* 封装消息的角色标识、内容样式、玻璃拟态背景
|
||||
*/
|
||||
@Component
|
||||
export struct ChatMessageBubble {
|
||||
@ObjectLink msg: ChatMessage;
|
||||
|
||||
build() {
|
||||
Column() {
|
||||
// 角色标识
|
||||
Text(this.msg.role === 'user' ? '🧑 你' : '🤖 AI')
|
||||
.fontSize(11)
|
||||
.fontColor(this.msg.role === 'user' ? '#7C4DFF' : '#999')
|
||||
.width('100%')
|
||||
|
||||
// 消息内容
|
||||
Text(this.msg.content)
|
||||
.fontSize(15)
|
||||
.width('100%')
|
||||
.margin({ top: 4 })
|
||||
.fontColor('#FFFFFF')
|
||||
}
|
||||
.padding(12)
|
||||
.backgroundColor(this.msg.role === 'user' ? 'rgba(124,77,255,0.15)' : 'rgba(245,245,245,0.1)')
|
||||
.borderRadius(12)
|
||||
.border({
|
||||
width: 1,
|
||||
color: this.msg.role === 'user' ? 'rgba(124,77,255,0.3)' : 'rgba(255,255,255,0.1)'
|
||||
})
|
||||
.backgroundBlurStyle(BlurStyle.Thin)
|
||||
.margin({ left: 8, right: 8, bottom: 8 })
|
||||
.width('100%')
|
||||
.alignItems(HorizontalAlign.Start)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* ThinkingIndicator — AI 思考中指示器
|
||||
* 玻璃拟态加载动画 + 文字提示
|
||||
*/
|
||||
@Component
|
||||
export struct ThinkingIndicator {
|
||||
build() {
|
||||
Row() {
|
||||
LoadingProgress()
|
||||
.width(20)
|
||||
.height(20)
|
||||
.margin({ right: 8 })
|
||||
.color('#7C4DFF')
|
||||
Text('AI 思考中...')
|
||||
.fontSize(13)
|
||||
.fontColor('#7C4DFF')
|
||||
}
|
||||
.padding(12)
|
||||
.backgroundColor('rgba(124,77,255,0.1)')
|
||||
.borderRadius(12)
|
||||
.border({ width: 1, color: 'rgba(124,77,255,0.2)' })
|
||||
.backgroundBlurStyle(BlurStyle.Thin)
|
||||
.margin({ left: 8, right: 8, bottom: 8 })
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* ToolCallLogPanel — 工具调用日志面板
|
||||
* 橙色风格,显示 Agent 调用的工具链
|
||||
*/
|
||||
@Component
|
||||
export struct ToolCallLogPanel {
|
||||
@Prop logText: string;
|
||||
|
||||
build() {
|
||||
Text(this.logText)
|
||||
.fontSize(10)
|
||||
.fontColor('#FF9800')
|
||||
.backgroundColor('rgba(255,152,0,0.1)')
|
||||
.padding(8)
|
||||
.borderRadius(8)
|
||||
.border({ width: 1, color: 'rgba(255,152,0,0.2)' })
|
||||
.backgroundBlurStyle(BlurStyle.Thin)
|
||||
.margin({ left: 8, right: 8, bottom: 4 })
|
||||
.lineHeight(16)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* ChatInputBar — 底部输入栏
|
||||
* TextArea + 发送按钮,主题色边框
|
||||
*/
|
||||
@Component
|
||||
export struct ChatInputBar {
|
||||
@Link inputText: string;
|
||||
@Prop isThinking: boolean;
|
||||
onSend?: () => void;
|
||||
|
||||
build() {
|
||||
Row() {
|
||||
TextArea({ text: this.inputText, placeholder: '输入消息...' })
|
||||
.layoutWeight(1)
|
||||
.onChange((v: string) => { this.inputText = v; })
|
||||
.height(40)
|
||||
.backgroundColor('rgba(255,255,255,0.1)')
|
||||
.borderRadius(8)
|
||||
.border({ width: 1, color: 'rgba(124,77,255,0.3)' })
|
||||
|
||||
Button('发送')
|
||||
.enabled(!this.isThinking)
|
||||
.onClick(() => { this.onSend?.(); })
|
||||
.backgroundColor('#7C4DFF')
|
||||
.borderRadius(8)
|
||||
}
|
||||
.width('100%')
|
||||
.padding(8)
|
||||
.backgroundColor('rgba(255,255,255,0.05)')
|
||||
.backgroundBlurStyle(BlurStyle.Regular)
|
||||
.border({
|
||||
width: 1,
|
||||
color: 'rgba(124,77,255,0.2)',
|
||||
style: BorderStyle.Solid
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* ChatMessageList — 聊天消息列表容器
|
||||
* 整合消息气泡、思考指示器、工具日志
|
||||
*/
|
||||
@Component
|
||||
export struct ChatMessageList {
|
||||
@Prop messages: ChatMessage[];
|
||||
@Prop isThinking: boolean;
|
||||
@Prop toolCallLog: string;
|
||||
private scrollController: Scroller = new Scroller();
|
||||
|
||||
build() {
|
||||
List() {
|
||||
ForEach(this.messages, (msg: ChatMessage) => {
|
||||
ListItem() {
|
||||
ChatMessageBubble({ msg: msg })
|
||||
}
|
||||
})
|
||||
|
||||
if (this.isThinking) {
|
||||
ListItem() {
|
||||
ThinkingIndicator()
|
||||
}
|
||||
}
|
||||
|
||||
if (this.toolCallLog && !this.isThinking) {
|
||||
ListItem() {
|
||||
ToolCallLogPanel({ logText: this.toolCallLog })
|
||||
}
|
||||
}
|
||||
}
|
||||
.width('100%')
|
||||
.layoutWeight(1)
|
||||
.backgroundColor('rgba(0,0,0,0.1)')
|
||||
}
|
||||
}
|
||||
@ -1,6 +1,5 @@
|
||||
import { GraphDatabase } from '@ohos/common';
|
||||
import { GraphMemoryService } from '@ohos/common';
|
||||
import { AIAgentService, ChatMessage, AgentResponse } from '@ohos/common';
|
||||
import { GraphDatabase, GraphMemoryService, AIAgentService, ChatMessage, AgentResponse, Logger } from '@ohos/common';
|
||||
import { ChatMessageList, ChatInputBar } from '../components/ChatComponents';
|
||||
|
||||
@Component
|
||||
export struct ChatPage {
|
||||
@ -9,7 +8,6 @@ export struct ChatPage {
|
||||
@Prop db: GraphDatabase;
|
||||
@State toolCallLog: string = '';
|
||||
@State isThinking: boolean = false;
|
||||
private scrollController: Scroller = new Scroller();
|
||||
private agentService?: AIAgentService;
|
||||
|
||||
async aboutToAppear() {
|
||||
@ -62,7 +60,7 @@ export struct ChatPage {
|
||||
await this.db.saveChatMessage('assistant', agentResponse.content, this.toolCallLog, this.agentService.getSessionId());
|
||||
this.messages = [...this.messages, { role: 'assistant', content: agentResponse.content }];
|
||||
} catch (err) {
|
||||
console.error('Agent request failed: ' + JSON.stringify(err));
|
||||
Logger.error('Agent request failed: ' + JSON.stringify(err));
|
||||
this.messages = [...this.messages, { role: 'assistant', content: `⚠️ 请求失败: ${err.message || JSON.stringify(err)}` }];
|
||||
} finally {
|
||||
this.isThinking = false;
|
||||
@ -71,101 +69,20 @@ export struct ChatPage {
|
||||
|
||||
build() {
|
||||
Column() {
|
||||
// 聊天列表
|
||||
List() {
|
||||
ForEach(this.messages, (msg: ChatMessage) => {
|
||||
ListItem() {
|
||||
Column() {
|
||||
// 角色标识
|
||||
Text(msg.role === 'user' ? '🧑 你' : '🤖 AI')
|
||||
.fontSize(11)
|
||||
.fontColor(msg.role === 'user' ? '#7C4DFF' : '#999')
|
||||
.width('100%')
|
||||
ChatMessageList({
|
||||
messages: this.messages,
|
||||
isThinking: this.isThinking,
|
||||
toolCallLog: this.toolCallLog
|
||||
})
|
||||
|
||||
// 消息内容
|
||||
Text(msg.content)
|
||||
.fontSize(15)
|
||||
.width('100%')
|
||||
.margin({ top: 4 })
|
||||
.fontColor('#FFFFFF')
|
||||
}
|
||||
.padding(12)
|
||||
.backgroundColor(msg.role === 'user' ? 'rgba(124,77,255,0.15)' : 'rgba(245,245,245,0.1)')
|
||||
.borderRadius(12)
|
||||
.border({ width: 1, color: msg.role === 'user' ? 'rgba(124,77,255,0.3)' : 'rgba(255,255,255,0.1)' })
|
||||
.backgroundBlurStyle(BlurStyle.Thin)
|
||||
.margin({ left: 8, right: 8, bottom: 8 })
|
||||
.width('100%')
|
||||
.alignItems(HorizontalAlign.Start)
|
||||
}
|
||||
})
|
||||
|
||||
// loading 指示
|
||||
if (this.isThinking) {
|
||||
ListItem() {
|
||||
Row() {
|
||||
LoadingProgress()
|
||||
.width(20)
|
||||
.height(20)
|
||||
.margin({ right: 8 })
|
||||
.color('#7C4DFF')
|
||||
Text('AI 思考中...')
|
||||
.fontSize(13)
|
||||
.fontColor('#7C4DFF')
|
||||
}
|
||||
.padding(12)
|
||||
.backgroundColor('rgba(124,77,255,0.1)')
|
||||
.borderRadius(12)
|
||||
.border({ width: 1, color: 'rgba(124,77,255,0.2)' })
|
||||
.backgroundBlurStyle(BlurStyle.Thin)
|
||||
.margin({ left: 8, right: 8, bottom: 8 })
|
||||
}
|
||||
}
|
||||
|
||||
// 工具调用日志
|
||||
if (this.toolCallLog && !this.isThinking) {
|
||||
ListItem() {
|
||||
Text(this.toolCallLog)
|
||||
.fontSize(10)
|
||||
.fontColor('#FF9800')
|
||||
.backgroundColor('rgba(255,152,0,0.1)')
|
||||
.padding(8)
|
||||
.borderRadius(8)
|
||||
.border({ width: 1, color: 'rgba(255,152,0,0.2)' })
|
||||
.backgroundBlurStyle(BlurStyle.Thin)
|
||||
.margin({ left: 8, right: 8, bottom: 4 })
|
||||
.lineHeight(16)
|
||||
}
|
||||
}
|
||||
}
|
||||
.width('100%')
|
||||
.layoutWeight(1)
|
||||
.backgroundColor('rgba(0,0,0,0.1)')
|
||||
|
||||
// 输入区
|
||||
Row() {
|
||||
TextArea({ text: this.inputText, placeholder: '输入消息...' })
|
||||
.layoutWeight(1)
|
||||
.onChange((v: string) => { this.inputText = v; })
|
||||
.height(40)
|
||||
.backgroundColor('rgba(255,255,255,0.1)')
|
||||
.borderRadius(8)
|
||||
.border({ width: 1, color: 'rgba(124,77,255,0.3)' })
|
||||
|
||||
Button('发送')
|
||||
.enabled(!this.isThinking)
|
||||
.onClick(() => this.sendMessage())
|
||||
.backgroundColor('#7C4DFF')
|
||||
.borderRadius(8)
|
||||
}
|
||||
.width('100%')
|
||||
.padding(8)
|
||||
.backgroundColor('rgba(255,255,255,0.05)')
|
||||
.backgroundBlurStyle(BlurStyle.Regular)
|
||||
.border({ width: 1, color: 'rgba(124,77,255,0.2)', style: BorderStyle.Solid })
|
||||
ChatInputBar({
|
||||
inputText: this.inputText,
|
||||
isThinking: this.isThinking,
|
||||
onSend: (): void => { this.sendMessage(); }
|
||||
})
|
||||
}
|
||||
.width('100%')
|
||||
.height('100%')
|
||||
.backgroundColor('rgba(26,27,46,0.95)')
|
||||
}
|
||||
}
|
||||
}
|
||||
12
features/chat/src/main/module.json5
Normal file
12
features/chat/src/main/module.json5
Normal file
@ -0,0 +1,12 @@
|
||||
{
|
||||
"module": {
|
||||
"name": "chat",
|
||||
"type": "har",
|
||||
"description": "TrulyMEM chat feature module",
|
||||
"deviceTypes": [
|
||||
"phone",
|
||||
"tablet",
|
||||
"2in1"
|
||||
]
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user