ProductInfoDetail.vue 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. <template>
  2. <div style="margin-top: 50px">
  3. <el-form
  4. :model="value"
  5. :rules="rules"
  6. ref="productInfoForm"
  7. label-width="120px"
  8. style="width: 600px"
  9. size="small"
  10. >
  11. <el-form-item label="商品分类:" prop="productCategoryId">
  12. <el-cascader
  13. :disabled="!isEdit"
  14. v-model="selectProductCateValue"
  15. :options="productCateOptions"
  16. >
  17. </el-cascader>
  18. </el-form-item>
  19. <el-form-item label="商品名称:" prop="name">
  20. <el-input v-model="value.name" :disabled="!isEdit"></el-input>
  21. </el-form-item>
  22. <!-- <el-form-item label="副标题:" prop="subTitle">
  23. <el-input v-model="value.subTitle" :disabled="!isEdit"></el-input>
  24. </el-form-item> -->
  25. <el-form-item label="商品品牌:" prop="brandId">
  26. <el-select
  27. v-model="value.brandId"
  28. @change="handleBrandChange"
  29. :disabled="!isEdit"
  30. placeholder="请选择品牌"
  31. >
  32. <el-option
  33. v-for="item in brandOptions"
  34. :key="item.value"
  35. :label="item.label"
  36. :value="item.value"
  37. >
  38. </el-option>
  39. </el-select>
  40. </el-form-item>
  41. <!-- <el-form-item label="商品介绍:">
  42. <el-input
  43. :autoSize="true"
  44. v-model="value.description"
  45. :disabled="!isEdit"
  46. type="textarea"
  47. placeholder="请输入内容"
  48. ></el-input>
  49. </el-form-item> -->
  50. <el-form-item label="商品货号:">
  51. <el-input v-model="value.productSn" :disabled="!isEdit"></el-input>
  52. </el-form-item>
  53. <el-form-item label="商品售价:" prop="price">
  54. <el-input-number
  55. v-model="value.price"
  56. :disabled="!isEdit"
  57. autocomplete="off"
  58. controls-position="right"
  59. class="number-input"
  60. type="number"
  61. ></el-input-number>
  62. </el-form-item>
  63. <el-form-item label="市场价:" prop="originalPrice">
  64. <el-input-number
  65. v-model="value.originalPrice"
  66. type="number"
  67. autocomplete="off"
  68. controls-position="right"
  69. class="number-input"
  70. :disabled="!isEdit"
  71. ></el-input-number>
  72. </el-form-item>
  73. <!-- <el-form-item label="商品库存:">
  74. <el-input-number
  75. v-model="value.stock"
  76. type="number"
  77. autocomplete="off"
  78. controls-position="right"
  79. class="number-input"
  80. :disabled="!isEdit"
  81. ></el-input-number>
  82. </el-form-item> -->
  83. <!-- <el-form-item label="计量单位:">
  84. <el-input-number
  85. v-model="value.unit"
  86. :disabled="!isEdit"
  87. ></el-input-number>
  88. </el-form-item> -->
  89. <!-- <el-form-item label="商品重量:">
  90. <el-input-number
  91. v-model="value.weight"
  92. type="number"
  93. autocomplete="off"
  94. controls-position="right"
  95. class="number-input"
  96. style="width: 300px"
  97. :disabled="!isEdit"
  98. ></el-input-number>
  99. <span style="margin-left: 20px">克</span>
  100. </el-form-item> -->
  101. <el-form-item label="排序">
  102. <el-input-number
  103. v-model="value.sort"
  104. :disabled="!isEdit"
  105. ></el-input-number>
  106. </el-form-item>
  107. <el-form-item style="text-align: center">
  108. <el-button
  109. type="primary"
  110. size="medium"
  111. @click="handleNext('productInfoForm')"
  112. >下一步,填写商品促销</el-button
  113. >
  114. </el-form-item>
  115. </el-form>
  116. </div>
  117. </template>
  118. <script>
  119. import { fetchListWithChildren } from "@/api/productCate";
  120. import { fetchList as fetchBrandList } from "@/api/brand";
  121. import { getProduct } from "@/api/product";
  122. export default {
  123. name: "ProductInfoDetail",
  124. props: {
  125. value: Object,
  126. isEdit: {
  127. type: Boolean,
  128. default: false,
  129. },
  130. },
  131. data() {
  132. return {
  133. hasEditCreated: false,
  134. //选中商品分类的值
  135. selectProductCateValue: [],
  136. productCateOptions: [],
  137. brandOptions: [],
  138. rules: {
  139. name: [
  140. { required: true, message: "请输入商品名称", trigger: "blur" },
  141. {
  142. min: 2,
  143. max: 140,
  144. message: "长度在 2 到 140 个字符",
  145. trigger: "blur",
  146. },
  147. ],
  148. // subTitle: [
  149. // { required: true, message: "请输入商品副标题", trigger: "blur" },
  150. // ],
  151. productCategoryId: [
  152. { required: true, message: "请选择商品分类", trigger: "blur" },
  153. ],
  154. brandId: [
  155. { required: true, message: "请选择商品品牌", trigger: "blur" },
  156. ],
  157. description: [
  158. { required: true, message: "请输入商品介绍", trigger: "blur" },
  159. ],
  160. requiredProp: [
  161. { required: true, message: "该项为必填项", trigger: "blur" },
  162. ],
  163. price: [
  164. { required: true, message: "请输入商品售价", trigger: "blur" },
  165. ],
  166. originalPrice: [
  167. { required: true, message: "请输入商品市场价", trigger: "blur" },
  168. ],
  169. },
  170. };
  171. },
  172. created() {
  173. this.getProductCateList();
  174. this.getBrandList();
  175. },
  176. computed: {
  177. //商品的编号
  178. productId() {
  179. return this.value.id;
  180. },
  181. },
  182. watch: {
  183. productId: function (newValue) {
  184. console.log("productId", newValue, this.isEdit);
  185. // if(!this.isEdit)return;
  186. if (this.hasEditCreated) return;
  187. if (newValue === undefined || newValue == null || newValue === 0) return;
  188. this.handleEditCreated();
  189. },
  190. selectProductCateValue: function (newValue) {
  191. console.log(newValue, "newValue");
  192. if (newValue != null && newValue.length === 2) {
  193. this.value.productCategoryId = newValue[1];
  194. this.value.productCategoryName = this.getCateNameById(
  195. this.value.productCategoryId
  196. );
  197. } else {
  198. this.value.productCategoryId = null;
  199. this.value.productCategoryName = null;
  200. }
  201. },
  202. },
  203. methods: {
  204. //处理编辑逻辑
  205. handleEditCreated() {
  206. if (this.value.productCategoryId != null) {
  207. this.selectProductCateValue.push(this.value.cateParentId);
  208. this.selectProductCateValue.push(this.value.productCategoryId);
  209. }
  210. this.hasEditCreated = true;
  211. },
  212. getProductCateList() {
  213. console.log("获取商品分类");
  214. fetchListWithChildren().then((response) => {
  215. let list = response.data;
  216. this.productCateOptions = [];
  217. for (let i = 0; i < list.length; i++) {
  218. let children = [];
  219. if (list[i].children != null && list[i].children.length > 0) {
  220. for (let j = 0; j < list[i].children.length; j++) {
  221. children.push({
  222. label: list[i].children[j].name,
  223. value: list[i].children[j].id,
  224. });
  225. }
  226. }
  227. this.productCateOptions.push({
  228. label: list[i].name,
  229. value: list[i].id,
  230. children: children,
  231. });
  232. }
  233. });
  234. },
  235. getBrandList() {
  236. fetchBrandList({ pageNum: 1, pageSize: 100 }).then((response) => {
  237. this.brandOptions = [];
  238. let brandList = response.data.list;
  239. for (let i = 0; i < brandList.length; i++) {
  240. this.brandOptions.push({
  241. label: brandList[i].name,
  242. value: brandList[i].id,
  243. });
  244. }
  245. });
  246. },
  247. getCateNameById(id) {
  248. let name = null;
  249. for (let i = 0; i < this.productCateOptions.length; i++) {
  250. for (let j = 0; j < this.productCateOptions[i].children.length; j++) {
  251. if (this.productCateOptions[i].children[j].value === id) {
  252. name = this.productCateOptions[i].children[j].label;
  253. return name;
  254. }
  255. }
  256. }
  257. return name;
  258. },
  259. handleNext(formName) {
  260. this.$refs[formName].validate((valid) => {
  261. if (valid) {
  262. this.$emit("nextStep");
  263. } else {
  264. this.$message({
  265. message: "验证失败",
  266. type: "error",
  267. duration: 1000,
  268. });
  269. return false;
  270. }
  271. });
  272. },
  273. handleBrandChange(val) {
  274. let brandName = "";
  275. for (let i = 0; i < this.brandOptions.length; i++) {
  276. if (this.brandOptions[i].value === val) {
  277. brandName = this.brandOptions[i].label;
  278. break;
  279. }
  280. }
  281. this.value.brandName = brandName;
  282. },
  283. },
  284. };
  285. </script>
  286. <style lang="scss" scoped>
  287. input::-webkit-outer-spin-button,
  288. input::-webkit-inner-spin-button {
  289. -webkit-appearance: none;
  290. }
  291. input[type="number"] {
  292. -moz-appearance: textfield;
  293. }
  294. .number-input {
  295. ::v-deep .el-input__inner {
  296. text-align: left;
  297. }
  298. width: 100%;
  299. }
  300. </style>