李浩杰 4 лет назад
Родитель
Сommit
dd835f5296
52 измененных файлов с 4173 добавлено и 49 удалено
  1. 7 1
      app/Http/Controllers/Admin/Base/IndexController.php
  2. 108 0
      app/Http/Controllers/Admin/DeviceController.php
  3. 122 0
      app/Http/Controllers/Admin/DeviceNameController.php
  4. 141 0
      app/Http/Controllers/Admin/InnerDeviceController.php
  5. 120 0
      app/Http/Controllers/Admin/OrderController.php
  6. 108 0
      app/Http/Controllers/Admin/ProjectController.php
  7. 104 0
      app/Http/Controllers/Admin/ProjectRoleController.php
  8. 118 0
      app/Http/Controllers/Admin/ProjectUserController.php
  9. 125 0
      app/Http/Controllers/Admin/SpecController.php
  10. 2 1
      app/Http/Controllers/Admin/TestController.php
  11. 58 17
      app/Http/Controllers/Admin/UserController.php
  12. 5 13
      app/Models/BaseModel.php
  13. 21 0
      app/Models/Device.php
  14. 4 1
      app/Models/DeviceName.php
  15. 29 0
      app/Models/InnerDevice.php
  16. 5 0
      app/Models/Project.php
  17. 5 0
      app/Models/ProjectRole.php
  18. 30 1
      app/Models/Spec.php
  19. 18 2
      app/Models/User.php
  20. 9 6
      database/seeds/MiniSeeder.php
  21. 90 1
      resources/views/admin/base/index/welcome.blade.php
  22. 57 0
      resources/views/admin/device-names/change-password.blade.php
  23. 61 0
      resources/views/admin/device-names/create.blade.php
  24. 47 0
      resources/views/admin/device-names/edit.blade.php
  25. 228 0
      resources/views/admin/device-names/index.blade.php
  26. 52 0
      resources/views/admin/devices/create.blade.php
  27. 53 0
      resources/views/admin/devices/edit.blade.php
  28. 218 0
      resources/views/admin/devices/index.blade.php
  29. 57 0
      resources/views/admin/inner-devices/create.blade.php
  30. 58 0
      resources/views/admin/inner-devices/edit.blade.php
  31. 235 0
      resources/views/admin/inner-devices/index.blade.php
  32. 2 0
      resources/views/admin/layout-content.blade.php
  33. 53 0
      resources/views/admin/orders/create.blade.php
  34. 54 0
      resources/views/admin/orders/edit.blade.php
  35. 251 0
      resources/views/admin/orders/index.blade.php
  36. 53 0
      resources/views/admin/project-roles/create.blade.php
  37. 54 0
      resources/views/admin/project-roles/edit.blade.php
  38. 219 0
      resources/views/admin/project-roles/index.blade.php
  39. 53 0
      resources/views/admin/project-users/create.blade.php
  40. 53 0
      resources/views/admin/project-users/edit.blade.php
  41. 219 0
      resources/views/admin/project-users/index.blade.php
  42. 51 0
      resources/views/admin/projects/create.blade.php
  43. 52 0
      resources/views/admin/projects/edit.blade.php
  44. 222 0
      resources/views/admin/projects/index.blade.php
  45. 53 0
      resources/views/admin/specs/create.blade.php
  46. 54 0
      resources/views/admin/specs/edit.blade.php
  47. 222 0
      resources/views/admin/specs/index.blade.php
  48. 2 1
      resources/views/admin/users/create.blade.php
  49. 15 4
      resources/views/admin/users/index.blade.php
  50. 105 0
      resources/views/share/device-select-form.blade.php
  51. 90 0
      resources/views/share/device-select.blade.php
  52. 1 1
      resources/views/share/layui-form-item.blade.php

+ 7 - 1
app/Http/Controllers/Admin/Base/IndexController.php

xqd xqd
@@ -9,6 +9,9 @@
 namespace App\Http\Controllers\Admin\Base;
 
 use App\Http\Controllers\Admin\Controller;
+use App\Models\InnerDevice;
+use App\Models\Order;
+use App\Models\Project;
 use App\Services\Base\Tree;
 use App\Services\Base\BaseArea;
 use App\Services\Admin\Menus;
@@ -36,7 +39,10 @@ class IndexController extends Controller
     }
     function welcome() {
 //        return redirect('/admin/AdminUser/index');
-        return view('admin.base.index.welcome');
+        $total_device = InnerDevice::count();
+        $total_project = Project::count();
+        $total_order = Order::count();
+        return view('admin.base.index.welcome', compact('total_device', 'total_project', 'total_order'));
     }
     
     function createAreaDate(){

+ 108 - 0
app/Http/Controllers/Admin/DeviceController.php

xqd
@@ -0,0 +1,108 @@
+<?php
+
+namespace App\Http\Controllers\Admin;
+
+use App\Models\Device;
+use App\Models\DeviceName;
+use App\Models\Spec;
+use Illuminate\Http\Request;
+
+class DeviceController extends BaseController
+{
+    protected $model;
+
+    protected $department;
+
+    protected $model_name = '设备类型';
+
+    protected $pre_uri = '/admin/Device/';
+
+    protected $view_path = 'admin.devices.';
+
+    protected $redirect_index = '/admin/Device/index';
+
+    public function __construct()
+    {
+        $this->model = new Device();
+    }
+
+    public function index()
+    {
+        list($model, $model_name, $pre_uri) = array($this->model, $this->model_name, $this->pre_uri);
+        return view($this->view_path . 'index', compact('model', 'model_name','pre_uri'));
+    }
+
+    public function get(Request $request)
+    {
+        $items = $this->model->where('id', '>', 0)->orderBy('sort');
+
+        $tmp_items = collect(['name']);
+        foreach($tmp_items as $tmp_item) {
+            if($request->has($tmp_item) && !empty($request->input($tmp_item))) {
+                $items = $items->where($tmp_item, 'like', '%' . $request->input($tmp_item) . '%');
+            }
+        }
+
+        $select_items = collect([]);
+        foreach($select_items as $select_item) {
+            if($request->has($select_item) && !empty($request->input($select_item))) {
+                $items = $items->where($select_item, '=', $request->input($select_item));
+            }
+        }
+
+        $items = $items->paginate();
+
+        return response()->json(['code' => 0, 'message' => '', 'count' => $items->total(), 'data' => $items->items()]);
+    }
+
+    public function create()
+    {
+        list($model, $model_name, $pre_uri) = array($this->model, $this->model_name, $this->pre_uri);
+        return view($this->view_path . 'create', compact('model', 'model_name','pre_uri'));
+    }
+
+    public function store(Request $request)
+    {
+        if(empty($request->input('data')) || !is_array($request->input('data'))) return back()->withErrors(['sg_error_info' => '数据错误']);
+        $validator = $this->model->getValidator($request, 'store');
+        if($validator->fails()) {
+            return back()->withErrors($validator)->withInput();
+        }
+        $data = $request->input('data');
+        $res = $this->model->create($data);
+        if(empty($res)) return back()->withErrors(['sg_error_info' => '保存失败']);
+        return redirect($this->pre_uri . 'create')->with(['sg_success_info' => '创建成功']);
+    }
+
+    public function edit(Request $request)
+    {
+        if(empty($request->input('id')) || empty($item = $this->model->find($request->input('id')))) return back()->withErrors(['sg_error_info' => '找不到要编辑的数据']);
+        list($model, $model_name, $pre_uri) = array($this->model, $this->model_name, $this->pre_uri);
+        return view($this->view_path . 'edit', compact('model', 'model_name', 'pre_uri', 'item'));
+    }
+
+    public function update(Request $request)
+    {
+        if(empty($request->input('id')) || empty($item = $this->model->find($request->input('id')))) return back()->withErrors(['sg_error_info' => '找不到要编辑的数据']);
+        if(empty($request->input('data')) || !is_array($request->input('data'))) return back()->withErrors(['sg_error_info' => '数据错误']);
+        $validator = $this->model->getValidator($request, 'update');
+        if($validator->fails()) {
+            return back()->withErrors($validator)->withInput();
+        }
+        $data = $request->input('data');
+        $res = $this->model->where('id', $request->input('id'))->update($data);
+        if(!$res) return back()->withErrors(['sg_error_info' => '数据库保存失败!']);
+        return back()->with(['sg_success_info' => '编辑成功']);
+    }
+
+    public function delete(Request $request)
+    {
+        if(empty($request->input('id')) || empty($item = $this->model->find($request->input('id')))) return response()->json(['status' => 'fail', 'info' => '找不到要删除的数据']);
+        DeviceName::where('device_id', $item->id)->delete();
+        Spec::where('device_id', $item->id)->delete();
+        $res = $item->delete();
+        if (!$res) return response()->json(['status' => 'fail', 'info' => '删除失败']);
+        return response()->json(['status' => 'success', 'info' => '操作成功']);
+    }
+
+}

+ 122 - 0
app/Http/Controllers/Admin/DeviceNameController.php

xqd
@@ -0,0 +1,122 @@
+<?php
+namespace App\Http\Controllers\Admin;
+
+use App\Models\AdminRoleModel;
+use App\Models\AdminUserModel;
+use App\Models\Device;
+use App\Models\DeviceName;
+use App\Models\Role;
+use App\Models\Spec;
+use App\Models\User;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Hash;
+
+class DeviceNameController extends BaseController
+{
+    protected $model;
+
+    protected $device;
+
+    protected $road;
+
+    protected $zone;
+
+    protected $model_name = '设备名称';
+
+    protected $pre_uri = '/admin/DeviceName/';
+
+    protected $view_path = 'admin.device-names.';
+
+    protected $redirect_index = '/admin/DeviceName/index';
+
+    public function __construct()
+    {
+        $this->model = new DeviceName();
+        $this->device = new Device();
+    }
+
+    public function index()
+    {
+        $device_options = $this->device->getOptions();
+        list($model, $model_name, $pre_uri) = array($this->model, $this->model_name, $this->pre_uri);
+        return view($this->view_path . 'index', compact('model', 'model_name','pre_uri', 'device_options'));
+    }
+
+    public function get(Request $request)
+    {
+        $items = $this->model->where('id', '>', 0)->orderBy('sort');
+
+        $tmp_items = collect(['name']);
+        foreach($tmp_items as $tmp_item) {
+            if($request->has($tmp_item) && !empty($request->input($tmp_item))) {
+                $items = $items->where($tmp_item, 'like', '%' . $request->input($tmp_item) . '%');
+            }
+        }
+
+        $select_items = collect(['device_name_id']);
+        foreach($select_items as $select_item) {
+            if($request->has($select_item) && !empty($request->input($select_item))) {
+                $items = $items->where($select_item, '=', $request->input($select_item));
+            }
+        }
+
+        $items = $items->paginate();
+        foreach($items as $item) {
+            $item->device_type = empty($item->device) ? '' : $item->device->name;
+        }
+        return response()->json(['code' => 0, 'message' => '', 'count' => $items->total(), 'data' => $items->items()]);
+    }
+
+    public function create()
+    {
+        $device_options = $this->device->getOptions();
+        list($model, $model_name, $pre_uri) = array($this->model, $this->model_name, $this->pre_uri);
+        return view($this->view_path . 'create', compact('model', 'model_name','pre_uri', 'device_options'));
+    }
+
+    public function store(Request $request)
+    {
+        if(empty($request->input('data')) || !is_array($request->input('data'))) return back()->withErrors(['sg_error_info' => '数据错误']);
+        $validator = $this->model->getValidator($request, 'store');
+        if($validator->fails()) {
+            return back()->withErrors($validator)->withInput();
+        }
+        $data = $request->input('data');
+        $res = $this->model->create($data);
+        if(empty($res)) return back()->withErrors(['sg_error_info' => '保存失败']);
+        return redirect($this->pre_uri . 'create')->with(['sg_success_info' => '创建成功']);
+    }
+
+    public function edit(Request $request)
+    {
+        if(empty($request->input('id')) || empty($item = $this->model->find($request->input('id')))) return back()->withErrors(['sg_error_info' => '找不到要编辑的数据']);
+        $device_options = $this->device->getOptions();
+        list($model, $model_name, $pre_uri) = array($this->model, $this->model_name, $this->pre_uri);
+        return view($this->view_path . 'edit', compact('model', 'model_name', 'pre_uri', 'item', 'device_options'));
+    }
+
+    public function update(Request $request)
+    {
+        if(empty($request->input('id')) || empty($item = $this->model->find($request->input('id')))) return back()->withErrors(['sg_error_info' => '找不到要编辑的数据']);
+        if(empty($request->input('data')) || !is_array($request->input('data'))) return back()->withErrors(['sg_error_info' => '数据错误']);
+        $validator = $this->model->getValidator($request, 'update');
+        if($validator->fails()) {
+            return back()->withErrors($validator)->withInput();
+        }
+
+        $data = $request->input('data');
+        $res = $this->model->where('id', $request->input('id'))->update($data);
+        if(!$res) return back()->withErrors(['sg_error_info' => '数据库保存失败!']);
+        return back()->with(['sg_success_info' => '编辑成功']);
+    }
+
+    public function delete(Request $request)
+    {
+        if(empty($request->input('id')) || empty($item = $this->model->find($request->input('id')))) return response()->json(['status' => 'fail', 'info' => '找不到要删除的数据']);
+        Spec::where('device_name_id', $item->id)->delete();
+        $res = $item->delete();
+        if (!$res) return response()->json(['status' => 'fail', 'info' => '删除失败']);
+        return response()->json(['status' => 'success', 'info' => '操作成功']);
+    }
+}

+ 141 - 0
app/Http/Controllers/Admin/InnerDeviceController.php

xqd
@@ -0,0 +1,141 @@
+<?php
+
+namespace App\Http\Controllers\Admin;
+
+use App\Models\AdminRoleModel;
+use App\Models\Department;
+use App\Models\Device;
+use App\Models\DeviceName;
+use App\Models\InnerDevice;
+use App\Models\Option;
+use App\Models\Road;
+use App\Models\Role;
+use App\Models\Spec;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Log;
+
+class InnerDeviceController extends BaseController
+{
+    protected $model;
+    
+    protected $device;
+
+    protected $department;
+
+    protected $model_name = '设备';
+
+    protected $pre_uri = '/admin/InnerDevice/';
+
+    protected $view_path = 'admin.inner-devices.';
+
+    protected $redirect_index = '/admin/InnerDevice/index';
+
+    public function __construct()
+    {
+        $this->model = new InnerDevice();
+        $this->device = new Device();
+    }
+
+    public function index()
+    {
+        $options = $this->device->getDeviceOptions();
+        $statuses = Option::get('inner_devices', 'status');
+        list($model, $model_name, $pre_uri) = array($this->model, $this->model_name, $this->pre_uri);
+        return view($this->view_path . 'index', compact('model', 'model_name','pre_uri', 'options', 'statuses'));
+    }
+
+    public function get(Request $request)
+    {
+        $items = $this->model->where('id', '>', 0)->with(['device', 'spec', 'device_name']);
+
+        $tmp_items = collect(['number']);
+        foreach($tmp_items as $tmp_item) {
+            if($request->has($tmp_item) && !empty($request->input($tmp_item))) {
+                $items = $items->where($tmp_item, 'like', '%' . $request->input($tmp_item) . '%');
+            }
+        }
+
+        $select_items = collect(['device_id', 'device_name_id', 'spec_id', 'status']);
+        foreach($select_items as $select_item) {
+            if($request->has($select_item) && !empty($request->input($select_item))) {
+                $items = $items->where($select_item, '=', $request->input($select_item));
+            }
+        }
+
+        $items = $items->orderBy('updated_at', 'desc')->paginate();
+
+        foreach ($items as $item) {
+            $item->device_type = $item->device ? $item->device->name : '';
+            $item->device_name_name = $item->device_name ? $item->device_name->name : '';
+            $item->spec_name = $item->spec ? $item->spec->name : '';
+            $item->status = $item->option ? '<div style="color: ' . $item->option->color . '">' . $item->option->name . '</div>' : '';
+        }
+
+
+        return response()->json(['code' => 0, 'message' => '', 'count' => $items->total(), 'data' => $items->items()]);
+    }
+
+    public function create()
+    {
+        list($model, $model_name, $pre_uri) = array($this->model, $this->model_name, $this->pre_uri);
+        $options = $this->device->getDeviceOptions();
+        $status_options = Option::get('inner_devices', 'status');
+        return view($this->view_path . 'create', compact('model', 'model_name','pre_uri', 'options', 'status_options'));
+    }
+
+    public function transObject($items)
+    {
+        return json_decode(json_encode($items));
+    }
+
+    public function store(Request $request)
+    {
+        if(empty($request->input('data')) || !is_array($request->input('data'))) return back()->withErrors(['sg_error_info' => '数据错误']);
+        $validator = $this->model->getValidator($request, 'store');
+        if($validator->fails()) {
+            return back()->withErrors($validator)->withInput();
+        }
+        $data = $request->input('data');
+        $data['device_id'] = $request->input('device_id');
+        $data['device_name_id'] = $request->input('device_name_id');
+        $data['spec_id'] = $request->input('spec_id');
+        $res = $this->model->create($data);
+        if(empty($res)) return back()->withErrors(['sg_error_info' => '保存失败']);
+        return redirect($this->pre_uri . 'create')->with(['sg_success_info' => '创建成功']);
+    }
+
+    public function edit(Request $request)
+    {
+        if(empty($request->input('id')) || empty($item = $this->model->find($request->input('id')))) return back()->withErrors(['sg_error_info' => '找不到要编辑的数据']);
+        $options = $this->device->getDeviceOptions();
+        $status_options = Option::get('inner_devices', 'status');
+        list($model, $model_name, $pre_uri) = array($this->model, $this->model_name, $this->pre_uri);
+        return view($this->view_path . 'edit', compact('model', 'model_name', 'pre_uri', 'item', 'options', 'status_options'));
+    }
+
+    public function update(Request $request)
+    {
+        if(empty($request->input('id')) || empty($item = $this->model->find($request->input('id')))) return back()->withErrors(['sg_error_info' => '找不到要编辑的数据']);
+        if(empty($request->input('data')) || !is_array($request->input('data'))) return back()->withErrors(['sg_error_info' => '数据错误']);
+        $validator = $this->model->getValidator($request, 'update');
+        if($validator->fails()) {
+            return back()->withErrors($validator)->withInput();
+        }
+        $data = $request->input('data');
+        $data['device_id'] = $request->input('device_id');
+        $data['device_name_id'] = $request->input('device_name_id');
+        $data['spec_id'] = $request->input('spec_id');
+        $res = $this->model->where('id', $request->input('id'))->update($data);
+        if(!$res) return back()->withErrors(['sg_error_info' => '数据库保存失败!']);
+        return back()->with(['sg_success_info' => '编辑成功']);
+    }
+
+    public function delete(Request $request)
+    {
+        if(empty($request->input('id')) || empty($item = $this->model->find($request->input('id')))) return response()->json(['status' => 'fail', 'info' => '找不到要删除的数据']);
+        $res = $item->delete();
+        if (!$res) return response()->json(['status' => 'fail', 'info' => '删除失败']);
+        return response()->json(['status' => 'success', 'info' => '操作成功']);
+    }
+
+}

+ 120 - 0
app/Http/Controllers/Admin/OrderController.php

xqd
@@ -0,0 +1,120 @@
+<?php
+
+namespace App\Http\Controllers\Admin;
+
+use App\Models\Option;
+use App\Models\Order;
+use App\Models\Project;
+use Illuminate\Http\Request;
+
+class OrderController extends BaseController
+{
+    protected $model;
+
+    protected $project;
+
+    protected $model_name = '订单';
+
+    protected $pre_uri = '/admin/Order/';
+
+    protected $view_path = 'admin.orders.';
+
+    protected $redirect_index = '/admin/Order/index';
+
+    public function __construct()
+    {
+        $this->model = new Order();
+        $this->project = new Project();
+    }
+
+    public function index()
+    {
+        $project_options = $this->project->getOptions();
+        $status_options = Option::get('orders', 'status');
+        $type_options = [['name' => '外部租赁', 'id' => 1], ['name' => '内部调用', 'id' => 2]];
+        list($model, $model_name, $pre_uri) = array($this->model, $this->model_name, $this->pre_uri);
+        return view($this->view_path . 'index', compact('model', 'model_name','pre_uri', 'project_options', 'status_options', 'type_options'));
+    }
+
+    public function get(Request $request)
+    {
+        $items = $this->model->where('id', '>', 0)->with('project', 'user');
+
+        $tmp_items = collect(['order_number']);
+        foreach($tmp_items as $tmp_item) {
+            if($request->has($tmp_item) && !empty($request->input($tmp_item))) {
+                $items = $items->where($tmp_item, 'like', '%' . $request->input($tmp_item) . '%');
+            }
+        }
+
+        $select_items = collect(['status', 'type', 'project_id']);
+        foreach($select_items as $select_item) {
+            if($request->has($select_item) && !empty($request->input($select_item))) {
+                $items = $items->where($select_item, '=', $request->input($select_item));
+            }
+        }
+
+        $items = $items->paginate();
+
+        foreach($items as $item) {
+            $item->project_name = $item->project ? $item->project->name : '';
+            $item->user_name = $item->user ? $item->user->name : '';
+            $item->status_name = $item->getStatusName();
+            $item->option = Option::find($item->status);
+            $color = $item->option ? $item->option->color : '';
+            $item->status_name = '<span style="color: ' . $color . '">' . $item->status_name . '</span>';
+            $item->type_name = $item->type == 1 ? '<span class="layui-badge layui-bg-green">外部租赁</span>' : '<span class="layui-badge layui-bg-blue">内部调用</span>';
+        }
+
+        return response()->json(['code' => 0, 'message' => '', 'count' => $items->total(), 'data' => $items->items()]);
+    }
+
+    public function create()
+    {
+        list($model, $model_name, $pre_uri) = array($this->model, $this->model_name, $this->pre_uri);
+        return view($this->view_path . 'create', compact('model', 'model_name','pre_uri'));
+    }
+
+    public function store(Request $request)
+    {
+        if(empty($request->input('data')) || !is_array($request->input('data'))) return back()->withErrors(['sg_error_info' => '数据错误']);
+        $validator = $this->model->getValidator($request, 'store');
+        if($validator->fails()) {
+            return back()->withErrors($validator)->withInput();
+        }
+        $data = $request->input('data');
+        $res = $this->model->create($data);
+        if(empty($res)) return back()->withErrors(['sg_error_info' => '保存失败']);
+        return redirect($this->pre_uri . 'create')->with(['sg_success_info' => '创建成功']);
+    }
+
+    public function edit(Request $request)
+    {
+        if(empty($request->input('id')) || empty($item = $this->model->find($request->input('id')))) return back()->withErrors(['sg_error_info' => '找不到要编辑的数据']);
+        list($model, $model_name, $pre_uri) = array($this->model, $this->model_name, $this->pre_uri);
+        return view($this->view_path . 'edit', compact('model', 'model_name', 'pre_uri', 'item'));
+    }
+
+    public function update(Request $request)
+    {
+        if(empty($request->input('id')) || empty($item = $this->model->find($request->input('id')))) return back()->withErrors(['sg_error_info' => '找不到要编辑的数据']);
+        if(empty($request->input('data')) || !is_array($request->input('data'))) return back()->withErrors(['sg_error_info' => '数据错误']);
+        $validator = $this->model->getValidator($request, 'update');
+        if($validator->fails()) {
+            return back()->withErrors($validator)->withInput();
+        }
+        $data = $request->input('data');
+        $res = $this->model->where('id', $request->input('id'))->update($data);
+        if(!$res) return back()->withErrors(['sg_error_info' => '数据库保存失败!']);
+        return back()->with(['sg_success_info' => '编辑成功']);
+    }
+
+    public function delete(Request $request)
+    {
+        if(empty($request->input('id')) || empty($item = $this->model->find($request->input('id')))) return response()->json(['status' => 'fail', 'info' => '找不到要删除的数据']);
+        $res = $item->delete();
+        if (!$res) return response()->json(['status' => 'fail', 'info' => '删除失败']);
+        return response()->json(['status' => 'success', 'info' => '操作成功']);
+    }
+
+}

+ 108 - 0
app/Http/Controllers/Admin/ProjectController.php

xqd
@@ -0,0 +1,108 @@
+<?php
+
+namespace App\Http\Controllers\Admin;
+
+use App\Models\AdminRoleModel;
+use App\Models\Department;
+use App\Models\Project;
+use App\Models\Road;
+use App\Models\Role;
+use Illuminate\Http\Request;
+
+class ProjectController extends BaseController
+{
+    protected $model;
+
+    protected $department;
+
+    protected $model_name = '项目';
+
+    protected $pre_uri = '/admin/Project/';
+
+    protected $view_path = 'admin.projects.';
+
+    protected $redirect_index = '/admin/Project/index';
+
+    public function __construct()
+    {
+        $this->model = new Project();
+    }
+
+    public function index()
+    {
+        list($model, $model_name, $pre_uri) = array($this->model, $this->model_name, $this->pre_uri);
+        return view($this->view_path . 'index', compact('model', 'model_name','pre_uri'));
+    }
+
+    public function get(Request $request)
+    {
+        $items = $this->model->where('id', '>', 0);
+
+        $tmp_items = collect(['name']);
+        foreach($tmp_items as $tmp_item) {
+            if($request->has($tmp_item) && !empty($request->input($tmp_item))) {
+                $items = $items->where($tmp_item, 'like', '%' . $request->input($tmp_item) . '%');
+            }
+        }
+
+        $select_items = collect([]);
+        foreach($select_items as $select_item) {
+            if($request->has($select_item) && !empty($request->input($select_item))) {
+                $items = $items->where($select_item, '=', $request->input($select_item));
+            }
+        }
+
+        $items = $items->paginate();
+
+        return response()->json(['code' => 0, 'message' => '', 'count' => $items->total(), 'data' => $items->items()]);
+    }
+
+    public function create()
+    {
+        list($model, $model_name, $pre_uri) = array($this->model, $this->model_name, $this->pre_uri);
+        return view($this->view_path . 'create', compact('model', 'model_name','pre_uri'));
+    }
+
+    public function store(Request $request)
+    {
+        if(empty($request->input('data')) || !is_array($request->input('data'))) return back()->withErrors(['sg_error_info' => '数据错误']);
+        $validator = $this->model->getValidator($request, 'store');
+        if($validator->fails()) {
+            return back()->withErrors($validator)->withInput();
+        }
+        $data = $request->input('data');
+        $res = $this->model->create($data);
+        if(empty($res)) return back()->withErrors(['sg_error_info' => '保存失败']);
+        return redirect($this->pre_uri . 'create')->with(['sg_success_info' => '创建成功']);
+    }
+
+    public function edit(Request $request)
+    {
+        if(empty($request->input('id')) || empty($item = $this->model->find($request->input('id')))) return back()->withErrors(['sg_error_info' => '找不到要编辑的数据']);
+        list($model, $model_name, $pre_uri) = array($this->model, $this->model_name, $this->pre_uri);
+        return view($this->view_path . 'edit', compact('model', 'model_name', 'pre_uri', 'item'));
+    }
+
+    public function update(Request $request)
+    {
+        if(empty($request->input('id')) || empty($item = $this->model->find($request->input('id')))) return back()->withErrors(['sg_error_info' => '找不到要编辑的数据']);
+        if(empty($request->input('data')) || !is_array($request->input('data'))) return back()->withErrors(['sg_error_info' => '数据错误']);
+        $validator = $this->model->getValidator($request, 'update');
+        if($validator->fails()) {
+            return back()->withErrors($validator)->withInput();
+        }
+        $data = $request->input('data');
+        $res = $this->model->where('id', $request->input('id'))->update($data);
+        if(!$res) return back()->withErrors(['sg_error_info' => '数据库保存失败!']);
+        return back()->with(['sg_success_info' => '编辑成功']);
+    }
+
+    public function delete(Request $request)
+    {
+        if(empty($request->input('id')) || empty($item = $this->model->find($request->input('id')))) return response()->json(['status' => 'fail', 'info' => '找不到要删除的数据']);
+        $res = $item->delete();
+        if (!$res) return response()->json(['status' => 'fail', 'info' => '删除失败']);
+        return response()->json(['status' => 'success', 'info' => '操作成功']);
+    }
+
+}

+ 104 - 0
app/Http/Controllers/Admin/ProjectRoleController.php

xqd
@@ -0,0 +1,104 @@
+<?php
+
+namespace App\Http\Controllers\Admin;
+
+use App\Models\ProjectRole;
+use Illuminate\Http\Request;
+
+class ProjectRoleController extends BaseController
+{
+    protected $model;
+
+    protected $department;
+
+    protected $model_name = '项目角色';
+
+    protected $pre_uri = '/admin/ProjectRole/';
+
+    protected $view_path = 'admin.project-roles.';
+
+    protected $redirect_index = '/admin/ProjectRole/index';
+
+    public function __construct()
+    {
+        $this->model = new ProjectRole();
+    }
+
+    public function index()
+    {
+        list($model, $model_name, $pre_uri) = array($this->model, $this->model_name, $this->pre_uri);
+        return view($this->view_path . 'index', compact('model', 'model_name','pre_uri'));
+    }
+
+    public function get(Request $request)
+    {
+        $items = $this->model->where('id', '>', 0);
+
+        $tmp_items = collect(['name']);
+        foreach($tmp_items as $tmp_item) {
+            if($request->has($tmp_item) && !empty($request->input($tmp_item))) {
+                $items = $items->where($tmp_item, 'like', '%' . $request->input($tmp_item) . '%');
+            }
+        }
+
+        $select_items = collect([]);
+        foreach($select_items as $select_item) {
+            if($request->has($select_item) && !empty($request->input($select_item))) {
+                $items = $items->where($select_item, '=', $request->input($select_item));
+            }
+        }
+
+        $items = $items->paginate();
+
+        return response()->json(['code' => 0, 'message' => '', 'count' => $items->total(), 'data' => $items->items()]);
+    }
+
+    public function create()
+    {
+        list($model, $model_name, $pre_uri) = array($this->model, $this->model_name, $this->pre_uri);
+        return view($this->view_path . 'create', compact('model', 'model_name','pre_uri'));
+    }
+
+    public function store(Request $request)
+    {
+        if(empty($request->input('data')) || !is_array($request->input('data'))) return back()->withErrors(['sg_error_info' => '数据错误']);
+        $validator = $this->model->getValidator($request, 'store');
+        if($validator->fails()) {
+            return back()->withErrors($validator)->withInput();
+        }
+        $data = $request->input('data');
+        $res = $this->model->create($data);
+        if(empty($res)) return back()->withErrors(['sg_error_info' => '保存失败']);
+        return redirect($this->pre_uri . 'create')->with(['sg_success_info' => '创建成功']);
+    }
+
+    public function edit(Request $request)
+    {
+        if(empty($request->input('id')) || empty($item = $this->model->find($request->input('id')))) return back()->withErrors(['sg_error_info' => '找不到要编辑的数据']);
+        list($model, $model_name, $pre_uri) = array($this->model, $this->model_name, $this->pre_uri);
+        return view($this->view_path . 'edit', compact('model', 'model_name', 'pre_uri', 'item'));
+    }
+
+    public function update(Request $request)
+    {
+        if(empty($request->input('id')) || empty($item = $this->model->find($request->input('id')))) return back()->withErrors(['sg_error_info' => '找不到要编辑的数据']);
+        if(empty($request->input('data')) || !is_array($request->input('data'))) return back()->withErrors(['sg_error_info' => '数据错误']);
+        $validator = $this->model->getValidator($request, 'update');
+        if($validator->fails()) {
+            return back()->withErrors($validator)->withInput();
+        }
+        $data = $request->input('data');
+        $res = $this->model->where('id', $request->input('id'))->update($data);
+        if(!$res) return back()->withErrors(['sg_error_info' => '数据库保存失败!']);
+        return back()->with(['sg_success_info' => '编辑成功']);
+    }
+
+    public function delete(Request $request)
+    {
+        if(empty($request->input('id')) || empty($item = $this->model->find($request->input('id')))) return response()->json(['status' => 'fail', 'info' => '找不到要删除的数据']);
+        $res = $item->delete();
+        if (!$res) return response()->json(['status' => 'fail', 'info' => '删除失败']);
+        return response()->json(['status' => 'success', 'info' => '操作成功']);
+    }
+
+}

+ 118 - 0
app/Http/Controllers/Admin/ProjectUserController.php

xqd
@@ -0,0 +1,118 @@
+<?php
+
+namespace App\Http\Controllers\Admin;
+
+use App\Models\Project;
+use App\Models\ProjectRole;
+use App\Models\ProjectUser;
+use App\Models\User;
+use Illuminate\Http\Request;
+
+class ProjectUserController extends BaseController
+{
+    protected $model;
+
+    protected $department;
+
+    protected $model_name = '项目角色';
+
+    protected $pre_uri = '/admin/ProjectUser/';
+
+    protected $view_path = 'admin.project-users.';
+
+    protected $redirect_index = '/admin/ProjectUser/index';
+
+    public function __construct()
+    {
+        $this->model = new ProjectUser();
+    }
+
+    public function index(Request $request)
+    {
+        $project = Project::find($request->input('project_id'));
+        list($model, $model_name, $pre_uri) = array($this->model, $this->model_name, $this->pre_uri);
+        return view($this->view_path . 'index', compact('model', 'model_name','pre_uri', 'project'));
+    }
+
+    public function get(Request $request)
+    {
+        $items = $this->model->where('project_id', '=', $request->input('project_id'))->with('user', 'projectRole');
+
+        if($request->input('name')) {
+            $user_ids = User::where('name', 'like', '%' . $request->input('name') . '')->pluck('id')->unique();
+            if(count($user_ids) > 0) {
+                $items = $items->whereIn('user_id', $user_ids);
+            }
+        }
+
+        $select_items = collect([]);
+        foreach($select_items as $select_item) {
+            if($request->has($select_item) && !empty($request->input($select_item))) {
+                $items = $items->where($select_item, '=', $request->input($select_item));
+            }
+        }
+
+        $items = $items->paginate();
+
+        foreach($items as $item) {
+            $item->user_name = $item->user ? $item->user->name : '';
+            $item->role_name = $item->projectRole ? $item->projectRole->name : '';
+        }
+
+        return response()->json(['code' => 0, 'message' => '', 'count' => $items->total(), 'data' => $items->items()]);
+    }
+
+    public function create()
+    {
+        $user_options = (new User())->getOptions();
+        $role_options = (new ProjectRole())->getOptions();
+        list($model, $model_name, $pre_uri) = array($this->model, $this->model_name, $this->pre_uri);
+        return view($this->view_path . 'create', compact('model', 'model_name','pre_uri', 'user_options', 'role_options'));
+    }
+
+    public function store(Request $request)
+    {
+        if(empty($request->input('data')) || !is_array($request->input('data'))) return back()->withErrors(['sg_error_info' => '数据错误']);
+        $validator = $this->model->getValidator($request, 'store');
+        if($validator->fails()) {
+            return back()->withErrors($validator)->withInput();
+        }
+        $data = $request->input('data');
+        $this->model->where('user_id', $data['user_id'])->delete();
+        $res = $this->model->create($data);
+        if(empty($res)) return back()->withErrors(['sg_error_info' => '保存失败']);
+        return redirect($this->pre_uri . 'create')->with(['sg_success_info' => '创建成功']);
+    }
+
+    public function edit(Request $request)
+    {
+        if(empty($request->input('id')) || empty($item = $this->model->find($request->input('id')))) return back()->withErrors(['sg_error_info' => '找不到要编辑的数据']);
+        $user_options = (new User())->getOptions();
+        $role_options = (new ProjectRole())->getOptions();
+        list($model, $model_name, $pre_uri) = array($this->model, $this->model_name, $this->pre_uri);
+        return view($this->view_path . 'edit', compact('model', 'model_name', 'pre_uri', 'item', 'user_options', 'role_options'));
+    }
+
+    public function update(Request $request)
+    {
+        if(empty($request->input('id')) || empty($item = $this->model->find($request->input('id')))) return back()->withErrors(['sg_error_info' => '找不到要编辑的数据']);
+        if(empty($request->input('data')) || !is_array($request->input('data'))) return back()->withErrors(['sg_error_info' => '数据错误']);
+        $validator = $this->model->getValidator($request, 'update');
+        if($validator->fails()) {
+            return back()->withErrors($validator)->withInput();
+        }
+        $data = $request->input('data');
+        $res = $this->model->where('id', $request->input('id'))->update($data);
+        if(!$res) return back()->withErrors(['sg_error_info' => '数据库保存失败!']);
+        return back()->with(['sg_success_info' => '编辑成功']);
+    }
+
+    public function delete(Request $request)
+    {
+        if(empty($request->input('id')) || empty($item = $this->model->find($request->input('id')))) return response()->json(['status' => 'fail', 'info' => '找不到要删除的数据']);
+        $res = $item->delete();
+        if (!$res) return response()->json(['status' => 'fail', 'info' => '删除失败']);
+        return response()->json(['status' => 'success', 'info' => '操作成功']);
+    }
+
+}

+ 125 - 0
app/Http/Controllers/Admin/SpecController.php

xqd
@@ -0,0 +1,125 @@
+<?php
+namespace App\Http\Controllers\Admin;
+
+use App\Models\AdminRoleModel;
+use App\Models\AdminUserModel;
+use App\Models\Device;
+use App\Models\DeviceName;
+use App\Models\Role;
+use App\Models\Spec;
+use App\Models\User;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Hash;
+
+class SpecController extends BaseController
+{
+    protected $model;
+
+    protected $device;
+
+    protected $device_name;
+
+    protected $model_name = '规格型号';
+
+    protected $pre_uri = '/admin/Spec/';
+
+    protected $view_path = 'admin.specs.';
+
+    protected $redirect_index = '/admin/Spec/index';
+
+    public function __construct()
+    {
+        $this->model = new Spec();
+        $this->device = new Device();
+        $this->device_name = new DeviceName();
+    }
+
+    public function index()
+    {
+        $options = $this->device->getDeviceOptions();
+        list($model, $model_name, $pre_uri) = array($this->model, $this->model_name, $this->pre_uri);
+        return view($this->view_path . 'index', compact('model', 'model_name','pre_uri', 'options'));
+    }
+
+    public function get(Request $request)
+    {
+        $items = $this->model->where('id', '>', 0)->orderBy('sort');
+
+        $tmp_items = collect(['name']);
+        foreach($tmp_items as $tmp_item) {
+            if($request->has($tmp_item) && !empty($request->input($tmp_item))) {
+                $items = $items->where($tmp_item, 'like', '%' . $request->input($tmp_item) . '%');
+            }
+        }
+
+        $select_items = collect(['device_id', 'device_name_id']);
+        foreach($select_items as $select_item) {
+            if($request->has($select_item) && !empty($request->input($select_item))) {
+                $items = $items->where($select_item, '=', $request->input($select_item));
+            }
+        }
+
+        $items = $items->paginate();
+        foreach($items as $item) {
+            $item->device_type = empty($item->device) ? '' : $item->device->name;
+            $item->device_name_name = empty($item->device_name) ? '' : $item->device_name->name;
+        }
+        return response()->json(['code' => 0, 'message' => '', 'count' => $items->total(), 'data' => $items->items()]);
+    }
+
+    public function create()
+    {
+        $options = $this->device->getDeviceOptions();
+        list($model, $model_name, $pre_uri) = array($this->model, $this->model_name, $this->pre_uri);
+        return view($this->view_path . 'create', compact('model', 'model_name','pre_uri', 'options'));
+    }
+
+    public function store(Request $request)
+    {
+        if(empty($request->input('data')) || !is_array($request->input('data'))) return back()->withErrors(['sg_error_info' => '数据错误']);
+        $validator = $this->model->getValidator($request, 'store');
+        if($validator->fails()) {
+            return back()->withErrors($validator)->withInput();
+        }
+        $data = $request->input('data');
+        $data['device_id'] = $request->input('device_id');
+        $data['device_name_id'] = $request->input('device_name_id');
+        $res = $this->model->create($data);
+        if(empty($res)) return back()->withErrors(['sg_error_info' => '保存失败']);
+        return redirect($this->pre_uri . 'create')->with(['sg_success_info' => '创建成功']);
+    }
+
+    public function edit(Request $request)
+    {
+        if(empty($request->input('id')) || empty($item = $this->model->find($request->input('id')))) return back()->withErrors(['sg_error_info' => '找不到要编辑的数据']);
+        $options = $this->device->getDeviceOptions();
+        list($model, $model_name, $pre_uri) = array($this->model, $this->model_name, $this->pre_uri);
+        return view($this->view_path . 'edit', compact('model', 'model_name', 'pre_uri', 'item', 'options'));
+    }
+
+    public function update(Request $request)
+    {
+        if(empty($request->input('id')) || empty($item = $this->model->find($request->input('id')))) return back()->withErrors(['sg_error_info' => '找不到要编辑的数据']);
+        if(empty($request->input('data')) || !is_array($request->input('data'))) return back()->withErrors(['sg_error_info' => '数据错误']);
+        $validator = $this->model->getValidator($request, 'update');
+        if($validator->fails()) {
+            return back()->withErrors($validator)->withInput();
+        }
+
+        $data = $request->input('data');
+        $data['device_id'] = $request->input('device_id');
+        $data['device_name_id'] = $request->input('device_name_id');
+        $res = $this->model->where('id', $request->input('id'))->update($data);
+        if(!$res) return back()->withErrors(['sg_error_info' => '数据库保存失败!']);
+        return back()->with(['sg_success_info' => '编辑成功']);
+    }
+
+    public function delete(Request $request)
+    {
+        if(empty($request->input('id')) || empty($item = $this->model->find($request->input('id')))) return response()->json(['status' => 'fail', 'info' => '找不到要删除的数据']);
+        $res = $item->delete();
+        if (!$res) return response()->json(['status' => 'fail', 'info' => '删除失败']);
+        return response()->json(['status' => 'success', 'info' => '操作成功']);
+    }
+}

+ 2 - 1
app/Http/Controllers/Admin/TestController.php

xqd xqd
@@ -2,6 +2,7 @@
 
 namespace App\Http\Controllers\Admin;
 
+use App\Models\DeviceName;
 use App\Models\InnerDevice;
 use App\Models\Order;
 use App\Models\OrderDevice;
@@ -17,7 +18,7 @@ class TestController extends Controller
 {
     public function index(Request $request)
     {
-        dd(User::all()->min('created_at'));
+        dd(User::find(8)->getProjectRoleName());
     	return view('admin.test.index');
     }
 }

+ 58 - 17
app/Http/Controllers/Admin/UserController.php

xqd xqd xqd xqd xqd xqd xqd xqd xqd
@@ -1,9 +1,9 @@
 <?php
 namespace App\Http\Controllers\Admin;
 
-use App\Models\AdminRoleModel;
-use App\Models\AdminUserModel;
-use App\Models\Role;
+use App\Models\Project;
+use App\Models\ProjectRole;
+use App\Models\ProjectUser;
 use App\Models\User;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
@@ -15,9 +15,7 @@ class UserController extends BaseController
 
     protected $role;
 
-    protected $road;
-
-    protected $zone;
+    protected $project;
 
     protected $model_name = '用户';
 
@@ -30,19 +28,21 @@ class UserController extends BaseController
     public function __construct()
     {
         $this->model = new User();
-        $this->role = new Role();
+        $this->role = new ProjectRole();
+        $this->project = new Project();
     }
 
     public function index()
     {
         $role_options = $this->role->getOptions();
+        $project_options = $this->project->getOptions();
         list($model, $model_name, $pre_uri) = array($this->model, $this->model_name, $this->pre_uri);
-        return view($this->view_path . 'index', compact('model', 'model_name','pre_uri', 'role_options'));
+        return view($this->view_path . 'index', compact('model', 'model_name','pre_uri', 'role_options', 'project_options'));
     }
 
     public function get(Request $request)
     {
-        $items = $this->model->where('id', '>', 0);
+        $items = $this->model;
 
         $tmp_items = collect(['name']);
         foreach($tmp_items as $tmp_item) {
@@ -50,17 +50,25 @@ class UserController extends BaseController
                 $items = $items->where($tmp_item, 'like', '%' . $request->input($tmp_item) . '%');
             }
         }
-
-        $select_items = collect([]);
-        foreach($select_items as $select_item) {
-            if($request->has($select_item) && !empty($request->input($select_item))) {
-                $items = $items->where($select_item, '=', $request->input($select_item));
+        $ids = [];
+        if($request->input('project_id') || $request->input('project_role_id')) {
+            $project_users = ProjectUser::where('id', '>', 0);
+            if($request->input('project_id')) {
+                $project_users = $project_users->where('project_id', $request->input('project_id'));
             }
+            if($request->input('project_role_id')) {
+                $project_users = $project_users->where('project_role_id', $request->input('project_role_id'));
+            }
+            $ids = $project_users->pluck('user_id')->unique();
+        }
+        if(count($ids) > 0) {
+            $items = $items->whereIn('id', $ids);
         }
 
         $items = $items->paginate();
         foreach($items as $item) {
-            $item->role_name = empty($item->role) ? '' : $item->role->name;
+            $item->role_name = $item->getProjectRoleName();
+            $item->project_name = $item->getProjectName();
         }
         return response()->json(['code' => 0, 'message' => '', 'count' => $items->total(), 'data' => $items->items()]);
     }
@@ -68,8 +76,11 @@ class UserController extends BaseController
     public function create()
     {
         $role_options = $this->role->getOptions();
+        $project_options = $this->project->getOptions();
+//        $role_options = array_merge([['id' => '', 'name' => '项目角色']], $role_options);
+//        $project_options = array_merge([['id' => '', 'name' => '项目']], $project_options);
         list($model, $model_name, $pre_uri) = array($this->model, $this->model_name, $this->pre_uri);
-        return view($this->view_path . 'create', compact('model', 'model_name','pre_uri', 'role_options'));
+        return view($this->view_path . 'create', compact('model', 'model_name','pre_uri', 'role_options', 'project_options'));
     }
 
     public function store(Request $request)
@@ -79,10 +90,22 @@ class UserController extends BaseController
         if($validator->fails()) {
             return back()->withErrors($validator)->withInput();
         }
+
         $data = $request->input('data');
+        $project_id = $data['project_id'];
+        $project_role_id = $data['project_role_id'];
         unset($data['password_confirmation']);
+        unset($data['project_id']);
+        unset($data['project_role_id']);
         $data['password'] = bcrypt($data['password']);
         $res = $this->model->create($data);
+        if($project_id || $project_role_id) {
+            ProjectUser::create([
+                'project_id' => $project_id,
+                'project_role_id' => $project_role_id,
+                'user_id' => $res['id']
+            ]);
+        }
         if(empty($res)) return back()->withErrors(['sg_error_info' => '保存失败']);
         return redirect($this->pre_uri . 'create')->with(['sg_success_info' => '创建成功']);
     }
@@ -91,8 +114,14 @@ class UserController extends BaseController
     {
         if(empty($request->input('id')) || empty($item = $this->model->find($request->input('id')))) return back()->withErrors(['sg_error_info' => '找不到要编辑的数据']);
         $role_options = $this->role->getOptions();
+        $project_options = $this->project->getOptions();
+//        $role_options = array_merge([['id' => '', 'name' => '项目角色']], $role_options);
+//        $project_options = array_merge([['id' => '', 'name' => '项目']], $project_options);
         list($model, $model_name, $pre_uri) = array($this->model, $this->model_name, $this->pre_uri);
-        return view($this->view_path . 'edit', compact('model', 'model_name', 'pre_uri', 'item', 'role_options'));
+        $project_user = ProjectUser::where('user_id', $item->id)->first();
+        $project_id = $project_user ? $project_user->project_id : '';
+        $project_role_id = $project_user ? $project_user->project_role_id : '';
+        return view($this->view_path . 'edit', compact('model', 'model_name', 'pre_uri', 'item', 'role_options', 'project_options', 'project_id', 'project_role_id'));
     }
 
     public function update(Request $request)
@@ -110,8 +139,19 @@ class UserController extends BaseController
         } else {
             unset($data['password']);
         }
+        $project_id = $data['project_id'];
+        $project_role_id = $data['project_role_id'];
         unset($data['password_confirmation']);
+        unset($data['project_id']);
+        unset($data['project_role_id']);
         $res = $this->model->where('id', $request->input('id'))->update($data);
+        if($project_id || $project_role_id) {
+            ProjectUser::updateOrCreate([
+                'project_id' => $project_id,
+                'project_role_id' => $project_role_id,
+                'user_id' => $request->input('id')
+            ]);
+        }
         if(!$res) return back()->withErrors(['sg_error_info' => '数据库保存失败!']);
         return back()->with(['sg_success_info' => '编辑成功']);
     }
@@ -119,6 +159,7 @@ class UserController extends BaseController
     public function delete(Request $request)
     {
         if(empty($request->input('id')) || empty($item = $this->model->find($request->input('id')))) return response()->json(['status' => 'fail', 'info' => '找不到要删除的数据']);
+        ProjectUser::where('user_id', $item->id)->delete();
         $res = $item->delete();
         if (!$res) return response()->json(['status' => 'fail', 'info' => '删除失败']);
         return response()->json(['status' => 'success', 'info' => '操作成功']);

+ 5 - 13
app/Models/BaseModel.php

xqd
@@ -49,19 +49,11 @@ class BaseModel extends Model
     }
     public function getValidator(Request $request, $type)
     {
-        if($type == 'store') {
-            $validator = Validator::make($request->input('data'), [
-                'name' => 'required'
-            ], [
-                'name.required' => '名称必填'
-            ]);
-        } else {
-            $validator = Validator::make($request->input('data'), [
-                'name' => 'required'
-            ], [
-                'name.required' => '名称必填'
-            ]);
-        }
+        $validator = Validator::make($request->input('data'), [
+            'user_id' => 'required'
+        ], [
+            'user_id.required' => '用户必填'
+        ]);
         return $validator;
     }
 

+ 21 - 0
app/Models/Device.php

xqd
@@ -5,4 +5,25 @@ namespace App\Models;
 class Device extends BaseModel
 {
     // 设备类型
+
+    public function getDeviceOptions()
+    {
+        $items = Device::select('name as text', 'id as value')->get();
+        $items = $items->prepend($this->transObject(['text' => '设备类型', 'value' => '']));
+        foreach ($items as $item) {
+            $names = DeviceName::where('device_id', $item->value)->select('name as text', 'id as value')->get();
+            $item->names = $names->prepend($this->transObject(['text' => '设备名称', 'value' => '']));
+            foreach($item->names as $name) {
+                $specs  = Spec::where('device_name_id', $name->value)->select('name as text', 'id as value')->get();
+                $name->specs = $specs->prepend($this->transObject(['text' => '规格型号', 'value' => '']));
+            }
+        }
+        return $items;
+    }
+
+
+    public function transObject($items)
+    {
+        return json_decode(json_encode($items));
+    }
 }

+ 4 - 1
app/Models/DeviceName.php

xqd
@@ -4,5 +4,8 @@ namespace App\Models;
 
 class DeviceName extends BaseModel
 {
-    //
+    public function device()
+    {
+        return $this->belongsTo('App\Models\Device', 'device_id');
+    }
 }

+ 29 - 0
app/Models/InnerDevice.php

xqd xqd
@@ -2,6 +2,9 @@
 
 namespace App\Models;
 
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Validator;
+
 class InnerDevice extends BaseModel
 {
     public function workPoint()
@@ -23,4 +26,30 @@ class InnerDevice extends BaseModel
     {
         return $this->belongsTo('App\Models\DeviceName', 'device_name_id');
     }
+
+    public function option()
+    {
+        return $this->belongsTo('App\Models\Option', 'status');
+    }
+
+    public function getValidator(Request $request, $type)
+    {
+        $validator = Validator::make($request->input('data'), [
+            'number' => 'required'
+        ], [
+            'number.required' => '固定资产编号'
+        ]);
+        $validator->after(function ($validator) use($request) {
+            if (!$request->input('device_id')) {
+                $validator->errors()->add('device_id', '设备类型必填');
+            }
+            if (!$request->input('device_name_id')) {
+                $validator->errors()->add('device_name_id', '设备名称必填');
+            }
+            if (!$request->input('spec_id')) {
+                $validator->errors()->add('spec_id', '规格型号必填');
+            }
+        });
+        return $validator;
+    }
 }

+ 5 - 0
app/Models/Project.php

xqd
@@ -70,4 +70,9 @@ class Project extends BaseModel
         $project_user = $this->getProjectUser($user, $is_draft == 1 ? 'current' : 'next');
         return $project_user ? $project_user['project_role_id'] : '';
     }
+
+    public static function getOptions()
+    {
+        return self::where('id', '>', 0)->get()->toArray();
+    }
 }

+ 5 - 0
app/Models/ProjectRole.php

xqd
@@ -32,4 +32,9 @@ class ProjectRole extends BaseModel
         ])->first();
         return $column ? ($item ? $item[$column] : '') : $item;
     }
+
+    public static function getOptions()
+    {
+        return self::where('id', '>', 0)->get()->toArray();
+    }
 }

+ 30 - 1
app/Models/Spec.php

xqd
@@ -2,7 +2,36 @@
 
 namespace App\Models;
 
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Validator;
+
 class Spec extends BaseModel
 {
-    //
+    public function device()
+    {
+        return $this->belongsTo('App\Models\Device', 'device_id');
+    }
+
+    public function device_name()
+    {
+        return $this->belongsTo('App\Models\DeviceName', 'device_name_id');
+    }
+
+    public function getValidator(Request $request, $type)
+    {
+        $validator = Validator::make($request->input('data'), [
+            'name' => 'required'
+        ], [
+            'name.required' => '规格型号必填'
+        ]);
+        $validator->after(function ($validator) use($request) {
+            if (!$request->input('device_id')) {
+                $validator->errors()->add('device_id', '设备类型必填');
+            }
+            if (!$request->input('device_name_id')) {
+                $validator->errors()->add('device_name_id', '设备名称必填');
+            }
+        });
+        return $validator;
+    }
 }

+ 18 - 2
app/Models/User.php

xqd xqd
@@ -42,7 +42,7 @@ class User extends Authenticatable
                 ['id', '!=', $request->input('id')],
                 ['name', '=', $data['name']]
             ])->first();
-            $validator->after(function ($validator) use($check) {
+            $validator->after(function ($validator) use($check, $request) {
                 if ($check) {
                     $validator->errors()->add('name', '用户名已存在');
                 }
@@ -66,11 +66,27 @@ class User extends Authenticatable
 
     public function projects()
     {
-        return $this->belongsToMany('App\Models\Project', 'project_users', 'project_id', 'user_id');
+        return $this->belongsToMany('App\Models\Project', 'project_users', 'user_id', 'project_id');
     }
 
     public function project_roles()
     {
         return $this->belongsToMany('App\Models\ProjectRole', 'project_users', 'project_role_id', 'user_id');
     }
+
+    public function getProjectRoleName()
+    {
+        $ids = ProjectUser::where('user_id', $this['id'])->pluck('project_role_id');
+        return ProjectRole::whereIn('id', $ids)->pluck('name')->implode(',');
+    }
+
+    public function getProjectName()
+    {
+        return $this->projects()->pluck('name')->implode(',');
+    }
+
+    public static function getOptions()
+    {
+        return self::where('id', '>', 0)->get()->toArray();
+    }
 }

+ 9 - 6
database/seeds/MiniSeeder.php

xqd
@@ -44,13 +44,16 @@ class MiniSeeder extends Seeder
             $project = \App\Models\Project::create([
                 'name' => '项目' . ($i + 2)
             ]);
-            for($j = 0; $j < count($users); ++$j) {
-                \App\Models\ProjectUser::create([
-                    'project_id' => $project->id,
-                    'user_id' => $users[$j]->id,
-                    'project_role_id' => $project_roles[$j]->id
-                ]);
+            if($i == 1) {
+                for($j = 0; $j < count($users); ++$j) {
+                    \App\Models\ProjectUser::create([
+                        'project_id' => $project->id,
+                        'user_id' => $users[$j]->id,
+                        'project_role_id' => $project_roles[$j]->id
+                    ]);
+                }
             }
+
         }
 
         \App\Models\Device::truncate();

+ 90 - 1
resources/views/admin/base/index/welcome.blade.php

xqd
@@ -1 +1,90 @@
-欢迎您~
+@extends('admin.layout-content')
+
+@section('header')
+    <style>
+        .sg-stat-box {
+            display: flex;
+            align-items: center;
+            justify-content: space-between;
+        }
+        .sg-stat-list {
+            display: flex;
+            align-items: center;
+            justify-content: space-around;
+        }
+        .sg-stat-box .sg-left {
+            display: flex;
+            align-items: center;
+            justify-content: center;
+        }
+        .sg-stat-list .sg-item {
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            flex-direction: column;
+            padding: 0 30px;
+        }
+        .sg-stat-list .sg-item:not(:last-child) {
+            border-right: 1px solid #ddd;
+        }
+        .sg-stat-list .sg-item .sg-label {
+            margin-top: 15px;
+            color: grey;
+        }
+        .sg-stat-list .sg-item .sg-number {
+            font-weight: bold;
+            font-size: 1.3rem;
+        }
+    </style>
+@endsection
+
+@section('content')
+    <div class="sg-container layui-container" style="background: #F3F3F4">
+        <div class="layui-row">
+            <div class="layui-card" style="margin-top: 30px;">
+                <div class="layui-card-body">
+                    <div class="sg-stat-box">
+                        <div class="sg-left">
+                            <img src="/images/avatar.png" class="sg-avatar">
+                            {{--<div class="sg-name">{{ $_user->name }}</div>--}}
+                        </div>
+                        <div class="sg-stat-list">
+                            <div class="sg-item">
+                                <div class="sg-number">{{ $total_device }}</div>
+                                <div class="sg-label">内部设备数目</div>
+                            </div>
+                            <div class="sg-item">
+                                <div class="sg-number">{{ $total_device }}</div>
+                                <div class="sg-label">项目数</div>
+                            </div>
+                            <div class="sg-item">
+                                <div class="sg-number">{{ $total_device }}</div>
+                                <div class="sg-label">订单数</div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+        {{--<div class="layui-row">--}}
+            {{--<div class="layui-card" style="margin-top: 30px;">--}}
+                {{--<div class="layui-card-body">--}}
+                    {{--<div class="sg-action-list">--}}
+                        {{--<a class="sg-action" href="">--}}
+                            {{--<i></i>--}}
+                            {{--<div>设备管理</div>--}}
+                        {{--</a>--}}
+                    {{--</div>--}}
+                {{--</div>--}}
+            {{--</div>--}}
+        {{--</div>--}}
+    </div>
+@endsection
+
+@section('footer')
+    <script>
+        $(function () {
+
+        })
+    </script>
+@endsection

+ 57 - 0
resources/views/admin/device-names/change-password.blade.php

xqd
@@ -0,0 +1,57 @@
+@extends('admin.layout-content')
+
+@section('header')
+    <style>
+
+    </style>
+@endsection
+
+@section('content')
+    <div class="layui-card">
+        <div class="layui-card-header sg-card-header">修改密码</div>
+        <div class="layui-card-body">
+            <div class="layui-container">
+                <div class="layui-row">
+                    <div class="layui-col-sm8 layui-col-sm-offset2">
+                        <form class="layui-form" method="POST" action="{{ $pre_uri . 'updatePassword' }}">
+
+                            {{ csrf_field() }}
+                            <input type="hidden" name="id" value="{{ $item->id }}">
+                            @include('share.layui-form-item', ['type' => 'input', 'input_type' =>
+                            'password', 'name' => 'old_password', 'label' => '原来密码', 'value' => '', 'placeholder' => '请输入原来密码'])
+                            @include('share.layui-form-item', ['type' => 'input', 'input_type' =>
+                            'password', 'name' => 'password', 'label' => '新的密码', 'value' => '', 'placeholder' => '请输入新密码'])
+                            @include('share.layui-form-item', ['type' => 'input', 'input_type' =>
+                            'password', 'name' => 'password_confirmation', 'label' => '确认密码', 'value' => ''])
+                            <div class="layui-form-item">
+                                <div class="layui-input-block">
+                                    <button class="layui-btn" lay-submit lay-filter="formDemo">提交</button>
+                                    <button type="reset" class="layui-btn layui-btn-primary">重置</button>
+                                </div>
+                            </div>
+                        </form>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+@endsection
+
+@section('footer')
+    <script>
+        $(function () {
+            layui.use('form', function(){
+                // var form = layui.form;
+
+                // form.verify({
+                //     integer: function (value) {
+                //         var pattern = /^[1-9]\d*$/;
+                //         if(!(pattern.test(value) || value === '0')) {
+                //             return '排序必须为大于等于0的整数';
+                //         }
+                //     }
+                // })
+            });
+        })
+    </script>
+@endsection

+ 61 - 0
resources/views/admin/device-names/create.blade.php

xqd
@@ -0,0 +1,61 @@
+@extends('admin.layout-content')
+
+@section('header')
+    <style>
+
+    </style>
+@endsection
+
+@section('content')
+    <div class="layui-container sg-create-container">
+        <div class="layui-col-sm8 layui-col-sm-offset2">
+            <form class="layui-form" method="POST" action="{{ $pre_uri . 'store' }}">
+
+                {{ csrf_field() }}
+                @include('share.layui-form-item', ['type' => 'select', 'name' => 'device_id', 'label' => '设备类型', 'selected_id' => (old('data') ? old('data')['device_id'] : ''), 'options' => $device_options])
+                @include('share.layui-form-item', ['type' => 'input', 'name' => 'name', 'label' => '设备名称', 'required' => true, 'value' => (old('data') ? old('data')['name'] : '')])
+                @include('share.layui-form-item', ['type' => 'input', 'input_type' => 'input', 'name' => 'sort', 'label' => '排序', 'required' => true, 'value' => ''])
+                <div class="layui-form-item">
+                    <div class="layui-input-block">
+                        <button class="layui-btn" lay-submit lay-filter="*">提交</button>
+                        <button type="reset" class="layui-btn layui-btn-primary">重置</button>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                </div>
+            </form>
+        </div>
+    </div>
+@endsection
+
+@section('footer')
+    <script>
+        $(function () {
+            layui.use(['form', 'laydate'], function(){
+                var form = layui.form;
+                var laydate = layui.laydate;
+
+                // form.verify({
+                //     integer: function (value) {
+                //         var pattern = /^[1-9]\d*$/;
+                //         if(!(pattern.test(value) || value === '0')) {
+                //             return '组员人数必须为大于等于0的整数';
+                //         }
+                //     }
+                // });
+
+                form.on('submit(*)', function(data) {
+                    var field = data.field;
+                    if(field['data[road_id]'] !== '-1' && field['data[zone_id]'] === '-1') {
+                        layer.msg('选择街道前请先选择功能区');
+                        return false;
+                    }
+                });
+
+                laydate.render({
+                    elem: '.sg-select-date'
+                });
+            });
+        })
+    </script>
+@endsection

+ 47 - 0
resources/views/admin/device-names/edit.blade.php

xqd
@@ -0,0 +1,47 @@
+@extends('admin.layout-content')
+
+@section('header')
+    <style>
+
+    </style>
+@endsection
+
+@section('content')
+    <div class="layui-container sg-create-container">
+        <div class="layui-col-sm8 layui-col-sm-offset2">
+            <form class="layui-form" method="POST" action="{{ $pre_uri . 'update' }}">
+
+                {{ csrf_field() }}
+                <input type="hidden" name="id" value="{{ $item->id }}">
+                @include('share.layui-form-item', ['type' => 'select', 'name' => 'device_id', 'label' => '设备类型', 'selected_id' => $item->device_id, 'options' => $device_options])
+                @include('share.layui-form-item', ['type' => 'input', 'name' => 'name', 'label' => '设备名称', 'required' => true, 'value' => $item->name])
+                @include('share.layui-form-item', ['type' => 'input', 'input_type' => 'input', 'name' => 'sort', 'label' => '排序', 'required' => true, 'value' => $item->sort])
+                <div class="layui-form-item">
+                    <div class="layui-input-block">
+                        <button class="layui-btn" lay-submit lay-filter="formDemo">提交</button>
+                        <button type="reset" class="layui-btn layui-btn-primary">重置</button>
+                    </div>
+                </div>
+            </form>
+        </div>
+    </div>
+@endsection
+
+@section('footer')
+    <script>
+        $(function () {
+            layui.use('form', function(){
+                // var form = layui.form;
+
+                // form.verify({
+                //     integer: function (value) {
+                //         var pattern = /^[1-9]\d*$/;
+                //         if(!(pattern.test(value) || value === '0')) {
+                //             return '排序必须为大于等于0的整数';
+                //         }
+                //     }
+                // })
+            });
+        })
+    </script>
+@endsection

+ 228 - 0
resources/views/admin/device-names/index.blade.php

xqd
@@ -0,0 +1,228 @@
+@extends('admin.layout-content')
+
+@section('header')
+    <style>
+
+    </style>
+@endsection
+
+@section('content')
+    <div class="layui-card">
+        <div class="layui-card-header sg-card-header">
+            {{ $model_name }}管理
+            <div class="sg-card-create">
+                <button id="sg-create-btn" class="layui-btn layui-btn-sm">创建{{ $model_name }}</button>
+            </div>
+        </div>
+        <div class="layui-card-body">
+            <form class="layui-form" id="sg-search-form">
+                <div class="layui-form-item layui-row">
+                    <div class="layui-inline">
+                        <div class="layui-input-inline">
+                            <select name="device_name_id">
+                                <option value="0">设备类型</option>
+                                @foreach($device_options as $option)
+                                    <option value="{{ $option['id'] }}" {{ request('device_id') == $option['id'] ? 'selected' : ''  }}>{{ $option['name'] }}</option>
+                                @endforeach
+                            </select>
+                        </div>
+                    </div>
+                    <div class="layui-inline">
+                        <div class="layui-input-inline">
+                            <input type="text" name="name" placeholder="请输入设备名称" autocomplete="off" class="layui-input" value="{{ request('name') }}">
+                        </div>
+                    </div>
+                    <div class="layui-inline">
+                        <div class="layui-btn" id="sg-search-btn">搜索</div>
+                    </div>
+                </div>
+            </form>
+            <table id="sg-main-table" class="layui-hide" lay-filter="tableEvent"></table>
+            <script type="text/html" id="sg-table-bar">
+                <div class="layui-btn-group">
+                    <div class="layui-btn-group">
+                        <a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
+                        <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="delete">删除</a>
+                    </div>
+                </div>
+            </script>
+        </div>
+    </div>
+@endsection
+
+@section('footer')
+    <script>
+        $(function () {
+            layui.use(['table', 'layer'], function(){
+                var table = layui.table,
+                    layer = layui.layer,
+                    form = layui.form,
+                    laydate = layui.laydate,
+                    top_window = window;
+
+                table.render({
+                    elem: '#sg-main-table',
+                    url: '{{ $pre_uri }}' + 'get',
+                    cellMinWidth: 80,
+                    cols: [[
+                        { field: 'device_type', title: '设备类型', align: 'center' },
+                        { field: 'name', title: '设备名称', align: 'center' },
+                        { field: 'sort', title: '排序', align: 'center' },
+                        { title: '操作', align:'center', toolbar: '#sg-table-bar' }
+                    ]],
+                    page: {
+                        layout: ['count', 'prev', 'page', 'next', 'skip', 'refresh'],
+                        limit: 15
+                    },
+                    even: true,
+                    where: transformToJson($('#sg-search-form').serializeArray()),
+                    done: function(res, curr, count) {
+
+                    }
+                });
+                table.on('tool(tableEvent)', function(obj){
+                    var data = obj.data;
+                    if(obj.event === 'delete'){
+                        layer.confirm('确定要删除吗?', function(index) {
+                            $.ajax({
+                                method: 'POST',
+                                url: '{{ $pre_uri }}' + 'delete',
+                                headers: {
+                                    'X-CSRF-TOKEN': '{{ csrf_token() }}'
+                                },
+                                data: {
+                                    id: data.id
+                                },
+                                success: function (data) {
+                                    if(data.status === 'success') {
+                                        obj.del();
+                                    } else {
+                                        layer.msg(data.info, {
+                                            icon: 2
+                                        });
+                                    }
+                                    layer.close(index);
+                                },
+                                error: function () {
+                                    layer.close(index);
+                                    layer.msg('删除失败', {
+                                        icon: 2
+                                    });
+                                }
+                            });
+                        });
+                    } else if(obj.event === 'edit') {
+                        layer.open({
+                            title: '编辑账号',
+                            type: 2,
+                            area: ['90%', '90%'],
+                            content: '{{ $pre_uri }}' + 'edit?id=' + data.id,
+                            end: function () {
+                                top_window.location.reload();
+                            }
+                        });
+                    }
+                });
+
+                if($('#search-begin-date').length > 0) {
+                    laydate.render({
+                        elem: '#search-begin-date',
+                        done: function () {
+                            updateTableBySearch();
+                        }
+                    });
+                }
+
+                if($('#search-end-date').length > 0) {
+                    laydate.render({
+                        elem: '#search-end-date',
+                        done: function () {
+                            updateTableBySearch();
+                        }
+                    });
+                }
+
+                function transformToJson(formData){
+                    var obj={};
+                    for (var i in formData) {
+                        obj[formData[i].name]=formData[i]['value'];
+                    }
+                    return obj;
+                }
+
+                function updateTableBySearch() {
+                    table.reload('sg-main-table', {
+                        where: transformToJson($('#sg-search-form').serializeArray()),
+                        page: {
+                            curr: 1
+                        }
+                    });
+                }
+
+                $('#sg-search-btn').click(function() {
+                    updateTableBySearch();
+                });
+                // $('#sg-search-form').change(function () {
+                //     updateTableBySearch();
+                // });
+                //
+                // form.on('select()', function(){
+                //     updateTableBySearch();
+                // });
+
+                $('#sg-create-btn').on('click', function () {
+                    layer.open({
+                        title: '创建' + '{{ $model_name }}',
+                        type: 2,
+                        area: ['90%', '90%'],
+                        content: '{{ $pre_uri }}' + 'create',
+                        end: function () {
+                            top_window.location.reload();
+                        }
+                    });
+                });
+
+                $('#sg-table-top-container').on('click', '.btn-delete-many', function () {
+                    layer.confirm('确定要删除所有选中行吗?', function () {
+                        var data = table.checkStatus('sg-main-table').data;
+                        if(data.length <= 0) {
+                            layer.msg('选择不能为空', {
+                                icon: 2
+                            });
+                            return false;
+                        }
+                        var ids = [];
+                        for(var i = 0; i < data.length; ++i) {
+                            ids.push(data[i]['id']);
+                        }
+                        $.ajax({
+                            method: 'POST',
+                            url: '{{ $pre_uri }}' + 'deleteMany',
+                            headers: {
+                                'X-CSRF-TOKEN': '{{ csrf_token() }}'
+                            },
+                            data: {
+                                ids: JSON.stringify(ids)
+                            },
+                            success: function (data) {
+                                if(data.status === 'success') {
+                                    top_window.location.reload();
+                                } else {
+                                    layer.msg(data.info, {
+                                        icon: 2
+                                    });
+                                }
+
+                            },
+                            error: function () {
+                                layer.msg('删除失败', {
+                                    icon: 2
+                                });
+                            }
+                        });
+                    })
+                });
+            });
+        })
+    </script>
+@endsection

+ 52 - 0
resources/views/admin/devices/create.blade.php

xqd
@@ -0,0 +1,52 @@
+@extends('admin.layout-content')
+
+@section('header')
+    <style>
+
+    </style>
+@endsection
+
+@section('content')
+    <div class="layui-container sg-create-container">
+        <div class="layui-col-sm8 layui-col-sm-offset2">
+            <form class="layui-form" method="POST" action="{{ $pre_uri . 'store' }}">
+
+                {{ csrf_field() }}
+                @include('share.layui-form-item', ['type' => 'input', 'name' => 'name', 'label' => '名称', 'required' => true, 'value' => (old('data') ? old('data')['name'] : '')])
+                @include('share.layui-form-item', ['type' => 'input', 'name' => 'sort', 'label' => '排序', 'required' => true, 'value' => (old('data') ? old('data')['sort'] : '')])
+                <div class="layui-form-item">
+                    <div class="layui-input-block">
+                        <button class="layui-btn" lay-submit lay-filter="formDemo">提交</button>
+                        <button type="reset" class="layui-btn layui-btn-primary">重置</button>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                </div>
+            </form>
+        </div>
+    </div>
+@endsection
+
+@section('footer')
+    <script>
+        $(function () {
+            layui.use(['form', 'laydate'], function(){
+                var form = layui.form;
+                var laydate = layui.laydate;
+
+                // form.verify({
+                //     integer: function (value) {
+                //         var pattern = /^[1-9]\d*$/;
+                //         if(!(pattern.test(value) || value === '0')) {
+                //             return '组员人数必须为大于等于0的整数';
+                //         }
+                //     }
+                // });
+
+                laydate.render({
+                    elem: '.sg-select-date'
+                });
+            });
+        })
+    </script>
+@endsection

+ 53 - 0
resources/views/admin/devices/edit.blade.php

xqd
@@ -0,0 +1,53 @@
+@extends('admin.layout-content')
+
+@section('header')
+    <style>
+
+    </style>
+@endsection
+
+@section('content')
+    <div class="layui-container sg-create-container">
+        <div class="layui-col-sm8 layui-col-sm-offset2">
+            <form class="layui-form" method="POST" action="{{ $pre_uri . 'update' }}">
+
+                {{ csrf_field() }}
+                <input type="hidden" name="id" value="{{ $item->id }}">
+                @include('share.layui-form-item', ['type' => 'input', 'name' => 'name', 'label' => '名称', 'required' => true, 'value' => ($item->name ? $item->name : '')])
+                @include('share.layui-form-item', ['type' => 'input', 'name' => 'sort', 'label' => '排序', 'required' => true, 'value' => ($item->sort ? $item->sort : '')])
+                <div class="layui-form-item">
+                    <div class="layui-input-block">
+                        <button class="layui-btn" lay-submit lay-filter="formDemo">提交</button>
+                        <button type="reset" class="layui-btn layui-btn-primary">重置</button>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                </div>
+            </form>
+        </div>
+    </div>
+@endsection
+
+@section('footer')
+    <script>
+        $(function () {
+            layui.use(['form', 'laydate'], function(){
+                var form = layui.form;
+                var laydate = layui.laydate;
+
+                // form.verify({
+                //     integer: function (value) {
+                //         var pattern = /^[1-9]\d*$/;
+                //         if(!(pattern.test(value) || value === '0')) {
+                //             return '组员人数必须为大于等于0的整数';
+                //         }
+                //     }
+                // });
+
+                laydate.render({
+                    elem: '.sg-select-date'
+                });
+            });
+        })
+    </script>
+@endsection

+ 218 - 0
resources/views/admin/devices/index.blade.php

xqd
@@ -0,0 +1,218 @@
+@extends('admin.layout-content')
+
+@section('header')
+    <style>
+
+    </style>
+@endsection
+
+@section('content')
+    <div class="layui-card">
+        <div class="layui-card-header sg-card-header">
+            {{ $model_name }}管理
+            <div class="sg-card-create">
+                <button id="sg-create-btn" class="layui-btn layui-btn-sm">创建</button>
+            </div>
+        </div>
+        <div class="layui-card-body">
+            <form class="layui-form" id="sg-search-form">
+                <div class="layui-form-item layui-row">
+                    <div class="layui-inline">
+                        <div class="layui-input-inline">
+                            <input type="text" name="name" placeholder="请输入名称" autocomplete="off" class="layui-input" value="{{ request('name') }}">
+                        </div>
+                    </div>
+                    <div class="layui-inline">
+                        <div class="layui-btn" id="sg-search-btn">搜索</div>
+                    </div>
+                </div>
+            </form>
+            <table id="sg-main-table" class="layui-hide" lay-filter="tableEvent"></table>
+            <script type="text/html" id="sg-table-bar">
+                <div class="layui-btn-group">
+                    <div class="layui-btn-group">
+                        <a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
+                        <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="delete">删除</a>
+                    </div>
+                </div>
+            </script>
+        </div>
+    </div>
+@endsection
+
+@section('footer')
+    <script>
+        $(function () {
+            layui.use(['table', 'layer'], function(){
+                var table = layui.table,
+                    layer = layui.layer,
+                    form = layui.form,
+                    laydate = layui.laydate,
+                    top_window = window;
+
+                table.render({
+                    elem: '#sg-main-table',
+                    url: '{{ $pre_uri }}' + 'get',
+                    cellMinWidth: 80,
+                    cols: [[
+                        { field: 'id', title: 'ID', align: 'center' },
+                        { field: 'name', title: '名称', align: 'center' },
+                        { field: 'sort', title: '排序', align: 'center' },
+                        { title: '操作', align:'center', toolbar: '#sg-table-bar' }
+                    ]],
+                    page: {
+                        layout: ['count', 'prev', 'page', 'next', 'skip', 'refresh'],
+                        limit: 15
+                    },
+                    even: true,
+                    where: transformToJson($('#sg-search-form').serializeArray()),
+                    done: function(res, curr, count) {
+
+                    }
+                });
+                table.on('tool(tableEvent)', function(obj){
+                    var data = obj.data;
+                    if(obj.event === 'delete'){
+                        layer.confirm('确定要删除吗?', function(index) {
+                            $.ajax({
+                                method: 'POST',
+                                url: '{{ $pre_uri }}' + 'delete',
+                                headers: {
+                                    'X-CSRF-TOKEN': '{{ csrf_token() }}'
+                                },
+                                data: {
+                                    id: data.id
+                                },
+                                success: function (data) {
+                                    if(data.status === 'success') {
+                                        obj.del();
+                                    } else {
+                                        layer.msg(data.info, {
+                                            icon: 2
+                                        });
+                                    }
+                                    layer.close(index);
+                                },
+                                error: function () {
+                                    layer.close(index);
+                                    layer.msg('删除失败', {
+                                        icon: 2
+                                    });
+                                }
+                            });
+                        });
+                    } else if(obj.event === 'edit') {
+                        layer.open({
+                            title: '编辑成员',
+                            type: 2,
+                            area: ['90%', '90%'],
+                            content: '{{ $pre_uri }}' + 'edit?id=' + data.id,
+                            end: function () {
+                                top_window.location.reload();
+                            }
+                        });
+                    }
+                });
+
+                if($('#search-begin-date').length > 0) {
+                    laydate.render({
+                        elem: '#search-begin-date',
+                        done: function () {
+                            updateTableBySearch();
+                        }
+                    });
+                }
+
+                if($('#search-end-date').length > 0) {
+                    laydate.render({
+                        elem: '#search-end-date',
+                        done: function () {
+                            updateTableBySearch();
+                        }
+                    });
+                }
+
+                function transformToJson(formData){
+                    var obj={};
+                    for (var i in formData) {
+                        obj[formData[i].name]=formData[i]['value'];
+                    }
+                    return obj;
+                }
+
+                function updateTableBySearch() {
+                    table.reload('sg-main-table', {
+                        where: transformToJson($('#sg-search-form').serializeArray()),
+                        page: {
+                            curr: 1
+                        }
+                    });
+                }
+
+                $('#sg-search-btn').click(function() {
+                    updateTableBySearch();
+                });
+                // $('#sg-search-form').change(function () {
+                //     updateTableBySearch();
+                // });
+                //
+                // form.on('select()', function(){
+                //     updateTableBySearch();
+                // });
+
+                $('#sg-create-btn').on('click', function () {
+                    layer.open({
+                        title: '创建' + '{{ $model_name }}',
+                        type: 2,
+                        area: ['90%', '90%'],
+                        content: '{{ $pre_uri }}' + 'create',
+                        end: function () {
+                            top_window.location.reload();
+                        }
+                    });
+                });
+
+                $('#sg-table-top-container').on('click', '.btn-delete-many', function () {
+                    layer.confirm('确定要删除所有选中行吗?', function () {
+                        var data = table.checkStatus('sg-main-table').data;
+                        if(data.length <= 0) {
+                            layer.msg('选择不能为空', {
+                                icon: 2
+                            });
+                            return false;
+                        }
+                        var ids = [];
+                        for(var i = 0; i < data.length; ++i) {
+                            ids.push(data[i]['id']);
+                        }
+                        $.ajax({
+                            method: 'POST',
+                            url: '{{ $pre_uri }}' + 'deleteMany',
+                            headers: {
+                                'X-CSRF-TOKEN': '{{ csrf_token() }}'
+                            },
+                            data: {
+                                ids: JSON.stringify(ids)
+                            },
+                            success: function (data) {
+                                if(data.status === 'success') {
+                                    top_window.location.reload();
+                                } else {
+                                    layer.msg(data.info, {
+                                        icon: 2
+                                    });
+                                }
+
+                            },
+                            error: function () {
+                                layer.msg('删除失败', {
+                                    icon: 2
+                                });
+                            }
+                        });
+                    })
+                });
+            });
+        })
+    </script>
+@endsection

+ 57 - 0
resources/views/admin/inner-devices/create.blade.php

xqd
@@ -0,0 +1,57 @@
+@extends('admin.layout-content')
+
+@section('header')
+    <style>
+
+    </style>
+@endsection
+
+@section('content')
+    <div class="layui-container sg-create-container">
+        <div class="layui-col-sm8 layui-col-sm-offset2">
+            <form class="layui-form" method="POST" action="{{ $pre_uri . 'store' }}">
+
+                {{ csrf_field() }}
+                @include('share.device-select-form', ['device_id' => '', 'device_name_id' => '', 'spec_id' => '', 'options' => $options])
+                @include('share.layui-form-item', ['type' => 'radio', 'name' => 'status', 'label' => '状态', 'selected_id' => (old('data') ? old('data')['status'] : ''), 'options' => $status_options])
+                @include('share.layui-form-item', ['type' => 'input', 'name' => 'number', 'label' => '固定资产编号', 'required' => true, 'value' => (old('data') ? old('data')['number'] : '')])
+                @include('share.layui-form-item', ['id' => 'sg-produce-date', 'type' => 'date', 'name' => 'produce_date', 'label' => '出厂日期', 'required' => true, 'value' => (old('data') ? old('data')['produce_date'] : '')])
+                @include('share.layui-form-item', ['type' => 'input', 'name' => 'shape', 'label' => '外形尺寸', 'required' => true, 'value' => (old('data') ? old('data')['shape'] : '')])
+                @include('share.layui-form-item', ['type' => 'input', 'name' => 'buy_origin', 'label' => '采购原值', 'required' => true, 'value' => (old('data') ? old('data')['buy_origin'] : '')])
+                @include('share.layui-form-item', ['type' => 'input', 'name' => 'manufacturer', 'label' => '生产厂家', 'required' => true, 'value' => (old('data') ? old('data')['manufacturer'] : '')])
+                <div class="layui-form-item">
+                    <div class="layui-input-block">
+                        <button class="layui-btn" lay-submit lay-filter="formDemo">提交</button>
+                        <button type="reset" class="layui-btn layui-btn-primary">重置</button>
+                    </div>
+                </div>
+            </form>
+        </div>
+    </div>
+@endsection
+
+@section('footer')
+    <script>
+        $(function () {
+            layui.use(['form', 'laydate'], function(){
+                var form = layui.form;
+                var laydate = layui.laydate;
+
+                // form.verify({
+                //     integer: function (value) {
+                //         var pattern = /^[1-9]\d*$/;
+                //         if(!(pattern.test(value) || value === '0')) {
+                //             return '组员人数必须为大于等于0的整数';
+                //         }
+                //     }
+                // });
+
+                console.log($('.sg-select-date')[0]);
+
+                laydate.render({
+                    elem: '.sg-select-date'
+                });
+            });
+        })
+    </script>
+@endsection

+ 58 - 0
resources/views/admin/inner-devices/edit.blade.php

xqd
@@ -0,0 +1,58 @@
+@extends('admin.layout-content')
+
+@section('header')
+    <style>
+
+    </style>
+@endsection
+
+@section('content')
+    <div class="layui-container sg-create-container">
+        <div class="layui-col-sm8 layui-col-sm-offset2">
+            <form class="layui-form" method="POST" action="{{ $pre_uri . 'update' }}">
+
+                {{ csrf_field() }}
+                <input type="hidden" name="id" value="{{ $item->id }}">
+                @include('share.device-select-form', ['device_id' => $item->device_id, 'device_name_id' => $item->device_name_id, 'spec_id' => $item->spec_id, 'options' => $options])
+                @include('share.layui-form-item', ['type' => 'radio', 'name' => 'status', 'label' => '状态', 'selected_id' => $item->status, 'options' => $status_options])
+                @include('share.layui-form-item', ['type' => 'input', 'name' => 'number', 'label' => '固定资产编号', 'required' => true, 'value' => $item->number])
+                @include('share.layui-form-item', ['id' => 'sg-produce-date', 'type' => 'date', 'name' => 'produce_date', 'label' => '出厂日期', 'required' => true, 'value' => $item->produce_date])
+                @include('share.layui-form-item', ['type' => 'input', 'name' => 'shape', 'label' => '外形尺寸', 'required' => true, 'value' => $item->shape])
+                @include('share.layui-form-item', ['type' => 'input', 'name' => 'buy_origin', 'label' => '采购原值', 'required' => true, 'value' => $item->buy_origin])
+                @include('share.layui-form-item', ['type' => 'input', 'name' => 'manufacturer', 'label' => '生产厂家', 'required' => true, 'value' => $item->manufacturer])
+                <div class="layui-form-item">
+                    <div class="layui-input-block">
+                        <button class="layui-btn" lay-submit lay-filter="formDemo">提交</button>
+                        <button type="reset" class="layui-btn layui-btn-primary">重置</button>
+                    </div>
+                </div>
+            </form>
+        </div>
+    </div>
+@endsection
+
+@section('footer')
+    <script>
+        $(function () {
+            layui.use(['form', 'laydate'], function(){
+                var form = layui.form;
+                var laydate = layui.laydate;
+
+                // form.verify({
+                //     integer: function (value) {
+                //         var pattern = /^[1-9]\d*$/;
+                //         if(!(pattern.test(value) || value === '0')) {
+                //             return '组员人数必须为大于等于0的整数';
+                //         }
+                //     }
+                // });
+
+                console.log($('.sg-select-date')[0]);
+
+                laydate.render({
+                    elem: '.sg-select-date'
+                });
+            });
+        })
+    </script>
+@endsection

+ 235 - 0
resources/views/admin/inner-devices/index.blade.php

xqd
@@ -0,0 +1,235 @@
+@extends('admin.layout-content')
+
+@section('header')
+    <style>
+
+    </style>
+@endsection
+
+@section('content')
+    <div class="layui-card">
+        <div class="layui-card-header sg-card-header">
+            {{ $model_name }}管理
+            <div class="sg-card-create">
+                <button id="sg-create-btn" class="layui-btn layui-btn-sm">创建</button>
+            </div>
+        </div>
+        <div class="layui-card-body">
+            <form class="layui-form" id="sg-search-form">
+                <div class="layui-form-item layui-row">
+                    @include('share.device-select', ['device_id' => '', 'device_name_id' => '', 'spec_id' => '', 'options' => $options])
+                    <div class="layui-inline">
+                        <div class="layui-input-inline">
+                            <select name="status">
+                                <option value="0">状态</option>
+                                @foreach($statuses as $option)
+                                    <option value="{{ $option['id'] }}" {{ request('status') == $option['id'] ? 'selected' : ''  }}>{{ $option['name'] }}</option>
+                                @endforeach
+                            </select>
+                        </div>
+                    </div>
+                    <div class="layui-inline">
+                        <div class="layui-input-inline">
+                            <input type="text" name="number" placeholder="请输入固定资产编号" autocomplete="off" class="layui-input" value="{{ request('number') }}">
+                        </div>
+                    </div>
+                    <div class="layui-inline">
+                        <div class="layui-btn" id="sg-search-btn">搜索</div>
+                    </div>
+                </div>
+            </form>
+            <table id="sg-main-table" class="layui-hide" lay-filter="tableEvent"></table>
+            <script type="text/html" id="sg-table-bar">
+                <div class="layui-btn-group">
+                    <div class="layui-btn-group">
+                        <a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
+                        <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="delete">删除</a>
+                    </div>
+                </div>
+            </script>
+        </div>
+    </div>
+@endsection
+
+@section('footer')
+    <script>
+        $(function () {
+
+            layui.use(['table', 'layer'], function(){
+                var table = layui.table,
+                    layer = layui.layer,
+                    form = layui.form,
+                    laydate = layui.laydate,
+                    top_window = window;
+
+                table.render({
+                    elem: '#sg-main-table',
+                    url: '{{ $pre_uri }}' + 'get',
+                    cellMinWidth: 80,
+                    cols: [[
+                        { field: 'id', title: 'ID', align: 'center' },
+                        { field: 'device_type', title: '类型', align: 'center' },
+                        { field: 'device_name_name', title: '名称', align: 'center' },
+                        { field: 'spec_name', title: '规格型号', align: 'center' },
+                        { field: 'number', title: '固定资产编号', align: 'center' },
+                        { field: 'produce_date', title: '出厂日期', align: 'center' },
+                        { field: 'shape', title: '外形尺寸', align: 'center' },
+                        { field: 'status', title: '状态', align: 'center' },
+                        { title: '操作', align:'center', toolbar: '#sg-table-bar' }
+                    ]],
+                    page: {
+                        layout: ['count', 'prev', 'page', 'next', 'skip', 'refresh'],
+                        limit: 15
+                    },
+                    even: true,
+                    where: transformToJson($('#sg-search-form').serializeArray()),
+                    done: function(res, curr, count) {
+
+                    }
+                });
+                table.on('tool(tableEvent)', function(obj){
+                    var data = obj.data;
+                    if(obj.event === 'delete'){
+                        layer.confirm('确定要删除吗?', function(index) {
+                            $.ajax({
+                                method: 'POST',
+                                url: '{{ $pre_uri }}' + 'delete',
+                                headers: {
+                                    'X-CSRF-TOKEN': '{{ csrf_token() }}'
+                                },
+                                data: {
+                                    id: data.id
+                                },
+                                success: function (data) {
+                                    if(data.status === 'success') {
+                                        obj.del();
+                                    } else {
+                                        layer.msg(data.info, {
+                                            icon: 2
+                                        });
+                                    }
+                                    layer.close(index);
+                                },
+                                error: function () {
+                                    layer.close(index);
+                                    layer.msg('删除失败', {
+                                        icon: 2
+                                    });
+                                }
+                            });
+                        });
+                    } else if(obj.event === 'edit') {
+                        layer.open({
+                            title: '编辑成员',
+                            type: 2,
+                            area: ['90%', '90%'],
+                            content: '{{ $pre_uri }}' + 'edit?id=' + data.id,
+                            end: function () {
+                                top_window.location.reload();
+                            }
+                        });
+                    }
+                });
+
+                if($('#search-begin-date').length > 0) {
+                    laydate.render({
+                        elem: '#search-begin-date',
+                        done: function () {
+                            updateTableBySearch();
+                        }
+                    });
+                }
+
+                if($('#search-end-date').length > 0) {
+                    laydate.render({
+                        elem: '#search-end-date',
+                        done: function () {
+                            updateTableBySearch();
+                        }
+                    });
+                }
+
+                function transformToJson(formData){
+                    var obj={};
+                    for (var i in formData) {
+                        obj[formData[i].name]=formData[i]['value'];
+                    }
+                    return obj;
+                }
+
+                function updateTableBySearch() {
+                    table.reload('sg-main-table', {
+                        where: transformToJson($('#sg-search-form').serializeArray()),
+                        page: {
+                            curr: 1
+                        }
+                    });
+                }
+
+                $('#sg-search-btn').click(function() {
+                    updateTableBySearch();
+                });
+                // $('#sg-search-form').change(function () {
+                //     updateTableBySearch();
+                // });
+                //
+                // form.on('select()', function(){
+                //     updateTableBySearch();
+                // });
+
+                $('#sg-create-btn').on('click', function () {
+                    layer.open({
+                        title: '创建' + '{{ $model_name }}',
+                        type: 2,
+                        area: ['90%', '90%'],
+                        content: '{{ $pre_uri }}' + 'create',
+                        end: function () {
+                            top_window.location.reload();
+                        }
+                    });
+                });
+
+                $('#sg-table-top-container').on('click', '.btn-delete-many', function () {
+                    layer.confirm('确定要删除所有选中行吗?', function () {
+                        var data = table.checkStatus('sg-main-table').data;
+                        if(data.length <= 0) {
+                            layer.msg('选择不能为空', {
+                                icon: 2
+                            });
+                            return false;
+                        }
+                        var ids = [];
+                        for(var i = 0; i < data.length; ++i) {
+                            ids.push(data[i]['id']);
+                        }
+                        $.ajax({
+                            method: 'POST',
+                            url: '{{ $pre_uri }}' + 'deleteMany',
+                            headers: {
+                                'X-CSRF-TOKEN': '{{ csrf_token() }}'
+                            },
+                            data: {
+                                ids: JSON.stringify(ids)
+                            },
+                            success: function (data) {
+                                if(data.status === 'success') {
+                                    top_window.location.reload();
+                                } else {
+                                    layer.msg(data.info, {
+                                        icon: 2
+                                    });
+                                }
+
+                            },
+                            error: function () {
+                                layer.msg('删除失败', {
+                                    icon: 2
+                                });
+                            }
+                        });
+                    })
+                });
+            });
+        })
+    </script>
+@endsection

+ 2 - 0
resources/views/admin/layout-content.blade.php

xqd
@@ -20,6 +20,8 @@
 
     <script src="/plugins/circle-process-bar/circleProcessBar.min.js"></script>
 
+    {{--<script src="https://cdn.jsdelivr.net/npm/vue@2.6.12"></script>--}}
+
     <style>
         .silent-layout-content {
             padding: 15px 15px 15px 15px;

+ 53 - 0
resources/views/admin/orders/create.blade.php

xqd
@@ -0,0 +1,53 @@
+@extends('admin.layout-content')
+
+@section('header')
+    <style>
+
+    </style>
+@endsection
+
+@section('content')
+    <div class="layui-container sg-create-container">
+        <div class="layui-col-sm8 layui-col-sm-offset2">
+            <form class="layui-form" method="POST" action="{{ $pre_uri . 'store' }}">
+
+                {{ csrf_field() }}
+                @include('share.layui-form-item', ['type' => 'input', 'name' => 'name', 'label' => '名称', 'required' => true, 'value' => (old('data') ? old('data')['name'] : '')])
+                @include('share.layui-form-item', ['type' => 'input', 'name' => 'key', 'label' => '键值', 'required' => true, 'value' => (old('data') ? old('data')['key'] : '')])
+                @include('share.layui-form-item', ['type' => 'input', 'name' => 'level', 'label' => '级别', 'required' => true, 'value' => (old('data') ? old('data')['level'] : '')])
+                <div class="layui-form-item">
+                    <div class="layui-input-block">
+                        <button class="layui-btn" lay-submit lay-filter="formDemo">提交</button>
+                        <button type="reset" class="layui-btn layui-btn-primary">重置</button>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                </div>
+            </form>
+        </div>
+    </div>
+@endsection
+
+@section('footer')
+    <script>
+        $(function () {
+            layui.use(['form', 'laydate'], function(){
+                var form = layui.form;
+                var laydate = layui.laydate;
+
+                // form.verify({
+                //     integer: function (value) {
+                //         var pattern = /^[1-9]\d*$/;
+                //         if(!(pattern.test(value) || value === '0')) {
+                //             return '组员人数必须为大于等于0的整数';
+                //         }
+                //     }
+                // });
+
+                laydate.render({
+                    elem: '.sg-select-date'
+                });
+            });
+        })
+    </script>
+@endsection

+ 54 - 0
resources/views/admin/orders/edit.blade.php

xqd
@@ -0,0 +1,54 @@
+@extends('admin.layout-content')
+
+@section('header')
+    <style>
+
+    </style>
+@endsection
+
+@section('content')
+    <div class="layui-container sg-create-container">
+        <div class="layui-col-sm8 layui-col-sm-offset2">
+            <form class="layui-form" method="POST" action="{{ $pre_uri . 'update' }}">
+
+                {{ csrf_field() }}
+                <input type="hidden" name="id" value="{{ $item->id }}">
+                @include('share.layui-form-item', ['type' => 'input', 'name' => 'name', 'label' => '名称', 'required' => true, 'value' => ($item->name ? $item->name : '')])
+                @include('share.layui-form-item', ['type' => 'input', 'name' => 'key', 'label' => '键值', 'required' => true, 'value' => ($item->key ? $item->key : '')])
+                @include('share.layui-form-item', ['type' => 'input', 'name' => 'level', 'label' => '级别', 'required' => true, 'value' => ($item->level ? $item->level : '')])
+                <div class="layui-form-item">
+                    <div class="layui-input-block">
+                        <button class="layui-btn" lay-submit lay-filter="formDemo">提交</button>
+                        <button type="reset" class="layui-btn layui-btn-primary">重置</button>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                </div>
+            </form>
+        </div>
+    </div>
+@endsection
+
+@section('footer')
+    <script>
+        $(function () {
+            layui.use(['form', 'laydate'], function(){
+                var form = layui.form;
+                var laydate = layui.laydate;
+
+                // form.verify({
+                //     integer: function (value) {
+                //         var pattern = /^[1-9]\d*$/;
+                //         if(!(pattern.test(value) || value === '0')) {
+                //             return '组员人数必须为大于等于0的整数';
+                //         }
+                //     }
+                // });
+
+                laydate.render({
+                    elem: '.sg-select-date'
+                });
+            });
+        })
+    </script>
+@endsection

+ 251 - 0
resources/views/admin/orders/index.blade.php

xqd
@@ -0,0 +1,251 @@
+@extends('admin.layout-content')
+
+@section('header')
+    <style>
+
+    </style>
+@endsection
+
+@section('content')
+    <div class="layui-card">
+        <div class="layui-card-header sg-card-header">
+            {{ $model_name }}管理
+            {{--<div class="sg-card-create">--}}
+                {{--<button id="sg-create-btn" class="layui-btn layui-btn-sm">创建</button>--}}
+            {{--</div>--}}
+        </div>
+        <div class="layui-card-body">
+            <form class="layui-form" id="sg-search-form">
+                <div class="layui-form-item layui-row">
+                    <div class="layui-inline">
+                        <div class="layui-input-inline">
+                            <select name="project_id">
+                                <option value="">项目</option>
+                                @foreach($project_options as $option)
+                                    <option value="{{ $option['id'] }}" {{ request('project_id') == $option['id'] ? 'selected' : ''  }}>{{ $option['name'] }}</option>
+                                @endforeach
+                            </select>
+                        </div>
+                    </div>
+                    <div class="layui-inline">
+                        <div class="layui-input-inline">
+                            <select name="type">
+                                <option value="">类型</option>
+                                @foreach($type_options as $option)
+                                    <option value="{{ $option['id'] }}" {{ request('type') == $option['id'] ? 'selected' : ''  }}>{{ $option['name'] }}</option>
+                                @endforeach
+                            </select>
+                        </div>
+                    </div>
+                    <div class="layui-inline">
+                        <div class="layui-input-inline">
+                            <select name="status">
+                                <option value="">状态</option>
+                                @foreach($status_options as $option)
+                                    <option value="{{ $option['id'] }}" {{ request('status') == $option['id'] ? 'selected' : ''  }}>{{ $option['name'] }}</option>
+                                @endforeach
+                            </select>
+                        </div>
+                    </div>
+                    <div class="layui-inline">
+                        <div class="layui-input-inline">
+                            <input type="text" name="order_number" placeholder="请输入订单号" autocomplete="off" class="layui-input" value="{{ request('order_number') }}">
+                        </div>
+                    </div>
+                    <div class="layui-inline">
+                        <div class="layui-btn" id="sg-search-btn">搜索</div>
+                    </div>
+                </div>
+            </form>
+            <table id="sg-main-table" class="layui-hide" lay-filter="tableEvent"></table>
+            <script type="text/html" id="sg-table-bar">
+                <div class="layui-btn-group">
+                    <div class="layui-btn-group">
+                        <a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
+                        <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="delete">删除</a>
+                    </div>
+                </div>
+            </script>
+        </div>
+    </div>
+@endsection
+
+@section('footer')
+    <script>
+        $(function () {
+            layui.use(['table', 'layer'], function(){
+                var table = layui.table,
+                    layer = layui.layer,
+                    form = layui.form,
+                    laydate = layui.laydate,
+                    top_window = window;
+
+                table.render({
+                    elem: '#sg-main-table',
+                    url: '{{ $pre_uri }}' + 'get',
+                    cellMinWidth: 80,
+                    cols: [[
+                        { field: 'order_number', title: '订单号', align: 'center' },
+                        { field: 'project_name', title: '项目', align: 'center' },
+                        { field: 'type_name', title: '类型', align: 'center' },
+                        { field: 'user_name', title: '提交人', align: 'center' },
+                        { field: 'status_name', title: '状态', align: 'center' },
+                        { field: 'created_at', title: '创建时间', align: 'center' },
+                        // { title: '操作', align:'center', toolbar: '#sg-table-bar' }
+                    ]],
+                    page: {
+                        layout: ['count', 'prev', 'page', 'next', 'skip', 'refresh'],
+                        limit: 15
+                    },
+                    even: true,
+                    where: transformToJson($('#sg-search-form').serializeArray()),
+                    done: function(res, curr, count) {
+
+                    }
+                });
+                table.on('tool(tableEvent)', function(obj){
+                    var data = obj.data;
+                    if(obj.event === 'delete'){
+                        layer.confirm('确定要删除吗?', function(index) {
+                            $.ajax({
+                                method: 'POST',
+                                url: '{{ $pre_uri }}' + 'delete',
+                                headers: {
+                                    'X-CSRF-TOKEN': '{{ csrf_token() }}'
+                                },
+                                data: {
+                                    id: data.id
+                                },
+                                success: function (data) {
+                                    if(data.status === 'success') {
+                                        obj.del();
+                                    } else {
+                                        layer.msg(data.info, {
+                                            icon: 2
+                                        });
+                                    }
+                                    layer.close(index);
+                                },
+                                error: function () {
+                                    layer.close(index);
+                                    layer.msg('删除失败', {
+                                        icon: 2
+                                    });
+                                }
+                            });
+                        });
+                    } else if(obj.event === 'edit') {
+                        layer.open({
+                            title: '编辑成员',
+                            type: 2,
+                            area: ['90%', '90%'],
+                            content: '{{ $pre_uri }}' + 'edit?id=' + data.id,
+                            end: function () {
+                                top_window.location.reload();
+                            }
+                        });
+                    }
+                });
+
+                if($('#search-begin-date').length > 0) {
+                    laydate.render({
+                        elem: '#search-begin-date',
+                        done: function () {
+                            updateTableBySearch();
+                        }
+                    });
+                }
+
+                if($('#search-end-date').length > 0) {
+                    laydate.render({
+                        elem: '#search-end-date',
+                        done: function () {
+                            updateTableBySearch();
+                        }
+                    });
+                }
+
+                function transformToJson(formData){
+                    var obj={};
+                    for (var i in formData) {
+                        obj[formData[i].name]=formData[i]['value'];
+                    }
+                    return obj;
+                }
+
+                function updateTableBySearch() {
+                    table.reload('sg-main-table', {
+                        where: transformToJson($('#sg-search-form').serializeArray()),
+                        page: {
+                            curr: 1
+                        }
+                    });
+                }
+
+                $('#sg-search-btn').click(function() {
+                    updateTableBySearch();
+                });
+                // $('#sg-search-form').change(function () {
+                //     updateTableBySearch();
+                // });
+                //
+                // form.on('select()', function(){
+                //     updateTableBySearch();
+                // });
+
+                $('#sg-create-btn').on('click', function () {
+                    layer.open({
+                        title: '创建' + '{{ $model_name }}',
+                        type: 2,
+                        area: ['90%', '90%'],
+                        content: '{{ $pre_uri }}' + 'create',
+                        end: function () {
+                            top_window.location.reload();
+                        }
+                    });
+                });
+
+                $('#sg-table-top-container').on('click', '.btn-delete-many', function () {
+                    layer.confirm('确定要删除所有选中行吗?', function () {
+                        var data = table.checkStatus('sg-main-table').data;
+                        if(data.length <= 0) {
+                            layer.msg('选择不能为空', {
+                                icon: 2
+                            });
+                            return false;
+                        }
+                        var ids = [];
+                        for(var i = 0; i < data.length; ++i) {
+                            ids.push(data[i]['id']);
+                        }
+                        $.ajax({
+                            method: 'POST',
+                            url: '{{ $pre_uri }}' + 'deleteMany',
+                            headers: {
+                                'X-CSRF-TOKEN': '{{ csrf_token() }}'
+                            },
+                            data: {
+                                ids: JSON.stringify(ids)
+                            },
+                            success: function (data) {
+                                if(data.status === 'success') {
+                                    top_window.location.reload();
+                                } else {
+                                    layer.msg(data.info, {
+                                        icon: 2
+                                    });
+                                }
+
+                            },
+                            error: function () {
+                                layer.msg('删除失败', {
+                                    icon: 2
+                                });
+                            }
+                        });
+                    })
+                });
+            });
+        })
+    </script>
+@endsection

+ 53 - 0
resources/views/admin/project-roles/create.blade.php

xqd
@@ -0,0 +1,53 @@
+@extends('admin.layout-content')
+
+@section('header')
+    <style>
+
+    </style>
+@endsection
+
+@section('content')
+    <div class="layui-container sg-create-container">
+        <div class="layui-col-sm8 layui-col-sm-offset2">
+            <form class="layui-form" method="POST" action="{{ $pre_uri . 'store' }}">
+
+                {{ csrf_field() }}
+                @include('share.layui-form-item', ['type' => 'input', 'name' => 'name', 'label' => '名称', 'required' => true, 'value' => (old('data') ? old('data')['name'] : '')])
+                @include('share.layui-form-item', ['type' => 'input', 'name' => 'key', 'label' => '键值', 'required' => true, 'value' => (old('data') ? old('data')['key'] : '')])
+                @include('share.layui-form-item', ['type' => 'input', 'name' => 'level', 'label' => '级别', 'required' => true, 'value' => (old('data') ? old('data')['level'] : '')])
+                <div class="layui-form-item">
+                    <div class="layui-input-block">
+                        <button class="layui-btn" lay-submit lay-filter="formDemo">提交</button>
+                        <button type="reset" class="layui-btn layui-btn-primary">重置</button>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                </div>
+            </form>
+        </div>
+    </div>
+@endsection
+
+@section('footer')
+    <script>
+        $(function () {
+            layui.use(['form', 'laydate'], function(){
+                var form = layui.form;
+                var laydate = layui.laydate;
+
+                // form.verify({
+                //     integer: function (value) {
+                //         var pattern = /^[1-9]\d*$/;
+                //         if(!(pattern.test(value) || value === '0')) {
+                //             return '组员人数必须为大于等于0的整数';
+                //         }
+                //     }
+                // });
+
+                laydate.render({
+                    elem: '.sg-select-date'
+                });
+            });
+        })
+    </script>
+@endsection

+ 54 - 0
resources/views/admin/project-roles/edit.blade.php

xqd
@@ -0,0 +1,54 @@
+@extends('admin.layout-content')
+
+@section('header')
+    <style>
+
+    </style>
+@endsection
+
+@section('content')
+    <div class="layui-container sg-create-container">
+        <div class="layui-col-sm8 layui-col-sm-offset2">
+            <form class="layui-form" method="POST" action="{{ $pre_uri . 'update' }}">
+
+                {{ csrf_field() }}
+                <input type="hidden" name="id" value="{{ $item->id }}">
+                @include('share.layui-form-item', ['type' => 'input', 'name' => 'name', 'label' => '名称', 'required' => true, 'value' => ($item->name ? $item->name : '')])
+                @include('share.layui-form-item', ['type' => 'input', 'name' => 'key', 'label' => '键值', 'required' => true, 'value' => ($item->key ? $item->key : '')])
+                @include('share.layui-form-item', ['type' => 'input', 'name' => 'level', 'label' => '级别', 'required' => true, 'value' => ($item->level ? $item->level : '')])
+                <div class="layui-form-item">
+                    <div class="layui-input-block">
+                        <button class="layui-btn" lay-submit lay-filter="formDemo">提交</button>
+                        <button type="reset" class="layui-btn layui-btn-primary">重置</button>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                </div>
+            </form>
+        </div>
+    </div>
+@endsection
+
+@section('footer')
+    <script>
+        $(function () {
+            layui.use(['form', 'laydate'], function(){
+                var form = layui.form;
+                var laydate = layui.laydate;
+
+                // form.verify({
+                //     integer: function (value) {
+                //         var pattern = /^[1-9]\d*$/;
+                //         if(!(pattern.test(value) || value === '0')) {
+                //             return '组员人数必须为大于等于0的整数';
+                //         }
+                //     }
+                // });
+
+                laydate.render({
+                    elem: '.sg-select-date'
+                });
+            });
+        })
+    </script>
+@endsection

+ 219 - 0
resources/views/admin/project-roles/index.blade.php

xqd
@@ -0,0 +1,219 @@
+@extends('admin.layout-content')
+
+@section('header')
+    <style>
+
+    </style>
+@endsection
+
+@section('content')
+    <div class="layui-card">
+        <div class="layui-card-header sg-card-header">
+            {{ $model_name }}管理
+            <div class="sg-card-create">
+                <button id="sg-create-btn" class="layui-btn layui-btn-sm">创建</button>
+            </div>
+        </div>
+        <div class="layui-card-body">
+            <form class="layui-form" id="sg-search-form">
+                <div class="layui-form-item layui-row">
+                    <div class="layui-inline">
+                        <div class="layui-input-inline">
+                            <input type="text" name="name" placeholder="请输入名称" autocomplete="off" class="layui-input" value="{{ request('name') }}">
+                        </div>
+                    </div>
+                    <div class="layui-inline">
+                        <div class="layui-btn" id="sg-search-btn">搜索</div>
+                    </div>
+                </div>
+            </form>
+            <table id="sg-main-table" class="layui-hide" lay-filter="tableEvent"></table>
+            <script type="text/html" id="sg-table-bar">
+                <div class="layui-btn-group">
+                    <div class="layui-btn-group">
+                        <a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
+                        <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="delete">删除</a>
+                    </div>
+                </div>
+            </script>
+        </div>
+    </div>
+@endsection
+
+@section('footer')
+    <script>
+        $(function () {
+            layui.use(['table', 'layer'], function(){
+                var table = layui.table,
+                    layer = layui.layer,
+                    form = layui.form,
+                    laydate = layui.laydate,
+                    top_window = window;
+
+                table.render({
+                    elem: '#sg-main-table',
+                    url: '{{ $pre_uri }}' + 'get',
+                    cellMinWidth: 80,
+                    cols: [[
+                        { field: 'id', title: 'ID', align: 'center' },
+                        { field: 'name', title: '名称', align: 'center' },
+                        { field: 'key', title: '键值', align: 'center' },
+                        { field: 'level', title: '级别', align: 'center' },
+                        { title: '操作', align:'center', toolbar: '#sg-table-bar' }
+                    ]],
+                    page: {
+                        layout: ['count', 'prev', 'page', 'next', 'skip', 'refresh'],
+                        limit: 15
+                    },
+                    even: true,
+                    where: transformToJson($('#sg-search-form').serializeArray()),
+                    done: function(res, curr, count) {
+
+                    }
+                });
+                table.on('tool(tableEvent)', function(obj){
+                    var data = obj.data;
+                    if(obj.event === 'delete'){
+                        layer.confirm('确定要删除吗?', function(index) {
+                            $.ajax({
+                                method: 'POST',
+                                url: '{{ $pre_uri }}' + 'delete',
+                                headers: {
+                                    'X-CSRF-TOKEN': '{{ csrf_token() }}'
+                                },
+                                data: {
+                                    id: data.id
+                                },
+                                success: function (data) {
+                                    if(data.status === 'success') {
+                                        obj.del();
+                                    } else {
+                                        layer.msg(data.info, {
+                                            icon: 2
+                                        });
+                                    }
+                                    layer.close(index);
+                                },
+                                error: function () {
+                                    layer.close(index);
+                                    layer.msg('删除失败', {
+                                        icon: 2
+                                    });
+                                }
+                            });
+                        });
+                    } else if(obj.event === 'edit') {
+                        layer.open({
+                            title: '编辑成员',
+                            type: 2,
+                            area: ['90%', '90%'],
+                            content: '{{ $pre_uri }}' + 'edit?id=' + data.id,
+                            end: function () {
+                                top_window.location.reload();
+                            }
+                        });
+                    }
+                });
+
+                if($('#search-begin-date').length > 0) {
+                    laydate.render({
+                        elem: '#search-begin-date',
+                        done: function () {
+                            updateTableBySearch();
+                        }
+                    });
+                }
+
+                if($('#search-end-date').length > 0) {
+                    laydate.render({
+                        elem: '#search-end-date',
+                        done: function () {
+                            updateTableBySearch();
+                        }
+                    });
+                }
+
+                function transformToJson(formData){
+                    var obj={};
+                    for (var i in formData) {
+                        obj[formData[i].name]=formData[i]['value'];
+                    }
+                    return obj;
+                }
+
+                function updateTableBySearch() {
+                    table.reload('sg-main-table', {
+                        where: transformToJson($('#sg-search-form').serializeArray()),
+                        page: {
+                            curr: 1
+                        }
+                    });
+                }
+
+                $('#sg-search-btn').click(function() {
+                    updateTableBySearch();
+                });
+                // $('#sg-search-form').change(function () {
+                //     updateTableBySearch();
+                // });
+                //
+                // form.on('select()', function(){
+                //     updateTableBySearch();
+                // });
+
+                $('#sg-create-btn').on('click', function () {
+                    layer.open({
+                        title: '创建' + '{{ $model_name }}',
+                        type: 2,
+                        area: ['90%', '90%'],
+                        content: '{{ $pre_uri }}' + 'create',
+                        end: function () {
+                            top_window.location.reload();
+                        }
+                    });
+                });
+
+                $('#sg-table-top-container').on('click', '.btn-delete-many', function () {
+                    layer.confirm('确定要删除所有选中行吗?', function () {
+                        var data = table.checkStatus('sg-main-table').data;
+                        if(data.length <= 0) {
+                            layer.msg('选择不能为空', {
+                                icon: 2
+                            });
+                            return false;
+                        }
+                        var ids = [];
+                        for(var i = 0; i < data.length; ++i) {
+                            ids.push(data[i]['id']);
+                        }
+                        $.ajax({
+                            method: 'POST',
+                            url: '{{ $pre_uri }}' + 'deleteMany',
+                            headers: {
+                                'X-CSRF-TOKEN': '{{ csrf_token() }}'
+                            },
+                            data: {
+                                ids: JSON.stringify(ids)
+                            },
+                            success: function (data) {
+                                if(data.status === 'success') {
+                                    top_window.location.reload();
+                                } else {
+                                    layer.msg(data.info, {
+                                        icon: 2
+                                    });
+                                }
+
+                            },
+                            error: function () {
+                                layer.msg('删除失败', {
+                                    icon: 2
+                                });
+                            }
+                        });
+                    })
+                });
+            });
+        })
+    </script>
+@endsection

+ 53 - 0
resources/views/admin/project-users/create.blade.php

xqd
@@ -0,0 +1,53 @@
+@extends('admin.layout-content')
+
+@section('header')
+    <style>
+
+    </style>
+@endsection
+
+@section('content')
+    <div class="layui-container sg-create-container">
+        <div class="layui-col-sm8 layui-col-sm-offset2">
+            <form class="layui-form" method="POST" action="{{ $pre_uri . 'store' }}">
+
+                {{ csrf_field() }}
+                <input type="hidden" name="data[project_id]" value="{{ request('project_id') }}">
+                @include('share.layui-form-item', ['type' => 'select', 'name' => 'user_id', 'label' => '用户', 'selected_id' => (old('data') ? old('data')['user_id'] : ''), 'options' => $user_options])
+                @include('share.layui-form-item', ['type' => 'select', 'name' => 'project_role_id', 'label' => '项目角色', 'selected_id' => (old('data') ? old('data')['project_role_id'] : ''), 'options' => $role_options])
+                <div class="layui-form-item">
+                    <div class="layui-input-block">
+                        <button class="layui-btn" lay-submit lay-filter="formDemo">提交</button>
+                        <button type="reset" class="layui-btn layui-btn-primary">重置</button>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                </div>
+            </form>
+        </div>
+    </div>
+@endsection
+
+@section('footer')
+    <script>
+        $(function () {
+            layui.use(['form', 'laydate'], function(){
+                var form = layui.form;
+                var laydate = layui.laydate;
+
+                // form.verify({
+                //     integer: function (value) {
+                //         var pattern = /^[1-9]\d*$/;
+                //         if(!(pattern.test(value) || value === '0')) {
+                //             return '组员人数必须为大于等于0的整数';
+                //         }
+                //     }
+                // });
+
+                laydate.render({
+                    elem: '.sg-select-date'
+                });
+            });
+        })
+    </script>
+@endsection

+ 53 - 0
resources/views/admin/project-users/edit.blade.php

xqd
@@ -0,0 +1,53 @@
+@extends('admin.layout-content')
+
+@section('header')
+    <style>
+
+    </style>
+@endsection
+
+@section('content')
+    <div class="layui-container sg-create-container">
+        <div class="layui-col-sm8 layui-col-sm-offset2">
+            <form class="layui-form" method="POST" action="{{ $pre_uri . 'update' }}">
+
+                {{ csrf_field() }}
+                <input type="hidden" name="id" value="{{ $item->id }}">
+                @include('share.layui-form-item', ['type' => 'select', 'name' => 'user_id', 'label' => '用户', 'selected_id' => $item->user_id, 'options' => $user_options])
+                @include('share.layui-form-item', ['type' => 'select', 'name' => 'project_role_id', 'label' => '项目角色', 'selected_id' => $item->project_role_id, 'options' => $role_options])
+                <div class="layui-form-item">
+                    <div class="layui-input-block">
+                        <button class="layui-btn" lay-submit lay-filter="formDemo">提交</button>
+                        <button type="reset" class="layui-btn layui-btn-primary">重置</button>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                </div>
+            </form>
+        </div>
+    </div>
+@endsection
+
+@section('footer')
+    <script>
+        $(function () {
+            layui.use(['form', 'laydate'], function(){
+                var form = layui.form;
+                var laydate = layui.laydate;
+
+                // form.verify({
+                //     integer: function (value) {
+                //         var pattern = /^[1-9]\d*$/;
+                //         if(!(pattern.test(value) || value === '0')) {
+                //             return '组员人数必须为大于等于0的整数';
+                //         }
+                //     }
+                // });
+
+                laydate.render({
+                    elem: '.sg-select-date'
+                });
+            });
+        })
+    </script>
+@endsection

+ 219 - 0
resources/views/admin/project-users/index.blade.php

xqd
@@ -0,0 +1,219 @@
+@extends('admin.layout-content')
+
+@section('header')
+    <style>
+
+    </style>
+@endsection
+
+@section('content')
+    <div class="layui-card">
+        <div class="layui-card-header sg-card-header">
+            {{ $model_name }}管理:{{$project->name}}
+            <div class="sg-card-create">
+                <button id="sg-create-btn" class="layui-btn layui-btn-sm">创建</button>
+            </div>
+        </div>
+        <div class="layui-card-body">
+            <form class="layui-form" id="sg-search-form">
+                <input type="hidden" name="project_id" value="{{ request('project_id') }}">
+                <div class="layui-form-item layui-row">
+                    <div class="layui-inline">
+                        <div class="layui-input-inline">
+                            <input type="text" name="name" placeholder="请输入用户名" autocomplete="off" class="layui-input" value="{{ request('name') }}">
+                        </div>
+                    </div>
+                    <div class="layui-inline">
+                        <div class="layui-btn" id="sg-search-btn">搜索</div>
+                    </div>
+                </div>
+            </form>
+            <table id="sg-main-table" class="layui-hide" lay-filter="tableEvent"></table>
+            <script type="text/html" id="sg-table-bar">
+                <div class="layui-btn-group">
+                    <div class="layui-btn-group">
+                        <a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
+                        <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="delete">删除</a>
+                    </div>
+                </div>
+            </script>
+        </div>
+    </div>
+@endsection
+
+@section('footer')
+    <script>
+        $(function () {
+            layui.use(['table', 'layer'], function(){
+                var table = layui.table,
+                    layer = layui.layer,
+                    form = layui.form,
+                    laydate = layui.laydate,
+                    top_window = window;
+
+                table.render({
+                    elem: '#sg-main-table',
+                    url: '{{ $pre_uri }}' + 'get',
+                    cellMinWidth: 80,
+                    cols: [[
+                        { field: 'id', title: 'ID', align: 'center' },
+                        { field: 'user_name', title: '用户名', align: 'center' },
+                        { field: 'role_name', title: '角色', align: 'center' },
+                        { title: '操作', align:'center', toolbar: '#sg-table-bar' }
+                    ]],
+                    page: {
+                        layout: ['count', 'prev', 'page', 'next', 'skip', 'refresh'],
+                        limit: 15
+                    },
+                    even: true,
+                    where: transformToJson($('#sg-search-form').serializeArray()),
+                    done: function(res, curr, count) {
+
+                    }
+                });
+                table.on('tool(tableEvent)', function(obj){
+                    var data = obj.data;
+                    if(obj.event === 'delete'){
+                        layer.confirm('确定要删除吗?', function(index) {
+                            $.ajax({
+                                method: 'POST',
+                                url: '{{ $pre_uri }}' + 'delete',
+                                headers: {
+                                    'X-CSRF-TOKEN': '{{ csrf_token() }}'
+                                },
+                                data: {
+                                    id: data.id
+                                },
+                                success: function (data) {
+                                    if(data.status === 'success') {
+                                        obj.del();
+                                    } else {
+                                        layer.msg(data.info, {
+                                            icon: 2
+                                        });
+                                    }
+                                    layer.close(index);
+                                },
+                                error: function () {
+                                    layer.close(index);
+                                    layer.msg('删除失败', {
+                                        icon: 2
+                                    });
+                                }
+                            });
+                        });
+                    } else if(obj.event === 'edit') {
+                        layer.open({
+                            title: '编辑成员',
+                            type: 2,
+                            area: ['90%', '90%'],
+                            content: '{{ $pre_uri }}' + 'edit?id=' + data.id,
+                            end: function () {
+                                top_window.location.reload();
+                            }
+                        });
+                    }
+                });
+
+                if($('#search-begin-date').length > 0) {
+                    laydate.render({
+                        elem: '#search-begin-date',
+                        done: function () {
+                            updateTableBySearch();
+                        }
+                    });
+                }
+
+                if($('#search-end-date').length > 0) {
+                    laydate.render({
+                        elem: '#search-end-date',
+                        done: function () {
+                            updateTableBySearch();
+                        }
+                    });
+                }
+
+                function transformToJson(formData){
+                    var obj={};
+                    for (var i in formData) {
+                        obj[formData[i].name]=formData[i]['value'];
+                    }
+                    return obj;
+                }
+
+                function updateTableBySearch() {
+                    table.reload('sg-main-table', {
+                        where: transformToJson($('#sg-search-form').serializeArray()),
+                        page: {
+                            curr: 1
+                        }
+                    });
+                }
+
+                $('#sg-search-btn').click(function() {
+                    updateTableBySearch();
+                });
+                // $('#sg-search-form').change(function () {
+                //     updateTableBySearch();
+                // });
+                //
+                // form.on('select()', function(){
+                //     updateTableBySearch();
+                // });
+
+                $('#sg-create-btn').on('click', function () {
+                    layer.open({
+                        title: '创建' + '{{ $model_name }}',
+                        type: 2,
+                        area: ['90%', '90%'],
+                        content: '{{ $pre_uri }}' + 'create?project_id=' + '{{ request('project_id') }}',
+                        end: function () {
+                            top_window.location.reload();
+                        }
+                    });
+                });
+
+                $('#sg-table-top-container').on('click', '.btn-delete-many', function () {
+                    layer.confirm('确定要删除所有选中行吗?', function () {
+                        var data = table.checkStatus('sg-main-table').data;
+                        if(data.length <= 0) {
+                            layer.msg('选择不能为空', {
+                                icon: 2
+                            });
+                            return false;
+                        }
+                        var ids = [];
+                        for(var i = 0; i < data.length; ++i) {
+                            ids.push(data[i]['id']);
+                        }
+                        $.ajax({
+                            method: 'POST',
+                            url: '{{ $pre_uri }}' + 'deleteMany',
+                            headers: {
+                                'X-CSRF-TOKEN': '{{ csrf_token() }}'
+                            },
+                            data: {
+                                ids: JSON.stringify(ids)
+                            },
+                            success: function (data) {
+                                if(data.status === 'success') {
+                                    top_window.location.reload();
+                                } else {
+                                    layer.msg(data.info, {
+                                        icon: 2
+                                    });
+                                }
+
+                            },
+                            error: function () {
+                                layer.msg('删除失败', {
+                                    icon: 2
+                                });
+                            }
+                        });
+                    })
+                });
+            });
+        })
+    </script>
+@endsection

+ 51 - 0
resources/views/admin/projects/create.blade.php

xqd
@@ -0,0 +1,51 @@
+@extends('admin.layout-content')
+
+@section('header')
+    <style>
+
+    </style>
+@endsection
+
+@section('content')
+    <div class="layui-container sg-create-container">
+        <div class="layui-col-sm8 layui-col-sm-offset2">
+            <form class="layui-form" method="POST" action="{{ $pre_uri . 'store' }}">
+
+                {{ csrf_field() }}
+                @include('share.layui-form-item', ['type' => 'input', 'name' => 'name', 'label' => '名称', 'required' => true, 'value' => (old('data') ? old('data')['name'] : '')])
+                <div class="layui-form-item">
+                    <div class="layui-input-block">
+                        <button class="layui-btn" lay-submit lay-filter="formDemo">提交</button>
+                        <button type="reset" class="layui-btn layui-btn-primary">重置</button>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                </div>
+            </form>
+        </div>
+    </div>
+@endsection
+
+@section('footer')
+    <script>
+        $(function () {
+            layui.use(['form', 'laydate'], function(){
+                var form = layui.form;
+                var laydate = layui.laydate;
+
+                // form.verify({
+                //     integer: function (value) {
+                //         var pattern = /^[1-9]\d*$/;
+                //         if(!(pattern.test(value) || value === '0')) {
+                //             return '组员人数必须为大于等于0的整数';
+                //         }
+                //     }
+                // });
+
+                laydate.render({
+                    elem: '.sg-select-date'
+                });
+            });
+        })
+    </script>
+@endsection

+ 52 - 0
resources/views/admin/projects/edit.blade.php

xqd
@@ -0,0 +1,52 @@
+@extends('admin.layout-content')
+
+@section('header')
+    <style>
+
+    </style>
+@endsection
+
+@section('content')
+    <div class="layui-container sg-create-container">
+        <div class="layui-col-sm8 layui-col-sm-offset2">
+            <form class="layui-form" method="POST" action="{{ $pre_uri . 'update' }}">
+
+                {{ csrf_field() }}
+                <input type="hidden" name="id" value="{{ $item->id }}">
+                @include('share.layui-form-item', ['type' => 'input', 'name' => 'name', 'label' => '名称', 'required' => true, 'value' => ($item->name ? $item->name : '')])
+                <div class="layui-form-item">
+                    <div class="layui-input-block">
+                        <button class="layui-btn" lay-submit lay-filter="formDemo">提交</button>
+                        <button type="reset" class="layui-btn layui-btn-primary">重置</button>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                </div>
+            </form>
+        </div>
+    </div>
+@endsection
+
+@section('footer')
+    <script>
+        $(function () {
+            layui.use(['form', 'laydate'], function(){
+                var form = layui.form;
+                var laydate = layui.laydate;
+
+                // form.verify({
+                //     integer: function (value) {
+                //         var pattern = /^[1-9]\d*$/;
+                //         if(!(pattern.test(value) || value === '0')) {
+                //             return '组员人数必须为大于等于0的整数';
+                //         }
+                //     }
+                // });
+
+                laydate.render({
+                    elem: '.sg-select-date'
+                });
+            });
+        })
+    </script>
+@endsection

+ 222 - 0
resources/views/admin/projects/index.blade.php

xqd
@@ -0,0 +1,222 @@
+@extends('admin.layout-content')
+
+@section('header')
+    <style>
+
+    </style>
+@endsection
+
+@section('content')
+    <div class="layui-card">
+        <div class="layui-card-header sg-card-header">
+            {{ $model_name }}管理
+            <div class="sg-card-create">
+                <button id="sg-create-btn" class="layui-btn layui-btn-sm">创建</button>
+            </div>
+        </div>
+        <div class="layui-card-body">
+            <form class="layui-form" id="sg-search-form">
+                <div class="layui-form-item layui-row">
+                    <div class="layui-inline">
+                        <div class="layui-input-inline">
+                            <input type="text" name="name" placeholder="请输入名称" autocomplete="off" class="layui-input" value="{{ request('name') }}">
+                        </div>
+                    </div>
+                    <div class="layui-inline">
+                        <div class="layui-btn" id="sg-search-btn">搜索</div>
+                    </div>
+                </div>
+            </form>
+            <table id="sg-main-table" class="layui-hide" lay-filter="tableEvent"></table>
+            <script type="text/html" id="sg-table-bar">
+                <div class="layui-btn-group">
+                    <div class="layui-btn-group">
+                        <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="member">成员管理</a>
+                        <a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
+                        <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="delete">删除</a>
+                    </div>
+                </div>
+            </script>
+        </div>
+    </div>
+@endsection
+
+@section('footer')
+    <script>
+        $(function () {
+            layui.use(['table', 'layer'], function(){
+                var table = layui.table,
+                    layer = layui.layer,
+                    form = layui.form,
+                    laydate = layui.laydate,
+                    top_window = window;
+
+                table.render({
+                    elem: '#sg-main-table',
+                    url: '{{ $pre_uri }}' + 'get',
+                    cellMinWidth: 80,
+                    cols: [[
+                        { field: 'id', title: 'ID', align: 'center' },
+                        { field: 'name', title: '名称', align: 'center' },
+                        { field: 'created_at', title: '创建时间', align: 'center' },
+                        { title: '操作', align:'center', toolbar: '#sg-table-bar' }
+                    ]],
+                    page: {
+                        layout: ['count', 'prev', 'page', 'next', 'skip', 'refresh'],
+                        limit: 15
+                    },
+                    even: true,
+                    where: transformToJson($('#sg-search-form').serializeArray()),
+                    done: function(res, curr, count) {
+
+                    }
+                });
+                table.on('tool(tableEvent)', function(obj){
+                    var data = obj.data;
+                    if(obj.event === 'delete'){
+                        layer.confirm('确定要删除吗?', function(index) {
+                            $.ajax({
+                                method: 'POST',
+                                url: '{{ $pre_uri }}' + 'delete',
+                                headers: {
+                                    'X-CSRF-TOKEN': '{{ csrf_token() }}'
+                                },
+                                data: {
+                                    id: data.id
+                                },
+                                success: function (data) {
+                                    if(data.status === 'success') {
+                                        obj.del();
+                                    } else {
+                                        layer.msg(data.info, {
+                                            icon: 2
+                                        });
+                                    }
+                                    layer.close(index);
+                                },
+                                error: function () {
+                                    layer.close(index);
+                                    layer.msg('删除失败', {
+                                        icon: 2
+                                    });
+                                }
+                            });
+                        });
+                    } else if(obj.event === 'edit') {
+                        layer.open({
+                            title: '编辑成员',
+                            type: 2,
+                            area: ['90%', '90%'],
+                            content: '{{ $pre_uri }}' + 'edit?id=' + data.id,
+                            end: function () {
+                                top_window.location.reload();
+                            }
+                        });
+                    } else if(obj.event === 'member') {
+                        console.log('ProjectUser/index?project_id=' + data.id)
+                        window.location = '/admin/ProjectUser/index?project_id=' + data.id
+                    }
+                });
+
+                if($('#search-begin-date').length > 0) {
+                    laydate.render({
+                        elem: '#search-begin-date',
+                        done: function () {
+                            updateTableBySearch();
+                        }
+                    });
+                }
+
+                if($('#search-end-date').length > 0) {
+                    laydate.render({
+                        elem: '#search-end-date',
+                        done: function () {
+                            updateTableBySearch();
+                        }
+                    });
+                }
+
+                function transformToJson(formData){
+                    var obj={};
+                    for (var i in formData) {
+                        obj[formData[i].name]=formData[i]['value'];
+                    }
+                    return obj;
+                }
+
+                function updateTableBySearch() {
+                    table.reload('sg-main-table', {
+                        where: transformToJson($('#sg-search-form').serializeArray()),
+                        page: {
+                            curr: 1
+                        }
+                    });
+                }
+
+                $('#sg-search-btn').click(function() {
+                    updateTableBySearch();
+                });
+                // $('#sg-search-form').change(function () {
+                //     updateTableBySearch();
+                // });
+                //
+                // form.on('select()', function(){
+                //     updateTableBySearch();
+                // });
+
+                $('#sg-create-btn').on('click', function () {
+                    layer.open({
+                        title: '创建' + '{{ $model_name }}',
+                        type: 2,
+                        area: ['90%', '90%'],
+                        content: '{{ $pre_uri }}' + 'create',
+                        end: function () {
+                            top_window.location.reload();
+                        }
+                    });
+                });
+
+                $('#sg-table-top-container').on('click', '.btn-delete-many', function () {
+                    layer.confirm('确定要删除所有选中行吗?', function () {
+                        var data = table.checkStatus('sg-main-table').data;
+                        if(data.length <= 0) {
+                            layer.msg('选择不能为空', {
+                                icon: 2
+                            });
+                            return false;
+                        }
+                        var ids = [];
+                        for(var i = 0; i < data.length; ++i) {
+                            ids.push(data[i]['id']);
+                        }
+                        $.ajax({
+                            method: 'POST',
+                            url: '{{ $pre_uri }}' + 'deleteMany',
+                            headers: {
+                                'X-CSRF-TOKEN': '{{ csrf_token() }}'
+                            },
+                            data: {
+                                ids: JSON.stringify(ids)
+                            },
+                            success: function (data) {
+                                if(data.status === 'success') {
+                                    top_window.location.reload();
+                                } else {
+                                    layer.msg(data.info, {
+                                        icon: 2
+                                    });
+                                }
+
+                            },
+                            error: function () {
+                                layer.msg('删除失败', {
+                                    icon: 2
+                                });
+                            }
+                        });
+                    })
+                });
+            });
+        })
+    </script>
+@endsection

+ 53 - 0
resources/views/admin/specs/create.blade.php

xqd
@@ -0,0 +1,53 @@
+@extends('admin.layout-content')
+
+@section('header')
+    <style>
+
+    </style>
+@endsection
+
+@section('content')
+    <div class="layui-container sg-create-container">
+        <div class="layui-col-sm8 layui-col-sm-offset2">
+            <form class="layui-form" method="POST" action="{{ $pre_uri . 'store' }}">
+
+                {{ csrf_field() }}
+                @include('share.device-select-form', ['device_id' => '', 'device_name_id' => '', 'spec_id' => '', 'options' => $options, 'hide_spec' => true])
+                @include('share.layui-form-item', ['type' => 'input', 'name' => 'name', 'label' => '型号规格', 'required' => true, 'value' => (old('data') ? old('data')['name'] : '')])
+                @include('share.layui-form-item', ['type' => 'input', 'name' => 'sort', 'label' => '排序', 'required' => true, 'value' => (old('data') ? old('data')['sort'] : '')])
+                <div class="layui-form-item">
+                    <div class="layui-input-block">
+                        <button class="layui-btn" lay-submit lay-filter="formDemo">提交</button>
+                        <button type="reset" class="layui-btn layui-btn-primary">重置</button>
+                    </div>
+                </div>
+            </form>
+        </div>
+    </div>
+@endsection
+
+@section('footer')
+    <script>
+        $(function () {
+            layui.use(['form', 'laydate'], function(){
+                var form = layui.form;
+                var laydate = layui.laydate;
+
+                // form.verify({
+                //     integer: function (value) {
+                //         var pattern = /^[1-9]\d*$/;
+                //         if(!(pattern.test(value) || value === '0')) {
+                //             return '组员人数必须为大于等于0的整数';
+                //         }
+                //     }
+                // });
+
+                console.log($('.sg-select-date')[0]);
+
+                laydate.render({
+                    elem: '.sg-select-date'
+                });
+            });
+        })
+    </script>
+@endsection

+ 54 - 0
resources/views/admin/specs/edit.blade.php

xqd
@@ -0,0 +1,54 @@
+@extends('admin.layout-content')
+
+@section('header')
+    <style>
+
+    </style>
+@endsection
+
+@section('content')
+    <div class="layui-container sg-create-container">
+        <div class="layui-col-sm8 layui-col-sm-offset2">
+            <form class="layui-form" method="POST" action="{{ $pre_uri . 'update' }}">
+
+                {{ csrf_field() }}
+                <input type="hidden" name="id" value="{{ $item->id }}">
+                @include('share.device-select-form', ['device_id' => $item->device_id, 'device_name_id' => $item->device_name_id, 'spec_id' => $item->spec_id, 'options' => $options, 'hide_spec' => true])
+                @include('share.layui-form-item', ['type' => 'input', 'name' => 'name', 'label' => '型号规格', 'required' => true, 'value' => $item->name])
+                @include('share.layui-form-item', ['type' => 'input', 'name' => 'sort', 'label' => '排序', 'required' => true, 'value' => $item->sort])
+                <div class="layui-form-item">
+                    <div class="layui-input-block">
+                        <button class="layui-btn" lay-submit lay-filter="formDemo">提交</button>
+                        <button type="reset" class="layui-btn layui-btn-primary">重置</button>
+                    </div>
+                </div>
+            </form>
+        </div>
+    </div>
+@endsection
+
+@section('footer')
+    <script>
+        $(function () {
+            layui.use(['form', 'laydate'], function(){
+                var form = layui.form;
+                var laydate = layui.laydate;
+
+                // form.verify({
+                //     integer: function (value) {
+                //         var pattern = /^[1-9]\d*$/;
+                //         if(!(pattern.test(value) || value === '0')) {
+                //             return '组员人数必须为大于等于0的整数';
+                //         }
+                //     }
+                // });
+
+                console.log($('.sg-select-date')[0]);
+
+                laydate.render({
+                    elem: '.sg-select-date'
+                });
+            });
+        })
+    </script>
+@endsection

+ 222 - 0
resources/views/admin/specs/index.blade.php

xqd
@@ -0,0 +1,222 @@
+@extends('admin.layout-content')
+
+@section('header')
+    <style>
+
+    </style>
+@endsection
+
+@section('content')
+    <div class="layui-card">
+        <div class="layui-card-header sg-card-header">
+            {{ $model_name }}管理
+            <div class="sg-card-create">
+                <button id="sg-create-btn" class="layui-btn layui-btn-sm">创建</button>
+            </div>
+        </div>
+        <div class="layui-card-body">
+            <form class="layui-form" id="sg-search-form">
+                <div class="layui-form-item layui-row">
+                    @include('share.device-select', ['device_id' => '', 'device_name_id' => '', 'spec_id' => '', 'options' => $options, 'hide_spec' => true])
+                    <div class="layui-inline">
+                        <div class="layui-input-inline">
+                            <input type="text" name="name" placeholder="请输入规格型号" autocomplete="off" class="layui-input" value="{{ request('name') }}">
+                        </div>
+                    </div>
+                    <div class="layui-inline">
+                        <div class="layui-btn" id="sg-search-btn">搜索</div>
+                    </div>
+                </div>
+            </form>
+            <table id="sg-main-table" class="layui-hide" lay-filter="tableEvent"></table>
+            <script type="text/html" id="sg-table-bar">
+                <div class="layui-btn-group">
+                    <div class="layui-btn-group">
+                        <a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
+                        <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="delete">删除</a>
+                    </div>
+                </div>
+            </script>
+        </div>
+    </div>
+@endsection
+
+@section('footer')
+    <script>
+        $(function () {
+
+            layui.use(['table', 'layer'], function(){
+                var table = layui.table,
+                    layer = layui.layer,
+                    form = layui.form,
+                    laydate = layui.laydate,
+                    top_window = window;
+
+                table.render({
+                    elem: '#sg-main-table',
+                    url: '{{ $pre_uri }}' + 'get',
+                    cellMinWidth: 80,
+                    cols: [[
+                        { field: 'id', title: 'ID', align: 'center' },
+                        { field: 'device_type', title: '设备类型', align: 'center' },
+                        { field: 'device_name_name', title: '设备名称', align: 'center' },
+                        { field: 'name', title: '规格型号', align: 'center' },
+                        { field: 'sort', title: '排序', align: 'center' },
+                        { title: '操作', align:'center', toolbar: '#sg-table-bar' }
+                    ]],
+                    page: {
+                        layout: ['count', 'prev', 'page', 'next', 'skip', 'refresh'],
+                        limit: 15
+                    },
+                    even: true,
+                    where: transformToJson($('#sg-search-form').serializeArray()),
+                    done: function(res, curr, count) {
+
+                    }
+                });
+                table.on('tool(tableEvent)', function(obj){
+                    var data = obj.data;
+                    if(obj.event === 'delete'){
+                        layer.confirm('确定要删除吗?', function(index) {
+                            $.ajax({
+                                method: 'POST',
+                                url: '{{ $pre_uri }}' + 'delete',
+                                headers: {
+                                    'X-CSRF-TOKEN': '{{ csrf_token() }}'
+                                },
+                                data: {
+                                    id: data.id
+                                },
+                                success: function (data) {
+                                    if(data.status === 'success') {
+                                        obj.del();
+                                    } else {
+                                        layer.msg(data.info, {
+                                            icon: 2
+                                        });
+                                    }
+                                    layer.close(index);
+                                },
+                                error: function () {
+                                    layer.close(index);
+                                    layer.msg('删除失败', {
+                                        icon: 2
+                                    });
+                                }
+                            });
+                        });
+                    } else if(obj.event === 'edit') {
+                        layer.open({
+                            title: '编辑成员',
+                            type: 2,
+                            area: ['90%', '90%'],
+                            content: '{{ $pre_uri }}' + 'edit?id=' + data.id,
+                            end: function () {
+                                top_window.location.reload();
+                            }
+                        });
+                    }
+                });
+
+                if($('#search-begin-date').length > 0) {
+                    laydate.render({
+                        elem: '#search-begin-date',
+                        done: function () {
+                            updateTableBySearch();
+                        }
+                    });
+                }
+
+                if($('#search-end-date').length > 0) {
+                    laydate.render({
+                        elem: '#search-end-date',
+                        done: function () {
+                            updateTableBySearch();
+                        }
+                    });
+                }
+
+                function transformToJson(formData){
+                    var obj={};
+                    for (var i in formData) {
+                        obj[formData[i].name]=formData[i]['value'];
+                    }
+                    return obj;
+                }
+
+                function updateTableBySearch() {
+                    table.reload('sg-main-table', {
+                        where: transformToJson($('#sg-search-form').serializeArray()),
+                        page: {
+                            curr: 1
+                        }
+                    });
+                }
+
+                $('#sg-search-btn').click(function() {
+                    updateTableBySearch();
+                });
+                // $('#sg-search-form').change(function () {
+                //     updateTableBySearch();
+                // });
+                //
+                // form.on('select()', function(){
+                //     updateTableBySearch();
+                // });
+
+                $('#sg-create-btn').on('click', function () {
+                    layer.open({
+                        title: '创建' + '{{ $model_name }}',
+                        type: 2,
+                        area: ['90%', '90%'],
+                        content: '{{ $pre_uri }}' + 'create',
+                        end: function () {
+                            top_window.location.reload();
+                        }
+                    });
+                });
+
+                $('#sg-table-top-container').on('click', '.btn-delete-many', function () {
+                    layer.confirm('确定要删除所有选中行吗?', function () {
+                        var data = table.checkStatus('sg-main-table').data;
+                        if(data.length <= 0) {
+                            layer.msg('选择不能为空', {
+                                icon: 2
+                            });
+                            return false;
+                        }
+                        var ids = [];
+                        for(var i = 0; i < data.length; ++i) {
+                            ids.push(data[i]['id']);
+                        }
+                        $.ajax({
+                            method: 'POST',
+                            url: '{{ $pre_uri }}' + 'deleteMany',
+                            headers: {
+                                'X-CSRF-TOKEN': '{{ csrf_token() }}'
+                            },
+                            data: {
+                                ids: JSON.stringify(ids)
+                            },
+                            success: function (data) {
+                                if(data.status === 'success') {
+                                    top_window.location.reload();
+                                } else {
+                                    layer.msg(data.info, {
+                                        icon: 2
+                                    });
+                                }
+
+                            },
+                            error: function () {
+                                layer.msg('删除失败', {
+                                    icon: 2
+                                });
+                            }
+                        });
+                    })
+                });
+            });
+        })
+    </script>
+@endsection

+ 2 - 1
resources/views/admin/users/create.blade.php

xqd
@@ -13,7 +13,8 @@
 
                 {{ csrf_field() }}
                 @include('share.layui-form-item', ['type' => 'input', 'name' => 'name', 'label' => '姓名', 'required' => true, 'value' => (old('data') ? old('data')['name'] : '')])
-                @include('share.layui-form-item', ['type' => 'select', 'name' => 'role_id', 'label' => '角色', 'selected_id' => (old('data') ? old('data')['role_id'] : ''), 'options' => $role_options])
+                @include('share.layui-form-item', ['type' => 'select', 'name' => 'project_id', 'label' => '项目', 'selected_id' => (old('data') ? old('data')['project_id'] : ''), 'options' => $project_options])
+                @include('share.layui-form-item', ['type' => 'select', 'name' => 'project_role_id', 'label' => '项目角色', 'selected_id' => (old('data') ? old('data')['project_role_id'] : ''), 'options' => $role_options])
                 @include('share.layui-form-item', ['type' => 'input', 'input_type' => 'input', 'name' => 'phone', 'label' => '手机号', 'required' => true, 'value' => ''])
                 @include('share.layui-form-item', ['type' => 'input', 'input_type' => 'password', 'name' => 'password', 'label' => '密码', 'required' => true, 'value' => ''])
                 @include('share.layui-form-item', ['type' => 'input', 'input_type' => 'password', 'name' => 'password_confirmation', 'label' => '确认密码', 'required' => true, 'value' => ''])

+ 15 - 4
resources/views/admin/users/index.blade.php

xqd xqd
@@ -19,10 +19,20 @@
                 <div class="layui-form-item layui-row">
                     <div class="layui-inline">
                         <div class="layui-input-inline">
-                            <select name="role_id">
-                                <option value="0">角色</option>
+                            <select name="project_id">
+                                <option value="">项目</option>
+                                @foreach($project_options as $option)
+                                    <option value="{{ $option['id'] }}" {{ request('project_id') == $option['id'] ? 'selected' : ''  }}>{{ $option['name'] }}</option>
+                                @endforeach
+                            </select>
+                        </div>
+                    </div>
+                    <div class="layui-inline">
+                        <div class="layui-input-inline">
+                            <select name="project_role_id">
+                                <option value="">项目角色</option>
                                 @foreach($role_options as $option)
-                                    <option value="{{ $option['id'] }}" {{ request('role_id') == $option['id'] ? 'selected' : ''  }}>{{ $option['name'] }}</option>
+                                    <option value="{{ $option['id'] }}" {{ request('project_role_id') == $option['id'] ? 'selected' : ''  }}>{{ $option['name'] }}</option>
                                 @endforeach
                             </select>
                         </div>
@@ -67,7 +77,8 @@
                     cols: [[
                         { field: 'name', title: '姓名', align: 'center' },
                         { field: 'phone', title: '手机号', align: 'center' },
-                        { field: 'role_name', title: '角色', align: 'center' },
+                        { field: 'project_name', title: '项目', align: 'center' },
+                        { field: 'role_name', title: '项目角色', align: 'center' },
                         { field: 'created_at', title: '创建时间', align: 'center' },
                         { title: '操作', align:'center', toolbar: '#sg-table-bar' }
                     ]],

+ 105 - 0
resources/views/share/device-select-form.blade.php

xqd
@@ -0,0 +1,105 @@
+<?php
+?>
+<style type="text/css">
+
+</style>
+<div class="layui-form-item {{ $errors->has('device_id') ? 'has-error' : '' }}">
+    <label class="layui-form-label" style="padding: 0px;">设备类型</label>
+    <div class="layui-input-block">
+        <select name="device_id" lay-filter="device_id">
+            @foreach($options as $option)
+                <option value="{{$option->value}}" {{$option->value == $device_id ? 'selected' : ''}}>{{$option->text}}</option>
+            @endforeach
+        </select>
+        @if($errors->has('device_id'))
+            <span class="help-block">{{ $errors->first('device_id') }}</span>
+        @endif
+    </div>
+    @if($errors->has('device_id'))
+        <span class="help-block">{{ $errors->first('device_id') }}</span>
+    @endif
+</div>
+
+<div class="layui-form-item {{ $errors->has('device_name_id') ? 'has-error' : '' }}">
+    <label class="layui-form-label" style="padding: 0px;">设备名称</label>
+    <div class="layui-input-block">
+        <select name="device_name_id" lay-filter="device_name_id">
+        </select>
+        @if($errors->has('device_name_id'))
+            <span class="help-block">{{ $errors->first('device_name_id') }}</span>
+        @endif
+    </div>
+</div>
+@if(!isset($hide_spec))
+<div class="layui-form-item {{ $errors->has('spec_id') ? 'has-error' : '' }}">
+    <label class="layui-form-label" style="padding: 0px;">规格型号</label>
+    <div class="layui-input-block">
+        <select name="spec_id" lay-filter="spec_id">
+        </select>
+        @if($errors->has('spec_id'))
+            <span class="help-block">{{ $errors->first('spec_id') }}</span>
+        @endif
+    </div>
+</div>
+@endif
+<script>
+    $(function() {
+        layui.use(['form'], function() {
+            let form = layui.form;
+            let data = JSON.parse('{!! $options !!}');
+            let device_names = [];
+            let specs = [];
+            let device_id = '{{ $device_id }}';
+            let device_name_id = '{{ $device_name_id }}';
+            let spec_id = '{{ $spec_id }}';
+            let hide_spec = '{{ isset($hide_spec) ? "yes" : "no" }}';
+            // console.log(hide_spec)
+
+            form.on('select(device_id)', function(data) {
+                device_id = data.value;
+                device_name_id = '';
+                spec_id = '';
+                updateDeviceName()
+            });
+
+            form.on('select(device_name_id)', function(data) {
+                device_name_id = data.value;
+                spec_id = '';
+                updateSpec()
+            });
+
+            updateDeviceName();
+
+            function updateDeviceName() {
+                let device_index = getIndex(data, device_id);
+                device_names = data[device_index].names;
+                let options = '';
+                for(let i = 0; i < device_names.length; ++i) {
+                    options += '<option value=' + device_names[i].value + (parseInt(device_names[i].value) === parseInt(device_name_id) ? ' selected' : '') + '>' + device_names[i].text + '</option>'
+                }
+                $("select[name='device_name_id']").html(options);
+                form.render('select');
+                if(hide_spec === 'no') updateSpec()
+            }
+
+            function updateSpec() {
+                let name_index = getIndex(device_names, device_name_id);
+                specs = device_names[name_index].specs;
+                let options = '';
+                for(let i = 0; i < specs.length; ++i) {
+                    options += '<option value=' + specs[i].value + (parseInt(specs[i].value) === parseInt(spec_id) ? ' selected' : '') + '>' + specs[i].text + '</option>'
+                }
+                $("select[name='spec_id']").html(options);
+                form.render('select');
+            }
+
+            function getIndex(list, id) {
+                id = parseInt(id);
+                for(var i = 0; i < list.length; ++i) {
+                    if(list[i].value === id) return i;
+                }
+                return 0;
+            }
+        })
+    })
+</script>

+ 90 - 0
resources/views/share/device-select.blade.php

xqd
@@ -0,0 +1,90 @@
+<?php
+?>
+<style type="text/css">
+    #sg-device-select-app {
+        display: inline;
+    }
+</style>
+<div id="sg-device-select-app">
+    <div class="layui-inline">
+        <div class="layui-input-inline">
+            <select name="device_id" lay-filter="device_id">
+                @foreach($options as $option)
+                    <option value="{{$option->value}}" {{$option->value == $device_id ? 'selected' : ''}}>{{$option->text}}</option>
+                @endforeach
+            </select>
+        </div>
+    </div>
+    <div class="layui-inline">
+        <div class="layui-input-inline">
+            <select name="device_name_id" lay-filter="device_name_id">
+            </select>
+        </div>
+    </div>
+    @if(!isset($hide_spec))
+    <div class="layui-inline">
+        <div class="layui-input-inline">
+            <select name="spec_id" lay-filter="spec_id">
+            </select>
+        </div>
+    </div>
+    @endif
+</div>
+<script>
+    $(function() {
+        layui.use(['form'], function() {
+            let form = layui.form;
+            let data = JSON.parse('{!! $options !!}');
+            let device_names = [];
+            let specs = [];
+            let device_id = '{{ $device_id }}';
+            let device_name_id = '{{ $device_name_id }}';
+            let hide_spec = '{{ isset($hide_spec) ? "yes" : "no" }}';
+
+            form.on('select(device_id)', function(data) {
+                device_id = data.value;
+                device_name_id = '';
+                updateDeviceName()
+            });
+
+            form.on('select(device_name_id)', function(data) {
+                device_name_id = data.value;
+                updateSpec()
+            });
+
+            updateDeviceName();
+
+            function updateDeviceName() {
+                let device_index = getIndex(data, device_id);
+                device_names = data[device_index].names;
+                let options = '';
+                for(let i = 0; i < device_names.length; ++i) {
+                    options += '<option value=' + device_names[i].value + '>' + device_names[i].text + '</option>'
+                }
+                $("select[name='device_name_id']").html(options);
+                form.render('select');
+
+                if(hide_spec === 'no') updateSpec()
+            }
+
+            function updateSpec() {
+                let name_index = getIndex(device_names, device_name_id);
+                specs = device_names[name_index].specs;
+                let options = '';
+                for(let i = 0; i < specs.length; ++i) {
+                    options += '<option value=' + specs[i].value + '>' + specs[i].text + '</option>'
+                }
+                $("select[name='spec_id']").html(options);
+                form.render('select');
+            }
+
+            function getIndex(list, id) {
+                id = parseInt(id);
+                for(var i = 0; i < list.length; ++i) {
+                    if(list[i].value === id) return i;
+                }
+                return 0;
+            }
+        })
+    })
+</script>

+ 1 - 1
resources/views/share/layui-form-item.blade.php

xqd
@@ -4,7 +4,7 @@
         @if(!isset($type) || $type === 'input')
             <input {{ isset($id) ? 'id="' . $id . '"' : ''  }} type="{{ isset($input_type) ? $input_type : 'text' }}" name="data[{{ $name }}]" value="{{ $value }}" placeholder="{{ isset($placeholder) ? $placeholder : '请输入' . $label }}" class="layui-input" {{ (isset($required) && $required) ? 'required lay-verify="required' . (isset($verify) ? $verify : '') . '"' : '' }} autocomplete="off" {{  isset($disable) && $disable ? 'disabled' : '' }}>
         @elseif($type === 'date')
-            <input {{ isset($id) ? 'id=' . $id . '' : ''  }} type="{{ isset($input_type) ? $input_type : 'text' }}" name="data[{{ $name }}]" value="{{ $value }}" placeholder="{{ isset($placeholder) ? $placeholder : '请输入' . $label }}" class="layui-input sg-date-select" {{ (isset($required) && $required) ? 'required lay-verify=required' . (isset($verify) ? $verify : '') . '' : '' }} autocomplete="off">
+            <input {{ isset($id) ? 'id=' . $id . '' : ''  }} type="{{ isset($input_type) ? $input_type : 'text' }}" name="data[{{ $name }}]" value="{{ $value }}" placeholder="{{ isset($placeholder) ? $placeholder : '请输入' . $label }}" class="layui-input sg-select-date sg-date-select" {{ (isset($required) && $required) ? 'required lay-verify=required' . (isset($verify) ? $verify : '') . '' : '' }} autocomplete="off">
         @elseif($type === 'textarea')
             <textarea {{ isset($id) ? 'id="' . $id . '"' : ''  }} name="data[{{ $name }}]" placeholder="{{ isset($placeholder) ? $placeholder : '请输入' . $label }}" class="layui-textarea" {{ (isset($required) && $required) ? 'required lay-verify="required"' : '' }} autocomplete="off">{{ $value }}</textarea>
         @elseif($type === 'radio')