目录

  1. 引言 3
  2. 系统结构 3
    2.1. 系统流程 3
    2.2. 系统主要框架 4
    2.2.1. Flask 4
    2.2.2. SQLAlchemy 5
    2.3. 系统功能 6
    2.3.1. 登录功能 6
    2.3.2. 请假申请功能 6
    2.3.3. 请假审批功能 7
  3. 实现代码 8
    3.1. 系统登录功能代码 8
    3.1.1. 前端调用代码 8
    3.1.2. 后台处理代码 10
    3.2. 学生请假申请代码 12
    3.2.1. 前端调用代码 12
    3.2.2. 后台处理代码 13
    3.3. 老师请假审批代码 14
    3.3.1. 前端调用代码 14
    3.3.2. 后台处理代码 15
  4. 实验 15
    4.1. 数据库的搭建 15
    4.1.1. student表 16
    4.1.2. teacher表 16
    4.1.3. leave表 17
    4.2. 数据模型 17
    4.2.1. student模型 17
    4.2.2. teacher模型 18
    4.2.3. leave模型 18
    4.3. 数据表及数据 18
    4.3.1. student数据 18
    4.3.2. teacher数据 19
    4.3.3. leave数据 19
  5. 总结和展望 19
    5.1. 总结 19
    5.2. 展望 19

摘要
请假小程序是前端使用微信小程序,后台使用Python制作的供学生申请课堂请假、老师或辅导员查看并批假的移动端小程序。已导入该系统的学生登录请假小程序,可以在请假标签页进行请假申请,填写好相关资料(请假类别、请假开始时间、请假结束时间、请假理由),选择院系辅导员和任课老师,再提供证明单据,即可提交请假申请。在消息标签页可以查看自己所提交的所有请假记录。已导入该系统的老师或辅导员登录请假小程序,在消息标签页可以查看归自己审批的学生请假记录,点击查看详情即可进行审批。在批假标签页可以查看自己所审批过的所有记录。
1.引言
数字化时代,任何事情都在使用计算机或手机进行。课堂请假使用移动端进行,省去了纸质证明以及要当面寻找老师请假的繁琐。不管学生老师都有使用微信,因此本系统借助微信小程序进行,通过微信这一方便的载体,便捷的分享使用请假小程序。学生或老师通过小程序入口或分享的入口进入,登录后可查看当前身份下的操作功能。该小程序的设计就是省去通常学生在学校请假需要同老师拿假条签完后又要上交的麻烦,将记录保存在服务器上,既不担心纸质假条的丢失,也节约了请假流程的时间。
2.系统结构
2.1.系统流程
用户(学生、老师、辅导员)登录系统后,根据角色的不同有不同的使用功能,主要功能流程图如下所示:

2.2.系统主要框架
2.2.1.Flask
Flask是一个轻量级的web框架,Flask中拥有灵活的Jinja2模板引擎,提高了前端代码的复用率。Flask有两个主要依赖:路由、调试和Web服务器网关接口(WebServerGatewayInterface,WSGI)子系统由Werkzeug提供;模板系统由Jinja2提供。在请假小程序中使用Flask构建API,在程序里将一个视图函数分配给一个URL,每当用户访问这个URL时,系统就会执行给该URL分配好的视图函数,获取函数的返回值并将其显示到浏览器上,其工作过程见图:

2.2.2.SQLAlchemy
SQLAlchemy 是 Python 中一个通过 ORM 操作数据库的框架。SQLAlchemy对象关系映射器提供了一种方法,用于将用户定义的Python类与数据库表相关联,并将这些类(对象)的实例与其对应表中的行相关联。它包括一个透明地同步对象及其相关行之间状态的所有变化的系统,称为工作单元,以及根据用户定义的类及其定义的彼此之间的关系表达数据库查询的系统。SQLAlchemy提供了一整套众所周知的企业级持久性模式,旨在实现高效,高性能的数据库访问,并采用简单的Pythonic域语言。SQLAlchemy 架构图如下所示:

2.3.系统功能
2.3.1.登录功能
微信小程序登录前端UI图:

2.3.2.请假申请功能
学生请假功能页面UI:

2.3.3.请假审批功能
老师审批请假UI:

3.实现代码
3.1.系统登录功能代码
3.1.1.前端调用代码
wx.request({
url: ‘http://127.0.0.1:8080/login’,
data: {
userId: this.data.id,
userPwd: this.data.pwd
},
header: {
‘content-type’: ‘application/json’ // 默认值
},
method: “POST”,
success: function (res) {
var json = res.data;
console.log(json);
var flag = parseInt(json[“flag”]);
var role = parseInt(json[“role”]);
switch (flag) {
case 0:
that.setData({
txt: “学号或者工号不存在”,
modalHidden: !that.data.modalHidden
});
break;
case 1:
that.setData({
txt: “密码错误”,
modalHidden: !that.data.modalHidden
});
break;
case 2:
var school=json[“school”];
console.log(school);
wx.setStorageSync(“school”, school);
if(role0){
var name = json[“name”];
var teacher_id = json[“teacher_id”];
wx.setStorageSync(“teacher_id”, teacher_id);
wx.setStorageSync(‘role’, ‘辅导员/班主任’);
wx.setStorageSync(“name”, name);
that.goTeacher();
}
else if(role1) {
var name = json[“name”];
wx.setStorageSync(“name”, name);
var teacher_id = json[“teacher_id”];
wx.setStorageSync(“teacher_id”, teacher_id);
wx.setStorageSync(‘role’, ‘任课老师’);
that.goClass();
}
else{
var s_class=json[“s_class”];
var student_id=json[“student_id”];
var room=json[“room”];
var name = json[“name”];
//添加学生信息到本地缓存,在退出时释放
wx.setStorageSync(“s_class”,s_class);
wx.setStorageSync(“name”, name);
wx.setStorageSync(“room”, room);
wx.setStorageSync(“student_id”, student_id);
that.goStudent();
}
break;
}
}
})

3.1.2.后台处理代码
@app.route("/login", methods=[‘GET’, ‘POST’])
def login():
if (request.method == ‘POST’):
if not (request.json):
return jsonify(‘not json’)
else:
data = request.get_json()

        rec_id = data['userId']rec_pwd = data['userPwd']print("rec_id:"+rec_id)print("rec_pwd:"+rec_pwd)if len(str(rec_id)) == 6:db_data = search_t(str(rec_id))if (db_data) is None:return_data = dict()return_data['flag'] = '0'return jsonify(return_data)else:db_id = str(Decimal(db_data['teacher_id']).quantize(Decimal('0')))db_name = db_data['name']db_pwd = db_data['passwd']db_role = db_data['role']db_school = db_data['school']print("db_pwd:"+db_pwd)if check_password_hash(str(db_pwd),str(rec_pwd)) is not True:return_data = dict()return_data['flag'] = '1'return_data['teacher_id'] = rec_idreturn jsonify(return_data)elif check_password_hash(str(db_pwd),str(rec_pwd)) is True:return_data = dict()db_id = str(Decimal(db_data['teacher_id']).quantize(Decimal('0')))return_data['teacher_id'] = db_idreturn_data['name'] = db_namereturn_data['role'] = db_rolereturn_data['school'] = db_schoolreturn_data['flag'] = '2'return (jsonify(return_data))if len(str(rec_id)) == 9:db_data = search_s(str(rec_id))if (db_data) is None:print ("db_data is none")return_data = dict()return_data['flag'] = '0'return jsonify(return_data)else:db_id = str(Decimal(db_data['student_id']).quantize(Decimal('0')))db_name = db_data['name']db_pwd = db_data['passwd']db_class = db_data['s_class']db_room = db_data['room']print("db_data is ok")print("db_pwd:"+db_pwd)print ("rec_pwd:"+rec_pwd)if check_password_hash(str(db_pwd),str(rec_pwd)) is not True:return_data = dict()return_data['flag'] = '1'return_data['student_id'] = rec_id#return_data['passwd'] = rec_pwdreturn jsonify(return_data)elif check_password_hash(str(db_pwd),str(rec_pwd)) is True:return_data = dict()db_id = str(Decimal(db_data['student_id']).quantize(Decimal('0')))return_data['student_id'] = db_idreturn_data['name'] = db_namereturn_data['s_class'] = db_data['s_class']return_data['room'] = db_data['room']return_data['flag'] = '2'return (jsonify(return_data))else:return_data = dict()return_data['flag'] = '0'return jsonify(return_data)else:return jsonify('not POST method')

3.2.学生请假申请代码
3.2.1.前端调用代码
wx.request({
url: ‘http://127.0.0.1:8080/student/ask_leave’,
data: {
student_id: that.data.student_id,
start_time: that.data.startdate,
end_time: that.data.enddate,
reason:that.data.leaveinfo,
flag:1,
teacher1_id:t1id,
teacher2_id:t2id,
s_type: typ,//请假类型
ensure:fileId
},
header: {
‘content-type’: ‘application/json’ // 默认值
},
method: “POST”,
success: function(e){
console.log(e);
if(e.data==‘True’){
that.setData({
txt: ‘添加成功’,
modalHidden: !that.data.modalHidden
})
}
else{
that.setData({
txt: ‘添加失败(>_<)’,
modalHidden: !that.data.modalHidden
})
}
}
})

3.2.2.后台处理代码
@app.route("/student/ask_leave", methods=[‘GET’, ‘POST’])
def ask_leave():

if (request.method == 'POST'):if not (request.json):return jsonify('not json')else:try:data = request.get_json()student_id = data['student_id']start_time = data['start_time']end_time = data['end_time']reason = data['reason']flag = data['flag']teacher1_id = data['teacher1_id']teacher2_id = data['teacher2_id']s_type = data['s_type']ensure = data['ensure']print("s_type:")print(data['s_type'])insert = insert_leave(student_id, start_time, end_time, reason, flag, teacher1_id, teacher2_id, s_type,ensure)if (insert == True):return ('True')else:return ('False')except Exception as ret:print(ret)return("ERROR")else:return jsonify('not POST method')

3.3.老师请假审批代码
3.3.1.前端调用代码
wx.request({
url: ‘http://127.0.0.1:8080/teacher/update_leave’,
data: {
leave_num: leave_num,
flag:2
},
header: {
“content-type”: “application/json”
},
method: “post”,
success: function (e) {
console.log(e.data);
if(e.data==“True”){
wx.redirectTo({
url: ‘…/one/one’,
});
wx.showToast({
title: ‘批假成功’,
icon: ‘success’,
duration: 2000
})
}else{
wx.showToast({
title: ‘批假失败’,
icon:‘fail’,
duration:2000
})
}
}
})

3.3.2.后台处理代码
@app.route("/teacher/update_leave", methods=[‘GET’, ‘POST’])
def update_leave():
if request.method == ‘POST’:
if not (request.json):
return jsonify(‘not json’)
else:
data = request.get_json()
leave_num = data[‘leave_num’]
flag = data[‘flag’]
update_leave_res = update_leave(leave_num, flag)
return(update_leave_res)

else:return jsonify("not POST")

4.实验
4.1.数据库的搭建
该请假系统使用了三张表,分别是student(学生信息表)、teacher(教师/辅导员信息表)、leave(请假记录表),每张表的设计如下:
4.1.1.student表

4.1.2.teacher表

4.1.3.leave表

4.2.数据模型
通过Flask框架,在后台通过声明数据模型(表对应的类),可在后台程序通过ORM操纵数据表,4.1中的各表对应的模型如下:
4.2.1.student模型

4.2.2.teacher模型

4.2.3.leave模型

4.3.数据表及数据
4.3.1.student数据

4.3.2.teacher数据

4.3.3.leave数据

5.总结和展望
5.1.总结
Python通过其丰富的框架,可以较少代码的实现相同的功能,该请假小程序所以后台代码刚好700行,提供所有该系统所必须的接口方法。通过Flask框架可在后台直接写原生sql语句进行数据库操作。通过SQLAlchemy框架,在后台代码简短的配置数据库连接即可实现连接数据库。整个项目下来,感受就是python的框架减少了大量的编码量,提高了编程进度。
5.2.展望
该请假小程序是轻量级的系统,所用框架并不多,并不能很好的承受数量众多的用户,如要较好的承受量,还得将系统拓展至分布式的重量级系统。而python的分布式暂未深入研究,将在了解后对该系统进行升级改造。
参考文献
[1]深入Python3
[2]简书作者:运维开发_西瓜甜,链接:https://www.jianshu.com/p/65903a69d61d

微信小程序-python结合制作的《请假小程序》相关推荐

  1. python做出来的小程序、可以在win10上面运行_超详细,手把手教你用20行Python代码制作飞花令小程序!...

    原标题:超详细,手把手教你用20行Python代码制作飞花令小程序! 来源:早起Python 作者:陈熹 飞花令是古时候人们经常玩一种"行酒令"的游戏,是中国古代酒令之一,属雅令. ...

  2. 微信小程序|基于小程序+云开发制作一个菜谱小程序

    今天吃什么?这是一个让强迫症左右为难的问题,跟随此文基于小程序+云开发制作一个菜谱小程序,根据现有食材一键生成菜谱,省心又省力. 一.小程序 1. 创建小程序

  3. 【抖音小游戏】 Unity制作抖音小游戏方案 最新完整详细教程来袭【持续更新】

    前言 [抖音小游戏] Unity制作抖音小游戏方案 最新完整详细教程来袭[持续更新] 一.相关准备工作 1.1 用到的相关网址 1.2 注册字节开发者后台账号 二.相关集成工作 2.1 下载需要的集成 ...

  4. 微信小程序|基于小程序+云开发制作一个租房小程序

    经济发展的同时伴随着大批人群的流动,租房需求一直是持久不衰的话题,如何租好房,好租房,跟随此文一起制作一个租房小程序,让租房不再困难. 一.小程序 1. 创建小程序 2. 首页 3. 房源列表页 4. ...

  5. python英语字典程序-python如何制作英文字典

    本文实例为大家分享了python制作英文字典的具体代码,供大家参考,具体内容如下 功能有添加单词,多次添加单词的意思,查询,退出,建立单词文件. keys=[] dic={} def rdic(): ...

  6. 小甲鱼python课后题答案_小甲鱼python视频教程下载|小甲鱼零基础学python视频教程附习题答案_ - 极光下载站...

    小甲鱼零基础学python视频教程下载,最完整的小甲鱼python语言学习视频来啦,想要学习python语言的小白们不妨点击观看视频在下学习吧! Python语言介绍 Python是一种面向对象的解释 ...

  7. 小甲鱼python课后题答案_Python 小甲鱼教程 课后练习44

    按照视频内的内容,已经写出了一个计时器,但是小甲鱼要求的内容是,不能让时间出现负值,所以需要修改计时器 自己写的和小甲鱼写的完全不一样-..小甲鱼那个应该是先计算,再最后赋值并打印 自己这个是先不管他 ...

  8. 小甲鱼python 第003讲:小插曲之变量和字符串

    文章目录 第003讲:小插曲之变量和字符串 讲课笔记 变量 字符串 思尻题 0. 以下哪个变量的命名不正确?为什么? 1. 在不上机的情况下,以下代码你能猜到屏幕会打印什么内容吗? 2. 在不上机的情 ...

  9. 超详细,手把手教你用20行Python代码制作飞花令小程序!

    大家好,我是涛哥. 飞花令是古时候人们经常玩一种"行酒令"的游戏,是中国古代酒令之一,属雅令."飞花"一词则出自唐代诗人韩翃<寒食>中 春城无处不飞 ...

最新文章

  1. 盘点 | 2017 年 关于 Python 的 13 件大事
  2. eclipse奇淫技巧 (转)
  3. 竞品分析实战系列之如何对电商产品条目进行合理设计?
  4. 【matlab代码】生成特定频率的正弦信号,X轴以时间表示
  5. JAVA中ListIterator和Iterator详解与辨析
  6. mysql实例详解_MySQL 多实例详解
  7. 2017.8.7 序列计数 思考记录
  8. jQuery EasyUI -ComboBox(下拉列表框)使用
  9. 戴尔笔记本不能识别U盘和鼠标解决方法
  10. 《自己动手写网络爬虫》笔记6-使用布隆过滤器实现Visited表
  11. 南京邮电大学离散数学实验一(求主析取和主合取范式)
  12. Excel 常用快捷键
  13. 测试人员的KPI考核指标
  14. arcgis api for javaScript学习-Measurement
  15. 华北地区博友链接集合(陆续增加中)
  16. 计算机怎样打印机驱动程序,详细教您电脑怎么安装打印机驱动
  17. python线程锁和线程池
  18. Vulkan再探(12):输入附件
  19. 微信小程序携带token请求
  20. C#中调用abobe reader打开PDF文件的方法

热门文章

  1. 课程表计算机基础与应用实验报告,大学计算机基础实验报告3.doc
  2. 计算机音乐乐谱后会无期,《后会无期》歌曲简谱
  3. 如果爱有来世,泪眸告别今生
  4. 为什么大部分硬件工程师没有用好LDO?
  5. 安装 Docker Registry 私服
  6. 蓖麻凝集素Ⅱ(RCAⅡ,RCA60,ricin)
  7. 基于BIM(Revit平台)的铝模设计软件产品
  8. 听云缓存报错:java.lang.NoClassDefFoundError: com.networkbench.agent.impl.instrumentation.NBSEventTraceEngi
  9. 研一Python基础课程第二周课后习题分享(含代码)
  10. 小程序商城具备的功能有哪些?