index.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755
  1. <template>
  2. <div class="appBox">
  3. <div class="mainBox">
  4. <div class="leftBox">
  5. <!--大标题-->
  6. <div class="titleBox">
  7. <div class="titleEnglish">Operation Management Platform</div>
  8. <div class="titleChinaeseBox">
  9. <span class="titleChinasesTop">政讯通<br></span>
  10. <span class="titleChinasesBottom">运营管理平台</span>
  11. </div>
  12. </div>
  13. <!--背景颜色-->
  14. <div class="yellow" />
  15. <div class="blue" />
  16. <!--人物图片-->
  17. <img src="@/assets/login/Picture.png" class="TitleImg">
  18. </div>
  19. <div class="rightBox">
  20. <!--form登陆框-->
  21. <div class="loginFormBox">
  22. <!--开始验证表单 start-->
  23. <el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form" autocomplete="on" label-position="left">
  24. <div class="inputBox greyBg">
  25. <img src="@/assets/login/id-card-outline.png" class="inputIcon">
  26. <el-form-item prop="username">
  27. <el-input
  28. ref="username"
  29. v-model="loginForm.username"
  30. placeholder="请输入手机号"
  31. name="username"
  32. type="text"
  33. tabindex="1"
  34. autocomplete="off"
  35. />
  36. </el-form-item>
  37. </div>
  38. <div class="inputBox greyBg">
  39. <img src="@/assets/login/bag-remove-outline.png" class="inputIcon">
  40. <el-tooltip v-model="capsTooltip" content="Caps lock is On" placement="right" manual>
  41. <el-form-item prop="password">
  42. <el-input
  43. :key="passwordType"
  44. ref="password"
  45. v-model="loginForm.password"
  46. :type="passwordType"
  47. placeholder="请输入密码"
  48. name="password"
  49. tabindex="2"
  50. autocomplete="off"
  51. @keyup.native="checkCapslock"
  52. @blur="capsTooltip = false"
  53. @keyup.enter.native="handleLogin"
  54. />
  55. <span class="show-pwd" @click="showPwd">
  56. <svg-icon :icon-class="passwordType === 'password' ? 'eye' : 'eye-open'" />
  57. </span>
  58. </el-form-item>
  59. </el-tooltip>
  60. </div>
  61. <!-- <div class="inputBoxSpecial">
  62. <div class="inputBoxLeft greyBg">
  63. <img src="@/assets/login/hardware-chip-outline.png" class="inputIcon">
  64. <el-form-item prop="captcha">
  65. <el-input
  66. ref="captcha"
  67. v-model="loginForm.captcha"
  68. placeholder="图形验证码"
  69. name="captcha"
  70. type="text"
  71. tabindex="3"
  72. maxlength="4"
  73. autocomplete="off"
  74. />
  75. </el-form-item>
  76. </div>
  77. <div class="inputBoxRight greyBg">
  78. <div class="submitCode">
  79. <img :src="codeImg" class="codeImg" @click="getImgCode">
  80. </div>
  81. <div class="reloadBtn" @click="getImgCode">看不清?换一张图</div>
  82. </div>
  83. </div> -->
  84. <el-button :loading="loading" type="primary" class="loginBtn" @click.native.prevent="singleLogin">
  85. 登录
  86. </el-button>
  87. <!-- <div class="singleLogin" @click="goBackWebUrl"><i class="el-icon-refresh-right" /> 点此返回原网站</div> -->
  88. </el-form>
  89. <!--开始验证表单 end-->
  90. </div>
  91. </div>
  92. </div>
  93. </div>
  94. </template>
  95. <script>
  96. import { validUserPhone } from '@/utils/validate'
  97. import axios from 'axios'
  98. import BASEURL from '@/utils/baseUrl'
  99. export default {
  100. name: 'Login',
  101. data() {
  102. // 配置验证规则:用于表单验证
  103. const validateUsername = (rule, value, callback) => {
  104. if (!validUserPhone(value)) {
  105. callback(new Error('请输入正确的手机号!'))
  106. } else {
  107. callback()
  108. }
  109. }
  110. const validatePassword = (rule, value, callback) => {
  111. if (value.length < 6) {
  112. callback(new Error('密码不能低于6位!'))
  113. } else {
  114. callback()
  115. }
  116. }
  117. const validateCode = (rule, value, callback) => {
  118. if (value.length < 4) {
  119. callback(new Error('图形验证码不能低于4位!'))
  120. } else {
  121. callback()
  122. }
  123. }
  124. // 本页基础数据
  125. return {
  126. loginForm: { // 1.用户使用哪些信息登录
  127. username: '', // 15210211200
  128. password: '', // 111111
  129. type: 1, //1=账号密码登录
  130. captcha: '',//验证码图片
  131. code:''//验证code
  132. },
  133. loginRules: { // 2.配置from表单验证规则
  134. username: [{ required: true, trigger: 'blur', validator: validateUsername }],
  135. password: [{ required: true, trigger: 'blur', validator: validatePassword }],
  136. captcha: [{ required: true, trigger: 'blur', validator: validateCode }]
  137. },
  138. passwordType: 'password', // 3.密码域默认type 当显示密码的时候改为text
  139. capsTooltip: false,
  140. loading: false,
  141. showDialog: false,
  142. redirect: undefined,
  143. otherQuery: {},
  144. // 图像验证码
  145. captchaText: '', // 保存生成的验证码文本
  146. captchaInput: '', // 用户输入的验证码
  147. codeImg: '' // 图形验证码
  148. }
  149. },
  150. watch: {
  151. $route: {
  152. handler: function(route) {
  153. const query = route.query
  154. if (query) {
  155. this.redirect = query.redirect
  156. this.otherQuery = this.getOtherQuery(query)
  157. }
  158. },
  159. immediate: true
  160. }
  161. },
  162. mounted() {
  163. this.getImgCode()
  164. },
  165. watch: {
  166. $route: {
  167. handler: function(route) {
  168. const query = route.query
  169. if (query) {
  170. this.redirect = query.redirect
  171. this.otherQuery = this.getOtherQuery(query)
  172. }
  173. },
  174. immediate: true
  175. }
  176. },
  177. methods: {
  178. // 检查输入状态
  179. checkCapslock(e) {
  180. const { key } = e
  181. this.capsTooltip = key && key.length === 1 && (key >= 'A' && key <= 'Z')
  182. },
  183. // 切换密码框的显示与隐藏
  184. showPwd() {
  185. if (this.passwordType === 'password') {
  186. this.passwordType = ''
  187. } else {
  188. this.passwordType = 'password'
  189. }
  190. this.$nextTick(() => {
  191. this.$refs.password.focus()
  192. })
  193. },
  194. // 提交表单并跳转
  195. handleLogin() {
  196. this.$refs.loginForm.validate(valid => {
  197. if (valid) {
  198. //console.log(this.loginForm)
  199. //开始登录
  200. this.loading = true
  201. this.$store.dispatch('user/login', this.loginForm)
  202. .then( res => {
  203. this.loading = false
  204. console.log(res)
  205. if(res.code==0){
  206. this.$message({
  207. type:'error',
  208. message:res.message
  209. })
  210. }else if(res.code==200){
  211. console.log("登录成功,将跳转至详情页面!")
  212. this.$router.push({ path: this.redirect || '/', query: this.otherQuery })
  213. }else if(res.code!=0&&res.code!=200){
  214. this.$message({
  215. type:'error',
  216. message:res.message
  217. })
  218. }
  219. })
  220. .catch(() => {
  221. this.loading = false
  222. })
  223. } else {
  224. console.log('表单填写错误!请检查!')
  225. return false
  226. }
  227. })
  228. },
  229. // 请求图形验证码
  230. getImgCode() {
  231. const that = this
  232. this.$store.dispatch('user/getImgCode').then( res => {
  233. if(res.code==200){
  234. console.log(res)
  235. //that.codeImg = res.data
  236. that.codeImg = res.data.img;
  237. that.loginForm.code = res.data.code;
  238. console.log(that.loginForm)
  239. }else{
  240. this.$message.error("获取验证码失败,请稍后再试!")
  241. }
  242. }).catch(() => {
  243. this.loading = false
  244. })
  245. },
  246. getOtherQuery(query) {
  247. return Object.keys(query).reduce((acc, cur) => {
  248. if (cur !== 'redirect') {
  249. acc[cur] = query[cur]
  250. }
  251. return acc
  252. }, {})
  253. },
  254. // 单点登录 start ---------------------------------------->
  255. // 使用字符串操作提取 backurl 参数的值
  256. getBackUrl(url) {
  257. const params = url.split('?')[1]; // 获取问号后面的部分
  258. if (params) {
  259. const paramArray = params.split('&'); // 分割参数
  260. for (let param of paramArray) {
  261. const [key, value] = param.split('='); // 分割键值对
  262. if (key === 'backurl') {
  263. return decodeURIComponent(value); // 返回解码后的 backurl 值
  264. }
  265. }
  266. }
  267. return null; // 如果没有找到 backurl 参数,返回 null
  268. },
  269. //登录分路器 start ---------------------------------------->
  270. singleLogin() {
  271. //获得当前域名
  272. const urlString = window.location.href;
  273. // 创建一个URL对象
  274. const url = new URL(urlString);
  275. // 获取hash部分(即#后面的部分)
  276. const hash = url.hash;
  277. // 从hash中提取查询参数
  278. const hashParams = new URLSearchParams(hash.split('?')[1]);
  279. // 获取backurl参数的值
  280. const backurl = hashParams.get('backurl');
  281. // 获取backurl参数的值
  282. const userurl = hashParams.get('userurl');
  283. // 获取可能出现的内部值
  284. const system = hashParams.get('redirect');
  285. // 解码backurl
  286. const decodedBackurl = decodeURIComponent(backurl);
  287. const decodedUserurl = decodeURIComponent(userurl);
  288. // 第一种情况, 不含有backUrl或者userUrl 说明登录者是超级管理员
  289. if(hashParams.size==0||system=='/dashboard'){
  290. // 获取当前网址
  291. const currentUrl = window.location.origin.replace(/^https?:\/\//, '').split('/')[0];
  292. console.log("当前网址是:" + currentUrl);
  293. console.log("执行超级管理员登录!")
  294. this.login(1,currentUrl)
  295. }else{
  296. // 第二种情况,含有backurl 说明是单点登录
  297. if(backurl!=null){
  298. console.log("执行单点登录!")
  299. const backurlObj = new URL(decodedBackurl);
  300. const back_url = backurlObj.hostname;
  301. this.login(2,back_url)
  302. }else if(userurl!=null){
  303. //第三种情况 含有userurl 说明是会员登录
  304. console.log(user_url)
  305. console.log("执行会员登录!")
  306. const backurlObj = new URL(decodedUserurl);
  307. const user_url = backurlObj.hostname;
  308. if(user_url==""){
  309. this.$message.error("登录链接错误!")
  310. }else{
  311. console.log("当前登录链接是:" + user_url)
  312. this.login(3,user_url)
  313. }
  314. }else{
  315. //this.$message.error("检查登录链接失败,请从正规渠道登录!")
  316. //2025-3-21 不在验证其他可能的值,直接允许登录
  317. const currentUrl = window.location.origin.replace(/^https?:\/\//, '').split('/')[0];
  318. console.log("当前网址是:" + currentUrl);
  319. console.log("执行超级管理员登录!")
  320. this.login(1,currentUrl)
  321. }
  322. }
  323. },
  324. // 登录分路器 end ---------------------------------------->
  325. // 登录 start ---------------------------------------->
  326. login(type,url){
  327. console.log(BASEURL.WebCloginUrl)
  328. //超级管理员登录
  329. if(type==1){
  330. // 获取当前页面的 URL
  331. this.loginForm.userurl = url;
  332. this.$refs.loginForm.validate(valid => {
  333. if (valid) {
  334. this.loading = true
  335. this.$store.dispatch('user/login', this.loginForm).then( res => {
  336. this.loading = false
  337. console.log(res)
  338. if(res.code==0){
  339. this.$message({
  340. type:'error',
  341. message:res.message
  342. })
  343. }else if(res.code==200&&res.token!=''){
  344. this.sendUrlServ()
  345. console.log("登录成功,将跳转至详情页面!")
  346. this.$router.push({ path: this.redirect || '/', query: this.otherQuery })
  347. }else if(res.code!=0&&res.code!=200){
  348. this.$message({
  349. type:'error',
  350. message:res.message
  351. })
  352. }else if(res.token==''||res.token==null||res.token==undefined){
  353. this.$message({
  354. type:'error',
  355. message:"登录失败!未能正确获取用户token,请重试!"
  356. })
  357. }
  358. })
  359. }else {
  360. console.log('表单填写错误!请检查!')
  361. return false;
  362. }
  363. })
  364. }
  365. //单点登录
  366. if(type==2){
  367. // 获取当前页面的 URL
  368. this.loginForm.backurl = url;
  369. this.$refs.loginForm.validate(valid => {
  370. if (valid) {
  371. this.loading = true
  372. this.$store.dispatch('user/login', this.loginForm)
  373. .then( res => {
  374. this.loading = false
  375. console.log(res)
  376. if(res.code==0){
  377. this.$message({
  378. type:'error',
  379. message:res.message
  380. })
  381. }else if(res.code==200&&res.token!=''){
  382. const currentUrl = window.location.href;
  383. const backurlValue = this.getBackUrl(currentUrl);
  384. console.log("单点登录成功,开始启动跳转!")
  385. console.log(backurlValue)
  386. console.log(res.data.token)
  387. this.sendUrlServ()
  388. //下面还有一个
  389. //window.location.href = 'http://admindev.bjzxtw.org.cn/auth/back_login.php?backurl=' + backurlValue + '&token=' + res.data.token; //dev返回链接
  390. window.location.href = BASEURL.WebCloginUrl + '?backurl=' + backurlValue + '&token=' + res.data.token; //pre返回地址
  391. }else if(res.code!=0&&res.code!=200){
  392. this.$message({
  393. type:'error',
  394. message:res.message
  395. })
  396. }
  397. })
  398. .catch(() => {
  399. this.loading = false
  400. })
  401. } else {
  402. console.log('表单填写错误!请检查!')
  403. return false
  404. }
  405. })
  406. }
  407. //会员登录
  408. if(type==3){
  409. this.loginForm.userurl = url;
  410. this.$refs.loginForm.validate(valid => {
  411. if (valid) {
  412. this.loading = true;
  413. this.$store.dispatch('user/login', this.loginForm).then( res => {
  414. this.loading = false
  415. console.log(res)
  416. if(res.code==0||res.code==-1){
  417. this.$message({
  418. type:'error',
  419. message:res.message
  420. })
  421. }else if(res.code==200&&res.token!=''){
  422. this.sendUrlServ()
  423. console.log("登录成功,将跳转至详情页面!")
  424. this.$router.push({ path: this.redirect || '/', query: this.otherQuery })
  425. }else if(res.code!=0&&res.code!=200){
  426. this.$message({
  427. type:'error',
  428. message:res.message
  429. })
  430. }else if(res.token==''||res.token==null||res.token==undefined){
  431. this.$message({
  432. type:'error',
  433. message:"登录失败!未能正确获取用户token,请重试!"
  434. })
  435. }
  436. })
  437. }else {
  438. console.log('表单填写错误!请检查!')
  439. return false;
  440. }
  441. })
  442. }
  443. },
  444. // 登录 end ---------------------------------------->
  445. // 返回原网站 start---------------------------------------->
  446. goBackWebUrl(){
  447. // 获得当前域名
  448. const urlString = window.location.href;
  449. // 创建一个URL对象
  450. const url = new URL(urlString);
  451. // 获取hash部分(即#后面的部分)
  452. const hash = url.hash;
  453. // 从hash中提取查询参数
  454. const hashParams = new URLSearchParams(hash.split('?')[1]);
  455. // 获取backurl参数的值
  456. const backurl = hashParams.get('backurl');
  457. // 解码backurl
  458. const decodedBackurl = decodeURIComponent(backurl);
  459. if(hashParams.size!=0&&backurl!=null){
  460. window.location.href = decodedBackurl
  461. }else{
  462. this.$message.error("无法返回原网站,请检查登录地址链接!")
  463. }
  464. },
  465. //登录成功通知后端 上面还有一个
  466. sendUrlServ(){
  467. //axios.get('http://admindev.bjzxtw.org.cn/auth/loginapi.php',{params: {
  468. axios.get(BASEURL.WebCloginUrl,{params: {
  469. token: this.$store.state.user.token
  470. }}).then(res => {
  471. console.log(res)
  472. }).catch(err => {
  473. console.log(err)
  474. });
  475. // 新做的,待替换
  476. // this.$store.dispatch('user/loginapi', {
  477. // token: this.$store.state.user.token
  478. // }).then(res => {
  479. // console.log("单点登录成功!")
  480. // }).catch(err => {
  481. // console.log(err)
  482. // })
  483. }
  484. // 返回原网站 end---------------------------------------->
  485. }
  486. }
  487. </script>
  488. <style scoped lang="less">
  489. .singleLogin {
  490. font-size: 18px;
  491. color: #666;
  492. cursor: pointer;
  493. margin-top: 30px;
  494. width: 400px;
  495. text-align: center;
  496. }
  497. /*整体盒子模型 使用display flex布局保持中间主体始终居中*/
  498. .appBox{
  499. clear: both;
  500. width: 100%;
  501. height: 100%;
  502. display:flex;
  503. align-items: center;
  504. /*中央盒子模型 在1920x1080下将会保持恒定的显示效果 低于这个分辨率左侧将会自动收缩*/
  505. .mainBox {
  506. width: 100%;
  507. max-width: 1920px;
  508. display:flex;
  509. justify-content: center;
  510. margin: 0 auto;
  511. .leftBox{
  512. width: 55%; //左侧自动收缩 最低1057 最高1920 1057/1920=55%
  513. max-width: 1057px;
  514. margin-right: 50px;
  515. max-height:585px;
  516. height: 100vh;//自适应全屏高度
  517. position: relative;
  518. }
  519. .rightBox{
  520. max-width: 400px;
  521. height:360px;
  522. position: relative;
  523. }
  524. }
  525. /*中央左侧main内容*/
  526. /*1.标题文字 start*/
  527. .titleBox {
  528. width: 516px;
  529. height: 280px;
  530. position: absolute;
  531. z-index:9999;
  532. top:5%;
  533. left:2%;
  534. .titleEnglish{
  535. left: 0px;
  536. top: 238px;
  537. position: absolute;
  538. color: #333333;
  539. font-size: 32px;
  540. font-family: Microsoft YaHei;
  541. font-weight: 400;
  542. word-wrap: break-word
  543. }
  544. .titleChinaeseBox{
  545. left: 0px;
  546. top: 0px;
  547. position: absolute;
  548. .titleChinasesTop{
  549. color: #5570F1;
  550. font-size: 86px;
  551. font-family: Microsoft YaHei;
  552. font-weight: 700;
  553. word-wrap: break-word
  554. }
  555. .titleChinasesBottom{
  556. color: #333333;
  557. font-size: 86px;
  558. font-family: Microsoft YaHei;
  559. font-weight: 700;
  560. word-wrap: break-word
  561. }
  562. }
  563. }
  564. /*标题文字 end*/
  565. /*2.背景颜色 start*/
  566. .yellow,.blue {
  567. width: 226px;
  568. height: 226px;
  569. position: absolute;
  570. }
  571. .yellow{
  572. z-index:1000;
  573. opacity: 0.45;
  574. top:0;
  575. left:0;
  576. background: #DDA82A;
  577. border-radius: 50%;
  578. filter: blur(120px)
  579. }
  580. .blue{
  581. z-index:1001;
  582. bottom:15%;
  583. left:20%;
  584. background: #4461F2;
  585. border-radius: 50%;
  586. filter: blur(150px)
  587. }
  588. /*背景颜色 end*/
  589. /*3.背景图 start*/
  590. .TitleImg {
  591. display:block;
  592. position: absolute;
  593. z-index:1100;
  594. right:0;
  595. bottom:0;
  596. @media (max-width: 1366px) and (max-height: 768px) {
  597. transform: scale(0.7); //稍微缩小
  598. }
  599. }
  600. /*背景图 end*/
  601. /*中央右侧main内容*/
  602. /*登录框 start*/
  603. .loginFormBox {
  604. margin-top:15%;
  605. .inputBox {
  606. margin-bottom: 30px;
  607. .inputIcon {
  608. width: 24px;
  609. height: 24px;
  610. margin: 0 20px 0 20px;
  611. }
  612. .inputIconSmall {
  613. width: 18px;
  614. height: 18px;
  615. }
  616. }
  617. .inputBoxSpecial {
  618. justify-content: space-between;
  619. margin-bottom: 80px;
  620. }
  621. .inputBox,.inputBoxSpecial{
  622. height: 52px;
  623. width: 400px;
  624. box-sizing: border-box;
  625. align-items: center;
  626. display:flex;
  627. input {
  628. border:0;
  629. background: transparent;
  630. font-size: 18x;
  631. }
  632. input:focus {
  633. outline: none;
  634. }
  635. }
  636. .greyBg {
  637. background: rgba(239, 241, 249, 0.60);
  638. border-radius: 8px;
  639. }
  640. .inputBoxLeft {
  641. width:250px;
  642. height: 52px;
  643. box-sizing: border-box;
  644. align-items: center;
  645. display:flex;
  646. input {
  647. width: 150px;
  648. font-size: 16px;
  649. }
  650. .inputIcon {
  651. width: 24px;
  652. height: 24px;
  653. margin: 0 20px 0 20px;
  654. }
  655. }
  656. .inputBoxRight {
  657. width:140px;
  658. height: 52px;
  659. position: relative;
  660. .submitCode {
  661. height: 52px;
  662. box-sizing: border-box;
  663. padding-top: 5px;
  664. padding-left: 10px;
  665. cursor:pointer;
  666. .codeImg{
  667. display: block;
  668. width: 120px;
  669. height: 42px;
  670. }
  671. }
  672. }
  673. .reloadBtn {
  674. color: #5570F1;
  675. font-size: 12px;
  676. font-family: Microsoft YaHei;
  677. font-weight: 400;
  678. word-wrap: break-word;
  679. position: absolute;
  680. bottom: -20px;
  681. right: 0;
  682. cursor:pointer
  683. }
  684. .loginBtn {
  685. width: 400px;
  686. height: 58px;
  687. background: #5570F1;
  688. box-shadow: 0px 4px 19px rgba(85, 112, 241, 0.40);
  689. border-radius: 12px;
  690. font-size:24px;
  691. color:#fff;
  692. border:0;
  693. }
  694. }
  695. }
  696. /*验证码*/
  697. .captcha-img {
  698. cursor: pointer;
  699. width: 120px;
  700. height: 40px; /* 调整验证码图片大小 */
  701. }
  702. .show-pwd{
  703. margin-left: 30px;
  704. }
  705. /*登录框 end*/
  706. /*此处修改了element-ui中的部分内置样式,但是通过css-scope可以保证不会污染到全局*/
  707. /*在index中使用deep或者>>>深度选择器来修改el-input的默认样式*/
  708. /deep/ .el-input__inner {
  709. background: transparent;
  710. width:100%;
  711. border: 0;
  712. //border:0
  713. }
  714. /deep/ .el-form-item {
  715. margin-bottom: 0;
  716. }
  717. /deep/ .el-form-item__content {
  718. display: flex;
  719. width: 300px;
  720. }
  721. /deep/ .el-form-item__error {
  722. bottom: -34px;
  723. left:15px;
  724. line-height: 30px;
  725. }
  726. </style>