src/assets/loginPage/login-bg.jpg | 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/assets/loginPage/login-bg.png | 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/assets/menu/bg_home1.jpg | 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/homeMenu/homeMenu.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/loginPage/component/accountLogin.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/loginPage/loginPage.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/assets/loginPage/login-bg.jpg
src/assets/loginPage/login-bg.png
src/assets/menu/bg_home1.jpg
src/views/homeMenu/homeMenu.vue
@@ -3,9 +3,9 @@ <div class="topPanel"> <div class="topPanelCont"> <div class="topTit"> <div>新疆国泰新华安</div> <div>新疆国泰新华</div> <span></span> <div>全风险预警监测系统</div> <div>安全风险预警监测系统</div> </div> <div class="userInfo"> <div class="avator"> @@ -20,7 +20,7 @@ <div class="menuGrid"> <div class="gridCont"> <el-row :gutter="16"> <el-row :gutter="20"> <el-col :span="6"><div class="grid-content" @click="renderMenu('2')"><div class="itemTit">双重预防系统</div><img class="iconImg" src="../../assets/menu/icon4.png"><img class="bgImg" src="../../assets/menu/card4.png"></div></el-col> <el-col :span="6"><div class="grid-content" @click="renderMenu('3')"><div class="itemTit">特殊作业系统</div><img class="iconImg" src="../../assets/menu/icon7.png"><img class="bgImg" src="../../assets/menu/card7.png"></div></el-col> <el-col :span="6"><div class="grid-content" @click="renderMenu('4')"><div class="itemTit">智能巡检系统</div><img class="iconImg" src="../../assets/menu/icon8.png"><img class="bgImg" src="../../assets/menu/card8.png"></div></el-col> @@ -34,13 +34,13 @@ </div> </el-col> </el-row> <el-row :gutter="16"> <el-row :gutter="20"> <el-col :span="6"><div class="grid-content grid-content-2" @click="renderMenu('6')"><div class="itemTit">应急管理系统</div><img class="iconImg" src="../../assets/menu/icon5.png"><img class="bgImg" src="../../assets/menu/card5.png"></div></el-col> <el-col :span="6"><div class="grid-content grid-content-2" @click="renderMenu('7')"><div class="itemTit">目标责任管理系统</div><img class="iconImg" src="../../assets/menu/icon2.png"><img class="bgImg" src="../../assets/menu/card2.png"></div></el-col> <el-col :span="6"><div class="grid-content grid-content-2" @click="renderMenu('8')"><div class="itemTit">事故管理系统</div><img class="iconImg" src="../../assets/menu/icon6.png"><img class="bgImg" src="../../assets/menu/card6.png"></div></el-col> <el-col :span="6"><div class="grid-content grid-content-2" @click="renderMenu('9')"><div class="itemTit">设备综合管控系统</div><img class="iconImg" src="../../assets/menu/icon9.png"><img class="bgImg" src="../../assets/menu/card9.png"></div></el-col> </el-row> <el-row :gutter="16"> <el-row :gutter="20"> <el-col :span="6"><div class="grid-content grid-content-3" @click="renderMenu('10')"><div class="itemTit">安全知识图谱系统</div><img class="iconImg" src="../../assets/menu/icon3.png"><img class="bgImg" src="../../assets/menu/card3.png"></div></el-col> <el-col :span="9"><div class="grid-content grid-content-3" @click="renderMenu('11')"><div class="itemTit">危险化学品全生命周期安全<br>管理系统</div><img class="iconImg" src="../../assets/menu/icon10.png"><img class="bgImg" src="../../assets/menu/card10.png"></div></el-col> <el-col :span="9"><div class="grid-content grid-content-3" @click="renderMenu('1')"><div class="itemTit">基础数据权限管理系统</div><img class="iconImg" src="../../assets/menu/icon11.png"><img class="bgImg" src="../../assets/menu/card11.png"></div></el-col> @@ -51,227 +51,227 @@ </template> <script lang="ts"> import { toRefs, reactive, computed, defineComponent, onMounted } from 'vue'; import { storeToRefs } from 'pinia'; import { useThemeConfig } from '/@/stores/themeConfig'; import logoMini from '/@/assets/logo-mini.svg'; import loginIconTwo from '/@/assets/login-icon-two.svg'; import { NextLoading } from '/@/utils/loading'; import {Session} from "/@/utils/storage"; import {useRoute, useRouter} from "vue-router"; import {initBackEndControlRoutes} from "/@/router/backEnd"; import {useUserInfo} from "/@/stores/userInfo"; import { toRefs, reactive, computed, defineComponent, onMounted } from 'vue'; import { storeToRefs } from 'pinia'; import { useThemeConfig } from '/@/stores/themeConfig'; import logoMini from '/@/assets/logo-mini.svg'; import loginIconTwo from '/@/assets/login-icon-two.svg'; import { NextLoading } from '/@/utils/loading'; import {Session} from "/@/utils/storage"; import {useRoute, useRouter} from "vue-router"; import {initBackEndControlRoutes} from "/@/router/backEnd"; import {useUserInfo} from "/@/stores/userInfo"; // 定义接口来定义对象的类型 interface LoginState { tabsActiveName: string; isScan: boolean; } // 定义接口来定义对象的类型 interface LoginState { tabsActiveName: string; isScan: boolean; } export default defineComponent({ name: 'loginIndex', components: {}, setup() { const route = useRoute(); const router = useRouter(); const userInfo = useUserInfo() const { userInfos } = storeToRefs(userInfo); const storesThemeConfig = useThemeConfig(); const { themeConfig } = storeToRefs(storesThemeConfig); const state = reactive<LoginState>({ tabsActiveName: 'account', isScan: false, }); // 获取布局配置信息 const getThemeConfig = computed(() => { return themeConfig.value; }); // 下拉菜单点击时 const onLoginOut = () => { console.log('退出登录') }; const renderMenu = async (value: string) => { Session.set('projectId',value) userInfos.value.projectId = value await initBackEndControlRoutes(); router.push('./') }; //点击进入特殊作业 const toSpecialWorkSys = () => { router.push('/workReservation'); }; // 页面加载时 onMounted(() => { NextLoading.done(); // loginBg(); // loginApp() }); return { logoMini, loginIconTwo, getThemeConfig, renderMenu, toSpecialWorkSys, ...toRefs(state), }; }, }); export default defineComponent({ name: 'loginIndex', components: {}, setup() { const route = useRoute(); const router = useRouter(); const userInfo = useUserInfo() const { userInfos } = storeToRefs(userInfo); const storesThemeConfig = useThemeConfig(); const { themeConfig } = storeToRefs(storesThemeConfig); const state = reactive<LoginState>({ tabsActiveName: 'account', isScan: false, }); // 获取布局配置信息 const getThemeConfig = computed(() => { return themeConfig.value; }); // 下拉菜单点击时 const onLoginOut = () => { console.log('退出登录') }; const renderMenu = async (value: string) => { Session.set('projectId',value) userInfos.value.projectId = value await initBackEndControlRoutes(); router.push('/home') }; //点击进入特殊作业 const toSpecialWorkSys = () => { router.push('/layoutPage'); }; // 页面加载时 onMounted(() => { NextLoading.done(); // loginBg(); // loginApp() }); return { logoMini, loginIconTwo, getThemeConfig, renderMenu, toSpecialWorkSys, ...toRefs(state), }; }, }); </script> <style scoped lang="scss"> .login-container { width: 100%; height: 100%; position: relative; background: url("../../assets/menu/bg_home.jpg") no-repeat center; .topPanel{ position: absolute; .login-container { width: 100%; top: -100px; left: 0; height:100px; background: #fff; display: flex; justify-content: center; box-shadow: 0 8px 32px rgba(0,0,0,.1); animation: showDown .6s 1 ease forwards; @keyframes showDown { 100%{ position: absolute; top: 0; } } .topPanelCont{ width: 1200px; height: 100%; height: 100%; position: relative; background: url("../../assets/menu/bg_home1.jpg") no-repeat center; .topPanel{ position: absolute; width: 100%; top: -100px; left: 0; height:100px; background: #fff; display: flex; align-items: center; justify-content: space-between; justify-content: center; box-shadow: 0 8px 32px rgba(0,0,0,.1); animation: showDown .6s 1 ease forwards; .topTit{ font-size: 24px; font-weight: bold; display: flex; align-items: center; color: #333; line-height: 28px; &>div:last-of-type{ color: #006DF5; } span{ width: 1px; height: 28px; background: #999; margin: 0 15px; @keyframes showDown { 100%{ position: absolute; top: 0; } } .userInfo{ .topPanelCont{ width: 1200px; height: 100%; display: flex; align-items: center; justify-content: space-between; .avator{ .topTit{ font-size: 24px; font-weight: bold; display: flex; justify-content: right; img{ width: 20px; height: 20px; border-radius: 10px; } div{ font-size: 15px; color: #333333; line-height: 20px; margin-left: 6px; } } span{ width: 1px; height: 20px; background: #999; margin: 0 15px; } .loginOut{ font-size: 15px; align-items: center; color: #333; line-height: 20px; cursor: pointer; line-height: 28px; &:hover{ &>div:last-of-type{ color: #006DF5; } span{ width: 1px; height: 28px; background: #999; margin: 0 15px; } } .userInfo{ display: flex; align-items: center; .avator{ display: flex; justify-content: right; img{ width: 20px; height: 20px; border-radius: 10px; } div{ font-size: 15px; color: #333333; line-height: 20px; margin-left: 6px; } } span{ width: 1px; height: 20px; background: #999; margin: 0 15px; } .loginOut{ font-size: 15px; color: #333; line-height: 20px; cursor: pointer; &:hover{ color: #006DF5; } } } } } } .menuGrid{ width: 100%; position: absolute; top: 150px; display: flex; justify-content: center; .gridCont{ width: 1200px; .el-row { margin-bottom: 16px; } .el-row:last-child { margin-bottom: 0; } .el-col { border-radius: 8px; } .grid-content { border-radius: 8px; height: 234px; padding: 32px; position: relative; background-image: linear-gradient(135deg,#00C0F5,#147AEA); overflow: hidden; cursor: pointer; transition: .3s; border: none; &:hover{ box-shadow: 0 8px 32px rgba(20,97,234,.4); .menuGrid{ width: 100%; position: absolute; top: 150px; display: flex; justify-content: center; .gridCont{ width: 1200px; .el-row { margin-bottom: 20px; } .el-row:last-child { margin-bottom: 0; } .el-col { border-radius: 8px; } .itemTit{ font-size: 24px; line-height: 36px; height: 40%; font-family: "PingFang SC"; font-weight: lighter; color: #fff; margin-bottom: 25px; } .iconImg{ width: 80px; height: 80px; .grid-content { border-radius: 10px; height: 234px; padding: 32px; position: relative; background-image: linear-gradient(135deg,#00C0F5,#44b1ff); overflow: hidden; cursor: pointer; transition: .3s; border: none; &:hover{ box-shadow: 0 8px 32px rgba(20,97,234,.4); } .itemTit{ font-size: 24px; line-height: 36px; height: 40%; font-family: "PingFang SC"; font-weight: lighter; color: #fff; margin-bottom: 25px; } .iconImg{ width: 80px; height: 80px; } .bgImg{ position: absolute; right: 0; bottom: 0; } } .bgImg{ position: absolute; right: 0; bottom: 0; } /*.grid-content-2{*/ /* background-image: linear-gradient(135deg,#0098F5,#1461EA);*/ /*}*/ /*.grid-content-3{*/ /* background-image: linear-gradient(135deg,#006DF5,#1450EA);*/ /*}*/ } .grid-content-2{ background-image: linear-gradient(135deg,#0098F5,#1461EA); } .grid-content-3{ background-image: linear-gradient(135deg,#006DF5,#1450EA); } } } } </style> src/views/loginPage/component/accountLogin.vue
@@ -9,20 +9,20 @@ </el-form-item> <el-form-item class="login-animation2"> <el-input :type="isShowPassword ? 'text' : 'password'" :placeholder="$t('message.account.accountPlaceholder2')" v-model="ruleForm.password" autocomplete="off" size="large" :type="isShowPassword ? 'text' : 'password'" :placeholder="$t('message.account.accountPlaceholder2')" v-model="ruleForm.password" autocomplete="off" size="large" > <template #prefix> <el-icon class="el-input__icon" style="margin-right: 20px"><img src="../../../assets/loginPage/login_icon_password.png" style="width: 24px;height: 24px"></el-icon> </template> <template #suffix> <i class="iconfont el-input__icon login-content-password" :class="isShowPassword ? 'icon-yincangmima' : 'icon-xianshimima'" @click="isShowPassword = !isShowPassword" class="iconfont el-input__icon login-content-password" :class="isShowPassword ? 'icon-yincangmima' : 'icon-xianshimima'" @click="isShowPassword = !isShowPassword" > </i> </template> @@ -41,167 +41,167 @@ </template> <script lang="ts"> import { toRefs, reactive, defineComponent, computed } from 'vue'; import { useRoute, useRouter } from 'vue-router'; import { ElMessage } from 'element-plus'; import { useI18n } from 'vue-i18n'; import Cookies from 'js-cookie'; import { storeToRefs } from 'pinia'; import { useThemeConfig } from '/@/stores/themeConfig'; import { initFrontEndControlRoutes } from '/@/router/frontEnd'; import { initBackEndControlRoutes } from '/@/router/backEnd'; import { Session } from '/@/utils/storage'; import { formatAxis } from '/@/utils/formatTime'; import { NextLoading } from '/@/utils/loading'; import { useLoginApi } from '/@/api/login'; import {useUserInfo} from "/@/stores/userInfo"; import { toRefs, reactive, defineComponent, computed } from 'vue'; import { useRoute, useRouter } from 'vue-router'; import { ElMessage } from 'element-plus'; import { useI18n } from 'vue-i18n'; import Cookies from 'js-cookie'; import { storeToRefs } from 'pinia'; import { useThemeConfig } from '/@/stores/themeConfig'; import { initFrontEndControlRoutes } from '/@/router/frontEnd'; import { initBackEndControlRoutes } from '/@/router/backEnd'; import { Session } from '/@/utils/storage'; import { formatAxis } from '/@/utils/formatTime'; import { NextLoading } from '/@/utils/loading'; import { useLoginApi } from '/@/api/login'; import {useUserInfo} from "/@/stores/userInfo"; export default defineComponent({ name: 'accountLogin', setup() { const { t } = useI18n(); const userInfo = useUserInfo() const route = useRoute(); const router = useRouter(); const state = reactive({ isShowPassword: false, ruleForm: { username: 'admin', password: '123456', }, loading: { signIn: false, }, }); // 时间获取 const currentTime = computed(() => { return formatAxis(new Date()); }); // 登录 const onSignIn = async () => { state.loading.signIn = true; // 存储 token 到浏览器缓存 let res = await useLoginApi().signIn(state.ruleForm) if(res.data.code === '200'){ userInfo.setUserInfos(res.data.data) Session.set('token', res.data.data.accessToken); Session.set('projectId',''); Session.set('uid',res.data.data.uid); signInSuccess(); }else{ state.loading.signIn = false ElMessage({ type:'warning', message:res.data.msg }) } // Session.set('token', Math.random().toString(36).substr(0)); // // 模拟数据,对接接口时,记得删除多余代码及对应依赖的引入。用于 `/src/stores/userInfo.ts` 中不同用户登录判断(模拟数据) // Cookies.set('userName', state.ruleForm.username); // if (!themeConfig.value.isRequestRoutes) { // // 前端控制路由,2、请注意执行顺序 // await initFrontEndControlRoutes(); // signInSuccess(); // } else { // // 模拟后端控制路由,isRequestRoutes 为 true,则开启后端控制路由 // // 添加完动态路由,再进行 router 跳转,否则可能报错 No match found for location with path "/" // await initBackEndControlRoutes(); // // 执行完 initBackEndControlRoutes,再执行 signInSuccess // signInSuccess(); // } }; // 登录成功后的跳转 const signInSuccess = async () => { // 初始化登录成功时间问候语 let currentTimeInfo = currentTime.value; // 登录成功,跳到转首页 // 如果是复制粘贴的路径,非首页/登录页,那么登录成功后重定向到对应的路径中 if (route.query?.redirect) { router.push('/homeMenu'); // router.push({ // path: <string>route.query?.redirect, // query: Object.keys(<string>route.query?.params).length > 0 ? JSON.parse(<string>route.query?.params) : '', // }); } else { router.push('/loginPage'); } state.loading.signIn = true; const signInText = t('message.signInText'); ElMessage.success(`${currentTimeInfo},${signInText}`); // 登录成功提示 // 关闭 loading // 添加 loading,防止第一次进入界面时出现短暂空白 // NextLoading.start(); }; return { onSignIn, ...toRefs(state), }; }, }); export default defineComponent({ name: 'accountLogin', setup() { const { t } = useI18n(); const userInfo = useUserInfo() const route = useRoute(); const router = useRouter(); const state = reactive({ isShowPassword: false, ruleForm: { username: 'admin', password: '123456', }, loading: { signIn: false, }, }); // 时间获取 const currentTime = computed(() => { return formatAxis(new Date()); }); // 登录 const onSignIn = async () => { state.loading.signIn = true; // 存储 token 到浏览器缓存 let res = await useLoginApi().signIn(state.ruleForm) if(res.data.code === '200'){ userInfo.setUserInfos(res.data.data) Session.set('token', res.data.data.accessToken); Session.set('projectId',''); Session.set('uid',res.data.data.uid); signInSuccess(); }else{ state.loading.signIn = false ElMessage({ type:'warning', message:res.data.msg }) } // Session.set('token', Math.random().toString(36).substr(0)); // // 模拟数据,对接接口时,记得删除多余代码及对应依赖的引入。用于 `/src/stores/userInfo.ts` 中不同用户登录判断(模拟数据) // Cookies.set('userName', state.ruleForm.username); // if (!themeConfig.value.isRequestRoutes) { // // 前端控制路由,2、请注意执行顺序 // await initFrontEndControlRoutes(); // signInSuccess(); // } else { // // 模拟后端控制路由,isRequestRoutes 为 true,则开启后端控制路由 // // 添加完动态路由,再进行 router 跳转,否则可能报错 No match found for location with path "/" // await initBackEndControlRoutes(); // // 执行完 initBackEndControlRoutes,再执行 signInSuccess // signInSuccess(); // } }; // 登录成功后的跳转 const signInSuccess = async () => { // 初始化登录成功时间问候语 let currentTimeInfo = currentTime.value; // 登录成功,跳到转首页 // 如果是复制粘贴的路径,非首页/登录页,那么登录成功后重定向到对应的路径中 if (route.query?.redirect) { router.push('/homeMenu'); // router.push({ // path: <string>route.query?.redirect, // query: Object.keys(<string>route.query?.params).length > 0 ? JSON.parse(<string>route.query?.params) : '', // }); } else { router.push('/loginPage'); } state.loading.signIn = true; const signInText = t('message.signInText'); ElMessage.success(`${currentTimeInfo},${signInText}`); // 登录成功提示 // 关闭 loading // 添加 loading,防止第一次进入界面时出现短暂空白 // NextLoading.start(); }; return { onSignIn, ...toRefs(state), }; }, }); </script> <style scoped lang="scss"> .login-content-form { margin-top: 40px; width: 420px; .login-content-form { margin-top: 40px; width: 420px; .el-input::v-deep .el-input__wrapper{ height: 56px; border-radius: 28px; padding: 0 30px; background: #F2F2F2; &:focus-within{ border: 1px solid #2053D7; .el-input::v-deep .el-input__wrapper{ height: 56px; border-radius: 28px; padding: 0 30px; background: #F2F2F2; &:focus-within{ border: 1px solid #2053D7; } } } @for $i from 1 through 4 { .login-animation#{$i} { opacity: 0; animation-name: error-num; animation-duration: 0.5s; animation-fill-mode: forwards; animation-delay: calc($i/10) + s; @for $i from 1 through 4 { .login-animation#{$i} { opacity: 0; animation-name: error-num; animation-duration: 0.5s; animation-fill-mode: forwards; animation-delay: calc($i/10) + s; } } } .codeDeal::v-deep .el-form-item__content{ display: flex; justify-content: space-between; .codeDeal::v-deep .el-form-item__content{ display: flex; justify-content: space-between; .forgetCode{ color: #2053D7; .forgetCode{ color: #2053D7; cursor: pointer; } } .login-content-password { width: 100%; display: inline-block; width: 20px; cursor: pointer; &:hover { color: #909399; } } .login-content-code { width: 100%; padding: 0; font-weight: bold; letter-spacing: 5px; } .login-content-submit { width: 100%; height: 56px; font-size: 16px; border-radius: 28px; letter-spacing: 4px; font-weight: 300; margin-top: 15px; background: #2053D7; transition: .3s; &:hover{ letter-spacing: 6px; background: #4E7AEC; } } } .login-content-password { width: 100%; display: inline-block; width: 20px; cursor: pointer; &:hover { color: #909399; } } .login-content-code { width: 100%; padding: 0; font-weight: bold; letter-spacing: 5px; } .login-content-submit { width: 100%; height: 56px; font-size: 16px; border-radius: 28px; letter-spacing: 4px; font-weight: 300; margin-top: 15px; background: #2053D7; transition: .3s; &:hover{ letter-spacing: 6px; background: #4E7AEC; } } } </style> src/views/loginPage/loginPage.vue
@@ -12,9 +12,9 @@ <div class="loginPanel"> <div class="welc">WELCOME!</div> <div class="welcc">欢迎登录</div> <!-- <div class="loginInfo">--> <!-- <el-input v-model="input" placeholder="Please input" />--> <!-- </div>--> <!-- <div class="loginInfo">--> <!-- <el-input v-model="input" placeholder="Please input" />--> <!-- </div>--> <div> <el-tabs v-model="tabsActiveName"> <AccountLogin /> @@ -27,134 +27,135 @@ </template> <script lang="ts"> import { toRefs, reactive, computed, defineComponent, onMounted } from 'vue'; import { storeToRefs } from 'pinia'; import { useThemeConfig } from '/@/stores/themeConfig'; import logoMini from '/@/assets/logo-mini.svg'; import loginIconTwo from '/@/assets/login-icon-two.svg'; import { NextLoading } from '/@/utils/loading'; import AccountLogin from '/@/views/loginPage/component/accountLogin.vue'; import { loginBg } from '../../../static/loginPage.js/login.js' import { loginApp } from '../../../static/loginPage.js/loginApp.js' import { toRefs, reactive, computed, defineComponent, onMounted } from 'vue'; import { storeToRefs } from 'pinia'; import { useThemeConfig } from '/@/stores/themeConfig'; import logoMini from '/@/assets/logo-mini.svg'; import loginIconTwo from '/@/assets/login-icon-two.svg'; import { NextLoading } from '/@/utils/loading'; import AccountLogin from '/@/views/loginPage/component/accountLogin.vue'; import { loginBg } from '../../../static/loginPage.js/login.js' import { loginApp } from '../../../static/loginPage.js/loginApp.js' // 定义接口来定义对象的类型 interface LoginState { tabsActiveName: string; isScan: boolean; } // 定义接口来定义对象的类型 interface LoginState { tabsActiveName: string; isScan: boolean; } export default defineComponent({ name: 'loginIndex', components: { AccountLogin }, setup() { const storesThemeConfig = useThemeConfig(); const { themeConfig } = storeToRefs(storesThemeConfig); const state = reactive<LoginState>({ tabsActiveName: 'account', isScan: false, }); // 获取布局配置信息 const getThemeConfig = computed(() => { return themeConfig.value; }); // 页面加载时 onMounted(() => { NextLoading.done(); loginBg(); loginApp() }); return { logoMini, loginIconTwo, getThemeConfig, ...toRefs(state), }; }, }); export default defineComponent({ name: 'loginIndex', components: { AccountLogin }, setup() { const storesThemeConfig = useThemeConfig(); const { themeConfig } = storeToRefs(storesThemeConfig); const state = reactive<LoginState>({ tabsActiveName: 'account', isScan: false, }); // 获取布局配置信息 const getThemeConfig = computed(() => { return themeConfig.value; }); // 页面加载时 onMounted(() => { NextLoading.done(); loginBg(); loginApp() }); return { logoMini, loginIconTwo, getThemeConfig, ...toRefs(state), }; }, }); </script> <style scoped lang="scss"> .login-container { width: 100%; height: 100%; position: relative; z-index: 999; display: flex; align-items: center; justify-content: center; background-image: radial-gradient(at center, #0075c3, #000b61); canvas { display: block; vertical-align: bottom; } #particles-js { .login-container { width: 100%; height: 100%; background-size: cover; background-position: 50% 50%; background-repeat: no-repeat; width: 100%; height: 100%; position: absolute; top: 0; left: 0; } .loginContent{ width: 100%; padding: 0 300px; position: relative; z-index: 999; display: flex; align-items: flex-start; justify-content: space-between; align-items: center; justify-content: center; background: url("../../assets/loginPage/login-bg.jpg") no-repeat center; /*background-image: radial-gradient(at center, #0075c3, #000b61);*/ .loginContL{ font-size: 48px; font-weight: bold; padding-top: 20px; margin-right: 30px; .apTitleT{ color: #fff; margin-bottom: 20px; letter-spacing: 4px; } .apTitleB{ color: #01d0ff; margin-bottom: 40px; letter-spacing: 4px; } &>span{ display: block; width: 120px; height: 8px; background: #01d0ff; } canvas { display: block; vertical-align: bottom; } .loginPanel{ padding: 85px 70px; background: #fff; border-radius: 15px; box-shadow: 0 8px 40px rgba(0,0,0,.15); .welc{ font-size: 36px; font-family: "PingFang SC"; font-weight: normal; color: #999999; letter-spacing: 2px; margin-bottom: 15px; #particles-js { width: 100%; height: 100%; background-size: cover; background-position: 50% 50%; background-repeat: no-repeat; width: 100%; height: 100%; position: absolute; top: 0; left: 0; } .loginContent{ width: 100%; padding: 0 300px; display: flex; align-items: flex-start; justify-content: space-between; .loginContL{ font-size: 48px; font-weight: bold; padding-top: 80px; margin-right: 30px; .apTitleT{ color: #fff; margin-bottom: 20px; letter-spacing: 4px; } .apTitleB{ color: #01d0ff; margin-bottom: 40px; letter-spacing: 4px; } &>span{ display: block; width: 120px; height: 8px; background: #01d0ff; } } .welcc{ font-size: 32px; font-family: "PingFang SC"; font-weight: lighter; color: #333; letter-spacing: 2px; .loginPanel{ padding: 85px 70px; background: #fff; border-radius: 15px; box-shadow: 0 8px 40px rgba(0,0,0,.15); .welc{ font-size: 36px; font-family: "PingFang SC"; font-weight: normal; color: #999999; letter-spacing: 2px; margin-bottom: 15px; } .welcc{ font-size: 32px; font-family: "PingFang SC"; font-weight: lighter; color: #333; letter-spacing: 2px; } } } } } </style>