Commit 98dfe263 authored by 白舜's avatar 白舜 🎱

Merge branch 'dev0217' of ssh://cloud.wodcloud.com:10022/apaas/apaas-system-ui into dev

parents 30a86f9a 679d75dd
kind: pipeline kind: pipeline
name: dev name: dev0217
trigger: trigger:
branch: branch:
- dev - dev0217
clone: clone:
disable: true disable: true
...@@ -17,6 +17,7 @@ steps: # 定义流水线执行步骤,这些步骤将顺序执行 ...@@ -17,6 +17,7 @@ steps: # 定义流水线执行步骤,这些步骤将顺序执行
image: registry.cn-qingdao.aliyuncs.com/wod/devops-git:1.0 image: registry.cn-qingdao.aliyuncs.com/wod/devops-git:1.0
network_mode: host network_mode: host
- name: s3-cache - name: s3-cache
image: registry.cn-qingdao.aliyuncs.com/wod/devops-s3-cache:1.0 image: registry.cn-qingdao.aliyuncs.com/wod/devops-s3-cache:1.0
network_mode: host network_mode: host
......
...@@ -12,7 +12,7 @@ module.exports = { ...@@ -12,7 +12,7 @@ module.exports = {
htmlWhitespaceSensitivity: "css", htmlWhitespaceSensitivity: "css",
insertPragma: false, insertPragma: false,
jsxSingleQuote: false, jsxSingleQuote: false,
printWidth: 120, // 如果属性过多需要换行,减少该值 printWidth: 100, // 如果属性过多需要换行,减少该值
proseWrap: "preserve", proseWrap: "preserve",
quoteProps: "as-needed", quoteProps: "as-needed",
requirePragma: false, requirePragma: false,
......
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -4,17 +4,33 @@ ...@@ -4,17 +4,33 @@
<bg-menu :path="nowParent.path" v-if="menuShow" @openMsg="openMsg"></bg-menu> <bg-menu :path="nowParent.path" v-if="menuShow" @openMsg="openMsg"></bg-menu>
<div class="container" :class="menuShow ? '' : 'full_screen'" v-if="pageShow"> <div class="container" :class="menuShow ? '' : 'full_screen'" v-if="pageShow">
<!-- <bg-nav :highlightParentRule="highlightParentRule" :title="nowParent.menuName" width="208px" :list="nowParent.children" v-show="navShow" class="con-nav" /> --> <!-- <bg-nav :highlightParentRule="highlightParentRule" :title="nowParent.menuName" width="208px" :list="nowParent.children" v-show="navShow" class="con-nav" /> -->
<bg-nav :highlightParentRule="highlightParentRule" width="208px" :list="nowParent.children" v-show="navShow" class="con-nav" /> <bg-nav
v-if="nowParent.children"
:highlightParentRule="highlightParentRule"
width="208px"
:list="nowParent.children"
v-show="navShow"
class="con-nav" />
<div class="bg-main view"> <div class="bg-main view">
<router-view /> <router-view />
</div> </div>
</div> </div>
<div class="container" v-else-if="$route.path=='/login'"> <div class="container" v-else-if="$route.path == '/login'">
<div class="bg-main view"> <div class="bg-main view">
<login></login> <login></login>
</div> </div>
</div> </div>
<div class="container" v-else-if="$route.path=='/404'"> <div class="container" v-else-if="$route.path == '/register'">
<div class="bg-main view">
<register></register>
</div>
</div>
<div class="container" v-else-if="$route.path == '/password'">
<div class="bg-main view">
<password></password>
</div>
</div>
<div class="container" v-else-if="$route.path == '/404'">
<div class="bg-main view"> <div class="bg-main view">
<page404></page404> <page404></page404>
</div> </div>
...@@ -25,128 +41,126 @@ ...@@ -25,128 +41,126 @@
</template> </template>
<script> <script>
import bgMenu from '@/components/bg-menu.vue' import bgMenu from "@/components/bg-menu.vue";
import login from '@/page/login/index.vue' import login from "@/page/login/index.vue";
import page404 from '@/page/404.vue' import page404 from "@/page/404.vue";
import register from "@/page/register/index.vue";
import password from "@/page/password/index.vue";
export default { export default {
components:{ components: {
bgMenu, bgMenu,
login, login,
page404, page404,
register,
password,
}, },
computed:{ computed: {
msgBoxFlag(){ msgBoxFlag() {
return this.$store.state.msgBoxFlag return this.$store.state.msgBoxFlag;
}, },
userInfo() { userInfo() {
return this.$store.state.userInfo || {}; return this.$store.state.userInfo || {};
}, },
navMenu(){ navMenu() {
return this.$store.state.menu return this.$store.state.menu;
}, },
menuObj(){ menuObj() {
return this.$store.state.menuObj return this.$store.state.menuObj;
}, },
navShow(){ navShow() {
return false||!['/','/404','/login'].includes(this.$route.path) return false || !["/", "/404", "/login", "/register", "/password"].includes(this.$route.path);
}, },
pageShow(){ pageShow() {
return false||!['/404','/login'].includes(this.$route.path) return false || !["/404", "/login", "/register", "/password"].includes(this.$route.path);
}, },
rowPath(){ rowPath() {
if(this.pageShow&&this.$store.state.userInfo){ if (this.pageShow && this.$store.state.userInfo) {
return this.menuObj[this.$route.path]&&this.menuObj[this.$route.path].rowPath return this.menuObj[this.$route.path] && this.menuObj[this.$route.path].rowPath;
}else{ } else {
return '' return "";
} }
}, },
nowParent(){ nowParent() {
if(this.pageShow&&this.$store.state.userInfo){ if (this.pageShow && this.$store.state.userInfo) {
return this.rowPath?this.navMenu[this.rowPath.slice(1,2)]:'' return this.rowPath ? this.navMenu[this.rowPath.slice(1, 2)] : "";
} else {
}else{ return "";
return ''
} }
}, },
menuShow() { menuShow() {
return false||!["/ui-example"].includes(this.$route.path) return false || !["/ui-example"].includes(this.$route.path);
} },
}, },
watch:{ watch: {
msgBoxFlag(n,o){ msgBoxFlag(n, o) {
this.readFlag = !this.readFlag this.readFlag = !this.readFlag;
}, },
userInfo: { userInfo: {
handler() { handler() {
this.initMsg() this.initMsg();
}, },
deep: true, deep: true,
}
}, },
data(){
return{
readFlag:false,
menuIndex:'',
}
}, },
created(){ data() {
// this.initMsg() return {
readFlag: false,
menuIndex: "",
};
}, },
mounted() { created() {
// this.initMsg()
}, },
methods:{ mounted() {},
methods: {
openMsg(data) { openMsg(data) {
this.readFlag = !this.readFlag; this.readFlag = !this.readFlag;
}, },
initMsg() { initMsg() {
if(this.userInfo && this.userInfo.system_id) { if (this.userInfo && this.userInfo.system_id) {
this.$trace.setOptionValue('userId',this.userInfo.system_id) this.$trace.setOptionValue("userId", this.userInfo.system_id);
// this.$trace.setOptionValue('userType',this.userInfo.userType) // this.$trace.setOptionValue('userType',this.userInfo.userType)
// this.$trace.setOptionValue('roleId',this.userInfo.roleIds.join(',')) // this.$trace.setOptionValue('roleId',this.userInfo.roleIds.join(','))
this.$trace.setOptionValue('organization',this.userInfo.organization_id) this.$trace.setOptionValue("organization", this.userInfo.organization_id);
} }
}, },
pathToData(data,path){ pathToData(data, path) {
let arr = path.split(".");
let arr = path.split('.') let temp = null;
let temp = null let tempName = "";
let tempName = '' let tempPath = "";
let tempPath = '' arr.forEach((e, idx) => {
arr.forEach((e,idx) => { if (idx == 1) {
temp = data[e];
if(idx==1){ tempName = data[e].menuName;
temp = data[e] tempPath = data[e].path;
tempName = data[e].menuName data = data[e];
tempPath = data[e].path
data = data[e]
} }
if(idx==2){ if (idx == 2) {
if(data.children&&data.children.length){ if (data.children && data.children.length) {
temp = data.children[e] temp = data.children[e];
data = data.children[e] data = data.children[e];
} }
} }
}); });
return { return {
menuName:tempName, menuName: tempName,
path:tempPath, path: tempPath,
children:[temp] children: [temp],
} };
}, },
highlightParentRule(pathArr){ highlightParentRule(pathArr) {
return pathArr.includes(this.$route.path) return pathArr.includes(this.$route.path);
}, },
ada(){ ada() {},
},
} };
}
}
</script> </script>
<style> <style>
#app{ #app {
height: 100%; height: 100%;
} }
.container{ .container {
width: 100%; width: 100%;
height: calc(100% - 56px); height: calc(100% - 56px);
overflow: hidden; overflow: hidden;
...@@ -157,10 +171,10 @@ export default { ...@@ -157,10 +171,10 @@ export default {
.full_screen .bg-main { .full_screen .bg-main {
overflow-x: hidden; overflow-x: hidden;
} }
.con-nav{ .con-nav {
float: left; float: left;
} }
.view{ .view {
height: 100%; height: 100%;
overflow-y: auto; overflow-y: auto;
background-color: #ebedf2; background-color: #ebedf2;
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
} }
/* 返回按钮颜色 */ /* 返回按钮颜色 */
.from_return>.el-button--primary { .from_return > .el-button--primary {
background-color: #edf0ff !important; background-color: #edf0ff !important;
border-color: #edf0ff !important; border-color: #edf0ff !important;
color: #264dd9 !important; color: #264dd9 !important;
...@@ -71,12 +71,15 @@ ...@@ -71,12 +71,15 @@
cursor: pointer; cursor: pointer;
} }
.space_bet {} .space_bet {
}
/* reset */ /* reset */
html {} html {
}
html,body { html,
body {
margin: 0; margin: 0;
font-family: Microsoft YaHei, sans-serif; font-family: Microsoft YaHei, sans-serif;
/* font-size: 17px; */ /* font-size: 17px; */
...@@ -101,16 +104,16 @@ h5 { ...@@ -101,16 +104,16 @@ h5 {
font-weight: normal; font-weight: normal;
} }
h1{ h1 {
font-size: 32px; font-size: 32px;
} }
h2{ h2 {
font-size: 24px; font-size: 24px;
} }
h3{ h3 {
font-size: 18.7px; font-size: 18.7px;
} }
h4{ h4 {
font-size: 16px; font-size: 16px;
} }
...@@ -154,7 +157,7 @@ div { ...@@ -154,7 +157,7 @@ div {
align-items: flex-start; align-items: flex-start;
} }
.ss_card>.sc_left_container { .ss_card > .sc_left_container {
width: 6rem; width: 6rem;
height: 6rem; height: 6rem;
flex-shrink: 0; flex-shrink: 0;
...@@ -163,19 +166,19 @@ div { ...@@ -163,19 +166,19 @@ div {
font-size: 0; font-size: 0;
} }
.ss_card>.sc_right_container { .ss_card > .sc_right_container {
width: calc(100% - 7rem); width: calc(100% - 7rem);
flex-grow: 1; flex-grow: 1;
margin-left: 1.2rem; margin-left: 1.2rem;
} }
.ss_card>.sc_right_container>.sc_title { .ss_card > .sc_right_container > .sc_title {
font-size: 1.6rem; font-size: 1.6rem;
font-weight: bold; font-weight: bold;
line-height: 2.6rem; line-height: 2.6rem;
} }
.ss_card>.sc_right_container>.sc_info { .ss_card > .sc_right_container > .sc_info {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
} }
...@@ -202,13 +205,13 @@ div { ...@@ -202,13 +205,13 @@ div {
position: relative; position: relative;
} }
.from_return>.el-button--primary { .from_return > .el-button--primary {
position: absolute; position: absolute;
top: 15px; top: 15px;
left: 20px; left: 20px;
} }
.from_return>span { .from_return > span {
color: #1a2236; color: #1a2236;
font-size: 16px; font-size: 16px;
} }
...@@ -279,6 +282,7 @@ div { ...@@ -279,6 +282,7 @@ div {
color: #404a62; color: #404a62;
text-align: center; text-align: center;
padding: 0 16px; padding: 0 16px;
line-height: 1;
} }
.dialog_box .el-dialog__body { .dialog_box .el-dialog__body {
padding: 24px; padding: 24px;
...@@ -621,7 +625,7 @@ border-radius:8px; ...@@ -621,7 +625,7 @@ border-radius:8px;
background-color: #fff; background-color: #fff;
} }
.el-radio__input.is-checked+.el-radio__label { .el-radio__input.is-checked + .el-radio__label {
color: #1a2236; color: #1a2236;
font-weight: 700; font-weight: 700;
} }
...@@ -674,18 +678,18 @@ border-radius:8px; ...@@ -674,18 +678,18 @@ border-radius:8px;
} }
/* common */ /* common */
.apass_breadcrumb>.el-breadcrumb { .apass_breadcrumb > .el-breadcrumb {
padding: 10px 0; padding: 10px 0;
} }
.apass_breadcrumb>.el-breadcrumb .el-breadcrumb__inner { .apass_breadcrumb > .el-breadcrumb .el-breadcrumb__inner {
font-size: 14px; font-size: 14px;
font-weight: 400; font-weight: 400;
color: #898d9e; color: #898d9e;
line-height: 23px; line-height: 23px;
} }
.apass_breadcrumb>.el-breadcrumb .el-breadcrumb__item:last-child .el-breadcrumb__inner { .apass_breadcrumb > .el-breadcrumb .el-breadcrumb__item:last-child .el-breadcrumb__inner {
color: #242c43; color: #242c43;
font-weight: normal; font-weight: normal;
} }
...@@ -771,8 +775,7 @@ border-radius:8px; ...@@ -771,8 +775,7 @@ border-radius:8px;
border-color: #ebeef5; border-color: #ebeef5;
} }
.apass_table .el-table th > .cell {
.apass_table .el-table th>.cell {
color: #1a2236; color: #1a2236;
} }
...@@ -851,7 +854,7 @@ border-radius:8px; ...@@ -851,7 +854,7 @@ border-radius:8px;
border-color: #515fe7; border-color: #515fe7;
} }
.apass_checkbox .el-checkbox__input.is-checked+.el-checkbox__label { .apass_checkbox .el-checkbox__input.is-checked + .el-checkbox__label {
color: #58617a; color: #58617a;
} }
...@@ -934,7 +937,7 @@ border-radius:8px; ...@@ -934,7 +937,7 @@ border-radius:8px;
margin-top: 50px; margin-top: 50px;
} }
.apaas_detail_container .detail_action .el-button+.el-button { .apaas_detail_container .detail_action .el-button + .el-button {
margin-left: 30px; margin-left: 30px;
} }
...@@ -1005,7 +1008,7 @@ border-radius:8px; ...@@ -1005,7 +1008,7 @@ border-radius:8px;
width: 124px; width: 124px;
} }
.apaas_steps .apaas_step .apaas_step_action .el-button+.el-button { .apaas_steps .apaas_step .apaas_step_action .el-button + .el-button {
margin-left: 20px; margin-left: 20px;
} }
...@@ -1017,7 +1020,7 @@ border-radius:8px; ...@@ -1017,7 +1020,7 @@ border-radius:8px;
flex-grow: 1; flex-grow: 1;
font-size: 0; font-size: 0;
} }
.filter_list>.filter_item { .filter_list > .filter_item {
display: flex; display: flex;
align-items: center; align-items: center;
margin: 0 34px 16px 0; margin: 0 34px 16px 0;
...@@ -1028,7 +1031,7 @@ border-radius:8px; ...@@ -1028,7 +1031,7 @@ border-radius:8px;
vertical-align: middle; vertical-align: middle;
} */ } */
.filter_list>.filter_item>.filter_title { .filter_list > .filter_item > .filter_title {
text-align: right; text-align: right;
font-size: 14px; font-size: 14px;
color: #242c43; color: #242c43;
...@@ -1058,14 +1061,14 @@ border-radius:8px; ...@@ -1058,14 +1061,14 @@ border-radius:8px;
text-align: right; text-align: right;
} }
.filter_action>.el-button { .filter_action > .el-button {
/* min-width: 90px; */ /* min-width: 90px; */
height: 36px; height: 36px;
margin-top: 16px; margin-top: 16px;
padding: 12px 17px; padding: 12px 17px;
} }
.filter_action>.el-button+.el-button { .filter_action > .el-button + .el-button {
margin-left: 10px; margin-left: 10px;
} }
...@@ -1104,7 +1107,7 @@ border-radius:8px; ...@@ -1104,7 +1107,7 @@ border-radius:8px;
margin-top: 5px; margin-top: 5px;
} }
.meassage_detail_dialog .detail_item .full_content>.apaas_scroll { .meassage_detail_dialog .detail_item .full_content > .apaas_scroll {
height: 176px; height: 176px;
overflow: auto; overflow: auto;
} }
...@@ -1279,11 +1282,11 @@ border-radius:8px; ...@@ -1279,11 +1282,11 @@ border-radius:8px;
.el-date-table td.in-range div:hover, .el-date-table td.in-range div:hover,
.el-date-table.is-week-mode .el-date-table__row.current div, .el-date-table.is-week-mode .el-date-table__row.current div,
.el-date-table.is-week-mode .el-date-table__row:hover div { .el-date-table.is-week-mode .el-date-table__row:hover div {
background-color: #eff2fa!important; background-color: #eff2fa !important;
} }
.el-date-table td.end-date .el-date-table-cell__text, .el-date-table td.end-date .el-date-table-cell__text,
.el-date-table td.start-date .el-date-table-cell__text { .el-date-table td.start-date .el-date-table-cell__text {
background-color: #3759be!important; background-color: #3759be !important;
} }
.el-date-table td.end-date span, .el-date-table td.end-date span,
.el-date-table td.start-date span { .el-date-table td.start-date span {
...@@ -1463,8 +1466,6 @@ border-radius:8px; ...@@ -1463,8 +1466,6 @@ border-radius:8px;
padding-right: 10px; padding-right: 10px;
} }
.page_container { .page_container {
width: 100%; width: 100%;
padding: 0 24px; padding: 0 24px;
...@@ -1478,8 +1479,7 @@ border-radius:8px; ...@@ -1478,8 +1479,7 @@ border-radius:8px;
.page_content { .page_content {
background-color: #fff; background-color: #fff;
height: calc(100% - 46px - 20px); height: calc(100% - 46px - 20px);
box-shadow: 0px 1px 4px 0px box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.15);
rgba(0, 7, 101, 0.15);
border-radius: 6px; border-radius: 6px;
} }
...@@ -1496,7 +1496,6 @@ border-radius:8px; ...@@ -1496,7 +1496,6 @@ border-radius:8px;
overflow: hidden; overflow: hidden;
} }
.flex_right { .flex_right {
height: calc(100% - 16px); height: calc(100% - 16px);
flex: 1; flex: 1;
...@@ -1504,11 +1503,9 @@ border-radius:8px; ...@@ -1504,11 +1503,9 @@ border-radius:8px;
} }
.bgc_white { .bgc_white {
box-shadow: 0px 1px 4px 0px box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.15);
rgba(0, 7, 101, 0.15);
border-radius: 6px; border-radius: 6px;
background-color: #fff; background-color: #fff;
} }
.tree::-webkit-scrollbar { .tree::-webkit-scrollbar {
...@@ -1576,3 +1573,36 @@ border-radius:8px; ...@@ -1576,3 +1573,36 @@ border-radius:8px;
color: #d75138; color: #d75138;
} }
.register_btn {
display: flex;
align-items: center;
background-color: #eff2fa;
border-radius: 4px;
border: solid 1px #b0bee8;
color: #3759be;
}
.register_btn .icon-arrow-right {
margin-left: 39px;
}
.forget_psd {
font-size: 14px;
color: #3759be;
cursor: pointer;
}
.select-empty {
color: #616f94;
text-align: center;
padding: 20px;
}
.tip-image {
position: absolute;
right: -24px;
bottom: 9px;
width: 16px;
height: 16px;
margin-left: 8px;
background-image: url("../imgs/ic_tips.png");
background-size: contain;
}
<template>
<div class="gap-title">
<span>{{ title }}</span>
</div>
</template>
<script setup>
const props = defineProps({
title: {
type: [Number, String],
default: "",
},
});
</script>
<style scoped>
.gap-title {
font-size: 18px;
font-weight: 600;
color: #1a1a1a;
display: flex;
align-items: center;
margin-bottom: 20px;
}
.gap-title span {
margin-right: 8px;
}
.gap-title::before {
content: "";
display: inline-block;
margin-right: 8px;
width: 4px;
height: 14px;
background-color: #3759be;
border-radius: 2px;
}
/* .gap-title::after {
content: "";
display: inline-block;
flex: 1;
border-top: 1px dashed #dadee7;
} */
</style>
...@@ -50,9 +50,17 @@ ...@@ -50,9 +50,17 @@
</template> </template>
<script setup> <script setup>
import { watch, ref } from "vue"; import { watch, ref, nextTick } from "vue";
import { selectTableMixin } from "./hook/mixin-select-table"; import { selectTableMixin } from "./hook/mixin-select-table";
let { nowSelectData, allSelectData, selectData, initSelectTableData, runPage, dealSelectData } = selectTableMixin(); const {
nowSelectData,
allSelectData,
initAllSelectData,
selectData,
initSelectTableData,
runPage,
dealSelectData,
} = selectTableMixin();
const props = defineProps({ const props = defineProps({
height: { height: {
...@@ -71,9 +79,6 @@ const props = defineProps({ ...@@ -71,9 +79,6 @@ const props = defineProps({
type: Boolean, type: Boolean,
default: false, default: false,
}, },
// selectable: {
// type: Function,
// },
isIndex: { isIndex: {
type: Boolean, type: Boolean,
default: false, default: false,
...@@ -95,18 +100,34 @@ const props = defineProps({ ...@@ -95,18 +100,34 @@ const props = defineProps({
default: false, default: false,
}, // 多选框是否禁用 }, // 多选框是否禁用
canEditFlag: { canEditFlag: {
typr: Boolean, type: String,
default: "", default: "",
}, // 决定多选框是否禁用的字段 }, // 决定多选框是否禁用的字段
indexWidth: { indexWidth: {
type: Number, type: Number,
default: 54, default: 54,
}, },
//初始表格选中数据
originSelectedData: {
type: Array,
default: () => [],
},
}); });
const table = ref(null); const table = ref(null);
const emit = defineEmits(["selectAc", "select"]); const emit = defineEmits(["selectAc", "select"]);
watch(
() => props.originSelectedData,
(val) => {
if (val.length) {
initAllSelectData(props.originSelectedData);
}
},
{
immediate: true,
}
);
watch( watch(
() => props.rows, () => props.rows,
(n, o) => { (n, o) => {
...@@ -120,6 +141,9 @@ watch( ...@@ -120,6 +141,9 @@ watch(
} }
}); });
} }
},
{
immediate: true,
} }
); );
...@@ -127,14 +151,19 @@ const toggleRowSelection = (row, flag = true) => { ...@@ -127,14 +151,19 @@ const toggleRowSelection = (row, flag = true) => {
table.value.toggleRowSelection(row, flag); table.value.toggleRowSelection(row, flag);
}; };
const selectAction = (selection) => { const selectAction = (selection) => {
emit("selectAc", { allLength: Object.keys(allSelectData).length + nowSelectData.length, selection }); nextTick(() => {
emit("selectAc", {
allLength: Object.keys(allSelectData.value).length + nowSelectData.value.length,
selection,
});
});
}; };
const clearSelection = () => { const clearSelection = () => {
table.value.clearSelection(); table.value.clearSelection();
emit("select", { allLength: Object.keys(allSelectData).length + nowSelectData.length, selection: [] }); emit("select", {
}; allLength: Object.keys(allSelectData.value).length + nowSelectData.value.length,
const setSelectedRow = (row) => { selection: [],
toggleRowSelection(row); });
}; };
const toggleRowArrSelection = (arr, flag = true) => { const toggleRowArrSelection = (arr, flag = true) => {
arr.forEach((e) => { arr.forEach((e) => {
...@@ -143,16 +172,22 @@ const toggleRowArrSelection = (arr, flag = true) => { ...@@ -143,16 +172,22 @@ const toggleRowArrSelection = (arr, flag = true) => {
}; };
const selectActionRow = (selection, row) => { const selectActionRow = (selection, row) => {
selectData(selection); selectData(selection);
emit("select", { allLength: Object.keys(allSelectData).length + nowSelectData.length, selection }); emit("select", {
allLength: Object.keys(allSelectData.value).length + nowSelectData.value.length,
selection,
});
}; };
const selectActionAll = (selection) => { const selectActionAll = (selection) => {
selectData(selection); selectData(selection);
emit("select", { allLength: Object.keys(allSelectData).length + nowSelectData.length, selection }); emit("select", {
allLength: Object.keys(allSelectData.value).length + nowSelectData.value.length,
selection,
});
}; };
const clearTable = () => { const clearTable = () => {
//清除选中数据,在页面状态更新时使用 //清除选中数据,在页面状态更新时使用
allSelectData = {}; allSelectData.value = {};
nowSelectData = []; nowSelectData.value = [];
clearSelection(); clearSelection();
}; };
const tableRowClassName = ({ row, rowIndex }) => { const tableRowClassName = ({ row, rowIndex }) => {
...@@ -176,5 +211,6 @@ const selectable = (row, index) => { ...@@ -176,5 +211,6 @@ const selectable = (row, index) => {
defineExpose({ defineExpose({
clearTable, clearTable,
toggleRowSelection, toggleRowSelection,
dealSelectData,
}); });
</script> </script>
...@@ -11,9 +11,7 @@ ...@@ -11,9 +11,7 @@
@click="changeActiveName(item, index)"> @click="changeActiveName(item, index)">
{{ item.label }} {{ item.label }}
</li> </li>
<li>
<!-- empty -->
</li>
</ul> </ul>
</div> </div>
<div class="bg-tabs-content"> <div class="bg-tabs-content">
......
import { reactive, toRefs,useAttrs } from 'vue' import { reactive, toRefs, useAttrs } from "vue";
export function selectTableMixin(){ export function selectTableMixin() {
const state = reactive({ const state = reactive({
nowSelectData:[], nowSelectData: [],
allSelectData:{} allSelectData: {},
}) });
const attrs = useAttrs()
// const nowSelectData = reactive([])
// const allSelectData = reactive({})
const selectData = (val)=>{ const attrs = useAttrs();
console.log(val); // const nowSelectData = reactive([])
state.nowSelectData = val // const allSelectData = reactive({})
console.log('allSelectData');
console.log(state.allSelectData);
console.log(Object.keys(state.allSelectData).length);
}
const initSelectTableData = (data)=>{ const selectData = (val) => {
return new Promise((reslove,reject)=>{ state.nowSelectData = val;
data.forEach(e => { };
if(state.allSelectData[e[attrs.rowKey||'id']]){ //当某些表格有原始的选中数据时,初始化allSelectData
delete state.allSelectData[e[attrs.rowKey||'id']] const initAllSelectData = (list) => {
state.nowSelectData.push(e) list.forEach((e) => {
state.allSelectData[e[attrs.rowKey || "id"]] = e;
});
};
const initSelectTableData = (data) => {
return new Promise((reslove, reject) => {
data.forEach((e) => {
if (state.allSelectData[e[attrs.rowKey || "id"]]) {
delete state.allSelectData[e[attrs.rowKey || "id"]];
state.nowSelectData.push(e);
} }
}); });
reslove(state.nowSelectData);
});
};
console.log(state.nowSelectData); const runPage = () => {
reslove(state.nowSelectData) //翻页数据推进
}) state.nowSelectData.forEach((e) => {
} state.allSelectData[e[attrs.rowKey || "id"]] = e;
const runPage=()=>{//翻页数据推进
state.nowSelectData.forEach(e => {
state.allSelectData[e[attrs.rowKey||'id']] = e
}); });
state.nowSelectData = [] state.nowSelectData = [];
} };
const clearTable=()=>{//清除选中数据,在页面状态更新时使用 // const clearTable = () => {
state.allSelectData={} // //清除选中数据,在页面状态更新时使用
state.nowSelectData=[] // state.allSelectData = {};
clearSelection(); // state.nowSelectData = [];
} // clearSelection();
// };
const dealSelectData=()=>{//最后提交处理数据 const dealSelectData = () => {
state.nowSelectData.forEach(e => { //最后提交处理数据
state.allSelectData[e[attrs.rowKey||'id']] = e const submitData = { ...state.allSelectData };
state.nowSelectData.forEach((e) => {
submitData[e[attrs.rowKey || "id"]] = e;
}); });
return state.allSelectData return submitData;
} };
const { nowSelectData, allSelectData } = toRefs(state) const { nowSelectData, allSelectData } = toRefs(state);
return{ return {
nowSelectData, nowSelectData,
allSelectData, allSelectData,
initAllSelectData,
selectData, selectData,
initSelectTableData, initSelectTableData,
runPage, runPage,
clearTable, // clearTable,
dealSelectData dealSelectData,
} };
} }
// export const selectTableMixin = { // export const selectTableMixin = {
......
/** /**
* 全局组件 * 全局组件
*/ */
import BgIcon from './bg-icon.vue' import BgIcon from "./bg-icon.vue";
import BgNav from './bg-nav.vue' import BgNav from "./bg-nav.vue";
import BgList from './bg-list.vue' import BgList from "./bg-list.vue";
import BgDetail from './bg-detail.vue' import BgDetail from "./bg-detail.vue";
import BgFiltrate from './bg-filtrate.vue' import BgFiltrate from "./bg-filtrate.vue";
import BgTable from './bg-table.vue' import BgTable from "./bg-table.vue";
import BgTablePro from './bg-table-pro.vue' import BgTablePro from "./bg-table-pro.vue";
import BgTableBtn from './bg-table-btn.vue' import BgTableBtn from "./bg-table-btn.vue";
import BgTabs from './bg-tabs.vue' import BgTabs from "./bg-tabs.vue";
import BgTab from './bg-tab.vue' import BgTab from "./bg-tab.vue";
import BgLayoutCard from './bg-layout-card.vue' import BgLayoutCard from "./bg-layout-card.vue";
import BgCard from './bg-card.vue' import BgCard from "./bg-card.vue";
import BgInfo from './bg-info.vue' import BgInfo from "./bg-info.vue";
import BgBtns from './bg-btns.vue' import BgBtns from "./bg-btns.vue";
import BgUpload from './bg-upload.vue' import BgUpload from "./bg-upload.vue";
import BgUploadImage from './bg-upload-image.vue' import BgUploadImage from "./bg-upload-image.vue";
import BgTags from './bg-tags.vue' import BgTags from "./bg-tags.vue";
import BgSwitch from './bg-switch.vue' import BgSwitch from "./bg-switch.vue";
import BgRichText from './bg-rich-text.vue' import BgRichText from "./bg-rich-text.vue";
import BgCodeEditor from './bg-code-editor.vue' import BgCodeEditor from "./bg-code-editor.vue";
import BgFilter from './bg-filter.vue' import BgFilter from "./bg-filter.vue";
import BgSort from './bg-sort.vue' import BgSort from "./bg-sort.vue";
import BgFilterDate from './bg-filter-date.vue' import BgFilterDate from "./bg-filter-date.vue";
import bgUserUploadImage from './bg-user-upload-image.vue' import bgUserUploadImage from "./bg-user-upload-image.vue";
import bgDetailTable from './bg-detail-table.vue' import bgDetailTable from "./bg-detail-table.vue";
import bgDetailTable2 from './bg-detail-table2.vue' import bgDetailTable2 from "./bg-detail-table2.vue";
import debounce from './debounce' import debounce from "./debounce";
import BgPagination from './bg-pagination.vue' import BgPagination from "./bg-pagination.vue";
import BgInnerTabs from './bg-inner-tabs.vue' import BgInnerTabs from "./bg-inner-tabs.vue";
import BgFilterGroup from './bg-filter-group.vue' import BgFilterGroup from "./bg-filter-group.vue";
import BgSwitchEle from './bg-switch-ele.vue' import BgSwitchEle from "./bg-switch-ele.vue";
import BgTableBtns from './bg-table-btns.vue' import BgTableBtns from "./bg-table-btns.vue";
import BgTableBtns2 from './bg-table-btns2.vue' import BgTableBtns2 from "./bg-table-btns2.vue";
import BgPermission from './bg-permission.vue' import BgPermission from "./bg-permission.vue";
import BgFormGap from "./bg-form-gap.vue";
const components = { const components = {
BgIcon,//字体图标 BgIcon, //字体图标
BgNav, // 左侧导航 BgNav, // 左侧导航
BgList, // 列表页布局 BgList, // 列表页布局
BgDetail, // 详情页布局 BgDetail, // 详情页布局
...@@ -56,21 +57,22 @@ const components = { ...@@ -56,21 +57,22 @@ const components = {
BgTags, // 标签 BgTags, // 标签
BgSwitch, // 开关 BgSwitch, // 开关
BgRichText, // 富文本 BgRichText, // 富文本
BgCodeEditor,//代码输入 BgCodeEditor, //代码输入
BgFilter, // 首页筛选 BgFilter, // 首页筛选
BgSort, // 首页排序 BgSort, // 首页排序
BgFilterDate, BgFilterDate,
bgUserUploadImage, bgUserUploadImage,
bgDetailTable,//详情展示组件1 bgDetailTable, //详情展示组件1
bgDetailTable2,//详情展示组件2 bgDetailTable2, //详情展示组件2
debounce,//防抖组件 debounce, //防抖组件
BgPagination,// 分页组件 BgPagination, // 分页组件
BgInnerTabs,//内部tab BgInnerTabs, //内部tab
BgFilterGroup,//高级搜索 BgFilterGroup, //高级搜索
BgSwitchEle,// 基于element-plus封装的switch BgSwitchEle, // 基于element-plus封装的switch
BgTableBtns,// 表格按钮组 BgTableBtns, // 表格按钮组
BgPermission,// 菜单选择 BgPermission, // 菜单选择
BgTableBtns2, // 表格按钮组-新 BgTableBtns2, // 表格按钮组-新
BgFormGap,
}; };
const install = (Vue) => { const install = (Vue) => {
......
...@@ -840,7 +840,7 @@ a { ...@@ -840,7 +840,7 @@ a {
.bg-tabs { .bg-tabs {
background-color: #ffffff; background-color: #ffffff;
box-shadow: 0px 6px 12px 0px rgba(0, 20, 53, 0.3); box-shadow: 0px 4px 16px 0px rgba(18, 30, 0.03, 0.08);
border-radius: 12px; border-radius: 12px;
overflow: hidden; overflow: hidden;
...@@ -865,9 +865,10 @@ a { ...@@ -865,9 +865,10 @@ a {
align-items: center; align-items: center;
padding: 8px; padding: 8px;
border-bottom: 1px solid #e6e9ef; border-bottom: 1px solid #e6e9ef;
font-size: 16px; font-size: 20px;
line-height: 25px; line-height: 25px;
color: #404a62; color: #616f94;
background: #f7f7f9;
cursor: pointer; cursor: pointer;
&.current { &.current {
...@@ -877,18 +878,19 @@ a { ...@@ -877,18 +878,19 @@ a {
border-right: 1px solid #e6e9ef; border-right: 1px solid #e6e9ef;
border-bottom: 1px solid #fff; border-bottom: 1px solid #fff;
border-left: 1px solid #e6e9ef; border-left: 1px solid #e6e9ef;
color: #e56600; color: #3759be;
background-color: #fff;
overflow: hidden; overflow: hidden;
&::before { // &::before {
content: ""; // content: "";
position: absolute; // position: absolute;
top: 0; // top: 0;
left: 0; // left: 0;
width: 100%; // width: 100%;
height: 4px; // height: 4px;
background-color: #e56600; // background-color: #e56600;
} // }
} }
&:first-child { &:first-child {
......
This diff is collapsed.
<template> <template>
<div class="login-by-account"> <div class="login-by-account">
<el-form <el-form ref="loginFormRef" label-position="top" :model="loginForm" :rules="steploginFormRules">
ref="loginForm" <el-form-item prop="userid">
label-position="top" <el-input v-model="loginForm.userid" placeholder="请输入账号" @keyup.enter.native="loginAction()" />
:model="loginForm"
:rules="steploginFormRules"
>
<el-form-item label="账号" prop="userid">
<el-input
v-model="loginForm.userid"
autofocus="autofocus"
placeholder="请输入账号"
@keyup.enter.native="loginAction()"
/>
</el-form-item> </el-form-item>
<el-form-item label="密码" prop="password"> <el-form-item prop="password">
<el-input <el-input
:type="hidePassword ? 'password' : 'text'" :type="hidePassword ? 'password' : 'text'"
v-model="loginForm.password" v-model="loginForm.password"
placeholder="请输入密码" placeholder="请输入密码"
@keyup.enter.native="loginAction()" @keyup.enter.native="loginAction()">
>
<span <span
slot="suffix" slot="suffix"
:title="hidePassword ? '显示密码' : '隐藏密码'" :title="hidePassword ? '显示密码' : '隐藏密码'"
:class="hidePassword ? 'hide-password' : 'show-password'" :class="hidePassword ? 'hide-password' : 'show-password'"
@click="hidePassword = !hidePassword" @click="hidePassword = !hidePassword"
style="cursor: pointer" style="cursor: pointer"></span>
></span>
</el-input> </el-input>
</el-form-item> </el-form-item>
<el-form-item label="验证码" prop="yzm"> <el-form-item prop="yzm">
<div class="msg-code"> <div class="msg-code">
<el-input <el-input
v-model="loginForm.yzm" v-model="loginForm.yzm"
placeholder="请输入验证码" placeholder="请输入验证码"
@keyup.enter.native="loginAction()" @keyup.enter.native="loginAction()"
/> style="width: 240px" />
<img <div class="yzm_img">
class="yzm_img" <img title="看不清?换一张" :src="imgSrc" @click="getImg()" style="width: 100%" />
title="看不清?换一张" </div>
:src="imgSrc"
@click="getImg()"
/>
</div> </div>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-checkbox v-model="rememberPassword">记住密码</el-checkbox> <el-button type="primary" @click="loginAction()" style="width: 100%"> 登录 </el-button>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="loginAction()" style="width: 100%"> <el-button class="register_btn" @click.prevent="$emit('register')" style="width: 100%">
登 录 还没有账号?前往注册
<bg-icon class="icon-arrow-right" icon="#bg-ic-arrow-right"></bg-icon>
</el-button> </el-button>
</el-form-item> </el-form-item>
<div class="regist_bottom">
<el-checkbox v-model="rememberPassword">记住密码</el-checkbox>
<span class="fr forget_psd" @click.prevent="$emit('password')">忘记密码?</span>
</div>
</el-form> </el-form>
</div> </div>
</template> </template>
<script> <script setup>
import CryptoJS from "crypto-js"; import CryptoJS from "crypto-js";
import { getCookie, clearCookie, setCookie } from "@/services/cookie.js"; import { getCookie, clearCookie, setCookie } from "@/services/cookie.js";
import menu from "../router/function"; import menu from "../router/function";
import { generateRoutes } from "../router/index"; import { generateRoutes } from "../router/index";
import { reactive, toRefs, ref, onBeforeMount, nextTick } from "vue";
import { ElMessage } from "element-plus";
import axios from "@/request/http.js";
import { Encrypt } from "@/services/secret.js";
import { useStore } from "vuex";
export default { const state = reactive({
name: "LoginByAccount", // 账号密码登录
data() {
return {
loginForm: { loginForm: {
userid: "", userid: "",
password: "", password: "",
...@@ -82,82 +74,73 @@ export default { ...@@ -82,82 +74,73 @@ export default {
identifyCode: "", identifyCode: "",
hidePassword: true, hidePassword: true,
rememberPassword: false, rememberPassword: false,
}; });
},
methods: { const store = useStore();
loginAction() {
if (this.rememberPassword) { const loginFormRef = ref(null);
let userinfo = window.btoa(
encodeURI(`${this.loginForm.userid},${this.loginForm.password}`) const loginAction = () => {
); if (state.rememberPassword) {
let userinfo = window.btoa(encodeURI(`${state.loginForm.userid},${state.loginForm.password}`));
setCookie("userinfo", userinfo); setCookie("userinfo", userinfo);
} else { } else {
clearCookie("userinfo"); clearCookie("userinfo");
} }
this.$refs.loginForm.validate((valid) => { loginFormRef.value.validate((valid) => {
if (valid) { if (valid) {
this.$axios axios.get(`/apaas/system/v5/user/verifyCaptcha?id=${state.imgId}&value=${state.loginForm.yzm}`).then((res) => {
.get(
`/apaas/system/v5/user/verifyCaptcha?id=${this.imgId}&value=${this.loginForm.yzm}`
)
.then((res) => {
if (res.data.code == 200) { if (res.data.code == 200) {
this.login(); login();
} else { } else {
this.$message.error(res.data.data); ElMessage.error(res.data.data);
} }
}); });
} }
}); });
}, };
login() { const login = () => {
this.$axios axios
.post(`/apaas/system/v5/user/login`, { .post(`/apaas/system/v5/user/login`, {
system_account: this.loginForm.userid, system_account: state.loginForm.userid,
password: CryptoJS.AES.encrypt( password: Encrypt(state.loginForm.password),
this.loginForm.password,
"swuE9cmCZQwrkYRV"
).toString(),
}) })
.then(({ data }) => { .then(({ data }) => {
if (data.code == 200) { if (data.code == 200) {
this.getUser(); getUser();
} else { } else {
this.getImg(true); getImg(true);
this.$message({ ElMessage.error(data.data);
message: data.data,
type: "error",
});
} }
}) })
.catch((error) => { .catch((error) => {
console.log(error); console.log(error);
}); });
}, };
getUserInfo() { const getUserInfo = () => {
return this.$axios.get(`/apaas/system/v5/user/getUserInfo`); return axios.get(`/apaas/system/v5/user/getUserInfo`);
}, };
getMenu(search) { const getMenu = (search) => {
return this.$axios.get(`/apaas/system/v5/menu/user/tree?search=${search}`); return axios.get(`/apaas/system/v5/menu/user/tree?search=${search}`);
}, };
getUser() { const getUser = () => {
Promise.all([this.getUserInfo(), this.getMenu('dadb2d3f-e263-48d1-9389-42acb9ea49f8')]).then((res) => { Promise.all([getUserInfo(), getMenu("dadb2d3f-e263-48d1-9389-42acb9ea49f8")]).then((res) => {
if (res[0].data.code == 200 && res[1].data.code == 200) { if (res[0].data.code == 200 && res[1].data.code == 200) {
let data = res[1].data.data&&res[1].data.data[0].children || []; let data = (res[1].data.data && res[1].data.data[0].children) || [];
this.$store.commit("setUserInfo", res[0].data.data); store.commit("setUserInfo", res[0].data.data);
// if (res.data.data.userType == 1) { // if (res.data.data.userType == 1) {
//超管 //超管
this.$store.commit("setMenu", data); store.commit("setMenu", data);
menu.menuToRouter(data); menu.menuToRouter(data);
this.$store.commit("setRoute", data); store.commit("setRoute", data);
//存储菜单对象信息 //存储菜单对象信息
let menuObj = {}; let menuObj = {};
this.getMenuObj(data, "", menuObj); getMenuObj(data, "", menuObj);
this.$store.commit("setMenuObj", menuObj); store.commit("setMenuObj", menuObj);
// } // }
generateRoutes(); generateRoutes();
// this.$router.push("/"); // this.$router.push("/");
...@@ -165,56 +148,71 @@ export default { ...@@ -165,56 +148,71 @@ export default {
window.location.href = "/apaas/portal/ui/#/"; window.location.href = "/apaas/portal/ui/#/";
} }
}); });
}, };
getMenuObj(menu, parentRowPath, menuObj) { const getMenuObj = (menu, parentRowPath, menuObj) => {
menu.forEach((e, idx) => { menu.forEach((e, idx) => {
e.rowPath = parentRowPath + "." + idx; e.rowPath = parentRowPath + "." + idx;
menuObj[e.path] = e; menuObj[e.path] = e;
if (e.children && e.children.length) { if (e.children && e.children.length) {
this.getMenuObj(e.children, e.rowPath, menuObj); getMenuObj(e.children, e.rowPath, menuObj);
} }
}); });
}, };
getImg(clearInput = false) { const getImg = (clearInput = false) => {
this.$axios axios.get(`/apaas/system/v5/user/getCaptcha??width=138&height=36`).then((res) => {
.get(`/apaas/system/v5/user/getCaptcha??width=240&height=32`)
.then((res) => {
if (res.data.code == 200) { if (res.data.code == 200) {
this.imgId = res.data.data.id; state.imgId = res.data.data.id;
this.imgSrc = res.data.data.captcha; state.imgSrc = res.data.data.captcha;
} }
}); });
if (clearInput) { if (clearInput) {
this.loginForm.yzm = ""; state.loginForm.yzm = "";
} }
}, };
}, onBeforeMount(() => {
created() { getImg();
this.getImg();
if (getCookie("userinfo")) { if (getCookie("userinfo")) {
let userinfo = window.atob(decodeURI(getCookie("userinfo"))).split(","); let userinfo = window.atob(decodeURI(getCookie("userinfo"))).split(",");
this.loginForm.userid = userinfo[0]; state.loginForm.userid = userinfo[0];
this.loginForm.password = userinfo[1]; state.loginForm.password = userinfo[1];
this.checked = true; state.checked = true;
this.rememberPassword = true; state.rememberPassword = true;
} else { } else {
this.checked = false; state.checked = false;
} }
}, });
}; const { loginForm, steploginFormRules, imgId, imgSrc, identifyCode, hidePassword, rememberPassword } = toRefs(state);
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.msg-code { .login-by-account {
.msg-code {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
.yzm_img {
margin: 4px 0 0 16px;
flex: 1;
}
> .bg-identify { > .bg-identify {
margin-left: 6px; margin-left: 6px;
flex-shrink: 0; flex-shrink: 0;
} }
}
:deep() .el-input__wrapper {
background-color: #f7f8f9;
}
.regist_bottom {
line-height: 1;
display: flex;
align-items: center;
justify-content: space-between;
:deep(.el-checkbox) {
height: auto;
}
}
} }
</style> </style>
<template> <template>
<div class="login-by-code"> <div class="login-by-code">
<el-form ref="loginForm" :model="loginForm" :rules="loginFormRules"> <el-form ref="loginFormRef" :model="loginForm" :rules="loginFormRules">
<el-form-item prop="mobile"> <el-form-item prop="mobile">
<template name="label">
<div class="form-title">
<span>
手机号码
</span>
<el-tooltip class="item" effect="dark" placement="top">
<template slot="content">
个人用户及企业(主账号)<br />可通过短信验证码登录
</template>
<img src="@/assets/imgs/ic_tips.png" />
</el-tooltip>
</div>
</template>
<el-input <el-input
v-model="loginForm.mobile" v-model="loginForm.mobile"
autofocus="autofocus" autofocus="autofocus"
placeholder="请输入手机号码" placeholder="请输入手机号码"
@keyup.enter.native="loginAction()" @keyup.enter.native="loginAction()" />
/>
</el-form-item> </el-form-item>
<el-form-item label="验证码" prop="code"> <el-form-item prop="code">
<div class="msg-code">
<el-input <el-input
v-model="loginForm.code" v-model="loginForm.code"
placeholder="请输入验证码" placeholder="请输入验证码"
@keyup.enter.native="loginAction()" @keyup.enter.native="loginAction()"
> style="width: 280px">
<template slot="append"> </el-input>
<a class="input-append disabled" v-if="countDown > 0"> <div class="yzm_img">
<el-button
type="primary"
:disabled="countDown > 0"
@click.prevent="getMsgCode()"
style="width: 100%; height: 34px">
{{ countDown > 0 ? countDown + "秒后再次获取" : "发送验证码" }}
</el-button>
<!-- <a class="input-append disabled" v-if="false && countDown > 0">
{{ countDown }}秒后再次获取 {{ countDown }}秒后再次获取
</a> </a>
<a class="input-append" @click="getMsgCode" v-else> <a class="input-append" @click="getMsgCode" v-else>
获取验证码 获取验证码
</a> </a> -->
</template> </div>
</el-input> </div>
</el-form-item> </el-form-item>
<el-form-item style="margin-top: 54px;"> <el-form-item>
<el-button type="primary" @click.prevent="loginAction()"> <el-button type="primary" @click.prevent="loginAction()" style="width: 100%"> 登 录 </el-button>
登 录
</el-button>
</el-form-item> </el-form-item>
<el-form-item style="margin-top: 24px;"> <el-form-item>
<el-button @click.prevent="$emit('register')"> <el-button class="register_btn" @click.prevent="$emit('register')" style="width: 100%">
还没有账户?立即注册&emsp;<i class="el-icon-arrow-right"></i> 还没有账号?前往注册
<bg-icon icon="#bg-ic-arrow-right"></bg-icon>
</el-button> </el-button>
</el-form-item> </el-form-item>
<div>
<span class="fr forget_psd" @click.prevent="$emit('password')">忘记密码?</span>
</div>
</el-form> </el-form>
</div> </div>
</template> </template>
<script setup>
import { reactive, toRefs, ref, onBeforeMount, nextTick } from "vue";
import { ElMessage } from "element-plus";
import axios from "@/request/http.js";
<script> const validatePhone = (rule, value, callback) => {
export default {
name: "LoginByCode", // 短信验证码登录
data() {
const validatePhone = (rule, value, callback) => {
const reg = /^(?:(?:\+|00)86)?1[3-9]\d{9}$/; const reg = /^(?:(?:\+|00)86)?1[3-9]\d{9}$/;
setTimeout(() => { setTimeout(() => {
...@@ -67,76 +64,67 @@ ...@@ -67,76 +64,67 @@
callback(); callback();
} }
}); });
}; };
return { const state = reactive({
loginForm: { loginForm: {
mobile: "", mobile: "",
code: "", code: "",
}, },
loginFormRules: { loginFormRules: {
mobile: [ mobile: [
{ required: true, message: "请输入手机号码", trigger: "change" }, { required: true, message: "请输入手机号码", trigger: "blur" },
{ validator: validatePhone, trigger: "blur" }, { validator: validatePhone, trigger: "blur" },
], ],
code: [{ required: true, message: "请输入验证码", trigger: "blur" }], code: [{ required: true, message: "请输入验证码", trigger: "blur" }],
}, },
countDown: 0, countDown: 0,
countDownTimer: null, countDownTimer: null,
}; });
},
methods: { const loginFormRef = ref(null);
getMsgCode() {
this.$refs.loginForm.validateField("mobile", (errMsg) => { const getMsgCode = () => {
if (!errMsg) { loginFormRef.value.validateField("mobile", (valid) => {
this.$api.general.getCode(this.loginForm.mobile).then(({ data }) => { if (valid) {
if (data.success == 1) { axios.post("/apaas/system/v5/sms/verifyCode", { phone: state.loginForm.mobile }).then(({ data }) => {
this.countDownAction(); if (data.code == 200) {
countDownAction();
} else {
ElMessage.error(data.data);
} }
}); });
} }
}); });
}, // 获取验证码 }; // 获取验证码
countDownAction() { const countDownAction = () => {
this.countDown = 60; state.countDown = 60;
if (this.countDownTimer) { if (state.countDownTimer) {
clearInterval(this.countDownTimer); clearInterval(state.countDownTimer);
} }
this.countDownTimer = setInterval(() => { state.countDownTimer = setInterval(() => {
if (this.countDown > 0) { if (state.countDown > 0) {
this.countDown--; state.countDown--;
} else { } else {
clearInterval(this.countDownTimer); clearInterval(state.countDownTimer);
} }
}, 1000); }, 1000);
}, };
loginAction() { const loginAction = () => {
this.$refs.loginForm.validate((valid) => { loginFormRef.value.validate((valid) => {
if (valid) { if (valid) {
this.$api.general axios
.loginByCode(this.loginForm) .post(`/apaas/system/v5/user/phone/login`, {
phone: state.loginForm.mobile,
code: state.loginForm.code,
})
.then(({ data }) => { .then(({ data }) => {
if (data.success == 1) { if (data.code == 200) {
let redirect = "/apaas/ui/#/index"; getUser();
// GIS重定向使用
if (this.$route.query.ReturnUrl) {
redirect = this.$route.query.ReturnUrl;
}
// 前端重定向使用
else if (this.$route.query.redirect) {
redirect = `/apaas/ui/#${this.$route.query.redirect}`;
}
window.location.href = redirect;
} else { } else {
this.$message({ ElMessage.error(data.data);
message: data.errMsg || data.data || "登陆失败",
type: "error",
});
} }
}) })
.catch((error) => { .catch((error) => {
...@@ -144,13 +132,55 @@ ...@@ -144,13 +132,55 @@
}); });
} }
}); });
}, // 短信验证码登录 }; // 短信验证码登录
},
}; const getUserInfo = () => {
</script> return axios.get(`/apaas/system/v5/user/getUserInfo`);
};
const getMenu = (search) => {
return axios.get(`/apaas/system/v5/menu/user/tree?search=${search}`);
};
const getUser = () => {
Promise.all([getUserInfo(), getMenu("dadb2d3f-e263-48d1-9389-42acb9ea49f8")]).then((res) => {
if (res[0].data.code == 200 && res[1].data.code == 200) {
let data = (res[1].data.data && res[1].data.data[0].children) || [];
store.commit("setUserInfo", res[0].data.data);
// if (res.data.data.userType == 1) {
//超管
store.commit("setMenu", data);
menu.menuToRouter(data);
<style lang="less" scoped> store.commit("setRoute", data);
.login-by-code {
//存储菜单对象信息
let menuObj = {};
getMenuObj(data, "", menuObj);
store.commit("setMenuObj", menuObj);
// }
generateRoutes();
// this.$router.push("/");
//跳转到工作台页面
window.location.href = "/apaas/portal/ui/#/";
}
});
};
const { loginForm, loginFormRules, countDown, countDownTimer } = toRefs(state);
</script>
<style lang="scss" scoped>
.login-by-code {
.msg-code {
display: flex;
justify-content: space-between;
align-items: center;
width: 100%;
.yzm_img {
flex: 1;
margin-left: 20px;
}
}
.el-form { .el-form {
.form-title { .form-title {
display: flex; display: flex;
...@@ -164,6 +194,5 @@ ...@@ -164,6 +194,5 @@
} }
} }
} }
} }
</style> </style>
\ No newline at end of file
import {createI18n} from 'vue-i18n' import {createI18n} from 'vue-i18n/index'
import lang from './index' import lang from './index'
const i18n = createI18n({ const i18n = createI18n({
......
import { createApp } from 'vue' import { createApp } from "vue";
import ElementPlus from 'element-plus' import ElementPlus from "element-plus";
import 'element-plus/dist/index.css' import "element-plus/dist/index.css";
import locale from 'element-plus/lib/locale/lang/zh-cn' import locale from "element-plus/lib/locale/lang/zh-cn";
import * as ElementPlusIconsVue from '@element-plus/icons-vue' import * as ElementPlusIconsVue from "@element-plus/icons-vue";
import bgui from "@/bg-ui"; import bgui from "@/bg-ui";
import "@/bg-ui/index.scss"; import "@/bg-ui/index.scss";
import msgSdk from './msg-sdk/index.js'; import msgSdk from "./msg-sdk/index.js";
import App from './App.vue' import App from "./App.vue";
import router from './router' import router from "./router";
import {generateRoutes} from './router/index.js' import { generateRoutes } from "./router/index.js";
import "../src/assets/css/font.css";
import "../src/assets/css/index.css";
import "../src/assets/item.css";
import '../src/assets/css/font.css' import store from "@/store";
import '../src/assets/css/index.css'
import '../src/assets/item.css'
import store from '@/store'; import i18n from "./i18n/i18n.js";
import i18n from './i18n/i18n.js' import axios from "./request/http.js";
import axios from './request/http.js' const createVue = createApp(App);
// createVue.use(ElementPlus, { locale });
const createVue = createApp(App)
createVue.use(ElementPlus, { locale });
function getMsgAppid() { function getMsgAppid() {
axios.get(`/apaas/system/v5/message/account`).then(res => { axios.get(`/apaas/system/v5/message/account`).then((res) => {
if (res.data.code == 200) { if (res.data.code == 200) {
createVue.use(msgSdk, { createVue.use(msgSdk, {
requestUrl: 'https://msg.wodcloud.com', // 请求地址 requestUrl: "https://msg.wodcloud.com", // 请求地址
appID: decodeURIComponent(escape(window.atob(res.data.data.app_id))), // 应用id appID: decodeURIComponent(escape(window.atob(res.data.data.app_id))), // 应用id
secretKey: decodeURIComponent(escape(window.atob(res.data.data.secret_key))), // 应用密钥 secretKey: decodeURIComponent(escape(window.atob(res.data.data.secret_key))), // 应用密钥
userId: '', userId: "",
userType: '', userType: "",
roleId: '', roleId: "",
organization: '', organization: "",
}) });
} }
}) });
} }
// getMsgAppid() // getMsgAppid()
for (const [key, component] of Object.entries(ElementPlusIconsVue)) { for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
createVue.component(key, component) createVue.component(key, component);
} }
createVue.config.globalProperties.$axios = axios createVue.config.globalProperties.$axios = axios;
import menu from './router/function.js' import menu from "./router/function.js";
//获取用户信息 //获取用户信息
function getUser() { function getUser() {
return axios.get(`/apaas/system/v5/user/getUserInfo`) return axios.get(`/apaas/system/v5/user/getUserInfo`);
} }
//获取用户菜单信息 //获取用户菜单信息
function getMenu(search) { function getMenu(search) {
return axios.get(`/apaas/system/v5/menu/user/tree?search=${search}`) return axios.get(`/apaas/system/v5/menu/user/tree?search=${search}`);
} }
//处理菜单成为对象 //处理菜单成为对象
function getMenuObj(menu,parentRowPath,menuObj){ function getMenuObj(menu, parentRowPath, menuObj) {
menu.forEach((e,idx) => { menu.forEach((e, idx) => {
e.rowPath = parentRowPath + '.' + idx e.rowPath = parentRowPath + "." + idx;
menuObj[e.path] = e menuObj[e.path] = e;
if(e.children&&e.children.length){ if (e.children && e.children.length) {
getMenuObj(e.children,e.rowPath,menuObj) getMenuObj(e.children, e.rowPath, menuObj);
} }
}); });
} }
store.commit("setWhiteList", ["/", "/login", "/register", "/password"]);
Promise.all([getUser(), getMenu("dadb2d3f-e263-48d1-9389-42acb9ea49f8")])
Promise.all([getUser(),getMenu('dadb2d3f-e263-48d1-9389-42acb9ea49f8')]).then(res => { .then((res) => {
if (res[0].data.code == 200&&res[1].data.code == 200) { if (res[0].data.code == 200 && res[1].data.code == 200) {
//已登录则记录菜单和用户信息 //已登录则记录菜单和用户信息
let data = res[1].data.data&&res[1].data.data[0].children||[] let data = (res[1].data.data && res[1].data.data[0].children) || [];
store.commit('setUserInfo', res[0].data.data) store.commit("setUserInfo", res[0].data.data);
// if (res[0].data.data.userType == 1) {//超管 // if (res[0].data.data.userType == 1) {//超管
store.commit('setMenu', data) store.commit("setMenu", data);
menu.menuToRouter(data) menu.menuToRouter(data);
store.commit('setRoute',data) store.commit("setRoute", data);
//存储菜单对象信息 //存储菜单对象信息
let menuObj = {} let menuObj = {};
getMenuObj(data,'',menuObj) getMenuObj(data, "", menuObj);
store.commit('setMenuObj',menuObj) store.commit("setMenuObj", menuObj);
// } // }
} }
generateRoutes() generateRoutes();
})
createVue.use(ElementPlus).use(store).use(router).use(i18n).use(bgui) .catch((e) => {
createVue.mount('#app') console.error(e);
}).catch(() => {
createVue.use(ElementPlus).use(store).use(router).use(i18n).use(bgui)
createVue.mount('#app')
}) })
.finally(() => {
createVue.use(ElementPlus, { locale }).use(store).use(router).use(i18n).use(bgui);
createVue.mount("#app");
});
//后期加入权限处理,参考msg/ui //后期加入权限处理,参考msg/ui
<template> <template>
<div class="login-container"> <div
class="login-container"
:style="{
'background-image': `url(${
configOptions.backgroundUrl
? JSON.parse(configOptions.backgroundUrl)[0].url
: getImageUrl('bg.png')
})`,
}">
<el-alert
class="bg-warning"
title="系统有效期剩余345 天,请管理员及时更换license!"
type="warning" />
<div class="bg-main"> <div class="bg-main">
<div class="bg-logo"> <!-- <div class="bg-logo">
<img class="logo" src="../../assets/imgs/login_img_logo.png" /> <img class="logo" src="../../assets/imgs/login_img_logo.png" />
<!-- <span>BD-aPaaS</span> --> </div> -->
</div>
<div class="bg-content"> <div class="bg-content">
<bg-tabs <bg-tabs
class="login-tab" class="login-tab"
v-model="loginTab" v-model="loginTab"
style="min-height: 450px;" style="width: 480px"
v-if="pageType === 'login'" v-if="pageType === 'login'">
>
<bg-tab label="账号密码登录" name="account"> <bg-tab label="账号密码登录" name="account">
<LoginByAccount @register="switchPageType('register')" /> <LoginByAccount @register="switchPageType('account')" @password="password" />
</bg-tab>
<bg-tab label="验证码登录" name="register">
<LoginByCode @register="switchPageType('register')" @password="password" />
</bg-tab> </bg-tab>
</bg-tabs> </bg-tabs>
</div> </div>
</div> </div>
<!-- v-if="pageType !== 'register'" -->
<p class="bg-msg" v-if="pageType !== 'register'"> <div class="bg-msg">
登录即代表您已同意 <span>《BD-aPaaS平台用户协议与隐私政策》</span> <p v-if="configOptions && configOptions.patent">{{ configOptions.patent }}</p>
<p v-if="configOptions">
<span class="can_click_text" @click="open(configOptions.icpUrl)">
{{ configOptions.icpFiling }} |
</span>
<span class="can_click_text" @click="open(configOptions.publicSecurityUrl)">
{{ configOptions.publicSecurityFiling }}
</span>
</p>
<p>
<span class="can_click_text" @click="open(configOptions.legalStatementUrl)">法律声明</span>
|
<span class="can_click_text" @click="open(configOptions.privacyPolicyUrl)">隐私政策</span>
</p> </p>
</div> </div>
</template>
<script> <el-dialog class="dialog_box" title="提示" v-model="dialogPasswordChange" width="400px">
import LoginByAccount from "@/components/login-by-account.vue"; <div>密码已过期,请修改密码后再次登录</div>
// import LoginByCode from "@/components/login-by-code.vue"; <template v-slot:footer>
// import RegisterPersonalUser from "@/components/register-personal-user.vue"; <div class="apaas_button">
// import RegisterFrimUser from "@/components/register-firm-user.vue"; <el-button type="primary" @click="password">立即修改</el-button>
// import RegisterOrgUser from "@/components/register-org-user.vue"; </div>
// import RegisterSuccess from "@/components/register-success.vue"; </template>
</el-dialog>
export default { </div>
name: "Index", </template>
components: {
LoginByAccount, <script setup>
// LoginByCode, import LoginByAccount from "@/components/login-by-account.vue";
// RegisterPersonalUser, import LoginByCode from "@/components/login-by-code.vue";
// RegisterFrimUser, import axios from "axios";
// RegisterOrgUser, import { ElMessage } from "element-plus";
// RegisterSuccess, import { ref, onBeforeMount, onMounted } from "vue";
}, import { useRouter } from "vue-router";
data() { import store from "../../store";
return { import { getImageUrl } from "@/services/helper.js";
pageType: "login", // login(登录) / register(注册) / success(认证) const router = useRouter();
loginTab: "account", // account(账号密码登录) / or register(短信验证码登录)
registerTab: "personal", // personal(个人用户) / firm(企业用户) / org(政府机构用户) const pageType = ref("login");
}; const loginTab = ref("account");
},
methods: { const configOptions = ref({});
switchPageType(type) { const dialogPasswordChange = ref(false);
this.pageType = type;
}, const switchPageType = (type) => {
}, // pageType.value = type
}; router.push("/register");
</script> };
const password = () => {
<style lang="scss" scoped> router.push("/password");
.login-container { };
const getLoginPageConfig = () => {
axios.get(`/apaas/system/v5/login/loginDetail`).then((res) => {
if (res.data.code == 200) {
configOptions.value = res.data.data || null;
store.commit("setSystemLogo", configOptions.value.logoUrl);
} else {
ElMessage.error(res.data.data);
}
});
};
const open = (url) => {
if (url !== "") {
window.open(url);
} else {
return;
}
};
onBeforeMount(() => {
getLoginPageConfig();
});
</script>
<style lang="scss" scoped>
.login-container {
width: 100vw; width: 100vw;
height: calc(100vh - 56px); height: calc(100vh - 56px);
background-image: url("@/assets/imgs/login_ysgz.jpg"); background-image: url("@/assets/imgs/bg.png");
background-size: cover; background-size: 100% 100%;
background-position: center center; background-position: center center;
background-size: cover;
position: relative; position: relative;
.bg-main { .bg-main {
position: absolute; position: absolute;
top: 50%; top: calc(50vh - 250px);
right: 0; right: calc(28vw - 240px);
margin-right: 16vw;
margin-bottom: 80px;
transform: translateY(calc(-50%));
width: 500px; width: 500px;
max-height: calc(100vh - 100px); max-height: calc(100vh - 100px);
overflow: hidden auto; overflow: hidden auto;
...@@ -100,7 +147,7 @@ ...@@ -100,7 +147,7 @@
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
.logo{ .logo {
width: 450px; width: 450px;
} }
...@@ -111,26 +158,43 @@ ...@@ -111,26 +158,43 @@
} }
} }
> .bg-content { .bg-content {
:deep(.bg-tabs-content) {
padding: 32px 0;
} }
} }
:deep(.el-form) {
.el-form-item {
.el-input,
.el-button {
height: 40px;
}
}
}
}
> .bg-warning {
text-align: center;
background-color: #fdf4e2;
color: #e56600;
font-size: 14px;
height: 32px;
line-height: 32px;
display: flex;
justify-content: center;
}
> .bg-msg { > .bg-msg {
position: absolute; position: absolute;
bottom: 70px; bottom: 10px;
left: 0; left: 0;
width: 100%; width: 100%;
font-size: 14px; font-size: 14px;
line-height: 20px; line-height: 20px;
color: #bcc1d0; color: #616f94;
text-align: center; text-align: center;
> p {
> span { padding: 8px 0;
color: #fff;
cursor: pointer;
}
} }
} }
</style> }
</style>
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -28,11 +28,11 @@ ...@@ -28,11 +28,11 @@
<bg-filter-group @search="changeSearch" v-model="filter.search" placeholder="请输入关键字"> <bg-filter-group @search="changeSearch" v-model="filter.search" placeholder="请输入关键字">
<template v-slot:left_action v-if="nodeClassifyId != '263758a4-0349-4d49-a816-e8ff8d33a8bb'"> <template v-slot:left_action v-if="nodeClassifyId != '263758a4-0349-4d49-a816-e8ff8d33a8bb'">
<div class="apaas_button"> <div class="apaas_button">
<el-button class="register_btn" type="primary" @click="backDict" v-if="dictLevel != 1"> <el-button type="primary" @click="backDict" v-if="dictLevel != 1">
<!-- <bg-icon style="font-size: 12px; color: #fff; margin-right: 8px" icon="#bg-ic-add"></bg-icon> --> <!-- <bg-icon style="font-size: 12px; color: #fff; margin-right: 8px" icon="#bg-ic-add"></bg-icon> -->
返回上级 返回上级
</el-button> </el-button>
<el-button class="register_btn" type="primary" @click="register"> <el-button type="primary" @click="register">
<bg-icon style="font-size: 12px; color: #fff; margin-right: 8px" icon="#bg-ic-add"></bg-icon> <bg-icon style="font-size: 12px; color: #fff; margin-right: 8px" icon="#bg-ic-add"></bg-icon>
新增 新增
</el-button> </el-button>
......
<!-- 角色管理 -->
<template>
<div class="page_container">
<bg-breadcrumb></bg-breadcrumb>
<div class="main_container">
<div class="form_content apaas_scroll_nor">
<el-form ref="refForm" :model="formData" :rules="rules" label-width="96px" class="registerForm">
<el-form-item label="LOGO" prop="logoUrl">
<bg-upload-image
v-model="formData.logoUrl"
:showTips="true"
customTips="请选择图片上传:支持jpg、png等格式,图片需小于500KB"
:fileSize="500"
:fileSizeUnit="'KB'"
:limit="1"
listType="picture-card"
@change="changeLogo"
:accept="['.jpg', '.jpeg', '.png']"></bg-upload-image>
</el-form-item>
<el-form-item label="登录背景图" prop="backgroundUrl">
<bg-upload-image
v-model="formData.backgroundUrl"
:fileSize="2"
:showTips="true"
customTips="请选择图片上传:大小1920 * 1026像素支持jpg、png等格式,图片需小于2MB"
:limit="1"
listType="picture-card"
@change="changeBanner"
:accept="['.jpg', '.jpeg', '.png']"></bg-upload-image>
</el-form-item>
<bg-form-gap title="底部所有权内容"></bg-form-gap>
<el-form-item label="内容" prop="patent">
<el-input
v-model.trim="formData.patent"
placeholder="例如:Copyright © 某某大数据, All Rights Reserved."></el-input>
</el-form-item>
<bg-form-gap title="底部ICP备案"></bg-form-gap>
<el-form-item label="内容" prop="icpFiling">
<el-input placeholder="请输入" v-model.trim="formData.icpFiling"></el-input>
</el-form-item>
<el-form-item label="跳转连接" prop="icpUrl">
<el-input placeholder="例如:https://...或http://..." v-model.trim="formData.icpUrl"></el-input>
</el-form-item>
<bg-form-gap title="底部公安网备案"></bg-form-gap>
<el-form-item label="内容" prop="publicSecurityFiling">
<el-input placeholder="请输入" v-model.trim="formData.publicSecurityFiling"></el-input>
</el-form-item>
<el-form-item label="跳转连接" prop="publicSecurityUrl">
<el-input placeholder="例如:https://...或http://..." v-model.trim="formData.publicSecurityUrl"></el-input>
</el-form-item>
<bg-form-gap title="法律声明"></bg-form-gap>
<el-form-item label="跳转连接" prop="legalStatementUrl">
<el-input placeholder="例如:https://...或http://..." v-model.trim="formData.legalStatementUrl"></el-input>
</el-form-item>
<bg-form-gap title="隐私政策"></bg-form-gap>
<el-form-item label="跳转连接" prop="privacyPolicyUrl">
<el-input placeholder="例如:https://...或http://..." v-model.trim="formData.privacyPolicyUrl"></el-input>
</el-form-item>
</el-form>
</div>
<div class="operate_btns">
<el-button type="primary" @click="save"> 保存 </el-button>
</div>
</div>
</div>
</template>
<script setup>
import { reactive, toRefs, ref, onBeforeMount, nextTick } from "vue";
import axios from "../../../../request/http.js";
import { ElMessage } from "element-plus";
import bgBreadcrumb from "@/components/bg-breadcrumb.vue";
import { validateLink } from "@/services/rules.js";
import store from "../../../../store";
const refForm = ref(null);
const state = reactive({
formData: {
logoUrl: [],
backgroundUrl: [],
patent: "",
icpFiling: "",
icpUrl: "",
publicSecurityFiling: "",
publicSecurityUrl: "",
legalStatementUrl: "",
privacyPolicyUrl: "",
}, //表单数据
rules: {
logoUrl: [{ required: true, message: "请上传Logo", trigger: "change" }],
backgroundUrl: [{ required: true, message: "请上传背景图", trigger: "change" }],
icpUrl: [{ validator: validateLink, trigger: "blur" }],
publicSecurityUrl: [{ validator: validateLink, trigger: "blur" }],
legalStatementUrl: [{ validator: validateLink, trigger: "blur" }],
privacyPolicyUrl: [{ validator: validateLink, trigger: "blur" }],
}, //表单校验规则
});
const changeLogo = (value) => {
if (value && value.length > 0) {
refForm.value.clearValidate("logoUrl");
}
};
const changeBanner = (value) => {
if (value && value.length > 0) {
refForm.value.clearValidate("backgroundUrl");
}
};
const save = () => {
refForm.value.validate((valid) => {
if (valid) {
let params = {
...state.formData,
};
params.logoUrl = JSON.stringify(params.logoUrl);
params.backgroundUrl = JSON.stringify(params.backgroundUrl);
axios.put(`/apaas/system/v5/login/updateLogin`, params).then((res) => {
if (res.data.code == 200) {
ElMessage.success(res.data.msg);
getLoginPageConfig();
} else {
ElMessage.error(res.data.data);
}
});
} else {
ElMessage.error("请先将表单填写完整");
}
});
};
const getLoginPageConfig = () => {
axios.get(`/apaas/system/v5/login/loginDetail`).then((res) => {
if (res.data.code == 200) {
let data = res.data.data;
store.commit("setSystemLogo", data.logoUrl);
data.logoUrl = data.logoUrl ? JSON.parse(data.logoUrl) : [];
data.backgroundUrl = data.backgroundUrl ? JSON.parse(data.backgroundUrl) : [];
Object.assign(state.formData, data);
} else {
ElMessage.error(res.data.data);
}
});
};
onBeforeMount(() => {
getLoginPageConfig();
});
const { formData, rules } = toRefs(state);
</script>
<style lang="scss" scoped>
.page_container {
.main_container {
position: relative;
margin: 0 0 16px;
width: 100%;
height: calc(100% - 62px);
padding: 32px 0 70px;
overflow: auto;
background-color: #fff;
box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.15);
border-radius: 6px;
.form_content {
overflow: auto;
height: 100%;
padding-left: 24px;
.el-form {
width: 60%;
:deep() .el-form-item {
&:nth-of-type(1) {
.el-upload--picture-card {
width: 120px;
height: 120px;
}
}
&:nth-of-type(2) {
.el-upload--picture-card {
width: 367px;
height: 196px;
}
}
}
}
:deep() .gap-title {
font-size: 16px;
color: #202531;
}
}
.operate_btns {
position: absolute;
bottom: 0;
width: 100%;
height: 70px;
text-align: right;
line-height: 68px;
border-top: solid 1px #e6e9ef;
.el-button {
width: 92px;
margin-right: 16px;
}
}
}
}
</style>
This diff is collapsed.
...@@ -51,22 +51,6 @@ const checkPhone = (rule, value, callback) => { ...@@ -51,22 +51,6 @@ const checkPhone = (rule, value, callback) => {
}); });
}; };
// const checkPhoneRepet = (rule, value, callback) => {
// let params = null;
// if (props.id){
// params = {id: parseInt(props.id),contact_phone: value,}
// }else {
// params = {id: 0,contact_phone: value}
// }
// $axios.post(`/apaas/system/v5/org/check`,params)
// .then((res) => {
// if (res.data.code == 200) {
// callback()
// }else {
// callback(new Error(res.data.data))
// }
// })
// }
const checkName = (rule, value, callback) => { const checkName = (rule, value, callback) => {
var reg = /^[a-zA-Z0-9\u4e00-\u9fa5]+$/; var reg = /^[a-zA-Z0-9\u4e00-\u9fa5]+$/;
...@@ -86,7 +70,6 @@ const contactFormRules = reactive({ ...@@ -86,7 +70,6 @@ const contactFormRules = reactive({
contact_phone: [ contact_phone: [
{ required: true, message: "请输入联系人手机号", trigger: "blur" }, { required: true, message: "请输入联系人手机号", trigger: "blur" },
{ validator: checkPhone, trigger: "blur" }, { validator: checkPhone, trigger: "blur" },
// { validator: checkPhoneRepet, trigger: 'blur' }
], ],
contact_email: [ contact_email: [
{ type: "email", message: "请输入正确的邮箱", trigger: "blur" }, { type: "email", message: "请输入正确的邮箱", trigger: "blur" },
......
...@@ -114,6 +114,7 @@ const formData = reactive({ ...@@ -114,6 +114,7 @@ const formData = reactive({
logo: "", logo: "",
system_role_id: "", system_role_id: "",
system_account: "", system_account: "",
system_phone: "",
password: "", password: "",
confirm_password: "", confirm_password: "",
access_address: "", access_address: "",
...@@ -213,6 +214,7 @@ const getDetail = () => { ...@@ -213,6 +214,7 @@ const getDetail = () => {
business_name: form.business_name, business_name: form.business_name,
business_desc: form.business_desc, business_desc: form.business_desc,
system_account: form.system_account, system_account: form.system_account,
system_phone: form.system_phone,
access_address: form.access_address, access_address: form.access_address,
develop_id: form.develop_id, develop_id: form.develop_id,
state: form.state, state: form.state,
......
...@@ -22,13 +22,28 @@ ...@@ -22,13 +22,28 @@
<el-input v-model="systemForm.business_name" /> <el-input v-model="systemForm.business_name" />
</el-form-item> </el-form-item>
<el-form-item label="AppId" prop="appid" v-if="formType"> <el-form-item label="AppId" prop="appid" v-if="formType">
<el-input v-model="systemForm.appid" :disabled="formType" style="width: 80%" /> <el-input v-model="systemForm.appid" :disabled="formType">
<span class="pl-1"><el-button type="primary" @click="copyText(systemForm.appid)">复制</el-button></span> <template #suffix>
<bg-icon
icon="#bg-ic-copy"
style="cursor: pointer"
@click="copyText(systemForm.appid)"></bg-icon>
</template>
</el-input>
<!-- <span class="pl-1"><el-button type="primary" @click="copyText(systemForm.appid)">复制</el-button></span> -->
</el-form-item> </el-form-item>
<el-form-item label="AppSecret" prop="appsecret" v-if="formType"> <el-form-item label="AppSecret" prop="appsecret" v-if="formType">
<el-input v-model="systemForm.appsecret" :disabled="formType" style="width: 80%" /> <div style="display: flex; width: 100%">
<span class="pl-1"><el-button type="primary" @click="copyText(systemForm.appsecret)">复制</el-button></span> <el-input v-model="systemForm.appsecret" :disabled="formType">
<template #suffix>
<bg-icon
icon="#bg-ic-copy"
style="cursor: pointer"
@click="copyText(systemForm.appsecret)"></bg-icon>
</template>
</el-input>
<span class="pl-1"><el-button type="primary" @click="resetSecret">重置</el-button></span> <span class="pl-1"><el-button type="primary" @click="resetSecret">重置</el-button></span>
</div>
</el-form-item> </el-form-item>
<el-form-item label="系统LOGO" prop="logo"> <el-form-item label="系统LOGO" prop="logo">
<bg-upload-image <bg-upload-image
...@@ -42,20 +57,39 @@ ...@@ -42,20 +57,39 @@
customTips="请选择图片上传:大小120 * 120像素支持jpg、png等格式,图片需小于500KB"></bg-upload-image> customTips="请选择图片上传:大小120 * 120像素支持jpg、png等格式,图片需小于500KB"></bg-upload-image>
</el-form-item> </el-form-item>
<el-form-item label="业务系统概述" prop="business_desc"> <el-form-item label="业务系统概述" prop="business_desc">
<el-input type="textarea" :rows="3" v-model="systemForm.business_desc" show-word-limit maxlength="300" /> <el-input
type="textarea"
:rows="3"
v-model="systemForm.business_desc"
show-word-limit
maxlength="300" />
</el-form-item> </el-form-item>
<el-form-item label="角色" prop="system_role_id" v-if="!formType"> <el-form-item label="角色" prop="system_role_id" v-if="!formType">
<el-select v-model="systemForm.system_role_id" placeholder="请选择角色" :disabled="true" style="width: 100%"> <el-select
<el-option v-for="item in roleList" :key="item.role_id" :label="item.role_name" :value="item.role_id" /> v-model="systemForm.system_role_id"
placeholder="请选择角色"
:disabled="true"
style="width: 100%">
<el-option
v-for="item in roleList"
:key="item.role_id"
:label="item.role_name"
:value="item.role_id" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="账号" prop="system_account"> <el-form-item label="账号" prop="system_account">
<el-input v-model="systemForm.system_account" /> <el-input v-model="systemForm.system_account" />
</el-form-item> </el-form-item>
<el-form-item label="手机号" prop="system_phone">
<el-input v-model="systemForm.system_phone" />
</el-form-item>
<el-form-item label="密码" prop="password" v-if="!formType"> <el-form-item label="密码" prop="password" v-if="!formType">
<el-input :type="password_eye ? 'text' : 'password'" v-model="systemForm.password"> <el-input :type="password_eye ? 'text' : 'password'" v-model="systemForm.password">
<template #suffix> <template #suffix>
<bg-icon @click="password_eye = !password_eye" class="icon_eye" icon="#bg-ic-eye"></bg-icon> <bg-icon
@click="password_eye = !password_eye"
class="icon_eye"
icon="#bg-ic-eye"></bg-icon>
</template> </template>
</el-input> </el-input>
</el-form-item> </el-form-item>
...@@ -71,7 +105,11 @@ ...@@ -71,7 +105,11 @@
</el-form-item> </el-form-item>
<el-form-item label="开发厂商名称" prop="develop_id"> <el-form-item label="开发厂商名称" prop="develop_id">
<el-select v-model="systemForm.develop_id" placeholder="请选择开发厂商" style="width: 100%"> <el-select v-model="systemForm.develop_id" placeholder="请选择开发厂商" style="width: 100%">
<el-option v-for="item in firmList" :key="item.dict_id" :label="item.dict_name" :value="item.dict_id" /> <el-option
v-for="item in firmList"
:key="item.dict_id"
:label="item.dict_name"
:value="item.dict_id" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="是否启用" prop="state"> <el-form-item label="是否启用" prop="state">
...@@ -84,6 +122,7 @@ ...@@ -84,6 +122,7 @@
import { reactive, ref, onBeforeMount, onMounted, computed } from "vue"; import { reactive, ref, onBeforeMount, onMounted, computed } from "vue";
import axios from "@/request/http.js"; import axios from "@/request/http.js";
import { ElMessage } from "element-plus"; import { ElMessage } from "element-plus";
import { validatePhone } from "@/services/rules.js";
const props = defineProps({ const props = defineProps({
formType: { formType: {
type: Boolean, type: Boolean,
...@@ -102,6 +141,7 @@ const systemForm = reactive({ ...@@ -102,6 +141,7 @@ const systemForm = reactive({
logo: [], logo: [],
system_role_id: "", system_role_id: "",
system_account: "", system_account: "",
system_phone: "",
password: "", password: "",
confirm_password: "", confirm_password: "",
access_address: "", access_address: "",
...@@ -127,7 +167,11 @@ const validateBusinessName = (rule, value, callback) => { ...@@ -127,7 +167,11 @@ const validateBusinessName = (rule, value, callback) => {
} else { } else {
let params = null; let params = null;
if (props.id) { if (props.id) {
params = { id: parseInt(props.id), business_name: value, organization_id: systemForm.organization_id }; params = {
id: parseInt(props.id),
business_name: value,
organization_id: systemForm.organization_id,
};
} else { } else {
params = { business_name: value, organization_id: systemForm.organization_id }; params = { business_name: value, organization_id: systemForm.organization_id };
} }
...@@ -164,6 +208,22 @@ const validateSystemAccount = (rule, value, callback) => { ...@@ -164,6 +208,22 @@ const validateSystemAccount = (rule, value, callback) => {
} }
}; };
const checkPhoneRepet = (rule, value, callback) => {
let params = null;
if (props.id) {
params = { id: parseInt(props.id), contact_phone: value };
} else {
params = { id: 0, contact_phone: value };
}
axios.post(`/apaas/system/v5/org/check`, params).then((res) => {
if (res.data.code == 200) {
callback();
} else {
callback(new Error(res.data.data));
}
});
};
const formRules = reactive({ const formRules = reactive({
organization_id: [{ required: true, message: "请选择组织机构", trigger: "change" }], organization_id: [{ required: true, message: "请选择组织机构", trigger: "change" }],
business_name: [ business_name: [
...@@ -178,6 +238,11 @@ const formRules = reactive({ ...@@ -178,6 +238,11 @@ const formRules = reactive({
{ max: 20, message: "帐号最大长度为20个字符", trigger: "blur" }, { max: 20, message: "帐号最大长度为20个字符", trigger: "blur" },
{ validator: validateSystemAccount, trigger: "blur" }, { validator: validateSystemAccount, trigger: "blur" },
], ],
system_phone: [
{ required: true, message: "请输入账号", trigger: "blur" },
{ validator: validatePhone, trigger: "blur" },
{ validator: checkPhoneRepet, trigger: "blur" },
],
password: [ password: [
{ required: true, message: "请输入密码", trigger: "blur" }, { required: true, message: "请输入密码", trigger: "blur" },
{ min: 8, message: "密码长度不得低于8位", trigger: "blur" }, { min: 8, message: "密码长度不得低于8位", trigger: "blur" },
......
...@@ -32,12 +32,12 @@ ...@@ -32,12 +32,12 @@
<bg-filter-group @search="changeSearch" v-model="filter.search" placeholder="请输入关键字"> <bg-filter-group @search="changeSearch" v-model="filter.search" placeholder="请输入关键字">
<template v-slot:left_action> <template v-slot:left_action>
<div class="apaas_button"> <div class="apaas_button">
<el-button class="register_btn" type="primary" @click="addAccount"> <el-button type="primary" @click="addAccount">
<bg-icon style="font-size: 12px; color: #fff; margin-right: 8px" icon="#bg-ic-add"></bg-icon> <bg-icon style="font-size: 12px; color: #fff; margin-right: 8px" icon="#bg-ic-add"></bg-icon>
新增 新增
</el-button> </el-button>
<el-button class="register_btn" @click="deleteBatch"> 批量删除 </el-button> <el-button @click="deleteBatch"> 批量删除 </el-button>
<el-button class="register_btn" @click="resetPsd"> 重置密码 </el-button> <el-button @click="resetPsd"> 重置密码 </el-button>
<span class="header_info" <span class="header_info"
>已选择<span style="color: #202531; font-weight: bold">{{ selected.length }}</span >已选择<span style="color: #202531; font-weight: bold">{{ selected.length }}</span
></span ></span
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
<bg-filter-group :showSearch="false"> <bg-filter-group :showSearch="false">
<template v-slot:left_action> <template v-slot:left_action>
<div class="apaas_button"> <div class="apaas_button">
<el-button class="register_btn" type="primary" @click="addBanner"> <el-button type="primary" @click="addBanner">
<bg-icon style="font-size: 12px; color: #fff; margin-right: 8px" icon="#bg-ic-add"></bg-icon> <bg-icon style="font-size: 12px; color: #fff; margin-right: 8px" icon="#bg-ic-add"></bg-icon>
新增 新增
</el-button> </el-button>
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment