@ -1,2 +1,2 @@ |
|||||||
var B=Object.defineProperty,O=Object.defineProperties;var D=Object.getOwnPropertyDescriptors;var S=Object.getOwnPropertySymbols;var W=Object.prototype.hasOwnProperty,$=Object.prototype.propertyIsEnumerable;var v=(a,r,o)=>r in a?B(a,r,{enumerable:!0,configurable:!0,writable:!0,value:o}):a[r]=o,m=(a,r)=>{for(var o in r||(r={}))W.call(r,o)&&v(a,o,r[o]);if(S)for(var o of S(r))$.call(r,o)&&v(a,o,r[o]);return a},d=(a,r)=>O(a,D(r));import{L as b,H}from"./index-c9e6302b-1782661552655.js";import{e as h,l as F,v as R,o as g,c as p,a as f,t as u,g as L,b as V,u as P,n as j}from"./index-1782661552655.js";const q={class:"smart-chart-header"},G={key:0},E={key:0,class:"smart-chart-source"},J={__name:"SmartChartRenderer",props:{chart:{type:Object,required:!0}},emits:["ready"],setup(a,{emit:r}){const o=r,i=a,l=["#30dcff","#27f0c0","#ffd76c","#7aa7ff","#ff8f6b","#a6f06d"],z=h(()=>{const t=(i.chart.rows||[]).filter(e=>Number.isFinite(Number(e.value)));return i.chart.type==="pie"?N(t):i.chart.type==="line"?w(t):_(t)}),k=h(()=>{const t=i.chart.rows||[];return i.chart.type==="bar"&&x(t)}),y=h(()=>{const t=i.chart.source||{},e=[t.mode,t.table,t.period,t.generatedAt].filter(Boolean);return e.length?e.join(" / "):""});F(()=>{R(()=>{window.requestAnimationFrame(()=>o("ready"))})});function _(t){return x(t)?C(t):{animationDuration:700,grid:{left:52,right:26,top:28,bottom:54},tooltip:s(),xAxis:{type:"category",data:t.map(e=>e.name),axisTick:{show:!1},axisLine:{lineStyle:{color:"rgba(48, 220, 255, 0.28)"}},axisLabel:{color:"rgba(223, 250, 255, 0.76)",fontSize:11,interval:0,rotate:t.length>6?28:0}},yAxis:{type:"value",axisLine:{show:!1},axisTick:{show:!1},splitLine:{lineStyle:{color:"rgba(48, 220, 255, 0.1)",type:"dashed"}},axisLabel:{color:"rgba(223, 250, 255, 0.58)",fontSize:11}},series:[{name:i.chart.title,type:"bar",barWidth:t.length>7?16:22,data:t.map((e,n)=>({value:e.value,name:e.name,itemStyle:{borderRadius:[8,8,0,0],color:new b(0,0,0,1,[{offset:0,color:l[n%l.length]},{offset:1,color:"rgba(48, 220, 255, 0.08)"}])}})),label:{show:!0,position:"top",color:"#ffffff",fontSize:11,formatter:({value:e})=>c(e)}}]}}function C(t){return{animationDuration:700,grid:{left:78,right:72,top:22,bottom:20},tooltip:d(m({},s()),{trigger:"axis",axisPointer:{type:"shadow"}}),xAxis:{type:"value",axisLine:{show:!1},axisTick:{show:!1},splitLine:{lineStyle:{color:"rgba(48, 220, 255, 0.1)",type:"dashed"}},axisLabel:{color:"rgba(223, 250, 255, 0.58)",fontSize:11}},yAxis:{type:"category",inverse:!0,data:t.map(e=>e.name),axisTick:{show:!1},axisLine:{lineStyle:{color:"rgba(48, 220, 255, 0.22)"}},axisLabel:{color:"rgba(223, 250, 255, 0.82)",fontSize:12}},series:[{name:i.chart.title,type:"bar",barWidth:13,data:t.map((e,n)=>({value:e.value,name:e.name,itemStyle:{borderRadius:[0,8,8,0],color:new b(0,0,1,0,[{offset:0,color:"rgba(48, 220, 255, 0.16)"},{offset:1,color:l[n%l.length]}])}})),label:{show:!0,position:"right",color:"#ffffff",fontSize:11,formatter:({value:e})=>c(e)}}]}}function N(t){return{animationDuration:700,tooltip:s(),legend:{orient:"vertical",right:10,top:"middle",itemWidth:10,itemHeight:10,textStyle:{color:"rgba(223, 250, 255, 0.78)",fontSize:11}},series:[{name:i.chart.title,type:"pie",radius:["48%","68%"],center:["35%","52%"],avoidLabelOverlap:!0,label:{color:"#fff",fontSize:11,formatter:`{b}
|
var B=Object.defineProperty,O=Object.defineProperties;var D=Object.getOwnPropertyDescriptors;var S=Object.getOwnPropertySymbols;var W=Object.prototype.hasOwnProperty,$=Object.prototype.propertyIsEnumerable;var v=(a,r,o)=>r in a?B(a,r,{enumerable:!0,configurable:!0,writable:!0,value:o}):a[r]=o,m=(a,r)=>{for(var o in r||(r={}))W.call(r,o)&&v(a,o,r[o]);if(S)for(var o of S(r))$.call(r,o)&&v(a,o,r[o]);return a},d=(a,r)=>O(a,D(r));import{L as b,H}from"./index-9fb96bf8-1782919616283.js";import{e as h,l as F,v as R,o as g,c as p,a as f,t as u,g as L,b as V,u as P,n as j}from"./index-1782919616283.js";const q={class:"smart-chart-header"},G={key:0},E={key:0,class:"smart-chart-source"},J={__name:"SmartChartRenderer",props:{chart:{type:Object,required:!0}},emits:["ready"],setup(a,{emit:r}){const o=r,i=a,l=["#30dcff","#27f0c0","#ffd76c","#7aa7ff","#ff8f6b","#a6f06d"],z=h(()=>{const t=(i.chart.rows||[]).filter(e=>Number.isFinite(Number(e.value)));return i.chart.type==="pie"?N(t):i.chart.type==="line"?w(t):_(t)}),k=h(()=>{const t=i.chart.rows||[];return i.chart.type==="bar"&&x(t)}),y=h(()=>{const t=i.chart.source||{},e=[t.mode,t.table,t.period,t.generatedAt].filter(Boolean);return e.length?e.join(" / "):""});F(()=>{R(()=>{window.requestAnimationFrame(()=>o("ready"))})});function _(t){return x(t)?C(t):{animationDuration:700,grid:{left:52,right:26,top:28,bottom:54},tooltip:s(),xAxis:{type:"category",data:t.map(e=>e.name),axisTick:{show:!1},axisLine:{lineStyle:{color:"rgba(48, 220, 255, 0.28)"}},axisLabel:{color:"rgba(223, 250, 255, 0.76)",fontSize:11,interval:0,rotate:t.length>6?28:0}},yAxis:{type:"value",axisLine:{show:!1},axisTick:{show:!1},splitLine:{lineStyle:{color:"rgba(48, 220, 255, 0.1)",type:"dashed"}},axisLabel:{color:"rgba(223, 250, 255, 0.58)",fontSize:11}},series:[{name:i.chart.title,type:"bar",barWidth:t.length>7?16:22,data:t.map((e,n)=>({value:e.value,name:e.name,itemStyle:{borderRadius:[8,8,0,0],color:new b(0,0,0,1,[{offset:0,color:l[n%l.length]},{offset:1,color:"rgba(48, 220, 255, 0.08)"}])}})),label:{show:!0,position:"top",color:"#ffffff",fontSize:11,formatter:({value:e})=>c(e)}}]}}function C(t){return{animationDuration:700,grid:{left:78,right:72,top:22,bottom:20},tooltip:d(m({},s()),{trigger:"axis",axisPointer:{type:"shadow"}}),xAxis:{type:"value",axisLine:{show:!1},axisTick:{show:!1},splitLine:{lineStyle:{color:"rgba(48, 220, 255, 0.1)",type:"dashed"}},axisLabel:{color:"rgba(223, 250, 255, 0.58)",fontSize:11}},yAxis:{type:"category",inverse:!0,data:t.map(e=>e.name),axisTick:{show:!1},axisLine:{lineStyle:{color:"rgba(48, 220, 255, 0.22)"}},axisLabel:{color:"rgba(223, 250, 255, 0.82)",fontSize:12}},series:[{name:i.chart.title,type:"bar",barWidth:13,data:t.map((e,n)=>({value:e.value,name:e.name,itemStyle:{borderRadius:[0,8,8,0],color:new b(0,0,1,0,[{offset:0,color:"rgba(48, 220, 255, 0.16)"},{offset:1,color:l[n%l.length]}])}})),label:{show:!0,position:"right",color:"#ffffff",fontSize:11,formatter:({value:e})=>c(e)}}]}}function N(t){return{animationDuration:700,tooltip:s(),legend:{orient:"vertical",right:10,top:"middle",itemWidth:10,itemHeight:10,textStyle:{color:"rgba(223, 250, 255, 0.78)",fontSize:11}},series:[{name:i.chart.title,type:"pie",radius:["48%","68%"],center:["35%","52%"],avoidLabelOverlap:!0,label:{color:"#fff",fontSize:11,formatter:`{b}
|
||||||
{d}%`},labelLine:{lineStyle:{color:"rgba(223, 250, 255, 0.42)"}},itemStyle:{borderColor:"rgba(3, 18, 31, 0.92)",borderWidth:3},data:t.map((e,n)=>({name:e.name,value:e.value,itemStyle:{color:l[n%l.length]}}))}]}}function w(t){return{animationDuration:760,grid:{left:52,right:28,top:30,bottom:48},tooltip:d(m({},s()),{trigger:"axis",axisPointer:{type:"line",lineStyle:{color:"rgba(255, 215, 108, 0.52)"}}}),xAxis:{type:"category",boundaryGap:!1,data:t.map(e=>e.name),axisTick:{show:!1},axisLine:{lineStyle:{color:"rgba(48, 220, 255, 0.28)"}},axisLabel:{color:"rgba(223, 250, 255, 0.76)",fontSize:11,interval:0}},yAxis:{type:"value",axisLine:{show:!1},axisTick:{show:!1},splitLine:{lineStyle:{color:"rgba(48, 220, 255, 0.1)",type:"dashed"}},axisLabel:{color:"rgba(223, 250, 255, 0.58)",fontSize:11}},series:[{name:i.chart.title,type:"line",smooth:!0,symbol:"circle",symbolSize:8,lineStyle:{width:3,color:"#30dcff"},itemStyle:{color:"#ffd76c",borderColor:"#041522",borderWidth:2},areaStyle:{color:new b(0,0,0,1,[{offset:0,color:"rgba(48, 220, 255, 0.24)"},{offset:1,color:"rgba(48, 220, 255, 0.02)"}])},label:{show:!0,position:"top",color:"#ffffff",fontSize:11,formatter:({value:e})=>c(e)},data:t.map(e=>({value:e.value,name:e.name}))}]}}function s(){return{trigger:"item",backgroundColor:"rgba(2, 13, 22, 0.94)",borderColor:"rgba(48, 220, 255, 0.34)",borderWidth:1,textStyle:{color:"#fff",fontSize:12},formatter:t=>{const e=(i.chart.rows||[]).find(A=>A.name===t.name),n=(e==null?void 0:e.unit)||i.chart.unit||"",T=e!=null&&e.extra?`<br/><span style="color:rgba(223,250,255,.62)">${e.extra}</span>`:"";return`${t.marker}${t.name}: ${c(t.value)}${n}${T}`}}}function x(t=[]){return t.length>6||t.some(e=>String(e.name||"").length>4)}function c(t){const e=Number(t);return Number.isFinite(e)?Number.isInteger(e)?e.toLocaleString("zh-CN"):e.toLocaleString("zh-CN",{maximumFractionDigits:2}):"--"}return(t,e)=>(g(),p("div",{class:j(["smart-chart-card",{"is-horizontal":k.value}])},[f("div",q,[f("div",null,[f("strong",null,u(a.chart.title),1),f("span",null,u(a.chart.subtitle),1)]),a.chart.unit?(g(),p("em",G,u(a.chart.unit),1)):L("",!0)]),V(P(H),{class:"smart-chart",option:z.value,autoresize:""},null,8,["option"]),y.value?(g(),p("div",E,u(y.value),1)):L("",!0)],2))}};export{J as default}; |
{d}%`},labelLine:{lineStyle:{color:"rgba(223, 250, 255, 0.42)"}},itemStyle:{borderColor:"rgba(3, 18, 31, 0.92)",borderWidth:3},data:t.map((e,n)=>({name:e.name,value:e.value,itemStyle:{color:l[n%l.length]}}))}]}}function w(t){return{animationDuration:760,grid:{left:52,right:28,top:30,bottom:48},tooltip:d(m({},s()),{trigger:"axis",axisPointer:{type:"line",lineStyle:{color:"rgba(255, 215, 108, 0.52)"}}}),xAxis:{type:"category",boundaryGap:!1,data:t.map(e=>e.name),axisTick:{show:!1},axisLine:{lineStyle:{color:"rgba(48, 220, 255, 0.28)"}},axisLabel:{color:"rgba(223, 250, 255, 0.76)",fontSize:11,interval:0}},yAxis:{type:"value",axisLine:{show:!1},axisTick:{show:!1},splitLine:{lineStyle:{color:"rgba(48, 220, 255, 0.1)",type:"dashed"}},axisLabel:{color:"rgba(223, 250, 255, 0.58)",fontSize:11}},series:[{name:i.chart.title,type:"line",smooth:!0,symbol:"circle",symbolSize:8,lineStyle:{width:3,color:"#30dcff"},itemStyle:{color:"#ffd76c",borderColor:"#041522",borderWidth:2},areaStyle:{color:new b(0,0,0,1,[{offset:0,color:"rgba(48, 220, 255, 0.24)"},{offset:1,color:"rgba(48, 220, 255, 0.02)"}])},label:{show:!0,position:"top",color:"#ffffff",fontSize:11,formatter:({value:e})=>c(e)},data:t.map(e=>({value:e.value,name:e.name}))}]}}function s(){return{trigger:"item",backgroundColor:"rgba(2, 13, 22, 0.94)",borderColor:"rgba(48, 220, 255, 0.34)",borderWidth:1,textStyle:{color:"#fff",fontSize:12},formatter:t=>{const e=(i.chart.rows||[]).find(A=>A.name===t.name),n=(e==null?void 0:e.unit)||i.chart.unit||"",T=e!=null&&e.extra?`<br/><span style="color:rgba(223,250,255,.62)">${e.extra}</span>`:"";return`${t.marker}${t.name}: ${c(t.value)}${n}${T}`}}}function x(t=[]){return t.length>6||t.some(e=>String(e.name||"").length>4)}function c(t){const e=Number(t);return Number.isFinite(e)?Number.isInteger(e)?e.toLocaleString("zh-CN"):e.toLocaleString("zh-CN",{maximumFractionDigits:2}):"--"}return(t,e)=>(g(),p("div",{class:j(["smart-chart-card",{"is-horizontal":k.value}])},[f("div",q,[f("div",null,[f("strong",null,u(a.chart.title),1),f("span",null,u(a.chart.subtitle),1)]),a.chart.unit?(g(),p("em",G,u(a.chart.unit),1)):L("",!0)]),V(P(H),{class:"smart-chart",option:z.value,autoresize:""},null,8,["option"]),y.value?(g(),p("div",E,u(y.value),1)):L("",!0)],2))}};export{J as default}; |
||||||
|
Before Width: | Height: | Size: 93 KiB After Width: | Height: | Size: 93 KiB |
|
Before Width: | Height: | Size: 701 B After Width: | Height: | Size: 701 B |
|
Before Width: | Height: | Size: 668 B After Width: | Height: | Size: 668 B |
|
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 64 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 74 KiB After Width: | Height: | Size: 74 KiB |
|
Before Width: | Height: | Size: 149 B After Width: | Height: | Size: 149 B |
|
Before Width: | Height: | Size: 149 B After Width: | Height: | Size: 149 B |
|
Before Width: | Height: | Size: 981 B After Width: | Height: | Size: 981 B |
|
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 282 KiB After Width: | Height: | Size: 282 KiB |
|
Before Width: | Height: | Size: 7.8 KiB After Width: | Height: | Size: 7.8 KiB |
|
Before Width: | Height: | Size: 51 KiB After Width: | Height: | Size: 51 KiB |
|
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 54 KiB |
@ -1 +1 @@ |
|||||||
.login-screen[data-v-02c20620]{position:fixed;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;overflow:hidden;background:linear-gradient(180deg,rgba(4,16,38,.1),rgba(2,8,22,.62)),url(./bg-3acb94e3-balabala-1782661552655.png) center/cover no-repeat,#05142f;color:#fff}.login-screen[data-v-02c20620]:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;background:linear-gradient(90deg,rgba(0,0,0,.46),transparent 42%,rgba(0,0,0,.35)),radial-gradient(circle at 52% 46%,rgba(48,220,255,.16),transparent 32%)}.login-shell[data-v-02c20620]{position:relative;z-index:1;width:min(980px,100vw - 48px);display:grid;grid-template-columns:minmax(0,1fr) 360px;gap:56px;align-items:center}.login-brand[data-v-02c20620]{display:flex;flex-direction:column;gap:14px;min-width:0;text-shadow:0 0 20px rgba(48,220,255,.36)}.login-brand span[data-v-02c20620]{font-size:42px;line-height:1.2;font-weight:700}.login-brand small[data-v-02c20620]{color:#c4f3feb8;font-size:13px;letter-spacing:0}.login-panel[data-v-02c20620]{width:360px;padding:30px 28px 28px;border:1px solid rgba(48,220,255,.34);background:rgba(3,14,32,.82);box-shadow:0 24px 70px #00000057,inset 0 0 28px #30dcff14;box-sizing:border-box}.login-panel-title[data-v-02c20620]{margin-bottom:26px;color:#c4f3fe;font-size:22px;font-weight:700;text-align:center}.login-field[data-v-02c20620]{display:block;margin-bottom:18px}.login-field span[data-v-02c20620]{display:block;margin-bottom:8px;color:#c4f3fec7;font-size:13px}.login-field input[data-v-02c20620]{width:100%;height:42px;padding:0 12px;border:1px solid rgba(48,220,255,.26);outline:none;background:rgba(0,10,24,.62);color:#fff;font-size:15px;box-sizing:border-box}.login-field input[data-v-02c20620]:focus{border-color:#30dcffb8;box-shadow:0 0 0 2px #30dcff1f}.login-error[data-v-02c20620]{min-height:20px;margin:-4px 0 12px;color:#ffcf8a;font-size:13px;line-height:20px}.login-submit[data-v-02c20620]{width:100%;height:44px;border:1px solid rgba(48,220,255,.52);background:linear-gradient(90deg,rgba(24,140,196,.92),rgba(37,204,218,.92));color:#fff;cursor:pointer;font-size:16px;font-weight:700}.login-submit[data-v-02c20620]:disabled{cursor:not-allowed;opacity:.68}@media (max-width: 820px){.login-shell[data-v-02c20620]{grid-template-columns:1fr;gap:28px}.login-brand span[data-v-02c20620]{font-size:30px}.login-panel[data-v-02c20620]{width:100%}} |
.login-screen[data-v-02c20620]{position:fixed;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;overflow:hidden;background:linear-gradient(180deg,rgba(4,16,38,.1),rgba(2,8,22,.62)),url(./bg-3acb94e3-balabala-1782919616283.png) center/cover no-repeat,#05142f;color:#fff}.login-screen[data-v-02c20620]:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;background:linear-gradient(90deg,rgba(0,0,0,.46),transparent 42%,rgba(0,0,0,.35)),radial-gradient(circle at 52% 46%,rgba(48,220,255,.16),transparent 32%)}.login-shell[data-v-02c20620]{position:relative;z-index:1;width:min(980px,100vw - 48px);display:grid;grid-template-columns:minmax(0,1fr) 360px;gap:56px;align-items:center}.login-brand[data-v-02c20620]{display:flex;flex-direction:column;gap:14px;min-width:0;text-shadow:0 0 20px rgba(48,220,255,.36)}.login-brand span[data-v-02c20620]{font-size:42px;line-height:1.2;font-weight:700}.login-brand small[data-v-02c20620]{color:#c4f3feb8;font-size:13px;letter-spacing:0}.login-panel[data-v-02c20620]{width:360px;padding:30px 28px 28px;border:1px solid rgba(48,220,255,.34);background:rgba(3,14,32,.82);box-shadow:0 24px 70px #00000057,inset 0 0 28px #30dcff14;box-sizing:border-box}.login-panel-title[data-v-02c20620]{margin-bottom:26px;color:#c4f3fe;font-size:22px;font-weight:700;text-align:center}.login-field[data-v-02c20620]{display:block;margin-bottom:18px}.login-field span[data-v-02c20620]{display:block;margin-bottom:8px;color:#c4f3fec7;font-size:13px}.login-field input[data-v-02c20620]{width:100%;height:42px;padding:0 12px;border:1px solid rgba(48,220,255,.26);outline:none;background:rgba(0,10,24,.62);color:#fff;font-size:15px;box-sizing:border-box}.login-field input[data-v-02c20620]:focus{border-color:#30dcffb8;box-shadow:0 0 0 2px #30dcff1f}.login-error[data-v-02c20620]{min-height:20px;margin:-4px 0 12px;color:#ffcf8a;font-size:13px;line-height:20px}.login-submit[data-v-02c20620]{width:100%;height:44px;border:1px solid rgba(48,220,255,.52);background:linear-gradient(90deg,rgba(24,140,196,.92),rgba(37,204,218,.92));color:#fff;cursor:pointer;font-size:16px;font-weight:700}.login-submit[data-v-02c20620]:disabled{cursor:not-allowed;opacity:.68}@media (max-width: 820px){.login-shell[data-v-02c20620]{grid-template-columns:1fr;gap:28px}.login-brand span[data-v-02c20620]{font-size:30px}.login-panel[data-v-02c20620]{width:100%}} |
||||||
@ -1 +1 @@ |
|||||||
/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}*,body{padding:0;margin:0}html,body,#app{width:100%;height:100%;overflow:hidden} |
/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}*,body{padding:0;margin:0}*{box-sizing:border-box}html,body,#app{width:100%;height:100%;overflow:hidden}body{font-family:AlibabaPuHuiTi,Microsoft YaHei,Arial,sans-serif;font-size:14px;color:#e7fbff}button,input,select,textarea{font:inherit} |
||||||
@ -1 +1 @@ |
|||||||
var m=(v,d,n)=>new Promise((i,a)=>{var u=l=>{try{r(n.next(l))}catch(t){a(t)}},o=l=>{try{r(n.throw(l))}catch(t){a(t)}},r=l=>l.done?i(l.value):Promise.resolve(l.value).then(u,o);r((n=n.apply(v,d)).next())});import{_ as x,P as w,Q as h,e as R,o as _,c as f,a as e,J as S,G as g,H as y,t as b,g as V,d as p,R as k}from"./index-1782661552655.js";const B={class:"login-screen"},D={class:"login-shell"},H={class:"login-field"},M={class:"login-field"},P={key:0,class:"login-error"},U=["disabled"],q={__name:"index",setup(v){const d=w(),n=h(),i=p(""),a=p(""),u=p(!1),o=p(""),r=R(()=>{const t=typeof d.query.redirect=="string"?decodeURIComponent(d.query.redirect):"/platform";return t.startsWith("/login")?"/platform":t||"/platform"});function l(){return m(this,null,function*(){if(o.value="",!i.value||!a.value){o.value="请输入账号和密码。";return}u.value=!0;try{yield k(i.value,a.value),n.replace(r.value)}catch(t){o.value=(t==null?void 0:t.message)||"登录失败,请稍后再试。"}finally{u.value=!1}})}return(t,s)=>(_(),f("div",B,[e("div",D,[s[5]||(s[5]=e("div",{class:"login-brand"},[e("span",null,"红原县数字畜牧业监管平台"),e("small",null,"Hongyuan Digital Animal Husbandry Supervision Platform")],-1)),e("form",{class:"login-panel",onSubmit:S(l,["prevent"])},[s[4]||(s[4]=e("div",{class:"login-panel-title"},"用户登录",-1)),e("label",H,[s[2]||(s[2]=e("span",null,"账号",-1)),g(e("input",{"onUpdate:modelValue":s[0]||(s[0]=c=>i.value=c),autocomplete:"username",autofocus:"",placeholder:"请输入账号"},null,512),[[y,i.value,void 0,{trim:!0}]])]),e("label",M,[s[3]||(s[3]=e("span",null,"密码",-1)),g(e("input",{"onUpdate:modelValue":s[1]||(s[1]=c=>a.value=c),autocomplete:"current-password",placeholder:"请输入密码",type:"password"},null,512),[[y,a.value]])]),o.value?(_(),f("div",P,b(o.value),1)):V("",!0),e("button",{class:"login-submit",disabled:u.value,type:"submit"},b(u.value?"登录中":"登录"),9,U)],32)])]))}},N=x(q,[["__scopeId","data-v-02c20620"]]);export{N as default}; |
var m=(v,d,n)=>new Promise((i,a)=>{var u=l=>{try{r(n.next(l))}catch(t){a(t)}},o=l=>{try{r(n.throw(l))}catch(t){a(t)}},r=l=>l.done?i(l.value):Promise.resolve(l.value).then(u,o);r((n=n.apply(v,d)).next())});import{_ as x,P as w,Q as h,e as R,o as _,c as f,a as e,J as S,G as g,H as y,t as b,g as V,d as p,R as k}from"./index-1782919616283.js";const B={class:"login-screen"},D={class:"login-shell"},H={class:"login-field"},M={class:"login-field"},P={key:0,class:"login-error"},U=["disabled"],q={__name:"index",setup(v){const d=w(),n=h(),i=p(""),a=p(""),u=p(!1),o=p(""),r=R(()=>{const t=typeof d.query.redirect=="string"?decodeURIComponent(d.query.redirect):"/platform";return t.startsWith("/login")?"/platform":t||"/platform"});function l(){return m(this,null,function*(){if(o.value="",!i.value||!a.value){o.value="请输入账号和密码。";return}u.value=!0;try{yield k(i.value,a.value),n.replace(r.value)}catch(t){o.value=(t==null?void 0:t.message)||"登录失败,请稍后再试。"}finally{u.value=!1}})}return(t,s)=>(_(),f("div",B,[e("div",D,[s[5]||(s[5]=e("div",{class:"login-brand"},[e("span",null,"红原县数字畜牧业监管平台"),e("small",null,"Hongyuan Digital Animal Husbandry Supervision Platform")],-1)),e("form",{class:"login-panel",onSubmit:S(l,["prevent"])},[s[4]||(s[4]=e("div",{class:"login-panel-title"},"用户登录",-1)),e("label",H,[s[2]||(s[2]=e("span",null,"账号",-1)),g(e("input",{"onUpdate:modelValue":s[0]||(s[0]=c=>i.value=c),autocomplete:"username",autofocus:"",placeholder:"请输入账号"},null,512),[[y,i.value,void 0,{trim:!0}]])]),e("label",M,[s[3]||(s[3]=e("span",null,"密码",-1)),g(e("input",{"onUpdate:modelValue":s[1]||(s[1]=c=>a.value=c),autocomplete:"current-password",placeholder:"请输入密码",type:"password"},null,512),[[y,a.value]])]),o.value?(_(),f("div",P,b(o.value),1)):V("",!0),e("button",{class:"login-submit",disabled:u.value,type:"submit"},b(u.value?"登录中":"登录"),9,U)],32)])]))}},N=x(q,[["__scopeId","data-v-02c20620"]]);export{N as default}; |
||||||
|
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 4.8 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 4.9 KiB After Width: | Height: | Size: 4.9 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 7.2 KiB After Width: | Height: | Size: 7.2 KiB |
|
Before Width: | Height: | Size: 82 KiB After Width: | Height: | Size: 82 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 499 B After Width: | Height: | Size: 499 B |
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
@ -0,0 +1,5 @@ |
|||||||
|
<!doctype html><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0"><title>牦牛产业链业务报告</title><style> |
||||||
|
*{box-sizing:border-box}html,body{margin:0;width:100%;height:100%;overflow:hidden;background:#061018;color:#edfaff;font-family:"PingFang SC","Microsoft YaHei",Arial,sans-serif}.screen{position:relative;width:100vw;height:100vh;min-width:1280px;min-height:720px;background:radial-gradient(circle at 70% 44%,rgba(38,152,190,.2),transparent 30%),linear-gradient(180deg,#081b29,#06121c 56%,#040910)}.screen:before{content:"";position:absolute;inset:0;background-image:linear-gradient(rgba(75,174,198,.07) 1px,transparent 1px),linear-gradient(90deg,rgba(75,174,198,.06) 1px,transparent 1px);background-size:48px 48px;mask-image:linear-gradient(90deg,#000 0 44%,rgba(0,0,0,.65) 62%,transparent)}header{position:absolute;left:0;right:0;top:0;height:82px;display:flex;align-items:center;justify-content:center;background:linear-gradient(180deg,rgba(14,56,82,.9),transparent);z-index:3}h1{margin:0;font-size:30px;text-shadow:0 0 18px rgba(63,210,255,.48)}.sub{position:absolute;top:57px;font-size:13px;color:rgba(218,240,246,.72)}.report{position:absolute;left:24px;top:88px;bottom:28px;width:455px;display:flex;flex-direction:column;gap:10px;z-index:2}.card{border:1px solid rgba(91,209,244,.32);background:linear-gradient(180deg,rgba(7,30,47,.9),rgba(6,23,36,.76));box-shadow:inset 0 0 26px rgba(45,174,215,.08),0 10px 30px rgba(0,0,0,.18);border-radius:6px;padding:12px 14px;position:relative;overflow:hidden}.card:before{content:"";position:absolute;left:0;right:0;top:0;height:2px;background:linear-gradient(90deg,transparent,rgba(65,221,255,.8),transparent)}.title{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px;font-size:16px;font-weight:650}.title span{font-size:12px;color:rgba(211,238,244,.64);font-weight:400}.kpi{height:126px}.grid{display:grid;grid-template-columns:1fr 1fr;gap:8px}.metric{height:39px;padding:6px 8px;border:1px solid rgba(94,188,224,.16);border-radius:5px;background:rgba(4,19,30,.54)}.metric label{font-size:12px;color:rgba(207,232,239,.68)}.metric strong{float:right;font-size:18px;color:#63e7ff}.metric small{margin-left:3px;color:rgba(222,241,247,.76)}.chain-section{height:102px}.section-head{display:flex;align-items:baseline;justify-content:space-between;gap:8px}.section-head b{font-size:15px;color:#ecfdff}.section-head span{font-size:12px;color:#76e5ff}.desc{margin-top:4px;font-size:12px;color:rgba(218,238,244,.68);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mini{display:flex;gap:6px;margin-top:8px}.mini div{flex:1;min-width:0;padding:6px 7px;border-radius:5px;background:rgba(4,19,30,.52);border:1px solid rgba(94,188,224,.14);font-size:12px}.mini strong{display:block;margin-top:2px;font-size:16px;color:#a4e65c}.badges{margin-top:7px;display:flex;gap:5px;overflow:hidden}.badge{padding:4px 6px;border-radius:4px;background:rgba(5,22,34,.62);border:1px solid rgba(111,202,232,.18);font-size:11px;color:rgba(234,249,252,.88);white-space:nowrap}.canvas{position:absolute;left:520px;right:34px;top:130px;bottom:88px;border:1px solid rgba(80,193,230,.12);border-radius:8px;background:radial-gradient(circle at 45% 45%,rgba(47,146,164,.22),transparent 30%),rgba(4,17,27,.18);z-index:1}.canvas:before{content:"牦牛产业链业务主线";position:absolute;left:44px;top:38px;font-size:34px;font-weight:700;color:rgba(240,253,255,.9);text-shadow:0 0 18px rgba(64,210,255,.3)}.canvas:after{content:"资源草畜基础 → 养殖育种 → 饲草保障 → 屠宰加工 → 产业服务。当前只把有数据支撑的业务环节放入左侧报告。";position:absolute;left:46px;top:90px;font-size:15px;color:rgba(220,241,247,.68);max-width:760px;line-height:1.8}.flow{position:absolute;left:50px;right:70px;bottom:74px;display:grid;grid-template-columns:repeat(5,1fr);gap:12px}.node{height:78px;border:1px solid rgba(105,211,242,.24);border-radius:6px;background:rgba(7,30,47,.54);display:flex;align-items:center;justify-content:center;text-align:center;font-size:14px;color:#e9fbff}.node:not(:last-child):after{content:"";position:absolute}.rings{position:absolute;right:12%;top:20%;width:360px;height:360px;border-radius:50%;border:1px solid rgba(95,220,245,.16)}.rings:before,.rings:after{content:"";position:absolute;border-radius:50%;border:1px dashed rgba(95,220,245,.18)}.rings:before{inset:54px}.rings:after{inset:110px;background:rgba(45,166,150,.08)} |
||||||
|
</style></head><body><div class="screen"><header><h1>红原牦牛产业链业务报告</h1><div class="sub">按照产业链业务环节组织:资源、养殖、饲草、加工、服务</div></header><aside class="report"><section class="card kpi"><div class="title">产业链关键业务数<span>有数据支撑</span></div><div class="grid" id="kpis"></div></section><div id="sections"></div></aside><main class="canvas"><div class="rings"></div><div class="flow"><div class="node">资源草畜基础</div><div class="node">养殖育种</div><div class="node">饲草防灾</div><div class="node">屠宰加工</div><div class="node">产业服务</div></div></main></div><script> |
||||||
|
const DATA={"kpis": [{"label": "家庭生态牧场", "value": 82, "unit": "户", "note": "源头经营主体"}, {"label": "养殖育种主体", "value": 52, "unit": "个", "note": "养殖与繁育"}, {"label": "饲草储备能力", "value": 10500.0, "unit": "吨", "note": "防灾保障"}, {"label": "加工屠宰主体", "value": 16, "unit": "家", "note": "转化承接"}], "sections": [{"key": "resource", "title": "一、资源与草畜基础", "desc": "草原资源、家庭牧场和牦牛生产承载,是产业链的底盘。", "codes": ["YC-GRASSLAND-RESOURCE", "YC-FAMILY-PASTURE"], "count": 85, "types": [{"name": "林草资源数据", "value": 3}, {"name": "家庭生态牧场", "value": 82}], "townRows": [{"name": "龙日镇", "value": 16}, {"name": "邛溪镇", "value": 16}, {"name": "瓦切镇", "value": 16}, {"name": "查尔玛乡", "value": 10}, {"name": "安曲镇", "value": 7}], "metrics": [{"name": "家庭牧场", "value": 82, "unit": "户"}, {"name": "资源指标", "value": 3, "unit": "项"}]}, {"key": "production", "title": "二、养殖与良种繁育", "desc": "标准化养殖基地和育种场决定源头供给能力。", "codes": ["YC-BREEDING-BASE", "YC-CXPT-BREEDING-BASE", "YC-BREEDING-STOCK", "YC-CXPT-BREEDING-STOCK-BASE"], "count": 52, "types": [{"name": "标准化养殖基地", "value": 19}, {"name": "cxpt养殖基地", "value": 28}, {"name": "育种繁育场", "value": 4}, {"name": "cxpt种畜基地", "value": 1}], "townRows": [{"name": "邛溪镇", "value": 6}, {"name": "安曲镇", "value": 4}, {"name": "瓦切镇", "value": 4}, {"name": "查尔玛乡", "value": 3}, {"name": "刷经寺镇", "value": 2}], "metrics": [{"name": "基地主体", "value": 52, "unit": "个"}, {"name": "设计存栏", "value": 9385.0, "unit": "头"}, {"name": "年出栏", "value": 18483.0, "unit": "头"}]}, {"key": "forage", "title": "三、饲草与防灾保障", "desc": "种草基地、草种基地和储备库决定补饲与抗灾能力。", "codes": ["YC-FORAGE-BASE", "YC-CXPT-FORAGE-BASE", "YC-CXPT-GRASS-SEED-BASE", "YC-DISASTER-FORAGE-STORAGE"], "count": 21, "types": [{"name": "种草饲草基地", "value": 8}, {"name": "cxpt饲草基地", "value": 5}, {"name": "cxpt草种基地", "value": 1}, {"name": "防灾减灾饲草储备库", "value": 7}], "townRows": [{"name": "瓦切镇", "value": 7}, {"name": "龙日镇", "value": 4}, {"name": "安曲镇", "value": 3}, {"name": "邛溪镇", "value": 1}, {"name": "刷经寺镇", "value": 1}], "metrics": [{"name": "保障主体", "value": 21, "unit": "个"}, {"name": "种植面积", "value": 21000.0, "unit": "亩"}, {"name": "储备库容", "value": 10500.0, "unit": "吨"}]}, {"key": "processing", "title": "四、屠宰与加工转化", "desc": "乳品加工、肉品加工和屠宰主体承接一产转化。", "codes": ["YC-PROCESSING-PLANT", "YC-SLAUGHTERHOUSE"], "count": 16, "types": [{"name": "加工厂", "value": 9}, {"name": "屠宰厂", "value": 7}], "townRows": [], "metrics": [{"name": "加工屠宰主体", "value": 16, "unit": "家"}, {"name": "年加工鲜奶", "value": 13000.0, "unit": "吨"}, {"name": "年屠宰量", "value": 68000.0, "unit": "头"}, {"name": "加工产值", "value": 59394.630000000005, "unit": "万元"}]}, {"key": "service", "title": "五、产业服务支撑", "desc": "金融、保险、防疫、培训、农机和交易服务支撑产业运行。", "codes": ["YC-DISEASE-CONTROL", "YC-TECH-TRAINING", "YC-SERVICE-FINANCE", "YC-SERVICE-INSURANCE", "YC-CXPT-OTHER-BASE", "YC-FARM-EQUIPMENT"], "count": 32, "types": [{"name": "疫病防控", "value": 3}, {"name": "技术培训", "value": 8}, {"name": "金融服务网点", "value": 4}, {"name": "保险服务网点", "value": 4}, {"name": "cxpt其他基地", "value": 11}, {"name": "农机装备", "value": 2}], "townRows": [{"name": "邛溪镇", "value": 7}, {"name": "瓦切镇", "value": 2}, {"name": "阿木乡", "value": 2}, {"name": "全县覆盖", "value": 1}, {"name": "马尔康市 / 邛溪镇", "value": 1}], "metrics": [{"name": "服务主体", "value": 32, "unit": "个"}, {"name": "服务类型", "value": 6, "unit": "类"}, {"name": "覆盖乡镇", "value": 55.0, "unit": "个次"}]}]};function fmt(v){if(typeof v==='string')return v;if(Math.abs(v)>=10000)return (v/10000).toFixed(1)+'万';return Number(v||0).toLocaleString('zh-CN')}document.getElementById('kpis').innerHTML=DATA.kpis.map(x=>`<div class="metric"><label>${x.label}</label><strong>${fmt(x.value)}<small>${x.unit}</small></strong></div>`).join('');document.getElementById('sections').innerHTML=DATA.sections.map(s=>`<section class="card chain-section"><div class="section-head"><b>${s.title}</b><span>${s.count}条</span></div><div class="desc">${s.desc}</div><div class="mini">${s.metrics.slice(0,3).map(m=>`<div>${m.name}<strong>${fmt(m.value)}${m.unit}</strong></div>`).join('')}</div><div class="badges">${s.types.slice(0,4).map(t=>`<span class="badge">${t.name} ${t.value}</span>`).join('')}</div></section>`).join('') |
||||||
|
</script></body></html> |
||||||
@ -0,0 +1,5 @@ |
|||||||
|
<!doctype html><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0"><title>牦牛产业基础统计报告</title><style> |
||||||
|
*{box-sizing:border-box}html,body{margin:0;width:100%;height:100%;overflow:hidden;background:#061018;color:#edfaff;font-family:"PingFang SC","Microsoft YaHei",Arial,sans-serif}.screen{position:relative;width:100vw;height:100vh;min-width:1280px;min-height:720px;background:radial-gradient(circle at 68% 42%,rgba(41,164,196,.22),transparent 28%),linear-gradient(180deg,#081d2c,#06121c 55%,#040910)}.screen:before{content:"";position:absolute;inset:0;background-image:linear-gradient(rgba(76,176,199,.07) 1px,transparent 1px),linear-gradient(90deg,rgba(76,176,199,.06) 1px,transparent 1px);background-size:48px 48px;mask-image:linear-gradient(90deg,#000 0 42%,rgba(0,0,0,.72) 62%,transparent)}header{position:absolute;left:0;right:0;top:0;height:82px;display:flex;align-items:center;justify-content:center;background:linear-gradient(180deg,rgba(14,56,82,.9),transparent);z-index:3}h1{margin:0;font-size:30px;text-shadow:0 0 18px rgba(63,210,255,.48)}.sub{position:absolute;top:57px;font-size:13px;color:rgba(218,240,246,.72)}.report{position:absolute;left:24px;top:88px;bottom:28px;width:430px;display:flex;flex-direction:column;gap:12px;z-index:2}.card{border:1px solid rgba(91,209,244,.32);background:linear-gradient(180deg,rgba(7,30,47,.88),rgba(6,23,36,.74));box-shadow:inset 0 0 26px rgba(45,174,215,.08),0 10px 30px rgba(0,0,0,.18);border-radius:6px;padding:14px 15px;position:relative;overflow:hidden}.card:before{content:"";position:absolute;left:0;right:0;top:0;height:2px;background:linear-gradient(90deg,transparent,rgba(65,221,255,.8),transparent)}.title{display:flex;justify-content:space-between;align-items:center;height:22px;margin-bottom:10px;font-size:16px;font-weight:650}.title span{font-size:12px;color:rgba(209,236,244,.62);font-weight:400}.summary{height:150px}.grid{display:grid;grid-template-columns:1fr 1fr;gap:10px}.metric{height:48px;padding:8px 10px;border:1px solid rgba(94,188,224,.16);border-radius:5px;background:rgba(4,19,30,.54)}.metric label{display:block;font-size:12px;color:rgba(207,232,239,.68)}.metric strong{display:inline-block;margin-top:4px;font-size:22px;line-height:1;color:#63e7ff}.metric small{margin-left:4px;color:rgba(222,241,247,.76)}.bars-card{height:150px}.ability{height:176px}.subcat{height:156px}.town{flex:1;min-height:140px}.bars{display:flex;flex-direction:column;gap:7px}.bar{display:grid;grid-template-columns:118px 1fr 54px;gap:8px;align-items:center;font-size:12px;color:rgba(231,247,250,.88)}.name{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.track{height:8px;border-radius:99px;background:rgba(110,157,175,.18);overflow:hidden}.fill{height:100%;border-radius:99px;background:linear-gradient(90deg,#35d7ff,#9cf1ff)}.ability-list{display:grid;grid-template-columns:1fr;gap:7px}.ability-row{display:flex;justify-content:space-between;align-items:center;padding:7px 9px;border:1px solid rgba(94,188,224,.13);border-radius:5px;background:rgba(4,19,30,.48);font-size:12px}.ability-row strong{font-size:18px;color:#a4e65c}.badges{display:flex;flex-wrap:wrap;gap:7px}.badge{padding:6px 8px;border:1px solid rgba(111,202,232,.18);border-radius:5px;background:rgba(5,22,34,.58);font-size:12px;color:rgba(234,249,252,.9)}.note{margin-top:8px;font-size:12px;color:rgba(218,239,245,.6)}.stage{position:absolute;left:500px;right:34px;top:130px;bottom:88px;border:1px solid rgba(80,193,230,.12);border-radius:8px;background:radial-gradient(circle at 45% 45%,rgba(47,146,164,.22),transparent 30%),rgba(4,17,27,.18);z-index:1}.stage:before{content:"产业数据基础报告";position:absolute;left:44px;top:38px;font-size:34px;font-weight:700;color:rgba(240,253,255,.9);text-shadow:0 0 18px rgba(64,210,255,.3)}.stage:after{content:"右侧区域可承载地图、主体点位或后续专题内容;当前不强行填充无依据图表。";position:absolute;left:46px;top:88px;font-size:15px;color:rgba(220,241,247,.68)}.rings{position:absolute;right:12%;top:22%;width:380px;height:380px;border-radius:50%;border:1px solid rgba(95,220,245,.16)}.rings:before,.rings:after{content:"";position:absolute;border-radius:50%;border:1px dashed rgba(95,220,245,.18)}.rings:before{inset:54px}.rings:after{inset:110px;background:rgba(45,166,150,.08)} |
||||||
|
</style></head><body><div class="screen"><header><h1>红原牦牛产业基础统计报告</h1><div class="sub">只展示当前数据能够支撑的指标、分布和分类</div></header><aside class="report"><section class="card summary"><div class="title">核心指标<span>全链</span></div><div class="grid" id="summary"></div></section><section class="card bars-card"><div class="title">节点分布<span>主体数量</span></div><div class="bars" id="stageBars"></div></section><section class="card ability"><div class="title">能力指标<span>生产保障</span></div><div class="ability-list" id="abilities"></div></section><section class="card subcat"><div class="title">分类构成<span>业务类型</span></div><div class="badges" id="subcats"></div></section><section class="card town"><div class="title">乡镇分布<span>Top 8</span></div><div class="bars" id="townBars"></div><div class="note" id="townNote"></div></section></aside><main class="stage"><div class="rings"></div></main></div><script> |
||||||
|
const DATA={"summary": [{"name": "全链主体", "value": 206, "unit": "条"}, {"name": "家庭牧场", "value": 82, "unit": "户"}, {"name": "养殖育种主体", "value": 52, "unit": "个"}, {"name": "服务主体", "value": 32, "unit": "个"}], "stageCounts": [{"name": "家庭生态牧场", "value": 82}, {"name": "养殖育种基地", "value": 52}, {"name": "饲草防灾保障", "value": 21}, {"name": "屠宰加工主体", "value": 16}, {"name": "社会化服务", "value": 32}, {"name": "林草资源底座", "value": 3}], "abilities": [{"name": "设计存栏", "value": 9385.0, "unit": "头"}, {"name": "年出栏量", "value": 18483.0, "unit": "头"}, {"name": "饲草种植面积", "value": 21000.0, "unit": "亩"}, {"name": "饲草储备库容", "value": 10500.0, "unit": "吨"}, {"name": "年加工鲜奶", "value": 13000.0, "unit": "吨"}, {"name": "年屠宰量", "value": 68000.0, "unit": "头"}, {"name": "加工屠宰产值", "value": 59394.630000000005, "unit": "万元"}], "subcats": [{"name": "家庭生态牧场", "value": 82, "group": "家庭生态牧场"}, {"name": "标准化养殖基地", "value": 19, "group": "养殖育种基地"}, {"name": "cxpt养殖基地", "value": 28, "group": "养殖育种基地"}, {"name": "育种繁育场", "value": 4, "group": "养殖育种基地"}, {"name": "cxpt种畜基地", "value": 1, "group": "养殖育种基地"}, {"name": "种草饲草基地", "value": 8, "group": "饲草防灾保障"}, {"name": "cxpt饲草基地", "value": 5, "group": "饲草防灾保障"}, {"name": "cxpt草种基地", "value": 1, "group": "饲草防灾保障"}, {"name": "防灾减灾饲草储备库", "value": 7, "group": "饲草防灾保障"}, {"name": "加工厂", "value": 9, "group": "屠宰加工主体"}, {"name": "屠宰厂", "value": 7, "group": "屠宰加工主体"}, {"name": "疫病防控", "value": 3, "group": "社会化服务"}, {"name": "技术培训", "value": 8, "group": "社会化服务"}, {"name": "金融服务网点", "value": 4, "group": "社会化服务"}, {"name": "保险服务网点", "value": 4, "group": "社会化服务"}, {"name": "cxpt其他基地", "value": 11, "group": "社会化服务"}, {"name": "农机装备", "value": 2, "group": "社会化服务"}, {"name": "林草资源数据", "value": 3, "group": "林草资源底座"}], "townRows": [{"name": "邛溪镇", "value": 30}, {"name": "瓦切镇", "value": 29}, {"name": "龙日镇", "value": 22}, {"name": "安曲镇", "value": 15}, {"name": "查尔玛乡", "value": 13}, {"name": "江茸乡", "value": 10}, {"name": "阿木乡", "value": 10}, {"name": "刷经寺镇", "value": 8}], "missingTown": 61};function fmt(v){return Number(v||0).toLocaleString('zh-CN')}function renderMetrics(){document.getElementById('summary').innerHTML=DATA.summary.map(x=>`<div class="metric"><label>${x.name}</label><strong>${fmt(x.value)}</strong><small>${x.unit}</small></div>`).join('')}function bars(id,rows){const max=Math.max(...rows.map(r=>+r.value||0),1);document.getElementById(id).innerHTML=rows.map(r=>`<div class="bar"><div class="name" title="${r.name}">${r.name}</div><div class="track"><div class="fill" style="width:${Math.max(4,(+r.value||0)/max*100)}%"></div></div><div>${fmt(r.value)}</div></div>`).join('')}function render(){renderMetrics();bars('stageBars',DATA.stageCounts);bars('townBars',DATA.townRows);document.getElementById('abilities').innerHTML=DATA.abilities.map(x=>`<div class="ability-row"><span>${x.name}</span><strong>${fmt(x.value)}<small>${x.unit}</small></strong></div>`).join('');document.getElementById('subcats').innerHTML=DATA.subcats.map(x=>`<span class="badge">${x.name} · ${x.value}</span>`).join('');document.getElementById('townNote').textContent=`另有 ${DATA.missingTown} 条主体未明确乡镇,暂不计入乡镇排行。`}render(); |
||||||
|
</script></body></html> |
||||||
|
After Width: | Height: | Size: 38 KiB |
@ -0,0 +1,116 @@ |
|||||||
|
import hongyuanTownshipsRaw from "/public/datas/geojsons/hongyuan-townships.geojson?raw" |
||||||
|
|
||||||
|
const townshipNameAliases = { |
||||||
|
安曲乡: "安曲镇", |
||||||
|
龙日乡: "龙日镇", |
||||||
|
瓦切乡: "瓦切镇", |
||||||
|
色地乡: "色地镇", |
||||||
|
壤口乡: "刷经寺镇", |
||||||
|
} |
||||||
|
|
||||||
|
const legacyTownCodeNames = { |
||||||
|
"513233100": "邛溪镇", |
||||||
|
"513233101": "刷经寺镇", |
||||||
|
"513233103": "安曲镇", |
||||||
|
"513233105": "龙日镇", |
||||||
|
"513233200": "安曲镇", |
||||||
|
"513233201": "龙日镇", |
||||||
|
"513233202": "江茸乡", |
||||||
|
"513233203": "查尔玛乡", |
||||||
|
"513233204": "瓦切镇", |
||||||
|
"513233205": "阿木乡", |
||||||
|
"513233206": "刷经寺镇", |
||||||
|
"513233207": "麦洼乡", |
||||||
|
"513233208": "色地镇", |
||||||
|
} |
||||||
|
|
||||||
|
const townshipEnNames = { |
||||||
|
邛溪镇: "qiongxi", |
||||||
|
刷经寺镇: "shuajingsi", |
||||||
|
安曲镇: "anqu", |
||||||
|
龙日镇: "longri", |
||||||
|
江茸乡: "jiangrong", |
||||||
|
查尔玛乡: "chaerma", |
||||||
|
瓦切镇: "waqie", |
||||||
|
阿木乡: "amu", |
||||||
|
麦洼乡: "maiwa", |
||||||
|
色地镇: "sedi", |
||||||
|
} |
||||||
|
|
||||||
|
const townshipValues = { |
||||||
|
色地镇: 1199, |
||||||
|
瓦切镇: 991, |
||||||
|
刷经寺镇: 986, |
||||||
|
邛溪镇: 896, |
||||||
|
阿木乡: 892, |
||||||
|
安曲镇: 885, |
||||||
|
查尔玛乡: 729, |
||||||
|
龙日镇: 645, |
||||||
|
麦洼乡: 559, |
||||||
|
江茸乡: 514, |
||||||
|
} |
||||||
|
|
||||||
|
function parseGeoJson(raw) { |
||||||
|
try { |
||||||
|
return JSON.parse(raw) |
||||||
|
} catch (error) { |
||||||
|
return { type: "FeatureCollection", features: [] } |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
function readPoint(feature = {}) { |
||||||
|
const properties = feature.properties || {} |
||||||
|
const point = properties.cp || properties.center || properties.centroid || properties.sourceCenter |
||||||
|
if (Array.isArray(point) && Number.isFinite(Number(point[0])) && Number.isFinite(Number(point[1]))) { |
||||||
|
return [Number(point[0]), Number(point[1])] |
||||||
|
} |
||||||
|
return [0, 0] |
||||||
|
} |
||||||
|
|
||||||
|
export const hongyuanTownshipsGeoJsonRaw = hongyuanTownshipsRaw |
||||||
|
export const hongyuanTownshipsGeoJson = parseGeoJson(hongyuanTownshipsRaw) |
||||||
|
export const hongyuanTownshipFeatures = hongyuanTownshipsGeoJson.features || [] |
||||||
|
|
||||||
|
const townshipsByCode = hongyuanTownshipFeatures.reduce((result, feature) => { |
||||||
|
const properties = feature.properties || {} |
||||||
|
const name = normalizeHongyuanTownName(properties.name) |
||||||
|
;[properties.code, properties.fullCode].forEach((code) => { |
||||||
|
const normalizedCode = String(code || "").replace(/\D/g, "") |
||||||
|
if (normalizedCode && name) result[normalizedCode] = name |
||||||
|
}) |
||||||
|
return result |
||||||
|
}, { ...legacyTownCodeNames }) |
||||||
|
|
||||||
|
export const hongyuanTownshipLabelPoints = hongyuanTownshipFeatures.map((feature) => { |
||||||
|
const properties = feature.properties || {} |
||||||
|
const name = normalizeHongyuanTownName(properties.name) |
||||||
|
const center = readPoint(feature) |
||||||
|
return { |
||||||
|
name, |
||||||
|
code: properties.code, |
||||||
|
fullCode: properties.fullCode, |
||||||
|
center, |
||||||
|
centroid: center, |
||||||
|
acreageMu: Number(properties.acreageMu) || 0, |
||||||
|
} |
||||||
|
}) |
||||||
|
|
||||||
|
export const hongyuanTownshipRankingPoints = hongyuanTownshipLabelPoints |
||||||
|
.map((item) => ({ |
||||||
|
...item, |
||||||
|
enName: townshipEnNames[item.name] || "", |
||||||
|
value: townshipValues[item.name] || 0, |
||||||
|
})) |
||||||
|
.sort((a, b) => b.value - a.value) |
||||||
|
|
||||||
|
export function normalizeHongyuanTownName(value) { |
||||||
|
const text = String(value || "").trim() |
||||||
|
if (!text || text === "--") return "" |
||||||
|
return townshipNameAliases[text] || text |
||||||
|
} |
||||||
|
|
||||||
|
export function getHongyuanTownshipNameByCode(value) { |
||||||
|
const normalizedCode = String(value || "").replace(/\D/g, "") |
||||||
|
if (!normalizedCode) return "" |
||||||
|
return townshipsByCode[normalizedCode] || townshipsByCode[normalizedCode.slice(0, 12)] || townshipsByCode[normalizedCode.slice(0, 9)] || "" |
||||||
|
} |
||||||
@ -0,0 +1,113 @@ |
|||||||
|
import { normalizeResponseData, requestJson } from "./request" |
||||||
|
|
||||||
|
const JSY_API_BASE = import.meta.env.VITE_JSY_API_BASE || "/jsyApi" |
||||||
|
const HONGYUAN_TOWN_NAMES = [ |
||||||
|
"邛溪镇", |
||||||
|
"刷经寺镇", |
||||||
|
"安曲镇", |
||||||
|
"龙日镇", |
||||||
|
"江茸乡", |
||||||
|
"查尔玛乡", |
||||||
|
"瓦切镇", |
||||||
|
"阿木乡", |
||||||
|
"麦洼乡", |
||||||
|
"色地镇", |
||||||
|
] |
||||||
|
|
||||||
|
function joinBase(path) { |
||||||
|
if (/^https?:\/\//.test(path)) return path |
||||||
|
return `${JSY_API_BASE}${path.startsWith("/") ? path : `/${path}`}` |
||||||
|
} |
||||||
|
|
||||||
|
function unwrapResponse(response) { |
||||||
|
const failed = |
||||||
|
response?.success === false || |
||||||
|
(response?.code !== undefined && ![0, 200, "0", "200"].includes(response.code)) |
||||||
|
|
||||||
|
if (failed) { |
||||||
|
const error = new Error(response?.msg || response?.message || "视频监控接口请求失败") |
||||||
|
error.code = response?.code |
||||||
|
throw error |
||||||
|
} |
||||||
|
|
||||||
|
return normalizeResponseData(response) |
||||||
|
} |
||||||
|
|
||||||
|
function pickValue(item, keys, fallback = "") { |
||||||
|
for (const key of keys) { |
||||||
|
if (item?.[key] !== undefined && item?.[key] !== null && item?.[key] !== "") { |
||||||
|
return item[key] |
||||||
|
} |
||||||
|
} |
||||||
|
return fallback |
||||||
|
} |
||||||
|
|
||||||
|
function inferTownName(name = "") { |
||||||
|
const normalizedName = String(name) |
||||||
|
const town = HONGYUAN_TOWN_NAMES.find((item) => normalizedName.includes(item.replace(/[镇乡]$/, ""))) |
||||||
|
return town || "红原县" |
||||||
|
} |
||||||
|
|
||||||
|
function inferSceneName(name = "") { |
||||||
|
const text = String(name) |
||||||
|
if (text.includes("养殖")) return "养殖基地" |
||||||
|
if (text.includes("饲草")) return "饲草基地" |
||||||
|
if (text.includes("种草") || text.includes("牧草")) return "牧草基地" |
||||||
|
if (text.includes("虫情")) return "虫情监测" |
||||||
|
if (text.includes("机场")) return "机场周边" |
||||||
|
return "重点点位" |
||||||
|
} |
||||||
|
|
||||||
|
function getChannel(row, index) { |
||||||
|
const url = pickValue(row, ["hdPlayUrl", "playUrl", "url"]) |
||||||
|
const match = String(url).match(/\/(\d+)(?:\.hd)?\.live/i) |
||||||
|
if (match) return match[1].padStart(2, "0") |
||||||
|
return String(index + 1).padStart(2, "0") |
||||||
|
} |
||||||
|
|
||||||
|
function getUpdateTime() { |
||||||
|
return new Date().toLocaleTimeString("zh-CN", { |
||||||
|
hour: "2-digit", |
||||||
|
minute: "2-digit", |
||||||
|
hour12: false, |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
function normalizeMonitoring(row, index, total, validTotal) { |
||||||
|
const name = pickValue(row, ["name", "title", "deviceName"], `视频监控${index + 1}`) |
||||||
|
const hdPlayUrl = pickValue(row, ["hdPlayUrl", "hd_play_url", "url"]) |
||||||
|
const playUrl = pickValue(row, ["playUrl", "play_url"], hdPlayUrl) |
||||||
|
const token = pickValue(row, ["token", "accessToken", "access_token"]) |
||||||
|
const isOnline = Boolean(token && (hdPlayUrl || playUrl)) |
||||||
|
const onlineRate = total ? Math.round((validTotal / total) * 100) : 0 |
||||||
|
|
||||||
|
return { |
||||||
|
key: pickValue(row, ["id", "number", "deviceSerial"], `${name}-${index}`), |
||||||
|
title: name, |
||||||
|
town: inferTownName(name), |
||||||
|
scene: inferSceneName(name), |
||||||
|
device: pickValue(row, ["number", "deviceSerial", "serialNumber"], `CAM-${String(index + 1).padStart(3, "0")}`), |
||||||
|
channel: getChannel(row, index), |
||||||
|
cameraCount: total, |
||||||
|
status: isOnline ? "直播中" : "离线", |
||||||
|
onlineRate, |
||||||
|
updateTime: getUpdateTime(), |
||||||
|
operator: isOnline ? "萤石云 · 在线预览" : "监控参数待同步", |
||||||
|
progress: isOnline ? 100 : 0, |
||||||
|
image: pickValue(row, ["img", "image", "cover", "snapshot"]), |
||||||
|
playUrl, |
||||||
|
hdPlayUrl, |
||||||
|
token, |
||||||
|
source: row, |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
export async function getHomeMonitorings(params = {}) { |
||||||
|
const data = await requestJson(joinBase("/api/home/monitorings"), { |
||||||
|
params, |
||||||
|
timeout: 18000, |
||||||
|
}).then(unwrapResponse) |
||||||
|
const rows = Array.isArray(data) ? data : data?.rows || data?.list || [] |
||||||
|
const validTotal = rows.filter((row) => pickValue(row, ["token", "accessToken", "access_token"]) && pickValue(row, ["hdPlayUrl", "playUrl", "url"])).length |
||||||
|
return rows.map((row, index) => normalizeMonitoring(row, index, rows.length, validTotal)) |
||||||
|
} |
||||||
@ -1,12 +1,26 @@ |
|||||||
*, |
*, |
||||||
body { |
body { |
||||||
padding: 0; |
padding: 0; |
||||||
margin: 0; |
margin: 0; |
||||||
} |
} |
||||||
html, |
* { |
||||||
body, |
box-sizing: border-box; |
||||||
#app { |
} |
||||||
width: 100%; |
html, |
||||||
height: 100%; |
body, |
||||||
overflow: hidden; |
#app { |
||||||
} |
width: 100%; |
||||||
|
height: 100%; |
||||||
|
overflow: hidden; |
||||||
|
} |
||||||
|
body { |
||||||
|
font-family: AlibabaPuHuiTi, "Microsoft YaHei", Arial, sans-serif; |
||||||
|
font-size: 14px; |
||||||
|
color: #e7fbff; |
||||||
|
} |
||||||
|
button, |
||||||
|
input, |
||||||
|
select, |
||||||
|
textarea { |
||||||
|
font: inherit; |
||||||
|
} |
||||||
|
|||||||
@ -0,0 +1,158 @@ |
|||||||
|
import * as echarts from "echarts" |
||||||
|
|
||||||
|
export const chartFontFamily = "AlibabaPuHuiTi, Microsoft YaHei, Arial, sans-serif" |
||||||
|
export const chartPalette = ["#24f6c4", "#32dcff", "#ffe06b", "#7ee269", "#ff9a62", "#9ea7ff"] |
||||||
|
|
||||||
|
export const chartTextStyle = { |
||||||
|
color: "rgba(225, 249, 255, 0.78)", |
||||||
|
fontFamily: chartFontFamily, |
||||||
|
fontSize: 10, |
||||||
|
} |
||||||
|
|
||||||
|
export function chartTooltip(formatter, overrides = {}) { |
||||||
|
return { |
||||||
|
trigger: "item", |
||||||
|
backgroundColor: "rgba(5, 31, 51, 0.96)", |
||||||
|
borderColor: "rgba(0, 210, 255, 0.54)", |
||||||
|
borderWidth: 1, |
||||||
|
padding: [7, 10], |
||||||
|
textStyle: { |
||||||
|
color: "#e7fbff", |
||||||
|
fontFamily: chartFontFamily, |
||||||
|
fontSize: 12, |
||||||
|
lineHeight: 18, |
||||||
|
}, |
||||||
|
extraCssText: "box-shadow:0 0 18px rgba(0,210,255,.2);", |
||||||
|
formatter, |
||||||
|
...overrides, |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
export function chartLegend(overrides = {}) { |
||||||
|
return { |
||||||
|
itemWidth: 10, |
||||||
|
itemHeight: 7, |
||||||
|
itemGap: 8, |
||||||
|
textStyle: { |
||||||
|
...chartTextStyle, |
||||||
|
color: "rgba(222, 250, 255, 0.78)", |
||||||
|
fontSize: 10, |
||||||
|
}, |
||||||
|
...overrides, |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
export function categoryAxis(data = [], overrides = {}) { |
||||||
|
return { |
||||||
|
type: "category", |
||||||
|
data, |
||||||
|
axisLabel: { |
||||||
|
...chartTextStyle, |
||||||
|
color: "rgba(223, 250, 255, 0.68)", |
||||||
|
interval: 0, |
||||||
|
hideOverlap: true, |
||||||
|
margin: 8, |
||||||
|
...(overrides.axisLabel || {}), |
||||||
|
}, |
||||||
|
axisLine: { lineStyle: { color: "rgba(48, 220, 255, 0.26)" }, ...(overrides.axisLine || {}) }, |
||||||
|
axisTick: { show: false, ...(overrides.axisTick || {}) }, |
||||||
|
splitLine: { show: false, ...(overrides.splitLine || {}) }, |
||||||
|
...stripAxisOverrides(overrides), |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
export function valueAxis(overrides = {}) { |
||||||
|
return { |
||||||
|
type: "value", |
||||||
|
axisLabel: { |
||||||
|
...chartTextStyle, |
||||||
|
color: "rgba(223, 250, 255, 0.56)", |
||||||
|
...(overrides.axisLabel || {}), |
||||||
|
}, |
||||||
|
axisLine: { show: false, ...(overrides.axisLine || {}) }, |
||||||
|
axisTick: { show: false, ...(overrides.axisTick || {}) }, |
||||||
|
splitLine: { |
||||||
|
lineStyle: { color: "rgba(48, 220, 255, 0.1)", type: "dashed" }, |
||||||
|
...(overrides.splitLine || {}), |
||||||
|
}, |
||||||
|
...stripAxisOverrides(overrides), |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
export function chartGrid(overrides = {}) { |
||||||
|
return { |
||||||
|
left: 42, |
||||||
|
right: 28, |
||||||
|
top: 30, |
||||||
|
bottom: 24, |
||||||
|
containLabel: false, |
||||||
|
...overrides, |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
export function verticalGradient(color, endColor = `${color}12`) { |
||||||
|
return new echarts.graphic.LinearGradient(0, 0, 0, 1, [ |
||||||
|
{ offset: 0, color }, |
||||||
|
{ offset: 1, color: endColor }, |
||||||
|
]) |
||||||
|
} |
||||||
|
|
||||||
|
export function horizontalGradient(color, startColor = `${color}20`, endColor = "#ffffff") { |
||||||
|
return new echarts.graphic.LinearGradient(0, 0, 1, 0, [ |
||||||
|
{ offset: 0, color: startColor }, |
||||||
|
{ offset: 0.68, color }, |
||||||
|
{ offset: 1, color: endColor }, |
||||||
|
]) |
||||||
|
} |
||||||
|
|
||||||
|
export function withChartDefaults(option = {}) { |
||||||
|
const normalized = { |
||||||
|
textStyle: { |
||||||
|
fontFamily: chartFontFamily, |
||||||
|
color: "rgba(225, 249, 255, 0.78)", |
||||||
|
...(option.textStyle || {}), |
||||||
|
}, |
||||||
|
animation: option.animation ?? true, |
||||||
|
animationDuration: option.animationDuration ?? 900, |
||||||
|
animationDurationUpdate: option.animationDurationUpdate ?? 700, |
||||||
|
animationEasing: option.animationEasing || "cubicOut", |
||||||
|
...option, |
||||||
|
} |
||||||
|
normalizeChartTypography(normalized) |
||||||
|
return normalized |
||||||
|
} |
||||||
|
|
||||||
|
function stripAxisOverrides(overrides = {}) { |
||||||
|
const { axisLabel, axisLine, axisTick, splitLine, ...rest } = overrides |
||||||
|
return rest |
||||||
|
} |
||||||
|
|
||||||
|
function normalizeChartTypography(target) { |
||||||
|
if (!target || typeof target !== "object") return |
||||||
|
const styleKeys = ["textStyle", "axisLabel", "nameTextStyle", "label", "axisName"] |
||||||
|
styleKeys.forEach((key) => { |
||||||
|
if (!target[key] || typeof target[key] !== "object") return |
||||||
|
target[key] = normalizeTextObject(target[key]) |
||||||
|
}) |
||||||
|
Object.keys(target).forEach((key) => { |
||||||
|
const value = target[key] |
||||||
|
if (!value || typeof value !== "object") return |
||||||
|
if (key === "color" || key === "itemStyle" || key === "areaStyle" || key === "lineStyle") return |
||||||
|
if (Array.isArray(value)) { |
||||||
|
value.forEach(normalizeChartTypography) |
||||||
|
return |
||||||
|
} |
||||||
|
normalizeChartTypography(value) |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
function normalizeTextObject(style) { |
||||||
|
const next = { |
||||||
|
fontFamily: style.fontFamily || chartFontFamily, |
||||||
|
...style, |
||||||
|
} |
||||||
|
if (typeof next.fontSize === "number" && next.fontSize < 10) { |
||||||
|
next.fontSize = 10 |
||||||
|
} |
||||||
|
return next |
||||||
|
} |
||||||
@ -1,52 +1,3 @@ |
|||||||
export default [ |
import { hongyuanTownshipLabelPoints } from "@/config/townshipBoundaries" |
||||||
{ |
|
||||||
name: "邛溪镇", |
export default hongyuanTownshipLabelPoints.map((item) => ({ ...item })) |
||||||
center: [102.60242339873115, 32.83022561372293], |
|
||||||
centroid: [102.60242339873115, 32.83022561372293], |
|
||||||
}, |
|
||||||
{ |
|
||||||
name: "刷经寺镇", |
|
||||||
center: [102.55651980382184, 32.204097908180216], |
|
||||||
centroid: [102.55651980382184, 32.204097908180216], |
|
||||||
}, |
|
||||||
{ |
|
||||||
name: "安曲镇", |
|
||||||
center: [102.38447320923945, 32.696113484169786], |
|
||||||
centroid: [102.38447320923945, 32.696113484169786], |
|
||||||
}, |
|
||||||
{ |
|
||||||
name: "龙日镇", |
|
||||||
center: [102.48704663740175, 32.471364980560764], |
|
||||||
centroid: [102.48704663740175, 32.471364980560764], |
|
||||||
}, |
|
||||||
{ |
|
||||||
name: "江茸乡", |
|
||||||
center: [102.29046083534963, 32.355689518554044], |
|
||||||
centroid: [102.29046083534963, 32.355689518554044], |
|
||||||
}, |
|
||||||
{ |
|
||||||
name: "查尔玛乡", |
|
||||||
center: [102.03268479676977, 32.440590072394265], |
|
||||||
centroid: [102.03268479676977, 32.440590072394265], |
|
||||||
}, |
|
||||||
{ |
|
||||||
name: "瓦切镇", |
|
||||||
center: [102.71535664604494, 33.12869670968013], |
|
||||||
centroid: [102.71535664604494, 33.12869670968013], |
|
||||||
}, |
|
||||||
{ |
|
||||||
name: "阿木乡", |
|
||||||
center: [102.77925597565002, 32.73632379185147], |
|
||||||
centroid: [102.77925597565002, 32.73632379185147], |
|
||||||
}, |
|
||||||
{ |
|
||||||
name: "麦洼乡", |
|
||||||
center: [102.95718106156616, 33.15445682575394], |
|
||||||
centroid: [102.95718106156616, 33.15445682575394], |
|
||||||
}, |
|
||||||
{ |
|
||||||
name: "色地镇", |
|
||||||
center: [103.12540730227074, 33.010462261362875], |
|
||||||
centroid: [103.12540730227074, 33.010462261362875], |
|
||||||
}, |
|
||||||
] |
|
||||||
|
|||||||
@ -1,72 +1,3 @@ |
|||||||
export default [ |
import { hongyuanTownshipRankingPoints } from "@/config/townshipBoundaries" |
||||||
{ |
|
||||||
name: "色地镇", |
export default hongyuanTownshipRankingPoints.map((item) => ({ ...item })) |
||||||
enName: "sedi", |
|
||||||
center: [103.12540730227074, 33.010462261362875], |
|
||||||
centroid: [103.12540730227074, 33.010462261362875], |
|
||||||
value: 1199, |
|
||||||
}, |
|
||||||
{ |
|
||||||
name: "瓦切镇", |
|
||||||
enName: "waqie", |
|
||||||
center: [102.71535664604494, 33.12869670968013], |
|
||||||
centroid: [102.71535664604494, 33.12869670968013], |
|
||||||
value: 991, |
|
||||||
}, |
|
||||||
{ |
|
||||||
name: "刷经寺镇", |
|
||||||
enName: "shuajingsi", |
|
||||||
center: [102.55651980382184, 32.204097908180216], |
|
||||||
centroid: [102.55651980382184, 32.204097908180216], |
|
||||||
value: 986, |
|
||||||
}, |
|
||||||
{ |
|
||||||
name: "邛溪镇", |
|
||||||
enName: "qiongxi", |
|
||||||
center: [102.60242339873115, 32.83022561372293], |
|
||||||
centroid: [102.60242339873115, 32.83022561372293], |
|
||||||
value: 896, |
|
||||||
}, |
|
||||||
{ |
|
||||||
name: "阿木乡", |
|
||||||
enName: "amu", |
|
||||||
center: [102.77925597565002, 32.73632379185147], |
|
||||||
centroid: [102.77925597565002, 32.73632379185147], |
|
||||||
value: 892, |
|
||||||
}, |
|
||||||
{ |
|
||||||
name: "安曲镇", |
|
||||||
enName: "anqu", |
|
||||||
center: [102.38447320923945, 32.696113484169786], |
|
||||||
centroid: [102.38447320923945, 32.696113484169786], |
|
||||||
value: 885, |
|
||||||
}, |
|
||||||
{ |
|
||||||
name: "查尔玛乡", |
|
||||||
enName: "chaerma", |
|
||||||
center: [102.03268479676977, 32.440590072394265], |
|
||||||
centroid: [102.03268479676977, 32.440590072394265], |
|
||||||
value: 729, |
|
||||||
}, |
|
||||||
{ |
|
||||||
name: "龙日镇", |
|
||||||
enName: "longri", |
|
||||||
center: [102.48704663740175, 32.471364980560764], |
|
||||||
centroid: [102.48704663740175, 32.471364980560764], |
|
||||||
value: 645, |
|
||||||
}, |
|
||||||
{ |
|
||||||
name: "麦洼乡", |
|
||||||
enName: "maiwa", |
|
||||||
center: [102.95718106156616, 33.15445682575394], |
|
||||||
centroid: [102.95718106156616, 33.15445682575394], |
|
||||||
value: 559, |
|
||||||
}, |
|
||||||
{ |
|
||||||
name: "江茸乡", |
|
||||||
enName: "jiangrong", |
|
||||||
center: [102.29046083534963, 32.355689518554044], |
|
||||||
centroid: [102.29046083534963, 32.355689518554044], |
|
||||||
value: 514, |
|
||||||
}, |
|
||||||
]; |
|
||||||
|
|||||||
@ -1,52 +1,3 @@ |
|||||||
export default [ |
import { hongyuanTownshipLabelPoints } from "@/config/townshipBoundaries" |
||||||
{ |
|
||||||
name: "邛溪镇", |
export default hongyuanTownshipLabelPoints.map((item) => ({ ...item })) |
||||||
center: [102.60242339873115, 32.83022561372293], |
|
||||||
centroid: [102.60242339873115, 32.83022561372293], |
|
||||||
}, |
|
||||||
{ |
|
||||||
name: "刷经寺镇", |
|
||||||
center: [102.55651980382184, 32.204097908180216], |
|
||||||
centroid: [102.55651980382184, 32.204097908180216], |
|
||||||
}, |
|
||||||
{ |
|
||||||
name: "安曲镇", |
|
||||||
center: [102.38447320923945, 32.696113484169786], |
|
||||||
centroid: [102.38447320923945, 32.696113484169786], |
|
||||||
}, |
|
||||||
{ |
|
||||||
name: "龙日镇", |
|
||||||
center: [102.48704663740175, 32.471364980560764], |
|
||||||
centroid: [102.48704663740175, 32.471364980560764], |
|
||||||
}, |
|
||||||
{ |
|
||||||
name: "江茸乡", |
|
||||||
center: [102.29046083534963, 32.355689518554044], |
|
||||||
centroid: [102.29046083534963, 32.355689518554044], |
|
||||||
}, |
|
||||||
{ |
|
||||||
name: "查尔玛乡", |
|
||||||
center: [102.03268479676977, 32.440590072394265], |
|
||||||
centroid: [102.03268479676977, 32.440590072394265], |
|
||||||
}, |
|
||||||
{ |
|
||||||
name: "瓦切镇", |
|
||||||
center: [102.71535664604494, 33.12869670968013], |
|
||||||
centroid: [102.71535664604494, 33.12869670968013], |
|
||||||
}, |
|
||||||
{ |
|
||||||
name: "阿木乡", |
|
||||||
center: [102.77925597565002, 32.73632379185147], |
|
||||||
centroid: [102.77925597565002, 32.73632379185147], |
|
||||||
}, |
|
||||||
{ |
|
||||||
name: "麦洼乡", |
|
||||||
center: [102.95718106156616, 33.15445682575394], |
|
||||||
centroid: [102.95718106156616, 33.15445682575394], |
|
||||||
}, |
|
||||||
{ |
|
||||||
name: "色地镇", |
|
||||||
center: [103.12540730227074, 33.010462261362875], |
|
||||||
centroid: [103.12540730227074, 33.010462261362875], |
|
||||||
}, |
|
||||||
] |
|
||||||
|
|||||||
@ -1,72 +1,3 @@ |
|||||||
export default [ |
import { hongyuanTownshipRankingPoints } from "@/config/townshipBoundaries" |
||||||
{ |
|
||||||
name: "色地镇", |
export default hongyuanTownshipRankingPoints.map((item) => ({ ...item })) |
||||||
enName: "sedi", |
|
||||||
center: [103.12540730227074, 33.010462261362875], |
|
||||||
centroid: [103.12540730227074, 33.010462261362875], |
|
||||||
value: 1199, |
|
||||||
}, |
|
||||||
{ |
|
||||||
name: "瓦切镇", |
|
||||||
enName: "waqie", |
|
||||||
center: [102.71535664604494, 33.12869670968013], |
|
||||||
centroid: [102.71535664604494, 33.12869670968013], |
|
||||||
value: 991, |
|
||||||
}, |
|
||||||
{ |
|
||||||
name: "刷经寺镇", |
|
||||||
enName: "shuajingsi", |
|
||||||
center: [102.55651980382184, 32.204097908180216], |
|
||||||
centroid: [102.55651980382184, 32.204097908180216], |
|
||||||
value: 986, |
|
||||||
}, |
|
||||||
{ |
|
||||||
name: "邛溪镇", |
|
||||||
enName: "qiongxi", |
|
||||||
center: [102.60242339873115, 32.83022561372293], |
|
||||||
centroid: [102.60242339873115, 32.83022561372293], |
|
||||||
value: 896, |
|
||||||
}, |
|
||||||
{ |
|
||||||
name: "阿木乡", |
|
||||||
enName: "amu", |
|
||||||
center: [102.77925597565002, 32.73632379185147], |
|
||||||
centroid: [102.77925597565002, 32.73632379185147], |
|
||||||
value: 892, |
|
||||||
}, |
|
||||||
{ |
|
||||||
name: "安曲镇", |
|
||||||
enName: "anqu", |
|
||||||
center: [102.38447320923945, 32.696113484169786], |
|
||||||
centroid: [102.38447320923945, 32.696113484169786], |
|
||||||
value: 885, |
|
||||||
}, |
|
||||||
{ |
|
||||||
name: "查尔玛乡", |
|
||||||
enName: "chaerma", |
|
||||||
center: [102.03268479676977, 32.440590072394265], |
|
||||||
centroid: [102.03268479676977, 32.440590072394265], |
|
||||||
value: 729, |
|
||||||
}, |
|
||||||
{ |
|
||||||
name: "龙日镇", |
|
||||||
enName: "longri", |
|
||||||
center: [102.48704663740175, 32.471364980560764], |
|
||||||
centroid: [102.48704663740175, 32.471364980560764], |
|
||||||
value: 645, |
|
||||||
}, |
|
||||||
{ |
|
||||||
name: "麦洼乡", |
|
||||||
enName: "maiwa", |
|
||||||
center: [102.95718106156616, 33.15445682575394], |
|
||||||
centroid: [102.95718106156616, 33.15445682575394], |
|
||||||
value: 559, |
|
||||||
}, |
|
||||||
{ |
|
||||||
name: "江茸乡", |
|
||||||
enName: "jiangrong", |
|
||||||
center: [102.29046083534963, 32.355689518554044], |
|
||||||
centroid: [102.29046083534963, 32.355689518554044], |
|
||||||
value: 514, |
|
||||||
}, |
|
||||||
]; |
|
||||||
|
|||||||