首页 文章 精选 留言 我的

精选列表

搜索[主题管理],共10000篇文章
优秀的个人博客,低调大师

Knative Service 之流量灰度和版本管理

本篇主要介绍 Knative Serving 的流量灰度,通过一个 rest-api 的例子演示如何创建不同的 Revision、如何在不同的 Revision 之间按照流量比例灰度。 部署 rest-api v1 代码 测试之前我们需要写一段 rest-api 的代码,并且还要能够区分不同的版本。下面我基于官方的例子进行了修改,为了使用方便去掉了 github.com/gorilla/mux 依赖,直接使用 Golang 系统包 net/http 替代。这段代码可以通过 RESOURCE 环境变量来区分不同的版本。 package main import ( "fmt" "io/ioutil" "log" "net/http" "net/url" "os" "flag"

优秀的个人博客,低调大师

基于Tablestore的共享汽车管理平台

前言 目前出行市场主要分为传统和新兴两个阵营:私家车、公共交通、出租车和长租车为传统出行提供服务,共享单车、网约车以及分时租赁共享汽车则是最近几年兴起的出行方式。_图1 出行方式分析_出行者往往是在成本和出行便捷之间权衡选择出行方式。从出行距离来看,在0~10公里以内,共享单车、网约车以及出租车兼具了低成本以及灵活性两个优势,所以往往是出行者的首选。超过100公里以上,私家车以及长租车则会显现其便捷性。但是在10~100公里之间,则存在一个出行服务真空市场。另外,在一二线城市中,10公里以上的出行需求还是非常大的,加上近几年国家的政策导向,国内出现了很多共享汽车租赁平台。按照罗兰贝格估算,2025年有600万辆分时租赁汽车,每辆车每天3-4单,日订单量约2000万单。这个行业还是具备很大的潜力。本文主要介绍如何基于Tablestor

优秀的个人博客,低调大师

SSM+maven实现答题管理系统(二)

好的,现在我们来实现删除模板(model表删除记录)的功能,删除功能不难做,主要我们这次实现的是批量删除功能。 一.思路整理 首先我们删除模板是根据模板的id来删除的,不管是单项删除还是批量删除,我们这里使用layui获取当前行的功能就能获取模板的id 其次不管单项删除还是批量删除,只要将id放入数组中,后端对数组进行遍历,就能达到单项删除/批量删除 二.代码实现 思路实现以后,我们上代码。 View层: var id_array = []; //获取选中行 // 获取选中行 这里我们可以选择删除 这里的id_array是一个隐藏的值 device对应device_id user对应code survry对应model_id table.on('checkbox(test)', function(obj) { //监听复选框 if (obj.type == 'all') { if (obj.checked == true) { var data = table.cache.dataCheck; //批量操作的表格复选框 id_array = []; for (var l = 0; l < data.length; l++) { id_array.push(data[l].model_id); } console.log(id_array); } else { id_array = []; } } else { if (obj.checked == true) { id_array.push(obj.data.model_id); console.log(id_array); } else { var index = id_array.indexOf(obj.data.model_id); id_array.splice(index, 1); console.log(id_array); } } }); $('#btn-delete-all').click(function() { //删除全部通过一个获取选中行的值,来删除 layer.confirm('您确定要删除这些数据吗?', function(index) { //打开正在加载中弹出层 layer.msg('加载中', { icon: 16, shade: 0.01, time: '9999999' }); var url = "survey/del_model"; var data = { model_id: id_array //这里将当前的model_id传到后端 } $.post(url, data, function(data) { layer.close(layer.index); //关闭正在加载中弹出层 console.log(id_array); if (data.code == 1) { layer.msg(data.msg, { icon: 6 }); location.reload(); } else { layer.msg(data.msg, { icon: 5 }); } }, "json"); }); }); 首先对数据表格进行监听,如果数据表格的当前行被选中,则往id_array数组中push一个id,有多少个,push多少个,而后我们将数组用ajax上传,键名为model_id. Controller层: //返回数据用responseBody //删除model @RequestMapping(value="Index/survey/del_model") @ResponseBody public Map<String,Object> delModel(HttpServletRequest req) throws IOException { String[] arr = req.getParameterValues("model_id[]");//前端传来的modelId int code; String msg; // if(arr!=null) // return api.returnJson(3,arr[0]); for (int i = 0; i < arr.length; i++) { List<Choose> is_answer=chooseService.findChooseByModelId(arr[i]); if (!is_answer.isEmpty()) { return api.returnJson(3,"抱歉,题目已经被作答,无法删除"); } continue; } //如果没有 那么当前选中模板的题目都没有被答过 作级联删除 删除模板表 删除题目表 删除选项表(根据model查出Qsn 再根据qsnId删除Option) int is_del=modelService.deleteModelByIds(arr);//删除模板表 for (int i = 0; i <arr.length ; i++) { int is_del_qsn=qsnService.deleteModel2Qsn(arr[i]);//删除题目表 List<Qsn> qsnList=qsnService.findQsnList(arr[i]);//得到题目 System.out.println(qsnList); for (int j = 0; j <qsnList.size() ; j++) {//删除选项表 int isDelOptions=detailService.deleteOptionsByQsnId(qsnList.get(j).getQsnId()); } } //先查询模板下的题目list 然后遍历list,根据item.id 即qsnId来删除 // String[] is_del_option 还缺删除选项表的逻辑 if (is_del!=0){ code=1; msg="success"; }else { code=2; msg="fail"; } return api.returnJson(code,msg); } 这里进行说明一下,区别于tp5,我们使用httpservlet.request的getParameterValues()方法来获取前端传入的array数组 Service层: modelService: package com.sl.example.service; import com.sl.example.pojo.Model; import java.util.List; public interface ModelService { public List<Model> findAllModel(); public int deleteModelById(String modelId); public int deleteModelByIds(String[] arr); public int InsertModel(Model model); public Model selectModelById(String modelId); } modelServiceImpl: package com.sl.example.service; import com.sl.example.dao.ModelMapper; import com.sl.example.pojo.Model; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.List; @Service("modelService") @Transactional public class ModelServiceImpl implements ModelService{ @Resource private ModelMapper modelMapper; @Override public List<Model> findAllModel() { return modelMapper.selectAllModel(); } @Override public int deleteModelById(String modelId) { return modelMapper.deleteByPrimaryKey(modelId); } @Override public int deleteModelByIds(String[] arr) { return modelMapper.deleteByIds(arr); } @Override public int InsertModel(Model model) { return modelMapper.insertSelective(model); } @Override public Model selectModelById(String modelId) { return modelMapper.selectByPrimaryKey(modelId); } } 将DAO层也贴出来: package com.sl.example.dao; import com.sl.example.pojo.Model; import java.util.List; public interface ModelMapper { int deleteByPrimaryKey(String modelId); int deleteByIds(String[] list); int insert(Model record); int insertSelective(Model record); Model selectByPrimaryKey(String modelId); List<Model> selectAllModel(); int updateByPrimaryKeySelective(Model record); int updateByPrimaryKey(Model record); } 对应的ModelMapper.xml: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace="com.sl.example.dao.ModelMapper" > <resultMap id="BaseResultMap" type="com.sl.example.pojo.Model" > <constructor > <idArg column="model_id" jdbcType="VARCHAR" javaType="java.lang.String" /> <arg column="name" jdbcType="VARCHAR" javaType="java.lang.String" /> <arg column="time" jdbcType="DATE" javaType="java.util.Date" /> <arg column="create_name" jdbcType="VARCHAR" javaType="java.lang.String" /> <arg column="rmk2" jdbcType="VARCHAR" javaType="java.lang.String" /> <arg column="rmk3" jdbcType="VARCHAR" javaType="java.lang.String" /> <arg column="rmk4" jdbcType="VARCHAR" javaType="java.lang.String" /> <arg column="rmk5" jdbcType="VARCHAR" javaType="java.lang.String" /> </constructor> </resultMap> <sql id="Base_Column_List" > model_id, name, time, create_name, rmk2, rmk3, rmk4, rmk5 </sql> <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.String" > select <include refid="Base_Column_List" /> from t_gr_qsn_model where model_id = #{modelId,jdbcType=VARCHAR} </select> <select id="selectAllModel" resultMap="BaseResultMap" resultType="java.util.List"> select <include refid="Base_Column_List" /> from t_gr_qsn_model </select> <delete id="deleteByPrimaryKey" parameterType="java.lang.String" > delete from t_gr_qsn_model where model_id = #{modelId,jdbcType=VARCHAR} </delete> <delete id="deleteByIds" parameterType="java.util.Arrays"> delete from t_gr_qsn_model where model_id in <foreach collection="array" index="index" item="item" open="(" separator="," close=")"> #{item} </foreach> </delete> <insert id="insert" parameterType="com.sl.example.pojo.Model" > insert into t_gr_qsn_model (model_id, name, time, create_name, rmk2, rmk3, rmk4, rmk5) values (#{modelId,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR}, #{time,jdbcType=DATE}, #{createName,jdbcType=VARCHAR}, #{rmk2,jdbcType=VARCHAR}, #{rmk3,jdbcType=VARCHAR}, #{rmk4,jdbcType=VARCHAR}, #{rmk5,jdbcType=VARCHAR}) </insert> <insert id="insertSelective" parameterType="com.sl.example.pojo.Model" > insert into t_gr_qsn_model <trim prefix="(" suffix=")" suffixOverrides="," > <if test="modelId != null" > model_id, </if> <if test="name != null" > name, </if> <if test="time != null" > time, </if> <if test="createName != null" > create_name, </if> <if test="rmk2 != null" > rmk2, </if> <if test="rmk3 != null" > rmk3, </if> <if test="rmk4 != null" > rmk4, </if> <if test="rmk5 != null" > rmk5, </if> </trim> <trim prefix="values (" suffix=")" suffixOverrides="," > <if test="modelId != null" > #{modelId,jdbcType=VARCHAR}, </if> <if test="name != null" > #{name,jdbcType=VARCHAR}, </if> <if test="time != null" > #{time,jdbcType=DATE}, </if> <if test="createName != null" > #{createName,jdbcType=VARCHAR}, </if> <if test="rmk2 != null" > #{rmk2,jdbcType=VARCHAR}, </if> <if test="rmk3 != null" > #{rmk3,jdbcType=VARCHAR}, </if> <if test="rmk4 != null" > #{rmk4,jdbcType=VARCHAR}, </if> <if test="rmk5 != null" > #{rmk5,jdbcType=VARCHAR}, </if> </trim> </insert> <update id="updateByPrimaryKeySelective" parameterType="com.sl.example.pojo.Model" > update t_gr_qsn_model <set > <if test="name != null" > name = #{name,jdbcType=VARCHAR}, </if> <if test="time != null" > time = #{time,jdbcType=DATE}, </if> <if test="createName != null" > create_name = #{createName,jdbcType=VARCHAR}, </if> <if test="rmk2 != null" > rmk2 = #{rmk2,jdbcType=VARCHAR}, </if> <if test="rmk3 != null" > rmk3 = #{rmk3,jdbcType=VARCHAR}, </if> <if test="rmk4 != null" > rmk4 = #{rmk4,jdbcType=VARCHAR}, </if> <if test="rmk5 != null" > rmk5 = #{rmk5,jdbcType=VARCHAR}, </if> </set> where model_id = #{modelId,jdbcType=VARCHAR} </update> <update id="updateByPrimaryKey" parameterType="com.sl.example.pojo.Model" > update t_gr_qsn_model set name = #{name,jdbcType=VARCHAR}, time = #{time,jdbcType=DATE}, create_name = #{createName,jdbcType=VARCHAR}, rmk2 = #{rmk2,jdbcType=VARCHAR}, rmk3 = #{rmk3,jdbcType=VARCHAR}, rmk4 = #{rmk4,jdbcType=VARCHAR}, rmk5 = #{rmk5,jdbcType=VARCHAR} where model_id = #{modelId,jdbcType=VARCHAR} </update> </mapper> 我们来试验一下。 1.gif 成功啦,下一节我们讲对应某一套题目模板下的题目的增删。

优秀的个人博客,低调大师

我来悟微服务(3)-需求管理

无限合并 最近工作上接到一个需求模块:关于账号自动合并的问题。简化来讲,手机1和邮箱1是一个账号,手机1和邮箱2请求过来创建账号时,由于手机号相同,自动合并为一个账号。手机3和邮箱2再过来请求创建账号,由于邮箱相同,自动合并为一个账号。手机3和邮箱4过来请求创建账号时,又因为手机号相同,再次合并为一个账号……假如是个访问量很大并且又这么巧的时候,就类似于无限合并了。实际上可能仅会出现几笔,不会这样无限循环下去。但我是一个容易多想的人。账号合并,又关联着和账号相关的数据的迁移,从我个人的角度来说,这样没有边界防御的需求,我内心是拒绝的,但还没想好更好的办法,暂且如此了。 这个话题联想到微服务,微服务能解决这种问题么?很遗憾,微服务并不是想象中的那么强大。账号合并本质上可以做成一个微服务,但微服务并不能解决这种业务问题。 我认识的微服务是为了方便水平扩展,方便使用体验异构技术,方便快速试错,方便部署,能最终实现高可用高并发。你了解再多的微服务知识,也不是用于解决此类业务问题。 对于此类业务问题,一般方式是判断需求是否合理?不合理的需求可以适当拒绝掉。 再着看是谁提的?如果是普通客户,尽量用其他更简便容易维护的方式代替。如果是金主或上层领导派发需求,那就只能在总结风险的基础上,一步一步往前看吧。 第三看需求是否通用,通用化的解决方案一般是更易理解,更适合推广。定制化得需求是耗时耗力的。 第四判断影响范围,如果是个高风险,又耗时又要牵扯很多旧业务,你敢动么?谨慎谨慎再谨慎。 需求判断阶段完毕,下面说说规避风险 第一,清晰的标注需求影响边界,改动后要及时单元测试或人工测试。你改的任何一行代码都有可能引发一个隐藏的碧游鸡。 第二,不要盲目动刀,一定要分析需求。对需求茫然的情况下,盲目码砖,你会很累的。更有甚者,需求本身只是显示了冰山一角,还有广大的未知冰山底层埋藏。如果不能提前发现,你的时间会越来越短,要做的事反而越来越多。这是一种失控。有时候失控是可预知但必须迎难而上的。有时候又可以轻易靠几句话轻易甩锅的。这本来也是一种修炼。 第三,人员分配。对合作的项目成员要有必要的了解,擅长的人做擅长的事。 第四,会议纪要。有时候频繁地会议是少不了的,有营养的思路应该记录下来方便实践。有疑问应及时去讨论,不要想当然。想当然是最浪费时间的事情。 这些事情和微服务无关。但这些功能最终可以称为一个微服务。这可以理解为微服务开发过程如何识别需求,开发需求的思路。 微服务来源于生活高于生活。 首发简书:https://www.jianshu.com/p/ab4f11fb4e77 作者:从此启程/范存威 出处:http://www.cnblogs.com/fancunwei/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。如文章对您有用,烦请点个推荐再走,感谢! 本博客新开通打赏,鼠标移到右侧打赏浮动处,即可赏博主点零花钱,感谢您的支持!

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册