fmt
This commit is contained in:
120
src/api/login.js
120
src/api/login.js
@ -3,87 +3,87 @@ import useUserStore from "@/store/modules/user";
|
||||
|
||||
// 登录方法
|
||||
export function login(username, password, code, uuid) {
|
||||
const data = {
|
||||
username,
|
||||
password,
|
||||
code,
|
||||
uuid,
|
||||
};
|
||||
return request({
|
||||
url: "/login",
|
||||
headers: {
|
||||
isToken: false,
|
||||
},
|
||||
method: "post",
|
||||
data: data,
|
||||
});
|
||||
const data = {
|
||||
username,
|
||||
password,
|
||||
code,
|
||||
uuid,
|
||||
};
|
||||
return request({
|
||||
url: "/login",
|
||||
headers: {
|
||||
isToken: false,
|
||||
},
|
||||
method: "post",
|
||||
data: data,
|
||||
});
|
||||
}
|
||||
|
||||
// 注册方法
|
||||
export function register(data) {
|
||||
return request({
|
||||
url: "/register",
|
||||
headers: {
|
||||
isToken: false,
|
||||
},
|
||||
method: "post",
|
||||
data: data,
|
||||
});
|
||||
return request({
|
||||
url: "/register",
|
||||
headers: {
|
||||
isToken: false,
|
||||
},
|
||||
method: "post",
|
||||
data: data,
|
||||
});
|
||||
}
|
||||
|
||||
// 获取用户详细信息
|
||||
export function getInfo() {
|
||||
// if (useUserStore().userInfoRes) {
|
||||
// return new Promise((resolve, reject) => {
|
||||
// resolve(useUserStore().userInfoRes);
|
||||
// });
|
||||
// }
|
||||
return request({
|
||||
url: "/getInfo",
|
||||
method: "get",
|
||||
});
|
||||
// if (useUserStore().userInfoRes) {
|
||||
// return new Promise((resolve, reject) => {
|
||||
// resolve(useUserStore().userInfoRes);
|
||||
// });
|
||||
// }
|
||||
return request({
|
||||
url: "/getInfo",
|
||||
method: "get",
|
||||
});
|
||||
}
|
||||
|
||||
// 退出方法
|
||||
export function logout() {
|
||||
return request({
|
||||
url: "/logout",
|
||||
method: "post",
|
||||
});
|
||||
return request({
|
||||
url: "/logout",
|
||||
method: "post",
|
||||
});
|
||||
}
|
||||
|
||||
// 获取验证码
|
||||
export function getCodeImg() {
|
||||
return request({
|
||||
url: "/captchaImage",
|
||||
headers: {
|
||||
isToken: false,
|
||||
},
|
||||
method: "get",
|
||||
timeout: 20000,
|
||||
});
|
||||
return request({
|
||||
url: "/captchaImage",
|
||||
headers: {
|
||||
isToken: false,
|
||||
},
|
||||
method: "get",
|
||||
timeout: 20000,
|
||||
});
|
||||
}
|
||||
|
||||
// 获取路由
|
||||
export const getRouters = () => {
|
||||
// if (usePermissionStore().routesRes) {
|
||||
// return new Promise((resolve, reject) => {
|
||||
// resolve(usePermissionStore().routesRes);
|
||||
// });
|
||||
// }
|
||||
return request({
|
||||
url: "/getRouters",
|
||||
method: "get",
|
||||
});
|
||||
// if (usePermissionStore().routesRes) {
|
||||
// return new Promise((resolve, reject) => {
|
||||
// resolve(usePermissionStore().routesRes);
|
||||
// });
|
||||
// }
|
||||
return request({
|
||||
url: "/getRouters",
|
||||
method: "get",
|
||||
});
|
||||
};
|
||||
|
||||
export const getTenantNormalList = (query) => {
|
||||
return request({
|
||||
url: "/tenant/normal-list",
|
||||
headers: {
|
||||
isToken: false,
|
||||
},
|
||||
params: query,
|
||||
method: "get",
|
||||
});
|
||||
return request({
|
||||
url: "/tenant/normal-list",
|
||||
headers: {
|
||||
isToken: false,
|
||||
},
|
||||
params: query,
|
||||
method: "get",
|
||||
});
|
||||
};
|
||||
|
@ -2,51 +2,51 @@ import request from "@/utils/request";
|
||||
|
||||
// 查询租户列表
|
||||
export function listTenant(query) {
|
||||
return request({
|
||||
url: "/tenant/list",
|
||||
method: "get",
|
||||
params: query,
|
||||
});
|
||||
return request({
|
||||
url: "/tenant/list",
|
||||
method: "get",
|
||||
params: query,
|
||||
});
|
||||
}
|
||||
|
||||
// 查询租户详细
|
||||
export function getTenant(tenantId) {
|
||||
return request({
|
||||
url: "/tenant/" + tenantId,
|
||||
method: "get",
|
||||
});
|
||||
return request({
|
||||
url: "/tenant/" + tenantId,
|
||||
method: "get",
|
||||
});
|
||||
}
|
||||
|
||||
// 新增租户
|
||||
export function addTenant(data) {
|
||||
return request({
|
||||
url: "/tenant",
|
||||
method: "post",
|
||||
data: data,
|
||||
});
|
||||
return request({
|
||||
url: "/tenant",
|
||||
method: "post",
|
||||
data: data,
|
||||
});
|
||||
}
|
||||
|
||||
// 修改租户
|
||||
export function updateTenant(data) {
|
||||
return request({
|
||||
url: "/tenant",
|
||||
method: "put",
|
||||
data: data,
|
||||
});
|
||||
return request({
|
||||
url: "/tenant",
|
||||
method: "put",
|
||||
data: data,
|
||||
});
|
||||
}
|
||||
|
||||
// 删除租户
|
||||
export function delTenant(tenantId) {
|
||||
return request({
|
||||
url: "/tenant/" + tenantId,
|
||||
method: "delete",
|
||||
});
|
||||
return request({
|
||||
url: "/tenant/" + tenantId,
|
||||
method: "delete",
|
||||
});
|
||||
}
|
||||
|
||||
// 查看设置
|
||||
export function getSetting(tenantId) {
|
||||
return request({
|
||||
url: `/tenant/getSetting/${tenantId}`,
|
||||
method: "get",
|
||||
});
|
||||
return request({
|
||||
url: `/tenant/getSetting/${tenantId}`,
|
||||
method: "get",
|
||||
});
|
||||
}
|
||||
|
@ -1,9 +1,17 @@
|
||||
<script setup>
|
||||
import {nextTick, onMounted, onUnmounted, ref, toRefs, watch, watchEffect,} from "vue";
|
||||
import {
|
||||
nextTick,
|
||||
onMounted,
|
||||
onUnmounted,
|
||||
ref,
|
||||
toRefs,
|
||||
watch,
|
||||
watchEffect,
|
||||
} from "vue";
|
||||
import InfiniteLoading from "v3-infinite-loading";
|
||||
import "v3-infinite-loading/lib/style.css";
|
||||
import {debounce} from "lodash-es"; //required if you're not going to override default slots
|
||||
import {ElInput, ElPopover, ElScrollbar} from "element-plus";
|
||||
import { debounce } from "lodash-es"; //required if you're not going to override default slots
|
||||
import { ElInput, ElPopover, ElScrollbar } from "element-plus";
|
||||
|
||||
const props = defineProps({
|
||||
modelValue: {},
|
||||
@ -17,7 +25,7 @@ const props = defineProps({
|
||||
width: {
|
||||
type: Number,
|
||||
},
|
||||
prefixIcon: {type: String},
|
||||
prefixIcon: { type: String },
|
||||
query: {
|
||||
type: Object,
|
||||
required: true,
|
||||
@ -35,14 +43,14 @@ const props = defineProps({
|
||||
},
|
||||
});
|
||||
|
||||
const {modelValue} = toRefs(props);
|
||||
const { modelValue } = toRefs(props);
|
||||
const loadKey = ref(0);
|
||||
const emit = defineEmits(["update:modelValue", "change", "confirm"]);
|
||||
|
||||
const showPopOver = ref(false);
|
||||
|
||||
const inputRefWhenShowPop = ref();
|
||||
const inputRefWhenNotShowPop = ref()
|
||||
const inputRefWhenNotShowPop = ref();
|
||||
const placeholderWhenShowPop = ref("");
|
||||
const placeholderWhenNotShowPop = ref("");
|
||||
const optionLabelWhenShowPop = ref("");
|
||||
@ -52,41 +60,41 @@ const options = ref([]);
|
||||
const page = ref(0);
|
||||
const initOptions = (keyword) => {
|
||||
props
|
||||
.remoteMethod({
|
||||
[props.query.page]: page.value,
|
||||
[props.query.size]: 10,
|
||||
[props.query.searchKey]: keyword,
|
||||
})
|
||||
.then((rows) => {
|
||||
options.value = rows;
|
||||
});
|
||||
.remoteMethod({
|
||||
[props.query.page]: page.value,
|
||||
[props.query.size]: 10,
|
||||
[props.query.searchKey]: keyword,
|
||||
})
|
||||
.then((rows) => {
|
||||
options.value = rows;
|
||||
});
|
||||
};
|
||||
|
||||
const loadMore = async ($state) => {
|
||||
page.value++;
|
||||
props
|
||||
.remoteMethod({
|
||||
[props.query.page]: page.value,
|
||||
[props.query.size]: 10,
|
||||
[props.query.searchKey]: showPopOver.value
|
||||
? optionLabelWhenShowPop.value ?? null
|
||||
: null,
|
||||
})
|
||||
.then((rows) => {
|
||||
options.value.push(...rows);
|
||||
if (rows.length < 10) {
|
||||
$state.complete();
|
||||
} else {
|
||||
$state.loaded();
|
||||
}
|
||||
})
|
||||
.catch(() => {
|
||||
$state.error();
|
||||
});
|
||||
.remoteMethod({
|
||||
[props.query.page]: page.value,
|
||||
[props.query.size]: 10,
|
||||
[props.query.searchKey]: showPopOver.value
|
||||
? optionLabelWhenShowPop.value ?? null
|
||||
: null,
|
||||
})
|
||||
.then((rows) => {
|
||||
options.value.push(...rows);
|
||||
if (rows.length < 10) {
|
||||
$state.complete();
|
||||
} else {
|
||||
$state.loaded();
|
||||
}
|
||||
})
|
||||
.catch(() => {
|
||||
$state.error();
|
||||
});
|
||||
};
|
||||
|
||||
const handleInputClick = (event) => {
|
||||
event.stopPropagation()
|
||||
event.stopPropagation();
|
||||
showPopOver.value = true;
|
||||
placeholderWhenShowPop.value = optionLabelWhenNotShowPop.value;
|
||||
nextTick(() => {
|
||||
@ -136,12 +144,12 @@ watchEffect(() => {
|
||||
if (showPopOver.value) return;
|
||||
if (modelValue.value) {
|
||||
optionLabelWhenNotShowPop.value =
|
||||
options.value.find((el) => el[props.prop.value] === modelValue.value)?.[
|
||||
props.prop.label
|
||||
] ??
|
||||
(echoLabel.value.length ? echoLabel.value : null) ??
|
||||
props.defaultLabel ??
|
||||
"...";
|
||||
options.value.find((el) => el[props.prop.value] === modelValue.value)?.[
|
||||
props.prop.label
|
||||
] ??
|
||||
(echoLabel.value.length ? echoLabel.value : null) ??
|
||||
props.defaultLabel ??
|
||||
"...";
|
||||
} else {
|
||||
optionLabelWhenNotShowPop.value = "";
|
||||
placeholderWhenNotShowPop.value = props.placeholder;
|
||||
@ -152,7 +160,6 @@ watch(modelValue, (value) => {
|
||||
emit("change", value);
|
||||
});
|
||||
|
||||
|
||||
/**
|
||||
* 点击空白关闭弹出选项列表
|
||||
* @param event
|
||||
@ -173,17 +180,25 @@ onMounted(() => {
|
||||
page.value++;
|
||||
initOptions();
|
||||
document.body.addEventListener("click", handleBodyClick);
|
||||
watch(showPopOver, (show) => {
|
||||
if (show) {
|
||||
inputRefWhenNotShowPop.value?.input?.parentNode?.removeEventListener('click', handleInputClick)
|
||||
} else {
|
||||
nextTick(() => {
|
||||
inputRefWhenNotShowPop.value?.input?.parentNode?.addEventListener('click', handleInputClick)
|
||||
})
|
||||
|
||||
}
|
||||
}, {immediate: true})
|
||||
|
||||
watch(
|
||||
showPopOver,
|
||||
(show) => {
|
||||
if (show) {
|
||||
inputRefWhenNotShowPop.value?.input?.parentNode?.removeEventListener(
|
||||
"click",
|
||||
handleInputClick
|
||||
);
|
||||
} else {
|
||||
nextTick(() => {
|
||||
inputRefWhenNotShowPop.value?.input?.parentNode?.addEventListener(
|
||||
"click",
|
||||
handleInputClick
|
||||
);
|
||||
});
|
||||
}
|
||||
},
|
||||
{ immediate: true }
|
||||
);
|
||||
});
|
||||
|
||||
onUnmounted(() => {
|
||||
@ -193,48 +208,48 @@ onUnmounted(() => {
|
||||
|
||||
<template>
|
||||
<el-popover
|
||||
:popper-style="{
|
||||
:popper-style="{
|
||||
padding: 0,
|
||||
}"
|
||||
:visible="showPopOver"
|
||||
:width="width ?? 240"
|
||||
placement="bottom"
|
||||
:visible="showPopOver"
|
||||
:width="width ?? 240"
|
||||
placement="bottom"
|
||||
>
|
||||
<template #reference>
|
||||
<div :style="`width: ${width ?? 240}px`">
|
||||
<!--选项显示时-->
|
||||
<el-input
|
||||
v-if="showPopOver"
|
||||
ref="inputRefWhenShowPop"
|
||||
v-model="optionLabelWhenShowPop"
|
||||
:placeholder="placeholderWhenShowPop"
|
||||
:prefix-icon="prefixIcon"
|
||||
:size="size ?? 'default'"
|
||||
class="select-inner"
|
||||
suffix-icon="ArrowUp"
|
||||
@input="handleInputChange"
|
||||
@click.stop
|
||||
v-if="showPopOver"
|
||||
ref="inputRefWhenShowPop"
|
||||
v-model="optionLabelWhenShowPop"
|
||||
:placeholder="placeholderWhenShowPop"
|
||||
:prefix-icon="prefixIcon"
|
||||
:size="size ?? 'default'"
|
||||
class="select-inner"
|
||||
suffix-icon="ArrowUp"
|
||||
@input="handleInputChange"
|
||||
@click.stop
|
||||
>
|
||||
<template #prefix>
|
||||
<slot name="prefix"/>
|
||||
<slot name="prefix" />
|
||||
</template>
|
||||
</el-input>
|
||||
<!--选项隐藏时-->
|
||||
<el-input
|
||||
v-else
|
||||
ref="inputRefWhenNotShowPop"
|
||||
v-model="optionLabelWhenNotShowPop"
|
||||
:placeholder="placeholderWhenNotShowPop"
|
||||
:prefix-icon="prefixIcon"
|
||||
:size="size ?? 'default'"
|
||||
class="select-inner"
|
||||
clearable
|
||||
suffix-icon="ArrowDown"
|
||||
@clear="handleClearSeletion"
|
||||
v-else
|
||||
ref="inputRefWhenNotShowPop"
|
||||
v-model="optionLabelWhenNotShowPop"
|
||||
:placeholder="placeholderWhenNotShowPop"
|
||||
:prefix-icon="prefixIcon"
|
||||
:size="size ?? 'default'"
|
||||
class="select-inner"
|
||||
clearable
|
||||
suffix-icon="ArrowDown"
|
||||
@clear="handleClearSeletion"
|
||||
>
|
||||
<!-- @click.stop="handleFocus"-->
|
||||
<template #prefix>
|
||||
<slot name="prefix"/>
|
||||
<slot name="prefix" />
|
||||
</template>
|
||||
</el-input>
|
||||
</div>
|
||||
@ -242,12 +257,12 @@ onUnmounted(() => {
|
||||
<el-scrollbar class="options-wrap" height="260" @click.stop>
|
||||
<ul class="options">
|
||||
<li
|
||||
v-for="option in options"
|
||||
:key="option[prop.value]"
|
||||
:class="`option-item ${
|
||||
v-for="option in options"
|
||||
:key="option[prop.value]"
|
||||
:class="`option-item ${
|
||||
option[prop.value] === modelValue ? 'selected' : null
|
||||
}`"
|
||||
@click.stop="selectOption(option)"
|
||||
@click.stop="selectOption(option)"
|
||||
>
|
||||
{{ option[prop.label] }}
|
||||
</li>
|
||||
@ -258,7 +273,7 @@ onUnmounted(() => {
|
||||
</template>
|
||||
<template #complete>
|
||||
<div
|
||||
style="display: flex; justify-content: center; align-items: center"
|
||||
style="display: flex; justify-content: center; align-items: center"
|
||||
>
|
||||
-
|
||||
</div>
|
||||
|
@ -1,36 +1,75 @@
|
||||
export const sys_normal_disable = [{
|
||||
label: "正常", value: "1", elTagType: "success",
|
||||
}, {
|
||||
label: "禁用", value: "0", elTagType: "danger",
|
||||
},];
|
||||
export const sys_normal_disable = [
|
||||
{
|
||||
label: "正常",
|
||||
value: "1",
|
||||
elTagType: "success",
|
||||
},
|
||||
{
|
||||
label: "禁用",
|
||||
value: "0",
|
||||
elTagType: "danger",
|
||||
},
|
||||
];
|
||||
|
||||
export const sys_user_gender = [{
|
||||
label: "男", value: "0",
|
||||
}, {
|
||||
label: "女", value: "1",
|
||||
}, {
|
||||
label: "未知", value: "2",
|
||||
},];
|
||||
export const sys_user_gender = [
|
||||
{
|
||||
label: "男",
|
||||
value: "0",
|
||||
},
|
||||
{
|
||||
label: "女",
|
||||
value: "1",
|
||||
},
|
||||
{
|
||||
label: "未知",
|
||||
value: "2",
|
||||
},
|
||||
];
|
||||
|
||||
export const menu_show_hide = [{
|
||||
label: "隐藏", value: "0", elTagType: "warning",
|
||||
}, {
|
||||
label: "显示", value: "1", elTagType: "success",
|
||||
},];
|
||||
export const menu_show_hide = [
|
||||
{
|
||||
label: "隐藏",
|
||||
value: "0",
|
||||
elTagType: "warning",
|
||||
},
|
||||
{
|
||||
label: "显示",
|
||||
value: "1",
|
||||
elTagType: "success",
|
||||
},
|
||||
];
|
||||
|
||||
export const sys_yes_no = [{
|
||||
label: "否", value: "N",
|
||||
}, {
|
||||
label: "是", value: "Y", elTagType: "danger",
|
||||
},];
|
||||
export const sys_yes_no = [
|
||||
{
|
||||
label: "否",
|
||||
value: "N",
|
||||
},
|
||||
{
|
||||
label: "是",
|
||||
value: "Y",
|
||||
elTagType: "danger",
|
||||
},
|
||||
];
|
||||
|
||||
export const database_type_dict = [{
|
||||
label: "MySQL", value: "MySQL", elTagType: "",
|
||||
}, {
|
||||
label: "Oracle", value: "Oracle", elTagType: "",
|
||||
}, {
|
||||
label: "PostgreSQL", value: "PostgreSQL", elTagType: "",
|
||||
},
|
||||
{
|
||||
label: "Microsoft SQL Server", value: "Microsoft SQL Server", elTagType: "",
|
||||
}];
|
||||
export const database_type_dict = [
|
||||
{
|
||||
label: "MySQL",
|
||||
value: "MySQL",
|
||||
elTagType: "",
|
||||
},
|
||||
{
|
||||
label: "Oracle",
|
||||
value: "Oracle",
|
||||
elTagType: "",
|
||||
},
|
||||
{
|
||||
label: "PostgreSQL",
|
||||
value: "PostgreSQL",
|
||||
elTagType: "",
|
||||
},
|
||||
{
|
||||
label: "Microsoft SQL Server",
|
||||
value: "Microsoft SQL Server",
|
||||
elTagType: "",
|
||||
},
|
||||
];
|
||||
|
@ -78,6 +78,7 @@ const useUserStore = defineStore("user", {
|
||||
this.roles = [];
|
||||
this.permissions = [];
|
||||
this.userInfoRes = null;
|
||||
this.tenant = null;
|
||||
removeToken();
|
||||
resolve();
|
||||
})
|
||||
|
@ -1,226 +1,231 @@
|
||||
import axios from "axios";
|
||||
import {ElLoading, ElMessage, ElMessageBox, ElNotification,} from "element-plus";
|
||||
import {getToken} from "@/utils/auth";
|
||||
import {
|
||||
ElLoading,
|
||||
ElMessage,
|
||||
ElMessageBox,
|
||||
ElNotification,
|
||||
} from "element-plus";
|
||||
import { getToken } from "@/utils/auth";
|
||||
import errorCode from "@/utils/errorCode";
|
||||
import {blobValidate, tansParams} from "@/utils/ruoyi";
|
||||
import { blobValidate, tansParams } from "@/utils/ruoyi";
|
||||
import cache from "@/plugins/cache";
|
||||
import {saveAs} from "file-saver";
|
||||
import { saveAs } from "file-saver";
|
||||
import useUserStore from "@/store/modules/user";
|
||||
|
||||
let downloadLoadingInstance;
|
||||
// 是否显示重新登录
|
||||
export let isRelogin = {show: false};
|
||||
export let isRelogin = { show: false };
|
||||
|
||||
axios.defaults.headers["Content-Type"] = "application/json;charset=utf-8";
|
||||
// 创建axios实例
|
||||
const service = axios.create({
|
||||
// axios中请求配置有baseURL选项,表示请求URL公共部分
|
||||
baseURL: import.meta.env.VITE_APP_BASE_API,
|
||||
// 超时
|
||||
timeout: 10000,
|
||||
// axios中请求配置有baseURL选项,表示请求URL公共部分
|
||||
baseURL: import.meta.env.VITE_APP_BASE_API,
|
||||
// 超时
|
||||
timeout: 10000,
|
||||
});
|
||||
|
||||
// request拦截器
|
||||
service.interceptors.request.use(
|
||||
(config) => {
|
||||
// 是否需要设置 token
|
||||
const isToken = (config.headers || {}).isToken === false;
|
||||
// 是否需要防止数据重复提交
|
||||
const isRepeatSubmit = (config.headers || {}).repeatSubmit === false;
|
||||
if (getToken() && !isToken) {
|
||||
config.headers["Authorization"] = "Bearer " + getToken(); // 让每个请求携带自定义token 请根据实际情况自行修改
|
||||
}
|
||||
// if (useUserStore().tenant) {
|
||||
if (config.url === "/captchaImage") {
|
||||
config.headers["tenant"] = useUserStore().tempTenant;
|
||||
} else {
|
||||
config.headers["tenant"] = useUserStore().tenant;
|
||||
}
|
||||
// }
|
||||
// get请求映射params参数
|
||||
if (config.method === "get" && config.params) {
|
||||
let url = config.url + "?" + tansParams(config.params);
|
||||
url = url.slice(0, -1);
|
||||
config.params = {};
|
||||
config.url = url;
|
||||
}
|
||||
if (
|
||||
!isRepeatSubmit &&
|
||||
(config.method === "post" || config.method === "put")
|
||||
) {
|
||||
const requestObj = {
|
||||
url: config.url,
|
||||
data:
|
||||
typeof config.data === "object"
|
||||
? JSON.stringify(config.data)
|
||||
: config.data,
|
||||
time: new Date().getTime(),
|
||||
};
|
||||
const sessionObj = cache.session.getJSON("sessionObj");
|
||||
if (
|
||||
sessionObj === undefined ||
|
||||
sessionObj === null ||
|
||||
sessionObj === ""
|
||||
) {
|
||||
cache.session.setJSON("sessionObj", requestObj);
|
||||
} else {
|
||||
const s_url = sessionObj.url; // 请求地址
|
||||
const s_data = sessionObj.data; // 请求数据
|
||||
const s_time = sessionObj.time; // 请求时间
|
||||
const interval = 1000; // 间隔时间(ms),小于此时间视为重复提交
|
||||
if (
|
||||
s_data === requestObj.data &&
|
||||
requestObj.time - s_time < interval &&
|
||||
s_url === requestObj.url
|
||||
) {
|
||||
const message = "数据正在处理,请勿重复提交";
|
||||
console.warn(`[${s_url}]: ` + message);
|
||||
return Promise.reject(new Error(message));
|
||||
} else {
|
||||
cache.session.setJSON("sessionObj", requestObj);
|
||||
}
|
||||
}
|
||||
}
|
||||
return config;
|
||||
},
|
||||
(error) => {
|
||||
console.log(error);
|
||||
Promise.reject(error);
|
||||
(config) => {
|
||||
// 是否需要设置 token
|
||||
const isToken = (config.headers || {}).isToken === false;
|
||||
// 是否需要防止数据重复提交
|
||||
const isRepeatSubmit = (config.headers || {}).repeatSubmit === false;
|
||||
if (getToken() && !isToken) {
|
||||
config.headers["Authorization"] = "Bearer " + getToken(); // 让每个请求携带自定义token 请根据实际情况自行修改
|
||||
}
|
||||
// if (useUserStore().tenant) {
|
||||
if (config.url === "/captchaImage") {
|
||||
config.headers["tenant"] = useUserStore().tempTenant;
|
||||
} else {
|
||||
config.headers["tenant"] = useUserStore().tenant;
|
||||
}
|
||||
// }
|
||||
// get请求映射params参数
|
||||
if (config.method === "get" && config.params) {
|
||||
let url = config.url + "?" + tansParams(config.params);
|
||||
url = url.slice(0, -1);
|
||||
config.params = {};
|
||||
config.url = url;
|
||||
}
|
||||
if (
|
||||
!isRepeatSubmit &&
|
||||
(config.method === "post" || config.method === "put")
|
||||
) {
|
||||
const requestObj = {
|
||||
url: config.url,
|
||||
data:
|
||||
typeof config.data === "object"
|
||||
? JSON.stringify(config.data)
|
||||
: config.data,
|
||||
time: new Date().getTime(),
|
||||
};
|
||||
const sessionObj = cache.session.getJSON("sessionObj");
|
||||
if (
|
||||
sessionObj === undefined ||
|
||||
sessionObj === null ||
|
||||
sessionObj === ""
|
||||
) {
|
||||
cache.session.setJSON("sessionObj", requestObj);
|
||||
} else {
|
||||
const s_url = sessionObj.url; // 请求地址
|
||||
const s_data = sessionObj.data; // 请求数据
|
||||
const s_time = sessionObj.time; // 请求时间
|
||||
const interval = 1000; // 间隔时间(ms),小于此时间视为重复提交
|
||||
if (
|
||||
s_data === requestObj.data &&
|
||||
requestObj.time - s_time < interval &&
|
||||
s_url === requestObj.url
|
||||
) {
|
||||
const message = "数据正在处理,请勿重复提交";
|
||||
console.warn(`[${s_url}]: ` + message);
|
||||
return Promise.reject(new Error(message));
|
||||
} else {
|
||||
cache.session.setJSON("sessionObj", requestObj);
|
||||
}
|
||||
}
|
||||
}
|
||||
return config;
|
||||
},
|
||||
(error) => {
|
||||
console.log(error);
|
||||
Promise.reject(error);
|
||||
}
|
||||
);
|
||||
|
||||
// 响应拦截器
|
||||
service.interceptors.response.use(
|
||||
(res) => {
|
||||
// 未设置状态码则默认成功状态
|
||||
const code = res.data.code || 200;
|
||||
// 获取错误信息
|
||||
const msg = errorCode[code] || res.data.msg || errorCode["default"];
|
||||
// 二进制数据则直接返回
|
||||
if (
|
||||
res.request.responseType === "blob" ||
|
||||
res.request.responseType === "arraybuffer"
|
||||
) {
|
||||
return res.data;
|
||||
}
|
||||
if (code === 401 || code === 4011) {
|
||||
if (!isRelogin.show) {
|
||||
isRelogin.show = true;
|
||||
ElMessageBox.confirm(
|
||||
"登录状态已过期,您可以继续留在该页面,或者重新登录",
|
||||
"系统提示",
|
||||
{
|
||||
showCancelButton: false,
|
||||
showClose: false,
|
||||
confirmButtonText: "重新登录",
|
||||
closeOnClickModal: false,
|
||||
closeOnPressEscape: false,
|
||||
cancelButtonText: "取消",
|
||||
type: "warning",
|
||||
}
|
||||
)
|
||||
.then(() => {
|
||||
isRelogin.show = false;
|
||||
useUserStore()
|
||||
.abnormalLogOut()
|
||||
.then(() => {
|
||||
location.href = "/index";
|
||||
});
|
||||
})
|
||||
.catch(() => {
|
||||
isRelogin.show = false;
|
||||
});
|
||||
}
|
||||
return Promise.reject("无效的会话,或者会话已过期,请重新登录。");
|
||||
} else if (code === 4012) {
|
||||
if (!isRelogin.show) {
|
||||
isRelogin.show = true;
|
||||
ElMessageBox.confirm("您已被挤下线", "系统提示", {
|
||||
showCancelButton: false,
|
||||
showClose: false,
|
||||
confirmButtonText: "重新登录",
|
||||
closeOnClickModal: false,
|
||||
closeOnPressEscape: false,
|
||||
cancelButtonText: "取消",
|
||||
type: "warning",
|
||||
})
|
||||
.then(() => {
|
||||
isRelogin.show = false;
|
||||
useUserStore()
|
||||
.abnormalLogOut()
|
||||
.then(() => {
|
||||
location.href = "/index";
|
||||
});
|
||||
})
|
||||
.catch(() => {
|
||||
isRelogin.show = false;
|
||||
});
|
||||
}
|
||||
return Promise.reject("您已被挤下线");
|
||||
} else if (code === 500) {
|
||||
ElMessage({message: msg, type: "error"});
|
||||
return Promise.reject(new Error(msg));
|
||||
} else if (code === 601) {
|
||||
ElMessage({message: msg, type: "warning"});
|
||||
return Promise.reject(new Error(msg));
|
||||
} else if (code !== 200) {
|
||||
ElNotification.error({title: msg});
|
||||
return Promise.reject("error");
|
||||
} else {
|
||||
return Promise.resolve(res.data);
|
||||
}
|
||||
},
|
||||
(error) => {
|
||||
console.log("err" + error);
|
||||
let {message} = error;
|
||||
if (message == "Network Error") {
|
||||
message = "后端接口连接异常";
|
||||
} else if (message.includes("timeout")) {
|
||||
message = "系统接口请求超时";
|
||||
} else if (message.includes("Request failed with status code")) {
|
||||
message = "系统接口" + message.substr(message.length - 3) + "异常";
|
||||
}
|
||||
ElMessage({message: message, type: "error", duration: 5 * 1000});
|
||||
return Promise.reject(error);
|
||||
(res) => {
|
||||
// 未设置状态码则默认成功状态
|
||||
const code = res.data.code || 200;
|
||||
// 获取错误信息
|
||||
const msg = errorCode[code] || res.data.msg || errorCode["default"];
|
||||
// 二进制数据则直接返回
|
||||
if (
|
||||
res.request.responseType === "blob" ||
|
||||
res.request.responseType === "arraybuffer"
|
||||
) {
|
||||
return res.data;
|
||||
}
|
||||
if (code === 401 || code === 4011) {
|
||||
if (!isRelogin.show) {
|
||||
isRelogin.show = true;
|
||||
ElMessageBox.confirm(
|
||||
"登录状态已过期,您可以继续留在该页面,或者重新登录",
|
||||
"系统提示",
|
||||
{
|
||||
showCancelButton: false,
|
||||
showClose: false,
|
||||
confirmButtonText: "重新登录",
|
||||
closeOnClickModal: false,
|
||||
closeOnPressEscape: false,
|
||||
cancelButtonText: "取消",
|
||||
type: "warning",
|
||||
}
|
||||
)
|
||||
.then(() => {
|
||||
isRelogin.show = false;
|
||||
useUserStore()
|
||||
.abnormalLogOut()
|
||||
.then(() => {
|
||||
location.href = "/index";
|
||||
});
|
||||
})
|
||||
.catch(() => {
|
||||
isRelogin.show = false;
|
||||
});
|
||||
}
|
||||
return Promise.reject("无效的会话,或者会话已过期,请重新登录。");
|
||||
} else if (code === 4012) {
|
||||
if (!isRelogin.show) {
|
||||
isRelogin.show = true;
|
||||
ElMessageBox.confirm("您已被挤下线", "系统提示", {
|
||||
showCancelButton: false,
|
||||
showClose: false,
|
||||
confirmButtonText: "重新登录",
|
||||
closeOnClickModal: false,
|
||||
closeOnPressEscape: false,
|
||||
cancelButtonText: "取消",
|
||||
type: "warning",
|
||||
})
|
||||
.then(() => {
|
||||
isRelogin.show = false;
|
||||
useUserStore()
|
||||
.abnormalLogOut()
|
||||
.then(() => {
|
||||
location.href = "/index";
|
||||
});
|
||||
})
|
||||
.catch(() => {
|
||||
isRelogin.show = false;
|
||||
});
|
||||
}
|
||||
return Promise.reject("您已被挤下线");
|
||||
} else if (code === 500) {
|
||||
ElMessage({ message: msg, type: "error" });
|
||||
return Promise.reject(new Error(msg));
|
||||
} else if (code === 601) {
|
||||
ElMessage({ message: msg, type: "warning" });
|
||||
return Promise.reject(new Error(msg));
|
||||
} else if (code !== 200) {
|
||||
ElNotification.error({ title: msg });
|
||||
return Promise.reject("error");
|
||||
} else {
|
||||
return Promise.resolve(res.data);
|
||||
}
|
||||
},
|
||||
(error) => {
|
||||
console.log("err" + error);
|
||||
let { message } = error;
|
||||
if (message == "Network Error") {
|
||||
message = "后端接口连接异常";
|
||||
} else if (message.includes("timeout")) {
|
||||
message = "系统接口请求超时";
|
||||
} else if (message.includes("Request failed with status code")) {
|
||||
message = "系统接口" + message.substr(message.length - 3) + "异常";
|
||||
}
|
||||
ElMessage({ message: message, type: "error", duration: 5 * 1000 });
|
||||
return Promise.reject(error);
|
||||
}
|
||||
);
|
||||
|
||||
// 通用下载方法
|
||||
export function download(url, params, filename, config) {
|
||||
downloadLoadingInstance = ElLoading.service({
|
||||
text: "正在下载数据,请稍候",
|
||||
background: "rgba(0, 0, 0, 0.7)",
|
||||
downloadLoadingInstance = ElLoading.service({
|
||||
text: "正在下载数据,请稍候",
|
||||
background: "rgba(0, 0, 0, 0.7)",
|
||||
});
|
||||
return service
|
||||
.post(url, params, {
|
||||
transformRequest: [
|
||||
(params) => {
|
||||
return tansParams(params);
|
||||
},
|
||||
],
|
||||
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
||||
responseType: "blob",
|
||||
...config,
|
||||
})
|
||||
.then(async (data) => {
|
||||
const isBlob = blobValidate(data);
|
||||
if (isBlob) {
|
||||
const blob = new Blob([data]);
|
||||
saveAs(blob, filename);
|
||||
} else {
|
||||
const resText = await data.text();
|
||||
const rspObj = JSON.parse(resText);
|
||||
const errMsg =
|
||||
errorCode[rspObj.code] || rspObj.msg || errorCode["default"];
|
||||
ElMessage.error(errMsg);
|
||||
}
|
||||
downloadLoadingInstance.close();
|
||||
})
|
||||
.catch((r) => {
|
||||
console.error(r);
|
||||
ElMessage.error("下载文件出现错误,请联系管理员!");
|
||||
downloadLoadingInstance.close();
|
||||
});
|
||||
return service
|
||||
.post(url, params, {
|
||||
transformRequest: [
|
||||
(params) => {
|
||||
return tansParams(params);
|
||||
},
|
||||
],
|
||||
headers: {"Content-Type": "application/x-www-form-urlencoded"},
|
||||
responseType: "blob",
|
||||
...config,
|
||||
})
|
||||
.then(async (data) => {
|
||||
const isBlob = blobValidate(data);
|
||||
if (isBlob) {
|
||||
const blob = new Blob([data]);
|
||||
saveAs(blob, filename);
|
||||
} else {
|
||||
const resText = await data.text();
|
||||
const rspObj = JSON.parse(resText);
|
||||
const errMsg =
|
||||
errorCode[rspObj.code] || rspObj.msg || errorCode["default"];
|
||||
ElMessage.error(errMsg);
|
||||
}
|
||||
downloadLoadingInstance.close();
|
||||
})
|
||||
.catch((r) => {
|
||||
console.error(r);
|
||||
ElMessage.error("下载文件出现错误,请联系管理员!");
|
||||
downloadLoadingInstance.close();
|
||||
});
|
||||
}
|
||||
|
||||
export default service;
|
||||
|
@ -1,31 +1,31 @@
|
||||
<template>
|
||||
<div class="login">
|
||||
<el-form
|
||||
ref="loginRef"
|
||||
:model="loginForm"
|
||||
:rules="loginRules"
|
||||
class="login-form"
|
||||
ref="loginRef"
|
||||
:model="loginForm"
|
||||
:rules="loginRules"
|
||||
class="login-form"
|
||||
>
|
||||
<h3 class="title">若依后台管理系统</h3>
|
||||
<el-form-item prop="tenant">
|
||||
<paged-select
|
||||
v-model="loginForm.tenant"
|
||||
:default-label="defaultTenantNamt"
|
||||
:prop="{
|
||||
v-model="loginForm.tenant"
|
||||
:default-label="defaultTenantNamt"
|
||||
:prop="{
|
||||
label: 'companyName',
|
||||
value: 'tenantId',
|
||||
}"
|
||||
:query="{
|
||||
:query="{
|
||||
page: 'pageNum',
|
||||
size: 'pageSize',
|
||||
searchKey: 'companyName',
|
||||
}"
|
||||
:remote-method="loadTenantOptions"
|
||||
:width="350"
|
||||
prefix-icon="OfficeBuilding"
|
||||
size="large"
|
||||
@change="handleTenantChange"
|
||||
@confirm="handleTenantConfirm"
|
||||
:remote-method="loadTenantOptions"
|
||||
:width="350"
|
||||
prefix-icon="OfficeBuilding"
|
||||
size="large"
|
||||
@change="handleTenantChange"
|
||||
@confirm="handleTenantConfirm"
|
||||
/>
|
||||
<!-- <el-input-->
|
||||
<!-- v-model="loginForm.tenant"-->
|
||||
@ -41,70 +41,70 @@
|
||||
</el-form-item>
|
||||
<el-form-item prop="username">
|
||||
<el-input
|
||||
v-model="loginForm.username"
|
||||
auto-complete="off"
|
||||
placeholder="账号"
|
||||
size="large"
|
||||
type="text"
|
||||
v-model="loginForm.username"
|
||||
auto-complete="off"
|
||||
placeholder="账号"
|
||||
size="large"
|
||||
type="text"
|
||||
>
|
||||
<template #prefix>
|
||||
<svg-icon class="el-input__icon input-icon" icon-class="user"/>
|
||||
<svg-icon class="el-input__icon input-icon" icon-class="user" />
|
||||
</template>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
<el-form-item prop="password">
|
||||
<el-input
|
||||
v-model="loginForm.password"
|
||||
auto-complete="off"
|
||||
placeholder="密码"
|
||||
size="large"
|
||||
type="password"
|
||||
@keyup.enter="handleLogin"
|
||||
v-model="loginForm.password"
|
||||
auto-complete="off"
|
||||
placeholder="密码"
|
||||
size="large"
|
||||
type="password"
|
||||
@keyup.enter="handleLogin"
|
||||
>
|
||||
<template #prefix>
|
||||
<svg-icon class="el-input__icon input-icon" icon-class="password"/>
|
||||
<svg-icon class="el-input__icon input-icon" icon-class="password" />
|
||||
</template>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
<el-form-item v-if="captchaEnabled && loginForm.tenant" prop="code">
|
||||
<el-input
|
||||
v-model="loginForm.code"
|
||||
auto-complete="off"
|
||||
placeholder="验证码"
|
||||
size="large"
|
||||
style="width: 63%"
|
||||
@keyup.enter="handleLogin"
|
||||
v-model="loginForm.code"
|
||||
auto-complete="off"
|
||||
placeholder="验证码"
|
||||
size="large"
|
||||
style="width: 63%"
|
||||
@keyup.enter="handleLogin"
|
||||
>
|
||||
<template #prefix>
|
||||
<svg-icon
|
||||
class="el-input__icon input-icon"
|
||||
icon-class="validCode"
|
||||
class="el-input__icon input-icon"
|
||||
icon-class="validCode"
|
||||
/>
|
||||
</template>
|
||||
</el-input>
|
||||
<div class="login-code">
|
||||
<img :src="codeUrl" class="login-code-img" @click="getCode"/>
|
||||
<img :src="codeUrl" class="login-code-img" @click="getCode" />
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-checkbox
|
||||
v-model="loginForm.rememberMe"
|
||||
style="margin: 0px 0px 25px 0px"
|
||||
>记住密码
|
||||
v-model="loginForm.rememberMe"
|
||||
style="margin: 0px 0px 25px 0px"
|
||||
>记住密码
|
||||
</el-checkbox>
|
||||
<el-form-item style="width: 100%">
|
||||
<el-button
|
||||
:loading="loading"
|
||||
size="large"
|
||||
style="width: 100%"
|
||||
type="primary"
|
||||
@click.prevent="handleLogin"
|
||||
:loading="loading"
|
||||
size="large"
|
||||
style="width: 100%"
|
||||
type="primary"
|
||||
@click.prevent="handleLogin"
|
||||
>
|
||||
<span v-if="!loading">登 录</span>
|
||||
<span v-else>登 录 中...</span>
|
||||
</el-button>
|
||||
<div v-if="register" style="float: right">
|
||||
<router-link :to="'/register'" class="link-type"
|
||||
>立即注册
|
||||
>立即注册
|
||||
</router-link>
|
||||
</div>
|
||||
</el-form-item>
|
||||
@ -117,16 +117,16 @@
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import {getCodeImg, getTenantNormalList} from "@/api/login";
|
||||
import { getCodeImg, getTenantNormalList } from "@/api/login";
|
||||
import Cookies from "js-cookie";
|
||||
import {decrypt, encrypt} from "@/utils/jsencrypt";
|
||||
import { decrypt, encrypt } from "@/utils/jsencrypt";
|
||||
import useUserStore from "@/store/modules/user";
|
||||
import PagedSelect from "@/components/InfiniteSelect";
|
||||
import {getCurrentInstance, ref, watchEffect} from "vue";
|
||||
import { getCurrentInstance, ref, watchEffect } from "vue";
|
||||
|
||||
const userStore = useUserStore();
|
||||
const router = useRouter();
|
||||
const {proxy} = getCurrentInstance();
|
||||
const { proxy } = getCurrentInstance();
|
||||
|
||||
const loginForm = ref({
|
||||
tenant: "",
|
||||
@ -138,10 +138,10 @@ const loginForm = ref({
|
||||
});
|
||||
|
||||
const loginRules = {
|
||||
tenant: [{required: true, trigger: "change", message: "请选择租户"}],
|
||||
username: [{required: true, trigger: "blur", message: "请输入您的账号"}],
|
||||
password: [{required: true, trigger: "blur", message: "请输入您的密码"}],
|
||||
code: [{required: true, trigger: "change", message: "请输入验证码"}],
|
||||
tenant: [{ required: true, trigger: "change", message: "请选择租户" }],
|
||||
username: [{ required: true, trigger: "blur", message: "请输入您的账号" }],
|
||||
password: [{ required: true, trigger: "blur", message: "请输入您的密码" }],
|
||||
code: [{ required: true, trigger: "change", message: "请输入验证码" }],
|
||||
};
|
||||
const defaultTenantNamt = ref("");
|
||||
const codeUrl = ref("");
|
||||
@ -158,12 +158,12 @@ function handleLogin() {
|
||||
loading.value = true;
|
||||
// 勾选了需要记住密码设置在 cookie 中设置记住用户名和密码
|
||||
if (loginForm.value.rememberMe) {
|
||||
Cookies.set("tenant", loginForm.value.tenant, {expires: 30});
|
||||
Cookies.set("username", loginForm.value.username, {expires: 30});
|
||||
Cookies.set("tenant", loginForm.value.tenant, { expires: 30 });
|
||||
Cookies.set("username", loginForm.value.username, { expires: 30 });
|
||||
Cookies.set("password", encrypt(loginForm.value.password), {
|
||||
expires: 30,
|
||||
});
|
||||
Cookies.set("rememberMe", loginForm.value.rememberMe, {expires: 30});
|
||||
Cookies.set("rememberMe", loginForm.value.rememberMe, { expires: 30 });
|
||||
} else {
|
||||
// 否则移除
|
||||
Cookies.remove("tenant");
|
||||
@ -173,17 +173,17 @@ function handleLogin() {
|
||||
}
|
||||
// 调用action的登录方法
|
||||
userStore
|
||||
.login(loginForm.value)
|
||||
.then(() => {
|
||||
router.push({path: redirect.value || "/"});
|
||||
})
|
||||
.catch(() => {
|
||||
loading.value = false;
|
||||
// 重新获取验证码
|
||||
if (captchaEnabled.value) {
|
||||
getCode();
|
||||
}
|
||||
});
|
||||
.login(loginForm.value)
|
||||
.then(() => {
|
||||
router.push({ path: redirect.value || "/" });
|
||||
})
|
||||
.catch(() => {
|
||||
loading.value = false;
|
||||
// 重新获取验证码
|
||||
if (captchaEnabled.value) {
|
||||
getCode();
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
@ -191,7 +191,7 @@ function handleLogin() {
|
||||
function getCode() {
|
||||
getCodeImg().then((res) => {
|
||||
captchaEnabled.value =
|
||||
res.captchaEnabled === undefined ? true : res.captchaEnabled;
|
||||
res.captchaEnabled === undefined ? true : res.captchaEnabled;
|
||||
register.value = res.register === undefined ? true : res.register;
|
||||
if (captchaEnabled.value) {
|
||||
codeUrl.value = "data:image/gif;base64," + res.img;
|
||||
@ -207,14 +207,14 @@ function getCookie() {
|
||||
loginForm.value = {
|
||||
username: username === undefined ? loginForm.value.username : username,
|
||||
password:
|
||||
password === undefined ? loginForm.value.password : decrypt(password),
|
||||
password === undefined ? loginForm.value.password : decrypt(password),
|
||||
rememberMe: rememberMe === undefined ? false : Boolean(rememberMe),
|
||||
tenant: useUserStore().tempTenant ?? "",
|
||||
};
|
||||
}
|
||||
|
||||
const loadTenantOptions = (query) =>
|
||||
getTenantNormalList(query).then((resp) => resp.rows);
|
||||
getTenantNormalList(query).then((resp) => resp.rows);
|
||||
|
||||
const handleTenantChange = (value) => {
|
||||
console.log(value);
|
||||
@ -231,12 +231,12 @@ const handleTenantConfirm = (option) => {
|
||||
};
|
||||
|
||||
watchEffect(() => {
|
||||
console.log(loginForm.value.tenant)
|
||||
console.log(loginForm.value.tenant);
|
||||
if (loginForm.value.tenant) {
|
||||
console.log('getcode')
|
||||
console.log("getcode");
|
||||
getCode();
|
||||
}
|
||||
})
|
||||
});
|
||||
getCookie();
|
||||
defaultTenantNamt.value = useUserStore().tempTenantName;
|
||||
</script>
|
||||
|
@ -3,110 +3,106 @@
|
||||
<el-form ref="queryRef" :inline="true" :model="queryParams">
|
||||
<el-form-item label="用户名称" prop="username">
|
||||
<el-input
|
||||
v-model="queryParams.username"
|
||||
clearable
|
||||
placeholder="请输入用户名称"
|
||||
style="width: 200px"
|
||||
@keyup.enter="handleQuery"
|
||||
v-model="queryParams.username"
|
||||
clearable
|
||||
placeholder="请输入用户名称"
|
||||
style="width: 200px"
|
||||
@keyup.enter="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button icon="Search" type="primary" @click="handleQuery"
|
||||
>搜索
|
||||
</el-button
|
||||
>
|
||||
>搜索
|
||||
</el-button>
|
||||
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<el-table
|
||||
v-loading="loading"
|
||||
:data="onlineList"
|
||||
style="width: 100%"
|
||||
>
|
||||
<el-table v-loading="loading" :data="onlineList" style="width: 100%">
|
||||
<el-table-column align="center" label="序号" type="index" width="100">
|
||||
<template #default="scope">
|
||||
<span>{{ (queryParams.pageNum - 1) * queryParams.pageSize + scope.$index + 1 }}</span>
|
||||
<span>{{
|
||||
(queryParams.pageNum - 1) * queryParams.pageSize + scope.$index + 1
|
||||
}}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
:show-overflow-tooltip="true"
|
||||
align="center"
|
||||
label="会话编号"
|
||||
prop="deviceSn"
|
||||
:show-overflow-tooltip="true"
|
||||
align="center"
|
||||
label="会话编号"
|
||||
prop="deviceSn"
|
||||
/>
|
||||
<el-table-column
|
||||
:show-overflow-tooltip="true"
|
||||
align="center"
|
||||
label="登录名称"
|
||||
prop="username"
|
||||
:show-overflow-tooltip="true"
|
||||
align="center"
|
||||
label="登录名称"
|
||||
prop="username"
|
||||
/>
|
||||
<el-table-column
|
||||
:show-overflow-tooltip="true"
|
||||
align="center"
|
||||
label="主机"
|
||||
prop="ip"
|
||||
:show-overflow-tooltip="true"
|
||||
align="center"
|
||||
label="主机"
|
||||
prop="ip"
|
||||
/>
|
||||
<el-table-column
|
||||
:show-overflow-tooltip="true"
|
||||
align="center"
|
||||
label="登录地点"
|
||||
prop="address"
|
||||
:show-overflow-tooltip="true"
|
||||
align="center"
|
||||
label="登录地点"
|
||||
prop="address"
|
||||
/>
|
||||
<el-table-column
|
||||
:show-overflow-tooltip="true"
|
||||
align="center"
|
||||
label="操作系统"
|
||||
prop="os"
|
||||
:show-overflow-tooltip="true"
|
||||
align="center"
|
||||
label="操作系统"
|
||||
prop="os"
|
||||
/>
|
||||
<el-table-column
|
||||
:show-overflow-tooltip="true"
|
||||
align="center"
|
||||
label="浏览器"
|
||||
prop="browser"
|
||||
:show-overflow-tooltip="true"
|
||||
align="center"
|
||||
label="浏览器"
|
||||
prop="browser"
|
||||
/>
|
||||
<el-table-column
|
||||
align="center"
|
||||
label="登录时间"
|
||||
prop="loginTime"
|
||||
width="180"
|
||||
align="center"
|
||||
label="登录时间"
|
||||
prop="loginTime"
|
||||
width="180"
|
||||
>
|
||||
<template #default="scope">
|
||||
<span>{{ parseTime(scope.row.loginTime) }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
align="center"
|
||||
class-name="small-padding fixed-width"
|
||||
label="操作"
|
||||
align="center"
|
||||
class-name="small-padding fixed-width"
|
||||
label="操作"
|
||||
>
|
||||
<template #default="scope">
|
||||
<el-button
|
||||
v-hasPermi="['monitor:online:forceLogout']"
|
||||
icon="Delete"
|
||||
link
|
||||
type="primary"
|
||||
@click="handleForceLogout(scope.row)"
|
||||
>强退
|
||||
</el-button
|
||||
>
|
||||
v-hasPermi="['monitor:online:forceLogout']"
|
||||
icon="Delete"
|
||||
link
|
||||
type="primary"
|
||||
@click="handleForceLogout(scope.row)"
|
||||
>强退
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<pagination
|
||||
v-show="total > 0"
|
||||
v-model:limit="queryParams.pageSize"
|
||||
v-model:page="queryParams.pageNum"
|
||||
:total="total"
|
||||
@pagination="getList"
|
||||
v-show="total > 0"
|
||||
v-model:limit="queryParams.pageSize"
|
||||
v-model:page="queryParams.pageNum"
|
||||
:total="total"
|
||||
@pagination="getList"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script name="Online" setup>
|
||||
import {forceLogout, list as initData} from "@/api/monitor/online";
|
||||
import { forceLogout, list as initData } from "@/api/monitor/online";
|
||||
|
||||
const {proxy} = getCurrentInstance();
|
||||
const { proxy } = getCurrentInstance();
|
||||
|
||||
const onlineList = ref([]);
|
||||
const loading = ref(true);
|
||||
@ -145,16 +141,15 @@ function resetQuery() {
|
||||
/** 强退按钮操作 */
|
||||
function handleForceLogout(row) {
|
||||
proxy.$modal
|
||||
.confirm('是否确认强退名称为"' + row.username + '"的用户?')
|
||||
.then(function () {
|
||||
return forceLogout(row.username, row.deviceSn);
|
||||
})
|
||||
.then(() => {
|
||||
getList();
|
||||
proxy.$modal.msgSuccess("删除成功");
|
||||
})
|
||||
.catch(() => {
|
||||
});
|
||||
.confirm('是否确认强退名称为"' + row.username + '"的用户?')
|
||||
.then(function () {
|
||||
return forceLogout(row.username, row.deviceSn);
|
||||
})
|
||||
.then(() => {
|
||||
getList();
|
||||
proxy.$modal.msgSuccess("删除成功");
|
||||
})
|
||||
.catch(() => {});
|
||||
}
|
||||
|
||||
getList();
|
||||
|
@ -1,33 +1,32 @@
|
||||
<template>
|
||||
<div class="app-container">
|
||||
<el-form
|
||||
v-show="showSearch"
|
||||
ref="queryRef"
|
||||
:inline="true"
|
||||
:model="queryParams"
|
||||
label-width="68px"
|
||||
v-show="showSearch"
|
||||
ref="queryRef"
|
||||
:inline="true"
|
||||
:model="queryParams"
|
||||
label-width="68px"
|
||||
>
|
||||
<el-form-item label="公司名称" prop="companyName">
|
||||
<el-input
|
||||
v-model="queryParams.companyName"
|
||||
clearable
|
||||
placeholder="请输入公司名称"
|
||||
@keyup.enter="handleQuery"
|
||||
v-model="queryParams.companyName"
|
||||
clearable
|
||||
placeholder="请输入公司名称"
|
||||
@keyup.enter="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="联系人" prop="contactName">
|
||||
<el-input
|
||||
v-model="queryParams.contactName"
|
||||
clearable
|
||||
placeholder="请输入联系人名称"
|
||||
@keyup.enter="handleQuery"
|
||||
v-model="queryParams.contactName"
|
||||
clearable
|
||||
placeholder="请输入联系人名称"
|
||||
@keyup.enter="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button icon="Search" type="primary" @click="handleQuery"
|
||||
>搜索
|
||||
</el-button
|
||||
>
|
||||
>搜索
|
||||
</el-button>
|
||||
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
@ -35,172 +34,165 @@
|
||||
<el-row :gutter="10" class="mb8">
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
v-hasPermi="['tenant:add']"
|
||||
icon="Plus"
|
||||
plain
|
||||
type="primary"
|
||||
@click="handleAdd"
|
||||
>新增
|
||||
</el-button
|
||||
>
|
||||
v-hasPermi="['tenant:add']"
|
||||
icon="Plus"
|
||||
plain
|
||||
type="primary"
|
||||
@click="handleAdd"
|
||||
>新增
|
||||
</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
v-hasPermi="['tenant:edit']"
|
||||
:disabled="single"
|
||||
icon="Edit"
|
||||
plain
|
||||
type="success"
|
||||
@click="handleUpdate"
|
||||
>修改
|
||||
</el-button
|
||||
>
|
||||
v-hasPermi="['tenant:edit']"
|
||||
:disabled="single"
|
||||
icon="Edit"
|
||||
plain
|
||||
type="success"
|
||||
@click="handleUpdate"
|
||||
>修改
|
||||
</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
v-hasPermi="['tenant:remove']"
|
||||
:disabled="multiple"
|
||||
icon="Delete"
|
||||
plain
|
||||
type="danger"
|
||||
@click="handleDelete"
|
||||
>删除
|
||||
</el-button
|
||||
>
|
||||
v-hasPermi="['tenant:remove']"
|
||||
:disabled="multiple"
|
||||
icon="Delete"
|
||||
plain
|
||||
type="danger"
|
||||
@click="handleDelete"
|
||||
>删除
|
||||
</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
v-hasPermi="['tenant:export']"
|
||||
icon="Download"
|
||||
plain
|
||||
type="warning"
|
||||
@click="handleExport"
|
||||
>导出
|
||||
</el-button
|
||||
>
|
||||
v-hasPermi="['tenant:export']"
|
||||
icon="Download"
|
||||
plain
|
||||
type="warning"
|
||||
@click="handleExport"
|
||||
>导出
|
||||
</el-button>
|
||||
</el-col>
|
||||
<right-toolbar
|
||||
v-model:showSearch="showSearch"
|
||||
@queryTable="getList"
|
||||
v-model:showSearch="showSearch"
|
||||
@queryTable="getList"
|
||||
></right-toolbar>
|
||||
</el-row>
|
||||
|
||||
<el-table
|
||||
v-loading="loading"
|
||||
:data="tenantList"
|
||||
@selection-change="handleSelectionChange"
|
||||
v-loading="loading"
|
||||
:data="tenantList"
|
||||
@selection-change="handleSelectionChange"
|
||||
>
|
||||
<el-table-column align="center" type="selection" width="55"/>
|
||||
<el-table-column align="center" label="编码" prop="tenantId"/>
|
||||
<el-table-column align="center" label="公司名称" prop="companyName"/>
|
||||
<el-table-column align="center" label="联系人名称" prop="contactName"/>
|
||||
<el-table-column align="center" label="联系人电话" prop="contactPhone"/>
|
||||
<el-table-column align="center" label="公司地址" prop="address"/>
|
||||
<el-table-column align="center" type="selection" width="55" />
|
||||
<el-table-column align="center" label="编码" prop="tenantId" />
|
||||
<el-table-column align="center" label="公司名称" prop="companyName" />
|
||||
<el-table-column align="center" label="联系人名称" prop="contactName" />
|
||||
<el-table-column align="center" label="联系人电话" prop="contactPhone" />
|
||||
<el-table-column align="center" label="公司地址" prop="address" />
|
||||
<el-table-column
|
||||
align="center"
|
||||
label="过期时间"
|
||||
prop="expireTime"
|
||||
width="180"
|
||||
align="center"
|
||||
label="过期时间"
|
||||
prop="expireTime"
|
||||
width="180"
|
||||
>
|
||||
<template #default="scope">
|
||||
<span>{{ parseTime(scope.row.expireTime, "{y}-{m}-{d}") }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" label="用户数量" prop="accountCount"/>
|
||||
<el-table-column align="center" label="状态" prop="status"/>
|
||||
<el-table-column align="center" label="用户数量" prop="accountCount" />
|
||||
<el-table-column align="center" label="状态" prop="status" />
|
||||
<el-table-column
|
||||
align="center"
|
||||
class-name="small-padding fixed-width"
|
||||
label="操作"
|
||||
align="center"
|
||||
class-name="small-padding fixed-width"
|
||||
label="操作"
|
||||
>
|
||||
<template #default="scope">
|
||||
<el-button
|
||||
icon="Setting"
|
||||
link
|
||||
type="primary"
|
||||
@click="handleSetting(scope.row)"
|
||||
>设置
|
||||
</el-button
|
||||
>
|
||||
icon="Setting"
|
||||
link
|
||||
type="primary"
|
||||
@click="handleSetting(scope.row)"
|
||||
>设置
|
||||
</el-button>
|
||||
<el-button
|
||||
v-hasPermi="['tenant:edit']"
|
||||
icon="Edit"
|
||||
link
|
||||
type="primary"
|
||||
@click="handleUpdate(scope.row)"
|
||||
>修改
|
||||
</el-button
|
||||
>
|
||||
v-hasPermi="['tenant:edit']"
|
||||
icon="Edit"
|
||||
link
|
||||
type="primary"
|
||||
@click="handleUpdate(scope.row)"
|
||||
>修改
|
||||
</el-button>
|
||||
<el-button
|
||||
v-hasPermi="['tenant:remove']"
|
||||
icon="Delete"
|
||||
link
|
||||
type="primary"
|
||||
@click="handleDelete(scope.row)"
|
||||
>删除
|
||||
</el-button
|
||||
>
|
||||
v-hasPermi="['tenant:remove']"
|
||||
icon="Delete"
|
||||
link
|
||||
type="primary"
|
||||
@click="handleDelete(scope.row)"
|
||||
>删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<pagination
|
||||
v-show="total > 0"
|
||||
v-model:limit="queryParams.pageSize"
|
||||
v-model:page="queryParams.pageNum"
|
||||
:total="total"
|
||||
@pagination="getList"
|
||||
v-show="total > 0"
|
||||
v-model:limit="queryParams.pageSize"
|
||||
v-model:page="queryParams.pageNum"
|
||||
:total="total"
|
||||
@pagination="getList"
|
||||
/>
|
||||
|
||||
<!-- 添加或修改租户对话框 -->
|
||||
<el-dialog v-model="open" :title="title" append-to-body width="500px">
|
||||
<el-form ref="tenantRef" :model="form" :rules="rules" label-width="130px">
|
||||
<el-form-item label="公司名称" prop="companyName">
|
||||
<el-input v-model="form.companyName" placeholder="请输入公司名称"/>
|
||||
<el-input v-model="form.companyName" placeholder="请输入公司名称" />
|
||||
</el-form-item>
|
||||
<el-form-item label="联系人名称" prop="contactName">
|
||||
<el-input v-model="form.contactName" placeholder="请输入联系人名称"/>
|
||||
<el-input v-model="form.contactName" placeholder="请输入联系人名称" />
|
||||
</el-form-item>
|
||||
<el-form-item label="联系人电话" prop="contactPhone">
|
||||
<el-input
|
||||
v-model="form.contactPhone"
|
||||
placeholder="请输入联系人电话"
|
||||
v-model="form.contactPhone"
|
||||
placeholder="请输入联系人电话"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="公司地址" prop="address">
|
||||
<el-input v-model="form.address" placeholder="请输入公司地址"/>
|
||||
<el-input v-model="form.address" placeholder="请输入公司地址" />
|
||||
</el-form-item>
|
||||
<el-form-item label="公司简介" prop="profile">
|
||||
<el-input
|
||||
v-model="form.profile"
|
||||
placeholder="请输入内容"
|
||||
type="textarea"
|
||||
v-model="form.profile"
|
||||
placeholder="请输入内容"
|
||||
type="textarea"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="统一社会信用代码" prop="licenseNumber">
|
||||
<el-input
|
||||
v-model="form.licenseNumber"
|
||||
placeholder="请输入统一社会信用代码"
|
||||
v-model="form.licenseNumber"
|
||||
placeholder="请输入统一社会信用代码"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="过期时间" prop="expireTime">
|
||||
<el-date-picker
|
||||
v-model="form.expireTime"
|
||||
clearable
|
||||
placeholder="请选择过期时间"
|
||||
type="datetime"
|
||||
value-format="YYYY-MM-DD HH:mm:ss"
|
||||
v-model="form.expireTime"
|
||||
clearable
|
||||
placeholder="请选择过期时间"
|
||||
type="datetime"
|
||||
value-format="YYYY-MM-DD HH:mm:ss"
|
||||
>
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
<el-form-item label="用户数量" prop="accountCount">
|
||||
<el-input v-model="form.accountCount" placeholder="请输入用户数量"/>
|
||||
<el-input v-model="form.accountCount" placeholder="请输入用户数量" />
|
||||
</el-form-item>
|
||||
<el-form-item label="备注" prop="remark">
|
||||
<el-input
|
||||
v-model="form.remark"
|
||||
placeholder="请输入内容"
|
||||
type="textarea"
|
||||
v-model="form.remark"
|
||||
placeholder="请输入内容"
|
||||
type="textarea"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
@ -213,8 +205,18 @@
|
||||
</el-dialog>
|
||||
|
||||
<!-- 添加或修改租户对话框 -->
|
||||
<el-dialog v-model="showTenantSetting" append-to-body title="租户设置" width="500px">
|
||||
<el-form ref="tenantSettingRef" :model="tenantSettingForm" :rules="tenantSettingRules" label-width="130px">
|
||||
<el-dialog
|
||||
v-model="showTenantSetting"
|
||||
append-to-body
|
||||
title="租户设置"
|
||||
width="500px"
|
||||
>
|
||||
<el-form
|
||||
ref="tenantSettingRef"
|
||||
:model="tenantSettingForm"
|
||||
:rules="tenantSettingRules"
|
||||
label-width="130px"
|
||||
>
|
||||
<!--TODO:-->
|
||||
<el-form-item label="模式">
|
||||
<el-radio-group v-model="tenantSettingForm.mode">
|
||||
@ -223,20 +225,42 @@
|
||||
<el-radio label="3">数据源</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<template v-if="tenantSettingForm.mode==='3'">
|
||||
<div v-for="item in tenantSettingForm.datasourceList" :key="`${item.ip}-${item.port}-${item.name}`"
|
||||
class="data-source-item">
|
||||
<template v-if="tenantSettingForm.mode === '3'">
|
||||
<div
|
||||
v-for="item in tenantSettingForm.datasourceList"
|
||||
:key="`${item.ip}-${item.port}-${item.name}`"
|
||||
class="data-source-item"
|
||||
>
|
||||
<div class="left">
|
||||
<div class="database-type">{{ "MySQL" }}</div>
|
||||
<div class="database-url">{{ "127.0.0.1" }} : {{ 3306 }}</div>
|
||||
<div class="database-name">{{ "ry-vue" }}</div>
|
||||
</div>
|
||||
<div class="right">
|
||||
<el-button circle icon="edit" plain size="small" type="primary"></el-button>
|
||||
<el-button circle icon="delete" plain size="small" type="danger"></el-button>
|
||||
<el-button
|
||||
circle
|
||||
icon="edit"
|
||||
plain
|
||||
size="small"
|
||||
type="primary"
|
||||
></el-button>
|
||||
<el-button
|
||||
circle
|
||||
icon="delete"
|
||||
plain
|
||||
size="small"
|
||||
type="danger"
|
||||
></el-button>
|
||||
</div>
|
||||
</div>
|
||||
<el-button icon="plus" plain size="small" style="margin-top: 18px" type="primary">新增数据源</el-button>
|
||||
<el-button
|
||||
icon="plus"
|
||||
plain
|
||||
size="small"
|
||||
style="margin-top: 18px"
|
||||
type="primary"
|
||||
>新增数据源</el-button
|
||||
>
|
||||
<!-- <el-form-item label="数据库类型" prop="type">-->
|
||||
<!-- <el-select v-model="tenantSettingForm.host">-->
|
||||
<!-- <el-option v-for="option in database_type_dict" :key="option.value" :label="option.label"-->
|
||||
@ -262,7 +286,9 @@
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button type="primary" @click="submitTenantSetting">确 定</el-button>
|
||||
<el-button type="primary" @click="submitTenantSetting"
|
||||
>确 定</el-button
|
||||
>
|
||||
<el-button @click="cancelSettingTenant">取 消</el-button>
|
||||
</div>
|
||||
</template>
|
||||
@ -271,9 +297,16 @@
|
||||
</template>
|
||||
|
||||
<script name="Tenant" setup>
|
||||
import {addTenant, delTenant, getSetting, getTenant, listTenant, updateTenant,} from "@/api/tenant/tenant";
|
||||
import {
|
||||
addTenant,
|
||||
delTenant,
|
||||
getSetting,
|
||||
getTenant,
|
||||
listTenant,
|
||||
updateTenant,
|
||||
} from "@/api/tenant/tenant";
|
||||
|
||||
const {proxy} = getCurrentInstance();
|
||||
const { proxy } = getCurrentInstance();
|
||||
|
||||
const tenantList = ref([]);
|
||||
const open = ref(false);
|
||||
@ -284,9 +317,9 @@ const single = ref(true);
|
||||
const multiple = ref(true);
|
||||
const total = ref(0);
|
||||
const title = ref("");
|
||||
const showTenantSetting = ref(false) /*是否显示租户设置对话框*/
|
||||
const tenantSettingRef = ref()
|
||||
const editDatasourceIndex = ref(-1)
|
||||
const showTenantSetting = ref(false); /*是否显示租户设置对话框*/
|
||||
const tenantSettingRef = ref();
|
||||
const editDatasourceIndex = ref(-1);
|
||||
const data = reactive({
|
||||
form: {},
|
||||
queryParams: {
|
||||
@ -307,7 +340,7 @@ const data = reactive({
|
||||
},
|
||||
rules: {
|
||||
companyName: [
|
||||
{required: true, message: "公司名称不能为空", trigger: "blur"},
|
||||
{ required: true, message: "公司名称不能为空", trigger: "blur" },
|
||||
],
|
||||
},
|
||||
tenantSettingForm: {
|
||||
@ -323,14 +356,14 @@ const data = reactive({
|
||||
// }
|
||||
// ],
|
||||
// mode: '3'
|
||||
}
|
||||
,
|
||||
},
|
||||
tenantSettingRules: {
|
||||
/*TODO:*/
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
const {queryParams, form, rules, tenantSettingForm, tenantSettingRules} = toRefs(data);
|
||||
const { queryParams, form, rules, tenantSettingForm, tenantSettingRules } =
|
||||
toRefs(data);
|
||||
|
||||
/** 查询租户列表 */
|
||||
function getList() {
|
||||
@ -352,9 +385,9 @@ function cancel() {
|
||||
* 取消租户设置
|
||||
*/
|
||||
const cancelSettingTenant = () => {
|
||||
showTenantSetting.value = false
|
||||
resetSettingTenant()
|
||||
}
|
||||
showTenantSetting.value = false;
|
||||
resetSettingTenant();
|
||||
};
|
||||
|
||||
// 表单重置
|
||||
function reset() {
|
||||
@ -385,17 +418,19 @@ function reset() {
|
||||
const resetSettingTenant = () => {
|
||||
form.value = {
|
||||
/*TODO:*/
|
||||
datasourceList: [{
|
||||
type: null,
|
||||
ip: null,
|
||||
port: null,
|
||||
name: null,
|
||||
username: null,
|
||||
password: null,
|
||||
}]
|
||||
}
|
||||
tenantSettingRef.value?.resetFields()
|
||||
}
|
||||
datasourceList: [
|
||||
{
|
||||
type: null,
|
||||
ip: null,
|
||||
port: null,
|
||||
name: null,
|
||||
username: null,
|
||||
password: null,
|
||||
},
|
||||
],
|
||||
};
|
||||
tenantSettingRef.value?.resetFields();
|
||||
};
|
||||
|
||||
/** 搜索按钮操作 */
|
||||
function handleQuery() {
|
||||
@ -440,12 +475,12 @@ function handleUpdate(row) {
|
||||
*/
|
||||
const handleSetting = (row) => {
|
||||
// editDatasourceIndex.value = 0
|
||||
resetSettingTenant()
|
||||
getSetting(row.tenantId).then(resp => {
|
||||
tenantSettingForm.value = resp.data
|
||||
showTenantSetting.value = true
|
||||
})
|
||||
}
|
||||
resetSettingTenant();
|
||||
getSetting(row.tenantId).then((resp) => {
|
||||
tenantSettingForm.value = resp.data;
|
||||
showTenantSetting.value = true;
|
||||
});
|
||||
};
|
||||
|
||||
/** 提交按钮 */
|
||||
function submitForm() {
|
||||
@ -473,33 +508,32 @@ function submitForm() {
|
||||
*/
|
||||
const submitTenantSetting = () => {
|
||||
/*TODO:*/
|
||||
showTenantSetting.value = false
|
||||
}
|
||||
showTenantSetting.value = false;
|
||||
};
|
||||
|
||||
/** 删除按钮操作 */
|
||||
function handleDelete(row) {
|
||||
const _tenantIds = row.tenantId || ids.value;
|
||||
proxy.$modal
|
||||
.confirm('是否确认删除租户编号为"' + _tenantIds + '"的数据项?')
|
||||
.then(function () {
|
||||
return delTenant(_tenantIds);
|
||||
})
|
||||
.then(() => {
|
||||
getList();
|
||||
proxy.$modal.msgSuccess("删除成功");
|
||||
})
|
||||
.catch(() => {
|
||||
});
|
||||
.confirm('是否确认删除租户编号为"' + _tenantIds + '"的数据项?')
|
||||
.then(function () {
|
||||
return delTenant(_tenantIds);
|
||||
})
|
||||
.then(() => {
|
||||
getList();
|
||||
proxy.$modal.msgSuccess("删除成功");
|
||||
})
|
||||
.catch(() => {});
|
||||
}
|
||||
|
||||
/** 导出按钮操作 */
|
||||
function handleExport() {
|
||||
proxy.download(
|
||||
"tenant/tenant/export",
|
||||
{
|
||||
...queryParams.value,
|
||||
},
|
||||
`tenant_${new Date().getTime()}.xlsx`
|
||||
"tenant/tenant/export",
|
||||
{
|
||||
...queryParams.value,
|
||||
},
|
||||
`tenant_${new Date().getTime()}.xlsx`
|
||||
);
|
||||
}
|
||||
|
||||
@ -539,6 +573,5 @@ getList();
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
}
|
||||
</style>
|
||||
|
Reference in New Issue
Block a user