大屏项目初始化
This commit is contained in:
13
screen-vue/src/api/bizFiles.js
Normal file
13
screen-vue/src/api/bizFiles.js
Normal file
@@ -0,0 +1,13 @@
|
||||
import request from '@/utils/request';
|
||||
|
||||
/**
|
||||
* 导出用户信息
|
||||
*/
|
||||
export function download(params) {
|
||||
return request({
|
||||
url: '/biz/homeFiles/dwonload',
|
||||
method: 'get',
|
||||
params,
|
||||
responseType: 'blob'
|
||||
});
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
|
||||
/**
|
||||
* 获取指标信息列表
|
||||
*/
|
||||
@@ -11,6 +12,28 @@ export function getHomeModuleList(params) {
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取指标信息列表
|
||||
*/
|
||||
export function getHomeModuleListAll(params) {
|
||||
return request({
|
||||
url: '/biz/homeModule/listAll',
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除信息列表
|
||||
*/
|
||||
export function getHomeModuleSave(data) {
|
||||
return request({
|
||||
url: '/biz/homeModule/save',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除信息列表
|
||||
*/
|
||||
|
||||
@@ -11,6 +11,17 @@ export function getHomeRoleList(params) {
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取指标信息列表
|
||||
*/
|
||||
export function getHomeRoleUserList(params) {
|
||||
return request({
|
||||
url: '/biz/homeRole/userList',
|
||||
method: 'get',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取角色授权的菜单
|
||||
*/
|
||||
|
||||
@@ -42,4 +42,5 @@ export function getHomeUserDelete(params) {
|
||||
method: 'post',
|
||||
params: params
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import axios from 'axios'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import { ElMessage, ElMessageBox } from 'element-plus'
|
||||
import router from '@/router'
|
||||
|
||||
const service = axios.create({
|
||||
@@ -39,27 +39,32 @@ service.interceptors.response.use(
|
||||
(response) => {
|
||||
const res = response.data;
|
||||
|
||||
// 1. 处理登录失效
|
||||
if (response.config.responseType === 'blob') {
|
||||
return handleFileExport(response);
|
||||
}
|
||||
|
||||
if (res.code === 401) {
|
||||
handleLoginExpired();
|
||||
return Promise.reject(res);
|
||||
}
|
||||
|
||||
// 2. 处理业务成功
|
||||
if (res.code === 200) {
|
||||
return res.data;
|
||||
}
|
||||
|
||||
// 3. 处理其他业务错误(如500)
|
||||
ElMessage.error(res.msg || '请求失败');
|
||||
return Promise.reject(res);
|
||||
},
|
||||
(error) => {
|
||||
const requestUrl = error?.config?.url || '';
|
||||
const isWhite = WHITE_LIST.some(item => requestUrl.includes(item));
|
||||
|
||||
if (error.config?.responseType === 'blob') {
|
||||
handleFileExportError(error);
|
||||
return Promise.reject(error);
|
||||
}
|
||||
|
||||
if (isWhite) {
|
||||
const errMsg = error?.response?.data?.msg || '登录请求失败,请检查网络或账号信息';
|
||||
const errMsg = error?.response?.data?.msg || '登录请求失败,请检查网络或账号信息';
|
||||
ElMessage.error(errMsg);
|
||||
return Promise.reject(error);
|
||||
}
|
||||
@@ -70,7 +75,7 @@ service.interceptors.response.use(
|
||||
}
|
||||
|
||||
if (!error.response) {
|
||||
ElMessage.error('网络异常,请检查网络连接后重试');
|
||||
ElMessage.error('网络异常,请检查网络连接后重试');
|
||||
return Promise.reject(error);
|
||||
}
|
||||
|
||||
@@ -82,7 +87,79 @@ function handleLoginExpired() {
|
||||
localStorage.removeItem('token');
|
||||
if (router.currentRoute.path !== '/login') {
|
||||
router.push('/login').catch(() => {});
|
||||
ElMessage.error('登录已失效,请重新登录');
|
||||
ElMessage.error('登录已失效,请重新登录');
|
||||
}
|
||||
}
|
||||
|
||||
function handleFileExport(response) {
|
||||
const blob = response.data;
|
||||
const defaultFileName = 'file.xlsx';
|
||||
return new Promise((resolve, reject) => {
|
||||
if (!blob || blob.size === 0) {
|
||||
ElMessage.error('文件大小异常,请稍后重试');
|
||||
reject(new Error('文件内容为空'));
|
||||
return;
|
||||
}
|
||||
const reader = new FileReader();
|
||||
reader.onerror = function() {
|
||||
reject(new Error('文件解析失败'));
|
||||
};
|
||||
reader.onload = function() {
|
||||
try {
|
||||
const res = JSON.parse(reader.result);
|
||||
ElMessage.error(res.msg || '文件下载失败');
|
||||
reject(res);
|
||||
} catch (e) {
|
||||
let fileName = defaultFileName;
|
||||
const disposition = response.headers['content-disposition'];
|
||||
if (disposition) {
|
||||
const match = disposition.match(/filename\*=UTF-8''(.+)/i);
|
||||
if (match && match[1]) {
|
||||
fileName = decodeURIComponent(match[1]);
|
||||
}
|
||||
}
|
||||
if (response.config.downloadFileName) {
|
||||
fileName = typeof response.config.downloadFileName === 'function'
|
||||
? response.config.downloadFileName(response)
|
||||
: response.config.downloadFileName;
|
||||
}
|
||||
|
||||
try {
|
||||
const url = window.URL.createObjectURL(blob);
|
||||
const link = document.createElement('a');
|
||||
link.target = '_blank';
|
||||
link.rel = 'noopener noreferrer';
|
||||
link.href = url;
|
||||
link.setAttribute('download', fileName);
|
||||
document.body.appendChild(link);
|
||||
const clickEvent = new MouseEvent('click', {
|
||||
bubbles: true,
|
||||
cancelable: true,
|
||||
view: window
|
||||
});
|
||||
link.dispatchEvent(clickEvent);
|
||||
setTimeout(() => {
|
||||
document.body.removeChild(link);
|
||||
window.URL.revokeObjectURL(url);
|
||||
}, 100);
|
||||
resolve(blob);
|
||||
} catch (downloadError) {
|
||||
ElMessage.error('文件下载失败,请手动重试');
|
||||
reject(downloadError);
|
||||
}
|
||||
}
|
||||
};
|
||||
reader.readAsText(blob);
|
||||
});
|
||||
}
|
||||
|
||||
function handleFileExportError(error) {
|
||||
if (error.response?.status === 401) {
|
||||
handleLoginExpired();
|
||||
} else if (error.message.includes('timeout')) {
|
||||
ElMessage.error('文件下载超时,请稍后重试');
|
||||
} else {
|
||||
ElMessage.error('文件下载失败,请稍后重试');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
</template>
|
||||
<template #main>
|
||||
<div class="main-content">
|
||||
<vUser @refresh-role-list="getListData" />
|
||||
<vUser @refresh-role-list="getListData" :formParams="FormValues" />
|
||||
</div>
|
||||
</template>
|
||||
</ResizablePage>
|
||||
@@ -43,14 +43,14 @@ import { ElMessage, ElMessageBox, ElNotification } from 'element-plus'
|
||||
import ResizablePage from '@/components/Table/proResizable.vue'
|
||||
import FilterSelect from '@/components/Table/proFilterSelect.vue'
|
||||
import PDialog from '@/components/Dialog/proDialog.vue'
|
||||
import { getHomeModuleList } from '@/api/bizModule'
|
||||
import { getHomeModuleUserSave , getHomeModuleUserDelete } from '@/api/bizModuleUser'
|
||||
import { getHomeModuleListAll, getHomeModuleDelete } from '@/api/bizModule'
|
||||
import { getHomeModuleUserSave } from '@/api/bizModuleUser'
|
||||
|
||||
import vUser from './list.vue'
|
||||
import vRole from './role.vue'
|
||||
|
||||
const FormValues = ref({
|
||||
menuId: ''
|
||||
moduleId: ''
|
||||
});
|
||||
|
||||
const listData = ref([]);
|
||||
@@ -61,7 +61,7 @@ const formComponentRef = ref(null)
|
||||
|
||||
const getListData = async () => {
|
||||
try {
|
||||
const res = await getHomeModuleList();
|
||||
const res = await getHomeModuleListAll();
|
||||
listData.value = res || []
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
@@ -69,7 +69,7 @@ const getListData = async () => {
|
||||
}
|
||||
|
||||
const handleItemClick = (item) => {
|
||||
console.log('选中了:', item)
|
||||
FormValues.value.moduleId = item.moduleId
|
||||
}
|
||||
|
||||
const handleEdit = (item) => {
|
||||
@@ -85,9 +85,9 @@ const handleDelete = (item) => {
|
||||
})
|
||||
.then(async () => {
|
||||
const reqParams = {
|
||||
roleId: item.roleId
|
||||
moduleId: item.moduleId
|
||||
}
|
||||
const res = await getHomeModuleUserDelete(reqParams);
|
||||
const res = await getHomeModuleDelete(reqParams);
|
||||
ElMessage.success(res.msg);
|
||||
getListData();
|
||||
})
|
||||
|
||||
@@ -40,9 +40,6 @@
|
||||
<el-button type="primary" icon="Plus" @click="handleAdd">
|
||||
新增
|
||||
</el-button>
|
||||
<el-button type="success" icon="Download" @click="handleExport">
|
||||
导出
|
||||
</el-button>
|
||||
</div>
|
||||
<STable
|
||||
:table-data="tableData"
|
||||
@@ -58,6 +55,8 @@
|
||||
<el-table-column prop="sex" label="性别" />
|
||||
<el-table-column prop="email" label="电子邮箱" width="225" show-overflow-tooltip="true" />
|
||||
<el-table-column prop="phone" label="联系电话" />
|
||||
<el-table-column prop="moduleName" label="模块名称" sortable />
|
||||
<el-table-column prop="moduleCode" label="模块编码" />
|
||||
<el-table-column prop="ustatus" label="状态" min-width="100" align="center">
|
||||
<template #default="scope">
|
||||
<el-tag
|
||||
@@ -86,17 +85,23 @@
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, reactive, onMounted } from 'vue'
|
||||
import { ref, reactive, onMounted, watch } from 'vue'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import { Plus, Download, Edit, Delete } from '@element-plus/icons-vue'
|
||||
import { getHomeUserList } from '@/api/bizUser'
|
||||
import { getHomeRoleSave } from '@/api/bizRole'
|
||||
import { getHomeModuleSave, getHomeModuleList } from '@/api/bizModule'
|
||||
|
||||
import CSearch from '@/components/Search/proSearch.vue'
|
||||
import STable from '@/components/Table/proTable.vue'
|
||||
import PDialog from '@/components/Dialog/proDialog.vue'
|
||||
import VForm from './form.vue'
|
||||
|
||||
const props = defineProps({
|
||||
formParams: {
|
||||
type: Object,
|
||||
default: () => ({})
|
||||
}
|
||||
})
|
||||
|
||||
const formComponentRef = ref(null)
|
||||
const emit = defineEmits(['refresh-role-list'])
|
||||
|
||||
@@ -124,11 +129,12 @@ async function getDataList() {
|
||||
loading.value = true
|
||||
try {
|
||||
const reqParmas = {
|
||||
... searchForm,
|
||||
pageNum: pagination.pageNum,
|
||||
pageSize: pagination.pageSize,
|
||||
... searchForm,
|
||||
...props.formParams,
|
||||
}
|
||||
const res = await getHomeUserList(reqParmas);
|
||||
const res = await getHomeModuleList(reqParmas);
|
||||
pagination.total = res.total;
|
||||
tableData.value = res.list || [];
|
||||
} catch (error) {
|
||||
@@ -175,10 +181,6 @@ const handleEdit = (row) => {
|
||||
dialogVisible.value = true
|
||||
}
|
||||
|
||||
const handleExport = () => {
|
||||
ElMessage.success('开始导出数据...')
|
||||
}
|
||||
|
||||
const handleSizeChange = (val) => {
|
||||
pagination.pageSize = val
|
||||
getDataList()
|
||||
@@ -216,7 +218,7 @@ const handleSave = async () => {
|
||||
const reqParams = {
|
||||
...formData.value
|
||||
}
|
||||
const res = await getHomeRoleSave(reqParams);
|
||||
const res = await getHomeModuleSave(reqParams);
|
||||
ElMessage.success(res.msg)
|
||||
dialogVisible.value = false
|
||||
emit('refresh-role-list')
|
||||
@@ -227,6 +229,16 @@ const handleSave = async () => {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
watch(
|
||||
() => props.formParams,
|
||||
() => {
|
||||
getDataList();
|
||||
},
|
||||
{ deep: true, immediate: true }
|
||||
)
|
||||
|
||||
|
||||
onMounted(() => {
|
||||
getDataList()
|
||||
})
|
||||
|
||||
@@ -8,10 +8,10 @@
|
||||
>
|
||||
<div class="form-row">
|
||||
<div class="form-col">
|
||||
<el-form-item label="模块编号" prop="moduleId">
|
||||
<el-form-item label="模块标识" prop="moduleId">
|
||||
<el-input
|
||||
v-model="formData.moduleId"
|
||||
placeholder="请输入模块编号"
|
||||
placeholder="请输入模块标识"
|
||||
disabled
|
||||
clearable
|
||||
/>
|
||||
@@ -27,6 +27,64 @@
|
||||
</el-form-item>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<div class="form-col">
|
||||
<el-form-item label="模块编号" prop="moduleCode">
|
||||
<el-input
|
||||
v-model="formData.moduleCode"
|
||||
placeholder="请输入模块编号"
|
||||
clearable
|
||||
/>
|
||||
</el-form-item>
|
||||
</div>
|
||||
<div class="form-col">
|
||||
<el-form-item label="路由地址" prop="path">
|
||||
<el-input
|
||||
v-model="formData.path"
|
||||
placeholder="请输入路由地址"
|
||||
clearable
|
||||
/>
|
||||
</el-form-item>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<div class="form-col">
|
||||
<el-form-item label="大屏标题" prop="titleName">
|
||||
<el-input
|
||||
v-model="formData.titleName"
|
||||
placeholder="请输入大屏标题"
|
||||
clearable
|
||||
/>
|
||||
</el-form-item>
|
||||
</div>
|
||||
<div class="form-col">
|
||||
<el-form-item label="模块状态" prop="ustatus">
|
||||
<el-select
|
||||
v-model="formData.ustatus"
|
||||
placeholder="请选择模块状态"
|
||||
clearable
|
||||
>
|
||||
<el-option label="停用" value="0" />
|
||||
<el-option label="在用" value="1" />
|
||||
<el-option label="锁定" value="2" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-row">
|
||||
<div class="form-col">
|
||||
<el-form-item label="模块描述" prop="remark">
|
||||
<el-input
|
||||
v-model="formData.remark"
|
||||
placeholder="请输入模块描述"
|
||||
type="textarea"
|
||||
clearable
|
||||
/>
|
||||
</el-form-item>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-row transfer-row">
|
||||
<div class="form-col transfer-col">
|
||||
<el-form-item label="权限列表" prop="userIds">
|
||||
@@ -58,6 +116,11 @@ const props = defineProps({
|
||||
default: () => ({
|
||||
moduleId: '',
|
||||
moduleName: '',
|
||||
moduleCode: '',
|
||||
path: '',
|
||||
titleName: '',
|
||||
remark: '',
|
||||
ustatus: '',
|
||||
userIds: []
|
||||
})
|
||||
},
|
||||
@@ -72,6 +135,10 @@ const transferData = ref([])
|
||||
|
||||
const formRules = {
|
||||
moduleName: [ { required: true, message: '请输入模块名称', trigger: 'blur' } ],
|
||||
moduleCode: [ { required: true, message: '请输入模块编号', trigger: 'blur' } ],
|
||||
path: [ { required: true, message: '请输入路由地址', trigger: 'blur' } ],
|
||||
titleName: [ { required: true, message: '请输入大屏标题', trigger: 'blur' } ],
|
||||
ustatus: [ { required: true, message: '请选择模块状态', trigger: 'blur' } ],
|
||||
userIds: [
|
||||
{ required: true, message: '请至少选择一个用户', trigger: 'change' }
|
||||
]
|
||||
|
||||
8
screen-vue/src/views/screen/Sys/index.vue
Normal file
8
screen-vue/src/views/screen/Sys/index.vue
Normal file
@@ -0,0 +1,8 @@
|
||||
<template>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
</script>
|
||||
|
||||
<style>
|
||||
</style>
|
||||
@@ -39,9 +39,6 @@
|
||||
<el-button type="primary" icon="Plus" @click="handleAdd">
|
||||
新增
|
||||
</el-button>
|
||||
<el-button type="success" icon="Download" @click="handleExport">
|
||||
导出
|
||||
</el-button>
|
||||
</div>
|
||||
<TreeTable
|
||||
:table-data="tableData"
|
||||
@@ -211,12 +208,6 @@ const handleDelete = async (row) => {
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
const handleExport = () => {
|
||||
console.log('导出菜单数据');
|
||||
}
|
||||
|
||||
const handleDialogClose = () => {
|
||||
formData.value = {}
|
||||
isEdit.value = false
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
</template>
|
||||
<template #main>
|
||||
<div class="main-content">
|
||||
<vUser @refresh-role-list="getListData" />
|
||||
<vUser @refresh-role-list="getListData" :formParams="FormValues" />
|
||||
</div>
|
||||
</template>
|
||||
</ResizablePage>
|
||||
@@ -48,7 +48,7 @@ import vUser from './list.vue'
|
||||
import vRole from './role.vue'
|
||||
|
||||
const FormValues = ref({
|
||||
menuId: ''
|
||||
roleId: ''
|
||||
});
|
||||
|
||||
const listData = ref([]);
|
||||
@@ -67,7 +67,7 @@ const getListData = async () => {
|
||||
}
|
||||
|
||||
const handleItemClick = (item) => {
|
||||
console.log('选中了:', item)
|
||||
FormValues.value.roleId = item.roleId
|
||||
}
|
||||
|
||||
const handleEdit = (item) => {
|
||||
|
||||
@@ -40,9 +40,6 @@
|
||||
<el-button type="primary" icon="Plus" @click="handleAdd">
|
||||
新增
|
||||
</el-button>
|
||||
<el-button type="success" icon="Download" @click="handleExport">
|
||||
导出
|
||||
</el-button>
|
||||
</div>
|
||||
<STable
|
||||
:table-data="tableData"
|
||||
@@ -86,17 +83,23 @@
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, reactive, onMounted } from 'vue'
|
||||
import { ref, reactive, onMounted, watch } from 'vue'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import { Plus, Download, Edit, Delete } from '@element-plus/icons-vue'
|
||||
import { getHomeUserList } from '@/api/bizUser'
|
||||
import { getHomeRoleSave } from '@/api/bizRole'
|
||||
import { getHomeRoleSave, getHomeRoleUserList } from '@/api/bizRole'
|
||||
|
||||
import CSearch from '@/components/Search/proSearch.vue'
|
||||
import STable from '@/components/Table/proTable.vue'
|
||||
import PDialog from '@/components/Dialog/proDialog.vue'
|
||||
import VForm from './form.vue'
|
||||
|
||||
const props = defineProps({
|
||||
formParams: {
|
||||
type: Object,
|
||||
default: () => ({})
|
||||
}
|
||||
})
|
||||
|
||||
const formComponentRef = ref(null)
|
||||
const emit = defineEmits(['refresh-role-list'])
|
||||
|
||||
@@ -124,11 +127,12 @@ async function getDataList() {
|
||||
loading.value = true
|
||||
try {
|
||||
const reqParmas = {
|
||||
... searchForm,
|
||||
pageNum: pagination.pageNum,
|
||||
pageSize: pagination.pageSize,
|
||||
... searchForm,
|
||||
...props.formParams,
|
||||
}
|
||||
const res = await getHomeUserList(reqParmas);
|
||||
const res = await getHomeRoleUserList(reqParmas);
|
||||
pagination.total = res.total;
|
||||
tableData.value = res.list || [];
|
||||
} catch (error) {
|
||||
@@ -175,10 +179,6 @@ const handleEdit = (row) => {
|
||||
dialogVisible.value = true
|
||||
}
|
||||
|
||||
const handleExport = () => {
|
||||
ElMessage.success('开始导出数据...')
|
||||
}
|
||||
|
||||
const handleSizeChange = (val) => {
|
||||
pagination.pageSize = val
|
||||
getDataList()
|
||||
@@ -227,6 +227,14 @@ const handleSave = async () => {
|
||||
}
|
||||
}
|
||||
|
||||
watch(
|
||||
() => props.formParams,
|
||||
() => {
|
||||
getDataList();
|
||||
},
|
||||
{ deep: true, immediate: true }
|
||||
)
|
||||
|
||||
onMounted(() => {
|
||||
getDataList()
|
||||
})
|
||||
|
||||
@@ -40,9 +40,6 @@
|
||||
<el-button type="primary" icon="Plus" @click="handleAdd">
|
||||
新增
|
||||
</el-button>
|
||||
<el-button type="success" icon="Download" @click="handleExport">
|
||||
导出
|
||||
</el-button>
|
||||
</div>
|
||||
<STable
|
||||
:table-data="tableData"
|
||||
@@ -139,9 +136,9 @@ async function getDataList() {
|
||||
loading.value = true
|
||||
try {
|
||||
const reqParams = {
|
||||
... searchForm,
|
||||
pageNum: pagination.pageNum,
|
||||
pageSize: pagination.pageSize,
|
||||
... searchForm,
|
||||
}
|
||||
const res = await getHomeUserList(reqParams);
|
||||
pagination.total = res.total;
|
||||
@@ -192,10 +189,6 @@ const handleEdit = (row) => {
|
||||
dialogVisible.value = true
|
||||
}
|
||||
|
||||
const handleExport = () => {
|
||||
ElMessage.success('开始导出数据...')
|
||||
}
|
||||
|
||||
const handleDelete = async (row) => {
|
||||
ElMessageBox.confirm('确定要删除该条数据吗?', '删除确认', {
|
||||
type: 'warning',
|
||||
|
||||
Reference in New Issue
Block a user