123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755 |
- <template>
- <div class="appBox">
- <div class="mainBox">
- <div class="leftBox">
- <!--大标题-->
- <div class="titleBox">
- <div class="titleEnglish">Operation Management Platform</div>
- <div class="titleChinaeseBox">
- <span class="titleChinasesTop">政讯通<br></span>
- <span class="titleChinasesBottom">运营管理平台</span>
- </div>
- </div>
- <!--背景颜色-->
- <div class="yellow" />
- <div class="blue" />
- <!--人物图片-->
- <img src="@/assets/login/Picture.png" class="TitleImg">
- </div>
- <div class="rightBox">
- <!--form登陆框-->
- <div class="loginFormBox">
- <!--开始验证表单 start-->
- <el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form" autocomplete="on" label-position="left">
- <div class="inputBox greyBg">
- <img src="@/assets/login/id-card-outline.png" class="inputIcon">
- <el-form-item prop="username">
- <el-input
- ref="username"
- v-model="loginForm.username"
- placeholder="请输入手机号"
- name="username"
- type="text"
- tabindex="1"
- autocomplete="off"
- />
- </el-form-item>
- </div>
- <div class="inputBox greyBg">
- <img src="@/assets/login/bag-remove-outline.png" class="inputIcon">
- <el-tooltip v-model="capsTooltip" content="Caps lock is On" placement="right" manual>
- <el-form-item prop="password">
- <el-input
- :key="passwordType"
- ref="password"
- v-model="loginForm.password"
- :type="passwordType"
- placeholder="请输入密码"
- name="password"
- tabindex="2"
- autocomplete="off"
- @keyup.native="checkCapslock"
- @blur="capsTooltip = false"
- @keyup.enter.native="handleLogin"
- />
- <span class="show-pwd" @click="showPwd">
- <svg-icon :icon-class="passwordType === 'password' ? 'eye' : 'eye-open'" />
- </span>
- </el-form-item>
- </el-tooltip>
- </div>
- <!-- <div class="inputBoxSpecial">
- <div class="inputBoxLeft greyBg">
- <img src="@/assets/login/hardware-chip-outline.png" class="inputIcon">
- <el-form-item prop="captcha">
- <el-input
- ref="captcha"
- v-model="loginForm.captcha"
- placeholder="图形验证码"
- name="captcha"
- type="text"
- tabindex="3"
- maxlength="4"
- autocomplete="off"
- />
- </el-form-item>
- </div>
- <div class="inputBoxRight greyBg">
- <div class="submitCode">
- <img :src="codeImg" class="codeImg" @click="getImgCode">
- </div>
- <div class="reloadBtn" @click="getImgCode">看不清?换一张图</div>
- </div>
- </div> -->
- <el-button :loading="loading" type="primary" class="loginBtn" @click.native.prevent="singleLogin">
- 登录
- </el-button>
- <!-- <div class="singleLogin" @click="goBackWebUrl"><i class="el-icon-refresh-right" /> 点此返回原网站</div> -->
- </el-form>
- <!--开始验证表单 end-->
- </div>
- </div>
- </div>
- </div>
- </template>
- <script>
- import { validUserPhone } from '@/utils/validate'
- import axios from 'axios'
- import BASEURL from '@/utils/baseUrl'
- export default {
- name: 'Login',
- data() {
- // 配置验证规则:用于表单验证
- const validateUsername = (rule, value, callback) => {
- if (!validUserPhone(value)) {
- callback(new Error('请输入正确的手机号!'))
- } else {
- callback()
- }
- }
- const validatePassword = (rule, value, callback) => {
- if (value.length < 6) {
- callback(new Error('密码不能低于6位!'))
- } else {
- callback()
- }
- }
- const validateCode = (rule, value, callback) => {
- if (value.length < 4) {
- callback(new Error('图形验证码不能低于4位!'))
- } else {
- callback()
- }
- }
- // 本页基础数据
- return {
- loginForm: { // 1.用户使用哪些信息登录
- username: '', // 15210211200
- password: '', // 111111
- type: 1, //1=账号密码登录
- captcha: '',//验证码图片
- code:''//验证code
- },
- loginRules: { // 2.配置from表单验证规则
- username: [{ required: true, trigger: 'blur', validator: validateUsername }],
- password: [{ required: true, trigger: 'blur', validator: validatePassword }],
- captcha: [{ required: true, trigger: 'blur', validator: validateCode }]
- },
- passwordType: 'password', // 3.密码域默认type 当显示密码的时候改为text
- capsTooltip: false,
- loading: false,
- showDialog: false,
- redirect: undefined,
- otherQuery: {},
- // 图像验证码
- captchaText: '', // 保存生成的验证码文本
- captchaInput: '', // 用户输入的验证码
- codeImg: '' // 图形验证码
- }
- },
- watch: {
- $route: {
- handler: function(route) {
- const query = route.query
- if (query) {
- this.redirect = query.redirect
- this.otherQuery = this.getOtherQuery(query)
- }
- },
- immediate: true
- }
- },
- mounted() {
- this.getImgCode()
- },
- watch: {
- $route: {
- handler: function(route) {
- const query = route.query
- if (query) {
- this.redirect = query.redirect
- this.otherQuery = this.getOtherQuery(query)
- }
- },
- immediate: true
- }
- },
- methods: {
- // 检查输入状态
- checkCapslock(e) {
- const { key } = e
- this.capsTooltip = key && key.length === 1 && (key >= 'A' && key <= 'Z')
- },
- // 切换密码框的显示与隐藏
- showPwd() {
- if (this.passwordType === 'password') {
- this.passwordType = ''
- } else {
- this.passwordType = 'password'
- }
- this.$nextTick(() => {
- this.$refs.password.focus()
- })
- },
- // 提交表单并跳转
- handleLogin() {
- this.$refs.loginForm.validate(valid => {
- if (valid) {
- //console.log(this.loginForm)
- //开始登录
- this.loading = true
- this.$store.dispatch('user/login', this.loginForm)
- .then( res => {
- this.loading = false
- console.log(res)
- if(res.code==0){
- this.$message({
- type:'error',
- message:res.message
- })
- }else if(res.code==200){
- console.log("登录成功,将跳转至详情页面!")
- this.$router.push({ path: this.redirect || '/', query: this.otherQuery })
- }else if(res.code!=0&&res.code!=200){
- this.$message({
- type:'error',
- message:res.message
- })
- }
- })
- .catch(() => {
- this.loading = false
- })
- } else {
- console.log('表单填写错误!请检查!')
- return false
- }
- })
- },
- // 请求图形验证码
- getImgCode() {
- const that = this
- this.$store.dispatch('user/getImgCode').then( res => {
- if(res.code==200){
- console.log(res)
- //that.codeImg = res.data
- that.codeImg = res.data.img;
- that.loginForm.code = res.data.code;
- console.log(that.loginForm)
- }else{
- this.$message.error("获取验证码失败,请稍后再试!")
- }
- }).catch(() => {
- this.loading = false
- })
- },
- getOtherQuery(query) {
- return Object.keys(query).reduce((acc, cur) => {
- if (cur !== 'redirect') {
- acc[cur] = query[cur]
- }
- return acc
- }, {})
- },
- // 单点登录 start ---------------------------------------->
- // 使用字符串操作提取 backurl 参数的值
- getBackUrl(url) {
- const params = url.split('?')[1]; // 获取问号后面的部分
- if (params) {
- const paramArray = params.split('&'); // 分割参数
- for (let param of paramArray) {
- const [key, value] = param.split('='); // 分割键值对
- if (key === 'backurl') {
- return decodeURIComponent(value); // 返回解码后的 backurl 值
- }
- }
- }
- return null; // 如果没有找到 backurl 参数,返回 null
- },
- //登录分路器 start ---------------------------------------->
- singleLogin() {
- //获得当前域名
- const urlString = window.location.href;
- // 创建一个URL对象
- const url = new URL(urlString);
- // 获取hash部分(即#后面的部分)
- const hash = url.hash;
- // 从hash中提取查询参数
- const hashParams = new URLSearchParams(hash.split('?')[1]);
- // 获取backurl参数的值
- const backurl = hashParams.get('backurl');
- // 获取backurl参数的值
- const userurl = hashParams.get('userurl');
- // 获取可能出现的内部值
- const system = hashParams.get('redirect');
- // 解码backurl
- const decodedBackurl = decodeURIComponent(backurl);
- const decodedUserurl = decodeURIComponent(userurl);
-
- // 第一种情况, 不含有backUrl或者userUrl 说明登录者是超级管理员
- if(hashParams.size==0||system=='/dashboard'){
- // 获取当前网址
- const currentUrl = window.location.origin.replace(/^https?:\/\//, '').split('/')[0];
- console.log("当前网址是:" + currentUrl);
- console.log("执行超级管理员登录!")
- this.login(1,currentUrl)
- }else{
- // 第二种情况,含有backurl 说明是单点登录
- if(backurl!=null){
- console.log("执行单点登录!")
- const backurlObj = new URL(decodedBackurl);
- const back_url = backurlObj.hostname;
- this.login(2,back_url)
- }else if(userurl!=null){
- //第三种情况 含有userurl 说明是会员登录
- console.log(user_url)
- console.log("执行会员登录!")
- const backurlObj = new URL(decodedUserurl);
- const user_url = backurlObj.hostname;
- if(user_url==""){
- this.$message.error("登录链接错误!")
- }else{
- console.log("当前登录链接是:" + user_url)
- this.login(3,user_url)
- }
- }else{
- //this.$message.error("检查登录链接失败,请从正规渠道登录!")
- //2025-3-21 不在验证其他可能的值,直接允许登录
- const currentUrl = window.location.origin.replace(/^https?:\/\//, '').split('/')[0];
- console.log("当前网址是:" + currentUrl);
- console.log("执行超级管理员登录!")
- this.login(1,currentUrl)
- }
- }
- },
- // 登录分路器 end ---------------------------------------->
- // 登录 start ---------------------------------------->
- login(type,url){
- console.log(BASEURL.WebCloginUrl)
- //超级管理员登录
- if(type==1){
- // 获取当前页面的 URL
- this.loginForm.userurl = url;
- this.$refs.loginForm.validate(valid => {
- if (valid) {
- this.loading = true
- this.$store.dispatch('user/login', this.loginForm).then( res => {
- this.loading = false
- console.log(res)
- if(res.code==0){
- this.$message({
- type:'error',
- message:res.message
- })
- }else if(res.code==200&&res.token!=''){
- this.sendUrlServ()
- console.log("登录成功,将跳转至详情页面!")
- this.$router.push({ path: this.redirect || '/', query: this.otherQuery })
- }else if(res.code!=0&&res.code!=200){
- this.$message({
- type:'error',
- message:res.message
- })
- }else if(res.token==''||res.token==null||res.token==undefined){
- this.$message({
- type:'error',
- message:"登录失败!未能正确获取用户token,请重试!"
- })
- }
- })
- }else {
- console.log('表单填写错误!请检查!')
- return false;
- }
- })
- }
- //单点登录
- if(type==2){
- // 获取当前页面的 URL
- this.loginForm.backurl = url;
- this.$refs.loginForm.validate(valid => {
- if (valid) {
- this.loading = true
- this.$store.dispatch('user/login', this.loginForm)
- .then( res => {
- this.loading = false
- console.log(res)
- if(res.code==0){
- this.$message({
- type:'error',
- message:res.message
- })
- }else if(res.code==200&&res.token!=''){
- const currentUrl = window.location.href;
- const backurlValue = this.getBackUrl(currentUrl);
- console.log("单点登录成功,开始启动跳转!")
- console.log(backurlValue)
- console.log(res.data.token)
- this.sendUrlServ()
- //下面还有一个
- //window.location.href = 'http://admindev.bjzxtw.org.cn/auth/back_login.php?backurl=' + backurlValue + '&token=' + res.data.token; //dev返回链接
- window.location.href = BASEURL.WebCloginUrl + '?backurl=' + backurlValue + '&token=' + res.data.token; //pre返回地址
- }else if(res.code!=0&&res.code!=200){
- this.$message({
- type:'error',
- message:res.message
- })
- }
- })
- .catch(() => {
- this.loading = false
- })
- } else {
- console.log('表单填写错误!请检查!')
- return false
- }
- })
- }
- //会员登录
- if(type==3){
- this.loginForm.userurl = url;
- this.$refs.loginForm.validate(valid => {
- if (valid) {
- this.loading = true;
- this.$store.dispatch('user/login', this.loginForm).then( res => {
- this.loading = false
- console.log(res)
- if(res.code==0||res.code==-1){
- this.$message({
- type:'error',
- message:res.message
- })
- }else if(res.code==200&&res.token!=''){
- this.sendUrlServ()
- console.log("登录成功,将跳转至详情页面!")
- this.$router.push({ path: this.redirect || '/', query: this.otherQuery })
- }else if(res.code!=0&&res.code!=200){
- this.$message({
- type:'error',
- message:res.message
- })
- }else if(res.token==''||res.token==null||res.token==undefined){
- this.$message({
- type:'error',
- message:"登录失败!未能正确获取用户token,请重试!"
- })
- }
- })
- }else {
- console.log('表单填写错误!请检查!')
- return false;
- }
- })
- }
- },
- // 登录 end ---------------------------------------->
- // 返回原网站 start---------------------------------------->
- goBackWebUrl(){
- // 获得当前域名
- const urlString = window.location.href;
- // 创建一个URL对象
- const url = new URL(urlString);
- // 获取hash部分(即#后面的部分)
- const hash = url.hash;
- // 从hash中提取查询参数
- const hashParams = new URLSearchParams(hash.split('?')[1]);
- // 获取backurl参数的值
- const backurl = hashParams.get('backurl');
- // 解码backurl
- const decodedBackurl = decodeURIComponent(backurl);
- if(hashParams.size!=0&&backurl!=null){
- window.location.href = decodedBackurl
- }else{
- this.$message.error("无法返回原网站,请检查登录地址链接!")
- }
- },
- //登录成功通知后端 上面还有一个
- sendUrlServ(){
- //axios.get('http://admindev.bjzxtw.org.cn/auth/loginapi.php',{params: {
- axios.get(BASEURL.WebCloginUrl,{params: {
- token: this.$store.state.user.token
- }}).then(res => {
- console.log(res)
- }).catch(err => {
- console.log(err)
- });
- // 新做的,待替换
- // this.$store.dispatch('user/loginapi', {
- // token: this.$store.state.user.token
- // }).then(res => {
- // console.log("单点登录成功!")
- // }).catch(err => {
- // console.log(err)
- // })
- }
- // 返回原网站 end---------------------------------------->
- }
- }
- </script>
- <style scoped lang="less">
- .singleLogin {
- font-size: 18px;
- color: #666;
- cursor: pointer;
- margin-top: 30px;
- width: 400px;
- text-align: center;
- }
- /*整体盒子模型 使用display flex布局保持中间主体始终居中*/
- .appBox{
- clear: both;
- width: 100%;
- height: 100%;
- display:flex;
- align-items: center;
- /*中央盒子模型 在1920x1080下将会保持恒定的显示效果 低于这个分辨率左侧将会自动收缩*/
- .mainBox {
- width: 100%;
- max-width: 1920px;
- display:flex;
- justify-content: center;
- margin: 0 auto;
- .leftBox{
- width: 55%; //左侧自动收缩 最低1057 最高1920 1057/1920=55%
- max-width: 1057px;
- margin-right: 50px;
- max-height:585px;
- height: 100vh;//自适应全屏高度
- position: relative;
- }
- .rightBox{
- max-width: 400px;
- height:360px;
- position: relative;
- }
- }
- /*中央左侧main内容*/
- /*1.标题文字 start*/
- .titleBox {
- width: 516px;
- height: 280px;
- position: absolute;
- z-index:9999;
- top:5%;
- left:2%;
- .titleEnglish{
- left: 0px;
- top: 238px;
- position: absolute;
- color: #333333;
- font-size: 32px;
- font-family: Microsoft YaHei;
- font-weight: 400;
- word-wrap: break-word
- }
- .titleChinaeseBox{
- left: 0px;
- top: 0px;
- position: absolute;
- .titleChinasesTop{
- color: #5570F1;
- font-size: 86px;
- font-family: Microsoft YaHei;
- font-weight: 700;
- word-wrap: break-word
- }
- .titleChinasesBottom{
- color: #333333;
- font-size: 86px;
- font-family: Microsoft YaHei;
- font-weight: 700;
- word-wrap: break-word
- }
- }
- }
- /*标题文字 end*/
- /*2.背景颜色 start*/
- .yellow,.blue {
- width: 226px;
- height: 226px;
- position: absolute;
- }
- .yellow{
- z-index:1000;
- opacity: 0.45;
- top:0;
- left:0;
- background: #DDA82A;
- border-radius: 50%;
- filter: blur(120px)
- }
- .blue{
- z-index:1001;
- bottom:15%;
- left:20%;
- background: #4461F2;
- border-radius: 50%;
- filter: blur(150px)
- }
- /*背景颜色 end*/
- /*3.背景图 start*/
- .TitleImg {
- display:block;
- position: absolute;
- z-index:1100;
- right:0;
- bottom:0;
- @media (max-width: 1366px) and (max-height: 768px) {
- transform: scale(0.7); //稍微缩小
- }
- }
- /*背景图 end*/
- /*中央右侧main内容*/
- /*登录框 start*/
- .loginFormBox {
- margin-top:15%;
- .inputBox {
- margin-bottom: 30px;
- .inputIcon {
- width: 24px;
- height: 24px;
- margin: 0 20px 0 20px;
- }
- .inputIconSmall {
- width: 18px;
- height: 18px;
- }
- }
- .inputBoxSpecial {
- justify-content: space-between;
- margin-bottom: 80px;
- }
- .inputBox,.inputBoxSpecial{
- height: 52px;
- width: 400px;
- box-sizing: border-box;
- align-items: center;
- display:flex;
- input {
- border:0;
- background: transparent;
- font-size: 18x;
- }
- input:focus {
- outline: none;
- }
- }
- .greyBg {
- background: rgba(239, 241, 249, 0.60);
- border-radius: 8px;
- }
- .inputBoxLeft {
- width:250px;
- height: 52px;
- box-sizing: border-box;
- align-items: center;
- display:flex;
- input {
- width: 150px;
- font-size: 16px;
- }
- .inputIcon {
- width: 24px;
- height: 24px;
- margin: 0 20px 0 20px;
- }
- }
- .inputBoxRight {
- width:140px;
- height: 52px;
- position: relative;
- .submitCode {
- height: 52px;
- box-sizing: border-box;
- padding-top: 5px;
- padding-left: 10px;
- cursor:pointer;
- .codeImg{
- display: block;
- width: 120px;
- height: 42px;
- }
- }
- }
- .reloadBtn {
- color: #5570F1;
- font-size: 12px;
- font-family: Microsoft YaHei;
- font-weight: 400;
- word-wrap: break-word;
- position: absolute;
- bottom: -20px;
- right: 0;
- cursor:pointer
- }
- .loginBtn {
- width: 400px;
- height: 58px;
- background: #5570F1;
- box-shadow: 0px 4px 19px rgba(85, 112, 241, 0.40);
- border-radius: 12px;
- font-size:24px;
- color:#fff;
- border:0;
- }
- }
- }
- /*验证码*/
- .captcha-img {
- cursor: pointer;
- width: 120px;
- height: 40px; /* 调整验证码图片大小 */
- }
- .show-pwd{
- margin-left: 30px;
- }
- /*登录框 end*/
- /*此处修改了element-ui中的部分内置样式,但是通过css-scope可以保证不会污染到全局*/
- /*在index中使用deep或者>>>深度选择器来修改el-input的默认样式*/
- /deep/ .el-input__inner {
- background: transparent;
- width:100%;
- border: 0;
- //border:0
- }
- /deep/ .el-form-item {
- margin-bottom: 0;
- }
- /deep/ .el-form-item__content {
- display: flex;
- width: 300px;
- }
- /deep/ .el-form-item__error {
- bottom: -34px;
- left:15px;
- line-height: 30px;
- }
- </style>
|