This commit is contained in:
2025-10-01 17:12:12 +08:00
parent 8e32bd2463
commit 950744adca
2 changed files with 184 additions and 3 deletions

View File

@@ -8,4 +8,12 @@ export function executeInstruction(data) {
})
}
export function getHistory(type, limit) {
return request({
url: '/jarvis/instruction/history',
method: 'get',
params: { type, limit }
})
}

View File

@@ -35,12 +35,52 @@
<el-button size="mini" type="primary" @click="copyAll">复制全部</el-button>
</div>
</div>
<el-divider>历史消息记录</el-divider>
<div class="history-container">
<div class="history-column">
<div class="history-header">
<span>历史请求最近 {{ historyLimit }} </span>
<el-button size="mini" type="primary" icon="el-icon-refresh" @click="loadHistory" :loading="historyLoading">刷新</el-button>
</div>
<div class="history-content">
<div v-if="requestHistory.length === 0" class="empty-history">
<el-empty description="暂无历史请求" :image-size="80" />
</div>
<div v-else class="history-list">
<div v-for="(item, idx) in requestHistory" :key="'req-' + idx" class="history-item">
<div class="history-time">{{ extractTime(item) }}</div>
<div class="history-text">{{ extractMessage(item) }}</div>
</div>
</div>
</div>
</div>
<div class="history-column">
<div class="history-header">
<span>历史响应最近 {{ historyLimit }} </span>
<el-button size="mini" type="success" @click="copyHistory('response')">复制全部</el-button>
</div>
<div class="history-content">
<div v-if="responseHistory.length === 0" class="empty-history">
<el-empty description="暂无历史响应" :image-size="80" />
</div>
<div v-else class="history-list">
<div v-for="(item, idx) in responseHistory" :key="'res-' + idx" class="history-item">
<div class="history-time">{{ extractTime(item) }}</div>
<div class="history-text">{{ extractMessage(item) }}</div>
</div>
</div>
</div>
</div>
</div>
</el-card>
</div>
</template>
<script>
import { executeInstruction } from '@/api/system/instruction'
import { executeInstruction, getHistory } from '@/api/system/instruction'
export default {
name: 'JdInstruction',
@@ -48,9 +88,16 @@ export default {
return {
form: { command: '' },
loading: false,
resultList: []
resultList: [],
requestHistory: [],
responseHistory: [],
historyLoading: false,
historyLimit: 50
}
},
mounted() {
this.loadHistory()
},
methods: {
copyOne(text) {
if (!text) return
@@ -61,6 +108,15 @@ export default {
const text = this.resultList.join('\n\n')
this.doCopy(text)
},
copyHistory(type) {
const list = type === 'response' ? this.responseHistory : this.requestHistory
if (!list || list.length === 0) {
this.$modal.msgWarning('暂无历史记录')
return
}
const text = list.map(item => this.extractMessage(item)).join('\n\n')
this.doCopy(text)
},
doCopy(text) {
if (navigator.clipboard) {
navigator.clipboard.writeText(text).then(() => {
@@ -91,6 +147,8 @@ export default {
if (Array.isArray(data)) this.resultList = data
else if (typeof data === 'string') this.resultList = data ? [data] : []
else this.resultList = []
// 执行成功后刷新历史记录
this.loadHistory()
} else {
this.$modal.msgError(res && res.msg ? res.msg : '执行失败')
}
@@ -99,6 +157,34 @@ export default {
this.$modal.msgError('执行失败,请稍后重试')
})
},
loadHistory() {
this.historyLoading = true
Promise.all([
getHistory('request', this.historyLimit),
getHistory('response', this.historyLimit)
]).then(([reqRes, respRes]) => {
this.historyLoading = false
if (reqRes && reqRes.code === 200) {
this.requestHistory = reqRes.data || []
}
if (respRes && respRes.code === 200) {
this.responseHistory = respRes.data || []
}
}).catch(() => {
this.historyLoading = false
this.$modal.msgError('加载历史记录失败')
})
},
extractTime(item) {
if (!item) return ''
const idx = item.indexOf(' | ')
return idx > 0 ? item.substring(0, idx) : ''
},
extractMessage(item) {
if (!item) return ''
const idx = item.indexOf(' | ')
return idx > 0 ? item.substring(idx + 3) : item
},
fillTF() {
this.form.command = 'TF'
},
@@ -108,7 +194,6 @@ export default {
fillMan() {
this.form.command = '慢单'
},
clearAll() {
this.form.command = ''
this.resultList = []
@@ -121,6 +206,94 @@ export default {
.box-card { margin: 20px; }
.msg-block { margin-bottom: 12px; }
.msg-header { display: flex; align-items: center; justify-content: space-between; margin: 6px 0; }
/* 历史消息容器 */
.history-container {
display: flex;
gap: 20px;
margin-top: 20px;
}
.history-column {
flex: 1;
border: 1px solid #DCDFE6;
border-radius: 4px;
overflow: hidden;
}
.history-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 12px 16px;
background-color: #F5F7FA;
border-bottom: 1px solid #DCDFE6;
font-weight: 600;
color: #303133;
}
.history-content {
height: 500px;
overflow-y: auto;
background-color: #FFFFFF;
}
.empty-history {
display: flex;
align-items: center;
justify-content: center;
height: 100%;
}
.history-list {
padding: 10px;
}
.history-item {
padding: 10px 12px;
margin-bottom: 8px;
border-radius: 4px;
background-color: #F9FAFC;
border-left: 3px solid #409EFF;
transition: all 0.3s;
}
.history-item:hover {
background-color: #ECF5FF;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
.history-time {
font-size: 12px;
color: #909399;
margin-bottom: 4px;
}
.history-text {
font-size: 13px;
color: #303133;
line-height: 1.5;
white-space: pre-wrap;
word-break: break-all;
}
/* 滚动条美化 */
.history-content::-webkit-scrollbar {
width: 8px;
}
.history-content::-webkit-scrollbar-track {
background: #F5F7FA;
}
.history-content::-webkit-scrollbar-thumb {
background: #DCDFE6;
border-radius: 4px;
}
.history-content::-webkit-scrollbar-thumb:hover {
background: #C0C4CC;
}
</style>