1557492053 3 years ago
parent
commit
1646a7411c

+ 52 - 10
app/admin/controller/Customer.php

@@ -7,6 +7,7 @@ namespace app\admin\controller;
 use app\BaseController;
 use app\common\model\CustomerModel;
 use app\common\model\StoreModel;
+use app\common\model\UserModel;
 use think\App;
 use think\facade\View;
 use think\Request;
@@ -15,12 +16,14 @@ class Customer extends BaseController
 {
     private $customerModel;
     private $storeModel;
+    private $userModel;
 
     public function __construct(App $app)
     {
         parent::__construct($app);
         $this->customerModel = new CustomerModel();
         $this->storeModel = new StoreModel();
+        $this->userModel = new UserModel();
     }
 
     /**
@@ -30,22 +33,38 @@ class Customer extends BaseController
      */
     public function index(Request $request) {
         $params = $request->param();
+        $format_params = [
+            'name_zh' => format_string($params['name_zh'] ?? null),
+            'name_en' => format_string($params['name_en'] ?? null),
+            'mobile' => format_string($params['mobile'] ?? null),
+        ];
         View::assign([
-            'list' => $this->customerModel->findCustomerPage($params),
-            'params' => [
-                'name' => format_string($params['name'] ?? null),
-                'mobile' => format_string($params['mobile'] ?? null),
-            ]
+            'list' => $this->customerModel->findByPaginate($format_params),
+            'params' => $format_params
         ]);
         return view();
     }
 
+    /**
+     * @param Request $request
+     * @return \think\response\Json|\think\response\View
+     * @throws \think\db\exception\DataNotFoundException
+     * @throws \think\db\exception\DbException
+     * @throws \think\db\exception\ModelNotFoundException
+     */
     public function add(Request $request) {
         if($request->isAjax()) {
             $params = $request->param();
             $isExist = $this->customerModel->doesItExist($params['mobile']);
-            if($isExist) return $this->fail(lang("Fail to add. Data duplication"));
-            $this->customerModel->save();
+            if ($isExist)
+                return $this->fail(lang("Fail to add. Data duplication"));
+            $user = $this->userModel->findById($params['follow_user_id']);
+            if (!$user)
+                return $this->fail(lang("The employees dont exist"));
+            $params['follow_username'] = $user->username;
+            $params['store_id'] = $user->store_id;
+            $params['store_abbr'] = $user->store_abbr;
+            $this->customerModel->save($params);
             return $this->ok(true);
         } else {
             View::assign('stores', $this->storeModel->findAllStore());
@@ -53,12 +72,35 @@ class Customer extends BaseController
         }
     }
 
+    /**
+     * @param Request $request
+     * @return \think\response\Json|\think\response\View
+     * @throws \think\db\exception\DataNotFoundException
+     * @throws \think\db\exception\DbException
+     * @throws \think\db\exception\ModelNotFoundException
+     */
     public function edit(Request $request) {
         $params = $request->param();
         if(!isset($params['id']))
             return $this->fail(lang('ID not exist'));
-        $this->customerModel->findById($params['id']);
-//        View::assign();
+        $customer = $this->customerModel->findById($params['id']);
+        if(!$customer)
+            return $this->fail(lang('"The customer doesn t exist"'));
+        if ($request->isAjax()) {
+            $user = $this->userModel->findById($params['follow_user_id']);
+            if (!$user)
+                return $this->fail(lang("The employees dont exist"));
+            $params['follow_username'] = $user->username;
+            $params['store_id'] = $user->store_id;
+            $params['store_abbr'] = $user->store_abbr;
+            $this->customerModel->where('id',$params['id'])->update($params);
+            return $this->ok(true);
+        }
+        View::assign([
+            'stores' => $this->storeModel->findAllStore(),
+            'customer' => $customer
+        ]);
+        return view();
     }
 
     public function delete(Request $request) {
@@ -66,7 +108,7 @@ class Customer extends BaseController
         if(!isset($params['ids']))
             return $this->fail(lang("Please select the data you want to delete"));
         $this->customerModel->deleteByIds(explode(',',$params['ids']));
-        return $this->ok();
+        return $this->ok(true);
     }
 
 

+ 13 - 5
app/admin/controller/Index.php

@@ -25,16 +25,24 @@ class Index extends BaseController
     }
 
     private function loadRuleTreeByAdminId(int $adminId) {
-        $access = $this->authGroupAccessModel->where('uid',$adminId)->find();
+        $access = $this->authGroupAccessModel->where([
+            ['is_delete', '=', 0],
+            ['uid','=',$adminId]
+        ])->find();
         if ($access->group_id > 0) {
-            $group = $this->authGroupModel->where('id',$access->group_id)->find();
+            $group = $this->authGroupModel->where([
+                ['is_delete','=', 0],
+                ['id', '=', $access->group_id]
+            ])->find();
             if ($group) {
                 $rules_str = $group->rules;
-                $rules = [];
                 if($rules_str == "*"){
-                    $rules = $this->authRuleModel->select();
+                    $rules = $this->authRuleModel->where('is_delete', 0)->select();
                 } else {
-                    $rules = $this->authRuleModel->select(explode(',',$rules_str));
+                    $rules = $this->authRuleModel->where([
+                        ['is_delete','=', 0],
+                        ['id', 'in', explode(',',$rules_str)]
+                    ])->select();
                 }
                 return $rules;
             }

+ 68 - 0
app/admin/controller/Product.php

@@ -0,0 +1,68 @@
+<?php
+
+
+namespace app\admin\controller;
+
+use app\BaseController;
+use app\common\model\ProductCategoryModel;
+use app\common\model\ProductModel;
+use think\App;
+use think\facade\View;
+use think\Request;
+
+class Product extends BaseController
+{
+
+    private $productModel;
+    private $categoryModel;
+
+    public function __construct(App $app)
+    {
+        parent::__construct($app);
+        $this->productModel = new ProductModel();
+        $this->categoryModel = new ProductCategoryModel();
+    }
+
+    /**
+     * @param Request $request
+     * @return \think\response\View
+     * @throws \think\db\exception\DbException
+     */
+    public function index(Request $request) {
+        $params = $request->param();
+        $format_params = [
+            'bar_code' => format_string($params['bar_code'] ?? null),
+            'category_id' => format_string($params['category_id'] ?? null),
+            'is_serve' => format_string($params['is_serve'] ?? null),
+        ];
+        View::assign([
+            'list' => $this->productModel->findByPaginate($format_params),
+            'params' => $format_params,
+            'all_category' => recursion($this->categoryModel->findAll(),0),
+        ]);
+        return view();
+    }
+
+
+    public function add(Request $request) {
+
+        return view();
+    }
+
+
+    public function edit(Request $request) {
+
+        return view();
+    }
+
+    public function delete(Request $request) {
+        $params = $request->param();
+        if(!isset($params['ids']))
+            return $this->fail(lang("Please select the data you want to delete"));
+        $this->productModel->deleteByIds(explode(',',$params['ids']));
+        return $this->ok();
+    }
+
+
+
+}

+ 104 - 0
app/admin/controller/ProductCategory.php

@@ -0,0 +1,104 @@
+<?php
+
+
+namespace app\admin\controller;
+
+
+use app\BaseController;
+use app\common\model\ProductCategoryModel;
+use think\App;
+use think\facade\View;
+use think\Request;
+
+class ProductCategory extends BaseController
+{
+
+    private $categoryModel;
+
+    public function __construct(App $app)
+    {
+        parent::__construct($app);
+        $this->categoryModel = new ProductCategoryModel();
+    }
+
+    /**
+     * @param Request $request
+     * @return \think\response\View
+     * @throws \think\db\exception\DbException
+     */
+    public function index(Request $request) {
+        $all_category = $this->categoryModel->findAll();
+        View::assign([
+            'tree' => recursion($all_category,0),
+        ]);
+        return view();
+    }
+
+    /**
+     * @param Request $request
+     * @return \think\response\Json|\think\response\View
+     */
+    public function add(Request $request) {
+        if($request->isAjax()) {
+            $params = $request->param();
+
+            $isExist = $this->categoryModel->doesItExist($params['name']);
+            if ($isExist)
+                return $this->fail(lang("Fail to add. Data duplication"));
+            if($params['pid'] > 0) {
+                $parent = $this->categoryModel->findById($params['pid']);
+                if(!$parent)
+                    return $this->fail(lang("The parent template does not exist"));
+            }
+            $category = $this->categoryModel->save($params);
+            return $this->ok($category);
+        }
+
+        $all_category = $this->categoryModel->findAll();
+        View::assign('all_category', recursion($all_category,0));
+        return view();
+    }
+
+    /**
+     * @param Request $request
+     * @return \think\response\Json|\think\response\View
+     * @throws \think\db\exception\DataNotFoundException
+     * @throws \think\db\exception\DbException
+     * @throws \think\db\exception\ModelNotFoundException
+     */
+    public function edit(Request $request) {
+        $params = $request->param();
+        if(!isset($params['id']))
+            return $this->fail(lang('ID not exist'));
+        $category = $this->categoryModel->findById($params['id']);
+        if(!$category)
+            return $this->fail(lang('"The customer doesn t exist"'));
+        if ($request->isAjax()) {
+            if($params['pid'] > 0) {
+                $parent = $this->categoryModel->findById($params['pid']);
+                if(!$parent)
+                    return $this->fail(lang("The parent template does not exist"));
+            }
+            $this->categoryModel->where('id',$params['id'])->update($params);
+            return $this->ok(true);
+        }
+
+        $all_category = $this->categoryModel->findAll();
+        View::assign([
+            'category' => $category,
+            'all_category' => recursion($all_category, 0)
+        ]);
+        return view();
+    }
+
+    public function delete(Request $request) {
+        $params = $request->param();
+        if(!isset($params['ids']))
+            return $this->fail(lang("Please select the data you want to delete"));
+        $this->categoryModel->deleteByIds(explode(',',$params['ids']));
+        return $this->ok();
+    }
+
+
+
+}

+ 21 - 8
app/admin/lang/zh-cn.php

@@ -37,21 +37,25 @@ return [
     'Confirm'   => '确定',
     'Submit'    => '提交',
     'Succeed'   => '成功',
+    'Warn'      =>  '提醒',
+    'Update'    =>  '更新',
+    'Base'      =>  '基础',
+    'Info'      =>  '信息',
     'unfold_search' => '展开搜索',
     'Please fill in' => '请填写',
+
+
     'Fail to add. Data duplication' => '添加失败,数据重复!',
     'Please select the data you want to delete' => '请选择您要删除的数据!',
     'Check at least one box' => '至少需要勾选一条进行删除',
     'ID not exist' => 'ID不存在!',
+    'Are you sure you want to delete the selected data' => '您确定要删除选中的数据吗',
+    "The customer doesn t exist" => "客户不存在",
+    'The employees dont exist'  => "员工不存在",
 
 
-
-
-
-
-
-
-
+    'Order'     =>  '订单',
+    'Order Data'=>  '订单数据',
 
 
 
@@ -66,7 +70,7 @@ return [
     'id' => 'ID',
     'name_zh' => '中文名',
     'name_en' => '英文名',
-    'name' => '名称',
+    'Name' => '名称',
     'mobile'     => '电话',
     'sex'     => '性别',
     'sun_calendar' => '阳历',
@@ -81,6 +85,15 @@ return [
     'store_id'=>'门店ID',
     'store_abbr' => '门店简称',
 
+    'Category'  =>  '类别',
+
+
+    'Bar Code'  => '商品条码',
+    'Image'  => '图片',
+    'Category ID'   =>  '商品类别ID',
+    'Is Serve'  =>  '是否是服务',
+    'Purchase Price'    =>  '进价',
+    'Selling Price'    =>  '卖价',
 
 
 ];

+ 17 - 15
app/admin/view/customer/add.html

@@ -46,14 +46,14 @@
                   <div class="layui-inline">
                     <label class="layui-form-label">{:lang("sun_calendar")}</label>
                     <div class="layui-input-block">
-                      <input type="text" name="sun_calendar" id="sun_calendar" lay-verify="date" placeholder="yyyy-MM-dd" autocomplete="off" class="layui-input" lay-key="1">
+                      <input type="text" name="sun_calendar" id="sun_calendar" lay-verify="datetime" placeholder="yyyy-MM-dd H:i:s" autocomplete="off" class="layui-input" lay-key="1">
                     </div>
                   </div>
 
                   <div class="layui-inline">
                     <label class="layui-form-label">{:lang("lunar_calendar")}</label>
                     <div class="layui-input-block">
-                      <input type="text" name="lunar_calendar" id="lunar_calendar" lay-verify="date" placeholder="yyyy-MM-dd" autocomplete="off" class="layui-input" lay-key="1">
+                      <input type="text" name="lunar_calendar" id="lunar_calendar" lay-verify="datetime" placeholder="yyyy-MM-dd H:i:s" autocomplete="off" class="layui-input" lay-key="1">
                     </div>
                   </div>
 
@@ -94,16 +94,16 @@
                     </div>
                   </div>
 
-                  <div class="layui-form-item">
-                    <label class="layui-form-label">{:lang('Store')}</label>
-                    <div class="layui-input-block">
-                      <select name="store_id" lay-filter="required">
-                        {volist name="stores" id="item"}
-                        <option value="{$item.id}">{$item.name}</option>
-                        {/volist}
-                      </select>
-                    </div>
-                  </div>
+<!--                  <div class="layui-form-item">-->
+<!--                    <label class="layui-form-label">{:lang('Store')}</label>-->
+<!--                    <div class="layui-input-block">-->
+<!--                      <select name="store_id" lay-filter="required">-->
+<!--                        {volist name="stores" id="item"}-->
+<!--                        <option value="{$item.id}">{$item.name}</option>-->
+<!--                        {/volist}-->
+<!--                      </select>-->
+<!--                    </div>-->
+<!--                  </div>-->
                   <div class="layui-form-item">
                     <div class="layui-input-block">
                       <button type="submit" class="layui-btn" lay-submit="" lay-filter="caviar_submit_btn">{:lang('Submit')}</button>
@@ -125,7 +125,7 @@
 </div>
 <script>
   //当你在iframe页面关闭自身时
-  var index = parent.layer.getFrameIndex(window.name); //先得到当前iframe层的索引
+  // var index = parent.layer.getFrameIndex(window.name); //先得到当前iframe层的索引
   // parent.layer.close(index); //再执行关闭
 
   layui.use(['laydate','form'], () => {
@@ -144,10 +144,12 @@
 
 
     laydate.render({
-      elem: '#sun_calendar' //指定元素
+      elem: '#sun_calendar',
+      type: 'datetime'
     });
     laydate.render({
-      elem: '#lunar_calendar' //指定元素
+      elem: '#lunar_calendar',
+      type: 'datetime'
     });
   });
 </script>

+ 118 - 113
app/admin/view/customer/edit.html

@@ -1,153 +1,158 @@
+
 {include file='common/_js_css'}
 
-<div class="lyear-layout-web">
-  <div class="lyear-layout-container">
-    <!--页面主要内容-->
-    <main>
-      <div class="container-fluid">
-        <div class="row">
-          <div class="col-lg-12">
-            <div class="card">
-              <div class="card-body">
-                <form class="layui-form" action="">
-
-                  <div class="layui-form-item">
-                    <label class="layui-form-label">{:lang("name_zh")}</label>
-                    <div class="layui-input-block">
-                      <input type="text" name="name_zh" lay-verify="required" lay-reqtext="{:lang('Please fill in')}" autocomplete="off" class="layui-input">
-                    </div>
-                  </div>
+<div class="container-fluid p-t-15">
+
+  <div class="row">
+    <div class="col-lg-12">
+      <div class="card">
+        <ul class="nav nav-tabs page-tabs">
+          <li class="active"> <a href="{:url('admin/customer/edit')}?id={$customer.id}">{:lang("Base")}</a> </li>
+          <li> <a href="#">{:lang("Order Data")}</a> </li>
+<!--          <li> <a href="lyear_pages_config_upload.html">上传</a> </li>-->
+        </ul>
+        <div class="tab-content">
+          <div class="tab-pane active">
+            <form class="layui-form" action="">
+
+              <div class="layui-form-item">
+                <label class="layui-form-label">{:lang("name_zh")}</label>
+                <div class="layui-input-block">
+                  <input name="id" value="{$customer.id}" hidden>
+                  <input type="text" name="name_zh" lay-verify="required" lay-reqtext="{:lang('Please fill in')}" value="{$customer.name_zh}" autocomplete="off" class="layui-input">
+                </div>
+              </div>
 
-                  <div class="layui-form-item">
-                    <label class="layui-form-label">{:lang("name_en")}</label>
-                    <div class="layui-input-block">
-                      <input type="text" name="name_en" lay-verify="required" lay-reqtext="{:lang('Please fill in')}" autocomplete="off" class="layui-input">
-                    </div>
-                  </div>
+              <div class="layui-form-item">
+                <label class="layui-form-label">{:lang("name_en")}</label>
+                <div class="layui-input-block">
+                  <input type="text" name="name_en" lay-verify="required" lay-reqtext="{:lang('Please fill in')}"  value="{$customer.name_en}" autocomplete="off" class="layui-input">
+                </div>
+              </div>
 
-                  <div class="layui-form-item">
-                      <label class="layui-form-label">{:lang("mobile")}</label>
-                      <div class="layui-input-block">
-                        <input type="tel" name="mobile" lay-verify="required|phone" autocomplete="off" class="layui-input demo-phone layui-form-danger">
-                      </div>
-                  </div>
+              <div class="layui-form-item">
+                <label class="layui-form-label">{:lang("mobile")}</label>
+                <div class="layui-input-block">
+                  <input type="tel" name="mobile" lay-verify="required|phone" autocomplete="off"  value="{$customer.mobile}" class="layui-input demo-phone layui-form-danger">
+                </div>
+              </div>
 
-                  <div class="layui-form-item">
-                    <label class="layui-form-label">{:lang('sex')}</label>
-                    <div class="layui-input-block">
-                      <select name="sex" lay-filter="required">
-                        <option value="1">{:lang('Man')}</option>
-                        <option value="2">{:lang('Woman')}</option>
-                        <option value="3">{:lang('Unknown')}</option>
-                      </select>
-                    </div>
-                  </div>
+              <div class="layui-form-item">
+                <label class="layui-form-label">{:lang('sex')}</label>
+                <div class="layui-input-block">
+                  <select name="sex" lay-filter="required">
+                    <option value="1" {if $customer.sex == 1} selected {/if}>{:lang('Man')}</option>
+                    <option value="2" {if $customer.sex == 2} selected {/if}>{:lang('Woman')}</option>
+                    <option value="3" {if $customer.sex == 3} selected {/if}>{:lang('Unknown')}</option>
+                  </select>
+                </div>
+              </div>
 
-                  <div class="layui-inline">
-                    <label class="layui-form-label">{:lang("sun_calendar")}</label>
-                    <div class="layui-input-block">
-                      <input type="text" name="sun_calendar" id="sun_calendar" lay-verify="date" placeholder="yyyy-MM-dd" autocomplete="off" class="layui-input" lay-key="1">
-                    </div>
-                  </div>
+              <div class="layui-inline">
+                <label class="layui-form-label">{:lang("sun_calendar")}</label>
+                <div class="layui-input-block">
+                  <input type="text" name="sun_calendar" id="sun_calendar" value="{$customer.sun_calendar}" lay-verify="datetime" placeholder="yyyy-MM-dd" autocomplete="off" class="layui-input" lay-key="1">
+                </div>
+              </div>
 
-                  <div class="layui-inline">
-                    <label class="layui-form-label">{:lang("lunar_calendar")}</label>
-                    <div class="layui-input-block">
-                      <input type="text" name="lunar_calendar" id="lunar_calendar" lay-verify="date" placeholder="yyyy-MM-dd" autocomplete="off" class="layui-input" lay-key="1">
-                    </div>
-                  </div>
+              <div class="layui-inline">
+                <label class="layui-form-label">{:lang("lunar_calendar")}</label>
+                <div class="layui-input-block">
+                  <input type="text" name="lunar_calendar" id="lunar_calendar" value="{$customer.lunar_calendar}" lay-verify="datetime" placeholder="yyyy-MM-dd" autocomplete="off" class="layui-input" lay-key="1">
+                </div>
+              </div>
 
-                  <div class="layui-form-item">
-                    <label class="layui-form-label">{:lang("follow_user_id")}</label>
-                    <div class="layui-input-block">
-                      <input type="text" name="follow_user_id" lay-verify="required" lay-reqtext="{:lang('Please fill in')}" autocomplete="off" class="layui-input">
-                    </div>
-                  </div>
+              <div class="layui-form-item">
+                <label class="layui-form-label">{:lang("follow_user_id")}</label>
+                <div class="layui-input-block">
+                  <input type="text" name="follow_user_id" value="{$customer.follow_user_id}" lay-verify="required" lay-reqtext="{:lang('Please fill in')}" autocomplete="off" class="layui-input">
+                </div>
+              </div>
 
-                  <div class="layui-form-item">
-                    <label class="layui-form-label">{:lang("linkman")}</label>
-                    <div class="layui-input-block">
-                      <input type="text" name="linkman" lay-verify="required" lay-reqtext="{:lang('Please fill in')}" autocomplete="off" class="layui-input">
-                    </div>
-                  </div>
+              <div class="layui-form-item">
+                <label class="layui-form-label">{:lang("follow_username")}</label>
+                <div class="layui-input-block">
+                  <input type="text" name="follow_username" value="{$customer.follow_username}" lay-verify="required" lay-reqtext="{:lang('Please fill in')}" autocomplete="off" class="layui-input" disabled>
+                </div>
+              </div>
 
-                  <div class="layui-form-item">
-                    <label class="layui-form-label">{:lang("relation")}</label>
-                    <div class="layui-input-block">
-                      <input type="text" name="relation" lay-verify="required" lay-reqtext="{:lang('Please fill in')}" autocomplete="off" class="layui-input">
-                    </div>
-                  </div>
 
-                  <div class="layui-form-item">
-                    <label class="layui-form-label">{:lang("address")}</label>
-                    <div class="layui-input-block">
-                      <input type="text" name="address" lay-verify="required" lay-reqtext="{:lang('Please fill in')}" autocomplete="off" class="layui-input">
-                    </div>
-                  </div>
+              <div class="layui-form-item">
+                <label class="layui-form-label">{:lang("linkman")}</label>
+                <div class="layui-input-block">
+                  <input type="text" name="linkman" lay-verify="required" value="{$customer.linkman}" lay-reqtext="{:lang('Please fill in')}" autocomplete="off" class="layui-input">
+                </div>
+              </div>
 
-                  <div class="layui-form-item">
-                    <div class="layui-inline">
-                      <label class="layui-form-label">{:lang("email")}</label>
-                      <div class="layui-input-block">
-                        <input type="text" name="email" lay-verify="email" autocomplete="off" class="layui-input">
-                      </div>
-                    </div>
-                  </div>
+              <div class="layui-form-item">
+                <label class="layui-form-label">{:lang("relation")}</label>
+                <div class="layui-input-block">
+                  <input type="text" name="relation" lay-verify="required" value="{$customer.relation}" lay-reqtext="{:lang('Please fill in')}" autocomplete="off" class="layui-input">
+                </div>
+              </div>
 
-                  <div class="layui-form-item">
-                    <label class="layui-form-label">{:lang('Store')}</label>
-                    <div class="layui-input-block">
-                      <select name="store_id" lay-filter="required">
-                        {volist name="stores" id="item"}
-                        <option value="{$item.id}">{$item.name}</option>
-                        {/volist}
-                      </select>
-                    </div>
-                  </div>
-                  <div class="layui-form-item">
-                    <div class="layui-input-block">
-                      <button type="submit" class="layui-btn" lay-submit="" lay-filter="caviar_submit_btn">{:lang('Submit')}</button>
-                      <button type="reset" class="layui-btn layui-btn-primary">{:lang("Reset")}</button>
-                    </div>
+              <div class="layui-form-item">
+                <label class="layui-form-label">{:lang("address")}</label>
+                <div class="layui-input-block">
+                  <input type="text" name="address" value="{$customer.address}"  lay-verify="required" lay-reqtext="{:lang('Please fill in')}" autocomplete="off" class="layui-input">
+                </div>
+              </div>
+
+              <div class="layui-form-item">
+                <div class="layui-inline">
+                  <label class="layui-form-label">{:lang("email")}</label>
+                  <div class="layui-input-block">
+                    <input type="text" name="email" value="{$customer.email}" lay-verify="email" autocomplete="off" class="layui-input">
                   </div>
-                </form>
+                </div>
+              </div>
 
+              <div class="layui-form-item">
+                <label class="layui-form-label">{:lang('Store')}</label>
+                <div class="layui-input-block">
+                  <select name="store_id" lay-filter="required" disabled>
+                    {volist name="stores" id="item"}
+                    <option value="{$item.id}" {if $customer.store_id == $item.id} selected {/if}> {$item.name} </option>
+                    {/volist}
+                  </select>
+                </div>
               </div>
-            </div>
+              <div class="layui-form-item">
+                <div class="layui-input-block">
+                  <button type="submit" class="layui-btn" lay-submit="" lay-filter="caviar_submit_btn">{:lang('Update')}</button>
+                </div>
+              </div>
+            </form>
           </div>
-
         </div>
 
       </div>
-    </main>
-    <!--End 页面主要内容-->
+    </div>
+
   </div>
+
 </div>
 <script>
-  //当你在iframe页面关闭自身时
-  var index = parent.layer.getFrameIndex(window.name); //先得到当前iframe层的索引
-  // parent.layer.close(index); //再执行关闭
-
   layui.use(['laydate','form'], () => {
     const laydate = layui.laydate;
     const form = layui.form;
 
     form.on('submit(caviar_submit_btn)', (data) =>{
-      const response = request('/admin/customer/add',data.field)
+      const response = request('/admin/customer/edit',data.field)
       response.then((res) => {
-          res.code === 200 ? layer.msg("{:lang('Succeed')}", {icon: 1,time:500},() => {
-            location.reload();
-          }) : layer.msg(res.message,{icon: 5})
+        res.code === 200 ? layer.msg("{:lang('Succeed')}", {icon: 1,time:500}) : layer.msg(res.message,{icon: 5})
       })
       return false;
     });
 
 
     laydate.render({
-      elem: '#sun_calendar' //指定元素
+      elem: '#sun_calendar',
+      type: 'datetime'
     });
     laydate.render({
-      elem: '#lunar_calendar' //指定元素
+      elem: '#lunar_calendar',
+      type: 'datetime'
     });
   });
 </script>

+ 22 - 24
app/admin/view/customer/index.html

@@ -10,15 +10,23 @@
                         <div class="row">
                             <div class="col-md-4">
                                 <div class="form-group">
-                                    <label class="w-120 pull-left control-label">{$Think.lang.name}</label>
+                                    <label class="w-120 pull-left control-label">{$Think.lang.name_zh}</label>
                                     <div class="pull-left w-120-calc">
-                                        <input type="text" class="form-control pull-left" name="name" value="{$params.name}" placeholder="{$Think.lang.name}" />
+                                        <input type="text" class="form-control pull-left" name="name_zh" value="{$params.name_zh}" placeholder="{$Think.lang.name_zh}" />
                                     </div>
                                 </div>
                             </div>
                             <div class="col-md-4">
                                 <div class="form-group">
-                                    <label class="w-120 pull-left control-label">{:lang("phone")}</label>
+                                    <label class="w-120 pull-left control-label">{$Think.lang.name_en}</label>
+                                    <div class="pull-left w-120-calc">
+                                        <input type="text" class="form-control pull-left" name="name_en" value="{$params.name_en}" placeholder="{$Think.lang.name_en}" />
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="col-md-4">
+                                <div class="form-group">
+                                    <label class="w-120 pull-left control-label">{:lang("mobile")}</label>
                                     <div class="pull-left w-120-calc">
                                         <input type="text" class="form-control pull-left" name="mobile" value="{$params.mobile}" placeholder="{:lang('mobile')}" />
                                     </div>
@@ -42,7 +50,9 @@
                     <div class="toolbar-btn-action">
                         <a class="btn btn-success m-r-5" id="caviar_search_btn" href="#!" onclick="select_card_switch()">{$Think.lang.unfold_search}</a>
                         <a class="btn btn-primary m-r-5" href="#!" onclick="add('{:url(\'admin/customer/add\')}')"><i class="mdi mdi-plus"></i> {:lang('add')}</a>
-                        <a class="btn btn-danger" href="#!" onclick="caviar_delete()"><i class="mdi mdi-window-close"></i> {:lang('delete')}</a>
+                        <a class="btn btn-danger" href="#!" onclick="
+                            caviar_checkbox_delete('{:url(\'admin/customer/delete\')}', ['{:lang(\'Check at least one box\')}','{:lang(\'Succeed\')}'],'{:lang(\'Warn\')}','{:lang(\'Are you sure you want to delete the selected data\')}',['{:lang(\'Confirm\')}'])"
+                        ><i class="mdi mdi-window-close"></i> {:lang('delete')}</a>
                     </div>
                 </div>
                 <div class="card-body">
@@ -92,9 +102,11 @@
                                 <td>{$item.create_time}</td>
                                 <td>
                                     <div class="btn-group">
-                                        <a class="btn btn-xs btn-default" href="#!" title="{:lang('edit')}" data-toggle="tooltip"><i class="mdi mdi-pencil"></i></a>
-                                        <a class="btn btn-xs btn-default" href="#!" title="{:lang('select')}" data-toggle="tooltip"><i class="mdi mdi-eye"></i></a>
-                                        <a class="btn btn-xs btn-default" href="#!" title="{:lang('delete')}" data-toggle="tooltip"><i class="mdi mdi-window-close"></i></a>
+<!--                                        <a class="btn btn-xs btn-default" href="#!" title="{:lang('edit')}" data-toggle="tooltip"><i class="mdi mdi-pencil"></i></a>-->
+                                        <a class="btn btn-xs btn-default" href="#!" title="{:lang('select')}" data-toggle="tooltip" onclick='view("/admin/customer/edit?id={$item.id}")'><i class="mdi mdi-eye"></i></a>
+                                        <a class="btn btn-xs btn-default" href="#!" title="{:lang('delete')}" data-toggle="tooltip" onclick='
+                                           deletingASingle("{:url(\"admin/customer/delete\")}","{$item.id}",["{:lang(\"Succeed\")}"],"{:lang(\"Warn\")}","{:lang(\"Are you sure you want to delete the selected data\")}",["{:lang(\"Confirm\")}"])'
+                                        ><i class="mdi mdi-window-close"></i></a>
                                     </div>
                                 </td>
                             </tr>
@@ -111,25 +123,11 @@
 
 <script type="text/javascript">
 
-    if(check_params(["{$params.name}", "{$params.mobile}"])) {
+    if(check_params(["{$params.name_zh}","{$params.name_en}", "{$params.mobile}"]))
         $('#select_card_caviar').css('display','block');
-    }
-
-    async function caviar_delete() {
-        const ids = $('.checkbox_caviar:checkbox:checked').map((index,el) => {
-            return $(el).val();
-        }).get();
-        if(ids.length === 0) {
-            layer.msg("{:lang('Check at least one box')}",{icon: 5})
-            return false;
-        }
-        const response = await request('{:url("admin/customer/delete")}', {ids:ids.join(',')});
-        response.code === 200 ? layer.msg("{:lang('Succeed')}", {icon: 1,time:500},() => {
-            location.reload();
-        }) : layer.msg(res.message,{icon: 5})
-        console.log(response)
-    }
+    
 
+    
 </script>
 
 

+ 145 - 0
app/admin/view/product/add.html

@@ -0,0 +1,145 @@
+{include file='common/_js_css'}
+
+<div class="lyear-layout-web">
+  <div class="lyear-layout-container">
+    <!--页面主要内容-->
+    <main>
+      <div class="container-fluid">
+        <div class="row">
+          <div class="col-lg-12">
+            <div class="card">
+              <div class="card-body">
+                <form class="layui-form" action="">
+
+                  <div class="layui-form-item">
+                    <label class="layui-form-label">{:lang("name_zh")}</label>
+                    <div class="layui-input-block">
+                      <input type="text" name="name_zh" lay-verify="required" lay-reqtext="{:lang('Please fill in')}" autocomplete="off" class="layui-input">
+                    </div>
+                  </div>
+
+                  <div class="layui-form-item">
+                    <label class="layui-form-label">{:lang("name_en")}</label>
+                    <div class="layui-input-block">
+                      <input type="text" name="name_en" lay-verify="required" lay-reqtext="{:lang('Please fill in')}" autocomplete="off" class="layui-input">
+                    </div>
+                  </div>
+
+                  <div class="layui-form-item">
+                      <label class="layui-form-label">{:lang("mobile")}</label>
+                      <div class="layui-input-block">
+                        <input type="tel" name="mobile" lay-verify="required|phone" autocomplete="off" class="layui-input demo-phone layui-form-danger">
+                      </div>
+                  </div>
+
+                  <div class="layui-form-item">
+                    <label class="layui-form-label">{:lang('sex')}</label>
+                    <div class="layui-input-block">
+                      <select name="sex" lay-filter="required">
+                        <option value="1">{:lang('Man')}</option>
+                        <option value="2">{:lang('Woman')}</option>
+                        <option value="3">{:lang('Unknown')}</option>
+                      </select>
+                    </div>
+                  </div>
+
+                  <div class="layui-inline">
+                    <label class="layui-form-label">{:lang("sun_calendar")}</label>
+                    <div class="layui-input-block">
+                      <input type="text" name="sun_calendar" id="sun_calendar" lay-verify="datetime" placeholder="yyyy-MM-dd H:i:s" autocomplete="off" class="layui-input" lay-key="1">
+                    </div>
+                  </div>
+
+                  <div class="layui-inline">
+                    <label class="layui-form-label">{:lang("lunar_calendar")}</label>
+                    <div class="layui-input-block">
+                      <input type="text" name="lunar_calendar" id="lunar_calendar" lay-verify="datetime" placeholder="yyyy-MM-dd H:i:s" autocomplete="off" class="layui-input" lay-key="1">
+                    </div>
+                  </div>
+
+                  <div class="layui-form-item">
+                    <label class="layui-form-label">{:lang("follow_user_id")}</label>
+                    <div class="layui-input-block">
+                      <input type="text" name="follow_user_id" lay-verify="required" lay-reqtext="{:lang('Please fill in')}" autocomplete="off" class="layui-input">
+                    </div>
+                  </div>
+
+                  <div class="layui-form-item">
+                    <label class="layui-form-label">{:lang("linkman")}</label>
+                    <div class="layui-input-block">
+                      <input type="text" name="linkman" lay-verify="required" lay-reqtext="{:lang('Please fill in')}" autocomplete="off" class="layui-input">
+                    </div>
+                  </div>
+
+                  <div class="layui-form-item">
+                    <label class="layui-form-label">{:lang("relation")}</label>
+                    <div class="layui-input-block">
+                      <input type="text" name="relation" lay-verify="required" lay-reqtext="{:lang('Please fill in')}" autocomplete="off" class="layui-input">
+                    </div>
+                  </div>
+
+                  <div class="layui-form-item">
+                    <label class="layui-form-label">{:lang("address")}</label>
+                    <div class="layui-input-block">
+                      <input type="text" name="address" lay-verify="required" lay-reqtext="{:lang('Please fill in')}" autocomplete="off" class="layui-input">
+                    </div>
+                  </div>
+
+                  <div class="layui-form-item">
+                    <div class="layui-inline">
+                      <label class="layui-form-label">{:lang("email")}</label>
+                      <div class="layui-input-block">
+                        <input type="text" name="email" lay-verify="email" autocomplete="off" class="layui-input">
+                      </div>
+                    </div>
+                  </div>
+
+                  <div class="layui-form-item">
+                    <div class="layui-input-block">
+                      <button type="submit" class="layui-btn" lay-submit="" lay-filter="caviar_submit_btn">{:lang('Submit')}</button>
+                      <button type="reset" class="layui-btn layui-btn-primary">{:lang("Reset")}</button>
+                    </div>
+                  </div>
+                </form>
+
+              </div>
+            </div>
+          </div>
+
+        </div>
+
+      </div>
+    </main>
+    <!--End 页面主要内容-->
+  </div>
+</div>
+<script>
+  //当你在iframe页面关闭自身时
+  // var index = parent.layer.getFrameIndex(window.name); //先得到当前iframe层的索引
+  // parent.layer.close(index); //再执行关闭
+
+  layui.use(['laydate','form'], () => {
+    const laydate = layui.laydate;
+    const form = layui.form;
+
+    form.on('submit(caviar_submit_btn)', (data) =>{
+      const response = request('/admin/product/add',data.field)
+      response.then((res) => {
+          res.code === 200 ? layer.msg("{:lang('Succeed')}", {icon: 1,time:500},() => {
+            location.reload();
+          }) : layer.msg(res.message,{icon: 5})
+      })
+      return false;
+    });
+
+
+    laydate.render({
+      elem: '#sun_calendar',
+      type: 'datetime'
+    });
+    laydate.render({
+      elem: '#lunar_calendar',
+      type: 'datetime'
+    });
+  });
+</script>

+ 158 - 0
app/admin/view/product/index.html

@@ -0,0 +1,158 @@
+{include file='common/_js_css'}
+<link href="__CSS__/common.css" rel="stylesheet">
+<div class="container-fluid">
+    <div class="row">
+        <div class="col-lg-12">
+            <div class="card" id="select_card_caviar"  style="display: none">
+                <div class="card-header">{$Think.lang.condition}</div>
+                <div class="card-body">
+                    <form action="{:url('admin/product/index')}" method="post" class="form-horizontal form-search">
+                        <div class="row">
+                            <div class="col-md-4">
+                                <div class="form-group">
+                                    <label class="w-120 pull-left control-label">{:lang("Bar Code")}</label>
+                                    <div class="pull-left w-120-calc">
+                                        <input type="text" class="form-control pull-left" name="bar_code" value="{$params.bar_code}" placeholder='{:lang("Bar Code")}' />
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="col-md-4">
+                                <div class="form-group">
+                                    <label class="w-120 pull-left control-label">{:lang("Category")}</label>
+                                    <div class="pull-left w-120-calc">
+                                        <select class="form-control pull-left" name="category_id">
+                                            <option value="0">{:lang("Unknown")}</option>
+                                            {volist name="all_category" id="item"}
+                                            <option value="{$item.id}" {if $params.category_id == $item.id} selected {/if} >{$item.name}</option>
+                                            {volist name='$item.children' id='tree_vo'}
+                                            <option value="{$tree_vo.id}" {if $params.category_id == $tree_vo.id} selected {/if} >&nbsp;&nbsp;| --&nbsp;{$tree_vo.name}</option>
+                                            {volist name='$tree_vo.children' id='tree_one_vo'}
+                                            <option value="{$tree_one_vo.id}" {if $params.category_id == $tree_one_vo.id}>&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;{$tree_one_vo.name}</option>
+                                            {/volist}
+                                            {/volist}
+                                            {/volist}
+                                        </select>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="col-md-4">
+                                <div class="form-group">
+                                    <label class="w-120 pull-left control-label">{:lang("Is serve")}</label>
+                                    <div class="pull-left w-120-calc">
+                                        <select class="form-control pull-left" name="category_id">
+                                            <option value="">{:lang("Unknown")}</option>
+                                            <option value="0">{:lang("Product")}</option>
+                                            <option value="1">{:lang("Serve")}</option>
+
+                                        </select>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="col-md-4">
+                                <div class="form-group">
+                                    <label class="w-120 pull-left control-label"></label>
+                                    <div class="pull-left w-120-calc">
+                                        <button class="btn btn-success m-r-5" id="caviar_send_btn" type="submit" href="#">{:lang('search')}</button>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+
+                    </form>
+                </div>
+            </div>
+            <div class="card">
+                <div class="card-toolbar clearfix">
+                    <div class="toolbar-btn-action">
+                        <a class="btn btn-success m-r-5" id="caviar_search_btn" href="#!" onclick="select_card_switch()">{$Think.lang.unfold_search}</a>
+                        <a class="btn btn-primary m-r-5" href="#!" onclick="add('{:url(\'admin/product/add\')}')"><i class="mdi mdi-plus"></i> {:lang('add')}</a>
+                        <a class="btn btn-danger" href="#!" onclick="
+                            caviar_checkbox_delete('{:url(\'admin/product/delete\')}', ['{:lang(\'Check at least one box\')}','{:lang(\'Succeed\')}'],'{:lang(\'Warn\')}','{:lang(\'Are you sure you want to delete the selected data\')}',['{:lang(\'Confirm\')}'])"
+                        ><i class="mdi mdi-window-close"></i> {:lang('delete')}</a>
+                    </div>
+                </div>
+                <div class="card-body">
+                    <div class="table-responsive">
+                        <table class="table table-bordered">
+                            <thead>
+                            <tr>
+                                <th>
+                                    <label class="lyear-checkbox checkbox-primary">
+                                        <input type="checkbox" id="check-all" onclick="checkbox()"><span></span>
+                                    </label>
+                                </th>
+                                <th>{:lang("ID")}</th>
+                                <th>{:lang("Bar Code")}</th>
+                                <th>{:lang('Name')}</th>
+                                <th>{:lang('Image')}</th>
+                                <th>{:lang('Category ID')}</th>
+                                <th>{:lang('Is Serve')}</th>
+                                <th>{:lang('Purchase Price')}</th>
+                                <th>{:lang('Selling Price')}</th>
+                                <th>{:lang('create_time')}</th>
+                                <th>{:lang('operation')}</th>
+                            </tr>
+                            </thead>
+                            <tbody>
+                            {volist name="list" id="item"}
+                            <tr>
+                                <td>
+                                    <label class="lyear-checkbox checkbox-primary">
+                                        <input class="checkbox_caviar" type="checkbox" name="ids[]" value="{$item.id}"><span></span>
+                                    </label>
+                                </td>
+                                <td>{$item.id}</td>
+                                <td>{$item.bar_code}</td>
+                                <td>{$item.name}</td>
+                                <td><img class="small-img" src="{$item.image}" onclick="image_magnify()" ></td>
+                                <td>{$item.category_id}</td>
+                                <td>{$item.is_serve}</td>
+                                <td>{$item.purchase_price}</td>
+                                <td>{$item.selling_price}</td>
+                                <td>{$item.create_time}</td>
+                                <td>
+                                    <div class="btn-group">
+                                        <a class="btn btn-xs btn-default" href="#!" title="{:lang('select')}" data-toggle="tooltip" onclick='view("/admin/product/edit?id={$item.id}")'><i class="mdi mdi-eye"></i></a>
+                                        <a class="btn btn-xs btn-default" href="#!" title="{:lang('delete')}" data-toggle="tooltip" onclick='
+                                           deletingASingle("{:url(\"admin/product/delete\")}","{$item.id}",["{:lang(\"Succeed\")}"],"{:lang(\"Warn\")}","{:lang(\"Are you sure you want to delete the selected data\")}",["{:lang(\"Confirm\")}"])'
+                                        ><i class="mdi mdi-window-close"></i></a>
+                                    </div>
+                                </td>
+                            </tr>
+                            {/volist}
+                            </tbody>
+                        </table>
+                    </div>
+                    {$list|raw}
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<style>
+
+</style>
+
+<script type="text/javascript">
+    if(check_params(["{$params.bar_code}","{$params.category_id}", "{$params.is_serve}"]))
+        $('#select_card_caviar').css('display','block');
+</script>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 89 - 0
app/admin/view/product_category/add.html

@@ -0,0 +1,89 @@
+{include file='common/_js_css'}
+
+<div class="lyear-layout-web">
+    <div class="lyear-layout-container">
+        <!--页面主要内容-->
+        <main>
+            <div class="container-fluid">
+                <div class="row">
+                    <div class="col-lg-12">
+                        <div class="card">
+                            <div class="card-body">
+                                <form class="layui-form" action="">
+
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label">{:lang("Name")}</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="name" lay-verify="required" lay-reqtext="{:lang('Please fill in')}" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label">{:lang('Category')}</label>
+                                        <div class="layui-input-block">
+                                            <select name="pid" lay-filter="required">
+                                                <option value="0" selected>顶级</option>
+                                                {volist name="all_category" id='item'}
+                                                <option value="{$item.id}">{$item.name}</option>
+                                                {volist name='$item.children' id='tree_vo'}
+                                                <option value="{$tree_vo.id}">&nbsp;&nbsp;| --&nbsp;{$tree_vo.name}</option>
+                                                {volist name='$tree_vo.children' id='tree_one_vo'}
+                                                <option value="{$tree_one_vo.id}" disabled>&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;{$tree_one_vo.name}</option>
+                                                {/volist}
+                                                {/volist}
+                                                {/volist}
+                                            </select>
+                                        </div>
+                                    </div>
+                                    <div class="layui-form-item">
+                                        <div class="layui-input-block">
+                                            <button type="submit" class="layui-btn" lay-submit="" lay-filter="caviar_submit_btn">{:lang('Submit')}</button>
+                                            <button type="reset" class="layui-btn layui-btn-primary">{:lang("Reset")}</button>
+                                        </div>
+                                    </div>
+                                </form>
+
+                            </div>
+                        </div>
+                    </div>
+
+                </div>
+
+            </div>
+        </main>
+        <!--End 页面主要内容-->
+    </div>
+</div>
+<script>
+
+
+
+    layui.use(['laydate','form'], () => {
+        const laydate = layui.laydate;
+        const form = layui.form;
+
+        form.on('submit(caviar_submit_btn)', (data) =>{
+            console.log(data)
+            const response = request('{:url("admin/product_category/add")}',data.field)
+            response.then((res) => {
+                res.code === 200 ? layer.msg("{:lang('Succeed')}", {icon: 1,time:500},() => {
+                    //当你在iframe页面关闭自身时
+                    var index = parent.layer.getFrameIndex(window.name); //先得到当前iframe层的索引
+                    // Promise.all()
+                    // parent.layer.close(index); //再执行关闭
+                    parent.location.reload();
+                }) : layer.msg(res.message,{icon: 5})
+            })
+            return false;
+        });
+
+
+        laydate.render({
+            elem: '#sun_calendar',
+            type: 'datetime'
+        });
+        laydate.render({
+            elem: '#lunar_calendar',
+            type: 'datetime'
+        });
+    });
+</script>

+ 90 - 0
app/admin/view/product_category/edit.html

@@ -0,0 +1,90 @@
+{include file='common/_js_css'}
+
+<div class="lyear-layout-web">
+    <div class="lyear-layout-container">
+        <!--页面主要内容-->
+        <main>
+            <div class="container-fluid">
+                <div class="row">
+                    <div class="col-lg-12">
+                        <div class="card">
+                            <div class="card-body">
+                                <form class="layui-form" action="">
+
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label">{:lang("ID")}</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="id" value="{$category.id}" disabled class="layui-input">
+                                        </div>
+                                    </div>
+
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label">{:lang("Name")}</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="name" lay-verify="required" value="{$category.name}" lay-reqtext="{:lang('Please fill in')}" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label">{:lang('Category')}</label>
+                                        <div class="layui-input-block">
+                                            <select name="pid" lay-filter="required">
+                                                <option value="0" selected>顶级</option>
+                                                {volist name="all_category" id='item'}
+                                                <option value="{$item.id}" {if $category.pid == $item.id} selected {/if} >{$item.name}</option>
+                                                {volist name='$item.children' id='tree_vo'}
+                                                <option value="{$tree_vo.id}" {if $category.pid == $tree_vo.id} selected {/if} >&nbsp;&nbsp;| --&nbsp;{$tree_vo.name}</option>
+                                                {volist name='$tree_vo.children' id='tree_one_vo'}
+                                                <option value="{$tree_one_vo.id}" disabled>&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;{$tree_one_vo.name}</option>
+                                                {/volist}
+                                                {/volist}
+                                                {/volist}
+                                            </select>
+                                        </div>
+                                    </div>
+                                    <div class="layui-form-item">
+                                        <div class="layui-input-block">
+                                            <button type="submit" class="layui-btn" lay-submit="" lay-filter="caviar_submit_btn">{:lang('Submit')}</button>
+                                            <button type="reset" class="layui-btn layui-btn-primary">{:lang("Reset")}</button>
+                                        </div>
+                                    </div>
+                                </form>
+
+                            </div>
+                        </div>
+                    </div>
+
+                </div>
+
+            </div>
+        </main>
+        <!--End 页面主要内容-->
+    </div>
+</div>
+<script>
+    //当你在iframe页面关闭自身时
+
+    layui.use(['laydate','form'], () => {
+        const laydate = layui.laydate;
+        const form = layui.form;
+
+        form.on('submit(caviar_submit_btn)', (data) =>{
+            const response = request('{:url("admin/product_category/edit")}',data.field)
+            response.then((res) => {
+                res.code === 200 ? layer.msg("{:lang('Succeed')}", {icon: 1,time:500},() => {
+                    parent.location.reload();
+                }) : layer.msg(res.message,{icon: 5})
+            })
+            return false;
+        });
+
+
+        laydate.render({
+            elem: '#sun_calendar',
+            type: 'datetime'
+        });
+        laydate.render({
+            elem: '#lunar_calendar',
+            type: 'datetime'
+        });
+    });
+</script>

+ 131 - 0
app/admin/view/product_category/index.html

@@ -0,0 +1,131 @@
+{include file='common/_js_css'}
+<link href="__CSS__/common.css" rel="stylesheet">
+<div class="container-fluid">
+    <div class="row">
+        <div class="col-lg-12">
+            <div class="card">
+                <div class="card-toolbar clearfix">
+                    <div class="toolbar-btn-action">
+                        <a class="btn btn-primary m-r-5" href="#!" onclick="add('{:url(\'admin/product_category/add\')}','{:lang(\'Add\')}')"><i class="mdi mdi-plus"></i> {:lang('add')}</a>
+                    </div>
+                </div>
+                <div class="card-body">
+                    <form action="#" method="post">
+                        <div class="table-responsive">
+                            <table class="table table-striped">
+                                <thead>
+                                </thead>
+                                <tbody>
+
+                                {volist name="tree" id="item"}
+                                <tr>
+                                    <td>
+                                        <label class="lyear-checkbox checkbox-primary">
+                                            <input name="ids[]" type="checkbox" class="checkbox-parent" dataid="id-{$item.id}" value="{$item.id}">
+                                            <span>{$item.name}</span>
+                                            <span>
+                                                <a class="btn btn-xs btn-default" href="#!" title="{:lang('select')}" data-toggle="tooltip" onclick='view("/admin/product_category/edit?id={$item.id}")'><i class="mdi mdi-eye"></i></a>
+                                                <a class="btn btn-xs btn-default" href="#!" title="{:lang('delete')}" data-toggle="tooltip" onclick='
+                                       deletingASingle("{:url(\"admin/product_category/delete\")}","{$item.id}",["{:lang(\"Succeed\")}"],"{:lang(\"Warn\")}","{:lang(\"Are you sure you want to delete the selected data\")}",["{:lang(\"Confirm\")}"])'
+                                                ><i class="mdi mdi-window-close"></i></a>
+                                            </span>
+                                        </label>
+                                    </td>
+                                </tr>
+                                {volist name="$item.children", id="second"}
+                                <tr>
+                                    <td class="p-l-20">
+                                        <label class="lyear-checkbox checkbox-primary">
+                                            <input name="rules[]" type="checkbox" class="checkbox-parent" dataid="id-{$item.id}-{$second.id}" value="{$second.id}">
+                                            <span> {$second.name}</span>
+                                            <span>
+                                                <a class="btn btn-xs btn-default" href="#!" title="{:lang('select')}" data-toggle="tooltip" onclick='view("/admin/product_category/edit?id={$second.id}")'><i class="mdi mdi-eye"></i></a>
+                                                <a class="btn btn-xs btn-default" href="#!" title="{:lang('delete')}" data-toggle="tooltip" onclick='
+                                       deletingASingle("{:url(\"admin/product_category/delete\")}","{$second.id}",["{:lang(\"Succeed\")}"],"{:lang(\"Warn\")}","{:lang(\"Are you sure you want to delete the selected data\")}",["{:lang(\"Confirm\")}"])'
+                                                ><i class="mdi mdi-window-close"></i></a>
+                                            </span>
+                                        </label>
+                                    </td>
+                                </tr>
+                                {volist name="$second.children", id="thirdly"}
+                                <tr>
+                                    <td class="p-l-40">
+                                        <label class="lyear-checkbox checkbox-primary">
+                                            <input name="rules[]" type="checkbox" class="checkbox-parent" dataid="id-{$item.id}-{$second.id}-{$thirdly.id}" value="{$thirdly.id}">
+                                            <span> {$thirdly.name}</span>
+                                            <span>
+                                                <a class="btn btn-xs btn-default" href="#!" title="{:lang('select')}" data-toggle="tooltip" onclick='view("/admin/product_category/edit?id={$thirdly.id}")'><i class="mdi mdi-eye"></i></a>
+                                                <a class="btn btn-xs btn-default" href="#!" title="{:lang('delete')}" data-toggle="tooltip" onclick='
+                                       deletingASingle("{:url(\"admin/product_category/delete\")}","{$thirdly.id}",["{:lang(\"Succeed\")}"],"{:lang(\"Warn\")}","{:lang(\"Are you sure you want to delete the selected data\")}",["{:lang(\"Confirm\")}"])'
+                                                ><i class="mdi mdi-window-close"></i></a>
+                                        </span>
+                                        </label>
+                                    </td>
+                                </tr>
+                                {/volist}
+                                {/volist}
+                                {/volist}
+                                </tbody>
+                            </table>
+                        </div>
+                    </form>
+
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+
+<script type="text/javascript">
+    $(function(){
+        //动态选择框,上下级选中状态变化
+        $('input.checkbox-parent').on('change', function(){
+            var dataid = $(this).attr("dataid");
+            $('input[dataid^=' + dataid + '-]').prop('checked', $(this).is(':checked'));
+        });
+        $('input.checkbox-child').on('change', function(){
+            var dataid = $(this).attr("dataid");
+            dataid = dataid.substring(0, dataid.lastIndexOf("-"));
+            var parent = $('input[dataid=' + dataid + ']');
+            if($(this).is(':checked')){
+                parent.prop('checked', true);
+                //循环到顶级
+                while(dataid.lastIndexOf("-") != 2){
+                    dataid = dataid.substring(0, dataid.lastIndexOf("-"));
+                    parent = $('input[dataid=' + dataid + ']');
+                    parent.prop('checked', true);
+                }
+            }else{
+                //父级
+                if($('input[dataid^=' + dataid + '-]:checked').length == 0){
+                    parent.prop('checked', false);
+                    //循环到顶级
+                    while(dataid.lastIndexOf("-") != 2){
+                        dataid = dataid.substring(0, dataid.lastIndexOf("-"));
+                        parent = $('input[dataid=' + dataid + ']');
+                        if($('input[dataid^=' + dataid + '-]:checked').length == 0){
+                            parent.prop('checked', false);
+                        }
+                    }
+                }
+            }
+        });
+    });
+</script>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 1 - 2
app/common.php

@@ -20,8 +20,7 @@ function predicate(bool $bool, $message, $code = 1012) {
  * @return null
  */
 function format_string($value, $def = null) {
-    if(!isset($value) || $value == null || $value == "") return $def;
-    return $value;
+    return $value != null && strlen(strval($value)) > 0 ? $value : $def;
 }
 
 /**

+ 13 - 6
app/common/model/BaseModel.php

@@ -22,12 +22,12 @@ abstract class BaseModel extends Model
 
     public function getCreateTimeAttr($v) {
         if(!$v)return $v;
-        return date("Y-m-d H:i:s", $v);
+        return date("Y-m-d H", $v);
     }
 
     public function getUpdateTimeAttr($v) {
         if(!$v)return $v;
-        return date("Y-m-d H:i:s", $v);
+        return date("Y-m-d H", $v);
     }
 
 
@@ -35,11 +35,18 @@ abstract class BaseModel extends Model
         return $this->whereIn('id',$ids)->update(['is_delete' => 1]);
     }
 
+    /**
+     * @param $id
+     * @return BaseModel|array|mixed|Model|null
+     * @throws \think\db\exception\DataNotFoundException
+     * @throws \think\db\exception\DbException
+     * @throws \think\db\exception\ModelNotFoundException
+     */
     public function findById($id) {
-        return $this->find([
-            ['id',$id],
-            ['is_delete', 0],
-        ]);
+        return $this->where([
+            ['id','=',$id],
+            ['is_delete','=', 0]
+        ])->find();
     }
 
 

+ 19 - 13
app/common/model/CustomerModel.php

@@ -9,12 +9,15 @@ class CustomerModel extends BaseModel
 
     protected $table = 'erp_customer';
 
-    public function getSexAttr($value) {
-        return ['', '男', '女', '未知'][$value];
-    }
+//    public function getSexAttr($value) {
+//        return ['', '男', '女', '未知'][$value];
+//    }
 
     public function doesItExist($mobile) {
-        $customer = $this->where("mobile", $mobile)->find();
+        $customer = $this->where([
+            ["mobile", '=',$mobile],
+            ["is_delete", '=', 0],
+        ])->find();
         return $customer ? true : false;
     }
 
@@ -47,17 +50,20 @@ class CustomerModel extends BaseModel
      * @return \think\Paginator
      * @throws \think\db\exception\DbException
      */
-    public function findCustomerPage(array $params) {
+    public function findByPaginate(array $params) {
         $where = [
-            'is_delete' => 0
+            ['is_delete', '=', 0]
         ];
-        if(isset($params['name'])) {
-            array_push($where,['name', 'like', "%".$params['name']."%"]);
-        }
-        if(count($where) > 0) {
-            return $this->where($where)->order('create_time','desc')->paginate(['list_rows'=>10, "query" => $params]);
-        }
-        return $this->order('create_time','desc')->paginate(['list_rows'=>10, "query" => $params]);
+        if(isset($params['name_zh']))
+            array_push($where,['name_zh', 'like', "%".$params['name_zh']."%"]);
+
+        if(isset($params['name_en']))
+            array_push($where,['name_en', 'like', "%".$params['name_en']."%"]);
+        if(isset($params['mobile']))
+            array_push($where,['mobile', 'like', "%".$params['mobile']."%"]);
+
+        return $this->where($where)->order('create_time','desc')->paginate(['list_rows'=>10, "query" => $params]);
+
     }
 
 

+ 50 - 0
app/common/model/ProductCategoryModel.php

@@ -0,0 +1,50 @@
+<?php
+
+
+namespace app\common\model;
+
+
+class ProductCategoryModel extends BaseModel
+{
+
+    protected $table = 'erp_product_category';
+
+    protected function genSchema(array $schema)
+    {
+        // TODO: Implement genSchema() method.
+    }
+
+    public function findAll() {
+        return $this->where('is_delete', 0)->select();
+    }
+
+    public function doesItExist($name) {
+        $customer = $this->where([
+            ["name", '=',$name],
+            ["is_delete", '=', 0]
+        ])->find();
+        return $customer ? true : false;
+    }
+
+
+
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 36 - 0
app/common/model/ProductModel.php

@@ -0,0 +1,36 @@
+<?php
+
+
+namespace app\common\model;
+
+
+class ProductModel extends BaseModel
+{
+    protected $table = 'erp_product';
+
+    protected function genSchema(array $schema)
+    {
+        // TODO: Implement genSchema() method.
+    }
+
+    /**
+     * @param array $params
+     * @return \think\Paginator
+     * @throws \think\db\exception\DbException
+     */
+    public function findByPaginate(array $params) {
+        $where = [
+            ['is_delete', '=', 0]
+        ];
+        if($params['bar_code'] != null)
+            array_push($where,['bar_code', 'like', "%".$params['bar_code']."%"]);
+        if($params['category_id'] != null)
+            array_push($where,['category_id', '=', $params['category_id']]);
+        if($params['is_serve'] != null)
+            array_push($where,['is_serve', '=', $params['is_serve']]);
+
+        return $this->where($where)->order('create_time','desc')->paginate(['list_rows'=>10, "query" => $params]);
+    }
+
+
+}

+ 16 - 0
app/common/model/UserModel.php

@@ -0,0 +1,16 @@
+<?php
+
+
+namespace app\common\model;
+
+
+class UserModel extends BaseModel
+{
+    protected $table = 'erp_user';
+
+    protected function genSchema(array $schema)
+    {
+        // TODO: Implement genSchema() method.
+    }
+
+}

+ 6 - 1
public/static/css/common.css

@@ -28,4 +28,9 @@
     .form-search.form-horizontal .control-label {
         margin-bottom: 5px;
     }
-}
+}
+
+.small-img {
+    height: 50px;
+    width: 80px;
+}

+ 104 - 17
public/static/js/common.js

@@ -1,3 +1,22 @@
+async function request($url, $data, $method = 'POST') {
+    return await new Promise((resolve, reject) => {
+        $.ajax({
+            type: $method,
+            url: $url,
+            data: $data,
+            success: (res) => {
+                // if(res.code === 1012) {
+                //     window.location = 'http://localhost:8001/admin/login'
+                // }
+                resolve(res)
+            },
+            error: (err) => {
+                reject(err.message)
+            }
+        })
+    })
+}
+
 // 搜索开关
 function select_card_switch() {
     const element = $('#select_card_caviar')
@@ -24,10 +43,63 @@ function checkbox() {
     })
 }
 
-function add(url = '', area = ['1000px', '600px']) {
+async function caviar_checkbox_delete(url,
+                                      hints = ['Check at least one box', 'Succeed'],
+                                      title= 'Warn',
+                                      content= 'Are you sure you want to delete the selected data?',
+                                      btn = ['Confirm'],
+                                      ) {
+    const ids = $('.checkbox_caviar:checkbox:checked').map((index,el) => {
+        return $(el).val();
+    }).get();
+    if(ids.length === 0) {
+        layer.msg(hints[0],{icon: 5})
+        return false;
+    }
+
+    layer.open({
+        title,
+        content,
+        btn,
+        yes: async (index, layero) => {
+            const response = await request(url, {ids: ids.join(',')});
+            response.code === 200 ? layer.msg(hints[1], {icon: 1,time:500},() => {
+                location.reload();
+            }) : layer.msg(res.message,{icon: 5})
+            layer.close(index);
+        }
+
+    });
+
+}
+
+function deletingASingle(url,
+                         id,
+                         hints = ['Succeed'],
+                         title= 'Warn',
+                         content= 'Are you sure you want to delete the selected data?',
+                         btn = ['Confirm']) {
+    layer.open({
+        title: title,
+        content: content,
+        btn: btn,
+        yes: async (index, layero) => {
+            const response = await request(url, { ids: id.toString()} );
+            response.code === 200 ? layer.msg(hints[0], {icon: 1,time:500},() => {
+                location.reload();
+            }) : layer.msg(res.message,{icon: 5})
+            layer.close(index);
+        }
+
+    });
+}
+
+function add(url = '', title = "Info", area = ['60%', '80%']) {
     layui.use('layer', function(){
         var layer = layui.layer;
         layer.open({
+            title: title,
+
             type: 2,
             content:url,
             area: area,
@@ -35,21 +107,36 @@ function add(url = '', area = ['1000px', '600px']) {
     });
 }
 
-async function request($url, $data, $method = 'POST') {
-    return await new Promise((resolve, reject) => {
-        $.ajax({
-            type: $method,
-            url: $url,
-            data: $data,
-            success: (res) => {
-                // if(res.code === 1012) {
-                //     window.location = 'http://localhost:8001/admin/login'
-                // }
-                resolve(res)
-            },
-            error: (err) => {
-                reject(err.message)
-            }
-        })
+function view(url = '', title = "Info", area = ['80%', '80%']) {
+    layui.use('layer', function(){
+        var layer = layui.layer;
+        layer.open({
+            title: title,
+            type: 2,
+            content:url,
+            area: area,
+        });
+    });
+}
+
+function image_magnify() {
+    let jishu=0;
+    $(document).on('click', '.small-img', function(data){
+        var ImgUrl=$(this).attr('src');
+        if(jishu===0) {
+            jishu=1;
+            layer.open({
+                type:1
+                ,title:false
+                ,closeBtn:0
+                ,skin:'layui-layer-nobg'
+                ,shadeClose:true
+                ,content:'<img style="width:100%;height:100%;" class="layui-upload-img" src="'+ ImgUrl+'"/>'
+                ,scrollbar:false
+            })
+        }else{
+            jishu=0;
+            layer.closeAll();
+        }
     })
 }