大屏页面初始化

This commit is contained in:
2026-03-06 17:25:46 +08:00
parent b9d209f7ef
commit 5ce6c6800f
9 changed files with 179 additions and 51 deletions

View File

@@ -11,6 +11,13 @@ export function getHomeMenuList(params) {
}) })
} }
export function getHomeMenuPlist(params) {
return request({
url: '/biz/homeMenu/pList',
method: 'get',
params: params
})
}
/** /**
* 获取指标信息列表 * 获取指标信息列表
@@ -33,3 +40,24 @@ export function getTreeMenuList(params) {
} }
/**
* 保存菜单信息列表
*/
export function getHomeMenuSave(data) {
return request({
url: '/biz/homeMenu/save',
method: 'post',
data
})
}
/**
* 删除菜单信息
*/
export function getHomeMenuDelete(params) {
return request({
url: '/biz/homeMenu/delete',
method: 'post',
params: params
})
}

View File

@@ -34,3 +34,13 @@ export function getHomeRoleAssign(data) {
} }
/**
* 删除角色信息
*/
export function getHomeRoleDelete(params) {
return request({
url: '/biz/homeRole/delete',
method: 'post',
params: params
})
}

View File

@@ -15,6 +15,12 @@
clearable clearable
> >
<el-option label="根目录" value="0" /> <el-option label="根目录" value="0" />
<el-option
v-for="item in pData"
:key="item.menuId"
:label="item.menuName"
:value="item.menuId"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
</div> </div>
@@ -61,7 +67,6 @@
v-model="formData.sort" v-model="formData.sort"
placeholder="请输入菜单序号" placeholder="请输入菜单序号"
clearable clearable
type="number"
/> />
</el-form-item> </el-form-item>
</div> </div>
@@ -122,9 +127,9 @@
</template> </template>
<script setup> <script setup>
import { ref, computed } from 'vue' import { ref, computed , onMounted } from 'vue'
import * as ElementPlusIconsVue from '@element-plus/icons-vue' import * as ElementPlusIconsVue from '@element-plus/icons-vue'
import { getHomeMenuList, getHomeMenuSave, getHomeMenuDelete, getHomeMenuPlist } from '@/api/bizMenu'
const props = defineProps({ const props = defineProps({
formData: { formData: {
type: Object, type: Object,
@@ -134,7 +139,7 @@ const props = defineProps({
menuName: '', menuName: '',
menuType: '', menuType: '',
path: '', path: '',
sort: 0, sort: '0',
isIframe: '', isIframe: '',
menuIcon: '', menuIcon: '',
ustatus: '1', ustatus: '1',
@@ -148,6 +153,8 @@ const props = defineProps({
const formRef = ref(null) const formRef = ref(null)
const pData = ref()
const iconList = computed(() => { const iconList = computed(() => {
return Object.keys(ElementPlusIconsVue).filter(name => return Object.keys(ElementPlusIconsVue).filter(name =>
!name.includes('Internal') && !name.includes('Icon') !name.includes('Internal') && !name.includes('Icon')
@@ -187,6 +194,20 @@ const resetForm = () => {
} }
defineExpose({ validate, resetForm }) defineExpose({ validate, resetForm })
const getPlistData = async () =>{
try {
const res = await getHomeMenuPlist();
pData.value = res || [];
} catch (error) {
console.log(error);
}
}
onMounted(() => {
getPlistData();
})
</script> </script>
<style scoped> <style scoped>

View File

@@ -50,7 +50,7 @@
row-key="menuId" row-key="menuId"
> >
<template #columns> <template #columns>
<el-table-column prop="menuName" label="菜单名称" width="225" :tree-node="true" /> <el-table-column prop="menuName" label="菜单名称" width="200" :tree-node="true" fixed="left" />
<el-table-column label="菜单类型" width="100"> <el-table-column label="菜单类型" width="100">
<template #default="scope"> <template #default="scope">
<el-tag :type="scope.row.menuType === 'M' ? 'info' : scope.row.menuType === 'C' ? 'primary' : 'warning'"> <el-tag :type="scope.row.menuType === 'M' ? 'info' : scope.row.menuType === 'C' ? 'primary' : 'warning'">
@@ -58,8 +58,8 @@
</el-tag> </el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="path" label="路由地址" width="225" /> <el-table-column prop="path" label="路由地址" show-overflow-tooltip="true" />
<el-table-column prop="sort" label="序号" sortable /> <el-table-column prop="sort" label="序号" sortable width="80" />
<el-table-column label="是否外链" width="100"> <el-table-column label="是否外链" width="100">
<template #default="scope"> <template #default="scope">
<span>{{ scope.row.isIframe === '1' ? '是' : '否' }}</span> <span>{{ scope.row.isIframe === '1' ? '是' : '否' }}</span>
@@ -101,6 +101,7 @@
<PDialog <PDialog
v-model="dialogVisible" v-model="dialogVisible"
:loading="saveLoading"
:title="isEdit ? '编辑数据' : '新增数据'" :title="isEdit ? '编辑数据' : '新增数据'"
@close="handleDialogClose" @close="handleDialogClose"
@reset="handleDialogReset" @reset="handleDialogReset"
@@ -118,7 +119,7 @@ import CSearch from '@/components/Search/proSearch.vue'
import PDialog from '@/components/Dialog/proDialog.vue' import PDialog from '@/components/Dialog/proDialog.vue'
import TreeTable from '@/components/Table/proTreeTable.vue' import TreeTable from '@/components/Table/proTreeTable.vue'
import { ElMessageBox, ElMessage } from 'element-plus' import { ElMessageBox, ElMessage } from 'element-plus'
import { getHomeMenuList } from '@/api/bizMenu' import { getHomeMenuList, getHomeMenuSave, getHomeMenuDelete } from '@/api/bizMenu'
import VForm from './form.vue' import VForm from './form.vue'
const props = defineProps({ const props = defineProps({
@@ -134,9 +135,11 @@ const searchForm = reactive({
ustatus: '', ustatus: '',
}) })
const saveLoading = ref(false)
const dialogVisible = ref(false) const dialogVisible = ref(false)
const isEdit = ref(false) const isEdit = ref(false)
const formData = ref({}) const formData = ref({})
const currentRow = ref({})
const formComponentRef = ref(null) const formComponentRef = ref(null)
const tableData = ref() const tableData = ref()
@@ -175,35 +178,40 @@ const getTreeListData = async () => {
} }
} }
const handleAdd = () => {
isEdit.value = false
formData.value = {}
currentRow.value = {}
dialogVisible.value = true
}
const handleEdit = (row) => { const handleEdit = (row) => {
isEdit.value = true isEdit.value = true
formData.value = { ...row } formData.value = { ...row }
currentRow.value = { ...row }
dialogVisible.value = true dialogVisible.value = true
} }
const handleDelete = async (row) => { const handleDelete = async (row) => {
try { ElMessageBox.confirm('确定要删除此菜单吗?', '删除确认', {
await ElMessageBox.confirm( type: 'warning',
"确定要删除此菜单吗?", closeOnClickModal: false,
'删除确认', showClose: false
{ })
confirmButtonText: '确定', .then(async () => {
cancelButtonText: '取消', const reqParams = {
type: 'warning' menuId: row.menuId
} }
); const res = await getHomeMenuDelete(reqParams);
ElMessage.success('删除成功!'); ElMessage.success(res.msg);
getTreeListData(); getTreeListData();
} catch (error) { })
console.error('删除失败', error); .catch(() => {
} ElMessage.info('已取消删除菜单操作');
});
} }
const handleAdd = () => {
isEdit.value = false
formData.value = {}
dialogVisible.value = true
}
const handleExport = () => { const handleExport = () => {
console.log('导出菜单数据'); console.log('导出菜单数据');
@@ -212,6 +220,7 @@ const handleExport = () => {
const handleDialogClose = () => { const handleDialogClose = () => {
formData.value = {} formData.value = {}
isEdit.value = false isEdit.value = false
currentRow.value = {}
dialogVisible.value = false dialogVisible.value = false
} }
@@ -231,11 +240,21 @@ const handleSave = async () => {
} }
} }
setTimeout(() => { try {
ElMessage.success(isEdit.value ? '编辑成功' : '新增成功') saveLoading.value = true
dialogVisible.value = false const reqParams = {
getTreeListData() ...formData.value,
}, 500) isEdit: isEdit.value,
menuId: currentRow.value?.menuId
}
const res = await getHomeMenuSave(reqParams);
saveLoading.value = false
dialogVisible.value = false;
ElMessage.success(res.msg);
getTreeListData();
} catch (error) {
console.log(error);
}
} }
watch( watch(

View File

@@ -39,11 +39,11 @@
<script setup> <script setup>
import { ref, onMounted } from 'vue' import { ref, onMounted } from 'vue'
import { ElMessage } from 'element-plus' import { ElMessage, ElMessageBox, ElNotification } from 'element-plus'
import ResizablePage from '@/components/Table/proResizable.vue' import ResizablePage from '@/components/Table/proResizable.vue'
import FilterSelect from '@/components/Table/proFilterSelect.vue' import FilterSelect from '@/components/Table/proFilterSelect.vue'
import PDialog from '@/components/Dialog/proDialog.vue' import PDialog from '@/components/Dialog/proDialog.vue'
import { getHomeRoleList, getHomeRoleAssign } from '@/api/bizRole' import { getHomeRoleList, getHomeRoleAssign, getHomeRoleDelete } from '@/api/bizRole'
import vUser from './list.vue' import vUser from './list.vue'
import vRole from './role.vue' import vRole from './role.vue'
@@ -76,7 +76,22 @@ const handleEdit = (item) => {
} }
const handleDelete = (item) => { const handleDelete = (item) => {
console.log('删除', item) ElMessageBox.confirm('确定要删除当前角色吗?', '删除确认', {
type: 'warning',
closeOnClickModal: false,
showClose: false
})
.then(async () => {
const reqParams = {
roleId: item.roleId
}
const res = await getHomeRoleDelete(reqParams);
ElMessage.success(res.msg);
getListData();
})
.catch(() => {
ElMessage.info('已取消删除角色操作');
});
} }
const handleView = (item) => { const handleView = (item) => {

View File

@@ -52,11 +52,11 @@
@current-change="handleCurrentChange" @current-change="handleCurrentChange"
> >
<template #columns> <template #columns>
<el-table-column prop="createTime" label="记录日期" width="180" /> <el-table-column prop="createTime" label="记录日期" width="180" fixed="left" />
<el-table-column prop="userName" label="登录账户" /> <el-table-column prop="userName" label="登录账户" />
<el-table-column prop="uname" label="用户名称" /> <el-table-column prop="uname" label="用户名称" />
<el-table-column prop="sex" label="性别" /> <el-table-column prop="sex" label="性别" />
<el-table-column prop="email" label="电子邮箱" /> <el-table-column prop="email" label="电子邮箱" width="225" show-overflow-tooltip="true" />
<el-table-column prop="phone" label="联系电话" /> <el-table-column prop="phone" label="联系电话" />
<el-table-column prop="ustatus" label="状态" min-width="100" align="center"> <el-table-column prop="ustatus" label="状态" min-width="100" align="center">
<template #default="scope"> <template #default="scope">

View File

@@ -56,7 +56,7 @@
<el-table-column prop="userName" label="登录账户" /> <el-table-column prop="userName" label="登录账户" />
<el-table-column prop="uname" label="用户名称" /> <el-table-column prop="uname" label="用户名称" />
<el-table-column prop="sex" label="性别" sortable /> <el-table-column prop="sex" label="性别" sortable />
<el-table-column prop="email" label="电子邮箱" /> <el-table-column prop="email" label="电子邮箱" width="225" show-overflow-tooltip="true" />
<el-table-column prop="phone" label="联系电话" /> <el-table-column prop="phone" label="联系电话" />
<el-table-column prop="ustatus" label="状态" min-width="100" align="center" sortable> <el-table-column prop="ustatus" label="状态" min-width="100" align="center" sortable>
<template #default="scope"> <template #default="scope">
@@ -90,6 +90,7 @@
<PDialog <PDialog
v-model="dialogVisible" v-model="dialogVisible"
:loading="saveLoading"
:title="isEdit ? '编辑数据' : '新增数据'" :title="isEdit ? '编辑数据' : '新增数据'"
@close="handleDialogClose" @close="handleDialogClose"
@reset="handleDialogReset" @reset="handleDialogReset"
@@ -113,7 +114,7 @@ import PDialog from '@/components/Dialog/proDialog.vue'
import VForm from './form.vue' import VForm from './form.vue'
const formComponentRef = ref(null) const formComponentRef = ref(null)
const saveLoading = ref(false)
const loading = ref(false) const loading = ref(false)
const searchForm = reactive({ const searchForm = reactive({
uname: '', uname: '',
@@ -269,7 +270,7 @@ const handleSave = async () => {
return return
} }
} }
saveLoading.value = true
try { try {
const reqParams = { const reqParams = {
...formData.value, ...formData.value,
@@ -277,9 +278,10 @@ const handleSave = async () => {
userId: currentRow.value?.userId userId: currentRow.value?.userId
} }
const res = await getHomeUserSave(reqParams); const res = await getHomeUserSave(reqParams);
saveLoading.value = false;
dialogVisible.value = false; dialogVisible.value = false;
ElMessage.success(res.msg);
getDataList(); getDataList();
ElMessage.success(res.msg)
} catch (error) { } catch (error) {
console.log(error); console.log(error);
} }

View File

@@ -2,7 +2,7 @@ package com.mini.mybigscreen.biz.controller;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.mini.mybigscreen.Model.Menu; import com.mini.mybigscreen.Model.Menu;
import com.mini.mybigscreen.Model.Message; import com.mini.mybigscreen.Model.Message;
import com.mini.mybigscreen.Model.Result; import com.mini.mybigscreen.Model.Result;
@@ -10,9 +10,7 @@ import com.mini.mybigscreen.Model.TreeMenu;
import com.mini.mybigscreen.biz.domain.HomeMenu; import com.mini.mybigscreen.biz.domain.HomeMenu;
import com.mini.mybigscreen.biz.service.HomeMenuService; import com.mini.mybigscreen.biz.service.HomeMenuService;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -90,6 +88,22 @@ public class HomeMenuController {
return Result.success(menuList); return Result.success(menuList);
} }
/**
* 父级菜单获取
*/
@GetMapping("pList")
public Result<?> getPlist() {
LambdaQueryWrapper<HomeMenu> parentQuery = new LambdaQueryWrapper<HomeMenu>()
.eq(HomeMenu::getUstatus, "1")
.eq(HomeMenu::getParentId, "0")
.orderByAsc(HomeMenu::getSort);
List<HomeMenu> pMenus = menuService.list(parentQuery);
return Result.success(pMenus);
}
/**
* 树形菜单
*/
@GetMapping("treeList") @GetMapping("treeList")
public Result<?> getTreeList() { public Result<?> getTreeList() {
List<TreeMenu> menuList = new ArrayList<>(); List<TreeMenu> menuList = new ArrayList<>();
@@ -117,6 +131,9 @@ public class HomeMenuController {
} }
/**
* 用户角色菜单
*/
@GetMapping("userList") @GetMapping("userList")
public Result<?> getUserList() { public Result<?> getUserList() {
List<Menu> menuList = new ArrayList<>(); List<Menu> menuList = new ArrayList<>();
@@ -145,13 +162,25 @@ public class HomeMenuController {
return Result.success(menuList); return Result.success(menuList);
} }
/**
public Result<Message> save() { * 新增/修改
return Result.success(new Message("数据新增成功", 200)); */
@PostMapping("save")
public Result<Message> save(@RequestBody HomeMenu homeMenu) {
boolean success = homeMenu.getIsEdit()
? menuService.update(homeMenu,
new LambdaUpdateWrapper<HomeMenu>().eq(HomeMenu::getMenuId, homeMenu.getMenuId())
) : menuService.save(homeMenu);
return Result.success(new Message(homeMenu.getIsEdit() ? "数据修改成功" : "数据新增成功", 200));
} }
public Result<Message> delete() { /**
* 删除
*/
@PostMapping("delete")
public Result<Message> delete(String menuId) {
menuService.removeById(menuId);
return Result.success(new Message("数据删除成功", 200)); return Result.success(new Message("数据删除成功", 200));
} }

View File

@@ -83,7 +83,11 @@ public class HomeRoleController {
} }
public Result<Message> delete() { @PostMapping("delete")
public Result<Message> delete(String roleId) {
roleService.removeById(roleId);
roleMenuService.remove(new LambdaQueryWrapper<HomeRoleMenu>()
.eq(HomeRoleMenu::getRoleId, roleId));
return Result.success(new Message("数据删除成功", 200)); return Result.success(new Message("数据删除成功", 200));
} }
} }