diff --git a/App.vue b/App.vue
index 0e94c79..6127a7c 100644
--- a/App.vue
+++ b/App.vue
@@ -1,31 +1,29 @@
@@ -305,7 +311,7 @@ uni-modal .uni-modal__btn:after {
uni-modal .uni-modal__btn_default {
background: #e6f6ff;
- color: #3CB5FB !important;
+ color: #3cb5fb !important;
margin-right: 20rpx;
}
@@ -322,7 +328,6 @@ uni-modal .uni-modal__btn_primary {
color: #ffffff !important;
}
-
uni-modal .uni-modal {
padding: 40rpx;
box-sizing: border-box;
@@ -357,8 +362,8 @@ uni-page-body {
body {
margin: 0;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen",
- "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue",
- "Microsoft Yahei", sans-serif;
+ "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue",
+ "Microsoft Yahei", sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
// max-width: 1536rpx;
diff --git a/common/http.api.js b/common/http.api.js
index 3fa268b..b0758b2 100644
--- a/common/http.api.js
+++ b/common/http.api.js
@@ -93,6 +93,10 @@ const install = (Vue, vm) => {
/** 首页ai对话 */
// 发送消息
let SendMessageApi = (params = {}) => vm.$u.post('api/ChatAI/CreateChat', params);
+ // 获取历史对话列表
+ let GetConversationPage = (params = {}) => vm.$u.get('api/ChatAI/GetConversationPage', params);
+ // 获取对话详情
+ let GetConversationDetail = (params = {}) => vm.$u.get('api/ChatAI/GetHistoricalConversations', params);
/** 登录 */
// 获取图形验证码
@@ -144,7 +148,9 @@ const install = (Vue, vm) => {
SendMessageApi,
GetCaptcha,
GetStuVerifyCode,
- StuLogin
+ StuLogin,
+ GetConversationPage,
+ GetConversationDetail
};
}
diff --git a/components/ChatHistory.vue b/components/ChatHistory.vue
new file mode 100644
index 0000000..c894044
--- /dev/null
+++ b/components/ChatHistory.vue
@@ -0,0 +1,210 @@
+
+
+
+
+
+
+
+
+
+ {{ group.id }}
+
+
+
+
+ {{ item.title }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/home/index/index.vue b/pages/home/index/index.vue
index 20164d7..14d7cd1 100644
--- a/pages/home/index/index.vue
+++ b/pages/home/index/index.vue
@@ -54,7 +54,7 @@
-->
-
@@ -206,6 +205,7 @@
v-model="messageValue"
type="text"
class="chat-input"
+ :focus="true"
placeholder="请输入内容"
placeholder-style="color: #adadad;"
@confirm="sendMessageFn"
@@ -223,56 +223,13 @@
-
-
-
-
- 周三
-
-
- {{ item.content }}
-
-
- 6/27
-
-
- {{ item.content }}
-
-
-
-
-
-
+
@@ -290,6 +247,7 @@ import MarkdownViewer from "@/components/markdown-viewer/markdown-viewer";
import CustomTabBar from "@/components/custom-tab-bar/custom-tab-bar.vue";
import AdvicePhone from "@/components/AdvicePhone.vue";
import PerfectInfo from "@/components/PerfectInfo.vue";
+import ChatHistory from "@/components/ChatHistory.vue"; // 导入新组件
export default {
components: {
@@ -297,10 +255,12 @@ export default {
AdvicePhone,
MarkdownViewer,
PerfectInfo,
+ ChatHistory, // 注册新组件
},
data() {
return {
isChat: false,
+ currentConversationId: "",
advicePhoneShow: false,
perfectInfoShow: false,
@@ -326,22 +286,37 @@ export default {
},
],
popupShow: false,
- chatHistoryList: [
- { content: "学校哪些专业比较好?" },
- { content: "如何报考学校综合合录取评澳市评招生?" },
- { content: "学校有新华专业?" },
- ],
- chatHistoryList2: [
- { content: "学校哪些专业比较好?" },
- { content: "如何报考学校综合合录取评澳市评招生?" },
- { content: "如何报考学校综合合录取评澳市评招生?" },
- { content: "如何报考学校综合合录取评澳市评招生?" },
- { content: "如何报考学校综合合录取评澳市评招生?" },
- { content: "学校有新华专业?" },
- { content: "学校有新华专业?" },
- { content: "学校有新华专业?" },
- { content: "学校有新华专业?" },
- { content: "学校有新华专业?" },
+ chatHistoryList3: [
+ // {
+ // "id": "今天",
+ // "conversation": [
+ // {
+ // "title": "你好",
+ // "id": "0d03f23c-9c5b-45ac-ae95-be51e9383a62",
+ // "startTime": "2025-07-10T15:28:02.832316"
+ // },
+ // {
+ // "title": "你知道今年的录取分数线吗",
+ // "id": "771ab434-348c-4a35-bd03-adebc21436d8",
+ // "startTime": "2025-07-10T15:11:32.885001"
+ // }
+ // ]
+ // },
+ // {
+ // "id": "周三",
+ // "conversation": [
+ // {
+ // "title": "今天是周三",
+ // "id": "0d03f23c-9c5b-45ac-ae95-be51e9383a62",
+ // "startTime": "2025-07-09T15:28:02.832316"
+ // },
+ // {
+ // "title": "你知道今年的录取分数线吗",
+ // "id": "771ab434-348c-4a35-bd03-adebc21436d8",
+ // "startTime": "2025-07-09T15:11:32.885001"
+ // }
+ // ]
+ // }
],
activeIndex: 0,
commonQuestions: [
@@ -352,57 +327,31 @@ export default {
"我什么时候能推知道自己是否被录取?",
],
scrollToView: "",
+ // 修改后的messageGroups数据结构
messageGroups: [
// {
- // time: "2025-07-01 10:00:00",
- // messages: [
- // { id: 1, content: "学校哪些专业比较好?", isUser: true },
- // {
- // id: 2,
- // content:
- // "我校有多个优势学科,包括计算机科学与技术、电子信息工程、机械工程、生物医学工程等。这些专业在国内都有较高的学术声誉和就业率。如果您对某个具体专业感兴趣,可以进一步咨询更多详情。",
- // isUser: false,
- // },
- // { id: 3, content: "计算机科学专业就业前景如何?", isUser: true },
- // {
- // id: 4,
- // content:
- // "计算机科学专业的就业前景非常好。根据最新数据,我校计算机专业毕业生就业率超过95%,平均起薪在全校名列前茅。主要就业方向包括互联网公司、IT企业、金融科技等领域,担任软件工程师、数据分析师、产品经理等职位。",
- // isUser: false,
- // },
- // ],
+ // id: "9cac8661-bf09-4b63-ab15-1a0a36b921e0",
+ // message: "你知道今年的录取分数线吗",
+ // sendDate: "2025-07-10T15:11:32.886075",
+ // isSend: true,
+ // isRead: false,
+ // interactMode: 0,
+ // messageType: 0,
+ // timeLabel: 1,
+ // displayTime: "15:11",
// },
// {
- // time: "2025-07-02 09:15:36",
- // messages: [
- // { id: 5, content: "新生报到流程", isUser: true },
- // {
- // id: 6,
- // content:
- // "新生报到流程:个人信息完善 --预报到 -- 照片信息采集 --缴费 --入校验审 -- 人脸识别 --打印报到单",
- // isUser: false,
- // },
- // { id: 7, content: "预报到需要准备哪些材料?", isUser: true },
- // {
- // id: 8,
- // content:
- // "预报到需要准备以下材料:\n1. 身份证原件及复印件\n2. 录取通知书原件\n3. 2寸蓝底证件照4张\n4. 学籍档案(密封)\n5. 党团关系材料(如有)\n\n建议提前准备齐全,以便快速完成报到流程。",
- // isUser: false,
- // },
- // ],
+ // id: "02306fc3-c821-4a23-ad66-0bd77d154105",
+ // message:
+ // "目前,2025年的录取分数线还没有正式公布,因为学校需要等招生工作结束后才会公布最终的录取分数线。不过,你可以参考2023-2024年的录取分数线作为大致的参考。\n\n如果你想知道具体专业的录取分数线,可以告诉我你所在省份和科类(历史类或物理类),我可以根据往年数据给你一些参考建议。如果需要更准确的信息,建议关注江西新能源科技职业学院的官网(www.jxnee.edu.cn)或者直接联系招生办(电话:0790-6764666/6765666)。",
+ // sendDate: "2025-07-10T15:11:32.88644",
+ // isSend: true,
+ // isRead: false,
+ // interactMode: 1,
+ // messageType: 0,
+ // timeLabel: 0,
+ // displayTime: "",
// },
- {
- time: "",
- messages: [
- // { id: 5, content: "新生报到流程", isUser: true },
- // {
- // id: 6,
- // content:
- // "新生报到流程:个人信息完善 --预报到 -- 照片信息采集 --缴费 --入校验审 -- 人脸识别 --打印报到单",
- // isUser: false,
- // },
- ],
- },
],
scrollTop: 0,
@@ -443,59 +392,15 @@ export default {
});
},
methods: {
- // 测试Markdown渲染效果(仅开发阶段使用)
- testMarkdownRender() {
- const markdownSample = `# 这是标题
-
- ## 这是二级标题
-
- 这是**加粗文本**和*斜体文本*
-
- > 这是引用文本
-
- - 列表项1
- - 列表项2
- - 列表项3
-
- \`\`\`javascript
- // 这是代码块
- function hello() {
- console.log('Hello World!');
- }
- \`\`\`
-
- [这是链接](https://www.example.com)
-
- | 表头1 | 表头2 |
- | ----- | ----- |
- | 内容1 | 内容2 |
- | 内容3 | 内容4 |
- `;
-
- this.messageGroups[0].messages.push({
- id: this.messageGroups[0].messages.length + 1,
- content: "测试Markdown渲染",
- isUser: true,
- });
-
- setTimeout(() => {
- this.messageGroups[0].messages.push({
- id: `test-${Date.now()}`,
- content: markdownSample,
- isUser: false,
- });
- }, 500);
- },
-
handleLeftClick() {
- this.$refs.uToast.show({
- title: "暂未开放",
- type: "warning",
- });
+ this.$u.api.GetConversationPage().then((res) => {
+ this.chatHistoryList3 = res.data;
+ console.log("this.chatHistoryList3", this.chatHistoryList3);
- return;
- this.popupShow = true;
+ this.popupShow = true;
+ });
},
+
selectChatItem(index) {
this.activeIndex = index;
},
@@ -538,44 +443,121 @@ export default {
}
},
+ // 修改发送消息的方法
sendMessageFn() {
if (!this.messageValue) {
return;
}
const sendMessage = this.messageValue;
-
console.log("发送消息", sendMessage);
- this.messageGroups[0].messages.push({
- id: this.messageGroups[0].messages.length + 1,
- content: sendMessage,
- isUser: true,
- });
+
+ // 创建新的用户消息对象
+ const userMessage = {
+ id: Math.random().toString(36).substring(2, 15),
+ message: sendMessage,
+ sendDate: "",
+ isSend: true,
+ isRead: false,
+ interactMode: 0, // 用户消息
+ messageType: 0,
+ timeLabel: 0,
+ displayTime: "",
+ };
+
+ // 添加到消息列表
+ this.messageGroups.push(userMessage);
this.messageValue = "";
this.$u.api
.SendMessageApi({
query: sendMessage,
- conversationId: "",
+ conversationId: this.currentConversationId,
})
.then((res) => {
console.log("res.....", res);
const data = res.data;
- // 处理返回内容,确保Markdown格式正确
- let content = data.content;
+ // 创建AI回复消息对象
+ const aiMessage = {
+ id:
+ data.conversationId ||
+ Math.random().toString(36).substring(2, 15),
+ message: data.content,
+ sendDate: "",
+ isSend: true,
+ isRead: false,
+ interactMode: 1, // AI消息
+ messageType: 0,
+ timeLabel: 0,
+ displayTime: "",
+ };
- // 如果返回的内容没有明确的Markdown格式,可以根据需要进行一些简单处理
- // 例如:将换行符转换为Markdown换行
- // content = content.replace(/\n/g, "\n\n");
+ // 添加到消息列表
+ this.messageGroups.push(aiMessage);
+ });
+ },
- this.messageGroups[0].messages.push({
- id: data.conversationId,
- content: content,
- isUser: false,
+ // 格式化时间的辅助方法
+ formatTime(date) {
+ const hours = date.getHours().toString().padStart(2, "0");
+ const minutes = date.getMinutes().toString().padStart(2, "0");
+ return `${hours}:${minutes}`;
+ },
+
+ // 处理选中的对话
+ handleSelectConversation(data) {
+ // 关闭弹窗
+ this.popupShow = false;
+
+ console.log("选中的对话:", data);
+ // 根据conversationId加载对应的对话内容
+ const conversationId = data.conversationId;
+
+ this.currentConversationId = conversationId;
+
+ this.isChat = true;
+
+ this.messageGroups = [];
+
+ this.$u.api
+ .GetConversationDetail({
+ "Item1.Id": conversationId,
+ PageIndex: "1",
+ PageSize: "20",
+ })
+ .then((res) => {
+ console.log("GetConversationDetail.....", res.item2);
+
+ // 将消息按sendDate升序排列,时间相同时用户消息(interactMode=0)排在前面
+ this.messageGroups = res.item2.sort((a, b) => {
+ const timeA = new Date(a.sendDate).getTime();
+ const timeB = new Date(b.sendDate).getTime();
+
+ // 如果时间相同,按interactMode排序(0排在前,1排在后)
+ if (timeA === timeB) {
+ return a.interactMode - b.interactMode;
+ }
+
+ // 否则按时间升序排列
+ return timeA - timeB;
});
});
},
+
+ handleCreateConversation() {
+ // 关闭弹窗
+ this.popupShow = false;
+ this.isChat = true;
+ this.currentConversationId = "";
+ this.messageGroups = [];
+ },
+
+ handleStartChat() {
+ this.isChat = true;
+ this.currentConversationId = "";
+ this.messageGroups = [];
+ },
},
};
diff --git a/pages/login/login/index.vue b/pages/login/login/index.vue
index cbcc547..2fb87e7 100644
--- a/pages/login/login/index.vue
+++ b/pages/login/login/index.vue
@@ -331,27 +331,27 @@ export default {
// 登录
login() {
- const res = {
- data: {
- // token:
- // "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL3JvbGUiOiJBZG1pbiIsIlVzZXJJbmZvIjoie1wiSWRcIjpcImI1MjY5ZWQxLTViYzgtMTFmMC05YTg5LTAwMTYzZTJkMmRkM1wiLFwiTmFtZVwiOlwi6J-56ICB5biIXCIsXCJQaG9uZU51bWJlclwiOlwiMTM1ODg4ODg4ODhcIixcIlNleFwiOjEsXCJBY2NvdW50VHlwZVwiOjJ9IiwibmJmIjoxNzUyMTE4ODU0LCJleHAiOjE3NTIyMDUyNTR9.aF0Q-X3ebIld7RIKMMW68tXjmmR4OO08dXLAtHWuuwc",
- token:
- "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL3JvbGUiOiJVc2VyIiwiVXNlckluZm8iOiJ7XCJJZFwiOlwiNTljNzIxNmMtMTRhZS00NmRmLTkxYTItNGYzMjFlZjM2YjQ5XCIsXCJOYW1lXCI6XCIxNzMzNTM3NDg4N1wiLFwiUGhvbmVOdW1iZXJcIjpcIjE3MzM1Mzc0ODg3XCIsXCJTZXhcIjoyLFwiQWNjb3VudFR5cGVcIjowfSIsIm5iZiI6MTc1MjExMDcwOSwiZXhwIjoxNzUyMTk3MTA5fQ.VDv2KjGq3s3BbZxZjB3P-BaeDU_1vIdqFEWGGvdpIxU",
- },
- };
+ // const res = {
+ // data: {
+ // // token:
+ // // "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL3JvbGUiOiJBZG1pbiIsIlVzZXJJbmZvIjoie1wiSWRcIjpcImI1MjY5ZWQxLTViYzgtMTFmMC05YTg5LTAwMTYzZTJkMmRkM1wiLFwiTmFtZVwiOlwi6J-56ICB5biIXCIsXCJQaG9uZU51bWJlclwiOlwiMTM1ODg4ODg4ODhcIixcIlNleFwiOjEsXCJBY2NvdW50VHlwZVwiOjJ9IiwibmJmIjoxNzUyMTE4ODU0LCJleHAiOjE3NTIyMDUyNTR9.aF0Q-X3ebIld7RIKMMW68tXjmmR4OO08dXLAtHWuuwc",
+ // token:
+ // "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL3JvbGUiOiJVc2VyIiwiVXNlckluZm8iOiJ7XCJJZFwiOlwiNTljNzIxNmMtMTRhZS00NmRmLTkxYTItNGYzMjFlZjM2YjQ5XCIsXCJOYW1lXCI6XCIxNzMzNTM3NDg4N1wiLFwiUGhvbmVOdW1iZXJcIjpcIjE3MzM1Mzc0ODg3XCIsXCJTZXhcIjoyLFwiQWNjb3VudFR5cGVcIjowfSIsIm5iZiI6MTc1MjExMDcwOSwiZXhwIjoxNzUyMTk3MTA5fQ.VDv2KjGq3s3BbZxZjB3P-BaeDU_1vIdqFEWGGvdpIxU",
+ // },
+ // };
- const token = res.data.token;
- // 解析获取用户信息
- const userInfo = getUserInfoFromJWT(token);
- // 保存登录后得到的用户数据
- this.$u.vuex("vuex_token", token);
- this.$u.vuex("vuex_user", userInfo);
+ // const token = res.data.token;
+ // // 解析获取用户信息
+ // const userInfo = getUserInfoFromJWT(token);
+ // // 保存登录后得到的用户数据
+ // this.$u.vuex("vuex_token", token);
+ // this.$u.vuex("vuex_user", userInfo);
- // 跳转至首页
- uni.reLaunch({
- url: "/pages/home/index/index",
- });
- return;
+ // // 跳转至首页
+ // uni.reLaunch({
+ // url: "/pages/home/index/index",
+ // });
+ // return;
// 校验手机号
if (!this.validatePhone()) {
diff --git a/static/common/js/config.js b/static/common/js/config.js
index 200f1db..2e60798 100644
--- a/static/common/js/config.js
+++ b/static/common/js/config.js
@@ -14,5 +14,5 @@ export default {
'/pages/login/recognitionResult/recognitionFailed'
],
//登录页
- loginPage:"/pages/login/login/login"
+ loginPage:"/pages/login/login/index"
}
\ No newline at end of file
diff --git a/static/common/js/router.js b/static/common/js/router.js
index 31ee8d1..8e1bd25 100644
--- a/static/common/js/router.js
+++ b/static/common/js/router.js
@@ -1,56 +1,58 @@
-import config from "./config.js"
-const initApp = function(vm) {
- /**
- * 页面跳转拦截器
- */
- let that = vm;
- let list = ["navigateTo", "redirectTo", "reLaunch", "switchTab"];
- list.forEach(item => { //用遍历的方式分别为,uni.navigateTo,uni.redirectTo,uni.reLaunch,uni.switchTab这4个路由方法添加拦截器
- uni.addInterceptor(item, {
- invoke(e) { // 调用前拦截
- //获取用户的token
- // console.log(e)
- const token = that.vuex_token,
- //获取要跳转的页面路径(url去掉"?"和"?"后的参数)
- url = e.url.split('?')[0];
- let notNeed = config.whiteList.includes(url)
- // 如果在whiteList里面就不需要登录
- // console.log(notNeed)
+import config from "./config.js";
+const initApp = function (vm) {
+ /**
+ * 页面跳转拦截器
+ */
+ let that = vm;
+ let list = ["navigateTo", "redirectTo", "reLaunch", "switchTab"];
+ list.forEach((item) => {
+ //用遍历的方式分别为,uni.navigateTo,uni.redirectTo,uni.reLaunch,uni.switchTab这4个路由方法添加拦截器
+ uni.addInterceptor(item, {
+ invoke(e) {
+ // 调用前拦截
+ //获取用户的token
+ // console.log(e)
+ const token = that.vuex_token,
+ //获取要跳转的页面路径(url去掉"?"和"?"后的参数)
+ url = e.url.split("?")[0];
+ let notNeed = config.whiteList.includes(url);
+ // 如果在whiteList里面就不需要登录
+ // console.log(notNeed)
- if (notNeed) {
- return e
- } else {
- //需要登录
- if (token == '') {
- // uni.showToast({
- // title: '请先登录',
- // icon: 'none'
- // })
- // uni.navigateTo({
- // url: config.loginPage
- // })
- uni.navigateTo({
- url: '/'
- })
- return false
- } else {
- return e
- }
- }
-
- },
- fail(err) { // 失败回调拦截
- console.log(err)
- // if (Debug) {
- // uni.showModal({
- // content: JSON.stringify(err),
- // showCancel: false
- // });
- // }
- }
- })
- })
-}
+ if (notNeed) {
+ return e;
+ } else {
+ //需要登录
+ if (token == "") {
+ // uni.showToast({
+ // title: '请先登录',
+ // icon: 'none'
+ // })
+ // uni.navigateTo({
+ // url: config.loginPage
+ // })
+ uni.navigateTo({
+ url: "/pages/login/login/index",
+ });
+ return false;
+ } else {
+ return e;
+ }
+ }
+ },
+ fail(err) {
+ // 失败回调拦截
+ console.log(err);
+ // if (Debug) {
+ // uni.showModal({
+ // content: JSON.stringify(err),
+ // showCancel: false
+ // });
+ // }
+ },
+ });
+ });
+};
export default {
- initApp: initApp
-}
\ No newline at end of file
+ initApp: initApp,
+};