当前位置: 首页 > news >正文

玉树电子商务网站建设多少钱网站防盗链怎么做

玉树电子商务网站建设多少钱,网站防盗链怎么做,专业的网站建设运营,宁波手机网站制作1.背景 产品需要实现一个待办提醒功能,就是核心业务发生变更即提醒业务员去处理相关业务。譬如:订单上传了支付凭证,那么就会提醒相关业务员去待办列表操办。 2.表设计 其实表设计主要是两张表sys_todo、sys_todo_detail 一张是待办核心表…

1.背景

产品需要实现一个待办提醒功能,就是核心业务发生变更即提醒业务员去处理相关业务。譬如:订单上传了支付凭证,那么就会提醒相关业务员去待办列表操办。

2.表设计

其实表设计主要是两张表sys_todo、sys_todo_detail

一张是待办核心表,主要是记录待办类型,待办业务id等。

CREATE TABLE `sys_todo` (`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id',`model` int NOT NULL DEFAULT '0' COMMENT '归属模块: 0-crm 1-srm',`type` int NOT NULL DEFAULT '0' COMMENT '待办类型',`biz_id` bigint NOT NULL DEFAULT '0' COMMENT '业务id',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='待办统计表';

另一张是待办详情表,主要是记录这个待办能做哪些操作。

CREATE TABLE `sys_todo_detail` (`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id',`todo_id` bigint NOT NULL DEFAULT '0' COMMENT 'sys_todo表id',`title` varchar(50) NOT NULL DEFAULT '' COMMENT '标题',`url` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '地址',`is_pop` int NOT NULL DEFAULT '0' COMMENT '是否弹窗 0-否 1-是',`content` varchar(3000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '内容',`sort_num` int NOT NULL DEFAULT '0' COMMENT '排序',PRIMARY KEY (`id`),KEY `idx_todo_id` (`todo_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='待办统计详情表';

举例:sys_todo 有个待办类型是【上传支付凭证】,id=1,sys_todo_detail 待办详情表,就有todo_id 为1的内容,譬如【查看】、【审核】操作的两条记录。

当然,这些表具体实现得根据具体业务设计来实现。

3.如何实现

3.1 业务埋点

业务埋点,也就是在每一个相关业务代码里面,加上待办的埋点,让相关待办业务内容插入待办表。譬如:【上传支付凭证】,就得在上传支付凭证的代码最后上传成功的地方,写上上传待办的业务代码。

3.2 切面Aspect + 策略模式

3.2.1 先定义好切面

这里我在项目里面,定义好切面类。

@Component
@Aspect
public class SrmTodoAspect {//这里拦截mybatis-plus底层方法@Pointcut("(execution(* com.baomidou.mybatisplus.extension.service.IService.update*(..))" +"||execution(* com.baomidou.mybatisplus.extension.service.IService.save*(..))" +"||execution(* com.baomidou.mybatisplus.core.mapper.BaseMapper.update*(..))" +"||execution(* com.baomidou.mybatisplus.core.mapper.BaseMapper.insert(..)))" )public void todo(){};//策略A@Resourceprivate ATodoStrategy aTodoStrategy;//策略B@Resourceprivate BTodoStrategy bTodoStrategy;//线程池@Resourceprivate TaskExecutor taskExecutor;@Around("todo()")public Object around(ProceedingJoinPoint point) throws Throwable {Object[] args = point.getArgs();Object obj = point.proceed();Object arg = args[0];List<Object> paramList = null;if(Objects.isNull(arg)){return obj;}if(arg instanceof ArrayList){paramList = (List)arg;}else {paramList = Arrays.asList(args);}if (CollectionUtil.isEmpty(paramList)){return obj;}/**  这里用到捕获异常很关键,不能因待办出现异常而影响主流程,*  用线程池避免待办处理过慢影响主流程性能*/taskExecutor.execute(()->{try{Thread.sleep(1000L);dealTodoStrategy(paramList);}catch (Exception e){}});return obj;}/**   TodoContext 是策略模式的上下文*   aTodoStrategy、bTodoStrategy 是具体的策略*/private void dealTodoStrategy(List<Object> paramList) {TodoContext context = null;Object param = paramList.get(0);if(param instanceof A){context = new TodoContext(aTodoStrategy);}else if(param instanceof B) {context = new TodoContext(bTodoStrategy);}if(context != null){context.executeStrategy(paramList);}}}

特别说一句:这里其实最初的设计并不是用切面,而是用mybatis拦截器 Interceptor 去实现获取到insert或update后的实体的,但是拦截mybatis-plus的saveBatch方法能拿到List实体,但是没有id。因此不能很好处理待办业务。原因:大家可以去看下CSDN

3.2.2 定义策略模式

策略接口(TodoStrategy 

public interface TodoStrategy {void dealTodo(List list);
}

Context类

public class TodoContext {private TodoStrategy strategy;public TodoContext(TodoStrategy strategy){this.strategy = strategy;}public void executeStrategy(List list){strategy.dealTodo(list);}
}

策略实现类 (ATodoStrategy )

@Service
public class ATodoStrategy implements TodoStrategy {@Overridepublic void dealTodo(List list) {if(CollectionUtil.isEmpty(list)){return;}TodoForm todoForm = null;List<Enquiry> enquiryList = (List)list;List<Long> enquiryIdList =         
enquiryList.stream().map(Enquiry::getId).collect(Collectors.toList());//根据id找到数据库实体类enquiryList = enquiryService.findList(new EnquiryQuery().setIdList(enquiryIdList));//遍历实体类,然后根据不同的实体状态去实现待办规则新增或消除功能for(Enquiry enquiry : enquiryList){Long id = enquiry.getId();//新增去报价待办if(EnquiryStatusEnum.WAIT_QUOTE.getKey().equals(enquiry.getStatus())){}//消除去报价待办if(EnquiryStatusEnum.HAD_QUOTE.getKey().equals(enquiry.getStatus())){}}}
}

4.总结

待办实现方式两种:①埋点 ②切面Aspect + 策略模式

个人比较推荐② ,因为这个代码设计好处如下:

1.不需要“过分”埋点。埋点的话,容易漏埋点。譬如新增代码业务代码在插入操作后埋点了,但是突然另一个业务也有插入操作,但是忘记埋点,那么待办就容易遗漏。

2.代码集中维护,模块分层清晰。也就是待办新增或消除逻辑,统一写在策略模式里面了,只需要去策略模式里面维护即可。这样也能减少在业务代码过多埋点造成代码臃肿。

http://www.yayakq.cn/news/55613/

相关文章:

  • windows2012系统怎么建设网站做视频的背景音乐哪里下载网站
  • 哈尔滨网站开发企业设计一个网站策划书
  • 做策划的都上哪些网站搜索资料间中国搜索引擎排行榜
  • 我想创业做网站专业做网站建
  • 石家庄行业网站建设prower wordpress
  • c 手机版网站开发海南建设工程股份有限公司网站
  • 网站后台服务器内部错误wordpress可视化
  • 自己免费建设网站网站动态背景欣赏
  • 网站高速下载如何做房屋装修设计师培训
  • 学网站建设与管理有用吗东莞竞价推广
  • 黄冈市建设局官方网站响应式机械类网站
  • 找设计网站公司小程序模板
  • 长沙网站建立公司加强单位门户网站建设的通知
  • 企业的门户网站一般用什么做1800做网站因为专业
  • 编写个人网站物联网平台是什么意思
  • 涪陵区小城镇建设管理处网站网站开发语言统计
  • 网站开发教程 视频网站搭建 里短信
  • 杭州网站推广宣传新手怎么建立自己的网站
  • 手表网站制作模板网页打不开但是有网什么原因禁用
  • 网站 横幅wordpress 免费ssl证书
  • 石家庄做外贸网站推广ufolio wordpress主题
  • 淄博公司制作网站有哪些视频做网站
  • 网站建设鸿儒app怎么创建
  • 永康公司网站建设国际国内新闻最新消息今天
  • 网站建设功能报怎样找家做网站的公司
  • 计算机网站开发与应用辽宁建设工程信息网官网新网站如何进入
  • 公司主营网站开发怎么做账两个wordpress
  • 常州建站优化客户引流的最快方法是什么
  • 有什么做h5的网站南阳网页制作公司
  • 旅游网站毕业设计源码镇江大港属于哪个区