Compare commits

...

10 Commits

23 changed files with 1020 additions and 818 deletions

Binary file not shown.

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="14px" height="14px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>上传</title>
<g id="组件" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" opacity="0.65">
<g id="上传_Resources/Button" transform="translate(-12.000000, -9.000000)">
<g id="上传" transform="translate(12.000000, 9.000000)">
<g id="upload" transform="translate(0.875000, 0.875000)" fill="currentColor" fill-rule="nonzero">
<path d="M5.80371094,0.138085937 C5.8953125,0.046484375 6.01699219,0 6.13867188,0 C6.26035156,0 6.38066406,0.046484375 6.47363281,0.138085937 L8.60371094,2.26953125 C8.78828125,2.45410156 8.78828125,2.75351562 8.60371094,2.93808594 C8.51484375,3.02695312 8.39589844,3.07617188 8.27011719,3.07617188 C8.14433594,3.07617188 8.02539062,3.02695312 7.93652344,2.93808594 L6.61171875,1.61328125 L6.61171875,9.51289062 C6.61171875,9.77402344 6.39980469,9.9859375 6.13867188,9.9859375 C5.87753906,9.9859375 5.665625,9.77402344 5.665625,9.51289062 L5.665625,1.61328125 L4.34082031,2.93808594 C4.15625,3.12265625 3.85683594,3.12265625 3.67363281,2.93808594 C3.4890625,2.75351562 3.4890625,2.45410156 3.67226563,2.26953125 L5.80371094,0.138085937 Z M11.7769531,7.88046875 C11.5158203,7.88046875 11.3039063,8.09238281 11.3039063,8.35351563 L11.3039063,11.025 C11.3039063,11.1794922 11.178125,11.3066406 11.0222656,11.3066406 L1.22636719,11.3066406 C1.071875,11.3066406 0.944726562,11.1808594 0.944726562,11.025 L0.944726562,8.35214844 C0.944726562,8.09101563 0.7328125,7.87910156 0.471679688,7.87910156 C0.210546875,7.87910156 0,8.09238281 0,8.35214844 L0,11.3996094 C0,11.8685547 0.381445313,12.2486328 0.849023437,12.2486328 L11.4009766,12.2486328 C11.8699219,12.2486328 12.25,11.8671875 12.25,11.3996094 L12.25,8.35214844 C12.25,8.09238281 12.0380859,7.88046875 11.7769531,7.88046875 Z" id="Shape"></path>
</g>
<rect id="Rectangle-49" x="0" y="0" width="14" height="14"></rect>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 KiB

BIN
src/assets/logo/cnbm.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -1,10 +1,13 @@
/* ===== PC DESIGN ===== */ /* ===== PC DESIGN ===== */
$W: 1000; $W: 1080;
$H: 1920; $H: 1920;
$picW: 438; // $picW: 438;
$picH: 560; // $picH: 560;
$formW: 320; $picW: 1080;
$picH: 1118;
$formW: 420;
$tabW: $formW / 2; $tabW: $formW / 2;
// $rowH: 56;
$rowH: 56; $rowH: 56;
$buttonH: 50; $buttonH: 50;
@@ -15,6 +18,7 @@ $containerBgImage: '../assets/images/bg.png';
$logoWidth: 417px; $logoWidth: 417px;
$logoHeight: 64px; $logoHeight: 64px;
$logoImage: '../assets/logo/login-logo.png'; $logoImage: '../assets/logo/login-logo.png';
$cnbmLogo: '../assets/logo/cnbm.png';
// container-content // container-content
$contentWidth: round($W / $H * 100) * 1vw; $contentWidth: round($W / $H * 100) * 1vw;
$contentHeight: round($picH / $W * 100) / 100 * $contentWidth; $contentHeight: round($picH / $W * 100) / 100 * $contentWidth;
@@ -22,7 +26,8 @@ $contentBgColor: #ffffff;
// container-content-pic // container-content-pic
$picWidth: round($picW / $H * 100) * 1vw; $picWidth: round($picW / $H * 100) * 1vw;
$picHeight: inherit; $picHeight: inherit;
$picImage: '../assets/images/pic.png'; // $picImage: '../assets/images/pic.png';
$picImage: '../assets/images/login-bg.png';
// container-content-field // container-content-field
$fieldWidth: $contentWidth - $picWidth; $fieldWidth: $contentWidth - $picWidth;
$fieldHeight: inherit; $fieldHeight: inherit;
@@ -34,231 +39,310 @@ $buttonHeight: $buttonH * 1px;
// - - - - - 页面基础设置 // - - - - - 页面基础设置
.container { .container {
.login-code { .login-code {
width: 33%; width: 33%;
height: 38px; height: 38px;
float: right; float: right;
img { img {
cursor: pointer; cursor: pointer;
width:100%;max-width:100px; height:auto; width: 100%;
vertical-align: middle; max-width: 100px;
} height: auto;
} vertical-align: middle;
// 元素 }
width: inherit; }
height: inherit; // 元素
min-width: 1080px; width: inherit;
min-height: 620px; height: inherit;
background-color: $containerBgColor; min-width: 1080px;
background-image: url($containerBgImage); min-height: 620px;
background-size: cover; background-color: $containerBgColor;
// 定位 // background-image: url($containerBgImage);
position: relative; background-size: cover;
display: flex; // 定位
justify-content: center; position: relative;
align-items: center; display: flex;
// 文字 justify-content: center;
font-size: 14px; align-items: center;
font-family: Microsoft YaHei; // 文字
font-weight: 400; font-size: 14px;
.logo { font-family: Microsoft YaHei;
// 元素 font-weight: 400;
width: $logoWidth; .logo {
height: $logoHeight; // 元素
// background-image: url($logoImage); width: $logoWidth;
// background-size: contain; height: $logoHeight;
// 定位 // background-image: url($logoImage);
position: absolute; // background-size: contain;
top: 50px; // 定位
left: 50%; position: absolute;
margin-left: -$logoWidth/2; top: 50px;
} left: 50%;
.content { margin-left: -$logoWidth/2;
// 元素 }
width: $contentWidth; .content {
height: $contentHeight; // 元素
background-color: #ffffff; // width: $contentWidth;
box-shadow: 0px 16px 40px rgba(0, 0, 0, 0.07); // height: $contentHeight;
border-radius: 20px; width: 100%;
// 定位 height: 100%;
position: relative; background-color: #ffffff;
.pic { // box-shadow: 0px 16px 40px rgba(0, 0, 0, 0.07);
// 元素 // border-radius: 20px;
width: $picWidth; // 定位
height: $picHeight; position: relative;
background-image: url($picImage); display: flex;
background-repeat: no-repeat;
background-size: cover; .pic {
border-radius: 20px 0 0 20px; // 元素
// 定位 width: $picWidth;
position: absolute; height: $picHeight;
top: 0; background-image: url($picImage);
left: 0; background-repeat: no-repeat;
} background-size: 100% 100%;
.field { background-position: 0 0;
width: $fieldWidth; position: relative;
height: $fieldHeight;
// 定位 &::after {
position: absolute; content: '';
top: 0; position: absolute;
left: $picWidth; top: 0;
display:flex; left: 0;
justify-content: center; width: 100%;
align-items: center; height: 100%;
.pc-title{ width: 100%; clear: both;} // background: #f003;
.mobile-title, display: inline-block;
.mobile-switch { }
display: none; }
} .field {
.form { // background: #ccc3;
box-sizing: border-box; position: relative;
width: $formWidth; padding-top: 196px;
// - - - tab flex: 1;
:deep(.el-tabs__content) { display: flex;
padding: 20px 0 0; flex-direction: column;
} // justify-content: center;
:deep(.el-tabs__item) { align-items: center;
// 元素 .pc-title {
width: $tabWidth; width: 100%;
height: $rowHeight; text-align: center;
padding: 0; clear: both;
// 文字 position: relative;
line-height: $rowHeight; top: -36px;
color: #666666;
} // h3.title {
:deep(.el-tabs__item.is-active) { // position: relative;
font-weight: bold;
color: #2F53EB; // &::before {
} // content: '';
:deep(.el-tabs__active-bar) { // background: url($cnbmLogo) 100% / 100% no-repeat;
height: 3px; // height: 48px;
border-radius: 2px; // width: 48px;
} // position: absolute;
// - - - input // left: 0px;
:deep(.el-input__inner) { // top: 4px;
// 元素 // display: inline-block;
width: 100%; // }
height: $rowHeight; // }
background: #f5f5f5; }
border: 0; .mobile-title,
border-radius: 28px; .mobile-switch {
// 文字 display: none;
text-align: center; }
line-height: 19px; .form {
color: #262626; margin-top: 32px;
} box-sizing: border-box;
.code:deep(.el-input__inner) { // width: $formWidth;
padding: 0 24px; width: 100%;
// 文字 // - - - tab
text-align: left; :deep(.el-tabs__nav) {
} // background: #f0f3;
:deep(.el-input__inner::-webkit-input-placeholder) { /* WebKit browsers */ }
font-weight: 400; :deep(.el-tabs__content) {
color: #8C8C8C; padding: 20px 0 0;
} }
:deep(.el-input__inner:-moz-placeholder) { /* Mozilla Firefox 4 to 18 */ :deep(.el-tabs__item) {
font-weight: 400; user-select: none;
color: #8C8C8C; // 元素
} width: $tabWidth;
:deep(.el-input__inner::-moz-placeholder) { /* Mozilla Firefox 19+ */ height: $rowHeight;
font-weight: 400; padding: 0;
color: #8C8C8C; // 文字
opacity:1; line-height: $rowHeight;
} color: #666666;
:deep(.el-input__inner:-ms-input-placeholder) { /* Internet Explorer 10+ */ font-size: 18px;
font-weight: 400; font-weight: 400;
color: #8C8C8C !important; text-align: center;
} }
:deep(.el-form-item) { :deep(.el-tabs__item.is-active) {
position: relative; font-weight: 500;
.button-code { color: #2f53eb;
// 元素 }
height: $rowHeight; :deep(.el-tabs__active-bar) {
box-sizing: border-box; height: 3px;
// 定位 border-radius: 2px;
position: absolute; }
top: 0; // - - - input
right: 20px; :deep(.el-input__inner) {
z-index: 1; // 元素
// 文字 width: 100%;
line-height: 20px; height: $rowHeight;
font-size: 14px; background: #f5f5f5;
font-family: PingFang SC; border: 0;
font-weight: 400; border-radius: 28px;
color: #2F53EB; // 文字
span { text-align: center;
padding-left: 15px; line-height: 19px;
border-left: 2px solid #D9D9D9; color: #262626;
} }
} .code:deep(.el-input__inner) {
} padding: 0 24px;
:deep(.el-form-item__error) { // 文字
padding-left: 24px; text-align: left;
} }
.button { :deep(.el-input__inner::-webkit-input-placeholder) {
width: 100%; /* WebKit browsers */
height: $buttonHeight; font-weight: 400;
background: rgba(24, 144, 255, 0.2); color: #8c8c8c;
border: 0; }
border-radius: 24px; :deep(.el-input__inner:-moz-placeholder) {
margin-bottom: 20px; /* Mozilla Firefox 4 to 18 */
// 文字 font-weight: 400;
line-height: 26px; color: #8c8c8c;
font-size: 20px; }
color: #FFFFFF; :deep(.el-input__inner::-moz-placeholder) {
} /* Mozilla Firefox 19+ */
.button-active { font-weight: 400;
background: #2F53EB; color: #8c8c8c;
box-shadow: 0px 2px 8px rgba(0, 80, 184, 0.2); opacity: 1;
} }
} :deep(.el-input__inner:-ms-input-placeholder) {
} /* Internet Explorer 10+ */
} font-weight: 400;
.footer { color: #8c8c8c !important;
// 元素 }
height: 16px; :deep(.el-form-item) {
line-height: 16px; position: relative;
font-size: 12px; .button-code {
color: #8c8c8c; // 元素
// 定位 height: $rowHeight;
position: absolute; box-sizing: border-box;
bottom: 30px; // 定位
a, position: absolute;
a:hover, top: 0;
a:active { right: 20px;
color: inherit; z-index: 1;
text-decoration: none; // 文字
} line-height: 20px;
} font-size: 14px;
font-family: PingFang SC;
font-weight: 400;
color: #2f53eb;
span {
padding-left: 15px;
border-left: 2px solid #d9d9d9;
}
}
}
:deep(.el-form-item__error) {
padding-left: 24px;
}
.button {
width: 100%;
height: $buttonHeight;
background: rgba(24, 144, 255, 0.2);
border: 0;
border-radius: 24px;
margin-bottom: 20px;
// 文字
line-height: 26px;
font-size: 20px;
color: #ffffff;
}
.button-active {
background: #2f53eb;
box-shadow: 0px 2px 8px rgba(0, 80, 184, 0.2);
}
}
}
}
.login-form {
* {
user-select: none;
}
// - - - input
:deep(.el-input__inner) {
// 元素
width: 420px;
height: 66px;
color: #262626;
font-size: 18px;
}
:deep(.el-checkbox__label) {
font-size: 18px;
line-height: 14px;
}
}
.footer {
user-select: none;
// 元素
height: 16px;
line-height: 16px;
font-size: 12px;
color: #8c8c8c;
// 定位
position: absolute;
bottom: 30px;
a,
a:hover,
a:active {
color: inherit;
text-decoration: none;
}
}
} }
// - - - - - PC 最小尺寸设置 // - - - - - PC 最小尺寸设置
@media screen and (min-width: 599px) and (max-width: 1366px) { @media screen and (min-width: 599px) and (max-width: 1366px) {
.container { .container {
.content { min-width: 599px;
width: 710px; .content {
height: 397px; // width: 710px;
.pic { // height: 397px;
width: 314px; width: 100%;
} height: 100%;
.field { .pic {
width: calc(710px - 314px); // width: 314px;
left: 314px; display: none;
.form { }
width: 320px; .field {
:deep(.el-input__inner) { // width: calc(710px - 314px);
width: 320px; // left: 314px;
height: 56px; // justify-content: center;
} width: 100%;
.button {
height: 50px;
}
}
}
}
}
}
.pc-title {
h3 {
font-size: 2.4rem !important;
}
}
.form {
// width: 320px;
:deep(.el-input__inner) {
width: 320px;
height: 56px;
}
.button {
height: 50px;
}
}
}
}
}
}
/* ===== MOBILE DESIGN ===== */ /* ===== MOBILE DESIGN ===== */
$mobileW: 375; $mobileW: 375;
@@ -273,115 +357,142 @@ $mobileButtonH: 48;
$mobileContainerBgImage: '../assets/images/bg-mobile.png'; $mobileContainerBgImage: '../assets/images/bg-mobile.png';
// container-content // container-content
$mobileContentWidth: round($mobileContentW / $mobileW * 100) * 1vw; $mobileContentWidth: round($mobileContentW / $mobileW * 100) * 1vw;
$mobileContentHeight: round($mobileContentH / $mobileW * 100) / 100 * $mobileContentWidth; $mobileContentHeight: round($mobileContentH / $mobileW * 100) / 100 *
$mobileContentWidth;
// container-content-field-form // container-content-field-form
$mobileFormWidth: round($mobileFormW / $mobileW *100) * 1vw; $mobileFormWidth: round($mobileFormW / $mobileW * 100) * 1vw;
$mobileRowHeight: $mobileRowH * 1px; $mobileRowHeight: $mobileRowH * 1px;
$mobileButtonHeight: $mobileButtonH * 1px; $mobileButtonHeight: $mobileButtonH * 1px;
$iconBgImage: '../assets/images/icon.png'; $iconBgImage: '../assets/images/icon.png';
// - - - - - 移动端设置 // - - - - - 移动端设置
@media screen and (max-width: 599px) { @media screen and (max-width: 599px) {
.container { .container {
// 元素 // 元素
background-image: url($mobileContainerBgImage); background-image: url($mobileContainerBgImage);
min-width: 280px; min-width: 280px;
min-height: 568px; min-height: 568px;
// 文字 // 文字
font-size: 17px; font-size: 14px;
font-family: PingFang SC; font-family: PingFang SC;
font-weight: bold; font-weight: bold;
.logo { .logo {
display: none; display: none;
} }
.content { .pc-title {
// 元素 display: none;
width: $mobileContentWidth; }
height: $mobileContentHeight;
min-width: 250px; .content {
min-height: 340px; // 元素
// 定位 width: $mobileContentWidth;
display: flex; height: $mobileContentHeight;
justify-content: center; min-width: 250px;
align-items: center; min-height: 340px;
.pic { // 定位
display: none; display: flex;
} justify-content: center;
.field { align-items: center;
// 元素 .pic {
width: inherit; display: none;
min-height: inherit; }
// 定位 .field {
left: 0; padding: 0;
display: flex; // 元素
flex-direction: column; width: inherit;
.mobile-title { min-height: inherit;
// 元素 // 定位
margin: 0 0 20px; left: 0;
display: block; display: flex;
} flex-direction: column;
.form {
width: $mobileFormWidth; .mobile-title {
// - - - tab // 元素
:deep(.el-tabs__header) { margin: 0;
display: none; display: block;
} }
:deep(.el-tabs__content) {
padding: 0; .form {
}
// - - - input
:deep(.el-input__inner) {
height: $mobileRowHeight;
line-height: 24px;
// 文字
text-align: center;
color: #262626;
}
:deep(.el-form-item) {
.button-code {
// 元素
height: $mobileRowHeight;
}
}
.button {
height: $mobileButtonHeight;
line-height: 24px;
color: #FFFFFF;
}
}
.mobile-switch {
display: block;
line-height: 20px;
font-size: 14px;
font-weight: 400;
color: #595959;
margin: 0; margin: 0;
.icon { width: $mobileFormWidth;
width: 14px; // - - - tab
height: 14px; :deep(.el-tabs__header) {
display: inline-block; display: none;
background-image: url($iconBgImage); }
background-size: cover; :deep(.el-tabs__content) {
} padding: 0;
} }
.mobile-switch:hover { // - - - input
cursor: pointer; :deep(.el-input__inner) {
} height: $mobileRowHeight;
} line-height: 24px;
} // 文字
.footer { text-align: center;
// 元素 color: #262626;
font-size: 12px; }
font-family: PingFang SC; :deep(.el-form-item) {
font-weight: 400; .button-code {
line-height: 17px; // 元素
color: #333333; height: $mobileRowHeight;
opacity: 0.6; }
// 定位 }
position: absolute; .button {
bottom: 20px; height: $mobileButtonHeight;
} line-height: 24px;
} color: #ffffff;
}
}
.login-form {
:deep(.el-input__inner) {
height: $mobileRowHeight;
line-height: 24px;
// 文字
text-align: center;
color: #262626;
}
:deep(#button-form-item) {
margin: 0 !important;
button {
// 元素
height: $mobileRowHeight;
}
}
}
.mobile-switch {
display: block;
line-height: 20px;
font-size: 14px;
font-weight: 400;
color: #595959;
margin: 0;
.icon {
width: 14px;
height: 14px;
display: inline-block;
background-image: url($iconBgImage);
background-size: cover;
}
}
.mobile-switch:hover {
cursor: pointer;
}
}
}
.footer {
// 元素
font-size: 12px;
font-family: PingFang SC;
font-weight: 400;
line-height: 17px;
color: #333333;
opacity: 0.6;
// 定位
// position: absolute;
bottom: -32px;
}
}
} }

View File

@@ -83,6 +83,9 @@
:on-success="handleUploadSuccess" :on-success="handleUploadSuccess"
v-bind="col.bind"> v-bind="col.bind">
<el-button size="mini" :disabled="col.bind?.disabled || false"> <el-button size="mini" :disabled="col.bind?.disabled || false">
<svg-icon
icon-class="icon-upload"
style="color: inherit"></svg-icon>
上传文件 上传文件
</el-button> </el-button>
<div class="el-upload__tip" slot="tip" v-if="col.uploadTips"> <div class="el-upload__tip" slot="tip" v-if="col.uploadTips">
@@ -133,7 +136,6 @@ const uploadedFile = {
}, },
methods: { methods: {
handleDelete() { handleDelete() {
console.log('emit delete event')
this.$emit('delete', this.file); this.$emit('delete', this.file);
}, },
}, },
@@ -188,6 +190,10 @@ export default {
type: Boolean, type: Boolean,
default: false, default: false,
}, },
hasFile: {
type: Boolean,
default: false,
},
labelPosition: { labelPosition: {
type: String, type: String,
default: 'right', default: 'right',
@@ -220,7 +226,6 @@ export default {
watch: { watch: {
rows: { rows: {
handler() { handler() {
console.log('watch triggered!');
this.$nextTick(() => { this.$nextTick(() => {
this.handleOptions('watch'); this.handleOptions('watch');
}); });
@@ -231,6 +236,9 @@ export default {
dataForm: { dataForm: {
handler(val) { handler(val) {
this.form = JSON.parse(JSON.stringify(val)); this.form = JSON.parse(JSON.stringify(val));
if (this.hasFile) {
this.form.files = this.form.files ?? [];
}
}, },
deep: true, deep: true,
immediate: true, immediate: true,
@@ -368,7 +376,9 @@ export default {
}, },
handleDeleteFile(file) { handleDeleteFile(file) {
this.form.files = this.form.files.filter(item => item.fileUrl != file.fileUrl); this.form.files = this.form.files.filter(
(item) => item.fileUrl != file.fileUrl
);
this.$emit('update', this.form); this.$emit('update', this.form);
}, },
}, },

View File

@@ -38,7 +38,7 @@
@close="cancel" @close="cancel"
@cancel="cancel" @cancel="cancel"
@confirm="submitForm"> @confirm="submitForm">
<DialogForm v-if="open" ref="form" :dataForm="form" :rows="rows" /> <DialogForm v-if="open" ref="form" v-model="form" :rows="rows" />
</base-dialog> </base-dialog>
<!-- 抽屉 详情 --> <!-- 抽屉 详情 -->

View File

@@ -36,7 +36,7 @@
v-if="showForm" v-if="showForm"
ref="form" ref="form"
:disabled="mode.includes('detail')" :disabled="mode.includes('detail')"
:dataForm="form" v-model="form"
:rows="formRows" /> :rows="formRows" />
</div> </div>

View File

@@ -38,7 +38,7 @@
@close="cancel" @close="cancel"
@cancel="cancel" @cancel="cancel"
@confirm="submitForm"> @confirm="submitForm">
<DialogForm v-if="open" ref="form" :dataForm="form" :rows="rows" /> <DialogForm v-if="open" ref="form" v-model="form" :rows="rows"/>
</base-dialog> </base-dialog>
<!-- 抽屉 详情 --> <!-- 抽屉 详情 -->

View File

@@ -38,7 +38,7 @@
@close="cancel" @close="cancel"
@cancel="cancel" @cancel="cancel"
@confirm="submitForm"> @confirm="submitForm">
<DialogForm v-if="open" ref="form" :dataForm="form" :rows="rows" /> <DialogForm v-if="open" ref="form" v-model="form" :rows="rows" />
</base-dialog> </base-dialog>
</div> </div>
</template> </template>

View File

@@ -36,7 +36,7 @@
v-if="showForm" v-if="showForm"
ref="form" ref="form"
:disabled="mode.includes('detail')" :disabled="mode.includes('detail')"
:dataForm="form" v-model="form"
:rows="formRows" /> :rows="formRows" />
</div> </div>

View File

@@ -38,7 +38,7 @@
@close="cancel" @close="cancel"
@cancel="cancel" @cancel="cancel"
@confirm="submitForm"> @confirm="submitForm">
<DialogForm v-if="open" ref="form" :dataForm="form" :rows="rows" /> <DialogForm v-if="open" ref="form" v-model="form" :rows="rows" />
</base-dialog> </base-dialog>
<!-- 抽屉 详情 --> <!-- 抽屉 详情 -->

View File

@@ -38,7 +38,7 @@
@close="cancel" @close="cancel"
@cancel="cancel" @cancel="cancel"
@confirm="submitForm"> @confirm="submitForm">
<DialogForm v-if="open" ref="form" :dataForm="form" :rows="rows" /> <DialogForm v-if="open" ref="form" v-model="form" :rows="rows" />
</base-dialog> </base-dialog>
</div> </div>
</template> </template>

View File

@@ -18,9 +18,16 @@
预览 预览
</div> --> </div> -->
</section> </section>
<section class="file-area"> <section
class="file-area"
:style="{
height: expand ? 'auto' : isPicMode ? '180px' : '152px',
gap: isPicMode ? '0 24px' : '24px',
gridAutoRows: isPicMode ? '180px' : '152px',
}">
<el-upload <el-upload
class="equipment-upload" class="equipment-upload"
:style="{ marginBottom: isPicMode ? '48px' : '24px' }"
:disabled="disabled" :disabled="disabled"
drag drag
:action="uploadUrl" :action="uploadUrl"
@@ -56,7 +63,6 @@
v-for="(file, index) in files" v-for="(file, index) in files"
:key="file.fileName" :key="file.fileName"
:style="{ :style="{
display: index > 3 && !expand ? 'none' : 'block',
background: isPicMode background: isPicMode
? `url(${file.fileUrl}) no-repeat` ? `url(${file.fileUrl}) no-repeat`
: `url(${defaultBg}) no-repeat`, : `url(${defaultBg}) no-repeat`,
@@ -226,7 +232,7 @@ export default {
clearTimeout(this.updateTimer); clearTimeout(this.updateTimer);
} }
this.updateTimer = setTimeout(() => { this.updateTimer = setTimeout(() => {
console.log('[AssetsUpload] 更新上传列表'); // console.log('[AssetsUpload] 更新上传列表');
this.emitFilelist(); this.emitFilelist();
clearTimeout(this.updateTimer); clearTimeout(this.updateTimer);
this.updateTimer = null; this.updateTimer = null;
@@ -314,7 +320,6 @@ export default {
} }
:deep(.equipment-upload) { :deep(.equipment-upload) {
background: #ccc4;
.el-upload-dragger { .el-upload-dragger {
width: 188px; width: 188px;
height: 128px; height: 128px;
@@ -346,6 +351,10 @@ export default {
} }
} }
.equipment-upload {
margin-bottom: 24px;
}
.file-list { .file-list {
padding: 12px; padding: 12px;
border: 1px solid #ccc; border: 1px solid #ccc;
@@ -354,13 +363,14 @@ export default {
// custom // custom
.file-area { .file-area {
display: grid; display: grid;
grid-template-columns: repeat(5, 188px); grid-template-columns: repeat(auto-fill, 188px);
grid-auto-rows: 128px; grid-auto-rows: 152px;
gap: 24px 18px; gap: 48px 24px;
place-content: center; overflow: hidden;
} }
.file-list__item { .file-list__item {
height: 128px;
background-color: #fff; background-color: #fff;
border: 1px dashed #d9d9d9; border: 1px dashed #d9d9d9;
border-radius: 6px; border-radius: 6px;

View File

@@ -1,32 +0,0 @@
<!--
filename: EquipmentAssets.vue
author: liubin
date: 2023-08-22 11:11:18
description: 设备资产
-->
<template>
<div class="equipment-assets"></div>
</template>
<script>
export default {
name: "EquipmentAssets",
components: {},
props: {},
data() {
return {}
},
computed: {},
methods: {},
}
</script>
<style scoped lang="scss">
.equipment-assets {
background: #f1f1f1;
padding: 12px;
min-height: 128px;
margin-top: 8px;
}
</style>

View File

@@ -1,111 +0,0 @@
<!--
filename: EquipmentPics.vue
author: liubin
date: 2023-08-18 16:29:39
description:
-->
<template>
<div class="equipment-pics">
<div v-for="(url, idx) in images" :key="url">
<img :src="url" :alt="url" />
<figure class="big-img" :style="inlineStyle">
<img :src="url" :alt="url" />
<figcaption>{{ desc[idx] }}</figcaption>
</figure>
</div>
</div>
</template>
<script>
export default {
name: 'EquipmentPics',
components: {},
props: {
inlineStyle: {
type: Object,
default: () => ({}),
},
},
data() {
return {
desc: [
'车间设备 - 1',
'车间设备 - 2',
'车间设备 - 3',
'车间设备 - 4',
'车间设备 - 5',
'车间设备 - 6',
'车间设备 - 7',
'车间设备 - 8',
'车间设备 - 9',
'车间设备 - 10',
'车间设备 - 11',
'车间设备 - 12',
],
images: Array(10)
.fill(1)
.map((_, index) => require(`../assets/eq${index + 1}.jpg`)),
};
},
methods: {},
};
</script>
<style scoped lang="scss">
.equipment-pics {
// background: #cfcfcf;
padding: 12px;
// margin: 8px;
display: flex;
overflow-x: auto;
}
.equipment-pics > div {
height: 100px;
position: relative;
cursor: pointer;
}
.equipment-pics > div:not(:last-child) {
margin-right: 12px;
}
.equipment-pics > div > img {
height: 95%;
}
.equipment-pics > div > figure {
display: none;
position: fixed;
// inset: 0;
// margin: auto;
top: 0;
right: 0;
// width: 640px;
// height: 480px;
background: #000;
overflow: hidden;
padding: 8px 8px 0;
}
.equipment-pics > div:hover > figure {
margin: 0;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.equipment-pics > div > figure > img {
flex: 1;
}
.equipment-pics > div > figure > figcaption {
height: 24px;
margin-top: 8px;
font-size: 18px;
line-height: 1;
color: #fff;
}
</style>

View File

@@ -44,8 +44,9 @@
ref="form" ref="form"
label-position="top" label-position="top"
size="small" size="small"
:dataForm="form" v-model="form"
:rows="computedRows" /> :rows="computedRows"
:has-file="true" />
</base-dialog> </base-dialog>
<!-- 设备 详情 - 编辑 --> <!-- 设备 详情 - 编辑 -->
@@ -105,9 +106,6 @@
<script> <script>
import moment from 'moment'; import moment from 'moment';
import basicPageMixin from '@/mixins/lb/basicPageMixin'; import basicPageMixin from '@/mixins/lb/basicPageMixin';
import { getAccessToken } from '@/utils/auth';
import EquipmentPics from './components/EquipmentPics';
import EquipmentAssets from './components/EquipmentAssets';
import EquipmentDrawer from './components/EquipmentDrawer'; import EquipmentDrawer from './components/EquipmentDrawer';
import { import {
@@ -132,6 +130,12 @@ export default {
return { return {
searchBarKeys: ['name', 'code'], searchBarKeys: ['name', 'code'],
tableBtn: [ tableBtn: [
this.$auth.hasPermi(`base:equipment:update`)
? {
type: 'detail',
btnName: '详情',
}
: undefined,
this.$auth.hasPermi('base:equipment:update') this.$auth.hasPermi('base:equipment:update')
? { ? {
type: 'edit', type: 'edit',
@@ -144,12 +148,6 @@ export default {
btnName: '删除', btnName: '删除',
} }
: undefined, : undefined,
this.$auth.hasPermi(`base:equipment:update`)
? {
type: 'detail',
btnName: '详情',
}
: undefined,
].filter((v) => v), ].filter((v) => v),
tableProps: [ tableProps: [
{ {
@@ -213,6 +211,13 @@ export default {
{ {
type: 'separate', type: 'separate',
}, },
{
type: this.$auth.hasPermi('base:equipment:export') ? 'button' : '',
btnName: '导出',
name: 'export',
plain: true,
color: 'primary',
},
{ {
type: this.$auth.hasPermi('base:equipment:create') ? 'button' : '', type: this.$auth.hasPermi('base:equipment:create') ? 'button' : '',
btnName: '新增', btnName: '新增',
@@ -220,12 +225,6 @@ export default {
plain: true, plain: true,
color: 'success', color: 'success',
}, },
{
type: this.$auth.hasPermi('base:equipment:export') ? 'button' : '',
btnName: '导出',
name: 'export',
color: 'warning',
},
], ],
rows: [ rows: [
[ [

View File

@@ -37,7 +37,12 @@
@close="cancel" @close="cancel"
@cancel="cancel" @cancel="cancel"
@confirm="submitForm"> @confirm="submitForm">
<DialogForm v-if="open" ref="form" v-model="form" :rows="rows" /> <DialogForm
v-if="open"
ref="form"
v-model="form"
:rows="rows"
:has-file="true" />
</base-dialog> </base-dialog>
</div> </div>
</template> </template>
@@ -207,8 +212,6 @@ export default {
name: undefined, name: undefined,
parentId: undefined, parentId: undefined,
remark: undefined, remark: undefined,
fileNames: [],
fileUrls: [],
}; };
this.resetForm('form'); this.resetForm('form');
}, },

View File

@@ -1,81 +1,238 @@
<template xmlns=""> <template xmlns="">
<div class="container"> <div class="container">
<div class="logo"></div> <div class="logo"></div>
<!-- 登录区域 --> <!-- 登录区域 -->
<div class="content"> <div class="content">
<!-- 配图 --> <!-- 配图 -->
<div class="pic"></div> <div class="pic">
<!-- 表单 --> <div
<div class="field"> class="welcome"
<!-- [移动端]标题 --> style="
<h2 class="mobile-title"> position: absolute;
<h3 class="title">芋道后台管理系统</h3> top: 15%;
</h2> left: 20%;
user-select: none;
display: flex;
flex-direction: column;
align-items: flex-start;
">
<strong
style="
letter-spacing: 1px;
font-family: Arial, Helvetica, sans-serif;
font-weight: 500;
font-size: 88px;
">
<span style="color: #26b9de">Wel</span>
<span style="color: #fff">come</span>
</strong>
<p
style="
margin: 0;
font-size: 26px;
letter-spacing: 1px;
color: #26b9de;
opacity: 75%;
">
<span
style="
display: inline-block;
height: 20px;
width: 20px;
margin-left: 8px;
margin-right: 12px;
border-radius: 100%;
background: #26b9de;
"></span>
产线生产监控系统
</p>
</div>
<video
src="/static/videos/login.webm"
muted
autoplay
loop
style="
user-select: none;
position: absolute;
top: 28%;
width: 100%;
height: 70%;
"></video>
</div>
<!-- 表单 -->
<div class="field">
<!-- [移动端]标题 -->
<h2 class="mobile-title">
<h3 class="title">中建材智能自动化研究院有限公司</h3>
</h2>
<h2 class="pc-title" style="">
<h3
class="title"
style="
margin: 0;
margin-left: 32px;
font-weight: 400;
user-select: none;
color: #000;
font-size: 36px;
line-height: 54px;
letter-spacing: 2px;
">
<img
src="../assets/logo/cnbm.png"
alt="cnbm_logo"
style="
height: 48px;
width: 48px;
position: relative;
top: 12px;
right: 8px;
" />
<span>中建材智能自动化研究院有限公司</span>
</h3>
<h3
class="sub-title"
style="
margin: 0;
margin-left: 32px;
font-weight: 400;
user-select: none;
color: #000;
font-size: 36px;
line-height: 54px;
letter-spacing: 2px;
">
产线生产监控系统
</h3>
</h2>
<!-- 表单 --> <!-- 表单 -->
<div class="form-cont"> <div class="form-cont">
<el-tabs class="form" v-model="loginForm.loginType" style=" float:none;"> <el-tabs
<el-tab-pane label="账号密码登录" name="uname"> class="form"
</el-tab-pane> v-model="loginForm.loginType"
<el-tab-pane label="短信验证码登录" name="sms"> style="float: none">
</el-tab-pane> <el-tab-pane label="账号密码登录" name="uname"></el-tab-pane>
</el-tabs> <el-tab-pane label="短信验证码登录" name="sms"></el-tab-pane>
<div> </el-tabs>
<el-form ref="loginForm" :model="loginForm" :rules="LoginRules" class="login-form"> <div style="">
<el-form-item prop="tenantName" v-if="tenantEnable"> <el-form
<el-input v-model="loginForm.tenantName" type="text" auto-complete="off" placeholder='租户'> ref="loginForm"
<svg-icon slot="prefix" icon-class="tree" class="el-input__icon input-icon" /> :model="loginForm"
</el-input> :rules="LoginRules"
</el-form-item> class="login-form">
<!-- 账号密码登录 --> <el-form-item prop="tenantName" v-if="tenantEnable">
<div v-if="loginForm.loginType === 'uname'"> <el-input
<el-form-item prop="username"> v-model="loginForm.tenantName"
<el-input v-model="loginForm.username" type="text" auto-complete="off" placeholder="账号"> type="text"
<svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" /> auto-complete="off"
</el-input> placeholder="租户">
</el-form-item> <!-- <svg-icon
<el-form-item prop="password"> slot="prefix"
<el-input v-model="loginForm.password" type="password" auto-complete="off" placeholder="密码" icon-class="tree"
@keyup.enter.native="getCode"> class="el-input__icon input-icon" /> -->
<svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon" /> </el-input>
</el-input> </el-form-item>
</el-form-item> <!-- 账号密码登录 -->
<el-checkbox v-model="loginForm.rememberMe" style="margin:0 0 25px 0;">记住密码</el-checkbox> <div v-if="loginForm.loginType === 'uname'">
</div> <el-form-item prop="username">
<el-input
v-model="loginForm.username"
type="text"
auto-complete="off"
placeholder="账号">
<!-- <svg-icon
slot="prefix"
icon-class="user"
class="el-input__icon input-icon" /> -->
</el-input>
</el-form-item>
<el-form-item prop="password">
<el-input
v-model="loginForm.password"
type="password"
auto-complete="off"
placeholder="密码"
@keyup.enter.native="getCode">
<!-- <svg-icon
slot="prefix"
icon-class="password"
class="el-input__icon input-icon" /> -->
</el-input>
</el-form-item>
<el-checkbox
v-model="loginForm.rememberMe"
style="margin: 0 0 25px 0">
记住密码
</el-checkbox>
</div>
<!-- 短信验证码登录 --> <!-- 短信验证码登录 -->
<div v-if="loginForm.loginType === 'sms'"> <div v-if="loginForm.loginType === 'sms'">
<el-form-item prop="mobile"> <el-form-item prop="mobile">
<el-input v-model="loginForm.mobile" type="text" auto-complete="off" placeholder="请输入手机号"> <el-input
<svg-icon slot="prefix" icon-class="phone" class="el-input__icon input-icon" /> v-model="loginForm.mobile"
</el-input> type="text"
</el-form-item> auto-complete="off"
<el-form-item prop="mobileCode"> placeholder="请输入手机号">
<el-input v-model="loginForm.mobileCode" type="text" auto-complete="off" placeholder="短信验证码" <!-- <svg-icon
class="sms-login-mobile-code-prefix" @keyup.enter.native="handleLogin"> slot="prefix"
<template> icon-class="phone"
<svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon" /> class="el-input__icon input-icon" /> -->
</template> </el-input>
<template slot="append"> </el-form-item>
<span v-if="mobileCodeTimer <= 0" class="getMobileCode" @click="getSmsCode" <el-form-item prop="mobileCode">
style="cursor: pointer;">获取验证码</span> <el-input
<span v-if="mobileCodeTimer > 0" class="getMobileCode">{{ mobileCodeTimer }}秒后可重新获取</span> v-model="loginForm.mobileCode"
</template> type="text"
</el-input> auto-complete="off"
</el-form-item> placeholder="短信验证码"
</div> class="sms-login-mobile-code-prefix"
@keyup.enter.native="handleLogin">
<!-- <template>
<svg-icon
slot="prefix"
icon-class="password"
class="el-input__icon input-icon" />
</template> -->
<template slot="suffix">
<span
v-if="mobileCodeTimer <= 0"
class="getMobileCode"
@click="getSmsCode"
style="
cursor: pointer;
color: #0b58ff;
font-size: 18px;
line-height: 66px;
padding-right: 12px;
">
获取验证码
</span>
<span v-if="mobileCodeTimer > 0" class="getMobileCode">
{{ mobileCodeTimer }}秒后可重新获取
</span>
</template>
</el-input>
</el-form-item>
</div>
<!-- 下方的登录按钮 --> <!-- 下方的登录按钮 -->
<el-form-item style="width:100%;"> <el-form-item id="button-form-item" style="width: 100%; margin-top: 32px">
<el-button :loading="loading" size="medium" type="primary" style="width:100%;" <el-button
@click.native.prevent="getCode"> :loading="loading"
<span v-if="!loading"> </span> size="medium"
<span v-else> 中...</span> type="primary"
</el-button> style="width: 100%; height: 66px; font-size: 18px;"
</el-form-item> @click.native.prevent="getCode">
<span v-if="!loading"> </span>
<span v-else> 中...</span>
</el-button>
</el-form-item>
<!-- 社交登录 --> <!-- 社交登录 -->
<!-- <el-form-item style="width:100%;"> <!-- <el-form-item style="width:100%;">
<div class="oauth-login" style="display:flex"> <div class="oauth-login" style="display:flex">
<div class="oauth-login-item" v-for="item in SysUserSocialTypeEnum" :key="item.type" @click="doSocialLogin(item)"> <div class="oauth-login-item" v-for="item in SysUserSocialTypeEnum" :key="item.type" @click="doSocialLogin(item)">
<img :src="item.img" height="25px" width="25px" alt="登录" > <img :src="item.img" height="25px" width="25px" alt="登录" >
@@ -83,265 +240,305 @@
</div> </div>
</div> </div>
</el-form-item> --> </el-form-item> -->
</el-form> </el-form>
</div> </div>
</div> </div>
</div>
</div>
<!-- 图形验证码 --> <!-- footer -->
<Verify ref="verify" :captcha-type="'blockPuzzle'" :img-size="{ width: '400px', height: '200px' }" <div class="footer">
@success="handleLogin" /> Copyright © 2023 中建材智能自动化院 All Rights Reserved.
</div>
</div>
</div>
<!-- footer --> <!-- 图形验证码 -->
<div class="footer"> <Verify
Copyright © 2023 中建材智能自动化院 All Rights Reserved. ref="verify"
</div> :captcha-type="'blockPuzzle'"
</div> :img-size="{ width: '400px', height: '200px' }"
@success="handleLogin" />
</div>
</template> </template>
<script> <script>
import { sendSmsCode, socialAuthRedirect } from "@/api/login"; import { sendSmsCode, socialAuthRedirect } from '@/api/login';
import { getTenantIdByName } from "@/api/system/tenant"; import { getTenantIdByName } from '@/api/system/tenant';
import { SystemUserSocialTypeEnum } from "@/utils/constants"; import { SystemUserSocialTypeEnum } from '@/utils/constants';
import { getCaptchaEnable, getTenantEnable } from "@/utils/ruoyi"; import { getCaptchaEnable, getTenantEnable } from '@/utils/ruoyi';
import { import {
getPassword, getPassword,
getRememberMe, getTenantName, getRememberMe,
getUsername, getTenantName,
removePassword, removeRememberMe, removeTenantName, getUsername,
removeUsername, removePassword,
setPassword, setRememberMe, setTenantId, setTenantName, removeRememberMe,
setUsername removeTenantName,
} from "@/utils/auth"; removeUsername,
setPassword,
setRememberMe,
setTenantId,
setTenantName,
setUsername,
} from '@/utils/auth';
import Verify from '@/components/Verifition/Verify'; import Verify from '@/components/Verifition/Verify';
import { resetUserPwd } from "@/api/system/user"; import { resetUserPwd } from '@/api/system/user';
export default { export default {
name: "Login", name: 'Login',
components: { components: {
Verify Verify,
}, },
data() { data() {
return { return {
codeUrl: "", codeUrl: '',
captchaEnable: true, captchaEnable: true,
tenantEnable: true, tenantEnable: true,
mobileCodeTimer: 0, mobileCodeTimer: 0,
loginForm: { loginForm: {
loginType: "uname", loginType: 'uname',
username: "admin", username: 'admin',
password: "admin123", password: 'admin123',
captchaVerification: "", captchaVerification: '',
mobile: "", mobile: '',
mobileCode: "", mobileCode: '',
rememberMe: false, rememberMe: false,
tenantName: "技术中心", tenantName: '技术中心',
}, },
scene: 21, scene: 21,
LoginRules: { LoginRules: {
username: [ username: [
{ required: true, trigger: "blur", message: "用户名不能为空" } { required: true, trigger: 'blur', message: '用户名不能为空' },
], ],
password: [ password: [
{ required: true, trigger: "blur", message: "密码不能为空" } { required: true, trigger: 'blur', message: '密码不能为空' },
], ],
mobile: [ mobile: [
{ required: true, trigger: "blur", message: "手机号不能为空" }, { required: true, trigger: 'blur', message: '手机号不能为空' },
{ {
validator: function (rule, value, callback) { validator: function (rule, value, callback) {
if (/^(?:(?:\+|00)86)?1(?:3[\d]|4[5-79]|5[0-35-9]|6[5-7]|7[0-8]|8[\d]|9[189])\d{8}$/.test(value) === false) { if (
callback(new Error("手机号格式错误")); /^(?:(?:\+|00)86)?1(?:3[\d]|4[5-79]|5[0-35-9]|6[5-7]|7[0-8]|8[\d]|9[189])\d{8}$/.test(
} else { value
callback(); ) === false
} ) {
}, trigger: "blur" callback(new Error('手机号格式错误'));
} } else {
], callback();
tenantName: [ }
{ required: true, trigger: "blur", message: "租户不能为空" }, },
{ trigger: 'blur',
validator: (rule, value, callback) => { },
// debugger ],
getTenantIdByName(value).then(res => { tenantName: [
const tenantId = res.data; { required: true, trigger: 'blur', message: '租户不能为空' },
if (tenantId && tenantId >= 0) { {
// 设置租户 validator: (rule, value, callback) => {
setTenantId(tenantId) // debugger
callback(); getTenantIdByName(value).then((res) => {
} else { const tenantId = res.data;
callback('租户不存在'); if (tenantId && tenantId >= 0) {
} // 设置租户
}); setTenantId(tenantId);
}, callback();
trigger: 'blur' } else {
} callback('租户不存在');
] }
}, });
loading: false, },
redirect: undefined, trigger: 'blur',
// 枚举 },
SysUserSocialTypeEnum: SystemUserSocialTypeEnum, ],
}; },
}, loading: false,
created() { redirect: undefined,
// 租户开关 // 枚举
this.tenantEnable = getTenantEnable(); SysUserSocialTypeEnum: SystemUserSocialTypeEnum,
if (this.tenantEnable) { };
getTenantIdByName(this.loginForm.tenantName).then(res => { // 设置租户 },
const tenantId = res.data; created() {
if (tenantId && tenantId >= 0) { // 租户开关
setTenantId(tenantId) this.tenantEnable = getTenantEnable();
} if (this.tenantEnable) {
}); getTenantIdByName(this.loginForm.tenantName).then((res) => {
} // 设置租户
// 验证码开关 const tenantId = res.data;
this.captchaEnable = getCaptchaEnable(); if (tenantId && tenantId >= 0) {
// 重定向地址 setTenantId(tenantId);
this.redirect = this.$route.query.redirect ? decodeURIComponent(this.$route.query.redirect) : undefined; }
this.getCookie(); });
}, }
methods: { // 验证码开关
getCode() { this.captchaEnable = getCaptchaEnable();
// 情况一,未开启:则直接登录 // 重定向地址
if (!this.captchaEnable) { this.redirect = this.$route.query.redirect
this.handleLogin({}) ? decodeURIComponent(this.$route.query.redirect)
return; : undefined;
} this.getCookie();
},
methods: {
getCode() {
// 情况一,未开启:则直接登录
if (!this.captchaEnable) {
this.handleLogin({});
return;
}
// 情况二,已开启:则展示验证码;只有完成验证码的情况,才进行登录 // 情况二,已开启:则展示验证码;只有完成验证码的情况,才进行登录
// 弹出验证码 // 弹出验证码
this.$refs.verify.show() this.$refs.verify.show();
}, },
getCookie() { getCookie() {
const username = getUsername(); const username = getUsername();
const password = getPassword(); const password = getPassword();
const rememberMe = getRememberMe(); const rememberMe = getRememberMe();
const tenantName = getTenantName(); const tenantName = getTenantName();
this.loginForm = { this.loginForm = {
...this.loginForm, ...this.loginForm,
username: username ? username : this.loginForm.username, username: username ? username : this.loginForm.username,
password: password ? password : this.loginForm.password, password: password ? password : this.loginForm.password,
rememberMe: rememberMe ? getRememberMe() : false, rememberMe: rememberMe ? getRememberMe() : false,
tenantName: tenantName ? tenantName : this.loginForm.tenantName, tenantName: tenantName ? tenantName : this.loginForm.tenantName,
}; };
}, },
handleLogin(captchaParams) { handleLogin(captchaParams) {
this.$refs.loginForm.validate(valid => { this.$refs.loginForm.validate((valid) => {
if (valid) { if (valid) {
this.loading = true; this.loading = true;
// 设置 Cookie // 设置 Cookie
if (this.loginForm.rememberMe) { if (this.loginForm.rememberMe) {
setUsername(this.loginForm.username) setUsername(this.loginForm.username);
setPassword(this.loginForm.password) setPassword(this.loginForm.password);
setRememberMe(this.loginForm.rememberMe) setRememberMe(this.loginForm.rememberMe);
setTenantName(this.loginForm.tenantName) setTenantName(this.loginForm.tenantName);
} else { } else {
removeUsername() removeUsername();
removePassword() removePassword();
removeRememberMe() removeRememberMe();
removeTenantName() removeTenantName();
} }
this.loginForm.captchaVerification = captchaParams.captchaVerification this.loginForm.captchaVerification =
// 发起登陆 captchaParams.captchaVerification;
// console.log("发起登录", this.loginForm); // 发起登陆
this.$store.dispatch(this.loginForm.loginType === "sms" ? "SmsLogin" : "Login", this.loginForm).then(() => { // console.log("发起登录", this.loginForm);
this.$router.push({ path: this.redirect || "/" }).catch(() => { this.$store
}); .dispatch(
}).catch(() => { this.loginForm.loginType === 'sms' ? 'SmsLogin' : 'Login',
this.loading = false; this.loginForm
}); )
} .then(() => {
}); this.$router.push({ path: this.redirect || '/' }).catch(() => {});
}, })
async doSocialLogin(socialTypeEnum) { .catch(() => {
// 设置登录中 this.loading = false;
this.loading = true; });
let tenant = false; }
if (this.tenantEnable) { });
await this.$prompt('请输入租户名称', "提示", { },
confirmButtonText: "确定", async doSocialLogin(socialTypeEnum) {
cancelButtonText: "取消" // 设置登录中
}).then(async ({ value }) => { this.loading = true;
await getTenantIdByName(value).then(res => { let tenant = false;
const tenantId = res.data; if (this.tenantEnable) {
tenant = true await this.$prompt('请输入租户名称', '提示', {
if (tenantId && tenantId >= 0) { confirmButtonText: '确定',
setTenantId(tenantId) cancelButtonText: '取消',
} })
}); .then(async ({ value }) => {
}).catch(() => { await getTenantIdByName(value).then((res) => {
// 取消登录按钮 loading状态 const tenantId = res.data;
this.loading = false; tenant = true;
if (tenantId && tenantId >= 0) {
setTenantId(tenantId);
}
});
})
.catch(() => {
// 取消登录按钮 loading状态
this.loading = false;
return false return false;
}); });
} else { } else {
tenant = true tenant = true;
} }
if (tenant) { if (tenant) {
// 计算 redirectUri // 计算 redirectUri
const redirectUri = location.origin + '/social-login?' const redirectUri =
+ encodeURIComponent('type=' + socialTypeEnum.type + '&redirect=' + (this.redirect || "/")); // 重定向不能丢 location.origin +
// const redirectUri = 'http://127.0.0.1:48080/api/gitee/callback'; '/social-login?' +
// const redirectUri = 'http://127.0.0.1:48080/api/dingtalk/callback'; encodeURIComponent(
// 进行跳转 'type=' +
socialAuthRedirect(socialTypeEnum.type, encodeURIComponent(redirectUri)).then((res) => { socialTypeEnum.type +
// console.log(res.url); '&redirect=' +
window.location.href = res.data; (this.redirect || '/')
}); ); // 重定向不能丢
} // const redirectUri = 'http://127.0.0.1:48080/api/gitee/callback';
}, // const redirectUri = 'http://127.0.0.1:48080/api/dingtalk/callback';
/** ========== 以下为升级短信登录 ========== */ // 进行跳转
getSmsCode() { socialAuthRedirect(
if (this.mobileCodeTimer > 0) return; socialTypeEnum.type,
this.$refs.loginForm.validate(valid => { encodeURIComponent(redirectUri)
if (!valid) return; ).then((res) => {
sendSmsCode(this.loginForm.mobile, this.scene, this.loginForm.uuid, this.loginForm.code).then(res => { // console.log(res.url);
this.$modal.msgSuccess("获取验证码成功") window.location.href = res.data;
this.mobileCodeTimer = 60; });
let msgTimer = setInterval(() => { }
this.mobileCodeTimer = this.mobileCodeTimer - 1; },
if (this.mobileCodeTimer <= 0) { /** ========== 以下为升级短信登录 ========== */
clearInterval(msgTimer); getSmsCode() {
} if (this.mobileCodeTimer > 0) return;
}, 1000); this.$refs.loginForm.validate((valid) => {
}); if (!valid) return;
}); sendSmsCode(
} this.loginForm.mobile,
} this.scene,
this.loginForm.uuid,
this.loginForm.code
).then((res) => {
this.$modal.msgSuccess('获取验证码成功');
this.mobileCodeTimer = 60;
let msgTimer = setInterval(() => {
this.mobileCodeTimer = this.mobileCodeTimer - 1;
if (this.mobileCodeTimer <= 0) {
clearInterval(msgTimer);
}
}, 1000);
});
});
},
},
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "~@/assets/styles/login.scss"; @import '~@/assets/styles/login.scss';
.oauth-login { .oauth-login {
display: flex; display: flex;
align-items: center; align-items: center;
cursor: pointer; cursor: pointer;
} }
.oauth-login-item { .oauth-login-item {
display: flex; display: flex;
align-items: center; align-items: center;
margin-right: 10px; margin-right: 10px;
} }
.oauth-login-item img { .oauth-login-item img {
height: 25px; height: 25px;
width: 25px; width: 25px;
} }
.oauth-login-item span:hover { .oauth-login-item span:hover {
text-decoration: underline red; text-decoration: underline red;
color: red; color: red;
} }
.sms-login-mobile-code-prefix { .sms-login-mobile-code-prefix {
:deep(.el-input__prefix) { :deep(.el-input__prefix) {
top: 22%; top: 22%;
} }
}</style> }
</style>

View File

@@ -77,7 +77,6 @@ export default {
label: '设备名称', label: '设备名称',
}, },
{ {
width: 128,
prop: 'equipmentCode', prop: 'equipmentCode',
label: '设备编码', label: '设备编码',
}, },
@@ -117,6 +116,7 @@ export default {
{ {
_action: 'params-monitor', _action: 'params-monitor',
label: '操作', label: '操作',
width: 56,
subcomponent: { subcomponent: {
props: ['injectData'], props: ['injectData'],
render: function (h) { render: function (h) {
@@ -124,10 +124,10 @@ export default {
return h( return h(
'el-button', 'el-button',
{ {
class: 'iconfont icon-detail',
props: { type: 'text' }, props: { type: 'text' },
on: { on: {
click: function () { click: function () {
console.log('inejctdata', _this.injectData);
_this.$emit('emitData', { _this.$emit('emitData', {
action: _this.injectData._action, action: _this.injectData._action,
// value: _this.injectData.id, // value: _this.injectData.id,
@@ -135,8 +135,8 @@ export default {
}); });
}, },
}, },
}, }
'查看详情' // '查看详情'
); );
}, },
}, },

View File

@@ -42,7 +42,7 @@
<DialogForm <DialogForm
v-if="open" v-if="open"
ref="form" ref="form"
:dataForm="form" v-model="form"
:rows="[ :rows="[
[ [
{ {

View File

@@ -40,7 +40,7 @@
<DialogForm <DialogForm
v-if="open" v-if="open"
ref="form" ref="form"
:dataForm="form" v-model="form"
:rows="[ :rows="[
[ [
{ {

View File

@@ -64,6 +64,7 @@ export default {
name: item.inspectionContent, name: item.inspectionContent,
type: 'bar', type: 'bar',
barCategoryGap: 12, barCategoryGap: 12,
barWidth: 20,
data: [], data: [],
}; };