welcome.blade.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393
  1. @extends('admin.layout-content')
  2. @section('header')
  3. <script src="https://cdn.jsdelivr.net/npm/echarts@4.9.0/dist/echarts.min.js"></script>
  4. <style>
  5. .sg-top-card {
  6. color: #87888A;
  7. }
  8. .sg-top-card .layui-card-body {
  9. display: flex;
  10. align-items: center;
  11. justify-content: space-between;
  12. }
  13. .sg-top-card .sg-top-left {
  14. display: flex;
  15. align-items: flex-end;
  16. }
  17. .sg-top-card .sg-top-left .sg-name {
  18. margin-left: 30px;
  19. }
  20. .sg-top-card .sg-top-left .sg-avatar {
  21. width: 50px;
  22. height: 50px;
  23. }
  24. .sg-top-right .sg-list {
  25. display: flex;
  26. align-items: center;
  27. }
  28. .sg-top-right .sg-list .sg-item {
  29. text-align: center;
  30. }
  31. .sg-divider {
  32. border-left: 1px solid rgba(233, 233, 233, 100);
  33. height: 30px;
  34. }
  35. .sg-top-right .sg-list .sg-item {
  36. margin: 15px;
  37. }
  38. .sg-top-right .sg-list .sg-item .sg-name {
  39. margin-top: 15px;
  40. }
  41. .sg-top-right .sg-list .sg-item .sg-name span {
  42. font-size: 2rem;
  43. font-weight: bold;
  44. color: rgba(38, 38, 38, 100);
  45. }
  46. .sg-project-list {
  47. display: flex;
  48. flex-wrap: wrap;
  49. }
  50. .sg-project-list .sg-item {
  51. width: 33%;
  52. border-top: 1px solid #e9e9e9;
  53. border-right: 1px solid #e9e9e9;
  54. padding: 15px;
  55. box-sizing: border-box;
  56. }
  57. .sg-project-list .sg-item:nth-child(3n) {
  58. border-right-width: 0;
  59. }
  60. .sg-project-list .sg-item .sg-header,
  61. .sg-project-list .sg-item .sg-footer {
  62. display: flex;
  63. align-items: center;
  64. justify-content: space-between;
  65. }
  66. .sg-project-list .sg-item .sg-desp {
  67. margin: 15px 0;
  68. }
  69. .sg-project-list .sg-item .sg-footer {
  70. color: #87888A;
  71. }
  72. .sg-project-header {
  73. display: flex;
  74. align-items: center;
  75. justify-content: space-between;
  76. }
  77. .sg-project-header .sg-right {
  78. color: #1990FF;
  79. }
  80. .sg-quick-list {
  81. display: flex;
  82. align-items: center;
  83. justify-content: space-around;
  84. color: #101010;
  85. }
  86. .sg-quick-list .sg-quick-item .sg-icon,
  87. .sg-quick-list .sg-quick-item {
  88. display: flex;
  89. flex-direction: column;
  90. align-items: center;
  91. justify-content: center;
  92. }
  93. .sg-quick-list .sg-quick-item .sg-icon {
  94. border-radius: 50%;
  95. height: 50px;
  96. width: 50px;
  97. line-height: 50px;
  98. color: white;
  99. }
  100. .sg-quick-list .sg-quick-item .sg-name {
  101. margin-top: 10px;
  102. font-size: 0.8rem;
  103. }
  104. .sg-icon.sg-create {
  105. background: #3894FF;
  106. }
  107. .sg-icon.sg-draft {
  108. background: #85888E;
  109. }
  110. .sg-icon.sg-point {
  111. background: #E29836;
  112. }
  113. .sg-icon.sg-revise {
  114. background: #4CA3AD;
  115. }
  116. .sg-zone-list .sg-zone-item {
  117. display: flex;
  118. align-items: center;
  119. width: 100%;
  120. color: #505559;
  121. margin: 15px 0;
  122. }
  123. .sg-zone-list .sg-zone-item .sg-process-bar {
  124. background: #0095D8;
  125. height: 16px;
  126. border-radius: 8px;
  127. margin: 0 15px;
  128. }
  129. .sg-zone-list .sg-zone-item .sg-process {
  130. display: flex;
  131. align-items: center;
  132. }
  133. .sg-zone-list .sg-zone-item .sg-zone-name {
  134. width: 100px;
  135. }
  136. .sg-project-2-list {
  137. display: flex;
  138. flex-wrap: wrap;
  139. }
  140. .sg-project-2-list .sg-item {
  141. display: flex;
  142. align-items: center;
  143. justify-content: space-around;
  144. flex-direction: column;
  145. margin: 20px;
  146. padding: 20px;
  147. width: calc(50% - 40px);
  148. box-sizing: border-box;
  149. color: white;
  150. border-radius: 20px;
  151. }
  152. .sg-project-2-list .sg-item div:first-child {
  153. margin-bottom: 20px;
  154. }
  155. .sg-gray-bg {
  156. background: grey;
  157. }
  158. .sg-font-lg {
  159. font-size: 2rem;
  160. }
  161. </style>
  162. @endsection
  163. @section('content')
  164. <div class="sg-index-container">
  165. <div class="layui-card sg-top-card">
  166. <div class="layui-card-body">
  167. <div class="sg-top-left">
  168. <img src="/images/avatar.png" class="sg-avatar">
  169. <div class="sg-name">{{ $_user->name }}|管理员</div>
  170. </div>
  171. <div class="sg-top-right">
  172. <div class="sg-list">
  173. <div class="sg-item">
  174. <div class="sg-label">项目数</div>
  175. <div class="sg-name">
  176. <span>{{$total_project}}</span>
  177. </div>
  178. </div>
  179. <div class="sg-item">
  180. <div class="sg-divider"></div>
  181. </div>
  182. <div class="sg-item">
  183. <div class="sg-label">内部设备总数</div>
  184. <div class="sg-name">
  185. <span>{{$total_device}}</span>
  186. </div>
  187. </div>
  188. <div class="sg-item">
  189. <div class="sg-divider"></div>
  190. </div>
  191. <div class="sg-item">
  192. <div class="sg-label">累计花费总金额</div>
  193. <div class="sg-name">
  194. <span>{{$total_money}}</span>
  195. </div>
  196. </div>
  197. </div>
  198. </div>
  199. </div>
  200. </div>
  201. <div class="layui-row layui-col-space15">
  202. <div class="layui-col-xs12 layui-col-sm12 layui-col-md8">
  203. <div class="layui-card">
  204. <div class="layui-card-header">项目数据一览图</div>
  205. <div class="layui-card-body">
  206. <div id="my-chart" style="width: 100%;height:400px;"></div>
  207. </div>
  208. </div>
  209. <div class="layui-card">
  210. <div class="layui-card-header">
  211. <div class="sg-project-header">
  212. <div class="sg-left">待授权用户</div>
  213. <a class="sg-right" href="/admin/UserAuth/index">全部待授权用户</a>
  214. </div>
  215. </div>
  216. <div class="layui-card-body">
  217. <div class="sg-list sg-project-list">
  218. @foreach($user_auths as $item)
  219. <a class="sg-item" href="/admin/UserAuth/index">
  220. <div class="sg-header">
  221. <h3 class="sg-name">
  222. <b>{{ $item->name }}</b>
  223. </h3>
  224. <span class="layui-badge layui-bg-orange">待授权</span>
  225. </div>
  226. <div class="sg-desp">{{ $item->remark }}</div>
  227. <div class="sg-footer">
  228. <div class="sg-zone">{{ $item->project ? $item->project->name : '' }}</div>
  229. <div class="sg-date">{{ substr($item->updated_at, 0, 10) }}</div>
  230. </div>
  231. </a>
  232. @endforeach
  233. </div>
  234. </div>
  235. </div>
  236. </div>
  237. <div class="layui-col-xs12 layui-col-sm12 layui-col-md4">
  238. <div class="layui-card">
  239. <div class="layui-card-header">快速开始 / 便捷导航</div>
  240. <div class="layui-card-body">
  241. <div class="sg-quick-list">
  242. <a class="sg-quick-item" href="/admin/UserAuth/index">
  243. <div class="sg-icon sg-create"><i class="iconfont iconbi"></i></div>
  244. <div class="sg-name">用户授权</div>
  245. </a>
  246. <a class="sg-quick-item" href="/admin/InnerDevice/index">
  247. <div class="sg-icon sg-draft"><i class="iconfont iconyouxiang"></i></div>
  248. <div class="sg-name">设备管理</div>
  249. </a>
  250. <a class="sg-quick-item" href="/admin/Project/index">
  251. <div class="sg-icon sg-point"><i class="iconfont iconxingxing"></i></div>
  252. <div class="sg-name">项目管理</div>
  253. </a>
  254. <a class="sg-quick-item" href="#">
  255. <div class="sg-icon sg-revise"><i class="iconfont iconduihao"></i></div>
  256. <div class="sg-name">尽情期待</div>
  257. </a>
  258. </div>
  259. </div>
  260. </div>
  261. <div class="layui-card">
  262. <div class="layui-card-header">用户人数</div>
  263. <div class="layui-card-body">
  264. <div class="sg-zone-list">
  265. <div class="sg-zone-item">
  266. <div class="sg-zone-name">注册总人数</div>
  267. <div class="sg-process">
  268. <div class="sg-process-bar" style="width: 100px"></div>
  269. <div class="sg-total">{{ $users_total }}个</div>
  270. </div>
  271. </div>
  272. <div class="sg-zone-item">
  273. <div class="sg-zone-name">待授权人数</div>
  274. <div class="sg-process">
  275. <div class="sg-process-bar" style="width: {{ $users_not_auth_total / $users_total * 100 }}px"></div>
  276. <div class="sg-total">{{ $users_not_auth_total }}个</div>
  277. </div>
  278. </div>
  279. </div>
  280. </div>
  281. </div>
  282. <div class="layui-card">
  283. <div class="layui-card-header">内部设备情况</div>
  284. <div class="layui-card-body">
  285. <div class="sg-project-2-list">
  286. <div class="sg-item sg-device-card sg-green-bg">
  287. <div>闲置</div>
  288. <div class="sg-font-lg">{{ $device_stat['free'] }}</div>
  289. </div>
  290. <div class="sg-item sg-device-card sg-red-bg">
  291. <div>在用</div>
  292. <div class="sg-font-lg">{{ $device_stat['using'] }}</div>
  293. </div>
  294. <div class="sg-item sg-device-card sg-orange-bg">
  295. <div>维修</div>
  296. <div class="sg-font-lg">{{ $device_stat['repair'] }}</div>
  297. </div>
  298. <div class="sg-item sg-device-card sg-gray-bg">
  299. <div>报废</div>
  300. <div class="sg-font-lg">{{ $device_stat['scrap'] }}</div>
  301. </div>
  302. </div>
  303. </div>
  304. </div>
  305. </div>
  306. </div>
  307. </div>
  308. @endsection
  309. @section('footer')
  310. <script>
  311. $(function() {
  312. var myChart = echarts.init(document.getElementById('my-chart'));
  313. $.ajax({
  314. method: 'POST',
  315. url: '/admin/Project/getStat',
  316. headers: {
  317. 'X-CSRF-TOKEN': '{{ csrf_token() }}'
  318. },
  319. data: {},
  320. success: function (data) {
  321. if(data.status === 'success') {
  322. // console.log(data.data);
  323. updateChart(data.data);
  324. }
  325. },
  326. error: function () {
  327. }
  328. });
  329. function updateChart(data) {
  330. // 指定图表的配置项和数据
  331. var option = {
  332. color: ['#71D4D4', '#C3B6E6'],
  333. legend: {
  334. data: ['订单数', '订单金额']
  335. },
  336. tooltip: {},
  337. xAxis: [
  338. {
  339. type: 'category',
  340. data: data['names']
  341. }
  342. ],
  343. yAxis: [{
  344. type: 'value',
  345. name: '订单数',
  346. splitLine: {
  347. show: false
  348. }
  349. }, {
  350. type: 'value',
  351. name: '订单金额',
  352. splitLine: {
  353. show: false
  354. }
  355. }],
  356. // Declare several bar series, each will be mapped
  357. // to a column of dataset.source by default.
  358. series: [
  359. {
  360. name: '订单数',
  361. type: 'bar',
  362. label: {
  363. show: true,
  364. position: 'top'
  365. },
  366. data: data.data[0]
  367. },
  368. {
  369. name: '订单金额',
  370. type: 'bar',
  371. label: {
  372. show: true,
  373. position: 'top'
  374. },
  375. yAxisIndex: 1,
  376. data: data.data[1]
  377. }
  378. ]
  379. };
  380. // 使用刚指定的配置项和数据显示图表。
  381. myChart.setOption(option);
  382. }
  383. })
  384. </script>
  385. @endsection