<param name="root">Field</param>Action的值与前台获取不对

本文讨论了JSON字符串中下级属性名称与Field冲突的情况,并提供了通过修改Field名称来解决问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原因是json字符串里面有下级属性有名称和Field一样,action通过“root”查找最下级Field名字匹配直接json化这个下级属性了。

改掉Field名字即可

//classDiagram // class Bancai { // Integer id // Caizhi caizhi // Mupi mupi1 // Mupi mupi2 // Double houdu // Kucun kucun // } // // class Caizhi { // String name // List~Bancai~ bancai // } // // class Mupi { // String name // Boolean you // List~Bancai~ bancaisForMupi1 // List~Bancai~ bancaisForMupi2 // } // // class Chanpin { // String bianhao // List~Chanpin_zujian~ chanpin_zujian // List~Dingdan_chanpin~ dingdan_chanpin // } // // class Zujian { // String name // List~Chanpin_zujian~ chanping_zujian // } // // class Chanpin_zujian { // Bancai bancai // Double one_howmany // Double zujianshu // } // // class Dingdan { // String number // Date xiadan // Date jiaohuo // List~Dingdan_chanpin~ dingdan_chanpin // } // // class Dingdan_chanpin { // Integer shuliang // } // // class Kucun { // Integer shuliang // Dingdan reservedOrder // } // // class Jinhuo { // Integer shuliang // Date date // } // // class User { // String name // String andy // String pass // int role // } // // Bancai "1" -- "1" Caizhi // Bancai "1" -- "1" Mupi : mupi1 // Bancai "1" -- "1" Mupi : mupi2 // Bancai "1" -- "1" Kucun // Caizhi "1" -- "*" Bancai // Mupi "1" -- "*" Bancai : mupi1 // Mupi "1" -- "*" Bancai : mupi2 // Chanpin "1" -- "*" Chanpin_zujian // Chanpin "1" -- "*" Dingdan_chanpin // Zujian "1" -- "*" Chanpin_zujian // Chanpin_zujian "1" -- "1" Bancai // Dingdan "1" -- "*" Dingdan_chanpin // Dingdan_chanpin "1" -- "1" Chanpin // Kucun "0..1" -- "1" Dingdan : reservedOrder // Jinhuo "1" -- "1" Dingdan_bancai // Jinhuo "1" -- "1" User function resolveDataReferences(data) { // 获取 data 对象的所有顶层键 const keys = Object.keys(data); // 遍历每个顶层键(如 users, posts 等) for (const key of keys) { const entities = data[key]; // 遍历该顶层键下的每个实体(如每个 user 或 post) for (const entity of entities) { // 遍历实体的每个属性 for (const attribute in entity) { if (entity?.hasOwnProperty(attribute)) { var trpe=attribute?.replace(/\d/g, ''); // 确保属性属于当前实体 if (Array.isArray(entity[attribute])) { if(data[trpe]==null){ trpe+="s" } // 如果属性是一个数组,则将数组中的每个 ID 替换为对应的实际对象 entity[attribute] = entity[attribute].map(item => data[trpe ]?.find(updateItem => updateItem.id === item.id) || item ); } else if (typeof entity[attribute] === "object" && entity[attribute] !== null) { // 如果属性是一个对象,则将其替换为对应的实际对象 entity[attribute] = data[trpe + "s"]?.find(updateItem => updateItem.id === entity[attribute].id); } } } } } console.log(data) return data; } /** * 数据管理器类,负责后端API通信并管理数据 */ class DataManager { constructor(baseUrl) { this.baseUrl = baseUrl; this.data = { bancais: [], dingdans: [], mupis: [], chanpins: [], kucuns: [], dingdan_bancais:[], chanpin_zujians: [], zujians: [], caizhis: [], dingdan_chanpins: [], users: [], jinhuos: [] }; this.isSyncing = false; this.lastSync = null; this.callbacks = { all: [], bancais: [], dingdan: [], mupi: [], chanpin: [], kucun: [], chanpin_zujian: [], dingdan_bancai:[], zujian: [], caizhi: [], dingdan_chanpin: [], user: [], jinhuo: [] }; this.syncQueue = Promise.resolve(); } /** * 获取所有数据 * @returns {Promise<boolean>} 是否成功 */ async fetchAll() { console.log(this) try { const response = await fetch(`${this.baseUrl}/app/all`); if (!response.ok) throw new Error('Network response was not ok'); const result = await response.json(); if (result.status !== 200) throw new Error(result.text || 'API error'); const resolvedData = resolveDataReferences(result.data); // 更新本地数据 Object.keys(this.data).forEach(key => { if (resolvedData[key]) { this.data[key] = resolvedData[key]; } }); this.lastSync = new Date(); // 关键改进:数据更新后触发刷新回调 this.triggerCallbacks('refresh', 'all', this.data); return true; } catch (error) { console.error('Fetch error:', error); // 触发错误回调 this.triggerCallbacks('fetch_error', 'all', { error }); return false; } } /** * 注册回调函数 * @param {string} entity - 实体类型(如'bancai')或'all'表示全局回调 * @param {Function} callback - 回调函数,参数为(operation, data) */ registerCallback(entity, callback) { if (!this.callbacks[entity]) { this.callbacks[entity] = []; } this.callbacks[entity].push(callback); } /** * 移除回调函数 * @param {string} entity - 实体类型单数性质 * @param {Function} callback - 要移除的回调函数 */ unregisterCallback(entity, callback) { if (!this.callbacks[entity]) return; const index = this.callbacks[entity].indexOf(callback); if (index !== -1) { this.callbacks[entity].splice(index, 1); } } /** * 触发回调 * @param {string} operation - 操作类型('add', 'update', 'delete') * @param {string} entity - 实体类型单数性质 * @param {Object} data - 相关数据 */ triggerCallbacks(operation, entity, data) { // 触发全局回调 this.callbacks.all.forEach(cb => cb(operation, entity, data)); // 触发特定实体回调 if (this.callbacks[entity]) { this.callbacks[entity].forEach(cb => cb(operation, data)); } } /** * 执行CRUD操作并触发回调 */ async crudOperation(operation, entity, data) { try { const response = await fetch(`${this.baseUrl}/app/${operation}/${entity}`, { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify(data) }); if (!response.ok) throw new Error('Network response was not ok'); const result = await response.json(); if (result.status !== 200) throw new Error(result.text || 'API error'); // 自动同步数据 this.syncData(); // 触发操作成功的回调 this.triggerCallbacks(operation, entity, data); return result; } catch (error) { console.error('CRUD error:', error); // 触发操作失败的回调 this.triggerCallbacks(`${operation}_error`, entity, { data, error: error.message }); throw error; } } /** * 执行CRUD操作 * @param {string} operation - 'add', 'delete', 'update' * @param {string} entity - 实体名称单数性质(小写) * @param {Object} data - 要发送的数据 后端要求数据格式为{属性: "", 关联对象: {id:0}, 关联对象集: [{id:0}]} * @returns {Promise<Object>} 响应结果 */ async crudOperation(operation, entity, data) { try { const response = await fetch(`${this.baseUrl}/app/${operation}/${entity}`, { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify(data) }); if (!response.ok) throw new Error('Network response was not ok'); const result = await response.json(); if (result.status !== 200) throw new Error(result.text || 'API error'); // 自动同步数据 this.syncQueue = this.syncQueue.then(async () => { await this.syncData(); // 同步完成后触发操作回调 this.triggerCallbacks(operation, entity, data); }); return result; } catch (error) { console.error('CRUD error:', error); // 触发操作失败的回调 this.triggerCallbacks(`${operation}_error`, entity, { data, error: error.message }); throw error; } } /** * 自动同步数据(防止频繁请求) */ async syncData() { if (this.isSyncing) { this.pendingSync = true; return; } this.isSyncing = true; try { await this.fetchAll(); } catch (error) { console.error('Sync failed:', error); } finally { this.isSyncing = false; // 处理等待中的同步请求 if (this.pendingSync) { this.pendingSync = false; setTimeout(() => this.syncData(), 1000); } } } /** * 添加实体 * @param {string} entity - 实体名称单数性质 * @param {Object} data - 实体数据 */ async addEntity(entity, data) { return this.crudOperation('add', entity, data); } /** * 更新实体 * @param {string} entity - 实体名称单数性质 * @param {Object} data - 实体数据(必须包含id) */ async updateEntity(entity, data) { return this.crudOperation('update', entity, data); } /** * 删除实体 * @param {string} entity - 实体名称单数性质 * @param {number} id - 实体ID */ async deleteEntity(entity, id) { return this.crudOperation('delete', entity, {id}); } /** * 新增方法:手动触发数据刷新 */ async refreshData() { return this.syncQueue = this.syncQueue.then(() => this.syncData()); } } export { DataManager }; // 创建单例实例 //const dataManager = new DataManager('http://127.0.0.1:8080/KuCun2'); //// 初始化时获取所有数据 //dataManager.fetchAll().then(() => { // console.log('Initial data loaded'); //}); // 导出数据对象,外部可以直接访问 data.bancais, data.dingdans 等 //export const data = dataManager.data; //// 导出操作方法 //export const addEntity = dataManager.addEntity.bind(dataManager); //export const updateEntity = dataManager.updateEntity.bind(dataManager); //export const deleteEntity = dataManager.deleteEntity.bind(dataManager); //export const fetchAll = dataManager.fetchAll.bind(dataManager);<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>板材库存查询系统</title> <!-- 引入外部CSS --> <link rel="stylesheet" href="../css/dingdan.css"> <!-- 引入jQuery --> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <!-- 引入Bootstrap --> <link href="../js/bootstrap-5.3.0-alpha1-dist/css/bootstrap.min.css" rel="stylesheet"> <script src="../js/bootstrap-5.3.0-alpha1-dist/umd/popper.min.js"></script> <script src="../js/bootstrap-5.3.0-alpha1-dist/js/bootstrap.min.js"></script> <!-- 引入Bootstrap Icons --> <link rel="stylesheet" href="../js/bootstrap-icons-1.8.1/bootstrap-icons.css"> <!-- 引入主JS文件 --> <script src="../js/main.js"></script> </head> <body> <div class="container py-4"> <!-- 标题部分 --> <div class="text-center mb-4"> <h1 class="text-primary"><i class="bi bi-boxes"></i> 板材库存管理系统</h1> <p class="text-muted">查询订单、产品、板材及库存信息</p> </div> <!-- 统计卡片 --> <div class="row mb-4"> <div class="col-md-3"> <div class="card stats-card border-primary"> <div class="card-body"> <h5 class="card-title">订单总数</h5> <p class="card-text fs-3 text-primary" id="orderCount">0</p> </div> </div> </div> <div class="col-md-3"> <div class="card stats-card border-info"> <div class="card-body"> <h5 class="card-title">产品种类</h5> <p class="card-text fs-3 text-info" id="productCount">0</p> </div> </div> </div> <div class="col-md-3"> <div class="card stats-card border-success"> <div class="card-body"> <h5 class="card-title">板材库存</h5> <p class="card-text fs-3 text-success" id="materialCount">0</p> </div> </div> </div> <div class="col-md-3"> <div class="card stats-card border-warning"> <div class="card-body"> <h5 class="card-title">库存总量</h5> <p class="card-text fs-3 text-warning" id="totalStock">0</p> </div> </div> </div> </div> <!-- 搜索区域 --> <div class="card search-section mb-4"> <div class="card-header"> <h5 class="mb-0"><i class="bi bi-search me-2"></i>高级搜索</h5> </div> <div class="card-body"> <div class="row g-3"> <!-- 订单搜索 --> <div class="col-md-4"> <div class="search-control"> <i class="bi bi-clipboard-search search-icon"></i> <input type="text" class="form-control with-icon" id="orderSearch" placeholder="搜索订单号..." aria-label="订单号搜索"> </div> </div> <!-- 产品搜索 --> <div class="col-md-4"> <div class="search-control"> <i class="bi bi-grid search-icon"></i> <input type="text" class="form-control with-icon" id="productSearch" placeholder="搜索产品编号..." aria-label="产品编号搜索"> </div> </div> <!-- 板材搜索 --> <div class="col-md-4"> <div class="search-control"> <i class="bi bi-box search-icon"></i> <input type="text" class="form-control with-icon" id="materialSearch" placeholder="搜索板材ID或材质..." aria-label="板材搜索"> </div> </div> <!-- 木皮搜索 --> <div class="col-md-4"> <div class="search-control"> <i class="bi bi-tree search-icon"></i> <input type="text" class="form-control with-icon" id="woodSearch" placeholder="搜索木皮名称..." aria-label="木皮搜索"> </div> </div> <!-- 厚度搜索 --> <div class="col-md-4"> <div class="search-control"> <i class="bi bi-arrows-vertical search-icon"></i> <input type="number" class="form-control with-icon" id="thicknessSearch" placeholder="厚度(mm)" min="0" step="0.1"> </div> </div> <!-- 库存范围搜索 --> <div class="col-md-4"> <div class="input-group"> <span class="input-group-text"><i class="bi bi-box"></i></span> <input type="number" class="form-control" id="minStock" placeholder="最小库存" min="0"> <input type="number" class="form-control" id="maxStock" placeholder="最大库存" min="0"> <button class="btn btn-primary" type="button" id="stockStatusBtn"> <i class="bi bi-search"></i> </button> </div> </div> </div> </div> </div> <!-- 结果区域 --> <div class="card"> <div class="card-header d-flex justify-content-between align-items-center"> <h5 class="mb-0"><i class="bi bi-table me-2"></i>查询结果</h5> <div class="text-secondary"> <span id="resultCount">0</span> 条记录 <span class="ms-2"><i class="bi bi-info-circle"></i> <small>实时数据更新时间: <span id="lastUpdate">--:--:--</span></small></span> </div> </div> <div class="card-body result-section"> <div class="table-responsive"> <table class="table table-hover" id="resultsTable"> <thead class="table-light sticky-top"> <tr> <th data-sortable>订单号 <span class="sort-indicator"></span></th> <th data-sortable>产品信息 <span class="sort-indicator"></span></th> <th data-sortable>产品数量 <span class="sort-indicator"></span></th> <th data-sortable>组件 <span class="sort-indicator"></span></th> <th data-sortable>板材 <span class="sort-indicator"></span></th> <th data-sortable>单件用量 <span class="sort-indicator"></span></th> <th data-sortable>订单用量 <span class="sort-indicator"></span></th> <th data-sortable>库存数量 <span class="sort-indicator"></span></th> <th>操作</th> </tr> </thead> <tbody id="resultBody"> <!-- 数据加载中 --> <tr id="loadingRow"> <td colspan="9" class="text-center py-5"> <div class="d-flex align-items-center justify-content-center"> <div class="spinner-border text-primary" role="status"> <span class="visually-hidden">加载中...</span> </div> <div class="ms-3">正在加载数据,请稍候...</div> </div> </td> </tr> </tbody> </table> </div> <!-- 空结果提示 --> <div id="noResults" class="no-results text-center py-5" style="display: none;"> <div> <i class="bi bi-inboxes text-muted" style="font-size: 3rem;"></i> <h4 class="mt-3 text-muted">没有找到匹配的记录</h4> <p class="text-muted">请尝试调整您的搜索条件</p> </div> </div> </div> </div> </div> <!-- 引入订单JS --> <script src="../js/test.js"></script> </body> </html> 实现页面功能,DataManager.js已经在父级页面加载过了,直接到父级调用, 业务基本逻辑 一个订单有很多产品不同数量,每个产品可以再很多订单中,一个产品有很多组件,一个组件可以在很多产品中,因为每个组件因为在不同的产品中有不同的生产工艺,所以使用不同的板材和板材能生产组件数量,每个板材有不同的材质和两面木皮,木皮表面可能有油漆, 订购时可能直接购入板材,也可能按订单和产品订购板材,也用可能按订单产品组件订购板材,每次采购不标准,一个订单可能订购几次,用户有姓名 账号 密码 权限, 一个记录进货和消耗,查看的时候会查看订单下有多少板材可用
06-24
@{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Index</title> <link href="~/Scripts/layui/css/layui.css" rel="stylesheet" /> <script src="~/Scripts/layui/layui.js"></script> <script src="~/Scripts/jquery-3.4.1.js"></script> <style> body { padding: 10px 20px 20px 20px; width: 90% } .editInfo { display: none; } .addeditInfo { display: none; } .editnewInfo { display: none; } </style> </head> <body> <fieldset class="layui-elem-field"> <legend> <span class="layui-breadcrumb"> <a href="/Home/Index">首页</a> <a href="/JobManagem/Index">菜单管理</a> </span> </legend> <div class="layui-field-box"> <div class="layui-form-item"> <div class="layui-inline"> <label class="layui-form-label" style="width:90px;">菜单名称</label> <div class="layui-input-block" style="margin-left:120px"> <input type="text" name="eumname" id="name" autocomplete="off" class="layui-input"> </div> </div> <button type="button" class="layui-btn layui-btn but" style=" margin-bottom: 4px;" id="searchButton" onclick="Search()"><i class="layui-icon layui-icon-search"></i>查询</button> <button type="button" class="layui-btn layui-bg-blue but" style=" margin-bottom: 4px;" onclick="Add()"><i class="layui-icon layui-icon-addition"></i>添加</button> </div> </div> </fieldset> <table class="layui-hide" id="ID-treeTable-demo" lay-filter="test"></table> <script type="text/html" id="TPL-treeTable-demo-tools"> <div class="layui-btn-container"> <a class="layui-btn layui-btn-warm layui-btn-xs" lay-event="add"><i class="layui-icon layui-icon-add-circle"></i>新增</a> <a class="layui-btn layui-bg-blue layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a> <a class="layui-btn layui-bg-red layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a> </div> </script> <div class="editInfo"> <form class="layui-form layui-form-pane addorgfrom" action="" lay-filter="demo-val-filter"> <input type="hidden" name="ID" /> <div class="layui-form-item"> <label class="layui-form-label" style="width:130px">模块名称</label> <div class="layui-input-block"> <input type="text" name="menuname" autocomplete="off" placeholder="请输入组织模块名称" lay-verify="required" class="layui-input" style="width:87%"> </div> </div> <div class="layui-form-item"> <label class="layui-form-label" style="width:130px">模块代码</label> <div class="layui-input-block"> <input type="text" name="menucode" autocomplete="off" placeholder="请输入组织模块代码" lay-verify="required" class="layui-input" style="width:87%"> </div> </div> <div class="layui-form-item" style="text-align:center" id="but"> <div class="layui-input-block" style="margin-left:-53px;padding:10px"> <button type="submit" class="layui-btn" lay-submit lay-filter="demo1" style="margin:10px">保存</button> <button type="reset" class="layui-btn layui-btn-primary" style="margin-left:30px;">重置</button> </div> </div> </form> </div> @*表格内的新增,编辑*@ <div class="addeditInfo"> <form class="layui-form layui-form-pane addform" action="" lay-filter="demo-val-filter"> <input type="hidden" name="ID" /> <input type="hidden" name="ParentId" /> <div class="layui-form-item"> <label class="layui-form-label" style="width:130px">上一级菜单名称</label> <div class="layui-input-block"> <input type="text" name="modulename" autocomplete="off" disabled="disabled" placeholder="请输入模块名称" lay-verify="required" class="layui-input" style="width:87%"> </div> </div> <div class="layui-form-item"> <label class="layui-form-label" style="width:130px">上一级菜单代码</label> <div class="layui-input-block"> <input type="text" name="modulecode" autocomplete="off" disabled="disabled" placeholder="请输入模块代码" lay-verify="required" class="layui-input" style="width:87%"> </div> </div> <div class="layui-form-item"> <label class="layui-form-label" style="width:120px">当前级别</label> <div class="layui-input-block" style="margin-left: 121px;width:289px"> <select name="Type" lay-verify="required" disabled="disabled"> <option value="">请选择级别</option> <option value="0">菜单</option> <option value="1">其他</option> </select> </div> </div> <div class="layui-form-item"> <label class="layui-form-label" style="width:120px">模块名称</label> <div class="layui-input-block"> <input type="text" name="newname" autocomplete="off" placeholder="请输入模块名称" lay-verify="required" class="layui-input" style="width:90%"> </div> </div> <div class="layui-form-item"> <label class="layui-form-label" style="width:120px">模块代码</label> <div class="layui-input-block"> <input type="text" name="newcode" autocomplete="off" placeholder="请输入模块代码" lay-verify="required" class="layui-input" style="width:90%"> </div> </div> <div class="layui-form-item" style="text-align:center" id="but"> <div class="layui-input-block" style="margin-left:-53px;padding:10px"> <button type="submit" class="layui-btn" lay-submit lay-filter="demo2" style="margin:10px">保存</button> <button type="reset" class="layui-btn layui-btn-primary" style="margin-left:30px;">重置</button> </div> </div> </form> </div> <script> var SearchtreeTable; layui.use(['form', 'table'], function () { var table = layui.table; var treeTable = layui.treeTable; var layer = layui.layer; var form = layui.form; // 渲染 var inst = treeTable.render({ elem: '#ID-treeTable-demo', url: '/ResourceManage/GetList', // 此处为静态模拟数据,实际使用时需换成真实接口 cols: [[ { type: 'checkbox', }, { field: 'ID', title: 'ID', hide: true }, // 隐藏但保留数据 { field: 'ParentId', title: '父ID', hide: true }, // 隐藏但保留数据 { field: 'name', title: '模块名称', width: '20%', }, { field: 'ModuleCode', title: '模块代码', width: '20%', sort: true }, { field: 'Type', title: '级别', width: '20%', sort: true, templet: function (d) { switch (d.Type) { case 0: return "菜单"; break; case 1: return "其他"; break; default: return "其他"; break; } } }, { field: 'Url', title: '链接', width: '15%', sort: true }, { title: "操作", width: '21.5%', align: "center", toolbar: "#TPL-treeTable-demo-tools" } ]], tree: { iconIndex: 1, // 图标显示在第 2 列(对应“组织机构名称”列,索引从 0 开始) isParent: 'isParent', // 绑定后台的 `isParent` 字段(标识是否有子节点) // 删除 async 配置!后台已返回完整 children 数组,无需异步加载 }, page: true }); SearchtreeTable = inst; //新增,编辑,删除 table.on('tool(test)', function (obj) { // 双击 toolDouble var data = obj.data; // 获得当前行数据 // console.log(obj) if (obj.event === 'add') { //新增子集 layer.open({ type: 1, // page 层类型 area: ['550px', '480px'], title: '新增资源模块', shade: 0.6, // 遮罩透明度 shadeClose: false, // 点击遮罩区域,关闭弹层 maxmin: false, // 允许全屏最小化 anim: 0, // 0-6 的动画形式,-1 不开启 content: $(".addeditInfo").html() }); //赋 form.val('demo-val-filter', { "modulename": data.name, "modulecode": data.ModuleCode, "Type": data.Type, "ID": null, "ParentId": data.ID }); } else if (obj.event === 'edit') { //编辑 //修改编辑职位 layer.open({ type: 1, area: ['550px', '480px'], title: '编辑资源模块', shade: 0.6, // 遮罩透明度 shadeClose: false, // 点击遮罩区域,关闭弹层 maxmin: false, // 允许全屏最小化 anim: 0, // 0-6 的动画形式,-1 不开启 content: $('.addeditInfo').html(), success: function () { $.ajax({ url: '/ResourceManage/GetEditData', data: { nodeId: data.ID }, success: function (res) { // 填充数据,处理父节点不存在的情况 form.val('demo-val-filter', { "modulename": res.parentName || data.name, // 父节点不存在时显示自身名称 "modulecode": res.parentCode || data.ModuleCode, // 父节点不存在时显示自身代码 "Type": data.Type, "newname": data.name, "newcode": data.ModuleCode, "ID": res.ID, "ParentId": res.parentID }); } }); } }); } else { layer.confirm('真的删除行 [' + data.name + '] 么', function (index) { obj.del(); // 删除对应行(tr)的DOM结构 layer.close(index); // 向服务端发送删除指令 $.ajax({ url: '/ResourceManage/DelInfo', type: 'post', data: { id: data.ID }, success: function (res) { if (res.code == 0) { layer.msg(res.msg, { icon: 6, time: 1500 }, function () { Search(); }) } else { layer.msg(res.msg, { icon: 5, time: 1500 }) } } }) }); } }); // 提交事件 form.on('submit(demo1)', function (data) { var field = data.field; // 获取表单字段 // 此处可执行 Ajax 等操作 $.ajax({ url: '/ResourceManage/Add', type: 'post', data: field, success: function (res) { if (res.code == 0) { layer.msg(res.msg, { icon: 6, time: 3000 }, function () { layer.closeAll(); // 关闭所有类型的层 Search(); }); } else { layer.msg(res.msg, { icon: 5, time: 2000 }); } } }) return false; // 阻止默认 form 跳转 }); // 提交事件 form.on('submit(demo2)', function (data) { var field = data.field; // 获取表单字段 var leve = data.leve; var ID = data.ID; var ParentId = data.ParentId; // 此处可执行 Ajax 等操作 $.ajax({ url: '/ResourceManage/AddTreeInfo', type: 'post', data: { newname: field.newname, newcode: field.newcode, Type: field.Type, ID: field.ID, pid: field.ParentId }, success: function (res) { if (res.code == 0) { layer.msg(res.msg, { icon: 6, time: 3000 }, function () { layer.closeAll(); // 关闭所有类型的层 Search(); }); } else { layer.msg(res.msg, { icon: 5, time: 2000 }); } } }) return false; // 阻止默认 form 跳转 }); }); //重载,模糊查询 //重载,模糊查询 function Search() { var nameVal = $('input[name="eumname"]').val().trim(); // 完整重载 - 所有属性属性(options)均可参到重载中 SearchtreeTable.reload({ where: { // 传递数据异步请求时携带的字段 eumname: nameVal, }, }); } //添加 function Add() { // 在此处输入 layer 的任意代码 layer.open({ type: 1, // page 层类型 area: ['550px', '350px'], title: '新增资源模块', shade: 0.6, // 遮罩透明度 shadeClose: true, // 点击遮罩区域,关闭弹层 maxmin: true, // 允许全屏最小化 anim: 0, // 0-6 的动画形式,-1 不开启 content: $(".editInfo").html() }); } </script> </body> </html> using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using System.Web; using System.Web.Mvc; using WebApplication1.Models; namespace WebApplication1.Controllers { [LoginActionFitter] public class ResourceManageController : Controller { AoutEntities1 db = new AoutEntities1(); ReturnJsonData jsonData = new ReturnJsonData(); ReturnListJsonData orgTreeList = new ReturnListJsonData(); // GET: public ActionResult Index() { return View(); } #region 查询 /// <summary> /// 模糊查询 /// </summary> /// <param name="page"></param> /// <param name="limit"></param> /// <param name="orgname"></param> /// <returns></returns> public ActionResult GetList(int page, int limit, string eumname) { //返回树形表格 List<object> retultlist = new List<object>(); //第一步 查找所有的一级菜单 var list = db.SystemResourceModule.Where(a => a.ParentId == Guid.Empty).ToList(); if (!string.IsNullOrEmpty(eumname)) { list = db.SystemResourceModule.Where(a => a.ModuleName.Contains(eumname)).ToList(); foreach (var itme in list) { ReturnMenuListData obj = new ReturnMenuListData(); obj.ID = itme.ID; obj.ParentId = itme.ParentId; obj.name = itme.ModuleName; obj.ModuleCode = itme.ModuleCode; obj.Url = itme.Url; obj.Type = itme.Type; obj.CreateDate = itme.CreateDate; obj.ModifyDate = itme.ModifyDate; //验证是否还有有子集 obj.isParent = false; obj.children = null; retultlist.Add(obj); } } else { list = db.SystemResourceModule.Where(a => a.ParentId == Guid.Empty).ToList(); //循环 foreach (var itme in list) { ReturnMenuListData obj = new ReturnMenuListData(); obj.ID = itme.ID; obj.ParentId = itme.ParentId; obj.name = itme.ModuleName; obj.ModuleCode = itme.ModuleCode; obj.Url = itme.Url; obj.Type = itme.Type; obj.CreateDate = itme.CreateDate; obj.ModifyDate = itme.ModifyDate; //验证是否还有有子集 obj.isParent = db.SystemResourceModule.Where(a => a.ParentId == itme.ID).ToList().Count > 0 ? true : false; if (obj.isParent == true) { //查找所以子集 obj.children = BuildTree(list, itme.ID); } retultlist.Add(obj); } } orgTreeList.code = 0; orgTreeList.count = list.Count; orgTreeList.data = retultlist; return Json(orgTreeList, JsonRequestBehavior.AllowGet); } #endregion #region 递归调用 /// <summary> /// 递归调用 /// </summary> /// <param name="list"></param> /// <param name="ID"></param> /// <returns></returns> private List<object> BuildTree(List<SystemResourceModule> list, Guid ID) { List<object> Treelist = new List<object>(); List<SystemResourceModule> childList = db.SystemResourceModule.Where(a => a.ParentId == ID).ToList(); //循环 foreach (var itme in childList) { ReturnMenuListData obj = new ReturnMenuListData(); obj.ID = itme.ID; obj.ParentId = itme.ParentId; obj.name = itme.ModuleName; obj.ModuleCode = itme.ModuleCode; obj.Url = itme.Url; obj.CreateDate = itme.CreateDate; obj.ModifyDate = itme.ModifyDate; obj.isParent = db.SystemResourceModule.Where(a => a.ParentId == itme.ID).ToList().Count > 0 ? true : false; obj.children = BuildTree(childList, itme.ID); Treelist.Add(obj); } return Treelist; } #endregion #region 查询父级及子集信息 public ActionResult GetEditData(Guid nodeId) { var current = db.SystemResourceModule.Find(nodeId); if (current == null) return Json(new { success = false }); // 总公司的ParentId为null或自身(假设总公司ParentId=0或null) var isRoot = current.ParentId == null || current.ParentId == Guid.Empty; var parent = isRoot ? current : db.SystemResourceModule.Find(current.ParentId); return Json(new { parentName = parent.ModuleName, parentCode = parent.ModuleCode, Type = current.Type, orgName = current.ModuleName, orgCode = current.ModuleCode, ID = current.ID, parentID = current.ParentId, }, JsonRequestBehavior.AllowGet); } #endregion #region 删除 /// <summary> /// 删除操作 /// </summary> /// <param name="id"></param> /// <returns></returns> public ActionResult DelInfo(Guid? id) { if (id == null) { jsonData.code = 1; jsonData.msg = "删除失败,未找到当行数据"; } else { //删除 var entity = db.SystemResourceModule.Find(id); if (entity == null) { jsonData.code = 1; jsonData.msg = "删除失败,未找到当前行数据"; } else { db.SystemResourceModule.Remove(entity); var result = db.SaveChanges(); if (result > 0) { jsonData.code = 0; jsonData.msg = "删除成功"; } else { jsonData.code = 1; jsonData.msg = "删除失败,请联系管理员"; } } } return Json(jsonData, JsonRequestBehavior.AllowGet); } #endregion #region 新增菜单 /// <summary> /// 新增,修改 /// </summary> /// <returns></returns> public ActionResult Add(SystemResourceModule org, string menuname, string menucode) { org.ModuleName = menuname; org.ModuleCode = menucode; org.ID = Guid.NewGuid(); org.Type = 0; org.ParentId = Guid.Empty; org.CreateDate = DateTime.Now; org.ModifyDate = DateTime.Now; db.SystemResourceModule.Add(org); var result = db.SaveChanges(); if (result > 0) { jsonData.code = 0; jsonData.msg = "新增资源模块成功"; } else { jsonData.code = 1; jsonData.msg = "新增失败,请联系管理员"; } return Json(jsonData, JsonRequestBehavior.AllowGet); } #endregion #region 新增修改 /// <summary> /// 新增,修改 /// </summary> /// <returns></returns> public ActionResult AddTreeInfo(string newname, string newcode, int? Type, Guid? ID, Guid pid) { if (ID == null || ID == Guid.Empty) { // 新增逻辑:parentId为父节点ID(新增时需传递) var newOrg = new SystemResourceModule { ID = Guid.NewGuid(), ParentId = pid, ModuleName = newname, ModuleCode = newcode, Type = Type + 1, CreateDate = DateTime.Now, ModifyDate = DateTime.Now }; db.SystemResourceModule.Add(newOrg); } else { // 编辑逻辑:通过ID查找当前行(确保是当前行,而非总公司,依赖ID唯一性) var entity = db.SystemResourceModule.Find(ID); if (entity != null) { entity.ModuleName = newname; entity.ModuleCode = newcode; entity.ModifyDate = DateTime.Now; db.Entry(entity).State = EntityState.Modified; } } var result = db.SaveChanges(); if (result > 0) { jsonData.code = 0; jsonData.msg = "保存成功"; } else { jsonData.code = 1; jsonData.msg = "保存失败,请联系管理员"; } return Json(jsonData, JsonRequestBehavior.AllowGet); } #endregion } }检查错误
最新发布
07-16
@{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Index</title> <link href="~/Scripts/layui/css/layui.css" rel="stylesheet" /> <script src="~/Scripts/layui/layui.js"></script> <script src="~/Scripts/jquery-3.4.1.js"></script> <style> body { padding: 10px 20px 20px 20px; width: 90% } .editInfo { display: none; } .addeditInfo { display: none; } .editnewInfo { display: none; } </style> </head> <body> <fieldset class="layui-elem-field"> <legend> <span class="layui-breadcrumb"> <a href="/Home/Index">首页</a> <a href="/JobManagem/Index">菜单管理</a> </span> </legend> <div class="layui-field-box"> <div class="layui-form-item"> <div class="layui-inline"> <label class="layui-form-label" style="width:90px;">菜单名称</label> <div class="layui-input-block" style="margin-left:120px"> <input type="text" name="eumname" id="name" autocomplete="off" class="layui-input"> </div> </div> <button type="button" class="layui-btn layui-btn but" style=" margin-bottom: 4px;" id="searchButton" onclick="Search()"><i class="layui-icon layui-icon-search"></i>查询</button> <button type="button" class="layui-btn layui-bg-blue but" style=" margin-bottom: 4px;" onclick="Add()"><i class="layui-icon layui-icon-addition"></i>添加</button> </div> </div> </fieldset> <table class="layui-hide" id="ID-treeTable-demo" lay-filter="test"></table> <script type="text/html" id="TPL-treeTable-demo-tools"> <div class="layui-btn-container"> <a class="layui-btn layui-btn-warm layui-btn-xs" lay-event="add"><i class="layui-icon layui-icon-add-circle"></i>新增</a> <a class="layui-btn layui-bg-blue layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a> <a class="layui-btn layui-bg-red layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a> </div> </script> <div class="editInfo"> <form class="layui-form layui-form-pane addorgfrom" action="" lay-filter="demo-val-filter"> <input type="hidden" name="ID" /> <div class="layui-form-item"> <label class="layui-form-label" style="width:130px">模块名称</label> <div class="layui-input-block"> <input type="text" name="menuname" autocomplete="off" placeholder="请输入组织模块名称" lay-verify="required" class="layui-input" style="width:87%"> </div> </div> <div class="layui-form-item"> <label class="layui-form-label" style="width:130px">模块代码</label> <div class="layui-input-block"> <input type="text" name="menucode" autocomplete="off" placeholder="请输入组织模块代码" lay-verify="required" class="layui-input" style="width:87%"> </div> </div> <div class="layui-form-item" style="text-align:center" id="but"> <div class="layui-input-block" style="margin-left:-53px;padding:10px"> <button type="submit" class="layui-btn" lay-submit lay-filter="demo1" style="margin:10px">保存</button> <button type="reset" class="layui-btn layui-btn-primary" style="margin-left:30px;">重置</button> </div> </div> </form> </div> @*表格内的新增,编辑*@ <div class="addeditInfo"> <form class="layui-form layui-form-pane addform" action="" lay-filter="demo-val-filter"> <input type="hidden" name="ID" /> <input type="hidden" name="ParentId" /> <div class="layui-form-item"> <label class="layui-form-label" style="width:130px">上一级菜单名称</label> <div class="layui-input-block"> <input type="text" name="modulename" autocomplete="off" disabled="disabled" placeholder="请输入模块名称" lay-verify="required" class="layui-input" style="width:87%"> </div> </div> <div class="layui-form-item"> <label class="layui-form-label" style="width:130px">上一级菜单代码</label> <div class="layui-input-block"> <input type="text" name="modulecode" autocomplete="off" disabled="disabled" placeholder="请输入模块代码" lay-verify="required" class="layui-input" style="width:87%"> </div> </div> <div class="layui-form-item"> <label class="layui-form-label" style="width:120px">当前级别</label> <div class="layui-input-block" style="margin-left: 121px;width:289px"> <select name="Type" lay-verify="required" disabled="disabled"> <option value="">请选择级别</option> <option value="0">菜单</option> <option value="1">其他</option> </select> </div> </div> <div class="layui-form-item"> <label class="layui-form-label" style="width:120px">模块名称</label> <div class="layui-input-block"> <input type="text" name="newname" autocomplete="off" placeholder="请输入模块名称" lay-verify="required" class="layui-input" style="width:90%"> </div> </div> <div class="layui-form-item"> <label class="layui-form-label" style="width:120px">模块代码</label> <div class="layui-input-block"> <input type="text" name="newcode" autocomplete="off" placeholder="请输入模块代码" lay-verify="required" class="layui-input" style="width:90%"> </div> </div> <div class="layui-form-item" style="text-align:center" id="but"> <div class="layui-input-block" style="margin-left:-53px;padding:10px"> <button type="submit" class="layui-btn" lay-submit lay-filter="demo2" style="margin:10px">保存</button> <button type="reset" class="layui-btn layui-btn-primary" style="margin-left:30px;">重置</button> </div> </div> </form> </div> <script> var SearchtreeTable; layui.use(['form', 'table'], function () { var table = layui.table; var treeTable = layui.treeTable; var layer = layui.layer; var form = layui.form; // 渲染 var inst = treeTable.render({ elem: '#ID-treeTable-demo', url: '/ResourceManage/GetList', // 此处为静态模拟数据,实际使用时需换成真实接口 cols: [[ { type: 'checkbox', }, { field: 'ID', title: 'ID', hide: true }, // 隐藏但保留数据 { field: 'ParentId', title: '父ID', hide: true }, // 隐藏但保留数据 { field: 'name', title: '模块名称', width: '20%', }, { field: 'ModuleCode', title: '模块代码', width: '20%', sort: true }, { field: 'Type', title: '级别', width: '20%', sort: true, templet: function (d) { switch (d.Type) { case 0: return "菜单"; break; case 1: return "其他"; break; default: return "其他"; break; } } }, { field: 'Url', title: '链接', width: '15%', sort: true }, { title: "操作", width: '21.5%', align: "center", toolbar: "#TPL-treeTable-demo-tools" } ]], tree: { iconIndex: 1, // 图标显示在第 2 列(对应“组织机构名称”列,索引从 0 开始) isParent: 'isParent', // 绑定后台的 `isParent` 字段(标识是否有子节点) // 删除 async 配置!后台已返回完整 children 数组,无需异步加载 }, page: true }); SearchtreeTable = inst; //新增,编辑,删除 table.on('tool(test)', function (obj) { // 双击 toolDouble var data = obj.data; // 获得当前行数据 // console.log(obj) if (obj.event === 'add') { //新增子集 layer.open({ type: 1, // page 层类型 area: ['550px', '480px'], title: '新增资源模块', shade: 0.6, // 遮罩透明度 shadeClose: false, // 点击遮罩区域,关闭弹层 maxmin: false, // 允许全屏最小化 anim: 0, // 0-6 的动画形式,-1 不开启 content: $(".addeditInfo").html() }); //赋 form.val('demo-val-filter', { "modulename": data.name, "modulecode": data.ModuleCode, "Type": data.Type, "ID": null, "ParentId": data.ID }); } else if (obj.event === 'edit') { //编辑 //修改编辑职位 layer.open({ type: 1, area: ['550px', '480px'], title: '编辑资源模块', shade: 0.6, // 遮罩透明度 shadeClose: false, // 点击遮罩区域,关闭弹层 maxmin: false, // 允许全屏最小化 anim: 0, // 0-6 的动画形式,-1 不开启 content: $('.addeditInfo').html(), success: function () { $.ajax({ url: '/ResourceManage/GetEditData', data: { nodeId: data.ID }, success: function (res) { // 填充数据,处理父节点不存在的情况 form.val('demo-val-filter', { "modulename": res.parentName || data.name, // 父节点不存在时显示自身名称 "modulecode": res.parentCode || data.ModuleCode, // 父节点不存在时显示自身代码 "Type": data.Type, "newname": data.name, "newcode": data.ModuleCode, "ID": res.ID, "ParentId": res.parentID }); } }); } }); } else { layer.confirm('真的删除行 [' + data.name + '] 么', function (index) { obj.del(); // 删除对应行(tr)的DOM结构 layer.close(index); // 向服务端发送删除指令 $.ajax({ url: '/ResourceManage/DelInfo', type: 'post', data: { id: data.ID }, success: function (res) { if (res.code == 0) { layer.msg(res.msg, { icon: 6, time: 1500 }, function () { Search(); }) } else { layer.msg(res.msg, { icon: 5, time: 1500 }) } } }) }); } }); // 提交事件 form.on('submit(demo1)', function (data) { var field = data.field; // 获取表单字段 // 此处可执行 Ajax 等操作 $.ajax({ url: '/ResourceManage/Add', type: 'post', data: field, success: function (res) { if (res.code == 0) { layer.msg(res.msg, { icon: 6, time: 3000 }, function () { layer.closeAll(); // 关闭所有类型的层 Search(); }); } else { layer.msg(res.msg, { icon: 5, time: 2000 }); } } }) return false; // 阻止默认 form 跳转 }); // 提交事件 form.on('submit(demo2)', function (data) { var field = data.field; // 获取表单字段 var leve = data.leve; var ID = data.ID; var ParentId = data.ParentId; // 此处可执行 Ajax 等操作 $.ajax({ url: '/ResourceManage/AddTreeInfo', type: 'post', data: { newname: field.newname, newcode: field.newcode, Type: field.Type, ID: field.ID, pid: field.ParentId }, success: function (res) { if (res.code == 0) { layer.msg(res.msg, { icon: 6, time: 3000 }, function () { layer.closeAll(); // 关闭所有类型的层 Search(); }); } else { layer.msg(res.msg, { icon: 5, time: 2000 }); } } }) return false; // 阻止默认 form 跳转 }); }); //重载,模糊查询 //重载,模糊查询 function Search() { var nameVal = $('input[name="eumname"]').val().trim(); // 完整重载 - 所有属性属性(options)均可参到重载中 SearchtreeTable.reload({ where: { // 传递数据异步请求时携带的字段 eumname: nameVal, }, }); } //添加 function Add() { // 在此处输入 layer 的任意代码 layer.open({ type: 1, // page 层类型 area: ['550px', '350px'], title: '新增资源模块', shade: 0.6, // 遮罩透明度 shadeClose: true, // 点击遮罩区域,关闭弹层 maxmin: true, // 允许全屏最小化 anim: 0, // 0-6 的动画形式,-1 不开启 content: $(".editInfo").html() }); } </script> </body> </html> using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using System.Web; using System.Web.Mvc; using WebApplication1.Models; namespace WebApplication1.Controllers { [LoginActionFitter] public class ResourceManageController : Controller { AoutEntities1 db = new AoutEntities1(); ReturnJsonData jsonData = new ReturnJsonData(); ReturnListJsonData orgTreeList = new ReturnListJsonData(); // GET: public ActionResult Index() { return View(); } #region 查询 /// <summary> /// 模糊查询 /// </summary> /// <param name="page"></param> /// <param name="limit"></param> /// <param name="orgname"></param> /// <returns></returns> public ActionResult GetList(int page, int limit, string eumname) { //返回树形表格 List<object> retultlist = new List<object>(); //第一步 查找所有的一级菜单 var list = db.SystemResourceModule.Where(a => a.ParentId == Guid.Empty).ToList(); if (!string.IsNullOrEmpty(eumname)) { list = db.SystemResourceModule.Where(a => a.ModuleName.Contains(eumname)).ToList(); foreach (var itme in list) { ReturnMenuListData obj = new ReturnMenuListData(); obj.ID = itme.ID; obj.ParentId = itme.ParentId; obj.name = itme.ModuleName; obj.ModuleCode = itme.ModuleCode; obj.Url = itme.Url; obj.Type = itme.Type; obj.CreateDate = itme.CreateDate; obj.ModifyDate = itme.ModifyDate; //验证是否还有有子集 obj.isParent = false; obj.children = null; retultlist.Add(obj); } } else { list = db.SystemResourceModule.Where(a => a.ParentId == Guid.Empty).ToList(); //循环 foreach (var itme in list) { ReturnMenuListData obj = new ReturnMenuListData(); obj.ID = itme.ID; obj.ParentId = itme.ParentId; obj.name = itme.ModuleName; obj.ModuleCode = itme.ModuleCode; obj.Url = itme.Url; obj.Type = itme.Type; obj.CreateDate = itme.CreateDate; obj.ModifyDate = itme.ModifyDate; //验证是否还有有子集 obj.isParent = db.SystemResourceModule.Where(a => a.ParentId == itme.ID).ToList().Count > 0 ? true : false; if (obj.isParent == true) { //查找所以子集 obj.children = BuildTree(list, itme.ID); } retultlist.Add(obj); } } orgTreeList.code = 0; orgTreeList.count = list.Count; orgTreeList.data = retultlist; return Json(orgTreeList, JsonRequestBehavior.AllowGet); } #endregion #region 递归调用 /// <summary> /// 递归调用 /// </summary> /// <param name="list"></param> /// <param name="ID"></param> /// <returns></returns> private List<object> BuildTree(List<SystemResourceModule> list, Guid ID) { List<object> Treelist = new List<object>(); List<SystemResourceModule> childList = db.SystemResourceModule.Where(a => a.ParentId == ID).ToList(); //循环 foreach (var itme in childList) { ReturnMenuListData obj = new ReturnMenuListData(); obj.ID = itme.ID; obj.ParentId = itme.ParentId; obj.name = itme.ModuleName; obj.ModuleCode = itme.ModuleCode; obj.Url = itme.Url; obj.CreateDate = itme.CreateDate; obj.ModifyDate = itme.ModifyDate; obj.isParent = db.SystemResourceModule.Where(a => a.ParentId == itme.ID).ToList().Count > 0 ? true : false; obj.children = BuildTree(childList, itme.ID); Treelist.Add(obj); } return Treelist; } #endregion #region 查询父级及子集信息 public ActionResult GetEditData(Guid nodeId) { var current = db.SystemResourceModule.Find(nodeId); if (current == null) return Json(new { success = false }); // 总公司的ParentId为null或自身(假设总公司ParentId=0或null) var isRoot = current.ParentId == null || current.ParentId == Guid.Empty; var parent = isRoot ? current : db.SystemResourceModule.Find(current.ParentId); return Json(new { parentName = parent.ModuleName, parentCode = parent.ModuleCode, Type = current.Type, orgName = current.ModuleName, orgCode = current.ModuleCode, ID = current.ID, parentID = current.ParentId, }, JsonRequestBehavior.AllowGet); } #endregion #region 删除 /// <summary> /// 删除操作 /// </summary> /// <param name="id"></param> /// <returns></returns> public ActionResult DelInfo(Guid? id) { if (id == null) { jsonData.code = 1; jsonData.msg = "删除失败,未找到当行数据"; } else { //删除 var entity = db.SystemResourceModule.Find(id); if (entity == null) { jsonData.code = 1; jsonData.msg = "删除失败,未找到当前行数据"; } else { db.SystemResourceModule.Remove(entity); var result = db.SaveChanges(); if (result > 0) { jsonData.code = 0; jsonData.msg = "删除成功"; } else { jsonData.code = 1; jsonData.msg = "删除失败,请联系管理员"; } } } return Json(jsonData, JsonRequestBehavior.AllowGet); } #endregion #region 新增菜单 /// <summary> /// 新增,修改 /// </summary> /// <returns></returns> public ActionResult Add(SystemResourceModule org, string menuname, string menucode) { org.ModuleName = menuname; org.ModuleCode = menucode; org.ID = Guid.NewGuid(); org.Type = 0; org.ParentId = Guid.Empty; org.CreateDate = DateTime.Now; org.ModifyDate = DateTime.Now; db.SystemResourceModule.Add(org); var result = db.SaveChanges(); if (result > 0) { jsonData.code = 0; jsonData.msg = "新增资源模块成功"; } else { jsonData.code = 1; jsonData.msg = "新增失败,请联系管理员"; } return Json(jsonData, JsonRequestBehavior.AllowGet); } #endregion #region 新增修改 /// <summary> /// 新增,修改 /// </summary> /// <returns></returns> public ActionResult AddTreeInfo(string newname, string newcode, int? Type, Guid? ID, Guid pid) { if (ID == null || ID == Guid.Empty) { // 新增逻辑:parentId为父节点ID(新增时需传递) var newOrg = new SystemResourceModule { ID = Guid.NewGuid(), ParentId = pid, ModuleName = newname, ModuleCode = newcode, Type = Type + 1, CreateDate = DateTime.Now, ModifyDate = DateTime.Now }; db.SystemResourceModule.Add(newOrg); } else { // 编辑逻辑:通过ID查找当前行(确保是当前行,而非总公司,依赖ID唯一性) var entity = db.SystemResourceModule.Find(ID); if (entity != null) { entity.ModuleName = newname; entity.ModuleCode = newcode; entity.ModifyDate = DateTime.Now; db.Entry(entity).State = EntityState.Modified; } } var result = db.SaveChanges(); if (result > 0) { jsonData.code = 0; jsonData.msg = "保存成功"; } else { jsonData.code = 1; jsonData.msg = "保存失败,请联系管理员"; } return Json(jsonData, JsonRequestBehavior.AllowGet); } #endregion } }数据展示不出来
07-16
using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using System.Web; using System.Web.Mvc; using WebApplication1.Models; using WebApplication1.Scripts; namespace WebApplication1.Controllers { [LoginActionFitter] public class OrgManagemController : Controller { AoutEntities1 db = new AoutEntities1(); ReturnJsonData jsonData = new ReturnJsonData(); Models.ReturnListJsonData orgTreeList = new Models.ReturnListJsonData(); // GET: OrgManagem public ActionResult Index() { return View(); } #region 查询 /// <summary> /// 模糊查询 /// </summary> /// <param name="page"></param> /// <param name="limit"></param> /// <param name="orgname"></param> /// <returns></returns> public ActionResult GetList(int page, int limit, string orgname) { //返回树形表格 List<object> retultlist = new List<object>(); //第一步 查找所有的一级菜单 var list = db.OrganizationStructure.Where(a => a.ParentId == Guid.Empty).ToList(); if (!string.IsNullOrEmpty(orgname)) { list = db.OrganizationStructure.Where(a => a.OrgName.Contains(orgname)).ToList(); foreach (var itme in list) { ReturnTreeListData obj = new ReturnTreeListData(); obj.ID = itme.ID; obj.parentId = itme.ParentId; obj.name = itme.OrgName; obj.OrgCode = itme.OrgCode; obj.Leve = itme.Leve; obj.CreateDate = itme.CreateDate; obj.ModifyDate = itme.ModifyDate; //验证是否还有有子集 obj.isParent = false; obj.children = null; retultlist.Add(obj); } } else { list = db.OrganizationStructure.Where(a => a.ParentId == Guid.Empty).ToList(); //循环 foreach (var itme in list) { ReturnTreeListData obj = new ReturnTreeListData(); obj.ID = itme.ID; obj.parentId = itme.ParentId; obj.name = itme.OrgName; obj.OrgCode = itme.OrgCode; obj.Leve = itme.Leve; obj.CreateDate = itme.CreateDate; obj.ModifyDate = itme.ModifyDate; //验证是否还有有子集 obj.isParent = db.OrganizationStructure.Where(a => a.ParentId == itme.ID).ToList().Count > 0 ? true : false; if (obj.isParent == true) { //查找所以子集 obj.children = BuildTree(list, itme.ID); } retultlist.Add(obj); } } orgTreeList.code = 0; orgTreeList.count = list.Count; orgTreeList.data = retultlist; return Json(orgTreeList, JsonRequestBehavior.AllowGet); } #endregion public ActionResult GetEditData(Guid nodeId) { var current = db.OrganizationStructure.Find(nodeId); if (current == null) return Json(new { success = false }); // 总公司的ParentId为null或自身(假设总公司ParentId=0或null) var isRoot = current.ParentId == null || current.ParentId == Guid.Empty; var parent = isRoot ? current : db.OrganizationStructure.Find(current.ParentId); return Json(new { parentName = parent.OrgName, parentCode = parent.OrgCode, level = current.Leve, orgName = current.OrgName, orgCode = current.OrgCode, ID = current.ID, parentID = current.ParentId, }, JsonRequestBehavior.AllowGet); } #region 递归调用 /// <summary> /// 递归调用 /// </summary> /// <param name="list"></param> /// <param name="ID"></param> /// <returns></returns> private List<object> BuildTree(List<OrganizationStructure> list, Guid ID) { List<object> Treelist = new List<object>(); List<OrganizationStructure> childList = db.OrganizationStructure.Where(a => a.ParentId == ID).ToList(); //循环 foreach (var itme in childList) { ReturnTreeListData obj = new ReturnTreeListData(); obj.ID = itme.ID; obj.parentId = itme.ParentId; obj.name = itme.OrgName; obj.OrgCode = itme.OrgCode; obj.Leve = itme.Leve; obj.CreateDate = itme.CreateDate; obj.ModifyDate = itme.ModifyDate; obj.isParent = db.OrganizationStructure.Where(a => a.ParentId == itme.ID).ToList().Count > 0 ? true : false; obj.children = BuildTree(childList, itme.ID); Treelist.Add(obj); } return Treelist; } #endregion #region 新增组织机构 /// <summary> /// 新增,修改 /// </summary> /// <returns></returns> public ActionResult Add(OrganizationStructure org) { org.ID = Guid.NewGuid(); org.Leve = 0; org.ParentId = Guid.Empty; org.CreateDate = DateTime.Now; org.ModifyDate = DateTime.Now; db.OrganizationStructure.Add(org); var result = db.SaveChanges(); if (result > 0) { jsonData.code = 0; jsonData.msg = "新增组织机构成功"; } else { jsonData.code = 1; jsonData.msg = "新增失败,请联系管理员"; } return Json(jsonData, JsonRequestBehavior.AllowGet); } #endregion #region 删除 /// <summary> /// 删除操作 /// </summary> /// <param name="id"></param> /// <returns></returns> public ActionResult DelInfo(Guid? id) { if (id == null) { jsonData.code = 1; jsonData.msg = "删除失败,未找到当行数据"; } else { //删除 var entity = db.OrganizationStructure.Find(id); if (entity == null) { jsonData.code = 1; jsonData.msg = "删除失败,未找到当前行数据"; } else { db.OrganizationStructure.Remove(entity); var result = db.SaveChanges(); if (result > 0) { jsonData.code = 0; jsonData.msg = "删除成功"; } else { jsonData.code = 1; jsonData.msg = "删除失败,请联系管理员"; } } } return Json(jsonData, JsonRequestBehavior.AllowGet); } #endregion #region 新增修改 /// <summary> /// 新增,修改 /// </summary> /// <returns></returns> public ActionResult AddTreeInfo(string neworgname, string neworgcode, OrganizationStructure org, Guid?ID, Guid ParentId) { if (ID == null || ID == Guid.Empty) { // 新增逻辑:parentId为父节点ID(新增时需传递) var newOrg = new OrganizationStructure { ID = Guid.NewGuid(), ParentId = ParentId, OrgName = neworgname, OrgCode = neworgcode, Leve = org.Leve, CreateDate = DateTime.Now, ModifyDate = DateTime.Now }; db.OrganizationStructure.Add(newOrg); } else { // 编辑逻辑:通过ID查找当前行(确保是当前行,而非总公司,依赖ID唯一性) var entity = db.OrganizationStructure.Find(ID); if (entity != null) { entity.OrgName = neworgname; entity.OrgCode = neworgcode; entity.Leve = org.Leve; entity.ModifyDate = DateTime.Now; db.Entry(entity).State = EntityState.Modified; } } var result = db.SaveChanges(); if (result > 0) { jsonData.code = 0; jsonData.msg = "保存成功"; } else { jsonData.code = 1; jsonData.msg = "保存失败,请联系管理员"; } return Json(jsonData, JsonRequestBehavior.AllowGet); } #endregion } } @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Demo</title> <!-- 请勿在项目正式环境中引用该 layui.css 地址 --> <link href="~/Scripts/layui/css/layui.css" rel="stylesheet" /> <script src="~/Scripts/layui/layui.js"></script> <script src="~/Scripts/jquery-3.4.1.js"></script> <style> body { padding: 10px 20px 20px 20px; width: 90% } .editInfo { display: none; } .addeditInfo { display: none; } .addorgfrom { border-radius: 8px; width: 400px; max-width: 100%; padding: 0px 35px 0; margin: auto; position: absolute; top: 60%; left: 55%; margin: -120px 0 0 -230px; } .addform { border-radius: 8px; width: 400px; max-width: 100%; padding: 0px 35px 0; margin: auto; position: absolute; top: 40%; left: 54%; margin: -120px 0 0 -230px; } .layui-form-item { margin-left: -31px; } </style> </head> <body> <fieldset class="layui-elem-field"> <legend> <span class="layui-breadcrumb"> <a href="/Home/Index">首页</a> <a href="/JobManagem/Index">组织机构管理管理</a> </span> </legend> <div class="layui-field-box"> <div class="layui-form-item"> <div class="layui-inline"> <label class="layui-form-label" style="width:90px;">组织机构名称</label> <div class="layui-input-block" style="margin-left:120px"> <input type="text" name="orgname" id="name" autocomplete="off" class="layui-input"> </div> </div> <button type="button" class="layui-btn layui-btn but" style=" margin-bottom: 4px;" id="searchButton" onclick="Search()"><i class="layui-icon layui-icon-search"></i>查询</button> <button type="button" class="layui-btn layui-bg-blue but" style=" margin-bottom: 4px;" onclick="Add()"><i class="layui-icon layui-icon-addition"></i>添加</button> </div> </div> </fieldset> <table class="layui-hide" id="ID-treeTable-demo" lay-filter="test"></table> <script type="text/html" id="TPL-treeTable-demo-tools"> <div class="layui-btn-container"> <a class="layui-btn layui-btn-warm layui-btn-xs" lay-event="add"><i class="layui-icon layui-icon-add-circle"></i>新增</a> <a class="layui-btn layui-bg-blue layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a> <a class="layui-btn layui-bg-red layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a> </div> </script> <div class="editInfo"> <form class="layui-form layui-form-pane addorgfrom" action="" lay-filter="demo-val-filter"> <input type="hidden" name="ID" /> <div class="layui-form-item"> <label class="layui-form-label" style="width:130px">组织机构名称</label> <div class="layui-input-block"> <input type="text" name="orgname" autocomplete="off" placeholder="请输入组织机构名称" lay-verify="required" class="layui-input" style="width:87%"> </div> </div> <div class="layui-form-item"> <label class="layui-form-label" style="width:130px">组织机构代码</label> <div class="layui-input-block"> <input type="text" name="orgcode" autocomplete="off" placeholder="请输入组织机构代码" lay-verify="required" class="layui-input" style="width:87%"> </div> </div> <div class="layui-form-item" style="text-align:center" id="but"> <div class="layui-input-block" style="margin-left:-53px;padding:10px"> <button type="submit" class="layui-btn" lay-submit lay-filter="demo1" id="add" style="margin:10px">保存</button> <button type="reset" class="layui-btn layui-btn-primary" style="margin-left:30px;">重置</button> </div> </div> </form> </div> @*表格内的新增*@ <div class="addeditInfo"> <form class="layui-form layui-form-pane addform" action="" lay-filter="demo-val-filter"> <input type="hidden" name="ID" /> <input type="hidden" name="ParentId" /> <div class="layui-form-item"> <label class="layui-form-label" style="width:130px">上一级菜单名称</label> <div class="layui-input-block"> <input type="text" name="orgname" autocomplete="off" disabled="disabled" placeholder="请输入组织机构名称" lay-verify="required" class="layui-input" style="width:87%"> </div> </div> <div class="layui-form-item"> <label class="layui-form-label" style="width:130px">上一级菜单代码</label> <div class="layui-input-block"> <input type="text" name="orgncode" autocomplete="off" disabled="disabled" placeholder="请输入组织机构名称" lay-verify="required" class="layui-input" style="width:87%"> </div> </div> <div class="layui-form-item"> <label class="layui-form-label" style="width:120px">当前级别</label> <div class="layui-input-block" style="margin-left: 121px;width:289px"> <select name="leve" lay-verify="required"> <option value="">请选择级别</option> <option value="0">集团总部</option> <option value="1">分公司</option> <option value="2">部门</option> <option value="3">其他</option> </select> </div> </div> <div class="layui-form-item"> <label class="layui-form-label" style="width:120px">组织机构名称</label> <div class="layui-input-block"> <input type="text" name="neworgname" autocomplete="off" placeholder="请输入组织机构名称" lay-verify="required" class="layui-input" style="width:90%"> </div> </div> <div class="layui-form-item"> <label class="layui-form-label" style="width:120px">组织机构代码名称</label> <div class="layui-input-block"> <input type="text" name="neworgcode" autocomplete="off" placeholder="请输入组织机构代码名称" lay-verify="required" class="layui-input" style="width:90%"> </div> </div> <div class="layui-form-item" style="text-align:center" id="but"> <div class="layui-input-block" style="margin-left:-53px;padding:10px"> <button type="submit" class="layui-btn" lay-submit lay-filter="demo2" id="add" style="margin:10px">保存</button> <button type="reset" class="layui-btn layui-btn-primary" style="margin-left:30px;">重置</button> </div> </div> </form> </div> <script> var SearchtreeTable; layui.use(['form', 'table'], function () { var table = layui.table; var treeTable = layui.treeTable; var layer = layui.layer; var form = layui.form; // 渲染 var inst = treeTable.render({ elem: '#ID-treeTable-demo', url: '/OrgManagem/GetList', // 此处为静态模拟数据,实际使用时需换成真实接口 cols: [[ { type: 'checkbox', }, { field: 'ID', title: 'ID', hide: true }, // 隐藏但保留数据 { field: 'ParentId', title: '父ID', hide: true }, // 隐藏但保留数据 { field: 'name', title: '组织机构名称', width: '30%', }, { field: 'OrgCode', title: '组织机构代码', width: '30%', sort: true }, { field: 'Leve', title: '级别', width: '20%', sort: true, templet: function (d) { switch (d.Leve) { case 0: return "集团总部"; break; case 1: return "分公司"; break; case 2: return "部门"; break; default: return "其他"; break; } } }, { title: "操作", width: '16%', align: "center", toolbar: "#TPL-treeTable-demo-tools" } ]], tree: { iconIndex: 1, // 图标显示在第 2 列(对应“组织机构名称”列,索引从 0 开始) isParent: 'isParent', // 绑定后台的 `isParent` 字段(标识是否有子节点) // 删除 async 配置!后台已返回完整 children 数组,无需异步加载 }, page: true }); SearchtreeTable = inst; //编辑,删除 table.on('tool(test)', function (obj) { // 双击 toolDouble var data = obj.data; // 获得当前行数据 // console.log(obj) if (obj.event === 'add') { //新增子集 layer.open({ type: 1, // page 层类型 area: ['550px', '480px'], title: '新增组织机构', shade: 0.6, // 遮罩透明度 shadeClose: false, // 点击遮罩区域,关闭弹层 maxmin: false, // 允许全屏最小化 anim: 0, // 0-6 的动画形式,-1 不开启 content: $(".addeditInfo").html() }); //赋 form.val('demo-val-filter', { "orgname": data.name, "orgncode": data.OrgCode, "ID": null, "ParentId": data.ID }); } else if (obj.event === 'edit') { //编辑 //修改编辑职位 layer.open({ type: 1, area: ['550px', '480px'], title: '编辑组织机构', shade: 0.6, // 遮罩透明度 shadeClose: false, // 点击遮罩区域,关闭弹层 maxmin: false, // 允许全屏最小化 anim: 0, // 0-6 的动画形式,-1 不开启 content: $('.addeditInfo').html(), success: function () { $.ajax({ url: '/OrgManagem/GetEditData', data: { nodeId: data.ID }, success: function (res) { // 填充数据,处理父节点不存在的情况 form.val('demo-val-filter', { "orgname": res.parentName || data.name, // 父节点不存在时显示自身名称 "orgncode": res.parentCode || data.orgCode, // 父节点不存在时显示自身代码 "leve": res.level, "neworgname": data.name, "neworgcode": data.OrgCode, "ID": res.ID, "ParentId": res.parentID }); } }); } }); } else { layer.confirm('真的删除行 [' + data.name + '] 么', function (index) { obj.del(); // 删除对应行(tr)的DOM结构 layer.close(index); // 向服务端发送删除指令 $.ajax({ url: '/OrgManagem/DelInfo', type: 'post', data: { id: data.ID }, success: function (res) { if (res.code == 0) { layer.msg(res.msg, { icon: 6, time: 1500 }, function () { Search(); }) } else { layer.msg(res.msg, { icon: 5, time: 1500 }) } } }) }); } }); // 提交事件 form.on('submit(demo1)', function (data) { var field = data.field; // 获取表单字段 // 此处可执行 Ajax 等操作 $.ajax({ url: '/OrgManagem/Add', type: 'post', data: field, success: function (res) { if (res.code == 0) { layer.msg(res.msg, { icon: 6, time: 3000 }, function () { layer.closeAll(); // 关闭所有类型的层 Search(); }); } else { layer.msg(res.msg, { icon: 5, time: 2000 }); } } }) return false; // 阻止默认 form 跳转 }); // 提交事件 form.on('submit(demo2)', function (data) { var field = data.field; // 获取表单字段 var leve = data.leve; var ParentId = data.ParentId; // 此处可执行 Ajax 等操作 $.ajax({ url: '/OrgManagem/AddTreeInfo', type: 'post', data: field, leve, ParentId, success: function (res) { if (res.code == 0) { layer.msg(res.msg, { icon: 6, time: 3000 }, function () { layer.closeAll(); // 关闭所有类型的层 Search(); }); } else { layer.msg(res.msg, { icon: 5, time: 2000 }); } } }) return false; // 阻止默认 form 跳转 }); }); //重载,模糊查询 function Search() { var nameVal = $('input[name="orgname"]').val().trim(); // 完整重载 - 所有属性属性(options)均可参到重载中 SearchtreeTable.reload({ where: { // 传递数据异步请求时携带的字段 orgname: nameVal, }, height: 500 // 重设高度 }); } //添加 function Add() { // 在此处输入 layer 的任意代码 layer.open({ type: 1, // page 层类型 area: ['550px', '350px'], title: '新增组织机构', shade: 0.6, // 遮罩透明度 shadeClose: true, // 点击遮罩区域,关闭弹层 maxmin: true, // 允许全屏最小化 anim: 0, // 0-6 的动画形式,-1 不开启 content: $(".editInfo").html() }); } </script> </body> </html>按照这中代码格式和风格写出上面的添加和编辑
07-15
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值