Flask OA项目的功能开发

本文围绕Flask OA项目的功能开发展开,涉及首页、新闻、权限、考勤、部门职位人员等模块。介绍了分页、富文本等功能的实现方式,如flask - sqlalchemy的分页方法、前端富文本编辑器的使用。还阐述了权限设置,不同角色用户权限不同,且员工权限与职位、部门相关。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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条)offsetlimit
1010
21010
32010
n(n-1)*1010
@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条)offsetlimit
1010
21010
32010
n(n-1)*1010
@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>

考勤

​ 请假流程

部门职位人员

​ 关联部门的职位操作

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值