|
|
@ -1,52 +1,81 @@ |
|
|
<template> |
|
|
<template> |
|
|
<view class="titleContent"> |
|
|
<view class="titleContent"> |
|
|
<view class="left"> |
|
|
<view class="left"> |
|
|
<uni-icons @click="handleBack" type="back" size="23" color="#111"></uni-icons> |
|
|
|
|
|
|
|
|
<uni-icons |
|
|
|
|
|
@click="handleBack" |
|
|
|
|
|
type="back" |
|
|
|
|
|
size="23" |
|
|
|
|
|
color="#111" |
|
|
|
|
|
></uni-icons> |
|
|
</view> |
|
|
</view> |
|
|
<view class="title">深度探索</view> |
|
|
<view class="title">深度探索</view> |
|
|
<view class="right"> |
|
|
<view class="right"> |
|
|
<image class="notice" src="/static/deepExploration-images/notice.png" mode="aspectFill"></image> |
|
|
|
|
|
<image @click="handleHistory" class="history" src="/static/deepExploration-images/history.png" |
|
|
|
|
|
mode="aspectFill"></image> |
|
|
|
|
|
|
|
|
<image |
|
|
|
|
|
class="notice" |
|
|
|
|
|
src="/static/deepExploration-images/notice.png" |
|
|
|
|
|
mode="aspectFill" |
|
|
|
|
|
></image> |
|
|
|
|
|
<image |
|
|
|
|
|
@click="openHistoryDrawer" |
|
|
|
|
|
class="history" |
|
|
|
|
|
src="/static/deepExploration-images/history.png" |
|
|
|
|
|
mode="aspectFill" |
|
|
|
|
|
></image> |
|
|
</view> |
|
|
</view> |
|
|
</view> |
|
|
</view> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<view class="drawer-overlay" v-show="showHistoryDrawer"></view> |
|
|
<view class="drawer-overlay" v-show="showHistoryDrawer"></view> |
|
|
|
|
|
|
|
|
<view class="drawer-panel" v-show="showHistoryDrawer" @click.stop @touchmove.stop.prevent |
|
|
|
|
|
:style="{ transform: 'translateY(' + drawerOffsetY + 'px)' }"> |
|
|
|
|
|
|
|
|
<view |
|
|
|
|
|
class="drawer-panel" |
|
|
|
|
|
v-show="showHistoryDrawer" |
|
|
|
|
|
@click.stop |
|
|
|
|
|
@touchmove.stop.prevent |
|
|
|
|
|
:style="{ transform: 'translateY(' + drawerOffsetY + 'px)' }" |
|
|
|
|
|
> |
|
|
<view class="drawer-header"> |
|
|
<view class="drawer-header"> |
|
|
<text class="drawer-title">历史对话</text> |
|
|
<text class="drawer-title">历史对话</text> |
|
|
<view class="drawer-actions"> |
|
|
<view class="drawer-actions"> |
|
|
<view class="delete-all-container"> |
|
|
<view class="delete-all-container"> |
|
|
<image class="delete-icon" src="/static/deepExploration-images/delete.png"></image> |
|
|
|
|
|
|
|
|
<image |
|
|
|
|
|
class="delete-icon" |
|
|
|
|
|
src="/static/icons/Group_48095481.svg" |
|
|
|
|
|
></image> |
|
|
<text class="delete-all" @click="clearAllHistory">删除全部</text> |
|
|
<text class="delete-all" @click="clearAllHistory">删除全部</text> |
|
|
</view> |
|
|
</view> |
|
|
<view class="drawer-close" @click="closeHistoryDrawer"> |
|
|
|
|
|
<image src="/static/deepExploration-images/close.png" mode="aspectFill"></image> |
|
|
|
|
|
</view> |
|
|
|
|
|
|
|
|
<view class="drawer-close" @click="onDrawerBackClick" |
|
|
|
|
|
><text class="drawer-close-icon"></text |
|
|
|
|
|
></view> |
|
|
</view> |
|
|
</view> |
|
|
</view> |
|
|
</view> |
|
|
<scroll-view scroll-y="true" class="drawer-content"> |
|
|
<scroll-view scroll-y="true" class="drawer-content"> |
|
|
<view class="drawer-inner"> |
|
|
<view class="drawer-inner"> |
|
|
<view v-if="historyList.length === 0" class="empty-history"> |
|
|
|
|
|
|
|
|
<view v-if="groupedHistory.length === 0" class="empty-history"> |
|
|
<text>暂无历史记录</text> |
|
|
<text>暂无历史记录</text> |
|
|
</view> |
|
|
</view> |
|
|
<view v-for="(section, sIdx) in historyList" :key="sIdx" class="history-section"> |
|
|
|
|
|
|
|
|
<view |
|
|
|
|
|
v-for="(section, sIdx) in groupedHistory" |
|
|
|
|
|
:key="sIdx" |
|
|
|
|
|
class="history-section" |
|
|
|
|
|
> |
|
|
<text class="section-title">{{ section.title }}</text> |
|
|
<text class="section-title">{{ section.title }}</text> |
|
|
<view v-for="(item, idx) in section.items" :key="idx" class="history-item"> |
|
|
|
|
|
|
|
|
<view |
|
|
|
|
|
v-for="(item, idx) in section.items" |
|
|
|
|
|
:key="idx" |
|
|
|
|
|
class="history-item" |
|
|
|
|
|
> |
|
|
<view class="history-left"> |
|
|
<view class="history-left"> |
|
|
<view class="flag-circle"> |
|
|
|
|
|
<image :src="item.icon" mode="aspectFill"></image> |
|
|
|
|
|
</view> |
|
|
|
|
|
|
|
|
<view class="flag-circle" |
|
|
|
|
|
><text class="flag-emoji">🇺🇸</text></view |
|
|
|
|
|
> |
|
|
</view> |
|
|
</view> |
|
|
<view class="history-main" @click="itemClick(item)"> |
|
|
<view class="history-main" @click="itemClick(item)"> |
|
|
<text class="history-query">{{ item.stockName }}</text> |
|
|
<text class="history-query">{{ item.stockName }}</text> |
|
|
<text class="history-query">({{ item.stockCode }})</text> |
|
|
<text class="history-query">({{ item.stockCode }})</text> |
|
|
</view> |
|
|
</view> |
|
|
<text class="history-time">{{ item.createdTime }}</text> |
|
|
|
|
|
|
|
|
<text class="history-time">{{ |
|
|
|
|
|
formatTimeForHistory(item.createdTime) |
|
|
|
|
|
}}</text> |
|
|
</view> |
|
|
</view> |
|
|
</view> |
|
|
</view> |
|
|
</view> |
|
|
</view> |
|
|
@ -55,45 +84,63 @@ |
|
|
</template> |
|
|
</template> |
|
|
|
|
|
|
|
|
<script setup> |
|
|
<script setup> |
|
|
import { |
|
|
|
|
|
ref, |
|
|
|
|
|
onMounted |
|
|
|
|
|
} from 'vue' |
|
|
|
|
|
|
|
|
import { RecordListApi } from "../api/deepExploration/deepExploration"; |
|
|
|
|
|
import { ref, onMounted, computed } from "vue"; |
|
|
|
|
|
|
|
|
const props = defineProps({ |
|
|
const props = defineProps({ |
|
|
name: { |
|
|
name: { |
|
|
type: String, |
|
|
type: String, |
|
|
default: '' |
|
|
|
|
|
} |
|
|
|
|
|
}) |
|
|
|
|
|
const showHistoryDrawer = ref(false) |
|
|
|
|
|
|
|
|
default: "", |
|
|
|
|
|
}, |
|
|
|
|
|
}); |
|
|
|
|
|
const showHistoryDrawer = ref(false); |
|
|
const drawerOffsetY = ref(0); |
|
|
const drawerOffsetY = ref(0); |
|
|
const handleHistory = () => { |
|
|
|
|
|
showHistoryDrawer.value = true |
|
|
|
|
|
|
|
|
// const handleHistory = () => { |
|
|
|
|
|
// showHistoryDrawer.value = true; |
|
|
|
|
|
// }; |
|
|
|
|
|
|
|
|
|
|
|
// 历史记录 |
|
|
|
|
|
const openHistoryDrawer = async () => { |
|
|
|
|
|
const res = await RecordListApi({ |
|
|
|
|
|
model: 1, |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
if (res.code === 200) { |
|
|
|
|
|
historyList.value = res.data; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
const clearAllHistory = () => { |
|
|
|
|
|
uni.setStorageSync("search_history", []); |
|
|
|
|
|
|
|
|
console.log("historyList.value", historyList.value); |
|
|
|
|
|
|
|
|
|
|
|
const hideDistance = uni.upx2px(900); |
|
|
|
|
|
drawerOffsetY.value = hideDistance; |
|
|
|
|
|
showHistoryDrawer.value = true; |
|
|
|
|
|
setTimeout(() => { |
|
|
|
|
|
drawerOffsetY.value = 0; |
|
|
|
|
|
}, 10); |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
const clearAllHistory = () => { |
|
|
|
|
|
searchHistory.value = []; |
|
|
|
|
|
|
|
|
|
|
|
// uni.setStorageSync("search_history", []); |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
//返回上一页 |
|
|
//返回上一页 |
|
|
const handleBack = () => { |
|
|
const handleBack = () => { |
|
|
uni.navigateBack() |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
uni.navigateBack(); |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
const closeHistoryDrawer = () => { |
|
|
const closeHistoryDrawer = () => { |
|
|
showHistoryDrawer.value = false; |
|
|
showHistoryDrawer.value = false; |
|
|
}; |
|
|
}; |
|
|
// const onDrawerBackClick = () => { |
|
|
|
|
|
// const hideDistance = uni.upx2px(900); |
|
|
|
|
|
// drawerOffsetY.value = hideDistance; |
|
|
|
|
|
// setTimeout(() => { |
|
|
|
|
|
// closeHistoryDrawer(); |
|
|
|
|
|
// drawerOffsetY.value = 0; |
|
|
|
|
|
// }, 180); |
|
|
|
|
|
// }; |
|
|
|
|
|
|
|
|
const onDrawerBackClick = () => { |
|
|
|
|
|
const hideDistance = uni.upx2px(900); |
|
|
|
|
|
drawerOffsetY.value = hideDistance; |
|
|
|
|
|
setTimeout(() => { |
|
|
|
|
|
closeHistoryDrawer(); |
|
|
|
|
|
drawerOffsetY.value = 0; |
|
|
|
|
|
}, 180); |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
// 历史记录详情 |
|
|
// 历史记录详情 |
|
|
async function itemClick(item) { |
|
|
async function itemClick(item) { |
|
|
@ -102,7 +149,6 @@ |
|
|
// parentId: item.parentId, |
|
|
// parentId: item.parentId, |
|
|
// model: 5, |
|
|
// model: 5, |
|
|
// }); |
|
|
// }); |
|
|
|
|
|
|
|
|
// if (res.code == 200) { |
|
|
// if (res.code == 200) { |
|
|
// const message = res.data.wokeFlowData.One.markdown; |
|
|
// const message = res.data.wokeFlowData.One.markdown; |
|
|
// messages.value = []; |
|
|
// messages.value = []; |
|
|
@ -115,37 +161,122 @@ |
|
|
// messages.value.push(botMsg); |
|
|
// messages.value.push(botMsg); |
|
|
// } |
|
|
// } |
|
|
} |
|
|
} |
|
|
const historyList = ref([{ |
|
|
|
|
|
|
|
|
const historyList = ref([ |
|
|
|
|
|
{ |
|
|
title: "今天", // 分组标题(如“今天”“昨天”“更早”) |
|
|
title: "今天", // 分组标题(如“今天”“昨天”“更早”) |
|
|
items: [{ |
|
|
|
|
|
|
|
|
|
|
|
icon: '/static/deepExploration-images/Americle.png', |
|
|
|
|
|
|
|
|
items: [ |
|
|
|
|
|
{ |
|
|
|
|
|
icon: "/static/deepExploration-images/Americle.png", |
|
|
stockName: "TechCore", // 股票名称 |
|
|
stockName: "TechCore", // 股票名称 |
|
|
stockCode: "600001", // 6位数字股票代码 |
|
|
stockCode: "600001", // 6位数字股票代码 |
|
|
createdTime: "14:35" // 时间格式(时:分) |
|
|
|
|
|
|
|
|
createdTime: "14:35", // 时间格式(时:分) |
|
|
}, |
|
|
}, |
|
|
{ |
|
|
{ |
|
|
icon: '/static/deepExploration-images/Americle.png', |
|
|
|
|
|
|
|
|
icon: "/static/deepExploration-images/Americle.png", |
|
|
stockName: "MediaLink", |
|
|
stockName: "MediaLink", |
|
|
stockCode: "600002", |
|
|
stockCode: "600002", |
|
|
createdTime: "10:12" |
|
|
|
|
|
} |
|
|
|
|
|
] |
|
|
|
|
|
|
|
|
createdTime: "10:12", |
|
|
|
|
|
}, |
|
|
|
|
|
], |
|
|
}, |
|
|
}, |
|
|
{ |
|
|
{ |
|
|
title: "昨天", |
|
|
title: "昨天", |
|
|
items: [{ |
|
|
|
|
|
icon: '/static/deepExploration-images/Americle.png', |
|
|
|
|
|
|
|
|
items: [ |
|
|
|
|
|
{ |
|
|
|
|
|
icon: "/static/deepExploration-images/Americle.png", |
|
|
stockName: "FinServ", |
|
|
stockName: "FinServ", |
|
|
stockCode: "600003", |
|
|
stockCode: "600003", |
|
|
createdTime: "09:48" |
|
|
|
|
|
}] |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
createdTime: "09:48", |
|
|
|
|
|
}, |
|
|
|
|
|
], |
|
|
|
|
|
}, |
|
|
]); |
|
|
]); |
|
|
|
|
|
|
|
|
onMounted(() => { |
|
|
|
|
|
|
|
|
// 为历史记录格式化时间:YYYY-MM-DD HH:mm |
|
|
|
|
|
const formatTimeForHistory = (timeString) => { |
|
|
|
|
|
// 假设 timeString 格式为 "YYYY-MM-DD HH:mm:ss" |
|
|
|
|
|
const parts = timeString.split(" "); |
|
|
|
|
|
if (parts.length >= 2) { |
|
|
|
|
|
const datePart = parts[0]; |
|
|
|
|
|
const timePart = parts[1]; |
|
|
|
|
|
const timeParts = timePart.split(":"); |
|
|
|
|
|
if (timeParts.length >= 2) { |
|
|
|
|
|
return `${datePart} ${timeParts[0]}:${timeParts[1]}`; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
return timeString; |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
}) |
|
|
|
|
|
|
|
|
// 历史分组(今天/昨天/近一周/按月) |
|
|
|
|
|
const groupedHistory = computed(() => { |
|
|
|
|
|
const sections = []; |
|
|
|
|
|
|
|
|
|
|
|
// 从缓存获取今天日期,如果没有则使用当前日期 |
|
|
|
|
|
const now = new Date(); |
|
|
|
|
|
|
|
|
|
|
|
const startOfDay = (d) => |
|
|
|
|
|
new Date(d.getFullYear(), d.getMonth(), d.getDate()); |
|
|
|
|
|
const isSameDay = (a, b) => |
|
|
|
|
|
startOfDay(a).getTime() === startOfDay(b).getTime(); |
|
|
|
|
|
const isYesterday = (d) => { |
|
|
|
|
|
const y = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 1); |
|
|
|
|
|
return isSameDay(d, y); |
|
|
|
|
|
}; |
|
|
|
|
|
const isToday = (d) => isSameDay(d, now); |
|
|
|
|
|
const withinLast7Days = (d) => { |
|
|
|
|
|
const seven = new Date( |
|
|
|
|
|
now.getFullYear(), |
|
|
|
|
|
now.getMonth(), |
|
|
|
|
|
now.getDate() - 7 |
|
|
|
|
|
); |
|
|
|
|
|
return d >= seven && !isToday(d) && !isYesterday(d); |
|
|
|
|
|
}; |
|
|
|
|
|
const monthLabel = (d) => `${d.getMonth() + 1}月`; |
|
|
|
|
|
|
|
|
|
|
|
const today = []; |
|
|
|
|
|
const yesterday = []; |
|
|
|
|
|
const last7 = []; |
|
|
|
|
|
const byMonth = new Map(); |
|
|
|
|
|
|
|
|
|
|
|
// 使用 historyList.value 替代 searchHistory.value |
|
|
|
|
|
historyList.value.forEach((item) => { |
|
|
|
|
|
// 根据你的数据结构,使用 createdTime 字段 |
|
|
|
|
|
const dt = new Date(item.createdTime); |
|
|
|
|
|
if (isToday(dt)) { |
|
|
|
|
|
today.push(item); |
|
|
|
|
|
} else if (isYesterday(dt)) { |
|
|
|
|
|
yesterday.push(item); |
|
|
|
|
|
} else if (withinLast7Days(dt)) { |
|
|
|
|
|
last7.push(item); |
|
|
|
|
|
} else { |
|
|
|
|
|
const year = dt.getFullYear(); |
|
|
|
|
|
const month = dt.getMonth() + 1; |
|
|
|
|
|
const key = `${year}-${month}`; |
|
|
|
|
|
if (!byMonth.has(key)) |
|
|
|
|
|
byMonth.set(key, { |
|
|
|
|
|
title: `${year}年${month}月`, |
|
|
|
|
|
year, |
|
|
|
|
|
month, |
|
|
|
|
|
items: [], |
|
|
|
|
|
}); |
|
|
|
|
|
byMonth.get(key).items.push(item); |
|
|
|
|
|
} |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
if (today.length) sections.push({ title: "今天", items: today }); |
|
|
|
|
|
if (yesterday.length) sections.push({ title: "昨天", items: yesterday }); |
|
|
|
|
|
if (last7.length) sections.push({ title: "近一周", items: last7 }); |
|
|
|
|
|
|
|
|
|
|
|
const monthSections = Array.from(byMonth.values()).sort((a, b) => { |
|
|
|
|
|
if (a.year !== b.year) return b.year - a.year; |
|
|
|
|
|
return b.month - a.month; // 月份倒序,如 10月 在 9月 之前 |
|
|
|
|
|
}); |
|
|
|
|
|
sections.push(...monthSections); |
|
|
|
|
|
|
|
|
|
|
|
return sections; |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
onMounted(() => {}); |
|
|
</script> |
|
|
</script> |
|
|
|
|
|
|
|
|
<style scoped lang="scss"> |
|
|
<style scoped lang="scss"> |
|
|
@ -177,7 +308,6 @@ |
|
|
font-style: normal; |
|
|
font-style: normal; |
|
|
font-weight: 400; |
|
|
font-weight: 400; |
|
|
line-height: 25px; |
|
|
line-height: 25px; |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
.right { |
|
|
.right { |
|
|
@ -199,8 +329,6 @@ |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* 搜索历史侧拉框样式 */ |
|
|
/* 搜索历史侧拉框样式 */ |
|
|
.drawer-overlay { |
|
|
.drawer-overlay { |
|
|
position: fixed; |
|
|
position: fixed; |
|
|
@ -272,6 +400,7 @@ |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
.drawer-close { |
|
|
.drawer-close { |
|
|
|
|
|
background: url("../static/icons/关闭2.svg"); |
|
|
width: 48rpx; |
|
|
width: 48rpx; |
|
|
height: 48rpx; |
|
|
height: 48rpx; |
|
|
border-radius: 24rpx; |
|
|
border-radius: 24rpx; |
|
|
@ -287,7 +416,6 @@ |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.drawer-header { |
|
|
.drawer-header { |
|
|
display: flex; |
|
|
display: flex; |
|
|
align-items: center; |
|
|
align-items: center; |
|
|
@ -361,7 +489,6 @@ |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.history-main { |
|
|
.history-main { |
|
|
flex: 1; |
|
|
flex: 1; |
|
|
} |
|
|
} |
|
|
|