create.blade.php 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620
  1. @extends('layouts.app')
  2. @section('title')录入-用户@endsection
  3. @section('content')
  4. <div class="container" id="editPanel">
  5. <div class="row justify-content-center">
  6. @if(Session::has('successTip'))
  7. <div class="alert alert-success h1">{{Session::get('successTip')}}</div>
  8. @endif
  9. <div class="col-md-8">
  10. <div class="card">
  11. <div class="card-header">录入用户</div>
  12. <div class="card-body">
  13. <form method="POST" action="{{ route('register') }}">
  14. @csrf
  15. <div class="form-group row">
  16. <label for="name" class="col-md-3 col-form-label text-md-right">姓名</label>
  17. <div class="col-md-7">
  18. <input id="name" type="text"
  19. class="form-control @error('name') is-invalid @enderror" name="name"
  20. value="{{ old('name') }}" required autocomplete="name" autofocus>
  21. @error('name')
  22. <span class="invalid-feedback" role="alert">
  23. <strong>{{ $message }}</strong>
  24. </span>
  25. @enderror
  26. </div>
  27. </div>
  28. <div class="form-group row">
  29. <label for="email" class="col-md-3 col-form-label text-md-right">Email地址</label>
  30. <div class="col-md-7">
  31. <input id="email" type="email"
  32. class="form-control @error('email') is-invalid @enderror" name="email"
  33. value="{{ old('email') }}" required autocomplete="email">
  34. @error('email')
  35. <span class="invalid-feedback" role="alert">
  36. <strong>{{ $message }}</strong>
  37. </span>
  38. @enderror
  39. </div>
  40. </div>
  41. <div class="form-group row">
  42. <label for="phone" class="col-md-3 col-form-label text-md-right">手机号码</label>
  43. <div class="col-md-7">
  44. <input id="phone" type="phone"
  45. class="form-control @error('phone') is-invalid @enderror" name="phone"
  46. value="{{ old('phone') }}" autocomplete="phone">
  47. @error('phone')
  48. <span class="invalid-feedback" role="alert">
  49. <strong>{{ $message }}</strong>
  50. </span>
  51. @enderror
  52. </div>
  53. </div>
  54. <div class="form-group row">
  55. <label for="password" class="col-md-3 col-form-label text-md-right">密码</label>
  56. <div class="col-md-7">
  57. <input id="password" type="password"
  58. class="form-control @error('password') is-invalid @enderror" name="password"
  59. required autocomplete="new-password">
  60. @error('password')
  61. <span class="invalid-feedback" role="alert">
  62. <strong>{{ $message }}</strong>
  63. </span>
  64. @enderror
  65. </div>
  66. </div>
  67. <div class="form-group row">
  68. <label for="password-confirm" class="col-md-3 col-form-label text-md-right">重输密码</label>
  69. <div class="col-md-7">
  70. <input id="password-confirm" type="password" class="form-control"
  71. name="password_confirmation" required autocomplete="new-password">
  72. </div>
  73. </div>
  74. <div class="form-group row">
  75. <label for="userWorkgroupID" class="col-md-3 col-form-label text-md-right">工作组</label>
  76. <div class="col-md-7">
  77. <select class="form-control" name="userWorkgroupID" id="userWorkgroupID">
  78. <option></option>
  79. <option v-for="userWorkgroup in userWorkgroups" :value="userWorkgroup.id">@{{
  80. userWorkgroup.name }}
  81. </option>
  82. </select>
  83. </div>
  84. </div>
  85. <div class="form-group row">
  86. <label for="role" class="col-md-3 col-form-label text-md-right">角色</label>
  87. <div class="col-md-7">
  88. <input type="text" class="form-control tooltipTarget" placeholder="定位角色"
  89. @input="seekRole($event)" title="输入关键词快速定位"></div>
  90. </div>
  91. <div class="form-group row">
  92. <label class="col-md-3"></label>
  93. <div class="col-md-4">
  94. <input name="role" hidden v-model="roles">
  95. <div class="input-group" style="max-height: 190px; overflow-y: scroll;border-radius:5px;opacity:0.5;text-align: center;">
  96. <ul class="list-group" style="width: 100%" onselectstart="return false;">
  97. <li :data-original-title="role.style ? '双击删除角色' : '双击添加角色'"
  98. v-for="role in rolesFilter" :id="role.name"
  99. class="tooltipTarget list-group-item list-group-item-action pt-0 pb-0 "
  100. @dblclick="selectedRole(role)" :class="role.style ? 'active' :''">
  101. <span style="cursor: default;" class=""> @{{ role.name }}</span>
  102. </li>
  103. </ul>
  104. </div>
  105. </div>
  106. <div class="col-md-3">
  107. <div class="input-group"
  108. style="max-height: 190px; overflow-y: scroll;border-radius:5px;text-align: center;">
  109. <ul class="list-group" style="width: 100%" onselectstart="return false;">
  110. <li
  111. title="双击删除角色"
  112. v-for="role in rolesList" :id="role.name"
  113. class="tooltipTarget list-group-item list-group-item-action pt-0 pb-0"
  114. @dblclick="selectedRole(role)"><span style="cursor: default;"> @{{ role.name }} </span>
  115. </li>
  116. </ul>
  117. </div>
  118. </div>
  119. </div>
  120. <div class="form-group row">
  121. <label for="logistic" class="col-md-3 col-form-label text-md-right">可见承运商</label>
  122. <div class="col-md-7">
  123. <input type="text" class="form-control tooltipTarget" placeholder="定位承运商"
  124. @input="seekLogistic($event)" title="输入关键词快速定位"></div>
  125. </div>
  126. <div class="form-group row">
  127. <label class="col-md-3"></label>
  128. <div class="col-md-4">
  129. <div class="input-group"
  130. style="max-height: 150px; overflow-y: scroll;border-radius:5px;opacity:0.5;text-align: center;">
  131. <ul class="list-group" style="width: 100%"
  132. onselectstart="return false;">
  133. <li :data-original-title="logistic.style ? '双击删除承运商' : '双击添加承运商'"
  134. v-for="logistic in logisticsFilter" :id="logistic.name"
  135. class="tooltipTarget list-group-item list-group-item-action pt-0 pb-0"
  136. @dblclick="selectedLogistic(logistic)"
  137. :class="logistic.style ? 'active' :''"><span style="cursor: default;"> @{{ logistic.name }} </span>
  138. </li>
  139. </ul>
  140. </div>
  141. </div>
  142. <div class="col-md-3">
  143. <input name="logistic" hidden v-model="logistics">
  144. <div class="input-group"
  145. style="max-height: 150px; overflow-y: scroll;border-radius:5px;text-align: center;">
  146. <ul class="list-group" style="width: 100%" onselectstart="return false;">
  147. <li title="双击删除承运商" v-for="logistic in logisticsList"
  148. class="tooltipTarget list-group-item list-group-item-action pt-0 pb-0"
  149. @dblclick="selectedLogistic(logistic)"><span style="cursor: default;"> @{{ logistic.name }} </span>
  150. </li>
  151. </ul>
  152. </div>
  153. </div>
  154. </div>
  155. <div class="form-group row">
  156. <label for="logistic" class="col-md-3 col-form-label text-md-right">可见供应商</label>
  157. <div class="col-md-7">
  158. <input type="text" class="form-control tooltipTarget" placeholder="定位供应商"
  159. @input="seekSupplier($event)" title="输入关键词快速定位"></div>
  160. </div>
  161. <div class="form-group row">
  162. <label class="col-md-3"></label>
  163. <div class="col-md-4">
  164. <div class="input-group"
  165. style="max-height: 150px; overflow-y: scroll;border-radius:5px;opacity:0.5;text-align: center;">
  166. <ul class="list-group" style="width: 100%"
  167. onselectstart="return false;">
  168. <li :data-original-title="supplier.style ? '双击删除供应商' : '双击添加供应商'"
  169. v-for="supplier in suppliersFilter" :id="supplier.name"
  170. class="tooltipTarget list-group-item list-group-item-action pt-0 pb-0"
  171. @dblclick="selectedSupplier(supplier)"
  172. :class="supplier.style ? 'active' :''"><span style="cursor: default;"> @{{ supplier.name }} </span>
  173. </li>
  174. </ul>
  175. </div>
  176. </div>
  177. <div class="col-md-3">
  178. <input name="supplier" hidden v-model="supplier">
  179. <div class="input-group"
  180. style="max-height: 150px; overflow-y: scroll;border-radius:5px;text-align: center;">
  181. <ul class="list-group" style="width: 100%" onselectstart="return false;">
  182. <li :data-original-title="suppliersList ? '双击删除供应商' : ''"
  183. v-for="supplier in suppliersList"
  184. class="tooltipTarget list-group-item list-group-item-action pt-0 pb-0"
  185. @dblclick="selectedSupplier(supplier)"><span style="cursor: default;"> @{{ supplier.name }} </span>
  186. </li>
  187. </ul>
  188. </div>
  189. </div>
  190. </div>
  191. {{-- 工作组、项目组开始 --}}
  192. <div class="form-group row ">
  193. <div class="col-6">
  194. <div class="card-header row">
  195. <div class="col-4">
  196. <div class="pull-left h5 font-weight-bold mr-3">工作组</div>
  197. <div class="pull-left text-muted">
  198. <div class="custom-control custom-checkbox">
  199. <input type="checkbox" class="custom-control-input" id="check-works" @change="hideNoSelected('workGroup',$event.target.checked)">
  200. <label class="custom-control-label ml-0" for="check-works">已拥有</label>
  201. </div>
  202. </div>
  203. </div>
  204. <div class="col-5">
  205. <div class="btn-group">
  206. <a class="btn border btn-primary" @click="expand(true)">展开全部</a>
  207. <a class="btn border btn-primary" @click="expand(false)">收起全部</a>
  208. </div>
  209. </div>
  210. </div>
  211. <div class="card-body overflow-scrollbar-200" style="max-height: 400px" id="workGroup">
  212. <tree :list="workGroup" :column="'name'" ></tree>
  213. </div>
  214. </div>
  215. <div class="col-6">
  216. <div class="card-header row">
  217. <div class="pull-left h5 font-weight-bold mr-3">项目组</div>
  218. <div class="pull-left text-muted">
  219. <div class="custom-control custom-checkbox">
  220. <input type="checkbox" class="custom-control-input" id="check-ownerGroups" @change="hideNoSelected('ownerGroup',$event.target.checked)">
  221. <label class="custom-control-label ml-0" for="check-ownerGroups">已拥有</label>
  222. </div>
  223. </div>
  224. </div>
  225. <div class="card-body overflow-scrollbar-200" style="max-height: 400px">
  226. <ul class="list-group">
  227. <li class="list-group-item" v-for="owner in ownerGroup" v-show="!owner.hide">
  228. <div class="form-check">
  229. <label class="form-check-label w-100">
  230. <input type="checkbox" class="form-check-input" name="ownerGroup[]" v-model="ownerGroups" :value="owner.id">@{{ owner.name }}
  231. </label>
  232. </div>
  233. </li>
  234. </ul>
  235. </div>
  236. </div>
  237. </div>
  238. {{-- 工作组、项目组结束--}}
  239. <input type="hidden" value="{{url('maintenance/user/create')}}">
  240. <div class="form-group row mb-0">
  241. <div class="col-md-7 offset-md-4">
  242. <button type="submit" class="btn btn-primary">
  243. 录入
  244. </button>
  245. </div>
  246. </div>
  247. </form>
  248. </div>
  249. </div>
  250. </div>
  251. </div>
  252. </div>
  253. @endsection
  254. @section('lastScript')
  255. <script>
  256. let vueList = new Vue({
  257. el: "#editPanel",
  258. data: {
  259. userWorkgroups: [
  260. @foreach($userWorkgroups as $userWorkgroup)
  261. {!! $userWorkgroup !!},
  262. @endforeach
  263. ],
  264. rolesAll: [
  265. @foreach( $rolesAll as $role )
  266. {
  267. id: '{{$role->id}}', name: '{{$role->name}}', style: false
  268. },
  269. @endforeach
  270. ],
  271. rolesFilter: [
  272. @foreach( $rolesAll as $role )
  273. {
  274. id: '{{$role->id}}', name: '{{$role->name}}', style: false
  275. },
  276. @endforeach
  277. ],
  278. roles: [{{old('role')}}],
  279. rolesList: [],
  280. logisticsAll: [
  281. @foreach($logistics as $logistic)
  282. {
  283. id: '{{$logistic->id}}', name: '{{$logistic->name}}', style: false
  284. },
  285. @endforeach
  286. ],
  287. logisticsFilter: [
  288. @foreach($logistics as $logistic)
  289. {
  290. id: '{{$logistic->id}}', name: '{{$logistic->name}}', style: false
  291. },
  292. @endforeach
  293. ],
  294. logistics: [{{old('logistic')}}],
  295. logisticsList: [],
  296. suppliersAll: [
  297. @foreach($suppliers as $supplier)
  298. {
  299. id: '{{$supplier->id}}', name: '{{$supplier->name}}', style: false
  300. },
  301. @endforeach
  302. ],
  303. suppliersFilter: [
  304. @foreach($suppliers as $supplier)
  305. {
  306. id: '{{$supplier->id}}', name: '{{$supplier->name}}', style: false
  307. },
  308. @endforeach
  309. ],
  310. supplier: [{{old('supplier')}}],
  311. suppliersList: [],
  312. workGroup: [@foreach($workGroup as $wg)@json($wg),@endforeach],
  313. ownerGroup: [@foreach($ownerGroup as $group)@json($group),@endforeach],
  314. },
  315. components:{
  316. 'tree':"url:{{asset("js/vue/tree.vue")}}"
  317. },
  318. mounted: function () {
  319. $(".tooltipTarget").tooltip({ boundary: 'window' });
  320. if (this.roles.length > 0) {
  321. let rolesAll = this.rolesAll;
  322. let roles = this.roles;
  323. let rolesList = this.rolesList;
  324. for (let i = 0; i < roles.length; i++) {
  325. rolesAll.every(function (roleAll) {
  326. if (roleAll.id == roles[i]) {
  327. roleAll.style = true;
  328. rolesList.push({'id': roleAll.id, 'name': roleAll.name});
  329. return false;
  330. }
  331. return true;
  332. });
  333. }
  334. }
  335. if (this.logistics.length > 0) {
  336. let logisticsAll = this.logisticsAll;
  337. let logistics = this.logistics;
  338. let logisticsList = this.logisticsList;
  339. for (let i = 0; i < logistics.length; i++) {
  340. logisticsAll.every(function (logisticAll) {
  341. if (logisticAll.id == logistics[i]) {
  342. logisticAll.style = true;
  343. logisticsList.push({'id': logisticAll.id, 'name': logisticAll.name});
  344. return false;
  345. }
  346. return true;
  347. });
  348. }
  349. }
  350. },
  351. methods: {
  352. selectedLogistic: function (e) {
  353. let logistics = this.logistics;
  354. let logisticsAll = this.logisticsAll;
  355. let logisticsList = this.logisticsList;
  356. let isLogistic = true;
  357. if (logistics && logisticsAll) {
  358. for (let i = 0; i < logistics.length; i++) {
  359. if (logistics[i] == e.id) {
  360. logistics.splice(i, 1);
  361. logisticsAll.every(function (logisticAll) {
  362. if (logisticAll.id == e.id) {
  363. logisticAll.style = false;
  364. return false;
  365. }
  366. return true;
  367. });
  368. logisticsList.every(function (logistic, i) {
  369. if (logistic.id == e.id) {
  370. logisticsList.splice(i, 1);
  371. $(".tooltipTarget").tooltip('hide');
  372. return false;
  373. }
  374. return true;
  375. });
  376. isLogistic = false;
  377. break;
  378. }
  379. isLogistic = true;
  380. }
  381. }
  382. if (isLogistic || !logistics) {
  383. logistics.push(e.id);
  384. logisticsAll.every(function (logisticAll) {
  385. if (logisticAll.id == e.id) {
  386. logisticAll.style = true;
  387. logisticsList.push({'id': logisticAll.id, 'name': logisticAll.name});
  388. return false;
  389. }
  390. return true;
  391. });
  392. }
  393. this.resetTooltip();
  394. },
  395. selectedSupplier: function (e) {
  396. let supplier = this.supplier;
  397. let suppliersAll = this.suppliersAll;
  398. let suppliersList = this.suppliersList;
  399. let isSupplier = true;
  400. if (supplier && suppliersAll) {
  401. for (let i = 0; i < supplier.length; i++) {
  402. if (supplier[i] == e.id) {
  403. supplier.splice(i, 1);
  404. suppliersAll.every(function (suppliersAll) {
  405. if (suppliersAll.id == e.id) {
  406. suppliersAll.style = false;
  407. return false;
  408. }
  409. return true;
  410. });
  411. suppliersList.every(function (supplier, i) {
  412. if (supplier.id == e.id) {
  413. suppliersList.splice(i, 1);
  414. $(".tooltipTarget").tooltip('hide');
  415. return false;
  416. }
  417. return true;
  418. });
  419. isSupplier = false;
  420. break;
  421. }
  422. isSupplier = true;
  423. }
  424. }
  425. if (isSupplier || !supplier) {
  426. supplier.push(e.id);
  427. suppliersAll.every(function (suppliersAll) {
  428. if (suppliersAll.id == e.id) {
  429. suppliersAll.style = true;
  430. suppliersList.push({'id': suppliersAll.id, 'name': suppliersAll.name});
  431. return false;
  432. }
  433. return true;
  434. });
  435. }
  436. this.resetTooltip();
  437. },
  438. seekLogistic: function (e) {
  439. let $val = e.target.value;
  440. let logisticsAll = this.logisticsAll;
  441. let bool = false;
  442. logisticsAll.every(function (logisticAll) {
  443. let name = logisticAll.name;
  444. if (name.includes($val)) {
  445. bool = true;
  446. return false;
  447. }
  448. return true;
  449. });
  450. if($val==='' && !bool){
  451. this.logisticsFilter = this.logisticsAll;
  452. }else if(bool){
  453. this.logisticsFilter= [];
  454. for (let i = 0; i < logisticsAll.length; i++) {
  455. let carries = logisticsAll[i];
  456. let name = carries.name;
  457. if(name.includes($val)){
  458. this.logisticsFilter.push(carries);
  459. }
  460. }
  461. }
  462. this.resetTooltip();
  463. },
  464. seekSupplier: function (e) {
  465. let $val = e.target.value;
  466. let suppliersAll = this.suppliersAll;
  467. let bool = false;
  468. suppliersAll.every(function (supplierAll) {
  469. let name = supplierAll.name;
  470. if (name.includes($val)) {
  471. bool = true;
  472. return false;
  473. }
  474. return true;
  475. });
  476. if($val==='' && !bool){
  477. this.suppliersFilter = this.suppliersAll;
  478. }else if(bool){
  479. this.suppliersFilter= [];
  480. for (let i = 0; i < suppliersAll.length; i++) {
  481. let supplier = suppliersAll[i];
  482. let name = supplier.name;
  483. if(name.includes($val)){
  484. this.suppliersFilter.push(supplier);
  485. }
  486. }
  487. }
  488. this.resetTooltip();
  489. },
  490. selectedRole: function (e) {
  491. let roles = this.roles;
  492. let rolesAll = this.rolesAll;
  493. let rolesList = this.rolesList;
  494. let isRole = true;
  495. if (roles && rolesAll) {
  496. for (let i = 0; i < roles.length; i++) {
  497. if (roles[i] == e.id) {
  498. roles.splice(i, 1);
  499. rolesAll.every(function (roleAll) {
  500. if (roleAll.id == e.id) {
  501. roleAll.style = false;
  502. return false;
  503. }
  504. return true;
  505. });
  506. rolesList.every(function (role, i) {
  507. if (role.id == e.id) {
  508. rolesList.splice(i, 1);
  509. $(".tooltipTarget").tooltip('hide');
  510. return false;
  511. }
  512. return true;
  513. });
  514. isRole = false;
  515. break;
  516. }
  517. isRole = true;
  518. }
  519. }
  520. if (isRole || !roles) {
  521. roles.push(e.id);
  522. rolesAll.every(function (roleAll) {
  523. if (roleAll.id == e.id) {
  524. roleAll.style = true;
  525. rolesList.push({'id': roleAll.id, 'name': roleAll.name});
  526. return false;
  527. }
  528. return true;
  529. });
  530. }
  531. this.resetTooltip();
  532. },
  533. seekRole: function (e) {
  534. let $val = e.target.value;
  535. let rolesAll = this.rolesAll;
  536. let rolesFilter = this.rolesFilter;
  537. let bool = false;
  538. rolesAll.every(function (roleAll) {
  539. let name = roleAll.name;
  540. if (name.includes($val)) {
  541. bool = true;
  542. return false;
  543. }
  544. return true;
  545. });
  546. if ($val === '' && bool) {
  547. this.rolesFilter = this.rolesAll;
  548. } else if (bool) {
  549. this.rolesFilter = [];
  550. for (let i = 0; i < rolesAll.length; i++) {
  551. let role = rolesAll[i];
  552. let name = role.name;
  553. if (name.includes($val)) {
  554. this.rolesFilter.push(role);
  555. }
  556. }
  557. }
  558. this.resetTooltip();
  559. },
  560. resetTooltip(){
  561. setTimeout(function () {
  562. $(".tooltipTarget").tooltip({ boundary: 'window' });
  563. }, 10 )
  564. },
  565. expand(isExpand){
  566. if (isExpand) $("#workGroup .up").slideDown();
  567. else $("#workGroup .up").slideUp();
  568. },
  569. hideNoSelected(type,isHide = true){
  570. switch (type) {
  571. case "ownerGroup":
  572. this.owners.forEach((owner,i)=>{
  573. let check = isHide;
  574. if (owner.hide !== check)this.$set(this.owners[i],"hide",check);
  575. });
  576. break;
  577. case "workGroup":
  578. let nodes = document.getElementById("workGroup").getElementsByTagName("INPUT");
  579. for (let i=0;i<nodes.length;i++){
  580. if (!nodes[i].checked && isHide)nodes[i].parentElement.parentElement.className = "d-none";
  581. else nodes[i].parentElement.parentElement.className = "";
  582. }
  583. break;
  584. default: break;
  585. }
  586. },
  587. },
  588. });
  589. </script>
  590. @endsection