Chrome 访问一次 Controller,请求却执行两次

写了一个 Spring Boot 整合 MyBatis Plus 的 demo,相应的配置了 SQL 性能分析插件。当所有代码都写好,使用 Chrome 访问控制器的时候,发现每发送一个请求,控制台都会输出两次同样的 SQL 分析日志。


这里写图片描述

没有配置任何拦截器,于是换了个浏览器访问,并没有出现这个问题,上网查了一下才知道是 Chrome 的 JSONView 插件搞的鬼。

只要更改一下 JSONView 的配置项就可以了。


这里写图片描述

<think>我们正在讨论U9系统的二次开发,特别是后端开发和UI页面交互实现。根据用户的问题,我们需要结合引用内容中提到的技术点(如layUI、QT界面设计、Vue.js等)来构建一个可行的方案。 首先,U9系统是用友公司推出的一款企业管理软件,其二次开发通常需要在其提供的开发框架下进行。虽然引用中没有直接提到U9,但我们可以借鉴其中提到的前端技术(如layUI、Vue.js)和后端开发思路。 根据引用[1]中提到的layUI,这是一个经典模块化前端框架,我们可以使用它来构建U9二次开发的UI界面。引用[3]中提到了Vue.js,这是一个现代前端框架,也可以用于构建交互式UI。同时,引用[2]中提到的QT界面设计思路(尽管是桌面应用)也可以给我们一些启示,特别是在数据绑定和界面布局方面。 对于后端开发,U9系统通常使用.NET平台(C#)作为后端语言,二次开发需要在其提供的API和业务对象模型基础上进行。 因此,我们可以将二次开发分为两个部分:后端开发和前端UI交互。 1. 后端开发:通常需要创建新的业务单据、流程或者扩展已有的业务逻辑。U9提供了自己的业务对象模型和持久化框架,我们可以通过继承或组合的方式来扩展。 2. UI页面交互:U9的前端界面可以使用其自带的UI框架(可能是基于ASP.NET Web Forms或MVC),但二次开发中也可以引入现代前端框架(如Vue.js)来构建更丰富的交互体验。同时,引用[1]中提到的layUI也是一个简洁易用的选择。 下面我们分别详细说明: ### 后端开发实现步骤 1. **了解U9的业务对象模型**:U9系统是基于SOA架构的,其业务逻辑封装在业务对象(Business Object, BO)中。二次开发需要创建新的BO或扩展现有BO。 2. **创建新的业务对象**:如果需要新增功能,比如一个新的单据,那么需要创建一个新的BO,并定义其字段、方法和校验规则。 3. **注册服务**:将新的BO注册到U9的服务容器中,以便前端调用。 4. **实现业务逻辑**:在BO中实现具体的业务逻辑,如数据校验、计算、保存等。 5. **数据库扩展**:如果需要新增表或字段,需要在数据库层面进行扩展,并在BO中映射。 示例代码(C#): ```csharp // 示例:创建一个新的业务对象 [Serializable] public class MyCustomBO : BaseBO { [FieldDef("自定义字段1", FieldType.String, Length = 50)] public string CustomField1 { get; set; } [FieldDef("自定义字段2", FieldType.Decimal)] public decimal CustomField2 { get; set; } // 重写保存方法 public override void Save() { // 自定义保存逻辑 base.Save(); } } ``` ### UI页面交互实现 U9的前端页面可以使用ASP.NET Web Forms或MVC,但也可以使用其他前端框架。这里我们可以参考引用[1]中的layUI和引用[3]中的Vue.js。 1. **使用layUI构建传统页面**:layUI是一个模块化的前端框架,使用简单,适合快速开发。我们可以按照引用[1]中的示例引入layUI,并构建表单和表格。 示例(HTML): ```html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>U9二次开发页面</title> <link rel="stylesheet" href="layui.css"> </head> <body> <form class="layui-form"> <div class="layui-form-item"> <label class="layui-form-label">自定义字段1</label> <div class="layui-input-block"> <input type="text" name="customField1" required lay-verify="required" placeholder="请输入" autocomplete="off" class="layui-input"> </div> </div> <div class="layui-form-item"> <div class="layui-input-block"> <button class="layui-btn" lay-submit lay-filter="formDemo">提交</button> </div> </div> </form> <script src="layui.js"></script> <script> layui.use('form', function(){ var form = layui.form; // 监听提交 form.on('submit(formDemo)', function(data){ // 这里可以通过Ajax将数据提交到U9后端 // 假设我们有一个处理这个表单的后端服务地址 $.ajax({ url: '/MyCustomBO/Save', type: 'POST', data: data.field, success: function(res) { layer.msg('保存成功'); } }); return false; // 阻止表单跳转 }); }); </script> </body> </html> ``` 2. **使用Vue.js构建更现代化的交互**:Vue.js提供了数据绑定和组件化,可以构建更复杂的单页面应用(SPA)。我们可以将Vue.js集成到U9的页面中。 示例(Vue.js): ```html <div id="app"> <form @submit.prevent="submitForm"> <label>自定义字段1</label> <input type="text" v-model="formData.customField1" required> <button type="submit">提交</button> </form> </div> <script src="vue.js"></script> <script> new Vue({ el: '#app', data: { formData: { customField1: '' } }, methods: { submitForm() { // 使用axios或其他Ajax库提交数据 axios.post('/MyCustomBO/Save', this.formData) .then(response => { alert('保存成功'); }) .catch(error => { console.error('保存失败', error); }); } } }); </script> ``` 3. **与U9后端交互**:无论使用layUI还是Vue.js,前端都需要通过Ajax调用U9后端提供的服务。U9的服务通常以Web Service(ASMX)或WCF服务的形式提供,也可以使用ASP.NET Web API。 注意:在U9环境中,通常需要处理U9的认证和授权,因此Ajax请求中可能需要携带U9的上下文信息(如Token)。 ### 总结 U9二次开发的后端开发主要是在其业务对象模型基础上进行扩展,而前端可以使用layUI或Vue.js等框架构建交互式页面,通过Ajax与后端交互。在实际开发中,需要遵循U9的开发规范,并利用U9提供的API。 §§相关问题§§ 1. U9二次开发中如何扩展现有的业务对象? 2. 在U9二次开发中,前端如何集成Vue.js并调用U9后端服务? 3. U9二次开发中,如何处理用户认证和权限控制?</think>### U9系统二次开发:后端开发与UI页面交互实现 U9系统是用友推出的企业级ERP平台,其二次开发主要涉及后端业务逻辑扩展和前端UI交互优化。以下是具体实现方案: #### 一、后端开发实现 1. **业务对象扩展** 通过继承或组合方式扩展标准业务对象: ```csharp // 示例:扩展销售订单对象 public class CustomSaleOrder : SaleOrder { [U9Field("CustomField", "自定义字段")] public string CustomField { get; set; } public override void BeforeSave() { base.BeforeSave(); // 自定义校验逻辑 if (this.CustomField == null) throw new Exception("自定义字段必填"); } } ``` 2. **服务端逻辑扩展** 使用拦截器模式增强标准业务逻辑: ```csharp // 订单保存拦截器 public class OrderSaveInterceptor : IInterceptor { public void Execute(InterceptorContext context) { var order = context.BusinessObject as SaleOrder; // 添加自定义业务逻辑 if (order.TotalAmount > 100000) order.NeedApprove = true; } } ``` 3. **API接口开发** 创建RESTful API供前端调用: ```csharp [U9ApiController] public class CustomAPIController { [HttpPost("/api/custom/approve")] public ActionResult ApproveOrder([FromBody] ApproveRequest request) { // 审批逻辑实现 var result = OrderService.Approve(request.OrderID); return new JsonResult(result); } } ``` #### 二、UI页面交互实现 1. **前端框架集成** 参考引用[1]的layUI集成方案: ```html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>U9扩展页面</title> <link rel="stylesheet" href="/u9/layui/css/layui.css"> </head> <body> <div id="customPanel"> <form class="layui-form"> <div class="layui-form-item"> <label class="layui-form-label">审批意见</label> <div class="layui-input-block"> <textarea id="approveRemark"></textarea> </div> </div> <button class="layui-btn" @click="submitApprove">提交</button> </form> </div> <script src="/u9/layui/layui.js"></script> <script> layui.use(['layer', 'form'], function(){ var layer = layui.layer; var form = layui.form; // 提交审批 window.submitApprove = function() { const remark = document.getElementById('approveRemark').value; // 调用后端API fetch('/api/custom/approve', { method: 'POST', body: JSON.stringify({ remark }) }).then(res => { layer.msg('审批提交成功'); }); }; }); </script> </body> </html> ``` 2. **数据绑定与交互** 参考引用[3]的Vue.js实现模式: ```html <div id="app"> <table class="layui-table"> <tr v-for="item in orderList"> <td>{{ item.orderNo }}</td> <td>{{ formatCurrency(item.amount) }}</td> <td> <button @click="approve(item)" :class="['layui-btn', item.status?'layui-btn-disabled':'']"> {{ item.status ? '已审批' : '审批' }} </button> </td> </tr> </table> </div> <script> new Vue({ el: '#app', data: { orderList: [] // 从后端API加载 }, mounted() { this.loadOrders(); }, methods: { async loadOrders() { const res = await fetch('/api/orders/pending'); this.orderList = await res.json(); }, approve(order) { // 调用审批API } } }); </script> ``` 3. **界面扩展机制** - 使用U9的**表单扩展点**注入自定义UI组件 - 通过**元数据覆盖**修改标准页面布局 - 利用**客户端脚本引擎**添加交互逻辑 #### 三、开发注意事项 1. **版本兼容性** 需严格匹配U9系统版本,不同版本的SDK和API存在差异 2. **权限控制** 新增功能需配置U9RBAC权限模型: ```sql INSERT INTO U9_RBAC (FuncCode, RoleID, PermType) VALUES ('CUSTOM_APPROVE', 'ROLE_ADMIN', 'RW'); ``` 3. **部署方式** - 后端:编译为DLL放入`/U9/Bin/Custom`目录 - 前端:静态资源放入`/U9/Portal/custom`目录 - 配置注册:在`u9config.xml`中添加扩展模块声明 4. **调试方案** - 使用U9提供的**Remote Debugger**工具 - 前端调试启用Chrome开发者工具 - 日志记录使用`U9Log.Write("模块名", "日志内容")` > 最佳实践:参考引用[4]的表单设计工具,复杂界面建议使用U9提供的**可视化设计器**进行布局,可降低兼容性问题风险[^4]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值