该项目是基于django的工作流引擎,工单。项目托管在 Github

一、安装基础环境

1.1 安装python 和 pip

yum install -y epel-release
yum install -y https://centos7.iuscommunity.org/ius-release.rpm
yum install -y python36u python36u-devel python36u-pip

# 更新pip
pip3. install --upgrade pip
pip -V

1.2 安装和新建python3虚拟环境

# 安装
pip install -U virtualenv
rm -f /usr/bin/python3 && ln -s /usr/bin/python3. /usr/bin/python3 # 建立virtualenv目录
mkdir -p /data/virtualenv # 新建python3虚拟环境(纯净安装,名称为loonflow)
cd /data/virtualenv
virtualenv --no-site-packages -p /usr/bin/python3. loonflow # 激活进入虚拟环境
source /data/virtualenv/loonflow/bin/activate
(loonflow) [root@localhost virtualenv]#

1.3 安装mysql

# 下载yum源
wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm # 安装yum源
yum -y install mysql57-community-release-el7-.noarch.rpm # yum安装MySQL服务
yum -y install mysql-community-server MySQL-python mysql-devel # 首先启动MySQL
systemctl start mysqld.service # 查看密码
此时MySQL已经开始正常运行,不过要想进入MySQL还得先找出此时root用户的密码,通过如下命令可以在日志文件中找出密码:
grep "password" /var/log/mysqld.log # 如下命令进入数据库:
mysql -uroot -p
# 输入初始密码,此时不能做任何事情,因为MySQL默认必须修改密码之后才能操作数据库:
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'Admin@123';

1.4 创建数据库

# 创建库指定utf8编码
# 创建后端数据库
mysql> CREATE DATABASE loonflow DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; # 创建前端数据库
mysql> CREATE DATABASE shutongflow DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

1.5 安装redis

启动redis(用于生成唯一的工单流水号+celery异步任务[执行脚本、通知脚本])

# 安装
yum install -y redis # 启动
systemctl start redis
systemctl enable redis

二、安装后端

2.1 下载loonflow代码

cd /opt
git clone https://github.com/blackholll/loonflow.git # 切换到 r0.3.19 tag
cd loonflow/
git checkout r0.3.19

2.2 安装loonflow依赖

# 进入虚拟环境
source /data/virtualenv/loonflow/bin/activate # 安装requirements依赖
cd /opt/loonflow/requirements # 添加requests模块
echo "requests" >> common.txt # 安装
(loonflow) # pip install -r pro.txt

2.3 配置loonflow

1)配置DB

# 文件:loonflow/settings/pro.py
……
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'loonflow', # 刚刚新建的数据库名称
'USER': 'root', # 数据库用户
'PASSWORD': 'Admin@123', # 数据库密码
'HOST': '127.0.0.1', # 数据库机器IP
'PORT': '', # 端口
}
}
……

2)允许访问地址

最后设置以域名访问的时候不会报错。

# 文件:loonflow/settings/common.py
# ALLOWED_HOSTS 改成如下
……
ALLOWED_HOSTS = ['*']
……

3)指定配置文件

# 文件:loonflow/tasks.py
# DJANGO_SETTINGS_MODULE 对应配置文件改成为 pro
……
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'settings.pro')
……

4)初始化db

python manage.py makemigrations
python manage.py migrate

5)创建超级用户

python manage.py createsuperuser

账号:root,密码:Admin123

2.4 启动后端

python manage.py runserver 0.0.0.0:

启动之后,就可以访问admin后台,然后随便测试一个接口

# 后端url
http://172.16.34.250:6060 # 后端管理url
http://172.16.34.250:6060/admin # api
http://172.16.34.250:6060/api/v1.0/workflows

三、安装前端

使用第三方代码:https://github.com/youshutong2080/shutongFlow
本系统使用Vue.js + Django开发,前端展示由loonflow配置决定,可以说前端是全动态,只需要配置好loonflow即可。

3.1 下载shutongFlow

cd /opt
git clone https://github.com/youshutong2080/shutongFlow.git

3.2 安装依赖

# 激活进入虚拟环境
source /data/virtualenv/loonflow/bin/activate cd /opt/shutongFlow/apps
pip install -r requirements.txt

3.3 配置shutongFlow

1)初始化db

# 初始化db
python manage.py makemigrations
python manage.py migrate 

2)导入数据

# 导入第三方数据(这里主要是用户数据)
cd /opt/shutongFlow/
mysql -uroot shutongflow < shutongflow.sql
# 导入loonflow数据(配置数据及用户数据)
mysql -uroot loonflow < loonflownew.sql

3)监听主机地址

# 文件:shutongFlow/fronted/config/index.js
# host: 'localhost' 改成如下
……
host: '0.0.0.0'
……

3.4 启动前端

1)启动shutongFlow后端

# 启动shutongFlow
cd /opt/shutongFlow/apps
python manage.py runserver 0.0.0.0:

2)启动shutongFlow前端vue

# 启动vue,会监听6061端口,前端的访问端口。
npm install .
npm run dev

3.5 启动通知服务

# 启动celery任务:
celery -A tasks worker -l info -Q loonflow

生产环境命令如下:celery multi start -A tasks worker -l info -c 8 -Q loonflow --logfile=xxx.log --pidfile=xxx.pid
参数说明:-c为启动的celery进程数, logfile为日志文件路径, pidfile为pid文件路径,可自行视情况调整。

四、前后端用户同步

前端数据库:shutongflow.user(username,alias,email)
后端数据库:loonflow.account_loonuser(username,alias,email)
当前端shutongflow库中的user表有插入动作,则把(username,alias,email)数据同步到后端loonflow库的account_loonuser表的(username,alias,email)数据。

4.1 插入的触发器

use shutongflow
DELIMITER //
CREATE TRIGGER user_trigger AFTER INSERT ON user FOR EACH ROW
BEGIN
INSERT INTO loonflow.account_loonuser(username,alias,email) VALUES(new.username,new.alias,new.email);
END ;
//
DELIMITER ;

注:在命令提示符下输入delimiter // 这样是用//替换换行符,这样可避免点击换行键时执行程序。

4.2 查看数据

当前端集成好了LDAP后,前端采用LDAP账号登入,会同步账号信息到后端数据库,这时候可以查看数据是否已经同步。

select * from shutongflow.user;
select * from loonflow.account_loonuser;

4.3 触发器操作

# 查询触发器
select * from information_schema.triggers\G # 删除触发器
use shutongflow
DROP TRIGGER user_trigger;

五、配置LDAP认证

当前端ldap登入后,会在user表中插入用户信息,然后触发器会同步数据到后端loonflow.account_loonuser用户表。

5.1 安装模块

# 激活进入虚拟环境
source /data/virtualenv/loonflow/bin/activate pip install python-ldap django_auth_ldap

5.2 配置文件

修改前端同步ldap文件:shutongFlow/apps/apps/settings.py

import ldap
from django_auth_ldap.config import LDAPSearch, LDAPSearchUnion, GroupOfNamesType AUTHENTICATION_BACKENDS = (
'django_auth_ldap.backend.LDAPBackend', #配置为先使用LDAP认证,如通过认证则不再使用后面的认证方式
'django.contrib.auth.backends.ModelBackend',
)
AUTH_LDAP_SERVER_URI = "ldap://ldap.wmq.com:389" # ldap服务器地址
AUTH_LDAP_BIND_DN = 'cn=manager,dc=wmq,dc=com' # 管理员账号
AUTH_LDAP_BIND_PASSWORD = 'xxxxx'
OUg = 'DC=wmq,DC=com'
AUTH_LDAP_USER_SEARCH = LDAPSearch(OUg, ldap.SCOPE_SUBTREE, "(&(objectClass=inetOrgPerson)(uid=%(user)s))")
AUTH_LDAP_USER_ATTR_MAP = {"first_name": "givenName", "last_name": "sn", "alias": "sn", "email": "mail", "username":"name"}
AUTH_LDAP_ALWAYS_UPDATE_USER = True # 是否同步LDAP修改
AUTH_USER_MODEL = 'account.Users'

六、supervisor守护进程

supervisor 是基于 python 的任务管理工具,用来自动运行各种后台任务,当然你也能直接利用 nohup 命令使任务自动后台运行,但如果要重启任务,每次都自己手动 kill 掉任务进程,这样很繁琐,而且一旦程序错误导致进程退出的话,系统也无法自动重载任务。

6.1 安装supervisor

yum install -y epel-release
yum install -y supervisor # 开机自启动
systemctl enable supervisord

6.2 配置supervisor

# 创建配置文件
mkdir /etc/supervisor
echo_supervisord_conf > /etc/supervisor/supervisord.conf
# 修改日志、pid、sock 存放目录
vim /etc/supervisor/supervisord.conf
……
[unix_http_server]
file=/var/run/supervisor.sock
……
[supervisord]
logfile=/var/log/supervisord.log
pidfile=/var/run/supervisord.pid
……
[supervisorctl]
serverurl=unix:///var/run/supervisor.sock
……
[include]
files = /etc/supervisor.d/*.ini

6.3 配置项目启动文件

# 创建项目配置文件
vim /etc/supervisord.d/loonflow.ini [program:loonflow]
directory=/opt/loonflow
environment=HOME="/opt/loonflow"
command=/data/virtualenv/loonflow/bin/python manage.py runserver 0.0.0.0:6060 ;在python3的虚拟环境运行,需要指定virtualenv的绝对路径
autostart=true
autorestart=true
startsecs=
stdout_logfile = /var/log/loonflow/loonflow_access.log
stderr_logfile = /var/log/loonflow/loonflow_error.log
stopasgroup=true
killasgroup=true
[program:shutongflow]
directory=/opt/shutongFlow/apps
command=/data/virtualenv/loonflow/bin/python manage.py runserver 0.0.0.0:
autostart=true
autorestart=true
startsecs=
stdout_logfile = /var/log/loonflow/shutongflow_access.log
stderr_logfile = /var/log/loonflow/shutongflow_error.log
stopasgroup=true
killasgroup=true

[program:vue]
directory=/opt/shutongFlow/fronted
command=npm run dev
autostart=true
autorestart=true
startsecs=
stdout_logfile = /var/log/loonflow/vue_access.log
stderr_logfile = /var/log/loonflow/vue_error.log
stopasgroup=true
killasgroup=true

[program:celery]
directory=/opt/loonflow
environment=HOME="/opt/loonflow"
command=/data/virtualenv/loonflow/bin/celery -A tasks worker -l info -c -Q loonflow --pidfile=/var/run/loonflow_celery.pid
autostart=true
autorestart=true
startsecs=
stdout_logfile = /var/log/loonflow/celery.log
stderr_logfile = /var/log/loonflow/celery_error.log
stopasgroup=true
killasgroup=true
# 创建日志存储目录
mkdir /var/log/loonflow

参考:https://github.com/jimmy201602/workflowdemo/blob/master/supervisord.conf

参数说明:https://www.restran.net/2015/10/04/supervisord-tutorial/

6.4 启动

# 启动
systemctl start supervisord systemctl status supervisord //运行状态
systemctl stop supervisord //停止
systemctl restart supervisord //重启

启动完成后,可以查看项目对应进程的启动状态,如果有错误查看日志文件。

supervisorctl status

celery                           RUNNING   pid , uptime ::
loonflow RUNNING pid , uptime ::
shutongflow RUNNING pid , uptime ::
vue RUNNING pid , uptime ::

6.5 访问

访问前端:http://172.31.57.1:6061
默认账号:admin,密码:yxuqtr
前端数据库:http://172.31.57.1:6062/admin/ 访问后端(支持ldap):http://172.31.57.1:6060
默认账号:admin,密码:123456
后端数据库:http://172.31.57.1:6060/admin/ 去除“所有工单”功能按钮,找到//注释即可。
shutongFlow/fronted/src/router/routers.js

七、配置域名

vue前端需要采用nginx进行代理才能正常以域名地址访问;其他端口直接做了域名解析即可访问,不用设置代理。

7.1 安装nginx

yum install -y nginx

7.2 配置文件

vim /etc/nginx/conf.d/loonflow.conf

server {
listen *:;
server_name loonflow.wmq.com; location / {
proxy_pass http://127.0.0.1:6061;
}
}

7.3 域名解析

172.31.57.1 loonflow.wmq.com

这样 6.5 节的访问url地址全部可以通过域名进行访问了。

八、附:企业微信通知脚本

send_wechat.py
内容如下: #!/usr/bin/env python
# -*- coding:utf- -*-
"""
通知脚本loonflow会将标题、内容、参与人等信息作为全局变量传给通知脚本,脚本中直接使用这些参数,通过各自的发送消息逻辑将信息发送出去。
详情参数参考:loonflow/media/notice_script/demo_notice_script.py 里面有变量名称。
本脚本引用三个变量:participant:接收人,content_result:内容,title_result:标题。
另外通知脚本内容是exec来执行的,不是直接执行脚本。所以 __name__ !== "__main__",不能用if __name__ == "__main__"。
""" import json
import requests class WeChat:
def __init__(self):
self.CORPID = 'wxc08*****7d5b2cb'
self.CORPSECRET = 'pmv*******************QBRv5w'
self.AGENTID = '' def _get_access_token(self):
url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken'
values = {'corpid': self.CORPID,
'corpsecret': self.CORPSECRET,
}
req = requests.post(url, params=values)
return req def get_access_token(self):
get_req = self._get_access_token()
if get_req.status_code != :
print('连接服务器失败')
else:
get_req_json = json.loads(get_req.text)
if get_req_json['errcode'] != :
print('响应结果不正确')
else:
access_token = get_req_json['access_token']
return access_token def send_data(self):
send_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + self.get_access_token()
send_values = {
"touser": participant,
"msgtype": "text",
"agentid": self.AGENTID,
"text": {
"content": '%s <a href=\"http://172.31.57.1:6061/ticket/todo\">%s</a>' % (content_result,title_result)
},
"safe": ""
}
send_msges = (bytes(json.dumps(send_values), 'utf-8'))
respone = requests.post(send_url, send_msges)
respone = respone.json()
return respone["errmsg"] wx = WeChat()
wx.send_data()

相关链接

后端(django):https://github.com/blackholll/loonflow

本文采用的前端demo(vue+django):https://github.com/youshutong2080/shutongFlow

其他前端demo(bootstrap+django):https://hub.docker.com/r/webterminal/workflowdemo

通知脚本:https://github.com/blackholll/loonflow-helper/blob/master/notice_script_demo/notice_script_demo.py

django接入ldap:https://igolang.cn/Python/django%20%E6%8E%A5%E5%85%A5%20ldap/

loonflow 工单系统的更多相关文章

  1. Rancher 部署 loonflow 工单系统

    上篇文章介绍用实例主机部署:https://www.cnblogs.com/weavepub/p/11672305.html,本文采用Rancher上部署. 文章所有的文件都托管在Github:htt ...

  2. Docker 安装 Request Tracker 工单系统

    1.需求 docker 安装工单系统 Request Tracker,并需要支持 LDAP 登入. 2.制作镜像 1)request-tracker-base镜像 第一个镜像安装一些基础支持软件,如 ...

  3. 阿里云使用Docker部署工单系统(redmine)

    环境:阿里云服务器 Redmine安装部署 Redmine是用Ruby开发的基于web的项目管理软件,是用ROR框架开发的一套跨平台项目管理系统,据说是源于Basecamp的ror版而来,支持多种数据 ...

  4. (OSP)外包工单关工单失败

    会计同事反映,在关几个外包(OSP)工单时,系统报错.错误讯息如下.检查错误讯息,发现Number of jobs failed in Delivered Quantity : 2.检查工单数据,均无 ...

  5. iDempiere 使用指南 BOM及工单流程

    Created by 蓝色布鲁斯,QQ32876341,blog http://www.cnblogs.com/zzyan/ iDempiere官方中文wiki主页 http://wiki.idemp ...

  6. Linux下使用Docker部署nacos-server(单机模式),丧心病狂的我在半夜给UCloud提交了一份工单

    1. 拉取nacos-server镜像 进入 Docker Hub 查看nacos-server最新版本为 nacos-server:1.4.0 配置阿里云镜像加速 sudo mkdir -p /et ...

  7. abp加DDD开发:低耦合、可复用、可扩展的【工单】业务模块-简介和集成

    前言 很多场景[单体+模块化]比微服务更合适,开发难度低.代码可复用性强.可扩展性强.模块化开发有些难点,模块启动与卸载.模块之间的依赖和通讯.asp.net core abp为我们提供了模块化开发能 ...

  8. failed jobs because of past close date,关工单报错

    今天会计反映关不了工单.我们公司关工单的程序是自己开发的,可以整批关.报如下错误.我试着用Standad程序关,可以.看来应该是我们开发的程序有问题.后来发现,是抛到WIP_DJ_CLOSE_TEMP ...

  9. MD4C/CO46/MD04一个很棒的工单缺料分析

    大家好~~~ 之前在MD04物料分析的时候,看到有订单预留,双击有个订单报告可以显示一个订单物料是否缺料清单 这个单独的工单分析可以在T-code:MD4C,CO46查看,如果只是单独的使用,那么这两 ...

随机推荐

  1. Asp.Net SignalR 使用记录

    工作上遇到一个推送消息的功能的实现.本着面向百度编程的思想.网上百度了一大堆.主要的实现方式是原生的WebSocket,和SignalR,再次写一个关于Asp.Net SignalR 的demo 这里 ...

  2. 中国爬虫违法违规案例汇总github项目介绍

    中国爬虫违法违规案例汇总github项目介绍 GitHub - 本项目用来整理所有中国大陆爬虫开发者涉诉与违规相关的新闻.资料与法律法规.致力于帮助在中国大陆工作的爬虫行业从业者了解我国相关法律,避免 ...

  3. 第3篇-超市管理系统Scrum冲刺博客

    一.站立式会议: 1.会议照片 2.昨天完成的工作 ①数据库方面:根据需求关系为在数据库中建立相关表的基本模型供后续参考. ②前端方面:完成了登录界面的设计:各个界面的草图:为各个界面选取合适的图片如 ...

  4. Vue实战狗尾草博客管理系统第二章

    伙伴们出来啦,探讨各问题,关于项目中大量的表单,大家是怎么处理的? 本章主要内容如下:底层布局,路由配置,github仓库推送关联. 关联GitHub仓库 关联建立在github已创建账号的基础上 登 ...

  5. element-ui的tag组件关闭事件失效的原因

    问题如上,原因是忘了加上一个函数 @close="handleClose(tag)" <el-tag :key="tag" v-for="tag ...

  6. grep日志去重

    grep --text ' ERROR '2017.06.08.log | grep '12345678' | grep -Eo 'telephone=.*{11},p'| sort | uniq | ...

  7. 白话SCRUM 之二:product backlog

    在SCRUM方法中明确要求了3个文档: 1 product backlog 2sprint backlog 3 burn-down chart Product backlog 中列举了本项目应该实现的 ...

  8. K3 主控台创建

    /*================================================== FFFFFF OOOO GGGG EEEEEE RRRR SSSS ###### FF OO ...

  9. VUE 直接通过JS 修改html对象的值导致没有更新到数据中去

    业务场景 我们在使用vue 编写 代码时,我们有一个 多行文本框控件,希望在页面点击一个按钮 在 文本框焦点位置插入一个 {pk}的数据. 发现插入 这个数据后,这个数据并没有同步到 数据中,但是直接 ...

  10. Python从零开始——字典Dict

    一:Python字典知识概览 . 二:字典常见操作 三:字典内置操作函数