create.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834
  1. <template>
  2. <div class="form-submit">
  3. <div class="i-layout-page-header">
  4. <PageHeader class="product_tabs" hidden-breadcrumb>
  5. <div slot="title">
  6. <router-link :to="{ path: `${roterPre}/marketing/super/index` }">
  7. <div class="font-sm after-line">
  8. <span class="iconfont iconfanhui"></span>
  9. <span class="pl10">返回</span>
  10. </div>
  11. </router-link>
  12. <span v-text="$route.params.id ? '编辑至尊卡' : '添加至尊卡'" class="mr20 ml16"></span>
  13. </div>
  14. </PageHeader>
  15. </div>
  16. <Card :bordered="false" dis-hover class="ivu-mt">
  17. <Form :model="formData" :label-width="150">
  18. <FormItem label="至尊卡名称" required>
  19. <Input v-model="formData.name" v-width="320" placeholder="请输入至尊卡名称"></Input>
  20. </FormItem>
  21. <FormItem label="至尊卡等级" required>
  22. <Input v-model="formData.grade" v-width="320" type="number" placeholder="请输入至尊卡等级"></Input>
  23. </FormItem>
  24. <FormItem label="全局折扣(%)" required>
  25. <Input v-model="formData.discount" v-width="320" type="number" placeholder="请输入全局折扣"></Input>
  26. </FormItem>
  27. <FormItem label="图标:" prop="icon">
  28. <div class="picBox" @click="modalPicTap('icon')">
  29. <div class="pictrue" v-if="formData.icon"><img v-lazy="formData.icon"></div>
  30. <div class="upLoad" v-else>
  31. <div class="iconfont">+</div>
  32. </div>
  33. </div>
  34. </FormItem>
  35. <FormItem label="背景:" prop="image">
  36. <div class="picBox" @click="modalPicTap('image')">
  37. <div class="pictrue" v-if="formData.image"><img v-lazy="formData.image"></div>
  38. <div class="upLoad" v-else>
  39. <div class="iconfont">+</div>
  40. </div>
  41. </div>
  42. </FormItem>
  43. <FormItem label="是否永久">
  44. <RadioGroup v-model="formData.is_forever">
  45. <Radio :label="0">否</Radio>
  46. <Radio :label="1">是</Radio>
  47. </RadioGroup>
  48. </FormItem>
  49. <FormItem v-show="!formData.is_forever" label="">
  50. <InputNumber :min="1" v-model="formData.valid_date" :precision="0"></InputNumber>
  51. <div class="info">领取后多少天内有效</div>
  52. </FormItem>
  53. <FormItem label="备注">
  54. <Input v-model="formData.mark" v-width="320" placeholder="备注"></Input>
  55. </FormItem>
  56. <FormItem label="是否显示">
  57. <i-switch v-model="formData.is_show" :true-value="1" :false-value="0" size="large">
  58. <span slot="open">显示</span>
  59. <span slot="close">隐藏</span>
  60. </i-switch>
  61. </FormItem>
  62. <FormItem label="关联商品">
  63. <Col span="20">
  64. <div class="acea-row row-between-wrapper">
  65. <div>
  66. <Button type="primary" @click="addGoods">添加商品</Button>
  67. <!-- <Button @click="batchSet" class="ml20" :disabled="!isAllChecked && !checkPidList.length">批量设置</Button>
  68. <Button @click="delAll" class="ml20" :disabled="!isAllChecked && !checkPidList.length">批量删除</Button> -->
  69. </div>
  70. <!-- <div class="goodsWord">
  71. <FormItem label="商品搜索:">
  72. <Input class="w_input240" v-model="keyword" placeholder="请输入商品关键词" @on-change="searchWord"></Input>
  73. </FormItem>
  74. </div> -->
  75. </div>
  76. </Col>
  77. <Col span="20">
  78. <div class="vxeTable">
  79. <vxe-table border="inner" ref="xTree" :column-config="{resizable: true}" row-id="id"
  80. :tree-config="{children: 'attrValue',reserve:true}" @checkbox-all="checkboxAll"
  81. @checkbox-change="checkboxItem"
  82. :data="(searchTableData.length || keyword)?searchTableData:tableData">
  83. <vxe-column title="" width="90" tree-node></vxe-column>
  84. <vxe-column field="info" title="商品信息" min-width="300" >
  85. <template v-slot="{ row }">
  86. <div class="imgPic acea-row row-middle">
  87. <viewer>
  88. <div class="pictrue"><img v-lazy="row.image" /></div>
  89. </viewer>
  90. <div class="info">
  91. <Tooltip max-width="200" placement="bottom" transfer>
  92. <span class="line2">{{ row.store_name }}{{row.suk}}</span>
  93. <p slot="content">{{ row.store_name }}{{row.suk}}</p>
  94. </Tooltip>
  95. </div>
  96. </div>
  97. </template>
  98. </vxe-column>
  99. <!-- <vxe-column field="info" title="商品信息" min-width="300" v-if="$route.params.id == 0">
  100. <template v-slot="{ row }">
  101. <div class="imgPic acea-row row-middle">
  102. <div class="info">
  103. <Tooltip max-width="200" placement="bottom" transfer>
  104. <span class="line2">{{ row.store_name }}{{row.suk}}</span>
  105. <p slot="content">{{ row.store_name }}{{row.suk}}</p>
  106. </Tooltip>
  107. </div>
  108. </div>
  109. </template>
  110. </vxe-column> -->
  111. <vxe-column field="price" title="价格" min-width="150">
  112. <template v-slot="{ row }">
  113. <div v-if="row.parent == 1">——</div>
  114. <vxe-input v-else v-model="row.price" min="0" placeholder="请输入价格" type="float"
  115. digits="2" step="1"></vxe-input>
  116. </template>
  117. </vxe-column>
  118. <vxe-column field="price" title="限购天数" min-width="150">
  119. <template v-slot="{ row }">
  120. <div v-if="row.parent == 1">——</div>
  121. <vxe-input v-else v-model="row.days" min="0" placeholder="请输入限购天数" type="float"
  122. digits="2" step="1"></vxe-input>
  123. </template>
  124. </vxe-column>
  125. <vxe-column field="price" title="限购次数" min-width="150">
  126. <template v-slot="{ row }">
  127. <div v-if="row.parent == 1">——</div>
  128. <vxe-input v-else v-model="row.number" min="0" placeholder="请输入限购次数" type="float"
  129. digits="2" step="1"></vxe-input>
  130. </template>
  131. </vxe-column>
  132. <vxe-column field="cost" title="成本价" min-width="80"></vxe-column>
  133. <vxe-column field="ot_price" title="原价" min-width="80"></vxe-column>
  134. <vxe-column field="is_yue" title="不可用余额" min-width="100">
  135. <template v-slot="{ row }">
  136. <i-switch v-if="row.parent != 1" v-model="row.is_yue" :value="row.is_yue"
  137. @on-change="onchangeIsShow(row)" size="large">
  138. <span slot="open">是</span>
  139. <span slot="close">否</span>
  140. </i-switch>
  141. <div v-else>——</div>
  142. </template>
  143. </vxe-column>
  144. <vxe-column field="date" title="操作" min-width="100" fixed="right" align="center">
  145. <template v-slot="{ row }">
  146. <a @click="del(row)" v-if="row.parent == 1">删除</a>
  147. </template>
  148. </vxe-column>
  149. </vxe-table>
  150. </div>
  151. </Col>
  152. </FormItem>
  153. </Form>
  154. </Card>
  155. <Card :bordered="false" dis-hover class="fixed-card"
  156. :style="{ left: `${!menuCollapse ? '200px' : isMobile ? '0' : '80px'}` }">
  157. <Form>
  158. <FormItem>
  159. <Button type="primary" class="submission" @click="save" :disabled="disabled">{{$route.params.id == 0?'立即创建': '修改'}}</Button>
  160. </FormItem>
  161. </Form>
  162. </Card>
  163. <!-- 选择商品-->
  164. <Modal v-model="modals" title="商品列表" footerHide scrollable width="900" @on-cancel="cancel">
  165. <goods-list ref="goodslist" :ischeckbox="true" :isdiy="true" :goodsType="1" @getProductId="getProductId"
  166. v-if="modals"></goods-list>
  167. </Modal>
  168. <Modal v-model="storeModals" title="门店列表" footerHide scrollable width="900" @on-cancel="cancelStore">
  169. <store-list ref="storelist" @getStoreId="getStoreId" v-if="storeModals"></store-list>
  170. </Modal>
  171. <Modal v-model="modalPic" width="960px" scrollable footer-hide closable title='上传' :mask-closable="false"
  172. :z-index="1">
  173. <uploadPictures :isChoice="isChoice" @getPic="getPic" :gridBtn="gridBtn" :gridPic="gridPic" v-if="modalPic">
  174. </uploadPictures>
  175. </Modal>
  176. </div>
  177. </template>
  178. <script>
  179. import {
  180. mapState
  181. } from "vuex";
  182. import storeList from "@/components/storeList";
  183. import goodsList from '@/components/goodsList';
  184. import {
  185. couponCategoryApi,
  186. couponSaveApi,
  187. addSuper,
  188. couponDetailApi,
  189. superInfo
  190. } from "@/api/marketing";
  191. import {
  192. brandList
  193. } from "@/api/product";
  194. // import { formatDate } from '@/utils/validate';
  195. import Setting from "@/setting";
  196. import uploadPictures from '@/components/uploadPictures';
  197. export default {
  198. name: "storeCouponCreate",
  199. components: {
  200. goodsList,
  201. storeList,
  202. uploadPictures
  203. },
  204. data() {
  205. return {
  206. checkPidList: [], //父级有关id集合 (需求禁止删除子级,用于删除整个商品)
  207. isAllChecked: false, //表头是否被选中
  208. gridPic: {
  209. xl: 6,
  210. lg: 8,
  211. md: 12,
  212. sm: 12,
  213. xs: 12
  214. },
  215. gridBtn: {
  216. xl: 4,
  217. lg: 8,
  218. md: 8,
  219. sm: 8,
  220. xs: 8
  221. },
  222. isChoice: '单选',
  223. modalPic: false,
  224. roterPre: Setting.roterPre,
  225. disabled: false,
  226. storesList: [],
  227. formData: {
  228. name: "",
  229. is_forever: 0,
  230. valid_date: 0,
  231. grade: '',
  232. discount: '',
  233. icon: '',
  234. image: '',
  235. is_show: 1,
  236. mark: '',
  237. product: [],
  238. id: 0,
  239. },
  240. categoryList: [],
  241. brandList: [],
  242. productList: [],
  243. isMinPrice: 0,
  244. isCouponTime: 1,
  245. isReceiveTime: 0,
  246. modals: false,
  247. datetime1: [],
  248. datetime2: [],
  249. storeModals: false,
  250. currentTab: '1',
  251. imageType: '',
  252. chooseModals: false,
  253. keyword: '',
  254. searchTableData: [],
  255. tableData: [],
  256. };
  257. },
  258. computed: {
  259. ...mapState("admin/layout", ["isMobile", "menuCollapse"]),
  260. },
  261. created() {
  262. this.getBrandList();
  263. this.getCategoryList();
  264. if (this.$route.params.id) {
  265. this.formData.id = this.$route.params.id
  266. this.getCouponDetail();
  267. }
  268. },
  269. methods: {
  270. onchangeIsShow(row) {
  271. // this.tableData.forEach(item=>{
  272. // item.attrValue.forEach(i => {
  273. // if(row.unique == i.unique) {
  274. // console.log('i.is_yue:',i.is_yue);
  275. // // i.is_yue = !i.is_yue;
  276. // }
  277. // })
  278. // })
  279. },
  280. getProductId(data) {
  281. this.modals = false;
  282. let list = this.tableData.concat(data);
  283. let uni = this.unique(list);
  284. uni.forEach((i) => {
  285. i.parent = 1;
  286. i.status = 1;
  287. i.attrValue.forEach(j => {
  288. j.cate_name = i.cate_name;
  289. j.store_label = i.store_label;
  290. j.is_yue = j.is_yue ? true : false;
  291. })
  292. })
  293. this.tableData = uni;
  294. console.log(uni,'uni')
  295. },
  296. checkboxItem(e) {
  297. let id = parseInt(e.rowid);
  298. if (e.row.product_id) {
  299. // let index = this.checkUidList.indexOf(id);
  300. // if(index !== -1){
  301. // this.checkUidList = this.checkUidList.filter((item)=> item !== id);
  302. // }else{
  303. // this.checkUidList.push(id);
  304. // }
  305. let pIndex = this.checkPidList.indexOf(e.row.product_id);
  306. if (pIndex !== -1 && !e.checked) {
  307. this.checkPidList = this.checkPidList.filter((item) => item !== e.row.product_id);
  308. }
  309. if (pIndex === -1 && e.checked) {
  310. this.checkPidList.push(e.row.product_id);
  311. }
  312. } else {
  313. let pIndex = this.checkPidList.indexOf(id);
  314. if (pIndex !== -1 && !e.checked) {
  315. this.checkPidList = this.checkPidList.filter((item) => item !== id);
  316. }
  317. if (pIndex === -1 && e.checked) {
  318. this.checkPidList.push(id);
  319. }
  320. }
  321. this.isAllChecked = this.$refs.xTree.isAllCheckboxChecked();
  322. },
  323. checkboxAll() {
  324. this.isAllChecked = this.$refs.xTree.isAllCheckboxChecked();
  325. if (!this.isAllChecked) {
  326. this.checkPidList = [];
  327. }
  328. console.log('fgfg', this.isAllChecked);
  329. },
  330. searchWord() {
  331. let list = []
  332. this.tableData.forEach(item => {
  333. let obj = item.store_name.indexOf(this.keyword);
  334. if (obj != -1) {
  335. list.push(item)
  336. }
  337. })
  338. if (this.keyword) {
  339. this.searchTableData = list;
  340. } else {
  341. this.searchTableData = []
  342. }
  343. },
  344. addGoods() {
  345. this.modals = true;
  346. },
  347. // 选择商品
  348. changeGoods() {
  349. this.modals = true;
  350. },
  351. // 选择图片
  352. modalPicTap(type) {
  353. this.imageType = type;
  354. this.modalPic = true;
  355. this.$refs.formItem.validateField("image")
  356. },
  357. // 选中图片
  358. getPic(pc) {
  359. this.formData[this.imageType] = pc.att_dir;
  360. this.modalPic = false;
  361. // this.$refs.formItem.validateField("image")
  362. },
  363. //删除门店
  364. delte(row) {
  365. this.storesList.forEach((item, index) => {
  366. if (row.id == item.id) {
  367. this.storesList.splice(index, 1)
  368. }
  369. })
  370. },
  371. //添加门店
  372. addStore() {
  373. this.storeModals = true;
  374. },
  375. //关闭门店弹窗
  376. cancelStore() {
  377. this.storeModals = false;
  378. },
  379. uniqueId(arr) {
  380. const res = new Map();
  381. return arr.filter((arr) => !res.has(arr.id) && res.set(arr.id, 1))
  382. },
  383. unique(arr) {
  384. const res = new Map();
  385. return arr.filter((arr) => !res.has(arr.id) && res.set(arr.id, 1))
  386. },
  387. getStoreId(data) {
  388. this.storeModals = false;
  389. let list = this.storesList.concat(data);
  390. let uni = this.uniqueId(list);
  391. this.storesList = uni;
  392. },
  393. // 品类
  394. getCategoryList() {
  395. couponCategoryApi(1).then(async (res) => {
  396. res.data.forEach((val) => {
  397. val.cate_name = `${val.html}${val.cate_name}`;
  398. });
  399. this.categoryList = res.data;
  400. });
  401. },
  402. //品牌
  403. getBrandList() {
  404. brandList().then(res => {
  405. this.brandList = res.data;
  406. })
  407. },
  408. // 至尊卡
  409. getCouponDetail() {
  410. superInfo(this.$route.params.id)
  411. .then((res) => {
  412. let data = res.data[0];
  413. this.formData.name = data.name;
  414. this.formData.is_forever = data.is_forever;
  415. this.formData.grade = data.grade;
  416. this.formData.discount = data.discount;
  417. this.formData.valid_date = data.valid_date / 60 / 60 / 24;
  418. this.formData.icon = data.icon;
  419. this.formData.image = data.image;
  420. this.formData.is_show = data.is_show;
  421. this.formData.mark = data.mark;
  422. let list = []
  423. data.product.forEach(item => {
  424. let obj = {
  425. image: item.info[0].attrValue.image,
  426. store_name: item.product_name,
  427. cost: item.info[0].attrValue.cost,
  428. ot_price: item.info[0].attrValue.ot_price,
  429. parent: 1,
  430. status: 1,
  431. id: item.product_id
  432. }
  433. let arr = []
  434. try{
  435. item.info.forEach(j => {
  436. arr.push({
  437. unique: j.unique,
  438. price: j.price,
  439. ot_price: j.attrValue.ot_price,
  440. cost: j.attrValue.cost,
  441. image: j.attrValue.image,
  442. suk: j.attrValue.suk,
  443. is_yue: j.is_yue? true:false,
  444. days: j.days || 0,
  445. number: j.number|| 0
  446. })
  447. })
  448. }catch(e){
  449. console.log(e,'err')
  450. //TODO handle the exception
  451. }
  452. obj.attrValue = arr
  453. list.push(obj)
  454. })
  455. this.tableData = list
  456. })
  457. .catch((err) => {
  458. this.$Message.error(err.msg);
  459. });
  460. },
  461. makeDate(data) {
  462. let date = new Date(data);
  463. let YY = date.getFullYear() + "-";
  464. let MM =
  465. (date.getMonth() + 1 < 10 ?
  466. "0" + (date.getMonth() + 1) :
  467. date.getMonth() + 1) + "-";
  468. let DD = date.getDate() < 10 ? "0" + date.getDate() : date.getDate();
  469. let hh =
  470. (date.getHours() < 10 ? "0" + date.getHours() : date.getHours()) + ":";
  471. let mm =
  472. (date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes()) +
  473. ":";
  474. let ss =
  475. date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds();
  476. return YY + MM + DD + " " + hh + mm + ss;
  477. },
  478. // 上一页:
  479. upTab() {
  480. if (this.currentTab == '2') {
  481. this.currentTab = (Number(this.currentTab) - 1).toString();
  482. }
  483. },
  484. // 创建
  485. save() {
  486. let that = this
  487. if (!that.formData.name) {
  488. return that.$Message.error("请输入至尊卡名称");
  489. }
  490. if (!that.formData.grade) {
  491. return that.$Message.error("请输入至尊卡等级");
  492. }
  493. if (!that.formData.is_forever && that.formData.valid_date <= 0) {
  494. return that.$Message.error("请输入有效天数");
  495. }
  496. if (!that.formData.icon) {
  497. return that.$Message.error("请选择图标");
  498. }
  499. if (!that.formData.image) {
  500. return that.$Message.error("请选择背景");
  501. }
  502. if (!that.formData.discount) {
  503. return that.$Message.error("请输入全局则扣");
  504. }
  505. let list = [];
  506. that.tableData.forEach(item => {
  507. let obj = {
  508. product_id: item.id
  509. }
  510. let info = [];
  511. item.attrValue.forEach(i => {
  512. info.push({
  513. unique: i.unique,
  514. price: i.price,
  515. is_yue: i.is_yue ? 1 : 0,
  516. days: i.days,
  517. number: i.number
  518. })
  519. })
  520. obj.info = info;
  521. list.push(obj)
  522. })
  523. addSuper({
  524. id: that.formData.id,
  525. name: that.formData.name,
  526. valid_date: that.is_forever ? 0 : that.formData.valid_date,
  527. is_forever: that.formData.is_forever,
  528. grade: that.formData.grade,
  529. discount: that.formData.discount,
  530. icon: that.formData.icon,
  531. image: that.formData.image,
  532. is_show: that.formData.is_show,
  533. mark: that.formData.mark,
  534. product: list,
  535. })
  536. .then((res) => {
  537. this.disabled = true;
  538. this.$Message.success(res.msg);
  539. setTimeout(() => {
  540. this.$router.push({
  541. path: this.roterPre + "/marketing/super/index",
  542. });
  543. }, 1000);
  544. })
  545. .catch((err) => {
  546. this.$Message.error(err.msg);
  547. });
  548. },
  549. cancel() {
  550. this.modals = false;
  551. },
  552. // 删除商品
  553. remove(productId) {
  554. for (let index = 0; index < this.productList.length; index++) {
  555. if (this.productList[index].product_id == productId) {
  556. this.productList.splice(index, 1);
  557. }
  558. }
  559. this.formData.product_id = "";
  560. this.productList.forEach((value) => {
  561. if (this.formData.product_id) {
  562. this.formData.product_id += `,${value.product_id}`;
  563. } else {
  564. this.formData.product_id += `${value.product_id}`;
  565. }
  566. });
  567. },
  568. //批量设置
  569. batchSet() {
  570. this.modalsSet = true;
  571. },
  572. //批量删除
  573. delAll() {
  574. if (this.isAllChecked && (this.tableData.length == this.searchTableData.length || !this.searchTableData
  575. .length)) {
  576. this.tableData = []
  577. } else {
  578. this.tableData = this.tableData.filter(item => !this.checkPidList.some(ele => ele === item.id));
  579. }
  580. this.checkPidList = [];
  581. this.isAllChecked = false;
  582. },
  583. //删除
  584. del(row) {
  585. if (this.searchTableData.length) {
  586. this.searchTableData.forEach((i, index) => {
  587. if (row.id == i.id) {
  588. this.searchTableData.splice(index, 1)
  589. }
  590. })
  591. this.tableData.forEach((i, index) => {
  592. if (row.id == i.id) {
  593. return this.tableData.splice(index, 1)
  594. }
  595. })
  596. } else {
  597. this.tableData.forEach((i, index) => {
  598. if (row.id == i.id) {
  599. return this.tableData.splice(index, 1)
  600. }
  601. })
  602. }
  603. if (this.isAllChecked && !this.tableData.length) {
  604. this.isAllChecked = false;
  605. this.checkPidList = []
  606. } else {
  607. let index = this.checkPidList.indexOf(row.id);
  608. this.checkPidList.splice(index, 1)
  609. }
  610. },
  611. },
  612. };
  613. </script>
  614. <style scoped lang="stylus">
  615. .tips {
  616. display: inline-bolck;
  617. font-size: 12px;
  618. font-weight: 400;
  619. color: #999999;
  620. margin-top: 10px;
  621. }
  622. .imgPic {
  623. .info {
  624. width: 60%;
  625. margin-left: 10px;
  626. }
  627. .pictrue {
  628. height: 36px;
  629. margin: 7px 3px 0 3px;
  630. img {
  631. height: 100%;
  632. display: block;
  633. }
  634. }
  635. }
  636. .productType {
  637. width: 120px;
  638. height: 60px;
  639. background: #FFFFFF;
  640. border-radius: 3px;
  641. border: 1px solid #E7E7E7;
  642. float: left;
  643. text-align: center;
  644. padding-top: 8px;
  645. position: relative;
  646. cursor: pointer;
  647. line-height: 23px;
  648. margin-right: 12px;
  649. &.on {
  650. border-color: #1890FF;
  651. }
  652. .name {
  653. font-size: 14px;
  654. font-weight: 600;
  655. color: rgba(0, 0, 0, 0.85);
  656. &.on {
  657. color: #1890FF;
  658. }
  659. }
  660. .title {
  661. font-size: 12px;
  662. font-weight: 400;
  663. color: #999999;
  664. }
  665. .jiao {
  666. position: absolute;
  667. bottom: 0;
  668. right: 0;
  669. width: 0;
  670. height: 0;
  671. border-bottom: 26px solid #1890FF;
  672. border-left: 26px solid transparent;
  673. }
  674. .iconfont {
  675. position: absolute;
  676. bottom: -3px;
  677. right: 1px;
  678. color: #FFFFFF;
  679. font-size: 12px;
  680. }
  681. }
  682. .info {
  683. color: #888;
  684. font-size: 12px;
  685. }
  686. .ivu-input-wrapper {
  687. width: 320px;
  688. }
  689. .ivu-input-number {
  690. width: 160px;
  691. }
  692. .ivu-date-picker {
  693. width: 320px;
  694. }
  695. .ivu-icon-ios-camera-outline {
  696. width: 58px;
  697. height: 58px;
  698. border: 1px dotted rgba(0, 0, 0, 0.1);
  699. border-radius: 4px;
  700. background-color: rgba(0, 0, 0, 0.02);
  701. line-height: 58px;
  702. cursor: pointer;
  703. vertical-align: middle;
  704. }
  705. .upload-list {
  706. width: 58px;
  707. height: 58px;
  708. border: 1px dotted rgba(0, 0, 0, 0.1);
  709. border-radius: 4px;
  710. margin-right: 15px;
  711. display: inline-block;
  712. position: relative;
  713. cursor: pointer;
  714. vertical-align: middle;
  715. }
  716. .upload-list img {
  717. display: block;
  718. width: 100%;
  719. height: 100%;
  720. }
  721. .ivu-icon-ios-close-circle {
  722. position: absolute;
  723. top: 0;
  724. right: 0;
  725. transform: translate(50%, -50%);
  726. }
  727. .form-submit {
  728. /deep/.ivu-card {
  729. border-radius: 0;
  730. }
  731. margin-bottom: 79px;
  732. .fixed-card {
  733. position: fixed;
  734. right: 0;
  735. bottom: 0;
  736. left: 200px;
  737. z-index: 99;
  738. box-shadow: 0 -1px 2px rgb(240, 240, 240);
  739. /deep/ .ivu-card-body {
  740. padding: 15px 16px 14px;
  741. }
  742. .ivu-form-item {
  743. margin-bottom: 0;
  744. }
  745. /deep/ .ivu-form-item-content {
  746. margin-right: 124px;
  747. text-align: center;
  748. }
  749. .ivu-btn {
  750. height: 36px;
  751. padding: 0 20px;
  752. }
  753. }
  754. }
  755. /deep/.vxe-tree-cell {
  756. padding-left: 0 !important;
  757. }
  758. .picBox {
  759. display: inline-block;
  760. cursor: pointer;
  761. .upLoad {
  762. width: 58px;
  763. height: 58px;
  764. line-height: 58px;
  765. border: 1px dotted rgba(0, 0, 0, 0.1);
  766. border-radius: 4px;
  767. background: rgba(0, 0, 0, 0.02);
  768. }
  769. .pictrue {
  770. width: 60px;
  771. height: 60px;
  772. border: 1px dotted rgba(0, 0, 0, 0.1);
  773. margin-right: 10px;
  774. img {
  775. width: 100%;
  776. height: 100%;
  777. }
  778. }
  779. .iconfont {
  780. color: #CCCCCC;
  781. font-size 26px;
  782. text-align center
  783. }
  784. }
  785. .vxeTable {
  786. border-top: 1px dotted #eee;
  787. margin-top 20px;
  788. }
  789. /deep/ .vxe-tree--btn-wrapper {
  790. left: 0;
  791. }
  792. </style>