Flask OA项目的功能开发
首页
全局的用户身份
中间件添加全局模板变量
# 添加全局变量
@app.app_template_global("base") #如果是蓝图就需要加app
def getBase():
result = {
"name": "未登录",
"user_id": 0
}
user_id = request.cookies.get("user_id") #登录之后cookie携带的用户id
if user_id:
user = Person.query.get(user_id) #获取用户的登录信息
result["user_id"] = user.id
result["name"] = user.username
#如果有昵称就展示昵称,否者展示用户名
if user.p_info and user.p_info.nick_name:
result["name"] = user.p_info.nick_name
return 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 = 1
else:
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 = 1
else:
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 = True
return 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>
考勤
请假流程
部门职位人员
关联部门的职位操作
必须先有部门,然后有职位,再有员工