表头报错前校验,分别显示更新前和更新后的内容

news/2024/6/19 3:58:45 标签: 数据库, oracle

表头报错前校验,分别显示更新前和更新后的内容

1.AceHeadTailAfterEditHandler.java

package nc.ui.cjkcmg.cjtbxmbg.ace.handler;

import nc.bs.framework.common.NCLocator;
import nc.itf.uap.IUAPQueryBS;
import nc.jdbc.framework.processor.BeanProcessor;
import nc.ui.cjkcmg.pub.translate.Addresstranslate;
import nc.ui.pubapp.uif2app.event.IAppEventHandler;
import nc.ui.pubapp.uif2app.event.card.CardHeadTailAfterEditEvent;
import nc.vo.cjkcmg.cjtbxmbg.CjtbxmbgBVO;
import nc.vo.cjkcmg.cjtbxmdj.CjtbxmdjVO;
import nc.vo.pub.BusinessException;
import nc.vo.pub.lang.UFDate;
import nc.vo.pubapp.pattern.exception.ExceptionUtils;
import nc.vo.wgbfb.utils.NullValueUtils;
/**
 * 单据表头表尾字段编辑后事件处理类
 * @author hh
 */
public class AceHeadTailAfterEditHandler implements IAppEventHandler<CardHeadTailAfterEditEvent> {

	@Override
	public void handleAppEvent(CardHeadTailAfterEditEvent e) {
		//当前编辑字段的名称
		String key=e.getKey();
		//判断当前编辑字段的名称是yxxm营销项目
		if(key.equals("code")){
			try {
				//营销项目编辑后带出表头表体信息
				yxxmBringoutXx(e);
			} catch (BusinessException e1) {
				// TODO 自动生成的 catch 块
				ExceptionUtils.wrappBusinessException(e1.getMessage());
			}
		}
	}
	
	/**
	 * 单据表头表尾字段编辑后事件处理类
	 * 
	 * @since 6.0
	 * @version 2023-08-15
	 * @author hh
	 * @throws BusinessException 
	 */
	private void yxxmBringoutXx(CardHeadTailAfterEditEvent e) throws BusinessException {
		//获取表头营销项目字段的值
		String code = NullValueUtils.getNullStringValue(e.getBillCardPanel().getHeadItem("code").getValueObject());
		//通过营销项目编码查询投标项目登记表头信息
		String sql = "select * from cj_tbxmdj where nvl(dr,0) = 0 and code = '" + code + "'";
		//将数据库查到的该条记录赋值给headvo
		CjtbxmdjVO headvo = (CjtbxmdjVO) getService().executeQuery(sql, new BeanProcessor(CjtbxmdjVO.class));
		if(headvo != null){
			//给投标项目信息变更 营销项目名称 字段赋值
			e.getBillCardPanel().setHeadItem("name", headvo.getName());
			//给投标项目信息变更 预计营销额 字段赋值
			e.getBillCardPanel().setHeadItem("expectedvolume", headvo.getExpectedvolume());
			//给投标项目信息变更 部门 字段赋值
			e.getBillCardPanel().setHeadItem("pk_jbdept", headvo.getPk_jbdept());
			//给投标项目信息变更 项目类型 字段赋值
			e.getBillCardPanel().setHeadItem("pk_markprotype", headvo.getPk_markprotype());
			//给投标项目信息变更 专业类型 字段赋值
			e.getBillCardPanel().setHeadItem("pk_promajor", headvo.getPk_promajor());
			//给投标项目信息变更 项目地点 字段赋值
			e.getBillCardPanel().setHeadItem("proposition", headvo.getProposition());
			//给投标项目信息变更 招标人名称 字段赋值
			e.getBillCardPanel().setHeadItem("zbrname", headvo.getZbrname());
			//给投标项目信息变更 招标代理名称 字段赋值
			e.getBillCardPanel().setHeadItem("zbdlname", headvo.getZbdlname());
			//给投标项目信息变更 联系人 字段赋值
			e.getBillCardPanel().setHeadItem("linkman", headvo.getLinkman());
			//给投标项目信息变更 联系人电话 字段赋值
			e.getBillCardPanel().setHeadItem("linkmaninfo", headvo.getLinkmaninfo());
			//给投标项目信息变更 项目控制价(投标) 字段赋值
			e.getBillCardPanel().setHeadItem("prokzj", headvo.getProkzj());
			//给投标项目信息变更 报名截止时间 字段赋值
			e.getBillCardPanel().setHeadItem("bmjzsj", headvo.getBmjzsj());
			//给投标项目信息变更 开标时间 字段赋值
			e.getBillCardPanel().setHeadItem("kbsj", headvo.getKbsj());
			//给投标项目信息变更 标书编制人总体负责人 字段赋值
			e.getBillCardPanel().setHeadItem("bsbzrztfzr", headvo.getBsbzrztfzr());
			//给投标项目信息变更 拟投入的项目负责人 字段赋值
			e.getBillCardPanel().setHeadItem("ntrdxmfzr", headvo.getNtrdxmfzr());
			//给投标项目信息变更 拟投入的技术负责人 字段赋值
			e.getBillCardPanel().setHeadItem("ntrdjsfzr", headvo.getNtrdjsfzr());
			//给投标项目信息变更 版本 字段赋值
			e.getBillCardPanel().setHeadItem("version", NullValueUtils.getNullStringValue(Integer.parseInt(headvo.getVersion())+1));
			//给投标项目信息变更 备注 字段赋值
			e.getBillCardPanel().setHeadItem("memo", headvo.getMemo());
			//给投标项目信息变更 附件说明 字段赋值
			e.getBillCardPanel().setHeadItem("fjsm", headvo.getFjsm());
			
			//修改前项目地点拼接:邮政编码+国家+省份+城市+县区+详细地址
			String beforexmdd = Addresstranslate.getAddressname(NullValueUtils.getNullStringValue(e.getBillCardPanel().getHeadItem("proposition").getValueObject()));
			//给投标项目信息变更 营销项目名称 字段赋值
			e.getBillCardPanel().setHeadItem("def2", beforexmdd);

			//清空表体,目的是为了防止换选营销项目时表体数据累加
			int rowCount = e.getBillCardPanel().getBillModel("id_cjtbxmbgbvo").getRowCount();
			int[] rows = new int[rowCount];
			for (int i = 0; i < rowCount; i++) {
				rows[i] = i;
			}
			e.getBillCardPanel().getBillModel("id_cjtbxmbgbvo").delLine(rows);
			//新建投标项目信息变更子表VO
			CjtbxmbgBVO tbxmbgBVO=new CjtbxmbgBVO();
			//变更人
			String userId = e.getContext().getPk_loginUser();
			tbxmbgBVO.setBgr(userId);
			//变更时间
			tbxmbgBVO.setBgsj(new UFDate());
			//给页签编码为CjtbxmdjVO增行
			e.getBillCardPanel().getBillModel("id_cjtbxmbgbvo").addLine();
			e.getBillCardPanel().getBillModel("id_cjtbxmbgbvo").setBodyRowVO(tbxmbgBVO, 0);
			e.getBillCardPanel().getBillModel("id_cjtbxmbgbvo").setValueAt((0+1)*10+"", 0, "rowno");
			
		}else{
			//如果表头营销项目为空,就清空后面字段以及表体字段的值
			emptyXx(e);
		}
	}
	
	private void emptyXx(CardHeadTailAfterEditEvent e) {
		//给投标项目信息变更 营销项目名称 字段赋值
		e.getBillCardPanel().setHeadItem("name", null);
		//给投标项目信息变更 预计营销额 字段赋值
		e.getBillCardPanel().setHeadItem("expectedvolume", null);
		//给投标项目信息变更 部门 字段赋值
		e.getBillCardPanel().setHeadItem("pk_jbdept", null);
		//给投标项目信息变更 项目类型 字段赋值
		e.getBillCardPanel().setHeadItem("pk_markprotype", null);
		//给投标项目信息变更 专业类型 字段赋值
		e.getBillCardPanel().setHeadItem("pk_promajor", null);
		//给投标项目信息变更 项目地点 字段赋值
		e.getBillCardPanel().setHeadItem("proposition", null);
		//给投标项目信息变更 招标人名称 字段赋值
		e.getBillCardPanel().setHeadItem("zbrname", null);
		//给投标项目信息变更 招标代理名称 字段赋值
		e.getBillCardPanel().setHeadItem("zbdlname", null);
		//给投标项目信息变更 联系人 字段赋值
		e.getBillCardPanel().setHeadItem("linkman", null);
		//给投标项目信息变更 联系人电话 字段赋值
		e.getBillCardPanel().setHeadItem("linkmaninfo", null);
		//给投标项目信息变更 项目控制价(投标) 字段赋值
		e.getBillCardPanel().setHeadItem("prokzj", null);
		//给投标项目信息变更 报名截止时间 字段赋值
		e.getBillCardPanel().setHeadItem("bmjzsj", null);
		//给投标项目信息变更 开标时间 字段赋值
		e.getBillCardPanel().setHeadItem("kbsj", null);
		//给投标项目信息变更 标书编制人总体负责人 字段赋值
		e.getBillCardPanel().setHeadItem("bsbzrztfzr", null);
		//给投标项目信息变更 拟投入的项目负责人 字段赋值
		e.getBillCardPanel().setHeadItem("ntrdxmfzr", null);
		//给投标项目信息变更 拟投入的技术负责人 字段赋值
		e.getBillCardPanel().setHeadItem("ntrdjsfzr", null);
		//给投标项目信息变更 版本 字段赋值
		e.getBillCardPanel().setHeadItem("version", null);
		//给投标项目信息变更 备注 字段赋值
		e.getBillCardPanel().setHeadItem("memo", null);
		//给投标项目信息变更 附件说明 字段赋值
		e.getBillCardPanel().setHeadItem("fjsm", null);
		//清空表体
		int rowCount = e.getBillCardPanel().getBillModel("id_cjtbxmbgbvo").getRowCount();
		int[] rows = new int[rowCount];
		for (int i = 0; i < rowCount; i++) {
			rows[i] = i;
		}
		e.getBillCardPanel().getBillModel("id_cjtbxmbgbvo").delLine(rows);
	}
	
	//前端使用数据库查询语句必须增加的方法
	private IUAPQueryBS service;
	private IUAPQueryBS getService() {
		if (service == null) {
			service = NCLocator.getInstance().lookup(IUAPQueryBS.class);
		}
		return service;
	}
}

2.SaveWriteBackBillsRule.java

package nc.bs.cjkcmg.cjtbxmbg.ace.bp.rule;

import java.util.HashMap;
import java.util.Map;

import nc.bs.dao.BaseDAO;
import nc.impl.pubapp.pattern.rule.IFilterRule;
import nc.jdbc.framework.processor.BeanProcessor;
import nc.ui.cjkcmg.pub.translate.Addresstranslate;
import nc.vo.cjkcmg.cjtbxmbg.AggCjtbxmbgVO;
import nc.vo.cjkcmg.cjtbxmbg.CjtbxmbgVO;
import nc.vo.pub.BusinessException;
import nc.vo.pub.SuperVOUtil;
import nc.vo.pub.lang.UFDouble;
import nc.vo.pubapp.pattern.exception.ExceptionUtils;
import nc.vo.pubapp.pattern.pub.SqlBuilder;
import nc.vo.wgbfb.utils.NullValueUtils;

public class SaveWriteBackBillsRule implements IFilterRule<AggCjtbxmbgVO> {

	@Override
	public AggCjtbxmbgVO[] process(AggCjtbxmbgVO[] aggvos) {
		for (int i = 0; i < aggvos.length; i++) {
			try {
				saveWriteBackBills(aggvos[i]);
			} catch (BusinessException e) {
				ExceptionUtils.wrappBusinessException("保存回写变更前和变更后内容失败:" + e.getMessage());
			}
		}
		return aggvos;
	}

	/*
	*回写变更前内容和变更后内容字段
	*/
	private void saveWriteBackBills(AggCjtbxmbgVO aggvo) throws BusinessException{
		
		if(aggvo.getParentVO().getVersion().equals("1")){
			return;
		}
		//营销项目
		String code = NullValueUtils.getNullStringValue(aggvo.getParentVO().getCode());
		//获取变更前VO
		SqlBuilder sql = new SqlBuilder();
		sql.append(" select code, ");//营销项目编码
		sql.append(" 		name, ");//营销项目名称
		sql.append("        expectedvolume, ");//预计营销额
		sql.append("        pk_jbdept,  ");//部门
		sql.append("        pk_markprotype,  ");//项目类型
		sql.append("        pk_promajor,  ");//专业类型
		sql.append("        proposition,  ");//项目地点
		sql.append("        zbrname,  ");//招标人名称
		sql.append("        zbdlname,  ");//招标代理名称
		sql.append("        linkman,  ");//联系人
		sql.append("        linkmaninfo,  ");//联系人电话
		sql.append("        prokzj,  ");//项目控制价(投资)
		sql.append("        bmjzsj,  ");//报名截止时间
		sql.append("        kbsj,  ");//开标时间
		sql.append("        bsbzrztfzr,  ");//标书编制人总体负责人
		sql.append("        ntrdxmfzr,  ");//拟投入的项目负责人
		sql.append("        ntrdjsfzr,  ");//拟投入的技术负责人
		sql.append("        memo,  ");//备注
		sql.append("        fjsm  ");//附件说明
		sql.append(" from cj_tbxmdj ");
		sql.append(" where nvl(dr,0) = 0 ");
		sql.append(" and code = '"+ code +"' ");
		//获取变更前VO
		CjtbxmbgVO beforevo = (CjtbxmbgVO) getDao().executeQuery(sql.toString(), new BeanProcessor(CjtbxmbgVO.class));
		//获取变更后VO
		CjtbxmbgVO aftervo = aggvo.getParentVO();
		//翻译变更前的参照类型
		CjtbxmbgVO exebeforevo = execFormulaWithVOs(beforevo);
		//处理UFDouble类型数据
		//处理预计营销额
		exebeforevo.setAttributeValue("expectedvolume",NullValueUtils.getNullUFdoubleValue(exebeforevo.getExpectedvolume()).setScale(2, UFDouble.ROUND_HALF_UP));
		//处理项目控制价
		exebeforevo.setAttributeValue("prokzj",NullValueUtils.getNullUFdoubleValue(exebeforevo.getProkzj()).setScale(2, UFDouble.ROUND_HALF_UP));
		//翻译变更后的参照类型
		CjtbxmbgVO exeaftervo = execFormulaWithVOs(aftervo);
		//处理UFDouble类型数据
		//处理预计营销额
		exeaftervo.setAttributeValue("expectedvolume",NullValueUtils.getNullUFdoubleValue(exeaftervo.getExpectedvolume()).setScale(2, UFDouble.ROUND_HALF_UP));
		//处理项目控制价
		exeaftervo.setAttributeValue("prokzj",NullValueUtils.getNullUFdoubleValue(exeaftervo.getProkzj()).setScale(2, UFDouble.ROUND_HALF_UP));
		//修改前项目地点拼接:邮政编码+国家+省份+城市+县区+详细地址
		String beforexmdd = NullValueUtils.getNullStringValue(exeaftervo.getDef2());
		//修改后项目地点拼接:邮政编码+国家+省份+城市+县区+详细地址
		String afterxmdd = Addresstranslate.getAddressname(NullValueUtils.getNullStringValue(exeaftervo.getProposition()));		
		//新建map,键存放字段编码,值存放字段名称
		Map<String, String> bmmcmap = new HashMap<>();
		//map中的键:编码
		String[] bm = new String[] {"code","name","expectedvolume","pk_jbdept","pk_markprotype","pk_promajor",
				"proposition","zbrname","zbdlname","linkman","linkmaninfo","prokzj","bmjzsj","kbsj","bsbzrztfzr",
				"ntrdxmfzr","ntrdjsfzr","memo","fjsm"}; 
		//map中的值:名称
		String[] mc = new String[] {"营销项目编码","营销项目名称","预计营销额","部门","项目类型","专业类型","项目地点",
				"招标人名称","招标代理名称","联系人","联系人电话","项目控制价(投资)","报名截止时间","开标时间","标书编制人总体负责人",
				"拟投入的项目负责人","拟投入的技术负责人","备注","附件说明"};
		//将数组中的编码和名称存放到map中
		for(int i=0; i<bm.length; i++){
			bmmcmap.put(bm[i], mc[i]);
		}
		//存储变更前内容
		StringBuilder bgq = new StringBuilder();
		//存储变更后内容
		StringBuilder bgh = new StringBuilder();
		//判断变更前和变更后的内容是否相同
		for(int i=0; i<bm.length; i++){
			if(!NullValueUtils.getNullStringValue(exebeforevo.getAttributeValue(bm[i])).equals(NullValueUtils.getNullStringValue(exeaftervo.getAttributeValue(bm[i])))){
				bgq.append(bmmcmap.get(bm[i])).append(":").append(NullValueUtils.getNullStringValue(exebeforevo.getAttributeValue(bm[i]))).append(";");
				bgh.append(bmmcmap.get(bm[i])).append(":").append(NullValueUtils.getNullStringValue(exeaftervo.getAttributeValue(bm[i]))).append(";");
			}
		}
		if(!NullValueUtils.getNullStringValue(beforexmdd).equals(NullValueUtils.getNullStringValue(afterxmdd))){
			bgq.append("项目地点").append(":").append(beforexmdd).append(";");
			bgh.append("项目地点").append(":").append(afterxmdd).append(";");
		}
		//清空报存后的自定义项
//		aggvo.getParentVO().setDef2(null);
		if(bgq.length() > 0){
			//去除拼接后字符串尾部的“;”
			bgq.deleteCharAt(bgq.lastIndexOf(";"));
			bgh.deleteCharAt(bgh.lastIndexOf(";"));
		}
		if(aggvo.getChildrenVO().length > 0){
			//将变更前内容和变更后内容赋值到表体变更前内容和变更后内容字段
			aggvo.getChildrenVO()[0].setAttributeValue("bgqnr", bgq.toString());
			aggvo.getChildrenVO()[0].setAttributeValue("bghnr", bgh.toString());
		}else{
			throw new BusinessException("当前表体为空!");
		}
	}
	
	/**   
	* @desc: 档案翻译
	* @author: hanh  
	* @date 2023年8月18日 下午10:55:22 
	*/
	private CjtbxmbgVO execFormulaWithVOs(CjtbxmbgVO hvo) {
		CjtbxmbgVO clonevo = (CjtbxmbgVO) hvo.clone();
		SuperVOUtil.execFormulaWithVOs(new CjtbxmbgVO[] {clonevo}, new String[] {
				//营销项目
				"code->getcolvalue(cj_yxproject,code,pk_yxproject,code)",
				//部门
				"pk_jbdept->getcolvalue(org_dept,name,pk_dept,pk_jbdept)",
				//项目类型
				"pk_markprotype->getcolvalue(bd_defdoc,name,pk_defdoc,pk_markprotype)",
				//专业类型
				"pk_promajor->getcolvalue(bd_defdoc,name,pk_defdoc,pk_promajor)",
				//标书编制人总体负责人
				"bsbzrztfzr->getcolvalue(bd_psndoc,name,pk_psndoc,bsbzrztfzr)",
				//拟投入的项目负责人
				"ntrdxmfzr->getcolvalue(bd_psndoc,name,pk_psndoc,ntrdxmfzr)",
				//拟投入的技术负责人
				"ntrdjsfzr->getcolvalue(bd_psndoc,name,pk_psndoc,ntrdjsfzr)"
		});
		
		return clonevo;
	}
	
	private BaseDAO dao;
	private BaseDAO getDao(){
		if(dao == null){
			dao = new BaseDAO();
		}
		return dao;
	}
}

3.Addresstranslate.java

package nc.ui.cjkcmg.pub.translate;

import nc.bs.framework.common.NCLocator;
import nc.itf.uap.IUAPQueryBS;
import nc.jdbc.framework.processor.ArrayProcessor;
import nc.vo.pub.BusinessException;
import nc.vo.pubapp.pattern.pub.SqlBuilder;
import nc.vo.util.NullUtils;
/**
 * 地址簿翻译
 * @author sh
 * @date : 2023-08-25
 */
public class Addresstranslate {
	public static String getAddressname(String value) throws BusinessException {
		IUAPQueryBS service = NCLocator.getInstance().lookup(IUAPQueryBS.class);
		// TODO 自动生成的方法存根
		SqlBuilder aftersb = new SqlBuilder();
		aftersb.append(" select bs.postcode, ");//邮政编码0
		aftersb.append(" be.name, ");//国家1
		aftersb.append(" bn.name, ");//省份2
		aftersb.append(" bon.name, ");//城市3
		aftersb.append(" bdn.name, ");//县区4
		aftersb.append(" bs.detailinfo ");//详细地址5
		aftersb.append(" from bd_address bs ");
		aftersb.append(" left join bd_countryzone be ");//国家地区
		aftersb.append(" on be.pk_country = bs.country ");
		aftersb.append(" left join bd_region bn ");//省份
		aftersb.append(" on bn.pk_region = bs.province ");
		aftersb.append(" left join bd_region bon ");//城市
		aftersb.append(" on bon.pk_region = bs.city ");
		aftersb.append(" left join bd_region bdn ");//县区
		aftersb.append(" on bdn.pk_region = bs.vsection ");
		aftersb.append(" where nvl(bs.dr,0) = 0 ");
		aftersb.append(" and nvl(be.dr,0) = 0 ");
		aftersb.append(" and nvl(bn.dr,0) = 0 ");
		aftersb.append(" and nvl(bon.dr,0) = 0 ");
		aftersb.append(" and nvl(bdn.dr,0) = 0 ");
		aftersb.append(" and bs.pk_address = '"+ value +"' ");
		Object[] afterobjs = (Object[]) service.executeQuery(aftersb.toString(), new ArrayProcessor());
		String xmdd = "";
		if(afterobjs != null && afterobjs.length > 0) {
			xmdd = NullUtils.getStringNullValue(afterobjs[0]) + NullUtils.getStringNullValue(afterobjs[1])
					+ NullUtils.getStringNullValue(afterobjs[2]) + NullUtils.getStringNullValue(afterobjs[3])
					+ NullUtils.getStringNullValue(afterobjs[4]) + NullUtils.getStringNullValue(afterobjs[5]);
			return xmdd;
		}
		return null;
	}


}


http://www.niftyadmin.cn/n/4970685.html

相关文章

镜像的介绍

镜像也是docker的核心组件之一&#xff0c;镜像时容器运行的基础&#xff0c;容器是镜像运行后的形态。 总体来说&#xff0c;镜像是一个包含程序运行必要依赖环境和代码的只读文件&#xff0c;它采用分层的文件系统&#xff0c;将每一层的改变以读写层的形式增加到原来的只读…

机器学习实战之模型的解释性:Scikit-Learn的SHAP和LIME库

概要 机器学习模型的“黑箱”困境 机器学习模型的崛起让我们惊叹不已&#xff01;不论是预测房价、识别图片中的猫狗&#xff0c;还是推荐给你喜欢的音乐&#xff0c;这些模型都表现得非常出色。但是&#xff0c;有没有想过&#xff0c;这些模型到底是如何做出这些决策的呢&a…

opencv案例03 -基于OpenCV实现二维码生成,发现,定位,识别

1.二维码的生成 废话不多说&#xff0c;直接上代码 # 生成二维码 import qrcode# 二维码包含的示例数据 data "B0018" # 生成的二维码图片名称 filename "qrcode.png" # 生成二维码 img qrcode.make(data) # 保存成图片输出 img.save(filename)img.sh…

【ArcGIS Pro二次开发】(63):批量更改字段别名

在我工作中遇到的大多数图斑&#xff0c;字段名称一般是英文&#xff0c;字段别名是中文&#xff0c;使用起来是比较方便的。 但有时候也会遇到一些不一样的情况&#xff0c;不知是经过了怎样的处理&#xff0c;图斑的字段别名被修改成了和字段名称一样的英文&#xff0c;这样…

智驾算力芯片市场仍处于「波动」周期,Momenta曝光自研NPU

用「冷热不均」来形容当下的汽车芯片赛道&#xff0c;再合适不过了。 本周&#xff0c;英伟达公布的第二财季&#xff08;5-7月&#xff09;营收达到创纪录的135亿美元&#xff0c;大幅超出了此前市场普遍预期的略高于110亿美元&#xff0c;同比增速更是达到了101%。 其中&…

Spark 7:Spark SQL 函数定义

SparkSQL 定义UDF函数 方式1语法&#xff1a; udf对象 sparksession.udf.register(参数1&#xff0c;参数2&#xff0c;参数3&#xff09; 参数1&#xff1a;UDF名称&#xff0c;可用于SQL风格 参数2&#xff1a;被注册成UDF的方法名 参数3&#xff1a;声明UDF的返回值类型 ud…

常见前端面试之VUE面试题汇总七

20. 对 vue 设计原则的理解 1.渐进式 JavaScript 框架&#xff1a;与其它大型框架不同的是&#xff0c;Vue 被设计 为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上 手&#xff0c;还便于与第三方库或既有项目整合。另一方面&#xff0c;当与现代化的…

【Qt专栏】实现单例程序,禁止程序多开的几种方式

目录 一&#xff0c;简要介绍 二&#xff0c;实现示例&#xff08;Windows&#xff09; 1.使用系统级别的互斥机制 2.通过共享内存&#xff08;进程间通信-IPC&#xff09; 3.使用命名互斥锁&#xff08;不推荐&#xff09; 4.使用文件锁 5.通过网络端口检测 一&#xf…