goodsList.vue 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632
  1. <template>
  2. <div class="app-container calendar-list-container">
  3. <!-- 查询和其他操作 -->
  4. <div class="filter-container">
  5. <el-input clearable class="filter-item" style="width: 200px;" placeholder="商品名称"
  6. v-model="listQuery.name"></el-input>
  7. <el-input clearable class="filter-item" style="width: 200px;" placeholder="商品编号"
  8. v-model="listQuery.seq"></el-input>
  9. <el-select v-model="listQuery.status" clearable placeholder="状态" class="filter-item" style="width: 200px;">
  10. <el-option :key="item.type" v-for="item in goodsStatusList" :label="item.name" :value="item.type">
  11. </el-option>
  12. </el-select>
  13. <el-select v-model="listQuery.productAttribute" clearable placeholder="商品属性" class="filter-item" style="width: 200px">
  14. <el-option :key="item.dictValue" v-for="item in productAttributeList" :label="item.dictLabel"
  15. :value="item.dictValue">
  16. </el-option>
  17. </el-select>
  18. <el-button class="filter-item" type="primary" v-waves icon="el-icon-search" @click="handleFilter">查找</el-button>
  19. <el-button class="filter-item" type="primary" @click="handleCreate" icon="el-icon-edit">添加</el-button>
  20. </div>
  21. <!-- 查询结果 -->
  22. <el-table size="small" :data="list" v-loading="listLoading" element-loading-text="正在查询中。。。" border fit
  23. highlight-current-row>
  24. <el-table-column type="index" label="序号" header-align="center" align="center">
  25. </el-table-column>
  26. <el-table-column align="center" min-width="200px" label="商品名称" prop="name">
  27. </el-table-column>
  28. <el-table-column align="center" min-width="120px" label="商品编号" prop="seq">
  29. </el-table-column>
  30. <el-table-column align="center" min-width="80px" label="商品属性" prop="productAttributeName">
  31. </el-table-column>
  32. <el-table-column align="center" min-width="80px" label="积分" prop="price">
  33. </el-table-column>
  34. <el-table-column align="center" min-width="80px" label="参考价格" prop="hisPrice">
  35. </el-table-column>
  36. <el-table-column align="center" min-width="100px" label="库存量" prop="actualStock">
  37. </el-table-column>
  38. <el-table-column align="center" min-width="100px" label="可兑换库存量" prop="stock">
  39. </el-table-column>
  40. <!-- <el-table-column align="center" min-width="100px" label="商品所在地" prop="location">
  41. </el-table-column> -->
  42. <el-table-column align="center" min-width="80px" label="商品状态">
  43. <template slot-scope="props">
  44. <span v-if="props.row.status == 1">上架</span>
  45. <span v-if="props.row.status == 0">下架</span>
  46. </template>
  47. </el-table-column>
  48. <el-table-column align="center" min-width="80px" label="兑换记录">
  49. <template slot-scope="props">
  50. <span @click="handleView(props.row)" style="color:green;cursor: pointer;">查看</span>
  51. </template>
  52. </el-table-column>
  53. <!-- fixed="right" -->
  54. <el-table-column align="center" label="操作" width="240px" class-name="small-padding fixed-width">
  55. <template slot-scope="scope">
  56. <el-button type="primary" size="small" @click="handleUpdate(scope.row)">编辑</el-button>
  57. <el-button v-if="scope.row.status == 0" type="success" size="small"
  58. @click="changeGoodsState(scope.row.skuId, 1)">上架</el-button>
  59. <el-button v-if="scope.row.status == 1" type="warning" size="small"
  60. @click="changeGoodsState(scope.row.skuId, 0)">下架</el-button>
  61. <el-button type="danger" size="small" @click="handleDelete(scope.row.skuId, -1)">删除</el-button>
  62. </template>
  63. </el-table-column>
  64. </el-table>
  65. <!-- 分页 -->
  66. <div class="pagination-container">
  67. <el-pagination background @size-change="handleSizeChange" @current-change="handleCurrentChange"
  68. :current-page="listQuery.page" :page-sizes="[10, 20, 30, 50]" :page-size="listQuery.limit"
  69. layout="total, sizes, prev, pager, next, jumper" :total="total">
  70. </el-pagination>
  71. </div>
  72. <!-- 员工积分记录列表 -->
  73. <el-dialog :close-on-click-modal="false" title="兑换记录" :visible.sync="dialogListVisible" width="70%" style="overflow: auto;">
  74. <div class="filter-container">
  75. <el-select filterable v-model="itemListQuery.deptId" clearable placeholder="部门" style="top: -4px;width: 200px;">
  76. <el-option :key="item.deptId" v-for="item in depTypeList" :label="item.deptName" :value="item.deptId">
  77. </el-option>
  78. </el-select>
  79. <el-input clearable class="filter-item" style="width: 200px;" placeholder="员工名称"
  80. v-model="itemListQuery.userName"></el-input>
  81. <el-button class="filter-item" type="primary" v-waves icon="el-icon-search"
  82. @click="itemHandleFilter">查找</el-button>
  83. <el-button class="filter-item" type="primary" @click="handleDownLoad" v-waves icon="el-icon-download">导出</el-button>
  84. </div>
  85. <!-- 查询结果 -->
  86. <el-table size="small" :data="itemList" v-loading="listLoading" element-loading-text="正在查询中。。。" border fit
  87. highlight-current-row>
  88. <el-table-column type="index" label="序号" header-align="center" align="center">
  89. </el-table-column>
  90. <el-table-column align="center" width="200px" label="部门" prop="deptName">
  91. </el-table-column>
  92. <el-table-column align="center" label="员工姓名" prop="purchaser">
  93. </el-table-column>
  94. <el-table-column align="center" label="兑换数量" prop="skuCount">
  95. </el-table-column>
  96. <el-table-column align="center" label="联系人" prop="contact">
  97. </el-table-column>
  98. <el-table-column align="center" width="120px" label="联系方式" prop="contactPhone">
  99. </el-table-column>
  100. <el-table-column align="center" width="200px" label="地址" prop="contactAddr">
  101. </el-table-column>
  102. <!-- <el-table-column align="center" width="200px" label="邮箱" prop="contactEmail">
  103. </el-table-column> -->
  104. <el-table-column align="center" width="150px" label="兑换时间" prop="createTime">
  105. </el-table-column>
  106. </el-table>
  107. <!-- 分页 -->
  108. <div class="pagination-container">
  109. <el-pagination background @size-change="itemHandleSizeChange" @current-change="itemHandleCurrentChange"
  110. :current-page="itemListQuery.page" :page-sizes="[10, 20, 30, 50]" :page-size="itemListQuery.limit"
  111. layout="total, sizes, prev, pager, next, jumper" :total="itemTotal">
  112. </el-pagination>
  113. </div>
  114. </el-dialog>
  115. <!-- 添加或修改对话框 -->
  116. <el-dialog :close-on-click-modal="false" :title="textMap[dialogStatus]" :visible.sync="dialogFormVisible" width="70%">
  117. <el-form :rules="rules" ref="dataForm" :model="dataForm" status-icon label-position="left" label-width="100px" style='width:700px; margin-left:50px;'>
  118. <el-form-item label="商品编号" prop="seq">
  119. <el-input disabled placeholder="添加成功后自动生成" readonly v-model="dataForm.seq"></el-input>
  120. </el-form-item>
  121. <el-form-item label="商品名称" prop="name">
  122. <el-input v-model="dataForm.name"></el-input>
  123. </el-form-item>
  124. <el-form-item label="商品属性" prop="productAttribute">
  125. <el-select v-model="dataForm.productAttribute" filterable placeholder="请选择" style="width: 350px"
  126. value-key="value" @change="changeProductAttribute">
  127. <el-option :key="item.dictValue" v-for="item in productAttributeList" :label="item.dictLabel"
  128. :value="item.dictValue">
  129. </el-option>
  130. </el-select>
  131. </el-form-item>
  132. <el-form-item label="兑换方式" prop="deliveryTypes">
  133. <el-select v-model="dataForm.deliveryTypes" multiple filterable placeholder="请选择" style="width: 350px">
  134. <el-option :key="item.dictValue" v-for="item in deliveryTypeList" :label="item.dictLabel" :value="item.dictValue">
  135. </el-option>
  136. </el-select>
  137. </el-form-item>
  138. <!-- <el-form-item v-if="dataForm.deliveryTypes==0" label="商品所在地" prop="location">
  139. <el-select v-model="dataForm.location" filterable placeholder="请选择" style="width: 350px">
  140. <el-option :key="item.dictLabel" v-for="item in locationList" :label="item.dictLabel" :value="item.dictLabel">
  141. </el-option>
  142. </el-select>
  143. </el-form-item> -->
  144. <el-form-item style="width: 800px" label="商品图片" prop="imgUrl">
  145. <el-upload :limit="1" :action="fileImgUrl" list-type="picture-card" :file-list="dataForm.images"
  146. :on-success="handleGallerySucess" :on-exceed="handleExceed" :before-upload="uploadBannerImg"
  147. :on-remove="handleRemove">
  148. <i class="el-icon-plus"></i>
  149. </el-upload>
  150. </el-form-item>
  151. <el-form-item style="width: 800px" label="商品副图" prop="imgIds">
  152. <el-upload :action="fileImgUrl" list-type="picture-card" :file-list="dataForm.imgUrls"
  153. :on-success="handleAvatarSuccess"
  154. :on-remove="handleRemoveImgs">
  155. <i class="el-icon-plus"></i>
  156. </el-upload>
  157. </el-form-item>
  158. <el-form-item label="积分" prop="price">
  159. <el-input v-model="dataForm.price"></el-input>
  160. </el-form-item>
  161. <el-form-item label="参考价格" prop="hisPrice">
  162. <el-input v-model="dataForm.hisPrice"></el-input>
  163. </el-form-item>
  164. <el-form-item label="库存量" prop="actualStock">
  165. <el-input-number :precision="0" :step="1" v-model="dataForm.actualStock"></el-input-number>
  166. </el-form-item>
  167. <el-form-item
  168. style="width: 800px"
  169. label="商品说明"
  170. prop="comment"
  171. >
  172. <tinymce v-model="dataForm.comment" ref="tinymce"></tinymce>
  173. </el-form-item>
  174. <el-form-item
  175. style="width: 800px"
  176. label="商品介绍"
  177. prop="skuDesc"
  178. >
  179. <skuDesc v-model="dataForm.skuDesc" ref="skuDesc"></skuDesc>
  180. </el-form-item>
  181. </el-form>
  182. <div slot="footer" class="dialog-footer">
  183. <el-button @click="dialogFormVisible = false">取消</el-button>
  184. <el-button v-if="dialogStatus == 'create'" type="primary" @click="createData">确定</el-button>
  185. <el-button v-else type="primary" @click="updateData">确定</el-button>
  186. </div>
  187. </el-dialog>
  188. </div>
  189. </template>
  190. <style>
  191. .demo-table-expand {
  192. font-size: 0;
  193. }
  194. .demo-table-expand label {
  195. width: 200px;
  196. color: #99a9bf;
  197. }
  198. .demo-table-expand .el-form-item {
  199. margin-right: 0;
  200. margin-bottom: 0;
  201. }
  202. </style>
  203. <script>
  204. import { createItem, updateItem, goodsList, goodsState, exchangeHistory } from "@/api/goodsManage";
  205. import { depTypeList,dataTypeList } from "@/api/public";
  206. import waves from "@/directive/waves"; // 水波纹指令
  207. import Tinymce from '@/components/Tinymce';
  208. import SkuDesc from '@/components/SkuDesc'
  209. export default {
  210. name: 'goodsList',
  211. components: { Tinymce,SkuDesc },
  212. directives: { waves },
  213. data() {
  214. return {
  215. locationList:[],
  216. productAttributeList: [],
  217. deliveryTypeList: [],
  218. goodsStatusList: [
  219. {
  220. type: 1,
  221. name: '上架'
  222. },
  223. {
  224. type: 0,
  225. name: '下架'
  226. },
  227. ],
  228. depTypeList: [],
  229. list: [],
  230. itemList: [],
  231. total: 0,
  232. itemTotal: 0,
  233. listLoading: false,
  234. downloadLoading: false,
  235. listQuery: {
  236. skuType:0,
  237. page: 1,
  238. limit: 10,
  239. name: '',
  240. seq: '',
  241. status: '',
  242. productAttribute:'',
  243. },
  244. itemListQuery: {
  245. skuType:0,
  246. page: 1,
  247. limit: 10,
  248. skuId:'',
  249. deptId: '',
  250. userName: '',
  251. },
  252. dataForm: {
  253. skuType:0,
  254. name: undefined,
  255. seq: undefined,
  256. productAttribute: undefined,
  257. imgUrl: undefined,
  258. price: undefined,
  259. hisPrice:undefined,
  260. actualStock: undefined,
  261. deliveryTypes: [],
  262. // location: undefined,
  263. images: [],
  264. imgIds: '',
  265. imgUrls:[],
  266. },
  267. dialogFormVisible: false,
  268. dialogStatus: '',
  269. textMap: {
  270. update: "编辑",
  271. create: "创建",
  272. },
  273. rules: {
  274. name: [{ required: true, message: "请填写商品名称", trigger: "blur" }],
  275. imgUrl: [{ required: true, message: "请上传商品图片", trigger: "blur" }],
  276. imgIds: [{ required: true, message: "请上传商品副图", trigger: "blur" }],
  277. productAttribute: [{ required: true, message: "请选择商品属性", trigger: "blur" }],
  278. price: [{ required: true, message: "请填写商品积分", trigger: "blur" }],
  279. hisPrice: [{ required: true, message: "请填写商品参考价格", trigger: "blur" }],
  280. actualStock: [{ required: true, message: "请设置库存量", trigger: "blur" }],
  281. deliveryTypes: [{ required: true, message: "请选择兑换方式", trigger: "blur" }],
  282. // location: [{ required: true, message: "请选择商品所在地", trigger: "blur" }],
  283. comment: [{ required: true, message: "说明不能为空", trigger: "blur" }],
  284. skuDesc: [{ required: true, message: "商品介绍不能为空", trigger: "blur" }],
  285. },
  286. dialogListVisible: false,
  287. fileImgUrl: this.upLoadUrl,
  288. }
  289. },
  290. created() {
  291. this.getProductAttributeList();
  292. this.getDataTypeList();
  293. this.getDepTypeList();
  294. this.getList();
  295. },
  296. methods: {
  297. getDeliveryTypeList(val){
  298. dataTypeList({dictType:val}).then(response => {
  299. this.deliveryTypeList = response.data.data;
  300. });
  301. },
  302. handleDownLoad(){
  303. window.location.href = process.env.BASE_API + '/mall-sku/exportSkuLog?skuId=' + this.itemListQuery.skuId + '&deptId=' + this.itemListQuery.deptId + '&userName=' + this.itemListQuery.userName;
  304. },
  305. changeProductAttribute(val) {
  306. debugger
  307. this.dataForm.deliveryTypes = [];
  308. // this.dataForm.location = undefined;
  309. this.getDeliveryTypeList(val);
  310. },
  311. handleRemove(file, fileList) {
  312. console.log(file, fileList);
  313. let images = [];
  314. for (let i in fileList) {
  315. let response = fileList[i].response;
  316. let url = response.data.url;
  317. images.push(url);
  318. this.dataForm.imgUrl = images.join(",");
  319. }
  320. },
  321. handleAvatarSuccess(res, file, fileList) {
  322. console.log(file, fileList);
  323. console.log("------", "==========");
  324. console.log("res = ", res);
  325. let fileIds = [];
  326. for (let i in fileList) {
  327. let response = fileList[i].response;
  328. if (response.errno && response.errno != "0") {
  329. this.$message.error("该文件上传失败,已被移除,请重新上传!");
  330. // 上传失败移除该 file 对象
  331. fileList.splice(i, 1);
  332. } else {
  333. let id = fileList[i].response.data.id;
  334. fileIds.push(id);
  335. }
  336. }
  337. this.dataForm.imgIds = fileIds.join(",");
  338. },
  339. handleRemoveImgs(file, fileList) {
  340. console.log(file, fileList);
  341. let fileIds = [];
  342. for (let i in fileList) {
  343. let id = fileList[i].response.data.id;
  344. fileIds.push(id);
  345. }
  346. this.dataForm.imgIds = fileIds.join(",");
  347. },
  348. uploadBannerImg(file) {
  349. const isJPGs = file.type === "image/jpeg";
  350. console.log(isJPGs);
  351. },
  352. handleExceed(files, fileList) {
  353. this.$message.warning(
  354. `当前限制选择 1 个文件,本次选择了 ${files.length} 个文件!,共选择了 ${files.length + fileList.length
  355. } 个文件`
  356. );
  357. },
  358. handleGallerySucess(res, file, fileList) {
  359. this.dataForm.imgUrl = ""; // 清空画廊图片数组
  360. let images = [];
  361. for (let i in fileList) {
  362. let response = fileList[i].response;
  363. if (response.errno && response.errno != "0") {
  364. this.$message.error("该图片上传失败,已被移除,请重新上传!");
  365. // 上传失败移除该 file 对象
  366. fileList.splice(i, 1);
  367. } else {
  368. let url = response.data.url;
  369. images.push(url);
  370. }
  371. }
  372. this.dataForm.imgUrl = images.join(",");
  373. },
  374. resetForm() {
  375. this.dataForm = {
  376. skuType:0,
  377. comment: undefined,
  378. skuDesc: undefined,
  379. name: undefined,
  380. seq: undefined,
  381. productAttribute: undefined,
  382. imgUrl: undefined,
  383. price: undefined,
  384. hisPrice:undefined,
  385. actualStock: undefined,
  386. deliveryTypes: [],
  387. // location: undefined,
  388. images: [],
  389. imgIds: '',
  390. imgUrls:[],
  391. };
  392. },
  393. handleCreate() {
  394. this.resetForm();
  395. this.dialogFormVisible = true;
  396. this.dialogStatus = "create";
  397. this.$nextTick(() => {
  398. this.$refs.tinymce.setContent("");
  399. this.$refs.skuDesc.setContent("");
  400. this.$refs["dataForm"].clearValidate();
  401. });
  402. },
  403. createData() {
  404. this.$refs["dataForm"].validate((valid) => {
  405. if (valid) {
  406. console.log(this.dataForm);
  407. createItem(this.dataForm)
  408. .then((response) => {
  409. this.getList();
  410. this.dialogFormVisible = false;
  411. this.$notify({
  412. title: "成功",
  413. message: "创建成功",
  414. type: "success",
  415. duration: 2000,
  416. });
  417. this.reload();
  418. })
  419. .catch(() => { });
  420. }
  421. });
  422. },
  423. handleUpdate(row) {
  424. this.dataForm = Object.assign({}, row);
  425. this.dataForm.productAttribute = row.productAttribute.toString();
  426. let comment = this.dataForm.comment;
  427. let skuDesc = this.dataForm.skuDesc?this.dataForm.skuDesc:'';
  428. let val = row.productAttribute;
  429. this.getDeliveryTypeList(val);
  430. if (this.dataForm.imgUrl) {
  431. let images = this.dataForm.imgUrl.split(",");
  432. this.dataForm.images = [];
  433. for (let i in images) {
  434. let url = images[i];
  435. let name = "image_" + i;
  436. this.dataForm.images.push({
  437. name: name,
  438. url: url,
  439. response: { error: "0", data: { url: url } },
  440. });
  441. }
  442. }
  443. if (this.dataForm.imgs) {
  444. let imgs = this.dataForm.imgs;
  445. this.dataForm.imgUrls = [];
  446. for (let i in imgs) {
  447. let url = imgs[i].url;
  448. let name = "image_" + i;
  449. this.dataForm.imgUrls.push({
  450. name: name,
  451. url: url,
  452. response: { error: "0", data: imgs[i] },
  453. });
  454. }
  455. }
  456. this.dialogStatus = 'update'
  457. this.dialogFormVisible = true
  458. this.$nextTick(() => {
  459. this.$refs.tinymce.setContent(comment);
  460. this.$refs.skuDesc.setContent(skuDesc);
  461. this.$refs['dataForm'].clearValidate()
  462. })
  463. },
  464. updateData() {
  465. this.$refs['dataForm'].validate((valid) => {
  466. if (valid) {
  467. updateItem(this.dataForm).then(() => {
  468. this.dialogFormVisible = false
  469. this.$notify({
  470. title: '成功',
  471. message: '更新成功',
  472. type: 'success',
  473. duration: 2000
  474. })
  475. this.getList()
  476. })
  477. }
  478. })
  479. },
  480. changeGoodsState(id, index) {
  481. goodsState({ skuType:0,skuId: id, status: index }).then(response => {
  482. this.$notify({
  483. title: '成功',
  484. message: '商品状态修改成功',
  485. type: 'success',
  486. duration: 2000
  487. })
  488. this.getList()
  489. })
  490. },
  491. handleDelete(id, index) {
  492. this.$confirm('确认删除吗?', '提示', {
  493. confirmButtonText: '确定',
  494. cancelButtonText: '取消',
  495. type: 'warning'
  496. }).then(() => {
  497. goodsState({skuType:0, skuId: id, status: index }).then(response => {
  498. this.$notify({
  499. title: '成功',
  500. message: '删除成功',
  501. type: 'success',
  502. duration: 2000
  503. })
  504. this.getList();
  505. })
  506. }).catch(() => {
  507. })
  508. },
  509. getDataTypeList() {
  510. dataTypeList({dictType:'mall_sku_location'}).then(response => {
  511. this.locationList = response.data.data;
  512. }).catch(() => {});
  513. },
  514. getProductAttributeList(){
  515. dataTypeList({dictType:'mall_sku_attribute'}).then(response => {
  516. this.productAttributeList = response.data.data;
  517. }).catch(() => {});
  518. },
  519. getDepTypeList() {
  520. depTypeList().then(response => {
  521. this.depTypeList = response.data.data;
  522. }).catch(() => {});
  523. },
  524. getList() {
  525. this.listLoading = true
  526. goodsList(this.listQuery).then(response => {
  527. this.list = response.data.data.items
  528. this.total = response.data.data.total
  529. this.listLoading = false
  530. }).catch(() => {})
  531. },
  532. getItemList() {
  533. this.listLoading = true
  534. exchangeHistory(this.itemListQuery).then(response => {
  535. this.itemList = response.data.data.items
  536. this.itemLotal = response.data.data.total
  537. this.listLoading = false
  538. }).catch(() => {})
  539. },
  540. handleFilter() {
  541. this.listQuery.page = 1
  542. this.getList()
  543. },
  544. handleSizeChange(val) {
  545. this.listQuery.limit = val
  546. this.getList()
  547. },
  548. handleCurrentChange(val) {
  549. this.listQuery.page = val
  550. this.getList()
  551. },
  552. itemHandleFilter() {
  553. this.itemListQuery.page = 1
  554. this.getItemList()
  555. },
  556. itemHandleSizeChange(val) {
  557. this.itemListQuery.limit = val
  558. this.getItemList()
  559. },
  560. itemHandleCurrentChange(val) {
  561. this.itemListQuery.page = val
  562. this.getItemList()
  563. },
  564. handleView(row) {
  565. this.itemListQuery.skuId = row.skuId;
  566. this.getItemList();
  567. this.dialogListVisible = true
  568. },
  569. }
  570. }
  571. </script>
  572. <style>
  573. .ad-avatar-uploader .el-upload {
  574. border: 1px dashed #d9d9d9;
  575. border-radius: 6px;
  576. cursor: pointer;
  577. position: relative;
  578. overflow: hidden;
  579. }
  580. .ad-avatar-uploader .el-upload:hover {
  581. border-color: #409EFF;
  582. }
  583. .ad-avatar-uploader-icon {
  584. font-size: 28px;
  585. color: #8c939d;
  586. width: 178px;
  587. height: 178px;
  588. line-height: 178px;
  589. text-align: center;
  590. }
  591. .ad-avatar {
  592. display: block;
  593. }
  594. </style>