大屏菜单定制化

dev_xd
lj7788@126.com 2025-06-17 16:21:08 +08:00
parent 0eb7aa4516
commit 749aaa7b28
10 changed files with 265 additions and 51 deletions

View File

@ -14,7 +14,15 @@ const getProjectInfo=id=>{
});
}
const bigScreenGetMenuByProjectId=id=>{
return request({
url: "/manage/api/project/bigscreenMenu/bigScreenGetMenuByProjectId?projectId="+id,
method: "get",
});
}
export default {
findMyProjectList,
getProjectInfo
getProjectInfo,
bigScreenGetMenuByProjectId
};

View File

@ -7,73 +7,71 @@
<div :class="nav == 2 ? 'head-nav active' : 'head-nav'" @click="doNav(2)" v-if="1 == 2"></div>
<div :class="nav == 7 ? 'head-nav active' : 'head-nav'" @click="doNav(7)" v-if="1 == 2"></div>
<div :class="(nav >= 100 && nav < 200) || nav == 1 ? 'head-nav active' : 'head-nav'" style="position: relative" class="has-submenu">
<div v-if="showMenusNavIds.includes('1')" :class="(nav >= 100 && nav < 200) || nav == 1 ? 'head-nav active' : 'head-nav'" style="position: relative" class="has-submenu">
<div>项目概况</div>
<div class="header-btn-list">
<div class="header-btn-list-arrow"></div>
<div class="header-btn-list-item" style>
<div class="header-btn-list-padding menu-row1" style="text-align: left">
<button type="button" :class="nav == 101 ? 'active' : ''" class="sub-btn" @click="doNav(101)"></button>
<button type="button" :class="nav == 102 ? 'active' : ''" class="sub-btn" @click="doNav(102)"></button>
<button v-if="showMenusNavIds.includes('101')" type="button" :class="nav == 101 ? 'active' : ''" class="sub-btn" @click="doNav(101)"></button>
<button v-if="showMenusNavIds.includes('102')" type="button" :class="nav == 102 ? 'active' : ''" class="sub-btn" @click="doNav(102)"></button>
</div>
</div>
</div>
</div>
<div :class="(nav >= 300 && nav < 400) || nav == 3 ? 'head-nav active' : 'head-nav'" style="position: relative" class="has-submenu">
<div v-if="showMenusNavIds.includes('3')" :class="(nav >= 300 && nav < 400) || nav == 3 ? 'head-nav active' : 'head-nav'" style="position: relative" class="has-submenu">
<div>安全管理</div>
<div class="header-btn-list">
<div class="header-btn-list-arrow"></div>
<div class="header-btn-list-item" style>
<div class="header-btn-list-padding menu-row1" style="text-align: left">
<button type="button" :class="nav == 301 ? 'active' : ''" class="sub-btn" @click="doNav(301)"></button>
<!-- <button type="button" :class="nav == 302 ? 'active' : ''" class="sub-btn" @click="doNav(302)"></button> -->
<button type="button" :class="nav == 303 ? 'active' : ''" class="sub-btn" @click="doNav(303)"></button>
<button type="button" :class="nav == 304 ? 'active' : ''" class="sub-btn" @click="doNav(304)"></button>
<button v-if="showMenusNavIds.includes('301')" type="button" :class="nav == 301 ? 'active' : ''" class="sub-btn" @click="doNav(301)"></button>
<button v-if="showMenusNavIds.includes('302')" type="button" :class="nav == 302 ? 'active' : ''" class="sub-btn" @click="doNav(302)"></button>
<button v-if="showMenusNavIds.includes('303')" type="button" :class="nav == 303 ? 'active' : ''" class="sub-btn" @click="doNav(303)"></button>
<button v-if="showMenusNavIds.includes('304')" type="button" :class="nav == 304 ? 'active' : ''" class="sub-btn" @click="doNav(304)"></button>
</div>
<div class="header-btn-list-padding menu-row1" style="text-align: left">
<!-- <button type="button" :class="nav == 305 ? 'active' : ''" class="sub-btn" @click="doNav(305)"></button> -->
<button type="button" :class="nav == 306 ? 'active' : ''" class="sub-btn" @click="doNav(306)"></button>
<!-- <button type="button" :class="nav == 307 ? 'active' : ''" class="sub-btn" @click="doNav(307)"></button>
<button type="button" :class="nav == 308 ? 'active' : ''" class="sub-btn" @click="doNav(308)"></button>-->
<button v-if="showMenusNavIds.includes('305')" type="button" :class="nav == 305 ? 'active' : ''" class="sub-btn" @click="doNav(305)"></button>
<button v-if="showMenusNavIds.includes('306')" type="button" :class="nav == 306 ? 'active' : ''" class="sub-btn" @click="doNav(306)"></button>
<button v-if="showMenusNavIds.includes('307')" type="button" :class="nav == 307 ? 'active' : ''" class="sub-btn" @click="doNav(307)"></button>
<button v-if="showMenusNavIds.includes('308')" type="button" :class="nav == 308 ? 'active' : ''" class="sub-btn" @click="doNav(308)"></button>
</div>
<div class="header-btn-list-padding menu-row1" style="text-align: left">
<button type="button" :class="nav == 309 ? 'active' : ''" class="sub-btn" @click="doNav(309)"></button>
<button type="button" :class="nav == 310 ? 'active' : ''" class="sub-btn" @click="doNav(310)">AI</button>
<!-- <button type="button" :class="nav == 311 ? 'active' : ''" class="sub-btn" @click="doNav(311)"></button> -->
<button v-if="showMenusNavIds.includes('309')" type="button" :class="nav == 309 ? 'active' : ''" class="sub-btn" @click="doNav(309)"></button>
<button v-if="showMenusNavIds.includes('310')" type="button" :class="nav == 310 ? 'active' : ''" class="sub-btn" @click="doNav(310)">AI</button>
<button v-if="showMenusNavIds.includes('311')" type="button" :class="nav == 311 ? 'active' : ''" class="sub-btn" @click="doNav(311)"></button>
</div>
</div>
</div>
</div>
<div :class="(nav >= 400 && nav < 500) || nav == 4 ? 'head-nav active' : 'head-nav'" style="position: relative" class="has-submenu">
<div v-if="showMenusNavIds.includes('4')" :class="(nav >= 400 && nav < 500) || nav == 4 ? 'head-nav active' : 'head-nav'" style="position: relative" class="has-submenu">
<div>质量管理</div>
<div class="header-btn-list">
<div class="header-btn-list-arrow"></div>
<div class="header-btn-list-item" style>
<div class="header-btn-list-padding menu-row1" style="text-align: left">
<button type="button" :class="nav == 401 ? 'active' : ''" class="sub-btn" @click="doNav(401)"></button>
<!--
<button type="button" :class="nav == 402 ? 'active' : ''" class="sub-btn" @click="doNav(402)"></button>
<button type="button" :class="nav == 403 ? 'active' : ''" class="sub-btn" @click="doNav(403)"></button>
<button type="button" :class="nav == 404 ? 'active' : ''" class="sub-btn" @click="doNav(404)"></button>-->
<button v-if="showMenusNavIds.includes('401')" type="button" :class="nav == 401 ? 'active' : ''" class="sub-btn" @click="doNav(401)"></button>
<button v-if="showMenusNavIds.includes('402')" type="button" :class="nav == 402 ? 'active' : ''" class="sub-btn" @click="doNav(402)"></button>
<button v-if="showMenusNavIds.includes('403')" type="button" :class="nav == 403 ? 'active' : ''" class="sub-btn" @click="doNav(403)"></button>
<button v-if="showMenusNavIds.includes('404')" type="button" :class="nav == 404 ? 'active' : ''" class="sub-btn" @click="doNav(404)"></button>
</div>
<div class="header-btn-list-padding menu-row1" style="text-align: left">
<button v-if="showMenusNavIds.includes('405')" type="button" :class="nav == 405 ? 'active' : ''" class="sub-btn" @click="doNav(405)"></button>
<button v-if="showMenusNavIds.includes('406')" type="button" :class="nav == 406 ? 'active' : ''" class="sub-btn" @click="doNav(406)"></button>
</div>
<!--
<div class="header-btn-list-padding menu-row1" style="text-align: left;">
<button type="button" :class="nav == 405 ? 'active' : ''" class="sub-btn" @click="doNav(405)"></button>
<button type="button" :class="nav == 406 ? 'active' : ''" class="sub-btn" @click="doNav(406)"></button>
</div>
-->
</div>
</div>
</div>
<div :class="(nav >= 500 && nav < 600) || nav == 5 ? 'head-nav active' : 'head-nav'" style="position: relative" class="has-submenu">
<div v-if="showMenusNavIds.includes('5')" :class="(nav >= 500 && nav < 600) || nav == 5 ? 'head-nav active' : 'head-nav'" style="position: relative" class="has-submenu">
<div>进度管理</div>
<div class="header-btn-list">
<div class="header-btn-list-arrow"></div>
<div class="header-btn-list-item" style>
<div class="header-btn-list-padding menu-row1" style="text-align: left">
<button type="button" :class="nav == 502 ? 'active' : ''" class="sub-btn" @click="doNav(502)"></button>
<button type="button" :class="nav == 501 ? 'active' : ''" class="sub-btn" @click="doNav(501)"></button>
<button v-if="showMenusNavIds.includes('502')" type="button" :class="nav == 502 ? 'active' : ''" class="sub-btn" @click="doNav(502)"></button>
<button v-if="showMenusNavIds.includes('501')" type="button" :class="nav == 501 ? 'active' : ''" class="sub-btn" @click="doNav(501)"></button>
</div>
</div>
</div>
@ -86,22 +84,22 @@
</el-col>
<el-col :span="8">
<div class="head-title-tab" style="display: inline-flex">
<div :class="nav == 6 ? 'head-nav active' : 'head-nav'" @click="doNav(6)">绿</div>
<div :class="(nav >= 700 && nav < 800) || nav == 7 ? 'head-nav active' : 'head-nav'" style="position: relative" class="has-submenu">
<div v-if="showMenusNavIds.includes('6')" :class="nav == 6 ? 'head-nav active' : 'head-nav'" @click="doNav(6)">绿</div>
<div v-if="showMenusNavIds.includes('7')" :class="(nav >= 700 && nav < 800) || nav == 7 ? 'head-nav active' : 'head-nav'" style="position: relative" class="has-submenu">
<div>数字孪生</div>
<div class="header-btn-list">
<div class="header-btn-list-arrow"></div>
<div class="header-btn-list-item" style>
<div class="header-btn-list-padding menu-row1" style="text-align: left">
<button type="button" :class="nav == 701 ? 'active' : ''" class="sub-btn" @click="doNav(701)"></button>
<button v-if="showMenusNavIds.includes('701')" type="button" :class="nav == 701 ? 'active' : ''" class="sub-btn" @click="doNav(701)"></button>
<button type="button" :class="nav == 702 ? 'active' : ''" class="sub-btn" @click="doNav(702)"></button>
<button type="button" :class="nav == 703 ? 'active' : ''" class="sub-btn" @click="doNav(703)">BIM</button>
<button v-if="showMenusNavIds.includes('702')" type="button" :class="nav == 702 ? 'active' : ''" class="sub-btn" @click="doNav(702)"></button>
<button v-if="showMenusNavIds.includes('703')" type="button" :class="nav == 703 ? 'active' : ''" class="sub-btn" @click="doNav(703)">BIM</button>
</div>
<div class="header-btn-list-padding menu-row1" style="text-align: left">
<button type="button" :class="nav == 704 ? 'active' : ''" class="sub-btn" @click="doNav(704)">BIM</button>
<button type="button" :class="nav == 705 ? 'active' : ''" class="sub-btn" @click="doNav(705)">4D</button>
<button v-if="showMenusNavIds.includes('704')" type="button" :class="nav == 704 ? 'active' : ''" class="sub-btn" @click="doNav(704)">BIM</button>
<button v-if="showMenusNavIds.includes('705')" type="button" :class="nav == 705 ? 'active' : ''" class="sub-btn" @click="doNav(705)">4D</button>
</div>
</div>
</div>
@ -143,6 +141,8 @@ export default {
selProjectId: "",
projects: [],
isFullScreen: false,
showMenus: [],
showMenusNavIds: [],
};
},
computed: {
@ -159,6 +159,17 @@ export default {
},
},
mounted() {
this.showMenus = [
{
id: 1,
navId: "1",
},
{
id: 2,
navId: "101",
},
];
this.showMenusNavIds = this.showMenus.map((d) => d.navId);
if (location.href.includes("#/detail?prjId=")) {
const urlParams = new URLSearchParams(location.href.split("?")[1]);
const prjId = urlParams.get("prjId");
@ -188,6 +199,7 @@ export default {
}, 400);
},
doProjectSelect() {
this.loadMenu();
let tmps = this.projects.filter((d) => d.id == this.selProjectId);
if (tmps.length > 0) {
this.$store.dispatch("SetSelProject", tmps[0]);
@ -202,6 +214,27 @@ export default {
localStorage.setItem("selProj", this.selProjectId);
localStorage.setItem("prj_title", document.title);
},
loadMenu() {
this.$api.project.bigScreenGetMenuByProjectId(this.selProjectId).then((d) => {
let objs = d.data || [];
if (objs.length == 0) {
objs = [
{
id: 1,
navId: "1",
},
{
id: 2,
navId: "101",
},
];
}
this.showMenus = objs;
this.showMenusNavIds = this.showMenus.map((d) => d.navId);
console.log(this.showMenusNavIds);
});
},
doNav(n) {
if (this.nav == n) {
return;
@ -243,7 +276,7 @@ export default {
break;
case 6:
this.$router.push("/greenCarbon");
break;
break;
case 702:
this.$router.push("/bimRoaming");
break;

View File

@ -109,7 +109,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="projectPersonPhone != null and projectPersonPhone != ''"> and pi.project_person_phone = #{projectPersonPhone}</if>
<if test="projectStatus != null and projectStatus != ''"> and pi.project_status = #{projectStatus}</if>
<if test="isDel != null "> and pi.is_del = #{isDel}</if>
and pi.is_del !=2
and pi.is_del not in (1,2)
</where>
<if test="currentUserId == null "> order by pi.project_sort, pi.id desc</if>
<if test="currentUserId != null "> order by psu.sort_by, pi.id desc</if>
@ -423,7 +423,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="projectPersonPhone != null and projectPersonPhone != ''"> and pi.project_person_phone = #{projectPersonPhone}</if>
<if test="projectStatus != null and projectStatus != ''"> and pi.project_status = #{projectStatus}</if>
<if test="isDel != null "> and pi.is_del = #{isDel}</if>
and pi.is_del!= 2
and pi.is_del=0
</where>
<if test="currentUserId == null "> order by pi.project_sort, pi.id desc</if>
<if test="currentUserId != null "> order by psu.sort_by, pi.id desc</if>

View File

@ -71,7 +71,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
select d.dept_id
from sys_dept d
left join sys_role_dept rd on d.dept_id = rd.dept_id
where rd.role_id = #{roleId}
where d.del_flag = '0' and
rd.role_id = #{roleId}
<if test="deptCheckStrictly">
and d.dept_id not in (select d.parent_id from sys_dept d inner join sys_role_dept rd on d.dept_id = rd.dept_id and rd.role_id = #{roleId})
</if>
@ -80,7 +81,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="selectDeptById" parameterType="Long" resultMap="SysDeptResult">
<include refid="selectDeptVo"/>
where dept_id = #{deptId}
where del_flag = '0' and dept_id = #{deptId}
</select>
<select id="checkDeptExistUser" parameterType="Long" resultType="int">
@ -93,7 +94,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</select>
<select id="selectChildrenDeptById" parameterType="Long" resultMap="SysDeptResult">
select * from sys_dept where find_in_set(#{deptId}, ancestors)
select * from sys_dept where find_in_set(#{deptId}, ancestors) and del_flag = '0'
</select>
<select id="selectNormalChildrenDeptById" parameterType="Long" resultType="int">

View File

@ -13,6 +13,7 @@ import com.yanzhu.common.security.annotation.RequiresPermissions;
import com.yanzhu.common.security.utils.SecurityUtils;
import com.yanzhu.manage.domain.ProProjectInfo;
import com.yanzhu.manage.service.IProProjectInfoService;
import com.yanzhu.system.api.domain.SysDept;
import com.yanzhu.system.api.model.LoginUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

View File

@ -19,7 +19,9 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;
@RestController
@ -32,6 +34,18 @@ public class BimModelController {
@Autowired
private RedisService redisService;
@GetMapping("/clearCache/{key}")
public AjaxResult clearCache(@PathVariable("key") String key){
// 依据前缀获取所有匹配的键
Collection<String> keys = redisService.keys(key + "*");
if (!keys.isEmpty()) {
// 删除所有匹配的键
redisService.deleteObject(keys);
return AjaxResult.success("缓存清除成功");
}
return AjaxResult.success("未找到匹配的缓存");
}
/**
* model_tree
* @param name

View File

@ -33,14 +33,14 @@ public class HasorModule implements SpringModule {
@Autowired
private RedisService redisService;
private boolean isCache(ApiInfo apiInfo) {
private String getKey(ApiInfo apiInfo){
Map<FieldDef, String> map = apiInfo.getObj();
if (map == null) {
return false;
return "";
}
String header = map.get(FieldDef.REQ_HEADER_SAMPLE);
if (StringUtils.isBlank(header)) {
return false;
return "";
}
try {
JSONArray jsonObject = JSON.parseArray(header);
@ -48,7 +48,7 @@ public class HasorModule implements SpringModule {
JSONObject obj = jsonObject.getJSONObject(i);
if ("cache".equals(obj.getString("name"))) {
String value = obj.getString("value");
return "1".equals(value) || "true".equals(value);
return value;
}
}
@ -56,11 +56,19 @@ public class HasorModule implements SpringModule {
} catch (Exception ex) {
}
return false;
return "";
}
private boolean isCache(ApiInfo apiInfo) {
String key=getKey(apiInfo);
if(StringUtils.isBlank(key)){
return false;
}
String keyLower=key.toLowerCase();
return !"0".equals(keyLower) && !"false".equals(keyLower);
}
public String getCacheKey(ApiInfo apiInfo) {
return "hasor-" + apiInfo.getApiPath() + JSON.toJSONString(apiInfo.getParameterMap());
return getKey(apiInfo)+"."+ apiInfo.getApiPath() + JSON.toJSONString(apiInfo.getParameterMap());
}
public void loadModule(ApiBinder apiBinder) throws Throwable {

View File

@ -0,0 +1,31 @@
import request from '@/utils/request'
export function getMenuByProjectId(query) {
return request({
url: '/manage/api/project/bigscreenMenu/getMenuByProjectId',
method: 'get',
params: query
})
}
export function addMenus(data) {
return request({
url: '/manage/api/project/bigscreenMenu/addMenus',
method: 'post',
data: data
})
}
export function updateMenus(data) {
return request({
url: '/manage/api/project/bigscreenMenu/updateMenus',
method: 'post',
data: data
})
}
export function clearCache(key) {
return request({
url: "/manage/bim/modelInfo/clearCache/" +key,
method: "get",
});
}

View File

@ -392,6 +392,7 @@
<script setup name="ProProjectInfo">
import { deptTreeSelect } from "@/api/system/user";
import { listProProjectInfo, getProProjectInfo, delProProjectInfo, addProProjectInfo, updateProProjectInfo, resetProQrCode } from "@/api/manage/proProjectInfo";
import {delDept} from '@/api/system/dept';
import BaiduMap from "@/components/BaiduMap/Map.vue";
import useUserStore from '@/store/modules/user'
import costOutputDrawer from "../costOutput/costOutputDrawer.vue";
@ -708,6 +709,7 @@ function submitForm() {
let postData = {
...form.value
}
postData.comId=postData.disDeptId
if (form.value.id != null) {
updateProProjectInfo(postData).then(response => {
proxy.$modal.msgSuccess("修改成功");
@ -745,7 +747,13 @@ function setProjectSort(row, val) {
function handleDelete(row) {
const _ids = row.id || ids.value;
proxy.$modal.confirm('是否确认删除项目信息编号为"' + _ids + '"的数据项?').then(function () {
return delProProjectInfo(_ids);
let ajaxs=[
delProProjectInfo(_ids)
];
if(Array.isArray(_ids)){
ajaxs=ajaxs.concat(_ids.map(id=>delDept(id)));
}
return Promise.all(ajaxs);
}).then(() => {
getList();
proxy.$modal.msgSuccess("删除成功");

View File

@ -0,0 +1,110 @@
<template>
<div class="bigscreen-menu app-container">
<el-button type="primary" @click="handleCheckDefault"></el-button>
<el-button type="success" @click="handleCheckSave"></el-button>
<el-button type="danger" @click="handleClearCache"></el-button>
<el-tree ref="treeRef" :data="dataSource" show-checkbox :props="defaultProps" node-key="id" default-expand-all :expand-on-click-node="false"> </el-tree>
</div>
</template>
<script>
import useUserStore from "@/store/modules/user";
import { getMenuByProjectId,addMenus,updateMenus,clearCache } from "@/api/system/bigscreenMenu";
export default {
name: "BigscreenMenu",
data() {
return {
dataSource: [],
userStore: {},
currentPrjId: null,
currentComId: null,
treeData: [],
defaultProps: {
children: "children",
label: "name",
},
};
},
mounted() {
console.log("--1--");
this.userStore = useUserStore();
this.currentPrjId = this.userStore.currentPrjId;
this.currentComId = this.userStore.currentComId;
getMenuByProjectId({ projectId: this.currentPrjId }).then((res) => {
let tmps = res.data || [];
this.treeData = tmps;
let makeTree = (nodes) => {
nodes.forEach((it) => {
it.checked = it.enabled == 1;
it.label = it.name;
it.children = tmps.filter((item) => item.pid == it.id);
if (it.children.length > 0) {
makeTree(it.children);
}
});
return nodes;
};
this.dataSource = makeTree(tmps.filter((it) => it.pid == 0));
this.$nextTick(()=>{
let ids=this.treeData.filter(it=>it.enabled==1).map(it=>it.id);
this.$refs.treeRef.setCheckedKeys(ids, false);
});
});
},
methods: {
handleCheckDefault() {
let ids = this.treeData.filter((it) => [101, 102, 301, 303, 304, 306, 309, 310, 401, 501, 502, 6, 701, 702, 703, 704, 705].includes(+it.navId)).map((it) => it.id);
this.$refs.treeRef.setCheckedKeys(ids, false);
},
handleCheckSave(){
this.$confirm("确定要保存吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}).then(() => {
this.doSave();
});
},
doSave(){
let checked=this.$refs.treeRef.getCheckedKeys(false);
let addData=this.treeData.filter(it=>!it.pmid).map(it=>{
return {
menuId:it.id,
projectId:this.currentPrjId,
enabled:checked.includes(it.id)?1:0,
currentUser:this.userStore.name,
}
});
let updateData=this.treeData.filter(it=>it.pmid).map(it=>{
return {
id:it.pmid,
enabled:checked.includes(it.id)?1:0
}
});
let ajaxs=[];
if(addData.length>0){
ajaxs.push(addMenus({items:addData}));
}
if(updateData.length>0){
ajaxs.push(updateMenus({items:updateData}));
}
if(ajaxs.length>0){
Promise.all(ajaxs).then(()=>{
this.$message({type:'success',message:'保存成功'})
})
}
},
handleClearCache(){
clearCache("big_screen_menu_cache").then(()=>{
this.$message({type:'success',message:'清除缓存成功'})
})
}
},
};
</script>
<style lang="scss">
.bigscreen-menu {
}
</style>