avaScript —— 極簡主義
點關注,不迷路~
一篇文章我給大家說明了如何從零開始搭建一個node的服務端框架,我們用到了Egg框架。Egg框架我不再過多介紹,如果有小伙伴想了解,可以回去看我以前寫的文章,會有相關的介紹。這次我將在上次搭建的框架上進行延伸,講一下如果用Egg框架連接數據庫,并且實現對數據的增刪查改。接下來我們直接進入主題。
我本次選用的數據庫是MySQL。所以我們安裝Egg官方的數據庫插件即可,首先我們安裝插件 egg-mysql 。我們在項目根目錄打開命令提示符,輸入命令行:npm i --save egg-mysql 。回車等待插件下載安裝完成。
npm i --save egg-mysql
命令行下載安裝插件完成后,我們下一步的工作就是在項目中開啟并配置egg-mysql插件。具體操作如下:
首先我們要在項目中開啟數據庫。找到項目中的/config/plugin.js文件我們需要在里面添加幾行代碼,如下所示。
//開啟數據庫插件
mysql : {
enable: true,
package: 'egg-mysql',
}
然后我們還要在 config/config.default.js 中配置各個環境的數據庫連接信息。具體配置如下。
//添加數據庫連接信息
config.mysql={
// 單數據庫信息配置
client: {
// host
host: 'localhost',
// 端口號
port: '3306',
// 用戶名
user: 'root',
// 密碼
password: '123456',
// 數據庫名
database: 'testdb',
},
// 是否加載到 app 上,默認開啟
app: true,
// 是否加載到 agent 上,默認關閉
agent: false,
};
到此步驟我們的數據庫插件已經安裝完成并且配置好了。那我們怎么實現數據的增刪查改呢?大家請繼續往下看。
首先我們看一下怎么新增數據。我們在mysql的testdb實例中新建一個user空表。如下圖所示。
我們的egg框架也遵循MVC的架構所以我們一般會在service層里面寫我們邏輯處理的代碼,而controller層則是獲取前端數據,回傳數據的控制層。所以我們操作數據庫的代碼是寫在service文件夾里面的。
我們在app/service文件夾里面新建一個user.js文件。在里面寫個新增用戶的方法,該方法就是把數據存到數據庫中。具體代碼如下。
const Service=require('egg').Service;
class UserService extends Service {
//新增用戶data是有controller層傳遞過來的數據記錄。
async addUser(data) {
const {ctx, app}=this;
let result={};
try {
data.id=0;//定義id=0,因為數據庫已經設置id為主鍵,并且自增。所以只需要賦值0即可。
// 在 user 表中,插入前端提交上來的數據記錄
const info=await app.mysql.insert('user', data);
//插入成功后。
if(info.affectedRows===1){
//給前端返回一個Json的對象
result={
state: 0, //自定義的狀態碼
msg: "添加成功", //返回的消息
data: info.insertId, //新增的記錄的id
}
}
} catch (err) {
//插入數據失敗的返回結果
result={
state: 1,
msg: err,
data: null,
}
}
return result
}
};
module.exports=UserService;
然后我們在app/controller文件夾里新建一個user.js文件。在這里我們需要獲取前端提交上來的數據,并且將數據處理的結果返回給前端。具體代碼如下。
'use strict';
const Controller=require('egg').Controller;
/**
* @Controller 用戶管理
*/
class UserController extends Controller {
/**
* @summary 新增用戶
* @router post /user/add
* @request body userAddRequest
* @response 200
*/
async addUser() {
const { ctx }=this;
//通過ctx.request.body的方式,可以獲取到前端post方式提交上來的數據
const data=ctx.request.body;
//調用service層的addUser方法。并且返回相應的結果
const userInfo=await ctx.service.user.addUser(data);
//向前端接口響應數據。
ctx.body=userInfo;
}
}
module.exports=UserController;
最后我們定義一個路由,讓前端請求訪問此路由。框架會監聽路由是否被訪問,如果被訪問了則會調用我們定義在controller層的新增用戶的方法。我們在app/router.js文件中添加如下代碼,即可完成路由的定義。
//新增用戶路由
router.post('/user/add', controller.user.addUser);
完成這步驟后,我們一個新增用戶的功能就已經完成了。接下里我們就測試一下它的實際效果。我們運行命令:npm run dev。啟動項目,然后打開網頁http://127.0.0.1:7001,可以直接在swagger-ui.html頁面中進行測試。結果如下圖所示。
經過測試,數據已經添加完成。所以數據庫連接也是正常的。
本次分享暫時先告一段落。請各位小伙伴抬起你們發財的小手,點個贊唄。下次我將會進行和大家分享對數據查改刪的方法。關注我!!!更多精彩分享不迷路。
.MySQL客戶端下,操作MySQL的步驟
第一步:連接到MySQL數據庫服務器 mysql –uroot -root
第二步:選擇要操作的數據庫(當前數據庫) use db_name
第三步:設置字符集 set names gbk
第四步:執行SQL語句:增、刪、改、查
增加:INSERT INTO table_name(title,author,addate) VALUES(‘標題’,’admin’,now())
刪除:DELETE FROM table_name WHERE 條件表達式
修改:UPDATE table_name SET title=“新的標題” WHERE 條件表達式
查詢:SELECT * FROM table_name WHERE條件 ORDER BY LIMIT
2.PHP操作MySQL的步驟(MySQL的函數)
第一步:連接MySQL數據庫服務器
mysql_connect()
含義:連接到MySQL數據庫服務器
格式:resource mysql_connect(主機地址,用戶名,用戶密碼)
返回值:如果連接成功返回資源標識符,如果連接失敗,返回false
舉例:$link=mysql_connect(“localhost”,”root”,”root”);
exit()
含義:輸出信息后中斷腳本繼續向下運行
格式:void exit([$string])
說明:$string參數是可選的,如果沒有參數,則直接中斷;如果有參數,則先輸出,再中斷
舉例:exit(“連接MySQL失敗”);
header()
含義:通過header()函數,向瀏覽器客戶端發送一些信息,如:字符集設置、網頁跳轉等。
格式:void header($string)
注意:header()函數前,不能有任何的輸出,包括:空格、空行、以及任何的HTML代碼。一般來說,header()函數應該寫在第一行代碼之前。
舉例:
header(“content-type:text/html;charset=utf-8”); //設置字符集
header(“location:http://www.sina.com.cn”); //跳轉網頁
以上是連接MySQL失敗的系統信息。一般情況下,不要將系統的出錯信息暴露給“黑客”。解決的辦法,可以將錯誤信息進行屏蔽。屏蔽用的符號是“@”符。
舉例:$link=@mysql_connect("localhost","r9oot","root");
mysql_get_host_info()
含義:如果連通MySQL后,顯示服務器的一些信息。
格式:mysql_get_host_info()
第二步:選擇要操作的數據庫
提示:一個中小型網站,只有一個數據庫,不會太多。
mysql_select_db()
含義:選擇當前做為操作的數據庫。
格式:bool mysql_select_db(db_name[,$link])
參數:db_name就是要選擇的數據庫名稱
$link是可選項,代表當前活動連接。如果$link省略,則以上一次連接MySQL成功時的那個連接(資源)為準。
舉例:mysql_select_db(“saixinjituan”)
mysql_error()
含義:顯示最近一次操作MySQL的出錯信息。
格式:string mysql_error()
第三步:設置MySQL返回的數據字符集
mysql_query(“set names utf8”)
提示:設置字符集,應在“選擇數據庫”之后,在其它的SQL語句執行之前。
第四步:執行SQL語句
mysql_query()
含義:執行SQL語句,包括任何合法的SQL語句。
格式:resource mysql_query(string $sql[,$link])
參數:$sql是任何合法的SQL語句;$link是當前活動連接
舉例:
查詢前10條的新聞: $result=mysql_query(“select * from 007_news id<=10”);
創建一個數據庫(要有權限):mysql_query(“CREATE DATABASE IF NOT EXISTS db_name”);
刪除ID=10的記錄:mysql_query(“DELETE FROM 007_news WHERE id=10”);
注意:mysql_query()對于select、describe、show返回資源標識符;對于其它的命令成功返回true,失敗返回false
mysql_fetch_row()
含義:從結果集中取得一行,作為枚舉數組返回。
格式:array mysql_fetch_row(結果集$result)
返回值:是一個枚舉數組,可通過print_r()來打印。
mysql_fetch_array()
含義:從結果集中取得一行,作為混合數組返回
格式:array mysql_fetch_array($result)
mysql_fetch_assoc()
含義:從結果集中取得一行,作為關聯數組返回
格式:array mysql_fetch_assoc($result)
3.綜合案例
企業網站的開發、制作基本分為前臺和后臺。
前臺功能相對簡單,就是讀取數據(SELECT)。
前臺功能相對復雜,方方面面都牽扯到了。
網站后臺登錄的一個流程圖
網站后臺的文件結構
include文件夾:公共功能的文件夾(核心文件)
config.php 公共配置文件
conn.php 連接數據庫的公共文件
functions.php 常用的函數定義文件
第一功能模塊:先做登錄模塊
(1)文件列表:
login.php 登錄的靜態頁面
login_check.php 獲取登錄信息,與數據庫進行比對
(2)數據表:007_admin
Username:用戶名
Password:密碼,經過md5()函數加密碼
Name:真實姓名
Tel:聯系手機
Lastloginip:最后登錄的客戶端的IP地址
Lastlogintime:最后登錄成功的時間
Loginhits:登錄的總次數
Status:賬號的狀態,1為啟用,0為禁用。
Addate:賬號的創建時間
4.PHP全局數組
如何獲取表單提交的數據?我們需要使用PHP全局數組來獲取。
1 | $_SERVER[ ]:獲取服務器的一些相關信息$_SERVER[“SERVER_NAME”],網站的域名$_SERVER[“SERVER_ADDR”],服務的IP地址$_SERVER[“REMOTE_ADDR”],客戶端的IP地址$_POST[ ]:獲取method=post的表單提交的值$username=$_POST[“username”];$password=$_POST[“password”];$_GET[ ]:獲取 method=get 的表單提交的值$username=$_GET[“username”];$password=$_GET[“password”]; |
5.包含文件:將其它的文件代碼包含(復制)進來
include(fileName)包含外部文件,如:include(“cofig.php”)
require(fileName)包含外部文件,如:require(“config.php”)
include()和require()的區別(面試題)
這兩個函數除了在出錯時處理方式不一樣,其它方面都一樣。
include()如果包含文件中存在錯誤代碼,包含進來后,會輸出一個“警告錯誤信息”,程序會繼續向下運行。
Require()如果包含文件中存儲錯誤代碼,包含進來后,會輸出一個“致命錯誤信息”,并終止程序繼續向下運行。
6.URL編碼函數
Urlencode():此字符串中除了 -_.之外的所有非字母數字字符都將被替換成百分號(%)后跟兩位十六進制數,空格則編碼為加號(+)。此編碼與 WWW 表單 POST 數據的編碼方式是一樣的
urlencode(“非法用戶”)的結果是“%E9%9D%9E%E6%B3%95%E7%94%A8%E6%88%B7”
urldecode():對使用urlencode()編碼后的字符進行解碼。
md5()對字符進行加密,返回一個32位的字符串,單向加密。
7.mysql_num_row($result):取出返回的字錄數
*請認真填寫需求信息,我們會在24小時內與您取得聯系。