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.

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