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

python Flask与微信小程序 统计管理

common/models/stat/StatDailyMember.py


DROP TABLE IF EXISTS `stat_daily_member`;CREATE TABLE `stat_daily_member` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`date` date NOT NULL COMMENT '日期',`member_id` int(11) NOT NULL DEFAULT '0' COMMENT '会员id',`total_shared_count` int(11) NOT NULL DEFAULT '0' COMMENT '当日分享总次数',`total_pay_money` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '当日付款总金额',`updated_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后一次更新时间',`created_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '插入时间',PRIMARY KEY (`id`),KEY `idx_date_member_id` (`date`,`member_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='会员日统计';
flask-sqlacodegen 'mysql://root:root@127.0.0.1/food_db' --tables stat_daily_member --outfile "common/models/stat/StatDailyMember.py"  --flask

common/models/stat/StatDailySite.py

DROP TABLE IF EXISTS `stat_daily_site`;CREATE TABLE `stat_daily_site` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`date` date NOT NULL COMMENT '日期',`total_pay_money` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '当日应收总金额',`total_member_count` int(11) NOT NULL COMMENT '会员总数',`total_new_member_count` int(11) NOT NULL COMMENT '当日新增会员数',`total_order_count` int(11) NOT NULL COMMENT '当日订单数',`total_shared_count` int(11) NOT NULL,`updated_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后一次更新时间',`created_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '插入时间',PRIMARY KEY (`id`),KEY `idx_date` (`date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='全站日统计';
flask-sqlacodegen 'mysql://root:root@127.0.0.1/food_db' --tables stat_daily_site --outfile "common/models/stat/StatDailySite.py"  --flask

common/models/stat/StatDailyFood.py

DROP TABLE IF EXISTS `stat_daily_food`;CREATE TABLE `stat_daily_food` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`date` date NOT NULL,`food_id` int(11) NOT NULL DEFAULT '0' COMMENT '菜品id',`total_count` int(11) NOT NULL DEFAULT '0' COMMENT '售卖总数量',`total_pay_money` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '总售卖金额',`updated_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后一次更新时间',`created_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '插入时间',PRIMARY KEY (`id`),KEY `date_food_id` (`date`,`food_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='书籍售卖日统计';
flask-sqlacodegen 'mysql://root:root@127.0.0.1/food_db' --tables stat_daily_food --outfile "common/models/stat/StatDailyFood.py"  --flask

jobs/tasks/stat/daily.py

# -*- coding: utf-8 -*-from application import app,db
from common.libs.Helper import getFormatDate,getCurrentDate
from common.models.member.Member import Member
from common.models.pay.PayOrder import PayOrder
from common.models.stat.StatDailyFood import StatDailyFood
from common.models.stat.StatDailySite import StatDailySite
from common.models.stat.StatDailyMember import StatDailyMember
from common.models.food.WxShareHistory import WxShareHistory
from common.models.food.FoodSaleChangeLog import FoodSaleChangeLog
from sqlalchemy import func
import random
'''
python manager.py runjob -m stat/daily -a member|food|site -p 2018-07-01
'''
class JobTask():def __init__(self):passdef run(self, params):act = params['act'] if 'act' in params else ''date = params['param'][0] if params['param'] and len(params['param']) else getFormatDate(format="%Y-%m-%d")if not act:returndate_from = date + " 00:00:00"date_to = date + " 23:59:59"func_params = {'act': act,'date':date,'date_from':date_from,'date_to':date_to}if act == "member":self.statMember( func_params )elif act == "food":self.statFood( func_params )elif act == "site":self.statSite( func_params)elif act == "test":self.test()app.logger.info("it's over~~")return'''会员统计'''def statMember(self,params):act = params['act']date = params['date']date_from = params['date_from']date_to = params['date_to']app.logger.info( "act:{0},from:{1},to:{2}".format( act,date_from,date_to ) )member_list = Member.query.all()if not member_list:app.logger.info( "no member list" )returnfor member_info in member_list:tmp_stat_member = StatDailyMember.query.filter_by( date = date,member_id = member_info.id ).first()if tmp_stat_member:tmp_model_stat_member = tmp_stat_memberelse:tmp_model_stat_member = StatDailyMember()tmp_model_stat_member.date = datetmp_model_stat_member.member_id = member_info.idtmp_model_stat_member.created_time = getCurrentDate()tmp_stat_pay =  db.session.query( func.sum(PayOrder.total_price).label("total_pay_money")) \.filter( PayOrder.member_id  == member_info.id ,PayOrder.status == 1 )\.filter( PayOrder.created_time >= date_from,PayOrder.created_time <= date_to ).first()tmp_stat_share_count = WxShareHistory.query.filter( PayOrder.member_id  == member_info.id  )\.filter( PayOrder.created_time >= date_from,PayOrder.created_time <= date_to ).count()tmp_model_stat_member.total_shared_count = tmp_stat_share_counttmp_model_stat_member.total_pay_money = tmp_stat_pay[ 0 ] if tmp_stat_pay[ 0 ] else 0.00'''为了测试效果模拟数据'''tmp_model_stat_member.total_shared_count = random.randint(50,100)tmp_model_stat_member.total_pay_money = random.randint(1000,1010)tmp_model_stat_member.updated_time = getCurrentDate()db.session.add( tmp_model_stat_member )db.session.commit()return'''Food统计'''def statFood(self,params):act = params['act']date = params['date']date_from = params['date_from']date_to = params['date_to']app.logger.info( "act:{0},from:{1},to:{2}".format( act,date_from,date_to ) )stat_food_list = db.session.query(FoodSaleChangeLog.food_id, func.sum(FoodSaleChangeLog.quantity).label("total_count"),func.sum(FoodSaleChangeLog.price).label("total_pay_money")) \.filter(FoodSaleChangeLog.created_time >= date_from, FoodSaleChangeLog.created_time <= date_to)\.group_by( FoodSaleChangeLog.food_id ).all()if not stat_food_list:app.logger.info("no data")returnfor item in stat_food_list:tmp_food_id = item[ 0 ]tmp_stat_food = StatDailyFood.query.filter_by(date=date, food_id = tmp_food_id ).first()if tmp_stat_food:tmp_model_stat_food = tmp_stat_foodelse:tmp_model_stat_food = StatDailyFood()tmp_model_stat_food.date = datetmp_model_stat_food.food_id = tmp_food_idtmp_model_stat_food.created_time = getCurrentDate()tmp_model_stat_food.total_count = item[1]tmp_model_stat_food.total_pay_money = item[2]tmp_model_stat_food.updated_time = getCurrentDate()'''为了测试效果模拟数据'''tmp_model_stat_food.total_count = random.randint(50, 100)tmp_model_stat_food.total_pay_money = random.randint(1000, 1010)db.session.add( tmp_model_stat_food )db.session.commit()return'''site统计'''def statSite(self,params):act = params['act']date = params['date']date_from = params['date_from']date_to = params['date_to']app.logger.info( "act:{0},from:{1},to:{2}".format( act,date_from,date_to ) )stat_pay = db.session.query(func.sum(PayOrder.total_price).label("total_pay_money")) \.filter(PayOrder.status == 1) \.filter(PayOrder.created_time >= date_from, PayOrder.created_time <= date_to).first()stat_member_count = Member.query.count()stat_new_member_count = Member.query.filter(Member.created_time >= date_from,Member.created_time <= date_to).count()stat_order_count = PayOrder.query.filter_by( status = 1 )\.filter(PayOrder.created_time >= date_from, PayOrder.created_time <= date_to)\.count()stat_share_count = WxShareHistory.query.filter(WxShareHistory.created_time >= date_from, WxShareHistory.created_time <= date_to).count()tmp_stat_site = StatDailySite.query.filter_by(date=date).first()if tmp_stat_site:tmp_model_stat_site = tmp_stat_siteelse:tmp_model_stat_site = StatDailySite()tmp_model_stat_site.date = datetmp_model_stat_site.created_time = getCurrentDate()tmp_model_stat_site.total_pay_money = stat_pay[ 0 ] if stat_pay[ 0 ] else 0.00tmp_model_stat_site.total_new_member_count = stat_new_member_counttmp_model_stat_site.total_member_count = stat_member_counttmp_model_stat_site.total_order_count = stat_order_counttmp_model_stat_site.total_shared_count = stat_share_counttmp_model_stat_site.updated_time = getCurrentDate()'''为了测试效果模拟数据'''tmp_model_stat_site.total_pay_money = random.randint(1000, 1010)tmp_model_stat_site.total_new_member_count = random.randint(50, 100)tmp_model_stat_site.total_member_count += tmp_model_stat_site.total_new_member_counttmp_model_stat_site.total_order_count = random.randint(900, 1000)tmp_model_stat_site.total_shared_count = random.randint(1000, 2000)db.session.add(tmp_model_stat_site)db.session.commit()def test(self):import datetimefrom common.libs.Helper import getFormatDatenow = datetime.datetime.now()for i in reversed( range( 1,30 ) ):date_before = now + datetime.timedelta( days = -i )date = getFormatDate( date = date_before,format = "%Y-%m-%d" )tmp_params = {'act': 'test','date': date,'date_from': date + " 00:00:00",'date_to':  date + " 23:59:59"}self.testFood( date )self.statFood( tmp_params )self.statMember( tmp_params )self.statSite( tmp_params )def testFood(self,date):from common.models.food.Food import Foodlist = Food.query.all()if list:for item in list:model =  FoodSaleChangeLog()model.food_id =  item.idmodel.quantity =  random.randint( 1,10 )model.price = model.quantity * item.pricemodel.member_id = 1model.created_time = date + " " + getFormatDate( format = "%H:%M:%S")db.session.add( model )db.session.commit()

statMember(self, params)

这段代码是一个函数statMember的实现,它接受一个参数params,其中包含了actdatedate_fromdate_to等信息。函数的主要功能是统计会员信息。

首先,函数会根据传入的参数打印出actdate_fromdate_to的值。然后,它会查询数据库中的所有会员信息,并进行遍历。

在遍历过程中,函数会根据日期和会员ID查询对应的每日会员统计信息StatDailyMember。如果找到了对应的记录,则将其赋值给tmp_model_stat_member;否则,创建一个新的StatDailyMember对象,并设置其日期、会员ID和创建时间。

接下来,函数会使用数据库查询语句计算该会员的总支付金额,并将结果保存在total_pay_money字段中。

最后,函数会返回统计结果。

statSite(self,params)

这段代码是一个函数statSite的定义,它接受一个参数params。函数内部首先从params中获取actdatedate_fromdate_to的值,并将它们打印出来。

接下来,函数使用SQLAlchemy进行数据库查询,统计了以下几个指标:

  1. stat_pay:计算了满足条件的支付订单的总金额。
  2. stat_member_count:统计了会员的总数量。
  3. stat_new_member_count:统计了在指定日期范围内新注册的会员数量。
  4. stat_order_count:统计了在指定日期范围内已支付的订单数量。
  5. stat_share_count:统计了在指定日期范围内的分享历史数量。

请注意,这段代码中使用了一些数据库模型(如PayOrderMemberWxShareHistory),以及一些SQLAlchemy的查询方法(如filter()count()first())来实现数据统计功能。

.count()

count()是一个用于统计字符串、列表、元组等可迭代对象中某个元素出现的次数的方法。它可以用于字符串、列表、元组等数据类型。

在字符串中,.count()方法可以统计指定字符或子字符串在字符串中出现的次数。例如:

python

string = "Hello, World!"
count = string.count("o")
print(count)  # 输出结果为2

在列表和元组中,.count()方法可以统计指定元素在列表或元组中出现的次数。例如:

python

my_list = [1, 2, 3, 4, 2, 2]
count = my_list.count(2)
print(count)  # 输出结果为3

.count()方法返回的是指定元素在可迭代对象中出现的次数。

test(self)

(imooc) [root@localhost order]# python manager.py runjob -m stat/daily -a test

加载30天的数据到数据库

这段代码是一个名为test的函数,它包含了一些操作。让我逐步解释一下:

  1. 首先,代码导入了datetime模块和getFormatDate函数。
  2. 然后,创建了一个当前时间的变量now,使用datetime.datetime.now()获取当前时间。
  3. 接下来,使用一个反向的循环,从1到29,创建一个变量date_before,表示当前时间减去i天的日期。
  4. 使用getFormatDate函数将date_before格式化为"%Y-%m-%d"的日期格式,并赋值给变量date
  5. 创建一个临时参数字典tmp_params,包含了一些键值对。
  6. 调用了self.testFood(date)函数,传入了date作为参数。
  7. 调用了self.statFood(tmp_params)函数,传入了tmp_params作为参数。
  8. 调用了self.statMember(tmp_params)函数,传入了tmp_params作为参数。
  9. 调用了self.statSite(tmp_params)函数,传入了tmp_params作为参数。

这段代码的作用是进行一系列的测试、统计操作,根据不同的日期进行相应的处理。

相关文章:

python Flask与微信小程序 统计管理

common/models/stat/StatDailyMember.py DROP TABLE IF EXISTS stat_daily_member;CREATE TABLE stat_daily_member (id int(11) unsigned NOT NULL AUTO_INCREMENT,date date NOT NULL COMMENT 日期,member_id int(11) NOT NULL DEFAULT 0 COMMENT 会员id,total_shared_count …...

光伏企业助力乡村振兴

光伏是一种利用太阳能生产电能的发电技术&#xff0c;属于可再生能源。近年来我国的光伏企业发展迅速&#xff0c;已经称霸全球&#xff0c;同时也为乡村振兴贡献了力量。 一、光伏企业助力乡村 1.推动农业发展 光伏发电和农业种植、畜牧、渔业、水产等有机结合&#xff0c;…...

root MUSIC 算法补充说明

root MUSIC 算法补充说明 多项式求根root MUSIC 算法原理如何从 2 M − 2 2M-2 2M−2 个根中确定 K K K 个根从复数域上观察 2 M − 2 2M-2 2M−2 个根的分布 这篇笔记是上一篇关于 root MUSIC 笔记的补充。 多项式求根 要理解 root MUSIC 算法&#xff0c;需要理解多项式求…...

关于Django的中间件使用说明。

目录 1.中间件2. 为什么要中间件&#xff1f;3. 具体使用中间件3.1 中间件所在的位置&#xff1a;在django的settings.py里面的MIDDLEWARE。3.2 中间件的创建3.3 中间件的使用 4. 展示成果 1.中间件 中间件的大概解释&#xff1a;在浏览器在请求服务器的时候&#xff0c;首先要…...

Chapter 8 - 15. Congestion Management in TCP Storage Networks

User Actions After learning the states of queue utilization, the following are the actions that admins and operators can take while using TCP transport for storage traffic. 了解了队列利用率的状态后,管理员和操作员在使用 TCP 传输存储流量时可以采取以下措施。…...

前端技巧之svg精灵图svg-sprite-loader

首先说明精灵图的必要性&#xff0c;其可以让我们只需要向服务器请求一次图片资源&#xff0c;就能加载很多图片&#xff0c;即能够减轻http请求造成的服务器压力。 然后这里要说明的是这个插件是webpack上面的&#xff0c;所以在vue2中比较好用&#xff0c;如果在vue3中&…...

IO线程-day2

1> 使用fread和fwrite完成两个文件的拷贝 程序&#xff1a; #define MAXSIZE 1024 #include<myhead.h>int main(int argc, char const *argv[]) {FILE *srcfpNULL;FILE *destfpNULL;if(!(srcfpfopen("pm.bmp","r")))PRINT_ERR("");if…...

Spring Boot 笔记 024 登录页面

1.1 登录接口 //导入request.js请求工具 import request from /utils/request.js//提供调用注册接口的函数 export const userRegisterService (registerData)>{//借助于UrlSearchParams完成传递const params new URLSearchParams()for(let key in registerData){params.a…...

09_Java集合

一、Java集合框架概述 一方面&#xff0c; 面向对象语言对事物的体现都是以对象的形式&#xff0c;为了方便对多个对象的操作&#xff0c;就要对对象进行存储。另一方面&#xff0c;使用Array存储对象方面具有一些弊端&#xff0c;而Java 集合就像一种容器&#xff0c;可以动态…...

HCIA-HarmonyOS设备开发认证V2.0-3.2.轻量系统内核基础-软件定时器

目录 一、软件定时器基本概念二、软件定时器运行机制三、软件定时器状态四、软件定时器模式五、软件定时器开发流程六、软件定时器使用说明七、软件定时器接口八、代码分析&#xff08;待续...&#xff09;坚持就有收获 一、软件定时器基本概念 软件定时器&#xff0c;是基于系…...

考研证件照可以自己用手机拍吗?考研证件照p过可以通过审核吗?考研证件照有什么要求

一、考研证件照可以自己用手机拍吗 现在的智能手机相机技术先进&#xff0c;大多都配备了高像素摄像头&#xff0c;使得自拍照片的质量有了大幅提升。相较于传统的证件照拍摄&#xff0c;使用手机自拍考研证件照理论上是可行的。然而&#xff0c;考研证件照需要满足一定的规定…...

win10 环境下Python 3.8按装fastapi paddlepaddle 进行图片文字识别1

###按装 用conda 创建python 3.8的环境&#xff0c;可参看本人python下的其它文章。 在pycharm开发环境下按装相关的模块&#xff1a; pip install -i https://pypi.tuna.tsinghua.edu.cn/simple fastapi pip install -i https://pypi.tuna.tsinghua.edu.cn/simple "uvi…...

json字符串的处理

json字符串的处理 【1】解析json字符串&#xff08;1&#xff09;如果json格式字符串 &#xff0c;最外层 是 中括号&#xff0c;表示数组&#xff0c;就使用方法&#xff08;2&#xff09;如果json格式字符串&#xff0c;最外层是 大括号&#xff0c;表示对象&#xff0c;就是…...

Java基础String常见的编程练习

1.对字符串数组进行排序 package javalianxi;import java.util.Arrays; import java.util.Comparator;public class Test1 {public static void main(String[] args) {String[] array { "cd", "CD", "bc", "AB", "ab", &q…...

代码随想录算法训练营(回溯5)| 491.递增子序列 46.全排列 47.全排列 II

491.递增子序列 本题和大家刚做过的 90.子集II 非常像&#xff0c;但又很不一样&#xff0c;很容易掉坑里。 题目链接/文章讲解 视频讲解 46.全排列 本题重点感受一下&#xff0c;排列问题 与 组合问题&#xff0c;组合总和&#xff0c;子集问题的区别。 为什么排列问题不用…...

专业140+总分420+南京信息工程大学811信号与系统考研经验南信大电子信息与通信工程,真题,大纲,参考书

今年顺利被南信大电子信息录取&#xff0c;初试420&#xff0c;专业811信号与系统140&#xff08;Jenny老师辅导班上140很多&#xff0c;真是大佬云集&#xff09;&#xff0c;今年应该是南信大电子信息最卷的一年&#xff0c;复试线比往年提高了很多&#xff0c;录取平均分380…...

一元函数微分学【高数笔记】

1. 什么是微分&#xff1f;什么是微商&#xff1f; 2. 什么是函数的微分&#xff1f; 3. 在函数的微分中&#xff0c;有什么样的关系&#xff1f; 4. 一元函数的微分运用在什么题型中&#xff1f; 5. 什么是一元函数&#xff1f;...

(16)Hive——企业调优经验

前言 本篇文章主要整理hive-3.1.2版本的企业调优经验&#xff0c;有误请指出~ 一、性能评估和优化 1.1 Explain查询计划 使用explain命令可以分析查询计划&#xff0c;查看计划中的资源消耗情况&#xff0c;定位潜在的性能问题&#xff0c;并进行相应的优化。 explain执行计划…...

【详解】图的概念和存储结构(邻接矩阵,邻接表)

目录 图的基本概念&#xff1a; 图的存储结构 邻接矩阵&#xff08;GraphByMatrix&#xff09;&#xff1a; 基本参数&#xff1a; 初始化&#xff1a; 获取顶点元素在其数组中的下标 &#xff1a; 添加边和权重&#xff1a; 获取顶点的度&#xff1a; 打印图&#xf…...

【AIGC】Stable Diffusion介绍

Stable Diffusion 是一个基于 OpenAI 的 Diffusion 模型的扩展版本&#xff0c;它采用了稳定扩散&#xff08;Stable Diffusion&#xff09;的技术&#xff0c;旨在提高图像生成和处理的质量。下面是 Stable Diffusion 的详细介绍&#xff1a; 基于 Diffusion 的图像生成&…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

Spring Boot + MyBatis 集成支付宝支付流程

Spring Boot MyBatis 集成支付宝支付流程 核心流程 商户系统生成订单调用支付宝创建预支付订单用户跳转支付宝完成支付支付宝异步通知支付结果商户处理支付结果更新订单状态支付宝同步跳转回商户页面 代码实现示例&#xff08;电脑网站支付&#xff09; 1. 添加依赖 <!…...

UE5 音效系统

一.音效管理 音乐一般都是WAV,创建一个背景音乐类SoudClass,一个音效类SoundClass。所有的音乐都分为这两个类。再创建一个总音乐类&#xff0c;将上述两个作为它的子类。 接着我们创建一个音乐混合类SoundMix&#xff0c;将上述三个类翻入其中&#xff0c;通过它管理每个音乐…...

基于Python的气象数据分析及可视化研究

目录 一.&#x1f981;前言二.&#x1f981;开源代码与组件使用情况说明三.&#x1f981;核心功能1. ✅算法设计2. ✅PyEcharts库3. ✅Flask框架4. ✅爬虫5. ✅部署项目 四.&#x1f981;演示效果1. 管理员模块1.1 用户管理 2. 用户模块2.1 登录系统2.2 查看实时数据2.3 查看天…...

基于Java项目的Karate API测试

Karate 实现了可以只编写Feature 文件进行测试,但是对于熟悉Java语言的开发或是测试人员,可以通过编程方式集成 Karate 丰富的自动化和数据断言功能。 本篇快速介绍在Java Maven项目中编写和运行测试的示例。 创建Maven项目 最简单的创建项目的方式就是创建一个目录,里面…...