11
package.json
|
@ -14,12 +14,17 @@
|
||||||
"core-js": "3.15.2",
|
"core-js": "3.15.2",
|
||||||
"cropperjs": "1.5.12",
|
"cropperjs": "1.5.12",
|
||||||
"crypto-js": "4.0.0",
|
"crypto-js": "4.0.0",
|
||||||
|
"dayjs": "^1.11.10",
|
||||||
"echarts": "5.1.2",
|
"echarts": "5.1.2",
|
||||||
|
"echarts-liquidfill": "^3.1.0",
|
||||||
|
"echarts-wordcloud": "^2.1.0",
|
||||||
"element-plus": "1.0.2-beta.54",
|
"element-plus": "1.0.2-beta.54",
|
||||||
"html2canvas": "^1.4.1",
|
"html2canvas": "^1.4.1",
|
||||||
|
"mapv-three": "^1.0.9",
|
||||||
"nprogress": "0.2.0",
|
"nprogress": "0.2.0",
|
||||||
"qrcodejs2": "^0.0.2",
|
"qrcodejs2": "^0.0.2",
|
||||||
"sortablejs": "1.13.0",
|
"sortablejs": "1.13.0",
|
||||||
|
"swiper": "^8.4.5",
|
||||||
"tinymce": "5.8.2",
|
"tinymce": "5.8.2",
|
||||||
"vue": "3.1.4",
|
"vue": "3.1.4",
|
||||||
"vue-router": "4.0.10",
|
"vue-router": "4.0.10",
|
||||||
|
@ -28,11 +33,14 @@
|
||||||
"vuex": "4.0.2"
|
"vuex": "4.0.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@babel/core": "^7.12.16",
|
||||||
|
"@babel/eslint-parser": "^7.12.16",
|
||||||
"@vue/cli-plugin-babel": "4.5.13",
|
"@vue/cli-plugin-babel": "4.5.13",
|
||||||
"@vue/cli-plugin-eslint": "4.5.13",
|
"@vue/cli-plugin-eslint": "4.5.13",
|
||||||
"@vue/cli-service": "4.5.13",
|
"@vue/cli-service": "4.5.13",
|
||||||
"@vue/compiler-sfc": "3.1.4",
|
"@vue/compiler-sfc": "3.1.4",
|
||||||
"babel-eslint": "10.1.0",
|
"babel-eslint": "10.1.0",
|
||||||
|
"cache-loader": "^4.1.0",
|
||||||
"eslint": "6.8.0",
|
"eslint": "6.8.0",
|
||||||
"eslint-plugin-vue": "7.12.1",
|
"eslint-plugin-vue": "7.12.1",
|
||||||
"less": "3.13.1",
|
"less": "3.13.1",
|
||||||
|
@ -57,7 +65,8 @@
|
||||||
"indent": 0,
|
"indent": 0,
|
||||||
"no-tabs": 0,
|
"no-tabs": 0,
|
||||||
"no-mixed-spaces-and-tabs": 0,
|
"no-mixed-spaces-and-tabs": 0,
|
||||||
"vue/no-unused-components": "off"
|
"vue/no-unused-components": "off",
|
||||||
|
"no-unused-vars": "off"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"browserslist": [
|
"browserslist": [
|
||||||
|
|
|
@ -6,8 +6,12 @@
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||||
<link rel="icon" href="<%= BASE_URL %>static/img/favicon.ico">
|
<link rel="icon" href="<%= BASE_URL %>static/img/favicon.ico">
|
||||||
|
<script
|
||||||
|
type="text/javascript"
|
||||||
|
src="//api.map.baidu.com/api?type=webgl&v=1.0&ak=k9luQNMq1GwExcPKOEusTniNUfcV49S3"
|
||||||
|
></script>
|
||||||
<title>
|
<title>
|
||||||
艺象心后台管理系统
|
艺象心后台管理系统
|
||||||
</title>
|
</title>
|
||||||
<!-- <script type="text/javascript">
|
<!-- <script type="text/javascript">
|
||||||
document.write("<script src='config.js?"+new Date().getTime()+"'><\/script>");
|
document.write("<script src='config.js?"+new Date().getTime()+"'><\/script>");
|
||||||
|
@ -26,7 +30,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="app-loading__loader"></div>
|
<div class="app-loading__loader"></div>
|
||||||
<div class="app-loading__title">
|
<div class="app-loading__title">
|
||||||
艺象心后台管理系统
|
艺象心后台管理系统
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<style>
|
<style>
|
||||||
|
@ -97,4 +101,4 @@
|
||||||
<!-- built files will be auto injected -->
|
<!-- built files will be auto injected -->
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
{"version":3,"sources":["../theme/theme.less"],"names":[],"mappings":"AAkBA,OACI,UAAA,CACA,YAEJ,QACI,YAAA,CACA,sBAEJ,QACI,YAAA,CACA,mBAEJ,QACI,MAAA,YAEJ,QACI,MAAA,YAEJ,QACI,MAAA,YAEJ,QACI,MAAA,YAEJ,QACI,MAAA,YAEJ,QACI,MAAA,YAEJ,QACI,MAAA,YAEJ,QACI,MAAA,YAEJ,QACI,MAAA,YAEJ,SACI,OAAA,YAEJ,EACC,SAAA,CACA,QAAA,CACA,oBAAA,CACA,eAAA,CACA,YAAA,CACG,WAAA,CACA,gBAAA,CACA,sBACH,WACC,kBAAA,CACM,oCAEJ,WACF,kBAAA,CACA,qCAGF,KACI,gBACA,IAAC,oBACG,SAAA,CACA,UAAA,CACA,gBAGR,WACI,cACA,UAAC,oBACG,SAAA,CACA,UAAA,CACA,WACA,UAJH,mBAII,OACG,iBAAA,CACA,wCAAA,CACA,mBAEJ,UATH,mBASI,OACG,wCAAA,CACA,iBAAA,CACA,gCAOZ,eACI,GACI,WAEJ,IACA,KACI,WAGR,eACI,GACI,UAEJ,IACA,KACI,UAGR,iBACI,GACI,YAEJ,IACA,KACI,YAGR,gBACI,GACI,aAEJ,IACA,KACI,aAGR,WACI,YAAA,CACA,qBAAA,CACA,iBAAA,CACA,gBACA,UAAC,SAAS,UAAC,QACP,QAAS,EAAT,CACA,iBAAA,CACA,UAAA,CACA,WAEJ,UAAC,SACG,KAAA,CACA,UAAA,CACA,iBAAkB,4CAAlB,CACA,iCAEJ,UAAC,QACG,QAAA,CACA,WAAA,CACA,iBAAkB,6CAAlB,CACA,sCArBR,UAuBI,GACI,iBAAA,CACA,oBAAA,CACA,WAAA,CACA,UACA,UALJ,EAKK,aACG,SAAA,CACA,OAAA,CACA,iBAAkB,6CAAlB,CACA,oCAEJ,UAXJ,EAWK,UAAU,IACP,YAAA,CACA,MAAA,CACA,iBAAkB,4CAAlB,CACA,qCAGR,UAAC,QAEG,eAAA,CACA,gBAAA,CACA,YAAA,CACA,kBAAA,CACA,sBAAA,CACA,kBAPJ,UAAC,OAQG,MACI,WAAA,CACA,gBAAA,CACA,cAAA,CACA,kBAAA,CACA,eAAA,CACA,UAAA,CACA,iBAAA,CACA,sBAhBR,UAAC,OAkBG,KACI,UAAA,CACA,YACA,UArBP,OAkBG,IAGK,YAAY,IACT,UAAW,eAtBvB,UAAC,OAyBG,iBAEI,iBAAA,CACA,OAAA,CACA,UAAA,CACA,aAAA,CACA,WAAA,CACA,gBAAA,CACA,4DAAA,CACA,eAlCR,UAAC,OAyBG,gBAUI,KACI,UAAA,CACA,WAAA,CACA,aAtCZ,UAAC,OAyBG,gBAeI,MACI,qBAAA,CACA,mBAIZ,UAAC,SACG,MAAA,CACA,YAAA,CACA,sBAHJ,UAAC,QAIG,iBACI,gBALR,UAAC,QAOG,iBACI,MAAA,CACA,aAMZ,UACI,iBACI,gBAFR,UACI,gBAGI,2BACI,+BAAA,CACI,YANhB,UACI,gBAGI,0BAGI,MACI,+BAAA,CACA,0BAAA,CACA,oBAAA,CACA,aAAA,CACA,YAEJ,UAbR,gBAGI,0BAUK,SACG,gCADJ,UAbR,gBAGI,0BAUK,QAEG,MACI,WAGR,UAnBR,gBAGI,0BAgBK,cACG,gBAGA,UAvBZ,gBAGI,0BAmBK,IAAI,cACA,SACG,aAzBpB,UACI,gBA6BI,aACI,iBAAA,CACA,WACA,UAhCR,gBA6BI,YAGK,IAAI,6BACD,sBACI,eAAA,CACA,wBAAA,YACA,UApChB,gBA6BI,YAGK,IAAI,6BACD,qBAGK,OACG,oBAAA,CACA,uBAAA,CACA,gBAxCxB,UACI,gBA6BI,YAcI,mBACI,aAAA,YAEJ,UA9CR,gBA6BI,YAiBK,SACG,MACI,aAAA,YACA,eAlDpB,UACI,gBA6BI,YAuBI,oBAAmB,IAAI,sBAAsB,WAAW,IAAI,6BACxD,sBACI,oBAAA,CACA,uBAAA,CACA,gBAzDpB,UACI,gBA6DI,aACI,aAAA,YACA,6BAAA,YACA,wBAAA,YACA,+BAAA,CACA,qBAAA,CACA,4BAAA,CACA,WAEA,UAtER,gBA6DI,YASK,QACG,aAAA,YAxEhB,UACI,gBA2EI,kBACI,OACI,aAAA,YACA,iBAMhB,qBACI,aAAA,YACA,6BAAA,YACA,wBAAA,YAEI,oBADJ,iCACK,IAAI,mCACF,gBAIH,oBADJ,+BACK,IAAI,mCACD,oEAKJ,oBADJ,wBACK,OACD,oEAEA,oBAJJ,wBAIK,QACG,oEAKZ,oBAEI,oBACI,4CAHR,oBAEI,mBAEI,QACI,wBAEJ,oBALJ,mBAKK,KACG,QACI,aAAA,YACA,+BAVhB,oBAcI,6BACI,aAAA,YACA,oCAAA,YACA,8DAAA,CACA,oCAlBR,oBAcI,4BAKI,mBACG,SApBX,oBAwBI,qBACI,wBAIA,oBADJ,iBACK,yBACG,wBACI,cAIJ,oBAPR,iBAMK,MACI,IAAI,0BAED,wBADJ,oBARR,iBAMK,MAEI,IAAI,2BAA2B,IAAI,8BAA8B,IAAI,4BAA4B,IAAI,oCAAoC,IAAI,kCAC1I,wBACG,mBASnB,mBAEI,yBAFJ,kBAGI,mBACI,qBAAA,CACA,WAAA,CACA,8DANR,kBAGI,kBAII,kBACI,kBAAA,CACA,cAAA,CACA,eAAA,CACA,WAXZ,kBAcI,iBACI,eAAgB,kDAfxB,kBAiBI,oBACI,UAAA,CACA,WAAA,CACA,gBAAA,CACA,kBAMR,UACI,iBACI,UAAA,YAFR,UAKI,sBACI,2BANR,UAQI,uBARJ,UAQ0B,CAAA,4BAClB,UAAA,YAMR,MACI,UAAA,CACA,WAAA,CACA,cAAA,CACA,YAAA,CACA,qBAAA,CACA,kBANJ,KAOI,SAgEA,KAAC,OAGG,QAmBI,YAKR,KAAC,OACG,QACI,YA5FJ,eAAA,CACA,WAAA,CACA,gBAAA,CACA,UAAA,CACA,iBAAA,CACA,8CAAA,CACA,qBAAA,CACA,YAAA,CACA,oBAAA,CACA,kBAAA,CACA,cAAA,CACA,eAAA,CACA,cApBR,KAOI,QAcI,GAkDJ,KAAC,OAGG,QAmBI,WAxEJ,GA6EJ,KAAC,OACG,QACI,WA/EJ,GACI,MAAA,CACA,WAAA,CACA,iBAAA,CACA,eAEJ,KApBJ,QAoBK,UAAU,OA4Cf,KAAC,OAGG,QAmBI,WAlEH,UAAU,OAuEf,KAAC,OACG,QACI,WAzEH,UAAU,OACP,8CAEJ,KAvBJ,QAuBK,UAAU,MAyCf,KAAC,OAGG,QAmBI,WA/DH,UAAU,MAoEf,KAAC,OACG,QACI,WAtEH,UAAU,MACP,6CA/BZ,KAkCI,SACI,WAGJ,KAAC,MACG,kBAAA,CACA,kBAAA,CACA,6BAAA,CACA,cAAA,CACA,YACA,KANH,KAMI,MACG,eAAA,CACA,WAAA,CACA,WAAA,CACA,eAAgB,sCAAhB,CACA,yBAAA,CACA,YAAA,CACA,mBAPJ,KANH,KAMI,KAQG,KACI,UAAA,CACA,WAAA,CACA,oBAXR,KANH,KAMI,KAaG,IACI,GACI,cAAA,CACA,iBAAA,CACA,WAjBZ,KANH,KAMI,KAaG,IAMI,MACI,0BAAA,CACA,eAMhB,KAAC,QACG,qBAAA,CACA,gBAFJ,KAAC,OAGG,SACI,wBAAA,CACA,eAAA,CACA,kBACA,KAPP,OAGG,QAIK,oBACG,SAAA,CACA,UAAA,CACA,WACA,KAXX,OAGG,QAIK,mBAII,OACG,iBAAA,CACA,wCAAA,CACA,mBAEJ,KAhBX,OAGG,QAIK,mBASI,OACG,wCAAA,CACA,iBAAA,CACA,gCAQhB,KAAC,OACG,QACI,YACI,WAAA,CACA,gBAJZ,KAAC,OAOG,cACI,GACI,YAAA,CACA,kBAAA,CACA,uBAMR,KADJ,SACK,OAAO,KADZ,SACa,QAAQ,KADrB,SACsB,OACd,aAAA,CACA,UAAA,CACA,WAAA,CACA,aAAA,CACA,iCAAA,CACA,4BAEJ,KATJ,SASK,OACG,qBAAsB,qCAE1B,KAZJ,SAYK,QACG,qBAAsB,sCAE1B,KAfJ,SAeK,OACG,qBAAsB,qCAG9B,KAAC,WACG,eAMR,oBACI,GACI,iBAAA,CACA"}
|
After Width: | Height: | Size: 696 B |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 2.5 MiB |
After Width: | Height: | Size: 49 KiB |
After Width: | Height: | Size: 89 KiB |
After Width: | Height: | Size: 26 KiB |
After Width: | Height: | Size: 10 KiB |
After Width: | Height: | Size: 10 KiB |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 76 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 54 KiB |
After Width: | Height: | Size: 48 KiB |
After Width: | Height: | Size: 40 KiB |
After Width: | Height: | Size: 57 KiB |
After Width: | Height: | Size: 64 KiB |
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 3.5 KiB |
After Width: | Height: | Size: 1010 B |
After Width: | Height: | Size: 750 B |
After Width: | Height: | Size: 13 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 4.5 KiB |
After Width: | Height: | Size: 984 B |
After Width: | Height: | Size: 1.0 KiB |
After Width: | Height: | Size: 1.0 KiB |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 33 KiB |
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 4.2 KiB |
After Width: | Height: | Size: 25 KiB |
After Width: | Height: | Size: 1.2 MiB |
After Width: | Height: | Size: 128 KiB |
After Width: | Height: | Size: 92 KiB |
After Width: | Height: | Size: 81 KiB |
After Width: | Height: | Size: 2.4 KiB |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 1.7 MiB |
After Width: | Height: | Size: 15 KiB |
|
@ -0,0 +1,590 @@
|
||||||
|
// ant默认样式修改
|
||||||
|
@link-color: #cff; //链接颜色
|
||||||
|
@lightColor:#cff; //浅色
|
||||||
|
@darkColor:hsla(0, 0%, 100%, 0.65); //深色
|
||||||
|
@antFontColor:#85b1bf !important; //灰色文字
|
||||||
|
@antBg:rgba(21,46,62,.9) !important; //黑色背景
|
||||||
|
@antBorder:1px solid #02739d !important; //黑色边框
|
||||||
|
|
||||||
|
//自定颜色
|
||||||
|
@listIconfontP:22px; //list-icon图标列表的p标签(数据)的文字大小
|
||||||
|
@listItemHeight:36px; //列表的高度
|
||||||
|
@pColor:#cff; //文本颜色
|
||||||
|
|
||||||
|
// foot的默认height为90px,两侧默认高度lrHeight为900px,中间cHeight为790px
|
||||||
|
@fontHeight: 90px;
|
||||||
|
@lrHeight: 900px + @fontHeight;
|
||||||
|
@cHeight: 790px + @fontHeight;
|
||||||
|
|
||||||
|
.chart{
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
.flex-c{
|
||||||
|
display:flex;
|
||||||
|
flex-direction:column
|
||||||
|
}
|
||||||
|
.flex-r{
|
||||||
|
display:flex;
|
||||||
|
flex-direction:row
|
||||||
|
}
|
||||||
|
.flex-1{
|
||||||
|
flex:1 !important
|
||||||
|
}
|
||||||
|
.flex-2{
|
||||||
|
flex:2 !important
|
||||||
|
}
|
||||||
|
.flex-3{
|
||||||
|
flex:3 !important
|
||||||
|
}
|
||||||
|
.flex-4{
|
||||||
|
flex:4 !important
|
||||||
|
}
|
||||||
|
.flex-5{
|
||||||
|
flex:5 !important
|
||||||
|
}
|
||||||
|
.flex-6{
|
||||||
|
flex:6 !important
|
||||||
|
}
|
||||||
|
.flex-7{
|
||||||
|
flex:7 !important
|
||||||
|
}
|
||||||
|
.flex-8{
|
||||||
|
flex:8 !important
|
||||||
|
}
|
||||||
|
.flex-9{
|
||||||
|
flex:9 !important
|
||||||
|
}
|
||||||
|
.flex-10{
|
||||||
|
flex:10 !important
|
||||||
|
}
|
||||||
|
* {
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
text-decoration: none;
|
||||||
|
list-style: none;
|
||||||
|
outline: none;
|
||||||
|
border: none;
|
||||||
|
user-select: none;
|
||||||
|
box-sizing: border-box;
|
||||||
|
@font-face {
|
||||||
|
font-family: dsFont;
|
||||||
|
src:url(../font/DS-DIGIT.TTF);
|
||||||
|
}
|
||||||
|
@font-face {
|
||||||
|
font-family: dyFont;
|
||||||
|
src: url(../font/douyuFont.otf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
body{
|
||||||
|
overflow: hidden;
|
||||||
|
&::-webkit-scrollbar{
|
||||||
|
width:0px;
|
||||||
|
height:0px;
|
||||||
|
overflow:hidden;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.scrollBar{
|
||||||
|
overflow: auto;
|
||||||
|
&::-webkit-scrollbar{
|
||||||
|
width: 3px;
|
||||||
|
height: 1px;
|
||||||
|
right: -5px;
|
||||||
|
&-thumb{
|
||||||
|
border-radius: 4px;
|
||||||
|
box-shadow: inset 0 0 5px rgb(0 0 0 / 20%);
|
||||||
|
background: #44909d;
|
||||||
|
}
|
||||||
|
&-track{
|
||||||
|
box-shadow: inset 0 0 5px rgb(0 0 0 / 20%);
|
||||||
|
border-radius: 4px;
|
||||||
|
background: rgba(36, 119, 130,.5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// commonBox的css ↓
|
||||||
|
@keyframes one{
|
||||||
|
0%{
|
||||||
|
left:-100%
|
||||||
|
}
|
||||||
|
50%,
|
||||||
|
100%{
|
||||||
|
left:100%
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@keyframes two{
|
||||||
|
0%{
|
||||||
|
top:-100%
|
||||||
|
}
|
||||||
|
50%,
|
||||||
|
100%{
|
||||||
|
top:100%
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@keyframes three{
|
||||||
|
0%{
|
||||||
|
right:-100%
|
||||||
|
}
|
||||||
|
50%,
|
||||||
|
100%{
|
||||||
|
right:100%
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@keyframes four{
|
||||||
|
0%{
|
||||||
|
bottom:-100%
|
||||||
|
}
|
||||||
|
50%,
|
||||||
|
100%{
|
||||||
|
bottom:100%
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.commonBox{
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
&::before,&::after{
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
height: 1px;
|
||||||
|
}
|
||||||
|
&::before{
|
||||||
|
top: 0;
|
||||||
|
left: -100%;
|
||||||
|
background-image: linear-gradient(90deg,transparent,#03e9f4);
|
||||||
|
animation: one 6s linear infinite;
|
||||||
|
}
|
||||||
|
&::after{
|
||||||
|
bottom: 0;
|
||||||
|
right: -100%;
|
||||||
|
background-image: linear-gradient(-90deg,transparent,#03e9f4);
|
||||||
|
animation: three 6s linear 2s infinite;
|
||||||
|
}
|
||||||
|
>i{
|
||||||
|
position: absolute;
|
||||||
|
display: inline-block;
|
||||||
|
height: 100%;
|
||||||
|
width: 1px;
|
||||||
|
&:first-child{
|
||||||
|
top: -100%;
|
||||||
|
right: 0;
|
||||||
|
background-image: linear-gradient(180deg,transparent,#03e9f4);
|
||||||
|
animation: two 6s linear 1s infinite;
|
||||||
|
}
|
||||||
|
&:nth-child(2){
|
||||||
|
bottom: -100%;
|
||||||
|
left: 0;
|
||||||
|
background-image: linear-gradient(1turn,transparent,#03e9f4);
|
||||||
|
animation: four 6s linear 3s infinite;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&-header{
|
||||||
|
@height:48px;
|
||||||
|
flex-basis: @height;
|
||||||
|
margin: 1px 1px 0;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
position: relative;
|
||||||
|
>span{
|
||||||
|
height: @height;
|
||||||
|
line-height: @height;
|
||||||
|
font-size: 18px;
|
||||||
|
font-family: dyFont;
|
||||||
|
font-weight: 400;
|
||||||
|
color: #fff;
|
||||||
|
padding: 4px 7px 0;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
>img{
|
||||||
|
width: 26px;
|
||||||
|
height: 26px;
|
||||||
|
&:nth-of-type(2){
|
||||||
|
transform: rotate(180deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.commonBox-more{
|
||||||
|
@height:40px;
|
||||||
|
position: absolute;
|
||||||
|
top: -7%;
|
||||||
|
right: 10px;
|
||||||
|
display: block;
|
||||||
|
height: @height;
|
||||||
|
line-height: @height+5;
|
||||||
|
background: url(../img/cbmb.webp) no-repeat 0/100% 100%;
|
||||||
|
cursor: pointer;
|
||||||
|
img{
|
||||||
|
width: 18px;
|
||||||
|
height: 18px;
|
||||||
|
margin: 0 6px;
|
||||||
|
}
|
||||||
|
span{
|
||||||
|
vertical-align: middle;
|
||||||
|
padding-right: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&-contain{
|
||||||
|
flex: 1;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
.commonBox-menu{
|
||||||
|
flex-basis: 24px;
|
||||||
|
}
|
||||||
|
.commonBox-item{
|
||||||
|
flex: 1;
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//ant组件样式修改
|
||||||
|
.commonBox{
|
||||||
|
.commonBox-menu{
|
||||||
|
margin: 8px 10px;
|
||||||
|
//radio菜单面板
|
||||||
|
.ant-radio-button-wrapper{
|
||||||
|
background: rgba(0,198,255,.08);
|
||||||
|
border: none;
|
||||||
|
span{
|
||||||
|
background: rgba(0,198,255,.08);
|
||||||
|
color: hsla(0,0%,100%,.65);
|
||||||
|
display: inline-block;
|
||||||
|
padding: 0 8px;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
&-checked{
|
||||||
|
background: rgba(0,198,255,.85);
|
||||||
|
span{
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&:focus-within{
|
||||||
|
box-shadow:none;
|
||||||
|
}
|
||||||
|
&:not(:first-child){
|
||||||
|
&::before{
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//select下拉选择
|
||||||
|
.ant-select{
|
||||||
|
position: absolute;
|
||||||
|
right: 10px;
|
||||||
|
&:not(.ant-select-customize-input){
|
||||||
|
.ant-select-selector{
|
||||||
|
background: none;
|
||||||
|
border: @antBorder;
|
||||||
|
&:hover{
|
||||||
|
border-color: #ccffff;
|
||||||
|
-webkit-box-shadow: none;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.ant-select-arrow{
|
||||||
|
color: @antFontColor;
|
||||||
|
}
|
||||||
|
&-selector{
|
||||||
|
span{
|
||||||
|
color: @antFontColor;
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.ant-select-focused:not(.ant-select-disabled).ant-select:not(.ant-select-customize-input){
|
||||||
|
.ant-select-selector {
|
||||||
|
border-color: #ccffff;
|
||||||
|
-webkit-box-shadow: none;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//日期选项框
|
||||||
|
.ant-picker{
|
||||||
|
color:@antFontColor;
|
||||||
|
background: @antBg;
|
||||||
|
border: @antBorder;
|
||||||
|
padding: 3px 11px 3px !important;
|
||||||
|
width: 80px !important;
|
||||||
|
position: absolute !important;
|
||||||
|
right: 10px;
|
||||||
|
//右侧图标
|
||||||
|
&-suffix{
|
||||||
|
color:@antFontColor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//日期选择框文本调整
|
||||||
|
.ant-picker-input{
|
||||||
|
>input{
|
||||||
|
color: @antFontColor;
|
||||||
|
text-indent: 0.1em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//下拉选项框面板
|
||||||
|
.ant-select-dropdown{
|
||||||
|
color:@antFontColor;
|
||||||
|
background: @antBg;
|
||||||
|
border: 1px solid #02739d !important;
|
||||||
|
.ant-select-item-option-selected{
|
||||||
|
&:not(.ant-select-item-option-disabled){
|
||||||
|
background: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.ant-select-item-option-active{
|
||||||
|
&:not(.ant-select-item-option-disabled){
|
||||||
|
background: url(../img/arrowItemBg.webp) no-repeat 0/100% 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//下拉框菜单
|
||||||
|
.ant-select-item-option{
|
||||||
|
&:hover{
|
||||||
|
background: url(../img/arrowItemBg.webp) no-repeat 0/100% 100%;
|
||||||
|
}
|
||||||
|
&:active{
|
||||||
|
background: url(../img/arrowItemBg.webp) no-repeat 0/100% 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//下拉日期框面板
|
||||||
|
.ant-picker-dropdown{
|
||||||
|
//头部添加背景,并隐藏年份左右切换的按钮
|
||||||
|
.ant-picker-header{
|
||||||
|
border-bottom: 1px solid rgba(0,198,255,.5);
|
||||||
|
>button{
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
&-view{
|
||||||
|
>button{
|
||||||
|
color: #ccffff !important;
|
||||||
|
pointer-events: none !important;// 取消年份切换效果
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.ant-picker-panel-container{
|
||||||
|
color:@antFontColor;
|
||||||
|
border: 1px solid rgba(0,198,255,.5)!important;
|
||||||
|
background: url(../img/bg_ms1.webp) no-repeat 0/100% 100%;
|
||||||
|
background-color: rgba(21, 56, 76,0.8);
|
||||||
|
.ant-picker-panel{
|
||||||
|
border: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//内容面板高度调整
|
||||||
|
.ant-picker-content{
|
||||||
|
height: 200px !important;
|
||||||
|
}
|
||||||
|
//内容面板颜色调整
|
||||||
|
.ant-picker-cell{
|
||||||
|
&.ant-picker-cell-disabled{
|
||||||
|
.ant-picker-cell-inner{
|
||||||
|
color: #6b909e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&:hover{
|
||||||
|
&:not(.ant-picker-cell-in-view),
|
||||||
|
&:not(.ant-picker-cell-selected):not(.ant-picker-cell-range-start):not(.ant-picker-cell-range-end):not(.ant-picker-cell-range-hover-start):not(.ant-picker-cell-range-hover-end){
|
||||||
|
.ant-picker-cell-inner{
|
||||||
|
background: #1890ff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// commonBox的css ↑
|
||||||
|
|
||||||
|
// ant弹窗样式 ↓
|
||||||
|
.ant-modal-content{
|
||||||
|
@closeWH:40px;
|
||||||
|
background-color: #3c697b;
|
||||||
|
.ant-modal-header{
|
||||||
|
padding: 12px 24px 6px;
|
||||||
|
border: none;
|
||||||
|
background: url(../img/bg_mt.webp) no-repeat 0/100% 100%;
|
||||||
|
.ant-modal-title{
|
||||||
|
font-family: dyFont;
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: 400;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.ant-modal-body{
|
||||||
|
background: url('../img/bg_ms1.webp') no-repeat 0/100% 100%;
|
||||||
|
}
|
||||||
|
.ant-modal-close-x{
|
||||||
|
width: @closeWH;
|
||||||
|
height: @closeWH;
|
||||||
|
line-height: @closeWH;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ant弹窗样式 ↑
|
||||||
|
|
||||||
|
// ant步骤条 ↓
|
||||||
|
.ant-steps{
|
||||||
|
.ant-steps-icon{
|
||||||
|
color: #cff !important;
|
||||||
|
}
|
||||||
|
.ant-steps-item-icon{
|
||||||
|
background:none !important;
|
||||||
|
}
|
||||||
|
.ant-steps-item-title,.ant-steps-item-description{
|
||||||
|
color: @lightColor !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ant步骤条 ↑
|
||||||
|
|
||||||
|
//列表样式 ↓ 包含图标列表list-icon,滚动列表list-scroll,自动滚动列表list-swiper
|
||||||
|
.list{
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
padding: 0 10px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
position: relative;
|
||||||
|
.list-h{
|
||||||
|
flex-basis: @listItemHeight;
|
||||||
|
height: @listItemHeight;
|
||||||
|
line-height: @listItemHeight;
|
||||||
|
width: 100%;
|
||||||
|
text-align: center;
|
||||||
|
background: rgba(203, 244, 255, .1) 50%/contain;
|
||||||
|
box-sizing: border-box;
|
||||||
|
display: flex;
|
||||||
|
flex-flow: row nowrap;
|
||||||
|
align-items: center;
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: 400;
|
||||||
|
color: #d7efff;
|
||||||
|
p{
|
||||||
|
flex: 1;
|
||||||
|
height: 100%;
|
||||||
|
margin-bottom: 0px;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
&:nth-child(even){
|
||||||
|
background: rgba(0, 198, 255, .04) 50%/contain;
|
||||||
|
}
|
||||||
|
&:nth-child(odd){
|
||||||
|
background: rgba(0, 198, 255, .1) 50%/contain;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.list-b{
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
//图标列表样式
|
||||||
|
&-icon{
|
||||||
|
flex-direction: row;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
height: auto;
|
||||||
|
&-item{
|
||||||
|
margin-top: 10px;
|
||||||
|
width: 170px;
|
||||||
|
height: 66px;
|
||||||
|
background: url('../img/icon_bg.webp') no-repeat;
|
||||||
|
background-size: 100% 100%;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
img{
|
||||||
|
width: 46px;
|
||||||
|
height: 48px;
|
||||||
|
margin: 0 10px 0 5px;
|
||||||
|
}
|
||||||
|
>div{
|
||||||
|
p{
|
||||||
|
font-size: @listIconfontP;
|
||||||
|
margin-bottom: 0px;
|
||||||
|
color: @pColor;
|
||||||
|
}
|
||||||
|
span{
|
||||||
|
color: @darkColor;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//滚动列表的样式
|
||||||
|
&-scroll{
|
||||||
|
flex-direction: column;
|
||||||
|
margin-top: 10px;
|
||||||
|
.list-b{
|
||||||
|
background-color: #122a3b;
|
||||||
|
overflow-y: auto;
|
||||||
|
overflow-x: hidden;
|
||||||
|
&::-webkit-scrollbar{
|
||||||
|
width: 3px;
|
||||||
|
height: 1px;
|
||||||
|
right: -5px;
|
||||||
|
&-thumb{
|
||||||
|
border-radius: 4px;
|
||||||
|
box-shadow: inset 0 0 5px rgb(0 0 0 / 20%);
|
||||||
|
background: #44909d;
|
||||||
|
}
|
||||||
|
&-track{
|
||||||
|
box-shadow: inset 0 0 5px rgb(0 0 0 / 20%);
|
||||||
|
border-radius: 4px;
|
||||||
|
background: rgba(36, 119, 130,.5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.list-item:extend(.list .list-h all){
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//自动滚动列表
|
||||||
|
&-swiper{
|
||||||
|
.list-b{
|
||||||
|
.list-item:extend(.list .list-h all){
|
||||||
|
height: auto;
|
||||||
|
flex-basis: auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.swiper-slide {
|
||||||
|
p {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//排行列表,前3改为图标
|
||||||
|
.ranking{
|
||||||
|
&-first,&-second,&-third{
|
||||||
|
display: block;
|
||||||
|
width: 36px;
|
||||||
|
height: 36px;
|
||||||
|
margin: 0 auto;
|
||||||
|
background-position: center center;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
}
|
||||||
|
&-first{
|
||||||
|
background-image: url('../img/icon/icon_first.webp');
|
||||||
|
}
|
||||||
|
&-second{
|
||||||
|
background-image: url('../img/icon/icon_second.webp');
|
||||||
|
}
|
||||||
|
&-third{
|
||||||
|
background-image: url('../img/icon/icon_third.webp');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&-operation {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//列表样式 ↑
|
||||||
|
|
||||||
|
//地图弹窗 ↓
|
||||||
|
.BMap_bubble_content{
|
||||||
|
p{
|
||||||
|
margin-bottom: 4px;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//地图弹窗 ↑
|
|
@ -0,0 +1,129 @@
|
||||||
|
<template>
|
||||||
|
<transition :appear='true' enter-active-class='animate__animated animate__fadeInUp'>
|
||||||
|
<div class='foot'>
|
||||||
|
<div class="foot-menu">
|
||||||
|
<div class='foot-page foot-page1'>
|
||||||
|
<a href="javascript:void(0)">基础概况</a>
|
||||||
|
</div>
|
||||||
|
<div class='foot-page foot-page2'>
|
||||||
|
<a href="javascript:void(0)">瞭望台</a>
|
||||||
|
</div>
|
||||||
|
<div class='foot-page foot-page3'>
|
||||||
|
<a href="javascript:void(0)">指挥台</a>
|
||||||
|
</div>
|
||||||
|
<div class='foot-page foot-page4'>
|
||||||
|
<a href="javascript:void(0)">工作台</a>
|
||||||
|
</div>
|
||||||
|
<div class='foot-icon'>
|
||||||
|
<img src="../assets/img/light.png" alt="">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</transition>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="less" scoped>
|
||||||
|
@keyframes one-data{
|
||||||
|
0%{
|
||||||
|
transform:rotate(0)
|
||||||
|
}
|
||||||
|
50%{
|
||||||
|
transform: rotate(180deg);
|
||||||
|
}
|
||||||
|
100%{
|
||||||
|
transform: rotate(1turn);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.foot{
|
||||||
|
position: fixed;
|
||||||
|
bottom: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 90px;
|
||||||
|
background: url(../assets/img/bg_bottom.png) no-repeat 0/100% 100%;
|
||||||
|
&-menu{
|
||||||
|
margin-top: 20px;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.foot-page{
|
||||||
|
a{
|
||||||
|
display: block;
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: 18px;
|
||||||
|
font-family: SourceHanSansCN;
|
||||||
|
font-weight: 500;
|
||||||
|
color: #fff;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.foot-page1{
|
||||||
|
margin-top:10px;
|
||||||
|
width:155px;
|
||||||
|
height:43px;
|
||||||
|
background: url(../assets/img/bg_btn_l1.png) no-repeat 0/100% 100%;
|
||||||
|
a{
|
||||||
|
padding-left: 24px;
|
||||||
|
transform: rotate(-4deg);
|
||||||
|
line-height: 46px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.foot-page2{
|
||||||
|
margin-right:79px;
|
||||||
|
width:146px;
|
||||||
|
height: 49px;
|
||||||
|
background: url(../assets/img/bg_btn_l2.png) no-repeat 0/100% 100%;
|
||||||
|
a{
|
||||||
|
padding-right: 20px;
|
||||||
|
transform: rotate(-4deg);
|
||||||
|
line-height: 46px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.foot-page3{
|
||||||
|
transform:rotateY(180deg);
|
||||||
|
width:120px;
|
||||||
|
height: 49px;
|
||||||
|
margin-left: 12px;
|
||||||
|
background: url(../assets/img/bg_btn_l2.png) no-repeat 0/100% 100%;
|
||||||
|
a{
|
||||||
|
line-height: 46px;
|
||||||
|
transform: rotate(-2deg) rotateY(180deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.foot-page4{
|
||||||
|
margin-top: 10px;
|
||||||
|
transform:rotateY(180deg);
|
||||||
|
width:152px;
|
||||||
|
height:43px;
|
||||||
|
background: url(../assets/img/bg_btn_l1.png) no-repeat 0/100% 100%;
|
||||||
|
a{
|
||||||
|
padding-right: 10px;
|
||||||
|
line-height: 46px;
|
||||||
|
transform: rotate(-4deg) rotateY(180deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.foot-icon{
|
||||||
|
position: absolute;
|
||||||
|
width: 140px;
|
||||||
|
height: 140px;
|
||||||
|
top: -20px;
|
||||||
|
background: url(../assets/img/bg_bottom_logo.png) no-repeat 0/100% 100%;
|
||||||
|
img{
|
||||||
|
pointer-events: none;
|
||||||
|
position: absolute;
|
||||||
|
width: 176px;
|
||||||
|
height: 176px;
|
||||||
|
z-index: 999;
|
||||||
|
top: -30px;
|
||||||
|
left: -18px;
|
||||||
|
top: -18px;
|
||||||
|
-webkit-animation: one-data 6s linear infinite;
|
||||||
|
animation: one-data 6s linear infinite;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
<template>
|
||||||
|
<transition
|
||||||
|
:appear="true"
|
||||||
|
enter-active-class="animate__animated animate__fadeInDown"
|
||||||
|
>
|
||||||
|
<div class="header">
|
||||||
|
<p>{{ datas.title }}</p>
|
||||||
|
</div>
|
||||||
|
</transition>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { reactive } from 'vue'
|
||||||
|
let datas = reactive({ // eslint-disable-line no-unused-vars
|
||||||
|
title: '"艺象心"驾驶舱',
|
||||||
|
}) // eslint-disable-line no-unused-vars
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="less" scoped>
|
||||||
|
|
||||||
|
.header {
|
||||||
|
position: fixed;
|
||||||
|
pointer-events: none;
|
||||||
|
width: 100%;
|
||||||
|
height: 90px;
|
||||||
|
background: url(../assets/img/top1.png) no-repeat;
|
||||||
|
background-size: 100% 100%;
|
||||||
|
> p {
|
||||||
|
color: #fff;
|
||||||
|
font-size: 26px;
|
||||||
|
font-family: dyFont;
|
||||||
|
letter-spacing: 8px;
|
||||||
|
margin: 16px auto 0;
|
||||||
|
text-align: center;
|
||||||
|
padding-left: 28px;
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -0,0 +1,146 @@
|
||||||
|
<template>
|
||||||
|
<div class="main-nav">
|
||||||
|
<div
|
||||||
|
v-for="(item, index) in mainNav"
|
||||||
|
:key="index"
|
||||||
|
class="main-nav-item"
|
||||||
|
:style="[
|
||||||
|
item.router == defaultNav
|
||||||
|
? { backgroundImage: 'url(' + item.obg + ')' }
|
||||||
|
: { backgroundImage: 'url(' + item.bg + ')' },
|
||||||
|
]"
|
||||||
|
>
|
||||||
|
<router-link :to="item.router">{{ item.name }}</router-link>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<router-view></router-view>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { reactive, ref } from '@vue/reactivity'
|
||||||
|
import { useRouter } from 'vue-router'
|
||||||
|
import { watch } from '@vue/runtime-core'
|
||||||
|
let mainNav = reactive([ // eslint-disable-line no-unused-vars
|
||||||
|
{
|
||||||
|
name: '首页',
|
||||||
|
router: '/coHome',
|
||||||
|
bg: require('../assets/img/lwt1.webp'),
|
||||||
|
obg: require('../assets/img/lwt11.webp'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '用户画像',
|
||||||
|
router: '/yhhx',
|
||||||
|
bg: require('../assets/img/lwt2.webp'),
|
||||||
|
obg: require('../assets/img/lwt22.webp'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '文艺作品',
|
||||||
|
router: '/wyzp',
|
||||||
|
bg: require('../assets/img/lwt3.webp'),
|
||||||
|
obg: require('../assets/img/lwt33.webp'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '文艺活动',
|
||||||
|
router: '/wyhd',
|
||||||
|
bg: require('../assets/img/lwt4.webp'),
|
||||||
|
obg: require('../assets/img/lwt44.webp'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '服务点',
|
||||||
|
router: '/fwd',
|
||||||
|
bg: require('../assets/img/lwt5.webp'),
|
||||||
|
obg: require('../assets/img/lwt55.webp'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '点单大厅',
|
||||||
|
router: '/dddt',
|
||||||
|
bg: require('../assets/img/lwt5.webp'),
|
||||||
|
obg: require('../assets/img/lwt55.webp'),
|
||||||
|
},
|
||||||
|
]) // eslint-disable-line no-unused-vars
|
||||||
|
const defaultNav = ref('/coHome')
|
||||||
|
const router = useRouter()
|
||||||
|
watch(
|
||||||
|
() => router.currentRoute.value.path,
|
||||||
|
(newValue) => {
|
||||||
|
defaultNav.value = newValue
|
||||||
|
let dom = document.getElementById('page')
|
||||||
|
dom.style.background = ['/fwd', '/dddt'].includes(newValue)
|
||||||
|
? 'none'
|
||||||
|
: ' #061119'
|
||||||
|
}
|
||||||
|
)
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="less" scoped>
|
||||||
|
.main-nav {
|
||||||
|
pointer-events: all;
|
||||||
|
width: 762px;
|
||||||
|
height: 70px;
|
||||||
|
padding: 8px 0;
|
||||||
|
box-sizing: border-box;
|
||||||
|
z-index: 1000;
|
||||||
|
position: fixed;
|
||||||
|
top: 92px;
|
||||||
|
left: 30.1%;
|
||||||
|
background: url(../assets/img/lwt_bg_center.webp) no-repeat;
|
||||||
|
background-size: 100% 100%;
|
||||||
|
display: flex;
|
||||||
|
&-item {
|
||||||
|
box-sizing: border-box;
|
||||||
|
flex: 1;
|
||||||
|
height: 100%;
|
||||||
|
font-weight: 400;
|
||||||
|
color: #fff;
|
||||||
|
padding-left: 52px;
|
||||||
|
background-size: 100% 100%;
|
||||||
|
a {
|
||||||
|
color: #fff;
|
||||||
|
font-family: dyFont;
|
||||||
|
font-size: 13px;
|
||||||
|
line-height: 54px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<style lang="less">
|
||||||
|
@import "@/assets/theme/theme.less";
|
||||||
|
.main {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
box-sizing: border-box;
|
||||||
|
position: relative;
|
||||||
|
&-l,
|
||||||
|
&-c,
|
||||||
|
&-r {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
.commonBox {
|
||||||
|
&:nth-child(n + 2) {
|
||||||
|
margin-top: 20px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&-l {
|
||||||
|
position: absolute;
|
||||||
|
left: 15px;
|
||||||
|
top: 70px;
|
||||||
|
width: 555px;
|
||||||
|
height: @lrHeight;
|
||||||
|
}
|
||||||
|
&-c {
|
||||||
|
position: absolute;
|
||||||
|
left: 595px;
|
||||||
|
top: 180px;
|
||||||
|
width: 734px;
|
||||||
|
height: @cHeight;
|
||||||
|
}
|
||||||
|
&-r {
|
||||||
|
position: absolute;
|
||||||
|
right: 15px;
|
||||||
|
top: 70px;
|
||||||
|
width: 555px;
|
||||||
|
height: @lrHeight;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -0,0 +1,198 @@
|
||||||
|
<template>
|
||||||
|
<div
|
||||||
|
class="commonBox"
|
||||||
|
:style="[
|
||||||
|
{ background: 'url(' + commonBoxBg + ') no-repeat 0/100% 100%' },
|
||||||
|
{ '--width': width || 'auto' },
|
||||||
|
{ '--height': height || 'auto' },
|
||||||
|
{ '--flex': flex },
|
||||||
|
]"
|
||||||
|
>
|
||||||
|
<i></i>
|
||||||
|
<i></i>
|
||||||
|
<div
|
||||||
|
class="commonBox-header"
|
||||||
|
:style="[
|
||||||
|
titleImg ? { backgroundImage: 'url(' + titleImg + ')' } : null,
|
||||||
|
]"
|
||||||
|
>
|
||||||
|
<img :src="tipImg" />
|
||||||
|
<span>{{ title }}</span>
|
||||||
|
<img :src="tipImg" />
|
||||||
|
<div
|
||||||
|
class="commonBox-more"
|
||||||
|
v-if="onMoreData.name"
|
||||||
|
@click="commonBoxMoreActive"
|
||||||
|
>
|
||||||
|
<img :src="commBoxMoreIcon" />
|
||||||
|
<span>{{ onMoreData.name }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="commonBox-contain">
|
||||||
|
<div class="commonBox-menu" v-if="onMenuData && onMenuData != ''">
|
||||||
|
<el-radio-group
|
||||||
|
v-model="defaultValue"
|
||||||
|
@change="menuChange"
|
||||||
|
>
|
||||||
|
<el-radio-button
|
||||||
|
v-for="(item, index) in onMenuData"
|
||||||
|
:key="index"
|
||||||
|
:label="item.value"
|
||||||
|
>
|
||||||
|
{{ item.name }}
|
||||||
|
</el-radio-button>
|
||||||
|
</el-radio-group>
|
||||||
|
<el-select
|
||||||
|
ref="select"
|
||||||
|
v-model="chooseValue"
|
||||||
|
v-if="chooseValue != ''"
|
||||||
|
@change="menuChange"
|
||||||
|
>
|
||||||
|
<el-select-option
|
||||||
|
v-for="(item, index) in choose"
|
||||||
|
:key="index"
|
||||||
|
:value="item.value"
|
||||||
|
>{{ item.name }}</el-select-option
|
||||||
|
>
|
||||||
|
</el-select>
|
||||||
|
<el-date-picker
|
||||||
|
v-if="dateFalg"
|
||||||
|
v-model="dateValue"
|
||||||
|
:disabled-date="disabledDate"
|
||||||
|
:placeholder="store.state.lastMon"
|
||||||
|
:format="'M月'"
|
||||||
|
picker="month"
|
||||||
|
:inputReadOnly="true"
|
||||||
|
@change="menuChange"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<slot></slot>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script setup>
|
||||||
|
import { ref, reactive, toRaw, toRefs, defineEmits, defineProps } from 'vue'
|
||||||
|
import { useStore } from 'vuex'
|
||||||
|
|
||||||
|
import dayjs from 'dayjs'
|
||||||
|
// import 'dayjs/locale/zh-cn'
|
||||||
|
// import locale from 'ant-design-vue/es/date-picker/locale/zh_CN'
|
||||||
|
// dayjs.locale('lcoale')
|
||||||
|
|
||||||
|
const store = useStore()
|
||||||
|
const props = defineProps([
|
||||||
|
'title',
|
||||||
|
'width',
|
||||||
|
'height',
|
||||||
|
'flex',
|
||||||
|
'bg',
|
||||||
|
'boxData',
|
||||||
|
'lbHeight',
|
||||||
|
])
|
||||||
|
const tipImg = ref(require('@/assets/img/title-tip.webp'))
|
||||||
|
let commonBoxBg = ref(require('@/assets/img/bg_ms1.webp'))
|
||||||
|
let titleImg = ref(require('@/assets/img/bg_mt.webp'))
|
||||||
|
const commBoxMoreIcon = ref(require('@/assets/img/cbmi.webp'))
|
||||||
|
|
||||||
|
//onSelectData当前状态的选项菜单相关数据
|
||||||
|
const onSelectData = reactive({
|
||||||
|
itemName: '', //当前盒子的名称
|
||||||
|
defaultValue: '', // 默认/当前选中的标签
|
||||||
|
lastValue: '', // 上一次选中的标签
|
||||||
|
chooseValue: '', //下拉菜单的默认名&是否显示
|
||||||
|
choose: [], //下拉菜单数据
|
||||||
|
dateFalg: false, //时间选择器是否显示
|
||||||
|
dateValue: '', //时间选择器的内容
|
||||||
|
})
|
||||||
|
const { defaultValue, chooseValue, choose, dateFalg, dateValue } =
|
||||||
|
toRefs(onSelectData)
|
||||||
|
let onDefaultData = [] //保存来自父组件的default数据
|
||||||
|
let onMenuData = [] //保存来自父组件的menu数据
|
||||||
|
let onMoreData = {} //保存来自父组件的more数据
|
||||||
|
const emit = defineEmits(['menuActive', 'moreActive']) //来自父组件的函数
|
||||||
|
|
||||||
|
//背景
|
||||||
|
const bgs = reactive({
|
||||||
|
bg1: require('@/assets/img/bg_ms1.webp'),
|
||||||
|
bg2: require('@/assets/img/bg_ms2.webp'),
|
||||||
|
bg3: require('@/assets/img/bg_ms3.webp'),
|
||||||
|
bg4: require('@/assets/img/bg_ms4.webp'),
|
||||||
|
bg5: require('@/assets/img/bg_ms5.webp'),
|
||||||
|
cbg: require('@/assets/img/bg_cbg.webp'),
|
||||||
|
})
|
||||||
|
// 修改默认背景图片
|
||||||
|
const changeBg = (b) => {
|
||||||
|
commonBoxBg = bgs[b] ? ref(bgs[b]) : ref(b)
|
||||||
|
titleImg = b == 'cbg' ? (titleImg = ref('')) : titleImg
|
||||||
|
}
|
||||||
|
//保存/解析传入的boxData数据
|
||||||
|
const setBoxData = (d) => {
|
||||||
|
let onboxData = toRaw(reactive(d))
|
||||||
|
let { more, menu, ...defData } = onboxData
|
||||||
|
//保存来自父组件的default(剩余)数据
|
||||||
|
onDefaultData = defData
|
||||||
|
//当defData内存在参数itemName时,取itemName对应的数据内容,否则取menu内第一条非herf的数据
|
||||||
|
//保存来自父组件的menu数据(其他数据)
|
||||||
|
onMenuData = menu
|
||||||
|
if (defData.itemName && defData.itemName != '') {
|
||||||
|
for (let v of menu) if (v.value == defData.itemName) checkChooseData(v)
|
||||||
|
}
|
||||||
|
//保存+挂载来自父组件的more数据
|
||||||
|
if (more) {
|
||||||
|
onMoreData = more
|
||||||
|
onMoreData.name = more.name || '更多'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//更新/重置onSelectData数据
|
||||||
|
const checkChooseData = (d) => {
|
||||||
|
if (d.href) return (onSelectData.defaultValue = onSelectData.lastValue)
|
||||||
|
onSelectData.defaultValue ? null : (onSelectData.defaultValue = d.value)
|
||||||
|
onSelectData.lastValue = onSelectData.lastValue
|
||||||
|
? onSelectData.defaultValue
|
||||||
|
: d.value
|
||||||
|
onSelectData.chooseValue = d.choose ? d.choose[0].value : ''
|
||||||
|
onSelectData.choose = d.choose || []
|
||||||
|
onSelectData.dateFalg = d.date ? true : false
|
||||||
|
onSelectData.dateValue = d.date ? store.state.lastMonTime : ''
|
||||||
|
}
|
||||||
|
//更多按钮点击后触发事件,根据memu内type值执行不同的操作
|
||||||
|
const commonBoxMoreActive = () => {
|
||||||
|
if (onMoreData.href) onMoreData.href ? window.open(onMoreData.href) : null
|
||||||
|
if (onMoreData.fn) emit('moreActive', onMoreData.fn)
|
||||||
|
}
|
||||||
|
props.bg && changeBg(props.bg)
|
||||||
|
props.boxData && setBoxData(props.boxData)
|
||||||
|
//限制时间选择器的时间为今年的月份(除当前月)
|
||||||
|
const disabledDate = (current) => {
|
||||||
|
return current && current > store.state.lastMonTime
|
||||||
|
}
|
||||||
|
//标签变化
|
||||||
|
const menuChange = (e) => {
|
||||||
|
for (let v of onMenuData) {
|
||||||
|
if (v.value == e) {
|
||||||
|
checkChooseData(v)
|
||||||
|
if (v.href) window.open(v.href)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let a = onSelectData.dateValue
|
||||||
|
? dayjs(onSelectData.dateValue).format('M月')
|
||||||
|
: ''
|
||||||
|
emit(
|
||||||
|
'menuActive',
|
||||||
|
onDefaultData.name,
|
||||||
|
onSelectData.defaultValue,
|
||||||
|
onSelectData.chooseValue,
|
||||||
|
a
|
||||||
|
)
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="less" scoped>
|
||||||
|
@import "@/assets/theme/theme.less";
|
||||||
|
.commonBox {
|
||||||
|
width: var(--width);
|
||||||
|
height: var(--height);
|
||||||
|
flex-basis: var(--height);
|
||||||
|
flex: var(--flex);
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -0,0 +1,210 @@
|
||||||
|
<template>
|
||||||
|
|
||||||
|
<div
|
||||||
|
:class="['list', 'list-' + ld.type, ld.ranking ? 'list-ranking' : null]"
|
||||||
|
>
|
||||||
|
<div class="list-h" v-if="!ld.hideHeader && ld.header">
|
||||||
|
<p
|
||||||
|
v-for="(item, index) in ld.header"
|
||||||
|
:key="index"
|
||||||
|
:class="[
|
||||||
|
ld.flex && ld.flex[index] ? 'flex-' + ld.flex[index] : null,
|
||||||
|
]"
|
||||||
|
>
|
||||||
|
{{ item.headerName }}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="list-b"
|
||||||
|
:style="[{ height: ld.height }]"
|
||||||
|
v-if="ld.type === 'scroll' && ld.data.length"
|
||||||
|
>
|
||||||
|
<template v-if="ld.ranking">
|
||||||
|
<div
|
||||||
|
class="list-item"
|
||||||
|
v-for="(item, index) in onList"
|
||||||
|
:key="index"
|
||||||
|
@click="itemActive(item)"
|
||||||
|
>
|
||||||
|
<p
|
||||||
|
v-for="(v, i) in ld.header"
|
||||||
|
:key="i"
|
||||||
|
:class="[
|
||||||
|
ld.flex && ld.flex[i] ? 'flex-' + ld.flex[i] : null,
|
||||||
|
]"
|
||||||
|
>
|
||||||
|
<i
|
||||||
|
v-if="index < 3 && i == 0"
|
||||||
|
:class="[
|
||||||
|
index === 0
|
||||||
|
? 'ranking-first'
|
||||||
|
: index === 1
|
||||||
|
? 'ranking-second'
|
||||||
|
: 'ranking-third',
|
||||||
|
]"
|
||||||
|
></i>
|
||||||
|
<span v-else-if="index >= 3 && i == 0">{{
|
||||||
|
item.ranking
|
||||||
|
}}</span>
|
||||||
|
<span
|
||||||
|
v-else-if="ld.header[i].key === 'operation'"
|
||||||
|
@click="operActive(item)"
|
||||||
|
class="list-operation"
|
||||||
|
>
|
||||||
|
{{ item[ld.header[i].key] }}
|
||||||
|
</span>
|
||||||
|
<span v-else>{{ item[ld.header[i].key] }}</span>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<div
|
||||||
|
class="list-item"
|
||||||
|
v-for="(item, index) in onList"
|
||||||
|
:key="index"
|
||||||
|
@click="itemActive(item)"
|
||||||
|
>
|
||||||
|
<p
|
||||||
|
v-for="(v, i) in ld.header"
|
||||||
|
:key="i"
|
||||||
|
:class="[
|
||||||
|
ld.flex && ld.flex[i] ? 'flex-' + ld.flex[i] : null,
|
||||||
|
]"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
v-if="ld.header[i].key === 'operation'"
|
||||||
|
@click="operActive(item)"
|
||||||
|
class="list-operation"
|
||||||
|
>
|
||||||
|
{{ item[ld.header[i].key] }}
|
||||||
|
</span>
|
||||||
|
<span v-else>{{ item[ld.header[i].key] }}</span>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
|
<swiper
|
||||||
|
class="swiper-container list-b"
|
||||||
|
:modules="modules"
|
||||||
|
:slidesPerView="!ld.swiperView ? 5 : ld.swiperView"
|
||||||
|
direction="vertical"
|
||||||
|
:loop="true"
|
||||||
|
:autoplay="{ delay: 5000, disableOnInteraction: false }"
|
||||||
|
:style="[{ height: ld.height }]"
|
||||||
|
v-else-if="ld.type === 'swiper' && ld.data.length"
|
||||||
|
>
|
||||||
|
<template v-if="ld.ranking">
|
||||||
|
<swiper-slide
|
||||||
|
class="list-item"
|
||||||
|
v-for="(item, index) in onList"
|
||||||
|
:key="index"
|
||||||
|
@click="itemActive(item)"
|
||||||
|
>
|
||||||
|
<p
|
||||||
|
v-for="(v, i) in ld.header"
|
||||||
|
:key="i"
|
||||||
|
:class="[
|
||||||
|
ld.flex && ld.flex[i] ? 'flex-' + ld.flex[i] : null,
|
||||||
|
]"
|
||||||
|
>
|
||||||
|
<i
|
||||||
|
v-if="index < 3 && i == 0"
|
||||||
|
:class="[
|
||||||
|
index === 0
|
||||||
|
? 'ranking-first'
|
||||||
|
: index === 1
|
||||||
|
? 'ranking-second'
|
||||||
|
: 'ranking-third',
|
||||||
|
]"
|
||||||
|
></i>
|
||||||
|
<span v-else-if="index >= 3 && i == 0">{{
|
||||||
|
item.ranking
|
||||||
|
}}</span>
|
||||||
|
<span
|
||||||
|
v-else-if="ld.header[i].key === 'operation'"
|
||||||
|
@click="operActive(item)"
|
||||||
|
class="list-operation"
|
||||||
|
>
|
||||||
|
{{ item[ld.header[i].key] }}
|
||||||
|
</span>
|
||||||
|
<span v-else>{{ item[ld.header[i].key] }}</span>
|
||||||
|
</p>
|
||||||
|
</swiper-slide>
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<swiper-slide
|
||||||
|
class="swiper-slide list-item"
|
||||||
|
v-for="(item, index) in onList"
|
||||||
|
:key="index"
|
||||||
|
@click="itemActive(item)"
|
||||||
|
>
|
||||||
|
<p
|
||||||
|
v-for="(v, i) in ld.header"
|
||||||
|
:key="i"
|
||||||
|
:class="[
|
||||||
|
ld.flex && ld.flex[i] ? 'flex-' + ld.flex[i] : null,
|
||||||
|
]"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
v-if="ld.header[i].key === 'operation'"
|
||||||
|
@click="operActive(item)"
|
||||||
|
class="list-operation"
|
||||||
|
>
|
||||||
|
{{ item[ld.header[i].key] }}
|
||||||
|
</span>
|
||||||
|
<span v-else>{{ item[ld.header[i].key] }}</span>
|
||||||
|
</p>
|
||||||
|
</swiper-slide>
|
||||||
|
</template>
|
||||||
|
</swiper>
|
||||||
|
<template v-if="ld.type === 'icon'">
|
||||||
|
<div
|
||||||
|
class="list-icon-item"
|
||||||
|
v-for="(item, index) in ld.data"
|
||||||
|
:key="index"
|
||||||
|
@click="itemActive(item)"
|
||||||
|
>
|
||||||
|
<img :src="item.icon" />
|
||||||
|
<div>
|
||||||
|
<p>
|
||||||
|
{{ item.value }}
|
||||||
|
<span>{{ item.unit }}</span>
|
||||||
|
</p>
|
||||||
|
<span>{{ item.name }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { reactive, toRaw, ref, defineEmits, defineProps } from 'vue'
|
||||||
|
import { hook } from '@/hook/hook'
|
||||||
|
import { Autoplay } from 'swiper'
|
||||||
|
import { Swiper, SwiperSlide } from 'swiper/vue/swiper-vue.js'
|
||||||
|
const modules = [Autoplay]
|
||||||
|
|
||||||
|
const { jsonSort } = hook()
|
||||||
|
const props = defineProps(['listData'])
|
||||||
|
const ld = reactive(props.listData)
|
||||||
|
var onList = reactive(props.listData.data)
|
||||||
|
ld &&
|
||||||
|
(() => {
|
||||||
|
if (ld.ranking) {
|
||||||
|
ld.header.unshift({ headerName: '排名', key: 'ranking' })
|
||||||
|
let r = typeof ld.ranking == 'string' ? ld.ranking : 'value'
|
||||||
|
let d = jsonSort(toRaw(ld.data), r, ld.rankingOrder)
|
||||||
|
d.forEach((v, i) => (v.ranking = i + 1))
|
||||||
|
onList = reactive(d)
|
||||||
|
}
|
||||||
|
if (ld.operation) {
|
||||||
|
ld.header.push({ headerName: '操作', key: 'operation' })
|
||||||
|
let r = typeof ld.operation == 'string' ? ld.operation : '查看'
|
||||||
|
for (let v of ld.data) v.operation = r
|
||||||
|
}
|
||||||
|
})()
|
||||||
|
const emit = defineEmits(['listItem', 'listOper']) //来自父组件的函数
|
||||||
|
const itemActive = (item) => emit('listItem', item)
|
||||||
|
|
||||||
|
const operActive = (item) => emit('listOper', item)
|
||||||
|
</script>
|
|
@ -0,0 +1,33 @@
|
||||||
|
<template>
|
||||||
|
<div class="common-title flex-r">
|
||||||
|
<img :src="tip1" />
|
||||||
|
<p class="common-title-info">{{ title }}</p>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { ref, defineEmits, defineProps } from 'vue'
|
||||||
|
|
||||||
|
const props = defineProps(['title'])
|
||||||
|
|
||||||
|
const tip1 = ref(require('@/assets/img/bg_ct.webp'))
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="less" scoped>
|
||||||
|
@import "@/assets/theme/theme.less";
|
||||||
|
.common-title {
|
||||||
|
height: 30px;
|
||||||
|
line-height: 30px;
|
||||||
|
flex-basis: 30px;
|
||||||
|
> img {
|
||||||
|
margin-right: 8px;
|
||||||
|
}
|
||||||
|
&-info {
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: 500;
|
||||||
|
min-width: 180px;
|
||||||
|
color: @lightColor;
|
||||||
|
background: url('../../assets/img/bg_cb.webp') no-repeat 0 bottom;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -0,0 +1,10 @@
|
||||||
|
const importFn = require.context('./', false, /\.vue$/)
|
||||||
|
|
||||||
|
export default {
|
||||||
|
install(app) {
|
||||||
|
importFn.keys().forEach((key) => {
|
||||||
|
const component = importFn(key).default
|
||||||
|
app.component(component.__name, component)
|
||||||
|
})
|
||||||
|
},
|
||||||
|
}
|
|
@ -0,0 +1,550 @@
|
||||||
|
<template>
|
||||||
|
<div class="main">
|
||||||
|
<teleport to="#app">
|
||||||
|
<div
|
||||||
|
id="map"
|
||||||
|
:style="{
|
||||||
|
width: store.state.pagePosition.scale * 1920 + 'px',
|
||||||
|
height: store.state.pagePosition.scale * 1080 + 'px',
|
||||||
|
marginLeft: store.state.pagePosition.left,
|
||||||
|
marginTop: store.state.pagePosition.top,
|
||||||
|
}"
|
||||||
|
></div>
|
||||||
|
</teleport>
|
||||||
|
<transition
|
||||||
|
:appear="true"
|
||||||
|
enter-active-class="animate__animated animate__fadeInLeft"
|
||||||
|
>
|
||||||
|
<div class="main-l">
|
||||||
|
<CommonBox
|
||||||
|
title="需求列表"
|
||||||
|
height="720px"
|
||||||
|
width="440px"
|
||||||
|
bg="bg5"
|
||||||
|
>
|
||||||
|
<CommonList :listData="xqlb.list" @listItem="showMore" />
|
||||||
|
</CommonBox>
|
||||||
|
</div>
|
||||||
|
</transition>
|
||||||
|
<transition-group
|
||||||
|
enter-active-class="animate__animated animate__fadeInRight"
|
||||||
|
leave-active-class="animate__animated animate__fadeOutRight"
|
||||||
|
>
|
||||||
|
<div class="main-r" :key="1" v-show="detailsFlag">
|
||||||
|
<CommonBox
|
||||||
|
title="需求详情"
|
||||||
|
width="440px"
|
||||||
|
class="details"
|
||||||
|
bg="bg5"
|
||||||
|
>
|
||||||
|
<div class="details-info">
|
||||||
|
<p>
|
||||||
|
<span>标题</span
|
||||||
|
><span>{{ detailsSetData.title }}</span>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<span>类型</span>
|
||||||
|
<span>{{ detailsSetData.type }}</span>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<span>时间</span>
|
||||||
|
<span>{{ detailsSetData.time }}</span>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<span>发布人</span>
|
||||||
|
<span>{{ detailsSetData.author }}</span>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<span>联系电话</span>
|
||||||
|
<span>{{ detailsSetData.photo }}</span>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<span>需求清单</span>
|
||||||
|
<span>{{ detailsSetData.listing }}</span>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<span>具体内容</span
|
||||||
|
><span>{{ detailsSetData.matter }}</span>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<template
|
||||||
|
v-if="
|
||||||
|
detailsSetData.progress &&
|
||||||
|
detailsSetData.progress.length
|
||||||
|
"
|
||||||
|
>
|
||||||
|
<commonTitle title="需求流程" />
|
||||||
|
<el-steps
|
||||||
|
direction="vertical"
|
||||||
|
:current="detailsSetData.progress.length"
|
||||||
|
class="details-process scrollBar"
|
||||||
|
>
|
||||||
|
<el-step
|
||||||
|
v-for="(item, index) in detailsSetData.progress"
|
||||||
|
:key="index"
|
||||||
|
:title="item.name"
|
||||||
|
:description="item.date"
|
||||||
|
/>
|
||||||
|
</el-steps>
|
||||||
|
</template>
|
||||||
|
<template
|
||||||
|
v-if="detailsSetData.imgs && detailsSetData.imgs.length"
|
||||||
|
>
|
||||||
|
<commonTitle title="相关内容" />
|
||||||
|
<swiper
|
||||||
|
:pagination="{ clickable: true }"
|
||||||
|
:modules="modules"
|
||||||
|
:slidesPerView="1"
|
||||||
|
class="details-imgs"
|
||||||
|
>
|
||||||
|
<swiper-slide
|
||||||
|
v-for="(item, index) in detailsSetData.imgs"
|
||||||
|
:key="index"
|
||||||
|
>
|
||||||
|
<img :src="item" />
|
||||||
|
</swiper-slide>
|
||||||
|
</swiper>
|
||||||
|
</template>
|
||||||
|
<template v-if="detailsSetData.remark">
|
||||||
|
<commonTitle title="需求评价" />
|
||||||
|
<p class="details-remark">
|
||||||
|
{{ detailsSetData.remark }}
|
||||||
|
</p>
|
||||||
|
</template>
|
||||||
|
</CommonBox>
|
||||||
|
</div>
|
||||||
|
</transition-group>
|
||||||
|
<transition
|
||||||
|
:appear="true"
|
||||||
|
enter-active-class="animate__animated animate__fadeInUp"
|
||||||
|
>
|
||||||
|
<ul class="map-tip">
|
||||||
|
<li
|
||||||
|
v-for="(v, k, i) in mapPointsIcon"
|
||||||
|
:key="i"
|
||||||
|
@click="mapPointsChoose(v)"
|
||||||
|
>
|
||||||
|
<img :src="v.tipFlag ? v.tip : v.tip2" />
|
||||||
|
<span :style="{ color: v.tipFlag ? '#cff' : '#85b1bf' }">{{
|
||||||
|
k
|
||||||
|
}}</span>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</transition>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { useStore } from 'vuex'
|
||||||
|
import { onMounted } from '@vue/runtime-core'
|
||||||
|
import { reactive, ref, toRefs } from '@vue/reactivity'
|
||||||
|
import { Pagination, A11y } from 'swiper'
|
||||||
|
import { Swiper, SwiperSlide } from 'swiper/vue/swiper-vue.js'
|
||||||
|
import { hook } from '@/hook/hook'
|
||||||
|
const { delay, chartDate } = hook()
|
||||||
|
const store = useStore()
|
||||||
|
const modules = [Pagination, A11y]
|
||||||
|
const detailsFlag = ref(false)
|
||||||
|
const mapPointsIcon = reactive({
|
||||||
|
学校乐队: {
|
||||||
|
name: '学校乐队',
|
||||||
|
tip: require('@/assets/img/icon/s.png'),
|
||||||
|
tip2: require('@/assets/img/icon/s2.png'),
|
||||||
|
tipFlag: true,
|
||||||
|
},
|
||||||
|
老年舞队: {
|
||||||
|
name: '老年舞队',
|
||||||
|
tip: require('@/assets/img/icon/l.png'),
|
||||||
|
tip2: require('@/assets/img/icon/l2.png'),
|
||||||
|
tipFlag: true,
|
||||||
|
},
|
||||||
|
文艺团队: {
|
||||||
|
name: '文艺团队',
|
||||||
|
tip: require('@/assets/img/icon/w.png'),
|
||||||
|
tip2: require('@/assets/img/icon/w2.png'),
|
||||||
|
tipFlag: true,
|
||||||
|
},
|
||||||
|
艺术机构: {
|
||||||
|
name: '艺术机构',
|
||||||
|
tip: require('@/assets/img/icon/j.png'),
|
||||||
|
tip2: require('@/assets/img/icon/j2.png'),
|
||||||
|
tipFlag: true,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
const mapPoints = reactive([
|
||||||
|
{
|
||||||
|
title: '丹城第二小学合唱团',
|
||||||
|
type: '学校乐队',
|
||||||
|
count: '115',
|
||||||
|
rating: '4.5',
|
||||||
|
location: '象山县建设路293号',
|
||||||
|
phone: '65477592',
|
||||||
|
x: 29.462307,
|
||||||
|
y: 121.886711,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '丹城中学合唱团',
|
||||||
|
type: '学校乐队',
|
||||||
|
count: '96',
|
||||||
|
rating: '4',
|
||||||
|
location: '象山县丹阳路附近',
|
||||||
|
phone: '65244785',
|
||||||
|
x: 29.467602,
|
||||||
|
y: 121.870499,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '丹河街道老年舞队',
|
||||||
|
type: '老年舞队',
|
||||||
|
count: '54',
|
||||||
|
rating: '4',
|
||||||
|
location: '象山县丹河东路1001号',
|
||||||
|
phone: '65855412',
|
||||||
|
x: 29.472591,
|
||||||
|
y: 121.879829,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '文峰小区文艺团',
|
||||||
|
type: '文艺团队',
|
||||||
|
count: '86',
|
||||||
|
rating: '4.5',
|
||||||
|
location: '象山县丹峰东路242号',
|
||||||
|
phone: '69655892',
|
||||||
|
x: 29.461435,
|
||||||
|
y: 121.884125,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '乐逍遥文艺团',
|
||||||
|
type: '文艺团队',
|
||||||
|
count: '65',
|
||||||
|
rating: '3.5',
|
||||||
|
location: '象山县天安路157号3楼',
|
||||||
|
phone: '65744895',
|
||||||
|
x: 29.481435,
|
||||||
|
y: 121.894125,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '飞韵琴行',
|
||||||
|
type: '艺术机构',
|
||||||
|
count: '105',
|
||||||
|
rating: '4.5',
|
||||||
|
location: '象山县象山河路世纪花园南侧约30米',
|
||||||
|
phone: '65322501',
|
||||||
|
x: 29.461435,
|
||||||
|
y: 121.864125,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '雅艺乐器行',
|
||||||
|
type: '艺术机构',
|
||||||
|
count: '105',
|
||||||
|
rating: '4.5',
|
||||||
|
location: '象山县象山河路世纪花园南侧约30米',
|
||||||
|
phone: '65322501',
|
||||||
|
x: 29.451435,
|
||||||
|
y: 121.884125,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '卓舞蹈培训中心',
|
||||||
|
type: '艺术机构',
|
||||||
|
count: '124',
|
||||||
|
rating: '5',
|
||||||
|
location: '象山县樟树下村34号 ',
|
||||||
|
phone: '65896632',
|
||||||
|
x: 29.471435,
|
||||||
|
y: 121.914125,
|
||||||
|
},
|
||||||
|
])
|
||||||
|
const commonBoxData = reactive({
|
||||||
|
xqlb: {
|
||||||
|
list: {
|
||||||
|
type: 'swiper',
|
||||||
|
height: '620px',
|
||||||
|
flex: [2, 1],
|
||||||
|
swiperView: 14,
|
||||||
|
header: [
|
||||||
|
{ headerName: '标题', key: 'title' },
|
||||||
|
{ headerName: '时间', key: 'time' },
|
||||||
|
],
|
||||||
|
data: [
|
||||||
|
{
|
||||||
|
title: '涌金广场文艺表演',
|
||||||
|
time: '2022-08-26',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '人民广场演唱会',
|
||||||
|
time: '2022-08-22',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '人民广场文艺演出',
|
||||||
|
time: '2022-08-19',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '第六届少儿慈善春晚活动',
|
||||||
|
time: '2022-08-10',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '《一心向党 歌唱祖国》文艺晚会',
|
||||||
|
time: '2022-08-05',
|
||||||
|
imgs: [],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '“象益山海”',
|
||||||
|
time: '2022-08-01',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '“中华慈善日”文艺汇演',
|
||||||
|
time: '2022-07-29',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '“红色领航·益暖象山”公益演出',
|
||||||
|
time: '2022-07-25',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '“百场演出进百乡”公演',
|
||||||
|
time: '2022-07-16',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '丹西街道军属慰问表演',
|
||||||
|
time: '2022-07-15',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '影视城端午节晚会',
|
||||||
|
time: '2022-07-10',
|
||||||
|
type: '演出',
|
||||||
|
author: '孙先生',
|
||||||
|
photo: '13905584151',
|
||||||
|
listing:
|
||||||
|
'需要主持人3人,现场管理人员20人,志愿者30人,表演团队5支。',
|
||||||
|
matter: '端午即将到来,现在象山县影视城举办端午节晚会活动,喜迎端午。',
|
||||||
|
progress: [
|
||||||
|
{ name: '需求发布', date: '2022-05-28 20:14' },
|
||||||
|
{ name: '已接单', date: '2022-05-29 09:53' },
|
||||||
|
{ name: '已结束', date: '2022-06-08 18:00' },
|
||||||
|
{ name: '已评价', date: '2022-06-09 10:20' },
|
||||||
|
],
|
||||||
|
imgs: [
|
||||||
|
require('@/assets/img/pics/3.jpg'),
|
||||||
|
require('@/assets/img/pics/4.jpg'),
|
||||||
|
],
|
||||||
|
remark: '这台晚会不仅有了故事性和趣味性,而且逻辑串联也非常合理。节目制作的精良让我们看到了主创团队的用心,赢得赞誉是很自然的事情。',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '“善行象山、走进晓塘”文艺演出',
|
||||||
|
time: '2022-07-03',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '象山渔区巡演',
|
||||||
|
time: '2022-06-21',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '象山县第四届群众文化艺术节',
|
||||||
|
time: '2022-06-18',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '象山县第五届群众文化艺术节',
|
||||||
|
time: '2022-06-11',
|
||||||
|
type: '演出',
|
||||||
|
author: '李女士',
|
||||||
|
photo: '1325224101',
|
||||||
|
listing:
|
||||||
|
'需要主持人3人,现场管理人员10人,志愿者20人,表演团队若干支。',
|
||||||
|
matter: '文化凝聚力量,艺术放飞梦想,特举办象山县第五届群众文化艺术节。',
|
||||||
|
progress: [
|
||||||
|
{ name: '需求发布', date: '2023-02-15 10:08' },
|
||||||
|
{ name: '已接单', date: '2023-02-15 14:23' },
|
||||||
|
{ name: '已结束', date: '2023-02-25 20:00' },
|
||||||
|
{ name: '已评价', date: '2023-02-26 09:21' },
|
||||||
|
],
|
||||||
|
imgs: [
|
||||||
|
require('@/assets/img/pics/1.jpg'),
|
||||||
|
require('@/assets/img/pics/2.jpg'),
|
||||||
|
],
|
||||||
|
remark: '满足人民群众对美好文化生活的需求,激发人民群众文化创造活力,发挥人民群众在文化活动中的主体作用,提增全民艺术知识普及、艺术欣赏普及、艺术技能普及、艺术活动普及水平,提升我县文化建设凝聚力、影响力和创造力.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '象山县第十四届中小学艺术节',
|
||||||
|
time: '2022-06-08',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '象山开镰节音乐节',
|
||||||
|
time: '2022-06-03',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
const { xqlb } = toRefs(commonBoxData)
|
||||||
|
var detailsSetData = reactive({})
|
||||||
|
var map
|
||||||
|
var opts = {
|
||||||
|
title: '',
|
||||||
|
}
|
||||||
|
const loadMap = (d) => {
|
||||||
|
for (const v in mapPointsIcon) {
|
||||||
|
mapPointsIcon[v].mapIcon = new window.BMapGL.Icon(
|
||||||
|
mapPointsIcon[v].tip,
|
||||||
|
new window.BMapGL.Size(26, 26)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
for (const v of d) {
|
||||||
|
let points = new window.BMapGL.Point(v.y, v.x)
|
||||||
|
opts.title = v.title
|
||||||
|
let html = `
|
||||||
|
<p>服务商积分: ${v.count}分</p>
|
||||||
|
<p>星级: ${v.rating}星</p>
|
||||||
|
<p>类型: ${v.type}</p>
|
||||||
|
<p>地址: ${v.location}</p>
|
||||||
|
<p>电话: ${v.phone}</p>
|
||||||
|
`
|
||||||
|
let markers = new window.BMapGL.Marker(points, {
|
||||||
|
icon: mapPointsIcon[v.type].mapIcon,
|
||||||
|
type: v.type,
|
||||||
|
})
|
||||||
|
map.addOverlay(markers)
|
||||||
|
let infoWindow = new window.BMapGL.InfoWindow(html, opts)
|
||||||
|
markers.addEventListener('click', function () {
|
||||||
|
map.openInfoWindow(infoWindow, points)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
onMounted(() => {
|
||||||
|
map = new window.BMapGL.Map('map')
|
||||||
|
map.setMapStyleV2({
|
||||||
|
styleId: '4a6029df2a52cd8be9496f0f2f47a1d4',
|
||||||
|
})
|
||||||
|
var point = new window.BMapGL.Point(121.879829, 29.472591)
|
||||||
|
map.centerAndZoom(point, 15)
|
||||||
|
map.setHeading(34.5)
|
||||||
|
map.setTilt(43)
|
||||||
|
map.enableScrollWheelZoom()
|
||||||
|
loadMap(mapPoints)
|
||||||
|
})
|
||||||
|
const mapPointsChoose = (e) => {
|
||||||
|
e.tipFlag = !e.tipFlag
|
||||||
|
if (e.tipFlag) {
|
||||||
|
let data = []
|
||||||
|
for (let v of mapPoints) if (v.type == e.name) data.push(v)
|
||||||
|
loadMap(data)
|
||||||
|
} else {
|
||||||
|
let allOverlay = map.getOverlays()
|
||||||
|
for (let v of allOverlay)
|
||||||
|
if (v._config.type == e.name) map.removeOverlay(v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const showMoreData = (e) => {
|
||||||
|
for (const v in detailsSetData) detailsSetData[v] = null
|
||||||
|
for (const v in e) detailsSetData[v] = e[v]
|
||||||
|
detailsFlag.value = true
|
||||||
|
}
|
||||||
|
const showMore = (e) => {
|
||||||
|
if (detailsFlag.value) {
|
||||||
|
detailsFlag.value = false
|
||||||
|
delay(showMoreData, e, 400)
|
||||||
|
} else showMoreData(e)
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style lang="less" scoped>
|
||||||
|
@import "@/assets/theme/theme.less";
|
||||||
|
.main {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
z-index: 1000;
|
||||||
|
&-l,
|
||||||
|
&-r {
|
||||||
|
pointer-events: none;
|
||||||
|
> .commonBox {
|
||||||
|
pointer-events: all;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.main-r {
|
||||||
|
align-items: flex-end;
|
||||||
|
}
|
||||||
|
.map-tip {
|
||||||
|
position: absolute;
|
||||||
|
bottom: 20px;
|
||||||
|
left: 24%;
|
||||||
|
width: auto;
|
||||||
|
height: auto;
|
||||||
|
background-color: #333333;
|
||||||
|
border-radius: 10px;
|
||||||
|
padding: 5px 10px;
|
||||||
|
pointer-events: all;
|
||||||
|
li {
|
||||||
|
float: left;
|
||||||
|
margin: 5px;
|
||||||
|
padding: 2px 5px;
|
||||||
|
height: 30px;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
img {
|
||||||
|
height: 30px;
|
||||||
|
width: 30px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.details {
|
||||||
|
position: relative;
|
||||||
|
padding-bottom: 10px;
|
||||||
|
.common-title {
|
||||||
|
margin: 8px;
|
||||||
|
}
|
||||||
|
&-info {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
margin: 10px 0;
|
||||||
|
p {
|
||||||
|
line-height: 20px;
|
||||||
|
padding: 5px 15px 5px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
width: 100%;
|
||||||
|
position: relative;
|
||||||
|
span {
|
||||||
|
color: @lightColor;
|
||||||
|
display: inline-block;
|
||||||
|
&:first-child {
|
||||||
|
color: @darkColor;
|
||||||
|
flex-basis: 80px;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&:nth-child(n + 2):not(:nth-child(n + 6)) {
|
||||||
|
width: 50%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&-process {
|
||||||
|
margin-left: 20px;
|
||||||
|
height: 185px;
|
||||||
|
width: 410px;
|
||||||
|
}
|
||||||
|
&-imgs {
|
||||||
|
:deep(.swiper) {
|
||||||
|
position: relative;
|
||||||
|
&-wrapper {
|
||||||
|
width: 390px;
|
||||||
|
height: 220px;
|
||||||
|
.swiper-slide {
|
||||||
|
width: 100%;
|
||||||
|
img {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&-pagination {
|
||||||
|
span {
|
||||||
|
background-color: white;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&-remark {
|
||||||
|
color: @lightColor;
|
||||||
|
padding: 0px 10px 10px 15px;
|
||||||
|
text-indent: 2em;
|
||||||
|
line-height: 22px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -0,0 +1,650 @@
|
||||||
|
<template>
|
||||||
|
<div class="main">
|
||||||
|
<teleport to="#app">
|
||||||
|
<div
|
||||||
|
id="map"
|
||||||
|
:style="{
|
||||||
|
width: store.state.pagePosition.scale * 1920 + 'px',
|
||||||
|
height: store.state.pagePosition.scale * 1080 + 'px',
|
||||||
|
marginLeft: store.state.pagePosition.left,
|
||||||
|
marginTop: store.state.pagePosition.top,
|
||||||
|
}"
|
||||||
|
></div>
|
||||||
|
</teleport>
|
||||||
|
<transition
|
||||||
|
:appear="true"
|
||||||
|
enter-active-class="animate__animated animate__fadeInLeft"
|
||||||
|
>
|
||||||
|
<div class="main-l">
|
||||||
|
<CommonBox
|
||||||
|
title="服务点带动消费金额统计"
|
||||||
|
height="280px"
|
||||||
|
width="440px"
|
||||||
|
>
|
||||||
|
<div class="chart" ref="ddxfRef" />
|
||||||
|
</CommonBox>
|
||||||
|
<CommonBox title="消费订单" height="280px" width="440px">
|
||||||
|
<CommonList :listData="xfdd.list" />
|
||||||
|
</CommonBox>
|
||||||
|
</div>
|
||||||
|
</transition>
|
||||||
|
<transition
|
||||||
|
:appear="true"
|
||||||
|
enter-active-class="animate__animated animate__fadeInRight"
|
||||||
|
>
|
||||||
|
<div class="main-r">
|
||||||
|
<CommonBox
|
||||||
|
title="服务点服务频次统计"
|
||||||
|
height="280px"
|
||||||
|
width="440px"
|
||||||
|
>
|
||||||
|
<div class="chart" ref="fwpcRef" />
|
||||||
|
</CommonBox>
|
||||||
|
<CommonBox title="服务点类型占比" height="280px" width="440px">
|
||||||
|
<div class="chart" ref="lxzbRef" />
|
||||||
|
</CommonBox>
|
||||||
|
</div>
|
||||||
|
</transition>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import * as echarts from 'echarts'
|
||||||
|
import { useStore } from 'vuex'
|
||||||
|
import { onMounted, onBeforeMount } from '@vue/runtime-core'
|
||||||
|
import { reactive, ref, toRefs } from '@vue/reactivity'
|
||||||
|
import { hook } from '@/hook/hook'
|
||||||
|
const { delay, chartDate } = hook()
|
||||||
|
const store = useStore()
|
||||||
|
// import {
|
||||||
|
// Engine,
|
||||||
|
// GeoJSONDataSource,
|
||||||
|
// EmptySky,
|
||||||
|
// Polygon,
|
||||||
|
// ExtendMeshStandardMaterial,
|
||||||
|
// } from 'mapv-three'
|
||||||
|
// import { BoxGeometry, MeshStandardMaterial, Mesh } from 'three'
|
||||||
|
|
||||||
|
const ddxfRef = ref(null)
|
||||||
|
const fwpcRef = ref(null)
|
||||||
|
const lxzbRef = ref(null)
|
||||||
|
var mapPoints = reactive([
|
||||||
|
{
|
||||||
|
title: '文海培训学校',
|
||||||
|
integral: '120',
|
||||||
|
rating: '4',
|
||||||
|
pointType: '培训学校',
|
||||||
|
location: '象山县樟树下村34号',
|
||||||
|
phone: '65745598',
|
||||||
|
x: 29.472591,
|
||||||
|
y: 121.879829,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '雅意乐器行',
|
||||||
|
integral: '96',
|
||||||
|
rating: '3.5',
|
||||||
|
pointType: '艺术机构',
|
||||||
|
location: '象山县象山港路150号',
|
||||||
|
phone: '13596624584',
|
||||||
|
x: 29.462307,
|
||||||
|
y: 121.886711,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '象山影视城',
|
||||||
|
integral: '156',
|
||||||
|
rating: '4.5',
|
||||||
|
pointType: '景区',
|
||||||
|
location: '象山县新桥镇黄公岙村',
|
||||||
|
phone: '65221458',
|
||||||
|
x: 29.467602,
|
||||||
|
y: 121.870499,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '龙宫海鲜餐厅',
|
||||||
|
integral: '111',
|
||||||
|
rating: '4',
|
||||||
|
pointType: '美食',
|
||||||
|
location: '象山县丹南路涌金广场2号楼5楼',
|
||||||
|
phone: '65671616',
|
||||||
|
x: 29.461435,
|
||||||
|
y: 121.884125,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '南北面馆',
|
||||||
|
integral: '75',
|
||||||
|
rating: '3.5',
|
||||||
|
pointType: '美食',
|
||||||
|
location: '象山县白鹤路白石商业广场',
|
||||||
|
phone: '13566027505',
|
||||||
|
x: 29.473518,
|
||||||
|
y: 121.894125,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '强盛饭堂',
|
||||||
|
integral: '96',
|
||||||
|
rating: '4',
|
||||||
|
pointType: '美食',
|
||||||
|
location: '象山县丹青路象山科技创业园',
|
||||||
|
phone: '15744485962',
|
||||||
|
x: 29.478518,
|
||||||
|
y: 121.924125,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '现代网苑',
|
||||||
|
integral: '145',
|
||||||
|
rating: '4',
|
||||||
|
pointType: '娱乐',
|
||||||
|
location: ' 象山县天安路145号',
|
||||||
|
phone: '13606786811',
|
||||||
|
x: 29.496518,
|
||||||
|
y: 121.904125,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '台球会所',
|
||||||
|
integral: '106',
|
||||||
|
rating: '4',
|
||||||
|
pointType: '娱乐',
|
||||||
|
location: ' 象山县天安路135弄3945',
|
||||||
|
phone: '13705748147',
|
||||||
|
x: 29.460518,
|
||||||
|
y: 121.854125,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '好学教育',
|
||||||
|
integral: '135',
|
||||||
|
rating: '4.5',
|
||||||
|
pointType: '培训学校',
|
||||||
|
location: '象山县天安路157号3楼',
|
||||||
|
phone: '13386616597',
|
||||||
|
x: 29.479518,
|
||||||
|
y: 121.824125,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '艺卓舞蹈培训中心',
|
||||||
|
integral: '126',
|
||||||
|
rating: '4',
|
||||||
|
pointType: '培训学校',
|
||||||
|
location: '艺卓舞蹈培训中心',
|
||||||
|
phone: '15158340345',
|
||||||
|
x: 29.476518,
|
||||||
|
y: 121.844125,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '艺术酒庄',
|
||||||
|
integral: '121',
|
||||||
|
rating: '3.5',
|
||||||
|
pointType: '艺术机构',
|
||||||
|
location: '象山县象山河路世纪花园南侧约30米',
|
||||||
|
phone: '65236698',
|
||||||
|
x: 29.486518,
|
||||||
|
y: 121.864125,
|
||||||
|
},
|
||||||
|
])
|
||||||
|
|
||||||
|
const commonBoxData = reactive({
|
||||||
|
ddxf: {
|
||||||
|
chart: [
|
||||||
|
{
|
||||||
|
name: '第一季度',
|
||||||
|
value: 47,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '第二季度',
|
||||||
|
value: 52,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '第三季度',
|
||||||
|
value: 39,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '第四季度',
|
||||||
|
value: 43,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
xfdd: {
|
||||||
|
list: {
|
||||||
|
type: 'swiper',
|
||||||
|
height: '190px',
|
||||||
|
header: [
|
||||||
|
{ headerName: '店名', key: 'storeName' },
|
||||||
|
{ headerName: '金额', key: 'price' },
|
||||||
|
{ headerName: '时间', key: 'time' },
|
||||||
|
],
|
||||||
|
data: [
|
||||||
|
{
|
||||||
|
storeName: '文海培训学校',
|
||||||
|
price: '60元',
|
||||||
|
time: '2022-08-28',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
storeName: '雅意乐器行',
|
||||||
|
price: '60元',
|
||||||
|
time: '2022-08-25',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
storeName: '象山影视城',
|
||||||
|
price: '60元',
|
||||||
|
time: '2022-08-21',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
storeName: '馒头山',
|
||||||
|
price: '60元',
|
||||||
|
time: '2022-08-20',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
storeName: '龙宫海鲜餐厅',
|
||||||
|
price: '60元',
|
||||||
|
time: '2022-08-17',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
storeName: '南北面馆',
|
||||||
|
price: '60元',
|
||||||
|
time: '2022-08-13',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
storeName: '卓舞蹈培训中心',
|
||||||
|
price: '60元',
|
||||||
|
time: '2022-08-09',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
fwpc: {
|
||||||
|
chart: [
|
||||||
|
{ name: '1月', value: 1540 },
|
||||||
|
{ name: '2月', value: 1370 },
|
||||||
|
{ name: '3月', value: 1310 },
|
||||||
|
{ name: '4月', value: 1050 },
|
||||||
|
{ name: '5月', value: 1650 },
|
||||||
|
{ name: '6月', value: 1420 },
|
||||||
|
{ name: '7月', value: 1711 },
|
||||||
|
{ name: '8月', value: 1554 },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
lxzb: {
|
||||||
|
chart: [
|
||||||
|
{ name: '美食', value: 100 },
|
||||||
|
{ name: '艺术机构', value: 200 },
|
||||||
|
{ name: '培训学校', value: 150 },
|
||||||
|
{ name: '景区', value: 80 },
|
||||||
|
{ name: '娱乐场所', value: 67 },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
})
|
||||||
|
const { xfdd } = toRefs(commonBoxData)
|
||||||
|
// 函数 创建多个标注
|
||||||
|
var map
|
||||||
|
var opts = {
|
||||||
|
title: '',
|
||||||
|
}
|
||||||
|
const loadMap = (d) => {
|
||||||
|
for (const v of d) {
|
||||||
|
let points = new window.BMapGL.Point(v.y, v.x)
|
||||||
|
opts.title = v.title
|
||||||
|
let html = `
|
||||||
|
<p>服务商积分: ${v.integral}分</p>
|
||||||
|
<p>星级: ${v.rating}星</p>
|
||||||
|
<p>类型: ${v.pointType}</p>
|
||||||
|
<p>地址: ${v.location}</p>
|
||||||
|
<p>电话: ${v.phone}</p>
|
||||||
|
`
|
||||||
|
let markers = new window.BMapGL.Marker(points)
|
||||||
|
map.addOverlay(markers)
|
||||||
|
let infoWindow = new window.BMapGL.InfoWindow(html, opts)
|
||||||
|
markers.addEventListener('click', function () {
|
||||||
|
map.openInfoWindow(infoWindow, points)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const eDdxf = () => {
|
||||||
|
let data = commonBoxData.ddxf.chart
|
||||||
|
let xLabel = []
|
||||||
|
let valueData = []
|
||||||
|
for (let i of data) {
|
||||||
|
xLabel.push(i.name)
|
||||||
|
valueData.push(i.value)
|
||||||
|
}
|
||||||
|
let option = {
|
||||||
|
tooltip: {
|
||||||
|
trigger: 'axis',
|
||||||
|
backgroundColor: 'rgba(21, 44, 59,.9)',
|
||||||
|
borderColor: 'rgba(21, 44, 59,1)',
|
||||||
|
label: {
|
||||||
|
show: true,
|
||||||
|
},
|
||||||
|
textStyle: {
|
||||||
|
color: '#cff',
|
||||||
|
fontSize: 14,
|
||||||
|
},
|
||||||
|
padding: [12, 10],
|
||||||
|
extraCssText: 'z-index:10',
|
||||||
|
formatter: '{b0}: {c0}万元',
|
||||||
|
},
|
||||||
|
grid: {
|
||||||
|
top: '18%',
|
||||||
|
bottom: '5%',
|
||||||
|
left: '3%',
|
||||||
|
right: '4%',
|
||||||
|
containLabel: true,
|
||||||
|
},
|
||||||
|
toolbox: {
|
||||||
|
show: false,
|
||||||
|
},
|
||||||
|
xAxis: {
|
||||||
|
type: 'category',
|
||||||
|
data: xLabel,
|
||||||
|
axisLine: {
|
||||||
|
lineStyle: {
|
||||||
|
color: 'rgba(193, 207, 220, 1)',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
axisLabel: {
|
||||||
|
color: '#afc3de',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
yAxis: [
|
||||||
|
{
|
||||||
|
type: 'value',
|
||||||
|
name: '万元',
|
||||||
|
nameTextStyle: {
|
||||||
|
color: '#afc3de',
|
||||||
|
fontSize: 12,
|
||||||
|
},
|
||||||
|
axisLabel: {
|
||||||
|
color: '#afc3de',
|
||||||
|
},
|
||||||
|
axisLine: {
|
||||||
|
show: false,
|
||||||
|
lineStyle: {
|
||||||
|
color: '#cdd5e2',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
splitLine: {
|
||||||
|
show: true,
|
||||||
|
lineStyle: {
|
||||||
|
color: '#afc3de',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'line',
|
||||||
|
data: valueData,
|
||||||
|
symbolSize: 10,
|
||||||
|
symbol: 'circle',
|
||||||
|
showSymbol: false,
|
||||||
|
smooth: false,
|
||||||
|
lineStyle: {
|
||||||
|
width: 2,
|
||||||
|
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
||||||
|
{
|
||||||
|
offset: 0,
|
||||||
|
color: 'RGBA(96, 122, 209, 1)',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
offset: 1,
|
||||||
|
color: 'RGBA(96, 122, 209, 1)',
|
||||||
|
},
|
||||||
|
]),
|
||||||
|
shadowColor: 'RGBA(96, 122, 209, 0.4)',
|
||||||
|
shadowBlur: 10,
|
||||||
|
shadowOffsetY: 10,
|
||||||
|
},
|
||||||
|
itemStyle: {
|
||||||
|
color: 'rgba(167, 181, 230, 1)',
|
||||||
|
borderColor: '#afc3de',
|
||||||
|
borderWidth: 3,
|
||||||
|
shadowColor: 'rgba(167, 181, 230, 0.7)',
|
||||||
|
shadowBlur: 5,
|
||||||
|
},
|
||||||
|
areaStyle: {
|
||||||
|
color: new echarts.graphic.LinearGradient(
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
[
|
||||||
|
{
|
||||||
|
offset: 0,
|
||||||
|
color: 'RGBA(184, 204, 241, 1)',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
offset: 0.5,
|
||||||
|
color: 'RGBA(184, 204, 241, 0.5)',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
offset: 0.7,
|
||||||
|
color: 'RGBA(184, 204, 241, 0)',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
false
|
||||||
|
),
|
||||||
|
shadowBlur: 0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
let myChart = echarts.init(ddxfRef.value)
|
||||||
|
myChart.clear()
|
||||||
|
myChart.setOption(option)
|
||||||
|
}
|
||||||
|
const eFwpc = () => {
|
||||||
|
let data = commonBoxData.fwpc.chart
|
||||||
|
let data1 = chartDate(8, 1)
|
||||||
|
let data2 = []
|
||||||
|
for (let i of data) {
|
||||||
|
data2.push(i.value)
|
||||||
|
}
|
||||||
|
let option = {
|
||||||
|
grid: {
|
||||||
|
top: '20%',
|
||||||
|
bottom: '6%',
|
||||||
|
left: '3%',
|
||||||
|
right: '6%',
|
||||||
|
containLabel: true,
|
||||||
|
},
|
||||||
|
tooltip: {
|
||||||
|
trigger: 'axis',
|
||||||
|
backgroundColor: 'rgba(21, 44, 59,.9)',
|
||||||
|
borderColor: 'rgba(21, 44, 59,1)',
|
||||||
|
label: {
|
||||||
|
show: true,
|
||||||
|
},
|
||||||
|
textStyle: {
|
||||||
|
color: '#cff',
|
||||||
|
fontSize: 14,
|
||||||
|
},
|
||||||
|
padding: [12, 10],
|
||||||
|
extraCssText: 'z-index:10',
|
||||||
|
formatter: '{b0}: {c0}次',
|
||||||
|
},
|
||||||
|
xAxis: {
|
||||||
|
type: 'category',
|
||||||
|
axisLine: {
|
||||||
|
show: true,
|
||||||
|
lineStyle: {
|
||||||
|
color: 'rgba(52, 51, 51, 1)',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
splitLine: {
|
||||||
|
show: false,
|
||||||
|
},
|
||||||
|
axisLabel: {
|
||||||
|
fontSize: 12,
|
||||||
|
color: '#afc3de',
|
||||||
|
},
|
||||||
|
axisTick: {
|
||||||
|
show: false,
|
||||||
|
alignWithLabel: true,
|
||||||
|
},
|
||||||
|
boundaryGap: false,
|
||||||
|
data: data1,
|
||||||
|
},
|
||||||
|
yAxis: {
|
||||||
|
type: 'value',
|
||||||
|
name: '次',
|
||||||
|
nameTextStyle: {
|
||||||
|
fontFamily: 'MicrosoftYaHei',
|
||||||
|
fontSize: 12,
|
||||||
|
color: '#afc3de',
|
||||||
|
},
|
||||||
|
min: 0,
|
||||||
|
axisLine: {
|
||||||
|
show: false,
|
||||||
|
},
|
||||||
|
splitLine: {
|
||||||
|
show: true,
|
||||||
|
lineStyle: {
|
||||||
|
color: 'rgba(52, 51, 51, 0.8)',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
axisLabel: {
|
||||||
|
show: true,
|
||||||
|
margin: 20,
|
||||||
|
fontFamily: 'MicrosoftYaHei',
|
||||||
|
fontSize: 12,
|
||||||
|
color: '#afc3de',
|
||||||
|
},
|
||||||
|
axisTick: {
|
||||||
|
show: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
name: '积分数',
|
||||||
|
type: 'line',
|
||||||
|
showAllSymbol: true,
|
||||||
|
symbol: 'circle',
|
||||||
|
symbolSize: 5,
|
||||||
|
lineStyle: {
|
||||||
|
color: 'rgba(155, 155, 226, 1)',
|
||||||
|
},
|
||||||
|
label: {
|
||||||
|
show: false,
|
||||||
|
},
|
||||||
|
itemStyle: {
|
||||||
|
color: 'rgba(155, 155, 226, 0.8)',
|
||||||
|
borderColor: 'rgba(155, 155, 226, 0.8)',
|
||||||
|
borderWidth: 3,
|
||||||
|
},
|
||||||
|
areaStyle: {
|
||||||
|
color: new echarts.graphic.LinearGradient(
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
[
|
||||||
|
{
|
||||||
|
offset: 0,
|
||||||
|
color: 'rgba(155, 155, 226, 0.8)',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
offset: 1,
|
||||||
|
color: 'rgba(155, 155, 226, 0)',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
false
|
||||||
|
),
|
||||||
|
shadowColor: 'rgba(155, 155, 226, 0.8)',
|
||||||
|
shadowBlur: 20,
|
||||||
|
},
|
||||||
|
data: data2,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
let myChart = echarts.init(fwpcRef.value)
|
||||||
|
myChart.clear()
|
||||||
|
myChart.setOption(option)
|
||||||
|
}
|
||||||
|
const eLxzb = () => {
|
||||||
|
let data = commonBoxData.lxzb.chart
|
||||||
|
let fucolor = ['#6e82b1', '#c465e0', '#ab98e8', '#47d3fa', '#cff0ff']
|
||||||
|
let option = {
|
||||||
|
tooltip: {
|
||||||
|
trigger: 'item',
|
||||||
|
backgroundColor: 'rgba(21, 44, 59,.9)',
|
||||||
|
borderColor: 'rgba(21, 44, 59,1)',
|
||||||
|
label: {
|
||||||
|
show: true,
|
||||||
|
},
|
||||||
|
textStyle: {
|
||||||
|
color: '#cff',
|
||||||
|
fontSize: 14,
|
||||||
|
},
|
||||||
|
padding: [12, 10],
|
||||||
|
extraCssText: 'z-index:10',
|
||||||
|
formatter: '{b} : {c}家 ({d}%)',
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
orient: 'vertical',
|
||||||
|
top: 'center',
|
||||||
|
right: '5%',
|
||||||
|
itemGap: 15,
|
||||||
|
itemWidth: 16,
|
||||||
|
itemHeight: 16,
|
||||||
|
textStyle: {
|
||||||
|
color: '#697780',
|
||||||
|
fontSize: 14,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'pie',
|
||||||
|
radius: '81%',
|
||||||
|
center: ['36%', '50%'],
|
||||||
|
data: data,
|
||||||
|
label: {
|
||||||
|
show: false,
|
||||||
|
},
|
||||||
|
color: fucolor,
|
||||||
|
emphasis: {
|
||||||
|
shadowBlur: 10,
|
||||||
|
shadowOffsetX: 0,
|
||||||
|
shadowColor: 'rgba(0, 0, 0, 0.5)',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
let myChart = echarts.init(lxzbRef.value)
|
||||||
|
myChart.clear()
|
||||||
|
myChart.setOption(option)
|
||||||
|
}
|
||||||
|
onMounted(() => {
|
||||||
|
eDdxf()
|
||||||
|
eFwpc()
|
||||||
|
eLxzb()
|
||||||
|
map = new window.BMapGL.Map('map')
|
||||||
|
map.setMapStyleV2({
|
||||||
|
styleId: '4a6029df2a52cd8be9496f0f2f47a1d4',
|
||||||
|
})
|
||||||
|
var point = new window.BMapGL.Point(121.879829, 29.472591)
|
||||||
|
map.centerAndZoom(point, 15)
|
||||||
|
map.setHeading(34.5)
|
||||||
|
map.setTilt(43)
|
||||||
|
map.enableScrollWheelZoom()
|
||||||
|
loadMap(mapPoints)
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
<style lang="less" scoped>
|
||||||
|
.main {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
z-index: 1000;
|
||||||
|
&-l,
|
||||||
|
&-r {
|
||||||
|
pointer-events: none;
|
||||||
|
> .commonBox {
|
||||||
|
pointer-events: all;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.main-r {
|
||||||
|
align-items: flex-end;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -0,0 +1,72 @@
|
||||||
|
<template>
|
||||||
|
<div class="main">
|
||||||
|
<div id="map"></div>
|
||||||
|
<transition
|
||||||
|
:appear="true"
|
||||||
|
enter-active-class="animate__animated animate__fadeInLeft"
|
||||||
|
>
|
||||||
|
<div class="main-l">
|
||||||
|
<CommonBox title="标题1" height="280px"></CommonBox>
|
||||||
|
<CommonBox title="标题2" height="280px"></CommonBox>
|
||||||
|
</div>
|
||||||
|
</transition>
|
||||||
|
<transition
|
||||||
|
:appear="true"
|
||||||
|
enter-active-class="animate__animated animate__fadeInRight"
|
||||||
|
>
|
||||||
|
<div class="main-r">
|
||||||
|
<CommonBox title="标题3" height="280px"></CommonBox>
|
||||||
|
<CommonBox title="标题4" height="280px"></CommonBox>
|
||||||
|
</div>
|
||||||
|
</transition>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { onMounted } from '@vue/runtime-core'
|
||||||
|
import mapJson from '@/assets/map/330225.json'
|
||||||
|
var map = null
|
||||||
|
var T = null
|
||||||
|
var polygon = null
|
||||||
|
const loadpolygon = (d, n) => {
|
||||||
|
let points = []
|
||||||
|
for (let v of d) points.push(new T.LngLat(v[0], v[1]))
|
||||||
|
polygon = new T.Polygon(points, {
|
||||||
|
name: n,
|
||||||
|
color: '#2D94E4',
|
||||||
|
weight: 1,
|
||||||
|
opacity: 0.6,
|
||||||
|
fillColor: '#ffffff',
|
||||||
|
fillOpacity: 0.3,
|
||||||
|
})
|
||||||
|
map.addOverLay(polygon)
|
||||||
|
}
|
||||||
|
const loadMapJson = () => {
|
||||||
|
let d = mapJson.features
|
||||||
|
for (let v of d) {
|
||||||
|
let pn = v.properties.name
|
||||||
|
let pd = v.geometry.coordinates
|
||||||
|
if (pd.length == 1) {
|
||||||
|
loadpolygon(pd[0], pn)
|
||||||
|
} else if (pd.length) {
|
||||||
|
for (let u of pd) loadpolygon(u[0], pn)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const showMap = () => {
|
||||||
|
T = window.T
|
||||||
|
map = new T.Map('map')
|
||||||
|
map.setMapType(window.TMAP_SATELLITE_MAP)
|
||||||
|
map.centerAndZoom(new T.LngLat(121.88, 29.38), 11)
|
||||||
|
}
|
||||||
|
onMounted(() => {
|
||||||
|
showMap()
|
||||||
|
loadMapJson()
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
<style lang="less" scoped>
|
||||||
|
#map {
|
||||||
|
width: 1920px;
|
||||||
|
height: 1080px;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -0,0 +1,958 @@
|
||||||
|
<template>
|
||||||
|
<div class="main">
|
||||||
|
<transition :appear="true" enter-active-class="animate__animated animate__fadeInLeft">
|
||||||
|
<div class="main-l">
|
||||||
|
<CommonBox class="rytj" title="人员统计" flex="7">
|
||||||
|
<CommonList :listData="rytj.list" />
|
||||||
|
</CommonBox>
|
||||||
|
<CommonBox class="wyzt" title="文艺展厅" flex="6">
|
||||||
|
<div class="chart" ref="wyztRef" />
|
||||||
|
</CommonBox>
|
||||||
|
<CommonBox class="wydt" title="文艺动态" flex="8">
|
||||||
|
<CommonList :listData="wydt.list" />
|
||||||
|
</CommonBox>
|
||||||
|
</div>
|
||||||
|
</transition>
|
||||||
|
<transition :appear="true" enter-active-class="animate__animated animate__fadeIn">
|
||||||
|
<div class="main-c">
|
||||||
|
<CommonBox class="wyzp" title="文艺作品" flex="4" bg="cbg">
|
||||||
|
<img class="ball" :src="wyzp.ball" />
|
||||||
|
<span class="ball-title">2023年</span>
|
||||||
|
<div class="ball-list">
|
||||||
|
<div v-for="(item, index) in wyzp.data" :key="index" :class="[
|
||||||
|
'ball-wrap',
|
||||||
|
index % 2 ? 'rightItem' : 'leftItem',
|
||||||
|
]">
|
||||||
|
<div class="ball-item">
|
||||||
|
<span class="ball-item-name">{{
|
||||||
|
item.name
|
||||||
|
}}</span>
|
||||||
|
<span class="ball-item-value">{{
|
||||||
|
item.value
|
||||||
|
}}</span>
|
||||||
|
<img class="ball-item-icon" :src="item.icon" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</CommonBox>
|
||||||
|
<CommonBox class="dddt" title="点单大厅" flex="3">
|
||||||
|
<CommonList :listData="dddt.list" />
|
||||||
|
<div class="chart" ref="dddtRef" />
|
||||||
|
</CommonBox>
|
||||||
|
</div>
|
||||||
|
</transition>
|
||||||
|
<transition :appear="true" enter-active-class="animate__animated animate__fadeInRight">
|
||||||
|
<div class="main-r">
|
||||||
|
<CommonBox class="wyhd" title="文艺活动" flex="1" bg="bg4">
|
||||||
|
<CommonList :listData="wyhd.list" />
|
||||||
|
<div class="chart" ref="wyhdRef" />
|
||||||
|
</CommonBox>
|
||||||
|
<CommonBox title="热力值" flex="1" :boxData="rlz" @menuActive="changeMenu">
|
||||||
|
<div v-if="rlz.itemName === 'TOP5'" class="commonBox-item">
|
||||||
|
<div class="chart" ref="TOP5Ref" />
|
||||||
|
</div>
|
||||||
|
<div v-if="rlz.itemName === 'rmbq'" class="commonBox-item">
|
||||||
|
<div class="chart" ref="rmbqRef" />
|
||||||
|
</div>
|
||||||
|
</CommonBox>
|
||||||
|
<CommonBox class="wyyz" title="文艺援助" flex="1">
|
||||||
|
<div class="commonBox-item flex-1 flex-c">
|
||||||
|
<div class="wyyz-info flex-4 flex-r">
|
||||||
|
<div class="flex-1 flex-c">
|
||||||
|
<CommonList :listData="wyyz.list1" />
|
||||||
|
</div>
|
||||||
|
<div class="flex-2">
|
||||||
|
<div class="chart" ref="wyyzRef"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="wyyz-details flex-3">
|
||||||
|
<CommonList :listData="wyyz.list2" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</CommonBox>
|
||||||
|
</div>
|
||||||
|
</transition>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { reactive, ref, toRefs } from '@vue/reactivity'
|
||||||
|
import { nextTick, onMounted } from '@vue/runtime-core'
|
||||||
|
import { useStore } from 'vuex'
|
||||||
|
import * as echarts from 'echarts'
|
||||||
|
import 'echarts-liquidfill'
|
||||||
|
import 'echarts-wordcloud'
|
||||||
|
|
||||||
|
import { hook } from '@/hook/hook'
|
||||||
|
|
||||||
|
const { delay, boxMenu, propFuns, chartDate } = hook()
|
||||||
|
|
||||||
|
const wyztRef = ref(null)
|
||||||
|
const TOP5Ref = ref(null)
|
||||||
|
const rmbqRef = ref(null)
|
||||||
|
const wyhdRef = ref(null)
|
||||||
|
const dddtRef = ref(null)
|
||||||
|
const wyyzRef = ref(null)
|
||||||
|
const store = useStore()
|
||||||
|
const commonBoxData = reactive({
|
||||||
|
rytj: {
|
||||||
|
list: {
|
||||||
|
type: 'icon',
|
||||||
|
data: store.state.rytj,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
wyzt: {
|
||||||
|
chart: store.state.wyzt,
|
||||||
|
},
|
||||||
|
wydt: {
|
||||||
|
list: {
|
||||||
|
type: 'scroll',
|
||||||
|
flex: [4, 1],
|
||||||
|
height: '260px',
|
||||||
|
header: [
|
||||||
|
{ headerName: '标题', key: 'title' },
|
||||||
|
{ headerName: '时间', key: 'time' },
|
||||||
|
],
|
||||||
|
data: store.state.wydt,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
wyzp: {
|
||||||
|
ball: require('@/assets/img/ball.png'),
|
||||||
|
data: store.state.wyzp.stat,
|
||||||
|
},
|
||||||
|
wyhd: {
|
||||||
|
list: {
|
||||||
|
type: 'icon',
|
||||||
|
data: store.state.wyhd.list,
|
||||||
|
},
|
||||||
|
chart: store.state.wyhd.monChart,
|
||||||
|
},
|
||||||
|
wyyz: {
|
||||||
|
list1: {
|
||||||
|
type: 'icon',
|
||||||
|
data: [
|
||||||
|
{
|
||||||
|
name: '月援助人数',
|
||||||
|
value: '149',
|
||||||
|
unit: '人',
|
||||||
|
icon: require('@/assets/img/icon/icon1.webp'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '总援助人数',
|
||||||
|
value: '6742',
|
||||||
|
unit: '人',
|
||||||
|
icon: require('@/assets/img/icon/icon1.webp'),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
list2: {
|
||||||
|
type: 'swiper',
|
||||||
|
swiperView: '2',
|
||||||
|
height: '60px',
|
||||||
|
header: [
|
||||||
|
{ headerName: '申请用户', key: 'type' },
|
||||||
|
{ headerName: '申请用户', key: 'user' },
|
||||||
|
{ headerName: '申请时间', key: 'time' },
|
||||||
|
{ headerName: '进度', key: 'progressbar' },
|
||||||
|
],
|
||||||
|
data: store.state.wyyz,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
rlz: {
|
||||||
|
name: 'rlz',
|
||||||
|
itemName: 'TOP5',
|
||||||
|
menu: [
|
||||||
|
{ name: 'TOP5', value: 'TOP5' },
|
||||||
|
{ name: '热门标签', value: 'rmbq' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
dddt: {
|
||||||
|
list: {
|
||||||
|
type: 'icon',
|
||||||
|
data: [
|
||||||
|
{
|
||||||
|
name: '需求数',
|
||||||
|
value: '2146',
|
||||||
|
unit: '个',
|
||||||
|
icon: require('@/assets/img/icon/icon1.webp'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '实施率',
|
||||||
|
value: '87',
|
||||||
|
unit: '%',
|
||||||
|
icon: require('@/assets/img/icon/icon1.webp'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '总接单人数',
|
||||||
|
value: '8764',
|
||||||
|
unit: '件',
|
||||||
|
icon: require('@/assets/img/icon/icon1.webp'),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
chart: [
|
||||||
|
{
|
||||||
|
value: 501,
|
||||||
|
name: '作品求购',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 410,
|
||||||
|
name: '公益活动',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 501,
|
||||||
|
name: '演出表演',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 410,
|
||||||
|
name: '乡村剧场',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 501,
|
||||||
|
name: '其他',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
})
|
||||||
|
const { rytj, wydt, wyzp, wyyz, rlz, wyhd, dddt } = toRefs(commonBoxData)
|
||||||
|
const eWyzt = () => {
|
||||||
|
const ColorList = ['#E8FF94', '#89FEBA', '#5EDCEB'] // 链群颜色值
|
||||||
|
let arrayTemp = commonBoxData.wyzt.chart
|
||||||
|
let titleData = []
|
||||||
|
let series = []
|
||||||
|
arrayTemp.forEach((item, index) => {
|
||||||
|
const color = ColorList[index]
|
||||||
|
titleData.push({
|
||||||
|
text: item.name,
|
||||||
|
x: `${32 * index + 17}%`,
|
||||||
|
y: ' 80%',
|
||||||
|
textAlign: 'center',
|
||||||
|
textStyle: {
|
||||||
|
fontSize: '15',
|
||||||
|
color: color,
|
||||||
|
textAlign: 'center',
|
||||||
|
},
|
||||||
|
})
|
||||||
|
series.push({
|
||||||
|
type: 'liquidFill',
|
||||||
|
name: item.name,
|
||||||
|
radius: '56%',
|
||||||
|
center: [`${32 * index + 18}%`, '44%'],
|
||||||
|
data: [
|
||||||
|
{
|
||||||
|
value: 1,
|
||||||
|
itemStyle: {
|
||||||
|
color: 'transparent',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
item.value / item.max,
|
||||||
|
],
|
||||||
|
backgroundStyle: {
|
||||||
|
color: 'transparent',
|
||||||
|
},
|
||||||
|
color: [color],
|
||||||
|
itemStyle: {
|
||||||
|
opacity: 0.6,
|
||||||
|
},
|
||||||
|
outline: {
|
||||||
|
borderDistance: 5,
|
||||||
|
itemStyle: {
|
||||||
|
borderWidth: 2,
|
||||||
|
borderColor: color,
|
||||||
|
shadowBlur: 10,
|
||||||
|
shadowColor: '#000',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
label: {
|
||||||
|
position: ['50%', '50%'],
|
||||||
|
formatter: function () {
|
||||||
|
return `${item.value}`
|
||||||
|
},
|
||||||
|
fontSize: 36,
|
||||||
|
fontFamily: 'dsFont',
|
||||||
|
color: '#fff',
|
||||||
|
},
|
||||||
|
})
|
||||||
|
})
|
||||||
|
let option = {
|
||||||
|
title: titleData,
|
||||||
|
series: series,
|
||||||
|
}
|
||||||
|
let myChart = echarts.init(wyztRef.value)
|
||||||
|
myChart.clear()
|
||||||
|
myChart.setOption(option)
|
||||||
|
}
|
||||||
|
const eTOP5 = () => {
|
||||||
|
let datas = [
|
||||||
|
{
|
||||||
|
name: '抗疫',
|
||||||
|
value: 953,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '亚运',
|
||||||
|
value: 623,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '生活',
|
||||||
|
value: 510,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '美食',
|
||||||
|
value: 423,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '春游',
|
||||||
|
value: '263',
|
||||||
|
},
|
||||||
|
]
|
||||||
|
let data1 = [],
|
||||||
|
data2 = []
|
||||||
|
datas.forEach((value) => {
|
||||||
|
data1.push(value.name)
|
||||||
|
data2.push(value.value)
|
||||||
|
})
|
||||||
|
data1 = data1.reverse()
|
||||||
|
data2 = data2.reverse()
|
||||||
|
let option = {
|
||||||
|
tooltip: {
|
||||||
|
trigger: 'axis',
|
||||||
|
backgroundColor: 'rgba(21, 44, 59,.9)',
|
||||||
|
borderColor: 'rgba(21, 44, 59,1)',
|
||||||
|
label: {
|
||||||
|
show: true,
|
||||||
|
},
|
||||||
|
textStyle: {
|
||||||
|
color: '#ffffff',
|
||||||
|
fontSize: 14,
|
||||||
|
},
|
||||||
|
padding: [12, 10],
|
||||||
|
extraCssText: 'z-index:10',
|
||||||
|
},
|
||||||
|
grid: {
|
||||||
|
top: '4%',
|
||||||
|
bottom: '3%',
|
||||||
|
left: '5%',
|
||||||
|
right: '6%',
|
||||||
|
containLabel: true,
|
||||||
|
},
|
||||||
|
xAxis: {
|
||||||
|
type: 'value',
|
||||||
|
position: 'top',
|
||||||
|
splitLine: { show: false },
|
||||||
|
boundaryGap: [0, 0.01],
|
||||||
|
axisLine: {
|
||||||
|
show: false,
|
||||||
|
lineStyle: {
|
||||||
|
color: '#697780',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
axisLabel: {
|
||||||
|
color: '#697780',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
yAxis: {
|
||||||
|
axisLabel: {
|
||||||
|
rotate: 0,
|
||||||
|
color: '#697780',
|
||||||
|
},
|
||||||
|
axisLine: {
|
||||||
|
show: false,
|
||||||
|
},
|
||||||
|
type: 'category',
|
||||||
|
data: data1,
|
||||||
|
},
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
name: '热力值',
|
||||||
|
barWidth: '60%',
|
||||||
|
itemStyle: {
|
||||||
|
color: '#60C0DD',
|
||||||
|
shadowBlur: 5,
|
||||||
|
shadowColor: 'rgba(0, 0, 0, 0.5)',
|
||||||
|
},
|
||||||
|
type: 'bar',
|
||||||
|
data: data2,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
let myChart = echarts.init(TOP5Ref.value)
|
||||||
|
myChart.clear()
|
||||||
|
myChart.setOption(option)
|
||||||
|
}
|
||||||
|
const eRmbq = () => {
|
||||||
|
let datas = [
|
||||||
|
{ name: '抗疫', value: 953 },
|
||||||
|
{ name: '亚运', value: 623 },
|
||||||
|
{ name: '生活', value: 510 },
|
||||||
|
{ name: '美食', value: 423 },
|
||||||
|
{ name: '春游', value: 263 },
|
||||||
|
{ name: '影视城', value: 214 },
|
||||||
|
{ name: '健身', value: 195 },
|
||||||
|
{ name: '网红', value: 164 },
|
||||||
|
{ name: '摄影', value: 84 },
|
||||||
|
{ name: '舞蹈', value: 41 },
|
||||||
|
]
|
||||||
|
let option = {
|
||||||
|
tooltip: {
|
||||||
|
backgroundColor: 'rgba(21, 44, 59,.9)',
|
||||||
|
borderColor: 'rgba(21, 44, 59,1)',
|
||||||
|
label: {
|
||||||
|
show: true,
|
||||||
|
},
|
||||||
|
textStyle: {
|
||||||
|
color: '#ffffff',
|
||||||
|
fontSize: 14,
|
||||||
|
},
|
||||||
|
padding: [12, 10],
|
||||||
|
extraCssText: 'z-index:10',
|
||||||
|
},
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
type: 'wordCloud',
|
||||||
|
// 网格大小,各项之间间距
|
||||||
|
gridSize: 45,
|
||||||
|
// 形状 circle 圆,cardioid 心, diamond 菱形,
|
||||||
|
// triangle-forward 、triangle 三角,star五角星
|
||||||
|
shape: 'circle',
|
||||||
|
// 字体大小范围
|
||||||
|
sizeRange: [16, 30],
|
||||||
|
// 文字旋转角度范围
|
||||||
|
// rotationRange: [0, 90],
|
||||||
|
rotationRange: [0, 0],
|
||||||
|
// 旋转步值
|
||||||
|
rotationStep: 90,
|
||||||
|
// 自定义图形
|
||||||
|
// maskImage: maskImage,
|
||||||
|
right: '0%',
|
||||||
|
top: '0%',
|
||||||
|
bottom: null,
|
||||||
|
// 画布宽
|
||||||
|
width: '100%',
|
||||||
|
// 画布高
|
||||||
|
height: '100%',
|
||||||
|
// 是否渲染超出画布的文字
|
||||||
|
drawOutOfBound: false,
|
||||||
|
textStyle: {
|
||||||
|
color: function () {
|
||||||
|
return (
|
||||||
|
'rgb(' +
|
||||||
|
[
|
||||||
|
Math.round(Math.random() * 100 + 55),
|
||||||
|
Math.round(Math.random() * 100 + 55),
|
||||||
|
Math.round(Math.random() * 100 + 55),
|
||||||
|
].join(',') +
|
||||||
|
')'
|
||||||
|
)
|
||||||
|
},
|
||||||
|
emphasis: {
|
||||||
|
shadowBlur: 10,
|
||||||
|
shadowColor: '#2ac',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
data: datas,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
let myChart = echarts.init(rmbqRef.value)
|
||||||
|
myChart.clear()
|
||||||
|
myChart.setOption(option)
|
||||||
|
}
|
||||||
|
const eWyhd = () => {
|
||||||
|
let data1 = chartDate(8, 1)
|
||||||
|
console.log('data1:', data1)
|
||||||
|
let data2 = []
|
||||||
|
for (let v of commonBoxData.wyhd.chart) {
|
||||||
|
data2.push(v.value)
|
||||||
|
}
|
||||||
|
let option = {
|
||||||
|
grid: {
|
||||||
|
top: '20%',
|
||||||
|
bottom: '16%',
|
||||||
|
left: '8%',
|
||||||
|
right: '2%',
|
||||||
|
},
|
||||||
|
tooltip: {
|
||||||
|
trigger: 'axis',
|
||||||
|
backgroundColor: 'rgba(21, 44, 59,.9)',
|
||||||
|
borderColor: 'rgba(21, 44, 59,1)',
|
||||||
|
label: {
|
||||||
|
show: true,
|
||||||
|
},
|
||||||
|
textStyle: {
|
||||||
|
color: '#ffffff',
|
||||||
|
fontSize: 14,
|
||||||
|
},
|
||||||
|
padding: [12, 10],
|
||||||
|
extraCssText: 'z-index:10',
|
||||||
|
formatter: '{a0}<br>{b0}: {c0}次',
|
||||||
|
},
|
||||||
|
xAxis: {
|
||||||
|
boundaryGap: true, //默认,坐标轴留白策略
|
||||||
|
axisLine: {
|
||||||
|
show: false,
|
||||||
|
},
|
||||||
|
splitLine: {
|
||||||
|
show: false,
|
||||||
|
},
|
||||||
|
axisLabel: {
|
||||||
|
interval: 0,
|
||||||
|
color: '#697780',
|
||||||
|
},
|
||||||
|
axisTick: {
|
||||||
|
show: false,
|
||||||
|
alignWithLabel: true,
|
||||||
|
},
|
||||||
|
data: data1,
|
||||||
|
},
|
||||||
|
yAxis: {
|
||||||
|
type: 'value',
|
||||||
|
name: '次数',
|
||||||
|
position: 'left',
|
||||||
|
show: true,
|
||||||
|
nameTextStyle: {
|
||||||
|
color: '#697780',
|
||||||
|
fontSize: '90%',
|
||||||
|
padding: [0, 0, 0, -45],
|
||||||
|
},
|
||||||
|
axisLine: {
|
||||||
|
show: false,
|
||||||
|
lineStyle: {
|
||||||
|
color: '#697780',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
axisLabel: {
|
||||||
|
interval: 0,
|
||||||
|
color: '#697780',
|
||||||
|
},
|
||||||
|
splitLine: {
|
||||||
|
show: true,
|
||||||
|
lineStyle: {
|
||||||
|
type: 'dashed',
|
||||||
|
color: 'rgba(33,148,246,0.2)',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
axisTick: {
|
||||||
|
show: false,
|
||||||
|
},
|
||||||
|
splitArea: {
|
||||||
|
show: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
name: '举办次数',
|
||||||
|
type: 'line',
|
||||||
|
symbol: 'circle',
|
||||||
|
symbolSize: 7,
|
||||||
|
lineStyle: {
|
||||||
|
color: '#556bb9',
|
||||||
|
shadowBlur: 12,
|
||||||
|
shadowColor: 'rgb(33,148,246,0.9)',
|
||||||
|
shadowOffsetX: 1,
|
||||||
|
shadowOffsetY: 1,
|
||||||
|
},
|
||||||
|
itemStyle: {
|
||||||
|
color: '#556bb9',
|
||||||
|
borderWidth: 1,
|
||||||
|
borderColor: '#FFF',
|
||||||
|
},
|
||||||
|
label: {
|
||||||
|
show: false,
|
||||||
|
},
|
||||||
|
data: data2,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
let myChart = echarts.init(wyhdRef.value)
|
||||||
|
myChart.clear()
|
||||||
|
myChart.setOption(option)
|
||||||
|
}
|
||||||
|
const eDddt = () => {
|
||||||
|
let data = commonBoxData.dddt.chart
|
||||||
|
let color = ['#9dabb4', '#54def5', '#47d3fa', '#79d9f1', '#00acee']
|
||||||
|
let baseData = []
|
||||||
|
for (let i = 0; i < data.length; i++) {
|
||||||
|
baseData.push({
|
||||||
|
value: data[i].value,
|
||||||
|
name: data[i].name,
|
||||||
|
itemStyle: {
|
||||||
|
borderWidth: 20,
|
||||||
|
shadowBlur: 50,
|
||||||
|
borderColor: color[i],
|
||||||
|
shadowColor: 'rgba(0, 0, 0, 0.8)',
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
let option = {
|
||||||
|
color: color,
|
||||||
|
tooltip: {
|
||||||
|
trigger: 'item',
|
||||||
|
backgroundColor: 'rgba(21, 44, 59,.9)',
|
||||||
|
borderColor: 'rgba(21, 44, 59,1)',
|
||||||
|
label: {
|
||||||
|
show: true,
|
||||||
|
},
|
||||||
|
textStyle: {
|
||||||
|
color: '#fff',
|
||||||
|
fontSize: 14,
|
||||||
|
},
|
||||||
|
padding: [12, 10],
|
||||||
|
extraCssText: 'z-index:10',
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
orient: 'vertical',
|
||||||
|
top: '14%',
|
||||||
|
right: '5%',
|
||||||
|
itemGap: 15,
|
||||||
|
itemWidth: 16,
|
||||||
|
itemHeight: 16,
|
||||||
|
textStyle: {
|
||||||
|
color: '#697780',
|
||||||
|
fontSize: 14,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
grid: {
|
||||||
|
top: 'bottom',
|
||||||
|
left: '90',
|
||||||
|
width: '90%',
|
||||||
|
height: '80%',
|
||||||
|
},
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
zlevel: 1,
|
||||||
|
name: '类型',
|
||||||
|
type: 'pie',
|
||||||
|
selectedMode: 'single',
|
||||||
|
radius: [84, 90],
|
||||||
|
center: ['36%', '50%'],
|
||||||
|
startAngle: '135',
|
||||||
|
label: {
|
||||||
|
show: false,
|
||||||
|
},
|
||||||
|
data: baseData,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
let myChart = echarts.init(dddtRef.value)
|
||||||
|
myChart.setOption(option)
|
||||||
|
}
|
||||||
|
const eWyyz = () => {
|
||||||
|
let category = [
|
||||||
|
{
|
||||||
|
name: '月援助成功率',
|
||||||
|
value: 100,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '援助成功率',
|
||||||
|
value: 97,
|
||||||
|
},
|
||||||
|
] // 类别
|
||||||
|
category = category.reverse()
|
||||||
|
let max = 100
|
||||||
|
let total = []
|
||||||
|
let datas = []
|
||||||
|
for (let v of category) {
|
||||||
|
datas.push(v.value)
|
||||||
|
total.push(max)
|
||||||
|
}
|
||||||
|
let option = {
|
||||||
|
xAxis: {
|
||||||
|
max: max,
|
||||||
|
splitLine: {
|
||||||
|
show: false,
|
||||||
|
},
|
||||||
|
axisLine: {
|
||||||
|
show: false,
|
||||||
|
},
|
||||||
|
axisLabel: {
|
||||||
|
show: false,
|
||||||
|
},
|
||||||
|
axisTick: {
|
||||||
|
show: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
grid: {
|
||||||
|
left: '3%',
|
||||||
|
right: '7%',
|
||||||
|
top: '0%',
|
||||||
|
bottom: '14%',
|
||||||
|
},
|
||||||
|
yAxis: [
|
||||||
|
{
|
||||||
|
type: 'category',
|
||||||
|
inverse: false,
|
||||||
|
stack: '1',
|
||||||
|
data: category,
|
||||||
|
axisLine: {
|
||||||
|
show: false,
|
||||||
|
},
|
||||||
|
axisTick: {
|
||||||
|
show: false,
|
||||||
|
},
|
||||||
|
axisLabel: {
|
||||||
|
show: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
// 内
|
||||||
|
type: 'bar',
|
||||||
|
stack: '1',
|
||||||
|
barWidth: 18,
|
||||||
|
silent: true,
|
||||||
|
itemStyle: {
|
||||||
|
color: '#28EAFD',
|
||||||
|
},
|
||||||
|
label: {
|
||||||
|
show: true,
|
||||||
|
position: 'right',
|
||||||
|
fontSize: 11,
|
||||||
|
color: '#fff',
|
||||||
|
padding: [0, 0, 0, -30],
|
||||||
|
rich: {
|
||||||
|
a: {
|
||||||
|
backgroundColor: {
|
||||||
|
image: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAUCAYAAAD/Rn+7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QzJGQTUxMzFGQ0M3MTFFQjg4QUNBRTRFRDBDQ0RBODEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QzJGQTUxMzJGQ0M3MTFFQjg4QUNBRTRFRDBDQ0RBODEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDMjIzQzAzNEZDQzcxMUVCODhBQ0FFNEVEMENDREE4MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDMkZBNTEzMEZDQzcxMUVCODhBQ0FFNEVEMENDREE4MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgnqNYIAAAHmSURBVHjaxJbLTsJQEIZnDmAxSsUNr+Fj4EKFjQuNQRMNKgroU5gYl6xELl633nYmujJx4wu48AnUWAzYcrHHOVqMIUBLgTLpnzbp9PTLnM4/xecad92W+dAwQhkAdGgeSOLgcLgBPO77CoeowsMBF0SIrtgmv0L6cpBP1jik3EEJv6Ij8Hih8bUAg0nHy9Riu951OM+M4xNyzqFIVIkC999U+JGMMD1IOFGggg7pfT/bnpKg9AMookyn1Q999K4MpyMIMzgAuBrpk0MmJWMy7MXSTzXrgPVYUnT5oQrHLoAZJ7dUE4Accnsybsx6Uf271wgoYuJFH6sCHNJlyAlA6lNRvfyOD9fnhlH7f481JoutpqMgikm67DecsAXyt9yuj8Ua4QyraRkKadm4DvWrITwIWfrm4iEJ1GY5zGSNN9IK6apPBcxIZCAhCT9bJTALi7ySFknXPYZLk5JUxVKtTRKzuJjY7vkeQmZI26SSWSLrYFExBhd6sN05UtwKXKeAIj5IkS66O0+KkVSrDzAbL7FrQTkDTuvkIWazEorR3VYhs6TNTirXLWC9u61YkGiIhBizdl7CuvzgzSzoQFiJ1YboB2A7CxKV2+oGruWoK/4Ob7BhQWekIOnEsBLVbNSZ/aJ/CzAAaE2fXTk9x2kAAAAASUVORK5CYII=',
|
||||||
|
},
|
||||||
|
fontSize: 12,
|
||||||
|
lineHeight: 20,
|
||||||
|
},
|
||||||
|
b: {
|
||||||
|
fontSize: 14,
|
||||||
|
lineHeight: 20,
|
||||||
|
padding: [0, 0, 0, -90],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
formatter: (params) => {
|
||||||
|
return (
|
||||||
|
'\n\n\n\n\n\n{a|}\n' +
|
||||||
|
' {b|' +
|
||||||
|
params.name +
|
||||||
|
': ' +
|
||||||
|
params.value +
|
||||||
|
'%}'
|
||||||
|
)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
data: category,
|
||||||
|
z: 1,
|
||||||
|
animationEasing: 'elasticOut',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// 分隔
|
||||||
|
type: 'pictorialBar',
|
||||||
|
itemStyle: {
|
||||||
|
color: '#0F2B57',
|
||||||
|
},
|
||||||
|
symbolRepeat: 'fixed',
|
||||||
|
symbolMargin: 10,
|
||||||
|
symbol: 'rect',
|
||||||
|
symbolClip: true,
|
||||||
|
symbolSize: [3, 18],
|
||||||
|
symbolPosition: 'start',
|
||||||
|
symbolOffset: [0, 0],
|
||||||
|
symbolBoundingData: total,
|
||||||
|
data: total,
|
||||||
|
z: 2,
|
||||||
|
animationEasing: 'elasticOut',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// label
|
||||||
|
type: 'pictorialBar',
|
||||||
|
symbolBoundingData: total,
|
||||||
|
itemStyle: {
|
||||||
|
color: 'none',
|
||||||
|
},
|
||||||
|
data: datas,
|
||||||
|
z: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '外框',
|
||||||
|
type: 'bar',
|
||||||
|
barGap: '-100%',
|
||||||
|
data: total,
|
||||||
|
barWidth: 18,
|
||||||
|
itemStyle: {
|
||||||
|
color: '#144E76',
|
||||||
|
},
|
||||||
|
z: 0,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
let myChart = echarts.init(wyyzRef.value)
|
||||||
|
myChart.clear()
|
||||||
|
myChart.setOption(option)
|
||||||
|
}
|
||||||
|
onMounted(() => {
|
||||||
|
nextTick(() => {
|
||||||
|
eWyzt()
|
||||||
|
eTOP5()
|
||||||
|
eWyhd()
|
||||||
|
eDddt()
|
||||||
|
eWyyz()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
propFuns(commonBoxData)
|
||||||
|
const changeMenu = (n, r, s, p) => {
|
||||||
|
commonBoxData.rlz.itemName = r
|
||||||
|
if (r == 'TOP5') {
|
||||||
|
setTimeout(() => { eTOP5() }, 100)
|
||||||
|
} else if (r == 'rmbq') {
|
||||||
|
setTimeout(() => { eRmbq() }, 100)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="less" scoped>
|
||||||
|
@import "@/assets/theme/theme.less";
|
||||||
|
|
||||||
|
//人员统计
|
||||||
|
.rytj {
|
||||||
|
:deep(.list-icon) {
|
||||||
|
margin-top: 10px;
|
||||||
|
|
||||||
|
&-item {
|
||||||
|
margin-bottom: 6px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//文艺作品
|
||||||
|
.wyzp {
|
||||||
|
:deep(.commonBox-contain) {
|
||||||
|
position: relative;
|
||||||
|
background: url('../../../assets/img/bg_ball.png') no-repeat;
|
||||||
|
background-position: center center;
|
||||||
|
|
||||||
|
.ball {
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%, -52%);
|
||||||
|
z-index: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ball-title {
|
||||||
|
position: absolute;
|
||||||
|
top: 47%;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
display: flex;
|
||||||
|
flex-flow: column nowrap;
|
||||||
|
text-align: center;
|
||||||
|
z-index: 2;
|
||||||
|
font-size: 26px;
|
||||||
|
font-family: dyFont;
|
||||||
|
font-weight: 400;
|
||||||
|
color: #fff;
|
||||||
|
line-height: 1.3;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ball-list {
|
||||||
|
width: 100%;
|
||||||
|
margin-top: 120px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
display: flex;
|
||||||
|
flex-flow: row wrap;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
.ball-wrap {
|
||||||
|
width: 50%;
|
||||||
|
height: 70px;
|
||||||
|
margin-bottom: 42px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
|
||||||
|
.ball-item {
|
||||||
|
background: url('../../../assets/img/w_ib.webp') no-repeat 0/100% 100%;
|
||||||
|
width: 245px;
|
||||||
|
height: 58px;
|
||||||
|
display: flex;
|
||||||
|
flex-flow: row nowrap;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
padding: 0 26px 0 14px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
|
||||||
|
&-icon {
|
||||||
|
object-fit: cover;
|
||||||
|
}
|
||||||
|
|
||||||
|
&-name,
|
||||||
|
&-value {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
&-name {
|
||||||
|
font-size: 14px;
|
||||||
|
font-family: Source;
|
||||||
|
font-weight: 400;
|
||||||
|
color: @darkColor;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
overflow: hidden;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
&-value {
|
||||||
|
order: -1;
|
||||||
|
font-size: 22px;
|
||||||
|
font-family: DIN Alternate Bold;
|
||||||
|
color: #d1f5ff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.leftItem {
|
||||||
|
padding-left: 38px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.rightItem {
|
||||||
|
padding-left: 88px;
|
||||||
|
|
||||||
|
.ball-item {
|
||||||
|
-moz-transform: rotateY(180deg);
|
||||||
|
transform: rotateY(180deg);
|
||||||
|
|
||||||
|
&-name,
|
||||||
|
&-value,
|
||||||
|
&-icon {
|
||||||
|
-moz-transform: rotateY(180deg);
|
||||||
|
transform: rotateY(180deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//点单大厅
|
||||||
|
.dddt {
|
||||||
|
:deep(.list-icon) {
|
||||||
|
&-item {
|
||||||
|
width: 220px;
|
||||||
|
margin-left: 10px;
|
||||||
|
|
||||||
|
>div {
|
||||||
|
margin-left: 20px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//文艺活动
|
||||||
|
.wyhd {
|
||||||
|
:deep(.list-icon) {
|
||||||
|
&-item {
|
||||||
|
width: 130px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//文艺援助
|
||||||
|
.wyyz {
|
||||||
|
&-details {
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -0,0 +1,398 @@
|
||||||
|
<template>
|
||||||
|
<div class="main">
|
||||||
|
<transition
|
||||||
|
:appear="true"
|
||||||
|
enter-active-class="animate__animated animate__fadeInLeft"
|
||||||
|
>
|
||||||
|
<div class="main-l">
|
||||||
|
<CommonBox
|
||||||
|
class="gqld"
|
||||||
|
title="公权力大数据监督"
|
||||||
|
width="555px"
|
||||||
|
height="260px"
|
||||||
|
:boxData="gqldData"
|
||||||
|
@menuActive="menuRadioActive"
|
||||||
|
@moreActive="moreBoxActive"
|
||||||
|
>
|
||||||
|
<div class="commonBox-content">
|
||||||
|
<div
|
||||||
|
v-if="gqldData.itemName === 'yghm'"
|
||||||
|
class="commonBox-content-item"
|
||||||
|
>
|
||||||
|
<div class="chart" ref="ecsRef"></div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
v-if="gqldData.itemName === 'xwql'"
|
||||||
|
class="commonBox-content-item"
|
||||||
|
>
|
||||||
|
<div class="chart" ref="ecaRef"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</CommonBox>
|
||||||
|
<CommonBox
|
||||||
|
class="zzdj"
|
||||||
|
title="组织建设"
|
||||||
|
width="555px"
|
||||||
|
height="374px"
|
||||||
|
:boxData="zzdjData"
|
||||||
|
@menuActive="menuRadioActive"
|
||||||
|
@moreActive="moreBoxActive"
|
||||||
|
>
|
||||||
|
<div class="commonBox-content">
|
||||||
|
<div
|
||||||
|
v-if="zzdjData.itemName === 'box1'"
|
||||||
|
class="commonBox-content-item"
|
||||||
|
>
|
||||||
|
box1
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
v-if="zzdjData.itemName === 'box2'"
|
||||||
|
class="commonBox-content-item"
|
||||||
|
>
|
||||||
|
box2
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</CommonBox>
|
||||||
|
<CommonBox title="意识形态" width="555px" height="346px">
|
||||||
|
<p>1412412</p>
|
||||||
|
</CommonBox>
|
||||||
|
</div>
|
||||||
|
</transition>
|
||||||
|
<transition
|
||||||
|
:appear="true"
|
||||||
|
enter-active-class="animate__animated animate__fadeIn"
|
||||||
|
>
|
||||||
|
<div class="main-c">
|
||||||
|
<CommonBox
|
||||||
|
title="工分+排名"
|
||||||
|
width="730px"
|
||||||
|
height="491px"
|
||||||
|
bg="cbg"
|
||||||
|
>
|
||||||
|
<p>1412412</p>
|
||||||
|
</CommonBox>
|
||||||
|
<CommonBox title="七张问题清单" width="730px" height="396px">
|
||||||
|
<p>1412412</p>
|
||||||
|
</CommonBox>
|
||||||
|
</div>
|
||||||
|
</transition>
|
||||||
|
<transition
|
||||||
|
:appear="true"
|
||||||
|
enter-active-class="animate__animated animate__fadeInRight"
|
||||||
|
>
|
||||||
|
<div class="main-r">
|
||||||
|
<CommonBox title="统一之家" flex="1">
|
||||||
|
<p>1412412</p>
|
||||||
|
</CommonBox>
|
||||||
|
<CommonBox title="民主法治" flex="1">
|
||||||
|
<p>1412412</p>
|
||||||
|
</CommonBox>
|
||||||
|
<CommonBox
|
||||||
|
title="群团组织"
|
||||||
|
flex="2"
|
||||||
|
:boxData="qtzzData"
|
||||||
|
@menuActive="menuRadioActive"
|
||||||
|
>
|
||||||
|
<div class="commonBox-content">
|
||||||
|
<div
|
||||||
|
v-if="qtzzData.itemName === 'list1'"
|
||||||
|
class="commonBox-content-item"
|
||||||
|
>
|
||||||
|
box1
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
v-if="qtzzData.itemName === 'list2'"
|
||||||
|
class="commonBox-content-item"
|
||||||
|
>
|
||||||
|
box2
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</CommonBox>
|
||||||
|
</div>
|
||||||
|
</transition>
|
||||||
|
<el-modal v-model:visible="showModal" title="标题" :footer="null">
|
||||||
|
<p>Some contents...</p>
|
||||||
|
<p>Some contents...</p>
|
||||||
|
<p>Some contents...</p>
|
||||||
|
<template #closeIcon>
|
||||||
|
<img src="@/assets/img/close.webp" />
|
||||||
|
</template>
|
||||||
|
</el-modal>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script setup>
|
||||||
|
import * as echarts from 'echarts'
|
||||||
|
import { reactive, ref, toRefs, toRaw } from '@vue/reactivity'
|
||||||
|
import { onMounted } from '@vue/runtime-core'
|
||||||
|
import CommonBox from '../commonBox/CommonBox.vue'
|
||||||
|
|
||||||
|
import { hook } from '@/hook/hook'
|
||||||
|
const { delay } = hook()
|
||||||
|
//more默认name值为'更多',href新页面打开地址,fn触发同名函数,默认传入参数为属性值
|
||||||
|
const commonBoxData = reactive({
|
||||||
|
gqldData: {
|
||||||
|
name: 'gqldData',
|
||||||
|
itemName: 'yghm',
|
||||||
|
more: {
|
||||||
|
name: '其他',
|
||||||
|
// href:'https://www.baidu.com/',
|
||||||
|
fn: 'gqld_a',
|
||||||
|
},
|
||||||
|
menu: [
|
||||||
|
{
|
||||||
|
name: '阳光惠民',
|
||||||
|
value: 'yghm',
|
||||||
|
choose: [
|
||||||
|
{
|
||||||
|
name: '2021年',
|
||||||
|
value: '2021',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '2022年',
|
||||||
|
value: '2022',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '小微权力',
|
||||||
|
value: 'xwql',
|
||||||
|
date: [
|
||||||
|
{
|
||||||
|
name: '1月',
|
||||||
|
datas: ['1', '2', '3'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '2月',
|
||||||
|
datas: ['11', '22', '33'],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '外链',
|
||||||
|
value: 'wl',
|
||||||
|
href: 'http://220.191.238.2:998/zldn/',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
zzdjData: {
|
||||||
|
name: 'zzdjData',
|
||||||
|
itemName: 'box1',
|
||||||
|
more: {
|
||||||
|
name: '更少',
|
||||||
|
href: 'https://wwww.baidu.com',
|
||||||
|
},
|
||||||
|
menu: [
|
||||||
|
{
|
||||||
|
name: '盒1',
|
||||||
|
value: 'box1',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '盒2',
|
||||||
|
value: 'box2',
|
||||||
|
date: [],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '转跳',
|
||||||
|
value: 'zt',
|
||||||
|
href: 'https://www.sogou.com/',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
qtzzData: {
|
||||||
|
name: 'qtzzData',
|
||||||
|
itemName: 'list1',
|
||||||
|
menu: [
|
||||||
|
{
|
||||||
|
name: '列表1',
|
||||||
|
value: 'list1',
|
||||||
|
date: [],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '列表2',
|
||||||
|
value: 'list2',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
})
|
||||||
|
const { gqldData, zzdjData, qtzzData } = toRefs(commonBoxData)
|
||||||
|
//获得页面echart图表dom
|
||||||
|
const ecsRef = ref(null)
|
||||||
|
const ecaRef = ref(null)
|
||||||
|
//弹窗的flag
|
||||||
|
const showModal = ref(false)
|
||||||
|
//目录使用的函数集合,d为 当前下拉菜单的值 || 弹窗的函数名
|
||||||
|
const funs = {
|
||||||
|
yghm: function (d) {
|
||||||
|
delay(ecs)
|
||||||
|
},
|
||||||
|
xwql: function (d) {
|
||||||
|
delay(eca)
|
||||||
|
},
|
||||||
|
gqld_a: function (d) {
|
||||||
|
showModal.value = true
|
||||||
|
},
|
||||||
|
}
|
||||||
|
//当前目录栏的回调函数,n为当前数据的name名称,r为当前复选框值,s为当前复选框的下拉框值,p为当前复选框时间器的值
|
||||||
|
//s和p只存在其中一个
|
||||||
|
const menuRadioActive = (n, r, s, p) => {
|
||||||
|
s = s || '无'
|
||||||
|
p = p || '无'
|
||||||
|
console.log(n, r, s, p)
|
||||||
|
let d = s == '' ? p : s
|
||||||
|
let cbd = toRaw(commonBoxData)
|
||||||
|
for (let v in cbd) {
|
||||||
|
if (cbd[v].name === n) cbd[v].itemName = r
|
||||||
|
}
|
||||||
|
funs[r] && funs[r](d)
|
||||||
|
}
|
||||||
|
//当前更多按钮的点击事件
|
||||||
|
const moreBoxActive = (d) => {
|
||||||
|
funs[d] && funs[d](d)
|
||||||
|
}
|
||||||
|
const ecs = () => {
|
||||||
|
let option = {
|
||||||
|
title: {
|
||||||
|
show: true,
|
||||||
|
text: '党员民资占比', // 当前写死
|
||||||
|
top: '50%',
|
||||||
|
left: '45%',
|
||||||
|
textAlign: 'center',
|
||||||
|
textStyle: {
|
||||||
|
fontSize: '14',
|
||||||
|
fontWeight: 'bold',
|
||||||
|
color: '#ffffff',
|
||||||
|
},
|
||||||
|
subtextStyle: {
|
||||||
|
fontSize: '20',
|
||||||
|
fontWeight: 'bold',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
color: ['#FFFF00', '#0080FF'],
|
||||||
|
grid: {
|
||||||
|
left: 0,
|
||||||
|
// right: 0,
|
||||||
|
bottom: 0,
|
||||||
|
top: 0,
|
||||||
|
containLabel: true,
|
||||||
|
},
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
radius: ['70%', '80%'],
|
||||||
|
center: ['45%', '50%'],
|
||||||
|
type: 'pie',
|
||||||
|
emphasis: {
|
||||||
|
shadowBlur: 10,
|
||||||
|
shadowOffsetX: 0,
|
||||||
|
shadowColor: 'rgba(0, 0, 0, 0.5)', //鼠标放在区域边框颜色
|
||||||
|
textColor: '#000',
|
||||||
|
normal: {
|
||||||
|
label: {
|
||||||
|
show: true,
|
||||||
|
textStyle: { fontSize: '16' },
|
||||||
|
formatter: function (val) {
|
||||||
|
//让series 中的文字进行换行
|
||||||
|
return val.name.split('-').join('\n')
|
||||||
|
},
|
||||||
|
},
|
||||||
|
labelLine: {
|
||||||
|
show: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
data: [
|
||||||
|
{ name: '20%-少数民族', value: 20 },
|
||||||
|
{ name: '80%-汉族', value: 80 },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'pie',
|
||||||
|
center: ['45%', '50%'],
|
||||||
|
radius: ['60%', '60%'],
|
||||||
|
data: [
|
||||||
|
{
|
||||||
|
value: 2,
|
||||||
|
name: '',
|
||||||
|
itemStyle: {
|
||||||
|
borderWidth: 2,
|
||||||
|
borderColor: '#61bad3',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
let myChart = echarts.init(ecsRef.value)
|
||||||
|
myChart.clear()
|
||||||
|
myChart.setOption(option)
|
||||||
|
}
|
||||||
|
const eca = () => {
|
||||||
|
let option = {
|
||||||
|
grid: {
|
||||||
|
left: '8%',
|
||||||
|
right: '6%',
|
||||||
|
top: '10%',
|
||||||
|
bottom: '20%',
|
||||||
|
},
|
||||||
|
xAxis: {
|
||||||
|
type: 'category',
|
||||||
|
boundaryGap: false, // 紧挨边缘
|
||||||
|
axisTick: {
|
||||||
|
// x轴上的小刻度
|
||||||
|
show: false,
|
||||||
|
},
|
||||||
|
axisLabel: {
|
||||||
|
// x轴样式
|
||||||
|
margin: 15, // x轴距离文字距离
|
||||||
|
},
|
||||||
|
data: ['类型1', '类型2', '类型3', '类型4', '类型5', '类型6'],
|
||||||
|
},
|
||||||
|
yAxis: {
|
||||||
|
type: 'value',
|
||||||
|
// min: 0, // 设置y轴刻度的最小值
|
||||||
|
// max: 1800, // 设置y轴刻度的最大值
|
||||||
|
splitNumber: 9, // 设置y轴刻度间隔个数
|
||||||
|
splitLine: {
|
||||||
|
// 网格线
|
||||||
|
show: true,
|
||||||
|
lineStyle: {
|
||||||
|
type: 'dotted', // dotted 虚线 solid 实线
|
||||||
|
color: 'rgba(255, 255, 255,0.3)',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
axisLabel: {
|
||||||
|
//y 轴样式
|
||||||
|
formatter: '{value}',
|
||||||
|
color: '#A1A7B3',
|
||||||
|
fontSize: 14,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
data: [200, 73, 110, 32, 125, 100],
|
||||||
|
type: 'line',
|
||||||
|
smooth: true, // 平滑过渡
|
||||||
|
symbol: 'none', // 拐点设置为实心圆点 默认是空心圆点 ECharts 提供的标记类型包括 'circle', 'rect', 'roundRect', 'triangle', 'diamond', 'pin', 'arrow', 'none' 可以通过 'image://url' 设置为图片,其中 URL 为图片的链接
|
||||||
|
// symbolSize: 8, // 拐点圆的大小
|
||||||
|
lineStyle: {
|
||||||
|
//线条样式
|
||||||
|
width: 5,
|
||||||
|
color: '#50e3c2',
|
||||||
|
type: 'solid', //虚线 dotted 点线 solid 实线 dashed 虚线
|
||||||
|
},
|
||||||
|
//填充风格
|
||||||
|
areaStyle: {
|
||||||
|
color: 'rgba(80, 227, 194, 0.3)',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
let myChart = echarts.init(ecaRef.value)
|
||||||
|
myChart.clear()
|
||||||
|
myChart.setOption(option)
|
||||||
|
}
|
||||||
|
onMounted(() => {
|
||||||
|
ecs()
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="less" scoped></style>
|
|
@ -0,0 +1,106 @@
|
||||||
|
import { toRaw } from '@vue/reactivity'
|
||||||
|
export function hook() {
|
||||||
|
const delay = (f, d, t = 500) => {
|
||||||
|
setTimeout(() => f(d), t)
|
||||||
|
}
|
||||||
|
const chartDate = (n, type, flag) => {
|
||||||
|
let nowDate = new Date()
|
||||||
|
let dateArray = []
|
||||||
|
let nm = nowDate.getMonth() + 1 //nowDate.getMonth()默认从0开始,定义nm获得正确的月份
|
||||||
|
if (!type) {
|
||||||
|
flag
|
||||||
|
? nowDate.setDate(nowDate.getDate() - n + 1)
|
||||||
|
: nowDate.setDate(nowDate.getDate() - n)
|
||||||
|
for (let i = 0; i < n; i++) {
|
||||||
|
let month = 0
|
||||||
|
let day = 0
|
||||||
|
nm < 10 ? (month = '0' + nm) : (month = nm)
|
||||||
|
nowDate.getDate() < 10
|
||||||
|
? (day = '0' + nowDate.getDate())
|
||||||
|
: (day = nowDate.getDate())
|
||||||
|
dateArray.push(month + '-' + day)
|
||||||
|
nowDate.setDate(nowDate.getDate() + 1)
|
||||||
|
}
|
||||||
|
} else if (type == 1) {
|
||||||
|
if (n) {
|
||||||
|
nm = flag ? nm + 1 : nm
|
||||||
|
for (let i = 0; i < n; i++) {
|
||||||
|
let k = nm - i - 1
|
||||||
|
k % 12 == 0
|
||||||
|
? dateArray.unshift('12月')
|
||||||
|
: k > 0
|
||||||
|
? dateArray.unshift(k + '月')
|
||||||
|
: dateArray.unshift(
|
||||||
|
12 * Math.ceil(Math.abs(k) / 12) + k + '月'
|
||||||
|
)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (nm == 1) {
|
||||||
|
dateArray = flag
|
||||||
|
? ['1月']
|
||||||
|
: [
|
||||||
|
'1月',
|
||||||
|
'2月',
|
||||||
|
'3月',
|
||||||
|
'4月',
|
||||||
|
'5月',
|
||||||
|
'6月',
|
||||||
|
'7月',
|
||||||
|
'8月',
|
||||||
|
'9月',
|
||||||
|
'10月',
|
||||||
|
'11月',
|
||||||
|
'12月',
|
||||||
|
]
|
||||||
|
} else {
|
||||||
|
let i = flag ? 0 : 1
|
||||||
|
for (i; i < nm; i++) {
|
||||||
|
dateArray.unshift(nm - i + '月')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (type == 2) {
|
||||||
|
let nowYear = nowDate.getFullYear()
|
||||||
|
nowYear = flag ? nowYear : nowYear - 1
|
||||||
|
for (let i = 0; i < n; i++) {
|
||||||
|
dateArray.unshift(nowYear - i)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dateArray
|
||||||
|
}
|
||||||
|
const jsonSort = (array, field, reverse) => {
|
||||||
|
if (array.length < 2 || !field || typeof array[0] !== 'object')
|
||||||
|
return array
|
||||||
|
if (typeof array[0][field] === 'number') {
|
||||||
|
array.sort((x, y) => {
|
||||||
|
return y[field] - x[field]
|
||||||
|
})
|
||||||
|
}
|
||||||
|
if (typeof array[0][field] === 'string') {
|
||||||
|
array.sort((x, y) => {
|
||||||
|
return y[field].localeCompare(x[field])
|
||||||
|
})
|
||||||
|
}
|
||||||
|
if (reverse) array.reverse()
|
||||||
|
return array
|
||||||
|
}
|
||||||
|
var commonBoxData = null
|
||||||
|
var funs = null
|
||||||
|
const propFuns = (a = null, b = null) => {
|
||||||
|
commonBoxData = a
|
||||||
|
funs = b
|
||||||
|
}
|
||||||
|
const boxMenu = (n, r, s, p) => {
|
||||||
|
n &&
|
||||||
|
(() => {
|
||||||
|
let d = s == '' ? p : s
|
||||||
|
let cbd = toRaw(commonBoxData)
|
||||||
|
for (let v in cbd) if (v === n) cbd[v].itemName = r
|
||||||
|
funs[r] && funs[r](d)
|
||||||
|
})()
|
||||||
|
}
|
||||||
|
const boxMore = (d) => {
|
||||||
|
funs[d] && funs[d](d)
|
||||||
|
}
|
||||||
|
return { delay, boxMenu, boxMore, propFuns, chartDate, jsonSort }
|
||||||
|
}
|
|
@ -29,6 +29,10 @@ import GrapeTableData from './views/grape/components/grapeTableData.vue';
|
||||||
import DialogUpload from './components/customs/dialogUpload.vue'
|
import DialogUpload from './components/customs/dialogUpload.vue'
|
||||||
import DialogGoods from './components/customs/dialogGoods.vue'
|
import DialogGoods from './components/customs/dialogGoods.vue'
|
||||||
import personQrcode from './views/grape/actions/personQrcode.vue';
|
import personQrcode from './views/grape/actions/personQrcode.vue';
|
||||||
|
import 'swiper/swiper-bundle.css'
|
||||||
|
import CommonBox from './components/lib/CommonBox.vue';
|
||||||
|
import CommonList from './components/lib/CommonList.vue';
|
||||||
|
import CommonTitle from './components/lib/CommonTitle.vue';
|
||||||
|
|
||||||
const app = createApp(App);
|
const app = createApp(App);
|
||||||
|
|
||||||
|
@ -59,6 +63,9 @@ app.component('GrapeTableData', GrapeTableData);
|
||||||
app.component('personQrcode', personQrcode);
|
app.component('personQrcode', personQrcode);
|
||||||
app.component('dialogUpload', DialogUpload);
|
app.component('dialogUpload', DialogUpload);
|
||||||
app.component('dialogGoods', DialogGoods);
|
app.component('dialogGoods', DialogGoods);
|
||||||
|
app.component('CommonBox', CommonBox);
|
||||||
|
app.component('CommonList', CommonList);
|
||||||
|
app.component('CommonTitle', CommonTitle);
|
||||||
|
|
||||||
//注册全局指令
|
//注册全局指令
|
||||||
app.directive('auth', auth)
|
app.directive('auth', auth)
|
||||||
|
|
|
@ -1,55 +1,95 @@
|
||||||
|
import Home from '@/components/view/lwt/Home'
|
||||||
|
import Yhhx from '@/components/view/lwt/Yhhx'
|
||||||
|
import Wyzp from '@/components/view/lwt/Wyzp'
|
||||||
|
import Wyhd from '@/components/view/lwt/Wyhd'
|
||||||
|
import Fwd from '@/components/view/lwt/Fwd'
|
||||||
|
import Dddt from '@/components/view/lwt/Dddt'
|
||||||
//系统路由
|
//系统路由
|
||||||
const routes = [{
|
const routes = [{
|
||||||
name: "layout",
|
name: "layout",
|
||||||
path: "/",
|
path: "/",
|
||||||
component: () => import(/* webpackChunkName: "layout" */ '@/layout'),
|
component: () => import(/* webpackChunkName: "layout" */ '@/layout'),
|
||||||
redirect: '/dashboard',
|
redirect: '/dashboard',
|
||||||
children: [
|
children: [
|
||||||
{
|
{
|
||||||
name: "home",
|
name: "home",
|
||||||
path: "/home",
|
path: "/home",
|
||||||
component: () => import(`@/views/other/empty`),
|
component: () => import(`@/views/other/empty`),
|
||||||
meta: {
|
meta: {
|
||||||
title: "首页",
|
title: "首页",
|
||||||
icon: "el-icon-s-home"
|
icon: "el-icon-s-home"
|
||||||
},
|
},
|
||||||
children: [
|
children: [
|
||||||
{
|
{
|
||||||
name: "dashboard",
|
name: "dashboard",
|
||||||
path: "/dashboard",
|
path: "/dashboard",
|
||||||
meta: {
|
meta: {
|
||||||
title: "控制台",
|
title: "控制台",
|
||||||
icon: "el-icon-menu",
|
icon: "el-icon-menu",
|
||||||
affix: true
|
affix: true
|
||||||
},
|
},
|
||||||
component: () => import(/* webpackChunkName: "home" */ '@/views/home'),
|
component: () => import(/* webpackChunkName: "home" */ '@/views/home'),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "userCenter",
|
name: "userCenter",
|
||||||
path: "/usercenter",
|
path: "/usercenter",
|
||||||
meta: {
|
meta: {
|
||||||
title: "修改密码",
|
title: "修改密码",
|
||||||
icon: "el-icon-user",
|
icon: "el-icon-user",
|
||||||
},
|
},
|
||||||
component: () => import(/* webpackChunkName: "usercenter" */ '@/views/userCenter'),
|
component: () => import(/* webpackChunkName: "usercenter" */ '@/views/userCenter'),
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/login",
|
path: "/login",
|
||||||
component: () => import(/* webpackChunkName: "login" */ '@/views/userCenter/login'),
|
component: () => import(/* webpackChunkName: "login" */ '@/views/userCenter/login'),
|
||||||
meta: {
|
meta: {
|
||||||
title: "登录"
|
title: "登录"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/force_password",
|
path: "/cockpit",
|
||||||
component: () => import('@/views/userCenter/forcePassword'),
|
component: () => import(/* webpackChunkName: "login" */ '@/views/cockpit'),
|
||||||
meta: {
|
meta: {
|
||||||
title: "重置密码"
|
title: "驾驶舱"
|
||||||
}
|
},
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
path: '/coHome',
|
||||||
|
component: Home,
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
path: '/yhhx',
|
||||||
|
component: Yhhx,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: '/wyzp',
|
||||||
|
component: Wyzp,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: '/wyhd',
|
||||||
|
component: Wyhd,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: '/fwd',
|
||||||
|
component: Fwd,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: '/dddt',
|
||||||
|
component: Dddt,
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: "/force_password",
|
||||||
|
component: () => import('@/views/userCenter/forcePassword'),
|
||||||
|
meta: {
|
||||||
|
title: "重置密码"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { createStore } from 'vuex';
|
import { createStore } from 'vuex';
|
||||||
|
import dayjs from 'dayjs'
|
||||||
|
|
||||||
const files = require.context('./modules', false, /\.js$/);
|
const files = require.context('./modules', false, /\.js$/);
|
||||||
const modules = {}
|
const modules = {}
|
||||||
|
@ -11,5 +12,412 @@ files.keys().forEach((key) => {
|
||||||
})
|
})
|
||||||
|
|
||||||
export default createStore({
|
export default createStore({
|
||||||
modules
|
modules,
|
||||||
|
state: {
|
||||||
|
lastMonTime: dayjs().subtract(1, 'months'),
|
||||||
|
lastMon: dayjs().subtract(1, 'months').format('M月'),
|
||||||
|
pagePosition: {
|
||||||
|
defaultWidth: 1920,
|
||||||
|
defaultHeight: 1080,
|
||||||
|
scale: 1,
|
||||||
|
left: '0px',
|
||||||
|
top: '0px',
|
||||||
|
},
|
||||||
|
rytj: [
|
||||||
|
{
|
||||||
|
name: '平台用户总数',
|
||||||
|
value: '10649',
|
||||||
|
unit: '人',
|
||||||
|
icon: require('@/assets/img/icon/icon1.webp'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '普通群众',
|
||||||
|
value: '76815',
|
||||||
|
unit: '人',
|
||||||
|
icon: require('@/assets/img/icon/icon1.webp'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '文艺志愿者',
|
||||||
|
value: '17635',
|
||||||
|
unit: '人',
|
||||||
|
icon: require('@/assets/img/icon/icon1.webp'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '协会会员',
|
||||||
|
value: '26699',
|
||||||
|
unit: '人',
|
||||||
|
icon: require('@/assets/img/icon/icon1.webp'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '文艺人才',
|
||||||
|
value: '7883',
|
||||||
|
unit: '人',
|
||||||
|
icon: require('@/assets/img/icon/icon1.webp'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '文艺名家',
|
||||||
|
value: '1944',
|
||||||
|
unit: '人',
|
||||||
|
icon: require('@/assets/img/icon/icon1.webp'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '文联人员',
|
||||||
|
value: '833',
|
||||||
|
unit: '人',
|
||||||
|
icon: require('@/assets/img/icon/icon1.webp'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '服务商',
|
||||||
|
value: '18862',
|
||||||
|
unit: '家',
|
||||||
|
icon: require('@/assets/img/icon/icon1.webp'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '文联协会',
|
||||||
|
value: '12',
|
||||||
|
unit: '人',
|
||||||
|
icon: require('@/assets/img/icon/icon1.webp'),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
wyyz: [
|
||||||
|
{
|
||||||
|
type: '文艺维权',
|
||||||
|
user: '韩佳琪',
|
||||||
|
time: '2022-08-29',
|
||||||
|
progressbar: '待办中',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: '会员培训',
|
||||||
|
user: '屠郑振',
|
||||||
|
time: '2022-08-25',
|
||||||
|
progressbar: '处理中',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: '艺术考级',
|
||||||
|
user: '董希贤',
|
||||||
|
time: '2022-08-20',
|
||||||
|
progressbar: '已解决',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: '职称评审',
|
||||||
|
user: '徐宇晨',
|
||||||
|
time: '2022-08-19',
|
||||||
|
progressbar: '已解决',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: '文艺维权',
|
||||||
|
user: '王梦莹',
|
||||||
|
time: '2022-08-14',
|
||||||
|
progressbar: '待办中',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: '文艺维权',
|
||||||
|
user: '王美基',
|
||||||
|
time: '2022-08-08',
|
||||||
|
progressbar: '待办中',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: '职称评审',
|
||||||
|
user: '林波君',
|
||||||
|
time: '2022-08-03',
|
||||||
|
progressbar: '处理中',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: '艺术考级',
|
||||||
|
user: '胡剑略',
|
||||||
|
time: '2022-07-31',
|
||||||
|
progressbar: '已解决',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: '文艺维权',
|
||||||
|
user: '李玲',
|
||||||
|
time: '2022-07-25',
|
||||||
|
progressbar: '待办中',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: '会员培训',
|
||||||
|
user: '郑贤东',
|
||||||
|
time: '2022-07-20',
|
||||||
|
progressbar: '处理中',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
wyzp: {
|
||||||
|
stat: [
|
||||||
|
{
|
||||||
|
name: '作品数量',
|
||||||
|
value: '203873',
|
||||||
|
unit: '个',
|
||||||
|
icon: require('@/assets/img/icon/icon_w.webp'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '作者数量',
|
||||||
|
value: '56821',
|
||||||
|
unit: '人',
|
||||||
|
icon: require('@/assets/img/icon/icon_w.webp'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '累计交易',
|
||||||
|
value: '34132',
|
||||||
|
unit: '次',
|
||||||
|
icon: require('@/assets/img/icon/icon_w.webp'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '交易总额',
|
||||||
|
value: '1059172',
|
||||||
|
unit: '元',
|
||||||
|
icon: require('@/assets/img/icon/icon_w.webp'),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
author: [
|
||||||
|
{
|
||||||
|
name: '作者总数',
|
||||||
|
value: '5.7',
|
||||||
|
unit: '万人',
|
||||||
|
icon: require('@/assets/img/icon/icon_w.webp'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '作品总数',
|
||||||
|
value: '20.4',
|
||||||
|
unit: '万个',
|
||||||
|
icon: require('@/assets/img/icon/icon_w.webp'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '月新增作者',
|
||||||
|
value: '23',
|
||||||
|
unit: '人',
|
||||||
|
icon: require('@/assets/img/icon/icon_w.webp'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '月新增作品',
|
||||||
|
value: '159',
|
||||||
|
unit: '个',
|
||||||
|
icon: require('@/assets/img/icon/icon_w.webp'),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
money: [
|
||||||
|
{
|
||||||
|
name: '累计交易',
|
||||||
|
value: '3.4',
|
||||||
|
unit: '万次',
|
||||||
|
icon: require('@/assets/img/icon/icon_w.webp'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '交易总额',
|
||||||
|
value: '105.9',
|
||||||
|
unit: '万元',
|
||||||
|
icon: require('@/assets/img/icon/icon_w.webp'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '当月交易',
|
||||||
|
value: '182',
|
||||||
|
unit: '次',
|
||||||
|
icon: require('@/assets/img/icon/icon_w.webp'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '月交易额',
|
||||||
|
value: '1.2',
|
||||||
|
unit: '万元',
|
||||||
|
icon: require('@/assets/img/icon/icon_w.webp'),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
wydt: [
|
||||||
|
{
|
||||||
|
title: '送万福,进万家,文艺惠民暖人心',
|
||||||
|
time: '2022-08-30',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '虎年新春活动再上央视《新闻联播》',
|
||||||
|
time: '2022-08-27',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '虎年新春活动再上央视《新闻联播》',
|
||||||
|
time: '2022-08-27',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '文联送欢乐,安置点享真情',
|
||||||
|
time: '2022-08-22',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '唱响象山“文艺春天”!',
|
||||||
|
time: '2022-08-20',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '摄影家协会公益拍照活动进行中',
|
||||||
|
time: '2022-08-17',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '祝贺迎亚运儿童画比赛圆满结束',
|
||||||
|
time: '2022-08-16',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '老年舞蹈队招新会举办在即',
|
||||||
|
time: '2022-08-14',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '文艺汇演活动走进丹东海山社区',
|
||||||
|
time: '2022-08-10',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '新时代五四青年文艺作品展在象举办',
|
||||||
|
time: '2022-08-05',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
wyhd: {
|
||||||
|
list: [
|
||||||
|
{
|
||||||
|
name: '举办次数',
|
||||||
|
value: '171',
|
||||||
|
unit: '场',
|
||||||
|
icon: require('@/assets/img/icon/icon1.webp'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '参与人数',
|
||||||
|
value: '1.3',
|
||||||
|
unit: '万人',
|
||||||
|
icon: require('@/assets/img/icon/icon1.webp'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '支援人数',
|
||||||
|
value: '1225',
|
||||||
|
unit: '人',
|
||||||
|
icon: require('@/assets/img/icon/icon1.webp'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '冠名单位',
|
||||||
|
value: '244',
|
||||||
|
unit: '家',
|
||||||
|
icon: require('@/assets/img/icon/icon1.webp'),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
monChart: [
|
||||||
|
{
|
||||||
|
name: '1月',
|
||||||
|
value: 26,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '2月',
|
||||||
|
value: 18,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '3月',
|
||||||
|
value: 28,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '4月',
|
||||||
|
value: 9,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '5月',
|
||||||
|
value: 16,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '6月',
|
||||||
|
value: 20,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '7月',
|
||||||
|
value: 31,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '8月',
|
||||||
|
value: 23,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
typeChart: [
|
||||||
|
{
|
||||||
|
value: 97,
|
||||||
|
name: '民俗',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 85,
|
||||||
|
name: '节庆',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 115,
|
||||||
|
name: '艺术',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 125,
|
||||||
|
name: '比赛',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 145,
|
||||||
|
name: '其他',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
wyzt: [
|
||||||
|
{
|
||||||
|
value: 16,
|
||||||
|
name: '举办场次(次)',
|
||||||
|
max: 40,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 124,
|
||||||
|
name: '参展作品(件)',
|
||||||
|
max: 160,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 44926,
|
||||||
|
name: '累计观看(人次)',
|
||||||
|
max: 55000,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
wyxx: {
|
||||||
|
iconList: [
|
||||||
|
{
|
||||||
|
name: '月下乡数',
|
||||||
|
value: '11',
|
||||||
|
unit: '次',
|
||||||
|
icon: require('@/assets/img/icon/icon1.webp'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '总下乡数',
|
||||||
|
value: '493',
|
||||||
|
unit: '次',
|
||||||
|
icon: require('@/assets/img/icon/icon1.webp'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '团队数',
|
||||||
|
value: '1225',
|
||||||
|
unit: '个',
|
||||||
|
icon: require('@/assets/img/icon/icon1.webp'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '节目数',
|
||||||
|
value: '2.4',
|
||||||
|
unit: '万个',
|
||||||
|
icon: require('@/assets/img/icon/icon1.webp'),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
dataList: [
|
||||||
|
{
|
||||||
|
wyTeam: '文化礼堂文艺团队',
|
||||||
|
wyShow: '《半岛新曲》',
|
||||||
|
startTime: '2023-01-27',
|
||||||
|
endTime: '2023-01-27',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
wyTeam: '舞龙队、戏曲快闪',
|
||||||
|
wyShow: '《象山非遗新风貌》',
|
||||||
|
startTime: '2023-01-24',
|
||||||
|
endTime: '2023-01-24',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
wyTeam: '西周镇土下村文艺团',
|
||||||
|
wyShow: '《快乐一家人》',
|
||||||
|
startTime: '2023-01-05',
|
||||||
|
endTime: '2023-01-05',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
mutations: {
|
||||||
|
resizePage(state, d) {
|
||||||
|
state.pagePosition.scale = d.scale
|
||||||
|
state.pagePosition.left = d.left
|
||||||
|
state.pagePosition.top = d.top
|
||||||
|
},
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
|
@ -0,0 +1,101 @@
|
||||||
|
<template>
|
||||||
|
<div
|
||||||
|
id="page"
|
||||||
|
ref="pageRef"
|
||||||
|
:style="[
|
||||||
|
{
|
||||||
|
'--scale': store.state.pagePosition.scale,
|
||||||
|
left: store.state.pagePosition.left,
|
||||||
|
top: store.state.pagePosition.top,
|
||||||
|
},
|
||||||
|
]"
|
||||||
|
>
|
||||||
|
<Header />
|
||||||
|
<Main />
|
||||||
|
<!-- <Foot /> -->
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import Header from '@/components/Header.vue' // eslint-disable-line no-unused-vars
|
||||||
|
import Main from '@/components/Main.vue' // eslint-disable-line no-unused-vars
|
||||||
|
// import Foot from './components//Foot.vue'
|
||||||
|
import { onBeforeMount } from '@vue/runtime-core'
|
||||||
|
import { hook } from '@/hook/hook'
|
||||||
|
import { reactive } from 'vue'
|
||||||
|
import { useStore } from 'vuex'
|
||||||
|
const { delay } = hook()
|
||||||
|
const wPosition = reactive({
|
||||||
|
scale: 1,
|
||||||
|
left: 0,
|
||||||
|
top: 0,
|
||||||
|
})
|
||||||
|
const store = useStore()
|
||||||
|
const reset_window = async () => {
|
||||||
|
|
||||||
|
let width =
|
||||||
|
document.documentElement.clientWidth || document.body.clientWidth
|
||||||
|
let w1 = width / store.state.pagePosition.defaultWidth
|
||||||
|
let height =
|
||||||
|
document.documentElement.clientHeight || document.body.clientHeight
|
||||||
|
let h1 = height / store.state.pagePosition.defaultHeight
|
||||||
|
wPosition.scale = w1 > h1 ? h1 : w1
|
||||||
|
let w2 =
|
||||||
|
Math.abs(
|
||||||
|
(width - store.state.pagePosition.defaultWidth * wPosition.scale) /
|
||||||
|
2
|
||||||
|
) + 'px'
|
||||||
|
let h2 =
|
||||||
|
Math.abs(
|
||||||
|
(height -
|
||||||
|
store.state.pagePosition.defaultHeight * wPosition.scale) /
|
||||||
|
2
|
||||||
|
) + 'px'
|
||||||
|
wPosition.left = w1 > h1 ? w2 : 0
|
||||||
|
wPosition.top = w1 > h1 ? 0 : h2
|
||||||
|
store.commit('resizePage', wPosition)
|
||||||
|
}
|
||||||
|
|
||||||
|
onBeforeMount(() => {
|
||||||
|
reset_window()
|
||||||
|
})
|
||||||
|
var timer
|
||||||
|
window.onresize = () => {
|
||||||
|
if (timer) clearTimeout(timer)
|
||||||
|
delay(reset_window, null, 500)
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="less" scoped>
|
||||||
|
#page {
|
||||||
|
background: #061119;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
box-sizing: border-box;
|
||||||
|
overflow: hidden;
|
||||||
|
width: 1920px !important;
|
||||||
|
height: 1080px !important;
|
||||||
|
position: absolute;
|
||||||
|
transform: scale(var(--scale));
|
||||||
|
transform-origin: 0 0;
|
||||||
|
transition: all 0.2s;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<style lang="less">
|
||||||
|
#app {
|
||||||
|
height: auto;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
#page {
|
||||||
|
z-index: 10000;
|
||||||
|
pointer-events: none;
|
||||||
|
> .header,
|
||||||
|
> main,
|
||||||
|
.commonBox {
|
||||||
|
pointer-events: all;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.anchorBL {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
</style>
|