goods.html 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title></title>
  5. #parse("sys/header.html")
  6. <style>
  7. .upload-list {
  8. display: inline-block;
  9. width: 60px;
  10. height: 60px;
  11. text-align: center;
  12. line-height: 60px;
  13. border: 1px solid transparent;
  14. border-radius: 4px;
  15. overflow: hidden;
  16. background: #fff;
  17. position: relative;
  18. box-shadow: 0 1px 1px rgba(0, 0, 0, .2);
  19. margin-right: 4px;
  20. }
  21. .upload-list img {
  22. width: 100%;
  23. height: 100%;
  24. }
  25. .upload-list-cover {
  26. display: none;
  27. position: absolute;
  28. top: 0;
  29. bottom: 0;
  30. left: 0;
  31. right: 0;
  32. background: rgba(0, 0, 0, .6);
  33. }
  34. .upload-list:hover .upload-list-cover {
  35. display: block;
  36. }
  37. .upload-list-cover i {
  38. color: #fff;
  39. font-size: 20px;
  40. cursor: pointer;
  41. margin: 0 2px;
  42. }
  43. .hselect {
  44. margin: 0;
  45. padding: 0;
  46. }
  47. </style>
  48. </head>
  49. <body>
  50. <div id="rrapp" v-cloak>
  51. <div v-show="showList">
  52. <Row :gutter="16">
  53. <div class="search-group">
  54. <i-col span="4">
  55. <i-input v-model="q.goodsSn" @on-enter="query" placeholder="商品编码"/>
  56. </i-col>
  57. <i-col span="4">
  58. <i-input v-model="q.name" @on-enter="query" placeholder="名称"/>
  59. </i-col>
  60. <i-col span="4">
  61. <i-select v-model="q.category" placeholder="商品分类" filterable @on-change="changeQueryCategories"
  62. label-in-value>
  63. <i-option v-for="category in queryCategories" :value="category.id"
  64. :key="category.id">{{category.name}}
  65. </i-option>
  66. </i-select>
  67. </i-col>
  68. <i-col span="4">
  69. <i-select v-model="q.categoryTwo" placeholder="商品二级分类" filterable label-in-value>
  70. <i-option v-for="category in queryCategoriesTwo" :value="category.id"
  71. :key="category.id">{{category.name}}
  72. </i-option>
  73. </i-select>
  74. </i-col>
  75. <i-button @click="query">查询</i-button>
  76. <i-button @click="reloadSearch">重置</i-button>
  77. </div>
  78. <div class="buttons-group">
  79. #if($shiro.hasPermission("goods:save"))
  80. <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
  81. #end
  82. #if($shiro.hasPermission("goods:update"))
  83. <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
  84. #end
  85. #if($shiro.hasPermission("goods:delete"))
  86. <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
  87. #end
  88. <i-button type="primary" @click="enSale"><i class="fa fa-hand-o-up"></i>&nbsp;上架</i-button>
  89. <i-button type="dashed" @click="unSale"><i class="fa fa-hand-o-down"></i>&nbsp;下架</i-button>
  90. </div>
  91. </Row>
  92. <table id="jqGrid"></table>
  93. <div id="jqGridPager"></div>
  94. </div>
  95. <Card v-show="!showList">
  96. <p slot="title">{{title}}</p>
  97. <i-form ref="formValidate" :model="goods" :rules="ruleValidate" :label-width="140">
  98. <Tabs value="name1">
  99. <Tab-Pane label="通用信息" name="name1">
  100. <!--<i-form ref="formValidate" :model="goods" :rules="ruleValidate" :label-width="80">-->
  101. <Form-item label="商品类型" prop="categoryId">
  102. <!--<i-input v-model="goods.categoryName" @on-click="categoryTree" icon="eye" readonly="readonly" placeholder="商品类型"/>-->
  103. <i-select v-model="goods.attributeCategory" placeholder="商品分类" filterable @on-change="changeCategories"
  104. label-in-value style="width: 268px;">
  105. <i-option v-for="category in categories" :value="category.id"
  106. :key="category.id">{{category.name}}
  107. </i-option>
  108. </i-select>
  109. <i-select v-model="goods.categoryId" placeholder="商品二级分类" filterable
  110. label-in-value style="width: 268px;">
  111. <i-option v-for="category in categoriesTwo" :value="category.id"
  112. :key="category.id">{{category.name}}
  113. </i-option>
  114. </i-select>
  115. </Form-item>
  116. <Form-item label="商品编码" prop="goodsSn">
  117. <i-input v-model="goods.goodsSn" placeholder="商品编码"/>
  118. </Form-item>
  119. <Form-item label="名称" prop="name">
  120. <i-input v-model="goods.name" placeholder="名称"/>
  121. </Form-item>
  122. <!--<Form-item label="类别" prop="attributeCategory" style="width: 268px;">
  123. <i-select v-model="goods.attributeCategory" filterable label-in-value>
  124. <i-option v-for="attributeCategory in attributeCategories" :value="attributeCategory.id" :key="attributeCategory.id">{{attributeCategory.name}}
  125. </i-option>
  126. </i-select>
  127. </Form-item>-->
  128. <Form-item label="SKU" prop="sku">
  129. <i-input v-model="goods.sku" placeholder="SKU" style="width: 268px;"/>
  130. </Form-item>
  131. <Form-item label="货品业务类型" prop="goodsBizType" >
  132. <i-select v-model="goods.goodsBizType" filterable placeholder="货品业务类型"
  133. label-in-value style="width: 268px;">
  134. <i-option v-for="macro in macros" :value="macro.value" :key="macro.id">{{macro.name}}
  135. </i-option>
  136. </i-select>
  137. </Form-item>
  138. <Form-item label="品牌" prop="brandId">
  139. <i-select v-model="goods.brandId" filterable placeholder="品牌"
  140. label-in-value style="width: 268px;">
  141. <i-option v-for="brand in brands" :value="brand.id" :key="brand.id">{{brand.name}}
  142. </i-option>
  143. </i-select>
  144. </Form-item>
  145. <Form-item label="运费模版" prop="freightId">
  146. <i-select v-model="goods.freightId" filterable placeholder="运费模版"
  147. label-in-value style="width: 268px;">
  148. <i-option v-for="freight in freights" :value="freight.id" :key="freight.id">{{freight.name}}
  149. </i-option>
  150. </i-select>
  151. </Form-item>
  152. <Form-item label="市场价" prop="marketPrice">
  153. <Input-number :min="0.01" :step="0.01" v-model="goods.marketPrice" placeholder="市场价" style="width: 268px;"/>
  154. </Form-item>
  155. <Form-item label="零售价" prop="retailPrice">
  156. <Input-number :min="0.01" :step="0.01" v-model="goods.retailPrice" placeholder="零售价" style="width: 268px;"/>
  157. </Form-item>
  158. <Form-item label="商品税率(0.00)" prop="goodsRate">
  159. <Input-number :min="0.001" :step="0.001" v-model="goods.goodsRate" placeholder="商品税率" style="width: 268px;"/>
  160. </Form-item>
  161. <Row>
  162. <i-col span="16">
  163. <Form-item label="商品主图" prop="primaryPicUrl">
  164. <i-input v-model="goods.primaryPicUrl" placeholder="商品主图" readonly/>
  165. </Form-item>
  166. </i-col>
  167. <i-col span="4">
  168. <Form-item :label-width="1">
  169. <Upload style="width: 300px;" action="../sys/oss/upload" :format="['jpg','jpeg','png']"
  170. max-size="2048"
  171. :on-success="handleSuccessPicUrl" :on-format-error="handleFormatError"
  172. :show-upload-list="false"
  173. :on-exceeded-size="handleMaxSize">
  174. <i-button icon="ios-cloud-upload-outline">上传图片</i-button>
  175. </Upload>
  176. </Form-item>
  177. </i-col>
  178. <i-col span="4">
  179. <Form-item :label-width="1">
  180. <i-button icon="eye" @click="eyeImagePicUrl">预览图片</i-button>
  181. </Form-item>
  182. </i-col>
  183. </Row>
  184. <Row>
  185. <i-col span="16">
  186. <Form-item label="商品列表图" prop="listPicUrl">
  187. <i-input v-model="goods.listPicUrl" placeholder="商品列表图" readonly/>
  188. </Form-item>
  189. </i-col>
  190. <i-col span="4">
  191. <Form-item :label-width="1">
  192. <Upload style="width: 300px;" action="../sys/oss/upload" :format="['jpg','jpeg','png']"
  193. max-size="2048"
  194. :on-success="handleSuccessListPicUrl" :on-format-error="handleFormatError"
  195. :show-upload-list="false"
  196. :on-exceeded-size="handleMaxSize">
  197. <i-button icon="ios-cloud-upload-outline">上传图片</i-button>
  198. </Upload>
  199. </Form-item>
  200. </i-col>
  201. <i-col span="4">
  202. <Form-item :label-width="1">
  203. <i-button icon="eye" @click="eyeImageListPicUrl">预览图片</i-button>
  204. </Form-item>
  205. </i-col>
  206. </Row>
  207. <!--</i-form>-->
  208. </Tab-Pane>
  209. <Tab-Pane label="海关信息" name="name2">
  210. <!--<i-form ref="formValidate" :model="goods" :rules="ruleValidate" :label-width="80">-->
  211. <Form-item label="产品品牌" prop="brand">
  212. <i-input v-model="goods.brand" placeholder="产品品牌"/>
  213. </Form-item>
  214. <Form-item label="产品条码" prop="prodBarcode">
  215. <i-input v-model="goods.prodBarcode" placeholder="产品条码"/>
  216. </Form-item>
  217. <Form-item label="海关备案编号" prop="cusRecCode">
  218. <i-input v-model="goods.cusRecCode" placeholder="海关备案编号"/>
  219. </Form-item>
  220. <Form-item label="计量单位代码" prop="unitCode">
  221. <i-input v-model="goods.unitCode" placeholder="计量单位代码"/>
  222. </Form-item>
  223. <Form-item label="海关商品编码" prop="cusGoodsCode">
  224. <i-input v-model="goods.cusGoodsCode" placeholder="海关商品编码"/>
  225. </Form-item>
  226. <Form-item label="国检规格型号" prop="ciqProdModel" >
  227. <i-input v-model="goods.ciqProdModel" placeholder="国检规格型号"/>
  228. </Form-item>
  229. <Form-item label="原产国代码" prop="oriCntCode">
  230. <i-input v-model="goods.oriCntCode" placeholder="原产国代码"/>
  231. </Form-item>
  232. <Form-item label="海关申报要素" prop="cusDeclEle">
  233. <i-input v-model="goods.cusDeclEle" placeholder="海关申报要素"/>
  234. </Form-item>
  235. <!--</i-form>-->
  236. </Tab-Pane>
  237. <!--<Tab-Pane label="规格" name="name3">
  238. &lt;!&ndash;<i-form ref="formValidate" :model="goods" :rules="ruleValidate" :label-width="80">&ndash;&gt;
  239. <table class="table table-bordered">
  240. <tr>
  241. <td style="text-align: center; width: 200px">编码</td>
  242. <td style="text-align: center; width: 100px">商品默认</td>
  243. &lt;!&ndash;<td style="text-align: center; width: 100px">规格</td>&ndash;&gt;
  244. <td style="text-align: center;">规格说明</td>
  245. <td style="text-align: center; width: 90px">操作</td>
  246. </tr>
  247. <tr v-for="(item,index) in productEntityList" v-show="item.isDelete==0">
  248. <td>
  249. <i-input v-model="item.goodsSn" placeholder="商品编码"/>
  250. </td>
  251. <td>
  252. <select class="hselect" v-model="item.goodsDefault" filterable label-in-value>
  253. <option value="1">是</option>
  254. <option value="0">否</option>
  255. </select>
  256. </td>
  257. <td>
  258. <i-input v-model="item.goodsSpecificationNameValue" placeholder="规格说明"/>
  259. </td>
  260. <td>
  261. <button v-if="index == 0" class="btn btn-primary btn-sm" type="button"
  262. @click="addSpeRow">
  263. <i class="fa fa-plus"></i>
  264. </button>
  265. <button class="btn red btn-sm" type="button" @click="delSpeRow(index)">
  266. <i class="fa fa-trash-o"></i>
  267. </button>
  268. </td>
  269. </tr>
  270. </table>
  271. &lt;!&ndash;</i-form>&ndash;&gt;
  272. </Tab-Pane>-->
  273. <Tab-Pane label="详细描述" name="name4">
  274. <template>
  275. <div class="upload-list" v-for="item in uploadList">
  276. <template v-if="item.status === 'finished'">
  277. <img :src="item.imgUrl"/>
  278. <div class="upload-list-cover">
  279. <Icon type="ios-eye-outline" @click.native="handleView(item.imgUrl)"></Icon>
  280. <Icon type="ios-trash-outline" @click.native="handleRemove(item)"></Icon>
  281. </div>
  282. </template>
  283. <template v-else>
  284. <Progress v-if="item.showProgress" :percent="item.percentage" hide-info></Progress>
  285. </template>
  286. </div>
  287. <Upload
  288. ref="upload"
  289. :show-upload-list="false"
  290. :default-file-list="uploadList"
  291. :on-success="handleSuccess"
  292. :format="['jpg','jpeg','png']"
  293. :max-size="2048"
  294. :on-format-error="handleFormatError"
  295. :on-exceeded-size="handleMaxSize"
  296. :before-upload="handleBeforeUpload"
  297. multiple
  298. type="drag"
  299. action="../sys/oss/upload"
  300. style="display: inline-block;width:58px;">
  301. <div style="width: 58px;height:58px;line-height: 58px;">
  302. <Icon type="camera" size="20"></Icon>
  303. </div>
  304. </Upload>
  305. <Modal title="查看图片" v-model="visible">
  306. <img :src="imgName" v-if="visible" style="width: 100%"/>
  307. </Modal>
  308. </template>
  309. <div id="goodsDesc"></div>
  310. </Tab-Pane>
  311. <Tab-Pane label="参数" name="name5">
  312. <!--<i-form ref="formValidate" :model="goods" :rules="ruleValidate" :label-width="80">-->
  313. <div v-for="(item,index) in attributeEntityList" v-show="item.isDelete==0">
  314. <div class="row">
  315. <div class="col-md-3">
  316. <label class="ivu-form-item-label">属性:</label>
  317. <div class="col-md-7 input-icon right">
  318. <i-select v-model="item.attributeId" filterable>
  319. <i-option v-for="attribute in attributes" :value="attribute.id"
  320. :key="attribute.id">{{attribute.name}}
  321. </i-option>
  322. </i-select>
  323. </div>
  324. </div>
  325. <div class="col-md-3">
  326. <label class="ivu-form-item-label">属性值:</label>
  327. <div class="col-md-7 input-icon right">
  328. <i-input type="text" v-model="item.value"/>
  329. </div>
  330. </div>
  331. <button v-if="index == 0" class="btn btn-primary btn-sm" type="button" @click="addAttrRow">
  332. <i class="fa fa-plus"></i>
  333. </button>
  334. <button class="btn red btn-sm" type="button" @click="delAttrRow(index)">
  335. <i class="fa fa-trash-o"></i>
  336. </button>
  337. </div>
  338. </div>
  339. <!--</i-form>-->
  340. </Tab-Pane>
  341. <Tab-Pane label="其他信息" name="name6">
  342. <!--<i-form ref="formValidate" :model="goods" :rules="ruleValidate" :label-width="80">-->
  343. <Form-item label="排序" prop="sortOrder">
  344. <Input-number :min="1" :step="1" v-model="goods.sortOrder" placeholder="排序" style="width: 188px;"/>
  345. </Form-item>
  346. <Form-item label="上架" prop="isOnSale">
  347. <Radio-group v-model="goods.isOnSale">
  348. <Radio label="0">
  349. <span>否</span>
  350. </Radio>
  351. <Radio label="1">
  352. <span>是</span>
  353. </Radio>
  354. </Radio-group>
  355. </Form-item>
  356. <Form-item label="热销" prop="isHot">
  357. <Radio-group v-model="goods.isHot">
  358. <Radio label="0">
  359. <span>否</span>
  360. </Radio>
  361. <Radio label="1">
  362. <span>是</span>
  363. </Radio>
  364. </Radio-group>
  365. </Form-item>
  366. <Form-item label="推广描述" prop="promotionDesc">
  367. <i-input v-model="goods.promotionDesc" placeholder="推广描述"/>
  368. </Form-item>
  369. <Form-item label="简明介绍" prop="goodsBrief">
  370. <i-input v-model="goods.goodsBrief" placeholder="简明介绍"/>
  371. </Form-item>
  372. <!--</i-form>-->
  373. </Tab-Pane>
  374. </Tabs>
  375. </i-form>
  376. <div style="padding-left: 20px">
  377. <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
  378. <i-button type="warning" @click="reload" style="margin-left: 8px"/>返回</i-button>
  379. <!--<i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>-->
  380. </div>
  381. </Card>
  382. </div>
  383. <!-- 选择类型 -->
  384. <div id="categoryLayer" style="display: none;padding: 10px;">
  385. <ul id="categoryTree" class="ztree"></ul>
  386. </div>
  387. <div id="qrcode" style="display: none;padding: 10px;">
  388. <div id="qrcodeCanvas" style="margin: 53px 0 0 93px"></div>
  389. </div>
  390. <div id="qrcImg" style="display:none">
  391. <img class="qrcImg align-center" src="">
  392. <img class="upLogo align-center-middle" src="" >
  393. </div>
  394. <script src="${rc.contextPath}/js/shop/goods.js?_${date.systemTime}"></script>
  395. </body>
  396. <style>
  397. .align-center {
  398. position:absolute;
  399. margin: auto;
  400. top:0px;
  401. bottom: 0px;
  402. right: 0px;
  403. left: 0px;
  404. }
  405. .align-center-middle {
  406. position:absolute;
  407. height: 30px;
  408. width: 30px;
  409. margin: auto;
  410. top:0px;
  411. bottom: 0px;
  412. right: 0px;
  413. left: 0px;
  414. }
  415. </style>
  416. </html>