二十三:创建交易

news2024/11/23 18:52:42

功能需求:

用户在交易主页面,点击”创建”按钮,跳转到创建交易的页面;

用户在创建交易的页面填写表单,点击”保存”按钮,完成创建交易的功能。

*所有者、阶段、类型、来源 都是动态的

*市场活动源是可搜索的

*联系人也是可搜索的

*可能性是可配置的

*客户名称支持自动补全

*表单验证

*保存成功之后,跳转到交易主页面

*保存失败,提示信息,页面不跳转

1.功能实现阶段、类型、来源加载下拉框

用户在交易主页面,点击”创建”按钮,跳转到创建交易的页面;

实现阶段、类型、来源加载下拉框

 1.流程图

 

1.代码实现

TranController

	@RequestMapping("/workbench/transaction/saveIndex.do")
	public String saveIndex(HttpServletRequest request) {
		// 调用service加载下拉数据
		List<User> userList = userService.queryAllUsers();
		List<DicValue> sourceList = dicValueService.queryDicValueByTypeCode("source");
		List<DicValue> stageList = dicValueService.queryDicValueByTypeCode("stage");
		List<DicValue> typeList = dicValueService.queryDicValueByTypeCode("transactionType");
		// 保存在请求域中
		request.setAttribute("userList", userList);
		request.setAttribute("sourceList", sourceList);
		request.setAttribute("stageList", stageList);
		request.setAttribute("typeList", typeList);
		return "workbench/transaction/save";

	}

save.jsp

    <div class="form-group">
        <label for="create-accountName" class="col-sm-2 control-label">客户名称<span
                style="font-size: 15px; color: red;">*</span></label>
        <div class="col-sm-10" style="width: 300px;">
            <input type="text" class="form-control" id="create-accountName" placeholder="支持自动补全,输入客户不存在则新建">
        </div>
        <label for="create-transactionStage" class="col-sm-2 control-label">阶段<span
                style="font-size: 15px; color: red;">*</span></label>
        <div class="col-sm-10" style="width: 300px;">
            <select class="form-control" id="create-transactionStage">
                <option></option>
                <c:forEach items="${stageList}" var="stage">
                    <option value="${stage.id}">${stage.value}</option>
                </c:forEach>
            </select>
        </div>
    </div>

    <div class="form-group">
        <label for="create-transactionType" class="col-sm-2 control-label">类型</label>
        <div class="col-sm-10" style="width: 300px;">
            <select class="form-control" id="create-transactionType">
                <option></option>
                <c:forEach items="${typeList}" var="type">
                    <option value="${type.id}">${type.value}</option>
                </c:forEach>
            </select>
        </div>
        <label for="create-contactsName" class="col-sm-2 control-label">联系人名称&nbsp;&nbsp;<a href="javascript:void(0);"
                                                                                            id="findContactsBtn"><span
                class="glyphicon glyphicon-search"></span></a></label>
        <div class="col-sm-10" style="width: 300px;">
            <input type="hidden" id="contactsId">
            <input type="text" class="form-control" id="create-contactsName">
        </div>
    </div>

    <div class="form-group">
        <label for="create-clueSource" class="col-sm-2 control-label">来源</label>
        <div class="col-sm-10" style="width: 300px;">
            <select class="form-control" id="create-clueSource">
                <option></option>
                <c:forEach items="${sourceList}" var="source">
                    <option value="${source.id}">${source.value}</option>
                </c:forEach>
            </select>
        </div>
        <label for="create-activitySrc" class="col-sm-2 control-label">市场活动源&nbsp;&nbsp;<a href="javascript:void(0);"
                                                                                           id="openActivityBtn"><span
                class="glyphicon glyphicon-search"></span></a></label>
        <div class="col-sm-10" style="width: 300px;">
            <input type="hidden" id="activityId">
            <input type="text" class="form-control" id="create-activitySrc">
        </div>
    </div>

2.功能实现:点击交易市场活动源

点击交易市场活动源

2.流程图

 

3.代码实现

ActivityMapper

    /**
     * 市场活动:根据名称查询
     */
    List<Activity> selectActivityForDetailByName(String activityName);
    <!--   List<Activity> selectActivityForDetailByName(String activityName);-->
    <select id="selectActivityForDetailByName" resultMap="BaseResultMap">
        select a.id, a.name, a.start_date, a.end_date, u.name as owner
        from tbl_activity a
        join tbl_user u on u.id = a.owner
        where a.name like "%"#{activityName}"%"
        order by create_time desc
    </select>

ActivityService

	/**
	 * 市场活动:市场活动名称查询
	 */
	List<Activity> queryActivityForDetailByName(String activityName);
	@Override
	public List<Activity> queryActivityForDetailByName(String activityName) {
		return activityMapper.selectActivityForDetailByName(activityName);
	}

TranController

	/**
	 * 创建交易2:查找市场活动
	 */
	@RequestMapping("/workbench/transaction/searchActivity.do")
	public @ResponseBody
	Object searchActivity(String activityName) {
		// 调用service
		List<Activity> activityList = activityService.queryActivityForDetailByName(activityName);
		return activityList;
	}

sava.jsp

 // 1.点击市场活动源
            $("#openActivityBtn").click(function () {
                $("#findMarketActivity").modal("show");
            });
            // 2.市场活动搜索框 输入市场活动名称
            $("#searchActivityOfTranTxt").keyup(function () {
                // 收集参数
                var activityName = $("#searchActivityOfTranTxt").val();
                // 发送请求
                $.ajax({
                    url: 'workbench/transaction/searchActivity.do',
                    data: {activityName: activityName},
                    type: 'post',
                    dataType: 'json',
                    success: function (data) {
                        var htmlStr = "";
                        // 遍历获取activity
                        $.each(data, function (index, obj) {
                            htmlStr += "<tr>";
                            htmlStr += "<td><input type=\"radio\" activityName=\"" + obj.name + "\" name=\"activity\" value=\"" + obj.id + "\"/></td>";
                            htmlStr += "<td>" + obj.name + "</td>";
                            htmlStr += "<td>" + obj.startDate + "</td>";
                            htmlStr += "<td>" + obj.endDate + "</td>";
                            htmlStr += "<td>" + obj.owner + "</td>";
                            htmlStr += "</tr>";
                        });
                        $("#tBody").html(htmlStr);
                    }

                });

            });
            // 选择市场活动
            $("#tBody").on("click", "input[type='radio']", function () {
                // 选择市场的id
                var id = this.value;
                var activityName = $(this).attr("activityName");
                // 填充到添加表单上面
                $("#activityId").val(id);
                $("#create-activitySrc").val(activityName);
                // 关闭输入框
                $("#findMarketActivity").modal("hide");
            });

3.功能实现:点击联系人

 

3.流程图

 

3.代码实现

ContactsMapper

    /**
     * 联系人信息:通过用户名
     */
    List<Contacts> selectContactsForDetailByName(String fullname);
  <select id="selectContactsForDetailByName" resultMap="BaseResultMap">
    select c.id,c.fullname,c.email,c.mphone
    from tbl_contacts c
    where c.fullname like "%"#{fullname}"%"
    order by create_time desc
  </select>

ContactsService

	/**
	 * 联系人信息:通过用户名查找
	 */
	List<Contacts> queryContactsForDetailByName(String fullname);
@Service
public class ContactsServiceImpl implements ContactsService {
	@Autowired
	private ContactsMapper contactsMapper;
	@Override
	public List<Contacts> queryContactsForDetailByName(String fullname) {
		return contactsMapper.selectContactsForDetailByName(fullname);
	}
}

TranController

	/**
	 * 创建交易3:查找联系人
	 */
	@RequestMapping("/workbench/transaction/searchContacts.do")
	public @ResponseBody
	Object searchContacts(String fullname) {
		// 调用service
		List<Contacts> contactsList = contactsService.queryContactsForDetailByName(fullname);
		return contactsList;
	}

sava.jsp

            // 3.联系人姓名
            $("#findContactsBtn").click(function () {
                $("#findContacts").modal("show");
            });
            // 联系人搜索框 输入fullname
            $("#searchContactsOfTranTxt").keyup(function () {
                // 收集参数
                var fullname = $("#searchContactsOfTranTxt").val();
                // 发送请求
                $.ajax({
                    url: 'workbench/transaction/searchContacts.do',
                    data: {fullname: fullname},
                    type: 'post',
                    dataType: 'json',
                    success: function (data) {
                        var htmlStr = "";
                        // 遍历获取activity
                        $.each(data, function (index, obj) {
                            htmlStr += "<tr>";
                            htmlStr += "<td><input type=\"radio\" fullname=\"" + obj.fullname + "\" name=\"activity\" value=\"" + obj.id + "\"/></td>";
                            htmlStr += "<td>" + obj.fullname + "</td>";
                            htmlStr += "<td>" + obj.email + "</td>";
                            htmlStr += "<td>" + obj.mphone + "</td>";
                            htmlStr += "</tr>";
                        });
                        $("#tBodyContacts").html(htmlStr);
                    }

                });

            });
            // 选择联系人
            $("#tBodyContacts").on("click", "input[type='radio']", function () {
                // 选择市场的id
                var id = this.value;
                var fullname = $(this).attr("fullname");
                // 填充到添加表单上面
                $("#contactsId").val(id);
                $("#create-contactsName").val(fullname);
                // 关闭输入框
                $("#findContacts").modal("hide");
            });

4.功能实现客户名称自动补全

如果不存在就新建

4.流程图

 

4.代码实现bootstrap3-typeahead插件

customerMapper

    /**
     * 客户信息:根据name模糊查询,返回list
     */
    List<String> selectCustomerForNameListlByName(String customerName);
    <select id="selectCustomerForNameListlByName" resultType="string">
        select name
        from tbl_customer
        where name like "%"#{customerName}"%"
    </select>

customerService

	/**
	 * 通过名称 查询客户信息
	 */
	List<String> queryCustomerForNameListByName(String customerName);
	@Override
	public List<String> queryCustomerForNameListByName(String customerName) {
		return customerMapper.selectCustomerForNameListlByName(customerName);
	}

TranController

	/**
	 * 创建交易4 :模糊查询客户
	 */
	@RequestMapping("/workbench/transaction/serachCustomer.do")
	public @ResponseBody Object serachCustomer(String customerName){
		return customerService.queryCustomerForNameListByName(customerName);
	}

sava.jsp

            // 客户自动补全
            $("#create-accountName").typeahead({
                source:function (jquery,process) {
                    // 每次键盘弹起,都自动触发本函数;向后台送请求,查询客户表中所有的名称,把客户名称以[]字符串形式返回前台,赋值给source
                    // process:是个函数,能够将['xxx','xxxxx','xxxxxx',.....]字符串赋值给source,从而完成自动补全
                    // jquery:在容器中输入的关键字
                    $.ajax({
                        url:'workbench/transaction/serachCustomer.do',
                        data:{customerName:jquery},
                        type:'post',
                        dataType:'json',
                        success:function (data) {//['xxx','xxxxx','xxxxxx',.....]
                            process(data);// 将后端查询的名称字符串通过process传给source
                        }
                    });
                }
            });

5.代码实现保存交易信息

5功能实现:

保存交易信息

 

5流程图

 

5代码实现

CustomerMapper---输入的是name,查询客户id

客户信息:根据name查询,返回id
 /**
     * 客户信息:根据name查询,返回id
     */
    String selectCustomerForNameToCustomerId(String customerName);
    <!-- Customer selectCustomerForName(String customerName);-->
    <select id="selectCustomerForNameToCustomerId" resultType="java.lang.String">
        select id
        from tbl_customer
        where name = #{customerName}
    </select>

TranMapper--插入交易

    /**
     * 插入交易
     */
    int insertCreateTran(Tran tran);
<!--  int insertCreateTran(Tran tran);-->
    <insert id="insertCreateTran">
        insert into tbl_tran (id, owner, money, name,
                              expected_date, customer_id, stage,
                              type, source, activity_id,
                              contacts_id, create_by, create_time, description,
                              contact_summary, next_contact_time)
        values (#{id,jdbcType=CHAR}, #{owner,jdbcType=CHAR}, #{money,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR},
                #{expectedDate,jdbcType=CHAR}, #{customerId,jdbcType=CHAR}, #{stage,jdbcType=VARCHAR},
                #{type,jdbcType=VARCHAR}, #{source,jdbcType=VARCHAR}, #{activityId,jdbcType=CHAR},
                #{contactsId,jdbcType=CHAR}, #{createBy,jdbcType=VARCHAR}, #{createTime,jdbcType=CHAR},
                #{description,jdbcType=VARCHAR},
                #{contactSummary,jdbcType=VARCHAR}, #{nextContactTime,jdbcType=CHAR})
    </insert>

CustomerServcice---如果客户不存在就要新建

	/**
	 * 客户信息:根据name查询
	 */
	String queryCustomerForNameToCustomerId(String customerName);

	/**
	 * 通过交易保存客户信息
	 * @param customer
	 */
	void saveCustomerByTran(Customer customer);
	@Override
	public String queryCustomerForNameToCustomerId(String customerName) {
		return customerMapper.selectCustomerForNameToCustomerId(customerName);
	}

	@Override
	public void saveCustomerByTran(Customer customer) {
		customerMapper.insertCustomer(customer);
	}

TranService

	/**
	 * 交易:增加
	 */
	int saveCreateTran(Tran tran);

	@Override
	public int saveCreateTran(Tran tran) {
		return tranMapper.insertCreateTran(tran);
	}

TranController

	/**
	 * 创建交易:点击保存
	 */
	@RequestMapping("/workbench/transaction/saveTran.do")
	public @ResponseBody
	Object saveTran(String owner, String money, String name, String expectedDate, String customerName, String stage, String type, String contactsId, String source, String activityId, String description, String contactSummary, String nextContactTime, HttpSession session) {
		// 封装参数
		User user = (User) session.getAttribute(Contants.SESSION_USER);
		Tran tran = new Tran();
		tran.setId(UUIDUtils.getUUID());
		tran.setOwner(owner);
		tran.setMoney(money);
		tran.setName(name);
		tran.setExpectedDate(expectedDate);

		tran.setStage(stage);
		tran.setType(type);
		tran.setSource(source);
		tran.setActivityId(activityId);
		tran.setContactsId(contactsId);
		tran.setCreateBy(user.getId());
		tran.setCreateTime(DateUtils.formateDateTime(new Date()));
		tran.setDescription(description);
		tran.setContactSummary(contactSummary);
		tran.setNextContactTime(nextContactTime);
		// 查找setCustomerId
		String customerId = customerService.queryCustomerForNameToCustomerId(customerName);
		if(customerId == null || "".equals(customerId)){
			// 没有此客户,需要添加
			Customer customer = new Customer();
			customer.setId(UUIDUtils.getUUID());
			customer.setName(customerName);
			customer.setCreateBy(user.getId());
			customer.setCreateTime(DateUtils.formateDateTime(new Date()));
			customer.setContactSummary(tran.getContactSummary());
			customer.setNextContactTime(tran.getNextContactTime());
			customer.setDescription(tran.getDescription());
			try {
				// 保存客户
				customerService.saveCustomerByTran(customer);
				tran.setCustomerId(customer.getId());
			} catch (Exception e) {
				e.printStackTrace();
			}
		}else{
			// 有这个客户 直接存放查询出的id
			tran.setCustomerId(customerId);
		}

		// 调用service,实现交易添加
		ReturnObject returnObject = new ReturnObject();
		try {
			int ret = tranService.saveCreateTran(tran);
			if (ret>0){
				//成功
				returnObject.setCode(Contants.RETURN_OBJECT_CODE_SUCCESS);
			}else{
				//失败
				returnObject.setCode(Contants.RETURN_OBJECT_CODE_FAIL);
				returnObject.setMessage("系统错误,稍后再试");
			}
		} catch (Exception e) {
			e.printStackTrace();
			//失败
			returnObject.setCode(Contants.RETURN_OBJECT_CODE_FAIL);
			returnObject.setMessage("系统错误,稍后再试");
		}
		return returnObject;

	}

sava.jsp

        //  4. 点击保存
            $("#saveTranBtn").click(function () {
                // 收集参数
                var owner = $("#create-transactionOwner").val();
                var money = $.trim($("#create-amountOfMoney").val());
                var name = $.trim($("#create-transactionName").val());
                var expectedDate = $("#create-expectedClosingDate").val();
                var customerName = $.trim($("#create-accountName").val());
                var stage = $("#create-transactionStage").val();
                var type = $("#create-transactionType").val();
                var contactsId = $("#contactsId").val();
                var source = $("#create-clueSource").val();
                var activityId = $("#activityId").val();
                var description = $.trim($("#create-describe").val());
                var contactSummary = $.trim($("#create-contactSummary").val());
                var nextContactTime = $("#create-nextContactTime").val();
                // 表单验证
                if (owner == "") {
                    alert("所有者不能为空");
                    return;
                }
                if (name == "") {
                    alert("名称不能为空");
                    return;
                }
                if (expectedDate == "") {
                    alert("预计成交日期不能为空");
                    return;
                }
                if (customerName == "") {
                    alert("客户名称不能为空");
                    return;
                }
                if (stage == "") {
                    alert("阶段不能为空");
                    return;
                }
                // 正则表达式验证成本:金额只能为非负整数
                var regExp = /^(([1-9]\d*)|0)$/;
                if (!regExp.test(money)) {
                    alert("金额要大于0");
                    return;
                }
                // 发送请求
                $.ajax({
                    url: 'workbench/transaction/saveTran.do',
                    data: {
                        owner: owner,
                        money: money,
                        name: name,
                        expectedDate: expectedDate,
                        customerName: customerName,
                        stage: stage,
                        type: type,
                        contactsId: contactsId,
                        source: source,
                        activityId: activityId,
                        description: description,
                        contactSummary: contactSummary,
                        nextContactTime: nextContactTime,
                    },
                    type: 'post',
                    dataType: 'json',
                    success: function (data) {
                        if (data.code > 0) {
                            // 成功跳转
                            window.location.href = 'workbench/transaction/index.do';
                        } else {
                            alert(data.message);
                        }
                    }
                });
            });

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/514531.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《编程思维与实践》1061.计算n!右端0的个数(II)

《编程思维与实践》1061.计算n!右端0的个数(II) 题目 思路 可以用大整数的乘法来处理,不过有些题目可以用数论的方法得到更方便的做法, 以本题为例: 注意到 10 2 ⋅ 5 102\cdot 5 102⋅5 , 所以只需要将阶乘的每一项分解成2和5的乘积形式即可, 同时由于每出现一个5,必然会出现…

shell补充命令

目录 排序sort命令 语法格式: 常用选项: 去重uniq命令 替换tr命令 替换字符 删除​编辑 压缩​编辑 压缩替换​编辑 删除空行 截取cut命令 拆分split命令 合并paste命令​ eval命令 排序sort命令 以行为单位对文件内容进行排序&#xff0c;也可以根据不同的数据类型…

淘天集团首战618,一场平台生态的“再创业”

电商行业还在“卷”&#xff0c;但不是所有人都还把目光放在低价、噱头上。 5月10日&#xff0c;淘宝天猫618商家大会应时而至&#xff0c;随之而来的&#xff0c;是“淘天集团”的首次公开亮相。淘天集团CEO戴珊表示&#xff0c;“新生变革”、自我变革不是选择题而是必答题。…

4.实现csdn暗黑模式-油猴脚本实战1

4.实现csdn暗黑模式-油猴脚本实战1 Start 前面的文章&#xff0c;对油猴脚本做了基础的介绍。今天来我们来实战一下&#xff0c;编写一个有实际作用的油猴脚本。 如果我希望我的csdn是暗黑模式&#xff0c;怎么办&#xff1f; 看我表演&#xff1f; 注意&#xff01;本文仅用…

shell脚本----正则表达式

文章目录 一、什么是正则表达式二、正则表达式的使用 一、什么是正则表达式 正则表达式是由普通字符与元字符组成&#xff1a; 普通字符 包括大小写字母、数字、标点符号及一些其他符号。 元字符 是指在正则表达式中具有特殊意义的专用字符&#xff0c;可以用来规定其前导字符…

科技助农 智慧养鸡2D组态可视化管理云平台

前言 养殖业是农业的一个重要分支&#xff0c;主要包括家禽养殖、畜牧养殖和水产养殖三个细分产业。养殖业发展至今&#xff0c;已成为与种植业并列的农业两大支柱产业之一。 建设背景 我国作为养殖业大国&#xff0c;各类型的散养农户、大中小型养殖场数量极多&#xff0c;…

事务的隔离级别有哪几种,解决了什么问题?

事务的隔离级别主要是为了保证多事务环境下的并发安全性&#xff0c;共有四大隔离级别&#xff0c;如下&#xff1a; 如果不考虑隔离性&#xff0c;在SQL操作中&#xff0c;多个事务竞争可能会产生三种不同的现象&#xff0c;分别是脏读、幻读、不可重复读。 首先来看脏读&am…

slf4j log4j log4j-over-slf4j self-log4j12

一、Java日志体系概述 图1-1 Java日志体系概况 日志门面接口&#xff08;SLF4J、JCL&#xff09;一系列绑定和桥接具体的日志实现 先来两个例子&#xff1a; Spring项目中通过Commons Logging直接使用log4j 图1-2 通过Commons Logging使用log4j本例中由于spring-core中原生依…

IS200TREGH1BEC直流并励电动机的启动

​ IS200TREGH1BEC​​​​​​直流并励电动机的启动 要启动机器&#xff0c;电机在零速时产生的扭矩必须超过负载所需的扭矩。然后 TM − TL 将为正&#xff0c;d!/dt 也为正&#xff0c;机器加速。 通常&#xff0c;直流电机的电枢电阻在满载电流时会导致 1% 到 5% 的下降。…

制作RPM包createrepo

每次源码安装很费事&#xff0c;所以直接做一个RPM包 安装 rpm-build 软件包 [rootproxy ~]# yum -y install rpm-build 生成 rpmbuild 目录结构 或许只有在家目录下生成一个不存在的目录才会生成 rpmbuild目录和子目录 若想在自己创建的目录下生成只有自己手动去创建&#…

基于.NET实现的家电维修保养信息系统[含文档+PPT+源码等]精品

1 项目简介 Hi&#xff0c;各位同学好呀&#xff0c;这里是卡莫&#xff01; 基于.NET实现的家电维修保养信息系统[含文档PPT源码等]精品 该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程等 软件开发环境及开发工具&#xff1a; 开发软件&#xff1a;…

怎么查看特定的端口是否被屏蔽了

文章目录 怎么查看特定的端口是否被屏蔽了前言无法访问原因查看命令所用环境开启windows的telnet功能查看特定端口是否被墙WSL演示windows终端演示总结 怎么查看特定的端口是否被屏蔽了 前言 如果你不知道自己的服务器的某个端口是否被屏蔽了&#xff0c;通过阅读本文&#x…

如何利用EAP系统优化锂电生产线的自动化流程?

锂电行业是新兴的能源产业&#xff0c;其快速发展和规模化生产对设备自动化系统的需求也越来越高。在生产过程中&#xff0c;设备自动化系统EAP&#xff08;Equipment Automation Program&#xff09;可以实现对生产线上的所有机台进行实时管控&#xff0c;从而实现设备运行的自…

“AIGC早报”已内测2个月了,来看看她长什么样子

今天&#xff0c;是咱们社群“AI产品经理大本营”六周年活动的第二天&#xff0c;正式给大家介绍下&#xff0c;已内测2个月的重要会员权益——AIGC日报。 会分三个部分&#xff1a;效果口碑、我们如何做到的、今日的AIGC早报展示‍‍‍‍‍‍‍‍ ps&#xff0c;文末会发福利星…

将群晖NAS加入域控,来点企业级应用

1. 使用逻辑 将NAS加入域&#xff0c;所有套件和文件可通过域用户来访问。设置NAS中的文件夹权限时&#xff0c;NAS识别出域用户和域群组&#xff0c;并可设置二级文件夹的权限。域管理员会成为NAS的管理员。在域控管理台&#xff0c;可以看到NAS加入到了域控中&#xff0c;在…

dom操作

<script>var htmlEldocument.documentElementvar bodyEldocument.bodyvar headEldocument.headvar doctypedocument.doctypeconsole.log(htmlEl,bodyEl,headEl,doctype)</script> ul>li{$}*5 节点之间的关系(极少用) 空行注释没标签包括的文字也算是一个节点 子…

快速排序加量改进_CUTOFF+三点中值法+三路划分

目录 1引入情境2 形式化描述2-1递归结构2-2 一次划分2-3 C实现 3 在工程中的改进3-1 处理重复元素双向划分三路划分C 实现 3-2 最差情况的改进三点中值法随机选择pivot短序列切回插入排序 4 全部改进技术加持 1引入情境 从低到高排成一队&#xff0c;怎么办&#xff1f; 以大雄…

通过gulp+vite搭建vue3组件库

核心要点 通过 vite 搭建运行环境通过 gulp 执行编译流程通过 vite 编译组件代码编写 组件测试 组件打包 编译组件上传 npm 1、通过 vite 搭建运行环境 这里主要是创建一个可以运行的测试的组件的环境&#xff0c;全局安装vite脚手架&#xff0c;并初始化项目 npm create v…

简单两步创建nVisual建筑场景

nVisual是一款网络基础设施可视化管理软件&#xff0c;通过模型可规划即将建设的机房效果&#xff0c;或者将已有的机房场景复刻至系统中&#xff0c;便于运维管理者清晰的了解机房设备及线缆路由连接关系。 数据初始我们需要将数据中心场景复刻至系统中&#xff0c;建筑场景也…

meta标签复习总结

文章目录 前言一、用在哪里二、用途1.charset2.http-equiv3.name4.content5.keywords 前言 我们往往忽视&#xff0c;却又很重要的一个标签&#xff0c;meta&#xff0c;它在页面细节上面还提供了不小的作用。 一、用在哪里 先来看看它用法 <!DOCTYPE html> <html …