tp5 备份数据库:use think/Config
public function  mysql()
    {
        @$falg=file_get_contents("./install/sql/database.sql");
        if($falg==true){
            unlink("./install/sql/database.sql");
        }
        set_time_limit(0);
        $config=Config::get('database');
        $link=mysqli_connect($config['hostname'],$config['username'],$config['password']);
        mysqli_select_db($link,$config['database']);
        $res=Db::query("show tables");
        $tabList=array();
        foreach($res as $k=>$v){
            foreach($v as $val){
                array_push($tabList,$val);}
        }
        $to_file_name = "./install/sql/database.sql";
        $info = "-- ----------------------------\r\n";
        $info .= "-- 日期:".date("Y-m-d H:i:s",time())."\r\n";
        $info .= "-- @qq.com\r\n";
        $info .= "-- ----------------------------\r\n\r\n";
        file_put_contents($to_file_name,$info,FILE_APPEND);

//将每个表的表结构导出到文件
        foreach($tabList as $val){
            $sql = "show create table ".$val;

            $row =Db::query($sql);

            $info = "-- ----------------------------\r\n";
            $info .= "-- Table structure for `".$val."`\r\n";
            $info .= "-- ----------------------------\r\n";
            $info .= "DROP TABLE IF EXISTS `".$val."`;\r\n";
            $sqlStr = $info.$row[0]['Create Table'].";\r\n\r\n";
            //追加到文件
            file_put_contents($to_file_name,$sqlStr,FILE_APPEND);

            //将每个表的数据导出到文件
            $sql = "select * from ".$val;
            $res =Db::query($sql);
            //如果表中没有数据,则继续下一张表
            if(empty($res)) continue;
            //
            $info = "-- ----------------------------\r\n";
            $info .= "-- Records for `".$val."`\r\n";
            $info .= "-- ----------------------------\r\n";
            file_put_contents($to_file_name,$info,FILE_APPEND);
            //读取数据

            foreach($res as $key=>$value){
                $row=array_values($value);
                $sqlStr = "INSERT INTO `".$val."` VALUES (";
                foreach($row as $zd){
                    $sqlStr .= "'".mysqli_escape_string($link,$zd)."', ";
                }
                //去掉最后一个逗号和空格
                $sqlStr = substr($sqlStr,0,strlen($sqlStr)-2);
                $sqlStr .= ");\r\n";
                file_put_contents($to_file_name,$sqlStr,FILE_APPEND);
            }
            //释放资源

            file_put_contents($to_file_name,"\r\n",FILE_APPEND);

        }

        $returnData['status'] = 1;
        $returnData['msg'] = "备份成功";
        return json_encode($returnData);

    }

OneinStack自带了Let’s Encrypt安装组件,要配置SSL,仅需要cd到oneinstack目录,执行./addons.sh命令添加组件,如下图:

添加Let’s Encrypt组件

安装完Let's Encrypt组件后,再执行./vhost.sh命令添加新的虚拟主机了。如果是已经存在的虚拟主机,则需要先./vhost.sh del删除虚拟主机后,再执行./vhost.sh命令添加虚拟主机。如下图:
添加虚拟主机

正常情况下,成功添加完虚拟主机后,https站点就部署成功了。但如果是阿里云服务器,则需要在安全组配置中开启443端口。

证书的定时更新(自动部署)

由于Let's Encrypt提供的证书是有期限的,因此需要定期更新。成功添加后,cd /etc 下,crontab -l查看定时任务

生成的定时任务

执行一下定时脚本中的代码,如下图:

脚本执行结果,反馈已经成功更新

30 2 1 表示每周一早上2点30分执行一次证书更新请求。

附原文:oneinstack配置https
附另一篇(推荐):配置https

前言:因为emoji占四个字符,而默认的utf8最多只是3个,所以会乱码,而utf8mb4是支持的
最新版的mysql 7是默认支持emoji表情的,不用任何配置,其他版本的必须得在5.5.3以上的版本才支持utf8mb4;

一、修改mysql配置文件:(我用的是oneinstack。在etc/my.conf)

default-character-set = utf8mb4
character-set-server = utf8mb4

二、把数据库、表、字段的字符集设置为utf8mb4(SQL语句或者Navicat工具控制)

# 修改数据库:  
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;  
# 修改表:  
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;  
# 修改表字段:  
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;  
PS:我用的是tp5框架,database配置里数据库默认编码里改为:'charset' => 'utf8mb4';

三、检查环境变量 和测试 SQL 如下:(设置:set NAME utf8mb4)

mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';  
+--------------------------+--------------------+  
| Variable_name            | Value              |  
+--------------------------+--------------------+  
| character_set_client    | utf8mb4            |  
| character_set_connection | utf8mb4            |  
| character_set_database  | utf8mb4            |  
| character_set_filesystem | binary            |  
| character_set_results    | utf8mb4            |  
| character_set_server    | utf8mb4            |  
| character_set_system    | utf8              |  
| collation_connection    | utf8mb4_unicode_ci |  
| collation_database      | utf8mb4_unicode_ci |  
| collation_server        | utf8mb4_unicode_ci |  
+--------------------------+--------------------+  

以上即可。

上传图片有两种,一种是base64直接保存,一种是简单配置一下;

基本实例化
var E = window.wangEditor;
var editor = new E('#editor');
editor.create();
一、 一种是base64直接保存,但是值太长,保存到数据库不友好,不建议,但是简单,直接开启就行
editor.customConfig.uploadImgShowBase64 = true;//开启即可用
二、 第二种是非base64,需要配置一下,
editor.customConfig.uploadImgServer = 'admin/Information/mww';//定义后台接收地址
editor.customConfig.uploadFileName = 'thumb';//自定义名字,后台$_FILES接收
editor.customConfig.uploadImgMaxSize = 2 * 1024 * 1024;//限制2M
editor.customConfig.uploadImgHooks = {//监听图片上传的步骤过程
     customInsert: function (insertImg, result, editor) {
            // 图片上传并返回结果,自定义插入图片的事件(而不是编辑器自动插入图片!!!)
            // insertImg 是插入图片的函数,editor 是编辑器对象,result 是服务器端返回的结果
            // 举例:假如上传图片成功后,服务器端返回的是 {url:'....'} 这种格式,即可这样插入图片:
            var url = result.url;
            insertImg(url)
            // result 必须是一个 JSON 格式字符串!!!否则报错
        }
    };
后台接收并处理(只是示例,只做简单的上传操作而已),返回图片路径,一定要是json格式的
public function mww(){
        $dir = $_SERVER['DOCUMENT_ROOT'];
        $url =  "http://".$_SERVER['HTTP_HOST'];
        if(!empty($_FILES['thumb']['tmp_name'])){
            //=======重命名=====
            $rand = date('YmdHis').rand(100000,999999);
            $exe = explode('.',$_FILES['thumb']['name']);
            $exe = end($exe);
            $newName = $rand . '.' .$exe;
            //=======================
            if(move_uploaded_file($_FILES['thumb']['tmp_name'],"{$dir}/upload/{$newName}")){
                $url = "{$url}/upload/{$newName}";
                return json_encode(['status'=>200,'url'=>$url]);
            }else{
                return json_encode(['status'=>0,'msg'=>'图片保存失败']);
            }
        }
    }
PS:这两种只能使用一种,不能同时使用,且必须都在editor.create();之前使用
PS2:其他参数和功能详见官网

PHP
    /****
     * @return \think\response\Json
     * 根据经纬度获取地址
     */
    public function getAddressByLatLon(){
        extract(input());
        $longitude = $lon;//用户当前定位的经度118.73893
        $latitude = $lat;//用户当前定位的纬度31.939964
        $place_url = 'http://api.map.baidu.com/geocoder/v2/?location='.$latitude.','.$longitude.'&               
output=json&ak=dsOE1fqvrdIPMRqZW8WYylBO36mWHVSp';
//$place_url="https://maps.googleapis.com/maps/api/geocode/json?latlng=40.714224,-73.961452&key=YOUR_API_KEY";
        $json_place = file_get_contents($place_url);
        $place_arr = json_decode($json_place,true);
        $address = $place_arr['result']['formatted_address'];
        return json(array('status'=>200,'msg'=>$address));
    }
JS
<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="chrome=1">
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
    <style type="text/css">
      body,html,#container{
        height: 100%;
        margin: 0px
      }
      .panel {
        background-color: #ddf;
        color: #333;
        border: 1px solid silver;
        box-shadow: 3px 4px 3px 0px silver;
        position: absolute;
        top: 10px;
        right: 10px;
        border-radius: 5px;
        overflow: hidden;
        line-height: 20px;
      }
      #input{
        width: 250px;
        height: 25px;
        border: 0;
      }
    </style>
    <title>地址与经纬度</title>
    
  </head>
  <body>
   <div id="container" tabindex="0"></div>
   
   <script type="text/javascript" src="https://webapi.amap.com/maps?v=1.4.2&key=5a18100022aa01e213a9b2680f7ccbf9"></script>
   <script type="text/javascript">
    var map = new AMap.Map('container',{
            resizeEnable: true,
            zoom: 13,
            center: [116.39,39.9]
    });
    AMap.plugin('AMap.Geocoder',function(){
        var geocoder = new AMap.Geocoder({
            city: "010"//城市,默认:“全国”
        });
        
        var lnglatXY=[118.765084, 31.969888];//地图上所标点的坐标
        geocoder.getAddress(lnglatXY, function(status, result) {
        if (status === 'complete' && result.info === 'OK') {
           //获得了有效的地址信息:
result.regeocode.addressComponent打印这个获取具体信息
result.regeocode.addressComponent['district']//区
           alert(result.regeocode.formattedAddress)
        }else{
           //获取地址失败
        }
});  
        
       

    });
   </script>
   <script type="text/javascript" src="https://webapi.amap.com/demos/js/liteToolbar.js"></script>
    
  </body>
</html>