'commit'
This commit is contained in:
28
static/css/app.css
Normal file
28
static/css/app.css
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
body{margin:0;font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;background:#050816;color:#e5e7eb;}
|
||||||
|
#app{display:flex;flex-direction:row;height:100vh;}
|
||||||
|
.left-panel{flex:3;padding:16px;box-sizing:border-box;display:flex;flex-direction:column;gap:12px;}
|
||||||
|
.right-panel{flex:2;padding:16px;box-sizing:border-box;border-left:1px solid #111827;background:#020617;}
|
||||||
|
.controls{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:4px;align-items:center;}
|
||||||
|
.controls input{padding:6px 8px;border-radius:4px;border:1px solid #374151;background:#020617;color:#e5e7eb;}
|
||||||
|
.controls button{padding:6px 12px;border-radius:4px;border:none;background:#2563eb;color:#f9fafb;cursor:pointer;}
|
||||||
|
.controls button:disabled{opacity:.5;cursor:not-allowed;}
|
||||||
|
.controls-spacer{flex:1;}
|
||||||
|
.station-list{flex:0 0 220px;border:1px solid #111827;border-radius:8px;background:#020617;overflow:hidden;display:flex;flex-direction:column;}
|
||||||
|
.station-list-header{padding:8px 12px;border-bottom:1px solid #111827;font-size:14px;background:#020617;}
|
||||||
|
.station-table{width:100%;border-collapse:collapse;font-size:13px;}
|
||||||
|
.station-table th,.station-table td{padding:6px 8px;border-bottom:1px solid #111827;}
|
||||||
|
.station-table th{background:#020617;color:#9ca3af;text-align:left;}
|
||||||
|
.station-row{cursor:pointer;}
|
||||||
|
.station-row:hover{background:#111827;}
|
||||||
|
.station-row.active{background:#1d283a;}
|
||||||
|
#chart{flex:1;border:1px solid #111827;border-radius:8px;background:#0b1120;}
|
||||||
|
.price-table{flex:0 0 260px;border:1px solid #111827;border-radius:8px;background:#020617;padding:8px;box-sizing:border-box;overflow:auto;}
|
||||||
|
.price-table-title{font-size:14px;margin-bottom:4px;}
|
||||||
|
.price-table-inner{width:100%;border-collapse:collapse;font-size:12px;}
|
||||||
|
.price-table-inner th,.price-table-inner td{padding:4px 6px;border-bottom:1px solid #111827;}
|
||||||
|
.price-table-inner th{background:#020617;color:#9ca3af;text-align:right;}
|
||||||
|
.price-table-inner th:first-child,.price-table-inner td:first-child{text-align:left;}
|
||||||
|
.ai-title{font-size:16px;margin-bottom:8px;}
|
||||||
|
.ai-box{height:calc(100% - 40px);border-radius:8px;border:1px solid #111827;background:#020617;padding:12px;box-sizing:border-box;white-space:pre-wrap;overflow:auto;font-size:14px;line-height:1.6;}
|
||||||
|
.label{font-size:14px;margin-right:8px;}
|
||||||
|
|
||||||
@@ -3,35 +3,7 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<title>驿来特价格分析大屏</title>
|
<title>驿来特价格分析大屏</title>
|
||||||
<style>
|
<link rel="stylesheet" href="css/app.css">
|
||||||
body{margin:0;font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;background:#050816;color:#e5e7eb;}
|
|
||||||
#app{display:flex;flex-direction:row;height:100vh;}
|
|
||||||
.left-panel{flex:3;padding:16px;box-sizing:border-box;display:flex;flex-direction:column;gap:12px;}
|
|
||||||
.right-panel{flex:2;padding:16px;box-sizing:border-box;border-left:1px solid #111827;background:#020617;}
|
|
||||||
.controls{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:4px;align-items:center;}
|
|
||||||
.controls input{padding:6px 8px;border-radius:4px;border:1px solid #374151;background:#020617;color:#e5e7eb;}
|
|
||||||
.controls button{padding:6px 12px;border-radius:4px;border:none;background:#2563eb;color:#f9fafb;cursor:pointer;}
|
|
||||||
.controls button:disabled{opacity:.5;cursor:not-allowed;}
|
|
||||||
.controls-spacer{flex:1;}
|
|
||||||
.station-list{flex:0 0 220px;border:1px solid #111827;border-radius:8px;background:#020617;overflow:hidden;display:flex;flex-direction:column;}
|
|
||||||
.station-list-header{padding:8px 12px;border-bottom:1px solid #111827;font-size:14px;background:#020617;}
|
|
||||||
.station-table{width:100%;border-collapse:collapse;font-size:13px;}
|
|
||||||
.station-table th,.station-table td{padding:6px 8px;border-bottom:1px solid #111827;}
|
|
||||||
.station-table th{background:#020617;color:#9ca3af;text-align:left;}
|
|
||||||
.station-row{cursor:pointer;}
|
|
||||||
.station-row:hover{background:#111827;}
|
|
||||||
.station-row.active{background:#1d283a;}
|
|
||||||
#chart{flex:1;border:1px solid #111827;border-radius:8px;background:#0b1120;}
|
|
||||||
.price-table{flex:0 0 260px;border:1px solid #111827;border-radius:8px;background:#020617;padding:8px;box-sizing:border-box;overflow:auto;}
|
|
||||||
.price-table-title{font-size:14px;margin-bottom:4px;}
|
|
||||||
.price-table-inner{width:100%;border-collapse:collapse;font-size:12px;}
|
|
||||||
.price-table-inner th,.price-table-inner td{padding:4px 6px;border-bottom:1px solid #111827;}
|
|
||||||
.price-table-inner th{background:#020617;color:#9ca3af;text-align:right;}
|
|
||||||
.price-table-inner th:first-child,.price-table-inner td:first-child{text-align:left;}
|
|
||||||
.ai-title{font-size:16px;margin-bottom:8px;}
|
|
||||||
.ai-box{height:calc(100% - 40px);border-radius:8px;border:1px solid #111827;background:#020617;padding:12px;box-sizing:border-box;white-space:pre-wrap;overflow:auto;font-size:14px;line-height:1.6;}
|
|
||||||
.label{font-size:14px;margin-right:8px;}
|
|
||||||
</style>
|
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="app">
|
<div id="app">
|
||||||
@@ -92,144 +64,9 @@ body{margin:0;font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",
|
|||||||
<div class="ai-box">{{ aiText || placeholder }}</div>
|
<div class="ai-box">{{ aiText || placeholder }}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<script src="https://unpkg.com/vue@3/dist/vue.global.prod.js"></script>
|
<script src="js/vue.global.js"></script>
|
||||||
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
|
<script src="js/axios.min.js"></script>
|
||||||
<script src="https://cdn.jsdelivr.net/npm/echarts@5/dist/echarts.min.js"></script>
|
<script src="js/echarts.min.js"></script>
|
||||||
<script>
|
<script src="js/app.js"></script>
|
||||||
const {createApp,onMounted,ref} = Vue
|
|
||||||
createApp({
|
|
||||||
setup(){
|
|
||||||
const apiBase = ref(window.location.origin || "http://localhost:8000")
|
|
||||||
const stationHash = ref("")
|
|
||||||
const aiText = ref("")
|
|
||||||
const placeholder = ref("在左侧列表中选择驿来特场站,点击“查看价差”加载24小时分时电价与竞品对比,再点击“AI价差分析”获取模型给出的策略建议。")
|
|
||||||
const loading = ref(false)
|
|
||||||
const aiLoading = ref(false)
|
|
||||||
const stations = ref([])
|
|
||||||
const searchKeyword = ref("")
|
|
||||||
const selectedStation = ref(null)
|
|
||||||
const priceTableColumns = ref([])
|
|
||||||
const priceTableRows = ref([])
|
|
||||||
let chartInstance = null
|
|
||||||
let es = null
|
|
||||||
const initChart = () => {
|
|
||||||
const dom = document.getElementById("chart")
|
|
||||||
if (dom && !chartInstance) {
|
|
||||||
chartInstance = echarts.init(dom)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const loadStations = async () => {
|
|
||||||
try{
|
|
||||||
const url = apiBase.value + "/api/ylt/stations"
|
|
||||||
const params = searchKeyword.value ? {params:{q:searchKeyword.value}} : {}
|
|
||||||
const res = await axios.get(url,params)
|
|
||||||
stations.value = Array.isArray(res.data) ? res.data : []
|
|
||||||
if (!selectedStation.value && stations.value.length > 0) {
|
|
||||||
selectStation(stations.value[0])
|
|
||||||
}
|
|
||||||
}catch(e){
|
|
||||||
console.error(e)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const buildPriceTable = data => {
|
|
||||||
const cols = []
|
|
||||||
cols.push("时段")
|
|
||||||
cols.push("驿来特")
|
|
||||||
data.competitors.forEach(c => {
|
|
||||||
cols.push(c.operator)
|
|
||||||
})
|
|
||||||
priceTableColumns.value = cols
|
|
||||||
const rows = []
|
|
||||||
for (let i = 0; i < data.hours.length; i++) {
|
|
||||||
const row = []
|
|
||||||
row.push(data.hours[i] + ":00")
|
|
||||||
row.push(data.ylt.series[i])
|
|
||||||
data.competitors.forEach(c => {
|
|
||||||
row.push(c.series[i])
|
|
||||||
})
|
|
||||||
rows.push(row)
|
|
||||||
}
|
|
||||||
priceTableRows.value = rows
|
|
||||||
}
|
|
||||||
const loadComparison = async () => {
|
|
||||||
if (!stationHash.value) return
|
|
||||||
loading.value = true
|
|
||||||
try{
|
|
||||||
const url = apiBase.value + "/api/ylt/pricing/comparison/" + stationHash.value
|
|
||||||
const res = await axios.get(url)
|
|
||||||
const data = res.data
|
|
||||||
const hours = data.hours.map(h => h + ":00")
|
|
||||||
const series = []
|
|
||||||
series.push({
|
|
||||||
name:"驿来特",
|
|
||||||
type:"line",
|
|
||||||
smooth:true,
|
|
||||||
data:data.ylt.series
|
|
||||||
})
|
|
||||||
data.competitors.forEach(c=>{
|
|
||||||
series.push({
|
|
||||||
name:c.operator,
|
|
||||||
type:"line",
|
|
||||||
smooth:true,
|
|
||||||
data:c.series
|
|
||||||
})
|
|
||||||
})
|
|
||||||
buildPriceTable(data)
|
|
||||||
const option = {
|
|
||||||
tooltip:{trigger:"axis"},
|
|
||||||
legend:{data:series.map(s=>s.name),textStyle:{color:"#e5e7eb"}},
|
|
||||||
xAxis:{type:"category",data:hours,axisLine:{lineStyle:{color:"#4b5563"}},axisLabel:{color:"#9ca3af"}},
|
|
||||||
yAxis:{type:"value",name:"元/度",axisLine:{lineStyle:{color:"#4b5563"}},axisLabel:{color:"#9ca3af"},splitLine:{lineStyle:{color:"#111827"}}},
|
|
||||||
grid:{left:40,right:20,top:30,bottom:30},
|
|
||||||
series:series
|
|
||||||
}
|
|
||||||
initChart()
|
|
||||||
chartInstance.setOption(option)
|
|
||||||
}finally{
|
|
||||||
loading.value = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const selectStation = s => {
|
|
||||||
selectedStation.value = s
|
|
||||||
stationHash.value = s.station_hash
|
|
||||||
loadComparison()
|
|
||||||
}
|
|
||||||
const startAiStream = () => {
|
|
||||||
if (!selectedStation.value || !stationHash.value) return
|
|
||||||
if (es) {
|
|
||||||
es.close()
|
|
||||||
es = null
|
|
||||||
}
|
|
||||||
aiText.value = ""
|
|
||||||
aiLoading.value = true
|
|
||||||
const url = apiBase.value + "/api/ylt/pricing/comparison/" + stationHash.value + "/sse"
|
|
||||||
es = new EventSource(url)
|
|
||||||
es.onmessage = ev => {
|
|
||||||
aiText.value += ev.data
|
|
||||||
}
|
|
||||||
es.onerror = () => {
|
|
||||||
aiLoading.value = false
|
|
||||||
if (es) {
|
|
||||||
es.close()
|
|
||||||
es = null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
onMounted(()=>{
|
|
||||||
initChart()
|
|
||||||
loadStations()
|
|
||||||
})
|
|
||||||
const formatCell = v => {
|
|
||||||
if (v === null || v === undefined || v === "") return "-"
|
|
||||||
if (typeof v === "number") {
|
|
||||||
if (Number.isNaN(v)) return "-"
|
|
||||||
return v.toFixed(2)
|
|
||||||
}
|
|
||||||
return v
|
|
||||||
}
|
|
||||||
return {apiBase,stationHash,aiText,placeholder,loading,aiLoading,stations,searchKeyword,selectedStation,priceTableColumns,priceTableRows,loadStations,loadComparison,selectStation,startAiStream,formatCell}
|
|
||||||
}
|
|
||||||
}).mount("#app")
|
|
||||||
</script>
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
61
static/js/ai-resource-workshop.js
Normal file
61
static/js/ai-resource-workshop.js
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
// AI资源工坊页面交互逻辑
|
||||||
|
layui.use(['form', 'laydate'], function() {
|
||||||
|
var form = layui.form;
|
||||||
|
var laydate = layui.laydate;
|
||||||
|
|
||||||
|
// 初始化表单
|
||||||
|
form.render();
|
||||||
|
|
||||||
|
// 生成按钮点击事件
|
||||||
|
document.querySelector('.generate-btn').addEventListener('click', function() {
|
||||||
|
// 显示加载动画
|
||||||
|
this.innerHTML = '<i class="fas fa-spinner fa-spin"></i> 生成中...';
|
||||||
|
this.disabled = true;
|
||||||
|
|
||||||
|
// 模拟生成过程
|
||||||
|
setTimeout(() => {
|
||||||
|
// 生成成功后跳转或显示结果
|
||||||
|
window.location.href = 'resource-preview.html';
|
||||||
|
}, 2000);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AI资源工坊页面专属脚本
|
||||||
|
*/
|
||||||
|
|
||||||
|
document.addEventListener('DOMContentLoaded', function() {
|
||||||
|
// 资源搜索功能
|
||||||
|
const searchInput = document.querySelector('.search-box input');
|
||||||
|
const searchBtn = document.querySelector('.search-box .search-btn');
|
||||||
|
|
||||||
|
if (searchBtn && searchInput) {
|
||||||
|
searchBtn.addEventListener('click', performSearch);
|
||||||
|
searchInput.addEventListener('keypress', function(e) {
|
||||||
|
if (e.key === 'Enter') performSearch();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 资源排序功能
|
||||||
|
const sortSelect = document.querySelector('.resource-filters select');
|
||||||
|
if (sortSelect) {
|
||||||
|
sortSelect.addEventListener('change', function() {
|
||||||
|
alert(`已切换排序方式为: ${this.options[this.selectedIndex].text}`);
|
||||||
|
// 在实际项目中,这里会发起AJAX请求获取排序后的资源
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 执行搜索功能
|
||||||
|
*/
|
||||||
|
function performSearch() {
|
||||||
|
const keyword = searchInput.value.trim();
|
||||||
|
if (keyword) {
|
||||||
|
alert(`搜索资源: ${keyword}`);
|
||||||
|
// 在实际项目中,这里会发起AJAX请求获取搜索结果
|
||||||
|
} else {
|
||||||
|
alert('请输入搜索关键词');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
135
static/js/app.js
Normal file
135
static/js/app.js
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
const {createApp,onMounted,ref} = Vue
|
||||||
|
createApp({
|
||||||
|
setup(){
|
||||||
|
const apiBase = ref(window.location.origin || "http://localhost:8000")
|
||||||
|
const stationHash = ref("")
|
||||||
|
const aiText = ref("")
|
||||||
|
const placeholder = ref("在左侧列表中选择驿来特场站,点击“查看价差”加载24小时分时电价与竞品对比,再点击“AI价差分析”获取模型给出的策略建议。")
|
||||||
|
const loading = ref(false)
|
||||||
|
const aiLoading = ref(false)
|
||||||
|
const stations = ref([])
|
||||||
|
const searchKeyword = ref("")
|
||||||
|
const selectedStation = ref(null)
|
||||||
|
const priceTableColumns = ref([])
|
||||||
|
const priceTableRows = ref([])
|
||||||
|
let chartInstance = null
|
||||||
|
let es = null
|
||||||
|
const initChart = () => {
|
||||||
|
const dom = document.getElementById("chart")
|
||||||
|
if (dom && !chartInstance) {
|
||||||
|
chartInstance = echarts.init(dom)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const loadStations = async () => {
|
||||||
|
try{
|
||||||
|
const url = apiBase.value + "/api/ylt/stations"
|
||||||
|
const params = searchKeyword.value ? {params:{q:searchKeyword.value}} : {}
|
||||||
|
const res = await axios.get(url,params)
|
||||||
|
stations.value = Array.isArray(res.data) ? res.data : []
|
||||||
|
if (!selectedStation.value && stations.value.length > 0) {
|
||||||
|
selectStation(stations.value[0])
|
||||||
|
}
|
||||||
|
}catch(e){
|
||||||
|
console.error(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const buildPriceTable = data => {
|
||||||
|
const cols = []
|
||||||
|
cols.push("时段")
|
||||||
|
cols.push("驿来特")
|
||||||
|
data.competitors.forEach(c => {
|
||||||
|
cols.push(c.operator)
|
||||||
|
})
|
||||||
|
priceTableColumns.value = cols
|
||||||
|
const rows = []
|
||||||
|
for (let i = 0; i < data.hours.length; i++) {
|
||||||
|
const row = []
|
||||||
|
row.push(data.hours[i] + ":00")
|
||||||
|
row.push(data.ylt.series[i])
|
||||||
|
data.competitors.forEach(c => {
|
||||||
|
row.push(c.series[i])
|
||||||
|
})
|
||||||
|
rows.push(row)
|
||||||
|
}
|
||||||
|
priceTableRows.value = rows
|
||||||
|
}
|
||||||
|
const loadComparison = async () => {
|
||||||
|
if (!stationHash.value) return
|
||||||
|
loading.value = true
|
||||||
|
try{
|
||||||
|
const url = apiBase.value + "/api/ylt/pricing/comparison/" + stationHash.value
|
||||||
|
const res = await axios.get(url)
|
||||||
|
const data = res.data
|
||||||
|
const hours = data.hours.map(h => h + ":00")
|
||||||
|
const series = []
|
||||||
|
series.push({
|
||||||
|
name:"驿来特",
|
||||||
|
type:"line",
|
||||||
|
smooth:true,
|
||||||
|
data:data.ylt.series
|
||||||
|
})
|
||||||
|
data.competitors.forEach(c=>{
|
||||||
|
series.push({
|
||||||
|
name:c.operator,
|
||||||
|
type:"line",
|
||||||
|
smooth:true,
|
||||||
|
data:c.series
|
||||||
|
})
|
||||||
|
})
|
||||||
|
buildPriceTable(data)
|
||||||
|
const option = {
|
||||||
|
tooltip:{trigger:"axis"},
|
||||||
|
legend:{data:series.map(s=>s.name),textStyle:{color:"#e5e7eb"}},
|
||||||
|
xAxis:{type:"category",data:hours,axisLine:{lineStyle:{color:"#4b5563"}},axisLabel:{color:"#9ca3af"}},
|
||||||
|
yAxis:{type:"value",name:"元/度",axisLine:{lineStyle:{color:"#4b5563"}},axisLabel:{color:"#9ca3af"},splitLine:{lineStyle:{color:"#111827"}}},
|
||||||
|
grid:{left:40,right:20,top:30,bottom:30},
|
||||||
|
series:series
|
||||||
|
}
|
||||||
|
initChart()
|
||||||
|
chartInstance.setOption(option)
|
||||||
|
}finally{
|
||||||
|
loading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const selectStation = s => {
|
||||||
|
selectedStation.value = s
|
||||||
|
stationHash.value = s.station_hash
|
||||||
|
loadComparison()
|
||||||
|
}
|
||||||
|
const startAiStream = () => {
|
||||||
|
if (!selectedStation.value || !stationHash.value) return
|
||||||
|
if (es) {
|
||||||
|
es.close()
|
||||||
|
es = null
|
||||||
|
}
|
||||||
|
aiText.value = ""
|
||||||
|
aiLoading.value = true
|
||||||
|
const url = apiBase.value + "/api/ylt/pricing/comparison/" + stationHash.value + "/sse"
|
||||||
|
es = new EventSource(url)
|
||||||
|
es.onmessage = ev => {
|
||||||
|
aiText.value += ev.data
|
||||||
|
}
|
||||||
|
es.onerror = () => {
|
||||||
|
aiLoading.value = false
|
||||||
|
if (es) {
|
||||||
|
es.close()
|
||||||
|
es = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
onMounted(()=>{
|
||||||
|
initChart()
|
||||||
|
loadStations()
|
||||||
|
})
|
||||||
|
const formatCell = v => {
|
||||||
|
if (v === null || v === undefined || v === "") return "-"
|
||||||
|
if (typeof v === "number") {
|
||||||
|
if (Number.isNaN(v)) return "-"
|
||||||
|
return v.toFixed(2)
|
||||||
|
}
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
return {apiBase,stationHash,aiText,placeholder,loading,aiLoading,stations,searchKeyword,selectedStation,priceTableColumns,priceTableRows,loadStations,loadComparison,selectStation,startAiStream,formatCell}
|
||||||
|
}
|
||||||
|
}).mount("#app")
|
||||||
|
|
||||||
3
static/js/axios.min.js
vendored
Normal file
3
static/js/axios.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
45
static/js/echarts.min.js
vendored
Normal file
45
static/js/echarts.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
56593
static/js/element-plus.index.full.js
Normal file
56593
static/js/element-plus.index.full.js
Normal file
File diff suppressed because one or more lines are too long
2
static/js/element-plus.zh-cn.min.js
vendored
Normal file
2
static/js/element-plus.zh-cn.min.js
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
/*! Element Plus v2.3.9 */(function(u,e){typeof exports=="object"&&typeof module!="undefined"?module.exports=e():typeof define=="function"&&define.amd?define(e):(u=typeof globalThis!="undefined"?globalThis:u||self,u.ElementPlusLocaleZhCn=e())})(this,function(){"use strict";var u={name:"zh-cn",el:{colorpicker:{confirm:"\u786E\u5B9A",clear:"\u6E05\u7A7A"},datepicker:{now:"\u6B64\u523B",today:"\u4ECA\u5929",cancel:"\u53D6\u6D88",clear:"\u6E05\u7A7A",confirm:"\u786E\u5B9A",selectDate:"\u9009\u62E9\u65E5\u671F",selectTime:"\u9009\u62E9\u65F6\u95F4",startDate:"\u5F00\u59CB\u65E5\u671F",startTime:"\u5F00\u59CB\u65F6\u95F4",endDate:"\u7ED3\u675F\u65E5\u671F",endTime:"\u7ED3\u675F\u65F6\u95F4",prevYear:"\u524D\u4E00\u5E74",nextYear:"\u540E\u4E00\u5E74",prevMonth:"\u4E0A\u4E2A\u6708",nextMonth:"\u4E0B\u4E2A\u6708",year:"\u5E74",month1:"1 \u6708",month2:"2 \u6708",month3:"3 \u6708",month4:"4 \u6708",month5:"5 \u6708",month6:"6 \u6708",month7:"7 \u6708",month8:"8 \u6708",month9:"9 \u6708",month10:"10 \u6708",month11:"11 \u6708",month12:"12 \u6708",weeks:{sun:"\u65E5",mon:"\u4E00",tue:"\u4E8C",wed:"\u4E09",thu:"\u56DB",fri:"\u4E94",sat:"\u516D"},months:{jan:"\u4E00\u6708",feb:"\u4E8C\u6708",mar:"\u4E09\u6708",apr:"\u56DB\u6708",may:"\u4E94\u6708",jun:"\u516D\u6708",jul:"\u4E03\u6708",aug:"\u516B\u6708",sep:"\u4E5D\u6708",oct:"\u5341\u6708",nov:"\u5341\u4E00\u6708",dec:"\u5341\u4E8C\u6708"}},select:{loading:"\u52A0\u8F7D\u4E2D",noMatch:"\u65E0\u5339\u914D\u6570\u636E",noData:"\u65E0\u6570\u636E",placeholder:"\u8BF7\u9009\u62E9"},cascader:{noMatch:"\u65E0\u5339\u914D\u6570\u636E",loading:"\u52A0\u8F7D\u4E2D",placeholder:"\u8BF7\u9009\u62E9",noData:"\u6682\u65E0\u6570\u636E"},pagination:{goto:"\u524D\u5F80",pagesize:"\u6761/\u9875",total:"\u5171 {total} \u6761",pageClassifier:"\u9875",page:"\u9875",prev:"\u4E0A\u4E00\u9875",next:"\u4E0B\u4E00\u9875",currentPage:"\u7B2C {pager} \u9875",prevPages:"\u5411\u524D {pager} \u9875",nextPages:"\u5411\u540E {pager} \u9875",deprecationWarning:"\u4F60\u4F7F\u7528\u4E86\u4E00\u4E9B\u5DF2\u88AB\u5E9F\u5F03\u7684\u7528\u6CD5\uFF0C\u8BF7\u53C2\u8003 el-pagination \u7684\u5B98\u65B9\u6587\u6863"},messagebox:{title:"\u63D0\u793A",confirm:"\u786E\u5B9A",cancel:"\u53D6\u6D88",error:"\u8F93\u5165\u7684\u6570\u636E\u4E0D\u5408\u6CD5!"},upload:{deleteTip:"\u6309 delete \u952E\u53EF\u5220\u9664",delete:"\u5220\u9664",preview:"\u67E5\u770B\u56FE\u7247",continue:"\u7EE7\u7EED\u4E0A\u4F20"},table:{emptyText:"\u6682\u65E0\u6570\u636E",confirmFilter:"\u7B5B\u9009",resetFilter:"\u91CD\u7F6E",clearFilter:"\u5168\u90E8",sumText:"\u5408\u8BA1"},tree:{emptyText:"\u6682\u65E0\u6570\u636E"},transfer:{noMatch:"\u65E0\u5339\u914D\u6570\u636E",noData:"\u65E0\u6570\u636E",titles:["\u5217\u8868 1","\u5217\u8868 2"],filterPlaceholder:"\u8BF7\u8F93\u5165\u641C\u7D22\u5185\u5BB9",noCheckedFormat:"\u5171 {total} \u9879",hasCheckedFormat:"\u5DF2\u9009 {checked}/{total} \u9879"},image:{error:"\u52A0\u8F7D\u5931\u8D25"},pageHeader:{title:"\u8FD4\u56DE"},popconfirm:{confirmButtonText:"\u786E\u5B9A",cancelButtonText:"\u53D6\u6D88"}}};return u});
|
||||||
|
//# sourceMappingURL=zh-cn.min.js.map
|
||||||
56593
static/js/element-plus@2.3.9/dist/index.full.js
vendored
Normal file
56593
static/js/element-plus@2.3.9/dist/index.full.js
vendored
Normal file
File diff suppressed because one or more lines are too long
2
static/js/element-plus@2.3.9/dist/locale/zh-cn.min.js
vendored
Normal file
2
static/js/element-plus@2.3.9/dist/locale/zh-cn.min.js
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
/*! Element Plus v2.3.9 */(function(u,e){typeof exports=="object"&&typeof module!="undefined"?module.exports=e():typeof define=="function"&&define.amd?define(e):(u=typeof globalThis!="undefined"?globalThis:u||self,u.ElementPlusLocaleZhCn=e())})(this,function(){"use strict";var u={name:"zh-cn",el:{colorpicker:{confirm:"\u786E\u5B9A",clear:"\u6E05\u7A7A"},datepicker:{now:"\u6B64\u523B",today:"\u4ECA\u5929",cancel:"\u53D6\u6D88",clear:"\u6E05\u7A7A",confirm:"\u786E\u5B9A",selectDate:"\u9009\u62E9\u65E5\u671F",selectTime:"\u9009\u62E9\u65F6\u95F4",startDate:"\u5F00\u59CB\u65E5\u671F",startTime:"\u5F00\u59CB\u65F6\u95F4",endDate:"\u7ED3\u675F\u65E5\u671F",endTime:"\u7ED3\u675F\u65F6\u95F4",prevYear:"\u524D\u4E00\u5E74",nextYear:"\u540E\u4E00\u5E74",prevMonth:"\u4E0A\u4E2A\u6708",nextMonth:"\u4E0B\u4E2A\u6708",year:"\u5E74",month1:"1 \u6708",month2:"2 \u6708",month3:"3 \u6708",month4:"4 \u6708",month5:"5 \u6708",month6:"6 \u6708",month7:"7 \u6708",month8:"8 \u6708",month9:"9 \u6708",month10:"10 \u6708",month11:"11 \u6708",month12:"12 \u6708",weeks:{sun:"\u65E5",mon:"\u4E00",tue:"\u4E8C",wed:"\u4E09",thu:"\u56DB",fri:"\u4E94",sat:"\u516D"},months:{jan:"\u4E00\u6708",feb:"\u4E8C\u6708",mar:"\u4E09\u6708",apr:"\u56DB\u6708",may:"\u4E94\u6708",jun:"\u516D\u6708",jul:"\u4E03\u6708",aug:"\u516B\u6708",sep:"\u4E5D\u6708",oct:"\u5341\u6708",nov:"\u5341\u4E00\u6708",dec:"\u5341\u4E8C\u6708"}},select:{loading:"\u52A0\u8F7D\u4E2D",noMatch:"\u65E0\u5339\u914D\u6570\u636E",noData:"\u65E0\u6570\u636E",placeholder:"\u8BF7\u9009\u62E9"},cascader:{noMatch:"\u65E0\u5339\u914D\u6570\u636E",loading:"\u52A0\u8F7D\u4E2D",placeholder:"\u8BF7\u9009\u62E9",noData:"\u6682\u65E0\u6570\u636E"},pagination:{goto:"\u524D\u5F80",pagesize:"\u6761/\u9875",total:"\u5171 {total} \u6761",pageClassifier:"\u9875",page:"\u9875",prev:"\u4E0A\u4E00\u9875",next:"\u4E0B\u4E00\u9875",currentPage:"\u7B2C {pager} \u9875",prevPages:"\u5411\u524D {pager} \u9875",nextPages:"\u5411\u540E {pager} \u9875",deprecationWarning:"\u4F60\u4F7F\u7528\u4E86\u4E00\u4E9B\u5DF2\u88AB\u5E9F\u5F03\u7684\u7528\u6CD5\uFF0C\u8BF7\u53C2\u8003 el-pagination \u7684\u5B98\u65B9\u6587\u6863"},messagebox:{title:"\u63D0\u793A",confirm:"\u786E\u5B9A",cancel:"\u53D6\u6D88",error:"\u8F93\u5165\u7684\u6570\u636E\u4E0D\u5408\u6CD5!"},upload:{deleteTip:"\u6309 delete \u952E\u53EF\u5220\u9664",delete:"\u5220\u9664",preview:"\u67E5\u770B\u56FE\u7247",continue:"\u7EE7\u7EED\u4E0A\u4F20"},table:{emptyText:"\u6682\u65E0\u6570\u636E",confirmFilter:"\u7B5B\u9009",resetFilter:"\u91CD\u7F6E",clearFilter:"\u5168\u90E8",sumText:"\u5408\u8BA1"},tree:{emptyText:"\u6682\u65E0\u6570\u636E"},transfer:{noMatch:"\u65E0\u5339\u914D\u6570\u636E",noData:"\u65E0\u6570\u636E",titles:["\u5217\u8868 1","\u5217\u8868 2"],filterPlaceholder:"\u8BF7\u8F93\u5165\u641C\u7D22\u5185\u5BB9",noCheckedFormat:"\u5171 {total} \u9879",hasCheckedFormat:"\u5DF2\u9009 {checked}/{total} \u9879"},image:{error:"\u52A0\u8F7D\u5931\u8D25"},pageHeader:{title:"\u8FD4\u56DE"},popconfirm:{confirmButtonText:"\u786E\u5B9A",cancelButtonText:"\u53D6\u6D88"}}};return u});
|
||||||
|
//# sourceMappingURL=zh-cn.min.js.map
|
||||||
2
static/js/jquery-3.7.1.min.js
vendored
Normal file
2
static/js/jquery-3.7.1.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
6
static/js/marked.min.js
vendored
Normal file
6
static/js/marked.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
8
static/js/uuidv4.min.js
vendored
Normal file
8
static/js/uuidv4.min.js
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
/**
|
||||||
|
* Minified by jsDelivr using Terser v5.37.0.
|
||||||
|
* Original file: /npm/uuidv4@6.2.13/build/lib/uuidv4.js
|
||||||
|
*
|
||||||
|
* Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files
|
||||||
|
*/
|
||||||
|
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.jsonSchema=exports.fromString=exports.empty=exports.isUuid=exports.regex=exports.uuid=void 0;const util_1=require("util"),uuid_1=require("uuid"),regex={v4:/(?:^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}$)|(?:^0{8}-0{4}-0{4}-0{4}-0{12}$)/u,v5:/(?:^[a-f0-9]{8}-[a-f0-9]{4}-5[a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}$)|(?:^0{8}-0{4}-0{4}-0{4}-0{12}$)/u};exports.regex=regex;const jsonSchema={v4:{type:"string",pattern:regex.v4.toString().slice(1,-2)},v5:{type:"string",pattern:regex.v5.toString().slice(1,-2)}};exports.jsonSchema=jsonSchema;const uuidv4=(0,util_1.deprecate)((()=>(0,uuid_1.v4)()),"uuidv4() is deprecated. Use v4() from the uuid module instead.");exports.uuid=uuidv4;const isUuid=(0,util_1.deprecate)((e=>(0,uuid_1.validate)(e)&&(4===(0,uuid_1.version)(e)||5===(0,uuid_1.version)(e))),"isUuid() is deprecated. Use validate() from the uuid module instead.");exports.isUuid=isUuid;const empty=(0,util_1.deprecate)((()=>uuid_1.NIL),"empty() is deprecated. Use NIL from the uuid module instead.");exports.empty=empty;const fromString=(0,util_1.deprecate)(((e,t="bb5d0ffa-9a4c-4d7c-8fc2-0a7d2220ba45")=>(0,uuid_1.v5)(e,t)),"fromString() is deprecated. Use v5() from the uuid module instead.");exports.fromString=fromString;
|
||||||
|
//# sourceMappingURL=/sm/a42ea5fd18391394c43e9d34af6508a5036d6c1e98e4f72dfe800c3f1c459770.map
|
||||||
18365
static/js/vue.global.js
Normal file
18365
static/js/vue.global.js
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user