This commit is contained in:
ailanyin
2023-06-12 16:03:09 +08:00
parent 830e2e9054
commit 2f1a48b088
9 changed files with 803 additions and 715 deletions

View File

@ -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",
});
};

View File

@ -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",
});
}

View File

@ -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>

View File

@ -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: "",
},
];

View File

@ -78,6 +78,7 @@ const useUserStore = defineStore("user", {
this.roles = [];
this.permissions = [];
this.userInfoRes = null;
this.tenant = null;
removeToken();
resolve();
})

View File

@ -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;

View File

@ -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>

View File

@ -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();

View File

@ -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>