| | |
| | | <template> |
| | | <div class v-loading="vLoading" :style="`width: ${currentWidth}px;height:${currentHeight}px`"> |
| | | <div class="web-site"> |
| | | <a href="http://www.smartai.com" target="_blank">www.smartai.com</a> |
| | | </div> |
| | | <licence /> |
| | | <div class="right-bg" style> |
| | | <particle-network /> |
| | | </div> |
| | | <div class="left-bg"> |
| | | <div class="login-logo"> |
| | | <img src="/images/login-logo.png" alt width="105px" height="105px" /> |
| | | </div> |
| | | <div class="login-com"> |
| | | <span>北京贝思科技术有限公司</span> |
| | | </div> |
| | | <div class="login-form"> |
| | | <el-form |
| | | :model="user" |
| | | status-icon |
| | | :rules="nullRule" |
| | | :validate-on-rule-change="false" |
| | | ref="ruleForm" |
| | | class="demo-ruleForm" |
| | | > |
| | | <el-form-item prop="loginName"> |
| | | <el-input v-model="user.loginName" style="width:280px" placeholder="请输入用户名"> |
| | | <i slot="prefix" class="iconfont iconyonghu1"></i> |
| | | </el-input> |
| | | </el-form-item> |
| | | <el-form-item prop="password"> |
| | | <el-input |
| | | show-password |
| | | @keyup.enter.native="systemLogin()" |
| | | v-model="user.password" |
| | | autocomplete="off" |
| | | style="width:280px" |
| | | placeholder="请输入密码" |
| | | > |
| | | <i slot="prefix" class="iconfont iconmima"></i> |
| | | </el-input> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button ref="submit" type="warning" @click="systemLogin()" style="width:280px">登录</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | <p class="gradient-text gradient-text-one">——— {{serverTitle || 'SmartAI — ReID'}} ———</p> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import { tologin, getLoginUserData, getServerName } from './api.ts' |
| | | import ParticleNetwork from './ParticleNetwork' |
| | | import Licence from '@/components/licence' |
| | | import { getMenuListData, findButtonAuthoritys, findInArr } from "@/api/utils"; |
| | | |
| | | export default { |
| | | name: 'login-pgae', |
| | | metaInfo: { |
| | | title: '登录页' |
| | | }, |
| | | components: { |
| | | ParticleNetwork, |
| | | Licence |
| | | }, |
| | | data: () => ({ |
| | | serverTitle: "", |
| | | user: { |
| | | loginName: '', |
| | | password: '', |
| | | rememberMe: false |
| | | }, |
| | | nullRule: {}, |
| | | rules: { |
| | | loginName: [ |
| | | { required: true, message: '请输入用户名', trigger: 'change' } |
| | | ], |
| | | password: [{ required: true, message: '请输入密码', trigger: 'change' }] |
| | | }, |
| | | loading: '', |
| | | vLoading: false, |
| | | currentHeight: 1057, |
| | | currentWidth: 1920 |
| | | }), |
| | | created() { |
| | | this.getServerName() |
| | | this.getScreenHeight() |
| | | }, |
| | | mounted() { |
| | | console.log(this.serverTitle) |
| | | }, |
| | | watch: {}, |
| | | beforeDestroy() { |
| | | window.onresize = null |
| | | }, |
| | | methods: { |
| | | systemLogin() { |
| | | this.nullRule = this.rules |
| | | this.$nextTick(() => { |
| | | this.$refs['ruleForm'].validate(valid => { |
| | | if (valid) { |
| | | this.loading = this.$loading({ |
| | | lock: true, |
| | | text: 'Loading', |
| | | spinner: 'el-icon-loading', |
| | | background: 'rgba(0, 0, 0, 0.7)' |
| | | }) |
| | | this.testLogin() |
| | | // return false |
| | | } else { |
| | | this.nullRule = {} |
| | | } |
| | | }) |
| | | this.nullRule = {} |
| | | }) |
| | | }, |
| | | async testLogin() { |
| | | tologin({ username: this.user.loginName, password: this.user.password }) |
| | | .then(json => { |
| | | // console.log(json, "登录请求"); |
| | | const loginedInfo = { |
| | | access_token: json.token_type + ' ' + json.access_token, |
| | | refresh_token: json.refresh_token |
| | | } |
| | | sessionStorage.setItem('expires_in', json.expires_in) |
| | | sessionStorage.setItem('loginedInfo', JSON.stringify(loginedInfo)) |
| | | this.loading.close() |
| | | this.getLoginUserData() |
| | | }) |
| | | .catch(err => { |
| | | // console.log(err, "登录报错"); |
| | | this.loading.close() |
| | | this.$notify({ |
| | | title: '提示', |
| | | type: 'error', |
| | | message: err |
| | | }) |
| | | this.$refs.pwd.focus() |
| | | }) |
| | | }, |
| | | async getLoginUserData() { |
| | | let json = await getLoginUserData() |
| | | if (!json.error) { |
| | | // this.loading.close() |
| | | sessionStorage.setItem('userInfo', JSON.stringify(json)) |
| | | this.$notify({ |
| | | title: '提示', |
| | | type: 'success', |
| | | message: '登录成功!' |
| | | }) |
| | | |
| | | // 获取权限 |
| | | await this.getMenuList() |
| | | location.assign("/view/desktop/") |
| | | return json |
| | | } else { |
| | | this.$notify({ |
| | | title: '提示', |
| | | type: 'error', |
| | | message: '登录失败!' |
| | | }) |
| | | // this.loading.close() |
| | | } |
| | | }, |
| | | |
| | | getScreenHeight() { |
| | | this.currentHeight = document.documentElement.clientHeight |
| | | this.currentWidth = document.documentElement.clientWidth |
| | | // console.log(this.currentHeight, "当前窗口大小"); |
| | | window.onresize = () => { |
| | | this.currentHeight = document.documentElement.clientHeight |
| | | this.currentWidth = document.documentElement.clientWidth |
| | | // console.log(this.currentHeight, "当前窗口大小2", this.currentWidth); |
| | | this.$forceUpdate() |
| | | } |
| | | }, |
| | | async getServerName() { |
| | | let res = await getServerName() |
| | | if (res && res.success) { |
| | | console.log(res.data.serverName) |
| | | this.serverTitle = res.data.serverName |
| | | window.document.title = res.data.serverName |
| | | ? res.data.serverName |
| | | : 'SmartAI' |
| | | sessionStorage.setItem('title', res.data.serverName) |
| | | } |
| | | }, |
| | | async getMenuList() { |
| | | let results = await getMenuListData({}); |
| | | if (results && results.success) { |
| | | /* 存储权限 */ |
| | | let buttonAuthoritys = results.data; |
| | | // console.log(this.$route.query.is_loginsss) |
| | | if (results && results.length && this.$route.query.is_login) { |
| | | this.$router.replace(results[0].url); |
| | | } |
| | | sessionStorage.setItem("buttonAuthoritys", "," + buttonAuthoritys + ","); |
| | | sessionStorage.setItem("menuInfo", JSON.stringify(results)); |
| | | } else { |
| | | this.$toast({ |
| | | type: "error", |
| | | message: "菜单获取失败" |
| | | }); |
| | | } |
| | | }, |
| | | }, |
| | | } |
| | | </script> |
| | | <style lang="scss"> |
| | | .right-bg { |
| | | position: fixed; |
| | | top: 0; |
| | | left: 0; |
| | | background-image: url("/images/login-net.png"); |
| | | |
| | | width: 100%; |
| | | height: 100%; |
| | | min-width: 1000px; |
| | | z-index: -10; |
| | | zoom: 1; |
| | | background-color: #fff; |
| | | background-repeat: no-repeat; |
| | | background-size: cover; |
| | | -webkit-background-size: cover; |
| | | -o-background-size: cover; |
| | | background-position: center 0; |
| | | } |
| | | .web-site { |
| | | position: absolute; |
| | | top: 55px; |
| | | left: 41px; |
| | | font-family: PingFangSC-Medium; |
| | | font-size: 20px; |
| | | color: #6170e1; |
| | | letter-spacing: 6.15px; |
| | | } |
| | | .left-bg { |
| | | position: absolute; |
| | | top: 30%; |
| | | right: 18%; |
| | | width: 390px; |
| | | height: 402px; |
| | | background: rgba(146, 208, 255, 0.23); |
| | | border-radius: 4px; |
| | | text-align: center; |
| | | .login-logo { |
| | | margin-top: -53px; |
| | | } |
| | | |
| | | .login-com { |
| | | font-family: PingFangSC-Medium; |
| | | font-size: 22px; |
| | | color: #ffffff; |
| | | letter-spacing: 0.44px; |
| | | margin: 15px; |
| | | } |
| | | .login-form { |
| | | margin: 40px 10px; |
| | | // margin: 24px 10px 40px 10px; |
| | | } |
| | | .gradient-text { |
| | | line-height: 50px; |
| | | font-size: 20px; |
| | | font-family: -webkit-pictograph; |
| | | font-weight: bolder; |
| | | position: relative; |
| | | } |
| | | .gradient-text-one { |
| | | background-image: linear-gradient(to right, #51feff 5%, #ff8725 100%); |
| | | -webkit-background-clip: text; |
| | | -webkit-text-fill-color: transparent; |
| | | } |
| | | |
| | | .el-input__prefix { |
| | | left: 8px; |
| | | } |
| | | |
| | | .el-form-item__error { |
| | | left: 54px; |
| | | } |
| | | } |
| | | </style> |
| | | <template>
|
| | | <div class="init" v-if="!isWhite">
|
| | | <img class="img-test" onerror="console.log('网络故障')" />
|
| | | <div class="content">
|
| | | <div class="title">欢迎注册Smart AI 人工智能操作系统</div>
|
| | | <el-steps :active="active" finish-status="success" :align-center="true">
|
| | | <el-step title="创建账号"></el-step>
|
| | | <el-step title="配置网络"></el-step>
|
| | | <el-step title="注册信息"></el-step>
|
| | | </el-steps>
|
| | |
|
| | | <el-carousel ref="carousel" trigger="click" :loop="false" :autoplay="false" :initial-index="active">
|
| | | <el-carousel-item>
|
| | | <formAccount ref="form0" v-show="active == createUser"></formAccount>
|
| | | </el-carousel-item>
|
| | | <el-carousel-item>
|
| | | <formNet ref="form1" v-show="active == configNet"></formNet>
|
| | | </el-carousel-item>
|
| | | <el-carousel-item>
|
| | | <formInfo ref="form2" v-show="active == registerInfo"></formInfo>
|
| | | </el-carousel-item>
|
| | | </el-carousel>
|
| | |
|
| | | <div class="control">
|
| | | <div class="pre" @click="preForm" v-if="active != createUser">上一步</div>
|
| | | <div class="next" @click="nextForm" v-if="active == createUser || (active == configNet && !isOnline)">
|
| | | 下一步
|
| | | </div>
|
| | | <div class="next" @click="nextFormNot" v-if="active == configNet">跳过</div>
|
| | |
|
| | | <div class="next" @click="nextForm" v-if="active == registerInfo">完成</div>
|
| | | </div>
|
| | | </div>
|
| | | </div>
|
| | | <div class="white" v-else></div>
|
| | | </template>
|
| | |
|
| | | <script>
|
| | | import formAccount from "@/pages/index/components/formAccount"
|
| | | import formNet from "@/pages/index/components/formNet"
|
| | | import formInfo from "@/pages/index/components/formInfo"
|
| | | import { getInitInfo, savePassword, initNetwork, saveRegInfo, getRegInfo, isOnNet } from "./api"
|
| | |
|
| | | export default {
|
| | | name: "smartai init",
|
| | | components: {
|
| | | formAccount,
|
| | | formNet,
|
| | | formInfo
|
| | | },
|
| | | data() {
|
| | | return {
|
| | | active: 0,
|
| | | formData: {},
|
| | | isWhite: true,
|
| | | isOnline: false,
|
| | | createUser: 0,
|
| | | configNet: 1,
|
| | | registerInfo: 2
|
| | | }
|
| | | },
|
| | | mounted() {
|
| | | this.getInitInfo()
|
| | | let message = "网络正常"
|
| | |
|
| | | function onLine(callback) {
|
| | | var img = new Image()
|
| | | //临时判断网络是否通畅
|
| | | img.src = "http://apps.smartai.com/img/icons/favicon-32x32.png"
|
| | | img.onload = function() {
|
| | | if (callback) callback(true)
|
| | | }
|
| | | img.onerror = function() {
|
| | | if (callback) callback(false)
|
| | | }
|
| | | }
|
| | |
|
| | | onLine((flag) => {
|
| | | let message = ""
|
| | | if (flag) {
|
| | | this.isOnline = true
|
| | | message = "已有网络"
|
| | | } else {
|
| | | //网络断网效果图出来后,将此地改为跳转路径到效果图上
|
| | | message = "无法连接互联网"
|
| | | this.$notify({
|
| | | message: message
|
| | | })
|
| | | }
|
| | | })
|
| | | },
|
| | |
|
| | | methods: {
|
| | | preForm() {
|
| | | if (this.active == this.createUser) {
|
| | | return
|
| | | }
|
| | | this.active--
|
| | |
|
| | | // 如果网络正常, 直接跳过
|
| | | if (this.active == this.configNet && this.isOnline) {
|
| | | this.active--
|
| | | }
|
| | |
|
| | | this.$refs["carousel"].setActiveItem(this.active)
|
| | | },
|
| | | async nextForm() {
|
| | | // 提交注册信息
|
| | | if (this.active == this.registerInfo) {
|
| | | const data = this.$refs[`form${this.active}`].getFormData()
|
| | | await saveRegInfo(data)
|
| | | location.assign("/view/login/")
|
| | | return
|
| | | }
|
| | |
|
| | | // 配置网络
|
| | | if (this.active == this.configNet) {
|
| | | const data = this.$refs[`form${this.active}`].getFormData()
|
| | | initNetwork(data)
|
| | | }
|
| | |
|
| | | // 创建用户
|
| | | if (this.active == this.createUser) {
|
| | | const data = this.$refs[`form${this.active}`].getFormData()
|
| | | if (!data) {
|
| | | return false
|
| | | }
|
| | |
|
| | | await savePassword(data)
|
| | |
|
| | | // 如果网络正常, 直接跳到第三部
|
| | | if (this.isOnline) {
|
| | | this.active++
|
| | | }
|
| | | }
|
| | |
|
| | | this.active++
|
| | | this.$refs["carousel"].setActiveItem(this.active)
|
| | | },
|
| | | async nextFormNot() {
|
| | | await this.getInitInfo()
|
| | |
|
| | | this.active++
|
| | | this.$refs["carousel"].next()
|
| | | },
|
| | | async getInitInfo() {
|
| | | const res = await getInitInfo().catch((err) => {
|
| | | this.isWhite = false
|
| | | })
|
| | |
|
| | | if (res.data && res.data.initPwd && !res.data.initRegInfo) {
|
| | | this.active = this.isOnline ? this.registerInfo : this.configNet
|
| | | }
|
| | |
|
| | | if (res.data && res.data.initPwd && res.data.initRegInfo) {
|
| | | location.assign("/view/login/")
|
| | | return
|
| | | }
|
| | |
|
| | | this.isWhite = false
|
| | | }
|
| | | }
|
| | | }
|
| | | </script>
|
| | |
|
| | | <style lang="scss" scoped>
|
| | | .init {
|
| | | background-image: url("/images/init/背景图.png");
|
| | | background-size: cover;
|
| | | background-attachment: fixed;
|
| | | color: #fff;
|
| | | user-select: none;
|
| | | height: 100%;
|
| | | min-width: 1000px;
|
| | | overflow: hidden;
|
| | | min-height: 760px;
|
| | | .content {
|
| | | margin: 0 auto;
|
| | | width: 1000px;
|
| | | padding-top: calc(6.4vh);
|
| | |
|
| | | .title {
|
| | | font-size: 28px;
|
| | | font-weight: 700;
|
| | | margin-bottom: 50px;
|
| | | letter-spacing: 5px;
|
| | | }
|
| | |
|
| | | .el-steps ::v-deep {
|
| | | margin-left: 22px;
|
| | | text-align: left;
|
| | |
|
| | | .el-step__icon {
|
| | | width: 48px;
|
| | | height: 48px;
|
| | | }
|
| | |
|
| | | .el-step__line {
|
| | | left: 210px;
|
| | | right: -110px;
|
| | | border: 0.5px solid #fff;
|
| | | border-bottom: none;
|
| | | border-top: none;
|
| | | opacity: 0.1;
|
| | | top: 22px;
|
| | | }
|
| | |
|
| | | .is-success .el-step__icon {
|
| | | background: none;
|
| | | border: 2px solid rgba(255, 255, 255, 0.3);
|
| | |
|
| | | .el-icon-check::before {
|
| | | color: #fff;
|
| | | font-size: 24px;
|
| | | font-weight: 700;
|
| | | }
|
| | | }
|
| | |
|
| | | .is-process .el-step__icon {
|
| | | background-color: rgba(255, 255, 255, 0.3);
|
| | | border: none;
|
| | |
|
| | | .el-step__icon-inner {
|
| | | color: #fff;
|
| | | font-size: 24px;
|
| | | font-weight: 700;
|
| | | }
|
| | | }
|
| | |
|
| | | .is-wait .el-step__icon {
|
| | | border: 2px solid rgba(255, 255, 255);
|
| | | opacity: 0.5;
|
| | | background: none;
|
| | |
|
| | | .el-step__icon-inner {
|
| | | color: #fff;
|
| | | font-size: 24px;
|
| | | font-weight: 700;
|
| | | }
|
| | | }
|
| | |
|
| | | .el-step__main {
|
| | | margin-top: 20px;
|
| | | .is-success,
|
| | | .is-process {
|
| | | font-size: 16px;
|
| | | color: #fff;
|
| | | font-weight: normal;
|
| | | }
|
| | |
|
| | | .is-wait {
|
| | | font-size: 16px;
|
| | | color: #fff;
|
| | | font-weight: normal;
|
| | | opacity: 0.5;
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | | .formAccount {
|
| | | margin-left: 200px;
|
| | | width: 550px;
|
| | | }
|
| | |
|
| | | .formNet,
|
| | | .formInfo {
|
| | | margin-left: 200px;
|
| | | width: 550px;
|
| | | }
|
| | |
|
| | | .control {
|
| | | margin: 0 auto;
|
| | | line-height: 40px;
|
| | | margin-top: calc(3.2vh);
|
| | |
|
| | | .pre {
|
| | | margin: 10px auto;
|
| | | cursor: pointer;
|
| | | width: 260px;
|
| | | height: 40px;
|
| | | border: 2px solid rgba(255, 255, 255, 0.3);
|
| | | border-radius: 20px;
|
| | | font-weight: bold;
|
| | | color: #ffffff;
|
| | | }
|
| | |
|
| | | .next {
|
| | | margin: 10px auto;
|
| | | cursor: pointer;
|
| | | width: 260px;
|
| | | height: 40px;
|
| | | background: rgba(255, 255, 255, 0.3);
|
| | | border-radius: 20px;
|
| | | font-weight: bold;
|
| | | color: #ffffff;
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | | ::v-deep .el-carousel__indicators {
|
| | | display: none;
|
| | | }
|
| | |
|
| | | ::v-deep .el-carousel__container button {
|
| | | display: none;
|
| | | }
|
| | |
|
| | | ::v-deep .el-carousel__container {
|
| | | margin-top: calc(5.74vh);
|
| | | height: 290px !important;
|
| | | }
|
| | | }
|
| | |
|
| | | .white {
|
| | | height: 100%;
|
| | | background-color: #fff;
|
| | | }
|
| | | </style>
|