PHP语言检测用户输入密码及调用Python脚本

  现在有一份计算流体力学N-S方程的Python脚本,想要在用户登录网站后可以可以运行该脚本,然后将脚本运行后绘制的图片显示在用户网页上。
建一个名为N_S.py的python脚本文件,这个脚本在生成图像后会自行关闭,随后将图片保存在指定的文件夹里:

import matplotlib.pyplot as plt  
import numpy as np  
from tqdm import tqdm  

N_POINTS = 41  #网格点数
DOMAIN_SIZE = 1.0  #模拟区域大小
N_ITERATIONS = 500  #迭代次数  
TIME_STEP_LENGTH = 0.001  #时间步长
KINEMATIC_VISCOSITY = 0.1  #运动粘度 
DENSITY = 1.0  #密度
HORIZONTAL_VELOCITY_TOP = 1.0  #顶部水平速度 
N_PRESSURE_POISSON_ITERATIONS = 50  #Poisson迭代的次数  

def initialize_fields():  
    element_length = DOMAIN_SIZE / (N_POINTS + 1)  
    x = np.linspace(0.0, DOMAIN_SIZE, N_POINTS)  
    y = np.linspace(0.0, DOMAIN_SIZE, N_POINTS)  
    X, Y = np.meshgrid(x, y)  
    u_prev = np.zeros_like(X)
    v_prev = np.zeros_like(X)
    p_prev = np.zeros_like(X)  
      
    return X, Y, u_prev, v_prev, p_prev, element_length  #element网格间距
  
def central_difference(f, axis, element_length):    
    diff = np.zeros_like(f)    
    if axis == 'x':    
        diff[1:-1, 1:-1] = (f[1:-1, 2:] - f[1:-1, 0:-2]) / (2 * element_length)    
    elif axis == 'y':    
        diff[1:-1, 1:-1] = (f[2:, 1:-1] - f[0:-2, 1:-1]) / (2 * element_length)    
    return diff 


#计算拉稀拉丝算子
def laplace(f, element_length):    
    diff = np.zeros_like(f)    
    diff[1:-1, 1:-1] = (f[1:-1, 0:-2] + f[0:-2, 1:-1] - 4 * f[1:-1, 1:-1] + f[1:-1, 2:] + f[2:, 1:-1]) / (element_length**2)    
    return diff  
  
def set_boundary_conditions(u, v, p):  
    #u=水平速度 v=垂直速度 p=压力
    u[0, :] = 0.0  #上部水平速度设为常数,其他全是0
    u[:, 0] = 0.0
    u[:, -1] = 0.0  
    u[-1, :] = HORIZONTAL_VELOCITY_TOP  
    v[0, :] = 0.0  
    v[:, 0] = 0.0  
    v[:, -1] = 0.0  
    v[-1, :] = 0.0  
    p[:, -1] = p[:, -2]  
    p[0, :] = p[1, :]  
    p[:, 0] = p[:, 1]  
    p[-1, :] = 0.0  
  
def main():     
    X, Y, u_prev, v_prev, p_prev, element_length = initialize_fields()    
    
    for _ in tqdm(range(N_ITERATIONS)):    
        d_u_prev__d_x = central_difference(u_prev, 'x', element_length)    
        d_u_prev__d_y = central_difference(u_prev, 'y', element_length)    
        d_v_prev__d_x = central_difference(v_prev, 'x', element_length)    
        d_v_prev__d_y = central_difference(v_prev, 'y', element_length)    
        laplace__u_prev = laplace(u_prev, element_length)    
        laplace__v_prev = laplace(v_prev, element_length)    
  
        u_tent = u_prev + TIME_STEP_LENGTH * (-(u_prev * d_u_prev__d_x + v_prev * d_u_prev__d_y) + KINEMATIC_VISCOSITY * laplace__u_prev)  
        v_tent = v_prev + TIME_STEP_LENGTH * (-(u_prev * d_v_prev__d_x + v_prev * d_v_prev__d_y) + KINEMATIC_VISCOSITY * laplace__v_prev)
        set_boundary_conditions(u_tent, v_tent, p_prev)  
  
        d_u_tent__d_x = central_difference(u_tent, 'x',  element_length)  
        d_v_tent__d_y = central_difference(v_tent, 'y',  element_length)  
  
        rhs = (DENSITY / TIME_STEP_LENGTH) * (d_u_tent__d_x + d_v_tent__d_y)  
  
        for _ in range(N_PRESSURE_POISSON_ITERATIONS):  
            p_next = np.zeros_like(p_prev)  
            p_next[1:-1, 1:-1] = 0.25 * (p_prev[1:-1, 0:-2] + p_prev[0:-2, 1:-1] + p_prev[1:-1, 2:] + p_prev[2:, 1:-1] - element_length**2 * rhs[1:-1, 1:-1])  
  
            p_next[:, -1] = p_next[:, -2]  
            p_next[0, :] = p_next[1, :]  
            p_next[:, 0] = p_next[:, 1]  
            p_next[-1, :] = 0.0  
  
            p_prev = p_next  
  
        d_p_next__d_x = central_difference(p_next, 'x', element_length)  
        d_p_next__d_y = central_difference(p_next, 'y',  element_length)  
  
        u_next = u_tent - TIME_STEP_LENGTH / DENSITY * d_p_next__d_x  
        v_next = v_tent - TIME_STEP_LENGTH / DENSITY * d_p_next__d_y  
  
        set_boundary_conditions(u_next, v_next, p_next)  
  
        u_prev = u_next  
        v_prev = v_next  
        p_prev = p_next  
    
    speed = np.sqrt(u_next**2 + v_next**2)  
 
    plt.figure()  
    plt.contour(X, Y, p_next, cmap='coolwarm')  
    plt.colorbar()  
    plt.quiver(X, Y, u_next, v_next, color="black")  
    plt.quiver(X[::2, ::2], Y[::2, ::2], u_next[::2, ::2], v_next[::2, ::2], speed[::2, ::2], cmap='jet')  
  
    quiv_colorbar = plt.colorbar()  
    quiv_colorbar.set_label('Speed')
    save_path = 'GGboy/images/my_plot.png'  
    plt.savefig(save_path) 
 
    plt.close() #显示图像换成plt.show()
  
if __name__ == "__main__":  
    main()  

脚本运行后生成的图片

 

PHP调用Python脚本可以使用exec()函数,运行该脚本后再将脚本生成并保存的图片反馈给用户。

先建立一个名为的login.html的HTML文件,在HTML页面中建立用于读取用户输入密码的文本框,将用户输入的密码传递给处理密码的PHP脚本。

<!-- 不完整代码 -->
<!DOCTYPE html>    
<html lang="zh">    
<head>    
    <meta charset="UTF-8">    
    <meta name="viewport" content="width=device-width, initial-scale=1.0">    
    <title>这是标题</title>       
</head>    
<body>     
 
    <form action="/文件保存路径/脚本.php" method="post">  
        <label for="password">请输入密码:</label> 
          <!-- 传递至PHP脚本  -->
        <input type="password" id="password" name="password">  
        <input type="submit" value="提交">  
    </form>  
      
</body>    
</html>

再建立一个名为GGBond.php的PHP文件,用来识别用户输入的密码是否正确:

//不完整代码
<?php  
if ($_SERVER["REQUEST_METHOD"] == "POST") {   
    $password = $_POST["password"];  
    if ($password == "ggboy") {  
        echo "密码正确";  
    } else {  
        echo "密码错误!";  
    }  
}  

这时应该优化功能,使PHP脚本能更安全地获取和处理 POST 数据,还能清理无用的缓存和防止注入攻击,顺便优化一下HTML页面 ,这时建立3个文件夹,一个用来存放CSS代码,一个用来存放JavaScript代码,一个用来存放页面图片总体结构如下:

先实现基本功能,使PHP代码调用Python脚本,先将GGBond.php的代码补全,把登录密码设置为ggboy

<?php  
if ($_SERVER["REQUEST_METHOD"] == "POST") {   
    $password = $_POST["password"];  
    // 密码是ggboy
    if ($password == "ggboy") {  
        // exce函数调用python
        exec("python N_S.py");  
        $imagePath = "/GGboy/images/my_plot.png";  
        echo "<img src='$imagePath' alt='Generated Image'>";  
    } else {  
        echo "密码错误!";  
    }  
}  

现在以下都是完整版代码,我先写的CSS代码,因为通过人力GPU运算的方式,我已设计好页面布局,有一个用来供用户护眼的滑动小猫,四张ins风格图型作为背景 ,再增加一组王者风的<h1>标题,确认好布局后开始CSS优化:

/* 让小猫划来划去 */
#sliding-image {  
    position: relative;  
    animation: slide 5s infinite;  
}  

@keyframes slide {  
    0% {  
        transform: translateX(0);  
    }  
    100% {  
        /* 可以改成transform: translateX(calc(100vw - 500px)); 让小猫少划一点 */
        transform: translateX(calc(1000vw - 500px)); 
    }  
}  

/* 酷炫的闪耀标题 */
.shining-title {  
    font-size: 3em;  
    text-align: center;  
    margin: 20px;  
    animation: color-change 2s infinite;  
}  
  
@keyframes color-change {  
    0% { color: red; text-shadow: 0 0 10px red, 0 0 20px red, 0 0 30px red; }  
    33% { color: yellow; text-shadow: 0 0 10px yellow, 0 0 20px yellow, 0 0 30px yellow; }  
    66% { color: blue; text-shadow: 0 0 10px blue, 0 0 20px blue, 0 0 30px blue; }  
    100% { color: red; text-shadow: 0 0 10px red, 0 0 20px red, 0 0 30px red; }  
}


/* 四个角放置四个GGBond靓照 */
body {  
    margin: 0;  
    padding: 0;  
    display: flex;  
    justify-content: center;  
    align-items: center;  
    height: 100vh;  
    background-color: #f0f0f0;  
    position: relative;  
}  
  
.container {  
    text-align: center;  
}  
  
.form-center {  
    display: flex;  
    flex-direction: column;  
}  
  
.password-input {  
    padding: 10px;  
    margin-bottom: 10px;  
    border-radius: 5px;  
    border: 1px solid #ccc;  
}  
  
.submit-btn {  
    padding: 10px 20px;  
    border-radius: 5px;  
    background-color: #4CAF50;  
    color: white;  
    cursor: pointer;  
    border: none;  
}  
  
.submit-btn:hover {  
    background-color: #45a049;  
}  
  
.background-image {  
    position: absolute;  
    width: 300px;  
    height: 300px;  
    background-size: cover;  
    background-repeat: no-repeat;  
}  
  
.top-left {  
    top: 0;  
    left: 0;  
    background-image: url('/GGboy/images/22.jpg'); 
}  
  
.top-right {  
    top: 0;  
    right: 0;  
    background-image: url('/GGboy/images/33.jpg'); 
}  
  
.bottom-left {  
    bottom: 0;  
    left: 0;  
    background-image: url('/GGboy/images/44.jpg'); 
}  
  
.bottom-right {  
    bottom: 0;  
    right: 0;  
    background-image: url('/GGboy/images/55.jpg'); 
}

因为设计中加入了图片移动动作,所以再编写好JavaScript代码:
 

document.addEventListener('DOMContentLoaded', function() {    
    var img = document.getElementById('sliding-image');    
    if (!img) {  
        console.error('Image element not found');  
        return;  
    }  
      
    var maxSlide = window.innerWidth - img.offsetWidth;    
      
    setInterval(function() {    
        var randomSlide = Math.random() * maxSlide;    
        img.style.transform = 'translateX(' + randomSlide + 'px)';    
  
        // 哈基米的滑动时间间隔
        setTimeout(function() {    
            img.style.transform = 'translateX(0)';    
        }, 200);    
    }, 3000); 
  
});

最后完备好HTML:

<!DOCTYPE html>    
<html lang="zh">    
<head>    
    <meta charset="UTF-8">    
    <meta name="viewport" content="width=device-width, initial-scale=1.0">    
    <title>哎呦喂,您猜怎么着</title>    
    <link rel="stylesheet" href="/GGboy/Csgo/GGBond.css">    
</head>    
<body>    
    <h1 class="shining-title">学流体力学的爷就是爷</h1>  
    <div class="background-image top-left"></div>    
    <div class="background-image top-right"></div>    
    <div class="background-image bottom-left"></div>    
    <div class="background-image bottom-right"></div> 
    
    <img id="sliding-image" src="/GGboy/images/66.jpg" alt="Moving Image">     
    <script src="/GGboy/jvav/AUV.js"></script> 
 
    <form action="/GGboy/GGBond.php" method="post">  
        <label for="password">请输入密码:</label> 
          <!-- 密码是ggboy  -->
        <input type="password" id="password" name="password">  
        <input type="submit" value="提交">  
    </form>  
      
</body>    
</html>

在VScode打开login.html文件中右键空白处,点击PHP Server:Server project试运行下:

 

 可以看到密码文本框这里效果很好 

 客户页面感觉不太妙啊,但是PHP和Python运行正常,我认为如果上线的话客户是不会投诉的
 


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/408709.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Stable Diffusion 3重磅发布

刚不久&#xff0c;Stability AI发布了Stable Diffusion 3.0&#xff0c;这一版本采用了与备受瞩目的爆火Sora相同的DiT架构。通过这一更新&#xff0c;画面质量、文字渲染以及对复杂对象的理解能力都得到了显著提升。由于这些改进&#xff0c;先前的技术Midjourney和DALL-E 3在…

解决vulhub漏洞环境下载慢卡死问题即解决docker-valhub漏洞环境下载慢的问题

解决vulhub环境下载慢/卡 当前环境为&#xff1a;ubuntu20 1.在 cd /etc/docker/目录下创建或修改daemon.json文件 sudo touch daemon.json编辑daemon.json文件 sudo vim daemon.json2.填写阿里云镜像地址&#xff1a; { "registry-mirrors":["https://6kx…

SWIFT:自我认知微调

文档:https://github.com/modelscope/swift/blob/main/docs/source/LLM/%E8%87%AA%E6%88%91%E8%AE%A4%E7%9F%A5%E5%BE%AE%E8%B0%83%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5.md ​​​​​​代码: Swift是如何把自我认知数据集融合到训练集中呢? 1:相关的3个参数

Java8 Stream API 详解:流式编程进行数据处理

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&…

Vue3中的select 的option是多余的?

背景&#xff1a; 通过Vue3中填充一个下拉框&#xff0c;在打开页面时要指定默认选中&#xff0c;并在选项改变时把下拉框的选中值显示出来 问题&#xff1a; 填充通常的作法是设置 <option v-for"option in cities" :value"option.value" >&a…

【数据结构-字符串 五】【字符串转换】字符串转为整数

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是【字符串转换】&#xff0c;使用【字符串】这个基本的数据结构来实现&#xff0c;这个高频题的站点是&#xff1a;CodeTop&#xff0c;筛选条件为&…

C++ 离散化算法设计原则:压缩的都是精华

公众号&#xff1a;编程驿站 1. 离散化 离散化是离散数学中的概念。离散化算法&#xff0c;指把无限空间中的离散数据映射到一个有限的存储空间中&#xff0c;并且对原数据进行有序索引化。主打压缩的都是精化。 离散化流程&#xff1a; 对离散化数列{235,897,458,7654,458…

Vue.js+SpringBoot开发电子元器件管理系统

目录 一、摘要1.1 项目简介1.2 项目录屏 二、研究内容三、界面展示3.1 登录&注册&主页3.2 元器件单位模块3.3 元器件仓库模块3.4 元器件供应商模块3.5 元器件品类模块3.6 元器件明细模块3.7 元器件类型模块3.8 元器件采购模块3.9 元器件领用模块3.10 系统基础模块 四、…

从源码解析Kruise(K8S)原地升级原理

从源码解析Kruise原地升级原理 本文从源码的角度分析 Kruise 原地升级相关功能的实现。 本篇Kruise版本为v1.5.2。 Kruise项目地址: https://github.com/openkruise/kruise 更多云原生、K8S相关文章请点击【专栏】查看&#xff01; 原地升级的概念 当我们使用deployment等Wor…

苍穹外卖项目微信支付(没有商户号)的解决方法,超详细!!!

今天在写苍穹外卖项目时&#xff0c;写到微信支付时发现个人无法获取商户号&#xff0c;那么今天我就在这里分享一个方法&#xff0c;可以绕过微信支付实现订单支付的功能。本方法仅仅是绕过微信支付&#xff0c;没有进行真正的微信支付&#xff0c;如果想要体验真正的微信支付…

值类型和引用类型详解(C#)

可能你对值类型和引用类型还不太了解。 值类型和引用类型&#xff0c;是c#比较基础&#xff0c;也必须掌握的知识点&#xff0c;但是也不是那么轻易就能掌握&#xff0c;今天跟着我一起来看看吧。 典型类型 首先我们看看这两种不同的类型有哪些比较典型的代表。 典型值类型…

橘子学es原理01之准备工作

es本身是具备很好的使用特性的&#xff0c;我指的是他的部署方面的&#xff0c;至于后期的使用和运维那还是很一眼难尽的。 我们从这一篇开始就着重于es的一些原理性的的一些探讨&#xff0c;当然我们也会有一些操作性的&#xff0c;业务性的会分为多个栏目来写。比如前面我写的…

java面试(并发)

java线程概念&#xff0c;安全&#xff1f; 进程是系统分配资源的最小单元&#xff0c;线程是操作系统调度的最小单位。线程属于进程。 加锁保证安全。1.JVM提供Synchronized关键字&#xff0c;2.jdk提供各种lock锁 实现多线程方式&#xff1f; 1.继承Thread类&#xff0c;…

【奥威-金蝶云星空BI方案】你要的报表,这里都有!

用金蝶云星空来记账&#xff0c;那确实好&#xff0c;但如果让你再去做一份详细的报表呢&#xff1f;自己开发的话&#xff0c;成本大、耗时长&#xff0c;一旦有了新的需求又要一再开发&#xff0c;长此以往将增加使用者使用难度&#xff0c;降低数据分析对运营决策的时效性。…

2024能源动力、机械自动化与航天航空技术国际学术会议(ICEPMAT2024)

2024能源动力、机械自动化与航天航空技术国际学术会议(ICEPMAT2024) 会议简介 能源动力、机械自动化和航空航天技术国际学术会议&#xff08;ICEPMAT2024&#xff09;将于2024年在北京举行。会议将探讨能源动力、机械自动化、航空航天技术领域的新研究热点、核心技术和发展趋…

迷你世界之建筑生成球体

local x0,y0,z00,30,0--起点坐标 local dx,dy,dz60,60,60--外切长方体横纵竖长度 local count,all0,dx*dy*dz--计数&#xff0c;总数 local m,k10000,0--单次生成方块数&#xff0c;无用循环值 local x,y,z0,0,0--当前坐标 local demath.random(2,19)/2 local id600--方块…

在openEuler中通过KVM可视化安装华为FusionCompute的CNA主机

一、环境说明 在Windows物理主机上通过VMware WorkStation创建一个虚拟机&#xff08;4U4C、16GB内存&#xff0c;400GB磁盘&#xff0c;NAT网络连接&#xff09;&#xff0c;在虚拟机中安装openEuler 22.03 LTS系统&#xff0c;并将该虚拟机作为部署 FusionCompute的服务器&a…

【Linux】 yum命令使用

yum命令 yum&#xff08; Yellow dog Updater, Modified&#xff09; 是一个在 Fedora、CentOS 及其它一些基于 RPM 的 Linux 发行版中使用的包管理器。它允许用户自动安装、更新、配置和删除软件包。yum 由 Python 写成&#xff0c;基于 RPM&#xff08;Red Hat Package Mana…

【C语言】linux内核ipoib模块 - ipoib_tx_poll

一、中文注释 这段代码是 Linux 内核网络栈中与 InfiniBand 协议相关的一个部分&#xff0c;特别是与 IP over InfiniBand (IPoIB)相关。该函数负责去处理IPoIB的发送完成队列&#xff08;发送CQ&#xff09;上的工作请求&#xff08;work completions&#xff09;。以下是对这…

微信小程序开发(实战案例):本地生活 - 列表页面开发(动态渲染处理)、节流防抖(节流阀应用)

文章目录 本地生活 - 列表页面开发一、将九宫格分类换成navigator组件二、动态设置商品列表页的 title三、动态渲染商品列表页面四、上拉触底加载数据五、添加Loading加载效果六、数据加载节流防抖处理 本地生活 - 列表页面开发 导入我们上次写的 本地生活 - 首页开发的项目 运…