网页开发:MySQL和Python案例

news2025/1/13 10:14:45

目录

一、MySQL的概念和引入

二、MySQL指令

1、数据库管理(文件夹)

2、数据表的管理(文件)

3、数据行操作

 三、常用的数据类型

四、员工管理案例

1、使用MySQL内置工具(命令)

 2、Python代码实现

①创建数据

② 动态创建数据

③查询数据

④删除数据

⑤修改数据

五、案例:Flask+MySQL

1、新增用户

2、查询用户


一、MySQL的概念和引入

  • Python相关:基础、函数、数据类型、面向、模块。
  • 前端开发:HTML、CSS、JavaScript、jQuery【静态页面】

Java+前端 ; Python+前端 ; Go+前端   ->【动态页面】

 直观:

  • 静态页面 = 写死了,页面永远长一个样子。
  • 动态页面 = 页面上的数据可以实时修改和展示。

动态:需要Web框架的功能

 简单的Flask网页

from flask import Flask, render_template

app = Flask(__name__)


@app.route('/index')
def index():
    # 目前写死:读取文件
    users = ["派大星", "海绵宝宝", "章鱼哥"]
    # 1.找到index.html的文件,读取所有内容
    # 2.找到内容中‘特殊的占位符’,将数据替换
    # 3.将替换完成的字符串返还给用户的浏览器
    return render_template("index.html", title="派大星",data_list = users)


if __name__ == '__main__':
    app.run()
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

    <link href="/static/plugins/bootstrap-3.3.7-dist/css/bootstrap.css" rel="stylesheet">
</head>
<body>
<nav class="navbar navbar-default">
  <div class="container-fluid">
    <div class="navbar-header">
      <a class="navbar-brand" href="#">
        <img alt="Brand" src="/static/img/img.png">
      </a>
    </div>
  </div>
</nav>
<div class="container">
    <h3>{{title}}</h3>
    <table class="table table-bordered">
        <caption>Optional table caption.</caption>
        <thead>
        <tr>
            <th>#</th>
            <th>First Name</th>
            <th>Last Name</th>
            <th>Username</th>
        </tr>
        </thead>
        <tbody>
        {% for item in data_list %}
        <tr>
            <th scope="row">1</th>
            <td>{{item}}</td>
            <td>Otto</td>
            <td>@mdo</td>
        </tr>
        {% endfor %}
        </tbody>
    </table>
</div>

<script src="static/js/jQuery.js"></script>
<script src="static/plugins/bootstrap-3.3.7-dist/js/bootstrap.js"></script>
</body>
</html>

 对于目前的我们来看,什么可以做数据的存储:

  • txt文件
  • excel文件
  • 存储数据地方(专业的软件):数据库管理系统。

MySQL/Oracke/SQLServer/DB2/Access...

二、MySQL指令

在MySQL和我们平时认知不同的概念

MySQL认知
数据库文件夹
数据表文件(EXCEL文件)

1、数据库管理(文件夹)

  • 查看已有的数据库(文件夹)
show databases;
  •  创建数据库(文件夹)
create database 数据库名字 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
  • 删除数据库(文件夹)
drop database 数据库名字;
  • 进入数据库(进入文件夹)
use 数据库名称;

2、数据表的管理(文件)

  •  查看文件夹下所有的数据表(文件)
show tables;
  • 创建表
create table 表名称(
	列名称 类型,
	列名称 类型,
	列名称 类型
) default charset=utf8;
create table tb1(
	id int,                      -- 允许为空(默认)
	name varchar(16) not null,   -- 不允许为空
	age int default 3            -- 插入数据时,age列的默认值为3                   
) default charset=utf8;

create table tb1(
	id int primary key,			--主键(不允许为空,不允许重复)
	name varchar(16),
	age int
) default charset=utf8;

主键一般用于表示当前的数据的编号(类似于人的身份证号)

create table tb1(
	id int auto_increment primary key,		--内部维护,自增
	name varchar(16),
	age int
) default charset=utf8;

一般情况下创建表的时候都是这么来写:

create table tb1(
	id int not null auto_increment primary key,
	name varchar(16),
	age int
) default charset=utf8; 
  • 删除表
drop table 表名称;

3、数据行操作

  • 新增数据 
insert into 表名称(字段1, 字段2, ...) values(1, "张三", ...);

example

insert into tb1(name,age) values("张三",25);
  •  查询数据
select 字段名(或者*) from 表名称;
select 字段名(或者*) from 表名称 where 条件;
mysql> select * from tb1;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  1 | 张三   |   25 |
+----+--------+------+

mysql> select name from tb1;
+--------+
| name   |
+--------+
| 张三   |
+--------+

mysql> select * from tb1 where id = 1;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  1 | 张三   |   25 |
+----+--------+------+

  • 删除数据
delete from 表名称;				--删除所有数据
delete from 表名称 where 条件;	--删除指定数据
delete from tb1 where id = 1;
delete from tb1 where id = 1 and name = "张三";
delete from tb1 where id = 1 or id = 100;
delete from tb1 where id > 100;
delete from tb1 where id != 50;
delete from tb1 where id in (10,15);
  • 修改数据
update 表名称 set 列 = 值;				--修改一列
update 表名称 set 列 = 值, 列 = 值;		--修改多列
update 表名称 set 列 = 值 where 条件;		--修改某行某列
update tb1 set name="李四" where id = 1;
update tb1 set age=age+10 where name=""李四;

 三、常用的数据类型

  • int

有符号, 取值范围: -2147483648 ~ 2147483647(有正有负)
无符号, 取值范围: 0 ~ 4294967295(只有正)  【默认】

  • tinyint

有符号, 取值范围: -128 ~ 127(有正有负)
无符号, 取值范围: 0 ~ 255(只有正)

create table tb2(
	id int not null auto_increment primary key,
	age tinyint				--有符号, 取值范围: -128 ~ 127
) default charset=utf8;
create table tb1(
	id int not null auto_increment primary key,
	age tinyint unsigned	--无符号, 取值范围: 0 ~ 255
) default charset=utf8;
  • bigint

有符号, 取值范围: -9223372036854775808 ~ 9223372036854775807(有正有负)
无符号, 取值范围: 0 ~ 18446744073709551615(只有正)

练习

# 创建表

create table tb2(
	id bigint not null auto_increment primary key,
    salary int,
	age tinyint	
) default charset=utf8;

# 插入数据
insert into tb2(salary,age)values(10000,18);
insert into tb2(salary,age)values(20000,28);
insert into tb2(salary,age)values(30000,38),(40000,40);

# 查看表中的数据
select * from tb2;

  •  float
  • double
  • decimal

准确的小数值,m是数字总个数(负号不算),d是小数点后个数,m最大值为65,d的最大值为30

create table tb1(
	id int auto_increment primary key,		--内部维护,自增
	name varchar(16),
	salary decimal(8,2)						--一共8位(整数位数+小数点位数), 保留小数点后2位
) default charset=utf8;
  • char

定长字符串, 默认固定用 11 个字符串进行存储,哪怕字符串个数不足,也按照11个字符存储
最多能存储255个字节的数据
查询效率高

  • varchar

变长字符串,默认最长 11 个字符,真实数据多长就按多长存储
最多能存储 65535 个字节的数据,中文可存储 65535/3 个汉字
相对 char 类型,查询效率低

  • text

保存变长的大字符串,可以最多到 65535 个字符
一般用于文章和新闻

  • mediumtext
  • longtext
  • datatime

YYYY-MM-DD HH:MM:SS (1000-01-01 00:00:00/9999-12-31 23:59:59)

  • data

YYYY-MM-DD (1000-01-01/9999-12-31)

四、员工管理案例

1、使用MySQL内置工具(命令)

  1. 创建数据库:unicom
  2. 数据一张表:admin

表名:admin

列: 

  • id 整型 自增 主键
  • username: 字符串 不为空
  • password: 字符串 不为空
  • mobile: 字符串 不为空
mysql> create database unicom DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
Query OK, 1 row affected (0.00 sec)

mysql> use unicom
Database changed
mysql> create table admin(
    -> id int auto_increment primary key,
    -> username varchar(30) not null,
    -> password varchar(30) not null,
    -> mobile varchar(20) not null)default charset=utf8;
Query OK, 0 rows affected (0.02 sec)

mysql> desc admin;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| id       | int(11)     | NO   | PRI | NULL    | auto_increment |
| username | varchar(30) | NO   |     | NULL    |                |
| password | varchar(30) | NO   |     | NULL    |                |
| mobile   | varchar(20) | NO   |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

 2、Python代码实现

安装pymysql

pip install pymysql

①创建数据

import pymysql

# 1.连接MySQL
conn = pymysql.connect(host="127.0.0.1", port=3306, user='root', password="123123", charset='utf8', db='unicom')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

# 2.发送指令
cursor.execute("insert into admin(username, password, mobile) values('Patrickstar', '123456', '12345678912');")
conn.commit()

# 3.关闭
cursor.close()
conn.close()
mysql> select * from admin;
+----+-------------+----------+-------------+
| id | username    | password | mobile      |
+----+-------------+----------+-------------+
|  1 | Patrickstar | 123456   | 12345678912 |
+----+-------------+----------+-------------+
1 row in set (0.00 sec)

优化

import pymysql

# 1.连接Mysql
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123123', charset='utf8', db='unicom')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

# 2.发送指令
sql = "insert into admin(username, password, mobile) values(%s, %s, %s);"
cursor.execute(sql, ['babe', '123456', '15555555555'])
conn.commit()

# 3.关闭
cursor.close()
conn.close()

注意: sql语句不要使用字符串格式化,有会SQL注入的风险,需要使用 cursor.execute(sql, [参数1, 参数2, …])

② 动态创建数据

import pymysql

while True:
    user = input("用户名:")
    if user.upper() == 'Q':
        break
    pwd = input("密码:")
    mobile = input("手机号:")

    # 1.连接Mysql
    conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123123', charset='utf8', db='unicom')
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

    # 2.发送指令
    sql = "insert into admin(username, password, mobile) values(%s, %s, %s);"
    cursor.execute(sql, [user, pwd, mobile])
    conn.commit()

    # 3.关闭
    cursor.close()
    conn.close()

③查询数据

#!/usr/bin/env python3

import pymysql

# 1.连接Mysql
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root',
                       passwd='123123', charset='utf8', db='unicom')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

# 2.发送指令
sql = "select * from admin where id > %s"
cursor.execute(sql, [2, ])
# data_list = cursor.fetchall()		查询一条数据,为字典
data_list = cursor.fetchall()
# 查询所有符合条件的数据,为列表套多个字典
for row_dict in data_list:
    print(row_dict)

# 3.关闭
cursor.close()
conn.close()

④删除数据

#!/usr/bin/env python3

import pymysql

# 1.连接Mysql
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root',
                       passwd='123123', charset='utf8', db='unicom')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

# 2.发送指令
sql = "delete from admin where id > %s"
cursor.execute(sql, [3, ])
conn.commit()

# 3.关闭
cursor.close()
conn.close()

⑤修改数据

#!/usr/bin/env python3

import pymysql

# 1.连接Mysql
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root',
                       passwd='123123', charset='utf8', db='unicom')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

# 2.发送指令
sql = "update admin set mobile=%s where id = %s"
cursor.execute(sql, ['12332145665', 3])
conn.commit()

# 3.关闭
cursor.close()
conn.close()

五、案例:Flask+MySQL

1、新增用户

html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <h1>添加用户</h1>
    <form method="post" action="/add/user">
        <input type="text" name="user" placeholder="用户名">
        <input type="text" name="pwd" placeholder="密码">
        <input type="text" name="mobile" placeholder="手机号">
        <input type="submit" value="提 交">
    </form>
</body>
</html>

app.py

from flask import Flask, render_template, request
import pymysql

app = Flask(__name__)


@app.route("/add/user", methods=["GET", "POST"])
def add_user():
    if request.method == "GET":
        return render_template("add_user.html")

    username = request.form.get("user")
    password = request.form.get("pwd")
    mobile = request.form.get("mobile")

    # 1.连接MySQL
    conn = pymysql.connect(host="127.0.0.1", port=3306, user='root', password="123123", charset='utf8', db='unicom')
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

    # 2.发送指令
    sql = "insert into admin(username, password, mobile) values(%s, %s, %s);"
    cursor.execute(sql, [username, password, mobile])
    conn.commit()

    # 3.关闭
    cursor.close()
    conn.close()

    return "添加成功"


if __name__ == '__main__':
    app.run()

2、查询用户

html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <h1>用户列表</h1>
    <table border="1">
        <thead>
            <tr>
                <th>ID</th>
                <th>姓名</th>
                <th>密码</th>
                <th>手机号</th>
            </tr>
        </thead>
        <tbody>
            {% for item in data_list %}
            <tr>
                <td>{{ item.id }}</td>
                <td>{{ item.username }}</td>
                <td>{{ item.password }}</td>
                <td>{{ item.mobile }}</td>
            </tr>
            {% endfor %}
        </tbody>
    </table>
</body>
</html>

app.py

from flask import Flask, render_template, request
import pymysql

app = Flask(__name__)


@app.route("/add/user", methods=["GET", "POST"])
def add_user():
    if request.method == "GET":
        return render_template("add_user.html")

    username = request.form.get("user")
    password = request.form.get("pwd")
    mobile = request.form.get("mobile")

    # 1.连接MySQL
    conn = pymysql.connect(host="127.0.0.1", port=3306, user='root', password="123123", charset='utf8', db='unicom')
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

    # 2.发送指令
    sql = "insert into admin(username, password, mobile) values(%s, %s, %s);"
    cursor.execute(sql, [username, password, mobile])
    conn.commit()

    # 3.关闭
    cursor.close()
    conn.close()

    return "添加成功"


@app.route("/show/user", methods=['GET', 'POST'])
def show_user():
    username = request.form.get('user')
    password = request.form.get('pwd')
    mobile = request.form.get('mobile')

    # 1.连接Mysql
    conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='123123', charset='utf8', db='unicom')
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

    # 2.发送指令
    sql = "select * from admin"
    cursor.execute(sql)
    data_list = cursor.fetchall()

    # 3.关闭
    cursor.close()
    conn.close()

    return render_template("show_user.html", data_list=data_list)


if __name__ == '__main__':
    app.run()

 优化之后

加入 bootstrap.css

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>

    <link rel="stylesheet" href="../static/plugins/bootstrap-3.3.7-dist/css/bootstrap.css">

</head>
<body>
    <div class="container">
        <h1>用户列表</h1>
        <table class="table table-bordered">
            <thead>
                <tr>
                    <th>ID</th>
                    <th>姓名</th>
                    <th>密码</th>
                    <th>手机号</th>
                </tr>
            </thead>
            <tbody>
                {% for item in data_list %}
                <tr>
                    <td>{{ item.id }}</td>
                    <td>{{ item.username }}</td>
                    <td>{{ item.password }}</td>
                    <td>{{ item.mobile }}</td>
                </tr>
                {% endfor %}
            </tbody>
        </table>
    </div>

</body>
</html>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux学习之常用基本命令【2】

文章目录一 文件内容查看1.1 catcatcat 由第一行开始显示1.2 tactactac 由最后一行开始显示1.3 nlnlnl 显示行号1.4 moremoremore 翻页1.5 lesslessless 翻页1.6 headheadhead 显示前几行1.7 tailtailtail 显示后几行1.8 拓展&#xff1a;LinuxLinuxLinux 链接概念二 VimVimVim…

Ubuntu18.04.6 配置固定ip、ssh登录、root账号

上文讲解了如何下载安装ubuntu&#xff0c;https://blog.csdn.net/weixin_47491957/article/details/128839639 ubuntu在安装完成后&#xff0c;是不能进行ssh登录、且没有root账号&#xff0c;本文带来如何配置ssh登录及root账号 在做这些设置之前&#xff0c;我们要确定ip固…

【手写 Promise 源码】第十三篇 - Promise.allsettled 和 Promise.any 的实现

一&#xff0c;前言 上一篇&#xff0c;主要实现了 Promise 静态 API&#xff08;类方法&#xff09;&#xff1a;Promise.race&#xff0c;主要涉及以下几个点&#xff1a; 测试原生 Promise.race 的使用&#xff1b;Promise.race 的功能与特性分析&#xff1b;Promise.race…

10、声明和创建字符串

目录 一、声明字符串 二、创建字符串 &#xff08;1&#xff09;String(char a[]) &#xff08;2&#xff09;String(char a[], int offset, int length) &#xff08;3&#xff09;String(char[] value) 一、声明字符串 在Java语言中字符串必须包含在一对双引号&#xf…

记录每日LeetCode 2325.解密消息 Java实现

题目描述&#xff1a; 给你字符串 key 和 message &#xff0c;分别表示一个加密密钥和一段加密消息。解密 message 的步骤如下&#xff1a; 使用 key 中 26 个英文小写字母第一次出现的顺序作为替换表中的字母 顺序 。 将替换表与普通英文字母表对齐&#xff0c;形成对照表。…

【Flink】详解StreamGraph

概述 没有看上一期的小伙伴请先看上一期【Flink】浅谈Flink架构和调度&#xff0c;上一期的一个核心内容就是 Flink 中的执行图可以分成四层&#xff1a;StreamGraph → JobGraph → ExecutionGraph → 物理执行图。 今天我们好好谈论一下StreamGraph&#xff0c;StreamGraph…

WPF MaterialDesignIn 收银系统(2)主界面

前言 接上一篇&#xff0c;既然登陆页面搞定了&#xff0c;接下来就是登陆成功后跳转的主界面了。 界面 思考 到了这一步&#xff0c;我们就要开始思考&#xff0c;怎么来丰富我们的应用&#xff0c;最少需要哪些东西、功能、模块、数据等等&#xff0c;才能支撑起一个收银系统…

java分支语句

流程控制1.1流程控制语句概述1.2流程控制语句分类顺序结构顺序结构是程序中最简单最基本的结构。分支结构(if,switch)循环结构(for,while,do...while)if语句2.1if语句格式1//格式 if(关系表达式){ 语句体&#xff1b; }执行流程&#xff1a;首先计算关系表达式的值如果关系表达…

每日一练10——井字棋密码强度等级

文章目录井字棋思路&#xff1a;代码&#xff1a;密码强度等级思路&#xff1a;代码&#xff1a;井字棋 题目链接&#xff1a; 思路&#xff1a; 井字棋&#xff0c;是一种在3*3格子上进行的连珠游戏&#xff0c;三个相同就代表获胜。 井字棋有四种情况表示当前玩家获胜&…

MySQL 面试题(一):索引失效的几种情况

❤️ 博客首页&#xff1a;水滴技术 &#x1f680; 支持水滴&#xff1a;点赞&#x1f44d; 收藏⭐ 留言&#x1f4ac; &#x1f338; 订阅专栏&#xff1a;MySQL 教程&#xff1a;从入门到精通 文章目录一、like 以通配符 % 开头的索引会失效二、is not null 无法使用索引&a…

SGI STL二级空间配置器源码剖析(1)

之前大概写过SGI STL相关的东西有关SGI STL&#xff0c;讲了讲空间配置器的原理&#xff0c;这一系列就剖析一下源码。 目录 下面就看看重要成员信息&#xff1a; 两个辅助接口函数&#xff1a; 关于C的STL的空间配置器allocator的实现就是分了四部分&#xff1a; allocate&…

云原生学习——容器的基本概念和Kubernetes 核心概念

https://developer.aliyun.com/learning/course/572/detail/7786什么是容器(Container)&#xff1f;什么是镜像(docker)&#xff1f;分层和复用运行后名称为 demo&#xff0c;进程是top命令二、容器的生命周期数据卷是一个特殊的目录四、容器 VS VM虚拟机一、什么是 Kubernetes…

KD:Distilling the Knowledge in a Neural Network 原理与代码解析

paper&#xff1a;Distilling the Knowledge in a Neural Networkcode&#xff1a;https://github.com/megvii-research/mdistiller/blob/master/configs/cifar100/kd.yaml存在的问题训练阶段&#xff0c;我们可以不考虑计算成本和训练时间&#xff0c;为了更高的精度训练一个很…

小程序提升篇-npm、数据共享、分包、自定义tabBar

npm 包的使用1.1 npm限制小程序支持npm第三方包&#xff0c;提高开发效率&#xff0c;有以下三种限制&#xff1a;不支持依赖node.js内置库包不支持依赖浏览器内置对象的包不支持依赖C插件的包限制较多&#xff0c;因此小程序可以使用的包不多1.2 Vant Weapp是一套开源的小程序…

带你读懂——频率响应与采样频率之间的关系

频响范围 频率响应&#xff1a;不同频率下的输入信号经过系统后响应之后的输出信号增益。大白话就是&#xff0c;输入信号频率是xxx Hz&#xff0c;幅值为yyy mg&#xff0c;观察此时的输出信号幅值为AyAyAy mg&#xff0c;此时升高或降低了AAA倍。 电压增益计算公式&#xff…

浅读人月神话笔记(2)

读书笔记&#xff1a;今日翻书浅读&#xff0c;从《为什么巴比伦塔会失败》开始至《干将莫邪》结束&#xff0c;巴比伦塔的建造对当下项目推进有广泛借鉴意义&#xff0c;今天这几个章节在PMBOK中有一些可以互相对照学习的内容&#xff0c;《为什么巴比伦塔会失败&#xff1f;》…

RPA自动化办公04——软件自动化(excel,word,浏览器)

参考&#xff1a;软件自动化_UiBot开发者指南 虽然我们可以使用前面的鼠标点击等操作打开excel表然后写入什么的&#xff0c;但是直接用Uibot里面的命令会更方便。 Excel 在旁边的命令里面打开excel簿 随便选一个excel表实验一下&#xff0c;然后读取区域&#xff0c;可以选。…

使用字典快速获取唯一值与重复值【单个字典对象】

在以前的博客《使用字典快速获取唯一值与重复值&#xff08;交集与并集&#xff09;》使用多个字典对象获取交集与并集&#xff0c;最近有同学提问&#xff0c;是否可以只使用一个字典对象实现相同的功能&#xff0c;对于有“编程洁癖”的同学来说&#xff0c;可能不喜欢使用多…

记录:windows+opencv3.4.16+vs2013+cmake编译

环境&#xff1a;vs2013,x64&#xff0c;opencv3.4.16&#xff0c;cmakeopencv官网&#xff1a;https://opencv.org/releases/1、opencv source下载&#xff1a;因为想用vs2013&#xff0c;现在opencv官网windows版安装包只有vc14和vc15了&#xff0c;只能自己编译了。找一个自…

良心无广的3款软件,每一款都逆天好用,且用且珍惜

闲话少说&#xff0c;直上干货&#xff01; 1、清浊 清浊是一款强大到离谱的国产手机清理APP&#xff0c;追求简约至上&#xff0c;界面非常清爽&#xff0c;无任何弹弹屏广告&#xff0c;值得关注的是&#xff0c;这款软件完全免费使用&#xff0c;常规清理、应用清理、空文件…