basic.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536
  1. <template>
  2. <div>
  3. <el-form :model="form" :rules="rules" ref="ruleForm" label-width="150px">
  4. <div class="container add_edit">
  5. <h3 class="margin_b_20">基本信息</h3>
  6. <div>
  7. <el-form-item label="两级分类">
  8. <uni-data-picker placeholder="请选择第一级分类" popup-title="请选择第二级分类" :localdata="categoryOptions" v-model="classes"
  9. @change="onchange" @nodeclick="onnodeclick" @popupopened="onpopupopened" @popupclosed="onpopupclosed">
  10. </uni-data-picker>
  11. <!-- <el-cascader class="sele" v-model="form.categoryOneId" :options="categoryOptions" ref="cascaderObj"
  12. :props="{ checkStrictly: true, emitPath: false, value: '_id', label: 'name' }">
  13. </el-cascader> -->
  14. </el-form-item>
  15. <!-- <el-form-item label="第二级分类" prop="categoryTwoId" ref="categoryTwoId">
  16. <el-cascader class="sele" v-model="form.categoryTwoId" :options="categoryOptions" ref="cascaderObj"
  17. :props="{ checkStrictly: true, emitPath: false, value: '_id', label: 'name' }">
  18. </el-cascader>
  19. </el-form-item> -->
  20. <el-form-item label="排序">
  21. <el-input v-model.number="form.sort" type="number" min="0"></el-input>
  22. <div class="remark_txt">数字越小,排名越靠前</div>
  23. </el-form-item>
  24. <el-form-item label="商品名称" prop="name" ref="name">
  25. <el-input placeholder="请输入商品名称" v-model="form.name"></el-input>
  26. </el-form-item>
  27. </div>
  28. </div>
  29. <div class="container add_edit">
  30. <h3 class="margin_b_20">商品信息</h3>
  31. <div>
  32. <el-form-item label="图片"><uni-file-picker v-model="imgval" fileMediatype="image" returnType="array"
  33. @select="imgDelete" limit="6" @delete="Delete" /></el-form-item>
  34. <el-form-item label="限时精选">
  35. <!-- <el-checkbox v-model.number="form.limited" :true-label="1" :false-label="0">显示</el-checkbox>
  36. <div class="remark_txt">此分类将决定商品信息显示在限时精选分类下</div> -->
  37. </el-form-item>
  38. <el-form-item label="显示">
  39. <el-radio-group v-model="form.limited">
  40. <el-radio label="1">是</el-radio>
  41. <el-radio label="0">否</el-radio>
  42. </el-radio-group>
  43. <div class="remark_txt">此分类将决定商品信息显示在限时精选分类下</div>
  44. </el-form-item>
  45. <el-form-item label="热门推荐">
  46. <!-- <el-checkbox v-model.number="form.hot" :true-label="1" :false-label="0">显示</el-checkbox>
  47. <div class="remark_txt">此分类将决定商品信息显示在热门推荐分类下</div> -->
  48. </el-form-item>
  49. <el-form-item label="显示">
  50. <el-radio-group v-model="form.hot">
  51. <el-radio label="1">是</el-radio>
  52. <el-radio label="0">否</el-radio>
  53. </el-radio-group>
  54. <div class="remark_txt">此分类将决定商品信息显示在热门推荐分类下</div>
  55. </el-form-item>
  56. <!-- <el-form-item label="商品标签">
  57. <el-checkbox-group v-model="goodsDatas">
  58. <el-checkbox v-for="(item, idx) in goodsTags" :label="item.name" :key="idx"></el-checkbox>
  59. </el-checkbox-group>
  60. <div class="remark_txt">此选项表示商品所属商品</div>
  61. </el-form-item> -->
  62. <el-form-item label="服务标签">
  63. <el-checkbox-group v-model="serveDatas">
  64. <el-checkbox v-for="(item, idx) in serveTags" :label="item.id" :key="idx">{{item.tagName}}</el-checkbox>
  65. </el-checkbox-group>
  66. <div class="remark_txt">此选项表示商品对应的服务项</div>
  67. </el-form-item>
  68. <el-form-item label="商城价" prop="price" ref="price">
  69. <el-input v-model="form.price" oninput="value=value.replace(/^\D*(\d*(?:\.\d{0,2})?).*$/g, '$1')" min="0.01"></el-input>
  70. <div class="remark_txt">单位为元,最少为0.01元
  71. <!-- {{form.price}} 分 = {{form.price / 100}} 元 -->
  72. </div>
  73. </el-form-item>
  74. <el-form-item label="市场价" prop="marketPrice" ref="marketPrice">
  75. <el-input v-model="form.marketPrice" oninput="value=value.replace(/^\D*(\d*(?:\.\d{0,2})?).*$/g, '$1')" min="0.01"></el-input>
  76. <div class="remark_txt">单位为元,最少为0.01元
  77. <!-- {{form.marketPrice}} 分 = {{form.marketPrice / 100}} 元 -->
  78. </div>
  79. </el-form-item>
  80. <el-form-item label="限购量" prop="limit" ref="limit">
  81. <el-input v-model.number="form.limit" type="number" min="0"></el-input>
  82. <div class="remark_txt">0为不限购</div>
  83. </el-form-item>
  84. <el-form-item label="库存" prop="stockNum" ref="stockNum">
  85. <el-input v-model.number="form.stockNum" type="number" min="0"></el-input>
  86. </el-form-item>
  87. <el-form-item label="已出售数">{{form.saleCnt}}
  88. <!-- <el-input v-model.number="form.saleCnt" type="number" min="0"></el-input> -->
  89. <!-- <el-checkbox class="w100" v-model.number="form.showSale" :true-label="1" :false-label="0">显示
  90. </el-checkbox>
  91. <div class="remark_txt">勾选此选项将作虚拟销量</div> -->
  92. </el-form-item>
  93. <el-form-item label="显示">
  94. <el-radio-group v-model="form.showSale">
  95. <el-radio label="0">否</el-radio>
  96. <el-radio label="1">是</el-radio>
  97. </el-radio-group>
  98. <div class="remark_txt">勾选此选项将作虚拟销量</div>
  99. </el-form-item>
  100. <el-form-item label="已访问数">{{form.visitCnt}}
  101. <!-- <el-input v-model.number="form.visitCnt" type="number" min="0"></el-input> -->
  102. <!-- <el-checkbox class="w100" v-model.number="form.showVisit" :true-label="1" :false-label="0">显示
  103. </el-checkbox>
  104. <div class="remark_txt">勾选此选项将作访问销量</div> -->
  105. </el-form-item>
  106. <el-form-item label="显示">
  107. <el-radio-group v-model="form.showVisit">
  108. <el-radio label="0">否</el-radio>
  109. <el-radio label="1">是</el-radio>
  110. </el-radio-group>
  111. <div class="remark_txt">勾选此选项将作访问销量</div>
  112. </el-form-item>
  113. <el-form-item label="已收藏数">{{form.collectCnt}}
  114. <!-- <el-input v-model.number="form.collectCnt" type="number" min="0"></el-input> -->
  115. <!-- <el-checkbox class="w100" v-model="form.showCollect" :true-label="1" :false-label="0">显示
  116. </el-checkbox> -->
  117. <!-- <div class="remark_txt">勾选此选项将作收藏销量</div> -->
  118. </el-form-item>
  119. <el-form-item label="显示">
  120. <el-radio-group v-model="form.showCollect">
  121. <el-radio label="0">否</el-radio>
  122. <el-radio label="1">是</el-radio>
  123. </el-radio-group>
  124. <div class="remark_txt">勾选此选项将作收藏销量</div>
  125. </el-form-item>
  126. <!-- <el-form-item label="已分享数">{{form.shareCnt}} -->
  127. <!-- <el-input v-model.number="form.shareCnt" type="number" min="0"></el-input> -->
  128. <!-- <el-checkbox class="w100" v-model.number="form.showShare" :true-label="1" :false-label="0">显示
  129. </el-checkbox>
  130. <div class="remark_txt">勾选此选项将作分享销量</div> -->
  131. <!-- </el-form-item> -->
  132. <!-- <el-form-item label="显示">
  133. <el-radio-group v-model="form.showShare">
  134. <el-radio label="0">否</el-radio>
  135. <el-radio label="1">是</el-radio>
  136. </el-radio-group>
  137. <div class="remark_txt">勾选此选项将作分享销量</div>
  138. </el-form-item> -->
  139. <!-- <el-form-item label="下架时间" prop="sold_out_time" ref="sold_out_time">
  140. <el-date-picker v-model="form.sold_out_time" type="datetime" placeholder="下架时间" align="center"
  141. class="time" format="yyyy-MM-dd HH:mm:ss" value-format="yyyy-MM-dd HH:mm:ss"
  142. :picker-options="pickerOptions"></el-date-picker>
  143. </el-form-item> -->
  144. <el-form-item label="状态">
  145. <el-radio-group v-model="form.state">
  146. <el-radio label="2">待审核</el-radio>
  147. <el-radio label="1">销售中</el-radio>
  148. <el-radio label="0">已下架</el-radio>
  149. </el-radio-group>
  150. </el-form-item>
  151. </div>
  152. </div>
  153. </el-form>
  154. </div>
  155. </template>
  156. <script>
  157. import E from 'wangeditor';
  158. export default {
  159. data() {
  160. return {
  161. classes: "",
  162. categoryOptions: [],
  163. // categoryOneId: '',//一级分类,
  164. // categoryTwoId:'',// 二级分类
  165. goodsDatas: [],
  166. serveDatas: [],
  167. goodsTags: [],
  168. serveTags: [],
  169. servevalue:[],//服务标签
  170. form: {
  171. categoryOneId: '',//一级分类,
  172. categoryTwoId:'',// 二级分类
  173. servevalue:[],//服务标签
  174. cids: [],
  175. sort: 0,
  176. name: '',
  177. desc:'',
  178. limited: '0',
  179. hot: '0',
  180. tags: [],
  181. price: 0,
  182. marketPrice: 0,
  183. limit: 0,
  184. stockNum: 0,
  185. saleCnt: 0,
  186. showSale: 0,
  187. visitCnt: 0,
  188. showVisit: 0,
  189. collectCnt: 0,
  190. showCollect: 0,
  191. shareCnt: 0,
  192. showShare: 0,
  193. sold_out_time: '',
  194. state: '2',//0下架 1在售 2 待审核
  195. serveDatas: [],
  196. serveTags: [],
  197. imgs:[],
  198. },
  199. imgval:null,//商品图片
  200. pickerOptions: {
  201. disabledDate(time) {
  202. return time.getTime() < Date.now();
  203. }
  204. },
  205. dataId:'',
  206. rules: {
  207. categoryOneId: [{
  208. required: true,
  209. message: '请选择一级分类',
  210. trigger: 'change'
  211. }],
  212. categoryTwoId: [{
  213. required: true,
  214. message: '请选择二级分类',
  215. trigger: 'change'
  216. }],
  217. servevalue:[{
  218. required: true,
  219. message: '请选择服务标签',
  220. trigger: 'change'
  221. }],
  222. name: [{
  223. required: true,
  224. message: '请输入商品名称',
  225. trigger: 'change'
  226. }],
  227. price: [{
  228. required: true,
  229. message: '请输入商城价,必须大于0.01',
  230. trigger: 'change'
  231. }],
  232. marketPrice: [{
  233. required: true,
  234. message: '请输入市场价,必须大于0.01',
  235. trigger: 'change'
  236. }],
  237. stockNum: [{
  238. required: true,
  239. message: '请输入库存,必须大于0',
  240. trigger: 'change'
  241. }],
  242. limit: [{
  243. required: true,
  244. message: '请输入库存,必须大于0',
  245. trigger: 'change'
  246. }],
  247. sort: [{
  248. required: true,
  249. message: '请排序',
  250. trigger: 'change'
  251. }],
  252. hot: [{
  253. required: true,
  254. message: '请选择是否热门推荐',
  255. trigger: 'change'
  256. }],
  257. limited: [{
  258. required: true,
  259. message: '请选择',
  260. trigger: 'change'
  261. }],
  262. state: [{
  263. required: true,
  264. message: '请选择商品状态',
  265. trigger: 'change'
  266. }],
  267. imgs: [{
  268. required: true,
  269. message: '请选择至少一张图片',
  270. trigger: 'change'
  271. }],
  272. showCollect: [{
  273. required: true,
  274. message: '请选择是否展示收藏数',
  275. trigger: 'change'
  276. }],
  277. showSale: [{
  278. required: true,
  279. message: '请选择是否展示已售数',
  280. trigger: 'change'
  281. }],
  282. showVisit: [{
  283. required: true,
  284. message: '请选择是否展示访问数',
  285. trigger: 'change'
  286. }],
  287. showShare: [{
  288. required: true,
  289. message: '请选择是否展示分享数',
  290. trigger: 'change'
  291. }],
  292. desc: [{
  293. required: true,
  294. message: '请输入商品详情',
  295. trigger: 'change'
  296. }],
  297. // sold_out_time: [{
  298. // required: true,
  299. // message: '请选择下架时间',
  300. // trigger: 'change'
  301. // }]
  302. }
  303. };
  304. },
  305. methods: {
  306. loadData() {
  307. var _self=this
  308. // 获取分类数据
  309. _self.$axios.get("/goodsCategory/open/list",
  310. {
  311. params:{
  312. },
  313. headers:{
  314. }
  315. }).then(response => {
  316. let res = response
  317. if (res.success) {
  318. _self.categoryOptions=res.data
  319. var stateDatas = [];
  320. for (let i = 0; i < _self.categoryOptions.length; i++) {
  321. let res = JSON.parse(
  322. JSON.stringify(_self.categoryOptions[i])
  323. .replace(/name/g, 'text')
  324. .replace(/id/g, 'value')
  325. .replace(/childCategory/g, 'children')
  326. );
  327. stateDatas.push(res);
  328. }
  329. _self.categoryOptions=stateDatas
  330. if (!_self.dataId) {
  331. _self.classes=_self.categoryOptions[0].children[0].value
  332. _self.form.categoryOneId = _self.categoryOptions[0].value
  333. _self.form.categoryTwoId = _self.categoryOptions[0].children[0].value
  334. return;
  335. }
  336. } else {
  337. }
  338. }).catch(res =>{
  339. });
  340. // 获取服务标签
  341. _self.$axios.get("/serviceTag/admin/list",
  342. {
  343. params:{
  344. },
  345. headers:{
  346. 'Mall-Token': uni.getStorageSync("token")
  347. }
  348. }).then(response => {
  349. let res = response
  350. if (res.success) {
  351. res.data.list.forEach(data => {
  352. _self.form.serveTags.push(data)
  353. _self.serveTags.push(data)
  354. })
  355. // var serve = [];
  356. // for (let i = 0; i < _self.form.serveTags.length; i++) {
  357. // let res = JSON.parse(
  358. // JSON.stringify(_self.form.serveTags[i])
  359. // .replace(/tagName/g, 'text')
  360. // .replace(/id/g, 'value')
  361. // );
  362. // serve.push(res);
  363. // }
  364. // _self.form.serveTags=serve
  365. // console.log()
  366. // if (!_self.dataId) {
  367. // _self.servevalue=_self.form.serveTags[0].value
  368. // _self.form.servevalue = _self.form.serveTags[0].value
  369. // return;
  370. // }
  371. } else {
  372. }
  373. }).catch(res =>{
  374. });
  375. },
  376. onnodeclick(e) {
  377. console.log(e);
  378. },
  379. onpopupopened(e) {
  380. console.log('popupopened',e);
  381. },
  382. onpopupclosed(e) {
  383. console.log('popupclosed',e);
  384. },
  385. onchange(e) {
  386. console.log('onchange:', e);
  387. this.form.categoryOneId = e.detail.value[0].value
  388. this.form.categoryTwoId = e.detail.value[1].value
  389. },
  390. setChildren(res) {
  391. res.forEach(item => {
  392. if (item.children && item.children.length <= 0) {
  393. item.children = null;
  394. return;
  395. }
  396. this.setChildren(item.children);
  397. });
  398. },
  399. setBaseData(res) {
  400. console.log(res)
  401. this.setChildren(res[0].datas);
  402. this.categoryOptions = res[0].datas;
  403. this.goodsTags = res[1].datas.filter(x => x.type == '商品');
  404. this.serveTags = res[1].datas.filter(x => x.type == '服务');
  405. },
  406. submitData(callback) {
  407. this.$refs['ruleForm'].validate((valid, obj) => {
  408. this.$api.set_unvalidated_form_focus(this, obj);
  409. if (valid) {
  410. this.form.tags = [...this.goodsDatas, ...this.serveDatas];
  411. // let cascaderObj = this.$refs.cascaderObj.getCheckedNodes();
  412. // this.form.cids = cascaderObj[0].path;
  413. if (typeof callback === 'function') {
  414. console.log(this.form)
  415. callback(this.form, true);
  416. }
  417. } else {
  418. if (typeof callback === 'function') {
  419. console.log(this.form)
  420. callback(this.form, false);
  421. }
  422. return false;
  423. }
  424. });
  425. },
  426. imgDelete(e) {
  427. console.log(e)
  428. var img = e.tempFiles[0].file;
  429. const file = img;
  430. const formData = new FormData();
  431. formData.append('file', file);
  432. // 文件上传
  433. this.$axios.post("/file/open/",formData,
  434. {
  435. headers:{
  436. 'Content-type' : 'multipart/form-data'
  437. }
  438. }).then(response => {
  439. let res = response
  440. if (res.success) {
  441. console.log(res.data)
  442. this.form.imgs=res.data
  443. console.log(this.form.imgs)
  444. } else {
  445. uni.showToast({
  446. icon:'error',
  447. title: '请重新上传!'
  448. });
  449. }
  450. }).catch(res =>{
  451. });
  452. // this.form.imgs.splice(this.form.imgs, 1);
  453. // this.imageValue.splice(this.imageValue.findIndex(x => x.url == e.url), 1);
  454. },
  455. Delete(e) {
  456. // 删除文件
  457. this.$axios.delete("/file/open/?url="+this.form.imgs,
  458. {
  459. }).then(response => {
  460. let res = response
  461. if (res.success) {
  462. this.form.imgs=''
  463. console.log(this.form.imgs)
  464. } else {
  465. }
  466. }).catch(res =>{
  467. });
  468. },
  469. getData(callback) {
  470. this.submitData(callback);
  471. },
  472. setData(data) {
  473. console.log(data)
  474. // serveTags
  475. for(var i=0;i<this.categoryOptions.length;i++){
  476. for(var j=0;j<this.categoryOptions[i].children.length;j++)
  477. if(data.categoryTwoId==this.categoryOptions[i].children[j].value){
  478. this.classes=this.categoryOptions[i].children[j].value
  479. }
  480. }
  481. data.tags = data.tags || [];
  482. data.cids = data.cids || [];
  483. this.goodsDatas = data.tags.filter(x => this.goodsTags.find(t => t.name == x));
  484. // this.serveDatas = this.serveTags.filter(x => data.goodsServiceTags.find(t => t.id == x.id));
  485. for(var i=0;i<data.goodsServiceTags.length;i++){
  486. this.serveDatas.push(data.goodsServiceTags[i].id)
  487. }
  488. console.log(this.serveDatas)
  489. // this.form.cid = data.cid;
  490. // this.imgval=imgs.split("")
  491. var tu=[]
  492. tu.push(data.imgs)
  493. var stateDatas = [];
  494. stateDatas=tu[0].split(',')
  495. this.imgval = []
  496. for (let key in stateDatas) {
  497. console.log(stateDatas[key])
  498. this.imgval.push({
  499. id: key,
  500. url: stateDatas[key]
  501. });
  502. }
  503. console.log(this.imgval)
  504. // this.form.categoryOneId = data.categoryOneId;
  505. // this.form.categoryTwoId = data.categoryTwoId;
  506. for (const key in this.form) {
  507. if (this.form.hasOwnProperty(key) && key != 'cid') {
  508. this.form[key] = data[key];
  509. }
  510. }
  511. }
  512. },
  513. created() {
  514. this.dataId = this.$route.query.id || '';
  515. this.loadData()
  516. }
  517. };
  518. </script>
  519. <style></style>