1557492053 3 years ago
parent
commit
20b6a7ffe7
57 changed files with 1401 additions and 87 deletions
  1. 94 8
      app/admin/controller/Product.php
  2. 117 0
      app/admin/controller/Stock.php
  3. 17 5
      app/admin/lang/zh-cn.php
  4. 8 0
      app/admin/view/common/_js_css.html
  5. 0 2
      app/admin/view/customer/edit.html
  6. 63 54
      app/admin/view/product/add.html
  7. 159 0
      app/admin/view/product/edit.html
  8. 11 10
      app/admin/view/product/index.html
  9. 137 0
      app/admin/view/stock/add.html
  10. 148 0
      app/admin/view/stock/index.html
  11. 0 4
      app/common/model/BaseModel.php
  12. 1 1
      app/common/model/ProductCategoryModel.php
  13. 20 3
      app/common/model/ProductModel.php
  14. 67 0
      app/common/model/StoreProductModel.php
  15. 1 0
      public/static/css/layui/layui.css
  16. 1 0
      public/static/css/layui/modules/code.css
  17. 1 0
      public/static/css/layui/modules/laydate/default/laydate.css
  18. BIN
      public/static/css/layui/modules/layer/default/icon-ext.png
  19. BIN
      public/static/css/layui/modules/layer/default/icon.png
  20. 1 0
      public/static/css/layui/modules/layer/default/layer.css
  21. BIN
      public/static/css/layui/modules/layer/default/loading-0.gif
  22. BIN
      public/static/css/layui/modules/layer/default/loading-1.gif
  23. BIN
      public/static/css/layui/modules/layer/default/loading-2.gif
  24. BIN
      public/static/fonts/iconfont.eot
  25. 554 0
      public/static/fonts/iconfont.svg
  26. BIN
      public/static/fonts/iconfont.ttf
  27. BIN
      public/static/fonts/iconfont.woff
  28. BIN
      public/static/fonts/iconfont.woff2
  29. 1 0
      public/static/js/layui/layui.js
  30. BIN
      public/storage/product/20221212/1433bf125d23a87fef582876243650d2.jpg
  31. BIN
      public/storage/product/20221212/209a7b22b3df380ca5726e9a5084b825.jpg
  32. BIN
      public/storage/product/20221212/2973fec39f5d248ab6e275c694a7e200.jpg
  33. BIN
      public/storage/product/20221212/2f7823a4d83dcaa76659b9925a8232d4.jpg
  34. BIN
      public/storage/product/20221212/41102eb205daf1e0e5141acb58ea79eb.jpg
  35. BIN
      public/storage/product/20221212/4659ba3b989a96413ae083d2c89260d1.jpg
  36. BIN
      public/storage/product/20221212/476e7e5df2871cc2c0ca7a532c02e360.jpg
  37. BIN
      public/storage/product/20221212/479261101c03b33f53c15c48f0bee5d2.jpg
  38. BIN
      public/storage/product/20221212/53720f4e5365bb485bcd3c4667b829bc.jpg
  39. BIN
      public/storage/product/20221212/57b57fa38d2bba00a6890d3efa3d29ff.jpg
  40. BIN
      public/storage/product/20221212/59303b361cf7c3e9b8b9fc2feddc5da5.jpg
  41. BIN
      public/storage/product/20221212/5bef0bfd8a38fb859d40360da6b2eb8c.jpg
  42. BIN
      public/storage/product/20221212/5f333e3e282d1830dd12944eec654f8b.jpg
  43. BIN
      public/storage/product/20221212/868acad2bd58b50b6cdee6d7328c13e6.jpg
  44. BIN
      public/storage/product/20221212/8bb76a6be9170a64f5da3adc3b6c06d7.jpg
  45. BIN
      public/storage/product/20221212/91d84a02ebed9fd7a9812f117645ece3.jpg
  46. BIN
      public/storage/product/20221212/99e753ccc50771a0b6214ff9bb1f7f4c.jpg
  47. BIN
      public/storage/product/20221212/9a7d1dc4b5576f94b2a239954da37bfe.jpg
  48. BIN
      public/storage/product/20221212/a373a5f55195eea4010aff2cd203a5dc.jpg
  49. BIN
      public/storage/product/20221212/bc29bd00a0c3fa7c7fdb23008be9087d.jpg
  50. BIN
      public/storage/product/20221212/bc6273bb0fb9ff69404cef744a292a32.jpg
  51. BIN
      public/storage/product/20221212/c15c51866ae3b69dc2077ae4e372297b.jpg
  52. BIN
      public/storage/product/20221212/cc2f0803f3412f8746d291e590142685.jpg
  53. BIN
      public/storage/product/20221212/cfe3b252201283f30579ccba0a8c7a81.jpg
  54. BIN
      public/storage/product/20221212/e216cdff1173320f982eaf5aca33969a.jpg
  55. BIN
      public/storage/product/20221212/eb068fd6f446c5a2b2c8a6c584b266cc.jpg
  56. BIN
      public/storage/product/20221212/ecf1113a308229ad4d89c678124b1eed.jpg
  57. BIN
      public/storage/product/20221212/efa70d9df3e76ca6d51ceb49a163dc72.jpg

+ 94 - 8
app/admin/controller/Product.php

@@ -32,8 +32,8 @@ class Product extends BaseController
         $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),
+            'category_id' => format_string($params['category_id'] ?? null) != null ? (int)$params['category_id']: null,
+            'is_serve' => format_string($params['is_serve'] ?? null) != null ? (int)$params['is_serve']: null,
         ];
         View::assign([
             'list' => $this->productModel->findByPaginate($format_params),
@@ -43,15 +43,58 @@ class Product extends BaseController
         return view();
     }
 
-
     public function add(Request $request) {
-
+        $params = $request->param();
+        if($request->isAjax()) {
+            $isExist = $this->productModel->doesItExist($params['bar_code']);
+            if ($isExist)
+                return $this->fail('Fail to add. Data duplication');
+            $category = $this->categoryModel->findById($params['category_id']);
+            if(!$category)
+                return $this->fail(lang('Category does not exist'));
+            $res = $this->productModel->save([
+                'bar_code'  =>  $params['bar_code'],
+                'name'      =>  $params['name'] ?? null,
+                'image'     =>  $params['image'] ?? null,
+                'category_id'   =>  $params['category_id'] ?? null,
+                'category_name' =>  $category->name,
+                'is_serve'      =>  $params['is_serve'],
+                'purchase_price'=>  $params['purchase_price'],
+                'selling_price' =>  $params['selling_price']
+            ]);
+            return $this->ok($res);
+        }
+        View::assign([
+            'all_category' => recursion($this->categoryModel->findAll(),0),
+        ]);
         return view();
     }
 
-
     public function edit(Request $request) {
-
+        $params = $request->param();
+        if(!isset($params['id']))
+            return $this->fail(lang('ID not exist'));
+        $product = $this->productModel->findById($params['id']);
+        if($request->isAjax()) {
+            $category = $this->categoryModel->findById($params['category_id']);
+            if(!$category)
+                return $this->fail(lang('Category does not exist'));
+            $res = $this->productModel->where('id',$params['id'])->update([
+                'bar_code'  =>  $params['bar_code'],
+                'name'      =>  $params['name'] ?? null,
+                'image'     =>  $params['image'] ?? null,
+                'category_id'   =>  $params['category_id'] ?? null,
+                'category_name' =>  $category->name,
+                'is_serve'      =>  (int)$params['is_serve'],
+                'purchase_price'=>  $params['purchase_price'],
+                'selling_price' =>  $params['selling_price']
+            ]);
+            return $this->ok($res);
+        }
+        View::assign([
+            'product'   =>  $product,
+            'all_category' => recursion($this->categoryModel->findAll(),0),
+        ]);
         return view();
     }
 
@@ -60,9 +103,52 @@ class Product extends BaseController
         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();
+        return $this->ok(true);
     }
 
+    /**
+     * @return \think\response\Json
+     */
+     public function upload() {
+         // 获取表单上传文件 例如上传了001.jpg
+         $file = request()->file('file');
+         // 上传到本地服务器
+         $save_name = \think\facade\Filesystem::disk('public')->putFile( 'product', $file);
+         return $this->ok(str_replace('\\',"/",'/storage/'.$save_name));
+     }
+
+     public function findProducts(Request $request) {
+        $params = $request->param();
+        if(!isset($params['text']))
+            return $this->fail(lang('Data not exist'));
+        $products = $this->productModel->findProducts($params['text']);
+        return $this->ok($products);
+     }
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
 
 
-}

+ 117 - 0
app/admin/controller/Stock.php

@@ -0,0 +1,117 @@
+<?php
+
+
+namespace app\admin\controller;
+
+use app\BaseController;
+use app\common\model\ProductModel;
+use app\common\model\StoreModel;
+use app\common\model\StoreProductModel;
+use think\App;
+use think\facade\View;
+use think\Request;
+
+class Stock extends BaseController
+{
+    private $storeModel;
+    private $storeProductModel;
+    private $productModel;
+
+    public function __construct(App $app)
+    {
+        parent::__construct($app);
+        $this->storeModel = new StoreModel();
+        $this->storeProductModel = new StoreProductModel();
+        $this->productModel = new ProductModel();
+    }
+
+    /**
+     * @param Request $request
+     * @return \think\response\View
+     * @throws \think\db\exception\DbException
+     */
+    public function index(Request $request) {
+        $params = $request->param();
+        $format_params = [
+            'store_id' => format_string($params['store_id'] ?? null),
+            'sort'      => format_string($params['sort'] ?? null)
+        ];
+        $list = $this->storeProductModel->findByPaginate($format_params);
+        View::assign([
+            'list' => $list,
+            'params' => $format_params,
+            'stores' => $this->storeModel->findAllStore(),
+        ]);
+        return view();
+    }
+
+    public function add(Request $request) {
+        $params = $request->param();
+        $store_id = format_string($params['store_id'] ?? null);
+        if($request->isAjax()) {
+            $store = $this->storeModel->findById($store_id);
+            $product = $this->productModel->findById(format_string($params['product_id'] ?? null));
+            if (!$store || !$product)
+                return $this->fail(lang('Store|Product does not exist'));
+
+            $relation = $this->storeProductModel->doesItExist($store->id,$product->id);
+            if($relation)
+                return $this->fail(lang('Fail to add. Data duplication'));
+
+            $res = $this->storeProductModel->save([
+                'store_id'  =>  $store->id,
+                'product_id'      =>  $product->id,
+                'product_bar_code'     => $product->bar_code,
+                'product_name'   => $product->name,
+                'now_stock' =>  $params['now_stock'],
+            ]);
+            return $this->ok($res);
+        }
+        View::assign([
+            'store_id' => $store_id,
+            'stores' =>  $this->storeModel->findAllStore(),
+            'products' => $this->productModel->findProducts()
+        ]);
+        return view();
+    }
+
+    public function edit(Request $request) {
+        $params = $request->param();
+//        if(!isset($params['id']))
+//            return $this->fail(lang('ID not exist'));
+//        $product = $this->productModel->findById($params['id']);
+//        if($request->isAjax()) {
+//            $category = $this->categoryModel->findById($params['category_id']);
+//            if(!$category)
+//                return $this->fail(lang('Category does not exist'));
+//            $res = $this->productModel->where('id',$params['id'])->update([
+//                'bar_code'  =>  $params['bar_code'],
+//                'name'      =>  $params['name'] ?? null,
+//                'image'     =>  $params['image'] ?? null,
+//                'category_id'   =>  $params['category_id'] ?? null,
+//                'category_name' =>  $category->name,
+//                'is_serve'      =>  (int)$params['is_serve'],
+//                'purchase_price'=>  $params['purchase_price'],
+//                'selling_price' =>  $params['selling_price']
+//            ]);
+//            return $this->ok($res);
+//        }
+//        View::assign([
+//            'product'   =>  $product,
+//            'all_category' => recursion($this->categoryModel->findAll(),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->storeProductModel->deleteByIds(explode(',',$params['ids']));
+        return $this->ok(true);
+    }
+
+    public function  test() {
+        return view();
+    }
+}

+ 17 - 5
app/admin/lang/zh-cn.php

@@ -25,7 +25,8 @@ return [
     'collection_channel_management'    => '收款渠道管理',
     'yu_long_bi_management'    => '御龙币管理',
 
-
+    'Yes'   => '是',
+    'No'    => '否',
     'add'       => '新增',
     'delete'    => '删除',
     'edit'      => '编辑',
@@ -41,21 +42,29 @@ return [
     'Update'    =>  '更新',
     'Base'      =>  '基础',
     'Info'      =>  '信息',
+    'Rest'      =>  '其他',
+    'Sort'      =>  '排序',
     '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不存在!',
+    'Data not exist' => '数据不存在!',
     'Are you sure you want to delete the selected data' => '您确定要删除选中的数据吗',
     "The customer doesn t exist" => "客户不存在",
     'The employees dont exist'  => "员工不存在",
-
+    'Category does not exist'   =>  '类别不存在',
+    'Please upload pictures.'   =>  '请上传图片',
+    'Please fill in' => '请填写',
+    'Store|Product does not exist' => '门店|商品不存在!',
 
     'Order'     =>  '订单',
     'Order Data'=>  '订单数据',
+    'Stock' =>  '库存',
+    'Now stock' =>  '当前库存',
+    'Sale stock' =>  '卖出数量',
 
 
 
@@ -91,9 +100,12 @@ return [
     'Bar Code'  => '商品条码',
     'Image'  => '图片',
     'Category ID'   =>  '商品类别ID',
-    'Is Serve'  =>  '是否是服务',
+    'Category Name' =>  '商品类别',
+    'Is Serve'  =>  '商品/服务',
     'Purchase Price'    =>  '进价',
     'Selling Price'    =>  '卖价',
-
+    'Now Total Stock'   => '当前总库存',
+    'Product'       =>  '商品',
+    'Serve'         =>  '服务',
 
 ];

+ 8 - 0
app/admin/view/common/_js_css.html

@@ -7,8 +7,16 @@
 <!--<script type="text/javascript" src="__JS__/main.min.js"></script>-->
 
 <!-- 引入 layui.css -->
+<!--<link href="__CSS__/layui/layui.css" rel="stylesheet">-->
+<!--&lt;!&ndash; 引入 layui.js &ndash;&gt;-->
+<!--<script src="__JS__/layui/layui.js"></script>-->
+
+<!-- 引入 layui.css -->
 <link href="//unpkg.com/layui@2.7.6/dist/css/layui.css" rel="stylesheet">
+
 <!-- 引入 layui.js -->
 <script src="//unpkg.com/layui@2.7.6/dist/layui.js"></script>
+
+
 <!--引入请求类-->
 <script type="text/javascript" src="__JS__/common.js"></script>

+ 0 - 2
app/admin/view/customer/edit.html

@@ -2,7 +2,6 @@
 {include file='common/_js_css'}
 
 <div class="container-fluid p-t-15">
-
   <div class="row">
     <div class="col-lg-12">
       <div class="card">
@@ -130,7 +129,6 @@
     </div>
 
   </div>
-
 </div>
 <script>
   layui.use(['laydate','form'], () => {

+ 63 - 54
app/admin/view/product/add.html

@@ -9,88 +9,74 @@
           <div class="col-lg-12">
             <div class="card">
               <div class="card-body">
-                <form class="layui-form" action="">
+                <form class="layui-form">
 
                   <div class="layui-form-item">
-                    <label class="layui-form-label">{:lang("name_zh")}</label>
+                    <label class="layui-form-label">{:lang("Bar code")}</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">
+                      <input type="text" name="bar_code" 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>
+                    <label class="layui-form-label">{:lang("Name")}</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">
+                      <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("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>
+                    <label class="layui-form-label">{:lang("Image")}</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">
+                      <button type="button" class="layui-btn" id="upload_img">
+                        <i class="layui-icon">&#xe67c;</i>{:lang("Upload")}
+                      </button>
+                      <input class="image_input" name="image" lay-verify="required" lay-reqtext="{:lang('Please upload pictures.')}" autocomplete="off" class="layui-input" hidden>
+                      <img class="img_view" style="height: 200px;width: 250px" hidden>
                     </div>
                   </div>
 
                   <div class="layui-form-item">
-                    <label class="layui-form-label">{:lang("follow_user_id")}</label>
+                    <label class="layui-form-label">{:lang("Is Serve")}</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>
+                      <input type="radio" name="is_serve" value="0" title="{:lang('Product')}" checked="">
+                      <div class="layui-unselect layui-form-radio layui-form-radioed">
+                        <i class="layui-anim layui-icon"></i>
+                      </div>
+                      <input type="radio" name="is_serve" value="1" title={:lang('Serve')}>
+                      <div class="layui-unselect layui-form-radio">
+                        <i class="layui-anim layui-icon"></i>
+                      </div>
+                      </div>
                   </div>
 
                   <div class="layui-form-item">
-                    <label class="layui-form-label">{:lang("linkman")}</label>
+                    <label class="layui-form-label">{:lang('Category')}</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">
+                      <select name="category_id" lay-filter="required">
+                        {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}">&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;{$tree_one_vo.name}</option>
+                        {/volist}
+                        {/volist}
+                        {/volist}
+                      </select>
                     </div>
                   </div>
 
                   <div class="layui-form-item">
-                    <label class="layui-form-label">{:lang("relation")}</label>
+                    <label class="layui-form-label">{:lang("Purchase price")}</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">
+                      <input type="number" name="purchase_price" 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>
+                    <label class="layui-form-label">{:lang("Selling price")}</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>
+                      <input type="number" name="selling_price" lay-verify="required" lay-reqtext="{:lang('Please fill in')}" autocomplete="off" class="layui-input">
                     </div>
                   </div>
 
@@ -114,19 +100,42 @@
   </div>
 </div>
 <script>
+
   //当你在iframe页面关闭自身时
   // var index = parent.layer.getFrameIndex(window.name); //先得到当前iframe层的索引
   // parent.layer.close(index); //再执行关闭
-
-  layui.use(['laydate','form'], () => {
+  layui.use(['laydate','form','upload'], () => {
     const laydate = layui.laydate;
     const form = layui.form;
 
+    const upload = layui.upload;
+
+    //执行实例
+    upload.render({
+      elem: '#upload_img' //绑定元素
+      ,url: '/admin/product/upload'
+      ,done: function(res){
+        console.log(res);
+        if(res.code === 200) {
+          $(".image_input").attr("value", res.data);
+          $(".img_view").attr('src', res.data)
+          $('.img_view').css('display','block');
+        } else {
+          layer.message(res.message, {icon: 5});
+        }
+        return false;
+      }
+      ,error: function(){
+        //请求异常回调
+      }
+    });
+
     form.on('submit(caviar_submit_btn)', (data) =>{
       const response = request('/admin/product/add',data.field)
       response.then((res) => {
+        console.log(res);
           res.code === 200 ? layer.msg("{:lang('Succeed')}", {icon: 1,time:500},() => {
-            location.reload();
+            parent.location.reload();
           }) : layer.msg(res.message,{icon: 5})
       })
       return false;

+ 159 - 0
app/admin/view/product/edit.html

@@ -0,0 +1,159 @@
+{include file='common/_js_css'}
+
+<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/product/edit')}?id={$product.id}">{:lang("Base")}</a> </li>
+          <li> <a href="#">{:lang("Rest")}</a> </li>
+          <div class="tab-content">
+            <div class="tab-pane active">
+              <form class="layui-form">
+                  <input name="id" value="{$product.id}" hidden>
+                  <div class="layui-form-item">
+                    <label class="layui-form-label">{:lang("Bar code")}</label>
+                    <div class="layui-input-block">
+                      <input type="text" name="bar_code" value="{$product.bar_code}" 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")}</label>
+                    <div class="layui-input-block">
+                      <input type="text" name="name" value="{$product.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("Image")}</label>
+                    <div class="layui-input-block">
+                      <button type="button" class="layui-btn" id="upload_img">
+                        <i class="layui-icon">&#xe67c;</i>{:lang("Upload")}
+                      </button>
+                      <div style="margin-top: 5px">
+                        <input class="image_input" name="image" value="{$product.image}" hidden>
+                        <img class="img_view" src={$product.image} style="height: 200px;width: 250px"  {if !:is_null($product.image)} hidden {/if}>
+                      </div>
+                    </div>
+                  </div>
+
+                  <div class="layui-form-item">
+                    <label class="layui-form-label">{:lang("Is Serve")}</label>
+                    <div class="layui-input-block">
+                      <input type="radio" name="is_serve" value="0" title="{:lang('Product')}" {if $product.is_serve == 0} checked {/if} >
+                      <div class="layui-unselect layui-form-radio layui-form-radioed">
+                        <i class="layui-anim layui-icon"></i>
+                      </div>
+                      <input type="radio" name="is_serve" value="1" title={:lang('Serve')} {if $product.is_serve == 1} checked {/if} >
+                      <div class="layui-unselect layui-form-radio">
+                        <i class="layui-anim layui-icon"></i>
+                      </div>
+                    </div>
+                  </div>
+
+                  <div class="layui-form-item">
+                    <label class="layui-form-label">{:lang('Category')}</label>
+                    <div class="layui-input-block">
+                      <select name="category_id" lay-filter="required">
+                        {volist name="all_category" id='item'}
+                        <option value="{$item.id}" {if $product.category_id == $item.id} selected {/if} >{$item.name}</option>
+                        {volist name='$item.children' id='tree_vo'}
+                        <option value="{$tree_vo.id}" {if $product.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 $product.category_id == tree_one_vo.id} selected {/if} >&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;{$tree_one_vo.name}</option>
+                        {/volist}
+                        {/volist}
+                        {/volist}
+                      </select>
+                    </div>
+                  </div>
+
+                  <div class="layui-form-item">
+                    <label class="layui-form-label">{:lang("Purchase price")}</label>
+                    <div class="layui-input-block">
+                      <input type="number" name="purchase_price" value="{$product.purchase_price ?? 0}" 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("Selling price")}</label>
+                    <div class="layui-input-block">
+                      <input type="number" name="selling_price" value="{$product.selling_price ?? 0}" 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("Now total stock")}</label>
+                    <div class="layui-input-block">
+                      <input type="number" disabled value="{$product.now_total_stock ?? 0}" class="layui-input">
+                    </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>
+        </ul>
+      </div>
+    </div>
+  </div>
+</div>
+
+<script>
+
+  //当你在iframe页面关闭自身时
+  // var index = parent.layer.getFrameIndex(window.name); //先得到当前iframe层的索引
+  // parent.layer.close(index); //再执行关闭
+  layui.use(['laydate','form','upload'], () => {
+    const laydate = layui.laydate;
+    const form = layui.form;
+
+    const upload = layui.upload;
+
+    //执行实例
+    upload.render({
+      elem: '#upload_img' //绑定元素
+      ,url: '/admin/product/upload'
+      ,done: function(res){
+        console.log(res);
+        if(res.code === 200) {
+          $(".image_input").attr("value", res.data);
+          $(".img_view").attr('src', res.data)
+          $('.img_view').css('display','block');
+        } else {
+          layer.message(res.message, {icon: 5});
+        }
+        return false;
+      }
+      ,error: function(){
+        //请求异常回调
+      }
+    });
+
+    form.on('submit(caviar_submit_btn)', (data) =>{
+      console.log(data.field);
+      const response = request('/admin/product/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>

+ 11 - 10
app/admin/view/product/index.html

@@ -21,13 +21,13 @@
                                     <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>
+                                            <option value="0" selected>{: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>
+                                            <option value="{$tree_one_vo.id}" {if $params.category_id == $tree_one_vo.id} selected {/if}>&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;{$tree_one_vo.name}</option>
                                             {/volist}
                                             {/volist}
                                             {/volist}
@@ -39,11 +39,10 @@
                                 <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 class="form-control pull-left" name="is_serve">
+                                            <option value="" selected>{:lang("Unknown")}</option>
+                                            <option value="0" {if  $params.is_serve === 0} selected {/if} >{:lang("Product")}</option>
+                                            <option value="1" {if  $params.is_serve === 1} selected {/if} >{:lang("Serve")}</option>
                                         </select>
                                     </div>
                                 </div>
@@ -85,10 +84,11 @@
                                 <th>{:lang("Bar Code")}</th>
                                 <th>{:lang('Name')}</th>
                                 <th>{:lang('Image')}</th>
-                                <th>{:lang('Category ID')}</th>
+                                <th>{:lang('Category Name')}</th>
                                 <th>{:lang('Is Serve')}</th>
                                 <th>{:lang('Purchase Price')}</th>
                                 <th>{:lang('Selling Price')}</th>
+                                <th>{:lang('Now Total Stock')}</th>
                                 <th>{:lang('create_time')}</th>
                                 <th>{:lang('operation')}</th>
                             </tr>
@@ -105,10 +105,11 @@
                                 <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.category_name}</td>
+                                <td>{if $item.is_serve == 1}{:lang("Yes")}{else /}{:lang("No")}{/if}</td>
                                 <td>{$item.purchase_price}</td>
                                 <td>{$item.selling_price}</td>
+                                <td>{$item.now_total_stock}</td>
                                 <td>{$item.create_time}</td>
                                 <td>
                                     <div class="btn-group">

+ 137 - 0
app/admin/view/stock/add.html

@@ -0,0 +1,137 @@
+{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">
+
+                                    <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}" {if $store_id == $item.id} selected {/if} >{$item.name}</option>
+                                                {/volist}
+                                            </select>
+                                        </div>
+                                    </div>
+
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label">{:lang('Product')}</label>
+                                        <div class="layui-input-block unfold_product">
+                                            <input type="text" name="product_id" id="product_id" class="layui-input"
+                                                   placeholder="搜索" style="position:absolute;z-index:2;width:88%;" value="" autocomplete="off">
+                                            <select id="product_select" placeholder="1" name="product_id" lay-verify="required" lay-filter="product_select" >
+                                                <option value="">请输入名称搜索</option>
+                                            </select>
+                                        </div>
+                                    </div>
+
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label">{:lang("Stock")}</label>
+                                        <div class="layui-input-block">
+                                            <input type="number" name="now_stock" lay-verify="required" lay-reqtext="{:lang('Please fill in')}" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+
+
+                                    <div class="layui-form-item">
+                                        <div class="layui-input-block">
+                                            <button type="button" 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>
+    // 用于缓存下拉获取的数据
+    let dropData
+
+    // 请求返回数据
+    function getData(str){
+        console.log(str);
+        return new Promise(resolve=>{
+            request("{:url('admin/product/findProducts')}", {"text": str}).then((data) => {
+                console.log(data)
+                if (data.code === 200) {
+                    resolve(data.data.map(v => {
+                        return {
+                            value: v.id,
+                            text: `【${v.bar_code}】 ${v.name}`
+                        }
+                    }))
+                }
+            })
+        })
+    }
+
+    $("#product_id").on("keyup", async function(e){
+        // 点击enter实现搜索功能
+        if(e.which=='13'){
+            // console.log("点击了enter",$(this).val())
+            // 模拟请求获取下拉菜单所需的参数
+            dropData=await getData($(this).val())
+            console.log("下拉菜单的数据:",dropData)
+            // 将获取回来的数据渲染给下拉菜单
+            innitSelect("#product_select", dropData)
+            let form = layui.form;
+            form.render()
+            // 将下拉框展开
+            $(".unfold_product .layui-form-select").addClass("layui-form-selected")
+        }
+    })
+
+    // 渲染下拉框的数据
+    function innitSelect(name,data){
+        let html=''
+        if(data&&data instanceof Array){
+            data.forEach(item=>{
+                html+="<option value="+item.value+">"+item.text+"</option>"
+            })
+        }
+        $(name).html(html)
+    }
+
+
+    layui.use(['laydate','form','upload'], () => {
+        const form = layui.form;
+
+        // 监听下拉框改变事件,修改输入框中的内容
+        form.on("select(product_select)",function(data){
+            let value=data.value
+            let selectObj=dropData.filter(item=>{
+                return item.value == value
+            })
+            $("#product_id").val(selectObj[0].text);
+            console.log($("#product_id").val(selectObj[0].text))
+        })
+
+        form.on('submit(caviar_submit_btn)', (data) =>{
+            const response = request('/admin/stock/add',data.field)
+            response.then((res) => {
+                console.log(res);
+                res.code === 200 ? layer.msg("{:lang('Succeed')}", {icon: 1,time:500},() => {
+                    parent.location.reload();
+                }) : layer.msg(res.message,{icon: 5})
+            })
+            return false;
+        });
+    });
+</script>

+ 148 - 0
app/admin/view/stock/index.html

@@ -0,0 +1,148 @@
+{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/stock/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("Store")}</label>
+                                    <div class="pull-left w-120-calc">
+                                        <select class="form-control pull-left" name="store_id">
+                                            <option value="0" selected>{:lang("Unknown")}</option>
+                                            {volist name="stores" id="item"}
+                                            <option value="{$item.id}" {if $params.store_id == $item.id} selected {/if} >{$item.name}</option>
+                                            {/volist}
+                                        </select>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="col-md-4">
+                                <div class="form-group">
+                                    <label class="w-120 pull-left control-label">{:lang("Sort")}</label>
+                                    <div class="pull-left w-120-calc">
+                                        <select class="form-control pull-left" name="sort">
+                                            <option value="0" selected>{:lang("Unknown")}</option>
+                                            <option value="id" {if $params.sort == 'id'} selected {/if} >{:lang("ID")}</option>
+                                            <option value="create_time" {if $params.sort == 'create_time'} selected {/if} >{:lang("create_time")}</option>
+                                            <option value="now_stock" {if $params.sort == 'now_stock'} selected {/if} >{:lang("Now stock")}</option>
+                                            <option value="sale_stock" {if $params.sort == 'sale_stock'} selected {/if} >{:lang("Sale stock")}</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/stock/add\')}?store_id={$params.store_id}')"><i class="mdi mdi-plus"></i> {:lang('add')}{:lang("Product")}</a>
+                        <a class="btn btn-danger" href="#!" onclick="
+                            caviar_checkbox_delete('{:url(\'admin/stock/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("Store")}</th>
+                                <th>{:lang("Product")}</th>
+                                <th>{:lang('Bar code')}</th>
+                                <th>{:lang('Image')}</th>
+                                <th>{:lang('Now stock')}</th>
+                                <th>{:lang('Sale stock')}</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.store.abbr}</td>
+                                <td>{$item.product_name}</td>
+                                <td>{$item.product_bar_code}</td>
+                                <td><img class="small-img" src="{$item.product.image}" onclick="image_magnify()" ></td>
+                                <td>{$item.now_stock}</td>
+                                <td>{$item.sale_stock}</td>
+                                <td>{$item.product.purchase_price}</td>
+                                <td>{$item.product.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/stock/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/stock/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>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 0 - 4
app/common/model/BaseModel.php

@@ -3,15 +3,11 @@
 
 namespace app\common\model;
 
-use think\Collection;
 use think\Model;
 
 abstract class BaseModel extends Model
 {
-    protected $autoWriteTimestamp = true;
 
-    protected $updateTime = 'update_time';
-    protected $createTime = 'create_time';
     public function __call($method, $args)
     {
         return parent::__call($method, $args); // TODO: Change the autogenerated stub

+ 1 - 1
app/common/model/ProductCategoryModel.php

@@ -20,7 +20,7 @@ class ProductCategoryModel extends BaseModel
 
     public function doesItExist($name) {
         $customer = $this->where([
-            ["name", '=',$name],
+            ["name", '=', $name],
             ["is_delete", '=', 0]
         ])->find();
         return $customer ? true : false;

+ 20 - 3
app/common/model/ProductModel.php

@@ -22,15 +22,32 @@ class ProductModel extends BaseModel
         $where = [
             ['is_delete', '=', 0]
         ];
-        if($params['bar_code'] != null)
+        if(!is_null($params['bar_code']))
             array_push($where,['bar_code', 'like', "%".$params['bar_code']."%"]);
-        if($params['category_id'] != null)
+        if(!is_null($params['category_id']) && $params['category_id'] > 0)
             array_push($where,['category_id', '=', $params['category_id']]);
-        if($params['is_serve'] != null)
+        if(!is_null($params['is_serve']))
             array_push($where,['is_serve', '=', $params['is_serve']]);
 
         return $this->where($where)->order('create_time','desc')->paginate(['list_rows'=>10, "query" => $params]);
     }
 
+    public function findProducts($text = null) {
+        $or_where = [];
+        if(strlen($text) > 0) {
+            array_push($or_where, ['name|bar_code', 'like', '%'.$text.'%']);
+        }
+        return $this->where('is_delete', 0)->where($or_where)->page(1,10)->select();
+    }
+
+
+
+    public function doesItExist($bar_code) {
+        $customer = $this->where([
+            ["bar_code", '=', $bar_code],
+            ["is_delete", '=', 0]
+        ])->find();
+        return $customer ? true : false;
+    }
 
 }

+ 67 - 0
app/common/model/StoreProductModel.php

@@ -0,0 +1,67 @@
+<?php
+
+
+namespace app\common\model;
+
+
+class StoreProductModel extends BaseModel
+{
+    protected $table = 'erp_store_product';
+
+    protected function genSchema(array $schema)
+    {
+        // TODO: Implement genSchema() method.
+    }
+
+    public function store()
+    {
+        return self::hasOne(StoreModel::class,'id','store_id');
+    }
+
+    public function product()
+    {
+        return self::hasOne(ProductModel::class,'id','product_id');
+    }
+
+    public function doesItExist($store_id, $product_id) {
+        return $this->where([
+            ["store_id", '=', $store_id],
+            ["product_id", '=', $product_id],
+            ["is_delete", '=', 0]
+        ])->find();
+    }
+
+    /**
+     * @param array $params
+     * @return \think\Paginator
+     * @throws \think\db\exception\DbException
+     */
+    public function findByPaginate(array $params) {
+
+//        if(!is_null($params['bar_code']))
+//            array_push($where,['bar_code', 'like', "%".$params['bar_code']."%"]);
+//        if(!is_null($params['category_id']) && $params['category_id'] > 0)
+//            array_push($where,['category_id', '=', $params['category_id']]);
+//        if(!is_null($params['is_serve']))
+//            array_push($where,['is_serve', '=', $params['is_serve']]);
+        $store_where = [
+            ['is_delete','=', 0],
+        ];
+        $product_where = [
+            ['is_delete','=', 0],
+        ];
+        if($params['store_id'] > 0)
+            array_push($store_where,["id", "=", $params['store_id']]);
+
+        return $this->where('erp_store_product.is_delete',0)
+            ->hasWhere('store', $store_where)
+            ->hasWhere('product',$product_where)
+            ->with(['store', 'product'])
+            ->order(isset($params['sort']) ? $params['sort'] : 'create_time','desc')
+            ->paginate(['list_rows'=>10, "query" => $params]);
+
+    }
+
+
+
+}

File diff suppressed because it is too large
+ 1 - 0
public/static/css/layui/layui.css


File diff suppressed because it is too large
+ 1 - 0
public/static/css/layui/modules/code.css


File diff suppressed because it is too large
+ 1 - 0
public/static/css/layui/modules/laydate/default/laydate.css


BIN
public/static/css/layui/modules/layer/default/icon-ext.png


BIN
public/static/css/layui/modules/layer/default/icon.png


File diff suppressed because it is too large
+ 1 - 0
public/static/css/layui/modules/layer/default/layer.css


BIN
public/static/css/layui/modules/layer/default/loading-0.gif


BIN
public/static/css/layui/modules/layer/default/loading-1.gif


BIN
public/static/css/layui/modules/layer/default/loading-2.gif


BIN
public/static/fonts/iconfont.eot


File diff suppressed because it is too large
+ 554 - 0
public/static/fonts/iconfont.svg


BIN
public/static/fonts/iconfont.ttf


BIN
public/static/fonts/iconfont.woff


BIN
public/static/fonts/iconfont.woff2


File diff suppressed because it is too large
+ 1 - 0
public/static/js/layui/layui.js


BIN
public/storage/product/20221212/1433bf125d23a87fef582876243650d2.jpg


BIN
public/storage/product/20221212/209a7b22b3df380ca5726e9a5084b825.jpg


BIN
public/storage/product/20221212/2973fec39f5d248ab6e275c694a7e200.jpg


BIN
public/storage/product/20221212/2f7823a4d83dcaa76659b9925a8232d4.jpg


BIN
public/storage/product/20221212/41102eb205daf1e0e5141acb58ea79eb.jpg


BIN
public/storage/product/20221212/4659ba3b989a96413ae083d2c89260d1.jpg


BIN
public/storage/product/20221212/476e7e5df2871cc2c0ca7a532c02e360.jpg


BIN
public/storage/product/20221212/479261101c03b33f53c15c48f0bee5d2.jpg


BIN
public/storage/product/20221212/53720f4e5365bb485bcd3c4667b829bc.jpg


BIN
public/storage/product/20221212/57b57fa38d2bba00a6890d3efa3d29ff.jpg


BIN
public/storage/product/20221212/59303b361cf7c3e9b8b9fc2feddc5da5.jpg


BIN
public/storage/product/20221212/5bef0bfd8a38fb859d40360da6b2eb8c.jpg


BIN
public/storage/product/20221212/5f333e3e282d1830dd12944eec654f8b.jpg


BIN
public/storage/product/20221212/868acad2bd58b50b6cdee6d7328c13e6.jpg


BIN
public/storage/product/20221212/8bb76a6be9170a64f5da3adc3b6c06d7.jpg


BIN
public/storage/product/20221212/91d84a02ebed9fd7a9812f117645ece3.jpg


BIN
public/storage/product/20221212/99e753ccc50771a0b6214ff9bb1f7f4c.jpg


BIN
public/storage/product/20221212/9a7d1dc4b5576f94b2a239954da37bfe.jpg


BIN
public/storage/product/20221212/a373a5f55195eea4010aff2cd203a5dc.jpg


BIN
public/storage/product/20221212/bc29bd00a0c3fa7c7fdb23008be9087d.jpg


BIN
public/storage/product/20221212/bc6273bb0fb9ff69404cef744a292a32.jpg


BIN
public/storage/product/20221212/c15c51866ae3b69dc2077ae4e372297b.jpg


BIN
public/storage/product/20221212/cc2f0803f3412f8746d291e590142685.jpg


BIN
public/storage/product/20221212/cfe3b252201283f30579ccba0a8c7a81.jpg


BIN
public/storage/product/20221212/e216cdff1173320f982eaf5aca33969a.jpg


BIN
public/storage/product/20221212/eb068fd6f446c5a2b2c8a6c584b266cc.jpg


BIN
public/storage/product/20221212/ecf1113a308229ad4d89c678124b1eed.jpg


BIN
public/storage/product/20221212/efa70d9df3e76ca6d51ceb49a163dc72.jpg