fix: show bound tenant in im menus

This commit is contained in:
richjohnrambo
2026-09-16 16:54:12 +08:00
parent 156e8b9c9f
commit fe5c7af7e2
47 changed files with 401 additions and 437 deletions
+3
View File
@@ -24,6 +24,9 @@ const Storage = createStorage({ storage: localStorage });
export interface UserInfoState {
id: number;
tenantId: number;
tenantCode?: string;
tenantName?: string;
deptName: string;
deptType: string;
roleName: string;
+6 -15
View File
@@ -55,7 +55,6 @@
import { BasicTable, TableAction } from '@/components/Table';
import { BasicForm, useForm } from '@/components/Form/index';
import { usePermission } from '@/hooks/web/usePermission';
import { useUserStore } from '@/store/modules/user';
import { BatchRevoke, Export, List, Revoke } from '@/api/im/registrationInvite';
import {
columns,
@@ -75,14 +74,11 @@
const message = useMessage();
const dialog = useDialog();
const { hasPermission } = usePermission();
const userStore = useUserStore();
const actionRef = ref();
const searchFormRef = ref<any>({});
const createRef = ref();
const batchViewRef = ref();
const bindUserRef = ref();
const isPlatformAdmin = computed(() => userStore.isCompanyDept);
const tableColumns = computed(() =>
columns.map((item: any) => {
if (item.key !== 'status') {
@@ -158,15 +154,12 @@
}
function selectedTenantId() {
if (!isPlatformAdmin.value) {
return 0;
}
return Number(searchFormRef.value?.formModel?.tenantId || 0);
}
function handleCreate(batch: boolean) {
const tenantId = selectedTenantId();
if (isPlatformAdmin.value && !tenantId) {
if (!tenantId) {
message.warning('请先选择商户');
return;
}
@@ -226,13 +219,11 @@
onMounted(async () => {
loadOptions();
if (isPlatformAdmin.value) {
await loadTenantOptions();
if (tenantOptions.value.length > 0) {
await setFieldsValue({ tenantId: tenantOptions.value[0].value });
} else {
message.warning('暂无可用商户');
}
await loadTenantOptions();
if (tenantOptions.value.length > 0) {
await setFieldsValue({ tenantId: tenantOptions.value[0].value });
} else {
message.warning('暂无可用商户');
}
reloadTable();
});
+2 -7
View File
@@ -2,7 +2,7 @@ import { computed, ref } from 'vue';
import { FormSchema } from '@/components/Form';
import { defRangeShortcuts } from '@/utils/dateUtil';
import { useDictStore } from '@/store/modules/dict';
import { List as TenantList } from '@/api/imTenant';
import { loadImTenantOptions } from '@/views/imTenantOptions';
const dict = useDictStore();
@@ -128,12 +128,7 @@ export function loadOptions() {
}
export async function loadTenantOptions() {
const res = await TenantList({ page: 1, perPage: 20, state: 1 });
tenantOptions.value = (res?.list || []).map((item) => ({
label: `${item.name}(${item.code})`,
value: item.id,
}));
return tenantOptions.value;
return loadImTenantOptions(tenantOptions, { page: 1, perPage: 20, state: 1 });
}
export function statusLabel(status: string) {
+9 -14
View File
@@ -94,7 +94,6 @@
import { BasicForm, useForm } from '@/components/Form/index';
import { BasicTable, TableAction } from '@/components/Table';
import { usePermission } from '@/hooks/web/usePermission';
import { useUserStore } from '@/store/modules/user';
import { Delete, Edit, List } from '@/api/imAbuseReason';
import { adaModalWidth, adaTableScrollX } from '@/utils/hotgo';
import {
@@ -112,8 +111,6 @@
const dialog = useDialog();
const message = useMessage();
const { hasPermission } = usePermission();
const userStore = useUserStore();
const isPlatformAdmin = computed(() => userStore.isCompanyDept);
const actionRef = ref();
const searchFormRef = ref<any>({});
const formRef = ref();
@@ -123,12 +120,12 @@
const dialogWidth = computed(() => adaModalWidth(560));
const targetTypeOptions = dict.getOption('ImAbuseTargetTypeOptions');
const currentTenantReady = computed(
() => !isPlatformAdmin.value || !!searchFormRef.value?.formModel?.tenantId
() => !!searchFormRef.value?.formModel?.tenantId
);
const tenantSchema = schemas.value.find((item) => item.field === 'tenantId');
if (tenantSchema) {
tenantSchema.ifShow = () => isPlatformAdmin.value;
tenantSchema.ifShow = () => true;
}
const requiresDescriptionValue = computed({
@@ -184,7 +181,7 @@
const loadDataTable = async (res) => {
const params = { ...searchFormRef.value?.formModel, ...res };
if (isPlatformAdmin.value && !params.tenantId)
if (!params.tenantId)
return { list: [], page: 1, pageCount: 0, totalCount: 0 };
return await List(params);
};
@@ -195,7 +192,7 @@
async function handleReset() {
const defaults: Recordable = {};
if (isPlatformAdmin.value && tenantOptions.value.length > 0)
if (tenantOptions.value.length > 0)
defaults.tenantId = tenantOptions.value[0].value;
await setFieldsValue(defaults);
reloadTable();
@@ -248,13 +245,11 @@
onMounted(async () => {
loadOptions();
if (isPlatformAdmin.value) {
await loadTenantOptions();
if (tenantOptions.value.length > 0) {
await setFieldsValue({ tenantId: tenantOptions.value[0].value });
} else {
message.warning('暂无可用商户');
}
await loadTenantOptions();
if (tenantOptions.value.length > 0) {
await setFieldsValue({ tenantId: tenantOptions.value[0].value });
} else {
message.warning('暂无可用商户');
}
reloadTable();
});
+2 -7
View File
@@ -2,7 +2,7 @@ import { computed, ref } from 'vue';
import { cloneDeep } from 'lodash-es';
import { FormSchema } from '@/components/Form';
import { useDictStore } from '@/store/modules/dict';
import { List as TenantList } from '@/api/imTenant';
import { loadImTenantOptions } from '@/views/imTenantOptions';
const dict = useDictStore();
@@ -140,10 +140,5 @@ export function loadOptions() {
}
export async function loadTenantOptions() {
const res = await TenantList({ page: 1, perPage: 100 });
tenantOptions.value = (res?.list || []).map((item) => ({
label: `${item.name}(${item.code})`,
value: item.id,
}));
return tenantOptions.value;
return loadImTenantOptions(tenantOptions, { page: 1, perPage: 100 });
}
+2 -7
View File
@@ -1,13 +1,8 @@
import { ref } from 'vue';
import { List as TenantList } from '@/api/imTenant';
import { loadImTenantOptions } from '@/views/imTenantOptions';
export const imQueryTenantOptions = ref<any[]>([]);
export async function loadImQueryTenantOptions() {
const res = await TenantList({ page: 1, perPage: 100 });
imQueryTenantOptions.value = (res?.list || []).map((item) => ({
label: `${item.name}(${item.code})`,
value: item.id,
}));
return imQueryTenantOptions.value;
return loadImTenantOptions(imQueryTenantOptions, { page: 1, perPage: 100 });
}
+9 -14
View File
@@ -47,7 +47,6 @@
import { BasicTable, TableAction } from '@/components/Table';
import { BasicForm, useForm } from '@/components/Form/index';
import { usePermission } from '@/hooks/web/usePermission';
import { useUserStore } from '@/store/modules/user';
import { List, Export } from '@/api/imAuditLog';
import { columns, loadTenantOptions, schemas, State, tenantOptions } from './model';
import { adaTableScrollX } from '@/utils/hotgo';
@@ -56,15 +55,13 @@
const message = useMessage();
const { hasPermission } = usePermission();
const userStore = useUserStore();
const isPlatformAdmin = computed(() => userStore.isCompanyDept);
const actionRef = ref();
const searchFormRef = ref<any>({});
const viewRef = ref();
const tenantSchema = schemas.value.find((item) => item.field === 'tenantId');
if (tenantSchema) {
tenantSchema.ifShow = () => isPlatformAdmin.value;
tenantSchema.ifShow = () => true;
}
const actionColumn = reactive({
@@ -96,7 +93,7 @@
const loadDataTable = async (res) => {
const params = { ...searchFormRef.value?.formModel, ...res };
if (isPlatformAdmin.value && !params.tenantId)
if (!params.tenantId)
return { list: [], page: 1, pageCount: 0, totalCount: 0 };
return await List(params);
};
@@ -107,7 +104,7 @@
async function handleReset() {
const defaults: Recordable = {};
if (isPlatformAdmin.value && tenantOptions.value.length > 0)
if (tenantOptions.value.length > 0)
defaults.tenantId = tenantOptions.value[0].value;
await setFieldsValue(defaults);
reloadTable();
@@ -115,7 +112,7 @@
function handleExport() {
const params = { ...searchFormRef.value?.formModel };
if (isPlatformAdmin.value && !params.tenantId) {
if (!params.tenantId) {
message.warning('请选择商户');
return;
}
@@ -123,13 +120,11 @@
}
onMounted(async () => {
if (isPlatformAdmin.value) {
await loadTenantOptions();
if (tenantOptions.value.length > 0) {
await setFieldsValue({ tenantId: tenantOptions.value[0].value });
} else {
message.warning('暂无可用商户');
}
await loadTenantOptions();
if (tenantOptions.value.length > 0) {
await setFieldsValue({ tenantId: tenantOptions.value[0].value });
} else {
message.warning('暂无可用商户');
}
reloadTable();
});
+2 -7
View File
@@ -2,7 +2,7 @@ import { computed, ref } from 'vue';
import { cloneDeep } from 'lodash-es';
import { FormSchema } from '@/components/Form';
import { defRangeShortcuts } from '@/utils/dateUtil';
import { List as TenantList } from '@/api/imTenant';
import { loadImTenantOptions } from '@/views/imTenantOptions';
export const tenantOptions = ref<any[]>([]);
@@ -110,10 +110,5 @@ export const columns = [
];
export async function loadTenantOptions() {
const res = await TenantList({ page: 1, perPage: 20 });
tenantOptions.value = (res?.list || []).map((item) => ({
label: `${item.name}(${item.code})`,
value: item.id,
}));
return tenantOptions.value;
return loadImTenantOptions(tenantOptions, { page: 1, perPage: 20 });
}
+6 -12
View File
@@ -5,7 +5,6 @@
<template #header-extra>
<n-space align="center">
<n-select
v-if="isPlatformAdmin"
v-model:value="tenantId"
:options="imQueryTenantOptions"
class="tenant-select"
@@ -37,15 +36,12 @@
</template>
<script lang="ts" setup>
import { computed, onMounted, ref } from 'vue';
import { onMounted, ref } from 'vue';
import { useMessage } from 'naive-ui';
import { useUserStore } from '@/store/modules/user';
import { Overview, Trends } from '@/api/imDashboard';
import { imQueryTenantOptions, loadImQueryTenantOptions } from '@/views/imAdminQueryShared';
const message = useMessage();
const userStore = useUserStore();
const isPlatformAdmin = computed(() => userStore.isCompanyDept);
const tenantId = ref(0);
const days = ref(7);
const loading = ref(false);
@@ -71,7 +67,7 @@
];
async function loadDashboard() {
if (isPlatformAdmin.value && !tenantId.value) {
if (!tenantId.value) {
message.warning('请选择商户');
return;
}
@@ -87,12 +83,10 @@
}
onMounted(async () => {
if (isPlatformAdmin.value) {
await loadImQueryTenantOptions();
tenantId.value = imQueryTenantOptions.value[0]?.value || 0;
if (!tenantId.value) message.warning('暂无可用商户');
}
if (!isPlatformAdmin.value || tenantId.value) await loadDashboard();
await loadImQueryTenantOptions();
tenantId.value = imQueryTenantOptions.value[0]?.value || 0;
if (!tenantId.value) message.warning('暂无可用商户');
else await loadDashboard();
});
</script>
+2 -7
View File
@@ -2,7 +2,7 @@ import { computed, ref } from 'vue';
import { cloneDeep } from 'lodash-es';
import { FormSchema } from '@/components/Form';
import { useDictStore } from '@/store/modules/dict';
import { List as TenantList } from '@/api/imTenant';
import { loadImTenantOptions } from '@/views/imTenantOptions';
const dict = useDictStore();
@@ -113,10 +113,5 @@ export function loadOptions() {
}
export async function loadTenantOptions() {
const res = await TenantList({ page: 1, perPage: 200 });
tenantOptions.value = (res?.list || []).map((item) => ({
label: `${item.name}(${item.code})`,
value: item.id,
}));
return tenantOptions.value;
return loadImTenantOptions(tenantOptions, { page: 1, perPage: 200 });
}
+8 -13
View File
@@ -31,7 +31,6 @@
import { BasicForm, useForm } from '@/components/Form/index';
import { BasicTable, TableAction } from '@/components/Table';
import { usePermission } from '@/hooks/web/usePermission';
import { useUserStore } from '@/store/modules/user';
import { Check, List } from '@/api/imExternalConfig';
import { columns, loadOptions, loadTenantOptions, schemas, State, tenantOptions } from './model';
import { adaTableScrollX } from '@/utils/hotgo';
@@ -40,15 +39,13 @@
const message = useMessage();
const dialog = useDialog();
const { hasPermission } = usePermission();
const userStore = useUserStore();
const isPlatformAdmin = computed(() => userStore.isCompanyDept);
const actionRef = ref();
const searchFormRef = ref<any>({});
const editRef = ref();
const tenantSchema = schemas.value.find((item) => item.field === 'tenantId');
if (tenantSchema) {
tenantSchema.ifShow = () => isPlatformAdmin.value;
tenantSchema.ifShow = () => true;
}
const actionColumn = reactive({
@@ -85,7 +82,7 @@
const loadDataTable = async (res) => {
const params = { ...searchFormRef.value?.formModel, ...res };
if (isPlatformAdmin.value && !params.tenantId)
if (!params.tenantId)
return { list: [], page: 1, pageCount: 0, totalCount: 0 };
return await List(params);
};
@@ -96,7 +93,7 @@
async function handleReset() {
const defaults: Recordable = {};
if (isPlatformAdmin.value && tenantOptions.value.length > 0)
if (tenantOptions.value.length > 0)
defaults.tenantId = tenantOptions.value[0].value;
await setFieldsValue(defaults);
reloadTable();
@@ -118,13 +115,11 @@
onMounted(async () => {
loadOptions();
if (isPlatformAdmin.value) {
await loadTenantOptions();
if (tenantOptions.value.length > 0) {
await setFieldsValue({ tenantId: tenantOptions.value[0].value });
} else {
message.warning('暂无可用商户');
}
await loadTenantOptions();
if (tenantOptions.value.length > 0) {
await setFieldsValue({ tenantId: tenantOptions.value[0].value });
} else {
message.warning('暂无可用商户');
}
reloadTable();
});
+2 -7
View File
@@ -2,7 +2,7 @@ import { computed, ref } from 'vue';
import { cloneDeep } from 'lodash-es';
import { FormSchema } from '@/components/Form';
import { useDictStore } from '@/store/modules/dict';
import { List as TenantList } from '@/api/imTenant';
import { loadImTenantOptions } from '@/views/imTenantOptions';
const dict = useDictStore();
@@ -129,10 +129,5 @@ export function loadOptions() {
}
export async function loadTenantOptions() {
const res = await TenantList({ page: 1, perPage: 20 });
tenantOptions.value = (res?.list || []).map((item) => ({
label: `${item.name}(${item.code})`,
value: item.id,
}));
return tenantOptions.value;
return loadImTenantOptions(tenantOptions, { page: 1, perPage: 20 });
}
+5 -10
View File
@@ -11,7 +11,7 @@
label-placement="left"
label-width="120"
>
<n-form-item v-if="isPlatformAdmin" label="商户">
<n-form-item label="商户">
<n-select
v-model:value="selectedTenantId"
:options="tenantOptions"
@@ -71,20 +71,17 @@
import { computed, onMounted, ref } from 'vue';
import { useMessage } from 'naive-ui';
import { usePermission } from '@/hooks/web/usePermission';
import { useUserStore } from '@/store/modules/user';
import { Get, Update } from '@/api/imFeedbackConfig';
import { loadOptions, loadTenantOptions, newState, rules, State, tenantOptions } from './model';
const message = useMessage();
const { hasPermission } = usePermission();
const userStore = useUserStore();
const isPlatformAdmin = computed(() => userStore.isCompanyDept);
const formRef = ref();
const formValue = ref<State>(newState(null));
const selectedTenantId = ref(0);
const loadLoading = ref(false);
const submitLoading = ref(false);
const currentTenantReady = computed(() => !isPlatformAdmin.value || selectedTenantId.value > 0);
const currentTenantReady = computed(() => selectedTenantId.value > 0);
const allowContactValue = computed({
get: () => formValue.value.allowContact === 1,
@@ -130,11 +127,9 @@
onMounted(async () => {
loadOptions();
if (isPlatformAdmin.value) {
await loadTenantOptions();
if (tenantOptions.value.length > 0) selectedTenantId.value = tenantOptions.value[0].value;
else message.warning('暂无可用商户');
}
await loadTenantOptions();
if (tenantOptions.value.length > 0) selectedTenantId.value = tenantOptions.value[0].value;
else message.warning('暂无可用商户');
await loadConfig();
});
</script>
+2 -7
View File
@@ -1,6 +1,6 @@
import { ref } from 'vue';
import { cloneDeep } from 'lodash-es';
import { List as TenantList } from '@/api/imTenant';
import { loadImTenantOptions } from '@/views/imTenantOptions';
import { useDictStore } from '@/store/modules/dict';
export const tenantOptions = ref<any[]>([]);
@@ -49,10 +49,5 @@ export function loadOptions() {
}
export async function loadTenantOptions() {
const res = await TenantList({ page: 1, perPage: 100 });
tenantOptions.value = (res?.list || []).map((item) => ({
label: `${item.name}(${item.code})`,
value: item.id,
}));
return tenantOptions.value;
return loadImTenantOptions(tenantOptions, { page: 1, perPage: 100 });
}
+9 -11
View File
@@ -57,7 +57,7 @@
const tenantSchema = schemas.value.find((item) => item.field === 'tenantId');
if (tenantSchema) {
tenantSchema.ifShow = () => isPlatformAdmin.value;
tenantSchema.ifShow = () => true;
}
const visibleColumns = computed(() =>
@@ -106,7 +106,7 @@
const loadDataTable = async (res) => {
const params = { ...searchFormRef.value?.formModel, ...res };
if (isPlatformAdmin.value && !params.tenantId)
if (!params.tenantId)
return { list: [], page: 1, pageCount: 0, totalCount: 0 };
return await List(params);
};
@@ -117,7 +117,7 @@
async function handleReset() {
const defaults: Recordable = {};
if (isPlatformAdmin.value && tenantOptions.value.length > 0)
if (tenantOptions.value.length > 0)
defaults.tenantId = tenantOptions.value[0].value;
await setFieldsValue(defaults);
reloadTable();
@@ -153,7 +153,7 @@
function handleCleanupOrphan() {
const params = searchFormRef.value?.formModel || {};
if (isPlatformAdmin.value && !params.tenantId) {
if (!params.tenantId) {
message.warning('请先选择商户');
return;
}
@@ -172,13 +172,11 @@
onMounted(async () => {
loadOptions();
if (isPlatformAdmin.value) {
await loadTenantOptions();
if (tenantOptions.value.length > 0) {
await setFieldsValue({ tenantId: tenantOptions.value[0].value });
} else {
message.warning('暂无可用商户');
}
await loadTenantOptions();
if (tenantOptions.value.length > 0) {
await setFieldsValue({ tenantId: tenantOptions.value[0].value });
} else {
message.warning('暂无可用商户');
}
reloadTable();
});
+2 -7
View File
@@ -3,7 +3,7 @@ import { cloneDeep } from 'lodash-es';
import { FormSchema } from '@/components/Form';
import { defRangeShortcuts } from '@/utils/dateUtil';
import { useDictStore } from '@/store/modules/dict';
import { List as TenantList } from '@/api/imTenant';
import { loadImTenantOptions } from '@/views/imTenantOptions';
const dict = useDictStore();
@@ -152,10 +152,5 @@ export function loadOptions() {
}
export async function loadTenantOptions() {
const res = await TenantList({ page: 1, perPage: 20 });
tenantOptions.value = (res?.list || []).map((item) => ({
label: `${item.name}(${item.code})`,
value: item.id,
}));
return tenantOptions.value;
return loadImTenantOptions(tenantOptions, { page: 1, perPage: 20 });
}
+8 -13
View File
@@ -85,7 +85,6 @@
import { BasicForm, useForm } from '@/components/Form/index';
import { BasicTable, TableAction } from '@/components/Table';
import { usePermission } from '@/hooks/web/usePermission';
import { useUserStore } from '@/store/modules/user';
import { List, Update } from '@/api/imFilePolicy';
import { adaModalWidth, adaTableScrollX } from '@/utils/hotgo';
import {
@@ -102,8 +101,6 @@
const dict = useDictStore();
const message = useMessage();
const { hasPermission } = usePermission();
const userStore = useUserStore();
const isPlatformAdmin = computed(() => userStore.isCompanyDept);
const actionRef = ref();
const searchFormRef = ref<any>({});
const formRef = ref();
@@ -122,7 +119,7 @@
const tenantSchema = schemas.value.find((item) => item.field === 'tenantId');
if (tenantSchema) {
tenantSchema.ifShow = () => isPlatformAdmin.value;
tenantSchema.ifShow = () => true;
}
const autoCleanupEnabled = computed({
@@ -166,7 +163,7 @@
const loadDataTable = async (res) => {
const params = { ...searchFormRef.value?.formModel, ...res };
if (isPlatformAdmin.value && !params.tenantId)
if (!params.tenantId)
return { list: [], page: 1, pageCount: 0, totalCount: 0 };
return await List(params);
};
@@ -177,7 +174,7 @@
async function handleReset() {
const defaults: Recordable = {};
if (isPlatformAdmin.value && tenantOptions.value.length > 0)
if (tenantOptions.value.length > 0)
defaults.tenantId = tenantOptions.value[0].value;
await setFieldsValue(defaults);
reloadTable();
@@ -212,13 +209,11 @@
onMounted(async () => {
loadOptions();
if (isPlatformAdmin.value) {
await loadTenantOptions();
if (tenantOptions.value.length > 0) {
await setFieldsValue({ tenantId: tenantOptions.value[0].value });
} else {
message.warning('暂无可用商户');
}
await loadTenantOptions();
if (tenantOptions.value.length > 0) {
await setFieldsValue({ tenantId: tenantOptions.value[0].value });
} else {
message.warning('暂无可用商户');
}
reloadTable();
});
+2 -7
View File
@@ -2,7 +2,7 @@ import { computed, ref } from 'vue';
import { cloneDeep } from 'lodash-es';
import { FormSchema } from '@/components/Form';
import { useDictStore } from '@/store/modules/dict';
import { List as TenantList } from '@/api/imTenant';
import { loadImTenantOptions } from '@/views/imTenantOptions';
const dict = useDictStore();
@@ -127,10 +127,5 @@ export function loadOptions() {
}
export async function loadTenantOptions() {
const res = await TenantList({ page: 1, perPage: 100 });
tenantOptions.value = (res?.list || []).map((item) => ({
label: `${item.name}(${item.code})`,
value: item.id,
}));
return tenantOptions.value;
return loadImTenantOptions(tenantOptions, { page: 1, perPage: 100 });
}
+7 -12
View File
@@ -32,7 +32,6 @@
import { useMessage } from 'naive-ui';
import { BasicTable, TableAction } from '@/components/Table';
import { BasicForm, useForm } from '@/components/Form/index';
import { useUserStore } from '@/store/modules/user';
import { List } from '@/api/imGroup';
import { columns, loadOptions, loadTenantOptions, schemas, State, tenantOptions } from './model';
import { adaTableScrollX } from '@/utils/hotgo';
@@ -41,8 +40,6 @@
import GovernanceModal from './governance.vue';
const message = useMessage();
const userStore = useUserStore();
const isPlatformAdmin = computed(() => userStore.isCompanyDept);
const actionRef = ref();
const searchFormRef = ref<any>({});
const viewRef = ref();
@@ -51,7 +48,7 @@
const tenantSchema = schemas.value.find((item) => item.field === 'tenantId');
if (tenantSchema) {
tenantSchema.ifShow = () => isPlatformAdmin.value;
tenantSchema.ifShow = () => true;
}
const actionColumn = reactive({
@@ -96,7 +93,7 @@
// 加载表格数据
const loadDataTable = async (res) => {
const params = { ...searchFormRef.value?.formModel, ...res };
if (isPlatformAdmin.value && !params.tenantId) {
if (!params.tenantId) {
return { list: [], page: 1, pageCount: 0, totalCount: 0 };
}
return await List(params);
@@ -124,13 +121,11 @@
onMounted(async () => {
loadOptions();
if (isPlatformAdmin.value) {
await loadTenantOptions();
if (tenantOptions.value.length > 0) {
await setFieldsValue({ tenantId: tenantOptions.value[0].value });
} else {
message.warning('暂无可用商户');
}
await loadTenantOptions();
if (tenantOptions.value.length > 0) {
await setFieldsValue({ tenantId: tenantOptions.value[0].value });
} else {
message.warning('暂无可用商户');
}
reloadTable();
});
+2 -7
View File
@@ -4,7 +4,7 @@ import { cloneDeep } from 'lodash-es';
import { FormSchema } from '@/components/Form';
import { defRangeShortcuts } from '@/utils/dateUtil';
import { useDictStore } from '@/store/modules/dict';
import { List as TenantList } from '@/api/imTenant';
import { loadImTenantOptions } from '@/views/imTenantOptions';
const dict = useDictStore();
@@ -505,10 +505,5 @@ export function loadOptions() {
}
export async function loadTenantOptions() {
const res = await TenantList({ page: 1, perPage: 20 });
tenantOptions.value = (res?.list || []).map((item) => ({
label: `${item.name}(${item.code})`,
value: item.id,
}));
return tenantOptions.value;
return loadImTenantOptions(tenantOptions, { page: 1, perPage: 20 });
}
+2 -8
View File
@@ -3,7 +3,7 @@ import { cloneDeep } from 'lodash-es';
import { FormSchema } from '@/components/Form';
import { defRangeShortcuts } from '@/utils/dateUtil';
import { useDictStore } from '@/store/modules/dict';
import { List as TenantList } from '@/api/imTenant';
import { loadImTenantOptions } from '@/views/imTenantOptions';
const dict = useDictStore();
@@ -129,11 +129,5 @@ export function loadOptions() {
}
export async function loadTenantOptions() {
const res = await TenantList({ page: 1, perPage: 20 });
tenantOptions.value = (res?.list || []).map((item) => ({
label: `${item.name}(${item.code})`,
value: item.id,
code: item.code,
}));
return tenantOptions.value;
return loadImTenantOptions(tenantOptions, { page: 1, perPage: 20 });
}
+8 -13
View File
@@ -78,7 +78,6 @@
import { BasicForm, useForm } from '@/components/Form/index';
import { BasicTable, TableAction } from '@/components/Table';
import { usePermission } from '@/hooks/web/usePermission';
import { useUserStore } from '@/store/modules/user';
import { adaTableScrollX } from '@/utils/hotgo';
import { AddBlacklist, BanUser, Export, List, View } from '@/api/imLoginFailureLog';
import { imQueryTenantOptions, loadImQueryTenantOptions } from '@/views/imAdminQueryShared';
@@ -87,8 +86,6 @@
const message = useMessage();
const dialog = useDialog();
const { hasPermission } = usePermission();
const userStore = useUserStore();
const isPlatformAdmin = computed(() => userStore.isCompanyDept);
const actionRef = ref();
const searchFormRef = ref<any>({});
const showDetail = ref(false);
@@ -97,7 +94,7 @@
const banReason = ref('');
const current = ref<Recordable>({});
const tenantSchema = schemas.value.find((item) => item.field === 'tenantId');
if (tenantSchema) tenantSchema.ifShow = () => isPlatformAdmin.value;
if (tenantSchema) tenantSchema.ifShow = () => true;
const actionColumn = reactive({
width: 260,
title: '操作',
@@ -134,7 +131,7 @@
});
const loadDataTable = async (res) => {
const params = { ...searchFormRef.value?.formModel, ...res };
if (isPlatformAdmin.value && !params.tenantId)
if (!params.tenantId)
return { list: [], page: 1, pageCount: 0, totalCount: 0 };
return List(params);
};
@@ -143,13 +140,13 @@
}
async function handleReset() {
const defaults: Recordable = {};
if (isPlatformAdmin.value) defaults.tenantId = imQueryTenantOptions.value[0]?.value;
defaults.tenantId = imQueryTenantOptions.value[0]?.value;
await setFieldsValue(defaults);
reloadTable();
}
function handleExport() {
const params = { ...searchFormRef.value?.formModel };
if (isPlatformAdmin.value && !params.tenantId) {
if (!params.tenantId) {
message.warning('请选择商户');
return;
}
@@ -200,12 +197,10 @@
}
onMounted(async () => {
loadOptions();
if (isPlatformAdmin.value) {
await loadImQueryTenantOptions();
if (imQueryTenantOptions.value.length)
await setFieldsValue({ tenantId: imQueryTenantOptions.value[0].value });
else message.warning('暂无可用商户');
}
await loadImQueryTenantOptions();
if (imQueryTenantOptions.value.length)
await setFieldsValue({ tenantId: imQueryTenantOptions.value[0].value });
else message.warning('暂无可用商户');
reloadTable();
});
</script>
+5 -10
View File
@@ -11,7 +11,7 @@
label-placement="left"
label-width="120"
>
<n-form-item v-if="isPlatformAdmin" label="商户">
<n-form-item label="商户">
<n-select
v-model:value="selectedTenantId"
:options="tenantOptions"
@@ -77,20 +77,17 @@
import { computed, onMounted, ref } from 'vue';
import { useMessage } from 'naive-ui';
import { usePermission } from '@/hooks/web/usePermission';
import { useUserStore } from '@/store/modules/user';
import { Get, Update } from '@/api/imMailboxConfig';
import { loadOptions, loadTenantOptions, newState, rules, State, tenantOptions } from './model';
const message = useMessage();
const { hasPermission } = usePermission();
const userStore = useUserStore();
const isPlatformAdmin = computed(() => userStore.isCompanyDept);
const formRef = ref();
const formValue = ref<State>(newState(null));
const selectedTenantId = ref(0);
const loadLoading = ref(false);
const submitLoading = ref(false);
const currentTenantReady = computed(() => !isPlatformAdmin.value || selectedTenantId.value > 0);
const currentTenantReady = computed(() => selectedTenantId.value > 0);
const enabledValue = computed({
get: () => formValue.value.enabled === 1,
@@ -142,11 +139,9 @@
onMounted(async () => {
loadOptions();
if (isPlatformAdmin.value) {
await loadTenantOptions();
if (tenantOptions.value.length > 0) selectedTenantId.value = tenantOptions.value[0].value;
else message.warning('暂无可用商户');
}
await loadTenantOptions();
if (tenantOptions.value.length > 0) selectedTenantId.value = tenantOptions.value[0].value;
else message.warning('暂无可用商户');
await loadConfig();
});
</script>
+2 -7
View File
@@ -1,6 +1,6 @@
import { ref } from 'vue';
import { cloneDeep } from 'lodash-es';
import { List as TenantList } from '@/api/imTenant';
import { loadImTenantOptions } from '@/views/imTenantOptions';
import { useDictStore } from '@/store/modules/dict';
export const tenantOptions = ref<any[]>([]);
@@ -58,10 +58,5 @@ export function loadOptions() {
}
export async function loadTenantOptions() {
const res = await TenantList({ page: 1, perPage: 100 });
tenantOptions.value = (res?.list || []).map((item) => ({
label: `${item.name}(${item.code})`,
value: item.id,
}));
return tenantOptions.value;
return loadImTenantOptions(tenantOptions, { page: 1, perPage: 100 });
}
+8 -13
View File
@@ -86,7 +86,6 @@
import { BasicForm, useForm } from '@/components/Form/index';
import { BasicTable, TableAction } from '@/components/Table';
import { usePermission } from '@/hooks/web/usePermission';
import { useUserStore } from '@/store/modules/user';
import { adaTableScrollX } from '@/utils/hotgo';
import { imQueryTenantOptions, loadImQueryTenantOptions } from '@/views/imAdminQueryShared';
import { createMessageColumns, createMessageSchemas, loadMessageOptions } from './model';
@@ -99,8 +98,6 @@
const permissionPrefix = props.group ? '/imGroupMessage' : '/imPrivateMessage';
const message = useMessage();
const { hasPermission } = usePermission();
const userStore = useUserStore();
const isPlatformAdmin = computed(() => userStore.isCompanyDept);
const schemas = createMessageSchemas(props.group);
const columns = createMessageColumns(props.group);
const actionRef = ref();
@@ -113,7 +110,7 @@
const reason = ref('');
const actionType = ref<'hide' | 'delete'>('hide');
const tenantSchema = schemas.value.find((item) => item.field === 'tenantId');
if (tenantSchema) tenantSchema.ifShow = () => isPlatformAdmin.value;
if (tenantSchema) tenantSchema.ifShow = () => true;
const actionColumn = reactive({
width: 210,
title: '操作',
@@ -151,7 +148,7 @@
const loadDataTable = async (res) => {
if (props.group && !hasQueried.value) return { list: [], page: 1, pageCount: 0, totalCount: 0 };
const params = { ...searchFormRef.value?.formModel, ...res };
if (isPlatformAdmin.value && !params.tenantId)
if (!params.tenantId)
return { list: [], page: 1, pageCount: 0, totalCount: 0 };
return api.List(params);
};
@@ -161,7 +158,7 @@
}
async function handleReset() {
const defaults: Recordable = {};
if (isPlatformAdmin.value) defaults.tenantId = imQueryTenantOptions.value[0]?.value;
defaults.tenantId = imQueryTenantOptions.value[0]?.value;
await setFieldsValue(defaults);
if (props.group) hasQueried.value = false;
actionRef.value?.reload();
@@ -172,7 +169,7 @@
return;
}
const params = { ...searchFormRef.value?.formModel };
if (isPlatformAdmin.value && !params.tenantId) {
if (!params.tenantId) {
message.warning('请选择商户');
return;
}
@@ -215,12 +212,10 @@
}
onMounted(async () => {
loadMessageOptions();
if (isPlatformAdmin.value) {
await loadImQueryTenantOptions();
if (imQueryTenantOptions.value.length)
await setFieldsValue({ tenantId: imQueryTenantOptions.value[0].value });
else message.warning('暂无可用商户');
}
await loadImQueryTenantOptions();
if (imQueryTenantOptions.value.length)
await setFieldsValue({ tenantId: imQueryTenantOptions.value[0].value });
else message.warning('暂无可用商户');
if (!props.group) reloadTable();
});
</script>
+8 -13
View File
@@ -89,7 +89,6 @@
import { BasicForm, useForm } from '@/components/Form/index';
import { BasicTable, TableAction } from '@/components/Table';
import { usePermission } from '@/hooks/web/usePermission';
import { useUserStore } from '@/store/modules/user';
import { TemplateList, TemplateUpdate } from '@/api/imNotification';
import { adaModalWidth, adaTableScrollX } from '@/utils/hotgo';
import {
@@ -106,8 +105,6 @@
const dict = useDictStore();
const message = useMessage();
const { hasPermission } = usePermission();
const userStore = useUserStore();
const isPlatformAdmin = computed(() => userStore.isCompanyDept);
const actionRef = ref();
const searchFormRef = ref<any>({});
const formRef = ref();
@@ -122,7 +119,7 @@
const tenantSchema = schemas.value.find((item) => item.field === 'tenantId');
if (tenantSchema) {
tenantSchema.ifShow = () => isPlatformAdmin.value;
tenantSchema.ifShow = () => true;
}
const inAppEnabled = computed({
@@ -172,7 +169,7 @@
const loadDataTable = async (res) => {
const params = { ...searchFormRef.value?.formModel, ...res };
if (isPlatformAdmin.value && !params.tenantId)
if (!params.tenantId)
return { list: [], page: 1, pageCount: 0, totalCount: 0 };
return await TemplateList(params);
};
@@ -183,7 +180,7 @@
async function handleReset() {
const defaults: Recordable = {};
if (isPlatformAdmin.value && tenantOptions.value.length > 0)
if (tenantOptions.value.length > 0)
defaults.tenantId = tenantOptions.value[0].value;
await setFieldsValue(defaults);
reloadTable();
@@ -215,13 +212,11 @@
onMounted(async () => {
loadOptions();
if (isPlatformAdmin.value) {
await loadTenantOptions();
if (tenantOptions.value.length > 0) {
await setFieldsValue({ tenantId: tenantOptions.value[0].value });
} else {
message.warning('暂无可用商户');
}
await loadTenantOptions();
if (tenantOptions.value.length > 0) {
await setFieldsValue({ tenantId: tenantOptions.value[0].value });
} else {
message.warning('暂无可用商户');
}
reloadTable();
});
+2 -7
View File
@@ -2,7 +2,7 @@ import { computed, ref } from 'vue';
import { cloneDeep } from 'lodash-es';
import { FormSchema } from '@/components/Form';
import { useDictStore } from '@/store/modules/dict';
import { List as TenantList } from '@/api/imTenant';
import { loadImTenantOptions } from '@/views/imTenantOptions';
const dict = useDictStore();
@@ -141,10 +141,5 @@ export function loadOptions() {
}
export async function loadTenantOptions() {
const res = await TenantList({ page: 1, perPage: 100 });
tenantOptions.value = (res?.list || []).map((item) => ({
label: `${item.name}(${item.code})`,
value: item.id,
}));
return tenantOptions.value;
return loadImTenantOptions(tenantOptions, { page: 1, perPage: 100 });
}
+9 -14
View File
@@ -204,7 +204,6 @@
import { BasicForm, useForm } from '@/components/Form/index';
import { BasicTable, TableAction } from '@/components/Table';
import { usePermission } from '@/hooks/web/usePermission';
import { useUserStore } from '@/store/modules/user';
import { adaModalWidth, adaTableScrollX } from '@/utils/hotgo';
import {
DepartmentDelete,
@@ -237,8 +236,6 @@
const dialog = useDialog();
const message = useMessage();
const { hasPermission } = usePermission();
const userStore = useUserStore();
const isPlatformAdmin = computed(() => userStore.isCompanyDept);
const departmentSearchRef = ref<any>({});
const memberSearchRef = ref<any>({});
@@ -257,7 +254,7 @@
const tenantSchema = departmentSchemas.value.find((item) => item.field === 'tenantId');
if (tenantSchema) {
tenantSchema.ifShow = () => isPlatformAdmin.value;
tenantSchema.ifShow = () => true;
}
const departmentStateOptions = dict.getOption('ImOrgDepartmentStateOptions');
@@ -350,7 +347,7 @@
const loadDepartmentTable = async (res) => {
const params = { ...departmentSearchRef.value?.formModel, ...res };
if (isPlatformAdmin.value && !params.tenantId)
if (!params.tenantId)
return { list: [], page: 1, pageCount: 0, totalCount: 0 };
const data = await DepartmentList(params);
departmentRows.value = data?.list || [];
@@ -387,7 +384,7 @@
function handleDepartmentExport() {
const params = { ...departmentSearchRef.value?.formModel };
if (isPlatformAdmin.value && !params.tenantId) {
if (!params.tenantId) {
message.warning('请先选择商户');
return;
}
@@ -408,7 +405,7 @@
async function handleDepartmentReset() {
const defaults: Recordable = {};
if (isPlatformAdmin.value && tenantOptions.value.length > 0)
if (tenantOptions.value.length > 0)
defaults.tenantId = tenantOptions.value[0].value;
selectedDepartment.value = newDepartmentState(null);
await setDepartmentFields(defaults);
@@ -524,13 +521,11 @@
onMounted(async () => {
loadOptions();
if (isPlatformAdmin.value) {
await loadTenantOptions();
if (tenantOptions.value.length > 0) {
await setDepartmentFields({ tenantId: tenantOptions.value[0].value });
} else {
message.warning('暂无可用商户');
}
await loadTenantOptions();
if (tenantOptions.value.length > 0) {
await setDepartmentFields({ tenantId: tenantOptions.value[0].value });
} else {
message.warning('暂无可用商户');
}
reloadDepartments();
});
+2 -7
View File
@@ -2,7 +2,7 @@ import { computed, ref } from 'vue';
import { cloneDeep } from 'lodash-es';
import { FormSchema } from '@/components/Form';
import { useDictStore } from '@/store/modules/dict';
import { List as TenantList } from '@/api/imTenant';
import { loadImTenantOptions } from '@/views/imTenantOptions';
const dict = useDictStore();
@@ -195,10 +195,5 @@ export function loadOptions() {
}
export async function loadTenantOptions() {
const res = await TenantList({ page: 1, perPage: 100 });
tenantOptions.value = (res?.list || []).map((item) => ({
label: `${item.name}(${item.code})`,
value: item.id,
}));
return tenantOptions.value;
return loadImTenantOptions(tenantOptions, { page: 1, perPage: 100 });
}
+8 -13
View File
@@ -31,7 +31,6 @@
import { BasicTable, TableAction } from '@/components/Table';
import { BasicForm, useForm } from '@/components/Form/index';
import { usePermission } from '@/hooks/web/usePermission';
import { useUserStore } from '@/store/modules/user';
import { Dead, List, Retry } from '@/api/imOutbox';
import { columns, loadOptions, loadTenantOptions, schemas, State, tenantOptions } from './model';
import { adaTableScrollX } from '@/utils/hotgo';
@@ -40,15 +39,13 @@
const message = useMessage();
const dialog = useDialog();
const { hasPermission } = usePermission();
const userStore = useUserStore();
const isPlatformAdmin = computed(() => userStore.isCompanyDept);
const actionRef = ref();
const searchFormRef = ref<any>({});
const viewRef = ref();
const tenantSchema = schemas.value.find((item) => item.field === 'tenantId');
if (tenantSchema) {
tenantSchema.ifShow = () => isPlatformAdmin.value;
tenantSchema.ifShow = () => true;
}
const actionColumn = reactive({
@@ -94,7 +91,7 @@
const loadDataTable = async (res) => {
const params = { ...searchFormRef.value?.formModel, ...res };
if (isPlatformAdmin.value && !params.tenantId)
if (!params.tenantId)
return { list: [], page: 1, pageCount: 0, totalCount: 0 };
if (!params.source) params.source = 'business';
return await List(params);
@@ -106,7 +103,7 @@
async function handleReset() {
const defaults: Recordable = { source: 'business' };
if (isPlatformAdmin.value && tenantOptions.value.length > 0)
if (tenantOptions.value.length > 0)
defaults.tenantId = tenantOptions.value[0].value;
await setFieldsValue(defaults);
reloadTable();
@@ -143,13 +140,11 @@
onMounted(async () => {
loadOptions();
await setFieldsValue({ source: 'business' });
if (isPlatformAdmin.value) {
await loadTenantOptions();
if (tenantOptions.value.length > 0) {
await setFieldsValue({ tenantId: tenantOptions.value[0].value });
} else {
message.warning('暂无可用商户');
}
await loadTenantOptions();
if (tenantOptions.value.length > 0) {
await setFieldsValue({ tenantId: tenantOptions.value[0].value });
} else {
message.warning('暂无可用商户');
}
reloadTable();
});
+2 -7
View File
@@ -3,7 +3,7 @@ import { cloneDeep } from 'lodash-es';
import { FormSchema } from '@/components/Form';
import { defRangeShortcuts } from '@/utils/dateUtil';
import { useDictStore } from '@/store/modules/dict';
import { List as TenantList } from '@/api/imTenant';
import { loadImTenantOptions } from '@/views/imTenantOptions';
const dict = useDictStore();
@@ -139,10 +139,5 @@ export function loadOptions() {
}
export async function loadTenantOptions() {
const res = await TenantList({ page: 1, perPage: 20 });
tenantOptions.value = (res?.list || []).map((item) => ({
label: `${item.name}(${item.code})`,
value: item.id,
}));
return tenantOptions.value;
return loadImTenantOptions(tenantOptions, { page: 1, perPage: 20 });
}
+8 -15
View File
@@ -1,23 +1,16 @@
import { ref } from 'vue';
import { List as TenantList } from '@/api/imTenant';
import { useUserStore } from '@/store/modules/user';
import { loadImTenantOptions } from '@/views/imTenantOptions';
export { getDefaultTenantValue } from '@/views/imTenantOptions';
export const policyTenantOptions = ref<any[]>([{ label: '全局默认', value: 0 }]);
export function getDefaultTenantValue(options: any[]) {
const defaultTenant = options.find(
(item) => item.code === 'default' || String(item.label || '').includes('(default)')
);
return defaultTenant?.value || options.find((item) => Number(item.value) > 0)?.value || 0;
}
const tenantOnlyOptions = ref<any[]>([]);
export async function loadPolicyTenantOptions(includeGlobal = true) {
const res = await TenantList({ page: 1, perPage: 100 });
const tenants = (res?.list || []).map((item) => ({
label: `${item.name}(${item.code})`,
value: item.id,
code: item.code,
}));
policyTenantOptions.value = includeGlobal
const tenants = await loadImTenantOptions(tenantOnlyOptions, { page: 1, perPage: 100 });
const canUseGlobal = includeGlobal && useUserStore().isCompanyDept;
policyTenantOptions.value = canUseGlobal
? [{ label: '全局默认', value: 0 }, ...tenants]
: tenants;
return policyTenantOptions.value;
+5 -10
View File
@@ -29,7 +29,6 @@
import { useDialog, useMessage } from 'naive-ui';
import { BasicTable, TableAction } from '@/components/Table';
import { BasicForm, useForm } from '@/components/Form/index';
import { useUserStore } from '@/store/modules/user';
import { List, Review } from '@/api/imRealname';
import { columns, loadOptions, loadTenantOptions, schemas, State, tenantOptions } from './model';
import { adaTableScrollX } from '@/utils/hotgo';
@@ -37,15 +36,13 @@
const message = useMessage();
const dialog = useDialog();
const userStore = useUserStore();
const isPlatformAdmin = computed(() => userStore.isCompanyDept);
const actionRef = ref();
const searchFormRef = ref<any>({});
const viewRef = ref();
const tenantSchema = schemas.value.find((item) => item.field === 'tenantId');
if (tenantSchema) {
tenantSchema.ifShow = () => isPlatformAdmin.value;
tenantSchema.ifShow = () => true;
}
const actionColumn = reactive({
@@ -88,7 +85,7 @@
const loadDataTable = async (res) => {
const params = { ...searchFormRef.value?.formModel, ...res };
if (isPlatformAdmin.value && !params.tenantId)
if (!params.tenantId)
return { list: [], page: 1, pageCount: 0, totalCount: 0 };
return await List(params);
};
@@ -116,11 +113,9 @@
onMounted(async () => {
loadOptions();
if (isPlatformAdmin.value) {
await loadTenantOptions();
if (tenantOptions.value.length > 0) {
await setFieldsValue({ tenantId: tenantOptions.value[0].value });
}
await loadTenantOptions();
if (tenantOptions.value.length > 0) {
await setFieldsValue({ tenantId: tenantOptions.value[0].value });
}
reloadTable();
});
+2 -7
View File
@@ -3,7 +3,7 @@ import { cloneDeep } from 'lodash-es';
import { FormSchema } from '@/components/Form';
import { defRangeShortcuts } from '@/utils/dateUtil';
import { useDictStore } from '@/store/modules/dict';
import { List as TenantList } from '@/api/imTenant';
import { loadImTenantOptions } from '@/views/imTenantOptions';
const dict = useDictStore();
@@ -109,10 +109,5 @@ export function loadOptions() {
}
export async function loadTenantOptions() {
const res = await TenantList({ page: 1, perPage: 20 });
tenantOptions.value = (res?.list || []).map((item) => ({
label: `${item.name}(${item.code})`,
value: item.id,
}));
return tenantOptions.value;
return loadImTenantOptions(tenantOptions, { page: 1, perPage: 20 });
}
+98 -6
View File
@@ -168,6 +168,50 @@
>
</n-space>
</n-tab-pane>
<n-tab-pane name="moderation" tab="内容审核">
<n-alert type="info" :bordered="false">
阿里云内容审核和本地内容审核的启用状态在“商户管理”中按商户设置。
</n-alert>
<n-form-item label="审核场景">
<n-checkbox-group v-model:value="enabledModerationScenes">
<n-space>
<n-checkbox
v-for="option in moderationSceneOptions"
:key="option.value"
:value="option.value"
:label="option.label"
/>
</n-space>
</n-checkbox-group>
</n-form-item>
<n-grid :cols="2" :x-gap="16">
<n-form-item-gi
v-for="risk in moderationRiskOptions"
:key="risk.value"
:label="risk.label"
>
<n-select
v-model:value="policyForm.moderationPolicy.risk_actions[risk.value]"
:options="moderationActionOptions"
/>
</n-form-item-gi>
</n-grid>
<n-form-item label="第三方异常">
<n-radio-group v-model:value="policyForm.moderationPolicy.failure_mode">
<n-space
><n-radio value="allow">放行并告警</n-radio
><n-radio value="block">拦截并稍后重试</n-radio></n-space
>
</n-radio-group>
</n-form-item>
<n-form-item label="拦截提示">
<n-input
v-model:value="policyForm.moderationPolicy.block_message"
maxlength="100"
show-count
/>
</n-form-item>
</n-tab-pane>
<n-tab-pane name="advanced" tab="其他策略">
<n-form-item label="密码策略JSON"
><n-input
@@ -337,6 +381,32 @@
blocked_entries: [...allFriendEntries],
message: '当前时段暂不允许添加好友',
});
const moderationSceneOptions = [
{ label: '用户昵称', value: 'user_nickname' },
{ label: '用户签名', value: 'user_signature' },
{ label: '群名称', value: 'group_name' },
{ label: '群昵称', value: 'group_nickname' },
{ label: '单聊消息', value: 'private_message' },
{ label: '群聊消息', value: 'group_message' },
{ label: '群公告', value: 'group_announcement' },
];
const moderationRiskOptions = [
{ label: '高风险动作', value: 'high' },
{ label: '中风险动作', value: 'medium' },
{ label: '低风险动作', value: 'low' },
{ label: '无风险动作', value: 'none' },
];
const moderationActionOptions = [
{ label: '拦截', value: 'block' },
{ label: '仅审计', value: 'audit_only' },
{ label: '放行', value: 'allow' },
];
const defaultModerationPolicy = () => ({
scenes: Object.fromEntries(moderationSceneOptions.map((item) => [item.value, true])),
risk_actions: { high: 'block', medium: 'block', low: 'audit_only', none: 'allow' },
failure_mode: 'allow',
block_message: '内容不符合平台规范,请修改后重试',
});
const emptyPolicy = () => ({
id: 0,
tenantId: tenantId(),
@@ -344,6 +414,7 @@
passwordPolicy: '{}',
loginRateLimit: '{}',
sensitiveWordPolicy: '{}',
moderationPolicy: defaultModerationPolicy(),
fileReviewPolicy: '{}',
realnamePolicy: '{}',
riskChallengePolicy: '{}',
@@ -354,6 +425,17 @@
curfewRules: [] as any[],
});
const policyForm = ref<any>(emptyPolicy());
const enabledModerationScenes = computed({
get: () =>
Object.keys(policyForm.value.moderationPolicy?.scenes || {}).filter(
(key) => policyForm.value.moderationPolicy.scenes[key]
),
set: (values: string[]) => {
policyForm.value.moderationPolicy.scenes = Object.fromEntries(
moderationSceneOptions.map((item) => [item.value, values.includes(item.value)])
);
},
});
const policyReadOnly = computed(
() => policyForm.value.id > 0 && policyForm.value.publishStatus !== 'draft'
);
@@ -372,7 +454,7 @@
const ipForm = ref<any>(emptyIP());
const ipRules = { ipCidr: { required: true, message: '请输入IP或CIDR' } };
const tenantSchema = schemas.value.find((v) => v.field === 'tenantId');
if (tenantSchema) tenantSchema.ifShow = () => userStore.isCompanyDept;
if (tenantSchema) tenantSchema.ifShow = () => true;
const [register, { setFieldsValue }] = useForm({
gridProps: { cols: '1 s:1 m:2 l:3' },
labelWidth: 90,
@@ -445,6 +527,18 @@
passwordPolicy: data.passwordPolicy || '{}',
loginRateLimit: data.loginRateLimit || '{}',
sensitiveWordPolicy: data.sensitiveWordPolicy || '{}',
moderationPolicy: {
...defaultModerationPolicy(),
...parseJSON(data.sensitiveWordPolicy, {}),
scenes: {
...defaultModerationPolicy().scenes,
...(parseJSON(data.sensitiveWordPolicy, {}).scenes || {}),
},
risk_actions: {
...defaultModerationPolicy().risk_actions,
...(parseJSON(data.sensitiveWordPolicy, {}).risk_actions || {}),
},
},
fileReviewPolicy: data.fileReviewPolicy || '{}',
realnamePolicy: data.realnamePolicy || '{}',
riskChallengePolicy: data.riskChallengePolicy || '{}',
@@ -492,7 +586,7 @@
...f,
passwordPolicy: jsonObject(f.passwordPolicy, '密码策略'),
loginRateLimit: jsonObject(f.loginRateLimit, '登录限频'),
sensitiveWordPolicy: jsonObject(f.sensitiveWordPolicy, '敏感词策略'),
sensitiveWordPolicy: f.moderationPolicy,
fileReviewPolicy: jsonObject(f.fileReviewPolicy, '文件审核策略'),
realnamePolicy: jsonObject(f.realnamePolicy, '实名策略'),
riskChallengePolicy: jsonObject(f.riskChallengePolicy, '风控策略'),
@@ -571,10 +665,8 @@
}
onMounted(async () => {
loadOptions();
if (userStore.isCompanyDept) {
await loadPolicyTenantOptions(true);
await setFieldsValue({ tenantId: getDefaultTenantValue(policyTenantOptions.value) });
}
await loadPolicyTenantOptions(true);
await setFieldsValue({ tenantId: getDefaultTenantValue(policyTenantOptions.value) });
reloadAll();
});
</script>
+3 -5
View File
@@ -200,7 +200,7 @@
groupId: { required: true, type: 'number', message: '请选择分组' },
};
const tenantSchema = schemas.value.find((v) => v.field === 'tenantId');
if (tenantSchema) tenantSchema.ifShow = () => userStore.isCompanyDept;
if (tenantSchema) tenantSchema.ifShow = () => true;
const [register, { setFieldsValue }] = useForm({
gridProps: { cols: '1 s:1 m:2 l:3 xl:4' },
labelWidth: 90,
@@ -309,10 +309,8 @@
);
onMounted(async () => {
loadOptions();
if (userStore.isCompanyDept) {
await loadPolicyTenantOptions(true);
await setFieldsValue({ tenantId: getDefaultTenantValue(policyTenantOptions.value) });
}
await loadPolicyTenantOptions(true);
await setFieldsValue({ tenantId: getDefaultTenantValue(policyTenantOptions.value) });
await loadGroups();
reload();
});
+6 -11
View File
@@ -28,20 +28,17 @@
import { useMessage } from 'naive-ui';
import { BasicForm, useForm } from '@/components/Form/index';
import { BasicTable } from '@/components/Table';
import { useUserStore } from '@/store/modules/user';
import { List } from '@/api/imTaskDashboard';
import { columns, loadOptions, loadTenantOptions, schemas, tenantOptions } from './model';
import { adaTableScrollX } from '@/utils/hotgo';
const message = useMessage();
const userStore = useUserStore();
const isPlatformAdmin = computed(() => userStore.isCompanyDept);
const actionRef = ref();
const searchFormRef = ref<any>({});
const tenantSchema = schemas.value.find((item) => item.field === 'tenantId');
if (tenantSchema) {
tenantSchema.ifShow = () => isPlatformAdmin.value;
tenantSchema.ifShow = () => true;
}
const scrollX = computed(() => adaTableScrollX(columns, 0));
@@ -68,13 +65,11 @@
onMounted(async () => {
loadOptions();
if (isPlatformAdmin.value) {
await loadTenantOptions();
if (tenantOptions.value.length > 0) {
await setFieldsValue({ tenantId: tenantOptions.value[0].value });
} else {
message.warning('暂无可用商户');
}
await loadTenantOptions();
if (tenantOptions.value.length > 0) {
await setFieldsValue({ tenantId: tenantOptions.value[0].value });
} else {
message.warning('暂无可用商户');
}
reloadTable();
});
+2 -7
View File
@@ -1,7 +1,7 @@
import { computed, ref } from 'vue';
import { FormSchema } from '@/components/Form';
import { useDictStore } from '@/store/modules/dict';
import { List as TenantList } from '@/api/imTenant';
import { loadImTenantOptions } from '@/views/imTenantOptions';
const dict = useDictStore();
@@ -79,10 +79,5 @@ export function loadOptions() {
}
export async function loadTenantOptions() {
const res = await TenantList({ page: 1, perPage: 100 });
tenantOptions.value = (res?.list || []).map((item) => ({
label: `${item.name}(${item.code})`,
value: item.id,
}));
return tenantOptions.value;
return loadImTenantOptions(tenantOptions, { page: 1, perPage: 100 });
}
+88
View File
@@ -0,0 +1,88 @@
import { Ref } from 'vue';
import { List as TenantList } from '@/api/imTenant';
import { useUserStore } from '@/store/modules/user';
export interface ImTenantOption {
label: string;
value: number;
code?: string;
name?: string;
}
export function formatImTenantLabel(item: any): string {
const code = item?.code || item?.tenantCode || '';
const name = item?.name || item?.tenantName || '当前商户';
return code ? `${name} (${code})` : name;
}
export function getDefaultTenantValue(options: any[]) {
const defaultTenant = options.find(
(item) => item.code === 'default' || String(item.label || '').includes('(default)')
);
return defaultTenant?.value || options.find((item) => Number(item.value) > 0)?.value || 0;
}
export async function loadImTenantOptions(
target: Ref<ImTenantOption[]>,
params: Record<string, any> = { page: 1, perPage: 100 }
) {
const userStore = useUserStore();
const userInfo = { ...readTokenUserInfo(userStore.getToken), ...(userStore.getUserInfo as any) };
const boundTenantId = Number(userInfo?.tenantId || userInfo?.tenantID || 0);
if (!userStore.isCompanyDept) {
if (boundTenantId <= 0) {
target.value = [];
return target.value;
}
let tenant: any = null;
try {
const res = await TenantList({ ...params, id: boundTenantId, page: 1, perPage: 1 });
tenant = (res?.list || []).find((item) => Number(item.id) === boundTenantId);
} catch {
tenant = null;
}
target.value = [
tenant
? toTenantOption(tenant)
: {
label: formatImTenantLabel({
id: boundTenantId,
name: userInfo?.tenantName,
code: userInfo?.tenantCode,
}),
value: boundTenantId,
code: userInfo?.tenantCode,
name: userInfo?.tenantName,
},
];
return target.value;
}
const res = await TenantList(params);
target.value = (res?.list || []).map(toTenantOption);
return target.value;
}
function toTenantOption(item: any): ImTenantOption {
return {
label: formatImTenantLabel(item),
value: Number(item.id),
code: item.code,
name: item.name,
};
}
function readTokenUserInfo(token: string) {
try {
const payload = token.split('.')[1];
if (!payload) return {};
const normalized = payload.replace(/-/g, '+').replace(/_/g, '/');
const padded = normalized.padEnd(Math.ceil(normalized.length / 4) * 4, '=');
const binary = window.atob(padded);
const bytes = Uint8Array.from(binary, (char) => char.charCodeAt(0));
return JSON.parse(new TextDecoder().decode(bytes));
} catch {
return {};
}
}
+8 -13
View File
@@ -211,7 +211,6 @@
import { BasicTable, TableAction } from '@/components/Table';
import { BasicForm, useForm } from '@/components/Form/index';
import { usePermission } from '@/hooks/web/usePermission';
import { useUserStore } from '@/store/modules/user';
import {
AccountCancel,
AdjustGroup,
@@ -244,8 +243,6 @@
const message = useMessage();
const dialog = useDialog();
const { hasPermission } = usePermission();
const userStore = useUserStore();
const isPlatformAdmin = computed(() => userStore.isCompanyDept);
const actionRef = ref();
const searchFormRef = ref<any>({});
const viewRef = ref();
@@ -286,7 +283,7 @@
const tenantSchema = schemas.value.find((item) => item.field === 'tenantId');
if (tenantSchema) {
tenantSchema.ifShow = () => isPlatformAdmin.value;
tenantSchema.ifShow = () => true;
}
const actionColumn = reactive({
@@ -364,7 +361,7 @@
// 加载表格数据
const loadDataTable = async (res) => {
const params = { ...searchFormRef.value?.formModel, ...res };
if (isPlatformAdmin.value && !params.tenantId) {
if (!params.tenantId) {
return { list: [], page: 1, pageCount: 0, totalCount: 0 };
}
return await List(params);
@@ -569,14 +566,12 @@
onMounted(async () => {
loadOptions();
let tenantId = currentTenantId();
if (isPlatformAdmin.value) {
await loadTenantOptions();
if (tenantOptions.value.length > 0) {
tenantId = Number(tenantOptions.value[0].value);
await setFieldsValue({ tenantId });
} else {
message.warning('暂无可用商户');
}
await loadTenantOptions();
if (tenantOptions.value.length > 0) {
tenantId = Number(tenantOptions.value[0].value);
await setFieldsValue({ tenantId });
} else {
message.warning('暂无可用商户');
}
await loadPolicyGroupOptions(tenantId);
reloadTable();
+2 -7
View File
@@ -3,7 +3,7 @@ import { NImage, NTag } from 'naive-ui';
import { cloneDeep } from 'lodash-es';
import { FormSchema } from '@/components/Form';
import { useDictStore } from '@/store/modules/dict';
import { List as TenantList } from '@/api/imTenant';
import { loadImTenantOptions } from '@/views/imTenantOptions';
import { List as PolicyGroupList } from '@/api/imUserPolicyGroup';
import defaultAvatar from '@/assets/images/schoolboy.png';
@@ -249,12 +249,7 @@ export function loadOptions() {
}
export async function loadTenantOptions() {
const res = await TenantList({ page: 1, perPage: 20 });
tenantOptions.value = (res?.list || []).map((item) => ({
label: `${item.name}(${item.code})`,
value: item.id,
}));
return tenantOptions.value;
return loadImTenantOptions(tenantOptions, { page: 1, perPage: 20 });
}
export async function loadPolicyGroupOptions(tenantId: number) {
+8 -13
View File
@@ -39,7 +39,6 @@
import { BasicForm, useForm } from '@/components/Form/index';
import { BasicTable } from '@/components/Table';
import { usePermission } from '@/hooks/web/usePermission';
import { useUserStore } from '@/store/modules/user';
import { adaTableScrollX } from '@/utils/hotgo';
import { Export, List } from '@/api/imUserLoginHistory';
import { imQueryTenantOptions, loadImQueryTenantOptions } from '@/views/imAdminQueryShared';
@@ -47,12 +46,10 @@
const message = useMessage();
const { hasPermission } = usePermission();
const userStore = useUserStore();
const isPlatformAdmin = computed(() => userStore.isCompanyDept);
const actionRef = ref();
const searchFormRef = ref<any>({});
const tenantSchema = schemas.value.find((item) => item.field === 'tenantId');
if (tenantSchema) tenantSchema.ifShow = () => isPlatformAdmin.value;
if (tenantSchema) tenantSchema.ifShow = () => true;
const scrollX = computed(() => adaTableScrollX(columns, 0));
const [register, { setFieldsValue }] = useForm({
gridProps: { cols: '1 s:1 m:2 l:3 xl:4 2xl:4' },
@@ -61,7 +58,7 @@
});
const loadDataTable = async (res) => {
const params = { ...searchFormRef.value?.formModel, ...res };
if (isPlatformAdmin.value && !params.tenantId)
if (!params.tenantId)
return { list: [], page: 1, pageCount: 0, totalCount: 0 };
return List(params);
};
@@ -70,13 +67,13 @@
}
async function handleReset() {
const defaults: Recordable = {};
if (isPlatformAdmin.value) defaults.tenantId = imQueryTenantOptions.value[0]?.value;
defaults.tenantId = imQueryTenantOptions.value[0]?.value;
await setFieldsValue(defaults);
reloadTable();
}
function handleExport() {
const params = { ...searchFormRef.value?.formModel };
if (isPlatformAdmin.value && !params.tenantId) {
if (!params.tenantId) {
message.warning('请选择商户');
return;
}
@@ -84,12 +81,10 @@
}
onMounted(async () => {
loadOptions();
if (isPlatformAdmin.value) {
await loadImQueryTenantOptions();
if (imQueryTenantOptions.value.length)
await setFieldsValue({ tenantId: imQueryTenantOptions.value[0].value });
else message.warning('暂无可用商户');
}
await loadImQueryTenantOptions();
if (imQueryTenantOptions.value.length)
await setFieldsValue({ tenantId: imQueryTenantOptions.value[0].value });
else message.warning('暂无可用商户');
reloadTable();
});
</script>
+4 -6
View File
@@ -284,7 +284,7 @@
groupName: { required: true, message: '请输入分组名称', trigger: 'blur' },
};
const tenantSchema = schemas.value.find((v) => v.field === 'tenantId');
if (tenantSchema) tenantSchema.ifShow = () => userStore.isCompanyDept;
if (tenantSchema) tenantSchema.ifShow = () => true;
const [register, { setFieldsValue }] = useForm({
gridProps: { cols: '1 s:1 m:2 l:3 xl:4' },
labelWidth: 90,
@@ -335,7 +335,7 @@
}
async function fetchLoginIPWhitelist() {
const tenantId = currentTenantId();
if (userStore.isCompanyDept && tenantId <= 0) {
if (tenantId <= 0) {
return null;
}
return await LoginIPWhitelist({ tenantId });
@@ -479,10 +479,8 @@
}
onMounted(async () => {
loadOptions();
if (userStore.isCompanyDept) {
await loadPolicyTenantOptions(true);
await setFieldsValue({ tenantId: getDefaultTenantValue(policyTenantOptions.value) });
}
await loadPolicyTenantOptions(true);
await setFieldsValue({ tenantId: getDefaultTenantValue(policyTenantOptions.value) });
reloadTable();
});
</script>
+8 -13
View File
@@ -30,7 +30,6 @@
import { useDialog, useMessage } from 'naive-ui';
import { BasicTable, TableAction } from '@/components/Table';
import { BasicForm, useForm } from '@/components/Form/index';
import { useUserStore } from '@/store/modules/user';
import { List, Status } from '@/api/imWorkOrder';
import { columns, loadOptions, loadTenantOptions, schemas, State, tenantOptions } from './model';
import { adaTableScrollX } from '@/utils/hotgo';
@@ -38,15 +37,13 @@
const message = useMessage();
const dialog = useDialog();
const userStore = useUserStore();
const isPlatformAdmin = computed(() => userStore.isCompanyDept);
const actionRef = ref();
const searchFormRef = ref<any>({});
const viewRef = ref();
const tenantSchema = schemas.value.find((item) => item.field === 'tenantId');
if (tenantSchema) {
tenantSchema.ifShow = () => isPlatformAdmin.value;
tenantSchema.ifShow = () => true;
}
const actionColumn = reactive({
@@ -102,7 +99,7 @@
const loadDataTable = async (res) => {
const params = { ...searchFormRef.value?.formModel, ...res };
if ((isPlatformAdmin.value && !params.tenantId) || !params.type)
if (!params.tenantId || !params.type)
return { list: [], page: 1, pageCount: 0, totalCount: 0 };
return await List(params);
};
@@ -113,7 +110,7 @@
async function handleReset() {
const defaults: Recordable = { type: 'abuse' };
if (isPlatformAdmin.value && tenantOptions.value.length > 0)
if (tenantOptions.value.length > 0)
defaults.tenantId = tenantOptions.value[0].value;
await setFieldsValue(defaults);
reloadTable();
@@ -139,13 +136,11 @@
onMounted(async () => {
loadOptions();
await setFieldsValue({ type: 'abuse' });
if (isPlatformAdmin.value) {
await loadTenantOptions();
if (tenantOptions.value.length > 0) {
await setFieldsValue({ tenantId: tenantOptions.value[0].value, type: 'abuse' });
} else {
message.warning('暂无可用商户');
}
await loadTenantOptions();
if (tenantOptions.value.length > 0) {
await setFieldsValue({ tenantId: tenantOptions.value[0].value, type: 'abuse' });
} else {
message.warning('暂无可用商户');
}
reloadTable();
});
+2 -7
View File
@@ -3,7 +3,7 @@ import { cloneDeep } from 'lodash-es';
import { FormSchema } from '@/components/Form';
import { defRangeShortcuts } from '@/utils/dateUtil';
import { useDictStore } from '@/store/modules/dict';
import { List as TenantList } from '@/api/imTenant';
import { loadImTenantOptions } from '@/views/imTenantOptions';
const dict = useDictStore();
@@ -140,10 +140,5 @@ export function loadOptions() {
}
export async function loadTenantOptions() {
const res = await TenantList({ page: 1, perPage: 20 });
tenantOptions.value = (res?.list || []).map((item) => ({
label: `${item.name}(${item.code})`,
value: item.id,
}));
return tenantOptions.value;
return loadImTenantOptions(tenantOptions, { page: 1, perPage: 20 });
}
+9 -14
View File
@@ -109,7 +109,6 @@
import { BasicForm, useForm } from '@/components/Form/index';
import { BasicTable, TableAction } from '@/components/Table';
import { usePermission } from '@/hooks/web/usePermission';
import { useUserStore } from '@/store/modules/user';
import { Delete, Edit, List, Reorder } from '@/api/imWorkbench';
import { adaModalWidth, adaTableScrollX } from '@/utils/hotgo';
import {
@@ -127,8 +126,6 @@
const dialog = useDialog();
const message = useMessage();
const { hasPermission } = usePermission();
const userStore = useUserStore();
const isPlatformAdmin = computed(() => userStore.isCompanyDept);
const actionRef = ref();
const searchFormRef = ref<any>({});
const formRef = ref();
@@ -141,12 +138,12 @@
const routeOptions = dict.getOption('ImWorkbenchRouteOptions');
const permissionOptions = dict.getOption('ImWorkbenchPermissionOptions');
const currentTenantReady = computed(
() => !isPlatformAdmin.value || !!searchFormRef.value?.formModel?.tenantId
() => !!searchFormRef.value?.formModel?.tenantId
);
const tenantSchema = schemas.value.find((item) => item.field === 'tenantId');
if (tenantSchema) {
tenantSchema.ifShow = () => isPlatformAdmin.value;
tenantSchema.ifShow = () => true;
}
const enabledValue = computed({
@@ -190,7 +187,7 @@
const loadDataTable = async (res) => {
const params = { ...searchFormRef.value?.formModel, ...res };
if (isPlatformAdmin.value && !params.tenantId) {
if (!params.tenantId) {
tableRows.value = [];
return { list: [], page: 1, pageCount: 0, totalCount: 0 };
}
@@ -205,7 +202,7 @@
async function handleReset() {
const defaults: Recordable = {};
if (isPlatformAdmin.value && tenantOptions.value.length > 0)
if (tenantOptions.value.length > 0)
defaults.tenantId = tenantOptions.value[0].value;
await setFieldsValue(defaults);
reloadTable();
@@ -278,13 +275,11 @@
onMounted(async () => {
loadOptions();
if (isPlatformAdmin.value) {
await loadTenantOptions();
if (tenantOptions.value.length > 0) {
await setFieldsValue({ tenantId: tenantOptions.value[0].value });
} else {
message.warning('暂无可用商户');
}
await loadTenantOptions();
if (tenantOptions.value.length > 0) {
await setFieldsValue({ tenantId: tenantOptions.value[0].value });
} else {
message.warning('暂无可用商户');
}
reloadTable();
});
+2 -7
View File
@@ -2,7 +2,7 @@ import { computed, ref } from 'vue';
import { cloneDeep } from 'lodash-es';
import { FormSchema } from '@/components/Form';
import { useDictStore } from '@/store/modules/dict';
import { List as TenantList } from '@/api/imTenant';
import { loadImTenantOptions } from '@/views/imTenantOptions';
const dict = useDictStore();
@@ -134,10 +134,5 @@ export function loadOptions() {
}
export async function loadTenantOptions() {
const res = await TenantList({ page: 1, perPage: 100 });
tenantOptions.value = (res?.list || []).map((item) => ({
label: `${item.name}(${item.code})`,
value: item.id,
}));
return tenantOptions.value;
return loadImTenantOptions(tenantOptions, { page: 1, perPage: 100 });
}