You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

796 lines
22 KiB

  1. <script setup>
  2. import { ref, onMounted, reactive, computed, watch, nextTick } from 'vue'
  3. import { ElMessage } from 'element-plus'
  4. import { Plus } from '@element-plus/icons-vue'
  5. import axios from 'axios'
  6. import { ElMessageBox } from 'element-plus'
  7. import API from '@/util/http.js'
  8. import { uploadFile } from '@/util/request.js';
  9. import moment from 'moment'
  10. import { range, re } from 'mathjs'
  11. import { utils, read } from 'xlsx'
  12. import throttle from 'lodash/throttle'
  13. // 定义 fixedAdminId
  14. // const fixedAdminId = 1;
  15. // 精网号去空格
  16. const trimJwCode = () => {
  17. if (recharge.value.jwcode) {
  18. recharge.value.jwcode = recharge.value.jwcode.replace(/\s/g, '');
  19. }
  20. }
  21. // 上传图片前的验证函数
  22. const beforeAvatarUpload = (file) => {
  23. const validTypes = ['image/jpeg', 'image/png'];
  24. const isImage = validTypes.includes(file.type);
  25. const isLt1M = file.size / 1024 / 1024 < 1;
  26. if (!isImage) {
  27. ElMessage.error('只能上传 JPG/PNG 图片!');
  28. return false;
  29. }
  30. if (!isLt1M) {
  31. ElMessage.error('图片大小不能超过 1MB!');
  32. return false;
  33. }
  34. return true;
  35. };
  36. // 这是添加上传图片的接口
  37. const imageUrl = ref('')
  38. const voucher = ref('')
  39. // const rateName = ref()
  40. const adminData = ref({})
  41. // 获取管理员信息
  42. const getAdminData = async function () {
  43. try {
  44. const result = await API({
  45. url: '/admin/userinfo',
  46. data: {}
  47. })
  48. adminData.value = result
  49. recharge.value.adminId = adminData.value.id
  50. recharge.value.market = adminData.value.market
  51. console.log('请求成功', result)
  52. console.log('用户信息', user.value)
  53. } catch (error) {
  54. console.log('请求失败', error)
  55. }
  56. }
  57. //提交禁止重复点击
  58. const addDisabled = ref(false)
  59. // 这是添加充值信息的表单
  60. const recharge = ref({
  61. jwcode: '', // jwcode 字段
  62. activity: '', // activity 字段
  63. voucher: '',
  64. rechargeWay: '客服充值',
  65. freeGold: "",
  66. money: null,
  67. permanentGold: "",
  68. rateName: null,
  69. rateId: null,
  70. payModel: '', // payModel 字段
  71. payTime: null, // payTime 字段
  72. remark: '', // remark 字段
  73. rechargeRatio: ''
  74. })
  75. // 这是添加充值信息的接口
  76. const add = async function () {
  77. try {
  78. const formattedRecharge = { ...recharge.value }
  79. // 将永久金币数、免费金币数和充值金额数乘以 100
  80. if (formattedRecharge.permanentGold) {
  81. formattedRecharge.permanentGold = Number(formattedRecharge.permanentGold) * 100;
  82. }
  83. if (formattedRecharge.freeGold) {
  84. formattedRecharge.freeGold = Number(formattedRecharge.freeGold) * 100;
  85. }
  86. if (formattedRecharge.money) {
  87. formattedRecharge.money = Number(formattedRecharge.money) * 100;
  88. }
  89. if (formattedRecharge.payTime) {
  90. // 使用 moment.js 格式化 payTime
  91. formattedRecharge.payTime = moment(formattedRecharge.payTime).format('YYYY-MM-DD HH:mm:ss')
  92. }
  93. console.log('开始添加充值信息', recharge.value)
  94. // 发送POST请求
  95. const result = await API({
  96. url: '/recharge/add',
  97. data: formattedRecharge
  98. })
  99. addDisabled.value = false
  100. if (result.code === 0) {
  101. ElMessage.error(result.msg)
  102. return
  103. }
  104. // 将响应结果存储到响应式数据中
  105. console.log('请求成功', result)
  106. // 显示成功消息
  107. ElMessage.success('添加成功')
  108. // 重置表单
  109. deleteRecharge()
  110. user.value = {}
  111. } catch (error) {
  112. console.log('请求失败', error)
  113. // 在这里可以处理错误逻辑,比如显示错误提示等
  114. }
  115. }
  116. //添加充值信息前的按钮点击事件,进行表单验证和用户确认操作
  117. const addBefore = () => {
  118. if(!recharge.value.permanentGold){
  119. recharge.value.permanentGold ='0'
  120. }
  121. if(!recharge.value.freeGold){
  122. recharge.value.freeGold ='0'
  123. }
  124. Ref.value.validate(async (valid) => {
  125. if (valid) {
  126. if (Number(recharge.value.permanentGold) === 0 && Number(recharge.value.freeGold) === 0) {
  127. ElMessage({
  128. type: 'error',
  129. message: '永久金币和免费金币不能同时为0'
  130. })
  131. return
  132. }
  133. if (recharge.value.rateName == null || recharge.value.rateName == '' || recharge.value.rateName == undefined) {
  134. ElMessage({
  135. type: 'error',
  136. message: '请选择币种'
  137. })
  138. return
  139. }
  140. if (recharge.value.money == null || recharge.value.money == '' || recharge.value.money == undefined) {
  141. ElMessage({
  142. type: 'error',
  143. message: '请输入充值金额'
  144. })
  145. return
  146. }
  147. // 根据选择的货币名称找到对应的 rateId
  148. const selectedRate = rateName.find(item => item.value === recharge.value.rateName)
  149. if (selectedRate) {
  150. recharge.value.rateId = selectedRate.rateId
  151. }
  152. ElMessageBox.confirm('确认充值?')
  153. .then(() => {
  154. addDisabled.value = true
  155. add()
  156. console.log('充值成功')
  157. })
  158. .catch(() => {
  159. console.log('取消充值')
  160. })
  161. } else {
  162. //提示
  163. ElMessage({
  164. type: 'error',
  165. message: '请检查输入内容'
  166. })
  167. }
  168. })
  169. }
  170. // 表单验证
  171. // 开始时间改变时,重新验证结束时间
  172. const Ref = ref(null)
  173. const rules = reactive({
  174. jwcode: [{
  175. required: true, validator: (rule, value, callback) => {
  176. if (!value) {
  177. callback(new Error('精网号不能为空'));
  178. return;
  179. }
  180. if (/[^0-9]/.test(value)) {
  181. callback(new Error('精网号只能包含数字'));
  182. return;
  183. }
  184. callback();
  185. }, trigger: 'blur'
  186. }],
  187. activity: [{ required: true, message: '请选择活动名称', trigger: 'blur' }],
  188. permanentGold: [
  189. { required: true, message: '请输入永久金币数', trigger: 'change' },
  190. {
  191. validator: (rule, value, callback) => {
  192. if(!value){
  193. value = '0'
  194. }
  195. // 检查是否包含特殊符号
  196. if (/[^0-9.]/.test(value)) {
  197. callback(new Error('不能包含特殊符号或负数'));
  198. return;
  199. }
  200. // 检查整数位数
  201. const integerPart = value.split('.')[0];
  202. if (integerPart.length > 6) {
  203. callback(new Error('整数位数不能超过6位'));
  204. return;
  205. }
  206. // 检查小数位数
  207. if (value.includes('.')) {
  208. const decimalPart = value.split('.')[1];
  209. if (decimalPart.length > 2) {
  210. callback(new Error('小数位数不能超过两位'));
  211. return;
  212. }
  213. }
  214. const numValue = Number(value);
  215. if (isNaN(numValue)) {
  216. callback(new Error('请输入有效的数字'));
  217. } else if (numValue < 0) {
  218. callback(new Error('输入金额不能小于0'));
  219. } else {
  220. callback();
  221. }
  222. },
  223. trigger: 'blur'
  224. }
  225. ],
  226. freeGold: [
  227. { required: true, message: '请输入免费金币数', trigger: 'change' },
  228. {
  229. validator: (rule, value, callback) => {
  230. if(!value){
  231. value = '0'
  232. }
  233. // 检查是否包含特殊符号
  234. if (/[^0-9.]/.test(value)) {
  235. callback(new Error('不能包含特殊符号或负数'));
  236. return;
  237. }
  238. // 检查整数位数
  239. const integerPart = value.split('.')[0];
  240. if (integerPart.length > 6) {
  241. callback(new Error('整数位数不能超过6位'));
  242. return;
  243. }
  244. // 检查小数位数
  245. if (value.includes('.')) {
  246. const decimalPart = value.split('.')[1];
  247. if (decimalPart.length > 2) {
  248. callback(new Error('小数位数不能超过两位'));
  249. return;
  250. }
  251. }
  252. const numValue = Number(value);
  253. if (isNaN(numValue)) {
  254. callback(new Error('请输入有效的数字'));
  255. } else if (numValue < 0) {
  256. callback(new Error('输入金额不能小于0'));
  257. } else {
  258. callback();
  259. }
  260. },
  261. trigger: 'blur'
  262. }
  263. ],
  264. rateName: [{
  265. required: true,
  266. message: '请选择货币名称',
  267. trigger: 'blur'
  268. }],
  269. money: [
  270. { required: true, message: '请输入充值金额', trigger: 'blur' },
  271. {
  272. validator: (rule, value, callback) => {
  273. // 检查是否包含特殊符号
  274. if (/[^0-9.]/.test(value)) {
  275. callback(new Error('不能包含特殊符号或负数'));
  276. return;
  277. }
  278. // 检查整数位数
  279. const integerPart = value.split('.')[0];
  280. if (integerPart.length > 6) {
  281. callback(new Error('整数位数不能超过6位'));
  282. return;
  283. }
  284. // 检查小数位数
  285. if (value.includes('.')) {
  286. const decimalPart = value.split('.')[1];
  287. if (decimalPart.length > 2) {
  288. callback(new Error('小数位数不能超过两位'));
  289. return;
  290. }
  291. }
  292. const numValue = Number(value);
  293. if (isNaN(numValue)) {
  294. callback(new Error('请输入有效的数字'));
  295. } else if (numValue < 0) {
  296. callback(new Error('输入金额不能小于0'));
  297. } else {
  298. callback();
  299. }
  300. },
  301. trigger: 'blur'
  302. }
  303. ],
  304. payModel: [{ required: true, message: '请选择付款方式', trigger: 'blur' }],
  305. payTime: [{ required: true, message: '请选择交款时间', trigger: 'blur' }]
  306. });
  307. // 查找客户信息的方法
  308. const user = ref({})
  309. const getUser = async function (jwcode) {
  310. trimJwCode();
  311. // 验证精网号
  312. if (!jwcode) {
  313. ElMessage.warning('精网号不能为空');
  314. return;
  315. }
  316. // 验证精网号是否为数字
  317. if (!/^\d{1,9}$/.test(jwcode)) {
  318. ElMessage.warning('精网号必须为数字且不超过九位');
  319. deleteRecharge()
  320. return;
  321. }
  322. try {
  323. const result = await API({
  324. url: '/user/selectUser',
  325. data: {
  326. jwcode: recharge.value.jwcode
  327. }
  328. })
  329. if (result.code === 0) {
  330. ElMessage.error(result.msg);
  331. } else if (result.data === null) {
  332. ElMessage.error("用户不存在");
  333. } else {
  334. user.value = result.data;
  335. console.log("用户信息", user.value);
  336. ElMessage.success("查询成功");
  337. }
  338. } catch (error) {
  339. console.log("请求失败", error);
  340. ElMessage.error("精网号错误");
  341. }
  342. }
  343. // 这是查询活动的接口,一期没有调用这个接口
  344. const activity = ref([])
  345. // const getActivity = async function () {
  346. // try {
  347. // // 发送POST请求
  348. // const result = await API({
  349. // url: '/general/activity',
  350. // data: {
  351. // }
  352. // })
  353. // // 将响应结果存储到响应式数据中
  354. // console.log('请求成功', result)
  355. // // 存储表格数据
  356. // activity.value = result.data
  357. // console.log('活动信息', activity.value)
  358. // } catch (error) {
  359. // console.log('activity请求失败', error)
  360. // // 在这里可以处理错误逻辑,比如显示错误提示等
  361. // }
  362. // }
  363. //货币条目
  364. const rateName = [
  365. {
  366. value: 'USD',
  367. label: 'USD',
  368. rateId: 1
  369. },
  370. {
  371. value: 'HKD',
  372. label: 'HKD',
  373. rateId: 2
  374. },
  375. {
  376. value: 'THB',
  377. label: 'THB',
  378. rateId: 3
  379. },
  380. {
  381. value: 'VND',
  382. label: 'VND',
  383. rateId: 4
  384. },
  385. {
  386. value: 'CAD',
  387. label: 'CAD',
  388. rateId: 5
  389. },
  390. {
  391. value: 'MYR',
  392. label: 'MYR',
  393. rateId: 6
  394. },
  395. {
  396. value: 'KRW',
  397. label: 'KRW',
  398. rateId: 7
  399. },
  400. {
  401. value: 'JPY',
  402. label: 'JPY',
  403. rateId: 8
  404. },
  405. {
  406. value: 'CNY',
  407. label: 'CNY',
  408. rateId: 9
  409. }
  410. ]
  411. // 修改上传处理
  412. const customUpload = async (options) => {
  413. try {
  414. const formData = new FormData();
  415. formData.append('file', options.file);
  416. const response = await axios.post(import.meta.env.VITE_UPLOAD_URL, formData, {
  417. headers: {
  418. 'Content-Type': 'multipart/form-data',
  419. 'Authorization': `Bearer ${localStorage.getItem('token')}`
  420. }
  421. });
  422. if (response.data.code === 200 && response.data.data) {
  423. // 传递原始文件对象和响应数据
  424. handleAvatarSuccess(response.data, options.file);
  425. ElMessage.success('上传成功');
  426. } else {
  427. ElMessage.error(response.data.msg || '上传失败');
  428. }
  429. } catch (error) {
  430. console.error('上传错误:', error);
  431. ElMessage.error(`上传失败: ${error.response?.data?.message || error.message}`);
  432. }
  433. };
  434. // 获取环境变量
  435. // const uploadUrl = import.meta.env.VITE_UPLOAD_URL;
  436. // 上传图片成功的回调函数
  437. const handleAvatarSuccess = (response, file) => {
  438. // 直接使用 file 对象创建 Object URL
  439. imageUrl.value = URL.createObjectURL(file);
  440. // 使用服务器返回的文件路径(根据实际响应结构调整)
  441. if (response && response.filePath) {
  442. recharge.value.voucher = response.filePath;
  443. } else if (response && response.url) {
  444. recharge.value.voucher = response.url;
  445. } else if (response && response.data) {
  446. // 假设响应结构为 { code: 200, data: { filePath: ... } }
  447. recharge.value.voucher = response.data.filePath || response.data.url;
  448. } else {
  449. // 后备方案:使用环境变量中的上传URL
  450. recharge.value.voucher = import.meta.env.VITE_UPLOAD_URL;
  451. }
  452. }
  453. //支付方式条目
  454. const payModel = [
  455. {
  456. value: '现金',
  457. label: '现金'
  458. },
  459. {
  460. value: '支票',
  461. label: '支票'
  462. },
  463. {
  464. value: '刷卡',
  465. label: '刷卡'
  466. },
  467. {
  468. value: '其他(各地区电子支付)',
  469. label: '其他(各地区电子支付)'
  470. }
  471. ]
  472. // }
  473. function handleActivityChange(value) {
  474. // 在这里执行你的逻辑,例如获取选中的值
  475. console.log('选中的值:', value)
  476. // getActivityById(value)
  477. console.log('看看', recharge.value)
  478. }
  479. //这是重置重置表单的方法
  480. const deleteRecharge = function () {
  481. recharge.value = {
  482. adminId: adminData.value.id,
  483. //adminId: fixedAdminId,
  484. market: adminData.value.market,
  485. voucher: '',
  486. rechargeWay: '客服充值',
  487. freeGold: '',
  488. money: null,
  489. permanentGold: '',
  490. rateId: null
  491. }
  492. imageUrl.value = ''
  493. recharge.value.rateName = ''
  494. }
  495. onMounted(async function () {
  496. await getAdminData()
  497. // await getCurrency()
  498. // await getActivity()// 现在的活动就是文字输入框,不需要请求接口,具体等后续需求
  499. })
  500. onMounted(() => {
  501. console.log('上传URL:', import.meta.env.VITE_UPLOAD_URL);
  502. });
  503. </script>
  504. <template>
  505. <div>
  506. <el-form :model="recharge" ref="Ref" :rules="rules" label-width="auto" label-position="right" style="max-width: 600px" class="add-form">
  507. <el-form-item prop="jwcode" label="精网号">
  508. <el-input v-model="recharge.jwcode" style="width: 220px" />
  509. <el-button type="primary" @click="getUser(recharge.jwcode)" style="margin-left: 20px">查询</el-button>
  510. </el-form-item>
  511. <!-- <el-form-item prop="activity" label="活动名称">
  512. <el-select
  513. v-model="recharge.activity"
  514. placeholder="请选择"
  515. style="width: 300px"
  516. @change="handleActivityChange"
  517. >
  518. <el-option
  519. v-for="(item, index) in activity"
  520. :key="index"
  521. :label="item"
  522. :value="item"
  523. />
  524. </el-select>
  525. </el-form-item> -->
  526. <el-form-item prop="activity" label="活动名称">
  527. <el-input v-model="recharge.activity" placeholder="请输入活动名称" style="width: 300px" />
  528. </el-form-item>
  529. <el-form-item prop="permanentGold" label="永久金币">
  530. <el-input v-model="recharge.permanentGold" placeholder="0" style="width: 100px" />
  531. <p></p>
  532. </el-form-item>
  533. <el-form-item prop="freeGold" label="免费金币">
  534. <el-input v-model="recharge.freeGold" placeholder="0" style="width: 100px" />
  535. <p></p>
  536. </el-form-item>
  537. <!-- <el-form-item label="充值金额">
  538. <el-select
  539. prop="moneys"
  540. v-model="rateName"
  541. placeholder="货币名称"
  542. style="width: 95px; margin-right: 5px"
  543. aria-required="true"
  544. >
  545. <el-option
  546. v-for="item in rateName"
  547. :key="item.value"
  548. :label="item.label"
  549. :value="item.value"
  550. />
  551. </el-select>
  552. <el-input prop="money" v-model="recharge.money" style="width: 200px" aria-required="true"/>
  553. </el-form-item> -->
  554. <el-form-item label="充值金额" required>
  555. <!-- 货币名称 -->
  556. <el-form-item prop="rateName" style="display: inline-block; margin-left:0;">
  557. <el-select v-model="recharge.rateName" placeholder="货币名称" style="width: 100px">
  558. <el-option v-for="item in rateName" :key="item.value" :label="item.label" :value="item.value" />
  559. </el-select>
  560. </el-form-item>
  561. <!-- 充值金额 -->
  562. <el-form-item prop="money" style="display: inline-block; margin-left:10px;">
  563. <el-input v-model="recharge.money" style="width: 190px" />
  564. </el-form-item>
  565. </el-form-item>
  566. <el-form-item prop="payModel" label="收款方式">
  567. <el-select v-model="recharge.payModel" placeholder="请选择" style="width: 300px">
  568. <el-option v-for="item in payModel" :key="item.value" :label="item.label" :value="item.value" />
  569. </el-select>
  570. </el-form-item>
  571. <el-form-item prop="payTime" label="交款时间">
  572. <!-- 修改 type 属性为 datetime 以支持时分秒选择 -->
  573. <el-date-picker v-model="recharge.payTime" type="datetime" style="width: 300px" />
  574. </el-form-item>
  575. <el-form-item prop="voucher" label="交款凭证" style="margin-bottom: 5px">
  576. <el-upload :http-request="customUpload" class="avatar-uploader" :show-file-list="false"
  577. :before-upload="beforeAvatarUpload" style="width: 100px; height: 115px">
  578. <img v-if="imageUrl" :src="imageUrl" class="avatar" style="width: 100px; height: 115px" />
  579. <el-icon v-else class="avatar-uploader-icon" style="width: 100px; height: 100px">
  580. <Plus />
  581. </el-icon>
  582. </el-upload>
  583. <p style="margin-left: 10px; color: rgb(177, 176, 176)">
  584. 仅支持.jpg .png格式文件1MB
  585. </p>
  586. </el-form-item>
  587. <el-form-item prop="remark" label="备注">
  588. <el-input v-model="recharge.remark" style="width: 300px" :rows="4" maxlength="100" show-word-limit
  589. type="textarea" />
  590. </el-form-item>
  591. <el-button @click="deleteRecharge" style="margin-left: 280px" type="success">重置</el-button>
  592. <el-button type="primary" :disabled="addDisabled" @click="addBefore"> 提交 </el-button>
  593. </el-form>
  594. <!-- 客户信息栏 -->
  595. <el-card v-if="user.jwcode" style="width: 800px; float: right" class="customer-info">
  596. <el-form :model="user" label-width="auto" style="max-width: 1000px" label-position="left">
  597. <el-text size="large" style="margin-left: 20px">客户信息</el-text>
  598. <!-- 第一行姓名 + 历史金币 -->
  599. <el-row style="margin-top: 20px">
  600. <el-col :span="9">
  601. <el-form-item label="姓名:">
  602. <p>{{ user.name }}</p>
  603. </el-form-item>
  604. </el-col>
  605. <el-col :span="14">
  606. <el-form-item label="历史金币总数">
  607. <!-- 检查 user.historySumGold 是否为有效的数字 -->
  608. <p style="color: #2fa1ff; margin-right: 5px" v-if="!isNaN(Number(user.historySumGold))">
  609. {{ Number(user.historySumGold) / 100 }}
  610. </p>
  611. <!-- 如果不是有效的数字显示默认值 -->
  612. <p v-else></p>
  613. </el-form-item>
  614. <el-form-item style="margin-top: -23px">
  615. <span style="display: inline; white-space: nowrap; color: #b1b1b1"
  616. v-if="user.historyPermanentGold !== undefined">(永久金币:{{ user.historyPermanentGold / 100 }};免费金币:{{
  617. (user.historyFreeGold) / 100
  618. }};任务金币:{{ user.historyTaskGold / 100 }})</span>
  619. </el-form-item>
  620. </el-col>
  621. </el-row>
  622. <!-- 第二行精网号 + 当前金币独立行 -->
  623. <el-row style="margin-top:-23px">
  624. <el-col :span="9">
  625. <el-form-item label="精网号">
  626. <p>{{ user.jwcode }}</p>
  627. </el-form-item>
  628. </el-col>
  629. <el-col :span="14">
  630. <el-form-item label="当前金币总数" style="width: 500px">
  631. <span style="color: #2fa1ff; margin-right: 5px" v-if="user.nowSumGold !== undefined">{{ user.nowSumGold
  632. /100}}</span>
  633. </el-form-item>
  634. <!-- 金币详情独立显示 -->
  635. <el-form-item style="margin-top: -23px"> <!-- 负边距减少间距 -->
  636. <span style="color: #b1b1b1; margin-left: 0px" v-if="user.nowPermanentGold !== undefined">(永久金币:{{
  637. user.nowPermanentGold /100}};
  638. 免费金币:{{ user.nowFreeGold / 100 }};
  639. 任务金币:{{ user.nowTaskGold / 100 }})</span>
  640. </el-form-item>
  641. </el-col>
  642. </el-row>
  643. <!-- 第三行首次充值日期 + 充值次数 -->
  644. <el-row style="margin-top:-23px">
  645. <el-col :span="9">
  646. <el-form-item label="首次充值日期">
  647. <p v-if="user.firstRecharge">
  648. {{ moment(user.firstRecharge).format('YYYY-MM-DD HH:mm:ss') }}
  649. </p>
  650. </el-form-item>
  651. </el-col>
  652. <el-col :span="14">
  653. <el-form-item label="充值次数">
  654. <p style="color: #2fa1ff">{{ user.rechargeNum }}</p>
  655. </el-form-item>
  656. </el-col>
  657. </el-row>
  658. <!-- 第四行消费次数 + 所属门店 -->
  659. <el-row>
  660. <el-col :span="9">
  661. <el-form-item label="消费次数">
  662. <p style="color: #2fa1ff">{{ user.consumeNum }}</p>
  663. </el-form-item>
  664. </el-col>
  665. <el-col :span="9">
  666. <el-form-item label="所属门店">
  667. <p>{{ user.market }}</p>
  668. </el-form-item>
  669. </el-col>
  670. </el-row>
  671. </el-form>
  672. </el-card>
  673. </div>
  674. </template>
  675. <style scoped>
  676. p {
  677. margin: 0px;
  678. }
  679. .batch-btn {
  680. margin-top: 20px;
  681. margin-left: auto;
  682. }
  683. .el-form-item {
  684. margin-left: 50px;
  685. }
  686. /* 上传图片的格式 */
  687. .avatar-uploader .avatar {
  688. width: 50px;
  689. height: 50px;
  690. display: block;
  691. }
  692. .error-message {
  693. color: red;
  694. font-size: 8px;
  695. }
  696. .is-invalid .el-input__inner {
  697. border-color: red;
  698. }
  699. .avatar-uploader .el-upload {
  700. border: 1px dashed var(--el-border-color);
  701. border-radius: 6px;
  702. cursor: pointer;
  703. position: relative;
  704. overflow: hidden;
  705. transition: var(--el-transition-duration-fast);
  706. }
  707. .avatar-uploader .el-upload:hover {
  708. border-color: var(--el-color-primary);
  709. }
  710. .el-icon.avatar-uploader-icon {
  711. font-size: 28px;
  712. color: #8c939d;
  713. width: 50px;
  714. height: 50px;
  715. text-align: center;
  716. }
  717. .add-form {
  718. margin-top: 50px;
  719. max-width: 50%;
  720. float: left;
  721. }
  722. .customer-info {
  723. max-width: 60%;
  724. }
  725. </style>