Rumah php教程 php手册 备份数据库

备份数据库

Jun 07, 2016 am 11:45 AM

全写在模块内了,可备份整个库,也可以选择部分表备份

纠正一处错误,361行empty 用错了
<?php <br /> <br> class BaksqlAction extends CommonAction {<br> <br>     public $config = '';                                                        //相关配置<br>     public $model = '';                                                         //实例化一个model<br>     public $content;                                                            //内容<br>     public $dbName = '';                                                        //数据库名<br>     public $dir_sep = '/';                                                      //路径符号<br> <br>     //初始化数据<br> <br>     function _initialize() {<br>         parent::_initialize();<br>         header("Content-type: text/html;charset=utf-8");<br>         set_time_limit(0);                                                      //不超时<br>         ini_set('memory_limit','500M');<br>         $this->config = array(<br>             'path' => C('DB_BACKUP'),                                           //备份文件存在哪里<br>             'isCompress' => 0,                                                  //是否开启gzip压缩      【未测试】<br>             'isDownload' => 0                                                   //备份完成后是否下载文件 【未测试】<br>         );<br>         $this->dbName = C('DB_NAME');                                           //当前数据库名称<br>         $this->model = new Model();<br>         //$sql = 'set interactive_timeout=24*3600';                             //空闲多少秒后 断开链接<br>         //$this->model>execute($sql);<br>     }<br> <br>     /* -<br>      * +------------------------------------------------------------------------<br>      * * @ 已备份数据列表<br>      * +------------------------------------------------------------------------<br>      */<br> <br>     function index() {<br>         $path = $this->config['path'];<br>         $fileArr = $this->MyScandir($path);<br>         foreach ($fileArr as $key => $value) {<br>             if ($key > 1) {<br>                 //获取文件创建时间<br>                 $fileTime = date('Y-m-d H:i:s', filemtime($path . '/' . $value));<br>                 $fileSize = filesize($path . '/' . $value) / 1024;<br>                 //获取文件大小<br>                 $fileSize = $fileSize                          number_format($fileSize / 1024, 2) . ' MB';<br>                 //构建列表数组<br>                 $list[] = array(<br>                     'name' => $value,<br>                     'time' => $fileTime,<br>                     'size' => $fileSize<br>                 );<br>             }<br>         }<br>         $this->assign('list', $list);<br>         $this->display();<br>     }<br> <br>     /* -<br>      * +------------------------------------------------------------------------<br>      * * @ 获取数据表<br>      * +------------------------------------------------------------------------<br>      */<br> <br>     function tablist() {<br>         $list = $this->model->query("SHOW TABLE STATUS FROM {$this->dbName}");  //得到表的信息<br>         //echo $Backup->getLastSql();<br>         $this->assign('list', $list);<br>         $this->display();<br>     }<br> <br>     /* -<br>      * +------------------------------------------------------------------------<br>      * * @ 备份整个数据库<br>      * +------------------------------------------------------------------------<br>      */<br> <br>     function backall() {<br>         $tables = $this->getTables();<br>         if ($this->backup($tables)) {<br>             $this->success('数据库备份成功!', '/public/ok');<br>         } else {<br>             $this->error('数据库备份失败!');<br>         }<br>     }<br> <br>     /* -<br>      * +------------------------------------------------------------------------<br>      * * @ 按表备份,可批量<br>      * +------------------------------------------------------------------------<br>      */<br> <br>     function backtables() {<br>         $tab = $_REQUEST['tab'];<br>         if (is_array($tab))<br>             $tables = $tab;<br>         else<br>             $tables[] = $tab;<br>         if ($this->backup($tables)) {<br>             if (is_array($tab))<br>                 $this->success('数据库备份成功!');<br>             else<br>                 $this->success('数据库备份成功!', '/public/ok');<br>         } else {<br>             $this->error('数据库备份失败!');<br>         }<br>     }<br> <br>     //还原数据库<br>     function recover() {<br>         if ($this->recover_file($_GET['file'])) {<br>             $this->success('数据还原成功!', '/public/ok');<br>         } else {<br>             $this->error('数据还原失败!');<br>         }<br>     }<br> <br>     //删除数据备份<br>     function deletebak() {<br>         if (unlink($this->config['path'] . $this->dir_sep . $_GET['file'])) {<br>             $this->success('删除备份成功!', '/public/ok');<br>         } else {<br>             $this->error('删除备份失败!');<br>         }<br>     }<br> <br>     /* -<br>      * +------------------------------------------------------------------------<br>      * * @ 下载备份文件<br>      * +------------------------------------------------------------------------<br>      */<br> <br>     function downloadBak() {<br>         $file_name = $_GET['file'];<br>         $file_dir = $this->config['path'];<br>         if (!file_exists($file_dir . "/" . $file_name)) { //检查文件是否存在<br>             return false;<br>             exit;<br>         } else {<br>             $file = fopen($file_dir . "/" . $file_name, "r"); // 打开文件<br>             // 输入文件标签<br>             header('Content-Encoding: none');<br>             header("Content-type: application/octet-stream");<br>             header("Accept-Ranges: bytes");<br>             header("Accept-Length: " . filesize($file_dir . "/" . $file_name));<br>             header('Content-Transfer-Encoding: binary');<br>             header("Content-Disposition: attachment; filename=" . $file_name);  //以真实文件名提供给浏览器下载<br>             header('Pragma: no-cache');<br>             header('Expires: 0');<br>             //输出文件内容<br>             echo fread($file, filesize($file_dir . "/" . $file_name));<br>             fclose($file);<br>             exit;<br>         }<br>     }<br> <br>     /* -<br>      * +------------------------------------------------------------------------<br>      * * @ 获取 目录下文件数组<br>      * +------------------------------------------------------------------------<br>      * * @ $FilePath 目录路径<br>      * * @ $Order    排序<br>      * +------------------------------------------------------------------------<br>      * * @ 获取指定目录下的文件列表,返回数组<br>      * +------------------------------------------------------------------------<br>      */<br> <br>     private function MyScandir($FilePath = './', $Order = 0) {<br>         $FilePath = opendir($FilePath);<br>         while ($filename = readdir($FilePath)) {<br>             $fileArr[] = $filename;<br>         }<br>         $Order == 0 ? sort($fileArr) : rsort($fileArr);<br>         return $fileArr;<br>     }<br> <br>     /*     * ******************************************************************************************** */<br> <br>     /* -<br>      * +------------------------------------------------------------------------<br>      * * @ 读取备份文件<br>      * +------------------------------------------------------------------------<br>      * * @ $fileName 文件名<br>      * +------------------------------------------------------------------------<br>      */<br> <br>     private function getFile($fileName) {<br>         $this->content = '';<br>         $fileName = $this->trimPath($this->config['path'] . $this->dir_sep . $fileName);<br>         if (is_file($fileName)) {<br>             $ext = strrchr($fileName, '.');<br>             if ($ext == '.sql') {<br>                 $this->content = file_get_contents($fileName);<br>             } elseif ($ext == '.gz') {<br>                 $this->content = implode('', gzfile($fileName));<br>             } else {<br>                 $this->error('无法识别的文件格式!');<br>             }<br>         } else {<br>             $this->error('文件不存在!');<br>         }<br>     }<br> <br>     /* -<br>      * +------------------------------------------------------------------------<br>      * * @ 把数据写入磁盘<br>      * +------------------------------------------------------------------------<br>      */<br> <br>     private function setFile() {<br>         $recognize = '';<br>         $recognize = $this->dbName;<br>         $fileName = $this->trimPath($this->config['path'] . $this->dir_sep . $recognize . '_' . date('YmdHis') . '_' . mt_rand(100000000, 999999999) . '.sql');<br>         $path = $this->setPath($fileName);<br>         if ($path !== true) {<br>             $this->error("无法创建备份目录目录 '$path'");<br>         }<br>         if ($this->config['isCompress'] == 0) {<br>             if (!file_put_contents($fileName, $this->content, LOCK_EX)) {<br>                 $this->error('写入文件失败,请检查磁盘空间或者权限!');<br>             }<br>         } else {<br>             if (function_exists('gzwrite')) {<br>                 $fileName .= '.gz';<br>                 if ($gz = gzopen($fileName, 'wb')) {<br>                     gzwrite($gz, $this->content);<br>                     gzclose($gz);<br>                 } else {<br>                     $this->error('写入文件失败,请检查磁盘空间或者权限!');<br>                 }<br>             } else {<br>                 $this->error('没有开启gzip扩展!');<br>             }<br>         }<br>         if ($this->config['isDownload']) {<br>             $this->downloadFile($fileName);<br>         }<br>     }<br> <br>     private function trimPath($path) {<br>         return str_replace(array('/', '\\', '//', '\\\\'), $this->dir_sep, $path);<br>     }<br> <br>     private function setPath($fileName) {<br>         $dirs = explode($this->dir_sep, dirname($fileName));<br>         $tmp = '';<br>         foreach ($dirs as $dir) {<br>             $tmp .= $dir . $this->dir_sep;<br>             if (!file_exists($tmp) && !@mkdir($tmp, 0777))<br>                 return $tmp;<br>         }<br>         return true;<br>     }<br> <br>     //未测试<br>     private function downloadFile($fileName) {<br>         ob_end_clean();<br>         header("Cache-Control: must-revalidate, post-check=0, pre-check=0");<br>         header('Content-Description: File Transfer');<br>         header('Content-Type: application/octet-stream');<br>         header('Content-Length: ' . filesize($fileName));<br>         header('Content-Disposition: attachment; filename=' . basename($fileName));<br>         readfile($fileName);<br>     }<br> <br>     /* -<br>      * +------------------------------------------------------------------------<br>      * * @ 给字符串添加 ` `<br>      * +------------------------------------------------------------------------<br>      * * @ $str 字符串<br>      * +------------------------------------------------------------------------<br>      * * @ 返回 `$str`<br>      * +------------------------------------------------------------------------<br>      */<br> <br>     private function backquote($str) {<br>         return "`{$str}`";<br>     }<br> <br>     /* -<br>      * +------------------------------------------------------------------------<br>      * * @ 获取数据库的所有表<br>      * +------------------------------------------------------------------------<br>      * * @ $dbName  数据库名称<br>      * +------------------------------------------------------------------------<br>      */<br> <br>     private function getTables($dbName = '') {<br>         if (!empty($dbName)) {<br>             $sql = 'SHOW TABLES FROM ' . $dbName;<br>         } else {<br>             $sql = 'SHOW TABLES ';<br>         }<br>         $result = $this->model->query($sql);<br>         $info = array();<br>         foreach ($result as $key => $val) {<br>             $info[$key] = current($val);<br>         }<br>         return $info;<br>     }<br> <br>     /* -<br>      * +------------------------------------------------------------------------<br>      * * @ 把传过来的数据 按指定长度分割成数组<br>      * +------------------------------------------------------------------------<br>      * * @ $array 要分割的数据<br>      * * @ $byte  要分割的长度<br>      * +------------------------------------------------------------------------<br>      * * @ 把数组按指定长度分割,并返回分割后的数组<br>      * +------------------------------------------------------------------------<br>      */<br> <br>     private function chunkArrayByByte($array, $byte = 5120) {<br>         $i = 0;<br>         $sum = 0;<br>         $return = array();<br>         foreach ($array as $v) {<br>             $sum += strlen($v);<br>             if ($sum                  $return[$i][] = $v;<br>             } elseif ($sum == $byte) {<br>                 $return[++$i][] = $v;<br>                 $sum = 0;<br>             } else {<br>                 $return[++$i][] = $v;<br>                 $i++;<br>                 $sum = 0;<br>             }<br>         }<br>         return $return;<br>     }<br> <br>     /* -<br>      * +------------------------------------------------------------------------<br>      * * @ 备份数据 { 备份每张表、视图及数据 }<br>      * +------------------------------------------------------------------------<br>      * * @ $tables 需要备份的表数组<br>      * +------------------------------------------------------------------------<br>      */<br> <br>     private function backup($tables) {<br>         if (empty($tables))<br>             $this->error('没有需要备份的数据表!');<br>         $this->content = '/* This file is created by MySQLReback ' . date('Y-m-d H:i:s') . ' */';<br>         foreach ($tables as $i => $table) {<br>             $table = $this->backquote($table);                                  //为表名增加 ``<br>             $tableRs = $this->model->query("SHOW CREATE TABLE {$table}");       //获取当前表的创建语句<br>             if (!empty($tableRs[0]["Create View"])) {<br>                 $this->content .= "\r\n /* 创建视图结构 {$table}  */";<br>                 $this->content .= "\r\n DROP VIEW IF EXISTS {$table};/* MySQLReback Separation */ " . $tableRs[0]["Create View"] . ";/* MySQLReback Separation */";<br>             }<br>             if (!empty($tableRs[0]["Create Table"])) {<br>                 $this->content .= "\r\n /* 创建表结构 {$table}  */";<br>                 $this->content .= "\r\n DROP TABLE IF EXISTS {$table};/* MySQLReback Separation */ " . $tableRs[0]["Create Table"] . ";/* MySQLReback Separation */";<br>                 $tableDateRow = $this->model->query("SELECT * FROM {$table}");<br>                 $valuesArr = array();<br>                 $values = '';<br>                 if (false != $tableDateRow) {<br>                     foreach ($tableDateRow as &$y) {<br>                         foreach ($y as &$v) {<br>                            if ($v=='')                                  //纠正empty 为0的时候  返回tree<br>                                 $v = 'null';                                    //为空设为null<br>                             else<br>                                 $v = "'" . mysql_escape_string($v) . "'";       //非空 加转意符<br>                         }<br>                         $valuesArr[] = '(' . implode(',', $y) . ')';<br>                     }<br>                 }<br>                 $temp = $this->chunkArrayByByte($valuesArr);<br>                 if (is_array($temp)) {<br>                     foreach ($temp as $v) {<br>                         $values = implode(',', $v) . ';/* MySQLReback Separation */';<br>                         if ($values != ';/* MySQLReback Separation */') {<br>                             $this->content .= "\r\n /* 插入数据 {$table} */";<br>                             $this->content .= "\r\n INSERT INTO {$table} VALUES {$values}";<br>                         }<br>                     }<br>                 }<br> //                dump($this->content);<br> //                exit;<br>             }<br>         }<br> <br>         if (!empty($this->content)) {<br>             $this->setFile();<br>         }<br>         return true;<br>     }<br> <br>     /* -<br>      * +------------------------------------------------------------------------<br>      * * @ 还原数据<br>      * +------------------------------------------------------------------------<br>      * * @ $fileName 文件名<br>      * +------------------------------------------------------------------------<br>      */<br> <br>     private function recover_file($fileName) {<br>         $this->getFile($fileName);<br>         if (!empty($this->content)) {<br>             $content = explode(';/* MySQLReback Separation */', $this->content);<br>             foreach ($content as $i => $sql) {<br>                 $sql = trim($sql);<br>                 if (!empty($sql)) {<br>                     $mes = $this->model->execute($sql);<br>                     if (false === $mes) {                                       //如果 null 写入失败,换成 ''<br>                         $table_change = array('null' => '\'\'');<br>                         $sql = strtr($sql, $table_change);<br>                         $mes = $this->model->execute($sql);<br>                     }<br>                     if (false === $mes) {                                       //如果遇到错误、记录错误<br>                         $log_text = '以下代码还原遇到问题:';<br>                         $log_text.="\r\n $sql";<br>                         set_log($log_text);<br>                     }<br>                 }<br>             }<br>         } else {<br>             $this->error('无法读取备份文件!');<br>         }<br>         return true;<br>     }<br> <br> }<br> ?>

AD:真正免费,域名+虚机+企业邮箱=0元

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Ketahui tentang contoh kod pengenalan untuk pengaturcaraan Python Ketahui tentang contoh kod pengenalan untuk pengaturcaraan Python Jan 04, 2024 am 10:50 AM

Ketahui tentang pengaturcaraan Python dengan contoh kod pengenalan Python ialah bahasa pengaturcaraan yang mudah dipelajari tetapi berkuasa. Bagi pemula, adalah sangat penting untuk memahami contoh kod pengenalan pengaturcaraan Python. Artikel ini akan memberikan anda beberapa contoh kod konkrit untuk membantu anda bermula dengan cepat. Cetak HelloWorldprint("HelloWorld") Ini ialah contoh kod paling mudah dalam Python. Fungsi print() digunakan untuk mengeluarkan kandungan yang ditentukan

Pembolehubah PHP dalam tindakan: 10 contoh penggunaan sebenar Pembolehubah PHP dalam tindakan: 10 contoh penggunaan sebenar Feb 19, 2024 pm 03:00 PM

Pembolehubah PHP menyimpan nilai semasa runtime program dan sangat penting untuk membina aplikasi WEB yang dinamik dan interaktif. Artikel ini melihat secara mendalam pembolehubah PHP dan menunjukkannya dalam tindakan dengan 10 contoh kehidupan sebenar. 1. Simpan input pengguna $nama pengguna=$_POST["nama pengguna"];$passWord=$_POST["kata laluan"] Contoh ini mengekstrak nama pengguna dan kata laluan daripada penyerahan borang dan menyimpannya dalam pembolehubah untuk pemprosesan selanjutnya. 2. Tetapkan nilai konfigurasi $database_host="localhost";$database_username="username";$database_pa

Daripada pemula hingga mahir: Pelaksanaan kod struktur data yang biasa digunakan dalam bahasa Go Daripada pemula hingga mahir: Pelaksanaan kod struktur data yang biasa digunakan dalam bahasa Go Mar 04, 2024 pm 03:09 PM

Tajuk: Dari Permulaan hingga Penguasaan: Pelaksanaan Kod Struktur Data Yang Biasa Digunakan dalam Bahasa Go Struktur data memainkan peranan penting dalam pengaturcaraan dan merupakan asas pengaturcaraan. Dalam bahasa Go, terdapat banyak struktur data yang biasa digunakan, dan menguasai pelaksanaan struktur data ini adalah penting untuk menjadi seorang pengaturcara yang baik. Artikel ini akan memperkenalkan struktur data yang biasa digunakan dalam bahasa Go dan memberikan contoh kod yang sepadan untuk membantu pembaca daripada mula menjadi mahir dalam struktur data ini. 1. Array Array ialah struktur data asas, kumpulan daripada jenis yang sama

Java melaksanakan kod isihan gelembung mudah Java melaksanakan kod isihan gelembung mudah Jan 30, 2024 am 09:34 AM

Contoh kod paling ringkas bagi jenis gelembung Java ialah algoritma pengisihan biasa. Idea asasnya ialah melaraskan urutan secara beransur-ansur ke dalam urutan tersusun melalui perbandingan dan pertukaran elemen bersebelahan. Berikut ialah contoh kod Java ringkas yang menunjukkan cara melaksanakan isihan gelembung: publicclassBubbleSort{publicstaticvoidbubbleSort(int[]arr){int

Contoh pengaturcaraan bahasa Go: contoh kod dalam pembangunan web Contoh pengaturcaraan bahasa Go: contoh kod dalam pembangunan web Mar 04, 2024 pm 04:54 PM

"Contoh Pengaturcaraan Bahasa Pergi: Contoh Kod dalam Pembangunan Web" Dengan perkembangan pesat Internet, pembangunan Web telah menjadi bahagian yang amat diperlukan dalam pelbagai industri. Sebagai bahasa pengaturcaraan dengan fungsi berkuasa dan prestasi unggul, bahasa Go semakin digemari oleh pembangun dalam pembangunan web. Artikel ini akan memperkenalkan cara menggunakan bahasa Go untuk pembangunan Web melalui contoh kod tertentu, supaya pembaca boleh memahami dengan lebih baik dan menggunakan bahasa Go untuk membina aplikasi Web mereka sendiri. 1. Pelayan HTTP Mudah Mula-mula, mari kita mulakan dengan a

Cara menggunakan PHP untuk menulis kod fungsi pengurusan inventori dalam sistem pengurusan inventori Cara menggunakan PHP untuk menulis kod fungsi pengurusan inventori dalam sistem pengurusan inventori Aug 06, 2023 pm 04:49 PM

Cara menggunakan PHP untuk menulis kod fungsi pengurusan inventori dalam sistem pengurusan inventori adalah bahagian yang amat diperlukan dalam banyak perusahaan. Bagi syarikat yang mempunyai berbilang gudang, fungsi pengurusan inventori amat penting. Dengan mengurus dan menjejak inventori dengan betul, syarikat boleh memperuntukkan inventori antara gudang yang berbeza, mengoptimumkan kos operasi dan meningkatkan kecekapan kerjasama. Artikel ini akan memperkenalkan cara menggunakan PHP untuk menulis kod bagi fungsi pengurusan gudang inventori dan memberikan anda contoh kod yang berkaitan. 1. Wujudkan pangkalan data sebelum mula menulis kod untuk fungsi pengurusan gudang inventori.

Panduan dan Contoh: Belajar untuk melaksanakan algoritma isihan pemilihan dalam Java Panduan dan Contoh: Belajar untuk melaksanakan algoritma isihan pemilihan dalam Java Feb 18, 2024 am 10:52 AM

Panduan Menulis Kod Kaedah Isih Pemilihan Java dan Contoh Isihan pemilihan ialah algoritma pengisihan yang mudah dan intuitif Ideanya adalah untuk memilih elemen terkecil (atau terbesar) daripada elemen yang tidak diisih setiap kali dan menukarnya sehingga semua elemen diisih. Artikel ini akan menyediakan panduan menulis kod untuk pengisihan pemilihan dan melampirkan kod sampel Java tertentu. Prinsip Algoritma Prinsip asas isihan pemilihan ialah membahagikan tatasusunan yang hendak diisih kepada dua bahagian, diisih dan tidak diisih Setiap kali, elemen terkecil (atau terbesar) dipilih daripada bahagian yang tidak diisih dan diletakkan di hujung bahagian yang diisih. Ulang perkara di atas

Panduan Sambungan Pengkomputeran Tepi Awan Huawei: Contoh kod Java untuk melaksanakan antara muka dengan cepat Panduan Sambungan Pengkomputeran Tepi Awan Huawei: Contoh kod Java untuk melaksanakan antara muka dengan cepat Jul 05, 2023 pm 09:57 PM

Panduan Sambungan Pengkomputeran Tepi Awan Huawei: Contoh Kod Java untuk Melaksanakan Antara Muka Dengan Pantas Dengan perkembangan pesat teknologi IoT dan peningkatan pengkomputeran tepi, semakin banyak perusahaan mula memberi perhatian kepada aplikasi pengkomputeran tepi. Huawei Cloud menyediakan perkhidmatan pengkomputeran edge, menyediakan perusahaan dengan sumber pengkomputeran yang sangat boleh dipercayai dan persekitaran pembangunan yang mudah, menjadikan aplikasi pengkomputeran tepi lebih mudah untuk dilaksanakan. Artikel ini akan memperkenalkan cara untuk melaksanakan antara muka pengkomputeran tepi Awan Huawei dengan cepat melalui kod Java. Pertama, kita perlu menyediakan persekitaran pembangunan. Pastikan anda memasang Java Development Kit (

See all articles