ui li 菜单 点击添加下级_轻量级办公平台开发实录(12):日程数据的添加和展示...

8f7affeb6cd6941ee4a2bf8d5b90f452.png

说明:文章中代码比较多,完整结构和代码可以查看最新版本:https://github.com/RobbieHan/sandboxOA

1、补充:Django URL name介绍

上节在sandboxOA/sandboxOA/urls.py文件中添加了工作日程访问的url,定义了name:

urlpatterns = [

    ......
    url(r'^myreport/$', views.MyReportView.as_view(), name='myreport'),

]

修改sandboxOA/templates/base-left.html文件,添加【我的日报】菜单链接:

......
  <ul class="treeview-menu">
    <li><a href="/myreport/"><i class="fa fa-caret-right"></i>我的日报</a></li>
    <li><a href="#"><i class="fa fa-caret-right"></i>下属日报</a></li>
  </ul>

上面我们在模板导航中添加了【我的日报】的url访问链接,同时我们也可以通过url中定义的name反向查询url地址: {% url 'name' %}, 这样使用的好处是,当修改url地址后,只要url的name不变,就不用修改模板中的网址。

......
  <ul class="treeview-menu">
    <li><a href="{% url 'myreport'%} "><i class="fa fa-caret-right"></i>我的日报</a></li>
    <li><a href="#"><i class="fa fa-caret-right"></i>下属日报</a></li>
  </ul>

完成以上配置,运行系统,登陆后就可以通过,左侧的导航栏访问【我的日报】页面了

77243c5d12a68504727105c8c88a6913.png

2、为导航菜单添加选中样式

我们想在点击页面导航菜单【我的日报】时,主菜单展开,同时【我的日报】菜单显示为选中状态:

  • 修改sandboxOA/templates/base-left.html文件, 分别给父菜单【工作日报】和二级菜单【我的日报】的<li>标签添加id字段:
 <li class="treeview" id="DailyReport">
      <a href="#"><i class="fa fa-calendar"></i> <span>工作日报</span>
        <span class="pull-right-container">
          <i class="fa fa-angle-left pull-right"></i>
        </span>
      </a>
      <ul class="treeview-menu">
        <li id="MyReport"><a href="{% url 'myreport' %}"><i class="fa fa-caret-right"></i>我的日报</a></li>
        <li><a href="#"><i class="fa fa-caret-right"></i>下属日报</a></li>
      </ul>
 </li>
 
  • 修改sandboxOA/templates/dailyreport/myreport.html文件,在{% block javascripts %} {% endblock %}模板标签中添加javascripts,通过id给导航菜单添加样式:
<script type="text/javascript">
    $(function () {
        $('#DailyReport').addClass('active');
        $('#MyReport').addClass('active');

    });
</script>

这样我们在点击页面导航【我的日报】时,【工作日报】主菜单会展开,同时【我的日报】菜单会显示为选中高亮状态

bf2abae04b0c2d311cd2cb04dc1c7ee0.png

3、添加日程记录的模板配置:
实现效果:

  • 在日历表上点击【添加】按钮,弹出日程添加窗口
  • 输入日程内容后,点击【保存】按钮,添加日程到数据库,同时刷新页面,在日程表上显示最新日程数据 创建日程添加模板:在sandboxOA/templates/dailyreport/目录下新建report_create.html文件,内容如下:
{% extends 'base-layer.html' %}
{% load staticfiles %}

{% block css %}
    <link rel="stylesheet" href="{% static 'plugins/select2/select2.min.css' %}">
    <link rel="stylesheet" href="{% static 'js/plugins/layer/skin/layer.css' %}">
    <link rel="stylesheet" href="{% static 'bootstrap/css/bootstrap-datetimepicker.min.css' %}">
{% endblock %}

{% block main %}
    <div class="box box-danger">
        <form class="form-horizontal" id="addForm" method="post">
            {% csrf_token %}
            <input type="hidden" name='user' value="{{ request.user.id }}"/>
            <p class="box-body">
            <fieldset>
                <div class="form-group has-feedback">
                    <label class="col-sm-2 control-label">日报类型</label>
                    <div class="col-sm-3">
                        <select class="form-control select2" style="width:100%;" name="category">
                            {% for category in category_all %}
                                <option value="{{ category.key }}">{{ category.value }}</option>
                            {% endfor %}
                        </select>
                    </div>
                    <label class="col-sm-2 control-label">添加关注</label>
                    <div class="col-sm-3">
                        <select class="form-control select2" multiple="multiple" name="attention" data-placeholder="添加关注"
                                style="width: 100%;">
                            {% for attention in user_all %}
                            <option value="{{ attention.id }}"></option>
                            {% endfor %}
                        </select>
                    </div>
                </div>
                <div class="form-group has-feedback">
                    <label class="col-sm-2 control-label">开始时间</label>
                    <div class="col-sm-3">
                        <input type="text" class="form-control pull-right form_datetime" name="start_time" readonly >
                    </div>
                    <label class="col-sm-2 control-label">结束时间</label>
                    <div class="col-sm-3">
                        <input type="text" class="form-control pull-right form_datetime" name="end_time" readonly />
                    </div>
                </div>
                <div class="form-group has-feedback">
                    <label class="col-sm-2 control-label">报告内容</label>
                    <div class="col-sm-8">
                        <textarea class="form-control" name="content" rows="5"></textarea>
                    </div>
                </div>
                <p>
                    <small class="text-danger margin-l-5">* 上级和关注人可以查看本条报告内容</small>
                </p>
            </fieldset>

    <div class="box-footer ">

        <div class="row span7 text-center ">
            <button type="button" id="btnCancel" class="btn btn-default margin-right ">重置</button>
            <button type="button" id="btnSave" class="btn btn-info margin-right ">保存</button>
        </div>
    </div>

    </form>
    </div>

{% endblock %}

{% block javascripts %}
    <script src="{% static 'plugins/select2/select2.full.min.js' %}"></script>
    <script src="{% static 'bootstrap/js/bootstrap-datetimepicker.js' %}"></script>
    <script type="text/javascript">

        $("#btnSave").click(function () {
            var data = $("#addForm").serialize();
            $.ajax({
                type: $("#addForm").attr('method'),
                url: "{% url 'myreport-create' %}",
                data: data,
                cache: false,
                success: function (msg) {
                    if (msg.result) {
                        layer.alert('数据保存成功!', {icon: 1}, function (index) {
                            parent.location.reload();
                        });
                    } else {
                        layer.alert('数据保存失败,请将信息填写完整!', {icon: 5});
                        //$('errorMessage').html(msg.message)
                    }
                    return;
                }
            });
        });


        /*点取消刷新新页面*/
        $("#btnCancel").click(function () {
            window.location.reload();

        });

        /*input 时间输入选择*/
        $(".form_datetime").datetimepicker({
            language: 'zh',
            //minView: 'month',
            weekStart: 1,
            todayBtn:  1,
            autoclose: 1,
            todayHighlight: 1,
            startView: 2,
            forceParse: 0,
            //format: 'yyyy-mm-dd hh:ss'
        }).on('changeDate', function (ev) {
            $(this).datetimepicker('hide');
        });

        // select2
        $(function () {
            //Initialize Select2 Elements
            $(".select2").select2();
        });
    </script>

{% endblock %}

4、添加日程记录:forms、view和url配置


添加sandboxOA/apps/dailyreport/forms.py文件,内容如下:

from django import forms
from .models import DailyReport


class DailyReportForm(forms.ModelForm):
    class Meta:
        model = DailyReport
        fields = '__all__'


说明:这里使用了ModelForm来对提交的数据进行验证,关于form验证的更多用法,可以查看官方文档。你也可以尝试下对日程数据开始和结束时间进行验证,保证输入的结束时间大于开始时间。
修改sandboxOA/dailyreport/views.py文件 新增如下内容:

import json

from django.shortcuts import render
from django.views.generic.base import View
from django.http import HttpResponse
from django.contrib.auth import get_user_model

from system.mixin import LoginRequiredMixin
from .models import DailyReport
from .forms import DailyReportForm

User = get_user_model()


class MyReportView(LoginRequiredMixin, View):

    def get(self, request):
        return render(request, 'dailyreport/myreport.html')


class ReportCreateView(LoginRequiredMixin, View):

    def get(self, request):
        ret = dict()
        category_all = [{'key': i[0], 'value': i[1]} for i in DailyReport.cat_choices]
        user_all = User.objects.exclude(username__in=['admin', request.user.username])
        ret['category_all'] = category_all
        ret['user_all'] = user_all
        return render(request, 'dailyreport/report_create.html', ret)

    def post(self, request):
        res = dict(result=False)
        daily_report_form = DailyReportForm(request.POST)
        if daily_report_form.is_valid():
            daily_report_form.save()
            res['result'] = True
        return HttpResponse(json.dumps(res), content_type='application/json')

修改sandboxOA/sandboxOA/urls.py新增如下内容:

urlpatterns = [
    .......
    url(r'^myreport/create$', views.ReportCreateView.as_view(), name='myreport-create'),

]

说明:

  • category_all:日程分为三种类型:工作报告、项目记录、日程安排,在定义模型的时候使用了choices属性,在添加数据时,保持和后台定义的一致性,我们通过后台返回这三种类型,前端添加纪录的时候直接选择就可以了。如果你想要修改日程类型,只需要修改models.py中 “cat_choices”内容就可以了。
  • user_all:排除了admin系统默认管理员用户和本人登陆用户,用户添加日程的时候选择关注人。

5、为FullCalendar自定义按钮添加点击事件


添加事件的后逻辑和前端模板都写好了,现在我们需要在FullCalendar日历表上通过点击自定义按钮打开添加窗口,完成日程数据的添加操作。
按照下面操作修改sandboxOA/templates/dailyreport/myreport.html文件:

  • 在{% block css %} {% endblock %} 标签中添加新的样式文件:
<link rel="stylesheet" href="{% static 'js/plugins/layer/skin/layer.css' %}">
<link rel="stylesheet" href="{% static 'plugins/select2/select2.min.css' %}">
  • 在{% block javascripts %} {% endblock %} 标签中添加新的js文件:
<script src="{% static 'js/plugins/layer/layer.js' %}"></script>
<script src="{% static 'plugins/select2/select2.full.min.js' %}"></script>
 
  • 在{% block javascripts %} {% endblock %} 标签中的FullCalendar初始化配置前添加新的函数,实现添加日程的弹窗效果:
<script type="text/javascript">
    function doCreate() {
        layer.open({
            type: 2,
            title: '新建日报',
            shadeClose: false,
            maxmin: true,
            area: ['800px', '460px'],
            content: "{% url 'myreport-create' %}",
            end: function () {
                window.location.reload();
            }
        });
    }

    $(function () {
        //初始化FullCalendar
        $('#calendar').fullCalendar({
        ...略...
  • 修改FullCalendar初始化配置中的自定义按钮事件,调用doCreate函数:
customButtons: {
    reportAddButton: {
        text: '添加',
        click: doCreate,
    },

},


重新运行下系统,点击【我的日报】日历中的【添加】按钮,添加新的日程数据(可以登陆django-admin后台,多添加几个用户,用来做日程数据的关联用户):

fa3e6a7ea2c7897edc809867b2adeabf.png


6、日程数据的展示
到现在为止,日历表上展示的还是测试数据,我们需要在日历表上展示数据库中的日程数据,操作如下:

  • 修改sandboxOA/apps/dailyreport/views.py中的 MyReportView:
class MyReportView(LoginRequiredMixin, View):

    def get(self, request):
        ret = dict()
        my_report_all = DailyReport.objects.filter(user=int(request.user.id))
        ret['my_report_all'] = my_report_all
        return render(request, 'dailyreport/myreport.html', ret)
 
  • 修改sandboxOA/templates/dailyreport/myreport.html中FullCalendar初始化配置中的events内容:
events: [
    {% for my_report in my_report_all %}
        {
            id: '{{ my_report.id }}',
            title: '{{ my_report.content }}',
            start: '{{ my_report.start_time | date:"Y-m-d H:i"}}',
            end: '{{ my_report.end_time | date:"Y-m-d H:i"}}',
            {% if my_report.category == '0'  %}
                backgroundColor: '#0073b7',
            {% elif my_report.category == '1' %}
                backgroundColor: '#00a65a',
            {% else %}
                backgroundColor: '#dd4b39',
            {% endif %}

        },
    {% endfor %}

],


备注:FullCalendar中events可以直接接收json作为事件内容,使用上面写法只是为根据日程类型来自定义显示样式,完成以上配置,刷新页面,就可以看到我们自己添加的日程数据。
下一节内容:通过点击日历表中日期添加日程、查看日程详情、修改日程数据


知乎专栏:Django 学习小组
知乎专栏:SandBox
更多实战文档可关注知识星球:https://t.zsxq.com/a6IqBMr(微信中打开链接)
轻量级办公管理系统项目开源地址:RobbieHan/gistandard
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
系统中所演示的数据均系杜撰,并非真实数据,包括单位名称、人名、地名和通信方式。 sandbox是一个基于django框架开发轻量级办公平台,主要模块有:权限控制、资产(库存)管理、设备管理、客户信息管理和工单流程管理,其目的在于建立一套规范化、统一化和清晰化的标准服务流程,能够清晰的处理、记录和追踪服务流程,同时依赖于工单流程模块,建立技术服务文档共享库,让技术人员相互协作,分享经验,提升服务技术水平。 这套系统的开发主要是为了规范当前公司服务流程,改变服务混乱,项目多人多次服务无交接的问题,同时将公司资产(库存)和销售的设备一起做了集中管理和服务跟踪。 目前公司主要是对外销售安全产品和安全服务,作为一个小型乙方公司,上一套OA系统太过繁重,所以就自己动手来做了这么一套轻量级办公系统。 线上环境部署 系统运行环境 centos7 python3.6 mysql 5.6, 系统需要安装 docker , docker-compose 1、下载项目文件到你的系统 $ git clone https://github.com/RobbieHan/gistandard.git 2、进入项目目录,拷贝和修改配置文件 $ cd gistandard $ mkdir -p /sandbox/nginx $ cp config/nginx.conf /sandbox/nginx/ $ cp -r media /sandbox $ vim /sandbox/nginx/nginx.conf # 修改nginx配置文件中 server标签下的 server_name 为你系统的地址IP 或域名(sandbox安装完成通过这个地址来访问) 3、运行容器 $ docker-compose up -d 等等等等..... 查看容器运行状态: $ docker-compose ps Name Command State Ports -------------------------------------------------------------------------------- gistandard_mysql_1 docker-entrypoint.sh mysql ... Up 3306/tcp gistandard_web_1 bash -c uwsgi config/sandb ... Up 0.0.0.0:80->80/tcp 4、导入数据库文件 $ docker cp db_tools/data/basic_data.sql gistandard_mysql_1:/tmp $ docker-compose exec mysql bash $ mysql -uddadmin -p1234@abcd.com gistandard < /tmp/basic_data.sql 5、访问系统: http://your_ip 初始用户 admin 密码 !qaz@wsx 本地环境运行 如果只是想查看代码和系统功能,可以在本地windows环境下临时运行项目,或者使用开发工具运行项目 1、从github上下载项目文件到本地,或者使用git克隆项目 2、在windows上安装python3.6环境(也可以使用python虚拟环境,python环境的安装方法网上很多,这里不再写了) 3、修改gistandard/gistandard/settings.py文件中数据库连接配置DATABASES, 本地运行使用db.sqlite3数据库,内含测试数据 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } } 4、安装依赖包,打开CMD命令行,进入项目主目录运行下面命令安装依赖包: 注意: 本地环境使用的是sqlite3数据库,安装依赖包前可以先将requirements文件中的mysqlclient那一行删掉,这个包是用来连接mysql数据库使用的,通常windows下安装这个包会报错,解决办法我在知乎境部署的文档中都有写过。 我windows下使用的是python虚拟环境,所以我下面CMD命令行开头是(gistandard)这个是我虚拟环境的名称,虚拟环境的使用方法也可以网上找下,或者关注我的知乎专栏,环境部署

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值