UI-Project/src/layout/MainErpView.vue
@@ -23,7 +23,7 @@ //提取菜单模块列表 let menuList = $ref([]) request.get('/loadGlass/menu/sysMenu/list').then((res) => { request.get('/loadGlass/sys/menu/getMenuTree').then((res) => { if (res.code == 200) { menuList = deepClone(res.data) } else { UI-Project/src/router/index.js
@@ -1,5 +1,9 @@ import {createRouter, createWebHashHistory} from 'vue-router' import User from '../views/sys/User.vue' import Role from '../views/sys/Role.vue' import Menu from '../views/sys/Menu.vue' const router = createRouter({ history: createWebHashHistory(), routes: [ @@ -195,10 +199,34 @@ component: () => import('../views/Visualization/screenthree.vue') } ] }, /*----------- 管理系统 ----------------*/ { path: 'sys', name: 'screen', component: () => import('../views/Visualization/screen.vue'), children: [ { path: '/sys/users', name: 'SysUser', component: User }, { path: '/sys/roles', name: 'SysRole', component: Role }, { path: '/sys/menus', name: 'SysMenu', component: Menu }, ] }, { path: '', redirect:'/Slicecage/slicecage' redirect: '/Slicecage/slicecage' } ] }, UI-Project/src/views/LoginView.vue
@@ -48,7 +48,7 @@ if (valid) { loginLoadings.value = true request .post('/loadGlass/userinfo/login', userForm) .post('/loadGlass/sys/user/login', userForm) .then((res) => { if (res['code'] == 200) { store.$patch({user: res.data}) UI-Project/src/views/Slicecage/slicecage.vue
@@ -1,25 +1,26 @@ <script lang="ts" setup> import {Search} from "@element-plus/icons-vue"; import {reactive} from "vue"; import {useRouter} from "vue-router" import {reactive, ref} from 'vue' import {useRouter} from 'vue-router' import {ElMessage, ElMessageBox} from 'element-plus' const router = useRouter() import { ref } from 'vue' import { ElMessage, ElMessageBox } from 'element-plus' import { tr } from "element-plus/es/locale"; const dialogFormVisible = ref(false) const dialogFormVisiblea = ref(false) const dialogFormVisibleb = ref(false) const carposition1 = ref(40); const carposition2 = ref(200); const timers1 =ref(true); const timers2 =ref(true); const cellshow=ref(false); const cellshow1=ref(true); const cellshow2=ref(true); const million=ref(0); const million1=ref(0); const carposition1 = ref(40) const carposition2 = ref(200) const timers1 = ref(true) const timers2 = ref(true) const cellshow = ref(false) const cellshow1 = ref(true) const cellshow2 = ref(true) const million = ref(0) const million1 = ref(0) const loading = null const handleSelectionChange = null const currentPage4 = ref(4) const pageSize4 = ref(100) @@ -45,95 +46,87 @@ e: '1', f: '100*100', g: '', } }, ] const dialogForm = () => { ElMessageBox.confirm( '确定要急停吗?', '提示', { confirmButtonText: '是', cancelButtonText: '否', type: 'warning', } ) .then(() => { ElMessage({ type: 'success', message: '急停成功!', ElMessageBox.confirm('确定要急停吗?', '提示', { confirmButtonText: '是', cancelButtonText: '否', type: 'warning', }) .then(() => { ElMessage({ type: 'success', message: '急停成功!', }) }) }) .catch(() => { ElMessage({ type: 'info', message: '急停失败', .catch(() => { ElMessage({ type: 'info', message: '急停失败', }) }) } var timer=setInterval(() => { console.log(million.value,million1.value); million.value+=1; if(million.value-million1.value!==12){ if(million.value-million1.value>=2){ if(carposition1.value==200){ timers1.value=false; }else if(carposition1.value==40){ timers1.value=true; } if(timers1.value==true){ carposition1.value=carposition1.value+16; }else{ carposition1.value=carposition1.value-16; } var timer = setInterval(() => { console.log(million.value, million1.value) million.value += 1 if (million.value - million1.value !== 12) { if (million.value - million1.value >= 2) { if (carposition1.value == 200) { timers1.value = false } else if (carposition1.value == 40) { timers1.value = true } if (timers1.value == true) { carposition1.value = carposition1.value + 16 } else { carposition1.value = carposition1.value - 16 } if(carposition2.value==200){ timers2.value=false; }else if(carposition2.value==40){ timers2.value=true; } if(timers2.value==true){ carposition2.value+=16; }else{ carposition2.value-=16; } }else{ if (carposition2.value == 200) { timers2.value = false } else if (carposition2.value == 40) { timers2.value = true } }else{ million1.value=million.value; if(cellshow.value==true){ cellshow.value=false; }else{ cellshow.value=true; if (timers2.value == true) { carposition2.value += 16 } else { carposition2.value -= 16 } if(cellshow1.value==true){ cellshow1.value=false; }else{ cellshow1.value=true; } if(cellshow2.value==true){ cellshow2.value=false; }else{ cellshow2.value=true; } } else { } }, 1000); } else { million1.value = million.value if (cellshow.value == true) { cellshow.value = false } else { cellshow.value = true } if (cellshow1.value == true) { cellshow1.value = false } else { cellshow1.value = true } if (cellshow2.value == true) { cellshow2.value = false } else { cellshow2.value = true } } }, 100000) const getTableRow = (row,type) =>{ const getTableRow = (row, type) => { switch (type) { case 'edit' :{ case 'edit': { //alert('我接收到子组件传送的编辑信息') router.push({path: '/main/returns/createReturns', query: { ReturnID: 'TH24010101' }}) router.push({ path: '/main/returns/createReturns', query: {ReturnID: 'TH24010101'}, }) break } case 'delete':{ case 'delete': { alert('我接收到子组件传送的删除信息') break } @@ -141,40 +134,41 @@ } const gridOptions = reactive({ border: "full",//表格加边框 keepSource: true,//保持源数据 align: 'center',//文字居中 stripe:true,//斑马纹 rowConfig: {isCurrent: true, isHover: true,height: 50},//鼠标移动或选择高亮 border: 'full', //表格加边框 keepSource: true, //保持源数据 align: 'center', //文字居中 stripe: true, //斑马纹 rowConfig: {isCurrent: true, isHover: true, height: 50}, //鼠标移动或选择高亮 id: 'OrderList', showFooter: true,//显示脚 showFooter: true, //显示脚 printConfig: {}, importConfig: {}, exportConfig: {}, scrollY:{ enabled: true },//开启虚拟滚动 showOverflow:true, scrollY: {enabled: true}, //开启虚拟滚动 showOverflow: true, columnConfig: { resizable: true, useKey: true useKey: true, }, filterConfig: { //筛选配置项 remote: true filterConfig: { //筛选配置项 remote: true, }, customConfig: { storage: true storage: true, }, editConfig: { trigger: 'click', mode: 'row', showStatus: true showStatus: true, }, data: [ data: [ { 'id': '1', 'long': '5', 'wide': '1005', 'thick': '183.6', } id: '1', long: '5', wide: '1005', thick: '183.6', }, ], }) </script> @@ -182,130 +176,208 @@ <template> <div style="height: 700px;"> <!-- <el-button style="margin-top: 5px;margin-left: 10px;" id="searchButton" type="primary" @click="dialogFormVisible = true">手动进片</el-button> --> <el-button style="margin-top: 5px;margin-left: 10px;" id="searchButton" type="primary" @click="dialogFormVisiblea = true">订单信息</el-button> <el-button style="margin-top: 5px;margin-left: 10px;" id="searchButton" type="success" @click="dialogFormVisibleb = true">出片队列</el-button> <el-button style="margin-top: 5px;margin-left: 10px;" id="searchButton" type="danger">终止进片</el-button> <el-button style="margin-top: 5px;margin-left: 10px;" id="searchButton" type="danger">终止出片</el-button> <el-button style="margin-top: 5px;margin-left: 10px;" id="searchButton" type="danger" @click="dialogForm">软急停</el-button> <el-card style="flex: 1;margin-left: 10px;margin-top: 5px;" v-loading="loading"> <el-button style="margin-top: 5px;margin-left: 10px;" id="searchButton" type="primary" @click="dialogFormVisiblea = true">订单信息 </el-button> <el-button style="margin-top: 5px;margin-left: 10px;" id="searchButton" type="success" @click="dialogFormVisibleb = true">出片队列 </el-button> <el-button style="margin-top: 5px;margin-left: 10px;" id="searchButton" type="danger">终止进片 </el-button> <el-button style="margin-top: 5px;margin-left: 10px;" id="searchButton" type="danger">终止出片 </el-button> <el-button style="margin-top: 5px;margin-left: 10px;" id="searchButton" type="danger" @click="dialogForm">软急停 </el-button> <el-card style="flex: 1;margin-left: 10px;margin-top: 5px;" v-loading="loading"> <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;max-height: 100px;"> <el-table height="100%" ref="table" @selection-change="handleSelectionChange" :data="tableData" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}"> <el-table-column prop="id" align="center" label="出片玻璃ID" min-width="80" /> <el-table-column prop="a" align="center" label="笼子" min-width="120" /> <el-table-column prop="b" align="center" label="格子" min-width="120" /> <el-table-column prop="c" align="center" label="工程号" min-width="120" /> <el-table-column prop="d" align="center" label="流程卡号" min-width="120" /> <el-table-column prop="e" align="center" label="钢化版图号" min-width="157" /> <el-table-column prop="f" align="center" label="尺寸" min-width="120" /> <el-table-column prop="g" align="center" label="结束任务" min-width="120"> <el-button style="margin-top: 5px;margin-left: 10px;" id="searchButton" type="text">完成任务</el-button> </el-table-column> <el-table height="100%" ref="table" @selection-change="handleSelectionChange" :data="tableData" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}"> <el-table-column prop="id" align="center" label="出片玻璃ID" min-width="80"/> <el-table-column prop="a" align="center" label="笼子" min-width="120"/> <el-table-column prop="b" align="center" label="格子" min-width="120"/> <el-table-column prop="c" align="center" label="工程号" min-width="120"/> <el-table-column prop="d" align="center" label="流程卡号" min-width="120"/> <el-table-column prop="e" align="center" label="钢化版图号" min-width="157"/> <el-table-column prop="f" align="center" label="尺寸" min-width="120"/> <el-table-column prop="g" align="center" label="结束任务" min-width="120"> <el-button style="margin-top: 5px;margin-left: 10px;" id="searchButton" type="text">完成任务 </el-button> </el-table-column> </el-table> </div> </el-card> <el-card style="flex: 1;margin-left: 10px;margin-top: 3px;" v-loading="loading"> <el-card style="flex: 1;margin-left: 10px;margin-top: 3px;" v-loading="loading"> <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;max-height: 100px;"> <el-table height="100%" ref="table" @selection-change="handleSelectionChange" :data="tableDatab" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}"> <el-table-column prop="id" align="center" label="进片玻璃ID" min-width="80" /> <el-table-column prop="a" align="center" label="笼子" min-width="120" /> <el-table-column prop="b" align="center" label="格子" min-width="120" /> <el-table-column prop="c" align="center" label="工程号" min-width="120" /> <el-table-column prop="d" align="center" label="流程卡号" min-width="120" /> <el-table-column prop="e" align="center" label="钢化版图号" min-width="157" /> <el-table-column prop="f" align="center" label="尺寸" min-width="120" /> <el-table-column prop="g" align="center" label="结束任务" min-width="120"> <el-button style="margin-top: 5px;margin-left: 10px;" id="searchButton" type="text">完成任务</el-button> </el-table-column> <el-table height="100%" ref="table" @selection-change="handleSelectionChange" :data="tableDatab" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}"> <el-table-column prop="id" align="center" label="进片玻璃ID" min-width="80"/> <el-table-column prop="a" align="center" label="笼子" min-width="120"/> <el-table-column prop="b" align="center" label="格子" min-width="120"/> <el-table-column prop="c" align="center" label="工程号" min-width="120"/> <el-table-column prop="d" align="center" label="流程卡号" min-width="120"/> <el-table-column prop="e" align="center" label="钢化版图号" min-width="157"/> <el-table-column prop="f" align="center" label="尺寸" min-width="120"/> <el-table-column prop="g" align="center" label="结束任务" min-width="120"> <el-button style="margin-top: 5px;margin-left: 10px;" id="searchButton" type="text">完成任务 </el-button> </el-table-column> </el-table> </div> </el-card> <div style="padding: 10px;display: flex;height:110px;"> <div id="occupy"> <el-col style="text-align:left;font-weight: bold;">#1</el-col> <el-col style="text-align:left;display:flex;justify-content: space-between;align-items: center;"> <span id="biao">使用率</span><span id="zhi">35%</span> </el-col> <hr style="width:80%;margin: 0 auto;" /> <el-col style="text-align:left;display:flex;justify-content: space-between;align-items: center;"> <span id="biao">空闲(格子数)</span><span id="zhi">555</span> </el-col> </div> <div id="occupy"> <el-col style="text-align:left;font-weight: bold;">#2</el-col> <el-col style="text-align:left;display:flex;justify-content: space-between;align-items: center;"> <span id="biao">使用率</span><span id="zhi">35%</span> </el-col> <hr style="width:80%;margin: 0 auto;" /> <el-col style="text-align:left;display:flex;justify-content: space-between;align-items: center;"> <span id="biao">空闲(格子数)</span><span id="zhi">555</span> </el-col> </div> <div id="occupy"> <el-col style="text-align:left;font-weight: bold;">#3</el-col> <el-col style="text-align:left;display:flex;justify-content: space-between;align-items: center;"> <span id="biao">使用率</span><span id="zhi">35%</span> </el-col> <hr style="width:80%;margin: 0 auto;" /> <el-col style="text-align:left;display:flex;justify-content: space-between;align-items: center;"> <span id="biao">空闲(格子数)</span><span id="zhi">555</span> </el-col> </div> <div id="occupy"> <el-col style="text-align:left;font-weight: bold;">#4</el-col> <el-col style="text-align:left;display:flex;justify-content: space-between;align-items: center;"> <span id="biao">使用率</span><span id="zhi">35%</span> </el-col> <hr style="width:80%;margin: 0 auto;" /> <el-col style="text-align:left;display:flex;justify-content: space-between;align-items: center;"> <span id="biao">空闲(格子数)</span><span id="zhi">555</span> </el-col> </div> <div id="occupy"> <el-col style="text-align:left;font-weight: bold;">#5</el-col> <el-col style="text-align:left;display:flex;justify-content: space-between;align-items: center;"> <span id="biao">使用率</span><span id="zhi">35%</span> </el-col> <hr style="width:80%;margin: 0 auto;" /> <el-col style="text-align:left;display:flex;justify-content: space-between;align-items: center;"> <span id="biao">空闲(格子数)</span><span id="zhi">555</span> </el-col> </div> <div id="occupy"> <el-col style="text-align:left;font-weight: bold;">#6</el-col> <el-col style="text-align:left;display:flex;justify-content: space-between;align-items: center;"> <span id="biao">使用率</span><span id="zhi">35%</span> </el-col> <hr style="width:80%;margin: 0 auto;" /> <el-col style="text-align:left;display:flex;justify-content: space-between;align-items: center;"> <span id="biao">空闲(格子数)</span><span id="zhi">555</span> </el-col> </div> <div id="occupy"> <el-col style="text-align:left;font-weight: bold;">#7</el-col> <el-col style="text-align:left;display:flex;justify-content: space-between;align-items: center;"> <span id="biao">使用率</span><span id="zhi">35%</span> </el-col> <hr style="width:80%;margin: 0 auto;" /> <el-col style="text-align:left;display:flex;justify-content: space-between;align-items: center;"> <span id="biao">空闲(格子数)</span><span id="zhi">555</span> </el-col> </div> <div id="occupy"> <el-col style="text-align:left;font-weight: bold;">#8</el-col> <el-col style="text-align:left;display:flex;justify-content: space-between;align-items: center;"> <span id="biao">使用率</span><span id="zhi">35%</span> </el-col> <hr style="width:80%;margin: 0 auto;" /> <el-col style="text-align:left;display:flex;justify-content: space-between;align-items: center;"> <span id="biao">空闲(格子数)</span><span id="zhi">555</span> </el-col> </div> <!-- <div v-for="n in 8" :key="n" id="occupy"> <div id="occupy"> <el-col style="text-align:left;font-weight: bold;">#1</el-col> <el-col style="text-align:left;display:flex;justify-content: space-between;align-items: center;"> <span id="biao">使用率</span><span id="zhi">35%</span> </el-col> <hr style="width:80%;margin: 0 auto;"/> <el-col style="text-align:left;display:flex;justify-content: space-between;align-items: center;"> <span id="biao">空闲(格子数)</span><span id="zhi">555</span> </el-col> </div> <div id="occupy"> <el-col style="text-align:left;font-weight: bold;">#2</el-col> <el-col style="text-align:left;display:flex;justify-content: space-between;align-items: center;"> <span id="biao">使用率</span><span id="zhi">35%</span> </el-col> <hr style="width:80%;margin: 0 auto;"/> <el-col style="text-align:left;display:flex;justify-content: space-between;align-items: center;"> <span id="biao">空闲(格子数)</span><span id="zhi">555</span> </el-col> </div> <div id="occupy"> <el-col style="text-align:left;font-weight: bold;">#3</el-col> <el-col style="text-align:left;display:flex;justify-content: space-between;align-items: center;"> <span id="biao">使用率</span><span id="zhi">35%</span> </el-col> <hr style="width:80%;margin: 0 auto;"/> <el-col style="text-align:left;display:flex;justify-content: space-between;align-items: center;"> <span id="biao">空闲(格子数)</span><span id="zhi">555</span> </el-col> </div> <div id="occupy"> <el-col style="text-align:left;font-weight: bold;">#4</el-col> <el-col style="text-align:left;display:flex;justify-content: space-between;align-items: center;"> <span id="biao">使用率</span><span id="zhi">35%</span> </el-col> <hr style="width:80%;margin: 0 auto;"/> <el-col style="text-align:left;display:flex;justify-content: space-between;align-items: center;"> <span id="biao">空闲(格子数)</span><span id="zhi">555</span> </el-col> </div> <div id="occupy"> <el-col style="text-align:left;font-weight: bold;">#5</el-col> <el-col style="text-align:left;display:flex;justify-content: space-between;align-items: center;"> <span id="biao">使用率</span><span id="zhi">35%</span> </el-col> <hr style="width:80%;margin: 0 auto;"/> <el-col style="text-align:left;display:flex;justify-content: space-between;align-items: center;"> <span id="biao">空闲(格子数)</span><span id="zhi">555</span> </el-col> </div> <div id="occupy"> <el-col style="text-align:left;font-weight: bold;">#6</el-col> <el-col style="text-align:left;display:flex;justify-content: space-between;align-items: center;"> <span id="biao">使用率</span><span id="zhi">35%</span> </el-col> <hr style="width:80%;margin: 0 auto;"/> <el-col style="text-align:left;display:flex;justify-content: space-between;align-items: center;"> <span id="biao">空闲(格子数)</span><span id="zhi">555</span> </el-col> </div> <div id="occupy"> <el-col style="text-align:left;font-weight: bold;">#7</el-col> <el-col style="text-align:left;display:flex;justify-content: space-between;align-items: center;"> <span id="biao">使用率</span><span id="zhi">35%</span> </el-col> <hr style="width:80%;margin: 0 auto;"/> <el-col style="text-align:left;display:flex;justify-content: space-between;align-items: center;"> <span id="biao">空闲(格子数)</span><span id="zhi">555</span> </el-col> </div> <div id="occupy"> <el-col style="text-align:left;font-weight: bold;">#8</el-col> <el-col style="text-align:left;display:flex;justify-content: space-between;align-items: center;"> <span id="biao">使用率</span><span id="zhi">35%</span> </el-col> <hr style="width:80%;margin: 0 auto;"/> <el-col style="text-align:left;display:flex;justify-content: space-between;align-items: center;"> <span id="biao">空闲(格子数)</span><span id="zhi">555</span> </el-col> </div> <!-- <div v-for="n in 8" :key="n" id="occupy"> <el-col style="text-align:left;font-weight: bold;">#1</el-col> <el-col style="text-align:left;display:flex;justify-content: space-between;align-items: center;"> <span id="biao">使用率</span><span id="zhi">35%</span> @@ -319,329 +391,508 @@ <!-- <div id="awatch"> <img src="../../assets/cp.png" alt="" style="width: 70%;height: 70%;margin-left: 160px;"> </div> --> <!-- // 父级框 --> <div class="img-dlpl" > <div class="img-car1" :style="'z-index:999;left:247px;top:' + carposition1 + 'px;position:absolute;'"> <div v-show="cellshow1" style="margin-top:10px;width:200px;height:5px;background-color:red;"></div> </div> <div class="img-car2" :style="'z-index:999;left:704px;top:' + carposition2 + 'px;position:absolute;'"> <div v-show="cellshow2" style="margin-top:10px;width:200px;height:5px;background-color:red;"></div> </div> <div v-show="cellshow" style="width: 200px;height: 5px;position: absolute;top:60px;left: 490px;background-color: red;"> <!-- // 父级框 --> <div class="img-dlpl"> <div class="img-car1" :style="'z-index:999;left:247px;top:' + carposition1 + 'px;position:absolute;'"> <div v-show="cellshow1" style="margin-top:10px;width:200px;height:5px;background-color:red;"></div> </div> <div class="img-car2" :style="'z-index:999;left:704px;top:' + carposition2 + 'px;position:absolute;'"> <div v-show="cellshow2" style="margin-top:10px;width:200px;height:5px;background-color:red;"></div> </div> <div v-show="cellshow" style="width: 200px;height: 5px;position: absolute;top:60px;left: 490px;background-color: red;"> </div> </div> </div> </div> <el-dialog v-model="dialogFormVisible" top="12vh" width="85%" title="请确认玻璃信息" > <div style="margin-left: 50px;margin-bottom: 10px;"> <div style="display: flex;"> <p style="margin-top: 4px;">确认状态:</p> <el-button style="margin-left: 10px;size: mini;" type="success">允许</el-button> <el-button style="margin-left: 10px;size: mini;" type="danger">不允许</el-button> <p style="margin-left: 60px;margin-top: 4px;">当前状态:</p> <div style="margin-top: 4px; margin-left: 10px;">手动</div> <el-button style="margin-left: 10px;size: mini;" type="primary">切换</el-button> <el-input placeholder="请输入玻璃id" style="width: 180px;size: mini;margin-left: 60px;"></el-input> <el-button style="margin-left: 10px;size: mini;" type="primary">添加</el-button> <p style="margin-left: 60px;margin-top: 4px;">玻璃id:</p> <el-input style="width: 180px;size: mini;margin-left: 30px;"></el-input> </div> <div style="display: flex;"> <p style="margin-left: 290px;margin-top: 20px;font-weight: bold;">上片位</p> <p style="margin-left: 630px;margin-top: 20px;font-weight: bold;">扫码位</p> </div> <div style="display: flex;"> <div style="margin-top: 20px;"> <p style="margin-top: 10px;margin-left: 100px;margin-bottom: 20px;">当前信息</p> <el-form label-position="right" label-width="90px"> <el-form-item style="width: 20vw" label="玻璃id:"> <el-input style="width: 180px" size="mini" placeholder="请输入玻璃id"></el-input> </el-form-item> <el-form-item style="width: 20vw" label="订单编号:"> <el-input style="width: 180px" size="mini" placeholder="请输入订单编号"></el-input> </el-form-item> <el-form-item style="width: 20vw" label="列表编号:"> <el-input style="width: 180px" size="mini" placeholder="请输入列表编号"></el-input> </el-form-item> <el-form-item style="width: 20vw" label="箱子编号:"> <el-input style="width: 180px" size="mini" placeholder="请输入箱子编号"></el-input> </el-form-item> <el-form-item style="width: 20vw" label="长:"> <el-input style="width: 180px" size="mini" placeholder="请输入长"></el-input> </el-form-item> <el-form-item style="width: 20vw" label="宽:"> <el-input style="width: 180px" size="mini" placeholder="请输入宽"></el-input> </el-form-item> </el-form> <el-dialog v-model="dialogFormVisible" top="12vh" width="85%" title="请确认玻璃信息"> <div style="margin-left: 50px;margin-bottom: 10px;"> <div style="display: flex;"> <p style="margin-top: 4px;">确认状态:</p> <el-button style="margin-left: 10px;size: mini;" type="success">允许 </el-button> <el-button style="margin-left: 10px;size: mini;" type="danger">不允许 </el-button> <p style="margin-left: 60px;margin-top: 4px;">当前状态:</p> <div style="margin-top: 4px; margin-left: 10px;">手动</div> <el-button style="margin-left: 10px;size: mini;" type="primary">切换 </el-button> <el-input placeholder="请输入玻璃id" style="width: 180px;size: mini;margin-left: 60px;"></el-input> <el-button style="margin-left: 10px;size: mini;" type="primary">添加 </el-button> <p style="margin-left: 60px;margin-top: 4px;">玻璃id:</p> <el-input style="width: 180px;size: mini;margin-left: 30px;"></el-input> </div> <div style="margin-top: 20px;"> <p style="margin-top: 10px;margin-left: 100px;margin-bottom: 20px;">修改信息</p> <el-form label-position="right" label-width="90px"> <el-form-item style="width: 20vw" label="玻璃id:"> <el-input style="width: 180px" size="mini" placeholder="请输入玻璃id"></el-input> </el-form-item> <el-form-item style="width: 20vw" label="订单编号:"> <el-input style="width: 180px" size="mini" placeholder="请输入订单编号"></el-input> </el-form-item> <el-form-item style="width: 20vw" label="列表编号:"> <el-input style="width: 180px" size="mini" placeholder="请输入列表编号"></el-input> </el-form-item> <el-form-item style="width: 20vw" label="箱子编号:"> <el-input style="width: 180px" size="mini" placeholder="请输入箱子编号"></el-input> </el-form-item> <el-form-item style="width: 20vw" label="长:"> <el-input style="width: 180px" size="mini" placeholder="请输入长"></el-input> </el-form-item> <el-form-item style="width: 20vw" label="宽:"> <el-input style="width: 180px" size="mini" placeholder="请输入宽"></el-input> </el-form-item> </el-form> <div style="display: flex;"> <p style="margin-left: 290px;margin-top: 20px;font-weight: bold;">上片位</p> <p style="margin-left: 630px;margin-top: 20px;font-weight: bold;">扫码位</p> </div> <div style="margin-top: 20px;"> <p style="margin-top: 10px;margin-left: 100px;margin-bottom: 20px;">修改信息</p> <el-form label-position="right" label-width="90px"> <el-form-item style="width: 20vw" label="玻璃id:"> <el-input style="width: 180px" size="mini" placeholder="请输入玻璃id"></el-input> </el-form-item> <el-form-item style="width: 20vw" label="订单编号:"> <el-input style="width: 180px" size="mini" placeholder="请输入订单编号"></el-input> </el-form-item> <el-form-item style="width: 20vw" label="列表编号:"> <el-input style="width: 180px" size="mini" placeholder="请输入列表编号"></el-input> </el-form-item> <el-form-item style="width: 20vw" label="箱子编号:"> <el-input style="width: 180px" size="mini" placeholder="请输入箱子编号"></el-input> </el-form-item> <el-form-item style="width: 20vw" label="长:"> <el-input style="width: 180px" size="mini" placeholder="请输入长"></el-input> </el-form-item> <el-form-item style="width: 20vw" label="宽:"> <el-input style="width: 180px" size="mini" placeholder="请输入宽"></el-input> </el-form-item> </el-form> </div> <div style="margin-top: 20px;"> <p style="margin-top: 10px;margin-left: 100px;margin-bottom: 20px;">当前信息</p> <el-form label-position="right" label-width="90px"> <el-form-item style="width: 20vw" label="玻璃id:"> <el-input style="width: 180px" size="mini" placeholder="请输入玻璃id"></el-input> </el-form-item> <el-form-item style="width: 20vw" label="订单编号:"> <el-input style="width: 180px" size="mini" placeholder="请输入订单编号"></el-input> </el-form-item> <el-form-item style="width: 20vw" label="列表编号:"> <el-input style="width: 180px" size="mini" placeholder="请输入列表编号"></el-input> </el-form-item> <el-form-item style="width: 20vw" label="箱子编号:"> <el-input style="width: 180px" size="mini" placeholder="请输入箱子编号"></el-input> </el-form-item> <el-form-item style="width: 20vw" label="长:"> <el-input style="width: 180px" size="mini" placeholder="请输入长"></el-input> </el-form-item> <el-form-item style="width: 20vw" label="宽:"> <el-input style="width: 180px" size="mini" placeholder="请输入宽"></el-input> </el-form-item> </el-form> </div> </div> <div style="display: flex;"> <div style="margin-top: 20px;"> <p style="margin-top: 10px;margin-left: 100px;margin-bottom: 20px;">当前信息</p> <el-form label-position="right" label-width="90px"> <el-form-item style="width: 20vw" label="玻璃id:"> <el-input style="width: 180px" size="mini" placeholder="请输入玻璃id"></el-input> </el-form-item> <el-form-item style="width: 20vw" label="订单编号:"> <el-input style="width: 180px" size="mini" placeholder="请输入订单编号"></el-input> </el-form-item> <el-form-item style="width: 20vw" label="列表编号:"> <el-input style="width: 180px" size="mini" placeholder="请输入列表编号"></el-input> </el-form-item> <el-form-item style="width: 20vw" label="箱子编号:"> <el-input style="width: 180px" size="mini" placeholder="请输入箱子编号"></el-input> </el-form-item> <el-form-item style="width: 20vw" label="长:"> <el-input style="width: 180px" size="mini" placeholder="请输入长"></el-input> </el-form-item> <el-form-item style="width: 20vw" label="宽:"> <el-input style="width: 180px" size="mini" placeholder="请输入宽"></el-input> </el-form-item> </el-form> </div> <template #footer> <div id="dialog-footer"> <el-button type="primary" @click="dialogFormVisible = false"> 确认 </el-button> <el-button @click="dialogFormVisible = false">取消</el-button> <div style="margin-top: 20px;"> <p style="margin-top: 10px;margin-left: 100px;margin-bottom: 20px;">修改信息</p> <el-form label-position="right" label-width="90px"> <el-form-item style="width: 20vw" label="玻璃id:"> <el-input style="width: 180px" size="mini" placeholder="请输入玻璃id"></el-input> </el-form-item> <el-form-item style="width: 20vw" label="订单编号:"> <el-input style="width: 180px" size="mini" placeholder="请输入订单编号"></el-input> </el-form-item> <el-form-item style="width: 20vw" label="列表编号:"> <el-input style="width: 180px" size="mini" placeholder="请输入列表编号"></el-input> </el-form-item> <el-form-item style="width: 20vw" label="箱子编号:"> <el-input style="width: 180px" size="mini" placeholder="请输入箱子编号"></el-input> </el-form-item> <el-form-item style="width: 20vw" label="长:"> <el-input style="width: 180px" size="mini" placeholder="请输入长"></el-input> </el-form-item> <el-form-item style="width: 20vw" label="宽:"> <el-input style="width: 180px" size="mini" placeholder="请输入宽"></el-input> </el-form-item> </el-form> </div> <div style="margin-top: 20px;"> <p style="margin-top: 10px;margin-left: 100px;margin-bottom: 20px;">修改信息</p> <el-form label-position="right" label-width="90px"> <el-form-item style="width: 20vw" label="玻璃id:"> <el-input style="width: 180px" size="mini" placeholder="请输入玻璃id"></el-input> </el-form-item> <el-form-item style="width: 20vw" label="订单编号:"> <el-input style="width: 180px" size="mini" placeholder="请输入订单编号"></el-input> </el-form-item> <el-form-item style="width: 20vw" label="列表编号:"> <el-input style="width: 180px" size="mini" placeholder="请输入列表编号"></el-input> </el-form-item> <el-form-item style="width: 20vw" label="箱子编号:"> <el-input style="width: 180px" size="mini" placeholder="请输入箱子编号"></el-input> </el-form-item> <el-form-item style="width: 20vw" label="长:"> <el-input style="width: 180px" size="mini" placeholder="请输入长"></el-input> </el-form-item> <el-form-item style="width: 20vw" label="宽:"> <el-input style="width: 180px" size="mini" placeholder="请输入宽"></el-input> </el-form-item> </el-form> </div> <div style="margin-top: 20px;"> <p style="margin-top: 10px;margin-left: 100px;margin-bottom: 20px;">当前信息</p> <el-form label-position="right" label-width="90px"> <el-form-item style="width: 20vw" label="玻璃id:"> <el-input style="width: 180px" size="mini" placeholder="请输入玻璃id"></el-input> </el-form-item> <el-form-item style="width: 20vw" label="订单编号:"> <el-input style="width: 180px" size="mini" placeholder="请输入订单编号"></el-input> </el-form-item> <el-form-item style="width: 20vw" label="列表编号:"> <el-input style="width: 180px" size="mini" placeholder="请输入列表编号"></el-input> </el-form-item> <el-form-item style="width: 20vw" label="箱子编号:"> <el-input style="width: 180px" size="mini" placeholder="请输入箱子编号"></el-input> </el-form-item> <el-form-item style="width: 20vw" label="长:"> <el-input style="width: 180px" size="mini" placeholder="请输入长"></el-input> </el-form-item> <el-form-item style="width: 20vw" label="宽:"> <el-input style="width: 180px" size="mini" placeholder="请输入宽"></el-input> </el-form-item> </el-form> </div> </div> </div> </template> </el-dialog> <el-dialog v-model="dialogFormVisiblea" top="10vh" width="85%" title="订单信息" > <el-input placeholder="请输入工程号" style="width: 180px;size: mini;"></el-input> <el-button style="margin-left: 10px;size: mini;" type="primary">查询</el-button> <el-table ref="table" style="margin-top: 20px;height: 500px;" @selection-change="handleSelectionChange" :data="tableDataa" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}"> <el-table-column prop="ida" align="center" label="玻璃id" min-width="80" /> <el-table-column prop="typea" align="center" label="工程号" min-width="120" /> <el-table-column prop="typea" align="center" label="长" min-width="120" /> <el-table-column prop="typea" align="center" label="宽" min-width="120" /> <el-table-column prop="typea" align="center" label="厚" min-width="120" /> </el-table> <div id="demo-pagination-block"> <el-pagination style="margin-left: 850px;" v-model:current-page="currentPage4" v-model:page-size="pageSize4" :page-sizes="[100, 200, 300, 400]" :small="small" :disabled="disabled" :background="background" layout="total, sizes, prev, pager, next, jumper" :total="400" @size-change="handleSizeChange" @current-change="handleCurrentChange" /> </div> </el-dialog> <el-dialog v-model="dialogFormVisibleb" top="10vh" width="85%" title="出片队列" > <div style="display: flex;"> <p style="margin-top: 4px;">队列状态:</p> <p style="margin-top: 4px;">开始</p> <el-button style="margin-left: 10px;size: mini;" type="danger">停止</el-button> <el-button style="margin-left: 10px;size: mini;" type="primary">添加</el-button> </div> <el-table ref="table" style="margin-top: 20px;height: 500px;" @selection-change="handleSelectionChange" :data="tableDatab" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}"> <el-table-column prop="id" align="center" label="铝框id" min-width="80" /> <el-table-column prop="type" align="center" label="玻璃id" min-width="120" /> <el-table-column prop="type" align="center" label="订单编号" min-width="120" /> <el-table-column prop="type" align="center" label="列表编号" min-width="120" /> <el-table-column prop="type" align="center" label="箱子编号" min-width="120" /> <el-table-column prop="type" align="center" label="长" min-width="120" /> <el-table-column prop="type" align="center" label="宽" min-width="120" /> <el-table-column prop="type" align="center" label="玻璃状态" min-width="120" /> <el-table-column prop="type" align="center" label="顺序" min-width="120" /> <el-table-column prop="type" align="center" label="完成" min-width="120" /> <el-table-column prop="type" align="center" label="操作" min-width="120" /> </el-table> </el-dialog> <template #footer> <div id="dialog-footer"> <el-button type="primary" @click="dialogFormVisible = false"> 确认 </el-button> <el-button @click="dialogFormVisible = false">取消</el-button> </div> </template> </el-dialog> <el-dialog v-model="dialogFormVisiblea" top="10vh" width="85%" title="订单信息"> <el-input placeholder="请输入工程号" style="width: 180px;size: mini;"></el-input> <el-button style="margin-left: 10px;size: mini;" type="primary">查询 </el-button> <el-table ref="table" style="margin-top: 20px;height: 500px;" @selection-change="handleSelectionChange" :data="tableDataa" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}"> <el-table-column prop="ida" align="center" label="玻璃id" min-width="80"/> <el-table-column prop="typea" align="center" label="工程号" min-width="120"/> <el-table-column prop="typea" align="center" label="长" min-width="120"/> <el-table-column prop="typea" align="center" label="宽" min-width="120"/> <el-table-column prop="typea" align="center" label="厚" min-width="120"/> </el-table> <div id="demo-pagination-block"> <el-pagination style="margin-left: 850px;" v-model:current-page="currentPage4" v-model:page-size="pageSize4" :page-sizes="[100, 200, 300, 400]" :small="small" :disabled="disabled" :background="background" layout="total, sizes, prev, pager, next, jumper" :total="400" @size-change="handleSizeChange" @current-change="handleCurrentChange"/> </div> </el-dialog> <el-dialog v-model="dialogFormVisibleb" top="10vh" width="85%" title="出片队列"> <div style="display: flex;"> <p style="margin-top: 4px;">队列状态:</p> <p style="margin-top: 4px;">开始</p> <el-button style="margin-left: 10px;size: mini;" type="danger">停止 </el-button> <el-button style="margin-left: 10px;size: mini;" type="primary">添加 </el-button> </div> <el-table ref="table" style="margin-top: 20px;height: 500px;" @selection-change="handleSelectionChange" :data="tableDatab" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}"> <el-table-column prop="id" align="center" label="铝框id" min-width="80"/> <el-table-column prop="type" align="center" label="玻璃id" min-width="120"/> <el-table-column prop="type" align="center" label="订单编号" min-width="120"/> <el-table-column prop="type" align="center" label="列表编号" min-width="120"/> <el-table-column prop="type" align="center" label="箱子编号" min-width="120"/> <el-table-column prop="type" align="center" label="长" min-width="120"/> <el-table-column prop="type" align="center" label="宽" min-width="120"/> <el-table-column prop="type" align="center" label="玻璃状态" min-width="120"/> <el-table-column prop="type" align="center" label="顺序" min-width="120"/> <el-table-column prop="type" align="center" label="完成" min-width="120"/> <el-table-column prop="type" align="center" label="操作" min-width="120"/> </el-table> </el-dialog> </template> <style scoped> #dt { display: block; float: left; line-height: 20px; margin-left: 100px; } #dt { display:block; float:left;line-height: 20px;margin-left: 100px;} #dta { display:block; float:left;line-height: 20px;margin-left: 80%;} #dialog-footer{ #dta { display: block; float: left; line-height: 20px; margin-left: 80%; } #dialog-footer { text-align: center; margin-top: -15px; } #message{ #message { text-align: center; align-items: center; color: black; width: 200px; height: 100px; background-color: #337ecc; margin-left: 28%; width: 200px; height: 100px; background-color: #337ecc; margin-left: 28%; } #awatch{ #awatch { height: 450px; } #occupy { height: 100%; width: 15%; background-color: white; margin: 0px 8px 0px 8px; border: 1px #EBEEF5 solid; text-align: center; padding: 5px; height: 100%; width: 15%; background-color: white; margin: 0px 8px 0px 8px; border: 1px #ebeef5 solid; text-align: center; padding: 5px; } #biao { font-size: 12px; font-size: 12px; } #zhi { font-size: 18px; font-weight: bold; font-size: 18px; font-weight: bold; } #demo-pagination-block + #demo-pagination-block { margin-top: 10px; } #demo-pagination-block #demonstration { margin-bottom: 16px; } ::-webkit-scrollbar { width: 0 !important; } ::-webkit-scrollbar { width: 0 !important;height: 0; } .img-list{ position:relative; width: 0 !important; } .data-img{ @apply float-none ; width:100%; height:16rem; ::-webkit-scrollbar { width: 0 !important; height: 0; } .img-list { position: relative; } .data-img { @apply float-none; width: 100%; height: 16rem; background: rgba(0, 0, 0, 0); opacity: 1; border-radius: 0.5rem 0.5rem 0px 0px; } .check-img{ .check-img { position: absolute; width: 3.3125rem; height: 2.9375rem; top:20rem; top: 20rem; right: 57rem; z-index: 10; } .check-imga{ .check-imga { position: absolute; width: 3.3125rem; height: 2.9375rem; top:15rem; top: 15rem; right: 28.5rem; z-index: 10; } .vertical { width: 45px; height: 25px; background-color: #409EFF; top: 485px; /* 初始位置 */ left: 899px; /* 水平居中 */ transform: translateX(-50%); animation: move-vertical 6s infinite; /* 从上到下动画,持续6秒,无限循环 */ width: 45px; height: 25px; background-color: #409eff; top: 485px; /* 初始位置 */ left: 899px; /* 水平居中 */ transform: translateX(-50%); animation: move-vertical 6s infinite; /* 从上到下动画,持续6秒,无限循环 */ } @keyframes move-vertical { 0% { top: 485px; /* 起始位置 */ } 100% { top: calc(100% - 210px); /* 从上到下结束位置 */ } 0% { top: 485px; /* 起始位置 */ } 100% { top: calc(100% - 210px); /* 从上到下结束位置 */ } } .img-dlpl{ .img-dlpl { margin-left: 200px; background-image:url('../../assets/dlpl.png'); background-image: url('../../assets/dlpl.png'); background-repeat: no-repeat; background-attachment: local; min-height: 400px; width: 1200px; max-width: 100%; background-size: 1200px 400px; overflow: hidden; position:relative background-attachment: local; min-height: 400px; width: 1200px; max-width: 100%; background-size: 1200px 400px; overflow: hidden; position: relative; } .img-car1{ background-image:url('../../assets/lpl.jpg'); .img-car1 { background-image: url('../../assets/lpl.jpg'); position: absolute; background-repeat: no-repeat; background-attachment: local; min-height: 200px; width: 200px; max-width: 100%; background-size: 200px 70px; overflow: hidden; position:relative background-attachment: local; min-height: 200px; width: 200px; max-width: 100%; background-size: 200px 70px; overflow: hidden; position: relative; } .img-car2{ background-image:url('../../assets/lpla.jpg'); .img-car2 { background-image: url('../../assets/lpla.jpg'); position: absolute; background-repeat: no-repeat; background-attachment: local; min-height: 200px; width: 200px; max-width: 100%; background-size: 200px 70px; overflow: hidden; position:relative background-attachment: local; min-height: 200px; width: 200px; max-width: 100%; background-size: 200px 70px; overflow: hidden; position: relative; } </style> hangzhoumesParent/common/servicebase/src/main/java/com/mes/common/config/Swagger2Config.java
@@ -7,13 +7,14 @@ import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.schema.ModelRef; import springfox.documentation.service.ApiInfo; import springfox.documentation.service.Contact; import springfox.documentation.service.Parameter; import springfox.documentation.service.*; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spi.service.contexts.SecurityContext; import springfox.documentation.spring.web.plugins.Docket; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; /** @@ -46,9 +47,26 @@ .apis(RequestHandlerSelectors.basePackage("com.mes")) .paths(PathSelectors.any()) .build() .globalOperationParameters(pars); .globalOperationParameters(pars) .securitySchemes(Collections.EMPTY_LIST) .securityContexts(Arrays.asList(securityContext())); } private SecurityContext securityContext() { return SecurityContext.builder() .securityReferences(defaultAuth()) .forPaths(PathSelectors.any()) .build(); } private List<SecurityReference> defaultAuth() { AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything"); AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; authorizationScopes[0] = authorizationScope; return Arrays.asList(new SecurityReference("Authorization", authorizationScopes)); } private ApiInfo webApiInfo() { return new ApiInfoBuilder() .title("网站-API文档") hangzhoumesParent/common/servicebase/src/main/java/com/mes/entity/request/GeneralRequest.java
File was renamed from hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/entity/request/UserRequest.java @@ -1,4 +1,4 @@ package com.mes.userinfo.entity.request; package com.mes.entity.request; import cn.hutool.db.Page; import lombok.Data; @@ -9,9 +9,9 @@ * @Description: */ @Data public class UserRequest { public class GeneralRequest { private String userName; private String key; private Page page; } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/base/BaseController.java
File was deleted hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/config/TokenWebSecurityConfig.java
@@ -2,6 +2,7 @@ import com.mes.common.filter.JwtAuthenticationTokenFilter; import com.mes.common.handler.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -13,8 +14,6 @@ import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.AuthenticationEntryPoint; import org.springframework.security.web.access.AccessDeniedHandler; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; @Configuration @@ -23,12 +22,20 @@ public class TokenWebSecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter; @Autowired LoginFailureHandler loginFailureHandler; @Autowired private AuthenticationEntryPoint authenticationEntryPoint; LoginSuccessHandler loginSuccessHandler; @Autowired private AccessDeniedHandler accessDeniedHandler; JwtAuthenticationEntryPoint jwtAuthenticationEntryPoint; @Autowired JwtAccessDeniedHandler jwtAccessDeniedHandler; @Autowired JwtLogoutSuccessHandler jwtLogoutSuccessHandler; @Bean public PasswordEncoder passwordEncoder() { @@ -40,25 +47,42 @@ */ @Override protected void configure(HttpSecurity http) throws Exception { http //关闭csrf .csrf().disable() //不通过Session获取SecurityContext .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) http.cors().and().csrf().disable() // 登录配置 .formLogin() .successHandler(loginSuccessHandler) .failureHandler(loginFailureHandler) .and() .logout() .logoutSuccessHandler(jwtLogoutSuccessHandler) // 禁用session .and() .sessionManagement() .sessionCreationPolicy(SessionCreationPolicy.STATELESS) // 配置拦截规则 .and() .authorizeRequests() // 对于登录接口 允许匿名访问 .antMatchers("/userinfo/login").anonymous() // 除上面外的所有请求全部需要鉴权认证 .anyRequest().authenticated(); http.addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class); .antMatchers("/sys/user/login").anonymous() .antMatchers("/swagger-ui.html").permitAll() .antMatchers("/webjars/**").permitAll() .antMatchers("/v2/**").permitAll() .antMatchers("/swagger-resources/**").permitAll() .anyRequest().authenticated() //配置异常处理器 http.exceptionHandling() .authenticationEntryPoint(authenticationEntryPoint) .accessDeniedHandler(accessDeniedHandler); //允许跨域 http.cors(); // 异常处理器 .and() .exceptionHandling() .authenticationEntryPoint(jwtAuthenticationEntryPoint) .accessDeniedHandler(jwtAccessDeniedHandler) // 配置自定义的过滤器 .and() .addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class); } @Bean hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/filter/JwtAuthenticationTokenFilter.java
@@ -2,8 +2,9 @@ import com.mes.common.utils.JwtUtil; import com.mes.common.utils.RedisUtil; import com.mes.menu.mapper.SysMenuMapper; import com.mes.common.utils.UserInfoUtils; import com.mes.userinfo.entity.LoginUser; import com.mes.userinfo.service.SysUserService; import io.jsonwebtoken.Claims; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; @@ -36,7 +37,7 @@ private RedisUtil redisUtil; @Resource private SysMenuMapper menuMapper; private SysUserService sysUserService; @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { @@ -63,9 +64,10 @@ response.setHeader("token", ""); throw new RuntimeException("用户未登录"); } //将用户信息放入当前线程 UserInfoUtils.set(loginUser.getUser()); //存入SecurityContextHolder,以供后面的过滤器使用 List<String> permissionKeyList = menuMapper.selectPermsByUserId(Long.parseLong(userid)); List<String> permissionKeyList = sysUserService.getUserAuthorityInfo(Long.parseLong(userid)); List<GrantedAuthority> authorities = permissionKeyList.stream(). map(SimpleGrantedAuthority::new) .collect(Collectors.toList()); hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/AccessDeniedHandlerImpl.java
File was deleted hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/AuthenticationEntryPointImpl.java
File was deleted hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtAccessDeniedHandler.java
New file @@ -0,0 +1,35 @@ package com.mes.common.handler; import cn.hutool.json.JSONUtil; import com.mes.utils.Result; import org.springframework.http.HttpStatus; import org.springframework.security.access.AccessDeniedException; import org.springframework.security.web.access.AccessDeniedHandler; import org.springframework.stereotype.Component; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Component public class JwtAccessDeniedHandler implements AccessDeniedHandler { @Override public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException { response.setContentType("application/json;charset=UTF-8"); response.setStatus(HttpServletResponse.SC_FORBIDDEN); ServletOutputStream outputStream = response.getOutputStream(); Result result = Result.error(HttpStatus.FORBIDDEN.value(), "权限不足"); outputStream.write(JSONUtil.toJsonStr(result).getBytes("UTF-8")); outputStream.flush(); outputStream.close(); } } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtAuthenticationEntryPoint.java
New file @@ -0,0 +1,33 @@ package com.mes.common.handler; import cn.hutool.json.JSONUtil; import com.mes.utils.Result; import org.springframework.http.HttpStatus; import org.springframework.security.core.AuthenticationException; import org.springframework.security.web.AuthenticationEntryPoint; import org.springframework.stereotype.Component; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Component public class JwtAuthenticationEntryPoint implements AuthenticationEntryPoint { @Override public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException { response.setContentType("application/json;charset=UTF-8"); response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); ServletOutputStream outputStream = response.getOutputStream(); Result result = Result.error(HttpStatus.UNAUTHORIZED.value(), "认证失败请重新登录"); outputStream.write(JSONUtil.toJsonStr(result).getBytes("UTF-8")); outputStream.flush(); outputStream.close(); } } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtLogoutSuccessHandler.java
New file @@ -0,0 +1,40 @@ package com.mes.common.handler; import cn.hutool.json.JSONUtil; import com.mes.utils.Result; import org.springframework.security.core.Authentication; import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler; import org.springframework.stereotype.Component; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Component public class JwtLogoutSuccessHandler implements LogoutSuccessHandler { private static final String header = "Authorization"; @Override public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { if (authentication != null) { new SecurityContextLogoutHandler().logout(request, response, authentication); } response.setContentType("application/json;charset=UTF-8"); ServletOutputStream outputStream = response.getOutputStream(); response.setHeader(header, ""); Result result = Result.success(""); outputStream.write(JSONUtil.toJsonStr(result).getBytes("UTF-8")); outputStream.flush(); outputStream.close(); } } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/LoginFailureHandler.java
New file @@ -0,0 +1,31 @@ package com.mes.common.handler; import cn.hutool.json.JSONUtil; import com.mes.utils.Result; import org.springframework.security.core.AuthenticationException; import org.springframework.security.web.authentication.AuthenticationFailureHandler; import org.springframework.stereotype.Component; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Component public class LoginFailureHandler implements AuthenticationFailureHandler { @Override public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException { response.setContentType("application/json;charset=UTF-8"); ServletOutputStream outputStream = response.getOutputStream(); Result result = Result.error("用户名或密码错误"); outputStream.write(JSONUtil.toJsonStr(result).getBytes("UTF-8")); outputStream.flush(); outputStream.close(); } } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/LoginSuccessHandler.java
New file @@ -0,0 +1,38 @@ package com.mes.common.handler; import cn.hutool.json.JSONUtil; import com.mes.common.utils.JwtUtil; import com.mes.utils.Result; import org.springframework.security.core.Authentication; import org.springframework.security.web.authentication.AuthenticationSuccessHandler; import org.springframework.stereotype.Component; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Component public class LoginSuccessHandler implements AuthenticationSuccessHandler { private static final String header = "Authorization"; @Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { response.setContentType("application/json;charset=UTF-8"); ServletOutputStream outputStream = response.getOutputStream(); // 生成jwt,并放置到请求头中 String jwt = JwtUtil.generateToken(authentication.getName()); response.setHeader(header, jwt); Result result = Result.success(""); outputStream.write(JSONUtil.toJsonStr(result).getBytes("UTF-8")); outputStream.flush(); outputStream.close(); } } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/JwtUtil.java
@@ -48,7 +48,7 @@ } // jwt是否过期 public boolean isTokenExpired(Claims claims) { public static boolean isTokenExpired(Claims claims) { return claims.getExpiration().before(new Date()); } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/UserInfoUtils.java
New file @@ -0,0 +1,26 @@ package com.mes.common.utils; import com.mes.userinfo.entity.SysUser; /** * @Author : zhoush * @Date: 2024/4/25 15:41 * @Description: */ public class UserInfoUtils { private static InheritableThreadLocal<SysUser> tokenPool = new InheritableThreadLocal<SysUser>(); public static SysUser get() { return tokenPool.get(); } public static void set(SysUser user) { tokenPool.set(user); } public static void remove() { if (get() != null) { tokenPool.remove(); } } } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/controller/SysMenuController.java
@@ -1,116 +1,76 @@ package com.mes.menu.controller; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.mes.base.BaseController; import com.mes.entity.request.GeneralRequest; import com.mes.menu.entity.SysMenu; import com.mes.role.entity.SysRoleMenu; import com.mes.menu.service.SysMenuService; import com.mes.utils.Result; import io.swagger.annotations.ApiModel; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Map; /** * <p> * 菜单表 * </p> * * @author zhoush * @since 2024-04-11 */ @ApiModel("获取菜单信息") @Api(description = "菜单管理") @RestController @RequestMapping("/menu/sysMenu") public class SysMenuController extends BaseController { @ApiOperation("获取用户有权限的所有菜单") @GetMapping("/list") public Result<List<SysMenu>> getMenuTree(String userName) { return Result.success(sysMenuService.getMenuTree()); } @RequestMapping("/sys/menu") public class SysMenuController { @ApiOperation("获取用户的权限") @GetMapping("/getAuthorityInfo") public Result<List<String>> getAuthorityInfo(String userName) { return Result.success(sysMenuService.getAuthorityInfo(userName)); } @Autowired private SysMenuService sysMenuService; /** * 用户当前用户的菜单和权限信息 * * @param userName * @return */ @GetMapping("/nav") public Result nav(String userName) { // SysUser sysUser = sysUserService.listByUserNameName(userName); // // // 获取权限信息 // sysUserService.getUserAuthorityInfo(sysUser.getId());// ROLE_admin,ROLE_normal,sys:user:list,.... // String[] authorityInfoArray = StringUtils.tokenizeToStringArray(authorityInfo, ","); // // // 获取导航栏信息 // List<SysMenuDto> navs = sysMenuService.getCurrentUserNav(); // // return Result.success(MapUtil.builder() // .put("authoritys", authorityInfoArray) // .put("nav", navs) // .map() // ); return null; } @GetMapping("/info/{id}") @PreAuthorize("hasAuthority('sys:menu:list')") public Result info(@PathVariable(name = "id") Long id) { return Result.success(sysMenuService.getById(id)); } // @GetMapping("/list") // @PreAuthorize("hasAuthority('sys:menu:list')") // public Result list() { // //// List<SysMenu> menus = sysMenuService.tree(); // return Result.success(null); // } @ApiOperation("新增菜单") @PostMapping("/save") @PreAuthorize("hasAuthority('sys:menu:save')") // @PreAuthorize("hasAuthority('sys:menu:save')") public Result save(@Validated @RequestBody SysMenu sysMenu) { return Result.success(sysMenuService.save(sysMenu)); } @PostMapping("/update") @PreAuthorize("hasAuthority('sys:menu:update')") public Result update(@Validated @RequestBody SysMenu sysMenu) { sysMenuService.updateById(sysMenu); // 清除所有与该菜单相关的权限缓存 sysUserService.clearUserAuthorityInfoByMenuId(sysMenu.getId()); @ApiOperation("修改菜单信息") @PostMapping("/updateMenu") // @PreAuthorize("hasAuthority('sys:menu:update')") public Result updateMenu(@Validated @RequestBody SysMenu sysMenu) { sysMenuService.updateMenu(sysMenu); return Result.success(sysMenu); } @PostMapping("/delete/{id}") @PreAuthorize("hasAuthority('sys:menu:delete')") public Result delete(@PathVariable("id") Long id) { @ApiOperation("获取用户有权限的所有菜单") @GetMapping("/getMenuTree") public Result<List<SysMenu>> getMenuTree(GeneralRequest request) { return Result.success(sysMenuService.getMenuTree(request)); } int count = sysMenuService.count(new QueryWrapper<SysMenu>().eq("parent_id", id)); if (count > 0) { return Result.error("请先删除子菜单"); } @ApiOperation("获取用户的权限") @GetMapping("/getAuthorityInfo") public Result<List<String>> getAuthorityInfo() { return Result.success(sysMenuService.getAuthorityInfo()); } // 清除所有与该菜单相关的权限缓存 sysUserService.clearUserAuthorityInfoByMenuId(id); sysMenuService.removeById(id); @ApiOperation("用户当前用户的菜单和权限信息") @GetMapping("/nav") public Result<Map<Object, Object>> nav() { return Result.success(sysMenuService.nav()); } // 同步删除中间关联表 sysRoleMenuService.remove(new QueryWrapper<SysRoleMenu>().eq("menu_id", id)); return Result.success(""); @ApiOperation("删除菜单") @PostMapping("/deleteMenu") // @PreAuthorize("hasAuthority('sys:menu:delete')") public Result<String> deleteMenu(Long menuId) { return Result.success(sysMenuService.deleteMenu(menuId)); } @ApiOperation("批量删除菜单") @PostMapping("/batchDeleteMenu") // @PreAuthorize("hasAuthority('sys:menu:delete')") public Result<String> batchDeleteMenu(@RequestBody List<Long> menuIds) { return Result.success(sysMenuService.batchDeleteMenu(menuIds)); } } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/entity/SysMenu.java
@@ -35,7 +35,7 @@ /** * 父id */ private Integer parentId; private Long parentId; /** * 模块名称 @@ -73,6 +73,11 @@ private Date createTime; /** * 权限 */ private String perms; /** * 子菜单 */ @TableField(exist = false) hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/mapper/SysMenuMapper.java
@@ -1,6 +1,6 @@ package com.mes.menu.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.github.yulichang.base.MPJBaseMapper; import com.mes.menu.entity.SysMenu; import org.apache.ibatis.annotations.Mapper; @@ -15,7 +15,7 @@ * @since 2024-04-11 */ @Mapper public interface SysMenuMapper extends BaseMapper<SysMenu> { public interface SysMenuMapper extends MPJBaseMapper<SysMenu> { List<String> selectPermsByUserId(long parseLong); } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/service/SysMenuService.java
@@ -1,9 +1,11 @@ package com.mes.menu.service; import com.baomidou.mybatisplus.extension.service.IService; import com.mes.entity.request.GeneralRequest; import com.mes.menu.entity.SysMenu; import java.util.List; import java.util.Map; /** * <p> @@ -16,17 +18,49 @@ public interface SysMenuService extends IService<SysMenu> { /** * 更新菜单信息 * * @param menu * @return */ SysMenu updateMenu(SysMenu menu); /** * 获取用户有权限的菜单树 * * @return */ List<SysMenu> getMenuTree(); List<SysMenu> getMenuTree(GeneralRequest request); /** * 获取用户的权限 * * @param userName * @return */ List<String> getAuthorityInfo(String userName); List<String> getAuthorityInfo(); /** * 获取用户菜单及权限信息 * * @return */ Map<Object, Object> nav(); /** * 删除菜单信息 * * @param menuId * @return */ String deleteMenu(Long menuId); /** * 批量删除菜单信息 * * @param menuIds * @return */ String batchDeleteMenu(List<Long> menuIds); } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/service/impl/SysMenuServiceImpl.java
@@ -1,18 +1,28 @@ package com.mes.menu.service.impl; import cn.hutool.core.map.MapUtil; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.mes.common.utils.UserInfoUtils; import com.mes.entity.request.GeneralRequest; import com.mes.menu.entity.SysMenu; import com.mes.menu.mapper.SysMenuMapper; import com.mes.menu.service.SysMenuService; import com.mes.role.entity.SysRoleMenu; import com.mes.role.service.SysRoleMenuService; import com.mes.userinfo.entity.SysUser; import com.mes.userinfo.entity.SysUserRole; import com.mes.userinfo.mapper.SysUserRoleMapper; import com.mes.userinfo.service.SysUserService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** @@ -30,21 +40,75 @@ @Autowired SysUserService sysUserService; @Autowired SysUserRoleMapper sysUserRoleMapper; @Autowired SysRoleMenuService sysRoleMenuService; @Override public List<SysMenu> getMenuTree() { public SysMenu updateMenu(SysMenu menu) { baseMapper.updateById(menu); // 清除所有与该菜单相关的权限缓存 sysUserService.clearUserAuthorityInfoByMenuId(menu.getId()); return menu; } @Override public List<SysMenu> getMenuTree(GeneralRequest request) { //todo:需要先获取用户的角色,角色下的菜单权限,拿到菜单id获取所有菜单 List<SysMenu> menuList = this.baseMapper.selectList(null); SysUser user = UserInfoUtils.get(); MPJLambdaWrapper<SysUserRole> wrapper = new MPJLambdaWrapper<>(); wrapper.selectAll(SysMenu.class).distinct() .leftJoin(SysUser.class, SysUser::getId, SysUserRole::getUserId) .leftJoin(SysRoleMenu.class, SysRoleMenu::getRoleId, SysUserRole::getRoleId) .leftJoin(SysMenu.class, SysMenu::getId, SysRoleMenu::getMenuId) .eq(SysUser::getId, user.getId()) .like(StringUtils.isNotBlank(request.getKey()), SysMenu::getMenuName, request.getKey()); List<SysMenu> menuList = sysUserRoleMapper.selectJoinList(SysMenu.class, wrapper); return create(menuList); } @Override public List<String> getAuthorityInfo(String userName) { log.info("获取用户信息,用户名为{}", userName); SysUser sysUser = sysUserService.getOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getUserName, userName)); public List<String> getAuthorityInfo() { SysUser user = UserInfoUtils.get(); log.info("获取用户信息,用户名为{}", user); // 获取权限信息 // ROLE_admin,ROLE_normal,sys:user:list,.... return sysUserService.getUserAuthorityInfo(sysUser.getId()); return sysUserService.getUserAuthorityInfo(user.getId()); } @Override public Map<Object, Object> nav() { List<SysMenu> menuTree = getMenuTree(new GeneralRequest()); List<String> authorityInfo = getAuthorityInfo(); return MapUtil.builder().put("authoritys", authorityInfo) .put("tree", menuTree).map(); } @Override public String deleteMenu(Long menuId) { int count = this.count(new LambdaQueryWrapper<SysMenu>().eq(SysMenu::getParentId, menuId)); if (count > 0) { return "无法删除,请先删除子菜单"; } // 清除所有与该菜单相关的权限缓存 sysUserService.clearUserAuthorityInfoByMenuId(menuId); this.removeById(menuId); // 同步删除中间关联表 sysRoleMenuService.remove(new LambdaQueryWrapper<SysRoleMenu>().eq(SysRoleMenu::getMenuId, menuId)); return "删除成功"; } @Override public String batchDeleteMenu(List<Long> menuIds) { menuIds.stream().forEach(e -> deleteMenu(e)); return "批量删除成功"; } @@ -74,87 +138,9 @@ private List<SysMenu> getChildren(SysMenu menu, List<SysMenu> menus) { List<SysMenu> res = menus.stream() .filter(item -> item.getParentId().equals(menu.getId())) .map(item -> { item.setChildren(getChildren(item, menus)); return item; }).collect(Collectors.toList()); .collect(Collectors.toList()); log.info("菜单树:{}", JSONUtil.toJsonStr(res)); return res; } // // @Autowired // SysUserMapper sysUserMapper; // // @Override // public List<SysMenuDto> getCurrentUserNav() { // String username = (String) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); // SysUser sysUser = sysUserService.listByUserNameName(username); // // List<Long> menuIds = sysUserMapper.getNavMenuIds(sysUser.getId()); // List<SysMenu> menus = this.listByIds(menuIds); // // // 转树状结构 // List<SysMenu> menuTree = buildTreeMenu(menus); // // // 实体转DTO // return convert(menuTree); // } // // @Override // public List<SysMenu> tree() { // // 获取所有菜单信息 // List<SysMenu> sysMenus = this.list(new QueryWrapper<SysMenu>().orderByAsc("orderNum")); // // // 转成树状结构 // return buildTreeMenu(sysMenus); // } // // private List<SysMenuDto> convert(List<SysMenu> menuTree) { // List<SysMenuDto> menuDtos = new ArrayList<>(); // // menuTree.forEach(m -> { // SysMenuDto dto = new SysMenuDto(); // // dto.setId(m.getId()); // dto.setName(m.getPerms()); // dto.setTitle(m.getName()); // dto.setComponent(m.getComponent()); // dto.setPath(m.getPath()); // // if (m.getChildren().size() > 0) { // // // 子节点调用当前方法进行再次转换 // dto.setChildren(convert(m.getChildren())); // } // // menuDtos.add(dto); // }); // // return menuDtos; // } // // private List<SysMenu> buildTreeMenu(List<SysMenu> menus) { // // List<SysMenu> finalMenus = new ArrayList<>(); // // // 先各自寻找到各自的孩子 // for (SysMenu menu : menus) { // // for (SysMenu e : menus) { // if (menu.getId() == e.getParentId()) { // menu.getChildren().add(e); // } // } // // // 提取出父节点 // if (menu.getParentId() == 0L) { // finalMenus.add(menu); // } // } // // System.out.println(JSONUtil.toJsonStr(finalMenus)); // return finalMenus; // } } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/controller/SysRoleController.java
@@ -1,20 +1,63 @@ package com.mes.role.controller; import com.mes.base.BaseController; import com.mes.entity.request.GeneralRequest; import com.mes.role.entity.SysRole; import com.mes.role.entity.vo.SysRoleVO; import com.mes.role.service.SysRoleService; import com.mes.utils.Result; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; /** * <p> * 角色表 前端控制器 * </p> * * @author zhoush * @since 2024-04-11 */ @Api(description = "角色管理") @RestController @RequestMapping("/role/sys-role") public class SysRoleController extends BaseController { } @RequestMapping("/sys/role") public class SysRoleController { @Autowired private SysRoleService sysRoleService; @ApiOperation("新增角色及角色下的权限信息") @PostMapping("/saveRole") // @PreAuthorize("hasAuthority('sys:role:save')") public Result<SysRole> saveRole(@Validated @RequestBody SysRoleVO sysRoleVO) { return Result.success(sysRoleService.saveRole(sysRoleVO)); } @ApiOperation("编辑角色及角色下的权限信息") @PostMapping("/updateRole") // @PreAuthorize("hasAuthority('sys:role:save')") public Result<String> updateRole(@Validated @RequestBody SysRoleVO sysRoleVO) { return Result.success(sysRoleService.updateRole(sysRoleVO)); } @ApiOperation("查询角色及角色下的权限信息") @PostMapping("/queryRole") // @PreAuthorize("hasAuthority('sys:role:save')") public Result<List<SysRoleVO>> queryRole(@Validated @RequestBody GeneralRequest request) { return Result.success(sysRoleService.queryRole(request)); } @ApiOperation("删除角色及角色下的权限信息") @PostMapping("/delete") // @PreAuthorize("hasAuthority('sys:role:delete')") @Transactional public Result<String> deleteRole(@RequestBody List<Long> ids) { return Result.success(sysRoleService.deleteRole(ids)); } } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/entity/SysRoleMenu.java
@@ -24,7 +24,7 @@ /** * 角色ID */ @TableId(value = "role_id", type = IdType.AUTO) @TableId(type = IdType.NONE) private Long roleId; /** hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/entity/vo/SysRoleVO.java
New file @@ -0,0 +1,44 @@ package com.mes.role.entity.vo; import com.mes.menu.entity.SysMenu; import io.swagger.annotations.Api; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; import java.util.List; /** * @Author : zhoush * @Date: 2024/4/26 13:57 * @Description: */ @Api(description = "角色信息") @Data public class SysRoleVO implements Serializable { @ApiModelProperty(hidden = true) private static final long serialVersionUID = 1L; @ApiModelProperty(value = "角色ID", position = 2) private Long id; @ApiModelProperty(value = "角色名称", position = 3) private String name; @ApiModelProperty(value = "角色权限字符串", position = 4) private String roleKey; @ApiModelProperty(value = "角色状态(0正常 1停用)", position = 5) private String status; @ApiModelProperty(value = "删除标志", position = 6) private Integer delFlag; @ApiModelProperty(value = "备注", position = 7) private String remark; @ApiModelProperty(value = "角色菜单信息", position = 8) private List<SysMenu> menuList; } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/mapper/SysRoleMapper.java
@@ -1,6 +1,6 @@ package com.mes.role.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.github.yulichang.base.MPJBaseMapper; import com.mes.role.entity.SysRole; import org.apache.ibatis.annotations.Mapper; @@ -13,6 +13,6 @@ * @since 2024-04-11 */ @Mapper public interface SysRoleMapper extends BaseMapper<SysRole> { public interface SysRoleMapper extends MPJBaseMapper<SysRole> { } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/service/SysRoleService.java
@@ -1,7 +1,11 @@ package com.mes.role.service; import com.baomidou.mybatisplus.extension.service.IService; import com.mes.entity.request.GeneralRequest; import com.mes.role.entity.SysRole; import com.mes.role.entity.vo.SysRoleVO; import java.util.List; /** * <p> @@ -13,4 +17,35 @@ */ public interface SysRoleService extends IService<SysRole> { /** * 创建角色信息 * * @param sysRoleVO * @return */ SysRole saveRole(SysRoleVO sysRoleVO); /** * 修改角色信息及权限 * * @param sysRoleVO * @return */ String updateRole(SysRoleVO sysRoleVO); /** * 按照角色名查询角色信息 * * @param request * @return */ List<SysRoleVO> queryRole(GeneralRequest request); /** * 查询角色及角色下的权限信息 * * @param ids * @return */ String deleteRole(List<Long> ids); } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/service/impl/SysRoleServiceImpl.java
@@ -1,10 +1,28 @@ package com.mes.role.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.mes.entity.request.GeneralRequest; import com.mes.menu.entity.SysMenu; import com.mes.role.entity.SysRole; import com.mes.role.entity.SysRoleMenu; import com.mes.role.entity.vo.SysRoleVO; import com.mes.role.mapper.SysRoleMapper; import com.mes.role.service.SysRoleMenuService; import com.mes.role.service.SysRoleService; import com.mes.userinfo.entity.SysUserRole; import com.mes.userinfo.service.SysUserRoleService; import com.mes.userinfo.service.SysUserService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; import java.util.List; import java.util.stream.Collectors; /** * <p> @@ -15,6 +33,91 @@ * @since 2024-04-11 */ @Service @Slf4j public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> implements SysRoleService { @Autowired SysRoleMenuService sysRoleMenuService; @Autowired SysUserService sysUserService; @Autowired SysUserRoleService sysUserRoleService; @Override @Transactional(rollbackFor = Exception.class) public SysRole saveRole(SysRoleVO sysRoleVO) { log.info("保存角色信息,生成对应的角色id"); SysRole sysRole = new SysRole(); BeanUtils.copyProperties(sysRoleVO, sysRole); this.save(sysRole); //保存角色权限信息 saveRoleMenu(sysRole.getId(), sysRoleVO.getMenuList()); return sysRole; } @Override @Transactional(rollbackFor = Exception.class) public String updateRole(SysRoleVO sysRoleVO) { log.info("保存角色信息,生成对应的角色id"); SysRole sysRole = new SysRole(); BeanUtils.copyProperties(sysRoleVO, sysRole); this.updateById(sysRole); //保存角色权限信息 return saveRoleMenu(sysRole.getId(), sysRoleVO.getMenuList()); } @Override public List<SysRoleVO> queryRole(GeneralRequest request) { MPJLambdaWrapper<SysRole> wrapper = new MPJLambdaWrapper<>(); wrapper.selectAll(SysRole.class) .selectCollection(SysMenu.class, SysRoleVO::getMenuList) .leftJoin(SysRoleMenu.class, SysRoleMenu::getRoleId, SysRole::getId) .leftJoin(SysMenu.class, SysMenu::getId, SysRoleMenu::getMenuId) .like(StringUtils.hasText(request.getKey()), SysRole::getName, request.getKey()); return baseMapper.selectJoinList(SysRoleVO.class, wrapper); } @Override @Transactional(rollbackFor = Exception.class) public String deleteRole(List<Long> ids) { log.info("删除角色信息"); this.removeByIds(ids); log.info("删除中间表信息"); sysUserRoleService.remove(new LambdaQueryWrapper<SysUserRole>().in(SysUserRole::getRoleId, ids)); sysRoleMenuService.remove(new LambdaQueryWrapper<SysRoleMenu>().in(SysRoleMenu::getRoleId, ids)); log.info("清空缓存中的权限信息"); ids.stream().forEach(id -> sysUserService.clearUserAuthorityInfoByRoleId(id)); return "success"; } /** * 保存角色权限信息 * * @param roleId * @param menuList * @return */ private String saveRoleMenu(Long roleId, List<SysMenu> menuList) { log.info("配置角色菜单关心"); List<SysRoleMenu> roleMenuList = menuList.stream().map(menu -> { SysRoleMenu roleMenu = new SysRoleMenu(); roleMenu.setRoleId(roleId); roleMenu.setMenuId(menu.getId()); return roleMenu; }).collect(Collectors.toList()); log.info("清空角色权限表中该角色信息"); // 先删除原来的记录,再保存新的 sysRoleMenuService.remove(new LambdaQueryWrapper<SysRoleMenu>().eq(SysRoleMenu::getRoleId, roleId)); sysRoleMenuService.saveBatch(roleMenuList); // 删除缓存 sysUserService.clearUserAuthorityInfoByRoleId(roleId); return "success"; } } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/controller/SysUserController.java
@@ -1,13 +1,15 @@ package com.mes.userinfo.controller; import com.mes.base.BaseController; import com.mes.entity.request.GeneralRequest; import com.mes.userinfo.entity.SysUser; import com.mes.userinfo.entity.request.UserRequest; import com.mes.userinfo.entity.vo.SysUserVO; import com.mes.userinfo.service.SysUserService; import com.mes.utils.Result; import io.swagger.annotations.ApiModel; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -25,10 +27,13 @@ * @author zhoush * @since 2024-04-11 */ @ApiModel("用户信息") @Api(description = "用户管理") @RestController @RequestMapping("/userinfo") public class SysUserController extends BaseController { @RequestMapping("/sys/user") public class SysUserController { @Autowired private SysUserService sysUserService; @ApiOperation("用户登录") @PostMapping("/login") @@ -38,6 +43,8 @@ @ApiOperation("退出登录") @PostMapping("/logout") // @PreAuthorize("hasRole('ROLE_admin')") @PreAuthorize("hasAuthority('xt:yh')") public Result<String> logout() { return Result.success(sysUserService.logout()); } @@ -57,17 +64,18 @@ return Result.success(sysUserService.updateUser(sysUser)); } @ApiOperation("重置密码") @PostMapping("/resetPassword") // @PreAuthorize("hasAuthority('sys:user:resetPassword')") public Result resetPassword(@RequestBody Long userId) { return Result.success(sysUserService.resetPassword(userId)); public Result resetPassword(String userId) { return Result.success(sysUserService.resetPassword(Long.parseLong(userId))); } @ApiOperation("获取用户列表") @PostMapping("/listByUserName") // @PreAuthorize("hasAuthority('sys:user:list')") public Result<List<SysUserVO>> listByUserName(@RequestBody UserRequest request) { public Result<List<SysUserVO>> listByUserName(@RequestBody GeneralRequest request) { return Result.success(sysUserService.listByUserName(request)); } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/entity/SysUserRole.java
@@ -1,5 +1,7 @@ package com.mes.userinfo.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; @@ -24,6 +26,7 @@ /** * 用户id */ @TableId(type = IdType.NONE) private Long userId; /** hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/entity/vo/SysUserVO.java
@@ -1,7 +1,7 @@ package com.mes.userinfo.entity.vo; import com.mes.role.entity.SysRole; import io.swagger.annotations.ApiModel; import io.swagger.annotations.Api; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -16,7 +16,7 @@ * @author zhoush * @since 2024-04-11 */ @ApiModel(description = "<p> 用户信息 </p>") @Api(description = "用户信息") @Data public class SysUserVO implements Serializable { hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/mapper/SysUserRoleMapper.java
@@ -1,6 +1,6 @@ package com.mes.userinfo.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.github.yulichang.base.MPJBaseMapper; import com.mes.userinfo.entity.SysUserRole; import org.apache.ibatis.annotations.Mapper; @@ -13,6 +13,6 @@ * @since 2024-04-11 */ @Mapper public interface SysUserRoleMapper extends BaseMapper<SysUserRole> { public interface SysUserRoleMapper extends MPJBaseMapper<SysUserRole> { } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/service/SysUserRoleService.java
@@ -1,6 +1,6 @@ package com.mes.userinfo.service; import com.baomidou.mybatisplus.extension.service.IService; import com.github.yulichang.base.MPJBaseService; import com.mes.userinfo.entity.SysUserRole; /** @@ -11,6 +11,7 @@ * @author zhoush * @since 2024-04-11 */ public interface SysUserRoleService extends IService<SysUserRole> { public interface SysUserRoleService extends MPJBaseService<SysUserRole> { } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/service/SysUserService.java
@@ -1,8 +1,8 @@ package com.mes.userinfo.service; import com.baomidou.mybatisplus.extension.service.IService; import com.mes.entity.request.GeneralRequest; import com.mes.userinfo.entity.SysUser; import com.mes.userinfo.entity.request.UserRequest; import com.mes.userinfo.entity.vo.SysUserVO; import java.util.List; @@ -60,10 +60,18 @@ /** * 按名称获取用户信息 * * @param userName * @return */ SysUser queryByUserName(String userName); /** * 按关键字获取用户信息列表 * * @param request * @return */ List<SysUserVO> listByUserName(UserRequest request); List<SysUserVO> listByUserName(GeneralRequest request); /** * 删除用户信息 @@ -81,5 +89,22 @@ */ List<String> getUserAuthorityInfo(Long userId); void clearUserAuthorityInfoByMenuId(Long userId); /** * 清空用户权限信息通过用户信息 */ void clearUserAuthorityInfo(String userName); /** * 清空用户权限信息通过角色id * * @param roleId */ void clearUserAuthorityInfoByRoleId(Long roleId); /** * 清空用户权限信息通过菜单id * * @param menuId */ void clearUserAuthorityInfoByMenuId(Long menuId); } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/service/impl/SysUserServiceImpl.java
@@ -1,5 +1,6 @@ package com.mes.userinfo.service.impl; import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -7,13 +8,15 @@ import com.mes.common.config.Const; import com.mes.common.utils.JwtUtil; import com.mes.common.utils.RedisUtil; import com.mes.common.utils.UserInfoUtils; import com.mes.entity.request.GeneralRequest; import com.mes.menu.mapper.SysMenuMapper; import com.mes.role.entity.SysRole; import com.mes.role.entity.SysRoleMenu; import com.mes.role.service.SysRoleService; import com.mes.userinfo.entity.LoginUser; import com.mes.userinfo.entity.SysUser; import com.mes.userinfo.entity.SysUserRole; import com.mes.userinfo.entity.request.UserRequest; import com.mes.userinfo.entity.vo.SysUserVO; import com.mes.userinfo.mapper.SysUserMapper; import com.mes.userinfo.service.SysUserRoleService; @@ -21,10 +24,10 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; @@ -69,8 +72,12 @@ @Resource BCryptPasswordEncoder passwordEncoder; @Value("${test.common}") private String value; @Override public Map<String, String> login(SysUser user) { log.info(value); UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(user.getUserName(), user.getPassword()); Authentication authenticate = authenticationManager.authenticate(authenticationToken); if (Objects.isNull(authenticate)) { @@ -93,10 +100,9 @@ @Override public String logout() { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); LoginUser loginUser = (LoginUser) authentication.getPrincipal(); Long userid = loginUser.getUser().getId(); redisUtil.deleteObject("login:" + userid); log.info("用户退出"); SysUser user = UserInfoUtils.get(); redisUtil.deleteObject("login:" + user.getId()); return "注销成功"; } @@ -122,10 +128,12 @@ BeanUtils.copyProperties(user, sysUser); this.updateById(sysUser); log.info("删除用户角色信息"); sysUserRoleService.removeByIds(user.getRoleList()); List<Long> roleIds = user.getRoleList().stream().map(SysRole::getId).collect(Collectors.toList()); sysUserRoleService.remove(new LambdaQueryWrapper<SysUserRole>() .eq(SysUserRole::getUserId, sysUser.getId()).in(CollectionUtil.isNotEmpty(roleIds), SysUserRole::getRoleId, roleIds)); log.info("保存用户角色信息"); saveUserRole(user.getRoleList(), sysUser.getId()); return null; return user; } @Override @@ -140,13 +148,18 @@ } @Override public List<SysUserVO> listByUserName(UserRequest request) { public SysUser queryByUserName(String userName) { return baseMapper.selectOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getUserName, userName)); } @Override public List<SysUserVO> listByUserName(GeneralRequest request) { MPJLambdaWrapper<SysUser> wrapper = new MPJLambdaWrapper<>(); wrapper.selectAll(SysUser.class) .selectCollection(SysRole.class, SysUserVO::getRoleList) .leftJoin(SysUserRole.class, SysUserRole::getUserId, SysUser::getId) .leftJoin(SysRole.class, SysRole::getId, SysUserRole::getRoleId) .like(StringUtils.hasText(request.getUserName()), SysUser::getUserName, request.getUserName()); .like(StringUtils.hasText(request.getKey()), SysUser::getUserName, request.getKey()); return baseMapper.selectJoinList(SysUserVO.class, wrapper); } @@ -191,8 +204,31 @@ } @Override public void clearUserAuthorityInfoByMenuId(Long userId) { public void clearUserAuthorityInfo(String userName) { redisUtil.deleteObject("GrantedAuthority:" + userName); } @Override public void clearUserAuthorityInfoByRoleId(Long roleId) { List<SysUser> sysUsers = this.list(new QueryWrapper<SysUser>() .inSql("id", "select user_id from sys_user_role where role_id = " + roleId)); sysUsers.forEach(u -> { this.clearUserAuthorityInfo(u.getUserName()); }); } @Override public void clearUserAuthorityInfoByMenuId(Long menuId) { MPJLambdaWrapper<SysUserRole> wrapper = new MPJLambdaWrapper<SysUserRole>().selectAll(SysUser.class).distinct() .leftJoin(SysUser.class, SysUser::getId, SysUserRole::getUserId) .leftJoin(SysRoleMenu.class, SysRoleMenu::getRoleId, SysUserRole::getRoleId) .eq(SysRoleMenu::getMenuId, menuId); List<SysUser> sysUsers = sysUserRoleService.selectJoinList(SysUser.class, wrapper); sysUsers.forEach(u -> { this.clearUserAuthorityInfo(u.getUserName()); }); } /** hangzhoumesParent/common/springsecurity/src/main/resources/application.yml
@@ -1,25 +1,25 @@ server: port: 8089 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://192.168.56.10:3306/hangzhoumes?serverTimezone=GMT%2b8&characterEncoding=utf-8&useSSL=false username: root password: root cloud: nacos: discovery: server-addr: 127.0.0.1:8848 application: name: security redis: database: 0 host: 127.0.0.1 port: 6379 password: session: store-type: redis mybatis-plus: mapper-locations: classpath*:mapper/*.xml configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #server: # port: 8089 #spring: # datasource: # driver-class-name: com.mysql.cj.jdbc.Driver # url: jdbc:mysql://192.168.56.10:3306/hangzhoumes?serverTimezone=GMT%2b8&characterEncoding=utf-8&useSSL=false # username: root # password: root # cloud: # nacos: # discovery: # server-addr: 127.0.0.1:8848 # application: # name: security # redis: # database: 0 # host: 127.0.0.1 # port: 6379 # password: # session: # store-type: redis #mybatis-plus: # mapper-locations: classpath*:mapper/*.xml # configuration: # log-impl: org.apache.ibatis.logging.stdout.StdOutImpl hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/controller/EdgStorageCageController.java
@@ -3,17 +3,12 @@ import com.mes.edgstoragecage.entity.EdgStorageCage; import com.mes.edgstoragecage.entity.EdgStorageCageDetails; import com.mes.edgstoragecage.service.EdgStorageCageService; import com.mes.edgstoragecage.service.impl.EdgStorageCageServiceImpl; import com.mes.taskcache.entity.TaskCache; import com.mes.taskcache.service.impl.TaskCacheServiceImpl; import com.mes.utils.Result; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.awt.image.ImageProducer; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -25,7 +20,7 @@ * @author zhoush * @since 2024-04-07 */ @Api(tags = "理片笼缓存") @Api(description = "理片笼缓存") @RestController @RequestMapping("/edgStorageCage") public class EdgStorageCageController { hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/glassinfo/controller/GlassInfoController.java
@@ -10,10 +10,8 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import com.mes.glassinfo.service.impl.GlassInfoServiceImpl; import java.util.List; import java.util.Map; /** * <p> @@ -23,7 +21,7 @@ * @author zhoush * @since 2024-04-07 */ @Api(tags = "玻璃信息小片") @Api(description = "玻璃信息小片") @RestController @RequestMapping("/glassInfo") public class GlassInfoController { hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/taskcache/controller/TaskCacheController.java
@@ -12,7 +12,6 @@ import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Map; /** * <p> @@ -22,7 +21,7 @@ * @author zhoush * @since 2024-04-07 */ @Api(tags = "识别显示") @Api(description = "识别显示") @RestController @RequestMapping("/taskCache") public class TaskCacheController { hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/application.yml
@@ -42,4 +42,4 @@ mybatis-plus: mapper-locations: classpath*:mapper/*.xml configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl log-impl: org.apache.ibatis.logging.stdout.StdOutImpl hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/controller/BigStorageCageController.java
@@ -2,7 +2,7 @@ import com.mes.bigstorage.entity.BigStorageCage; import com.mes.bigstorage.service.BigStorageCageService; import io.swagger.annotations.ApiModel; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; @@ -19,7 +19,7 @@ * @author zhoush * @since 2024-03-27 */ @ApiModel("理片笼信息") @Api(description = "理片笼信息") @RestController @RequestMapping("/bigStorageCage") public class BigStorageCageController { hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/controller/BigStorageCageDetailsController.java
@@ -3,10 +3,9 @@ import com.mes.bigstorage.entity.BigStorageCageDetails; import com.mes.bigstorage.service.BigStorageCageDetailsService; import io.swagger.annotations.ApiModel; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -21,7 +20,7 @@ * @author zhoush * @since 2024-03-27 */ @ApiModel(description = "理片笼详情") @Api(description = "理片笼详情") @RestController @RequestMapping("/bigStorageCageDetails") public class BigStorageCageDetailsController { hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/BigStorageCage.java
@@ -3,7 +3,7 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import io.swagger.annotations.ApiModel; import io.swagger.annotations.Api; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; @@ -19,7 +19,7 @@ * @author zhoush * @since 2024-03-27 */ @ApiModel(description = "<p> 大理片笼 </p>") @Api(description = "大理片笼") @Data @EqualsAndHashCode(callSuper = false) public class BigStorageCage implements Serializable { hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/BigStorageCageDetails.java
@@ -2,22 +2,22 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import java.io.Serializable; import io.swagger.annotations.ApiModel; import io.swagger.annotations.Api; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import java.io.Serializable; /** * <p> * * * </p> * * @author zhoush * @since 2024-03-27 */ @ApiModel(description = "<p> 大理片笼详情 </p>") @Api(description = "大理片笼详情") @Data @EqualsAndHashCode(callSuper = false) public class BigStorageCageDetails implements Serializable { hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/controller/BigStorageCageFeedTaskController.java
@@ -3,7 +3,7 @@ import com.mes.bigstoragetask.entity.BigStorageCageFeedTask; import com.mes.bigstoragetask.service.BigStorageCageFeedTaskService; import io.swagger.annotations.ApiModel; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; @@ -20,7 +20,7 @@ * @author zhoush * @since 2024-04-16 */ @ApiModel("进片任务信息") @Api(description = "进片任务信息") @RestController @RequestMapping("/big-storage-cage-feed-task") public class BigStorageCageFeedTaskController { hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/controller/BigStorageCageOutTaskController.java
@@ -3,7 +3,7 @@ import com.mes.bigstoragetask.entity.BigStorageCageOutTask; import com.mes.bigstoragetask.service.BigStorageCageOutTaskService; import io.swagger.annotations.ApiModel; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; @@ -20,7 +20,7 @@ * @author zhoush * @since 2024-04-16 */ @ApiModel("出片任务信息") @Api(description = "出片任务信息") @RestController @RequestMapping("/big-storage-cage-out-task") public class BigStorageCageOutTaskController { hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/application.yml
@@ -31,4 +31,7 @@ mybatis-plus: mapper-locations: classpath*:mapper/*.xml configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl log-impl: org.apache.ibatis.logging.stdout.StdOutImpl test: common: 123789 hangzhoumesParent/moduleService/LoadGlassModule/src/test/java/com/mes/ApplicationTest.java
@@ -1,7 +1,11 @@ package com.mes; import com.mes.common.utils.UserInfoUtils; import com.mes.menu.entity.SysMenu; import com.mes.menu.service.SysMenuService; import com.mes.pp.entity.OptimizeDetail; import com.mes.pp.service.OptimizeDetailService; import com.mes.userinfo.entity.SysUser; import lombok.extern.slf4j.Slf4j; import org.junit.Test; import org.junit.runner.RunWith; @@ -25,6 +29,18 @@ @Resource OptimizeDetailService optimizationDetailService; @Resource SysMenuService service; @Test public void test1() { SysUser user = new SysUser(); user.setId(1l); UserInfoUtils.set(user); List<SysMenu> menuTree = service.getMenuTree(null); System.out.println("获取记录数:" + menuTree); } @Test public void test() { List<OptimizeDetail> list = optimizationDetailService.list(); hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downstorage/controller/DownStorageCageDetailsController.java
@@ -11,7 +11,7 @@ import java.util.List; import java.util.Map; @Api(tags = "缓存") @Api(description = "缓存") @RestController @RequestMapping("/downStorage") public class DownStorageCageDetailsController { hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downstorage/entity/DownStorageCage.java
@@ -2,7 +2,7 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import io.swagger.annotations.ApiModel; import io.swagger.annotations.Api; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; @@ -17,7 +17,7 @@ * @author zhoush * @since 2024-03-27 */ @ApiModel(description = "<p> 缓存</p>") @Api(description = "缓存") @Data @EqualsAndHashCode(callSuper = false) public class DownStorageCage implements Serializable { hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downworkstation/controller/DownWorkstationController.java
@@ -25,7 +25,7 @@ */ @RestController @Api(tags = "工位") @Api(description = "工位") @RequestMapping("/downWorkStation") public class DownWorkstationController { hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downworkstation/entity/DownWorkstationTask.java
@@ -5,9 +5,6 @@ import lombok.Data; import lombok.EqualsAndHashCode; import org.springframework.data.annotation.Id; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; //import javax.persistence.Id; import java.io.Serializable; @@ -29,11 +26,7 @@ * id */ @TableId(value = "id", type = IdType.AUTO) @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; /**