作者归档:admin

Thinkphp 时间戳 软删除 更新 插入

数据库中得有3个

  • create_time
  • update_time
  • delete_time

且这三个为int 默认NULL

插入数据和修改数据 必须使用save
即使用对象操作。若使用insert 则不可以
create 和save 来实现时间戳

使用SAVE来插入数据:但是save返回值成功1 失败false 无法返回ID

$user = new User();
$user->name = 'thinkphp';
$user->save();
echo $user->create_time; // 输出类似 2016-10-12 14:20:10
echo $user->update_time; // 输出类似 2016-10-12 14:20:10

CREATE 来插入数据,可以返回ID

$userData = [
    'name' => '张三',
    'email' => 'zhangsan@example.com',
];
// 使用 create 方法插入数据

$user = User::create($userData);
echo $user->id;//插入后的ID

更新数据SAVE

#update
$result = User::where('id', $userId)->update($updateData);
$user=User::find($userId);
echo $user->update_time;//UPDATE时间

#save 1
$user=User::find($userId);
$user->name="Tom";
$user->save();
echo $user->update_time;//UPDATE时间

#save 2
$result = User::where('id', $userId)->save($updateData);
$user=User::find($userId);
echo $user->update_time;//UPDATE时间

配置:

<?php
namespace app\portal\model;
use think\facade\Db;
use think\Model;
use app\portal\model\LoanModel;
use think\model\concern\SoftDelete;

class HmModel extends Model
{
    /**
     * 模型名称
     * @var string
     */
    use SoftDelete;
    protected $name = 'hm';
    protected $autoWriteTimestamp=true;
    protected $deleteTime="delete_time";

软删除:必须使用对象操作

$Hm=new HmModel();
$j=$Hm->find(1);
$j->delete();
$j=$Hm->where('xh',11)->select();
$j->delete();

#或者
$j=$Hm->where('xh',11)->select()->delete();

软删除下的错误删除范例

$Hm->where('xh',11)->delete();

在软删除开启的情况下,上面的语句会执行失败!

UI固件 gooey gooeypie Python 【TAG】

gooey
pip install gooey -i https://mirrors.aliyun.com/pypi/simple

gooeypie 这个更方便,python>3.6即可
pip install gooeypie -i https://mirrors.aliyun.com/pypi/simple

gooeypie的文档:https://www.gooeypie.dev/widgetshttps://www.gooeypie.dev/widgets

综合来看 gooeypie非常方便,插个眼,以后备用。

CD-R 刻录TAG

  • 第一步:

你希望如何使用此光盘?
选择:用于 CD/DVD 播放机

  • 第二步:刻录音频 CD

按计算机上可以播放的数据将音乐文件刻录到光盘,或者以家庭或汽车音响可以播放的格式刻录。
你想使用哪种格式?
选择:生成一张数据 CD(供计算机和某些 CD 播放机播放)(D)

发现个自动化运维爬虫 的好东西seleniumbase

神仙玩意儿,基于selenium,方便管理使用。

https://seleniumbase.io/

pip install seleniumbase 安装好了第一次执行会从GoogleAPI自动下载对应的chrome driver ,特别适合部署再VPS上执行(启动无头模式 headless=True)

看代码:

from seleniumbase import SB

with SB(test=True, uc=True) as sb:
    sb.open("https://google.com/ncr")
    sb.type('[title="Search"]', "SeleniumBase GitHub page\n")
    sb.click('[href*="github.com/seleniumbase/"]')
    sb.save_screenshot_to_logs()  # ./latest_logs/
    print(sb.get_page_title())

卧槽 !你看到了吗:

sb.open()打开网页 ,

sb.click中使用js的选择器,

sb.type 就改变input标签的里面的信息。

牛的来了 还可以过cloudflare

from seleniumbase import SB

with SB(uc=True, test=True, locale="en") as sb:
    url = "https://gitlab.com/users/sign_in"
    sb.activate_cdp_mode(url)
    sb.uc_gui_click_captcha()

    sb.sleep(2)

看看这个行云流水的操作:

from seleniumbase import BaseCase
BaseCase.main(__name__, __file__)  # Call pytest

class MyTestClass(BaseCase):
    def test_swag_labs(self):
        self.open("https://www.saucedemo.com")
        self.type("#user-name", "standard_user")
        self.type("#password", "secret_sauce\n")
        self.assert_element("div.inventory_list")
        self.click('button[name*="backpack"]')
        self.click("#shopping_cart_container a")
        self.assert_text("Backpack", "div.cart_item")
        self.click("button#checkout")
        self.type("input#first-name", "SeleniumBase")
        self.type("input#last-name", "Automation")
        self.type("input#postal-code", "77123")
        self.click("input#continue")
        self.click("button#finish")
        self.assert_text("Thank you for your order!")
  • assert_element
  • assert_exact_text
  • assert_text
  • type
  • click
  • click_link
  • open
  • js_click
  • go_back
from seleniumbase import sb

with SB(test=True, uc=True) as sb:
    sb.open("https://el.psy.congroo.com")
    quotes = sb.find_elements("h1")
    for quote in quotes:
        print(quote.text)

无头浏览器:

from seleniumbase import SB

with SB(headless=True) as sb:
    sb.open("https://el.psy.congroo.com")
    quotes = sb.find_elements("h1")
    for quote in quotes:
        print(quote.text)
    sb.save_screenshot("webpage_screenshot.png")
    print("截图已保存为 webpage_screenshot.png")    

好东西Eel 模块【需要安装chrome】

python下的eel。可以结合HTML JS CSS创建UI

1.可以从外界引入css 和JS (CDN),目前bootstrap 和Jquery完全没问题

2.在头部引入 <script type="text/javascript" src="/eel.js"></script> 即可,在JS里面可以调用Python的函数方法,即

eel.say_hello(name)(function(result) {
                document.getElementById("greeting").innerHTML = result;
            });

使用ell.函数名称(传递参数)(function(result) {

document.getElementById(“greeting”).innerHTML = result;

});

(对于python函数返回的结果result处理)

也就是说,该应用的所有网络请求可以在python里面完成,不需要使用AJAX,JS只需要页面交互,其实这样搞个FFMPEG的UI倒是非常简单 233333333333。

其中python 中定义函数需要使用装饰器来暴露这个函数

@eel.expose
def say_hello(name):
    return f"Hello, {name}!"

3.最关键是可以打包成EXE格式

打包当前目录所有文件,且以main.py为运行文件,且不显示命令行

pyinstaller --onefile -w --add-data=".:." main.py

坑点

需要运行端安装Chrome浏览器才能使用,如果使用chrome便携版 则可能无法使用。

解决方法 Chromium Embedded Framework (CEF) 

pip install cefpython3

他仅支持3.9 pass


代码示例

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Eel应用</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
    <link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
    <!-- eel.js必须引入,这点其实很像wasm模式 -->
    <script type="text/javascript" src="/eel.js"></script>
</head>
<body class="container">
   <h1>欢迎</h1>
   <div class="row">
        <div class="col-md-6"><button class="btn btn-info" id="abc">ABC</button></div>
        <div class="col-md-6">
            <input type="text" id="name" placeholder="请输入你的名字" class="form-control"/>
            <button onclick="sayHello()" class="btn btn-success" id="hello">打招呼</button>
        </div>
   </div>
    
    <div class="row">
        <div id="greeting"></div>
            <button onclick="getJoke()">讲个笑话</button>
            <div id="joke"></div>
    </div>
    

    <script type="text/javascript">
        function sayHello() {
            var name = document.getElementById("name").value;
            eel.say_hello(name)(function(result) {
                document.getElementById("greeting").innerHTML = result;
            });
        }

        function getJoke() {
            eel.get_joke()(function(joke) {
                document.getElementById("joke").innerHTML = joke;
            });
        }
        $("#abc").click(function(){
            var name=prompt("your name?")
            $("#name").val(name)
            $("#hello").click()
        })
    </script>
</body>
</html>

main.py

import eel
import random

# 笑话列表
jokes = [
    "为什么电脑经常生病?因为窗户(Windows)总是开着!",
    "为什么数学书看起来总是很悲伤?因为它里面有太多的问题(problems)",
    "为什么海洋里没有电脑?因为它们总是遇到短路(seals)",
    "为什么冰块感觉很高冷?因为它的幽默感都冻结了。"
]

@eel.expose
def get_joke():
    return random.choice(jokes)

@eel.expose
def say_hello(name):
    return f"Hello, {name}!"

if __name__ == "__main__":
    eel.init(".") #如果是文件夹,就写文件夹名字,我这里html跟python同级
    eel.start("index.html", size=(400, 500))