精华内容
下载资源
问答
  • 任务管理系统是为团队项目工作开发的Web应用程序,用户可以在其中轻松管理团队中的各种任务。 它是使用Spring Boot(后端)和Angular(前端)框架开发的。 项目主要集中于处理基于文档的项目。 “用户”可以同时...
  • gocron - 定时任务管理系统 项目简介 使用Go语言开发的轻量级定时任务集中调度和管理系统, 用于替代Linux-crontab 查看文档 原有的延时任务拆分为独立项目延迟队列 功能特性 Web界面管理定时任务 crontab时间表达式...
        

    gocron - 定时任务管理系统

    项目简介

    使用Go语言开发的轻量级定时任务集中调度和管理系统, 用于替代Linux-crontab 查看文档

    原有的延时任务拆分为独立项目延迟队列

    功能特性

    • Web界面管理定时任务
    • crontab时间表达式, 精确到秒
    • 任务执行失败可重试
    • 任务执行超时, 强制结束
    • 任务依赖配置, A任务完成后再执行B任务
    • 账户权限控制
    • 任务类型

      • shell任务

        在任务节点上执行shell命令, 支持任务同时在多个节点上运行
      • HTTP任务

        访问指定的URL地址, 由调度器直接执行, 不依赖任务节点
    • 查看任务执行结果日志
    • 任务执行结果通知, 支持邮件、Slack、Webhook

    截图

    流程图
    任务
    Slack

    支持平台

    Windows、Linux、Mac OS

    环境要求

    MySQL

    下载

    releases

    版本升级

    安装

    二进制安装

    1. 解压压缩包
    2. cd 解压目录
    3. 启动
    • 调度器启动

      • Windows: gocron.exe web
      • Linux、Mac OS: ./gocron web
    • 任务节点启动, 默认监听0.0.0.0:5921

      • Windows: gocron-node.exe
      • Linux、Mac OS: ./gocron-node
    1. 浏览器访问 http://localhost:5920

    源码安装

    • 安装Go 1.9+
    • go get -d github.com/ouqiang/gocron
    • 编译 make
    • 启动

      • gocron ./bin/gocron web
      • gocron-node ./bin/gocron-node

    docker

    docker run --name gocron -p 5920:5920 -d ouqg/gocron

    开发

    1. 安装Go1.9+, Node.js, Yarn
    2. 安装前端依赖 make install-vue
    3. 启动gocron, gocron-node make run
    4. 启动node server cd web/vue && yarn run dev, 访问地址 http://localhost:8080

    访问http://localhost:8080, API请求会转发给gocron

    make 编译

    make run 编译并运行

    make package 打包

    生成当前系统的压缩包 gocron-v1.5-darwin-amd64.tar.gz gocron-node-v1.5-darwin-amd64.tar.gz

    make package-all 生成Windows、Linux、Mac的压缩包

    命令

    • gocron

      • -v 查看版本
    • gocron web

      • --host 默认0.0.0.0
      • -p 端口, 指定端口, 默认5920
      • -e 指定运行环境, dev|test|prod, dev模式下可查看更多日志信息, 默认prod
      • -h 查看帮助
    • gocron-node

      • -allow-root *nix平台允许以root用户运行
      • -s ip:port 监听地址
      • -enable-tls 开启TLS
      • -ca-file CA证书文件
      • -cert-file 证书文件
      • -key-file 私钥文件
      • -h 查看帮助
      • -v 查看版本

    To Do List

    • [x] 版本升级
    • [x] 批量开启、关闭、删除任务
    • [x] 调度器与任务节点通信支持https
    • [x] 任务分组
    • [x] 多用户
    • [x] 权限控制

    程序使用的组件

    反馈

    提交issue

    展开全文
  • bottle web开发 项目实战:任务管理系统,是学习pyhton的好项目。可以开发成博客系统,python是比较火
  • java web开发教学任务管理信息系统源代码下载
  • Web应用程序系统,用于管理团队,项目和任务。 想退房吗? 访问此给定链接: :
  • 在很多办公管理系统的流程中,关于任务的分配和管理很复杂,下面列几种常见的任务管理方式: 1、竞争型任务 将任务分配给一组具有相同权限的人处理,谁先选择处理就锁定为谁处理。  2、直接指派型 将任务...

    在很多办公管理系统的流程中,关于任务的分配和管理很复杂,下面列几种常见的任务管理方式:


    1、竞争型任务
    将任务分配给一组具有相同权限的人处理,谁先选择处理就锁定为谁处理。  

    2、直接指派型
    将任务直接指派给具体的人处理。

    3、动态会签型
      根据预先设定好的任务执行人范围,生成他们的处理工单,必须都处理完成了,任务才能完成。也可以根据预先设置好的会签百分比来判断任务是否完成。

    4、平均分配型
       将任务平均分配给任务的可执行人。任务的可执行人为一组用户,任务派发给当时在处理的工单数最少的用户。


    任务的实际分配方式可能有很多种,可以根据实际情况再扩展出符合自己需要的任务分配和管理方式。

    在eworkflow中,

    1、竞争型任务是这样管理的。
    在流程定义的时候,流程设计器中,先定义好任务的类型

    如下图:




    任务类型选择 竞争型,同时选择任务的参与人,即任务的可执行人。

    当流程运行时,流程到此节点时,会根据任务的可执行人范围,生成任务的待签收记录;



    当有用户选择签收后,则锁定为此用户的待办任务,其他的用户则不能再签收或执行此任务了。

    当用户从待办任务中,选择执行此任务后,流程流转到其他节点后,此任务就执行完成,成为已办任务。

    2、直接指派型任务管理

    在流程设计器中先定义好任务的主要信息,任务的可执行人等。选择任务类型为 直接指派型 任务,

    如下图:



    在流程实例运行时,流程到此节点时,会根据任务定义的信息直接生成预设置的任务人的工单,

    当任务的可执行人登录后从待办任务中选择执行任务后,流程节点流转出此节点,任务就完成了。

    展开全文
  • 文章目录一、数据库模型二、表单...添加任务清单 添加任务分类 app/models.py class User(UserMixin, db.Model): """用户""" # ....... # 1). Category添加一个属性todos, 2). Todo添加属性category; to...

    一、数据库模型

    • 用户信息修改
    • 添加任务清单
    • 添加任务分类

    app/models.py

    class User(UserMixin, db.Model): 
        """用户""" 
        # ....... 
        # 1). Category添加一个属性todos, 2). Todo添加属性category; 
        todos = db.relationship('Todo', backref='user') 
        # ........
    class Todo(db.Model):
        __tablename__='todos'
        id=db.Column(db.Integer,autoincrement=True,primary_key=True)
        content=db.Column(db.String(100))  # 任务内容
        status=db.Column(db.Boolean,default=False)   # 任务状态
        add_time=db.Column(db.DateTime,default=datetime.utcnow) # 任务创建时间
        # 任务的类型,关联分类表的id,因为分类:任务=1:N,外键写在多的一端
        category_id=db.Column(db.Integer,db.ForeignKey('categories.id'))
        # 任务所属用户,用户:任务=1:N,因此外键写在任务一端,关联的是用户表的id
        user_id=db.Column(db.Integer,db.ForeignKey('users.id'))
    
        def __repr__(self):
            return '<Todo %s>'%(self.content[:6])
    
    
    class Category(db.Model):
        __tablename__='categories'
        id=db.Column(db.Integer,autoincrement=True,primary_key=True)
        name=db.Column(db.String(20),unique=True)
        add_time=db.Column(db.DateTime,default=datetime.utcnow)  # 任务创建时间
        # 用户:分类=1:N
        user_id=db.Column(db.Integer,db.ForeignKey('users.id'))
        # 反向引用:1)Category添加todos属性 2)Todo添加categories属性
        todos=db.relationship('Todo',backref='category')
    
    
        def __repr__(self):
            return '<Category %s>'%(self.name)

    二、表单文件

    • 添加任务的表单
    • 编辑任务的表单
    • 添加分类的表单

    app/todo/forms.py

    from flask_wtf import FlaskForm
    from wtforms import StringField,SelectField,SubmitField
    from wtforms.validators import DataRequired
    from app.models import Category
    
    
    class AddTodoForm(FlaskForm):
        content=StringField(
            label='任务内容',
            validators=[DataRequired()],
            render_kw={
                'class':'form-control',
                'placeholder':'添加任务信息'
            }
            # 当使用宏时,租用类名为form-control的模板,在list.html中
        )
        # 下拉表
        category=SelectField(
            label='任务类型',
            coerce=int ,
            # choice=[(item.id,item.name) for item in Category.query.all()]
            render_kw={
                'class':'btn btn-choice dropdown-toggle',
                'type': "button",
                'data-toggle': "dropdown",
                'aria-haspopup': "true",
                'aria-expanded': "false"
            }
        )
        submit=SubmitField(
            label='添加任务',
            render_kw={
                'class':'btn btn-default btn-todo-add'
            }
        )
    
        # 构造方法在实例化对象时自动执行,这里在每次实例化表单对象时,都会重新查询所有的分类,并展示在下拉表中
        def __init__(self):
            # 执行父类的构造方法
            super(AddTodoForm, self).__init__()
            categories=Category.query.all()
            if categories:
                self.category.choices=[(item.id,item.name) for item in categories]
            else:
                self.category.choices=[(-1,'请先创建分类')]
    
    
    class EditTodoForm(FlaskForm):
        content=StringField(
            label='任务内容',
            validators=[DataRequired()]
        )
        category=SelectField(
            label='任务类型',
            coerce=int,
        )
        submit=SubmitField(
            label='编辑任务',
        )
    
        def __init__(self):
            super(EditTodoForm, self).__init__()
            categories=Category.query.all()
            if categories:
                self.category.choices=[(item.id,item.name) for item in categories]
            else:
                self.category.choices=[-1,'请先创建分类']
    
    class AddCategoryForm(FlaskForm): 
        content = StringField(
            label='分类名称', 
            validators=[DataRequired()] 
        )
        submit = SubmitField( 
             label='添加分类', 
        ) 

    三、视图函数文件

    app/todo/views.py

    # 查看任务
    @todo.route('/list/')
    @login_required
    def list():
        form = AddTodoForm()  # 添加任务之前首先有一个表单,这里实例化了在forms文件中的表单类
        # 任务显示需要分页,每个用户只能查看自己的任务
        page=int(request.args.get('page',1))   # request获取用户传入的参数,由于页数是整型,所以int()
        todoPageobj=Todo.query.filter_by(
            user_id=current_user.id).paginate(
            # 在config.py文件中设置PER_PAGE=5
            # paginate设置分页,page表示显示几页,per_page表示显示多少条数据
            page,per_page=current_app.config['PER_PAGE']
        )
        return render_template('todo/list.html',todoObj=todoPageobj,form=form)
    
    
    @todo.route('/add',methods=['POST'])
    # 用get方法获取表单页面,post方法提交一些用户输入的新的数据
    @login_required
    def add():
        form = AddTodoForm()  # 添加任务之前首先有一个表单,这里实例化了在forms文件中的表单类
        if form.validate_on_submit():
            # 获取用户提交的内容
            content=form.content.data
            # 这里虽然填入的是字符串,但是实际存入的是任务id,是由于forms文件中coerce=int的设置
            category_id=form.category.data
            # 添加到数据库中
            todo=Todo(
                content=content,
                category_id=category_id,
                user_id=current_user.id
            )
            db.session.add(todo)
            db.session.commit()
            # 闪现信息没有显示,需要在add.html中include一下
            flash('添加任务成功',category='success')
            return redirect(url_for('todo.list'))
        print(Category.query.all())
    
    
    @todo.route('/edit/<int:id>/',methods=['GET','POST'])
    def edit(id):
        form=EditTodoForm()
        # ****重要**** 编辑任务时需要获取原先任务的信息,并显示到表单里面
        todo=Todo.query.filter_by(id=id).first()
        form.content.data=todo.content
        form.category.data=todo.category_id
        if form.validate_on_submit():
            # 更新时获取表单数据一定要使用request.form方法获取,
            # 而form.content.data并不能获取用户更新后提交的表单内容;
            content=request.form.get('content')
            category_id=request.form.get('category')
            # 更新到数据库里面
            todo.content=content
            todo.category_id=category_id
            db.session.add(todo)
            db.session.commit()
            flash('任务已更新',category='success')
            return redirect(url_for('todo.list'))
        return render_template('todo/edit.html',form=form)
    
    
    # 删除任务,根据任务id删除
    @todo.route('/delete/<int:id>')
    @login_required
    def delete(id):
        todo=Todo.query.filter_by(id=id).first()
        db.session.delete(todo)
        db.session.commit()
        flash('删除任务成功',category='success')
        return redirect(url_for('todo.list'))
    
    
    # 修改任务状态为完成
    @todo.route('/done/<int:id>')
    @login_required
    def done(id):
        todo=Todo.query.filter_by(id=id).first()
        todo.status=True
        db.session.add(todo)
        db.session.commit()
        flash('修改状态成功',category='success')
        return redirect(url_for('todo.list'))
    
    
    # 修改任务状态为未完成
    @todo.route('/undo/<int:id>')
    @login_required
    def undo(id):
        todo=Todo.query.filter_by(id=id).first()
        todo.status=False
        db.session.add(todo)
        db.session.commit()
        flash('修改状态成功',category='success')
        return redirect(url_for('todo.list'))
    
    
    
    @todo.route('/category/add/', methods=['GET', 'POST']) 
    @login_required 
    def category_add(): 
        form = AddCategoryForm() 
        if form.validate_on_submit(): 
    	# 获取用户提交的内容 
    	content = form.content.data 
    	# 添加到数据库中
    	category = Category(name=content, 	
    			    user_id=current_user.id 
    			    ) 
    	db.session.add(category) 
    	flash('添加分类成功', category='success') 
    	return redirect(url_for('todo.category_add')) 
        print(Category.query.all()) 
        return render_template('todo/category_add.html', form=form) 
    
    
    
    # 查看任务 
    @todo.route('/category/list/') 
    @login_required 
    def category_list(page=1): 
        print(page) 
        # 任务显示需要分页,每个用户只能查看自己的任务 
        categoryPageObj = Category.query.filter_by( 
            user_id=current_user.id).paginate( 
            # 在config.py文件中有设置; 
            page, per_page=current_app.config['PER_PAGE']) 
            return render_template('todo/category_list.html', categoryPageObj=categoryPageObj) 

    四、分页展示

    • 视图函数
      app/todo/views.py
    # 查看任务
    @todo.route('/list/')
    @login_required
    def list():
        form = AddTodoForm()  # 添加任务之前首先有一个表单,这里实例化了在forms文件中的表单类
        # 任务显示需要分页,每个用户只能查看自己的任务
        page=int(request.args.get('page',1))   # request获取用户传入的参数,由于页数是整型,所以int()
        todoPageobj=Todo.query.filter_by(
            user_id=current_user.id).paginate(
            # 在config.py文件中设置PER_PAGE=5
            # paginate设置分页,page表示显示几页,per_page表示显示多少条数据
            page,per_page=current_app.config['PER_PAGE']
        )
        return render_template('todo/list.html',todoObj=todoPageobj,form=form)
    
    • 前端页面
    {% if paginate.has_prev %} 
         <a href="{{ url_for('user.list') }}?page={{ paginate.prev_num }}">上一页</a> 
    {% endif %} 
    
    {% for i in paginate.iter_pages() %} 
         <a href="{{ url_for('user.list') }}?page={{ i }}"> 
    	{% if not i %} 
    	    ... 
    	{% else %} 
    	    {{ i }} 
    	{% endif %} 
         </a> 
    {% endfor %} 
    
    {% if paginate.has_next %} 
         <a href="{{ url_for('user.list') }}?page={{ paginate.next_num }}">下一页</a> 
    {% endif %}
    展开全文
  • osworkflow的任务管理很简单,没有专门的任务表,也没有待办,已办,发出,处理任务等等。 只有很简单的查询用户可处理的动作和已经处理过的历史步骤。(注意这里只是可处理的动作和已经处理过的历史步骤,都不是...

    前言:
    osworkflow的任务管理很简单,没有专门的任务表,也没有待办,已办,发出,处理任务等等。
    只有很简单的查询用户可处理的动作和已经处理过的历史步骤。(注意这里只是可处理的动作和已经处理过的历史步骤,都不是任务)

    这显然距任务管理差很多很多

    改造方案:
          增加任务表,记录任务的相关属性,可执行人,任务处理人,任务发出时间,完成时间等。
          流程定义模版文件中增加任务节点,定义任务的名称,从流程上下文中获取任务的内容和相关属性,定义任务的可执行人。

          将产生任务记录和处理关闭任务的过程嵌入到工作流引擎的动作执行函数中。
          当流程到达步骤后,根据流程定义模版文件中定义的任务节点,产生任务记录;
          当动作执行时,检查任务是否可以执行完成,关闭任务。

          因为单独出一张任务表,所以可以增加对任务的管理,查询得出待办任务列表,已办任务列表,做代理待办,催办,逾期未办等等的处理。

          可以做到的任务管理:任务发起,待办,已办,催办,督办,收回等等。

     

    任务表结构:

     


    流程定义节点:
    例如:
         <tasks>
            <task name="审核员工:${oCaller.name} 的请假申请" classname="cn.com.fcsoft.workflow.util.MakeTask">
              <arg name="taskDesc">内容:${remark}</arg>
              <arg name="rolename">部门经理</arg>
              <arg name="stepId">5110</arg>
              <arg name="role">ROL_0000003</arg>
            </task>
          </tasks>

     

    增加生成任务的类MakeTask:

     

    增加descriptor中的任务定义类,并在相应的检查校验中增加对任务节点的校验:

     


    总结:

          通过增加任务,将任务的生成与处理嵌入到流程引擎中,任务的产生与完成跟流程的运行密切相关,在流程运行时会生成相应的任务,实例递进时完成相应的任务。同时任务记录单独抽出生成一张表,又可以很容易的做待办,已办,催办等等和任务相关的管理。
          原来osworkflow是从流程引擎的核心表中去查太麻烦了,也很不灵活,功能太过简单,也不利于扩展。

    展开全文
  • 基于web教务管理系统

    2011-07-08 19:25:08
    教务管理系统web 教务管理系统 课程设计 课程预选(部分选修课)à教学任务à排课à学生选课à学生成绩为中心,对教师学生课程、教学计划、学生学习及学籍成绩、教材、教学评估、收费等数据进行网络化信息管理
  • 任务管理系统是一套基于B/S模式的全面实施任务过程化、规范化、信息化的管理软件产品。以A(金字塔)&T(扁平化)管理思想为理论基础,以任务过程化管理为核心。以整合公司内、外部资源实现知识协同管理为最终目标,...
  • 1. 概述Apache AirflowAirflow是airbnb开源的基于DAG(有向无环图)的用Python开发的任务管理系统。最简单的理解就是一个高级版的crontab,它解决了crontab无法解决的任务依赖问题。项目于2014年启动,于2015年春季...
  • 文章目录一、项目简介1、项目功能2、技术分析1)、为什么选择...任务清单管理系统采用 B/S 架构,基于 Linux 平台开发。采用轻量级的 Web 服务器 Nginx , 其后端实现建议采用基于 Python 语言的 Flask 开源 Web 框...
  • 定时任务管理系统 gocron

    千次阅读 2018-06-25 14:13:36
    gocron - 定时任务管理系统 项目简介 使用Go语言开发的定时任务集中调度和管理系统, 用于替代Linux-crontab 查看文档 原有的延时任务拆分为独立项目延迟队列 功能特性 Web界面管理定时任务 ...
  • idea自动构建web项目 系统管理员(sysadmin)每年在重复性任务上浪费数千小时。 幸运的是,使用开源工具构建的Web应用程序可以自动消除很大一部分痛苦。 例如,使用Python和JavaScript构建Web应用程序只需要大约一...
  • gocron-定时任务管理系统 项目简介 使用Go语言开发的轻量级定时任务集中调度和管理系统,使用替代Linux-crontab 的原有任务延时为拆分项目独立 功能特性 Web界面管理定时任务 crontab时间表达式,精确到秒 任务执行...
  • django项目实战:开发一种ansible web管理工具
  • WDCP是国内知名的Linux主机管理系统,因其简单的操作、强大的功能深受很多linux主机新手的喜爱,系统运行久了产生的临时数据会占用内存的资源,造成性能下降,我们可以通过WDCP面板中的“服务重启”来重启WEB服务...
  • CodendiCodendi 是一个软件项目协作管理平台,功能有配置管理、问题跟踪(bug、任务、需求等)、文档管理,还包含一个Eclipse插件;...RedmineRedmine是一个灵活的项目管理系统,使用 Ruby on Rails 框架开发,...
  • gocron - 定时任务管理系统

    千次阅读 2017-06-13 13:52:45
    gocron - 定时任务管理系统项目简介使用Go语言开发的定时任务集中调度和管理系统, 用于替代Linux-crontab 项目地址功能特性 Web界面管理定时任务, 支持动态添加、删除、编辑任务 crontab时间表达式,精确到秒 任务...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,276
精华内容 910
关键字:

web任务管理系统