add.vue 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  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">
  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-col :span="23">
  19. <el-form-item label="支持盲豆兑换:" prop="exchangeShow">
  20. <el-switch
  21. v-model="addData.exchangeShow"
  22. active-color="#13ce66"
  23. inactive-color="#ff4949"
  24. :active-value="1"
  25. :inactive-value="0"
  26. active-text="支持"
  27. inactive-text="不支持">
  28. </el-switch>
  29. <div class="tip">关闭则不再兑换大厅显示,不支持盲豆兑换。</div>
  30. </el-form-item>
  31. </el-col>
  32. </el-row>
  33. <el-divider content-position="left">价格库存</el-divider>
  34. <el-row>
  35. <el-col :span="23">
  36. <el-form-item label="启用多SKU:" prop="multiSku">
  37. <el-switch
  38. v-model="addData.multiSku"
  39. active-color="#13ce66"
  40. inactive-color="#ff4949"
  41. :active-value="1"
  42. :inactive-value="0"
  43. active-text="是"
  44. inactive-text="否"
  45. />
  46. </el-form-item>
  47. </el-col>
  48. </el-row>
  49. <el-row>
  50. <el-col :span="23">
  51. <el-form-item prop="skuList">
  52. <Spec ref="spec" @valid="update" :multiSku="addData.multiSku" />
  53. </el-form-item>
  54. </el-col>
  55. </el-row>
  56. <el-row v-if="addData.multiSku === 0" :gutter="40">
  57. <el-col :span="23">
  58. <el-form-item label="价格:" prop="value">
  59. <el-input v-model="addData.value" type="number" placeholder="请输入商品价格">
  60. <template slot="append">元</template>
  61. </el-input>
  62. </el-form-item>
  63. </el-col>
  64. <el-col :span="23">
  65. <el-form-item label="兑换盲豆数量:" prop="value">
  66. <el-input v-model="addData.value" type="number" readonly placeholder="请输入兑换盲豆数量">
  67. <template slot="append">盲豆</template>
  68. </el-input>
  69. </el-form-item>
  70. </el-col>
  71. <el-col :span="23">
  72. <el-form-item label="采购价格:" prop="cost">
  73. <el-input v-model.number="addData.cost" type="number" placeholder="请输入商品采购价格">
  74. <template slot="append">元</template>
  75. </el-input>
  76. </el-form-item>
  77. </el-col>
  78. <el-col :span="23">
  79. <el-form-item label="库存:" prop="quantity">
  80. <el-input v-model="addData.quantity" type="number" placeholder="请输入商品库存">
  81. <template slot="append">件</template>
  82. </el-input>
  83. </el-form-item>
  84. </el-col>
  85. </el-row>
  86. <!-- <el-divider content-position="left">商品详情</el-divider> -->
  87. <el-row>
  88. <el-col :span="23">
  89. <el-form-item label="商品详情" prop="description">
  90. <TinyEditor v-model="addData.description" />
  91. </el-form-item>
  92. </el-col>
  93. </el-row>
  94. </el-form>
  95. <br>
  96. <el-row>
  97. <el-col :span="24" style="text-align: right">
  98. <el-button type="primary" @click="updateItem()">发布</el-button>
  99. <el-button type="info" @click="$router.replace('/goods/list')">取消</el-button>
  100. </el-col>
  101. </el-row>
  102. </div>
  103. </template>
  104. <script>
  105. import Upload from '@/components/ImageUpload'
  106. import Spec from './components/spec'
  107. import TinyEditor from '@/components/TinyEditor'
  108. import { getGoodsDetail, addGoods } from '@/api/business/goods'
  109. import { publicFileGetUrl } from "@/api/common"
  110. import { accDiv, accMul } from '@/utils/util'
  111. export default {
  112. components: {
  113. TinyEditor,
  114. Upload,
  115. Spec
  116. },
  117. data() {
  118. return {
  119. IMG_URL: publicFileGetUrl,
  120. id: this.$route.query.id,
  121. addData: {
  122. multiSku: 0,
  123. description: ''
  124. },
  125. rules: {
  126. title: [{ required: true, message: '请输入商品名称', trigger: 'blur' }],
  127. picUrl: [{ required: true, message: '请上传商品图片', trigger: 'change' }],
  128. exchangeShow: [{ required: true, message: '请选择是否支持盲豆兑换', trigger: 'change' }],
  129. multiSku: [{ required: true, message: '请选择SKU类型', trigger: 'change' }],
  130. value: [
  131. { required: true, message: '请输入商品价格', trigger: 'blur' },
  132. { pattern: /^([1-9]\d*(\.\d{1,2})?|([0](\.([0][1-9]|[1-9]\d{0,1}))))$/, message: "请输入正确的金额,最多两位小数", trigger: ["blur", "change"] }
  133. ],
  134. exchangePrice: [
  135. { required: true, message: '请输入兑换价格', trigger: 'blur' },
  136. { pattern: /^([1-9]\d*)$/, message: "请输入正确的数字", trigger: ["blur", "change"] }
  137. ],
  138. cost: [
  139. { required: false, message: '请输入采购价格', trigger: 'blur' },
  140. { pattern: /^([1-9]\d*(\.\d{1,2})?|([0](\.([0][1-9]|[1-9]\d{0,1}))))$/, message: "请输入正确的金额,最多两位小数", trigger: ["blur", "change"] }
  141. ],
  142. quantity: [
  143. { required: true, message: '请输入库存', trigger: 'blur' },
  144. { pattern: /^([1-9]\d*)$/, message: "请输入正确的数字", trigger: ["blur", "change"] }
  145. ],
  146. description: [{ required: true, message: '请输入商品详情', trigger: 'blur' }]
  147. }
  148. }
  149. },
  150. computed: {
  151. mainPicUrl: {
  152. get() {
  153. return this.addData.picUrl ? this.addData.picUrl.split(',').map(item => {
  154. return {
  155. fileName: item
  156. }
  157. }) : []
  158. },
  159. set(val) {
  160. this.$set(this.addData, 'picUrl', val.map(item => { return item.fileName }).toString())
  161. }
  162. }
  163. },
  164. created() {
  165. if (this.id) {
  166. getGoodsDetail(this.id).then(res => {
  167. const { goodsId, title, picUrl, exchangeShow, multiSku, value, exchangePrice, cost, quantity, description, skuList } = res.data
  168. this.addData = {
  169. value: accDiv(value, 100),
  170. cost: accDiv(cost, 100),
  171. goodsId, title, picUrl, exchangeShow, multiSku, exchangePrice, quantity, description, skuList
  172. }
  173. if (multiSku && skuList instanceof Array && skuList.length > 0) {
  174. this.$nextTick(() => {
  175. this.$refs.spec.setSkuList(skuList)
  176. })
  177. }
  178. })
  179. }
  180. },
  181. methods: {
  182. updateItem() {
  183. if (this.addData.multiSku == 1) {
  184. this.$refs.spec.getSkuList()
  185. } else {
  186. this.update()
  187. }
  188. },
  189. update(skuList) {
  190. this.$refs.addItem.validate((valid, items) => {
  191. if (valid) {
  192. this.addData.skuList = skuList
  193. const { value, cost, description, ...rest } = this.addData
  194. addGoods({...rest, ...{
  195. value: accMul(value, 100),
  196. cost: accMul(cost, 100),
  197. exchangePrice: accMul(value, 100),
  198. description: encodeURI(description)
  199. }}).then(res => {
  200. if (res.code === 0) {
  201. this.$message({
  202. message: this.addData.goodsId ? '修改成功!' : '添加成功!',
  203. type: 'success'
  204. })
  205. this.$store.dispatch('tagsView/delView', this.$route)
  206. this.$router.go(-1)
  207. }
  208. })
  209. } else {
  210. if (items && Object.keys(items).length>0) {
  211. this.$message({
  212. message: items[Object.keys(items)[0]][0].message,
  213. type: 'warning'
  214. })
  215. }
  216. }
  217. })
  218. }
  219. }
  220. }
  221. </script>
  222. <style lang="scss">
  223. .goods-add {
  224. .tip {
  225. font-size: 12px;
  226. color: #999;
  227. }
  228. .el-divider {
  229. .is-left {
  230. color: #409EFF;
  231. font-size: 20px;
  232. font-weight: bolder;
  233. left: 10px;
  234. }
  235. }
  236. }
  237. </style>