热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:进来看冰冰!用Python写了一个青年大学习提醒系统

篇首语:本文由编程笔记#小编为大家整理,主要介绍了进来看冰冰!用Python写了一个青年大学习提醒系统相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了进来看冰冰!用Python写了一个青年大学习提醒系统相关的知识,希望对你有一定的参考价值。







来源:CSDN


链接:https://blog.csdn.net/weixin_45304503/article/details/117730712




大家好,欢迎来到 Crossin的编程教室 !

今天给大家分享的这个开发案例,作者是一名班级团支书,每周都要催班上同学做青年大学习。于是,他就做了一个自动提醒的脚本,后来封装成了一个APP。

uniapp + flask 前后端分离

瞬间减少了日常的工作量,再也不怕忘记提醒了。而且看青年大学习(看冰冰lp)谁不喜欢呢?



进来看冰冰!用Python写了一个青年大学习提醒系统

呜呜呜冰冰怎么这么好看且有气质啊!!!!
呜呜呜wsl
进来看冰冰!用Python写了一个青年大学习提醒系统

为了让大家尽快学习到青年大学习!

话不多说,直接看代码吧!



1、flask后端部分


1.1 前情概要

脚本获取数据部分戳这里:

https://blog.csdn.net/weixin_45304503/article/details/114501006



1.2 具体细节


1.2.1 数据库部分

配置连接







































HOSTNAME = '127.0.0.1' # 这里改成你的mysql配置PORT = '3306' DATABASE = 'teenstudy'USERNAME = 'root'PASSWORD = 'root'db_url = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format( USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE,)

class Config(object): SQLALCHEMY_DATABASE_URI = db_url SQLALCHEMY_TRACK_MODIFICATIOnS= False SQLALCHEMY_COMMIT_ON_TEARDOWN = True

app = Flask(__name__)CORS(app, supports_credentials=True)pymysql.install_as_MySQLdb()app.config.from_object(Config)db = SQLAlchemy(app)
manager = Manager(app) # 数据迁移Migrate(app, db) # 第一个参数是flask实例,第二个参数SQLAlchemy实例manager.add_command("db", MigrateCommand)
engin = create_engine(db_url) # 创建引擎Base = declarative_base(engin)Session = sessionmaker(engin)session = Session()

数据库的相关字段设置
































































# 用户模型class User(db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True) account = db.Column(db.String(18)) # 账号 add_time = db.Column(db.DateTime, index=True, default=datetime.datetime.now()) # 创建时间 email = db.Column(db.String(100)) # 邮箱 name = db.Column(db.String(16)) # 名字 province = db.Column(db.String(255)) # 省份 school = db.Column(db.String(255)) # 学校 college = db.Column(db.String(255)) # 学院 origirtion = db.Column(db.String(255)) # 组织 grade = db.Column(db.String(255)) # 年级 major = db.Column(db.String(255)) # 专业 count = db.Column(db.Boolean, default=False) # 最新一期青年大学习是否有做 history_count = db.Column(db.Integer, default=False) # 本季青年大学习做了多少次 role_id = db.Column(db.Integer, db.ForeignKey('roles.id'), default=3) # 管理身份
def __repr__(self): return """%s""" % self.email

# 身份模型class Role(db.Model): __tablename__ = 'roles' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(8), unique=True) # 1、管理员, 2、团支书, 3、普通团员 users = db.relationship('User', backref='role')
def __repr__(self): return """ """ % (self.id, self.name)

# 青年大学习模型class TeenStudy(db.Model): __tablename__ = 'teenstudy' id = db.Column(db.Integer, primary_key=True) study_id = db.Column(db.String(255)) # 第几期,爬下日期 study_title = db.Column(db.String(255)) # 这一期的名字 add_time = db.Column(db.DateTime, index=True, default=datetime.datetime.now())
def __repr__(self): return """ add_time:%s)>""" % (self.id, self.study_id, self.study_title, self.add_time)

class admin(db.Model): # 管理员 __tablenaem__ = 'admin' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(255)) password = db.Column(db.String(255)) add_time = db.Column(db.DateTime, index=True, default=datetime.datetime.now())
def __repr__(self): return """            add_time:%s)>""" % (self.id, self.name, self.password, self.add_time)


1.2.2 路由部分

首先是登陆,后台将模拟浏览器登陆到智慧团建,然后就获取到COOKIE,拿这个COOKIE去将requests请求到所对应的没做的名单。
































































@app.route('/login', methods=['GET''POST'])def login(): username = request.form.get("username") password = request.form.get("password") # print(username, password) COOKIE = GetCOOKIE(username, password) if COOKIE == "500": return { "code": "500", "msg": "发生了点错误,请稍后重试" } headers = { 'Host': 'm.fjcyl.com', 'Referer': 'http://m.fjcyl.com/logout', 'User-Agent': 'Mozilla/5.0 (iPad; CPU OS 13_4_1 like Mac OS X) AppleWebKit/605.1.15 (Khtml, like Gecko) ' 'Mobile/15E148 MicroMessenger/7.0.12(0x17000c33) NetType/WIFI Language/zh_CN', 'COOKIE': COOKIE } GetSchoolInfo(headers) cate, infoDetail, reg = GetStuInfo(headers) if cate == 3: # 普通团员 if reg == 10001: return { "code": 200, "msg": 3, # 普通团员 "info": 10001, "infoDetail": infoDetail, } elif reg == 10002: return { "code": 200, "msg": 3, # 普通团员 "info": 10002, } elif cate == 2: # 团支书 DidNumListT = Parma(headers) # print("DidNumListT") # print(DidNumListT) if len(DidNumListT) == 0: return { "code": 200 } if reg == 10001: result = { "code": "200", "info": 10001, # 还没在数据库中存在 "msg": 2, # 团支书 "data": eval(DidNumListT), "infoDetail": infoDetail, } return result elif reg == 10002: result = { "code": "200", "msg": 2, # 团支书 "info": 10002, # 在数据库中不存在 "data": eval(DidNumListT) }            return result

找到名单之后去查询数据库,在数据库中拿到没做名单的邮箱。































@app.route('/init_email', methods=['GET', 'POST'])def init_email(): QQEmail = request.form.get("QQEmail") UserName = request.form.get("UserName") acctId = request.form.get("acctId") colName = request.form.get("colName") grade = request.form.get("grade") major = request.form.get("major") positiOnName= request.form.get("positionName") schoolName = request.form.get("schoolName") count = db.session.query(func.count(User.id)).filter(User.school == schoolName, User.college == colName, User.major == major, User.account == acctId).scalar() if count == 0: user = User(account=acctId, name=UserName, school=schoolName, college=colName, grade=grade, major=major, origirtion=positionName, email=QQEmail) db.session.add(user) db.session.commit() return { "msg": 200, "data": "success" } elif count != 0: return { "msg": 200, "data": 10001, # 已经存在了        }

然后就发送邮件,发送成功后,给前端返回一个成功。












































@app.route('/sendMail', methods=['GET', 'POST'])def sendMail(): # print("DidDoneLists") DidDOneLists= request.form.get("EmailList") DidDOneList= DidDoneLists.split(",") Email = [] count = 1 for k in DidDoneList: count += 1 if count == 2: Email.append(k) count = 0 print(Email) msg = MIMEText('青年大学习!不用回复!赶紧做!!') # 构造邮件,内容为青年大学习 msg["Subject"] = "青年大学习!!又是你!!!" # 设置邮件主题 msg["From"] = '辛苦勤劳艰苦奋斗的团支书' # 寄件者 msg["To"] = '未做人员' # 收件者 from_addr = '' password = '' smtp_server = 'smtp.qq.com' # smtp服务器地址 to_addr = Email # 收件人地址 try: # smtp协议的默认端口是25,QQ邮箱smtp服务器端口是465,第一个参数是smtp服务器地址,第二个参数是端口,第三个参数是超时设置,这里必须使用ssl证书,要不链接不上服务器 server = smtplib.SMTP_SSL(smtp_server, 465, timeout=2) server.login(from_addr, password) # 登录邮箱 # 发送邮件,第一个参数是发送方地址,第二个参数是接收方列表,列表中可以有多个接收方地址,表示发送给多个邮箱,msg.as_string()将MIMEText对象转化成文本 server.sendmail(from_addr, to_addr, msg.as_string()) server.quit() logging.info("EMAIL SUCCESS") return {"code": "200", "info": "success"} # print('success') except Exception as e: if e is None: # Send_Boss() logging.error("EMAIL FAIL") return {"code": "200", "info": "success"} else: print('Faild:%s' % e)            return {"code""500""info""fail"}


1.2.3 数据交换部分

由于使用的是前后端分离,所以要用json格式传送数据,然而json格式是要双引号进行传送的,而python是默认单引号的,所以要把python的单引号变双引号!!我是用正则来进行匹配替换的。








strinfo = re.compile("'") Num_Email = str(DidDoneNumList_Json)    Num_Email_Json = strinfo.sub('"', Num_Email)

进来看冰冰!用Python写了一个青年大学习提醒系统


2、uni-app前端部分

前端部分使用的是uni-app,主要是因为这个是跨平台的。
下载HBuilder X 编译器


2.1 登陆页面

进来看冰冰!用Python写了一个青年大学习提醒系统


2.2 提醒页面

进来看冰冰!用Python写了一个青年大学习提醒系统


2.3 效果演示

进来看冰冰!用Python写了一个青年大学习提醒系统

以后我们班成员都能好好看青年大学习了!!!
嘻嘻!!

进来看冰冰!用Python写了一个青年大学习提醒系统


3、结语

大家不要找我做什么自动看青年大学习了!!
这个不做!!!我不会做!也没必要做!!

这个只是为了让我们班的同学都能及时完成学习而已,没别的意思。

相关代码:

https://blog.csdn.net/weixin_45304503/article/details/114501006

如果文章对你有帮助,欢迎转发/点赞/收藏~










_往期文章推荐_











如需了解付费精品课程教学答疑服务


请在Crossin的编程教室内回复:
666


推荐阅读
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 本文详细介绍了IBM DB2数据库在大型应用系统中的应用,强调其卓越的可扩展性和多环境支持能力。文章深入分析了DB2在数据利用性、完整性、安全性和恢复性方面的优势,并提供了优化建议以提升其在不同规模应用程序中的表现。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • 深入解析:手把手教你构建决策树算法
    本文详细介绍了机器学习中广泛应用的决策树算法,通过天气数据集的实例演示了ID3和CART算法的手动推导过程。文章长度约2000字,建议阅读时间5分钟。 ... [详细]
  • ImmutableX Poised to Pioneer Web3 Gaming Revolution
    ImmutableX is set to spearhead the evolution of Web3 gaming, with its innovative technologies and strategic partnerships driving significant advancements in the industry. ... [详细]
  • 本文详细介绍了macOS系统的核心组件,包括如何管理其安全特性——系统完整性保护(SIP),并探讨了不同版本的更新亮点。对于使用macOS系统的用户来说,了解这些信息有助于更好地管理和优化系统性能。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 导航栏样式练习:项目实例解析
    本文详细介绍了如何创建一个具有动态效果的导航栏,包括HTML、CSS和JavaScript代码的实现,并附有详细的说明和效果图。 ... [详细]
  • 主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • MongoDB集群配置:副本集与分片详解
    本文详细介绍了如何在MongoDB中配置副本集(Replica Sets)和分片(Sharding),并提供了具体的步骤和命令,帮助读者理解并实现高可用性和水平扩展的MongoDB集群。 ... [详细]
  • This document outlines the recommended naming conventions for HTML attributes in Fast Components, focusing on readability and consistency with existing standards. ... [详细]
author-avatar
手机用户2602920567
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有