add.vue 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. <template>
  2. <div class="app-container goods-add">
  3. <el-divider content-position="left">商品信息</el-divider>
  4. <el-form ref="addItem" :rules="rules" :model="addData" label-width="120px">
  5. <el-row :gutter="40" style="width: 600px">
  6. <el-col :span="23">
  7. <el-form-item label="商品名称:" prop="title">
  8. <el-input v-model="addData.title" placeholder="请输入商品名称"/>
  9. </el-form-item>
  10. </el-col>
  11. <el-col :span="23">
  12. <el-form-item label="商品主图:" prop="picUrl">
  13. <Upload v-model="mainPicUrl" :limit="10" />
  14. <br>
  15. <div class="tip">第一张图片将作为商品列表图片,最多上传10张,多张图片之间可随意调整位置,支持jpg、png格式上传,建议使用尺寸800x800像素以上、大小不超过1M的正方形图片;</div>
  16. </el-form-item>
  17. </el-col>
  18. </el-row>
  19. <el-row :gutter="40" style="width: 500px">
  20. <el-col :span="23">
  21. <el-form-item label="支持盲豆兑换:" prop="exchangeShow">
  22. <el-switch
  23. v-model="addData.exchangeShow"
  24. :active-value="1"
  25. :inactive-value="0"
  26. />
  27. <div class="tip">关闭则不再兑换大厅显示,不支持盲豆兑换。</div>
  28. </el-form-item>
  29. </el-col>
  30. </el-row>
  31. <el-row :gutter="40" style="width: 500px">
  32. <el-col :span="23">
  33. <el-form-item label="商品分类" prop="categoryId">
  34. <el-select
  35. v-model="addData.categoryId"
  36. placeholder="请选择商品分类"
  37. clearable
  38. >
  39. <el-option :label="item.name" :value="item.categoryId" v-for="(item, index) in goodsCategoryItemsList" :key="index" />
  40. </el-select>
  41. </el-form-item>
  42. </el-col>
  43. </el-row>
  44. <el-row :gutter="40" style="width: 500px">
  45. <el-col :span="23">
  46. <el-form-item label="商品标签">
  47. <el-select
  48. v-model="addData.tagIds"
  49. placeholder="请选择商品标签"
  50. multiple
  51. clearable
  52. >
  53. <el-option :label="item.name" :value="item.tagId" v-for="(item, index) in goodsTagItemsList" :key="index" />
  54. </el-select>
  55. </el-form-item>
  56. </el-col>
  57. </el-row>
  58. <el-divider content-position="left">价格库存</el-divider>
  59. <el-row>
  60. <el-col :span="23">
  61. <el-form-item label="启用多SKU:" prop="multiSku">
  62. <el-switch
  63. v-model="addData.multiSku"
  64. :active-value="1"
  65. :inactive-value="0"
  66. />
  67. </el-form-item>
  68. </el-col>
  69. </el-row>
  70. <el-row>
  71. <el-col :span="22">
  72. <el-form-item prop="skuList">
  73. <Spec ref="spec" @valid="update" :multiSku="addData.multiSku" />
  74. </el-form-item>
  75. </el-col>
  76. </el-row>
  77. <el-row v-if="addData.multiSku === 0" :gutter="40" style="width: 600px">
  78. <el-col :span="23">
  79. <el-form-item label="价格:" prop="value">
  80. <el-input v-model="addData.value" type="number" placeholder="请输入商品价格">
  81. <template slot="append">元</template>
  82. </el-input>
  83. </el-form-item>
  84. </el-col>
  85. <el-col :span="23">
  86. <el-form-item label="兑换盲豆数量:" prop="exchangePrice">
  87. <el-input v-model="addData.exchangePrice" type="number" placeholder="请输入盲豆数量">
  88. <template slot="append">盲豆</template>
  89. </el-input>
  90. </el-form-item>
  91. </el-col>
  92. <el-col :span="23">
  93. <el-form-item label="采购价格:" prop="cost">
  94. <el-input v-model="addData.cost" type="number" placeholder="请输入商品采购价格">
  95. <template slot="append">元</template>
  96. </el-input>
  97. </el-form-item>
  98. </el-col>
  99. <el-col :span="23">
  100. <el-form-item label="库存:" prop="quantity">
  101. <el-input v-model="addData.quantity" type="number" placeholder="请输入商品库存">
  102. <template slot="append">件</template>
  103. </el-input>
  104. </el-form-item>
  105. </el-col>
  106. </el-row>
  107. <!-- <el-divider content-position="left">商品详情</el-divider> -->
  108. <el-row>
  109. <el-col :span="22">
  110. <el-form-item label="商品详情" prop="description">
  111. <TinyEditor v-model="addData.description" />
  112. </el-form-item>
  113. </el-col>
  114. </el-row>
  115. </el-form>
  116. <br>
  117. <el-row>
  118. <el-col :span="24" style="text-align: center">
  119. <el-button type="info" @click="$router.replace('/goods/list')">取消</el-button>
  120. <el-button type="primary" @click="updateItem()">保存</el-button>
  121. </el-col>
  122. </el-row>
  123. </div>
  124. </template>
  125. <script>
  126. import Upload from '@/components/DragImageUpload'
  127. import Spec from './components/spec'
  128. import TinyEditor from '@/components/TinyEditor'
  129. import { getGoodsDetail, addGoods } from '@/api/business/goods'
  130. import { goodsCategoryItems } from '@/api/business/category'
  131. import { goodsTagItems } from '@/api/business/tag'
  132. import { publicFileGetUrl } from "@/api/common"
  133. import { accDiv, accMul } from '@/utils/util'
  134. export default {
  135. components: {
  136. TinyEditor,
  137. Upload,
  138. Spec
  139. },
  140. data() {
  141. return {
  142. IMG_URL: publicFileGetUrl,
  143. id: this.$route.query.id,
  144. goodsCategoryItemsList: [],
  145. goodsTagItemsList: [],
  146. addData: {
  147. multiSku: 0,
  148. description: ''
  149. },
  150. rules: {
  151. title: [{ required: true, message: '请输入商品名称', trigger: 'blur' }],
  152. picUrl: [{ required: true, message: '请上传商品图片', trigger: 'change' }],
  153. categoryId: [{ required: true, message: '请选择商品分类', trigger: 'change' }],
  154. exchangeShow: [{ required: true, message: '请选择是否支持盲豆兑换', trigger: 'change' }],
  155. multiSku: [{ required: true, message: '请选择SKU类型', trigger: 'change' }],
  156. value: [
  157. { required: true, message: '请输商品入价格', trigger: 'blur' },
  158. { pattern: /^([1-9]\d*(\.\d{1,2})?|([0](\.([0][1-9]|[1-9]\d{0,1}))))$/, message: "请输入正确的金额,最多两位小数", trigger: ["blur", "change"] }
  159. ],
  160. exchangePrice: [
  161. { required: true,message:'请输入盲豆数量', trigger: 'blur' },
  162. { pattern: /^([1-9]\d*)$/, message: "请输入正确盲豆数量", trigger: ["blur", "change"] }
  163. ],
  164. cost: [
  165. { required: false, message: '请输入采购价格', trigger: 'blur' },
  166. { pattern: /^([1-9]\d*(\.\d{1,2})?|([0](\.([0][1-9]|[1-9]\d{0,1}))))$/, message: "请输入正确的金额,最多两位小数", trigger: ["blur", "change"] }
  167. ],
  168. quantity: [
  169. { required: true, message: '请输入库存', trigger: 'blur' },
  170. { pattern: /^([1-9]\d*)$/, message: "请输入正确的数字", trigger: ["blur", "change"] }
  171. ],
  172. description: [{ required: true, message: '请输入商品详情', trigger: 'blur' }]
  173. }
  174. }
  175. },
  176. computed: {
  177. mainPicUrl: {
  178. get() {
  179. return this.addData.picUrl ? this.addData.picUrl.split(',').map(item => {
  180. return {
  181. fileName: item
  182. }
  183. }) : []
  184. },
  185. set(val) {
  186. this.$set(this.addData, 'picUrl', val.map(item => { return item.fileName }).toString())
  187. }
  188. }
  189. },
  190. created() {
  191. this.getGoodsCategoryItems()
  192. this.getGoodsTagItems()
  193. if (this.id) {
  194. getGoodsDetail(this.id).then(res => {
  195. const { goodsId, title, picUrl, exchangeShow, multiSku, value, exchangePrice, cost, quantity, description, skuList, categoryId, tagIds } = res.data
  196. this.addData = {
  197. value: accDiv(value, 100),
  198. cost: cost == '' || cost == null ? '' : accDiv(cost, 100),
  199. goodsId, title, picUrl, exchangeShow, multiSku, exchangePrice, quantity, description, skuList, categoryId, tagIds
  200. }
  201. if (multiSku && skuList instanceof Array && skuList.length > 0) {
  202. this.$nextTick(() => {
  203. this.$refs.spec.setSkuList(skuList)
  204. })
  205. }
  206. })
  207. }
  208. },
  209. methods: {
  210. getGoodsCategoryItems(){
  211. goodsCategoryItems({}).then(res => {
  212. this.goodsCategoryItemsList = res && res.data
  213. })
  214. },
  215. getGoodsTagItems(){
  216. goodsTagItems({}).then(res => {
  217. this.goodsTagItemsList = res && res.data
  218. })
  219. },
  220. updateItem() {
  221. if (this.addData.multiSku == 1) {
  222. this.$refs.spec.getSkuList()
  223. } else {
  224. this.update()
  225. }
  226. },
  227. update(skuList) {
  228. this.$refs.addItem.validate((valid, items) => {
  229. if (valid) {
  230. this.addData.skuList = skuList
  231. const { value, cost,exchangePrice, description, ...rest } = this.addData
  232. addGoods({...rest, ...{
  233. value: accMul(value, 100),
  234. cost: cost == '' || cost == null ? '' : accMul(cost, 100),
  235. exchangePrice: accMul(exchangePrice, 1),
  236. description: encodeURI(description)
  237. }}).then(res => {
  238. if (res.code === 0) {
  239. this.$message({
  240. message: this.addData.goodsId ? '修改成功!' : '添加成功!',
  241. type: 'success'
  242. })
  243. this.$store.dispatch('tagsView/delView', this.$route)
  244. this.$router.go(-1)
  245. }
  246. })
  247. } else {
  248. if (items && Object.keys(items).length>0) {
  249. this.$message({
  250. message: items[Object.keys(items)[0]][0].message,
  251. type: 'warning'
  252. })
  253. }
  254. }
  255. })
  256. }
  257. }
  258. }
  259. </script>
  260. <style lang="scss">
  261. .goods-add {
  262. .tip {
  263. font-size: 12px;
  264. color: #999;
  265. }
  266. .el-divider {
  267. .is-left {
  268. color: #409EFF;
  269. font-size: 20px;
  270. font-weight: bolder;
  271. left: 10px;
  272. }
  273. }
  274. }
  275. </style>