index.html 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462
  1. <template>
  2. <div style="overflow: hidden;max-width: 100%;">
  3. <el-row :gutter="10">
  4. <el-col :md="18" :xs="24" :sm="24">
  5. <div class="card-container">
  6. <el-card shadow="always" body-style="padding-bottom:10px;">
  7. <el-row>
  8. <el-col :md="6" :sm="12" :xs="12">
  9. <div class="style-1 bkcolor1">
  10. <div class="box">
  11. <div class="box-title">用户总数</div>
  12. <div class="box-number">{{panel[0]}}</div>
  13. </div>
  14. <i class="fa fa-user-circle-o"></i>
  15. </div>
  16. </el-col>
  17. <el-col :md="6" :sm="12" :xs="12">
  18. <div class="style-1 bkcolor2">
  19. <div class="box">
  20. <div class="box-title">在线人数</div>
  21. <div class="box-number">{{panel[1]}}</div>
  22. </div>
  23. <i class="fa fa-tasks"></i>
  24. </div>
  25. </el-col>
  26. <el-col :md="6" :sm="12" :xs="12">
  27. <div class="style-1 bkcolor3">
  28. <div class="box">
  29. <div class="box-title">月租用户</div>
  30. <div class="box-number">{{panel[2]}}</div>
  31. </div>
  32. <i class="fa fa-dashcube"></i>
  33. </div>
  34. </el-col>
  35. <el-col :md="6" :sm="12" :xs="12">
  36. <div class="style-1 bkcolor4">
  37. <div class="box">
  38. <div class="box-title">数据表数量</div>
  39. <div class="box-number">{{panel[3]}}</div>
  40. </div>
  41. <i class="fa fa-database"></i>
  42. </div>
  43. </el-col>
  44. </el-row>
  45. </el-card>
  46. </div>
  47. <div class="card-container">
  48. <el-card shadow="always">
  49. <template #header>
  50. <div class="header">
  51. <div class="title"><i class="fa fa-caret-right"></i>折线图</div>
  52. </div>
  53. </template>
  54. <div class="chart1" id="chart1"></div>
  55. </el-card>
  56. </div>
  57. <div class="card-container">
  58. <el-card shadow="always">
  59. <template #header>
  60. <div class="header">
  61. <div class="title"><i class="fa fa-caret-right"></i>表格</div>
  62. <div class="right-filter">
  63. <el-button-group>
  64. <el-button @click="changeForm('all')" size="small" :type="(filterForm.table=='all')?'primary':''">全部</el-button>
  65. <el-button @click="changeForm('today')" size="small" :type="(filterForm.table=='today')?'primary':''">今日</el-button>
  66. <el-button @click="changeForm('week')" size="small" :type="(filterForm.table=='week')?'primary':''">本周</el-button>
  67. <el-button @click="changeForm('month')" size="small" :type="(filterForm.table=='month')?'primary':''">当月</el-button>
  68. </el-button-group>
  69. </div>
  70. </div>
  71. </template>
  72. <el-table :data="table">
  73. <el-table-column label="排名" prop="sort"></el-table-column>
  74. <el-table-column label="会员" prop="name"></el-table-column>
  75. <el-table-column label="下单">
  76. <template #default="{row}">{{row.total}}笔</template>
  77. </el-table-column>
  78. <el-table-column label="金额">
  79. <template #default="{row}">¥{{row.money}}</template>
  80. </el-table-column>
  81. </el-table>
  82. </el-card>
  83. </div>
  84. <div class="card-container">
  85. <el-card shadow="always">
  86. <template #header>
  87. <div class="header">
  88. <div class="title"><i class="fa fa-caret-right"></i>柱状图</div>
  89. <div class="right-filter">
  90. <el-form :model="filterForm">
  91. <el-form-item label="统计时间" style="margin-bottom: 0;">
  92. <el-select v-model="filterForm.select" style="margin-right: 10px;width: 150px;" @change="changeForm(0)">
  93. <el-option label="第一项" value="one"></el-option>
  94. <el-option label="第二项" value="two"></el-option>
  95. <el-option label="第三项" value="three"></el-option>
  96. </el-select>
  97. <el-date-picker @change="changeForm(0)" v-model="filterForm.datepicker" style="width: 250px;" type="daterange" range-separator="到"></el-date-picker>
  98. </el-form-item>
  99. </el-form>
  100. </div>
  101. </div>
  102. </template>
  103. <div class="chart3" id="chart3"></div>
  104. </el-card>
  105. </div>
  106. </el-col>
  107. <el-col :md="6" :xs="24" :sm="24">
  108. <div class="card-container left">
  109. <el-card shadow="always">
  110. <div style="font-weight: bold;margin-bottom: 10px;">😀欢迎您,{:$auth->nickname}!</div>
  111. <el-alert type="success" :closable="false">行到水穷处,坐看云起时。在线乞讨公司,贵阳云起信息科技,跪求打赏😭</el-alert>
  112. <div class="pay">
  113. <img src="{:request()->domain()}/assets/img/pay.png">
  114. </div>
  115. </el-card>
  116. </div>
  117. <div class="card-container left">
  118. <el-card shadow="always">
  119. <template #header>
  120. <div class="header">
  121. <div class="title"><i class="fa fa-caret-right"></i>进度框样式</div>
  122. </div>
  123. </template>
  124. <el-row>
  125. <el-col :span="24">
  126. <div class="style-2">
  127. <div class="box">
  128. <el-progress type="circle" :percentage="order.percentage[0]"></el-progress>
  129. <div class="box-title">销售目标</div>
  130. <div class="box-number">{{order.count}}单/{{order.total}}单</div>
  131. </div>
  132. </div>
  133. </el-col>
  134. <el-col :span="24">
  135. <div class="style-3">
  136. <div class="box">
  137. <div class="box-title">今日销售额</div>
  138. <div class="box-content">
  139. <div class="box-content-left">
  140. <div class="box-number-top">¥{{order.today}}</div>
  141. <div class="box-number-bottom">昨日销售额:¥{{order.yestoday}}</div>
  142. </div>
  143. <div class="icon bkcolor3" v-if="order.percentage[1]<50">
  144. <i class="fa fa-arrow-down"></i>
  145. </div>
  146. <div class="icon bkcolor2" v-if="order.percentage[1]>=50 && order.percentage[1]<100">
  147. <i class="fa fa-arrow-down"></i>
  148. </div>
  149. <div class="icon bkcolor4" v-if="order.percentage[1]>=100">
  150. <i class="fa fa-arrow-up"></i>
  151. </div>
  152. </div>
  153. <el-progress v-if="order.percentage[1]<50" :percentage="order.percentage[1]" color="#F56C6C"></el-progress>
  154. <el-progress v-if="order.percentage[1]>=50 && order.percentage[1]<100" :percentage="order.percentage[1]" color="#E6A23C"></el-progress>
  155. <el-progress v-if="order.percentage[1]>=100" :percentage="order.percentage[1]" color="#45991b"></el-progress>
  156. </div>
  157. </div>
  158. </el-col>
  159. </el-row>
  160. </el-card>
  161. </div>
  162. <div class="card-container left">
  163. <el-card shadow="always">
  164. <template #header>
  165. <div class="header">
  166. <div class="title"><i class="fa fa-caret-right"></i>饼状图</div>
  167. </div>
  168. </template>
  169. <div class="chart2" id="chart2"></div>
  170. </el-card>
  171. </div>
  172. </el-col>
  173. </el-row>
  174. </div>
  175. </template>
  176. <script>
  177. export default{
  178. data:{
  179. echarts:'',
  180. panel:[],
  181. line:{
  182. date:[],
  183. data:[]
  184. },
  185. table:[],
  186. bar:{
  187. date:[],
  188. name:[],
  189. data:[]
  190. },
  191. pie:[],
  192. order:{
  193. percentage:[0,0]
  194. },
  195. filterForm:{
  196. table:'all',
  197. select:'one',
  198. datepicker:['2023-01-01','2023-02-01'],
  199. }
  200. },
  201. onLoad:function (){
  202. Yunqi.use('/assets/js/echarts.min.js').then(res=>{
  203. this.echarts=res;
  204. this.parseData();
  205. });
  206. },
  207. methods:{
  208. parseData:function (){
  209. Yunqi.ajax.get('dashboard/index',{}).then(res=>{
  210. this.panel=res.panel;
  211. this.line=res.line;
  212. this.table=res.table;
  213. this.bar=res.bar;
  214. this.pie=res.pie;
  215. this.order=res.order;
  216. this.chart1();
  217. this.chart2();
  218. this.chart3();
  219. });
  220. },
  221. chart1:function () {
  222. let mychart = this.echarts.init(document.getElementById('chart1'), 'walden');
  223. mychart.setOption({
  224. title: {text: '每日新增用户数',left: 'center'},
  225. tooltip: {
  226. trigger: 'axis'
  227. },
  228. toolbox: {
  229. show: false,
  230. feature: {
  231. magicType: {show: true, type: ['stack', 'tiled']},
  232. saveAsImage: {show: true}
  233. }
  234. },
  235. xAxis: {
  236. type: 'category',
  237. boundaryGap: false,
  238. data: this.line.date
  239. },
  240. yAxis: {},
  241. grid: [{
  242. left: 40,
  243. top: 40,
  244. right: 0,
  245. bottom:30
  246. }],
  247. series: [{
  248. name: '注册用户',
  249. type: 'line',
  250. smooth: true,
  251. areaStyle: {
  252. normal: {}
  253. },
  254. lineStyle: {
  255. normal: {
  256. width: 1.5
  257. }
  258. },
  259. data: this.line.data
  260. }]
  261. });
  262. window.addEventListener('resize',()=>{
  263. mychart.resize();
  264. });
  265. },
  266. chart2:function (){
  267. let mychart = this.echarts.init(document.getElementById('chart2'))
  268. mychart.setOption({
  269. title: {text: '消费比例图',left: 'center'},
  270. legend: {
  271. orient: 'horizontal',
  272. bottom: 0,
  273. },
  274. series: [{
  275. type: 'pie',
  276. data:this.pie,
  277. label: {
  278. normal: {
  279. show: true,
  280. formatter: "¥{c}",
  281. }
  282. }
  283. }]
  284. });
  285. window.addEventListener('resize',()=>{
  286. mychart.resize();
  287. });
  288. },
  289. chart3:function (){
  290. let mychart = this.echarts.init(document.getElementById('chart3'))
  291. mychart.setOption({
  292. title: {text: '消费日历图',left: 'center'},
  293. legend: {
  294. orient: 'vertical',
  295. left: 'left',
  296. },
  297. yAxis: {},
  298. xAxis: {
  299. data: this.bar.date
  300. },
  301. grid: [{
  302. left: 100,
  303. top: 40,
  304. right: 40,
  305. bottom:20
  306. }],
  307. series: [
  308. {
  309. type: 'bar',
  310. name:this.bar.name[0],
  311. data: this.bar.data[0]
  312. },
  313. {
  314. type: 'bar',
  315. name:this.bar.name[1],
  316. data: this.bar.data[1]
  317. },
  318. {
  319. type: 'bar',
  320. name:this.bar.name[2],
  321. data: this.bar.data[2]
  322. }
  323. ]
  324. });
  325. window.addEventListener('resize',()=>{
  326. mychart.resize();
  327. });
  328. },
  329. changeForm:function (type){
  330. if(type){
  331. this.filterForm.table=type;
  332. }
  333. this.parseData();
  334. }
  335. }
  336. }
  337. </script>
  338. <style>
  339. .pay{
  340. text-align: center;
  341. padding: 10px;
  342. }
  343. .pay img{
  344. width: 180px;
  345. height: 180px;
  346. }
  347. .card-container{
  348. margin-bottom: 10px;
  349. }
  350. .card-container.left{
  351. padding-right: 10px;
  352. }
  353. @media screen and (max-width: 992px) {
  354. .card-container.left{
  355. padding-right: 0;
  356. }
  357. }
  358. .card-container .el-card__header{
  359. padding: 8px 20px;
  360. }
  361. .card-container .header{
  362. display: flex;
  363. justify-content: space-between;
  364. align-items: center;
  365. }
  366. .card-container .el-card__header .title{
  367. font-weight: bold;
  368. font-size: 14px;
  369. display: flex;
  370. align-items: center;
  371. }
  372. .card-container .el-card__header .title i{
  373. font-size: 22px;
  374. color: var(--el-color-primary);
  375. margin-right: 8px;
  376. }
  377. .style-1{
  378. display: flex;
  379. justify-content: space-between;
  380. align-items: center;
  381. padding: 10px;
  382. border-radius: 6px;
  383. width: 87%;
  384. margin:0 auto 10px;
  385. color: #fff;
  386. }
  387. .style-1 i{
  388. font-size: 42px;
  389. color: #fff;
  390. }
  391. .style-2{
  392. padding: 10px;
  393. width: 87%;
  394. margin:0 auto;
  395. text-align: center;
  396. }
  397. .style-3{
  398. padding: 10px;
  399. width: 87%;
  400. margin:0 auto;
  401. text-align: center;
  402. }
  403. .style-3 .box-title{
  404. text-align: left;
  405. }
  406. .style-3 .box{
  407. height: 190px;
  408. display: flex;
  409. flex-direction: column;
  410. justify-content: space-around;
  411. }
  412. .style-3 .box-content-left{
  413. text-align: left;
  414. }
  415. .style-3 .box-number-top{
  416. font-size: 26px;
  417. }
  418. .style-3 .box-number-bottom{
  419. color: darkgrey;
  420. }
  421. .style-3 .box-content{
  422. display: flex;
  423. justify-content: space-between;
  424. align-items: center;
  425. }
  426. .style-3 .icon{
  427. color: #fff;
  428. width: 60px;
  429. height: 60px;
  430. line-height: 60px;
  431. text-align: center;
  432. font-size: 32px;
  433. }
  434. .box .box-title{
  435. font-size: 18px;
  436. }
  437. .bkcolor1{
  438. background: linear-gradient(to right,var(--el-color-primary-light-3),var(--el-color-primary));
  439. }
  440. .bkcolor2{
  441. background: linear-gradient(to right,var(--el-color-warning-light-3),var(--el-color-warning));
  442. }
  443. .bkcolor3{
  444. background: linear-gradient(to right,var(--el-color-danger-light-3),var(--el-color-danger));
  445. }
  446. .bkcolor4{
  447. background: linear-gradient(to right,var(--el-color-success-light-3),var(--el-color-success));
  448. }
  449. .chart1{
  450. width: 100%;
  451. height: 305px;
  452. }
  453. .chart2{
  454. width: 100%;
  455. height: 310px;
  456. margin: 0 auto;
  457. }
  458. .chart3{
  459. width: 100%;
  460. height: 300px;
  461. }
  462. </style>