C#绘制含流动块的管道

1,效果。

2,绘制技巧。

1,流动块的实质是使用Pen的自定义DashStyle绘制的线,并使用线的偏移值呈现出流动的效果。

 Pen barPen = new Pen(BarColor, BarHeight);barPen.DashStyle = DashStyle.Custom;barPen.DashOffset = startOffset;barPen.DashPattern = new float[] { BarLength, GapLength };graphicsPath.StartFigure();g.DrawPath(barPen, graphicsPath);

2,使用GraphicsPath,绘制包含弧的多段线。

 GraphicsPath graphicsPath = new GraphicsPath();//特别需要注意角度旋转方向,如果角度旋转方向选错就形成闭环
graphicsPath.AddArc(new Rectangle(this.Height / 2, this.Height / 2 * (-1) - 1, this.Height, this.Height), 180.0f, -90.0f);

3,对于扇形区域使用渐变色时需要使用PathGradientBrush画刷而不是 LinearGradientBrush, LinearGradientBrush画刷无法实现从圆心到边缘的颜色渐变。

void PaintRectangle(Graphics g, Rectangle rec, PointF[] points, LinearGradientMode linearGradientMode = LinearGradientMode.Vertical){//画刷效果呈现线型分布,注意与PathGradientBrush的区别LinearGradientBrush brush = new LinearGradientBrush(rec, PipeEdgeColor, PipeCenterColor, linearGradientMode);brush.InterpolationColors = new ColorBlend() { Colors = new Color[] { PipeEdgeColor, PipeCenterColor, PipeEdgeColor }, Positions = new float[] { 0, 0.5f, 1 } };brush.InterpolationColors = new ColorBlend() { Colors = new Color[] { PipeEdgeColor, PipeCenterColor, PipeEdgeColor }, Positions = new float[] { 0, 0.5f, 1 } };g.FillRectangle(brush, rec);g.DrawLine(new Pen(BorderColor, BorderWidth), points[0], points[1]);g.DrawLine(new Pen(BorderColor, BorderWidth), points[2], points[3]);}

3,使用自定义的流动管道控件(FlowControl)

引用控件

属性窗口设置自定义的相关属性

设置后效果

4,代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
namespace CustomControl
{public partial class FlowControl : UserControl{private float startOffset = 0.0f;private Timer mytimer = new Timer();Graphics g;public FlowControl(){InitializeComponent();设置控件样式this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);this.SetStyle(ControlStyles.DoubleBuffer, true);this.SetStyle(ControlStyles.ResizeRedraw, true);this.SetStyle(ControlStyles.Selectable, true);this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);this.SetStyle(ControlStyles.UserPaint, true);mytimer.Interval = 50;mytimer.Tick += Mytimer_Tick;mytimer.Start();}private void Mytimer_Tick(object sender, EventArgs e){startOffset += moveSpeed;if (Math.Abs(startOffset) > BarLength + GapLength){startOffset = 0;}this.Invalidate();}#region Filedsprivate int barHeight = 5;[Browsable(true), Category("自定义属性"), Description("流动条宽度")]public int BarHeight{get { return barHeight; }set{this.barHeight = value;base.Invalidate();}}private Color barColor = Color.DodgerBlue;[Browsable(true), Category("自定义属性"), Description("获取或设置管道控件的流动块颜色")]public Color BarColor{get{return this.barColor;}set{this.barColor = value;base.Invalidate();}}private Color borderColor = Color.DimGray;[Browsable(true), Category("自定义属性"), Description("获取或设置管道边线颜色")]public Color BorderColor{get{return this.borderColor;}set{this.borderColor = value;base.Invalidate();}}private float borderWidth = 1;[Browsable(true), Category("自定义属性"), Description("获取或设置管道壁厚度")]public float BorderWidth{get{return this.borderWidth;}set{this.borderWidth = value;base.Invalidate();}}private Color pipeEdgeColor = Color.DimGray;[Browsable(true), Category("自定义属性"), Description("获取或设置管道边缘颜色")]public Color PipeEdgeColor{get{return this.pipeEdgeColor;}set{this.pipeEdgeColor = value;base.Invalidate();}}private Color pipeCenterColor = Color.LightGray;[Browsable(true), Category("自定义属性"), Description("获取或设置管道控件的中心颜色")]public Color PipeCenterColor{get{return this.pipeCenterColor;}set{this.pipeCenterColor = value;base.Invalidate();}}private PipeTurnDirection pipeTurnLeft = PipeTurnDirection.None;[Browsable(true), Category("自定义属性"), Description("左管道的转向类型")]public PipeTurnDirection PipeTurnLeft{get{return this.pipeTurnLeft;}set{this.pipeTurnLeft = value;base.Invalidate();}}private PipeTurnDirection pipeTurnRight = PipeTurnDirection.None;[Browsable(true), Category("自定义属性"), Description("右管道的转向类型")]public PipeTurnDirection PipeTurnRight{get{return this.pipeTurnRight;}set{this.pipeTurnRight = value;base.Invalidate();}}private DirectionStyle pipeLineDirection = DirectionStyle.Horizontal;[Browsable(true), Category("自定义属性"), Description("设置管道是横向的还是纵向的")]public DirectionStyle PipeLineDirection{get{return this.pipeLineDirection;}set{this.pipeLineDirection = value;int temp;if (value == DirectionStyle.Horizontal){temp = Height;Height = Width;Width = temp;}else{temp = Width;Width = Height;Height = temp;}base.Invalidate();}}private bool isActive = false;[Browsable(true), Category("自定义属性"), DefaultValue(false), Description("获取或设置管道线是否激活液体显示")]public bool IsActive{get{return this.isActive;}set{this.isActive = value;this.mytimer.Enabled = value;base.Invalidate();}}private float moveSpeed = 0.3f;[Browsable(true), Category("自定义属性"), Description("管道线液体流动的速度,0为静止,正数为正向流动,负数为反向流动")]public float MoveSpeed{get{return this.moveSpeed;}set{this.moveSpeed = value;base.Invalidate();}}private int barLength = 5;[Browsable(true), Category("自定义属性"), Description("流动条长度")]public int BarLength{get{return this.barLength;}set{this.barLength = value;base.Invalidate();}}private int gapLength = 5;[Browsable(true), Category("自定义属性"), Description("间隙长度")]public int GapLength{get{return this.gapLength;}set{this.gapLength = value;base.Invalidate();}}#endregionprotected override void OnResize(EventArgs e){if (PipeLineDirection == DirectionStyle.Horizontal){if (Width < 2 * Height){Width = 2 * Height;}}else{if (Height < 2 * Width){Height = 2 * Width;}}base.OnResize(e);}protected override void OnPaint(PaintEventArgs e){//  base.OnPaint(e);g = e.Graphics;Rectangle rec;Rectangle rec2;GraphicsPath graphicsPath = new GraphicsPath();if (PipeLineDirection == DirectionStyle.Horizontal){#region 水平switch (pipeTurnLeft){case PipeTurnDirection.Up:rec = new Rectangle(0, -Height, 2 * Height, 2 * Height);rec2 = new Rectangle(rec.X + (int)BorderWidth / 2, rec.Y, rec.Width - (int)BorderWidth, rec.Height - (int)BorderWidth / 2);PaintElliple(g, rec, rec2, 90, 90);// path.AddArc(new Rectangle( Height / 2, rec.Y /2, Height , Height), 90, 90);//特别需要注意角度旋转方向,如果角度旋转方向选错就形成闭环graphicsPath.AddArc(new Rectangle(this.Height / 2, this.Height / 2 * (-1) - 1, this.Height, this.Height), 180.0f, -90.0f);break;case PipeTurnDirection.Down:rec = new Rectangle(0, 0, 2 * Height, 2 * Height);rec2 = new Rectangle(rec.X + (int)BorderWidth / 2, rec.Y + (int)BorderWidth / 2, rec.Width - (int)BorderWidth, rec.Height - (int)BorderWidth / 2);PaintElliple(g, rec, rec2, 180, 90);graphicsPath.AddArc(new Rectangle(Height / 2, Height / 2, Height, Height), 180, 90);break;case PipeTurnDirection.Left:case PipeTurnDirection.Right:case PipeTurnDirection.None:PointF[] points = new PointF[] { new PointF(Height, BorderWidth / 2), new PointF(0, BorderWidth / 2), new PointF(0, Height - BorderWidth / 2), new PointF(Height, Height - BorderWidth / 2) };PaintRectangle(g, new Rectangle(0, 0, Height, Height), points);graphicsPath.AddLine(new PointF(0, Height / 2), new PointF(Height, Height / 2));break;default:break;}switch (PipeTurnRight){case PipeTurnDirection.Up:rec = new Rectangle(Width - 2 * Height, -Height, 2 * Height, 2 * Height);rec2 = new Rectangle(rec.X + (int)BorderWidth / 2, rec.Y, rec.Width - (int)BorderWidth, rec.Height - (int)BorderWidth / 2);PaintElliple(g, rec, rec2, 0, 90);graphicsPath.AddArc(new Rectangle(rec.X + Height / 2, rec.Y / 2, Height, Height), 90, -90);break;case PipeTurnDirection.Down:rec = new Rectangle(Width - 2 * Height, 0, 2 * Height, 2 * Height);rec2 = new Rectangle(rec.X, rec.Y + (int)BorderWidth / 2, rec.Width - (int)BorderWidth / 2, rec.Height - (int)BorderWidth / 2);PaintElliple(g, rec, rec2, 270, 90);//特别需要注意角度旋转方向,如果角度旋转方向选错就形成闭环graphicsPath.AddArc(new Rectangle(rec.X + Height / 2, Height / 2, Height, Height), 270, 90);break;case PipeTurnDirection.Left:case PipeTurnDirection.Right:case PipeTurnDirection.None:PointF[] points = new PointF[] { new PointF(Width - Height, BorderWidth / 2), new PointF(Width, BorderWidth / 2), new PointF(Width, Height - BorderWidth / 2), new PointF(Width - Height, Height - BorderWidth / 2) };PaintRectangle(g, new Rectangle(Width - Height, 0, Height, Height), points);graphicsPath.AddLine(Width - Height, Height / 2, Width, Height / 2);break;default:break;}if (Width > Height * 2){PointF[] points = new PointF[] { new PointF(Height, BorderWidth / 2), new PointF(Width - Height, BorderWidth / 2), new PointF(Height, Height - BorderWidth / 2), new PointF(Width - Height, Height - BorderWidth / 2) };PaintRectangle(g, new Rectangle(Height, 0, Width - 2 * Height, Height), points);//  graphicsPath.AddLine(Height, Height / 2,Width- Height , Height / 2);}#endregion}else{//垂直switch (pipeTurnLeft){case PipeTurnDirection.Left:rec = new Rectangle(-Width, 0, 2 * Width, 2 * Width);rec2 = new Rectangle(rec.X, rec.Y + (int)BorderWidth / 2, rec.Width - (int)BorderWidth / 2, rec.Height - (int)BorderWidth);PaintElliple(g, rec, rec2, 270, 90);// path.AddArc(new Rectangle( Height / 2, rec.Y /2, Height , Height), 90, 90);//特别需要注意角度旋转方向,如果角度旋转方向选错就形成闭环graphicsPath.AddArc(new Rectangle(-this.Width / 2, this.Width / 2, this.Width, this.Width), 270.0f, 90.0f);break;case PipeTurnDirection.Right:rec = new Rectangle(0, 0, 2 * Width, 2 * Width);rec2 = new Rectangle(rec.X + (int)BorderWidth / 2, rec.Y + (int)BorderWidth / 2, rec.Width - (int)BorderWidth, rec.Height - (int)BorderWidth / 2);PaintElliple(g, rec, rec2, 180, 90);graphicsPath.AddArc(new Rectangle(Width / 2, Width / 2, Width, Width), 180, 90);break;case PipeTurnDirection.Up:case PipeTurnDirection.Down:case PipeTurnDirection.None:PointF[] points = new PointF[] { new PointF(BorderWidth / 2, 0), new PointF(BorderWidth / 2, Width), new PointF(Width - BorderWidth / 2, 0), new PointF(Width - BorderWidth / 2, Width) };PaintRectangle(g, new Rectangle(0, 0, Width, Width), points, LinearGradientMode.Horizontal);graphicsPath.AddLine(new PointF(Width / 2, 0), new PointF(Width / 2, Width));break;default:break;}switch (PipeTurnRight){case PipeTurnDirection.Left:rec = new Rectangle(-Width, Height - 2 * Width, 2 * Width, 2 * Width);rec2 = new Rectangle(rec.X, rec.Y + (int)BorderWidth / 2, rec.Width - (int)BorderWidth / 2, rec.Height - (int)BorderWidth);PaintElliple(g, rec, rec2, 0, 90);//特别需要注意角度旋转方向,如果角度旋转方向选错就形成闭环graphicsPath.AddArc(new Rectangle(rec.X / 2, rec.Y + Width / 2, this.Width, this.Width), 0f, 90.0f);break;case PipeTurnDirection.Right:rec = new Rectangle(0, Height - 2 * Width, 2 * Width, 2 * Width);rec2 = new Rectangle(rec.X + (int)BorderWidth / 2, rec.Y + 1, rec.Width - (int)BorderWidth, rec.Height - (int)BorderWidth / 2);PaintElliple(g, rec, rec2, 90, 90);graphicsPath.AddArc(new Rectangle(Width / 2, rec.Y + Width / 2, Width, Width), 180, -90);break;case PipeTurnDirection.Up:case PipeTurnDirection.Down:case PipeTurnDirection.None:PointF[] points = new PointF[] { new PointF(BorderWidth / 2, Height - Width), new PointF(BorderWidth / 2, Height), new PointF(Width - BorderWidth / 2, Height - Width), new PointF(Width - BorderWidth / 2, Height) };PaintRectangle(g, new Rectangle(0, Height - Width, Width, Width), points, LinearGradientMode.Horizontal);graphicsPath.AddLine(new PointF(Width / 2, Height - Width), new PointF(Width / 2, Height));break;default:break;}if (Height > Width * 2){PointF[] points = new PointF[] { new PointF(BorderWidth / 2, Width), new PointF(BorderWidth / 2, Height - Width), new PointF(Width - BorderWidth / 2, Width), new PointF(Width - BorderWidth / 2, Height - Width) };PaintRectangle(g, new Rectangle(0, Width, Width, Height - 2 * Width), points, LinearGradientMode.Horizontal);// graphicsPath.AddLine(Height, Height / 2,Width- Height , Height / 2);}}if (IsActive){//绘制流动条Pen barPen = new Pen(BarColor, BarHeight);barPen.DashStyle = DashStyle.Custom;barPen.DashOffset = startOffset;barPen.DashPattern = new float[] { BarLength, GapLength };graphicsPath.StartFigure();g.DrawPath(barPen, graphicsPath);}}//绘制椭圆与圆弧void PaintElliple(Graphics g, Rectangle rec, Rectangle recArc, float startAngle, float sweepAngle){GraphicsPath graphicsPath = new GraphicsPath();graphicsPath.AddEllipse(rec);//画刷效果呈现由中心向四方层叠     PathGradientBrush brush = new PathGradientBrush(graphicsPath);brush.CenterPoint = new PointF(rec.X + rec.Width / 2, rec.Y + rec.Height / 2);brush.InterpolationColors = new ColorBlend() { Colors = new Color[] { PipeEdgeColor, PipeCenterColor, PipeEdgeColor }, Positions = new float[] { 0, 0.5f, 1 } };g.FillPie(brush, rec, startAngle, sweepAngle);g.DrawArc(new Pen(BorderColor, BorderWidth), recArc, startAngle, sweepAngle);}void PaintRectangle(Graphics g, Rectangle rec, PointF[] points, LinearGradientMode linearGradientMode = LinearGradientMode.Vertical){//画刷效果呈现线型分布,注意与PathGradientBrush的区别LinearGradientBrush brush = new LinearGradientBrush(rec, PipeEdgeColor, PipeCenterColor, linearGradientMode);brush.InterpolationColors = new ColorBlend() { Colors = new Color[] { PipeEdgeColor, PipeCenterColor, PipeEdgeColor }, Positions = new float[] { 0, 0.5f, 1 } };brush.InterpolationColors = new ColorBlend() { Colors = new Color[] { PipeEdgeColor, PipeCenterColor, PipeEdgeColor }, Positions = new float[] { 0, 0.5f, 1 } };g.FillRectangle(brush, rec);g.DrawLine(new Pen(BorderColor, BorderWidth), points[0], points[1]);g.DrawLine(new Pen(BorderColor, BorderWidth), points[2], points[3]);}}/// <summary>/// 管道左、右的转向类型/// </summary>public enum PipeTurnDirection{Up = 1,Down,Left,Right,None}/// <summary>/// 管道的样式,水平还是数值/// </summary>public enum DirectionStyle{Horizontal = 1,Vertical}
}

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

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

相关文章

MySQL-日志-优化

目录 介绍一下mysql 的日志 redo log 和binlog 的区别及应用场景 redo log 和 binlog 在恢复数据库有什么区别? redo log 是怎么实现持久化的? redo log除了崩溃恢复还有什么其他作用? &#xff08;顺序写&#xff09; redo log 怎么刷入磁盘的知道吗&#xff1f; 两阶…

重塑水利未来:智慧水利解决方案的探索与实践,从物联网、大数据到人工智能,科技如何赋能水利行业,实现智慧化管理与决策

本文关键词&#xff1a;智慧水利、智慧水利工程、智慧水利发展前景、智慧水利技术、智慧水利信息化系统、智慧水利解决方案、数字水利和智慧水利、数字水利工程、数字水利建设、数字水利概念、人水和协、智慧水库、智慧水库管理平台、智慧水库建设方案、智慧水库解决方案、智慧…

如何通过3D开发组件HOOPS增强Navisworks数据访问?

随着建筑信息模型&#xff08;BIM&#xff09;和建筑、工程和施工&#xff08;AEC&#xff09;市场的快速发展&#xff0c;对Navisworks支持的需求也在不断增长。特别是在多个公司赞助Navisworks项目的大环境下&#xff0c;HOOPS组件的支持显得尤为重要。这些公司包括一家大型电…

【多模态学习笔记二】MINIGPT-4论文阅读

MINIGPT-4:ENHANCING VISION-LANGUAGE UNDERSTANDING WITH ADVANCED LARGE LANGUAGE MODELS 提出的MiniGPT-4使用一个投影层,将冻结的视觉编码器与冻结的先进的LLM Vicuna对齐。我们的工作首次揭示,将视觉特征与先进的大型语言模型正确对齐可以具有GPT-4所展示的许多先进的多…

【14】Github Copilot环境搭建

环境搭建 这里以Visual Studio Code为例&#xff0c;安装好vs code&#xff0c;打开扩展侧边菜单栏&#xff0c;搜索“Github Copilot”&#xff0c;会出现如下图的两个插件&#xff0c;点击安装第一个&#xff0c;另一个会附带一起安装&#xff0c;然后弹出提示重新启动vs co…

对于栈和链表,数组之间关系的一些探索

先贴脸来个图 这是一个解析图&#xff0c;总体是个栈&#xff08;stacks&#xff09;细分有数组和链表【注意这儿的linkedlist可不是Java集合List中的linklist】 对于栈&#xff0c;如果我们想向栈中添加元素&#xff0c;或者想从中删除元素&#xff0c;都必须从一个地方开始&…

阿里云DSW实例中安装并运行Neo4J

想尝试使用大模型对接Neo4J&#xff0c;在阿里云DSW实例中安装了Neo4J&#xff0c;却无法通过本地浏览器访问在DSW实例中运行的Neo4J。尝试了改neo4j.conf文件&#xff0c;以及添加专用网络的公共IP地址等方法&#xff0c;均没有成功。最后决定直接在服务器的命令行进行各种Cyp…

uniapp 页面字体乱码问题解决【已解决】

这个不是我们本身代码的问题&#xff0c;调整一下编译器就好了 打开编译器文件 2,然后以指定编码重新打开&#xff0c;选择utf-8就行了 非常简单 &#xff0c;如果你选择了之后重新渲染页面还是乱码的话&#xff0c;你就把项目关掉&#xff0c;重新启动就OK了。。。

基于搜索二叉树的停车收费管理系统

系统效果&#xff1a;录入汽车信息 查看汽车信息 收费信息查看 查询车库车辆 代码展示&#xff1a; //SearchBinaryTree.h #pragma once #include<iostream> #include<string> #include<time.h> #include<Windows.h> using namespace std;template<…

百分点科技入选《2024中国数据要素产业图谱1.0版》

近日&#xff0c;数据猿与上海大数据联盟发布了《2024中国数据要素产业图谱1.0版》&#xff0c;百分点科技凭借领先的数据科学技术和深入的行业洞察力&#xff0c;入选数据管理/治理、数据分析与挖掘、应急管理三大领域。 在数据要素的发展关键期&#xff0c;数据作为生产要素持…

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【26】【内网穿透】cpolar

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【27】【内网穿透】cpolar 内网穿透cpolar内网穿透联调配置练习—使用公网地址访问gulimall.com参考 内网穿透 正常的外网需要访问我们项目的流程是&#xff1a; 买服务器并且有公网固定…

怎么压缩视频文件?简单的压缩视频方法分享

视频已成为我们日常生活中不可或缺的一部分。但随着视频质量的提高&#xff0c;文件大小也逐渐成为我们分享的阻碍。如何有效压缩视频文件&#xff0c;使其既能保持清晰&#xff0c;又能轻松分享&#xff1f;今天&#xff0c;给大家分享五种实用的视频压缩方法&#xff0c;快来…

安装adb和常用命令

下载ADB安装包 https://dl.google.com/android/repository/platform-tools-latest-windows.zip 解压安装包 解压如上下载的安装包&#xff0c;然后复制adb.exe所在的文件地址 配置环境变量 我的电脑——>右键属性——>高级系统设置——>环境变量——>系统变量—…

stm32学习:(寄存器1)控制寄存器来让led亮

开启时钟&#xff0c;先查找到开启时钟的寄存器&#xff0c;然后通过该寄存器操作时钟的开启或关闭&#xff0c;要打开的是GPIOA的时钟 在芯片手册&#xff0c;找到RCC寄存器描述章节找到APB2外设时钟使能寄存器&#xff08;RCC_APB2ENR)&#xff0c;现在算RCC_APB2ENR这个寄存…

基于mcu固件反汇编逆向入门示例-stm32c8t6平台

基于mcu固件反汇编逆向入门示例-stm32c8t6平台 本文目标&#xff1a;基于mcu固件反汇编逆向入门示例-stm32c8t6平台 按照本文的描述&#xff0c;应该可以在对应的硬件上通实验并举一反三。 先决条件&#xff1a;拥有C语言基础&#xff0c;集成的开发环境&#xff0c;比如&am…

《背包乱斗》为什么好玩 苹果电脑怎么玩《背包乱斗》游戏 mac怎么玩steam windows游戏

在当今竞争激烈的游戏市场中&#xff0c;《背包乱斗》以其独特的魅力在众多作品中脱颖而出&#xff0c;吸引了大量玩家的关注和喜爱。其创新的游戏机制和不断迭代的内容&#xff0c;加之出色的视觉效果和社区建设&#xff0c;使其成为了游戏界的一股清流。 一、《背包乱斗》为…

《绝区零》是一款什么类型的游戏,Mac电脑怎么玩《绝区零》苹果电脑玩游戏怎么样

米哈游的《绝区零》最近在网上爆火呀&#xff0c;不过很多人都想知道mac电脑能不能玩《绝区零》&#xff0c;今天麦麦就给大家介绍一下《绝区零》是一款什么样的游戏&#xff0c;Mac电脑怎么玩《绝区零》。 一、《绝区零》是一款什么样的游戏 《绝区零》是由上海米哈游自主研发…

ES快速开发,ElasticsearchRestTemplate基本使用以及ELK快速部署

最近博主有一些elasticsearch的工作&#xff0c;所以更新的慢了些&#xff0c;现在就教大家快速入门&#xff0c;并对一些基本的查询、更新需求做一下示例&#xff0c;废话不多说开始&#xff1a; 1. ES快速上手 es下载&#xff1a;[https://elasticsearch.cn/download/]()这…

Spring Boot集成Activity7实现简单的审批流

由于客户对于系统里的一些新增数据&#xff0c;例如照片墙、照片等&#xff0c;想实现上级逐级审批通过才可见的效果&#xff0c;于是引入了Acitivity7工作流技术来实现&#xff0c;本文是对实现过程的介绍讲解&#xff0c;由于我是中途交接前同事的这块需求&#xff0c;所以具…

uniapp开发钉钉小程序流程

下载开发工具 1、小程序开发工具 登录钉钉开发平台&#xff0c;根据自己的需求下载合适的版本&#xff0c;我这里下载的是Windows &#xff08;64位&#xff09;版本 小程序开发工具 - 钉钉开放平台 2、HBuilder X HBuilderX-高效极客技巧 新建项目及相关配置 新建项目 …