index.html 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  1. {include file="/shopro/common/script" /}
  2. <script src="__CDN__/assets/addons/shopro/libs/echarts.min.js?v={$site.version|htmlentities}"></script>
  3. <style>
  4. .dashboard-index .panel-block {
  5. /* background: #f1f4f6; */
  6. }
  7. .dashboard-index .dashboard-index-main {
  8. --el-main-padding: 0;
  9. }
  10. .dashboard-index .el-scrollbar__wrap {
  11. overflow-x: hidden;
  12. }
  13. .dashboard-index .el-scrollbar__bar.is-horizontal {
  14. display: none;
  15. }
  16. .dashboard-index #userTotal,
  17. .dashboard-index #agentTotal,
  18. .dashboard-index #shareTotal {
  19. width: 100%;
  20. height: 66px;
  21. }
  22. .dashboard-index .card {
  23. line-height: 1;
  24. background: var(--sa-background-assist);
  25. border-radius: 8px;
  26. border: 1px solid var(--sa-space);
  27. box-shadow: 0 2px 6px rgb(140 140 140 / 12%);
  28. padding: 12px;
  29. font-size: 12px;
  30. color: var(--sa-font);
  31. margin-bottom: 20px;
  32. }
  33. .dashboard-index .card:hover {
  34. transition: all .2s;
  35. }
  36. @media screen and (min-width: 1200px) {
  37. .dashboard-index .scale-card:hover {
  38. transform: scale(1.05);
  39. }
  40. }
  41. .dashboard-index .card .card-title .left {
  42. font-size: 14px;
  43. color: var(--sa-subtitle);
  44. }
  45. .dashboard-index .card .card-title .left .num {
  46. font-size: 16px;
  47. }
  48. .dashboard-index .card .card-footer {
  49. margin-top: 12px;
  50. }
  51. .dashboard-index .card .card-footer .left {
  52. margin-right: 8px;
  53. }
  54. .dashboard-index .card .card-footer .dot {
  55. width: 6px;
  56. height: 6px;
  57. border-radius: 50%;
  58. display: inline-block;
  59. margin-right: 8px;
  60. }
  61. .dashboard-index .bar-card {
  62. min-height: 358px;
  63. }
  64. .dashboard-index #chartContent {
  65. width: 100%;
  66. height: 296px;
  67. }
  68. .dashboard-index .tab-item {
  69. height: 32px;
  70. line-height: 32px;
  71. margin-right: 20px;
  72. font-size: 14px;
  73. color: var(--sa-subfont);
  74. cursor: pointer;
  75. }
  76. .dashboard-index .tab-item:last-of-type {
  77. margin-right: 0;
  78. }
  79. .dashboard-index .tab-item.is-active {
  80. color: var(--sa-subtitle);
  81. font-weight: bold;
  82. }
  83. @media only screen and (max-width: 768px) {
  84. .dashboard-index .date-time .el-date-editor {
  85. --el-date-editor-datetimerange-width: 320px;
  86. }
  87. }
  88. .dashboard-index .chart-card {
  89. height: 106px;
  90. color: var(--sa-subfont);
  91. }
  92. .dashboard-index .chart-card .card-icon {
  93. width: 24px;
  94. height: 24px;
  95. }
  96. .dashboard-index .chart-card .num {
  97. font-size: 24px;
  98. color: var(--sa-subtitle);
  99. }
  100. .dashboard-index .chart-card .warning {
  101. color: var(--el-color-warning);
  102. }
  103. .dashboard-index .goods-card,
  104. .dashboard-index .hot-search-card {
  105. height: 326px;
  106. }
  107. .dashboard-index .goods-card .header,
  108. .dashboard-index .hot-search-card .header {
  109. line-height: 16px;
  110. font-size: 14px;
  111. color: var(--sa-subtitle);
  112. margin-bottom: 16px;
  113. }
  114. .dashboard-index .top {
  115. width: 18px;
  116. height: 20px;
  117. }
  118. .dashboard-index #rankingContent {
  119. width: 192px;
  120. height: 192px;
  121. }
  122. </style>
  123. <div id="index" class="dashboard-index panel panel-default panel-intro" v-cloak>
  124. <el-container class="panel-block">
  125. <el-main class="dashboard-index-main">
  126. <el-scrollbar height="100%">
  127. {if $auth->check('shopro/dashboard/total')}
  128. <el-row :gutter="20">
  129. <!-- -- commission code start -- -->
  130. <!--<el-col :xs="24" :sm="24" :md="8" :lg="8" :xl="8">
  131. <div class="scale-card card ">
  132. <div class="card-title sa-flex sa-row-between">
  133. <div class="left">{{state.total.user.title}} <span
  134. class="num">{{state.total.user.data.total}}</span> </div>
  135. <div>{{state.total.user.tip}} <span>{{state.total.user.data.today}}</span> </div>
  136. </div>
  137. <div id="userTotal"></div>
  138. <div class="card-footer sa-flex">
  139. <span class="left sa-flex">
  140. <span class="dot" :style="{ background: state.total.user.color }"></span>
  141. <span>{{ state.total.user.footer }}</span>
  142. </span>
  143. <span>{{ state.total.user.data.week }}</span>
  144. </div>
  145. </div>
  146. </el-col>
  147. <el-col :xs="24" :sm="24" :md="8" :lg="8" :xl="8">
  148. <div class="scale-card card ">
  149. <div class="card-title sa-flex sa-row-between">
  150. <div class="left">{{state.total.agent.title}} <span
  151. class="num">{{state.total.agent.data.total}}</span> </div>
  152. <div>{{state.total.agent.tip}} <span>{{state.total.agent.data.today}}</span> </div>
  153. </div>
  154. <div id="agentTotal"></div>
  155. <div class="card-footer sa-flex">
  156. <span class="left sa-flex">
  157. <span class="dot" :style="{ background: state.total.agent.color }"></span>
  158. <span>{{ state.total.agent.footer }}</span>
  159. </span>
  160. <span>{{ state.total.agent.data.week }}</span>
  161. </div>
  162. </div>
  163. </el-col>
  164. <el-col :xs="24" :sm="24" :md="8" :lg="8" :xl="8">
  165. <div class="scale-card card ">
  166. <div class="card-title sa-flex sa-row-between">
  167. <div class="left">{{state.total.share.title}} <span
  168. class="num">{{state.total.share.data.total}}</span> </div>
  169. <div>{{state.total.share.tip}} <span>{{state.total.share.data.today}}</span> </div>
  170. </div>
  171. <div id="shareTotal"></div>
  172. <div class="card-footer sa-flex">
  173. <span class="left sa-flex">
  174. <span class="dot" :style="{ background: state.total.share.color }"></span>
  175. <span>{{ state.total.share.footer }}</span>
  176. </span>
  177. <span>{{ state.total.share.data.week }}</span>
  178. </div>
  179. </div>
  180. </el-col>-->
  181. <!-- -- commission code end -- -->
  182. <!-- <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  183. <div class="scale-card card ">
  184. <div class="card-title sa-flex sa-row-between">
  185. <div class="left">{{state.total.user.title}} <span
  186. class="num">{{state.total.user.data.total}}</span> </div>
  187. <div>{{state.total.user.tip}} <span>{{state.total.user.data.today}}</span> </div>
  188. </div>
  189. <div id="userTotal"></div>
  190. <div class="card-footer sa-flex">
  191. <span class="left sa-flex">
  192. <span class="dot" :style="{ background: state.total.user.color }"></span>
  193. <span>{{ state.total.user.footer }}</span>
  194. </span>
  195. <span>{{ state.total.user.data.week }}</span>
  196. </div>
  197. </div>
  198. </el-col>
  199. <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  200. <div class="scale-card card ">
  201. <div class="card-title sa-flex sa-row-between">
  202. <div class="left">{{state.total.share.title}} <span
  203. class="num">{{state.total.share.data.total}}</span> </div>
  204. <div>{{state.total.share.tip}} <span>{{state.total.share.data.today}}</span> </div>
  205. </div>
  206. <div id="shareTotal"></div>
  207. <div class="card-footer sa-flex">
  208. <span class="left sa-flex">
  209. <span class="dot" :style="{ background: state.total.share.color }"></span>
  210. <span>{{ state.total.share.footer }}</span>
  211. </span>
  212. <span>{{ state.total.share.data.week }}</span>
  213. </div>
  214. </div>
  215. </el-col> -->
  216. </el-row>
  217. {/if}
  218. {if $auth->check('shopro/dashboard/chart')}
  219. <el-row :gutter="20">
  220. <el-col :xs="24" :sm="24" :md="24" :lg="16" :xl="16">
  221. <div class="bar-card card">
  222. <div class="sa-flex sa-row-between sa-flex-wrap">
  223. <div class="sa-flex">
  224. <div class="tab-item" :class="chart.tabActive == key ? 'is-active' : ''"
  225. v-for="(value, key) in chart.tabsData" :key="key"
  226. @click="onChangeTabActive(key)">
  227. {{ value }}
  228. </div>
  229. </div>
  230. <div class="date-time">
  231. <el-date-picker v-model="chart.dateTime" type="datetimerange"
  232. value-format="YYYY-MM-DD HH:mm:ss" format="YYYY-MM-DD HH:mm:ss"
  233. :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 2, 1, 23, 59, 59)]"
  234. range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"
  235. :shortcuts="chart.shortcuts" @change="onChangeDateTime" :editable="false">
  236. </el-date-picker>
  237. </div>
  238. </div>
  239. <div id="chartContent"></div>
  240. </div>
  241. </el-col>
  242. <el-col :xs="24" :sm="24" :md="24" :lg="8" :xl="8">
  243. <el-row :gutter="20">
  244. <el-col :xs="12" :sm="8" :md="12" :lg="12" :xl="12" v-for="(value, key) in statistics"
  245. :key="key">
  246. <div class="chart-card scale-card card">
  247. <div class="sa-flex sa-row-between mb-2">
  248. <img class="card-icon"
  249. :src="`/assets/addons/shopro/img/dashboard/${key}.png`" />
  250. <div class="sa-flex" @click="onOpen(value.status)">
  251. <el-button type="info" link size="small">详情
  252. <el-icon class="ml-1">
  253. <arrow-right />
  254. </el-icon>
  255. </el-button>
  256. </div>
  257. </div>
  258. <div class="num mb-1">{{ value.num }}</div>
  259. <div class="sa-flex sa-row-between">
  260. <span>{{ value.text }}</span>
  261. <el-popover popper-class="sa-popper" placement="top" trigger="hover"
  262. :content="value.tip">
  263. <template #reference>
  264. <el-icon class="warning">
  265. <Warning />
  266. </el-icon>
  267. </template>
  268. </el-popover>
  269. </div>
  270. </div>
  271. </el-col>
  272. </el-row>
  273. </el-col>
  274. </el-row>
  275. {/if}
  276. {if $auth->check('shopro/dashboard/ranking')}
  277. <el-row :gutter="20">
  278. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
  279. <div class="goods-card card">
  280. <div class="header">
  281. <span>销量榜</span>
  282. </div>
  283. <el-table class="sa-table" :data="ranking.goods" stripe>
  284. <el-table-column label="排名" width="60" align="center">
  285. <template #default="scope">
  286. <img class="top"
  287. :src="`/assets/addons/shopro/img/dashboard/top${scope.$index + 1}.png`" />
  288. </template>
  289. </el-table-column>
  290. <el-table-column label="名称" min-width="200">
  291. <template #default="scope">
  292. <div class="sa-flex">
  293. <sa-image :url="scope.row.image" size="20"></sa-image>
  294. <div class="ml-2 sa-table-line-1">
  295. {{ scope.row.title || '-' }}
  296. </div>
  297. </div>
  298. </template>
  299. </el-table-column>
  300. <el-table-column label="销量" width="100">
  301. <template #default="scope">
  302. <div class="sa-table-line-1">
  303. {{ scope.row.real_sales || '-' }}
  304. </div>
  305. </template>
  306. </el-table-column>
  307. </el-table>
  308. </div>
  309. </el-col>
  310. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
  311. <div class="hot-search-card card">
  312. <div class="header">
  313. <span>热搜榜</span>
  314. </div>
  315. <el-row :gutter="16">
  316. <el-col :xs="24" :sm="24" :md="16" :lg="16" :xl="16">
  317. <el-table class="sa-table" :data="ranking.hot_search" stripe>
  318. <el-table-column label="排名" width="60" align="center">
  319. <template #default="scope">
  320. <img class="top"
  321. :src="`/assets/addons/shopro/img/dashboard/top${scope.$index + 1}.png`" />
  322. </template>
  323. </el-table-column>
  324. <el-table-column label="名称" min-width="200">
  325. <template #default="scope">
  326. <div class="sa-table-line-1">
  327. {{ scope.row.keyword || '-' }}
  328. </div>
  329. </template>
  330. </el-table-column>
  331. <el-table-column label="搜索量(次)" width="100">
  332. <template #default="scope">
  333. <div class="sa-table-line-1">
  334. {{ scope.row.num }}
  335. </div>
  336. </template>
  337. </el-table-column>
  338. </el-table>
  339. </el-col>
  340. <el-col :xs="24" :sm="24" :md="8" :lg="8" :xl="8">
  341. <div class="sa-flex sa-row-center">
  342. <div id="rankingContent"></div>
  343. </div>
  344. </el-col>
  345. </el-row>
  346. </div>
  347. </el-col>
  348. </el-row>
  349. {/if}
  350. </el-scrollbar>
  351. </el-main>
  352. </el-container>
  353. </div>