This commit is contained in:
1378012178@qq.com 2025-07-01 15:31:41 +08:00
commit af1878cee5
18 changed files with 262 additions and 238 deletions

BIN
src/assets/images/bj.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 234 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.3 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
src/assets/images/logo2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 KiB

View File

@ -362,4 +362,5 @@ a {
background-size: cover;
background-position: top center;
background-repeat: no-repeat;
background-color: #e4ecf5;
}

View File

@ -6,7 +6,7 @@
.aui-container {
max-width: 1000px;
margin: 0 auto;
box-shadow: 0 4px 8px 1px rgba(0, 0, 0, 0.2);
// box-shadow: 0 4px 8px 1px rgba(0, 0, 0, 0.2);
position: fixed;
top: 50%;
left: 50%;
@ -20,8 +20,7 @@
}
.aui-form {
width: 100%;
background: #eee;
width: 90%;
display: -webkit-box;
display: -moz-box;
display: -ms-flexbox;
@ -30,18 +29,14 @@
}
.aui-image {
padding: 180px 80px;
flex-basis: 60%;
-webkit-flex-basis: 60%;
background-color: #0198cd;
background-image: url(../icon/jeecg_ad.png);
background-size: cover;
}
.aui-image-text {
top: 50%;
left: 50%;
width: 100%;
width: 80%;
}
.aui-formBox {
@ -51,13 +46,15 @@
padding: 30px 20px;
background: #fff;
box-shadow: 2px 9px 49px -17px rgba(0, 0, 0, 0.1);
height: 400px;
border-radius: 20px;
}
.aui-logo {
width: 180px;
height: 80px;
position: absolute;
top: 2%;
top: 8%;
left: 8%;
z-index: 4;
}
@ -239,6 +236,7 @@
font-size: 18px;
font-weight: 500;
cursor: pointer;
text-align: left;
}
.aui-clear-left {
@ -325,12 +323,13 @@
.aui-inputClear {
width: 100%;
border-bottom: 1px solid #cccccc;
// border-bottom: 1px solid #cccccc;
position: relative;
padding-left: 20px;
background: #fff;
background: #f4f5f9;
margin-bottom: 8px;
margin-top: 20px;
border-radius: 8px;
}
.aui-inputClear .icon {
@ -350,8 +349,8 @@
.aui-code {
position: absolute;
right: 8px;
bottom: 0;
right: -4px;
bottom: 4px;
width: 115px;
cursor: pointer;
}

View File

@ -3,7 +3,7 @@
* @Description: logo component
-->
<template>
<div class="anticon" :class="getAppLogoClass" @click="goHome">
<div class="anticon" :class="getAppLogoClass" @click="goHome" style="background: #e3f6fc;text-align: center;">
<img src="../../../assets/images/logo.png" />
<div class="ml-2 truncate md:opacity-100" :class="getTitleClass" v-show="showTitle">
{{ shortTitle }}
@ -41,6 +41,7 @@
const go = useGo();
// const getAppLogoClass = [ "jeecg-app-logo", "light", { "collapsed-show-title": false } ]
const getAppLogoClass = computed(() => [prefixCls, props.theme, { 'collapsed-show-title': unref(getCollapsedShowTitle) }]);
const getTitleClass = computed(() => [
@ -90,4 +91,8 @@
line-height: normal;
}
}
.advisoryClass{
background-image: url(/@/assets/images/bj.png);
}
</style>

View File

@ -192,4 +192,32 @@
</script>
<style lang="less">
@import './index.less';
.jeecg-menu-item-active:not(.jeecg-menu-submenu) {
color: white !important;
background-color: #1890ff !important;
border-radius: 8px;
margin: 0px 20px 0 20px;
}
.jeecg-menu-vertical .jeecg-menu-item:hover, .jeecg-menu-vertical .jeecg-menu-submenu-title:hover {
color: #fff !important;
border-radius: 8px;
background: #c9cacc;
margin: 10px 20px 0 20px;
}
.jeecg-menu-light.jeecg-menu-vertical .jeecg-menu-item-active.jeecg-menu-submenu {
color: #606266 !important;
background: #f0f0f0;
}
.jeecg-menu-vertical .jeecg-menu-item, .jeecg-menu-vertical .jeecg-menu-submenu-title {
position: relative;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
cursor: pointer;
margin-top: 10px;
padding: 8px;
}
</style>

View File

@ -6,9 +6,47 @@
// &.ant-btn-success:not(.ant-btn-link),
// &.ant-btn-error:not(.ant-btn-link),
// &.ant-btn-warning:not(.ant-btn-link),
// &.ant-btn-primary:not(.ant-btn-link) {
// box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.12), 0 2px 4px 0 rgba(0, 0, 0, 0.08) !important;
// }
&.ant-btn-primary:not(.ant-btn-link) {
// box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.12), 0 2px 4px 0 rgba(0, 0, 0, 0.08) !important;
// background: linear-gradient(to right, #1ea1fb, #017de9);
// align-items: center;
border-radius: 8px;
background: linear-gradient(to right,#1ea0fa , #017de9);
// border: 1px solid #fff;
// color: #fff;
// position: relative; /* needed for pseudo-element */
overflow: hidden; /* clip the animated stripe */
border: 0px;
color: white;
// height: 34px;
}
&.ant-btn-primary:not(.ant-btn-link)::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(
90deg,
transparent 0%,
rgba(255,255,255,0.4) 50%,
transparent 100%
);
transform: skewX(0);
}
&.ant-btn-primary:not(.ant-btn-link):hover::before {
animation: light-sweep 1.5s forwards;
}
@keyframes light-sweep {
to {
left: 100%;
}
}
// &-group {
// .ant-btn:not(:first-child) {
// bottom: 1px;
@ -321,3 +359,52 @@
}
}
}
.ant-btn-default {
border-radius: 8px !important;
color: white;
background: linear-gradient(to right,#1ea0fa , #017de9);
border: 0px;
}
:where(.css-dev-only-do-not-override-9m98ij).ant-btn-default:not(:disabled):hover {
color: white;
border-color: white;
}
&.ant-btn-default:not(.ant-btn-link) {
border-radius: 8px;
color: white;
background: linear-gradient(to right,#1ea0fa , #017de9);
overflow: hidden; /* clip the animated stripe */
border: 0px;
}
&.ant-btn-default:not(:disabled):hover {
color: white;
border-color: #40a9ff;
}
&.ant-btn-default:not(.ant-btn-link)::before {
content: '';
color: white;
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(
90deg,
transparent 0%,
rgba(255,255,255,0.4) 50%,
transparent 100%
);
transform: skewX(0);
}
&.ant-btn-default:not(.ant-btn-link):hover::before {
animation: light-sweep 1.5s forwards;
}
@keyframes light-sweep {
to {
left: 100%;
}
}

View File

@ -1,7 +1,7 @@
<template>
<Header :class="getHeaderClass">
<Header :class="getHeaderClass" style="background-image: url('/devops/src/assets/images/bj.png');">
<!-- left start -->
<div :class="`${prefixCls}-left`">
<div :class="`${prefixCls}-left`" >
<!-- logo -->
<AppLogo v-if="getShowHeaderLogo || getIsMobile" :class="`${prefixCls}-logo`" :theme="getHeaderTheme" :style="getLogoWidth" />
<LayoutTrigger
@ -11,7 +11,7 @@
/>
<LayoutBreadcrumb v-if="getShowContent && getShowBread" :theme="getHeaderTheme" />
<!-- 欢迎语 -->
<span v-if="getShowContent && getShowBreadTitle && !getIsMobile" :class="[prefixCls, `${prefixCls}--${getHeaderTheme}`,'headerIntroductionClass']"> {{t('layout.header.welcomeIn')}} {{ title }} </span>
<span v-if="getShowContent && getShowBreadTitle && !getIsMobile" style="background: #e3f6fc !important;" :class="[prefixCls, `${prefixCls}--${getHeaderTheme}`,'headerIntroductionClass']"> {{t('layout.header.welcomeIn')}} {{ title }} </span>
</div>
<!-- left end -->
@ -26,17 +26,17 @@
<!-- <AppSearch :class="`${prefixCls}-action__item `" v-if="getShowSearch" /> -->
<ErrorAction v-if="getUseErrorHandle" :class="`${prefixCls}-action__item error-action`" />
<a-divider type="vertical" v-if="getUseErrorHandle" />
<Notify v-if="getShowNotice" :class="`${prefixCls}-action__item notify-item`" />
<a-divider type="vertical" v-if="getShowNotice" />
<FullScreen v-if="getShowFullScreen" :class="`${prefixCls}-action__item fullscreen-item`" />
<a-divider type="vertical" v-if="getShowFullScreen" />
<LockScreen v-if="getUseLockPage" />
<a-divider type="vertical" v-if="getUseLockPage" />
<!-- <AppLocalePicker v-if="getShowLocalePicker" :reload="true" :showText="false" :class="`${prefixCls}-action__item`" /> -->
<UserDropDown :theme="getHeaderTheme" />
<a-divider type="vertical" />
<SettingDrawer v-if="getShowSetting" :class="`${prefixCls}-action__item`" />
<!-- ai助手 -->
<!-- <Aide></Aide> -->
@ -257,4 +257,8 @@
}
//update-end---author:scott ---date::2022-09-30 for--------------
}
.jeecg-layout-header--light {
border-bottom: 0px;
border-left: 0px;
}
</style>

View File

@ -4,7 +4,7 @@
<LayoutHeader fixed v-if="getShowFullHeaderRef" />
<Layout :class="[layoutClass]">
<LayoutSideBar v-if="getShowSidebar || getIsMobile" />
<Layout :class="`${prefixCls}-main`">
<Layout :class="`${prefixCls}-main`" style="background-image: url('/devops/src/assets/images/bj.png');">
<LayoutMultipleHeader />
<LayoutContent />
<LayoutFooter />

View File

@ -15,182 +15,75 @@ import { primaryColor } from '../../build/config/themeConfig';
// ! 改动后需要清空浏览器缓存
const setting: ProjectConfig = {
// 是否显示SettingButton
showSettingButton: true,
// 是否显示主题切换按钮
showDarkModeToggle: true,
// 设置按钮位置 可选项
// SettingButtonPositionEnum.AUTO: 自动选择
// SettingButtonPositionEnum.HEADER: 位于头部
// SettingButtonPositionEnum.FIXED: 固定在右侧
settingButtonPosition: SettingButtonPositionEnum.AUTO,
// 权限模式,默认前端角色权限模式
// ROUTE_MAPPING: 前端模式(菜单由路由生成,默认)
// ROLE前端模式菜单路由分开
// BACK后台模式
permissionMode: PermissionModeEnum.BACK,
// 权限缓存存放位置。默认存放于localStorage
permissionCacheType: CacheTypeEnum.LOCAL,
// 会话超时处理方案
// SessionTimeoutProcessingEnum.ROUTE_JUMP: 路由跳转到登录页
// SessionTimeoutProcessingEnum.PAGE_COVERAGE: 生成登录弹窗,覆盖当前页面
sessionTimeoutProcessing: SessionTimeoutProcessingEnum.ROUTE_JUMP,
// 项目主题色
themeColor: primaryColor,
// 网站灰色模式,用于可能悼念的日期开启
grayMode: false,
// 色弱模式
colorWeak: false,
// 是否取消菜单,顶部,多标签页显示, 用于可能内嵌在别的系统内
fullContent: false,
// 主题内容宽度
contentMode: ContentEnum.FULL,
// 是否显示logo
showLogo: true,
// 是否显示底部信息 copyright
showFooter: false,
// 头部配置
headerSetting: {
// 背景色
bgColor: HEADER_PRESET_BG_COLOR_LIST[4],
// 固定头部
fixed: true,
// 是否显示顶部
show: true,
// 主题
theme: ThemeEnum.LIGHT,
// 开启锁屏功能
useLockPage: false,
// 显示全屏按钮
showFullScreen: false,
// 显示官网按钮
showDoc: false,
// 显示消息中心按钮
showNotice: true,
// 显示菜单搜索按钮
showSearch: true,
"showSettingButton": true,
"showDarkModeToggle": true,
"settingButtonPosition": "auto",
"permissionMode": "BACK",
"permissionCacheType": 1,
"sessionTimeoutProcessing": 0,
"themeColor": "#1890FF",
"grayMode": false,
"colorWeak": false,
"fullContent": false,
"contentMode": "full",
"showLogo": true,
"showFooter": false,
"headerSetting": {
"bgColor": "#ffffff",
"fixed": true,
"show": true,
"theme": "light",
"useLockPage": false,
"showFullScreen": false,
"showDoc": false,
"showNotice": true,
"showSearch": true
},
// 菜单配置
menuSetting: {
// 背景色
bgColor: SIDE_BAR_BG_COLOR_LIST[0],
// 是否固定住左侧菜单
fixed: true,
// 菜单折叠
collapsed: false,
// 折叠菜单时候是否显示菜单名
collapsedShowTitle: false,
// 是否可拖拽
// Only limited to the opening of the left menu, the mouse has a drag bar on the right side of the menu
canDrag: false,
// Whether to show no dom
show: true,
// Whether to show dom
hidden: false,
// 菜单宽度
menuWidth: 210,
// 菜单模式
mode: MenuModeEnum.INLINE,
// 菜单类型
type: MenuTypeEnum.SIDEBAR,
// 菜单主题
theme: ThemeEnum.DARK,
// update-begin--author:liaozhiyang---date:20241203---for【issues/7522】解决menuSetting ts警告
// 左侧导航栏文字颜色调整区分彩色和暗黑 (不对应配置)
isThemeBright: false,
// update-end--author:liaozhiyang---date:20241203---for【issues/7522】解决menuSetting ts警告
// 分割菜单
split: false,
// 顶部菜单布局
topMenuAlign: 'center',
// 折叠触发器的位置
trigger: TriggerEnum.HEADER,
// 手风琴模式,只展示一个菜单
accordion: true,
// 在路由切换的时候关闭左侧混合菜单展开菜单
closeMixSidebarOnChange: false,
// 左侧混合菜单模块切换触发方式 click |'hover'
mixSideTrigger: MixSidebarTriggerEnum.CLICK,
// 是否固定左侧混合菜单
mixSideFixed: false,
"menuSetting": {
"bgColor": "#ffffff",
"fixed": true,
"collapsed": false,
"collapsedShowTitle": false,
"canDrag": false,
"show": true,
"hidden": false,
"menuWidth": 210,
"mode": "inline",
"type": "sidebar",
"theme": "light",
"isThemeBright": false,
"split": false,
"topMenuAlign": "center",
"trigger": "HEADER",
"accordion": true,
"closeMixSidebarOnChange": false,
"mixSideTrigger": "click",
"mixSideFixed": false
},
// 多标签
multiTabsSetting: {
// 刷新后是否保留已经打开的标签页
cache: false,
// 开启
show: true,
// 是否可以拖拽
canDrag: true,
// 开启快速操作
showQuick: true,
// 是否显示刷新按钮
showRedo: true,
// 是否显示折叠按钮
showFold: true,
// 标签页样式
theme: TabsThemeEnum.CARD,
"multiTabsSetting": {
"cache": false,
"show": false,
"canDrag": true,
"showQuick": true,
"showRedo": true,
"showFold": true,
"theme": "card"
},
// 动画配置
transitionSetting: {
// 是否开启切换动画
// The disabled state will also disable pageLoading
enable: true,
// 动画名 Route basic switching animation
basicTransition: RouterTransitionEnum.FADE_SIDE,
// 是否打开页面切换loading
// Only open when enable=true
openPageLoading: true,
//是否打开页面切换顶部进度条
openNProgress: true,
"transitionSetting": {
"enable": true,
"basicTransition": "fade-slide",
"openPageLoading": true,
"openNProgress": true
},
// 是否开启KeepAlive缓存 开发时候最好关闭,不然每次都需要清除缓存
openKeepAlive: true,
// 自动锁屏时间为0不锁屏。 单位分钟 默认1个小时
lockTime: 0,
// 显示面包屑
showBreadCrumb: false,
// 显示面包屑图标
showBreadCrumbIcon: true,
// 是否使用全局错误捕获
useErrorHandle: false,
// 是否开启回到顶部
useOpenBackTop: true,
// 是否可以嵌入iframe页面
canEmbedIFramePage: true,
// 切换界面的时候是否删除未关闭的message及notify
closeMessageOnSwitch: true,
// 切换界面的时候是否取消已经发送但是未响应的http请求。
// 如果开启,想对单独接口覆盖。可以在单独接口设置
removeAllHttpPending: false,
"openKeepAlive": false,
"lockTime": 0,
"showBreadCrumb": false,
"showBreadCrumbIcon": true,
"useErrorHandle": false,
"useOpenBackTop": true,
"canEmbedIFramePage": true,
"closeMessageOnSwitch": true,
"removeAllHttpPending": false
};
export default setting;

View File

@ -1,7 +1,5 @@
<template>
<div :class="prefixCls" class="login-background-img">
<AppLocalePicker class="absolute top-4 right-4 enter-x xl:text-gray-600" :showText="false"/>
<AppDarkModeToggle class="absolute top-3 right-7 enter-x" />
<div class="aui-logo" v-if="!getIsMobile">
<div>
<h3>
@ -12,7 +10,7 @@
<div v-else class="aui-phone-logo">
<img :src="logoImg" alt="jeecg" />
</div>
<div v-show="type === 'login'">
<div >
<div class="aui-content">
<div class="aui-container">
<div class="aui-form">
@ -24,34 +22,54 @@
<div class="aui-formBox">
<div class="aui-formWell">
<div class="aui-flex aui-form-nav investment_title">
<div class="aui-flex-box" :class="activeIndex === 'accountLogin' ? 'activeNav on' : ''" @click="loginClick('accountLogin')"
>{{ t('sys.login.signInFormTitle') }}
<div class="aui-flex-box">账号登录
</div>
</div>
<a-divider />
<div class="aui-form-box" style="height: 180px">
<a-form ref="loginRef" :model="formData" v-if="activeIndex === 'accountLogin'" @keyup.enter.native="loginHandleClick">
<div class="aui-account">
<div class="aui-inputClear">
<i class="icon icon-code"></i>
<a-form-item>
<a-input class="fix-auto-fill" :placeholder="t('sys.login.userName')" v-model:value="formData.username" />
</a-form-item>
<a-row>
<a-col :span="2">
<span style="margin-top: 10px;display: block;"><img :src="icon1Img" alt="账号" style="width: 20px;" /></span>
</a-col>
<a-col :span="20">
<a-form-item>
<a-input class="fix-auto-fill" :placeholder="`请输入`+t('sys.login.userName')" v-model:value="formData.username" />
</a-form-item>
</a-col>
</a-row>
</div>
<div class="aui-inputClear">
<i class="icon icon-password"></i>
<a-form-item>
<a-input class="fix-auto-fill" type="password" :placeholder="t('sys.login.password')" v-model:value="formData.password" />
</a-form-item>
<a-row>
<a-col :span="2">
<span style="margin-top: 10px;display: block;"><img :src="icon2Img" alt="密码" style="width: 20px;" /></span>
</a-col>
<a-col :span="20">
<a-form-item>
<a-input class="fix-auto-fill" type="password" :placeholder="`请输入`+t('sys.login.password')" v-model:value="formData.password" />
</a-form-item>
</a-col>
</a-row>
</div>
<div class="aui-inputClear">
<i class="icon icon-code"></i>
<a-form-item>
<a-input class="fix-auto-fill" type="text" :placeholder="t('sys.login.inputCode')" v-model:value="formData.inputCode" />
</a-form-item>
<div class="aui-code">
<img v-if="randCodeData.requestCodeSuccess" :src="randCodeData.randCodeImage" @click="handleChangeCheckCode" />
<img v-else style="margin-top: 2px; max-width: initial" :src="codeImg" @click="handleChangeCheckCode" />
</div>
<a-row>
<a-col :span="2">
<span style="margin-top: 10px;display: block;"><img :src="icon3Img" alt="验证码" style="width: 20px;" /></span>
</a-col>
<a-col :span="19">
<a-form-item>
<a-input class="fix-auto-fill" type="text" :placeholder="`请输入`+t('sys.login.inputCode')" v-model:value="formData.inputCode" />
</a-form-item>
</a-col>
<a-col :span="3">
<div class="aui-code">
<img v-if="randCodeData.requestCodeSuccess" :src="randCodeData.randCodeImage" @click="handleChangeCheckCode" />
<img v-else style="margin-top: 2px; max-width: initial" :src="codeImg" @click="handleChangeCheckCode" />
</div>
</a-col>
</a-row>
</div>
</div>
</a-form>
@ -61,9 +79,6 @@
<a-button :loading="loginLoading" class="aui-link-login" type="primary" @click="loginHandleClick">
{{ t('sys.login.loginButton') }}</a-button>
</div>
<div class="aui-flex">
<a class="aui-linek-code aui-flex-box" @click="registerHandleClick">{{ t('sys.login.registerButton') }}</a>
</div>
</div>
</div>
</div>
@ -71,17 +86,6 @@
</div>
</div>
</div>
<div v-show="type === 'forgot'" :class="`${prefixCls}-form`">
<MiniForgotpad ref="forgotRef" @go-back="goBack" @success="handleSuccess" />
</div>
<div v-show="type === 'register'" :class="`${prefixCls}-form`">
<MiniRegister ref="registerRef" @go-back="goBack" @success="handleSuccess" />
</div>
<div v-show="type === 'codeLogin'" :class="`${prefixCls}-form`">
<MiniCodelogin ref="codeRef" @go-back="goBack" @success="handleSuccess" />
</div>
<!-- 第三方登录相关弹框 -->
<ThirdModal ref="thirdModalRef"></ThirdModal>
<!-- 图片验证码弹窗 -->
<CaptchaModal @register="captchaRegisterModal" @ok="getLoginCode" />
@ -100,8 +104,11 @@
import MiniForgotpad from './MiniForgotpad.vue';
import MiniRegister from './MiniRegister.vue';
import MiniCodelogin from './MiniCodelogin.vue';
import logoImg from '/@/assets/loginmini/icon/jeecg_logo.png';
import adTextImg from '/@/assets/loginmini/icon/jeecg_ad_text.png';
import logoImg from '/@/assets/loginmini/icon/logo_yw.png';
import adTextImg from '/@/assets/loginmini/icon/yunwei.gif';
import icon1Img from '/@/assets/loginmini/icon/icon1.png';
import icon2Img from '/@/assets/loginmini/icon/icon2.png';
import icon3Img from '/@/assets/loginmini/icon/icon3.png';
import { AppLocalePicker, AppDarkModeToggle } from '/@/components/Application';
import { useLocaleStore } from '/@/store/modules/locale';
import { useDesign } from "/@/hooks/web/useDesign";
@ -132,7 +139,7 @@
//
const formData = reactive<any>({
inputCode: '',
username: 'admin',
username: '',
password: '',
});
//
@ -415,8 +422,8 @@
.aui-phone-logo{
position: absolute;
margin-left: 10px;
width: 60px;
top:2px;
width: 40%;
top: 4%;
z-index: 4;
}
.top-3{