ISDP010_基于DDD架构实现收银用例主成功场景

信息系统开发实践 | 系列文章传送门
ISDP001_课程概述
ISDP002_Maven上_创建Maven项目
ISDP003_Maven下_Maven项目依赖配置
ISDP004_创建SpringBoot3项目
ISDP005_Spring组件与自动装配
ISDP006_逻辑架构设计
ISDP007_Springboot日志配置与单元测试
ISDP008_SpringBoot Controller接口文档与测试
ISDP009_基于DDD架构设计ISDP的处理销售用例
ISDP010_基于DDD架构实现收银用例主成功场景

1 面向DDD重构mis-pos模块

重要说明:由于代码量增加,且经常需要重构。笔记将难以展示项目完整代码。本章笔记开始只展示部分代码。完整代码详见笔记最后项目仓库分支代码。

参考上篇分析与设计制品,参考DDD架构,重构的mis-pos模块的架构分层。

根据DDD架构分为application、domain、infrastructure三个包。
在这里插入图片描述

2 基础设施层

基础设施层暂时还没有写太多的类。只是添加了SaleFactory用于实例化Sale。

引入Hutool工具类,用于生成订单的雪花ID。

        <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.20</version></dependency>

编写SaleFactory,实例化Sale并设置初始化值。

package edu.scau.mis.pos.infrastructure.factory;import cn.hutool.core.util.IdUtil;
import edu.scau.mis.pos.domain.entity.Sale;
import edu.scau.mis.pos.domain.enums.SaleStatusEnum;
import org.springframework.stereotype.Component;import java.math.BigDecimal;
import java.util.Date;/*** Sale工厂类*/
@Component
public class SaleFactory {public Sale initSale(){Sale sale = new Sale();sale.setSaleNo("so-" + IdUtil.getSnowflakeNextId());sale.setSaleStatus(SaleStatusEnum.CREATED);sale.setTotalAmount(BigDecimal.ZERO);sale.setTotalQuantity(0);sale.setSaleTime(new Date());return sale;}}

3 领域层

在DDD架构中,领域层是重点关注层。

为了简化Setter和getter编写,引入了Lombok。

        <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>

3.1 SaleProduct实体类

SaleProduct实体类包含了业务逻辑方法getSubTotal,计算每个订单明细的小计。

package edu.scau.mis.pos.domain.entity;import edu.scau.mis.pos.domain.enums.SaleProductStatusEnum;
import lombok.Data;import java.math.BigDecimal;/*** 订单-产品明细实体类*/
@Data
public class SaleProduct {private Long saleProductId;private Long saleId;private Long productId;private Product product;private Integer saleQuantity;private BigDecimal salePrice;private SaleProductStatusEnum saleProductStatus;/*** 计算小计* @return*/public BigDecimal getSubTotal() {return salePrice.multiply(new BigDecimal(saleQuantity));}
}

3.2 支付实体类

支付类暂时还没有写业务逻辑方法。后期考虑通过适配器,连接第三方支付。

package edu.scau.mis.pos.domain.entity;import com.fasterxml.jackson.annotation.JsonFormat;
import edu.scau.mis.pos.domain.enums.PaymentStatusEnum;
import edu.scau.mis.pos.domain.enums.PaymentStrategyEnum;
import lombok.Data;import java.math.BigDecimal;
import java.util.Date;/*** 支付实体类*/
@Data
public class Payment {private Long paymentId;private Long paymentSaleId;private PaymentStrategyEnum paymentStrategy;private String paymentNo;private BigDecimal paymentAmount;@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private Date paymentTime;private PaymentStatusEnum paymentStatus;}

3.3 Sale聚合根

Sale类是收银领域层的聚合根。

该类内聚了两个业务逻辑方法,分别为添加订单明细和计算总金额。

package edu.scau.mis.pos.domain.entity;import com.fasterxml.jackson.annotation.JsonFormat;
import edu.scau.mis.pos.domain.enums.SaleStatusEnum;
import lombok.Data;import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;/*** 销售实体类* 聚合根*/
@Data
public class Sale {private Long saleId;private String saleNo;private BigDecimal totalAmount;private Integer totalQuantity;@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private Date saleTime;private Payment payment;private List<SaleProduct> saleProducts = new ArrayList<>();private SaleStatusEnum saleStatus;/*** 计算总金额* @return*/public BigDecimal getTotal(){totalAmount = BigDecimal.ZERO;totalQuantity = 0;for(SaleProduct saleProduct: saleProducts){totalAmount = totalAmount.add(saleProduct.getSubTotal());totalQuantity = totalQuantity + saleProduct.getSaleQuantity();}return totalAmount;}/*** 添加订单明细* @param product* @param saleQuantity* @return*/public List<SaleProduct> makeLineItem(Product product, Integer saleQuantity) {// 判断商品是否已录入,未录入则新增。已录入则修改数量。if(!isEntered(product.getProductSn(),saleQuantity)){SaleProduct saleProduct = new SaleProduct();saleProduct.setProduct(product);saleProduct.setSaleQuantity(saleQuantity);saleProduct.setSalePrice(product.getProductPrice());saleProducts.add(saleProduct);}return saleProducts;}/*** 判断商品是否已录入* 业务逻辑:如果已录入,则修改数量,否则添加saleLineItem* @param productSn* @param saleQuantity* @return*/private boolean isEntered(String productSn, Integer saleQuantity){boolean flag = false;for(SaleProduct sp : saleProducts){if(productSn.equals(sp.getProduct().getProductSn())) {flag = true;Integer quantityOriginal = sp.getSaleQuantity();sp.setSaleQuantity(quantityOriginal + saleQuantity);}}return flag;}
}

3.4 领域服务类SaleService

主要用于生成支付功能。ISDP项目POS系统设计支持挂单功能。

package edu.scau.mis.pos.domain.service.impl;import cn.hutool.core.util.IdUtil;
import edu.scau.mis.pos.domain.entity.Payment;
import edu.scau.mis.pos.domain.entity.Sale;
import edu.scau.mis.pos.domain.enums.PaymentStatusEnum;
import edu.scau.mis.pos.domain.enums.PaymentStrategyEnum;
import edu.scau.mis.pos.domain.service.ISaleService;
import org.springframework.stereotype.Service;import java.math.BigDecimal;
import java.util.Date;/*** 领域服务*/
@Service
public class SaleServiceImpl implements ISaleService {@Overridepublic Payment makePayment(Sale sale, String paymentStrategy, BigDecimal paymentAmount) {Payment payment = new Payment();payment.setPaymentStrategy(PaymentStrategyEnum.valueOf(paymentStrategy));payment.setPaymentNo(paymentStrategy + "-" + IdUtil.getSnowflakeNextId());payment.setPaymentAmount(paymentAmount);payment.setPaymentTime(new Date());payment.setPaymentStatus(PaymentStatusEnum.PAID);// TODO: 根据不同支付策略调用不同外部接口return payment;}
}

3.5 其他

Domain层还有仓库、枚举等包。由于暂时还没有使用数据库和Redis,仓库代码暂时没写。

写了一些枚举类。由于只是教学项目,没有设计过多状态。

package edu.scau.mis.pos.domain.enums;/*** 订单状态枚举*/
public enum SaleStatusEnum {CREATED("0","已预订"),SUBMITTED("1","已提交"),PAID("2","已支付");private String value;private String label;SaleStatusEnum(String value, String label) {this.value = value;this.label = label;}public String getLabel() {return label;}public String getValue() {return value;}/*** 根据匹配value的值获取Label** @param value* @return*/public static String getLabelByValue(String value){for (SaleStatusEnum s : SaleStatusEnum.values()) {if(value.equals(s.getValue())){return s.getLabel();}}return "";}/*** 获取StatusEnum** @param value* @return*/public static SaleStatusEnum getStatusEnum(String value){for (SaleStatusEnum s : SaleStatusEnum.values()) {if(value.equals(s.getValue())){return s;}}return null;}
}

支付策略枚举类

package edu.scau.mis.pos.domain.enums;/*** 支付策略枚举*/
public enum PaymentStrategyEnum {WECHAT("wechat","微信支付"),ALIPAY("alipay","支付宝"),CASH("cash","现金");private String value;private String label;PaymentStrategyEnum(String value, String label) {this.value = value;this.label = label;}public String getLabel() {return label;}public String getValue() {return value;}/*** 根据匹配value的值获取Label** @param value* @return*/public static String getLabelByValue(String value){for (PaymentStrategyEnum s : PaymentStrategyEnum.values()) {if(value.equals(s.getValue())){return s.getLabel();}}return "";}/*** 获取StatusEnum** @param value* @return*/public static PaymentStrategyEnum getStrategyEnum(String value){for (PaymentStrategyEnum s : PaymentStrategyEnum.values()) {if(value.equals(s.getValue())){return s;}}return null;}
}

4 应用层

4.1 应用服务类SaleApplicationService

编写SaleApplicationService类。该类主要负责跨领域协作。

目前主要就两个领域Sale(SaleProduct、Payment)和Product(Category)。

如果使用微服务,可以分别针对这两个领域创建两个微服务模块。

package edu.scau.mis.pos.application.service;import edu.scau.mis.pos.application.assembler.SaleAssembler;
import edu.scau.mis.pos.application.dto.command.EnterItemCommand;
import edu.scau.mis.pos.application.dto.command.MakePaymentCommand;
import edu.scau.mis.pos.application.dto.vo.*;
import edu.scau.mis.pos.domain.entity.Payment;
import edu.scau.mis.pos.domain.entity.Product;
import edu.scau.mis.pos.domain.entity.Sale;
import edu.scau.mis.pos.domain.entity.SaleProduct;
import edu.scau.mis.pos.domain.enums.SaleStatusEnum;
import edu.scau.mis.pos.domain.service.IProductService;
import edu.scau.mis.pos.infrastructure.factory.SaleFactory;
import edu.scau.mis.pos.domain.service.ISaleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class SaleApplicationService {@Autowiredprivate IProductService productService;@Autowiredprivate ISaleService saleService;@Autowiredprivate SaleFactory saleFactory;@Autowiredprivate SaleAssembler saleAssembler;private Sale currentSale; // 后期改成Redis缓存CurrentSale/*** 开始一次新销售* @return*/public SaleVo makeNewSale(){SaleVo saleVo = new SaleVo();currentSale = saleFactory.initSale();// TODO:引入Redis缓存return saleAssembler.toSaleVo(currentSale);}/*** 录入商品* @param command* @return*/public SaleAndProductListVo enterItem(EnterItemCommand command){SaleAndProductListVo saleAndProductListVo = new SaleAndProductListVo();Product product = productService.selectProductBySn(command.getProductSn());List<SaleProduct> saleProducts = currentSale.makeLineItem(product, command.getSaleQuantity());currentSale.getTotal();List<SaleProductVo> saleProductVoList = saleProducts.stream().map(saleProduct -> new SaleProductVo(saleProduct.getProduct().getProductSn(), saleProduct.getProduct().getProductName(), saleProduct.getSalePrice(), saleProduct.getSaleQuantity())).toList();saleAndProductListVo.setSaleVo(saleAssembler.toSaleVo(currentSale));saleAndProductListVo.setSaleProductVoList(saleProductVoList);return saleAndProductListVo;}/*** 结束销售* 计算优惠、持久化订单等* @return*/public SaleVo endSale(){currentSale.setSaleStatus(SaleStatusEnum.SUBMITTED);// TODO: 持久化Sale和SaleProduct,添加事务注解return saleAssembler.toSaleVo(currentSale);}/*** 完成支付* @param command* @return*/public SaleAndPaymentVo makePayment(MakePaymentCommand command){SaleAndPaymentVo saleAndPaymentVo = new SaleAndPaymentVo();// TODO: 挂单--根据saleNo获取SalePayment payment = saleService.makePayment(currentSale,command.getPaymentStrategy(), command.getPaymentAmount());currentSale.setPayment(payment);currentSale.setSaleStatus(SaleStatusEnum.PAID);// TODO: 持久化Sale和Payment,添加事务注解// payment.setPaymentSaleId(sale.getSaleId());saleAndPaymentVo.setSaleVo(saleAssembler.toSaleVo(currentSale));saleAndPaymentVo.setPaymentVo(saleAssembler.toPaymentVo(payment));return saleAndPaymentVo;}
}

4.2 数据传输对象DTO

ISDP项目采用CQRS思想,该层编写大量的数据传输对象DTO。笔记只展示部分代码。详细参加项目仓库。

EnterItemCommand参考代码如下。

后期将使用Redis缓存currentSale,设计saleNo作为key。保留saleNo备用。

package edu.scau.mis.pos.application.dto.command;import lombok.Data;import java.io.Serializable;/*** 输入订单明细命令*/
@Data
public class EnterItemCommand implements Serializable {private String saleNo;private String productSn;private Integer saleQuantity;
}

MakePaymentCommand代码参考如下:

同上,saleNo暂时不需要。

package edu.scau.mis.pos.application.dto.command;import lombok.Data;import java.io.Serializable;
import java.math.BigDecimal;/*** 创建支付命令*/
@Data
public class MakePaymentCommand implements Serializable {private String saleNo;private BigDecimal paymentAmount;private String paymentStrategy;
}

SaleVo类

package edu.scau.mis.pos.application.dto.vo;import lombok.Data;import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
@Data
public class SaleVo implements Serializable {private String saleNo;private BigDecimal totalAmount;private Integer totalQuantity;private Date saleTime;private String saleStatus;
}

SaleAndPaymentVo

package edu.scau.mis.pos.application.dto.vo;import lombok.Data;import java.io.Serializable;
@Data
public class SaleAndPaymentVo implements Serializable {private SaleVo saleVo;private PaymentVo paymentVo;
}

4.3 对象转换器SaleAssembler

面向接口层主要使用DTO对象,因此不可避免涉及到DTO与领域对象的转换。

package edu.scau.mis.pos.application.assembler;import edu.scau.mis.pos.application.dto.vo.PaymentVo;
import edu.scau.mis.pos.application.dto.vo.SaleVo;
import edu.scau.mis.pos.domain.entity.Payment;
import edu.scau.mis.pos.domain.entity.Sale;
import org.springframework.stereotype.Component;/*** 订单转换器* 实现DTO与Entity的转换*/@Component
public class SaleAssembler {public SaleVo toSaleVo(Sale sale){SaleVo saleVo = new SaleVo();saleVo.setSaleNo(sale.getSaleNo());saleVo.setTotalAmount(sale.getTotalAmount());saleVo.setTotalQuantity(sale.getTotalQuantity());saleVo.setSaleTime(sale.getSaleTime());saleVo.setSaleStatus(sale.getSaleStatus().getLabel());return saleVo;}public PaymentVo toPaymentVo(Payment payment){PaymentVo paymentVo = new PaymentVo();paymentVo.setPaymentId(payment.getPaymentId());paymentVo.setPaymentSaleId(payment.getPaymentSaleId());paymentVo.setPaymentNo(payment.getPaymentNo());paymentVo.setPaymentAmount(payment.getPaymentAmount());paymentVo.setPaymentTime(payment.getPaymentTime());paymentVo.setPaymentStrategy(payment.getPaymentStrategy().getLabel());paymentVo.setPaymentStatus(payment.getPaymentStatus().getLabel());return paymentVo;}
}

5 接口层

5.1 Controller接口

SaleController参考如下:

package edu.scau.mis.web.controller;import edu.scau.mis.pos.application.dto.command.EnterItemCommand;
import edu.scau.mis.pos.application.dto.command.MakePaymentCommand;
import edu.scau.mis.pos.application.dto.vo.SaleAndPaymentVo;
import edu.scau.mis.pos.application.dto.vo.SaleAndProductListVo;
import edu.scau.mis.pos.application.dto.vo.SaleVo;
import edu.scau.mis.pos.application.service.SaleApplicationService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/sale")
public class SaleController {@Autowiredprivate SaleApplicationService saleApplicationService;@GetMapping("/makeNewSale")public ResponseEntity<SaleVo> makeNewSale(){return ResponseEntity.ok(saleApplicationService.makeNewSale());}@PostMapping("/enterItem")public ResponseEntity<SaleAndProductListVo> enterItem(@RequestBody  EnterItemCommand enterItemCommand){return ResponseEntity.ok(saleApplicationService.enterItem(enterItemCommand));}@GetMapping("/endSale")public ResponseEntity<SaleVo> endSale(){return ResponseEntity.ok(saleApplicationService.endSale());}@PostMapping("/makePayment")public ResponseEntity<SaleAndPaymentVo> makePayment(@RequestBody MakePaymentCommand makePaymentCommand){return ResponseEntity.ok(saleApplicationService.makePayment(makePaymentCommand));}
}

5.2 接口测试

使用Knife4j对SaleController接口进行测试,简单验证后端业务逻辑。

5.2.1 makeNewSale接口

该接口目前只是初始化currentSale数据。
在这里插入图片描述

5.2.2 enterItem接口

接口接收产品编号和订购数量。

接口返回订单和订购商品集合的json数据。

在这里插入图片描述

5.2.3 endSale接口

该接口暂时未写太多业务逻辑,只是提交订单,更新订单状。

后期将会从redis中清除缓存currentSale,然后持久化currentSale数据。
在这里插入图片描述

5.2.4 makePayment接口

接口接收支付金额和支付方式两个参数。

接口返回订单和支付json数据。
在这里插入图片描述
本章笔记基于上篇的分析与设计模型,编写DDD架构基础设施层、领域层、应用层和接口层的代码。实现了收银用例的4个主要步骤makeNewSale、enterItem、endSale和makePayment。

下一篇笔记将应用适配器模式调用支付宝沙箱支付接口。

本笔记项目仓库地址:
https://gitcode.com/tiger2704/isdp-boot3/tree/isdp010

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

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

相关文章

中学数学:一个函数值计算题

在数学的领域中&#xff0c;函数是一种描述变量之间关系的桥梁&#xff0c;它能够揭示出看似复杂现象背后的简洁规律。通过函数&#xff0c;我们可以预测、分析并解决实际问题。在这张图片中&#xff0c;我们看到了一位数学爱好者手写的解题过程&#xff0c;它展示了如何巧妙地…

#渗透测试#漏洞挖掘#红蓝攻防#常见未授权访问漏洞汇总

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

基于Oauth2的SSO单点登录---前端

Vue-element-admin 是一个基于 Vue.js 和 Element UI 的后台管理系统框架&#xff0c;提供了丰富的组件和功能&#xff0c;可以帮助开发者快速搭建现代化的后台管理系统。 一、基本知识 &#xff08;一&#xff09;Vue-element-admin 的主要文件和目录 vue-element-admin/ |--…

华为 AI Agent:企业内部管理的智能变革引擎(11/30)

一、华为 AI Agent 引领企业管理新潮流 在当今数字化飞速发展的时代&#xff0c;企业内部管理的高效性与智能化成为了决定企业竞争力的关键因素。华为&#xff0c;作为全球领先的科技巨头&#xff0c;其 AI Agent 技术在企业内部管理中的应用正掀起一场全新的变革浪潮。 AI Ag…

RustDesk内置ID服务器,Key教程

RustDesk内置ID服务器&#xff0c;Key教程 首先需要准备一个域名&#xff0c;并将其指定到你的 rustdesk 服务器 ip 地址上&#xff0c;这里编译采用的是Github Actions &#xff0c;说白了是就workflows&#xff0c;可以创建一些自动化的工作流程&#xff0c;例如代码的检查&a…

Wend看源码-Java-集合学习(List)

摘要 本篇文章深入探讨了基于JDK 21版本的Java.util包中提供的多样化集合类型。在Java中集合共分类为三种数据结构&#xff1a;List、Set和Queue。本文将详细阐述这些数据类型的各自实现&#xff0c;并按照线程安全性进行分类&#xff0c;分别介绍非线程安全与线程安全的实现方…

阿里云新用户服务器配置

创建和链接实例 创建实例&#xff0c;点击左侧标签栏总的实例&#xff0c; 找到链接帮助 根据帮助中的ip信息&#xff0c;然后启用vscode的ssh链接 ctrlp选择配置&#xff0c;输入公网的ip即可 passwd修改root密码 安装conda 参考 https://blog.csdn.net/adreammaker/arti…

五金产品视觉检测

五金产品种类繁多&#xff0c;且与我们的日常生活紧密有关&#xff0c;依照加工工艺的不同&#xff0c;五金产品有压铸件&#xff0c;五金冲压件&#xff0c;铸件等&#xff0c;无论是哪种加工方式&#xff0c;产品总会存在各式各样的问题&#xff0c;今天我们就五金产品的缺陷…

拼多多纠偏,能否实现买卖平权?

科技新知 原创作者丨江蓠 编辑丨蕨影 当曾将仅退款、运费险作为标配的电商平台们开始听到商家诉求&#xff0c;有意优化营商环境&#xff0c;作为“仅退款”服务发起者的拼多多也坐不住了。 在推出一揽子减免计划讨好中小商家之后&#xff0c;拼多多近期被传正在内测精选用户…

XGPT用户帮助手册

文章目录 20242024.12.27 摘要 本文介绍如何使用XGPT软件, XGPT融合了当前最先进的人工智能技术&#xff0c;并专为国内用户优化。 2024 2024.12.27 XGPT v1正式发布, 特色功能: 具备图像文本多模态处理功能包含GPT等最先进模型国内可访问 B站视频介绍 图1 XGPT v1 快照

低代码开源项目Joget的研究——Joget7社区版安装部署

大纲 环境准备安装必要软件配置Java配置JAVA_HOME配置Java软链安装三方库 获取源码配置MySql数据库创建用户创建数据库导入初始数据 配置数据库连接配置sessionFactory编译下载tomcat启动下载aspectjweaver移动jw.war文件编写脚本运行 测试参考资料 Joget&#xff0c;作为一款开…

后端开发如何高效使用 Apifox?

Apifox 是一个 API 协作开发平台&#xff0c;后端、前端、测试都可以使用 Apifox 来提升团队的工作效率。对于后端开发者而言&#xff0c;Apifox 的核心功能主要包括四个模块&#xff1a;调用 API、定义 API、开发与调试 API 以及生成 API 文档。本文将详细介绍后端开发人员如何…

flask后端开发(11):User模型创建+注册页面模板渲染

目录 一、数据库创建和配置信息1.新建数据库2.数据库配置信息3.User表4.ORM迁移 二、注册页面模板渲染1.导入静态文件2.蓝图注册路由 一、数据库创建和配置信息 1.新建数据库 终端中 CREATE DATABASE zhiliaooa DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;2…

极客说|微软新模型:Phi-4 来了

作者&#xff1a;魏新宇 - 微软 AI 全球黑带高级技术专家 「极客说」 是一档专注 AI 时代开发者分享的专栏&#xff0c;我们邀请来自微软以及技术社区专家&#xff0c;带来最前沿的技术干货与实践经验。在这里&#xff0c;您将看到深度教程、最佳实践和创新解决方案。关注「极客…

redis相关数据类型介绍

当然&#xff0c;Redis 作为一个高性能的键值存储系统&#xff0c;提供了多种数据类型来支持不同的应用场景。 1. String&#xff08;字符串&#xff09; • 定义&#xff1a;Redis 最基本的数据类型&#xff0c;用于存储字符串值。 • 操作&#xff1a;SET、GET、INCR、DECR、…

arthas查看拼接好参数的sql, redis, es完整可直接执行的命令

arthas查看拼接好参数的sql, redis, es完整可直接执行的命令 arthas查看sql可执行命令arthas查看redis可执行命令arthas查看es可执行命令相关链接 经常修bug的时候, 拿不到能够执行的命令, 真是太难受了 arthas查看sql可执行命令 # mybatis plus (参数和sql分离了) watch org.…

OpenHarmony怎么修改DPI密度值?RK3566鸿蒙开发板演示

本文介绍在开源鸿蒙OpenHarmony系统下&#xff0c;修改DPI密度值的方法&#xff0c;触觉智能Purple Pi OH鸿蒙开发板演示&#xff0c;搭载了瑞芯微RK3566四核处理器&#xff0c;Laval鸿蒙社区推荐开发板&#xff0c;已适配全新开源鸿蒙OpenHarmony5.0 Release系统&#xff0c;适…

电子应用设计方案74:智能家庭对讲系统设计

智能家庭对讲系统设计 一、引言 智能家庭对讲系统作为智能家居的重要组成部分&#xff0c;为家庭成员之间以及与访客的沟通提供了便捷、高效的方式。本设计方案旨在打造一个功能强大、稳定可靠、操作简便且具有良好扩展性的智能家庭对讲系统。 二、系统概述 1. 系统目标 - 实…

《鸿蒙HarmonyOS应用开发从入门到精通(第2版)》学习笔记——HarmonyOS技术理念

1.2 技术理念 在万物智联时代重要机遇期&#xff0c;HarmonyOS结合移动生态发展的趋势&#xff0c;提出了三大技术理念&#xff08;如下图3-1所示&#xff09;&#xff1a;一次开发&#xff0c;多端部署&#xff1b;可分可合&#xff0c;自由流转&#xff1b;统一生态&#xf…

《医药养生保健报》是正规报刊吗?如何在数据库搜索报刊信息?

在数据库检索报刊的正规性&#xff0c;可以说是论文发表环节中一个重中之重的环节。文章能否被数据库正常收录&#xff0c;很大程度上会影响到毕业、评职称的审核结果。 目前主流认可的三大数据库分别为中国知网、万方数据以及维普资讯。接下来就让我们以《医药养生保健报》为例…