NC 备料计划添加自定义按钮

1.自己找位置新建一个xml文件和一个类。

2.在客户端注册中心找到自己的功能节点中参数注册,添加上自己新建的xml文件路径。

参数名称为:非行业扩展的可增加参数名称为:PluginBeanConfigFilePath, 也 可使用: PluginBeanConfigFilePath_开始后面加字符 行业扩展参数名称:PluginBeanConfigFilePath_Industry行业编码 _CountryZone本地化编码,实现不同集团不同行业加载不同 的行业的扩展配置文件

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    <!-- 列表界面下增加导入按钮组 -->
     <bean class="nc.ui.pubapp.plugin.action.InsertActionInfo">
        <!-- cardEditorActions 列表界面下的按钮 --> 
        <property name="actionContainer" ref="actionsOfList" />
        <!-- 非编辑状态下 -->
        <property name="actionType" value="edit" />
        <!-- 目标按钮payMenuAction -->
        <property name="target" ref="printMenuAction" />  
        <!-- after为目标按钮之后 -->
        <property name="pos" value="after" />
        <!-- submitOaAction扩展的按钮 -->
        <property name="action" ref="addTestAction" />
    </bean> 

    <!-- 卡片界面下增加导入按钮组 -->
     <bean class="nc.ui.pubapp.plugin.action.InsertActionInfo">
        <!-- cardEditorActions 卡片界面下的按钮  -->
        <property name="actionContainer" ref="actionsOfCard" />
        <!-- 非编辑状态下 -->
        <property name="actionType" value="edit" />
        <!-- 目标按钮payMenuAction -->
        <property name="target" ref="replaceAction" />  
       <!--  after为目标按钮之后 -->
        <property name="pos" value="after" />
        <!-- addTestAction扩展的按钮 -->
        <property name="action" ref="addTestAction" />
    </bean> 
    

        <!-- 测试-->
    <bean id="addTestAction" class="nc.ui.mmpac.pickm.action.rxhk.AddTestAction">
           <property name="model" ref="manageAppModel" /> 
           
      <!-- <property name="model" ref="manageAppModel" />
        <property name="billForm" ref="billFormEditor" />
        <property name="listView" ref="listView" /> -->
    </bean>
</beans>

 按钮类

package nc.ui.mmpac.pickm.action.rxhk;



import java.awt.event.ActionEvent;



import nc.ui.pubapp.uif2app.query2.model.IModelDataManager;
import nc.ui.pubapp.uif2app.view.BillForm;
import nc.ui.uif2.NCAction;
import nc.ui.uif2.model.BillManageModel;
import nc.uif2.annoations.MethodType;
import nc.uif2.annoations.ViewMethod;
import nc.uif2.annoations.ViewType;
import nc.vo.pubapp.pattern.exception.ExceptionUtils;
import nc.vo.pubapp.pattern.model.entity.bill.AbstractBill;
public class AddTestAction extends  NCAction{

	private static final long serialVersionUID = 6648493618234538195L;
	private BillManageModel model;
	private BillForm editor;
	public AddTestAction(){
	//初始按钮名称和code
		super.setBtnName("测试按钮");
		//传入值和xml中的code对应
		super.setCode("addTestAction");
	}

	@Override
	public void doAction(ActionEvent  e) throws Exception {
		//super.doAction(e);
		AbstractBill aggVO = (AbstractBill) this.model.getSelectedData();
		//RegisterVO hvo = (RegisterVO) aggVO.getParentVO();
		//BillCardPanel panel = getEditor().getBillCardPanel();
		//panel.getHeadItem();
		//object.
		//BillItem[] hvo=panel.getHeadItems();
		// TODO 自动生成的方法存根
		//if (null != this.model.getSelectedData()) {

            // TODO 实现你的业务逻辑。
			ExceptionUtils.wrappBusinessException("qweqwe");
		//}
	}
	
	//按钮可不可用方法
		@Override
		protected boolean isActionEnable(){
		//设置按钮可见性
	 	return true;	
		}
		public BillManageModel getModel() {
			return model;
		}

		public void setModel(BillManageModel model) {
			this.model = model;
			//必须要加上这个监听,不然可能按钮出不来
			this.model.addAppEventListener(this);
		}
		
		@ViewMethod(viewType = ViewType.BillForm, methodType = MethodType.GETTER)
		public BillForm getEditor() {
			return this.editor;
		}

		
}

<think>我们正在处理的是NC57系统中为自定义按钮添加权限控制的问题。根据之前的讨论,我们已经知道如何添加自定义按钮,现在需要为这个按钮添加权限控制,确保只有拥有特定权限的用户才能看到和使用这个按钮。 在NC57中,权限控制通常通过系统自带的权限管理模块实现,主要涉及角色、功能节点和操作权限的配置。以下是实现步骤: ### 步骤1:在元数据中注册按钮操作 - 自定义按钮需要被注册为系统的功能节点(FuncNode),这样它才能被纳入权限管理体系。在NC57中,这通常通过修改模块的元数据文件(如`module.xml`或`funcnode.xml`)来实现。 - 例如,在`funcnode.xml`中添加一个按钮操作节点: ```xml <funcnode id="自定义按钮ID" name="自定义按钮名称" parent="父节点ID" funcentry="true" handler="自定义按钮处理类"> <operations> <operation name="执行操作" type="exec" /> </operations> </funcnode> ``` **说明**: - `id`:唯一标识,建议使用模块名+功能名的形式,如`MOD_ReceiveSettle_CustomBtn`。 - `parent`:指定该节点挂载到哪个父节点下。通常可以挂到收款结算单的父节点下(需要查找原系统的功能节点树)。 - `handler`:指定处理按钮操作的类,这个类需要实现特定接口(如`nc.ui.pubapp.uif2app.actions.SingleAction`)。 ### 步骤2:在按钮代码中添加权限检查 - 在自定义表单类中,我们需要在初始化按钮时,根据当前用户的权限来决定是否显示该按钮。 - 使用NC的权限服务(`nc.itf.uap.pf.IPfAuthService`)来检查用户是否具有该按钮的权限。 - **代码示例**: ```java import nc.itf.uap.pf.IPfAuthService; import nc.vo.pub.BusinessException; import nc.vo.pubapp.pattern.exception.ExceptionUtils; public class CustomReceiveSettleForm extends ReceiveSettleBillForm { private static final String CUSTOM_BUTTON_NODE_ID = "MOD_ReceiveSettle_CustomBtn"; // 步骤1中定义的节点ID @Override public void initUI() { super.initUI(); // 检查当前用户是否具有该按钮的权限 if (hasButtonPermission()) { ButtonObject customButton = new ButtonObject("自定义操作"); customButton.addActionListener(e -> onCustomButtonClick()); this.getBillCardPanel().getToolBar().add(customButton); } } private boolean hasButtonPermission() { try { // 获取权限服务 IPfAuthService authService = (IPfAuthService) NCLocator.getInstance().lookup(IPfAuthService.class.getName()); // 获取当前用户 String userID = getModel().getContext().getPk_loginUser(); // 检查用户是否有该功能节点的执行权限 return authService.hasFuncNodePermission(userID, CUSTOM_BUTTON_NODE_ID, "exec"); } catch (BusinessException e) { ExceptionUtils.wrappException(e); return false; } } private void onCustomButtonClick() { // 按钮点击逻辑 } } ``` ### 步骤3:配置权限项 - 在NC57系统中,管理员需要登录到系统管理控制台,将新注册的功能节点分配给相应的角色。 1. 用管理员账号登录NC57。 2. 进入“系统管理” -> “权限管理” -> “角色管理”。 3. 选择需要授权的角色,进入功能权限分配界面。 4. 在功能树中找到我们注册的节点(如`自定义按钮名称`),勾选“执行操作”权限。 5. 保存角色配置。 ### 注意事项 1. **权限节点注册的准确性**:确保在元数据中注册的节点ID与代码中检查的ID完全一致。 2. **权限缓存**:权限信息在用户登录时加载到缓存,因此修改权限后,用户可能需要重新登录才能生效。 3. **异常处理**:权限检查可能抛出异常,需要妥善处理。 4. **性能考虑**:如果表单中有多个按钮需要权限控制,应避免频繁调用权限服务,可以考虑批量检查权限。 ### 常见问题 - **按钮不显示**:检查权限节点ID是否正确,以及当前用户是否被分配了该权限。 - **权限服务查找失败**:确保服务接口`IPfAuthService`的类名正确,并且NC服务正常运行。 通过以上步骤,即可实现自定义按钮的权限控制。这样,只有被授权的用户才能在收款结算单中看到并使用该按钮。 §§相关问题§§ 1. 如何在NC57中自定义功能节点? 2. 如何为NC57自定义按钮添加国际化支持? 3. NC57权限管理中的角色和用户组有什么区别?</think>### 在NC57中为自定义按钮添加权限控制的步骤 在NC57系统中,为自定义按钮添加权限控制需要结合功能节点注册、权限服务调用和UI控制逻辑。以下是具体实现步骤: --- #### 步骤1:注册功能节点(FuncNode) 在模块的元数据文件中注册按钮操作权限节点: ```xml <!-- 在 module.xml 或 funcnode.xml 中添加 --> <funcnode id="MOD_RECEIVE_SETTLE_CUSTOM_BTN" name="自定义按钮操作" parent="父节点ID(如结算单功能树节点)" funcentry="true"> <operations> <operation name="执行" type="exec" /> <!-- 定义操作类型 --> </operations> </funcnode> ``` **关键参数**: - `id`:唯一标识符(建议按 `模块名_功能_操作` 格式命名) - `parent`:挂载到现有功能节点树的位置 - `type="exec"`:表示执行操作权限 --- #### 步骤2:在按钮代码中添加权限检查 在自定义表单类中实现权限验证逻辑: ```java public class CustomReceiveSettleForm extends ReceiveSettleBillForm { private static final String BTN_PERMISSION_CODE = "MOD_RECEIVE_SETTLE_CUSTOM_BTN"; // 步骤1定义的节点ID @Override public void initUI() { super.initUI(); // 创建按钮 ButtonObject customBtn = new ButtonObject("自定义操作"); // 添加权限检查 if (checkButtonPermission()) { customBtn.addActionListener(e -> executeCustomLogic()); this.getBillCardPanel().getToolBar().add(customBtn); } else { // 可选:记录无权限日志 Logger.debug("用户无此按钮权限"); } } // 权限验证方法 private boolean checkButtonPermission() { try { IPfAuthService authService = (IPfAuthService) NCLocator.getInstance().lookup(IPfAuthService.class.getName()); String userPK = getModel().getContext().getPk_loginUser(); // 获取当前用户 String nodeID = BTN_PERMISSION_CODE + ".exec"; // 格式:节点ID.操作类型 return authService.hasFuncNodePermission(userPK, nodeID); } catch (BusinessException e) { ExceptionUtils.wrappException(e); return false; } } private void executeCustomLogic() { // 按钮业务逻辑实现 } } ``` --- #### 步骤3:配置系统权限(管理员操作) 管理员在NC控制台分配权限: 1. 登录 **系统管理** → **权限管理** → **角色管理** 2. 选择目标角色,进入 **功能权限** 页签 3. 在功能树中找到注册的节点 `自定义按钮操作` 4. 勾选 **执行** 操作权限并保存 --- #### 权限控制原理图 ```mermaid graph TD A[自定义按钮] --> B{权限检查} B -->|有权限| C[显示按钮并启用] B -->|无权限| D[隐藏/禁用按钮] E[权限服务] -->|验证| F[角色权限配置] G[功能节点注册] --> F ``` --- #### 关键注意事项 1. **权限缓存** NC权限数据通常缓存30分钟,修改权限后需等待或清除缓存(`ncc clear cache`) 2. **多维度控制**(可选增强) ```java // 增加组织权限检查 String orgPK = getModel().getContext().getPk_group(); authService.hasDataPermission(userPK, orgPK, "DATA_ORG_SCOPE"); ``` 3. **按钮状态管理** 无权限时可选择: - 完全隐藏按钮(推荐) - 显示但禁用(需额外代码) ```java customBtn.setEnabled(false); // 禁用但不隐藏 ``` 4. **权限节点命名规范** 建议格式:`模块简写_功能_操作`(如 `AR_SETTLE_EXPORT`) --- #### 常见问题排查 - **按钮不显示** 检查:①功能节点ID是否匹配 ②角色权限是否分配 ③用户是否重新登录 - **权限服务异常** 捕获`BusinessException`并检查服务接口`IPfAuthService`的可用性 - **跨组织权限** 需额外实现`getDataRuleService().checkDataPermission()`验证数据级权限 通过以上步骤,即可实现基于NC57标准权限体系的按钮级访问控制。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值