【企业应用】车间生产任务通知系统 . 开发过程笔记

从4月10号开始学李魏老师的python入门教程,边学边度边写,到今天5月11,正式完成这个项目的雏形。代码很初级,笨笨地实现一些功能,这周上线到生产环境,边跑边补吧。

 

简介: #

  • 真.轻量简洁,全web应用,后端python,前端html,框架flask,数据库mysql,复杂的目前我也整不来
  • 提供3个车间的任务通知,可新建任务、删除(完成)任务

部署环境: #

  • 后端:Linux CentOS 7 / Python3.10.0 + Flask 1.14 + Mysql 5.6
  • 前端:Html5
  • 本地服务器+云端数据库

系统特点: #

  • web前端脱管运行,任务更新时前端会自动渲染刷新
  • 其它的 也就那么回事吧

演示界面: #

后台登陆

任务发布

任务修改和结束

任务通知界面

 

 

 

开源地址: #

https://github.com/ruderal828/Saida_project.git

 

开发过程: #

开发环境: #

 

1. 安装Pyhton3.10.0。 #

这是python的基础环境。

下载地址https://www.python.org/ftp/python/3.10.0/ ,安装一路下一步到底,能勾的都勾上(至少应该把环境变量pip IDLE等工具勾上)。

社会主义机构,免费。

 

2. 安装Pycharm。 #

这是配合python的编程环境,高效而优雅。

下载地址:https://www.jetbrains.com/pycharm/download/#section=windows

试用30天,够用。试用到期继续用是8.9刀每月。

 

3. 安装Xshell。 #

SSH管理工具。

下址地址:https://www.xshellcn.com/xiazai.html

直接填一下信息,然后邮箱里接收链接,个人免费够用,不需要去搞注册那些。

 

4 安装Navicat Premium。 #

数据库管理工具。

下载地址:http://www.navicat.com.cn/download/navicat-premium

14天试用,个人版的3个月819太阳币。..有点巨。也可度娘国情方案。

 

5. 安装云端mysql。 #

数据库环境。

登录阿里云,我这里是用的ECS。

为什么不一起装在本地或云端,主要考量安全问题。自己的代码不完美,在局域网跑要安全一些;而数据库分在云端,则是防止自己给本地Linux整挂了。

实例与镜像 – 实例 – ECS – 安装centOS8 – 配置root密码 – 完成

网络与安全 – 安全组 – 规则配置 – 开放ssh端口(通常是22)、888端口(BT初始界面需要) – 完成

打开第二步安装好的Xshell 7连接云服务器。

# 获取所有权限
sudo -i
# 一键盘安装BT工具界面
yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh ed8484bec

中途有几个需要确认的地方 -y 一下,等待一阵,完成后把最后的登陆信息复制保存。

切换到浏览器中登陆操作,最好把用户、密码、授权路径、端口号等改一下。

主页 – 数据库 – 增加数据库 – 完成

回到阿里云上的网络规则,关闭888端口,换成刚改的端口号。

 

准备环境基本就完成了。

 

开发过程: #

只记录遇到小要点的笔记。

Python 连接ssh并执行Linux脚本 #

# -*- codeing = utf-8 -*-
# @Time : 2022/4/26 21:37
# @Author : Ruderal.cn
# @File : courceurl.py
# @Software : PyCharm

# 引入paramiko模块,若无则pip3 install paramiko
import paramiko

# 创建连接
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# 连接服务器
client.connect(hostname='192.168.1.230',
               port=22,
               username='root',
               password='password')

# 执行预订的脚本操作
stdin, stdout, stderr = client.exec_command('/root/xx.sh') # 要执行的脚路径

#5.获取命令执行的结果
result_ssh = stdout.tell()
# print(result_ssh)
# time.sleep(10)

#6.关闭连接
client.close()

Python 通过SSH连接云服务器 操作mysql数据库 #

from sshtunnel import SSHTunnelForwarder
import pymysql

# 通过SSH连接云服务器
server = SSHTunnelForwarder(
    ssh_address_or_host=('192.168.1.230', 22),
    ssh_username='root',
    ssh_password='password',
    remote_bind_address=('localhost', 3306)
)

# 连接服务器并启用通道
server.start()

# 连接数据库
con = pymysql.connect(
    host='127.0.0.1',
    port=server.local_bind_port,
    user='user',
    password='password',
    db="sqlname",
    charset='utf8')

# 创建游标
cur = con.cursor()
# 要执行的语句
sql = ''
# 执行语句
exe = cur.execute(sql)
# 提交
con.commit()
# 关闭游标
cur.close()
# 关闭连接
con.close()

用post方法form到flask@app.route下接收做返回 #

# 登陆路由
@app.route('/', methods=['GET', 'POST'])
def hello_world():  # put application's code here
    return render_template('admin/sign-in.html')

接上面的方法,做一个简单的登陆验证,基础逻辑是查表返回字典,if==本地input,判断str登陆。

# 用户验证路由
@app.route('/center', methods=['POST'])
def login():
    if request.method == 'POST':
        # print(request.form)
        # return login
        from database import con  # 引入连接数据库文件database的连接con
        cur = con.cursor(cursor=pymysql.cursors.DictCursor)  # 创建返回字典(dict)记录的游标
        sql = "SELECT * FROM users"  # 要执行的sql语法
        con.ping(reconnect=True)  # 确实连接
        cur.execute(sql)  # 执行sql
        f = cur.fetchall()  # 接收字典结果
        cur.close()  # 关闭游标
        con.close()  # 关闭数据库连接
        # server.close()

        # 判断登陆用户,以匹配用户名密码
        if request.form.get('user') == '一只大浣熊':
            if request.form.get('user') == f[0]['name'] and request.form.get('password') == f[0]['pass']:
                return '登陆成功!'
            else:
                return '用户名或密码错误!'
        # 多个用户 多个elif
        elif request.form.get('user') == '另一只大浣熊':
            balabala...

        else request.form.get('user') == '别的什么熊':
            return '用户不存在!'
    else:
        return 'need POST methods!'

如何用python flask给前端html传参,以及前端网页显示传参数据 #

# 传参路由 单个参数
@app.route('/tof1', methods=['POST'])
def tof1():
    # 定义参数user_id
    user_id = request.form.get('tof1')
    return render_template("f1.html", user_id=user_id)

# 前台网页现实
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>前台显示用户名</title>
</head>
<body>
    <h1>今天来的是几号熊?</h1>
    <p>是{{user_id}}号熊。</p>
</body>
</html>


# 传参路由 多个参数
@app.route('/tof1', methods=['POST'])
def tof1():
    # 定义参数user_id 并形成列表
    user_ids = []
    for id in request.form.get('tof1')
        user_ids.addend(in)
    return render_template("f1.html", user_id=user_ids)

# 前台网页现实
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>前台显示用户名</title>
</head>
<body>
    <h1>今天来都有哪些号的熊?</h1>
    <p>有{{user_ids[0]}}号熊。</p>
    <p>有{{user_ids[1]}}号熊。</p>
    <p>有{{user_ids[2]}}号熊。</p>
</body>
</html>

python 多个变量写入数据库 #

# 接收的定义
c_name = request.form.get('c_name')
type_spec = request.form.get('type_spec')
quantity = request.form.get('quantity')
postscript = request.form.get('postscript')
delivery_date = request.form.get('delivery_date')
author_id = request.form.get('author_id')

# 引入数据库连接
from database import con
nitonew = con.cursor()
sql = """
        INSERT INTO `production_order`.`message_3f` (`c_name`, `type_spec`, `quantity`, `postscript`, `delivery_date`, `author_id`) VALUES (%s, %s, %s, %s, %s, %s)    
        """
values = (c_name, type_spec, quantity, postscript, delivery_date, author_id)
# 确认连接
con.ping(reconnect=True)
# 执行
nitonew.execute(sql, values)
# 提交
con.commit()
# 关闭游标
nitonew.close()

数据更新后Flask前端自动刷新 #

这个是折腾最久的一个问题。

我想要数据库更新后,前端也时时更新,而flask框架只有在启动的时候运行渲染,并把结果传给html,但当我后端数据库发生变更时,前端刷新网页显示的仍是之前的旧数据,要显示最数据必须重启flask。

我的解决办法是,先在Linux写一个名为 restart.sh 的重启flask的脚本,放到用户目录下,并赋权限757:

# 杀掉正在运行的flask
pkill python3



# 重新启动flask
# 程序目录
cd /root/ruderal
# 激活虚拟环境
source ENV/bin/activate
# 运行flask主程序,!注意末尾必须加上&
python3 app.py run &
python3 app.py run &

#	suspend 
sleep 200 &

再编写一个名为run_again.py文件,通过ssh远程执行Linux脚本的脚本(笨熊套娃)

# 执行预订的脚本,路径为 restart.sh 脚本的全路径
stdin, stdout, stderr = client.exec_command('/root/restart.sh')

# 获取结果,这条等下要用
result_ssh = stdout.tell()
# print(result_ssh)

# 关闭连接
client.close()

然后,在app.py主程序里创建一个返回

#   自动渲染数据并加载
@app.route('/cxjz', methods=['POST'])
def cxjz():
#   引入上面run_again.py文件里的返回值,以此调用整个文件运行
    from run_anaig import result_ssh
    if result_ssh == '0':
        return render_template('ojbk!')
    else:
        return render_template('ojbk too!')

最后一步,在前端html中,用form表单方式同步执行数据库操作和重新渲染的效果

<form action="cxjz" method="post">
     <br>
     <p>该指令中止或完成!</p>
     <input type="hidden" name="cxjz">
     <button type="submit">结束指令</button>
     </form>

到这里基本就实现功能了,但前端必须手动刷新后才会显示最新数据

这里,再用个livereload模块,来现实后端flask重启时,前端自动刷新页面的效果

# 引入livereload 模块中的Server,如果没有就pip一个

from livereload import Server
if __name__ == '__main__':
    app.debug = True
    live_server = Server(app.wsgi_app)
    # live_server.watch('**/*.*')
    # 如果要指定IP和端口,则live_server.serve(host='192.168.1.230', port=5000)
    live_server.serve()
    # app.run()

这样,这种笨笨的办法,也算是实现我要的效果了。

 

html 如何在执行点击事件的同时执行表单提交 #

执行onclick关闭窗口的同时,执行javascript:document.gotodali.submit();表单提交,注意gotodali必须与表单中的name值相同

<form name="gotodali" action="gotodali" method="post">
      <input type="hidden" name="gotodali" value="woyequ">
      <div><a href="javascript:document.gotodali.submit();" onclick="window.close()">去哪啊朋友?</a></div>
      </form>

#

服务器部署 #

安装Linux #

下载CentOS Stream 9 地址https://www.centos.org/download/

用UltraISO把镜像写入U盘,启动安装时如果找不到盘,先ls /dev 看一下盘符,找到U盘记下,reboot

重启到安装菜单时e到install的HD:后面写上U盘路径,比如我的U盘是sda4,那我这里就是

vmlinuz initrd=initrd.img inst.stage2=hd:/dev/sda4 quiet

然后ctrl+x,none。

配置网络 #

# 查看网卡
ip addr
# 进入网卡配置目录
cd /etc/sysconfig/network-scripts

# 编辑配置文件
vim ifcfg-ensxx

# 配置方法
TYPE=Ethernet    /*设备类型*/
BOOTPROTO=static   /*IP分配方式,一般就是static静态IP和dhcp动态分配IP两种*/
DEVICE=ens12     /*网卡名称,如果要改网卡名称,只改配置文件是没用的*/
ONBOOT=yes    /*是否启动,有yes和no两种参数*/
IPADDR=192.168.1.20  /*设置内网IP地址*/
NETMASK=255.255.255.0  /*设置子网掩码*/
GATEWAY=192.168.0.1   /*设置网关*/
DNS1=192.168.0.1   /*设置DNS地址*/
# 重启网卡
systemctl restart network

防火墙配置 #

# 启动
systemctl start firewalld
# 关闭
systemctl stop firewalld
# 查看状态
systemctl status firewalld 
# 开机禁用
systemctl disable firewalld
# 开机启用
systemctl enable firewalld

Linux CentOS7 配置网络唤醒 #

BIOS设置

 

进系统配置

# 安装环境
sudo yum install ethtool 
# or
yum install -y ethtool

# 查看状态
ethtool enp4s0 |grep Wake-on

#	Supports Wake-on: pumbg
#	Wake-on: d
#	d为关闭,g为激活

# 激活
ethtool -s 网卡名 wol g
# ethtool -s enp4s0 wol g

# 获取网卡信息
ifconfig 网卡名 | grep ether | awk '{print $2}'


# 由于重启之后,ethtool会自动关闭,所以要将激活状态写入启动
cd /etc/rc.d
vi rc.local
# 在最下面添加一条
ethtool -s 网卡名 wol g


下载控制端软件:https://github.com/basildane/WakeOnLAN/releases/tag/2.12.4

网卡唤醒已完成。

 

安装环境 #

这里有很多先后依赖要安装,像套娃一样,一个套上另一个,所以要按先后一个个装,不然有的装到一半会报错。

ps. 所有编译安装的过程中出错中断的,再次安装之前必须要先清理编译包:make clean

 

1. 更新yum源配置 #
#1.查看yum源信息
yum repolist

#2.备份配置文件
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak

#3.下载国内yum源文件(centOs7,比如阿里)
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
(红帽同理 (RHEL 7))
(wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo)

#4.清理缓存
yum clean all

#5.重新生成缓存
yum make cache

6. 更新yum
yum update
2. 安装/升级OpenSSL #
yum install openssl

如果上面的安装不成功

# 先安装这两个前置依赖
yum install build-essential
yum install zlib

# 再安装openssl
yum group install 'Development Tools'
yum install perl-core zlib-devel -y git

cd /usr/local/src
wget https://www.openssl.org/source/openssl-1.1.1o.tar.gz
tar -xf openssl-1.1.1o.tar.gz
cd openssl-1.1.1o
./config --prefix=/usr/local/ssl --openssldir=/usr/local/ssl shared zlib

make
make test
make install
3. 安装 GMP,MPFR,MPC #
wget https://gmplib.org/download/gmp/gmp-6.2.1.tar.xz
tar -jxvf gmp-6.2.1.tar.xz
cd gmp-6.2.1
./configure --prefix=/usr/local/gmp-6.2.1  --build=x86_64-linux
sudo make && make install


wget http://ftp.gnu.org/gnu/mpfr/mpfr-3.1.0.tar.gz
tar -xf mpfr-3.1.0.tar.gz 
cd mpfr-3.1.0
./configure --prefix=/usr/local/mpfr-3.1.0  --with-gmp=/opt/gmp-6.2.1  --build=x86_64-linux
sudo make && make install


wget https://ftp.gnu.org/gnu/mpc/mpc-1.2.1.tar.gz
tar -zxvf  mpc-1.2.1.tar.gz
cd mpc-1.2.1
./configure --prefix=/usr/local/mpc-1.2.1  --with-gmp=/usr/local/gmp-6.2.1 -with-mpfr=/usr/local/mpfr-3.1.0  --build=x86_64-linux
sudo make && make install
4. 安装GCC #
wget ftp://ftp.irisa.fr/pub/mirrors/gcc.gnu.org/gcc/releases/gcc-11.1.0/gcc-11.1.0.tar.gz
tar -zxvf gcc-11.1.0.tar.gz
cd gcc-11.1.0/
ls
ABOUT-NLS           COPYING3.LIB     libbacktrace   libquadmath         Makefile.def
ar-lib              COPYING.LIB      libcc1         libsanitizer        Makefile.in
ChangeLog           COPYING.RUNTIME  libcody        libssp              Makefile.tpl
ChangeLog.jit       c++tools         libcpp         libstdc++-v3        MD5SUMS
ChangeLog.tree-ssa  depcomp          libdecnumber   libtool-ldflags     missing
compile             fixincludes      libffi         libtool.m4          mkdep
config              gcc              libgcc         libvtv              mkinstalldirs
config.guess        gnattools        libgfortran    ltgcc.m4            move-if-change
config-ml.in        gotools          libgo          ltmain.sh           multilib.am
config.rpath        include          libgomp        lt~obsolete.m4      NEWS
config.sub          INSTALL          libhsail-rt    lto-plugin          README
configure           install-sh       libiberty      ltoptions.m4        symlink-tree
configure.ac        intl             libitm         ltsugar.m4          test-driver
contrib             LAST_UPDATED     libobjc        ltversion.m4        ylwrap
COPYING             libada           liboffloadmic  MAINTAINERS         zlib
COPYING3            libatomic        libphobos      maintainer-scripts
./configure --prefix=$PWD/_install
sudo make && make install
5. 安装Prel5 #
wget https://www.cpan.org/src/5.0/perl-5.28.0.tar.gz
tar -xzf perl-5.28.0.tar.gz
cd perl-5.28.0
./Configure -des -Dprefix=$HOME/localperl
make
make test
make install
6. 安装phthon3.10.0 #
yum install gcc openssl-devel gcc-c++ compat-gcc-34 compat-gcc-34-c++


wget https://www.python.org/ftp/python/3.10.0/Python-3.10.0.tgz

#解压
tar zxf Python-3.10.0.tgz

cd Python-3.10.0
./configure --prefix=/usr/python3 --with-ssl

# 编译安装
make 
make install

# 验证安装
python3 -V
pip3 -V

# 如果报错,则补软链
# ln -s 源文件或目录 目标文件或目录
ln -s /usr/python3/bin/python3.10 /usr/bin/python3
ln -s /usr/python3/bin/pip3 /usr/bin/pip3

# 配置环境变量
# 使用whereis python3 查找文件目录,把目录配置到环境变量中
vim /etc/profile
export PATH=/usr/python3/bin:$PATH
# 使变量生效
source /etc/profile

# 再次检验
python3 -V
pip3 -V

 

10. Linux用户免输入密码登陆 #
cd /etc/gdm
ls
vi custom.conf

# 在[daemon]下增加
AutomaticLoginEnable=True
AutomaticLogin=root
# root为要免密码登陆的用户
11. 其它小本本记录 #

登陆后自动执行程序

vim ~/.bash_profile
export DISPLAY=:0 && moon is my lovey &
# moon is my lovey 为要执行的应用

安装google chorme

wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm
rpm  -ivh  google-chrome-stable_current_x86_64.rpm

# 如果报错
sudo yum -y localinstall google-chrome-stable_current_x86_64.rpm 

# 添加google-chrome快捷方式
cp /usr/share/applications/google-chrome.desktop /root/desktop/

centos7安装deb包

yum install alien

# 如果没有这alien包
yum install epel-release

# 安装好后再
yum install alien

alien -r 软件名 generated
rpm -ivh 文件名.rpm

# 如果安装不上可以强制进行安装。
rpm -ivh --nodeps --force 文件名.rpm

Linux安装google chrome后 自动全屏最大化

google-chrome --no-sandbox -kiosk
# 但重启后发现google chrome只是比窗口最大化大一点,并不能全屏

# cd到目录后再运行程序,完美实现
# 务必加上sudo以管理员身份运行,否则全屏前会弹input密码
# runing after login the google chrome
# export DISPLAY=:0 &sudo google-chrome --no-sandbox -kiosk &
cd /usr/bin
sudo google-chrome --no-sandbox -kiosk https://ruderal.cn/f3

 

 

Powered by BetterDocs

发表评论