style(api): 统一代码风格并修复语法问题

- 统一import语句的空格格式
- 修复分号缺失问题
- 调整函数参数换行格式以符合规范
- 删除多余空行保持代码整洁
- 修复字符串拼接的换行格式问题
This commit is contained in:
2026-01-21 00:26:14 +08:00
parent 7a37f66081
commit 82ac209505
559 changed files with 40550 additions and 37977 deletions

View File

@@ -1,52 +1,45 @@
<!-- 搜索表单 -->
<template>
<a-space style="flex-wrap: wrap; display: none;" v-if="hasRole('superAdmin') || hasRole('admin') || hasRole('foundation')">
<a-button
type="text"
@click="openUrl('/dormitory/building')"
>楼栋管理
</a-button
>
<a-button
type="text"
@click="openUrl('/dormitory/floor')"
>楼层管理
</a-button
>
<a-button
type="text"
@click="openUrl('/dormitory/record')"
>宿舍管理
</a-button
>
<a-space
style="flex-wrap: wrap; display: none"
v-if="hasRole('superAdmin') || hasRole('admin') || hasRole('foundation')"
>
<a-button type="text" @click="openUrl('/dormitory/building')"
>楼栋管理
</a-button>
<a-button type="text" @click="openUrl('/dormitory/floor')"
>楼层管理
</a-button>
<a-button type="text" @click="openUrl('/dormitory/record')"
>宿舍管理
</a-button>
</a-space>
</template>
<script lang="ts" setup>
import {watch, nextTick} from 'vue';
import {CmsWebsite} from '@/api/cms/cmsWebsite/model';
import {openUrl} from "@/utils/common";
import {hasAnyRole, hasPermission, hasRole} from "@/utils/permission";
import { watch, nextTick } from 'vue';
import { CmsWebsite } from '@/api/cms/cmsWebsite/model';
import { openUrl } from '@/utils/common';
import { hasAnyRole, hasPermission, hasRole } from '@/utils/permission';
const props = withDefaults(
defineProps<{
// 选中的角色
selection?: [];
website?: CmsWebsite;
count?: 0;
}>(),
{}
);
const props = withDefaults(
defineProps<{
// 选中的角色
selection?: [];
website?: CmsWebsite;
count?: 0;
}>(),
{}
);
nextTick(() => {
if (localStorage.getItem('NotActive')) {
// IsActive.value = false
}
})
nextTick(() => {
if (localStorage.getItem('NotActive')) {
// IsActive.value = false
}
});
watch(
() => props.selection,
() => {
}
);
watch(
() => props.selection,
() => {}
);
</script>

View File

@@ -1,100 +1,71 @@
<!-- 搜索表单 -->
<template>
<a-space style="flex-wrap: wrap">
<a-button
type="text"
@click="openUrl(`/website/field`)"
>字段扩展
<a-button type="text" @click="openUrl(`/website/field`)"
>字段扩展
</a-button>
<a-button
type="text"
@click="openUrl('/website/dict')"
>字典管理
<a-button type="text" @click="openUrl('/website/dict')">字典管理 </a-button>
<a-button type="text" @click="openUrl('/website/domain')"
>域名管理
</a-button>
<a-button
type="text"
@click="openUrl('/website/domain')"
>域名管理
</a-button
>
<a-button
type="text"
@click="openUrl('/website/model')"
>模型管理
</a-button
>
<a-button
type="text"
@click="openUrl('/website/form')"
>表单管理
</a-button
>
<a-button
type="text"
@click="openUrl('/website/lang')"
>国际化
</a-button
>
<a-button
type="text"
@click="openUrl('/website/setting')"
>网站设置
</a-button
>
<a-button
type="text"
class="ele-btn-icon"
@click="clearSiteInfoCache">
<a-button type="text" @click="openUrl('/website/model')"
>模型管理
</a-button>
<a-button type="text" @click="openUrl('/website/form')">表单管理 </a-button>
<a-button type="text" @click="openUrl('/website/lang')">国际化 </a-button>
<a-button type="text" @click="openUrl('/website/setting')"
>网站设置
</a-button>
<a-button type="text" class="ele-btn-icon" @click="clearSiteInfoCache">
清除缓存
</a-button>
</a-space>
</template>
<script lang="ts" setup>
import {watch,nextTick} from 'vue';
import {CmsWebsite} from '@/api/cms/cmsWebsite/model';
import {openUrl} from "@/utils/common";
import {message} from 'ant-design-vue';
import {removeSiteInfoCache} from "@/api/cms/cmsWebsite";
import { watch, nextTick } from 'vue';
import { CmsWebsite } from '@/api/cms/cmsWebsite/model';
import { openUrl } from '@/utils/common';
import { message } from 'ant-design-vue';
import { removeSiteInfoCache } from '@/api/cms/cmsWebsite';
const props = withDefaults(
defineProps<{
// 选中的角色
selection?: [];
website?: CmsWebsite;
count?: 0;
}>(),
{}
);
const props = withDefaults(
defineProps<{
// 选中的角色
selection?: [];
website?: CmsWebsite;
count?: 0;
}>(),
{}
);
const emit = defineEmits<{
(e: 'add'): void;
}>();
const emit = defineEmits<{
(e: 'add'): void;
}>();
const add = () => {
emit('add');
};
const add = () => {
emit('add');
};
// 清除缓存
const clearSiteInfoCache = () => {
removeSiteInfoCache('SiteInfo:' + localStorage.getItem('TenantId') + "*").then(
(msg) => {
// 清除缓存
const clearSiteInfoCache = () => {
removeSiteInfoCache(
'SiteInfo:' + localStorage.getItem('TenantId') + '*'
).then((msg) => {
if (msg) {
message.success(msg);
}
});
};
nextTick(() => {
if (localStorage.getItem('NotActive')) {
// IsActive.value = false
}
});
watch(
() => props.selection,
() => {}
);
};
nextTick(() => {
if(localStorage.getItem('NotActive')){
// IsActive.value = false
}
})
watch(
() => props.selection,
() => {
}
);
</script>

View File

@@ -39,11 +39,8 @@
v-model:value="form.websiteName"
/>
</a-form-item>
<a-form-item label="网站域名" name="domain" v-if="form.type == 10">
<a-input
v-model:value="form.domain"
placeholder="huawei.com"
>
<a-form-item label="网站域名" name="domain" v-if="form.type == 10">
<a-input v-model:value="form.domain" placeholder="huawei.com">
<template #addonBefore>
<a-select v-model:value="form.prefix" style="width: 90px">
<a-select-option value="http://">http://</a-select-option>
@@ -52,7 +49,7 @@
</template>
</a-input>
</a-form-item>
<a-form-item label="AppId" name="websiteCode" v-if="form.type == 20">
<a-form-item label="AppId" name="websiteCode" v-if="form.type == 20">
<a-input
allow-clear
placeholder="请输入AppId"
@@ -120,294 +117,292 @@
</template>
<script lang="ts" setup>
import {ref, reactive, watch} from 'vue';
import {Form, message} from 'ant-design-vue';
import {assignObject, uuid} from 'ele-admin-pro';
import {addCmsWebsite, updateCmsWebsite} from '@/api/cms/cmsWebsite';
import {CmsWebsite} from '@/api/cms/cmsWebsite/model';
import {useThemeStore} from '@/store/modules/theme';
import {storeToRefs} from 'pinia';
import {FormInstance, type Rule} from 'ant-design-vue/es/form';
import {ItemType} from 'ele-admin-pro/es/ele-image-upload/types';
import {FileRecord} from '@/api/system/file/model';
import {checkExistence} from '@/api/cms/cmsDomain';
import {updateCmsDomain} from '@/api/cms/cmsDomain';
import {updateTenant} from "@/api/system/tenant";
import { ref, reactive, watch } from 'vue';
import { Form, message } from 'ant-design-vue';
import { assignObject, uuid } from 'ele-admin-pro';
import { addCmsWebsite, updateCmsWebsite } from '@/api/cms/cmsWebsite';
import { CmsWebsite } from '@/api/cms/cmsWebsite/model';
import { useThemeStore } from '@/store/modules/theme';
import { storeToRefs } from 'pinia';
import { FormInstance, type Rule } from 'ant-design-vue/es/form';
import { ItemType } from 'ele-admin-pro/es/ele-image-upload/types';
import { FileRecord } from '@/api/system/file/model';
import { checkExistence } from '@/api/cms/cmsDomain';
import { updateCmsDomain } from '@/api/cms/cmsDomain';
import { updateTenant } from '@/api/system/tenant';
// 是否是修改
const isUpdate = ref(false);
const useForm = Form.useForm;
// 是否开启响应式布局
const themeStore = useThemeStore();
const {styleResponsive} = storeToRefs(themeStore);
// 是否是修改
const isUpdate = ref(false);
const useForm = Form.useForm;
// 是否开启响应式布局
const themeStore = useThemeStore();
const { styleResponsive } = storeToRefs(themeStore);
const props = defineProps<{
// 弹窗是否打开
visible: boolean;
// 修改回显的数据
data?: CmsWebsite | null;
}>();
const props = defineProps<{
// 弹窗是否打开
visible: boolean;
// 修改回显的数据
data?: CmsWebsite | null;
}>();
const emit = defineEmits<{
(e: 'done'): void;
(e: 'update:visible', visible: boolean): void;
}>();
const emit = defineEmits<{
(e: 'done'): void;
(e: 'update:visible', visible: boolean): void;
}>();
// 提交状态
const loading = ref(false);
// 是否显示最大化切换按钮
const maxable = ref(true);
// 表格选中数据
const formRef = ref<FormInstance | null>(null);
const images = ref<ItemType[]>([]);
const websiteQrcode = ref<ItemType[]>([]);
const oldDomain = ref();
const files = ref<ItemType[]>([]);
// 提交状态
const loading = ref(false);
// 是否显示最大化切换按钮
const maxable = ref(true);
// 表格选中数据
const formRef = ref<FormInstance | null>(null);
const images = ref<ItemType[]>([]);
const websiteQrcode = ref<ItemType[]>([]);
const oldDomain = ref();
const files = ref<ItemType[]>([]);
// 用户信息
const form = reactive<CmsWebsite>({
websiteId: undefined,
websiteLogo: undefined,
websiteName: undefined,
websiteCode: undefined,
type: 20,
files: undefined,
keywords: '',
prefix: '',
domain: '',
adminUrl: '',
style: '',
icpNo: undefined,
email: undefined,
version: undefined,
websiteType: '',
running: 1,
expirationTime: undefined,
sortNumber: undefined,
comments: undefined,
status: undefined,
statusText: undefined
});
/* 更新visible */
const updateVisible = (value: boolean) => {
emit('update:visible', value);
};
// 表单验证规则
const rules = reactive({
// comments: [
// {
// required: true,
// type: 'string',
// message: '请填写小程序描述',
// trigger: 'blur'
// }
// ],
keywords: [
{
required: true,
type: 'string',
message: '请填写SEO关键词',
trigger: 'blur'
}
],
running: [
{
required: true,
type: 'number',
message: '请选择小程序状态',
trigger: 'change'
}
],
domain: [
{
required: true,
type: 'string',
message: '请填写小程序域名',
trigger: 'blur'
}
],
websiteCode: [
{
required: true,
type: 'string',
message: '请填写小程序码',
trigger: 'blur'
}
],
// websiteCode: [
// {
// required: true,
// type: 'string',
// message: '该域名已被使用',
// validator: (_rule: Rule, value: string) => {
// return new Promise<void>((resolve, reject) => {
// if (!value) {
// return reject('请输入二级域名');
// }
// checkExistence('domain', `${value}.wsdns.cn`)
// .then(() => {
// if (value === oldDomain.value) {
// return resolve();
// }
// reject('已存在');
// })
// .catch(() => {
// resolve();
// });
// });
// },
// trigger: 'blur'
// }
// ],
adminUrl: [
{
required: true,
type: 'string',
message: '请填写小程序后台管理地址',
trigger: 'blur'
}
],
icpNo: [
{
required: true,
type: 'string',
message: '请填写ICP备案号',
trigger: 'blur'
}
],
appSecret: [
{
required: true,
type: 'string',
message: '请填写小程序秘钥',
trigger: 'blur'
}
],
websiteName: [
{
required: true,
type: 'string',
message: '请填写小程序信息名称',
trigger: 'blur'
}
]
});
const chooseImage = (data: FileRecord) => {
images.value.push({
uid: data.id,
url: data.path,
status: 'done'
// 用户信息
const form = reactive<CmsWebsite>({
websiteId: undefined,
websiteLogo: undefined,
websiteName: undefined,
websiteCode: undefined,
type: 20,
files: undefined,
keywords: '',
prefix: '',
domain: '',
adminUrl: '',
style: '',
icpNo: undefined,
email: undefined,
version: undefined,
websiteType: '',
running: 1,
expirationTime: undefined,
sortNumber: undefined,
comments: undefined,
status: undefined,
statusText: undefined
});
form.websiteLogo = data.downloadUrl;
};
const onDeleteItem = (index: number) => {
images.value.splice(index, 1);
form.websiteLogo = '';
};
/* 更新visible */
const updateVisible = (value: boolean) => {
emit('update:visible', value);
};
const chooseFile = (data: FileRecord) => {
form.websiteCode = data.url;
files.value.push({
uid: data.id,
url: data.url,
status: 'done'
});
};
const onDeleteFile = (index: number) => {
files.value.splice(index, 1);
};
// const onWebsiteType = (text: string) => {
// form.websiteType = text;
// };
const {resetFields} = useForm(form, rules);
/* 保存编辑 */
const save = () => {
if (!formRef.value) {
return;
}
formRef.value
.validate()
.then(() => {
loading.value = true;
const saveOrUpdate = isUpdate.value ? updateCmsWebsite : addCmsWebsite;
if (!isUpdate.value) {
updateVisible(false);
message.loading('创建过程中请勿刷新页面!', 0)
// 表单验证规则
const rules = reactive({
// comments: [
// {
// required: true,
// type: 'string',
// message: '请填写小程序描述',
// trigger: 'blur'
// }
// ],
keywords: [
{
required: true,
type: 'string',
message: '请填写SEO关键词',
trigger: 'blur'
}
const formData = {
...form,
type: 20,
adminUrl: `mp.websoft.top`,
files: JSON.stringify(files.value),
};
saveOrUpdate(formData)
.then((msg) => {
loading.value = false;
updateVisible(false);
updateCmsDomain({
websiteId: form.websiteId,
domain: `${localStorage.getItem('TenantId')}.shoplnk.cn`
});
updateTenant({
tenantName: `${form.websiteName}`
}).then(() => {
})
localStorage.setItem('Domain', `${form.websiteCode}.shoplnk.cn`);
localStorage.setItem('WebsiteId', `${form.websiteId}`);
localStorage.setItem('WebsiteName', `${form.websiteName}`);
message.destroy();
message.success(msg);
// window.location.reload();
emit('done');
})
.catch((e) => {
loading.value = false;
message.destroy();
message.error(e.message);
});
})
.catch(() => {
],
running: [
{
required: true,
type: 'number',
message: '请选择小程序状态',
trigger: 'change'
}
],
domain: [
{
required: true,
type: 'string',
message: '请填写小程序域名',
trigger: 'blur'
}
],
websiteCode: [
{
required: true,
type: 'string',
message: '请填写小程序码',
trigger: 'blur'
}
],
// websiteCode: [
// {
// required: true,
// type: 'string',
// message: '该域名已被使用',
// validator: (_rule: Rule, value: string) => {
// return new Promise<void>((resolve, reject) => {
// if (!value) {
// return reject('请输入二级域名');
// }
// checkExistence('domain', `${value}.wsdns.cn`)
// .then(() => {
// if (value === oldDomain.value) {
// return resolve();
// }
// reject('已存在');
// })
// .catch(() => {
// resolve();
// });
// });
// },
// trigger: 'blur'
// }
// ],
adminUrl: [
{
required: true,
type: 'string',
message: '请填写小程序后台管理地址',
trigger: 'blur'
}
],
icpNo: [
{
required: true,
type: 'string',
message: '请填写ICP备案号',
trigger: 'blur'
}
],
appSecret: [
{
required: true,
type: 'string',
message: '请填写小程序秘钥',
trigger: 'blur'
}
],
websiteName: [
{
required: true,
type: 'string',
message: '请填写小程序信息名称',
trigger: 'blur'
}
]
});
const chooseImage = (data: FileRecord) => {
images.value.push({
uid: data.id,
url: data.path,
status: 'done'
});
};
form.websiteLogo = data.downloadUrl;
};
watch(
() => props.visible,
(visible) => {
if (visible) {
images.value = [];
files.value = [];
websiteQrcode.value = [];
if (props.data?.websiteId) {
assignObject(form, props.data);
if (props.data.websiteLogo) {
images.value.push({
uid: uuid(),
url: props.data.websiteLogo,
status: 'done'
});
}
if (props.data.files) {
files.value = JSON.parse(props.data.files);
}
if (props.data.websiteCode) {
oldDomain.value = props.data.websiteCode;
}
isUpdate.value = true;
} else {
isUpdate.value = false;
}
} else {
resetFields();
const onDeleteItem = (index: number) => {
images.value.splice(index, 1);
form.websiteLogo = '';
};
const chooseFile = (data: FileRecord) => {
form.websiteCode = data.url;
files.value.push({
uid: data.id,
url: data.url,
status: 'done'
});
};
const onDeleteFile = (index: number) => {
files.value.splice(index, 1);
};
// const onWebsiteType = (text: string) => {
// form.websiteType = text;
// };
const { resetFields } = useForm(form, rules);
/* 保存编辑 */
const save = () => {
if (!formRef.value) {
return;
}
},
{immediate: true}
);
formRef.value
.validate()
.then(() => {
loading.value = true;
const saveOrUpdate = isUpdate.value ? updateCmsWebsite : addCmsWebsite;
if (!isUpdate.value) {
updateVisible(false);
message.loading('创建过程中请勿刷新页面!', 0);
}
const formData = {
...form,
type: 20,
adminUrl: `mp.websoft.top`,
files: JSON.stringify(files.value)
};
saveOrUpdate(formData)
.then((msg) => {
loading.value = false;
updateVisible(false);
updateCmsDomain({
websiteId: form.websiteId,
domain: `${localStorage.getItem('TenantId')}.shoplnk.cn`
});
updateTenant({
tenantName: `${form.websiteName}`
}).then(() => {});
localStorage.setItem('Domain', `${form.websiteCode}.shoplnk.cn`);
localStorage.setItem('WebsiteId', `${form.websiteId}`);
localStorage.setItem('WebsiteName', `${form.websiteName}`);
message.destroy();
message.success(msg);
// window.location.reload();
emit('done');
})
.catch((e) => {
loading.value = false;
message.destroy();
message.error(e.message);
});
})
.catch(() => {});
};
watch(
() => props.visible,
(visible) => {
if (visible) {
images.value = [];
files.value = [];
websiteQrcode.value = [];
if (props.data?.websiteId) {
assignObject(form, props.data);
if (props.data.websiteLogo) {
images.value.push({
uid: uuid(),
url: props.data.websiteLogo,
status: 'done'
});
}
if (props.data.files) {
files.value = JSON.parse(props.data.files);
}
if (props.data.websiteCode) {
oldDomain.value = props.data.websiteCode;
}
isUpdate.value = true;
} else {
isUpdate.value = false;
}
} else {
resetFields();
}
},
{ immediate: true }
);
</script>

View File

@@ -17,17 +17,29 @@
</a-col>
<a-col :span="14">
<div class="system-info">
<h2 class="ele-text-heading cursor-pointer" @click="$router.push('/website/index')">{{ siteStore.appName }}</h2>
<h2
class="ele-text-heading cursor-pointer"
@click="$router.push('/website/index')"
>{{ siteStore.appName }}</h2
>
<p class="ele-text-secondary">{{ siteStore.description }}</p>
<a-space>
<a-tag color="green">{{ siteStore.statusText }}</a-tag>
<a-tag color="blue" v-if="siteStore.version">{{ siteStore.version }}</a-tag>
<a-tag color="blue" v-if="siteStore.version">{{
siteStore.version
}}</a-tag>
<a-popover title="小程序码" v-if="siteStore.mpQrCode">
<template #content>
<p><img :src="siteStore.mpQrCode" alt="小程序码" width="300" height="300"></p>
<p
><img
:src="siteStore.mpQrCode"
alt="小程序码"
width="300"
height="300"
/></p>
</template>
<a-tag>
<QrcodeOutlined/>
<QrcodeOutlined />
</a-tag>
</a-popover>
</a-space>
@@ -35,7 +47,6 @@
</a-col>
<a-col :span="3">
<div class="flex justify-center items-center h-full w-full">
</div>
</a-col>
</a-row>
@@ -52,7 +63,7 @@
:loading="loading"
>
<template #prefix>
<UserOutlined/>
<UserOutlined />
</template>
</a-statistic>
</a-card>
@@ -67,7 +78,7 @@
:loading="loading"
>
<template #prefix>
<AccountBookOutlined/>
<AccountBookOutlined />
</template>
</a-statistic>
</a-card>
@@ -82,7 +93,7 @@
:loading="loading"
>
<template #prefix>
<MoneyCollectOutlined/>
<MoneyCollectOutlined />
</template>
</a-statistic>
</a-card>
@@ -98,7 +109,7 @@
:loading="loading"
>
<template #prefix>
<ClockCircleOutlined/>
<ClockCircleOutlined />
</template>
</a-statistic>
</a-card>
@@ -130,7 +141,11 @@
{{ siteInfo?.expirationTime }}
</a-descriptions-item>
<a-descriptions-item label="技术支持">
<span class="cursor-pointer" @click="openNew(`https://websoft.top`)">网宿软件</span>
<span
class="cursor-pointer"
@click="openNew(`https://websoft.top`)"
>网宿软件</span
>
</a-descriptions-item>
</a-descriptions>
</a-card>
@@ -140,38 +155,43 @@
<a-col :span="12">
<a-card title="快捷操作" :bordered="false" style="min-height: 353px">
<a-space direction="vertical" style="width: 100%">
<a-button type="primary" block @click="$router.push('/website/field')" :loading="loading">
<UngroupOutlined/>
<a-button
type="primary"
block
@click="$router.push('/website/field')"
:loading="loading"
>
<UngroupOutlined />
参数配置
</a-button>
<a-button block @click="$router.push('/shopOrder')">
<CalendarOutlined/>
<CalendarOutlined />
订单管理
</a-button>
<a-button block @click="$router.push('/system/user')">
<UserOutlined/>
<UserOutlined />
用户管理
</a-button>
<a-button block @click="$router.push('/website/index')">
<ShopOutlined/>
<ShopOutlined />
站点管理
</a-button>
<!-- <a-button block @click="refreshStatistics" :loading="loading">-->
<!-- <ReloadOutlined/>-->
<!-- 刷新统计-->
<!-- </a-button>-->
<!-- <a-button block @click="refreshStatistics" :loading="loading">-->
<!-- <ReloadOutlined/>-->
<!-- 刷新统计-->
<!-- </a-button>-->
<a-button block @click="$router.push('/system/login-record')">
<FileTextOutlined/>
<FileTextOutlined />
登录日志
</a-button>
<a-button block @click="clearSiteInfoCache">
<ClearOutlined/>
<ClearOutlined />
清除缓存
</a-button>
<!-- <a-button block @click="$router.push('/system/setting')">-->
<!-- <SettingOutlined/>-->
<!-- 系统设置-->
<!-- </a-button>-->
<!-- <a-button block @click="$router.push('/system/setting')">-->
<!-- <SettingOutlined/>-->
<!-- 系统设置-->
<!-- </a-button>-->
</a-space>
</a-card>
</a-col>
@@ -180,116 +200,117 @@
</template>
<script lang="ts" setup>
import {ref, onMounted, onUnmounted, computed} from 'vue';
import {
UserOutlined,
CalendarOutlined,
QrcodeOutlined,
ShopOutlined,
ClockCircleOutlined,
AccountBookOutlined,
FileTextOutlined,
ClearOutlined,
UngroupOutlined,
MoneyCollectOutlined
} from '@ant-design/icons-vue';
import {message} from 'ant-design-vue/es';
import {openNew} from "@/utils/common";
import {useSiteStore} from '@/store/modules/site';
import {useStatisticsStore} from '@/store/modules/statistics';
import {storeToRefs} from 'pinia';
import {removeSiteInfoCache} from "@/api/cms/cmsWebsite";
import { ref, onMounted, onUnmounted, computed } from 'vue';
import {
UserOutlined,
CalendarOutlined,
QrcodeOutlined,
ShopOutlined,
ClockCircleOutlined,
AccountBookOutlined,
FileTextOutlined,
ClearOutlined,
UngroupOutlined,
MoneyCollectOutlined
} from '@ant-design/icons-vue';
import { message } from 'ant-design-vue/es';
import { openNew } from '@/utils/common';
import { useSiteStore } from '@/store/modules/site';
import { useStatisticsStore } from '@/store/modules/statistics';
import { storeToRefs } from 'pinia';
import { removeSiteInfoCache } from '@/api/cms/cmsWebsite';
// 使用状态管理
const siteStore = useSiteStore();
const statisticsStore = useStatisticsStore();
// 使用状态管理
const siteStore = useSiteStore();
const statisticsStore = useStatisticsStore();
// 从 store 中获取响应式数据
const {siteInfo, loading: siteLoading} = storeToRefs(siteStore);
const {loading: statisticsLoading} = storeToRefs(statisticsStore);
// 从 store 中获取响应式数据
const { siteInfo, loading: siteLoading } = storeToRefs(siteStore);
const { loading: statisticsLoading } = storeToRefs(statisticsStore);
// 系统信息
const systemInfo = ref({
name: '小程序开发',
description: '基于Spring、SpringBoot、SpringMVC等技术栈构建的前后端分离开发平台',
version: '2.0.0',
status: '运行中',
logo: '/logo.png',
environment: '生产环境',
database: 'MySQL 8.0',
server: 'Linux CentOS 7.9',
expirationTime: '2024-01-01 09:00:00'
});
// 系统信息
const systemInfo = ref({
name: '小程序开发',
description:
'基于Spring、SpringBoot、SpringMVC等技术栈构建的前后端分离开发平台',
version: '2.0.0',
status: '运行中',
logo: '/logo.png',
environment: '生产环境',
database: 'MySQL 8.0',
server: 'Linux CentOS 7.9',
expirationTime: '2024-01-01 09:00:00'
});
// 计算属性
const runDays = computed(() => siteStore.runDays);
const userCount = computed(() => statisticsStore.userCount);
const orderCount = computed(() => statisticsStore.orderCount);
const totalSales = computed(() => statisticsStore.totalSales);
// 计算属性
const runDays = computed(() => siteStore.runDays);
const userCount = computed(() => statisticsStore.userCount);
const orderCount = computed(() => statisticsStore.orderCount);
const totalSales = computed(() => statisticsStore.totalSales);
// 加载状态
const loading = computed(() => siteLoading.value || statisticsLoading.value);
// 加载状态
const loading = computed(() => siteLoading.value || statisticsLoading.value);
// 清除缓存
const clearSiteInfoCache = () => {
removeSiteInfoCache('SiteInfo:' + localStorage.getItem('TenantId')).then(
(msg) => {
if (msg) {
message.success(msg);
// 清除缓存
const clearSiteInfoCache = () => {
removeSiteInfoCache('SiteInfo:' + localStorage.getItem('TenantId')).then(
(msg) => {
if (msg) {
message.success(msg);
}
}
);
};
// 刷新统计数据
const refreshStatistics = async () => {
try {
await statisticsStore.forceRefresh();
message.success('统计数据刷新成功');
} catch (error) {
console.error('刷新统计数据失败:', error);
message.error('刷新统计数据失败');
}
);
};
};
// 刷新统计数据
const refreshStatistics = async () => {
try {
await statisticsStore.forceRefresh();
message.success('统计数据刷新成功');
} catch (error) {
console.error('刷新统计数据失败:', error);
message.error('刷新统计数据失败');
}
};
onMounted(async () => {
// 加载网站信息和统计数据
try {
await Promise.all([
siteStore.fetchSiteInfo(),
statisticsStore.fetchStatistics()
]);
onMounted(async () => {
// 加载网站信息和统计数据
try {
await Promise.all([
siteStore.fetchSiteInfo(),
statisticsStore.fetchStatistics()
]);
// 开始自动刷新统计数据每5分钟
statisticsStore.startAutoRefresh();
} catch (error) {
console.error('加载数据失败:', error);
}
});
// 开始自动刷新统计数据每5分钟
statisticsStore.startAutoRefresh();
} catch (error) {
console.error('加载数据失败:', error);
}
});
onUnmounted(() => {
// 组件卸载时停止自动刷新
statisticsStore.stopAutoRefresh();
});
onUnmounted(() => {
// 组件卸载时停止自动刷新
statisticsStore.stopAutoRefresh();
});
</script>
<style scoped>
.system-info h2 {
margin-bottom: 8px;
}
.system-info h2 {
margin-bottom: 8px;
}
.stat-card {
text-align: center;
margin-bottom: 16px;
}
.stat-card {
text-align: center;
margin-bottom: 16px;
}
.stat-card :deep(.ant-statistic-title) {
font-size: 14px;
color: #666;
}
.stat-card :deep(.ant-statistic-title) {
font-size: 14px;
color: #666;
}
.stat-card :deep(.ant-statistic-content) {
font-size: 24px;
font-weight: 600;
}
.stat-card :deep(.ant-statistic-content) {
font-size: 24px;
font-weight: 600;
}
</style>

View File

@@ -154,7 +154,10 @@
import { ref, reactive, watch } from 'vue';
import { Form, message } from 'ant-design-vue';
import { assignObject, uuid } from 'ele-admin-pro';
import { addDormitoryApply, updateDormitoryApply } from '@/api/dormitory/dormitoryApply';
import {
addDormitoryApply,
updateDormitoryApply
} from '@/api/dormitory/dormitoryApply';
import { DormitoryApply } from '@/api/dormitory/dormitoryApply/model';
import { useThemeStore } from '@/store/modules/theme';
import { storeToRefs } from 'pinia';
@@ -264,7 +267,9 @@
const formData = {
...form
};
const saveOrUpdate = isUpdate.value ? updateDormitoryApply : addDormitoryApply;
const saveOrUpdate = isUpdate.value
? updateDormitoryApply
: addDormitoryApply;
saveOrUpdate(formData)
.then((msg) => {
loading.value = false;
@@ -287,12 +292,12 @@
images.value = [];
if (props.data) {
assignObject(form, props.data);
if(props.data.image){
if (props.data.image) {
images.value.push({
uid: uuid(),
url: props.data.image,
status: 'done'
})
});
}
isUpdate.value = true;
} else {

View File

@@ -21,7 +21,7 @@
</template>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'image'">
<a-image :src="record.image" :width="50"/>
<a-image :src="record.image" :width="50" />
</template>
<template v-if="column.key === 'status'">
<a-tag v-if="record.status === 0" color="green">显示</a-tag>
@@ -30,7 +30,7 @@
<template v-if="column.key === 'action'">
<a-space>
<a @click="openEdit(record)">修改</a>
<a-divider type="vertical"/>
<a-divider type="vertical" />
<a-popconfirm
title="确定要删除此记录吗?"
@confirm="remove(record)"
@@ -44,249 +44,260 @@
</a-card>
<!-- 编辑弹窗 -->
<DormitoryApplyEdit v-model:visible="showEdit" :data="current" @done="reload"/>
<DormitoryApplyEdit
v-model:visible="showEdit"
:data="current"
@done="reload"
/>
</a-page-header>
</template>
<script lang="ts" setup>
import {createVNode, ref} from 'vue';
import {message, Modal} from 'ant-design-vue';
import {ExclamationCircleOutlined} from '@ant-design/icons-vue';
import type {EleProTable} from 'ele-admin-pro';
import {toDateString} from 'ele-admin-pro';
import type {
DatasourceFunction,
ColumnItem
} from 'ele-admin-pro/es/ele-pro-table/types';
import Search from './components/search.vue';
import DormitoryApplyEdit from './components/dormitoryApplyEdit.vue';
import {pageDormitoryApply, removeDormitoryApply, removeBatchDormitoryApply} from '@/api/dormitory/dormitoryApply';
import type {DormitoryApply, DormitoryApplyParam} from '@/api/dormitory/dormitoryApply/model';
import {getPageTitle} from "@/utils/common";
import { createVNode, ref } from 'vue';
import { message, Modal } from 'ant-design-vue';
import { ExclamationCircleOutlined } from '@ant-design/icons-vue';
import type { EleProTable } from 'ele-admin-pro';
import { toDateString } from 'ele-admin-pro';
import type {
DatasourceFunction,
ColumnItem
} from 'ele-admin-pro/es/ele-pro-table/types';
import Search from './components/search.vue';
import DormitoryApplyEdit from './components/dormitoryApplyEdit.vue';
import {
pageDormitoryApply,
removeDormitoryApply,
removeBatchDormitoryApply
} from '@/api/dormitory/dormitoryApply';
import type {
DormitoryApply,
DormitoryApplyParam
} from '@/api/dormitory/dormitoryApply/model';
import { getPageTitle } from '@/utils/common';
// 表格实例
const tableRef = ref<InstanceType<typeof EleProTable> | null>(null);
// 表格实例
const tableRef = ref<InstanceType<typeof EleProTable> | null>(null);
// 表格选中数据
const selection = ref<DormitoryApply[]>([]);
// 当前编辑数据
const current = ref<DormitoryApply | null>(null);
// 是否显示编辑弹窗
const showEdit = ref(false);
// 是否显示批量移动弹窗
const showMove = ref(false);
// 加载状态
const loading = ref(true);
// 表格选中数据
const selection = ref<DormitoryApply[]>([]);
// 当前编辑数据
const current = ref<DormitoryApply | null>(null);
// 是否显示编辑弹窗
const showEdit = ref(false);
// 是否显示批量移动弹窗
const showMove = ref(false);
// 加载状态
const loading = ref(true);
// 表格数据源
const datasource: DatasourceFunction = ({
page,
limit,
where,
orders,
filters
}) => {
if (filters) {
where.status = filters.status;
}
return pageDormitoryApply({
...where,
...orders,
// 表格数据源
const datasource: DatasourceFunction = ({
page,
limit
});
};
// 表格列配置
const columns = ref<ColumnItem[]>([
{
title: '学号',
dataIndex: 'userId',
key: 'userId',
align: 'center',
width: 90,
},
{
title: '姓名',
dataIndex: 'realName',
key: 'realName',
align: 'center',
},
{
title: '手机号',
dataIndex: 'mobile',
key: 'mobile',
align: 'center',
},
{
title: '宿舍号',
dataIndex: 'recordName',
key: 'recordName',
align: 'center',
},
{
title: '床铺号',
dataIndex: 'bedName',
key: 'bedName',
align: 'center',
},
// {
// title: '操作人员',
// dataIndex: 'refereeName',
// key: 'refereeName',
// align: 'center',
// },
// {
// title: '申请方式(10需后台审核 20无需审核)',
// dataIndex: 'applyType',
// key: 'applyType',
// align: 'center',
// },
{
title: '审核状态',
dataIndex: 'applyStatus',
key: 'applyStatus',
align: 'center',
},
// {
// title: '申请时间',
// dataIndex: 'applyTime',
// key: 'applyTime',
// align: 'center',
// },
// {
// title: '审核时间',
// dataIndex: 'auditTime',
// key: 'auditTime',
// align: 'center',
// },
// {
// title: '合同时间',
// dataIndex: 'contractTime',
// key: 'contractTime',
// align: 'center',
// },
// {
// title: '过期时间',
// dataIndex: 'expirationTime',
// key: 'expirationTime',
// align: 'center',
// },
{
title: '驳回原因',
dataIndex: 'rejectReason',
key: 'rejectReason',
align: 'center',
},
// {
// title: '备注',
// dataIndex: 'comments',
// key: 'comments',
// align: 'center',
// },
{
title: '创建时间',
dataIndex: 'createTime',
key: 'createTime',
align: 'center',
sorter: true,
ellipsis: true,
customRender: ({text}) => toDateString(text, 'yyyy-MM-dd HH:mm:ss')
},
{
title: '操作',
key: 'action',
width: 180,
fixed: 'right',
align: 'center',
hideInSetting: true
}
]);
/* 搜索 */
const reload = (where?: DormitoryApplyParam) => {
selection.value = [];
tableRef?.value?.reload({where: where});
};
/* 打开编辑弹窗 */
const openEdit = (row?: DormitoryApply) => {
current.value = row ?? null;
showEdit.value = true;
};
/* 打开批量移动弹窗 */
const openMove = () => {
showMove.value = true;
};
/* 删除单个 */
const remove = (row: DormitoryApply) => {
const hide = message.loading('请求中..', 0);
removeDormitoryApply(row.id)
.then((msg) => {
hide();
message.success(msg);
reload();
})
.catch((e) => {
hide();
message.error(e.message);
limit,
where,
orders,
filters
}) => {
if (filters) {
where.status = filters.status;
}
return pageDormitoryApply({
...where,
...orders,
page,
limit
});
};
/* 批量删除 */
const removeBatch = () => {
if (!selection.value.length) {
message.error('请至少选择一条数据');
return;
}
Modal.confirm({
title: '提示',
content: '确定要删除选中的记录吗?',
icon: createVNode(ExclamationCircleOutlined),
maskClosable: true,
onOk: () => {
const hide = message.loading('请求中..', 0);
removeBatchDormitoryApply(selection.value.map((d) => d.id))
.then((msg) => {
hide();
message.success(msg);
reload();
})
.catch((e) => {
hide();
message.error(e.message);
});
}
});
};
/* 查询 */
const query = () => {
loading.value = true;
};
/* 自定义行属性 */
const customRow = (record: DormitoryApply) => {
return {
// 行点击事件
onClick: () => {
// console.log(record);
},
// 行双击事件
onDblclick: () => {
openEdit(record);
}
};
};
query();
// 表格列配置
const columns = ref<ColumnItem[]>([
{
title: '学号',
dataIndex: 'userId',
key: 'userId',
align: 'center',
width: 90
},
{
title: '姓名',
dataIndex: 'realName',
key: 'realName',
align: 'center'
},
{
title: '手机号',
dataIndex: 'mobile',
key: 'mobile',
align: 'center'
},
{
title: '宿舍号',
dataIndex: 'recordName',
key: 'recordName',
align: 'center'
},
{
title: '床铺号',
dataIndex: 'bedName',
key: 'bedName',
align: 'center'
},
// {
// title: '操作人员',
// dataIndex: 'refereeName',
// key: 'refereeName',
// align: 'center',
// },
// {
// title: '申请方式(10需后台审核 20无需审核)',
// dataIndex: 'applyType',
// key: 'applyType',
// align: 'center',
// },
{
title: '审核状态',
dataIndex: 'applyStatus',
key: 'applyStatus',
align: 'center'
},
// {
// title: '申请时间',
// dataIndex: 'applyTime',
// key: 'applyTime',
// align: 'center',
// },
// {
// title: '审核时间',
// dataIndex: 'auditTime',
// key: 'auditTime',
// align: 'center',
// },
// {
// title: '合同时间',
// dataIndex: 'contractTime',
// key: 'contractTime',
// align: 'center',
// },
// {
// title: '过期时间',
// dataIndex: 'expirationTime',
// key: 'expirationTime',
// align: 'center',
// },
{
title: '驳回原因',
dataIndex: 'rejectReason',
key: 'rejectReason',
align: 'center'
},
// {
// title: '备注',
// dataIndex: 'comments',
// key: 'comments',
// align: 'center',
// },
{
title: '创建时间',
dataIndex: 'createTime',
key: 'createTime',
align: 'center',
sorter: true,
ellipsis: true,
customRender: ({ text }) => toDateString(text, 'yyyy-MM-dd HH:mm:ss')
},
{
title: '操作',
key: 'action',
width: 180,
fixed: 'right',
align: 'center',
hideInSetting: true
}
]);
/* 搜索 */
const reload = (where?: DormitoryApplyParam) => {
selection.value = [];
tableRef?.value?.reload({ where: where });
};
/* 打开编辑弹窗 */
const openEdit = (row?: DormitoryApply) => {
current.value = row ?? null;
showEdit.value = true;
};
/* 打开批量移动弹窗 */
const openMove = () => {
showMove.value = true;
};
/* 删除单个 */
const remove = (row: DormitoryApply) => {
const hide = message.loading('请求中..', 0);
removeDormitoryApply(row.id)
.then((msg) => {
hide();
message.success(msg);
reload();
})
.catch((e) => {
hide();
message.error(e.message);
});
};
/* 批量删除 */
const removeBatch = () => {
if (!selection.value.length) {
message.error('请至少选择一条数据');
return;
}
Modal.confirm({
title: '提示',
content: '确定要删除选中的记录吗?',
icon: createVNode(ExclamationCircleOutlined),
maskClosable: true,
onOk: () => {
const hide = message.loading('请求中..', 0);
removeBatchDormitoryApply(selection.value.map((d) => d.id))
.then((msg) => {
hide();
message.success(msg);
reload();
})
.catch((e) => {
hide();
message.error(e.message);
});
}
});
};
/* 查询 */
const query = () => {
loading.value = true;
};
/* 自定义行属性 */
const customRow = (record: DormitoryApply) => {
return {
// 行点击事件
onClick: () => {
// console.log(record);
},
// 行双击事件
onDblclick: () => {
openEdit(record);
}
};
};
query();
</script>
<script lang="ts">
export default {
name: 'DormitoryApply'
};
export default {
name: 'DormitoryApply'
};
</script>
<style lang="less" scoped></style>

View File

@@ -26,13 +26,13 @@
v-model:value="form.name"
/>
</a-form-item>
<!-- <a-form-item label="编号" name="code">-->
<!-- <a-input-->
<!-- allow-clear-->
<!-- placeholder="请输入编号"-->
<!-- v-model:value="form.code"-->
<!-- />-->
<!-- </a-form-item>-->
<!-- <a-form-item label="编号" name="code">-->
<!-- <a-input-->
<!-- allow-clear-->
<!-- placeholder="请输入编号"-->
<!-- v-model:value="form.code"-->
<!-- />-->
<!-- </a-form-item>-->
<a-form-item label="上下铺" name="bunk">
<a-radio-group v-model:value="form.bunk">
<a-radio :value="0">下铺</a-radio>
@@ -47,14 +47,14 @@
disabled
v-model:value="form.realName"
/>
<!-- <a-tooltip :title="`选择学生`">-->
<!-- <SelectStudent-->
<!-- :placeholder="`选择学生`"-->
<!-- class="form-item"-->
<!-- v-model:value="form.realName"-->
<!-- @done="chooseStudent"-->
<!-- />-->
<!-- </a-tooltip>-->
<!-- <a-tooltip :title="`选择学生`">-->
<!-- <SelectStudent-->
<!-- :placeholder="`选择学生`"-->
<!-- class="form-item"-->
<!-- v-model:value="form.realName"-->
<!-- @done="chooseStudent"-->
<!-- />-->
<!-- </a-tooltip>-->
</div>
</a-form-item>
<a-form-item label="联系电话" name="phone">
@@ -66,15 +66,23 @@
/>
</a-form-item>
<a-form-item label="照片" name="avatar">
<a-image :src="form.avatar || 'https://oss.wsdns.cn/20251003/bf67047afe244ab0b159d836704baf1e.png'" :preview="false" :width="120" :height="160" />
<a-image
:src="
form.avatar ||
'https://oss.wsdns.cn/20251003/bf67047afe244ab0b159d836704baf1e.png'
"
:preview="false"
:width="120"
:height="160"
/>
</a-form-item>
<!-- <a-form-item label="充电口" name="chargingPort">-->
<!-- <a-input-->
<!-- allow-clear-->
<!-- placeholder="请输入充电口"-->
<!-- v-model:value="form.chargingPort"-->
<!-- />-->
<!-- </a-form-item>-->
<!-- <a-form-item label="充电口" name="chargingPort">-->
<!-- <a-input-->
<!-- allow-clear-->
<!-- placeholder="请输入充电口"-->
<!-- v-model:value="form.chargingPort"-->
<!-- />-->
<!-- </a-form-item>-->
<a-form-item label="排序" name="sortNumber">
<a-input-number
:min="0"
@@ -106,13 +114,16 @@
import { ref, reactive, watch } from 'vue';
import { Form, message } from 'ant-design-vue';
import { assignObject } from 'ele-admin-pro';
import { addDormitoryBed, updateDormitoryBed } from '@/api/dormitory/dormitoryBed';
import {
addDormitoryBed,
updateDormitoryBed
} from '@/api/dormitory/dormitoryBed';
import { DormitoryBed } from '@/api/dormitory/dormitoryBed/model';
import { useThemeStore } from '@/store/modules/theme';
import { storeToRefs } from 'pinia';
import { ItemType } from 'ele-admin-pro/es/ele-image-upload/types';
import { FormInstance } from 'ant-design-vue/es/form';
import {User} from "@/api/system/user/model";
import { User } from '@/api/system/user/model';
// 是否是修改
const isUpdate = ref(false);
@@ -192,7 +203,7 @@
form.userId = item.userId;
form.realName = item.realName;
form.phone = item.phone;
}
};
const { resetFields } = useForm(form, rules);
@@ -208,7 +219,9 @@
const formData = {
...form
};
const saveOrUpdate = isUpdate.value ? updateDormitoryBed : addDormitoryBed;
const saveOrUpdate = isUpdate.value
? updateDormitoryBed
: addDormitoryBed;
saveOrUpdate(formData)
.then((msg) => {
loading.value = false;

View File

@@ -1,53 +1,57 @@
<template>
<a-page-header :title="getPageTitle()" @back="() => $router.go(-1)">
<template #extra>
<Extra/>
<Extra />
</template>
<a-card :bordered="false" :body-style="{ padding: '16px' }">
<ele-pro-table
ref="tableRef"
row-key="dormitoryBedId"
:columns="columns"
:datasource="datasource"
:customRow="customRow"
tool-class="ele-toolbar-form"
class="sys-org-table"
>
<template #toolbar>
<search
@search="reload"
:selection="selection"
@add="openEdit"
@remove="removeBatch"
@batchMove="openMove"
/>
<a-card :bordered="false" :body-style="{ padding: '16px' }">
<ele-pro-table
ref="tableRef"
row-key="dormitoryBedId"
:columns="columns"
:datasource="datasource"
:customRow="customRow"
tool-class="ele-toolbar-form"
class="sys-org-table"
>
<template #toolbar>
<search
@search="reload"
:selection="selection"
@add="openEdit"
@remove="removeBatch"
@batchMove="openMove"
/>
</template>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'image'">
<a-image :src="record.image" :width="50" />
</template>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'image'">
<a-image :src="record.image" :width="50" />
</template>
<template v-if="column.key === 'status'">
<a-tag v-if="record.status === 0" color="green">显示</a-tag>
<a-tag v-if="record.status === 1" color="red">隐藏</a-tag>
</template>
<template v-if="column.key === 'action'">
<a-space>
<a @click="openEdit(record)">修改</a>
<a-divider type="vertical" />
<a-popconfirm
title="确定要删除此记录吗?"
@confirm="remove(record)"
>
<a class="ele-text-danger">删除</a>
</a-popconfirm>
</a-space>
</template>
<template v-if="column.key === 'status'">
<a-tag v-if="record.status === 0" color="green">显示</a-tag>
<a-tag v-if="record.status === 1" color="red">隐藏</a-tag>
</template>
</ele-pro-table>
</a-card>
<template v-if="column.key === 'action'">
<a-space>
<a @click="openEdit(record)">修改</a>
<a-divider type="vertical" />
<a-popconfirm
title="确定要删除此记录吗?"
@confirm="remove(record)"
>
<a class="ele-text-danger">删除</a>
</a-popconfirm>
</a-space>
</template>
</template>
</ele-pro-table>
</a-card>
<!-- 编辑弹窗 -->
<DormitoryBedEdit v-model:visible="showEdit" :data="current" @done="reload" />
<!-- 编辑弹窗 -->
<DormitoryBedEdit
v-model:visible="showEdit"
:data="current"
@done="reload"
/>
</a-page-header>
</template>
@@ -62,10 +66,17 @@
} from 'ele-admin-pro/es/ele-pro-table/types';
import Search from './components/search.vue';
import DormitoryBedEdit from './components/dormitoryBedEdit.vue';
import { pageDormitoryBed, removeDormitoryBed, removeBatchDormitoryBed } from '@/api/dormitory/dormitoryBed';
import type { DormitoryBed, DormitoryBedParam } from '@/api/dormitory/dormitoryBed/model';
import {getPageTitle} from "@/utils/common";
import Extra from "@/views/dormitory/Extra.vue";
import {
pageDormitoryBed,
removeDormitoryBed,
removeBatchDormitoryBed
} from '@/api/dormitory/dormitoryBed';
import type {
DormitoryBed,
DormitoryBedParam
} from '@/api/dormitory/dormitoryBed/model';
import { getPageTitle } from '@/utils/common';
import Extra from '@/views/dormitory/Extra.vue';
// 表格实例
const tableRef = ref<InstanceType<typeof EleProTable> | null>(null);
@@ -113,14 +124,14 @@
title: '床铺编号',
dataIndex: 'name',
key: 'name',
align: 'center',
align: 'center'
},
{
title: '学生姓名',
dataIndex: 'realName',
key: 'realName',
align: 'center',
width: 300,
width: 300
},
// {
// title: '手机号码',
@@ -145,7 +156,7 @@
dataIndex: 'recordName',
key: 'recordName',
align: 'center',
width: 300,
width: 300
},
{
title: '上下铺',
@@ -166,7 +177,7 @@
title: '排序',
dataIndex: 'sortNumber',
key: 'sortNumber',
align: 'center',
align: 'center'
},
// {
// title: '备注',

View File

@@ -50,12 +50,12 @@
v-model:value="form.comments"
/>
</a-form-item>
<!-- <a-form-item label="状态" name="status">-->
<!-- <a-radio-group v-model:value="form.status">-->
<!-- <a-radio :value="0">启用</a-radio>-->
<!-- <a-radio :value="1">禁用</a-radio>-->
<!-- </a-radio-group>-->
<!-- </a-form-item>-->
<!-- <a-form-item label="状态" name="status">-->
<!-- <a-radio-group v-model:value="form.status">-->
<!-- <a-radio :value="0">启用</a-radio>-->
<!-- <a-radio :value="1">禁用</a-radio>-->
<!-- </a-radio-group>-->
<!-- </a-form-item>-->
</a-form>
</ele-modal>
</template>
@@ -64,7 +64,10 @@
import { ref, reactive, watch } from 'vue';
import { Form, message } from 'ant-design-vue';
import { assignObject, uuid } from 'ele-admin-pro';
import { addDormitoryBuilding, updateDormitoryBuilding } from '@/api/dormitory/dormitoryBuilding';
import {
addDormitoryBuilding,
updateDormitoryBuilding
} from '@/api/dormitory/dormitoryBuilding';
import { DormitoryBuilding } from '@/api/dormitory/dormitoryBuilding/model';
import { useThemeStore } from '@/store/modules/theme';
import { storeToRefs } from 'pinia';
@@ -141,7 +144,9 @@
const formData = {
...form
};
const saveOrUpdate = isUpdate.value ? updateDormitoryBuilding : addDormitoryBuilding;
const saveOrUpdate = isUpdate.value
? updateDormitoryBuilding
: addDormitoryBuilding;
saveOrUpdate(formData)
.then((msg) => {
loading.value = false;

View File

@@ -1,53 +1,57 @@
<template>
<a-page-header :title="getPageTitle()" @back="() => $router.go(-1)">
<template #extra>
<Extra/>
<Extra />
</template>
<a-card :bordered="false" :body-style="{ padding: '16px' }">
<ele-pro-table
ref="tableRef"
row-key="id"
:columns="columns"
:datasource="datasource"
:customRow="customRow"
tool-class="ele-toolbar-form"
class="sys-org-table"
>
<template #toolbar>
<search
@search="reload"
:selection="selection"
@add="openEdit"
@remove="removeBatch"
@batchMove="openMove"
/>
<a-card :bordered="false" :body-style="{ padding: '16px' }">
<ele-pro-table
ref="tableRef"
row-key="id"
:columns="columns"
:datasource="datasource"
:customRow="customRow"
tool-class="ele-toolbar-form"
class="sys-org-table"
>
<template #toolbar>
<search
@search="reload"
:selection="selection"
@add="openEdit"
@remove="removeBatch"
@batchMove="openMove"
/>
</template>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'image'">
<a-image :src="record.image" :width="50" />
</template>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'image'">
<a-image :src="record.image" :width="50" />
</template>
<template v-if="column.key === 'status'">
<a-tag v-if="record.status === 0" color="green">显示</a-tag>
<a-tag v-if="record.status === 1" color="red">隐藏</a-tag>
</template>
<template v-if="column.key === 'action'">
<a-space>
<a @click="openEdit(record)">修改</a>
<a-divider type="vertical" />
<a-popconfirm
title="确定要删除此记录吗?"
@confirm="remove(record)"
>
<a class="ele-text-danger">删除</a>
</a-popconfirm>
</a-space>
</template>
<template v-if="column.key === 'status'">
<a-tag v-if="record.status === 0" color="green">显示</a-tag>
<a-tag v-if="record.status === 1" color="red">隐藏</a-tag>
</template>
</ele-pro-table>
</a-card>
<template v-if="column.key === 'action'">
<a-space>
<a @click="openEdit(record)">修改</a>
<a-divider type="vertical" />
<a-popconfirm
title="确定要删除此记录吗?"
@confirm="remove(record)"
>
<a class="ele-text-danger">删除</a>
</a-popconfirm>
</a-space>
</template>
</template>
</ele-pro-table>
</a-card>
<!-- 编辑弹窗 -->
<DormitoryBuildingEdit v-model:visible="showEdit" :data="current" @done="reload" />
<!-- 编辑弹窗 -->
<DormitoryBuildingEdit
v-model:visible="showEdit"
:data="current"
@done="reload"
/>
</a-page-header>
</template>
@@ -63,10 +67,17 @@
} from 'ele-admin-pro/es/ele-pro-table/types';
import Search from './components/search.vue';
import DormitoryBuildingEdit from './components/dormitoryBuildingEdit.vue';
import { pageDormitoryBuilding, removeDormitoryBuilding, removeBatchDormitoryBuilding } from '@/api/dormitory/dormitoryBuilding';
import type { DormitoryBuilding, DormitoryBuildingParam } from '@/api/dormitory/dormitoryBuilding/model';
import {getPageTitle} from "@/utils/common";
import Extra from "@/views/dormitory/Extra.vue";
import {
pageDormitoryBuilding,
removeDormitoryBuilding,
removeBatchDormitoryBuilding
} from '@/api/dormitory/dormitoryBuilding';
import type {
DormitoryBuilding,
DormitoryBuildingParam
} from '@/api/dormitory/dormitoryBuilding/model';
import { getPageTitle } from '@/utils/common';
import Extra from '@/views/dormitory/Extra.vue';
// 表格实例
const tableRef = ref<InstanceType<typeof EleProTable> | null>(null);
@@ -108,13 +119,13 @@
dataIndex: 'id',
key: 'id',
align: 'center',
width: 90,
width: 90
},
{
title: '楼栋名称',
dataIndex: 'name',
key: 'name',
align: 'center',
align: 'center'
},
// {
// title: '楼栋编号',
@@ -126,7 +137,7 @@
title: '排序',
dataIndex: 'sortNumber',
key: 'sortNumber',
align: 'center',
align: 'center'
},
// {
// title: '备注',

View File

@@ -49,20 +49,20 @@
v-model:value="form.sortNumber"
/>
</a-form-item>
<!-- <a-form-item label="备注" name="comments">-->
<!-- <a-textarea-->
<!-- :rows="4"-->
<!-- :maxlength="200"-->
<!-- placeholder="请输入描述"-->
<!-- v-model:value="form.comments"-->
<!-- />-->
<!-- </a-form-item>-->
<!-- <a-form-item label="状态" name="status">-->
<!-- <a-radio-group v-model:value="form.status">-->
<!-- <a-radio :value="0">启用</a-radio>-->
<!-- <a-radio :value="1">禁用</a-radio>-->
<!-- </a-radio-group>-->
<!-- </a-form-item>-->
<!-- <a-form-item label="备注" name="comments">-->
<!-- <a-textarea-->
<!-- :rows="4"-->
<!-- :maxlength="200"-->
<!-- placeholder="请输入描述"-->
<!-- v-model:value="form.comments"-->
<!-- />-->
<!-- </a-form-item>-->
<!-- <a-form-item label="状态" name="status">-->
<!-- <a-radio-group v-model:value="form.status">-->
<!-- <a-radio :value="0">启用</a-radio>-->
<!-- <a-radio :value="1">禁用</a-radio>-->
<!-- </a-radio-group>-->
<!-- </a-form-item>-->
</a-form>
</ele-modal>
</template>
@@ -71,7 +71,10 @@
import { ref, reactive, watch } from 'vue';
import { Form, message } from 'ant-design-vue';
import { assignObject } from 'ele-admin-pro';
import { addDormitoryFloor, updateDormitoryFloor } from '@/api/dormitory/dormitoryFloor';
import {
addDormitoryFloor,
updateDormitoryFloor
} from '@/api/dormitory/dormitoryFloor';
import { DormitoryFloor } from '@/api/dormitory/dormitoryFloor/model';
import { useThemeStore } from '@/store/modules/theme';
import { storeToRefs } from 'pinia';
@@ -158,7 +161,9 @@
const formData = {
...form
};
const saveOrUpdate = isUpdate.value ? updateDormitoryFloor : addDormitoryFloor;
const saveOrUpdate = isUpdate.value
? updateDormitoryFloor
: addDormitoryFloor;
saveOrUpdate(formData)
.then((msg) => {
loading.value = false;

View File

@@ -1,7 +1,7 @@
<template>
<a-page-header :title="getPageTitle()" @back="() => $router.go(-1)">
<template #extra>
<Extra/>
<Extra />
</template>
<a-card :bordered="false" :body-style="{ padding: '16px' }">
<ele-pro-table
@@ -24,7 +24,7 @@
</template>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'image'">
<a-image :src="record.image" :width="50"/>
<a-image :src="record.image" :width="50" />
</template>
<template v-if="column.key === 'status'">
<a-tag v-if="record.status === 0" color="green">启用</a-tag>
@@ -33,7 +33,7 @@
<template v-if="column.key === 'action'">
<a-space>
<a @click="openEdit(record)">修改</a>
<a-divider type="vertical"/>
<a-divider type="vertical" />
<a-popconfirm
title="确定要删除此记录吗?"
@confirm="remove(record)"
@@ -47,202 +47,213 @@
</a-card>
<!-- 编辑弹窗 -->
<DormitoryFloorEdit v-model:visible="showEdit" :data="current" @done="reload"/>
<DormitoryFloorEdit
v-model:visible="showEdit"
:data="current"
@done="reload"
/>
</a-page-header>
</template>
<script lang="ts" setup>
import {createVNode, ref} from 'vue';
import {message, Modal} from 'ant-design-vue';
import {ExclamationCircleOutlined} from '@ant-design/icons-vue';
import type {EleProTable} from 'ele-admin-pro';
import type {
DatasourceFunction,
ColumnItem
} from 'ele-admin-pro/es/ele-pro-table/types';
import Search from './components/search.vue';
import DormitoryFloorEdit from './components/dormitoryFloorEdit.vue';
import {pageDormitoryFloor, removeDormitoryFloor, removeBatchDormitoryFloor} from '@/api/dormitory/dormitoryFloor';
import type {DormitoryFloor, DormitoryFloorParam} from '@/api/dormitory/dormitoryFloor/model';
import {getPageTitle} from "@/utils/common";
import Extra from "@/views/dormitory/Extra.vue";
import { createVNode, ref } from 'vue';
import { message, Modal } from 'ant-design-vue';
import { ExclamationCircleOutlined } from '@ant-design/icons-vue';
import type { EleProTable } from 'ele-admin-pro';
import type {
DatasourceFunction,
ColumnItem
} from 'ele-admin-pro/es/ele-pro-table/types';
import Search from './components/search.vue';
import DormitoryFloorEdit from './components/dormitoryFloorEdit.vue';
import {
pageDormitoryFloor,
removeDormitoryFloor,
removeBatchDormitoryFloor
} from '@/api/dormitory/dormitoryFloor';
import type {
DormitoryFloor,
DormitoryFloorParam
} from '@/api/dormitory/dormitoryFloor/model';
import { getPageTitle } from '@/utils/common';
import Extra from '@/views/dormitory/Extra.vue';
// 表格实例
const tableRef = ref<InstanceType<typeof EleProTable> | null>(null);
// 表格实例
const tableRef = ref<InstanceType<typeof EleProTable> | null>(null);
// 表格选中数据
const selection = ref<DormitoryFloor[]>([]);
// 当前编辑数据
const current = ref<DormitoryFloor | null>(null);
// 是否显示编辑弹窗
const showEdit = ref(false);
// 是否显示批量移动弹窗
const showMove = ref(false);
// 加载状态
const loading = ref(true);
// 表格选中数据
const selection = ref<DormitoryFloor[]>([]);
// 当前编辑数据
const current = ref<DormitoryFloor | null>(null);
// 是否显示编辑弹窗
const showEdit = ref(false);
// 是否显示批量移动弹窗
const showMove = ref(false);
// 加载状态
const loading = ref(true);
// 表格数据源
const datasource: DatasourceFunction = ({
page,
limit,
where,
orders,
filters
}) => {
if (filters) {
where.status = filters.status;
}
return pageDormitoryFloor({
...where,
...orders,
// 表格数据源
const datasource: DatasourceFunction = ({
page,
limit
});
};
// 表格列配置
const columns = ref<ColumnItem[]>([
{
title: 'ID',
dataIndex: 'id',
key: 'id',
align: 'center',
width: 90,
},
{
title: '楼栋',
dataIndex: 'buildingName',
key: 'buildingName',
align: 'center',
width: 300,
},
{
title: '楼层',
dataIndex: 'name',
key: 'name',
align: 'center',
},
// {
// title: '编号',
// dataIndex: 'code',
// key: 'code',
// align: 'center',
// },
{
title: '排序',
dataIndex: 'sortNumber',
key: 'sortNumber',
align: 'center',
},
// {
// title: '状态',
// dataIndex: 'status',
// key: 'status',
// align: 'center',
// },
// {
// title: '创建时间',
// dataIndex: 'createTime',
// key: 'createTime',
// align: 'center',
// sorter: true,
// ellipsis: true,
// customRender: ({text}) => toDateString(text, 'yyyy-MM-dd')
// },
{
title: '操作',
key: 'action',
width: 180,
fixed: 'right',
align: 'center',
hideInSetting: true
}
]);
/* 搜索 */
const reload = (where?: DormitoryFloorParam) => {
selection.value = [];
tableRef?.value?.reload({where: where});
};
/* 打开编辑弹窗 */
const openEdit = (row?: DormitoryFloor) => {
current.value = row ?? null;
showEdit.value = true;
};
/* 打开批量移动弹窗 */
const openMove = () => {
showMove.value = true;
};
/* 删除单个 */
const remove = (row: DormitoryFloor) => {
const hide = message.loading('请求中..', 0);
removeDormitoryFloor(row.id)
.then((msg) => {
hide();
message.success(msg);
reload();
})
.catch((e) => {
hide();
message.error(e.message);
limit,
where,
orders,
filters
}) => {
if (filters) {
where.status = filters.status;
}
return pageDormitoryFloor({
...where,
...orders,
page,
limit
});
};
/* 批量删除 */
const removeBatch = () => {
if (!selection.value.length) {
message.error('请至少选择一条数据');
return;
}
Modal.confirm({
title: '提示',
content: '确定要删除选中的记录吗?',
icon: createVNode(ExclamationCircleOutlined),
maskClosable: true,
onOk: () => {
const hide = message.loading('请求中..', 0);
removeBatchDormitoryFloor(selection.value.map((d) => d.id))
.then((msg) => {
hide();
message.success(msg);
reload();
})
.catch((e) => {
hide();
message.error(e.message);
});
}
});
};
/* 查询 */
const query = () => {
loading.value = true;
};
/* 自定义行属性 */
const customRow = (record: DormitoryFloor) => {
return {
// 行点击事件
onClick: () => {
// console.log(record);
},
// 行双击事件
onDblclick: () => {
openEdit(record);
}
};
};
query();
// 表格列配置
const columns = ref<ColumnItem[]>([
{
title: 'ID',
dataIndex: 'id',
key: 'id',
align: 'center',
width: 90
},
{
title: '楼栋',
dataIndex: 'buildingName',
key: 'buildingName',
align: 'center',
width: 300
},
{
title: '楼层',
dataIndex: 'name',
key: 'name',
align: 'center'
},
// {
// title: '编号',
// dataIndex: 'code',
// key: 'code',
// align: 'center',
// },
{
title: '排序',
dataIndex: 'sortNumber',
key: 'sortNumber',
align: 'center'
},
// {
// title: '状态',
// dataIndex: 'status',
// key: 'status',
// align: 'center',
// },
// {
// title: '创建时间',
// dataIndex: 'createTime',
// key: 'createTime',
// align: 'center',
// sorter: true,
// ellipsis: true,
// customRender: ({text}) => toDateString(text, 'yyyy-MM-dd')
// },
{
title: '操作',
key: 'action',
width: 180,
fixed: 'right',
align: 'center',
hideInSetting: true
}
]);
/* 搜索 */
const reload = (where?: DormitoryFloorParam) => {
selection.value = [];
tableRef?.value?.reload({ where: where });
};
/* 打开编辑弹窗 */
const openEdit = (row?: DormitoryFloor) => {
current.value = row ?? null;
showEdit.value = true;
};
/* 打开批量移动弹窗 */
const openMove = () => {
showMove.value = true;
};
/* 删除单个 */
const remove = (row: DormitoryFloor) => {
const hide = message.loading('请求中..', 0);
removeDormitoryFloor(row.id)
.then((msg) => {
hide();
message.success(msg);
reload();
})
.catch((e) => {
hide();
message.error(e.message);
});
};
/* 批量删除 */
const removeBatch = () => {
if (!selection.value.length) {
message.error('请至少选择一条数据');
return;
}
Modal.confirm({
title: '提示',
content: '确定要删除选中的记录吗?',
icon: createVNode(ExclamationCircleOutlined),
maskClosable: true,
onOk: () => {
const hide = message.loading('请求中..', 0);
removeBatchDormitoryFloor(selection.value.map((d) => d.id))
.then((msg) => {
hide();
message.success(msg);
reload();
})
.catch((e) => {
hide();
message.error(e.message);
});
}
});
};
/* 查询 */
const query = () => {
loading.value = true;
};
/* 自定义行属性 */
const customRow = (record: DormitoryFloor) => {
return {
// 行点击事件
onClick: () => {
// console.log(record);
},
// 行双击事件
onDblclick: () => {
openEdit(record);
}
};
};
query();
</script>
<script lang="ts">
export default {
name: 'DormitoryFloor'
};
export default {
name: 'DormitoryFloor'
};
</script>
<style lang="less" scoped></style>

View File

@@ -26,27 +26,27 @@
v-model:value="form.name"
/>
</a-form-item>
<!-- <a-form-item label="编号" name="code">-->
<!-- <a-input-->
<!-- allow-clear-->
<!-- placeholder="请输入编号"-->
<!-- v-model:value="form.code"-->
<!-- />-->
<!-- </a-form-item>-->
<!-- <a-form-item label="楼栋ID" name="buildingId">-->
<!-- <a-input-->
<!-- allow-clear-->
<!-- placeholder="请输入楼栋ID"-->
<!-- v-model:value="form.buildingId"-->
<!-- />-->
<!-- </a-form-item>-->
<!-- <a-form-item label="楼层ID" name="floorId">-->
<!-- <a-input-->
<!-- allow-clear-->
<!-- placeholder="请输入楼层ID"-->
<!-- v-model:value="form.floorId"-->
<!-- />-->
<!-- </a-form-item>-->
<!-- <a-form-item label="编号" name="code">-->
<!-- <a-input-->
<!-- allow-clear-->
<!-- placeholder="请输入编号"-->
<!-- v-model:value="form.code"-->
<!-- />-->
<!-- </a-form-item>-->
<!-- <a-form-item label="楼栋ID" name="buildingId">-->
<!-- <a-input-->
<!-- allow-clear-->
<!-- placeholder="请输入楼栋ID"-->
<!-- v-model:value="form.buildingId"-->
<!-- />-->
<!-- </a-form-item>-->
<!-- <a-form-item label="楼层ID" name="floorId">-->
<!-- <a-input-->
<!-- allow-clear-->
<!-- placeholder="请输入楼层ID"-->
<!-- v-model:value="form.floorId"-->
<!-- />-->
<!-- </a-form-item>-->
<a-form-item label="床铺数" name="beds">
<a-input
allow-clear
@@ -55,7 +55,7 @@
/>
</a-form-item>
<a-form-item label="独立卫生间" name="toilet">
<a-switch v-model:checked="form.toilet"/>
<a-switch v-model:checked="form.toilet" />
</a-form-item>
<a-form-item label="排序" name="sortNumber">
<a-input-number
@@ -66,20 +66,20 @@
v-model:value="form.sortNumber"
/>
</a-form-item>
<!-- <a-form-item label="备注" name="comments">-->
<!-- <a-textarea-->
<!-- :rows="4"-->
<!-- :maxlength="200"-->
<!-- placeholder="请输入描述"-->
<!-- v-model:value="form.comments"-->
<!-- />-->
<!-- </a-form-item>-->
<!-- <a-form-item label="状态" name="status">-->
<!-- <a-radio-group v-model:value="form.status">-->
<!-- <a-radio :value="0">启用</a-radio>-->
<!-- <a-radio :value="1">禁用</a-radio>-->
<!-- </a-radio-group>-->
<!-- </a-form-item>-->
<!-- <a-form-item label="备注" name="comments">-->
<!-- <a-textarea-->
<!-- :rows="4"-->
<!-- :maxlength="200"-->
<!-- placeholder="请输入描述"-->
<!-- v-model:value="form.comments"-->
<!-- />-->
<!-- </a-form-item>-->
<!-- <a-form-item label="状态" name="status">-->
<!-- <a-radio-group v-model:value="form.status">-->
<!-- <a-radio :value="0">启用</a-radio>-->
<!-- <a-radio :value="1">禁用</a-radio>-->
<!-- </a-radio-group>-->
<!-- </a-form-item>-->
</a-form>
</ele-modal>
</template>
@@ -88,7 +88,10 @@
import { ref, reactive, watch } from 'vue';
import { Form, message } from 'ant-design-vue';
import { assignObject } from 'ele-admin-pro';
import { addDormitoryRecord, updateDormitoryRecord } from '@/api/dormitory/dormitoryRecord';
import {
addDormitoryRecord,
updateDormitoryRecord
} from '@/api/dormitory/dormitoryRecord';
import { DormitoryRecord } from '@/api/dormitory/dormitoryRecord/model';
import { useThemeStore } from '@/store/modules/theme';
import { storeToRefs } from 'pinia';
@@ -169,7 +172,9 @@
const formData = {
...form
};
const saveOrUpdate = isUpdate.value ? updateDormitoryRecord : addDormitoryRecord;
const saveOrUpdate = isUpdate.value
? updateDormitoryRecord
: addDormitoryRecord;
saveOrUpdate(formData)
.then((msg) => {
loading.value = false;

View File

@@ -1,7 +1,7 @@
<template>
<a-page-header :title="getPageTitle()" @back="() => $router.go(-1)">
<template #extra>
<Extra/>
<Extra />
</template>
<a-card :bordered="false" :body-style="{ padding: '16px' }">
<ele-pro-table
@@ -24,7 +24,7 @@
</template>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'image'">
<a-image :src="record.image" :width="50"/>
<a-image :src="record.image" :width="50" />
</template>
<template v-if="column.key === 'status'">
<a-tag v-if="record.status === 1" color="green">已使用</a-tag>
@@ -33,7 +33,7 @@
<template v-if="column.key === 'action'">
<a-space>
<a @click="openEdit(record)">修改</a>
<a-divider type="vertical"/>
<a-divider type="vertical" />
<a-popconfirm
title="确定要删除此记录吗?"
@confirm="remove(record)"
@@ -47,232 +47,243 @@
</a-card>
<!-- 编辑弹窗 -->
<DormitoryRecordEdit v-model:visible="showEdit" :data="current" @done="reload"/>
<DormitoryRecordEdit
v-model:visible="showEdit"
:data="current"
@done="reload"
/>
</a-page-header>
</template>
<script lang="ts" setup>
import {createVNode, ref} from 'vue';
import {message, Modal} from 'ant-design-vue';
import {ExclamationCircleOutlined} from '@ant-design/icons-vue';
import type {EleProTable} from 'ele-admin-pro';
import type {
DatasourceFunction,
ColumnItem
} from 'ele-admin-pro/es/ele-pro-table/types';
import Search from './components/search.vue';
import DormitoryRecordEdit from './components/dormitoryRecordEdit.vue';
import {pageDormitoryRecord, removeDormitoryRecord, removeBatchDormitoryRecord} from '@/api/dormitory/dormitoryRecord';
import type {DormitoryRecord, DormitoryRecordParam} from '@/api/dormitory/dormitoryRecord/model';
import {getPageTitle} from "@/utils/common";
import Extra from "@/views/dormitory/Extra.vue";
import { createVNode, ref } from 'vue';
import { message, Modal } from 'ant-design-vue';
import { ExclamationCircleOutlined } from '@ant-design/icons-vue';
import type { EleProTable } from 'ele-admin-pro';
import type {
DatasourceFunction,
ColumnItem
} from 'ele-admin-pro/es/ele-pro-table/types';
import Search from './components/search.vue';
import DormitoryRecordEdit from './components/dormitoryRecordEdit.vue';
import {
pageDormitoryRecord,
removeDormitoryRecord,
removeBatchDormitoryRecord
} from '@/api/dormitory/dormitoryRecord';
import type {
DormitoryRecord,
DormitoryRecordParam
} from '@/api/dormitory/dormitoryRecord/model';
import { getPageTitle } from '@/utils/common';
import Extra from '@/views/dormitory/Extra.vue';
// 表格实例
const tableRef = ref<InstanceType<typeof EleProTable> | null>(null);
// 表格实例
const tableRef = ref<InstanceType<typeof EleProTable> | null>(null);
// 表格选中数据
const selection = ref<DormitoryRecord[]>([]);
// 当前编辑数据
const current = ref<DormitoryRecord | null>(null);
// 是否显示编辑弹窗
const showEdit = ref(false);
// 是否显示批量移动弹窗
const showMove = ref(false);
// 加载状态
const loading = ref(true);
// 表格选中数据
const selection = ref<DormitoryRecord[]>([]);
// 当前编辑数据
const current = ref<DormitoryRecord | null>(null);
// 是否显示编辑弹窗
const showEdit = ref(false);
// 是否显示批量移动弹窗
const showMove = ref(false);
// 加载状态
const loading = ref(true);
// 表格数据源
const datasource: DatasourceFunction = ({
page,
limit,
where,
orders,
filters
}) => {
if (filters) {
where.status = filters.status;
}
return pageDormitoryRecord({
...where,
...orders,
// 表格数据源
const datasource: DatasourceFunction = ({
page,
limit
});
};
// 表格列配置
const columns = ref<ColumnItem[]>([
{
title: 'ID',
dataIndex: 'id',
key: 'id',
align: 'center',
width: 90,
},
{
title: '楼栋',
dataIndex: 'buildingName',
key: 'buildingName',
align: 'center',
width: 300,
},
{
title: '宿舍号',
dataIndex: 'name',
key: 'name',
align: 'center',
},
// {
// title: '编号',
// dataIndex: 'code',
// key: 'code',
// align: 'center',
// },
// {
// title: '楼栋ID',
// dataIndex: 'buildingId',
// key: 'buildingId',
// align: 'center',
// },
{
title: '楼层',
dataIndex: 'floorName',
key: 'floorName',
align: 'center',
},
{
title: '床铺数',
dataIndex: 'beds',
key: 'beds',
align: 'center',
},
// {
// title: '独立卫生间',
// dataIndex: 'toilet',
// key: 'toilet',
// align: 'center',
// },
{
title: '排序',
dataIndex: 'sortNumber',
key: 'sortNumber',
align: 'center',
},
// {
// title: '备注',
// dataIndex: 'comments',
// key: 'comments',
// align: 'center',
// },
// {
// title: '使用状态',
// dataIndex: 'status',
// key: 'status',
// align: 'center',
// },
// {
// title: '创建时间',
// dataIndex: 'createTime',
// key: 'createTime',
// align: 'center',
// sorter: true,
// ellipsis: true,
// customRender: ({text}) => toDateString(text, 'yyyy-MM-dd')
// },
{
title: '操作',
key: 'action',
width: 180,
fixed: 'right',
align: 'center',
hideInSetting: true
}
]);
/* 搜索 */
const reload = (where?: DormitoryRecordParam) => {
selection.value = [];
tableRef?.value?.reload({where: where});
};
/* 打开编辑弹窗 */
const openEdit = (row?: DormitoryRecord) => {
current.value = row ?? null;
showEdit.value = true;
};
/* 打开批量移动弹窗 */
const openMove = () => {
showMove.value = true;
};
/* 删除单个 */
const remove = (row: DormitoryRecord) => {
const hide = message.loading('请求中..', 0);
removeDormitoryRecord(row.id)
.then((msg) => {
hide();
message.success(msg);
reload();
})
.catch((e) => {
hide();
message.error(e.message);
limit,
where,
orders,
filters
}) => {
if (filters) {
where.status = filters.status;
}
return pageDormitoryRecord({
...where,
...orders,
page,
limit
});
};
/* 批量删除 */
const removeBatch = () => {
if (!selection.value.length) {
message.error('请至少选择一条数据');
return;
}
Modal.confirm({
title: '提示',
content: '确定要删除选中的记录吗?',
icon: createVNode(ExclamationCircleOutlined),
maskClosable: true,
onOk: () => {
const hide = message.loading('请求中..', 0);
removeBatchDormitoryRecord(selection.value.map((d) => d.id))
.then((msg) => {
hide();
message.success(msg);
reload();
})
.catch((e) => {
hide();
message.error(e.message);
});
}
});
};
/* 查询 */
const query = () => {
loading.value = true;
};
/* 自定义行属性 */
const customRow = (record: DormitoryRecord) => {
return {
// 行点击事件
onClick: () => {
// console.log(record);
},
// 行双击事件
onDblclick: () => {
openEdit(record);
}
};
};
query();
// 表格列配置
const columns = ref<ColumnItem[]>([
{
title: 'ID',
dataIndex: 'id',
key: 'id',
align: 'center',
width: 90
},
{
title: '楼栋',
dataIndex: 'buildingName',
key: 'buildingName',
align: 'center',
width: 300
},
{
title: '宿舍号',
dataIndex: 'name',
key: 'name',
align: 'center'
},
// {
// title: '编号',
// dataIndex: 'code',
// key: 'code',
// align: 'center',
// },
// {
// title: '楼栋ID',
// dataIndex: 'buildingId',
// key: 'buildingId',
// align: 'center',
// },
{
title: '楼层',
dataIndex: 'floorName',
key: 'floorName',
align: 'center'
},
{
title: '床铺数',
dataIndex: 'beds',
key: 'beds',
align: 'center'
},
// {
// title: '独立卫生间',
// dataIndex: 'toilet',
// key: 'toilet',
// align: 'center',
// },
{
title: '排序',
dataIndex: 'sortNumber',
key: 'sortNumber',
align: 'center'
},
// {
// title: '备注',
// dataIndex: 'comments',
// key: 'comments',
// align: 'center',
// },
// {
// title: '使用状态',
// dataIndex: 'status',
// key: 'status',
// align: 'center',
// },
// {
// title: '创建时间',
// dataIndex: 'createTime',
// key: 'createTime',
// align: 'center',
// sorter: true,
// ellipsis: true,
// customRender: ({text}) => toDateString(text, 'yyyy-MM-dd')
// },
{
title: '操作',
key: 'action',
width: 180,
fixed: 'right',
align: 'center',
hideInSetting: true
}
]);
/* 搜索 */
const reload = (where?: DormitoryRecordParam) => {
selection.value = [];
tableRef?.value?.reload({ where: where });
};
/* 打开编辑弹窗 */
const openEdit = (row?: DormitoryRecord) => {
current.value = row ?? null;
showEdit.value = true;
};
/* 打开批量移动弹窗 */
const openMove = () => {
showMove.value = true;
};
/* 删除单个 */
const remove = (row: DormitoryRecord) => {
const hide = message.loading('请求中..', 0);
removeDormitoryRecord(row.id)
.then((msg) => {
hide();
message.success(msg);
reload();
})
.catch((e) => {
hide();
message.error(e.message);
});
};
/* 批量删除 */
const removeBatch = () => {
if (!selection.value.length) {
message.error('请至少选择一条数据');
return;
}
Modal.confirm({
title: '提示',
content: '确定要删除选中的记录吗?',
icon: createVNode(ExclamationCircleOutlined),
maskClosable: true,
onOk: () => {
const hide = message.loading('请求中..', 0);
removeBatchDormitoryRecord(selection.value.map((d) => d.id))
.then((msg) => {
hide();
message.success(msg);
reload();
})
.catch((e) => {
hide();
message.error(e.message);
});
}
});
};
/* 查询 */
const query = () => {
loading.value = true;
};
/* 自定义行属性 */
const customRow = (record: DormitoryRecord) => {
return {
// 行点击事件
onClick: () => {
// console.log(record);
},
// 行双击事件
onDblclick: () => {
openEdit(record);
}
};
};
query();
</script>
<script lang="ts">
export default {
name: 'DormitoryRecord'
};
export default {
name: 'DormitoryRecord'
};
</script>
<style lang="less" scoped></style>

View File

@@ -1,55 +1,54 @@
<!-- 搜索表单 -->
<template>
<a-space style="flex-wrap: wrap" v-if="hasRole('superAdmin') || hasRole('admin') || hasRole('foundation')">
<a-space
style="flex-wrap: wrap"
v-if="hasRole('superAdmin') || hasRole('admin') || hasRole('foundation')"
>
<a-button
type="text"
v-if="hasPermission('sys:org:list')"
@click="openUrl('/staff')"
>人员管理
</a-button
>
>人员管理
</a-button>
<a-button
type="text"
v-if="hasPermission('sys:userVerify:list')"
@click="openUrl('/system/user-verify')"
>实名认证
</a-button
>
>实名认证
</a-button>
<a-button
type="text"
v-if="hasAnyRole(['superAdmin','admin'])"
v-if="hasAnyRole(['superAdmin', 'admin'])"
@click="openUrl('/system/admin')"
>管理员列表
</a-button
>
>管理员列表
</a-button>
</a-space>
</template>
<script lang="ts" setup>
import {watch, nextTick} from 'vue';
import {CmsWebsite} from '@/api/cms/cmsWebsite/model';
import {openUrl} from "@/utils/common";
import {hasAnyRole, hasPermission, hasRole} from "@/utils/permission";
import { watch, nextTick } from 'vue';
import { CmsWebsite } from '@/api/cms/cmsWebsite/model';
import { openUrl } from '@/utils/common';
import { hasAnyRole, hasPermission, hasRole } from '@/utils/permission';
const props = withDefaults(
defineProps<{
// 选中的角色
selection?: [];
website?: CmsWebsite;
count?: 0;
}>(),
{}
);
const props = withDefaults(
defineProps<{
// 选中的角色
selection?: [];
website?: CmsWebsite;
count?: 0;
}>(),
{}
);
nextTick(() => {
if (localStorage.getItem('NotActive')) {
// IsActive.value = false
}
})
nextTick(() => {
if (localStorage.getItem('NotActive')) {
// IsActive.value = false
}
});
watch(
() => props.selection,
() => {
}
);
watch(
() => props.selection,
() => {}
);
</script>

View File

@@ -19,53 +19,53 @@
</template>
<script lang="ts" setup>
import {ref, computed} from 'vue';
import {message} from 'ant-design-vue/es';
import {listRoles} from '@/api/system/role';
import type {Role} from '@/api/system/role/model';
import { ref, computed } from 'vue';
import { message } from 'ant-design-vue/es';
import { listRoles } from '@/api/system/role';
import type { Role } from '@/api/system/role/model';
const emit = defineEmits<{
(e: 'update:value', value: Role[]): void;
(e: 'blur'): void;
}>();
const emit = defineEmits<{
(e: 'update:value', value: Role[]): void;
(e: 'blur'): void;
}>();
const props = withDefaults(
defineProps<{
// 选中的角色
value?: Role[];
//
placeholder?: string;
}>(),
{
placeholder: '请选择角色'
}
);
// 选中的角色id
const roleIds = computed(() => props.value?.map((d) => d.roleId as number));
// 角色数据
const data = ref<Role[]>([]);
/* 更新选中数据 */
const updateValue = (value: number[]) => {
emit(
'update:value',
value.map((v) => ({roleId: v}))
const props = withDefaults(
defineProps<{
// 选中的角色
value?: Role[];
//
placeholder?: string;
}>(),
{
placeholder: '请选择角色'
}
);
};
/* 获取角色数据 */
listRoles()
.then((list) => {
data.value = list;
})
.catch((e) => {
message.error(e.message);
});
// 选中的角色id
const roleIds = computed(() => props.value?.map((d) => d.roleId as number));
/* 失去焦点 */
const onBlur = () => {
emit('blur');
};
// 角色数据
const data = ref<Role[]>([]);
/* 更新选中数据 */
const updateValue = (value: number[]) => {
emit(
'update:value',
value.map((v) => ({ roleId: v }))
);
};
/* 获取角色数据 */
listRoles()
.then((list) => {
data.value = list;
})
.catch((e) => {
message.error(e.message);
});
/* 失去焦点 */
const onBlur = () => {
emit('blur');
};
</script>

View File

@@ -154,7 +154,7 @@
// import { getDictionaryOptions } from '@/utils/common';
import { Organization } from '@/api/system/organization/model';
import { Grade } from '@/api/user/grade/model';
import {TEMPLATE_ID} from "@/config/setting";
import { TEMPLATE_ID } from '@/config/setting';
// 是否开启响应式布局
const themeStore = useThemeStore();

View File

@@ -49,7 +49,9 @@
v-bind="styleResponsive ? { md: 12, sm: 24, xs: 24 } : { span: 12 }"
>
<a-form-item label="可用余额">
<span class="ele-text-success">{{ formatNumber(user.balance) }}</span>
<span class="ele-text-success"
>{{ formatNumber(user.balance) }}</span
>
</a-form-item>
<a-form-item label="可用积分">
<span class="ele-text">{{ user.points }}</span>

View File

@@ -97,11 +97,7 @@
/>
</a-form-item>
<a-form-item label="" name="idcard">
<a-input
allow-clear
placeholder="请输入"
v-model:value="form.idcard"
/>
<a-input allow-clear placeholder="请输入" v-model:value="form.idcard" />
</a-form-item>
<a-form-item label="" name="truename">
<a-input
@@ -254,12 +250,12 @@
images.value = [];
if (props.data) {
assignObject(form, props.data);
if(props.data.image){
if (props.data.image) {
images.value.push({
uid: uuid(),
url: props.data.image,
status: 'done'
})
});
}
isUpdate.value = true;
} else {

File diff suppressed because it is too large Load Diff