| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505 |
- <!-- b y 7 5 2 7 1 8 9 2 0 -->
- <template>
- <div class="main">
- <a-form :form="form" class="user-layout-login" ref="formLogin" id="formLogin">
- <a-form-item>
- <a-input
- size="large"
- v-decorator="['loginName', { initialValue: '', rules: validatorRules.loginName.rules }]"
- type="text"
- placeholder="请输入用户名"
- >
- <a-icon slot="prefix" type="user" :style="{ color: 'rgba(0,0,0,.25)' }" />
- </a-input>
- </a-form-item>
- <a-form-item>
- <a-input-password
- v-decorator="['password', { initialValue: '', rules: validatorRules.password.rules }]"
- size="large"
- type="password"
- autocomplete="false"
- placeholder="请输入密码"
- >
- <a-icon slot="prefix" type="lock" :style="{ color: 'rgba(0,0,0,.25)' }" />
- </a-input-password>
- </a-form-item>
- <a-row :gutter="0">
- <a-col :span="14">
- <a-form-item>
- <a-input
- v-decorator="['inputCode', { initialValue: '', rules: validatorRules.inputCode.rules }]"
- size="large"
- type="text"
- default-value=""
- placeholder="请输入验证码"
- >
- <a-icon slot="prefix" type="smile" :style="{ color: 'rgba(0,0,0,.25)' }" />
- </a-input>
- </a-form-item>
- </a-col>
- <a-col :span="10" style="text-align: right">
- <img v-if="requestCodeSuccess" style="margin-top: 2px" :src="randCodeImage" @click="handleChangeCheckCode" />
- <img v-else style="margin-top: 2px" src="../../assets/checkcode.png" @click="handleChangeCheckCode" />
- </a-col>
- </a-row>
- <a-form-item>
- <a-checkbox :checked="checked" @change="handleChange">记住密码</a-checkbox>
- </a-form-item>
- <a-form-item style="margin-top: 16px">
- <a-button
- size="large"
- type="primary"
- htmlType="submit"
- class="login-button"
- :loading="loginBtn"
- @click.stop.prevent="handleSubmit"
- :disabled="loginBtn"
- >登 录
- </a-button>
- </a-form-item>
- <div class="login-copyright" v-if="device === 'mobile'">
- <a-row>
- <a-col>
- © 2015-2030 Powered By
- <a style="color: #00458a" :href="systemUrl" target="_blank">官方网站</a>
- </a-col>
- </a-row>
- </div>
- </a-form>
- </div>
- </template>
- <!-- BY cao_yu_li -->
- <script>
- import md5 from 'md5'
- import TwoStepCaptcha from '@/components/tools/TwoStepCaptcha'
- import { mapActions } from 'vuex'
- import { timeFix } from '@/utils/util'
- import Vue from 'vue'
- import { getPlatformConfigByKey } from '@/api/api'
- import { ACCESS_TOKEN, ENCRYPTED_STRING } from '@/store/mutation-types'
- import { getAction } from '@/api/manage'
- import { getEncryptedString } from '@/utils/encryption/aesEncrypt'
- import { mixinDevice } from '@/utils/mixin.js'
- export default {
- components: {
- TwoStepCaptcha,
- },
- mixins: [mixinDevice],
- data() {
- return {
- customActiveKey: 'tab1',
- systemTitle: window.SYS_TITLE,
- systemUrl: window.SYS_URL,
- loginBtn: false,
- // login type: 0 email, 1 username, 2 telephone
- loginType: 0,
- requiredTwoStepCaptcha: false,
- stepCaptchaVisible: false,
- form: this.$form.createForm(this),
- encryptedString: {
- key: '',
- iv: '',
- },
- state: {
- time: 60,
- smsSendBtn: false,
- },
- validatorRules: {
- loginName: { rules: [{ required: true, message: '请输入用户名!' }, { validator: this.handleLoginName }] },
- password: { rules: [{ required: true, message: '请输入密码!', validator: 'click' }] },
- inputCode: { rules: [{ required: true, message: '请输入验证码!', validator: 'click' }] },
- },
- verifiedCode: '',
- inputCodeContent: '', //20200510 cfm: 为方便测试,不输入验证码可 ""-->"xxxx"
- inputCodeNull: true,
- departList: [],
- departVisible: false,
- departSelected: '',
- currentUsername: '',
- validate_status: '',
- currdatetime: '',
- uuid: '',
- randCodeImage: '',
- registerFlag: '',
- requestCodeSuccess: false,
- checked: false,
- }
- },
- created() {
- this.loadInfo()
- this.checkScreen()
- this.currdatetime = new Date().getTime()
- Vue.ls.remove(ACCESS_TOKEN)
- this.getRouterData()
- this.getRegisterFlag()
- this.handleChangeCheckCode()
- },
- methods: {
- ...mapActions(['Login', 'Logout']),
- // handler
- loadInfo() {
- //从缓存中获取登录名和密码
- this.$nextTick(() => {
- if (Vue.ls.get('cache_loginName') && Vue.ls.get('cache_password')) {
- this.form.setFieldsValue({ loginName: Vue.ls.get('cache_loginName') })
- this.form.setFieldsValue({ password: Vue.ls.get('cache_password') })
- this.checked = true
- }
- })
- //从注册页面跳转过来,给登录名进行赋值
- if (this.$route.params.loginName) {
- this.$nextTick(() => {
- //先清空缓存
- Vue.ls.remove('cache_loginName')
- Vue.ls.remove('cache_password')
- this.form.setFieldsValue({ loginName: this.$route.params.loginName })
- this.form.setFieldsValue({ password: '' })
- this.checked = false
- })
- }
- },
- handleLoginName(rule, value, callback) {
- const regex = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\.[a-zA-Z0-9_-]{2,3}){1,2})$/
- if (regex.test(value)) {
- this.loginType = 0
- } else {
- this.loginType = 1
- }
- callback()
- },
- //切换勾选
- handleChange(e) {
- this.checked = e.target.checked
- },
- handleChangeCheckCode() {
- getAction('/user/randomImage')
- .then((res) => {
- if (res.code == 200) {
- this.uuid = res.data.uuid
- this.randCodeImage = res.data.base64
- this.requestCodeSuccess = true
- } else {
- this.$message.error(res.data)
- this.requestCodeSuccess = false
- }
- })
- .catch(() => {
- this.requestCodeSuccess = false
- })
- },
- handleSubmit() {
- let that = this
- let loginParams = {}
- that.loginBtn = true
- // 使用账户密码登陆
- if (that.customActiveKey === 'tab1') {
- that.form.validateFields(['loginName', 'password', 'inputCode'], { force: true }, (err, values) => {
- if (!err) {
- loginParams.loginName = values.loginName
- loginParams.password = md5(values.password)
- loginParams.code = values.inputCode
- loginParams.uuid = that.uuid
- if (that.checked) {
- //勾选的时候进行缓存
- Vue.ls.set('cache_loginName', values.loginName)
- Vue.ls.set('cache_password', values.password)
- } else {
- //没勾选的时候清缓存
- Vue.ls.remove('cache_loginName')
- Vue.ls.remove('cache_password')
- }
- that
- .Login(loginParams)
- .then((res) => {
- this.departConfirm(res, loginParams.loginName)
- })
- .catch((err) => {
- that.requestFailed(err)
- })
- } else {
- that.loginBtn = false
- }
- })
- }
- },
- loginSuccess(res) {
- let that = this
- this.$router.push({ path: '/dashboard/analysis' })
- this.$notification.success({
- message: '欢迎',
- description: `${timeFix()},欢迎回来`,
- })
- if (res.data.pwdSimple) {
- setTimeout(function () {
- that.$notification.warning({
- message: '友情提醒',
- description: '密码过于简单,请尽快修改',
- })
- }, 3000)
- }
- if (res.data && res.data.user) {
- if (res.data.user.loginName === 'admin') {
- let desc =
- 'admin只是平台运维用户,真正的管理员是租户(测试账号为jsh),admin不能编辑任何业务数据,只能配置平台菜单和创建租户'
- this.$message.info(desc, 30)
- } else {
- getPlatformConfigByKey({ platformKey: 'bill_excel_url' }).then((res) => {
- if (res && res.code === 200) {
- if (res.data.platformValue) {
- Vue.ls.set('isShowExcel', true)
- } else {
- Vue.ls.set('isShowExcel', false)
- }
- }
- })
- getAction('/user/infoWithTenant', {}).then((res) => {
- if (res && res.code === 200) {
- let currentTime = new Date() //新建一个日期对象,默认现在的时间
- let expireTime = new Date(res.data.expireTime) //设置过去的一个时间点,"yyyy-MM-dd HH:mm:ss"格式化日期
- let type = res.data.type //租户类型,0免费租户,1付费租户
- let difftime = expireTime - currentTime //计算时间差
- let tipInfo = '您好,服务即将到期,请及时续费!'
- //0免费租户-如果距离到期还剩5天就进行提示续费
- if (type === '0' && difftime < 86400000 * 5) {
- this.$message.warning(tipInfo, 8)
- }
- //1付费租户-如果距离到期还剩15天就进行提示续费
- if (type === '1' && difftime < 86400000 * 15) {
- this.$message.warning(tipInfo, 8)
- }
- }
- })
- }
- }
- this.initMPropertyShort()
- },
- cmsFailed(err) {
- this.$notification['error']({
- message: '登录失败',
- description: err,
- duration: 4,
- })
- },
- requestFailed(err) {
- this.$notification['error']({
- message: '登录失败',
- description:
- ((err.response || {}).data || {}).message || err.message || err.data.message || '请求出现错误,请稍后再试',
- duration: 4,
- })
- //验证码刷新
- this.form.setFieldsValue({ inputCode: '' })
- this.handleChangeCheckCode()
- this.loginBtn = false
- },
- generateCode(value) {
- this.verifiedCode = value.toLowerCase()
- },
- departConfirm(res, loginName) {
- if (res.code === 200) {
- let err = {}
- if (res.data.msgTip === 'user can login') {
- this.loginSuccess(res)
- } else if (res.data.msgTip === 'user is not exist') {
- err.message = '用户不存在'
- this.requestFailed(err)
- this.Logout()
- } else if (res.data.msgTip === 'user password error') {
- err.message = '用户密码不正确'
- this.requestFailed(err)
- this.Logout()
- } else if (res.data.msgTip === 'user is black') {
- err.message = '用户被禁用'
- this.requestFailed(err)
- this.Logout()
- } else if (res.data.msgTip === 'tenant is black') {
- if (loginName === 'jsh') {
- err.message = 'jsh用户已停用,请注册租户进行体验!'
- } else {
- err.message = '用户所属的租户被禁用'
- }
- this.requestFailed(err)
- this.Logout()
- } else if (res.data.msgTip === 'tenant is expire') {
- err.message = '试用期已结束,请联系客服续费'
- this.requestFailed(err)
- this.Logout()
- } else if (res.data.msgTip === 'access service error') {
- err.message = '查询服务异常'
- this.requestFailed(err)
- this.Logout()
- }
- } else {
- this.requestFailed(res)
- this.Logout()
- }
- },
- getRouterData() {
- this.$nextTick(() => {
- if (this.$route.params.username) {
- this.form.setFieldsValue({
- username: this.$route.params.username,
- })
- }
- })
- },
- getRegisterFlag() {
- getAction('/platformConfig/getPlatform/registerFlag').then((res) => {
- this.registerFlag = res + ''
- })
- },
- //获取密码加密规则
- getEncrypte() {
- var encryptedString = Vue.ls.get(ENCRYPTED_STRING)
- if (encryptedString == null) {
- getEncryptedString().then((data) => {
- this.encryptedString = data
- })
- } else {
- this.encryptedString = encryptedString
- }
- },
- //加载商品属性
- initMPropertyShort() {
- getAction('/materialProperty/getAllList').then((res) => {
- if (res && res.code === 200) {
- if (res.data) {
- let thisRows = res.data //属性列表
- Vue.ls.set('materialPropertyList', thisRows, 7 * 24 * 60 * 60 * 1000)
- }
- }
- })
- },
- checkScreen() {
- let percentage = '100%'
- let basicWidth = 1920
- const currentWidth = window.screen.width
- const currentHeight = window.screen.height
- //浏览器的当前比例
- const currentRatio = window.devicePixelRatio.toFixed(2)
- //浏览器需要调整的比例
- let needRatio = 1
- let ratio = currentWidth / basicWidth
- if (ratio > 0.5 && ratio < 0.67) {
- percentage = '50%'
- needRatio = 0.5
- }
- if (ratio >= 0.67 && ratio < 0.75) {
- percentage = '67%'
- needRatio = 0.67
- } else if (ratio >= 0.75 && ratio < 0.8) {
- percentage = '75%'
- needRatio = 0.75
- } else if (ratio >= 0.8 && ratio < 0.9) {
- percentage = '80%'
- needRatio = 0.8
- } else if (ratio >= 1.1 && ratio < 1.25) {
- percentage = '110%'
- needRatio = 1.1
- } else if (ratio >= 1.25 && ratio < 1.5) {
- percentage = '125%'
- needRatio = 1.25
- } else if (ratio >= 1.5 && ratio < 1.75) {
- percentage = '150%'
- needRatio = 1.5
- }
- //console.log(currentRatio)
- //console.log(needRatio)
- if (currentRatio - 0 !== needRatio) {
- this.openNotificationWithIcon('warning', currentWidth, currentHeight, percentage)
- }
- },
- openNotificationWithIcon(type, currentWidth, currentHeight, percentage) {
- this.$notification[type]({
- message: '浏览器的缩放比例调整提示',
- description:
- '检测到您显示器的分辨率为:' +
- currentWidth +
- '*' +
- currentHeight +
- ' ,为了获得更好的操作体验,建议您将浏览器的缩放比例调整至' +
- percentage,
- duration: 10,
- })
- },
- },
- }
- </script>
- <style lang="less" scoped>
- .user-layout-login {
- label {
- font-size: 14px;
- }
- .ant-form-item {
- margin-bottom: 16px;
- }
- .getCaptcha {
- display: block;
- width: 100%;
- height: 40px;
- }
- .forge-password {
- font-size: 14px;
- font-weight: bolder;
- }
- button.login-button {
- padding: 0 15px;
- font-size: 16px;
- height: 40px;
- width: 100%;
- }
- .user-login-other {
- text-align: left;
- margin-top: 24px;
- line-height: 22px;
- .item-icon {
- font-size: 24px;
- color: rgba(0, 0, 0, 0.2);
- margin-left: 16px;
- vertical-align: middle;
- cursor: pointer;
- transition: color 0.3s;
- &:hover {
- color: #1890ff;
- }
- }
- .register {
- float: right;
- }
- }
- .weixin {
- padding-left: 10px;
- color: red;
- cursor: pointer;
- }
- }
- </style>
- <style>
- .valid-error .ant-select-selection__placeholder {
- color: #f5222d;
- }
- .login-copyright {
- text-align: center;
- margin-top: 20px;
- }
- .login-copyright,
- .login-copyright a {
- color: #666;
- }
- </style>
|