Flask OA项目的功能开发

首页

​ 全局的用户身份

​ 中间件添加全局模板变量

# 添加全局变量
@app.app_template_global("base") #如果是蓝图就需要加app
def getBase():result = {"name": "未登录","user_id": 0}user_id = request.cookies.get("user_id") #登录之后cookie携带的用户idif user_id:user = Person.query.get(user_id) #获取用户的登录信息result["user_id"] = user.idresult["name"] = user.username#如果有昵称就展示昵称,否者展示用户名if user.p_info and user.p_info.nick_name:result["name"] = user.p_info.nick_namereturn result

然后根据全局变量编写了个人详情页面

echarts绘图 基于数据分析的WEB数据可视化

注意,index页面比base也多一个外部css多两个外部js

前端采用ajax技术请求服务器

var myChart = echarts.init(document.getElementById('show'));var option = {title: {text: '年度个人KPI统计'},tooltip: {},legend: {},xAxis: {data: ["一月份", "二月份", "三月份","四月份", "五月份", "六月份","七月份", "八月份", "九月份","十月份", "十一月份", "十二月份"]},yAxis: {},series: [{name: '绩效值',type: 'line', //柱状图data: []}]
};$.ajax({url: "/oa/get_kpi/",type: "get",data: "",success: function (data) {option["series"][0]["data"] = data["kpis"]; //将后端传递的数据传递各图片参数对象myChart.setOption(option); //图片加载设置},error: function (error) {console.log(error)}
});

后端在index的基础上,采用视图函数专门查询kpi数据

@app.route("/index/")
@is_login
def index():return render_template("index.html", **locals())@app.route("/get_kpi/")
def get_kpi():user_id = request.cookies.get("user_id")kpis = [i.value for i in Person.query.get(int(user_id)).p_kpi]for j in range(12-len(kpis)):kpis.append(0)return jsonify({"kpis":kpis})

新闻

​ 增删改查查

​ 分页

​ offset limit

页码(每页10条) offset limit
1 0 10
2 10 10
3 20 10
n (n-1)*10 10
@csrf.exempt #去掉csrf
@app.route("/news/")
@is_login
def news():page = request.args.get("page")if not page:page = 1else:page = int(page)news_list = News.query.order_by(News.public_time.desc()).offset((page-1)*10).limit(10)return render_template("news.html", **locals())

​ 富文本

权限

​ 权限设置

考勤

​ 请假流程

部门

​ 增删改查查

职位

​ 关联部门的职位操作

人员

​ 增删改查查 个人详情

Flask OA功能开发

分页

​ offset limit

页码(每页10条) offset limit
1 0 10
2 10 10
3 20 10
n (n-1)*10 10
@csrf.exempt #去掉csrf
@app.route("/news/")
@is_login
def news():page = request.args.get("page")if not page:page = 1else:page = int(page)news_list = News.query.order_by(News.public_time.desc()).offset((page-1)*10).limit(10)return render_template("news.html", **locals())

​ flask-sqlalchemy提供了一个分页的方法:

方法 描述
items 当前页的数据
pages 总页数
iter_pages 页码生成器,带有自动缩略页码的功能
has_next 判断是否有下一页
next_num 下一页页码
has_prev 判断是否有上一页
prev_num 上一页页码
page 当前页码
query 查询
total 数据总数
@csrf.exempt #去掉csrf
@app.route("/news/")
@is_login
def news():page = request.args.get("page",1)page = int(page)news_list = News.query.order_by(News.public_time.desc()).paginate(page,10)return render_template("news.html", **locals())
<ul class="pagination pull-right"><li><a href="#">首页</a></li>{% if news_list.has_prev %}<li><a href="/oa/news/?page={{ news_list.prev_num }}">上一页</a></li>{% endif %}{% for news in news_list.iter_pages() %}{% if news %}{% if news == page %}<li class="active"><a href="#">{{ news }}</a></li>{% else %}<li><a href="/oa/news/?page={{ news }}">{{ news }}</a></li>{% endif %}{% else %}<li><a href="#">....</a></li>{% endif %}{% endfor %}{% if news_list.has_next %}<li><a href="/oa/news/?page={{ news_list.next_num }}">下一页</a></li>{% endif %}{% if news_list.page != news_list.pages %}<li><a href="/oa/news/?page={{ news_list.pages }}">尾页</a></li>{% endif %}
</ul>

创建路由和视图指出页面

获取查询条件

前端发送条件

前端通过路由发送get请求

可以将路由绑定到a标签上,使用a标签跳转到新的路由

根据条件查询和分页

在前端渲染数据

富文本

​ 富文本编辑器是写好的前端插件,使用简单

​ 1、前端导入CKeditor.js文件,必须整个目录原样在项目当中

​ 2、对将要变成富文本的textarea添加class属性 ckeditor

3、富文本编辑器的内容会自动添加HTML标签,需要使用safe标签调用

权限和流程是OA类型项目的核心

权限

权限是指为了保证职责的有效履行,任职者必须具备的,对某事项进行决策的范围和程度。

权限

角色

人物

不同的人对平台具有不同的权限,同一角色的人在平台拥有相同的权限,OA项目当中,角色指的是职位。

对于不同角色的用户,访问OA项目,拥有不同的界面。

老板拥有所有权限。

领导拥有所有考勤权限,普通员工拥有自己考勤权限。

人事部拥有人事管理的职员管理权限

新媒体部门拥有新闻发布权限

权限分为展示和限制两个部分

展示部分需要使用全局模板进行设置

员工权限依赖职位

职位依赖部门

必须先有部门,然后有职位,再有员工

添加部门

部门添加职位

职位管理权限

职位对应员工

#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#版本三
def permission_v3(user,p_id):value = False# 获取用户职位position = user.p_info.per_position# 获取用户职位对应的权限permission = [p.id for p in position.position_permission]if p_id in permission:  # 判断是否有权限权限value = Truereturn value
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#版本二
# def per_permission(user):
#     value = False
#     # 获取用户职位
#     position = user.p_info.per_position
#     # 获取用户职位对应的权限
#     permission = [p.id for p in position.position_permission]
#     if 2 in permission:  # 判断是否有权限权限
#         value = True
#     return value
#
# def per_news(user):
#     """
#     校验是否具有新闻管理权限
#     只有老板 和 新媒体拓展有权限
#     新闻权限 1
#     """
#     # 获取用户职位
#     value = False
#     position = user.p_info.per_position
#     permission = [p.id for p in position.position_permission]
#     if 1 in permission:  # 判断是否有权限权限
#         value = True
#     return value
#
# def per_department(user):
#     """
#     校验是否具有新闻管理权限
#     只有老板 和 新媒体拓展有权限
#     新闻权限 1
#     """
#     # 获取用户职位
#     value = False
#     position = user.p_info.per_position
#     permission = [p.id for p in position.position_permission]
#     if 4 in permission:  # 判断是否有权限权限
#         value = True
#     return value
#
# def per_person(user):
#     """
#     校验是否具有新闻管理权限
#     只有老板 和 新媒体拓展有权限
#     新闻权限 1
#     """
#     # 获取用户职位
#     value = False
#     position = user.p_info.per_position
#     permission = [p.id for p in position.position_permission]
#     if 3 in permission:  # 判断是否有权限权限
#         value = True
#     return value
#
# def per_attendance(user):
#     """
#     校验是否具有新闻管理权限
#     只有老板 和 新媒体拓展有权限
#     新闻权限 1
#     """
#     # 获取用户职位
#     value = False
#     position = user.p_info.per_position
#     permission = [p.id for p in position.position_permission]
#     if 5 in permission:  # 判断是否有权限权限
#         value = True
#     return value
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#现在设置权限
@app.app_template_global("show")
def show():# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#版本一# result = {#     "permission": False# }# 判断依据是用户是否具有权限# 拥有权限菜单的权限id  2# 获取用户# user_id = request.cookies.get("user_id")# user = Person.query.get(int(user_id))# # 获取用户职位# position = user.p_info.per_position# #获取用户职位对应的权限# permission = [p.id for p in position.position_permission]# if 2 in permission: #判断是否有权限权限#     result["permission"] = True
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#版本二# user_id = request.cookies.get("user_id")# user = Person.query.get(int(user_id))# result = {#     "permission": per_permission(user),#     "news": per_news(user),#     "department": per_department(user),#     "person": per_person(user),#     "attendance":per_attendance(user)# }
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#版本三user_id = request.cookies.get("user_id")user = Person.query.get(int(user_id))result = {"permission": permission_v3(user,2),"news": permission_v3(user,1),"department": permission_v3(user,4),"person": permission_v3(user,3),"attendance":permission_v3(user,5)}return result
<div class="navbar-default sidebar" role="navigation"><div class="sidebar-nav navbar-collapse"><ul class="nav" id="side-menu"><li><a href="/oa/index/"><i class="fa fa-dashboard fa-fw"></i> 首页</a></li>{% if show().news %}<li><a href="/oa/news/"><i class="fa fa-envelope-o fa-fw"></i> 新闻管理</a></li>{% endif %}{% if show().permission %}<li><a href="/oa/permission/"><i class="fa fa-table fa-fw"></i> 权限管理</a></li>{% endif %}<li><a href="#"><i class="fa fa-bar-chart-o fa-fw"></i> 考勤管理<span class="fa arrow"></span></a><ul class="nav nav-second-level"><li><a href="/static/attendance_me.html">个人考勤</a></li>{% if show().attendance %}<li><a href="/static/attendance_subordinate.html">下属考勤</a></li>{% endif %}</ul></li>{% if show().department or show().person %}<li><a href="#"><i class="fa fa-user fa-fw"></i> 人事管理<span class="fa arrow"></span></a><ul class="nav nav-second-level">{% if show().department %}<li><a href="/static/department.html">部门管理</a></li>{% endif %}<li><a href="/static/person.html">职员管理</a></li></ul><!-- /.nav-second-level --></li>{% endif %}</ul></div><!-- /.sidebar-collapse --></div><!-- /.navbar-static-side -->
</nav>

考勤

​ 请假流程

部门职位人员

​ 关联部门的职位操作

​ 必须先有部门,然后有职位,再有员工

Flask OA项目的功能开发相关推荐

  1. 快速上手Flask(一) 认识框架Flask、项目结构、开发环境

    文章目录 快速上手Flask(一) 认识框架Flask.项目结构.开发环境 Web开发轻量级框架Flask Flash历史和团队 Pallets 项目 flask运行过程 使用flask的场景 使用P ...

  2. OA项目实战(二) 开发准备

    上次的博文OA系统实践(一) 概述中,我们已经了解了OA的相关概念.从本次博文开始,我们做一个简单的OA实例. 在OA开发之前,有几个工作们需要提前做.一个是对需求进行分析,另一个是对开发环境进行选择 ...

  3. 炫酷超拽!推荐一款Vue开发的OA系统,功能还不错哟!!!

    推荐一款Vue开发的OA系统,功能还不错 基于Ant Design Pro 开发 ,项目名:OA-System 基于 Ant Design of Vue 开发的OA办公系统 Vue 开发的OA系统 具 ...

  4. 会议OA项目(项目原型图介绍发布会议功能)

    目录 一.会议OA项目介绍 为什么要开发OA会议管理 会议OA管理的作用 二.项目原型图介绍 1)会议管理 2)投票管理 3)会议室管理 三.数据库表结构 四.发布会议功能&多功能下拉框 La ...

  5. O2OA企业应用开发平台,全开源的协同OA项目

    今天给大家介绍的是一款好用的全开源协同OA项目,它的名字叫做:O2OA企业应用开发平台(简称O2OA平台). O2OA平台是什么? O2OA开源企业应用开发平台基于J2EE分布式架构,集成移动办公.智 ...

  6. 项目开发一般流程、入职流程、尚学堂OA项目01_基础环境搭建、人事管理模块搭建、Servlet的高级封装

    项目开发一般流程.入职流程.尚学堂OA项目01 1. 项目开发的一般流程 2. 入职时工作的一般流程 3. 尚学堂办公自动化系统/OA 3.1 项目介绍 3.2 项目资料 3.3 项目开发 3.3.1 ...

  7. 当项目经理让我负责数据展示功能开发,我的内心为什么是拒绝的?

    随着互联网行业的发展,各行各业都走上了数字化的道路.业务操作产生了大量数据,而数据只有汇总成报表才能为决策产出更大价值.报表的类型非常多样,比如最常见的财务类的资产负债表.制造业的出入库打印单.医药行 ...

  8. Django后台项目之用户管理功能开发流程

    项目功能开发流程 1 先写列表页(加载出来数据就行) ob = User_vip.objects.filter(is_del='004001').order_by('-cts') 2 写添加功能 2. ...

  9. 【SpringBoot项目实战+思维导图】瑞吉外卖①(项目介绍、开发环境搭建、后台登陆/退出功能开发)

    文章目录 软件开发整体介绍 软件开发流程 角色分工 软件环境 瑞吉外卖项目介绍 项目介绍 产品原型 技术选型 功能架构 角色 开发环境搭建 数据库环境搭建 创建数据库 数据库表导入 数据库表介绍 Ma ...

最新文章

  1. PyTorch官方中文文档:torch.optim 优化器参数
  2. ionic中的后退方法
  3. 我所犯的JavaScript引用错误
  4. 学Java有什么技巧和方法推荐?
  5. HALCON学习之旅(三)
  6. web项目移动端在线预览(excel在线预览)
  7. R6900P/R7000P 梅林固件
  8. 三星6818LED驱动的编写
  9. 同花顺股票交易接口 正确用法
  10. matlab学霸表白公式,一个理科学霸的表白:数学公式的超酷表白
  11. 输入法的TSF框架(Text Service Framework)简介
  12. 【Git学习】解决GitLab内存消耗大的问题
  13. [2015 Springer] Local Image Descriptor: Modern Approaches——2 Classical Local Descriptors
  14. 计算机小游戏有哪些,为你解答电脑小游戏有哪些
  15. Java学习打卡第八天——[Collection终结之HashMap,Collections的简介和使用]
  16. 3D Human Body Reshaping with Anthropometric Modeling 阅读翻译
  17. 淘宝Buy+负责人胡晓航:从技术和产品维度看Buy+ VR购物
  18. 题目标题: 高斯日记
  19. shell 脚本中双引号、单引号、反引号的区别,其他命令
  20. 和Sun一起开源(武林外传游戏外挂Java源代码) - 论坛版

热门文章

  1. 一元函数微分学和一元函数积分学的应用
  2. 大数据产业是怎么分类的,主要有哪些特点?
  3. 设计模式之结构型模式(7种)
  4. 盗销苹果ID成黑色产业链
  5. 网络安全——应用层安全协议
  6. 程序员小灰灰专栏收集
  7. 断网攻击 1.局域网 2.广域网
  8. 【电子取证:FTK Imager 篇】DD、E01系统镜像动态仿真
  9. 飞凌嵌入式基于i.MX6UL平台实现无线地磁车辆检测网关
  10. SAP ABAP转换特殊字符乱码