basic.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534
  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. import { cos } from '@/util/cos.js'
  159. export default {
  160. data() {
  161. return {
  162. classes: "",
  163. categoryOptions: [],
  164. // categoryOneId: '',//一级分类,
  165. // categoryTwoId:'',// 二级分类
  166. goodsDatas: [],
  167. serveDatas: [],
  168. goodsTags: [],
  169. serveTags: [],
  170. servevalue:[],//服务标签
  171. form: {
  172. categoryOneId: '',//一级分类,
  173. categoryTwoId:'',// 二级分类
  174. servevalue:[],//服务标签
  175. cids: [],
  176. sort: 0,
  177. name: '',
  178. desc:'',
  179. limited: '0',
  180. hot: '0',
  181. tags: [],
  182. price: 0,
  183. marketPrice: 0,
  184. limit: 0,
  185. stockNum: 0,
  186. saleCnt: 0,
  187. showSale: 0,
  188. visitCnt: 0,
  189. showVisit: 0,
  190. collectCnt: 0,
  191. showCollect: 0,
  192. shareCnt: 0,
  193. showShare: 0,
  194. sold_out_time: '',
  195. state: '2',//0下架 1在售 2 待审核
  196. serveDatas: [],
  197. serveTags: [],
  198. imgs:[],
  199. },
  200. imgval:null,//商品图片
  201. pickerOptions: {
  202. disabledDate(time) {
  203. return time.getTime() < Date.now();
  204. }
  205. },
  206. dataId:'',
  207. rules: {
  208. categoryOneId: [{
  209. required: true,
  210. message: '请选择一级分类',
  211. trigger: 'change'
  212. }],
  213. categoryTwoId: [{
  214. required: true,
  215. message: '请选择二级分类',
  216. trigger: 'change'
  217. }],
  218. servevalue:[{
  219. required: true,
  220. message: '请选择服务标签',
  221. trigger: 'change'
  222. }],
  223. name: [{
  224. required: true,
  225. message: '请输入商品名称',
  226. trigger: 'change'
  227. }],
  228. price: [{
  229. required: true,
  230. message: '请输入商城价,必须大于0.01',
  231. trigger: 'change'
  232. }],
  233. marketPrice: [{
  234. required: true,
  235. message: '请输入市场价,必须大于0.01',
  236. trigger: 'change'
  237. }],
  238. stockNum: [{
  239. required: true,
  240. message: '请输入库存,必须大于0',
  241. trigger: 'change'
  242. }],
  243. limit: [{
  244. required: true,
  245. message: '请输入库存,必须大于0',
  246. trigger: 'change'
  247. }],
  248. sort: [{
  249. required: true,
  250. message: '请排序',
  251. trigger: 'change'
  252. }],
  253. hot: [{
  254. required: true,
  255. message: '请选择是否热门推荐',
  256. trigger: 'change'
  257. }],
  258. limited: [{
  259. required: true,
  260. message: '请选择',
  261. trigger: 'change'
  262. }],
  263. state: [{
  264. required: true,
  265. message: '请选择商品状态',
  266. trigger: 'change'
  267. }],
  268. imgs: [{
  269. required: true,
  270. message: '请选择至少一张图片',
  271. trigger: 'change'
  272. }],
  273. showCollect: [{
  274. required: true,
  275. message: '请选择是否展示收藏数',
  276. trigger: 'change'
  277. }],
  278. showSale: [{
  279. required: true,
  280. message: '请选择是否展示已售数',
  281. trigger: 'change'
  282. }],
  283. showVisit: [{
  284. required: true,
  285. message: '请选择是否展示访问数',
  286. trigger: 'change'
  287. }],
  288. showShare: [{
  289. required: true,
  290. message: '请选择是否展示分享数',
  291. trigger: 'change'
  292. }],
  293. desc: [{
  294. required: true,
  295. message: '请输入商品详情',
  296. trigger: 'change'
  297. }],
  298. // sold_out_time: [{
  299. // required: true,
  300. // message: '请选择下架时间',
  301. // trigger: 'change'
  302. // }]
  303. }
  304. };
  305. },
  306. methods: {
  307. loadData() {
  308. var _self=this
  309. // 获取分类数据
  310. _self.$axios.get("/goodsCategory/open/list",
  311. {
  312. params:{
  313. },
  314. headers:{
  315. }
  316. }).then(response => {
  317. let res = response
  318. if (res.success) {
  319. _self.categoryOptions=res.data
  320. var stateDatas = [];
  321. for (let i = 0; i < _self.categoryOptions.length; i++) {
  322. let res = JSON.parse(
  323. JSON.stringify(_self.categoryOptions[i])
  324. .replace(/name/g, 'text')
  325. .replace(/id/g, 'value')
  326. .replace(/childCategory/g, 'children')
  327. );
  328. stateDatas.push(res);
  329. }
  330. _self.categoryOptions=stateDatas
  331. if (!_self.dataId) {
  332. _self.classes=_self.categoryOptions[0].children[0].value
  333. _self.form.categoryOneId = _self.categoryOptions[0].value
  334. _self.form.categoryTwoId = _self.categoryOptions[0].children[0].value
  335. return;
  336. }
  337. } else {
  338. }
  339. }).catch(res =>{
  340. });
  341. // 获取服务标签
  342. _self.$axios.get("/serviceTag/admin/list",
  343. {
  344. params:{
  345. },
  346. headers:{
  347. 'Mall-Token': uni.getStorageSync("token")
  348. }
  349. }).then(response => {
  350. let res = response
  351. if (res.success) {
  352. res.data.list.forEach(data => {
  353. _self.form.serveTags.push(data)
  354. _self.serveTags.push(data)
  355. })
  356. // var serve = [];
  357. // for (let i = 0; i < _self.form.serveTags.length; i++) {
  358. // let res = JSON.parse(
  359. // JSON.stringify(_self.form.serveTags[i])
  360. // .replace(/tagName/g, 'text')
  361. // .replace(/id/g, 'value')
  362. // );
  363. // serve.push(res);
  364. // }
  365. // _self.form.serveTags=serve
  366. // console.log()
  367. // if (!_self.dataId) {
  368. // _self.servevalue=_self.form.serveTags[0].value
  369. // _self.form.servevalue = _self.form.serveTags[0].value
  370. // return;
  371. // }
  372. } else {
  373. }
  374. }).catch(res =>{
  375. });
  376. },
  377. onnodeclick(e) {
  378. console.log(e);
  379. },
  380. onpopupopened(e) {
  381. console.log('popupopened',e);
  382. },
  383. onpopupclosed(e) {
  384. console.log('popupclosed',e);
  385. },
  386. onchange(e) {
  387. console.log('onchange:', e);
  388. this.form.categoryOneId = e.detail.value[0].value
  389. this.form.categoryTwoId = e.detail.value[1].value
  390. },
  391. setChildren(res) {
  392. res.forEach(item => {
  393. if (item.children && item.children.length <= 0) {
  394. item.children = null;
  395. return;
  396. }
  397. this.setChildren(item.children);
  398. });
  399. },
  400. setBaseData(res) {
  401. console.log(res)
  402. this.setChildren(res[0].datas);
  403. this.categoryOptions = res[0].datas;
  404. this.goodsTags = res[1].datas.filter(x => x.type == '商品');
  405. this.serveTags = res[1].datas.filter(x => x.type == '服务');
  406. },
  407. submitData(callback) {
  408. this.$refs['ruleForm'].validate((valid, obj) => {
  409. this.$api.set_unvalidated_form_focus(this, obj);
  410. if (valid) {
  411. this.form.tags = [...this.goodsDatas, ...this.serveDatas];
  412. // let cascaderObj = this.$refs.cascaderObj.getCheckedNodes();
  413. // this.form.cids = cascaderObj[0].path;
  414. if (typeof callback === 'function') {
  415. console.log(this.form)
  416. callback(this.form, true);
  417. }
  418. } else {
  419. if (typeof callback === 'function') {
  420. console.log(this.form)
  421. callback(this.form, false);
  422. }
  423. return false;
  424. }
  425. });
  426. },
  427. imgDelete(e) {
  428. var img = e.tempFilePaths[0];
  429. let Key = e.tempFiles[0].name
  430. cos.postObject(
  431. {
  432. Bucket: 'jinganminsu-1320402385',
  433. Region: 'ap-nanjing',
  434. Key: Key,
  435. FilePath: img,
  436. onProgress: (info) => {
  437. // console.log(info)
  438. }
  439. },
  440. (err, data) => {
  441. if (err) {
  442. console.log('上传失败', err)
  443. } else {
  444. console.log('上传成功', data)
  445. uni.hideLoading()
  446. let imgUrl = 'https://' + data.Location
  447. this.form.imgs =imgUrl
  448. }
  449. }
  450. )
  451. },
  452. Delete(e) {
  453. // 删除文件
  454. this.$axios.delete("/file/open/?url="+this.form.imgs,
  455. {
  456. }).then(response => {
  457. let res = response
  458. if (res.success) {
  459. this.form.imgs=''
  460. console.log(this.form.imgs)
  461. } else {
  462. }
  463. }).catch(res =>{
  464. });
  465. },
  466. getData(callback) {
  467. this.submitData(callback);
  468. },
  469. setData(data) {
  470. console.log(data)
  471. // serveTags
  472. for(var i=0;i<this.categoryOptions.length;i++){
  473. for(var j=0;j<this.categoryOptions[i].children.length;j++)
  474. if(data.categoryTwoId==this.categoryOptions[i].children[j].value){
  475. this.classes=this.categoryOptions[i].children[j].value
  476. }
  477. }
  478. data.tags = data.tags || [];
  479. data.cids = data.cids || [];
  480. this.goodsDatas = data.tags.filter(x => this.goodsTags.find(t => t.name == x));
  481. // this.serveDatas = this.serveTags.filter(x => data.goodsServiceTags.find(t => t.id == x.id));
  482. for(var i=0;i<data.goodsServiceTags.length;i++){
  483. this.serveDatas.push(data.goodsServiceTags[i].id)
  484. }
  485. console.log(this.serveDatas)
  486. // this.form.cid = data.cid;
  487. // this.imgval=imgs.split("")
  488. var tu=[]
  489. tu.push(data.imgs)
  490. var stateDatas = [];
  491. stateDatas=tu[0].split(',')
  492. this.imgval = []
  493. for (let key in stateDatas) {
  494. console.log(stateDatas[key])
  495. this.imgval.push({
  496. id: key,
  497. url: stateDatas[key]
  498. });
  499. }
  500. console.log(this.imgval)
  501. // this.form.categoryOneId = data.categoryOneId;
  502. // this.form.categoryTwoId = data.categoryTwoId;
  503. for (const key in this.form) {
  504. if (this.form.hasOwnProperty(key) && key != 'cid') {
  505. this.form[key] = data[key];
  506. }
  507. }
  508. }
  509. },
  510. created() {
  511. this.dataId = this.$route.query.id || '';
  512. this.loadData()
  513. }
  514. };
  515. </script>
  516. <style></style>