Files
it/frontend/dist/assets/ProductComparison-DaPfOM8r.js
2025-11-03 17:03:57 +08:00

2 lines
17 KiB
JavaScript

import{a as e,u as a}from"./EmptyState.vue_vue_type_style_index_0_scoped_fb24dc77_lang-CriKEGZ4.js";import{a3 as t,Q as l,o as r,S as o,a6 as s,T as n,M as c}from"./element-plus-CzySQqEG.js";/* empty css */import{_ as i}from"./index-XFdsC_4R.js";import{a8 as d,m as u,q as p,v as m,t as f,H as v,B as y,A as b,D as h,F as g,r as _,c as k,G as x,X as w,u as C,d as S,n as j}from"./vue-vendor-GS00DpJy.js";import{u as V,H as E,i as I,h as M,b as O,c as P,d as D,e as F,f as $,g as R}from"./charts-DH_olTd-.js";import"./utils-UCiI1fAk.js";const U={name:"ErrorBoundary",components:{Warning:t},props:{title:{type:String,default:""},message:{type:String,default:""},retryable:{type:Boolean,default:!0}},setup(e,{emit:a}){const t=_(!1),l=_("");return{hasError:t,errorMessage:l,handleRetry:()=>{t.value=!1,l.value="",a("retry")},errorCaptured:(e,a,r)=>(t.value=!0,l.value=e.message,!1)}}},A={class:"error-boundary"},B={key:0,class:"error-content"},N={class:"error-icon"},z={class:"error-text"};const T=i(U,[["render",function(e,a,t,r,o,s){const n=d("Warning"),c=d("el-icon"),i=d("el-button");return p(),u("div",A,[r.hasError?(p(),u("div",B,[f("div",N,[v(c,{size:"64",color:"#F56C6C"},{default:y(()=>[v(n)]),_:1})]),f("div",z,[f("h3",null,l(t.title||"出现错误"),1),f("p",null,l(t.message||"应用程序遇到了意外错误"),1),t.retryable?(p(),b(i,{key:0,type:"primary",onClick:r.handleRetry},{default:y(()=>[...a[1]||(a[1]=[g(" 重试 ",-1)])]),_:1},8,["onClick"])):h("",!0),v(i,{onClick:a[0]||(a[0]=a=>e.$router.push("/"))},{default:y(()=>[...a[2]||(a[2]=[g(" 返回首页 ",-1)])]),_:1})])])):m(e.$slots,"default",{key:1},void 0,!0)])}],["__scopeId","data-v-8b59789b"]]),L={class:"comparison-table"},q={key:0,class:"bg-white rounded-lg shadow-md p-6 mb-6"},G={key:1,class:"bg-white rounded-lg shadow-md p-6 mb-6"},W={class:"flex items-center"},H={key:0,class:"flex-1"},Q={key:2,class:"bg-white rounded-lg shadow-md p-6"},X=i({__name:"ComparisonTable",props:{products:{type:Array,required:!0},comparisonData:{type:Object,default:()=>({})},type:{type:String,default:"all",validator:e=>["all","basic","performance","specifications"].includes(e)}},setup(e){const a=e,t=_([]),o=k(()=>"all"===a.type||"basic"===a.type),s=k(()=>"all"===a.type||"performance"===a.type),n=k(()=>"all"===a.type||"specifications"===a.type),c=k(()=>{if(!a.products.length)return[];return[{key:"name",label:"产品名称"},{key:"model",label:"型号"},{key:"manufacturer",label:"制造商"},{key:"releaseDate",label:"发布日期"},{key:"currentRank",label:"当前排名"}].map(e=>{const t={attribute:e.label},l={};a.products.forEach(a=>{let t=a[e.key];"releaseDate"===e.key&&t&&(t=new Date(t).toLocaleDateString()),"currentRank"===e.key&&t&&(t=`#${t}`),l[a.id]=t});const r=Object.values(l).filter(e=>!isNaN(parseFloat(e))&&isFinite(e));if(r.length>0)if("currentRank"===e.key){const e=Math.min(...r),a=Math.max(...r);Object.keys(l).forEach(r=>{const o=parseFloat(l[r]);o===e&&(t.best=parseInt(r)),o===a&&(t.worst=parseInt(r))})}else{const e=Math.max(...r),a=Math.min(...r);Object.keys(l).forEach(r=>{const o=parseFloat(l[r]);o===e&&(t.best=parseInt(r)),o===a&&(t.worst=parseInt(r))})}return{...t,...l}})}),i=k(()=>{if(!a.products.length)return[];const e=new Set;return a.products.forEach(a=>{a.performanceScores&&a.performanceScores.forEach(a=>{e.add(a.benchmarkName)})}),Array.from(e).map(e=>{const t={benchmark:e},l={};a.products.forEach(a=>{var t;const r=null==(t=a.performanceScores)?void 0:t.find(a=>a.benchmarkName===e);l[a.id]=r?r.score:null});const r=Object.values(l).filter(e=>null!==e);if(r.length>0){const e=Math.max(...r),a=Math.min(...r);Object.keys(l).forEach(r=>{l[r]===e&&(t.best=parseInt(r)),l[r]===a&&(t.worst=parseInt(r))})}return{...t,...l}})}),m=k(()=>{if(!a.products.length)return{};const e={};a.products.forEach(a=>{a.specifications&&a.specifications.forEach(t=>{const l=t.group||"其他";e[l]||(e[l]={}),e[l][t.name]=e[l][t.name]||{},e[l][t.name][a.id]=t.value})});const t={};return Object.keys(e).forEach(a=>{t[a]=Object.keys(e[a]).map(t=>{const l={specification:t},r=e[a][t],o=Object.values(r).filter(e=>{const a=parseFloat(e);return!isNaN(a)&&isFinite(a)});if(o.length>0){const e=t.includes("功耗")||t.includes("制程")||t.includes("nm")||t.includes("TDP"),a=Math.max(...o),s=Math.min(...o);Object.keys(r).forEach(t=>{const o=parseFloat(r[t]);e?(o===s&&(l.best=parseInt(t)),o===a&&(l.worst=parseInt(t))):(o===a&&(l.best=parseInt(t)),o===s&&(l.worst=parseInt(t)))})}return{...l,...r}})}),t}),g=(e,a)=>{if(!e)return 0;const t={"GeekBench Single-Core":5e3,"GeekBench Multi-Core":2e4,"3DMark Time Spy":2e4,"3DMark Fire Strike":3e4,AnTuTu:1e6}[a]||1e4;return Math.min(100,Math.round(e/t*100))},C=(e,a)=>{if(!e)return"#e0e0e0";if(a)return"#67c23a";const t=g(e);return t>=80?"#67c23a":t>=60?"#e6a23c":t>=40?"#f56c6c":"#909399"};return(a,_)=>{const k=d("el-table-column"),S=d("el-table"),j=d("el-progress"),V=d("el-collapse-item"),E=d("el-collapse");return p(),u("div",L,[o.value?(p(),u("div",q,[_[1]||(_[1]=f("h2",{class:"text-lg font-semibold mb-4"},"基本信息对比",-1)),v(S,{data:c.value,stripe:""},{default:y(()=>[v(k,{prop:"attribute",label:"属性",width:"180"}),(p(!0),u(x,null,w(e.products,(e,a)=>(p(),b(k,{key:e.id,label:`产品 ${a+1}`},{default:y(a=>[f("div",{class:r({"text-green-600 font-semibold":a.row.best===e.id,"text-red-600":a.row.worst===e.id})},l(a.row[e.id]||"-"),3)]),_:2},1032,["label"]))),128))]),_:1},8,["data"])])):h("",!0),s.value?(p(),u("div",G,[_[2]||(_[2]=f("h2",{class:"text-lg font-semibold mb-4"},"性能分数对比",-1)),v(S,{data:i.value,stripe:""},{default:y(()=>[v(k,{prop:"benchmark",label:"测试项目",width:"180"}),(p(!0),u(x,null,w(e.products,(e,a)=>(p(),b(k,{key:e.id,label:`产品 ${a+1}`},{default:y(a=>[f("div",W,[f("div",{class:r([{"text-green-600 font-semibold":a.row.best===e.id,"text-red-600":a.row.worst===e.id},"mr-2"])},l(a.row[e.id]||"-"),3),a.row[e.id]?(p(),u("div",H,[v(j,{percentage:g(a.row[e.id],a.row.benchmark),color:C(a.row[e.id],a.row.best===e.id),"show-text":!1,"stroke-width":6},null,8,["percentage","color"])])):h("",!0)])]),_:2},1032,["label"]))),128))]),_:1},8,["data"])])):h("",!0),n.value?(p(),u("div",Q,[_[3]||(_[3]=f("h2",{class:"text-lg font-semibold mb-4"},"规格参数对比",-1)),v(E,{modelValue:t.value,"onUpdate:modelValue":_[0]||(_[0]=e=>t.value=e)},{default:y(()=>[(p(!0),u(x,null,w(m.value,(a,t)=>(p(),b(V,{key:t,title:t,name:t},{default:y(()=>[v(S,{data:a,stripe:""},{default:y(()=>[v(k,{prop:"specification",label:"参数",width:"180"}),(p(!0),u(x,null,w(e.products,(e,a)=>(p(),b(k,{key:e.id,label:`产品 ${a+1}`},{default:y(a=>[f("div",{class:r({"text-green-600 font-semibold":a.row.best===e.id,"text-red-600":a.row.worst===e.id})},l(a.row[e.id]||"-"),3)]),_:2},1032,["label"]))),128))]),_:1},8,["data"])]),_:2},1032,["title","name"]))),128))]),_:1},8,["modelValue"])])):h("",!0)])}}},[["__scopeId","data-v-63ee2e44"]]),J={class:"comparison-charts"},K={class:"chart-container"},Y={class:"chart-container"},Z={class:"chart-container"},ee={class:"chart-container"},ae=i({__name:"ComparisonChart",props:{products:{type:Array,required:!0},comparisonData:{type:Object,default:()=>({})},loading:{type:Boolean,default:!1},type:{type:String,default:"all",validator:e=>["performance","specifications","comprehensive","all"].includes(e)}},setup(e){V([I,M,O,P,D,F,$,R]);const a=e,t=_("score"),l=k(()=>a.products&&0!==a.products.length?{title:{text:"产品性能分数对比",left:"center"},tooltip:{trigger:"axis",axisPointer:{type:"shadow"}},legend:{data:a.products.map(e=>e.name),top:30},grid:{left:"3%",right:"4%",bottom:"3%",containLabel:!0},xAxis:{type:"category",data:["性能分数"]},yAxis:{type:"value",name:"分数"},series:a.products.map(e=>({name:e.name,type:"bar",data:[e.performanceScore||0],itemStyle:{color:o(a.products.indexOf(e))}}))}:{title:{text:"暂无数据",left:"center",top:"middle"}}),r=k(()=>{if(!a.products||0===a.products.length)return{title:{text:"暂无数据",left:"center",top:"middle"}};const e=new Set;a.products.forEach(a=>{a.specifications&&a.specifications.forEach(a=>{null===a.value||isNaN(a.value)||e.add(a.name)})});const t=Array.from(e).slice(0,8).map(e=>({name:e,max:100})),l=a.products.map(e=>{const l=t.map(a=>{var t;const l=null==(t=e.specifications)?void 0:t.find(e=>e.name===a.name);return l?l.value:0});return{name:e.name,type:"radar",data:[{value:l,name:e.name}],itemStyle:{color:o(a.products.indexOf(e))}}});return{title:{text:"产品多维度规格对比",left:"center"},tooltip:{},legend:{data:a.products.map(e=>e.name),top:30},radar:{indicator:t.length>0?t:[{name:"性能",max:100},{name:"功耗",max:100},{name:"温度",max:100},{name:"稳定性",max:100}]},series:l}}),o=e=>{const a=["#5470c6","#91cc75","#fac858","#ee6666","#73c0de","#3ba272","#fc8452","#9a60b4"];return a[e%a.length]};return(a,o)=>{const s=d("el-tab-pane"),n=d("el-tabs");return p(),u("div",J,["performance"===e.type||"all"===e.type?(p(),b(n,{key:0,modelValue:t.value,"onUpdate:modelValue":o[0]||(o[0]=e=>t.value=e),type:"card"},{default:y(()=>[v(s,{label:"性能分数对比",name:"score"},{default:y(()=>[f("div",K,[v(C(E),{class:"chart",option:l.value,loading:e.loading,autoresize:""},null,8,["option","loading"])])]),_:1})]),_:1},8,["modelValue"])):h("",!0),"specifications"===e.type||"all"===e.type?(p(),b(n,{key:1,modelValue:t.value,"onUpdate:modelValue":o[1]||(o[1]=e=>t.value=e),type:"card"},{default:y(()=>[v(s,{label:"多维度规格对比",name:"radar"},{default:y(()=>[f("div",Y,[v(C(E),{class:"chart",option:r.value,loading:e.loading,autoresize:""},null,8,["option","loading"])])]),_:1})]),_:1},8,["modelValue"])):h("",!0),"comprehensive"===e.type||"all"===e.type?(p(),b(n,{key:2,modelValue:t.value,"onUpdate:modelValue":o[2]||(o[2]=e=>t.value=e),type:"card"},{default:y(()=>[v(s,{label:"性能分数对比",name:"score"},{default:y(()=>[f("div",Z,[v(C(E),{class:"chart",option:l.value,loading:e.loading,autoresize:""},null,8,["option","loading"])])]),_:1}),v(s,{label:"多维度规格对比",name:"radar"},{default:y(()=>[f("div",ee,[v(C(E),{class:"chart",option:r.value,loading:e.loading,autoresize:""},null,8,["option","loading"])])]),_:1})]),_:1},8,["modelValue"])):h("",!0)])}}},[["__scopeId","data-v-294e8498"]]),te={class:"product-comparison container mx-auto px-4 py-8"},le={class:"breadcrumb mb-6"},re={class:"bg-white rounded-lg shadow-md p-6 mb-6"},oe={class:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4 mb-4"},se={class:"pr-8"},ne={class:"font-medium mb-1 truncate"},ce={class:"text-sm text-gray-600 mb-2 truncate"},ie={class:"text-sm"},de={key:0,class:"text-sm font-medium text-blue-600 mt-1"},ue={class:"flex justify-between items-center"},pe={key:0,class:"flex justify-center items-center h-64"},me={key:1,class:"error-state text-center py-12"},fe={key:2,class:"space-y-6"},ve={class:"comprehensive-comparison"},ye={class:"mt-8"},be={key:3,class:"empty-state text-center py-12"},he={class:"mb-4"},ge={key:0,class:"search-loading mt-4 text-center"},_e={key:1,class:"max-h-96 overflow-y-auto"},ke=i({__name:"ProductComparison",setup(t){const r=e(),i=a(),m=_(!1),V=_(null),E=_(!1),I=_(""),M=_([]),O=_(!1),P=_([]);_(null),_(null);const D=_("performance"),F=k(()=>r.selectedProducts),$=k(()=>r.comparisonResult),R=k(()=>r.canCompare),U=async()=>{m.value=!0,V.value=null;try{await r.compareProducts(),await j(),A()}catch(e){V.value="产品对比失败"}finally{m.value=!1}},A=()=>{$.value},B=()=>{r.clearSelection()},N=()=>{E.value=!0,I.value="",M.value=[],P.value=[]},z=async()=>{if(I.value.trim()){O.value=!0;try{const e=await i.searchProducts(I.value);M.value=e.filter(e=>!F.value.some(a=>a.id===e.id))}catch(e){c.error("搜索产品失败")}finally{O.value=!1}}else M.value=[]},L=e=>{P.value=e},q=()=>{const e=4-F.value.length,a=P.value.slice(0,e);let t=0;a.forEach(e=>{r.addProduct(e)&&t++}),t>0&&c.success(`已添加 ${t} 个产品到对比列表`),E.value=!1};return S(async()=>{const e=new URLSearchParams(window.location.search).get("productIds");if(e){const t=e.split(",").filter(e=>e.trim());if(t.length>0){m.value=!0;try{for(const e of t){const a=await i.getProductById(parseInt(e));a&&r.addProduct(a)}r.canCompare&&await U()}catch(a){V.value="从URL加载产品失败"}finally{m.value=!1}}}}),(e,a)=>{const t=d("el-breadcrumb-item"),c=d("el-breadcrumb"),i=d("el-icon"),_=d("el-button"),k=d("el-loading-directive"),S=d("el-result"),j=d("el-tab-pane"),A=d("el-tabs"),G=d("el-empty"),W=d("el-input"),H=d("el-table-column"),Q=d("el-table"),J=d("el-dialog");return p(),b(T,{onRetry:U},{default:y(()=>[f("div",te,[f("div",le,[v(c,{separator:"/"},{default:y(()=>[v(t,{to:{path:"/"}},{default:y(()=>[...a[6]||(a[6]=[g("首页",-1)])]),_:1}),v(t,null,{default:y(()=>[...a[7]||(a[7]=[g("产品对比",-1)])]),_:1})]),_:1})]),a[18]||(a[18]=f("div",{class:"page-header mb-8"},[f("h1",{class:"text-3xl font-bold text-gray-800"},"产品对比"),f("p",{class:"text-gray-600 mt-2"},"对比不同硬件产品的性能和规格参数")],-1)),f("div",re,[a[11]||(a[11]=f("h2",{class:"text-lg font-semibold mb-4"},"选择要对比的产品 (最多4个)",-1)),f("div",oe,[(p(!0),u(x,null,w(F.value,(e,a)=>(p(),u("div",{key:e.id,class:"border rounded-lg p-4 relative hover:shadow-md transition-shadow"},[v(_,{type:"danger",size:"small",circle:"",class:"absolute top-2 right-2",onClick:a=>{return t=e.id,void r.removeProduct(t);var t}},{default:y(()=>[v(i,null,{default:y(()=>[v(C(o))]),_:1})]),_:1},8,["onClick"]),f("div",se,[f("div",ne,l(e.name),1),f("div",ce,l(e.model),1),f("div",ie,l(e.manufacturer),1),e.performanceScore?(p(),u("div",de," 性能分数: "+l(e.performanceScore),1)):h("",!0)])]))),128)),(p(!0),u(x,null,w(4-F.value.length,e=>(p(),u("div",{key:`empty-${e}`,class:"border border-dashed rounded-lg p-4 flex items-center justify-center hover:bg-gray-50 transition-colors"},[v(_,{type:"primary",plain:"",onClick:N},{default:y(()=>[v(i,{class:"mr-1"},{default:y(()=>[v(C(s))]),_:1}),a[8]||(a[8]=g(" 添加产品 ",-1))]),_:1})]))),128))]),f("div",ue,[v(_,{type:"primary",size:"large",disabled:!R.value,loading:m.value,onClick:U},{default:y(()=>[...a[9]||(a[9]=[g(" 开始对比 ",-1)])]),_:1},8,["disabled","loading"]),v(_,{onClick:B,disabled:0===F.value.length},{default:y(()=>[...a[10]||(a[10]=[g(" 清空选择 ",-1)])]),_:1},8,["disabled"])])]),m.value?(p(),u("div",pe,[v(k)])):V.value?(p(),u("div",me,[v(S,{icon:"warning",title:"对比失败","sub-title":V.value},{extra:y(()=>[v(_,{type:"primary",onClick:U},{default:y(()=>[...a[12]||(a[12]=[g("重新加载",-1)])]),_:1}),v(_,{onClick:a[0]||(a[0]=a=>e.$router.push("/"))},{default:y(()=>[...a[13]||(a[13]=[g("返回首页",-1)])]),_:1})]),_:1},8,["sub-title"])])):$.value?(p(),u("div",fe,[v(A,{modelValue:D.value,"onUpdate:modelValue":a[1]||(a[1]=e=>D.value=e),class:"comparison-tabs"},{default:y(()=>[v(j,{label:"性能对比",name:"performance"},{default:y(()=>[v(ae,{products:F.value,"comparison-data":$.value,type:"performance"},null,8,["products","comparison-data"]),v(X,{products:F.value,"comparison-data":$.value,type:"performance"},null,8,["products","comparison-data"])]),_:1}),v(j,{label:"规格对比",name:"specifications"},{default:y(()=>[v(ae,{products:F.value,"comparison-data":$.value,type:"specifications"},null,8,["products","comparison-data"]),v(X,{products:F.value,"comparison-data":$.value,type:"specifications"},null,8,["products","comparison-data"])]),_:1}),v(j,{label:"基本信息",name:"basic"},{default:y(()=>[v(X,{products:F.value,"comparison-data":$.value,type:"basic"},null,8,["products","comparison-data"])]),_:1}),v(j,{label:"综合对比",name:"comprehensive"},{default:y(()=>[f("div",ve,[v(ae,{products:F.value,"comparison-data":$.value,type:"all"},null,8,["products","comparison-data"]),f("div",ye,[v(X,{products:F.value,"comparison-data":$.value,type:"all"},null,8,["products","comparison-data"])])])]),_:1})]),_:1},8,["modelValue"])])):m.value||0!==F.value.length?h("",!0):(p(),u("div",be,[v(G,{description:"请选择要对比的产品"},{extra:y(()=>[v(_,{type:"primary",onClick:a[2]||(a[2]=a=>e.$router.push("/"))},{default:y(()=>[...a[14]||(a[14]=[g("浏览产品",-1)])]),_:1})]),_:1})])),v(J,{modelValue:E.value,"onUpdate:modelValue":a[5]||(a[5]=e=>E.value=e),title:"选择产品",width:"70%"},{footer:y(()=>[v(_,{onClick:a[4]||(a[4]=e=>E.value=!1)},{default:y(()=>[...a[16]||(a[16]=[g("取消",-1)])]),_:1}),v(_,{type:"primary",onClick:q,disabled:0===P.value.length},{default:y(()=>[...a[17]||(a[17]=[g(" 添加选中产品 ",-1)])]),_:1},8,["disabled"])]),default:y(()=>[f("div",he,[v(W,{modelValue:I.value,"onUpdate:modelValue":a[3]||(a[3]=e=>I.value=e),placeholder:"搜索产品名称或型号","prefix-icon":"Search",clearable:"",onInput:z},null,8,["modelValue"])]),O.value?(p(),u("div",ge,[v(i,{class:"is-loading"},{default:y(()=>[v(C(n))]),_:1}),a[15]||(a[15]=f("span",{class:"ml-2"},"搜索中...",-1))])):(p(),u("div",_e,[v(Q,{data:M.value,onSelectionChange:L},{default:y(()=>[v(H,{type:"selection",width:"55"}),v(H,{prop:"name",label:"产品名称"}),v(H,{prop:"model",label:"型号"}),v(H,{prop:"manufacturer",label:"制造商"}),v(H,{prop:"performanceScore",label:"性能分数"})]),_:1},8,["data"])]))]),_:1},8,["modelValue"])])]),_:1})}}},[["__scopeId","data-v-02a6965d"]]);export{ke as default};