xieruidong 2 年之前
父节点
当前提交
02f1c94c96

+ 1 - 0
application/admin/controller/Goods.php

@@ -80,6 +80,7 @@ class Goods extends Backend
 
     public function add()
     {
+        $this->layout=false;
         if($this->request->isGet()){
             $this->assign('row',[
                 'sku'=>[

+ 126 - 209
application/admin/view/goods/add.html

@@ -1,211 +1,128 @@
-<style>
-    .smInput{
-        width: 100px;
-    }
-    .skuName{
-        width: 150px;
-    }
-    .amountItem{
-        line-height: 30px;
-    }
-</style>
-<form id="add-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
-    <input type="hidden" name="row[id]" value="{$row.id|default=''}"/>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Name')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-name" class="form-control" name="row[name]" type="text" data-rule="required;length(1~50)" value="{$row.name|default=''}">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('分类')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            {:build_select('row[category_id]',array_column($category,'name','id'),$row['category_id']??0,['required'=>true])}
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Brand')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-brand" class="form-control" name="row[brand]" type="text" data-rule="required;length(1~10)" value="{$row.brand|default=''}">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('描述')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-describe" class="form-control" name="row[describe]" type="text" data-rule="required" value="{$row.describe|default=''}">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Is_hot')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            {:build_radios('row[is_hot]',[0=>'否',1=>'是'],$row['is_hot']??0)}
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Is_kill')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            {:build_radios('row[is_kill]',[0=>'否',1=>'是'],$row['is_kill']??0)}
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('状态')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            {:build_radios('row[status]',$status,$row['status']??1)}
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">是否维修费商品:</label>
-        <div class="col-xs-12 col-sm-8">
-            {:build_radios('row[is_fix]',[0=>'否',1=>'是'],$row['is_fix']??0)}
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Logo')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <div class="input-group">
-                <input id="c-logo" class="form-control" size="50" name="row[logo]" type="text" value="{:implode(',',$row['logo']??[])}" data-rule="required">
-                <div class="input-group-addon no-border no-padding">
-                    <span><button type="button" id="plupload-avatar-logo" class="btn btn-danger plupload" data-input-id="c-logo" data-mimetype="image/*" data-multiple="true" data-preview-id="c-logo-pre"><i class="fa fa-upload"></i> 上传</button></span>
-                    <span><button type="button" id="fachoose-avatar-logo" class="btn btn-primary fachoose" data-input-id="c-logo" data-mimetype="image/*" data-multiple="true"><i class="fa fa-list"></i> 选择</button></span>
+<html>
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport"
+          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
+    <meta http-equiv="X-UA-Compatible" content="ie=edge">
+    <title>Document</title>
+    <script crossorigin="anonymous" integrity="sha512-PhuYrdDBtBeUjY7KTmjRYFFadw8uXXdTmzZyhCHZewYsqZJ0pxFCwU528jRoil42LXMW3ksegQT5zdjkfiR1IA==" src="https://lib.baomitu.com/vue/2.7.7/vue.min.js"></script>
+    <script crossorigin="anonymous" integrity="sha512-hybks56be1W1sC5RgFWfH7pn+uUlfCi6bPD8AbNvNlc7b1k69wwIxwhF05wobYemsndUkdoNWomx/kBD94xpgA==" src="https://lib.baomitu.com/element-ui/2.15.10/index.min.js"></script>
+    <link crossorigin="anonymous" integrity="sha512-2by4R3Ml3Olue9XwB86eM7YLPqZr1pOBFfdsSOFs/1SJ7NIOCz0QhK99lR7d4+B/aOYXOWnghUUV/gjaITrL1g==" href="https://lib.baomitu.com/element-ui/2.15.10/theme-chalk/index.min.css" rel="stylesheet">
+    <style type="text/css">
+        [v-cloak]{
+            display: none;
+        }
+        .add-img {
+            width: 60px;
+            height: 60px;
+            border: 1px dashed #E6E6E6;
+            border-radius: 4px;
+            justify-content: center;
+        }
+        .display-flex {
+            display: flex;
+            align-items: center;
+        }
+        .goods-images {
+            width: 60px;
+            height: 60px;
+            border-radius: 4px;
+            position: relative;
+            border: 1px solid #7438D5;
+            margin-right: 10px;
+            margin-bottom: 10px;
+        }
+        .label-auto {
+            width: 100%;
+            height: 100%;
+        }
+        .del-image-btn {
+            position: absolute;
+            width: 14px;
+            height: 14px;
+            line-height: 14px;
+            text-align: center;
+            border-radius: 50%;
+            font-size: 12px;
+            font-weight: 600;
+            background: #7438D5;
+            color: #fff;
+            top: -7px;
+            right: -7px;
+        }
+    </style>
+</head>
+<body>
+    <div id="app">
+        <el-form :model="form" ref="form" size="mini" v-cloak>
+            <el-form-item label="商品名称" prop="name">
+                <el-input v-model="form.name" maxlength="30" show-word-limit></el-input>
+            </el-form-item>
+            <el-form-item label="商品分类" prop="category_id">
+                <el-select v-model="form.category_id">
+                    <el-option v-for="item in category" :key="item.id" :value="item.id" :label="item.name"/>
+                </el-select>
+            </el-form-item>
+            <el-form-item label="商品品牌" prop="brand">
+                <el-input v-model="form.brand" maxlength="20" show-word-limit></el-input>
+            </el-form-item>
+            <el-form-item label="商品描述" prop="describe">
+                <el-input v-model="form.describe" maxlength="50" show-word-limit></el-input>
+            </el-form-item>
+            <el-form-item label="是否热销" prop="is_hot">
+                <el-radio v-model="form.is_hot" :label="0">否</el-radio>
+                <el-radio v-model="form.is_hot" :label="1">是</el-radio>
+            </el-form-item>
+            <el-form-item label="是否秒杀" prop="is_kill">
+                <el-radio v-model="form.is_kill" :label="0">否</el-radio>
+                <el-radio v-model="form.is_kill" :label="1">是</el-radio>
+            </el-form-item>
+            <el-form-item label="状态" prop="status">
+                <el-radio v-model="form.status" :label="parseInt(idx)" v-for="(item,idx) in status" :key="idx">{{item}}</el-radio>
+            </el-form-item>
+            <el-form-item label="是否维修商品" prop="is_kill">
+                <el-radio v-model="form.is_fix" :label="0">否</el-radio>
+                <el-radio v-model="form.is_fix" :label="1">是</el-radio>
+            </el-form-item>
+            <el-form-item label="轮播图" prop="logo">
+                <div class="display-flex" style="flex-wrap: wrap;">
+                    <div class="goods-image-box display-flex" style="flex-wrap: wrap;"
+                         v-if="form.logo">
+                        <div class="goods-images" v-for="(it,index) in form.logo">
+                            <img class="label-auto" :src="Fast.api.cdnurl(it)" style="border-radius: 4px;">
+                            <div class="del-image-btn" @click="delImg(index)">
+                                <img class="label-auto" src="/images/close.png">
+                            </div>
+                        </div>
+                    </div>
+                    <div class="add-img display-flex" @click="addImg('image',null,false)"
+                         v-if="form.logo.length<6">
+                        <i class="el-icon-plus"></i>
+                    </div>
                 </div>
-                <span class="msg-box n-right" for="c-logo"></span>
-            </div>
-            <ul class="row list-inline faupload-preview" id="c-logo-pre"></ul>
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2" for="c-video">视频:</label>
-        <div class="col-xs-12 col-sm-8">
-            <div class="input-group">
-                <input id="c-video" class="form-control" size="50" name="row[video]" type="text" value="{$row.video|default=''}" data-rule="">
-                <div class="input-group-addon no-border no-padding">
-                    <span><button type="button" id="plupload-video-logo" class="btn btn-danger plupload" data-input-id="c-video" data-mimetype="video/mp4" data-multiple="false" data-preview-id="c-video-pre"><i class="fa fa-upload"></i> 上传</button></span>
-                    <span><button type="button" id="fachoose-video-logo" class="btn btn-primary fachoose" data-input-id="c-video" data-mimetype="video/mp4" data-multiple="false"><i class="fa fa-list"></i> 选择</button></span>
+            </el-form-item>
+            <el-form-item label="视频" prop="logo">
+                <div class="display-flex" style="flex-wrap: wrap;">
+                    <div class="goods-image-box display-flex" style="flex-wrap: wrap;"
+                         v-if="form.video">
+                        <div class="goods-images">
+                            <video class="label-auto" :src="Fast.api.cdnurl(form.video)" style="border-radius: 4px;">
+                            <div class="del-image-btn" @click="delVideo">
+                                <img class="label-auto" src="/images/close.png">
+                            </div>
+                        </div>
+                    </div>
+                    <div class="add-img display-flex" @click="addImg('video',null,false)"
+                         v-if="!form.video">
+                        <i class="el-icon-plus"></i>
+                    </div>
                 </div>
-                <span class="msg-box n-right" for="c-video"></span>
-            </div>
-            <ul class="row list-inline faupload-preview" id="c-video-pre"></ul>
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('尺寸')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            {foreach name="$row['size']??[[]]" item="a"}
-            <div class="skuItem sizeItem" key="{$key}">
-                <input type="hidden" class="id" name="row[sku][_{$key}][id]" value="{$a.id|default=''}"/>
-                名称:<input class="form-control smInput skuName" name="row[sku][_{$key}][name]" type="text" placeholder="名称" value="{$a.name|default=''}">
-                <a class="btn btn-sm delSku">删除</a>
-            </div>
-            {/foreach}
-            <div>
-                <a class="btn btn-sm btnAddSku">添加</a>
-            </div>
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('版本')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            {foreach name="$row['sku']??[[]]" item="a"}
-            <div class="skuItem specItem" key="{$key}">
-                <input type="hidden" class="id" name="row[sku][_{$key}][id]" value="{$a.id|default=''}"/>
-                名称:<input class="form-control smInput skuName" name="row[sku][_{$key}][name]" type="text" placeholder="名称" value="{$a.name|default=''}">
-                <a class="btn btn-sm delSku">删除</a>
-            </div>
-            {/foreach}
-            <div>
-                <a class="btn btn-sm btnAddSku">添加</a>
-            </div>
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('参数')}:</label>
-        <div class="col-xs-12 col-sm-8 amountSet">
-            {foreach name="$row['sku']?:[[]]" item="aa" key="aakey"}
-            <div class="amountItem">
-                <span class="itemName">{:$aa['name']??''}</span>
-                {foreach name="$aa['amount_ladder']?:[[]]" item="a"}
-                <div>
-                    库存:<input class="form-control smInput skuNumStock" name="row[sku][_{$key}][num_stock]" type="number" placeholder="库存" value="{$a.num_stock|default=''}">
-                    秒杀库存:<input class="form-control smInput skuNumStockKill" name="row[sku][_{$key}][num_stock_kill]" type="number" placeholder="库存" value="{$a.num_stock_kill|default=''}">
-                    成本价:<input class="form-control smInput skuNumStock" name="row[sku][_{$key}][amount_cost]" type="number" placeholder="价格" value="{$a.amount_cost|default=''}">
-                </div>
-                <div class="amountItemOne">
-                    <input class="form-control smInput" name="row[amount_ladder][_{$aakey}][__{$key}][min]" type="number" placeholder="数量" value="{$a.min|default=''}">-
-                    <input class="form-control smInput" name="row[amount_ladder][_{$aakey}][__{$key}][max]" type="number" placeholder="数量" value="{$a.max|default=''}">,
-                    售价<input class="form-control smInput" name="row[amount_ladder][_{$aakey}][__{$key}][amount]" type="number" placeholder="金额" value="{$a.amount|default=''}">
-                    <a class="btn btn-sm delAmountItem">删除</a>
-                </div>
-                {/foreach}
-                <a class="btn btn-info addAmountDetail">添加</a>
-            </div>
-            {/foreach}
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('秒杀价')}:</label>
-        <div class="col-xs-12 col-sm-8 amountSetKill">
-            {foreach name="$row['sku']?:[[]]" item="aa" key="aakey"}
-            <div class="amountItem">
-                <span class="itemName">{:$aa['name']??''}</span>
-                {foreach name="$aa['amount_kill_ladder']?:[[]]" item="a"}
-                <div class="amountItemOne">
-                    <input class="form-control smInput" name="row[amount_kill_ladder][_{$aakey}][__{$key}][min]" type="number" placeholder="数量" value="{$a.min|default=''}">-
-                    <input class="form-control smInput" name="row[amount_kill_ladder][_{$aakey}][__{$key}][max]" type="number" placeholder="数量" value="{$a.max|default=''}">,
-                    售价<input class="form-control smInput" name="row[amount_kill_ladder][_{$aakey}][__{$key}][amount]" type="number" placeholder="金额" value="{$a.amount|default=''}">
-                    <a class="btn btn-sm delAmountItem">删除</a>
-                </div>
-                {/foreach}
-                <a class="btn btn-info addAmountDetail">添加</a>
-            </div>
-            {/foreach}
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Content')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <textarea id="c-content" class="form-control editor" rows="5" name="row[content]" cols="50">{$row.content|default=''}</textarea>
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('规格参数')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            {foreach name="$row['detail']??[['id'=>'','name'=>'','value'=>'']]" item="a"}
-            <div class="detailItem">
-                <input type="hidden" class="id" name="row[detail][_{$key}][id]" value="{$a.id}"/>
-                <input class="form-control smInput name" name="row[detail][_{$key}][name]" type="text" placeholder="参数名" value="{$a.name}">
-                <input class="form-control smInput value" name="row[detail][_{$key}][value]" type="text" placeholder="参数值" value="{$a.value}">
-                <a class="btn btn-sm delDetail">删除</a>
-            </div>
-            {/foreach}
-            <div>
-                <a class="btn btn-sm btnAddDetail" data-m="detail">添加</a>
-            </div>
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('售后服务')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            {foreach name="$row['service']??[['id'=>'','name'=>'','value'=>'']]" item="a"}
-            <div class="detailItem">
-                <input type="hidden" class="id" name="row[service][_{$key}][id]" value="{$a.id}"/>
-                <input class="form-control smInput name" name="row[service][_{$key}][name]" type="text" placeholder="参数名" value="{$a.name}">
-                <input class="form-control smInput value" name="row[service][_{$key}][value]" type="text" placeholder="参数值" value="{$a.value}">
-                <a class="btn btn-sm delDetail">删除</a>
-            </div>
-            {/foreach}
-            <div>
-                <a class="btn btn-sm btnAddDetail" data-m="service">添加</a>
-            </div>
-        </div>
-    </div>
-
-
-
-    <div class="form-group layer-footer">
-        <label class="control-label col-xs-12 col-sm-2"></label>
-        <div class="col-xs-12 col-sm-8">
-            <button type="submit" class="btn btn-success btn-embossed disabled">{:__('OK')}</button>
-            <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
-        </div>
-    </div>
-</form>
+            </el-form-item>
+        </el-form>
+    </div>
+<script>
+    let category={$category|json_encode};
+    let status={$status|json_encode};
+</script>
+</body>
+</html>

+ 211 - 0
application/admin/view/goods/add.old.html

@@ -0,0 +1,211 @@
+<style>
+    .smInput{
+        width: 100px;
+    }
+    .skuName{
+        width: 150px;
+    }
+    .amountItem{
+        line-height: 30px;
+    }
+</style>
+<form id="add-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
+    <input type="hidden" name="row[id]" value="{$row.id|default=''}"/>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Name')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-name" class="form-control" name="row[name]" type="text" data-rule="required;length(1~50)" value="{$row.name|default=''}">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('分类')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            {:build_select('row[category_id]',array_column($category,'name','id'),$row['category_id']??0,['required'=>true])}
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Brand')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-brand" class="form-control" name="row[brand]" type="text" data-rule="required;length(1~10)" value="{$row.brand|default=''}">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('描述')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-describe" class="form-control" name="row[describe]" type="text" data-rule="required" value="{$row.describe|default=''}">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Is_hot')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            {:build_radios('row[is_hot]',[0=>'否',1=>'是'],$row['is_hot']??0)}
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Is_kill')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            {:build_radios('row[is_kill]',[0=>'否',1=>'是'],$row['is_kill']??0)}
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('状态')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            {:build_radios('row[status]',$status,$row['status']??1)}
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">是否维修费商品:</label>
+        <div class="col-xs-12 col-sm-8">
+            {:build_radios('row[is_fix]',[0=>'否',1=>'是'],$row['is_fix']??0)}
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Logo')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <div class="input-group">
+                <input id="c-logo" class="form-control" size="50" name="row[logo]" type="text" value="{:implode(',',$row['logo']??[])}" data-rule="required">
+                <div class="input-group-addon no-border no-padding">
+                    <span><button type="button" id="plupload-avatar-logo" class="btn btn-danger plupload" data-input-id="c-logo" data-mimetype="image/*" data-multiple="true" data-preview-id="c-logo-pre"><i class="fa fa-upload"></i> 上传</button></span>
+                    <span><button type="button" id="fachoose-avatar-logo" class="btn btn-primary fachoose" data-input-id="c-logo" data-mimetype="image/*" data-multiple="true"><i class="fa fa-list"></i> 选择</button></span>
+                </div>
+                <span class="msg-box n-right" for="c-logo"></span>
+            </div>
+            <ul class="row list-inline faupload-preview" id="c-logo-pre"></ul>
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2" for="c-video">视频:</label>
+        <div class="col-xs-12 col-sm-8">
+            <div class="input-group">
+                <input id="c-video" class="form-control" size="50" name="row[video]" type="text" value="{$row.video|default=''}" data-rule="">
+                <div class="input-group-addon no-border no-padding">
+                    <span><button type="button" id="plupload-video-logo" class="btn btn-danger plupload" data-input-id="c-video" data-mimetype="video/mp4" data-multiple="false" data-preview-id="c-video-pre"><i class="fa fa-upload"></i> 上传</button></span>
+                    <span><button type="button" id="fachoose-video-logo" class="btn btn-primary fachoose" data-input-id="c-video" data-mimetype="video/mp4" data-multiple="false"><i class="fa fa-list"></i> 选择</button></span>
+                </div>
+                <span class="msg-box n-right" for="c-video"></span>
+            </div>
+            <ul class="row list-inline faupload-preview" id="c-video-pre"></ul>
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('尺寸')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            {foreach name="$row['size']??[[]]" item="a"}
+            <div class="skuItem sizeItem" key="{$key}">
+                <input type="hidden" class="id" name="row[sku][_{$key}][id]" value="{$a.id|default=''}"/>
+                名称:<input class="form-control smInput skuName" name="row[sku][_{$key}][name]" type="text" placeholder="名称" value="{$a.name|default=''}">
+                <a class="btn btn-sm delSku">删除</a>
+            </div>
+            {/foreach}
+            <div>
+                <a class="btn btn-sm btnAddSku">添加</a>
+            </div>
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('版本')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            {foreach name="$row['sku']??[[]]" item="a"}
+            <div class="skuItem specItem" key="{$key}">
+                <input type="hidden" class="id" name="row[sku][_{$key}][id]" value="{$a.id|default=''}"/>
+                名称:<input class="form-control smInput skuName" name="row[sku][_{$key}][name]" type="text" placeholder="名称" value="{$a.name|default=''}">
+                <a class="btn btn-sm delSku">删除</a>
+            </div>
+            {/foreach}
+            <div>
+                <a class="btn btn-sm btnAddSku">添加</a>
+            </div>
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('参数')}:</label>
+        <div class="col-xs-12 col-sm-8 amountSet">
+            {foreach name="$row['sku']?:[[]]" item="aa" key="aakey"}
+            <div class="amountItem">
+                <span class="itemName">{:$aa['name']??''}</span>
+                {foreach name="$aa['amount_ladder']?:[[]]" item="a"}
+                <div>
+                    库存:<input class="form-control smInput skuNumStock" name="row[sku][_{$key}][num_stock]" type="number" placeholder="库存" value="{$a.num_stock|default=''}">
+                    秒杀库存:<input class="form-control smInput skuNumStockKill" name="row[sku][_{$key}][num_stock_kill]" type="number" placeholder="库存" value="{$a.num_stock_kill|default=''}">
+                    成本价:<input class="form-control smInput skuNumStock" name="row[sku][_{$key}][amount_cost]" type="number" placeholder="价格" value="{$a.amount_cost|default=''}">
+                </div>
+                <div class="amountItemOne">
+                    <input class="form-control smInput" name="row[amount_ladder][_{$aakey}][__{$key}][min]" type="number" placeholder="数量" value="{$a.min|default=''}">-
+                    <input class="form-control smInput" name="row[amount_ladder][_{$aakey}][__{$key}][max]" type="number" placeholder="数量" value="{$a.max|default=''}">,
+                    售价<input class="form-control smInput" name="row[amount_ladder][_{$aakey}][__{$key}][amount]" type="number" placeholder="金额" value="{$a.amount|default=''}">
+                    <a class="btn btn-sm delAmountItem">删除</a>
+                </div>
+                {/foreach}
+                <a class="btn btn-info addAmountDetail">添加</a>
+            </div>
+            {/foreach}
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('秒杀价')}:</label>
+        <div class="col-xs-12 col-sm-8 amountSetKill">
+            {foreach name="$row['sku']?:[[]]" item="aa" key="aakey"}
+            <div class="amountItem">
+                <span class="itemName">{:$aa['name']??''}</span>
+                {foreach name="$aa['amount_kill_ladder']?:[[]]" item="a"}
+                <div class="amountItemOne">
+                    <input class="form-control smInput" name="row[amount_kill_ladder][_{$aakey}][__{$key}][min]" type="number" placeholder="数量" value="{$a.min|default=''}">-
+                    <input class="form-control smInput" name="row[amount_kill_ladder][_{$aakey}][__{$key}][max]" type="number" placeholder="数量" value="{$a.max|default=''}">,
+                    售价<input class="form-control smInput" name="row[amount_kill_ladder][_{$aakey}][__{$key}][amount]" type="number" placeholder="金额" value="{$a.amount|default=''}">
+                    <a class="btn btn-sm delAmountItem">删除</a>
+                </div>
+                {/foreach}
+                <a class="btn btn-info addAmountDetail">添加</a>
+            </div>
+            {/foreach}
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Content')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <textarea id="c-content" class="form-control editor" rows="5" name="row[content]" cols="50">{$row.content|default=''}</textarea>
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('规格参数')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            {foreach name="$row['detail']??[['id'=>'','name'=>'','value'=>'']]" item="a"}
+            <div class="detailItem">
+                <input type="hidden" class="id" name="row[detail][_{$key}][id]" value="{$a.id}"/>
+                <input class="form-control smInput name" name="row[detail][_{$key}][name]" type="text" placeholder="参数名" value="{$a.name}">
+                <input class="form-control smInput value" name="row[detail][_{$key}][value]" type="text" placeholder="参数值" value="{$a.value}">
+                <a class="btn btn-sm delDetail">删除</a>
+            </div>
+            {/foreach}
+            <div>
+                <a class="btn btn-sm btnAddDetail" data-m="detail">添加</a>
+            </div>
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('售后服务')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            {foreach name="$row['service']??[['id'=>'','name'=>'','value'=>'']]" item="a"}
+            <div class="detailItem">
+                <input type="hidden" class="id" name="row[service][_{$key}][id]" value="{$a.id}"/>
+                <input class="form-control smInput name" name="row[service][_{$key}][name]" type="text" placeholder="参数名" value="{$a.name}">
+                <input class="form-control smInput value" name="row[service][_{$key}][value]" type="text" placeholder="参数值" value="{$a.value}">
+                <a class="btn btn-sm delDetail">删除</a>
+            </div>
+            {/foreach}
+            <div>
+                <a class="btn btn-sm btnAddDetail" data-m="service">添加</a>
+            </div>
+        </div>
+    </div>
+
+
+
+    <div class="form-group layer-footer">
+        <label class="control-label col-xs-12 col-sm-2"></label>
+        <div class="col-xs-12 col-sm-8">
+            <button type="submit" class="btn btn-success btn-embossed disabled">{:__('OK')}</button>
+            <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
+        </div>
+    </div>
+</form>

+ 1 - 1
application/admin/view/goods/index.html

@@ -7,7 +7,7 @@
                 <div class="widget-body no-padding">
                     <div id="toolbar" class="toolbar">
                         <a href="javascript:;" class="btn btn-primary btn-refresh" title="{:__('Refresh')}" ><i class="fa fa-refresh"></i> </a>
-                        <a href="javascript:;" data-area='["100%","100%"]' class="btn btn-success btn-add {:$auth->check('goods/add')?'':'hide'}" title="{:__('Add')}" ><i class="fa fa-plus"></i> {:__('Add')}</a>
+                        <a href="javascript:;" data-area='["800px","90%"]' class="btn btn-success btn-add {:$auth->check('goods/add')?'':'hide'}" title="{:__('Add')}" ><i class="fa fa-plus"></i> {:__('Add')}</a>
                         <a href="javascript:;" class="btn btn-danger btn-del btn-disabled disabled {:$auth->check('goods/del')?'':'hide'}" title="{:__('Delete')}" ><i class="fa fa-trash"></i> {:__('Delete')}</a>
                         <!-- <a href="javascript:;" class="btn btn-danger btn-import {:$auth->check('goods/import')?'':'hide'}" title="{:__('Import')}" id="btn-import-file" data-url="ajax/upload" data-mimetype="csv,xls,xlsx" data-multiple="false"><i class="fa fa-upload"></i> {:__('Import')}</a>
 

+ 47 - 51
public/assets/js/backend/goods.js

@@ -121,7 +121,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
                 ],
                 onLoadSuccess(){
                     setTimeout(()=>{
-                        $('.btn-editone').attr('data-area','["100%","100%"]')
+                        $('.btn-editone').attr('data-area','["800px","90%"]')
                     },100)
                 }
             });
@@ -136,11 +136,9 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
         },
         add: function () {
             this.editor()
-            Controller.api.bindevent();
         },
         edit: function () {
-            this.editor()
-            Controller.api.bindevent();
+            this.editor(1)
         },
         goods_statistics(){
             //Controller.api.bindevent();
@@ -219,55 +217,53 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
             });
             Table.api.bindevent(table);
         },
-        editor(){
-            $('.btnAddSku').click(function (){
-                let key=Date.now()
-                let a=$($('.skuItem')[0].outerHTML.replace(/\[_\d+]/g,`[_${key}]`))
-                $(this).parent().before(a[0].outerHTML.replace(/value="\S+"/ig,''))
-
-                //添加价格
-                let html=$('.amountItem')[0].outerHTML.replace(/\[_\d+]/g,`[_${key}]`)
-                let item=$(html)
-                item.find('.itemName').text('')
-                item.find('.amountItemOne').each(function (idx){
-                    if(idx>0){
-                        $(this).remove()
+        editor(isEdit){
+            let app=new Vue({
+                el:'#app',
+                data(){
+                    return {
+                        form:{
+                            is_hot:0,
+                            is_kill:0,
+                            is_fix:0,
+                            status:1,
+                            logo:[],
+                            video:null,
+                        },
+                        category:category,
+                        status:status,
+                    }
+                },
+                methods:{
+                    addImg(type, index, multiple) {
+                        let that = this;
+                        let ext
+                        if(type==='image'){
+                            ext='image/*'
+                        }else if(type==='video'){
+                            ext='video/mp4'
+                        }
+                        parent.Fast.api.open(`general/attachment/select?mimetype=${ext}&multiple=` + multiple, "选择图片", {
+                            callback: function (data) {
+                                switch (type) {
+                                    case "image":
+                                        that.form.logo.push(data.url)
+                                        break;
+                                    case "video":
+                                        that.form.video=data.url
+                                        break;
+                                }
+                            }
+                        });
+                        return false;
+                    },
+                    delImg(index) {
+                        this.form.logo.splice(index,1)
+                    },
+                    delVideo(){
+                        this.form.video=null
                     }
-                })
-                $('.amountSet').append(item[0].outerHTML)
-                $('.amountSetKill').append(item[0].outerHTML.replace(/\[amount_ladder]/g,'[amount_kill_ladder]'))
-            })
-            $(document).on('click','.delSku,.delDetail',function (){
-                let className=$(this).parent()[0].className
-                if($(this).parent().parent().find(`.${className}`).length===1){
-                    return
-                }
-                $('.amountItem').eq($(this).parent().index()).remove()
-                $(this).parent().remove()
-            })
-            $(document).on('click','.delAmountItem',function (){
-                let className=$(this).parent()[0].className
-                if($(this).parent().parent().find(`.${className}`).length===1){
-                    return
                 }
-                $(this).parent().remove()
-            })
-            $('.btnAddDetail').click(function (){
-                let a=$($(this).parent().prev()[0].outerHTML),key=Date.now(),m=$(this).data('m')
-                a.find('.id').attr('name',`row[${m}][${key}][id]`)
-                a.find('.name').attr('name',`row[${m}][${key}][name]`)
-                a.find('.value').attr('name',`row[${m}][${key}][value]`)
-                $(this).parent().before(a[0].outerHTML.replace(/value="\S+"/ig,''))
-            })
-            $(document).on('input','.skuName',function (){
-                let val=this.value,idx=$(this).parent().index()
-                $('.amountSet .amountItem').eq(idx).find('.itemName').text(val)
-                $('.amountSetKill .amountItem').eq(idx).find('.itemName').text(val)
-            })
-            $(document).on('click','.addAmountDetail',function (){
-                let key=Date.now()
-                let a=$($(this).prev()[0].outerHTML.replace(/\[__\d+]/g,`[__${key}]`))
-                $(this).before(a[0].outerHTML.replace(/value="\S+"/ig,''))
             })
         },
         api: {

+ 321 - 0
public/assets/js/backend/goods.old.js

@@ -0,0 +1,321 @@
+define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
+
+    var Controller = {
+        index: function () {
+            // 初始化表格参数配置
+            Table.api.init({
+                extend: {
+                    index_url: 'goods/index' + location.search,
+                    add_url: 'goods/add',
+                    edit_url: 'goods/edit',
+                    del_url: 'goods/del',
+                    multi_url: 'goods/multi',
+                    import_url: 'goods/import',
+                    bind_url: 'goods/bind_goods',
+                    statistics_url: 'goods/goods_statistics',
+                    amount_rank_url: 'goods/goods_buy_rank',
+                    order_amount_rank_url: 'goods/order_amount_rank',
+                    order_num_rank_url: 'goods/order_num_rank',
+                    table: 'goods',
+                }
+            });
+            let extend=$.fn.bootstrapTable.defaults.extend
+            var table = $("#table");
+
+            // 初始化表格
+            table.bootstrapTable({
+                url: $.fn.bootstrapTable.defaults.extend.index_url,
+                pk: 'id',
+                sortName: 'id',
+                searchFormVisible:true,
+                columns: [
+                    [
+                        {checkbox: true},
+                        {field: 'id', title: __('Id')},
+                        {field: 'name', title: __('Name'),formatter: Table.api.formatter.content,width:200},
+                        {field: 'category.name', title: __('分类'),formatter: Table.api.formatter.label,operate: "like"},
+                        {field: 'brand', title: __('Brand')},
+                        //{field: 'amount', title: __('售价'), operate:'BETWEEN'},
+                        //{field: 'amount_kill', title: __('Amount_kill'), operate:'BETWEEN'},
+                        {field: 'is_hot', title: __('Is_hot'),formatter:Table.api.formatter.label,searchList:{0:'否',1:'是'}},
+                        {field: 'is_kill', title: __('Is_kill'),formatter:Table.api.formatter.label,searchList:{0:'否',1:'是'}},
+                        {field: 'status', title: __('状态'),formatter:Table.api.formatter.label,searchList:goodsStatus},
+                        {field: 'num_sell', title: __('Num_sell')},
+                        {field: 'create_time', title: __('Create_time'),formatter: Table.api.formatter.datetime,addClass:'datetimerange'},
+                        //{field: 'update_time', title: __('Update_time'),formatter: Table.api.formatter.datetime,addClass:'datetimerange'},
+
+                        {field:'',title:'统计',table: table,events: Table.api.events.operate,formatter: Table.api.formatter.buttons,operate: false,
+                            buttons:[
+                                {
+                                    name: 'detail',
+                                    text: __('商品组合'),
+                                    title: __('商品组合'),
+                                    classname: 'btn btn-xs btn-primary btn-dialog',
+                                    icon: 'fa',
+                                    url: extend.bind_url,
+                                    callback: function (data) {
+                                    },
+                                    visible: function (row) {
+                                        return table.data('operate-bind_goods');
+                                    }
+                                },
+                                {
+                                    name: 'detail',
+                                    text: __('数据统计'),
+                                    title: __('数据统计'),
+                                    classname: 'btn btn-xs btn-info btn-dialog',
+                                    icon: 'fa',
+                                    url: extend.statistics_url,
+                                    extend:`data-area='["800px","80%"]'`,
+                                    callback: function (data) {
+                                    },
+                                    visible: function (row) {
+                                        return table.data('operate-buy_rank');
+                                    }
+                                },
+                                {
+                                    name: 'detail',
+                                    text: __('采购金额排名'),
+                                    title: __('采购金额排名'),
+                                    classname: 'btn btn-xs btn-info btn-dialog',
+                                    icon: 'fa',
+                                    url: extend.amount_rank_url,
+                                    extend:`data-area='["800px","80%"]'`,
+                                    callback: function (data) {
+                                    },
+                                    visible: function (row) {
+                                        return table.data('operate-buy_rank');
+                                    }
+                                },
+                                {
+                                    name: 'detail',
+                                    text: __('订单金额排名'),
+                                    title: __('订单金额排名'),
+                                    classname: 'btn btn-xs btn-info btn-dialog',
+                                    icon: 'fa',
+                                    url: extend.order_amount_rank_url,
+                                    extend:`data-area='["800px","80%"]'`,
+                                    callback: function (data) {
+                                    },
+                                    visible: function (row) {
+                                        return table.data('operate-order_amount_rank');
+                                    }
+                                },
+                                {
+                                    name: 'detail',
+                                    text: __('订单笔数排名'),
+                                    title: __('订单笔数排名'),
+                                    classname: 'btn btn-xs btn-info btn-dialog',
+                                    icon: 'fa',
+                                    url: extend.order_num_rank_url,
+                                    extend:`data-area='["800px","80%"]'`,
+                                    callback: function (data) {
+                                    },
+                                    visible: function (row) {
+                                        return table.data('operate-order_num_rank');
+                                    }
+                                },
+                            ]},
+                        {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate},
+                    ]
+                ],
+                onLoadSuccess(){
+                    setTimeout(()=>{
+                        $('.btn-editone').attr('data-area','["100%","100%"]')
+                    },100)
+                }
+            });
+
+            $(document).on('click','.bindGoods',function (){
+                let id=$(this).data('id')
+                Fast.api.open(extend.bind_url+`/id/${id}`,'绑定商品')
+            })
+
+            // 为表格绑定事件
+            Table.api.bindevent(table);
+        },
+        add: function () {
+            this.editor()
+            Controller.api.bindevent();
+        },
+        edit: function () {
+            this.editor()
+            Controller.api.bindevent();
+        },
+        goods_statistics(){
+            //Controller.api.bindevent();
+            Form.events.daterangepicker($('.form'))
+            $('.doSearch').click(()=>{
+                layer.load()
+            })
+        },
+        goods_buy_rank(){
+            Table.api.init()
+            var table = $("#table");
+            // 初始化表格
+            table.bootstrapTable({
+                url: location.href,
+                pk: 'id',
+                sortName: 'id',
+                searchFormVisible:true,
+                showExport:false,
+                commonSearch:true,
+                search:false,
+                columns: [
+                    [
+                        {field: 'rank', title: __('排名'),operate:false,},
+                        {field: 'nickname', title: __('用户名'),operate:false,},
+                        {field: 'amount', title: __('金额'),operate:false,},
+                        {field: 'date', title: __('时间'),operate:'range',addClass:'datetimerange',visible:false},
+                    ]
+                ]
+            });
+            Table.api.bindevent(table);
+        },
+        order_amount_rank(){
+            Table.api.init()
+            var table = $("#table");
+            // 初始化表格
+            table.bootstrapTable({
+                url: location.href,
+                pk: 'id',
+                sortName: 'id',
+                searchFormVisible:true,
+                showExport:false,
+                commonSearch:true,
+                search:false,
+                columns: [
+                    [
+                        {field: 'rank', title: __('排名'),operate: false,},
+                        {field: 'order_no', title: __('订单号'),operate: false,},
+                        {field: 'nickname', title: __('用户名'),operate: false,},
+                        {field: 'amount', title: __('金额'),operate: false,},
+                        {field: 'date', title: __('时间'),operate:'range',addClass:'datetimerange',visible:false},
+                    ]
+                ]
+            });
+            Table.api.bindevent(table);
+        },
+        order_num_rank(){
+            Table.api.init()
+            var table = $("#table");
+            // 初始化表格
+            table.bootstrapTable({
+                url: location.href,
+                pk: 'id',
+                sortName: 'id',
+                searchFormVisible:true,
+                showExport:false,
+                commonSearch:true,
+                search:false,
+                columns: [
+                    [
+                        {field: 'rank', title: __('排名'),operate: false,},
+                        {field: 'nickname', title: __('用户名'),operate: false,},
+                        {field: 'num', title: __('笔数'),operate: false,},
+                        {field: 'date', title: __('时间'),operate:'range',addClass:'datetimerange',visible:false},
+                    ]
+                ]
+            });
+            Table.api.bindevent(table);
+        },
+        editor(){
+            $('.btnAddSku').click(function (){
+                let key=Date.now()
+                let a=$($('.skuItem')[0].outerHTML.replace(/\[_\d+]/g,`[_${key}]`))
+                $(this).parent().before(a[0].outerHTML.replace(/value="\S+"/ig,''))
+
+                //添加价格
+                let html=$('.amountItem')[0].outerHTML.replace(/\[_\d+]/g,`[_${key}]`)
+                let item=$(html)
+                item.find('.itemName').text('')
+                item.find('.amountItemOne').each(function (idx){
+                    if(idx>0){
+                        $(this).remove()
+                    }
+                })
+                $('.amountSet').append(item[0].outerHTML)
+                item.find('.skuBase').remove()
+                $('.amountSetKill').append(item[0].outerHTML.replace(/\[amount_ladder]/g,'[amount_kill_ladder]'))
+            })
+            $('.btnAddSize').click(function (){
+                let key=Date.now()
+                let a=$($('.skuItem')[0].outerHTML.replace(/\[_\d+]/g,`[_${key}]`))
+                $(this).parent().before(a[0].outerHTML.replace(/value="\S+"/ig,''))
+
+                //添加价格
+                let html=$('.amountItem')[0].outerHTML.replace(/\[_\d+]/g,`[_${key}]`)
+                let item=$(html)
+                item.find('.itemName .itemSize').text('')
+                item.find('.itemName .itemSpec').text('')
+                item.find('.amountItemOne').each(function (idx){
+                    if(idx>0){
+                        $(this).remove()
+                    }
+                })
+                $('.amountSet').append(item[0].outerHTML)
+                item.find('.skuBase').remove()
+                $('.amountSetKill').append(item[0].outerHTML.replace(/\[amount_ladder]/g,'[amount_kill_ladder]'))
+            })
+            $(document).on('click','.delSku,.delDetail',function (){
+                let className=$(this).parent()[0].className
+                if($(this).parent().parent().find(`.${className}`).length===1){
+                    return
+                }
+                $('.amountItem').eq($(this).parent().index()).remove()
+                $(this).parent().remove()
+            })
+            $(document).on('click','.delAmountItem',function (){
+                let className=$(this).parent()[0].className
+                if($(this).parent().parent().find(`.${className}`).length===1){
+                    return
+                }
+                $(this).parent().remove()
+            })
+            $('.btnAddDetail').click(function (){
+                let a=$($(this).parent().prev()[0].outerHTML),key=Date.now(),m=$(this).data('m')
+                a.find('.id').attr('name',`row[${m}][${key}][id]`)
+                a.find('.name').attr('name',`row[${m}][${key}][name]`)
+                a.find('.value').attr('name',`row[${m}][${key}][value]`)
+                $(this).parent().before(a[0].outerHTML.replace(/value="\S+"/ig,''))
+            })
+            $(document).on('input','.skuName',function (){
+                let val=this.value,idx=$(this).parent().index()
+                $('.amountSet .amountItem').eq(idx).find('.itemName').text(val)
+                $('.amountSetKill .amountItem').eq(idx).find('.itemName').text(val)
+            })
+            $(document).on('click','.addAmountDetail',function (){
+                let key=Date.now()
+                let a=$($(this).prev()[0].outerHTML.replace(/\[__\d+]/g,`[__${key}]`))
+                $(this).before(a[0].outerHTML.replace(/value="\S+"/ig,''))
+            })
+        },
+        api: {
+            bindevent: function () {
+                Form.api.bindevent($("form[role=form]"));
+            }
+        },
+        bind_goods(){
+            Controller.api.bindevent();
+            $('.skuItem input[type=radio]').change(function (){
+                getGoods(goods.id,this.value)
+            })
+
+            let getGoods=(goods_id,sku_id)=>{
+                let idx=layer.load()
+                $.post('',{e:'get',sku_id,goods_id},function (res){
+                    if(res.data.length) {
+                        $('#c-name').val(res.data.join(','))
+                    }else{
+                        $('#c-name').selectPageClear()
+                    }
+                    $('#c-name').selectPageRefresh();
+                    layer.close(idx)
+                })
+            }
+
+            $('.firstSku').trigger('click')
+        }
+    };
+    return Controller;
+});

二进制
public/images/close.png