good.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822
  1. <template>
  2. <div class="good-info-box" v-loading="loading > 0">
  3. <Header :title="title"></Header>
  4. <div class="container">
  5. <div class="content">
  6. <div class="base-info group">
  7. <div class="basic">
  8. <!-- <span>*</span> -->
  9. 基本信息
  10. </div>
  11. <el-form
  12. ref="form"
  13. :rules="rules"
  14. :model="baseInfo"
  15. class="good-form base-info-form"
  16. label-width="auto"
  17. >
  18. <el-form-item label="商品名称" prop="name" class="form-item">
  19. <el-input
  20. placeholder="请输入商品名称"
  21. v-model="baseInfo.name"
  22. class="good-input"
  23. ></el-input>
  24. <span class="tip">商品名称不要超过五十个字</span>
  25. </el-form-item>
  26. <el-form-item label="宣传语" prop="tagline" class="form-item">
  27. <el-input
  28. placeholder="商品备注/副标题"
  29. v-model="baseInfo.tagline"
  30. class="good-input"
  31. ></el-input>
  32. <span class="tip">商品描述不要超过四十个字</span>
  33. </el-form-item>
  34. <el-form-item
  35. label="关联分类"
  36. prop="secondSortId"
  37. class="form-item"
  38. >
  39. <!-- <el-select
  40. placeholder="请选择"
  41. v-model="baseInfo.secondSortId"
  42. class="good-input"
  43. style="width: 185px"
  44. >
  45. <el-option
  46. v-for="item in categoryList"
  47. :key="item.id"
  48. :value="item.id"
  49. :label="item.name"
  50. ></el-option>
  51. </el-select> -->
  52. <el-cascader
  53. v-model="baseInfo.secondSortId"
  54. :options="categoryList"
  55. placeholder="请选择"
  56. :props="{
  57. children: 'second',
  58. value: 'id',
  59. label: 'name',
  60. }"
  61. class="good-input"
  62. style="width: 185px"
  63. ></el-cascader>
  64. </el-form-item>
  65. <!-- <el-form-item label="关联分区" prop="secondSortId" class="form-item">
  66. <el-select
  67. placeholder="请选择"
  68. v-model="baseInfo.secondSortId"
  69. class="good-input"
  70. style="width: 185px"
  71. >
  72. <el-option
  73. v-for="item in categoryList"
  74. :key="item.id"
  75. :value="item.id"
  76. :label="item.name"
  77. ></el-option>
  78. </el-select>
  79. </el-form-item> -->
  80. <el-form-item label="商品图片" class="form-item" prop="masterPic">
  81. <p class="tips" style="margin-bottom: 8px">
  82. 建议尺寸:600*600,图片类型jpg、png
  83. </p>
  84. <div class="img-box">
  85. <imgUpLoader
  86. :max-pic-num="1"
  87. @getPics="getMasterImgList"
  88. :index="0"
  89. text="主图"
  90. :imgUrl="baseInfo.masterPic"
  91. />
  92. <imgUpLoader
  93. v-for="(item, index) in bannerNum"
  94. :key="index"
  95. :max-pic-num="1"
  96. @getPics="getImgList"
  97. :index="index"
  98. text="细节图"
  99. :imgUrl="baseInfo.slideshow[index]"
  100. />
  101. </div>
  102. </el-form-item>
  103. <el-form-item label="商品状态" prop="status" class="form-item">
  104. <el-radio-group v-model="baseInfo.status">
  105. <el-radio :label="3">出售中</el-radio>
  106. <el-radio :label="1">仓库中</el-radio>
  107. </el-radio-group>
  108. </el-form-item>
  109. <!-- <el-form-item label="商品类型" prop="genre" class="form-item">
  110. <el-select
  111. placeholder="请选择"
  112. v-model="baseInfo.genre"
  113. class="good-input"
  114. style="width: 185px"
  115. >
  116. <el-option :value="1" label="自营"></el-option>
  117. <el-option :value="2" label="供应链"></el-option>
  118. </el-select>
  119. </el-form-item> -->
  120. <!-- <el-form-item label="购买限制" prop="newBuy" class="form-item">
  121. <el-checkbox v-model="baseInfo.newBuy">仅新用户可购买</el-checkbox>
  122. </el-form-item> -->
  123. <!-- <el-form-item
  124. label="限购数量"
  125. prop="limitNum"
  126. class="form-item"
  127. >
  128. <el-input
  129. placeholder="请输入限购数量"
  130. v-model="baseInfo.limitNum"
  131. class="good-input"
  132. style="width: 150px"
  133. ></el-input>
  134. </el-form-item> -->
  135. <el-form-item
  136. label="商品销量"
  137. prop="baseMonthlySales"
  138. class="form-item"
  139. >
  140. <el-input
  141. placeholder="请输入商品销量"
  142. v-model="baseInfo.baseMonthlySales"
  143. class="good-input"
  144. style="width: 185px"
  145. >
  146. <template slot="append">件</template>
  147. </el-input>
  148. </el-form-item>
  149. <el-form-item label="商品成本" prop="cost" class="form-item">
  150. <el-input
  151. placeholder="请输入商品成本"
  152. v-model="baseInfo.cost"
  153. class="good-input"
  154. style="width: 185px"
  155. >
  156. <template slot="append">元</template>
  157. </el-input>
  158. </el-form-item>
  159. <el-form-item label="打赏成本" prop="rewardAmount" class="form-item">
  160. <el-input
  161. placeholder="请输入打赏成本"
  162. v-model="baseInfo.rewardAmount"
  163. class="good-input"
  164. style="width: 185px"
  165. >
  166. <template slot="append">元</template>
  167. </el-input>
  168. </el-form-item>
  169. <el-form-item label="商品商家" prop="sid" class="form-item">
  170. <el-select
  171. placeholder="请选择"
  172. v-model="baseInfo.sid"
  173. class="good-input"
  174. style="width: 185px"
  175. >
  176. <el-option
  177. v-for="item in businessList"
  178. :key="item.id"
  179. :value="item.id"
  180. :label="item.name"
  181. ></el-option>
  182. </el-select>
  183. </el-form-item>
  184. <el-form-item label="供应链商品ID" prop="chainId" class="form-item">
  185. <el-input
  186. placeholder="请输入供应链商品ID"
  187. v-model="baseInfo.chainId"
  188. class="good-input"
  189. style="width: 180px"
  190. ></el-input>
  191. </el-form-item>
  192. <!-- <el-form-item label="商品参数" prop="option" class="form-item">
  193. <div class="option-box">
  194. <div class="option-item option-head">
  195. <div class="cell1">参数名称</div>
  196. <div class="cell2">参数值</div>
  197. </div>
  198. <div class="option-item" v-for="(item, index) in optionList" :key="index">
  199. <div class="cell1">
  200. <input type="text" v-model="item.name" placeholder="请输入"/>
  201. </div>
  202. <div class="cell2">
  203. <input type="text" v-model="item.value" placeholder="请输入"/>
  204. </div>
  205. </div>
  206. <div class="option-btn" @click="addOption">+添加参数</div>
  207. </div>
  208. </el-form-item> -->
  209. </el-form>
  210. </div>
  211. <div class="good-specs-box group">
  212. <div class="basic">
  213. <!-- <span>*</span> -->
  214. 售卖信息
  215. </div>
  216. <div class="specs good-specs">
  217. <goods-attr
  218. :attrSku="key"
  219. :skuTable="attribute"
  220. :sales="baseInfo.linePrice"
  221. @editAttr="editAttr"
  222. @getSales="getSales"
  223. />
  224. </div>
  225. <div class="specs good-specs-des"></div>
  226. </div>
  227. <div class="base-info group">
  228. <div class="basic">
  229. 商品说明
  230. <span style="font-size: 13px"
  231. >该部分内容展示在商品详情页后部分</span
  232. >
  233. </div>
  234. <div class="remarks">
  235. <el-form class="good-form" label-width="auto">
  236. <el-form-item label="商品描述:" class="form-item">
  237. <el-input
  238. type="textarea"
  239. :rows="4"
  240. placeholder="请输入商品描述"
  241. v-model="baseInfo.detailDes"
  242. class="remarks-input"
  243. >
  244. </el-input>
  245. </el-form-item>
  246. </el-form>
  247. <div class="good-detail">
  248. <UpImgDetail :max-pic-num="10" :imageList="baseInfo.detailPic" />
  249. </div>
  250. </div>
  251. </div>
  252. </div>
  253. <div class="btn-box">
  254. <button class="cancel-btn" @click="handleCancel">取消</button>
  255. <button class="confirm-btn" @click="handleConfirm">保存</button>
  256. </div>
  257. </div>
  258. </div>
  259. </template>
  260. <script type="text/ecmascript-6">
  261. import GoodsAttr from '../../components/goods/goodsAttr';
  262. import imgUpLoader from '../../components/goods/imgUpLoader';
  263. import UpImgDetail from '../../components/goods/upImgDetail';
  264. import Header from '../../components/common/header';
  265. export default {
  266. components: { GoodsAttr, imgUpLoader, UpImgDetail, Header },
  267. name: 'goods-lock',
  268. data() {
  269. return {
  270. loading: 0,
  271. title: {
  272. // 页面标题
  273. firstTitile: '商品管理',
  274. secondTitle: '商品详情'
  275. },
  276. categoryList: [],
  277. goodsInfo: {},
  278. bannerNum: 5,
  279. rules: {
  280. name: [
  281. {
  282. required: true,
  283. message: '请输入商品名称',
  284. trigger: 'blur'
  285. },
  286. {
  287. max: 50,
  288. message: '商品名称不能超过五十个字',
  289. trigger: 'blur'
  290. }
  291. ],
  292. tagline: [
  293. {
  294. max: 40,
  295. message: '商品名称不能超过四十个字',
  296. trigger: 'blur'
  297. }
  298. ],
  299. secondSortId: [
  300. {
  301. required: true,
  302. message: '请输入商品分类',
  303. trigger: 'change'
  304. }
  305. ],
  306. masterPic: [
  307. {
  308. required: true,
  309. message: '请上传主图图片',
  310. trigger: 'change'
  311. }
  312. ],
  313. goods_type: [
  314. {
  315. required: true,
  316. message: '请选择类型',
  317. trigger: 'change'
  318. }
  319. ],
  320. status: [
  321. {
  322. required: true,
  323. message: '请选择状态',
  324. trigger: 'change'
  325. }
  326. ],
  327. genre: [
  328. {
  329. required: true,
  330. message: '请选择商品类型',
  331. trigger: 'change'
  332. }
  333. ],
  334. limitNum: [
  335. {
  336. required: true,
  337. message: '请输入限购数量',
  338. trigger: 'blur'
  339. }
  340. ],
  341. sid: [
  342. {
  343. required: true,
  344. message: '请选择商品商家',
  345. trigger: 'change'
  346. }
  347. ],
  348. freight: [
  349. {
  350. required: true,
  351. message: '请选择运费模板',
  352. trigger: 'change'
  353. }
  354. ]
  355. },
  356. attribute: [],
  357. key: [],
  358. // weight: false,
  359. remarks: '',
  360. skuList: [],
  361. gid: null,
  362. id: null,
  363. freightList: [],
  364. optionList: [{ name: '', value: '' }],
  365. baseInfo: {
  366. status: null,
  367. name: '',
  368. detailDes: '',
  369. detailPic: [],
  370. tagline: '',
  371. slideshow: [],
  372. secondSortId: null,
  373. linePrice: null,
  374. masterPic: '',
  375. genre: 1,
  376. baseMonthlySales: null,
  377. sid: null,
  378. cost: null,
  379. rewardAmount: null,
  380. twig: null,
  381. newBuy: 0,
  382. limitNum: 0,
  383. chainId: null,
  384. detailContent: '',
  385. shopId: null
  386. },
  387. businessList: []
  388. };
  389. },
  390. computed: {},
  391. async mounted() {
  392. this.getBusinessList();
  393. await this.getCategoryList();
  394. // this.getFreightList();
  395. let query = this.$route.query;
  396. if (query && query.gid) {
  397. this.gid = query.gid;
  398. this.getGoodDetail(query.gid);
  399. }
  400. },
  401. methods: {
  402. // 获取商品信息
  403. getGoodDetail(gid) {
  404. this.loading++;
  405. this.httpGet(this.$root.goodsDetail, { gid }).then(
  406. (res) => {
  407. this.loading--;
  408. let baseInfo = { ...this.baseInfo };
  409. for (let key in baseInfo) {
  410. baseInfo[key] = res[key];
  411. }
  412. baseInfo.secondSortId = [res.firstSortId, res.secondSortId];
  413. baseInfo.newBuy = Boolean(baseInfo.newBuy);
  414. this.baseInfo = { ...baseInfo };
  415. this.skuList = res.skuList;
  416. this.key = this.getAttrName(res.skuList);
  417. this.attribute = this.getAttrs(res.skuList);
  418. this.gid = res.gid;
  419. this.id = res.id;
  420. },
  421. (res) => {
  422. this.loading--;
  423. this.$message.error(res);
  424. }
  425. );
  426. },
  427. getBusinessList() {
  428. this.loading++;
  429. this.httpGet(this.$root.getBusinessList, {
  430. size: 9999
  431. }).then(
  432. (res) => {
  433. this.loading--;
  434. // this.businessList = [{ name: '未选择', id: 0 }, ...res.list];
  435. this.businessList = res.list;
  436. },
  437. (res) => {
  438. this.loading--;
  439. this.$message.error(res);
  440. }
  441. );
  442. },
  443. // 根据组件转换格式为接口需要格式
  444. getAttrs(skus) {
  445. let newSkus = [...skus];
  446. let skusFormat = newSkus.map((item) => {
  447. let obj = {};
  448. item.attrs.forEach((attr) => {
  449. obj[attr.keyName] = attr.value;
  450. });
  451. return {
  452. ...item,
  453. attribute: obj
  454. };
  455. });
  456. return skusFormat;
  457. },
  458. // 获取所有规格
  459. getAttrName(skus) {
  460. let newAttrs = [];
  461. skus.forEach((item) => {
  462. item.attrs.forEach((attr) => {
  463. if (newAttrs.indexOf(attr.keyName) < 0) {
  464. newAttrs.push(attr.keyName);
  465. }
  466. });
  467. });
  468. return newAttrs;
  469. },
  470. // 获取分类列表
  471. getCategoryList() {
  472. this.loading++;
  473. this.httpGet(this.$root.getGoodsCategoryList, {}).then(
  474. (res) => {
  475. this.loading--;
  476. this.categoryList = res.list.filter((item) => item.second.length);
  477. },
  478. (res) => {
  479. this.loading--;
  480. this.$message.error(res);
  481. }
  482. );
  483. },
  484. // 获取模板列表
  485. getFreightList() {
  486. this.loading++;
  487. this.httpGet(this.$root.getFreightList, {}).then(
  488. (res) => {
  489. this.loading--;
  490. this.freightList = res.list;
  491. },
  492. (res) => {
  493. this.loading--;
  494. this.$message.error(res);
  495. }
  496. );
  497. },
  498. // 取消
  499. handleCancel() {
  500. this.$router.push({ name: 'goodsManage' });
  501. },
  502. getMasterImgList(index, val) {
  503. if (val === '') {
  504. // slideshow.splice(index, 1);
  505. this.baseInfo.masterPic = null;
  506. } else {
  507. this.baseInfo.masterPic = val;
  508. }
  509. this.$refs.form.clearValidate(['masterPic']);
  510. },
  511. // 设置
  512. getImgList(index, val) {
  513. // 获取主图
  514. let slideshow = [...this.baseInfo.slideshow];
  515. if (val === '') {
  516. // slideshow.splice(index, 1);
  517. slideshow[index] = null;
  518. } else {
  519. slideshow[index] = val;
  520. }
  521. // this.bannerNum = slideshow.length <= 5 ? slideshow.length : 5;
  522. this.baseInfo.slideshow = slideshow;
  523. this.$refs.form.clearValidate(['slideshow']);
  524. },
  525. // 获取规格值
  526. editAttr(val) {
  527. console.log(val);
  528. let newSkus = val.map((item) => {
  529. let arr = [];
  530. for (let key in item.attribute) {
  531. arr.push({
  532. keyName: key,
  533. value: item.attribute[key]
  534. });
  535. }
  536. return {
  537. sku: {
  538. price: +item.price,
  539. stock: +item.stock,
  540. pic: item.pic,
  541. kid: item.kid,
  542. code: item.code,
  543. chainId: item.chainId,
  544. cost: +item.cost || 0
  545. },
  546. attrs: arr
  547. };
  548. });
  549. this.skuList = newSkus;
  550. },
  551. getSales(val) {
  552. this.baseInfo.linePrice = +val;
  553. },
  554. // getDetail(val) {
  555. // this.baseInfoForm.details = [...val];
  556. // },
  557. // 下一步
  558. handleConfirm() {
  559. this.$refs.form.validate((valid) => {
  560. if (valid) {
  561. if (!this.skuList.length) {
  562. this.$message({
  563. message: '请选择商品规格',
  564. type: 'warning'
  565. });
  566. return;
  567. }
  568. // for (let spuKey in this.spu) {
  569. // this.spu[spuKey] = this.baseInfo[spuKey];
  570. // }
  571. this.addGood();
  572. } else {
  573. this.$message({
  574. message: '请填写商品信息',
  575. type: 'warning'
  576. });
  577. }
  578. });
  579. },
  580. // 添加商品
  581. addGood() {
  582. // 请求数据
  583. let inputData = {
  584. spu: this.baseInfo,
  585. skuList: this.skuList,
  586. secondSortId: this.baseInfo.secondSortId[1]
  587. };
  588. console.log(inputData.spu);
  589. inputData.spu.slideshow = this.baseInfo.slideshow.filter((item) => item);
  590. inputData.spu.baseMonthlySales = +inputData.spu.baseMonthlySales || 0;
  591. inputData.spu.cost = +inputData.spu.cost || 0;
  592. inputData.spu.rewardAmount = +inputData.spu.rewardAmount || 0;
  593. inputData.spu.limitNum = +inputData.spu.limitNum || 0;
  594. inputData.spu.newBuy = +inputData.spu.newBuy || 0;
  595. // inputData.spu.freight = 1;
  596. // 是否为编辑商品
  597. let method = 'httpPost';
  598. if (this.gid) {
  599. method = 'httpPut';
  600. inputData.spu.id = this.id;
  601. inputData.spu.gid = this.gid;
  602. }
  603. this.loading++;
  604. this[method](
  605. this.gid ? this.$root.editGoods : this.$root.createGoods, // 添加商品 or 创建商品
  606. inputData
  607. ).then(
  608. (res) => {
  609. this.$message({
  610. message: this.gid ? '商品修改成功' : '商品创建成功',
  611. type: 'success'
  612. });
  613. this.loading--;
  614. this.$router.push({
  615. name: 'goodsManage'
  616. });
  617. },
  618. (res) => {
  619. this.loading--;
  620. this.$message.error(res);
  621. }
  622. );
  623. },
  624. addOption() {
  625. this.optionList.push({
  626. name: '',
  627. value: ''
  628. });
  629. }
  630. }
  631. };
  632. </script>
  633. <style lang="stylus" rel="stylesheet/stylus">
  634. @import '~assets/public.styl';
  635. </style>
  636. <style lang="stylus" rel="stylesheet/stylus" scoped>
  637. @import '~assets/main.styl';
  638. .good-info-box {
  639. height: 100%;
  640. width: 100%;
  641. flex-y(flex-start, flex-start);
  642. overflow-y: hidden;
  643. background: bg-color;
  644. .container {
  645. box-sizing: border-box;
  646. height: 100%;
  647. width: 100%;
  648. overflow-y: auto;
  649. flex-y(flex-start, flex-start);
  650. padding: 24px;
  651. // content 表格
  652. .content {
  653. flex: 1;
  654. width: 100%;
  655. font-size: 14px;
  656. background: white;
  657. box-sizing: border-box;
  658. padding: 24px 20px;
  659. border-radius: 2px;
  660. .group {
  661. .basic {
  662. height: 48px;
  663. line-height: 48px;
  664. font-size: 20px;
  665. text-indent: 20px;
  666. margin-top: 20px;
  667. color: gray3;
  668. flex-x(flex-start);
  669. span {
  670. // color: red;
  671. color: gray6;
  672. margin-right: 3px;
  673. }
  674. }
  675. }
  676. .base-info {
  677. .good-form {
  678. padding: 20px 0 30px;
  679. .img-box {
  680. flex-x(flex-start);
  681. }
  682. }
  683. .base-info-form {
  684. margin-left: 90px;
  685. }
  686. .good-input {
  687. width: 620px;
  688. }
  689. .tip {
  690. font-size: 14px;
  691. color: gray6;
  692. margin-left: 16px;
  693. }
  694. .red {
  695. color: red;
  696. }
  697. .option-box {
  698. background: #F7F8FA;
  699. padding: 0 24px;
  700. border-radius: 2px;
  701. border: 1px solid #E8E8E8;
  702. // height: 32px;
  703. overflow: hidden;
  704. .option-item {
  705. flex-x(flex-start);
  706. height: 40px;
  707. &.option-head {
  708. height: 32px;
  709. }
  710. input {
  711. height: 32px;
  712. background: #fff;
  713. border: 1px solid #E8E8E8;
  714. box-sizing: border-box;
  715. }
  716. .cell1 {
  717. width: 330px;
  718. input {
  719. width: 310px;
  720. padding: 0 10px;
  721. box-sizing: border-box;
  722. }
  723. }
  724. .cell2 {
  725. input {
  726. width: 500px;
  727. padding: 0 10px;
  728. box-sizing: border-box;
  729. }
  730. }
  731. }
  732. .option-btn {
  733. width: 94px;
  734. height: 32px;
  735. border: 1px solid #E8E8E8;
  736. box-sizing: border-box;
  737. background: #fff;
  738. flex-x(center);
  739. font-size: 14px;
  740. border-radius: 2px;
  741. cursor: pointer;
  742. margin-top: 12px;
  743. margin-bottom: 16px;
  744. }
  745. }
  746. }
  747. .good-specs-box {
  748. .good-specs {
  749. // padding: 20px;
  750. // border: 1px solid gray9;
  751. margin: 30px 70px 0 60px;
  752. }
  753. }
  754. .remarks {
  755. width: 100%;
  756. padding-left: 95px;
  757. box-sizing: border-box;
  758. .remarks-input {
  759. max-width: 600px;
  760. textarea {
  761. font-size: 14px;
  762. max-width: 600px;
  763. }
  764. }
  765. .good-detail {
  766. padding-left: 82px;
  767. }
  768. }
  769. .good-detail {
  770. padding-bottom: 50px;
  771. }
  772. }
  773. }
  774. .btn-box {
  775. background: white;
  776. width: 100%;
  777. flex-x(center);
  778. padding-bottom: 48px;
  779. .cancel-btn {
  780. width: 96px;
  781. height: 40px;
  782. cancel-btn();
  783. // border-radius: 23px;
  784. }
  785. .confirm-btn {
  786. width: 96px;
  787. height: 40px;
  788. margin-left: 20px;
  789. confirm-btn();
  790. }
  791. }
  792. }
  793. </style>