数据可视化大屏电商数据展示平台开发实录(Echarts柱图曲线图、mysql筛选统计语句、时间计算、大数据量统计)

news/2024/4/26 21:20:07/文章来源:https://blog.csdn.net/weixin_41290949/article/details/130373379

数据可视化大屏电商数据展示平台

  • 一、前言
  • 二、项目介绍
  • 三、项目展示
  • 四、项目经验分享
    • 4.1 翻牌器
      • 4.1.1 翻牌器-今日实时交易
      • 4.1.2.翻牌器后端统计SUM函数的使用
    • 4.2 不同时间指标的数据
      • MySql内部的时间计算
    • 4.3 实时交易播报
      • MySql联表查询和内部遍历循环
    • 4.4 每日交易量
      • 4.4.1.近30日交易量/交易额API
      • 4.4.1.近30日交易量/交易额Echarts
    • 4.5 24小时销售额/销售量折线图
      • 4.5.1.GROUP BY 条件
      • 4.5.2.近24小时/上24小时
    • 4.6 筛选时间切换封装函数
      • 4.6.1.获取当天日期
      • 4.6.2.获取当月日期
      • 4.6.3.获取上月日期
      • 4.6.3.获取当前月份天数
  • 总结

一、前言

作为地区销售部门,有很多指标需要跟踪。从收入或订单数量等高级指标,到客户反馈等更详细的信息,作为部门的领导,可能需要花费大量的时间从数据堆中找出每次需要的不同数据。客户的销售基本上都是通过线上或者手机端完成的,统一存储在Mysql数据库中。
作为数据可视化开发,客户的基本面已经完成了在数据收集、数据清洗和数据过滤。接下来的主要工作是数据筛选和统计、数据格式化输入即可。

二、项目介绍

项目是某奶品在华东区线下销售的数据统计平台,主要呈现每日奶品销售的信息数据。如销售总金额、区域销售排行、产品品类销售排行、24小时销售量和销售额、不同网点的销售趋势等等。

从需求上可以分析得出,大屏一是要满足数据展示类,二是要满足决策者实时操作比对不同时间节点的销售数据,和后端数据进行交互,三是实时数据,顾名思义指的就是数据在实时传输,产生了数据就要立即展示出来。

三、项目展示

在这里插入图片描述

四、项目经验分享

电商数据展示,主要的数据指标,昨日、今日、7日、30日、本月、上月等多维度环比的展示,这对mysql语句的熟练掌握和实际应用有很大的挑战。也正是该项目的顺利完成,让自己对mysql有了更深度的认识。

4.1 翻牌器

4.1.1 翻牌器-今日实时交易

在这里插入图片描述
作为当日交易总金额,是整个大屏最为关注的点睛之处。因此,采用了numberAnimate翻牌器效果,实时刷新数据,一目了解掌握大局。

4.1.2.翻牌器后端统计SUM函数的使用

使用数据表中的当天记录和mysql内置函数CURDATE(),进行条件筛选判断,date_format(a.paid_at,'%Y-%m-%d') = CURDATE()

  public function getToday(){$sql = "select SUM(a.should_paid) AS totalPays,a.uniacid,b.uniacid,b.dpopen from " . $db->table('orders') . " AS a, " . $db->table('set_basic') . " AS b where a.status <> '-128'";// AND a.status <> '-126'$sql .= " AND date_format(a.paid_at,'%Y-%m-%d') = CURDATE() AND a.uniacid = b.uniacid";$row = $db->queryall($sql);$res["data"] = $row;die(json_encode_lockdata($res));}

4.2 不同时间指标的数据

在这里插入图片描述

MySql内部的时间计算

不同的时间指标对应不同的计算方式,充分利用mysql内置函数进行计算。通过数据可视化大屏前端点击切换时间指标来动态获取具体的时间数据指标。

  • 昨天 :TO_DAYS(CURDATE()) - TO_DAYS(date_format(a.paid_at,'%Y-%m-%d')) = 1
  • 今天 : date_format(a.paid_at,'%Y-%m-%d') = CURDATE()
  • 近7天:DATE_SUB(CURDATE(), INTERVAL 6 DAY) <= date(a.paid_at)
  • 本月:date_format(a.paid_at,'%Y-%m') = date_format(CURDATE(),'%Y-%m')
  • 上月:date_format(a.paid_at,'%Y-%m') = date_format(DATE_SUB(CURDATE(), INTERVAL 1 MONTH),'%Y-%m')
  • 近30天: DATE_SUB(CURDATE(), INTERVAL 29 DAY) <= date(a.paid_at)
  public function getOrders(){global $db, $res;dbc();/*间隔时间天数,-1昨天,0-当日;7-近7日;30-近30天;* 过滤$days,如果无参数,默认为当日* */@$CR_days = $_POST['days'];if ($CR_days == "") {$CR_days = "0";}$sql = "select COUNT(a.id) AS transTotal,SUM(a.should_paid) AS totalPays,a.paid_at,a.uniacid,b.uniacid,b.dpopen from " . $db->table('orders') . " AS a, " . $db->table('set_basic') . " AS b where a.status <> '-128' AND a.uniacid = b.uniacid";//AND a.status <> '-126'/*判断日期间隔*/switch ($CR_days) {case -1;$sql .= "  AND TO_DAYS(CURDATE()) - TO_DAYS(date_format(a.paid_at,'%Y-%m-%d')) = 1";break;case 0;$sql .= "  AND date_format(a.paid_at,'%Y-%m-%d') = CURDATE()";break;case 7;$sql .= "  AND DATE_SUB(CURDATE(), INTERVAL 6 DAY) <= date(a.paid_at)";break;case 2;//本月,修改 BY jieji007,2020-08-31$sql .= "  AND date_format(a.paid_at,'%Y-%m') = date_format(CURDATE(),'%Y-%m')";break;case 3;//上月,修改 BY jieji007,2020-08-31$sql .= "  AND date_format(a.paid_at,'%Y-%m') = date_format(DATE_SUB(CURDATE(), INTERVAL 1 MONTH),'%Y-%m')";break;case 30;$sql .= "  AND DATE_SUB(CURDATE(), INTERVAL 29 DAY) <= date(a.paid_at)";break;default:$sql .= "  AND date_format(a.paid_at,'%Y-%m-%d') = CURDATE()";}$row = $db->queryall($sql);$res["data"] = $row;die(json_encode_lockdata($res));}

4.3 实时交易播报

实时交易播报,开发难点在于需要多次跨表查询。

  • 获取当日交易的站点及名称;
  • 获取对应站点团长的数量;
  • 获取对应站点团长的数量;
  • 获取对应的站点会员数量;
    在这里插入图片描述
    联表查询后,再次循环不同的数据表,方便生成json数据,传送至前端。

MySql联表查询和内部遍历循环

public function getTransMaster(){global $db, $res;dbc();//获取当日交易的站点及名称;$sql = "select a.uniacid,SUM(a.should_paid) AS totalPays,COUNT(a.id) AS transTotal,MAX(a.paid_at) AS paid_at,b.uniacid,b.name,b.dpopen from " . $db->table('orders');$sql .= " AS a, " . $db->table('set_basic') . " AS b";$sql .= " WHERE date_format(a.paid_at,'%Y-%m-%d') = CURDATE() AND a.uniacid = b.uniacid AND b.dpopen = 1";$sql .= " GROUP BY a.uniacid ORDER BY totalPays DESC LIMIT 15";$row = $db->queryall($sql);//获取对应站点团长的数量;foreach ($row as $k => $v) {$sql_l = "select uniacid,IFNULL(COUNT(id),0) AS leaderTotal,server,legitimate,created_at from " . $db->table('leader');$sql_l .= " WHERE date_format(created_at,'%Y-%m-%d') = CURDATE() AND uniacid =" . $v['uniacid'];//server = 1 AND legitimate = 1 AND$sql_l .= " GROUP BY uniacid";$row[$k]["leaderTotal"] = $db->queryall($sql_l);}//获取对应的站点会员数量;foreach ($row as $k => $v) {$sql_m = "select COUNT(id) AS memberTotal,created_at,uniacid,legitimate from " . $db->table('member');$sql_m .= " WHERE legitimate = 1 AND date_format(created_at,'%Y-%m-%d') = CURDATE() AND uniacid =" . $v['uniacid'];$sql_m .= " GROUP BY uniacid";$row[$k]["memberTotal"] = $db->queryall($sql_m);}$res["data"] = $row;die(json_encode_lockdata($res));}

4.4 每日交易量

在这里插入图片描述
准确的表述,应该是近30日的交易量/交易额柱图。方便决策者迅速有效的发现每日销售数据的差异,快速做出反应,进行销售问题的反馈和解决。

4.4.1.近30日交易量/交易额API

  • 为防止日统计无效,使用到了ifnull(COUNT(a.id),0) AS totalTrans函数;
  • 日期格式化DATE_FORMAT(a.paid_at,'%Y-%m-%d'),便于Echarts的图表的展示;
   //近30日交易量;public function getEveryDay(){global $db, $res;dbc();$sql = "select DATE_FORMAT(a.paid_at,'%Y-%m-%d') as dataKey,ifnull(COUNT(a.id),0) AS totalTrans,ifnull(SUM(a.should_paid),0) AS totalPays,b.uniacid,b.dpopen from " . $db->table('orders') . " AS a, " . $db->table('set_basic') . " AS b WHERE a.status <> '-128' AND a.uniacid = b.uniacid";// AND a.status <> '-126'if (@$_COOKIE['Controller'] == "-1") {$sql .= "  AND a.uniacid = " . $_COOKIE['uniacid'];} else {$sql .= " AND b.dpopen = 1";}$sql .= " GROUP BY DATE_FORMAT(a.paid_at,'%Y-%m-%d') ORDER BY a.paid_at DESC LIMIT 30";$row = $db->queryall($sql);$res["data"] = $row;die(json_encode_lockdata($res));}

4.4.1.近30日交易量/交易额Echarts

//柱状图
function getBar(dataName, dataList1, dataList2) {var myChart = echarts.init(document.getElementById("trans"));var option = {tooltip: {trigger: 'axis',axisPointer: {lineStyle: {color: '#57617B'}}},dataZoom: [{show: false,start: 0,end: 50,type: "inside",}],legend: {data: [{"name": "交易量"},{"name": "交易额"}],top: '2%',icon: 'circle',textStyle: {"color": "rgba(255,255,255,0.9)"}},xAxis: [{"type": "category",data: dataName,axisLine: {lineStyle: {color: "rgba(255,255,255,.1)"}},inverse: true,axisLabel: {textStyle: {color: "rgba(255,255,255,.6)", fontSize: '12'}}}],yAxis: [{type: "value",axisLabel: {show: true},axisLine: {lineStyle: {color: 'rgba(255,255,255,.4)'}},splitLine: {show: true, lineStyle: {color: "rgba(255,255,255,.2)"}}},{type: "value",show: true,axisLabel: {show: true},axisLine: {lineStyle: {color: 'rgba(255,255,255,.4)'}},splitLine: {show: true, lineStyle: {color: "rgba(255,255,255,0)"}}}],grid: {top: '13%',right: '2%',left: '2%',bottom: '5%',containLabel: true},series: [{name: "交易量",type: "bar",data: dataList1,barWidth: '50%',yAxisIndex: 1,itemStyle: {normal: {color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{offset: 0,color: '#39e7d7'}, {offset: 1,color: '#10A7DB'}], false),barBorderRadius: [2, 2, 0, 0],shadowColor: 'rgba(0,255,225,1)',shadowBlur: 4}}},{name: "交易额",type: 'line',smooth: true,symbol: 'circle',symbolSize: 5,//showSymbol: false,yAxisIndex: 0,data: dataList2,lineStyle: {normal: {width: 2},},itemStyle: {color: '#cdba00',borderColor: 'rgba(0,136,212,0.2)',borderWidth: 12}}]};myChart.setOption(option);window.addEventListener("resize", function () {myChart.resize();});
}

4.5 24小时销售额/销售量折线图

在这里插入图片描述

4.5.1.GROUP BY 条件

  • 筛选条件 TO_DAYS(CURDATE()) - TO_DAYS(date_format(a.paid_at,'%Y-%m-%d')) = 1
  • 分组统计规则 GROUP BY DATE_FORMAT(a.paid_at,'%Y-%m-%d %H')
public function getTwentyFour(){global $db, $res;dbc();//最近24小时记录;$sql = "select RIGHT(DATE_FORMAT(a.paid_at,'%Y-%m-%d %H'),2) as dataKey,ifnull(COUNT(a.id),0) AS totalTrans,ifnull(SUM(a.should_paid),0) AS totalPays,b.uniacid,b.dpopen from " . $db->table('orders') . " AS a, " . $db->table('set_basic') . " AS b WHERE a.paid_at <> '' AND DATE_FORMAT(a.paid_at,'%Y-%m-%d') = CURDATE()";$sql .= " AND a.status <> '-128' AND a.uniacid = b.uniacid AND b.dpopen = 1";//AND a.status <> '-126'$sql .= " GROUP BY DATE_FORMAT(a.paid_at,'%Y-%m-%d %H')";$row = $db->queryall($sql);$res["data"] = $row;//上24小时记录;$sql_p = "select RIGHT(DATE_FORMAT(a.paid_at,'%Y-%m-%d %H'),2) as dataKey,ifnull(COUNT(a.id),0) AS totalTrans,ifnull(SUM(a.should_paid),0) AS totalPays,b.uniacid,b.dpopen from " . $db->table('orders') . " AS a, " . $db->table('set_basic') . " AS b WHERE a.paid_at <> '' AND TO_DAYS(CURDATE()) - TO_DAYS(date_format(a.paid_at,'%Y-%m-%d')) = 1";$sql_p .= " GROUP BY DATE_FORMAT(a.paid_at,'%Y-%m-%d %H')";$row_p = $db->queryall($sql_p);$res["pdata"] = $row_p;die(json_encode_lockdata($res));}

4.5.2.近24小时/上24小时

//折线图
function getLine(dataName, dataList1, dataList2) {var myChart = echarts.init(document.getElementById('twentyFour'));var option = {tooltip: {trigger: 'axis',axisPointer: {lineStyle: {color: '#57617B'}}},legend: {data: ['近24小时', '上24小时'],y: 'top',textStyle: {color: "#fff"},itemGap: 20,},grid: {top: '15%',right: '2%',left: '2%',bottom: '5%',containLabel: true},xAxis: [{type: 'category',boundaryGap: false,interval: 0,axisLabel: {show: true,textStyle: {color: 'rgba(255,255,255,.6)'}},axisLine: {lineStyle: {color: 'rgba(255,255,255,.1)'}},data: dataName}],yAxis: [{axisLabel: {show: true,textStyle: {color: 'rgba(255,255,255,.6)'}},axisLine: {lineStyle: {color: 'rgba(255,255,255,.1)'}},splitLine: {lineStyle: {color: 'rgba(255,255,255,.1)'}}}],series: [{name: '近24小时',type: 'line',connectNulls: true,smooth: true,symbol: 'circle',symbolSize: 3,showSymbol: true,lineStyle: {normal: {width: 2}},areaStyle: {normal: {color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{offset: 0,color: 'rgba(24, 163, 64, 0.3)'}, {offset: 0.8,color: 'rgba(24, 163, 64, 0)'}], false),shadowColor: 'rgba(0, 0, 0, 0.1)',shadowBlur: 10}},itemStyle: {normal: {color: '#cdba00',borderColor: 'rgba(137,189,2,0.27)',borderWidth: 12}},data: dataList1}, {name: '上24小时',type: 'line',connectNulls: true,smooth: true,symbol: 'circle',symbolSize: 3,showSymbol: true,lineStyle: {normal: {width: 2}},areaStyle: {normal: {color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{offset: 0,color: 'rgba(39, 122,206, 0.3)'}, {offset: 0.8,color: 'rgba(39, 122,206, 0)'}], false),shadowColor: 'rgba(0, 0, 0, 0.1)',shadowBlur: 10}},itemStyle: {normal: {color: '#277ace',borderColor: 'rgba(0,136,212,0.2)',borderWidth: 12}},data: dataList2}]};myChart.setOption(option);window.addEventListener("resize", function () {myChart.resize();});
}

4.6 筛选时间切换封装函数

在这里插入图片描述

4.6.1.获取当天日期

function getDate(days) {//定义今日标准时间;var d = new Date();var nowYear = d.getFullYear().toString();//今年var nowMonth = timeAdd0((d.getMonth() + 1).toString());//当月var nowDay = timeAdd0(d.getDate().toString());//当日var now = nowYear + "-" + nowMonth + "-" + nowDay;//今日标准时间; 2020-09-02//日期计算;var startDate = new Date(Date.parse(now.replace(/-/g, '/'))); //将开始时间由字符串格式转换为日期格式var value = startDate.getTime();  //将开始时间转为毫秒value += days * (24 * 3600 * 1000); //将天数转换成毫秒后与开始时间相加得到结束时间的毫秒数var d2 = new Date(value);    //将得到的毫秒数转换为日期var nowYear2 = d2.getFullYear().toString();//今年var nowMonth2 = timeAdd0((d2.getMonth() + 1).toString());//当月var nowDay2 = timeAdd0(d2.getDate().toString());//当日var endDate = nowYear2 + "-" + nowMonth2 + "-" + nowDay2;return endDate;
}

4.6.2.获取当月日期

//获取当月;
function getMonths(mons, today) {var d = new Date();var nowYear = d.getFullYear().toString();//今年var nowMonth = timeAdd0((d.getMonth() + 1 + Number(mons)).toString());//当月var nowDay = timeAdd0(d.getDate().toString());//当日if (today == "0") {var now = nowYear + "-" + nowMonth + "-" + nowDay;//今日标准时间; 2020-09-02} else {var now = nowYear + "-" + nowMonth + "-" + "01";//今日标准时间; 2020-09-02}return now;
}

4.6.3.获取上月日期

//获取上月;
function getLastMonths(mons, today) {var d = new Date();var nowYear = d.getFullYear().toString();//今年var nowMonth = timeAdd0((d.getMonth() + 1 + Number(mons)).toString());//当月if (today == "1") {var now = nowYear + "-" + nowMonth + "-" + "01";//今日标准时间; 2020-09-02}if (today == "30") {var now = nowYear + "-" + nowMonth + "-" + mGetDate(Number(mons));//今日标准时间; 2020-09-02}return now;
}

4.6.3.获取当前月份天数


//获取当前月份天数:
function mGetDate(mons) {var date = new Date();var year = date.getFullYear();var month = date.getMonth() + 1 + Number(mons);var d = new Date(year, month, 0);return d.getDate();
}

总结

该项目是初期入门数据可视化大屏的作品,严格意义上,是在懵懂的状态下完成的开发。随时开发作品的不断增加,对项目销售的了解、开发过程的深入、大数据量的学习,回头再看,总有些可以精进的地方。

@漏刻有时

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

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

相关文章

5.5 高斯型求积公式简历

学习目标&#xff1a; 我会按照以下步骤学习高斯求积公式简介&#xff1a; 理解积分的概念&#xff1a;学习什么是积分以及积分的几何和物理意义&#xff0c;如面积、质量、电荷等概念。 掌握基本的积分技巧&#xff1a;掌握基本的积分公式和技巧&#xff0c;如换元法、分部积…

流辰信息微服务平台:数字化转型的优良工具!

在互联网迅猛发展的今天&#xff0c;越来越多的企业倾向于新兴领域带来的便利性和灵活性了&#xff0c;其中&#xff0c;微服务平台就是其中之一了。流辰信息微服务平台是专注于研发系统开发、数据治理、数据分析的平台&#xff0c;致力于为各中大小型企业提供优质的微服务解决…

Java——字符串的排列

题目链接 牛客网在线oj题——字符串的排列 题目描述 输入一个长度为 n 字符串&#xff0c;打印出该字符串中字符的所有排列&#xff0c;你可以以任意顺序返回这个字符串数组。 例如输入字符串ABC,则输出由字符A,B,C所能排列出来的所有字符串ABC,ACB,BAC,BCA,CBA和CAB。 数…

打造卓越游戏 | 2023 Google 游戏开发者峰会

一款游戏从初始构想的开发到辉煌赛季的策划&#xff0c;开发者们每时每刻都在倾注心血潜心钻研&#xff0c;Google 也致力于在整个开发和发布生命周期中为您提供帮助。我们很高兴能在今年如约而至的 Google 游戏开发者峰会中与您分享诸多更新&#xff0c;展示我们为助力您打造精…

如何有效的开展接口自动化测试,一篇就行

一、简介 接口自动化测试是指使用自动化测试工具和脚本对软件系统中的接口进行测试的过程。其目的是在软件开发过程中&#xff0c;通过对接口的自动化测试来提高测试效率和测试质量&#xff0c;减少人工测试的工作量和测试成本&#xff0c;并且能够快速发现和修复接口错误&…

PCL点云库(2) — IO模块

目录 2.1 IO模块接口 2.2 PCD数据读写 &#xff08;1&#xff09; PCD数据解析 &#xff08;2&#xff09;PCD文件读写示例 2.3 PLY数据读写 &#xff08;1&#xff09;PLY数据解析 &#xff08;2&#xff09;PLY文件读写示例 2.4 OBJ数据读写 &#xff08;1&#xff…

C语言指针2大问题:指针类型有什么用?指针如何运算?

如题&#xff0c;本篇博客主要解决2个疑点&#xff1a;指针类型的用处&#xff0c;指针如何运算。 1.指针类型 C语言中的指针类型&#xff0c;在X86环境下大小是4个字节&#xff0c;在X64环境下大小是8个字节。既然指针的大小和指针类型无关&#xff0c;那么指针类型究竟有什么…

银行系统【GUI/Swing+MySQL】(Java课设)

系统类型 Swing窗口类型Mysql数据库存储数据 使用范围 适合作为Java课设&#xff01;&#xff01;&#xff01; 部署环境 jdk1.8Mysql8.0Idea或eclipsejdbc 运行效果 ​​​​​​​ 本系统源码地址&#xff1a;​​​​​​​https://download.csdn.net/download/qq_50…

从零开始写ChatGLM大模型的微调代码

cursor 的下载及安装&#xff08;免费版每月100次&#xff0c;升级pro 20刀/月&#xff09; cursor是一款与openai合作的&#xff0c;使用gpt-4的一款编程工具&#xff0c;它可以让你通过gpt-4进行辅助编程&#xff0c;以此提高效率。 下载地址&#xff1a;https://www.curso…

USART串口协议和USART串口外设(USART串口发送串口发送和接收)

1、通信接口 • 通信的目的&#xff1a;将一个设备的数据传送到另一个设备&#xff0c;扩展硬件系统 • 通信协议&#xff1a;制定通信的规则&#xff0c;通信双方按照协议规则进行数据收发 异步&#xff1a;需要双方约定一个频率 2、 硬件电路 • 简单双向串口通信有两根通信…

【Unity-ML】Unity机器学习(一)

安装环境&#xff1a;Windows10 Anaconda3(64-bit)&#xff0c;网上很多教程&#xff0c;例如这个anaconda下载及安装(保姆级教程) - 知乎anaconda包管理器和环境管理器&#xff0c;强烈建议食用 1.下载官网下载太慢可选用镜像下载 官网下载&#xff1a; Anaconda | Individua…

〖ChatGPT实践指南 - 零基础扫盲篇④〗- OpenAI API 相关介绍、提示-Prompt 与 完成-Completion

文章目录 ⭐ OpenAI API介绍⭐ 提示-Prompt 与 完成-Completion 介绍 这一章节将为各位小伙伴介绍一下 OpenAI 的 API 相关内容&#xff0c;以及在 ChatGPT 中两个经常被用来比较的名词&#xff1a;“提示-prompt” 与 “完成-completion”。 ⭐ OpenAI API介绍 OpenAI API 概…

JavaScript常用方法整理

文章目录 前言1.栈方法&#xff1a;push()、pop()2.队列方法&#xff1a;unshift()、shift()3.indexof()、lastIndexOf()、includes()4.操作方法&#xff1a;concat()、slice()、splice()5.Array.isArray()6.排序方法:sort()、reverse()7.转换方法&#xff1a;toString()、join…

【Winform学习笔记(二)】TextBox文本框实现按回车键触发Button事件

TextBox文本框实现按回车键触发Button事件 前言正文1、实现方法2、具体代码3、实现效果 前言 在本文中主要介绍 如何基于 Winform 框架实现 TextBox 文本框实现按回车键触发 Button 事件&#xff0c;该功能可实现在文本框中输入密码后不需要按登录或确定按钮&#xff0c;直接回…

vue页面内嵌iframe使用postMessage进行数据交互(postMessage跨域通信)

什么是postMessage postMessage是html5引入的API,它允许来自不同源的脚本采用异步方式进行有效的通信,可以实现跨文本文档,多窗口,跨域消息传递.多用于窗口间数据通信,这也使它成为跨域通信的一种有效的解决方案. vue父页面&#xff08;嵌入iframe的页面&#xff09; 在vue中…

webAPI学习笔记2(DOM事件高级)

1. 注册事件&#xff08;绑定事件&#xff09; 1.1 注册事件概述 给元素添加事件&#xff0c;称为注册事件或者绑定事件。 注册事件有两种方式&#xff1a;传统方式和方法监听注册方式 传统注册方式 利用 on 开头的事件 onclick <button οnclick“alert(hi~)”><…

如何构建可靠的台账数据——详解台账管理系统的使用方法

随着数字化的发展&#xff0c;越来越多的企业开始采用电子台账管理&#xff0c;实现了对各项业务数据的及时准确保存和管理。而在台账管理应用中&#xff0c;发票管理、工单管理和库房台账是三大重要方面。下面我将详细介绍一下台账管理系统。 一、发票管理 1.收票台账报表 …

【Python小技巧】使用Gradio构建基于ChatGPT的 Web 应用(附源码)

文章目录 前言一、Gradio是什么&#xff1f;二、使用Gradio构建基于ChatGPT的 Web 应用1. 安装gradio库2. 安装openai库&#xff08;ChatGPT的python库&#xff09;3. Web 应用示例&#xff08;源代码&#xff09; 总结 前言 随着人工智能的不断发展&#xff0c;各种智能算法越…

UE4架构初识(五)

UE4仿真引擎学习 一、架构基础 1. GameInstance UE提供的方案是一以贯之的&#xff0c;为我们提供了一个GameInstance类。为了受益于UObject的反射创建能力&#xff0c;直接继承于UObject&#xff0c;这样就可以依据一个Class直接动态创建出来具体的GameInstance子类。 UGam…

【Golang项目实战】手把手教你写一个备忘录程序|附源码——建议收藏

博主简介&#xff1a;努力学习的大一在校计算机专业学生&#xff0c;热爱学习和创作。目前在学习和分享&#xff1a;数据结构、Go&#xff0c;Java等相关知识。博主主页&#xff1a; 是瑶瑶子啦所属专栏: Go语言核心编程近期目标&#xff1a;写好专栏的每一篇文章 前几天瑶瑶子…