welcome.blade.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455
  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. #sg-search-form .layui-form-item .layui-inline {
  162. margin-bottom: 0;
  163. }
  164. </style>
  165. @endsection
  166. @section('content')
  167. <div class="sg-index-container">
  168. <div class="layui-card sg-top-card">
  169. <div class="layui-card-body">
  170. <div class="sg-top-left">
  171. <img src="/images/avatar.png" class="sg-avatar">
  172. <?php
  173. $admin_role_id = $_user->admin_role_id;
  174. $admin_role_name = \App\Models\AdminRoleModel::where('id',$admin_role_id)->value('name');
  175. ?>
  176. <div class="sg-name">{{ $_user->name }}|{{$admin_role_name}}</div>
  177. </div>
  178. <div class="sg-top-right">
  179. <div class="sg-list">
  180. <div class="sg-item">
  181. <div class="sg-label">项目数</div>
  182. <div class="sg-name">
  183. <span>{{$total_project-1}}</span>
  184. </div>
  185. </div>
  186. <div class="sg-item">
  187. <div class="sg-divider"></div>
  188. </div>
  189. <div class="sg-item">
  190. <div class="sg-label">内部设备总数</div>
  191. <div class="sg-name">
  192. <span>{{$total_device}}</span>
  193. </div>
  194. </div>
  195. <div class="sg-item">
  196. <div class="sg-divider"></div>
  197. </div>
  198. <div class="sg-item">
  199. <div class="sg-label">累计花费总金额</div>
  200. <div class="sg-name">
  201. <span>{{$total_money}}</span>
  202. </div>
  203. </div>
  204. </div>
  205. </div>
  206. </div>
  207. </div>
  208. <div class="layui-row layui-col-space15">
  209. <div class="layui-col-xs12 layui-col-sm12 layui-col-md8">
  210. <div class="layui-card">
  211. <div class="layui-card-header" style="display: flex; align-items: center; justify-content: space-between">
  212. <div>项目数据一览图(鼠标滑动缩放)</div>
  213. <form class="layui-form" id="sg-search-form">
  214. <div class="layui-form-item layui-row" style="margin-bottom: 0;">
  215. <div class="layui-inline">
  216. <div class="layui-input-inline">
  217. <select name="year">
  218. @foreach($year_options as $option)
  219. <option value="{{ $option['id'] }}" {{ $select_year == $option['id'] ? 'selected' : '' }}>{{ $option['name'] }}</option>
  220. @endforeach
  221. </select>
  222. </div>
  223. </div>
  224. <div class="layui-inline">
  225. <div class="layui-input-inline">
  226. <select name="month">
  227. @foreach($month_options as $option)
  228. <option value="{{ $option['id'] }}" {{ $select_month == $option['id'] ? 'selected' : '' }}>{{ $option['name'] }}</option>
  229. @endforeach
  230. </select>
  231. </div>
  232. </div>
  233. </div>
  234. </form>
  235. </div>
  236. <div class="layui-card-body" >
  237. <div id="my-chart" style="width: 100%;height:400px;"></div>
  238. </div>
  239. </div>
  240. <div class="layui-card">
  241. <div class="layui-card-header">
  242. <div class="sg-project-header">
  243. <div class="sg-left">待授权用户</div>
  244. <a class="sg-right" href="/admin/UserAuth/index">全部待授权用户</a>
  245. </div>
  246. </div>
  247. <div class="layui-card-body">
  248. <div class="sg-list sg-project-list">
  249. @foreach($user_auths as $item)
  250. <a class="sg-item" href="/admin/UserAuth/index">
  251. <div class="sg-header">
  252. <h3 class="sg-name">
  253. <b>{{ $item->name }}</b>
  254. </h3>
  255. <span class="layui-badge layui-bg-orange">待授权</span>
  256. </div>
  257. <div class="sg-desp">{{ $item->remark }}</div>
  258. <div class="sg-footer">
  259. <div class="sg-zone">{{ $item->project ? $item->project->name : '' }}</div>
  260. <div class="sg-date">{{ substr($item->updated_at, 0, 10) }}</div>
  261. </div>
  262. </a>
  263. @endforeach
  264. </div>
  265. </div>
  266. </div>
  267. </div>
  268. <div class="layui-col-xs12 layui-col-sm12 layui-col-md4">
  269. <div class="layui-card">
  270. <div class="layui-card-header">快速开始 / 便捷导航</div>
  271. <div class="layui-card-body">
  272. <div class="sg-quick-list">
  273. <a class="sg-quick-item" href="/admin/UserAuth/index">
  274. <div class="sg-icon sg-create"><i class="iconfont iconbi"></i></div>
  275. <div class="sg-name">用户授权</div>
  276. </a>
  277. <a class="sg-quick-item" href="/admin/InnerDevice/index">
  278. <div class="sg-icon sg-draft"><i class="iconfont iconyouxiang"></i></div>
  279. <div class="sg-name">设备管理</div>
  280. </a>
  281. <a class="sg-quick-item" href="/admin/Project/index">
  282. <div class="sg-icon sg-point"><i class="iconfont iconxingxing"></i></div>
  283. <div class="sg-name">项目管理</div>
  284. </a>
  285. <a class="sg-quick-item" href="#">
  286. <div class="sg-icon sg-revise"><i class="iconfont iconduihao"></i></div>
  287. <div class="sg-name">尽情期待</div>
  288. </a>
  289. </div>
  290. </div>
  291. </div>
  292. <div class="layui-card">
  293. <div class="layui-card-header">用户人数</div>
  294. <div class="layui-card-body">
  295. <div class="sg-zone-list">
  296. <div class="sg-zone-item">
  297. <div class="sg-zone-name">注册总人数</div>
  298. <div class="sg-process">
  299. <div class="sg-process-bar" style="width: 100px"></div>
  300. <div class="sg-total">{{ $users_total }}个</div>
  301. </div>
  302. </div>
  303. <div class="sg-zone-item">
  304. <div class="sg-zone-name">待授权人数</div>
  305. <div class="sg-process">
  306. <div class="sg-process-bar" style="width: {{ $users_not_auth_total / $users_total * 100 }}px"></div>
  307. <div class="sg-total">{{ $users_not_auth_total }}个</div>
  308. </div>
  309. </div>
  310. </div>
  311. </div>
  312. </div>
  313. <div class="layui-card">
  314. <div class="layui-card-header">内部设备情况</div>
  315. <div class="layui-card-body">
  316. <div class="sg-project-2-list">
  317. <div class="sg-item sg-device-card sg-green-bg">
  318. <div>闲置</div>
  319. <div class="sg-font-lg">{{ $device_stat['free'] }}</div>
  320. </div>
  321. <div class="sg-item sg-device-card sg-red-bg">
  322. <div>在用</div>
  323. <div class="sg-font-lg">{{ $device_stat['using'] }}</div>
  324. </div>
  325. <div class="sg-item sg-device-card sg-orange-bg">
  326. <div>维修</div>
  327. <div class="sg-font-lg">{{ $device_stat['repair'] }}</div>
  328. </div>
  329. <div class="sg-item sg-device-card sg-gray-bg">
  330. <div>报废</div>
  331. <div class="sg-font-lg">{{ $device_stat['scrap'] }}</div>
  332. </div>
  333. </div>
  334. </div>
  335. </div>
  336. </div>
  337. </div>
  338. </div>
  339. @endsection
  340. @section('footer')
  341. <script>
  342. $(function() {
  343. layui.use(['table', 'layer'], function() {
  344. var form = layui.form,
  345. top_window = window;
  346. var myChart = echarts.init(document.getElementById('my-chart'));
  347. form.on('select()', function(){
  348. getChartData();
  349. });
  350. getChartData();
  351. function transformToJson(formData){
  352. var obj={};
  353. for (var i in formData) {
  354. obj[formData[i].name]=formData[i]['value'];
  355. }
  356. return obj;
  357. }
  358. function getChartData() {
  359. $.ajax({
  360. method: 'POST',
  361. url: '/admin/Project/getStat',
  362. headers: {
  363. 'X-CSRF-TOKEN': '{{ csrf_token() }}'
  364. },
  365. data: transformToJson($('#sg-search-form').serializeArray()),
  366. success: function (data) {
  367. if(data.status === 'success') {
  368. // console.log(data.data);
  369. updateChart(data.data);
  370. }
  371. },
  372. error: function () {
  373. }
  374. });
  375. }
  376. function updateChart(data) {
  377. // 指定图表的配置项和数据
  378. var option = {
  379. color: ['#71D4D4', '#C3B6E6'],
  380. legend: {
  381. data: ['订单数', '订单金额']
  382. },
  383. dataZoom: [
  384. {
  385. id: 'dataZoomX',
  386. type: 'slider',
  387. xAxisIndex: [0],
  388. filterMode: 'filter',
  389. height:30,
  390. start:1,
  391. end:12,
  392. }
  393. ],
  394. tooltip: {},
  395. xAxis: [
  396. {
  397. type: 'category',
  398. data: data['names']
  399. }
  400. ],
  401. yAxis: [{
  402. type: 'value',
  403. name: '订单数',
  404. splitLine: {
  405. show: false
  406. }
  407. }, {
  408. type: 'value',
  409. name: '订单金额',
  410. splitLine: {
  411. show: false
  412. }
  413. }],
  414. // Declare several bar series, each will be mapped
  415. // to a column of dataset.source by default.
  416. series: [
  417. {
  418. name: '订单数',
  419. type: 'bar',
  420. label: {
  421. show: true,
  422. position: 'top'
  423. },
  424. data: data.data[0]
  425. },
  426. {
  427. name: '订单金额',
  428. type: 'bar',
  429. label: {
  430. show: true,
  431. position: 'top'
  432. },
  433. yAxisIndex: 1,
  434. data: data.data[1]
  435. }
  436. ]
  437. };
  438. // 使用刚指定的配置项和数据显示图表。
  439. myChart.setOption(option);
  440. }
  441. });
  442. })
  443. </script>
  444. @endsection