Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
們在瀏覽網頁的時候,可以看到頁面上有導航欄,逛商城的時候會看到商品的詳情頁里有商品的簡介,以及在注冊或者申請一個網站會員的時候會讓我們填寫各種各樣的信息,這些分別由列表、表格、表單來完成的,今天我學習了這些知識,下面我把我學到的知識梳理一下,以及在學習中遇到的坑總結一下,希望能給其他初學者一些幫助,同時,如有不足之處,也請各位大神指出來,我也好學習學習,提升自我。
網站導航欄
HTML列表在網站頁面中使用的是相當廣泛。如上圖的網站導航欄,就是使用了列表實現的,再比如說,一個欄目的文章列表等等,都是使用了列表功能,根據我今天學到的內容,我總結了一下,總共三大知識點:
1.無序列表:
可以在<ul>標簽中使用type屬性來控制每一項前面的圓點的樣式:
<h3>商品列表</h3>
<ul start="2">
<li>iPhone 12</li>
<li>MacBook Air</li>
<li>AirPods Pro</li>
</ul>
2.有序列表:
<h3>商品列表</h3>
<ol>
<li>iPhone 12</li>
<li>MacBook Air</li>
<li>AirPods Pro</li>
</ol>
有序列表
可以在<ol>標簽中使用start屬性來控制第一項數字起始值:
<h3>商品列表</h3>
<ol start="2">
<li>iPhone 12</li>
<li>MacBook Air</li>
<li>AirPods Pro</li>
</ol>
效果如圖:
start=2
可以使用type規定在列表中使用的標記類型,type值有五種:
不過我個人感覺,這個type屬性的作用貌似不多大,基本上都是以默認值,就是數字來作為每一項的標記了吧。
3.自定義列表:
<dl>
<dt>名稱:</dt>
<dd>小白學編程</dd>
<dt>地址:</dt>
<dd>河南省鄭州市二七區</dd>
<dt>聯系</dt>
<dd>電話:<a href="tel:189****1122">189****1122</a></dd>
<dd>郵箱:<a href="mailto:admin@admin.com">admin@admin.com</a></dd>
</dl>
自定義列表
備注:根據本小白查的文檔,a標簽的href屬性,不僅可以填寫鏈接,還可以用:
【tel:電話號碼】的格式點擊進行撥號,只不過是在電腦上需要有能撥號的軟件;
撥號
【mailto:郵箱地址】的格式可以快速拉起發送郵件的軟件。
發送郵件
不過我不知道這個的兼容性怎么樣,如果有知道的大佬,可以在評論區指導一下,跪謝!
一個表格的基本結構:
<table class="table">
<!-- caption:表格標題 -->
<caption>
商品信息表
</caption>
<!-- 表頭 -->
<thead>
<!-- 添加表格數據的時候必須先添加一行 -->
<tr>
<td>ID</td>
<td>商品名稱</td>
<td>單價</td>
<td>單位</td>
<td>數量</td>
<td>金額</td>
</tr>
</thead>
<!-- 一個表格可以有多個tbody,但是只能有一個thead -->
<tbody>
<tr>
<td>1</td>
<td>iPhone 12 mini</td>
<td>5499</td>
<td>部</td>
<td>100</td>
<td>549900</td>
</tr>
</tbody>
</table>
Excel里的表格可以進行行與列的合并,單元格直接也能合并,那么HTML表格也是可以的,可以使用colspan進行列合并,rowspan進行行的合并。利用這兩個屬性,我們可以使用<table>標簽寫一個課程表。
HTML表單是用于搜集用戶輸入的不同類型數據的,它包含了不同類型的<input>元素,如:文本框、單選框、復選框、提交按鈕等等。因此可以看出,<input>元素是表單中最重要的元素。
表單的基本格式:
<form action="" method="POST" class="register">
<!-- 這里面可以放input元素 -->
</form>
根據我學習的成果,我總結出了input元素的七種type類型并一一做了記錄:
1.type="text" 單行文本框
<label for="username">賬號:</label>
<input type="text" name="username" id="username" value="admin" required>
單行文本框
2.type="email" 郵箱型文本框
<label for="email">郵箱:</label>
<input type="email" name="email" id="email" value="html@html.cn" required>
郵箱型文本框還會對輸入的內容進行校驗,如果不符合郵件地址的格式會彈出如上圖提示。
3.type="password" 密碼型文本框/非明文
<label for="password">密碼:</label>
<input type="password" name="password" id="password" value="" placeholder="密碼不少于6位" required>
密碼型文本框
輸入內容
值得注意的是,密碼型文本框在輸入密碼的時候都是以小黑點進行替換的,并不會顯示我們輸入的內容。
4.type="radio" 單選框
<label for="">性別:</label>
<div>
<input type="radio" name="gender" value="male" id="male">
<label for="male">男</label>
<input type="radio" name="gender" value="male" id="male">
<label for="female">女</label>
<input type="radio" name="gender" value="male" id="male" checked>
<label for="secret">保密</label>
</div>
單選框
單選框(radio)的name值必須都相同才能保證值的唯一性,默認選中使用checked屬性。
5.type="checkbox" 復選框
<label for="#">興趣:</label>
<div>
<input type="checkbox" name="hobby[]" value="basketball" id="basketball">
<label for="basketball">籃球</label>
<input type="checkbox" name="hobby[]" value="game" id="game">
<label for="game">游戲</label>
<input type="checkbox" name="hobby[]" value="travel" id="travel">
<label for="travel">旅游</label>
<input type="checkbox" name="hobby[]" value="program" id="program">
<label for="program">編程</label>
</div>
復選框
復選框的name值一定要用數組表示,否則,服務器在接收數據的時候不能獲取所有選中的值。
6.type="file" 文件域
<label for="user-pic">頭像:</label>
<input type="file" name="user_pic" id="user-pic" />
上傳文件
7.type="hidden" 隱藏域
<input type="hidden" name="MAX_FILE_ZIE" value="80000" />
隱藏域在頁面是看不到的,是服務器端進行處理的一項數據。
通過上述的七種<input>元素類型,我得出一個結論就是一個<input>元素至少包含有三個屬性:
除了上述的<input>元素的7種標簽類型,還有下拉列表、文本域這些常用的控件。
<label for="">學歷:</label>
<select name="edu" id="eud">
<option value="1">初中</option>
<option value="2">高中</option>
<option value="3" selected>本科</option>
<option value="4">研究生</option>
<option value="5" label="老司機">博士</option>
</select
下拉列表/下拉框
<label for="">學歷:</label>
<select name="edu" id="eud">
<option value="1">初中</option>
<option value="2">高中</option>
<option value="3" selected>本科</option>
<option value="4">研究生</option>
<option value="5" label="老司機">博士</option>
</select>
multiple、size用法
<label for="comment">備注:</label>
<textarea name="comment" id="comment" cols="30" rows="10"></textarea>
上傳文件需要注意兩點:
<form action="" method="POST" class="register" enctype="multipart/form-data">
<label for="user-pic">頭像:</label>
<!-- 隱藏域在頁面是看不到的,是服務器端進行處理的一項數據。 -->
<input type="hidden" name="MAX_FILE_ZIE" value="80000" />
<input type="file" name="user_pic" id="user-pic" />
<div class="user-pic" style="grid-column: 2;"></div>
<button>提交</button>
</form>
enctype有3個值:
<form action="check.php" method="get" id="register">
<div class="box">
<label for="email">郵箱:</label>
<input type="email" form="register" name="email" id="email" placeholder="demo@email.com" />
<label for="password">密碼:</label>
<input type="password" form="register" name="password" id="password" placeholder="至少8位" />
<button form="register">提交</button>
</div>
</form>
<label for="username">帳號:</label>
<input type="text" name="username" id="username" placeholder="不能為空" />
注冊表單
例如:以下情況就是沒有在空間中寫form屬性的情況,我們可以看到,在瀏覽器里沒有獲取到密碼password的值,只獲取到了username和email的值:
沒有獲取到password的值
我個人的理解是:如果不把表單控件寫到form內部,這樣會方便js獲取表單元素的值,但是這樣寫會容易影響布局,造成布局混亂,建議還是按照標準的寫法,把所有的控件都寫到form表單內部。
至于什么時候使用GET方法,什么時候使用POST方法呢?通過今天的學習,我做了如下總結:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="css/table.css">
<title>表格:行與列的合并</title>
</head>
<body>
<table class="lesson">
<caption>
xxxx小學課程表
</caption>
<thead>
<tr>
<th colspan="2"></th>
<th>星期一</th>
<th>星期二</th>
<th>星期三</th>
<th>星期四</th>
<th>星期五</th>
</tr>
</thead>
<tbody>
<tr>
<td rowspan="4">上午</td>
<td>1</td>
<td>語文</td>
<td>數學</td>
<td>音樂</td>
<td>社會</td>
<td>科學</td>
</tr>
<tr>
<td>2</td>
<td>數學</td>
<td>語文</td>
<td>音樂</td>
<td>語文</td>
<td>數學</td>
</tr>
<tr>
<td>3</td>
<td>美術</td>
<td>音樂</td>
<td>音樂</td>
<td>數學</td>
<td>音樂</td>
</tr>
<tr>
<td>4</td>
<td>社會</td>
<td>體育</td>
<td>音樂</td>
<td>體育</td>
<td>語文</td>
</tr>
<tr class="rest">
<td colspan="7">中午休息</td>
</tr>
<tr>
<td rowspan="4">下午</td>
<td>5</td>
<td>語文</td>
<td>數學</td>
<td>音樂</td>
<td>社會</td>
<td>科學</td>
</tr>
<tr>
<td>6</td>
<td>數學</td>
<td>語文</td>
<td>音樂</td>
<td>語文</td>
<td>數學</td>
</tr>
<tr>
<td>7</td>
<td>課外活動:</td>
<td colspan="4">各班自行組織,自愿參加</td>
<td>數學</td>
<td>音樂</td> -->
</tr>
</tbody>
</table>
</body>
</html>
效果:
用HTML表格寫一個課程表
個人總結:為了學習這些表單知識,真真的是看了一天,頭都懵了,還有不少內容沒有記住,還是需要多寫多練,其中我認為比較坑的幾個地方是:
在看視頻教程的過程中,我看到好多大佬在用VS Code的時候都是使用了快捷鍵,后來網上搜了一下,原來官方給的就有一個PDF文檔,從VS里就可以進去,在工具的頂部導航欄幫助里,如下圖:
快捷鍵
為了方便大家快速找到,我把官方地址貼出來吧,VS Code快捷鍵PDF文檔:https://code.visualstudio.com/shortcuts/keyboard-shortcuts-windows.pdf
VS Code快捷鍵
續一周沒怎么更新了,今天我們繼續HTML的學習,表格標簽。表格是實際開發中常用的一種標簽類型,會說到表格標簽的主要作用和基本語法。
主要作用: 表格主要用于顯示、展示數據,因為它可以讓數據展示的非常規整,可讀性非常好,特別是后臺展示數據的時候,能夠熟練運用表格非常重要。一個清爽簡約的表格可以把復雜的數據表現的很簡單。表格不是用來布局頁面的,而是用來展示數據的。
表格的基本語法: <table><tr><td></td></tr></table>
<table></table>用來定義表格標簽
<tr></tr>用于定義表格中的行,嵌套在<table>標簽中使用
<td></td>用于定義表格中的單元格,嵌套在<tr>標簽中使用,字母td指表格數據(table data),即數據單元格的內容。
我們來展示一個例子,比如 數據庫中有三個字段,分別為 姓名 性別和年齡,如果想用前端將這三個字段的數據展示出來,應該怎么操作呢?
先看效果:
然后我們看下代碼:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>20210829---</title>
</head>
<body>
<table>
<tr> <td>姓名</td> <td>性別</td> <td>年齡</td> </tr>
</table>
</body>
</html>
這次開始使用vs code來編輯代碼了,感覺比sublime line高級一些,但是相對的也麻煩點。可以看到,在前端頁面展示了 姓名、性別和年齡。然后我們添加一行數據,看效果:
民族英雄黃飛鴻如果還活著,應該也是一位非常高壽的宗師了。多加幾個數據
讓我們看看代碼有什么不同
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>20210829---</title>
</head>
<body>
<table>
<tr> <td>姓名</td> <td>性別</td> <td>年齡</td> </tr>
<tr> <td>黃飛鴻</td> <td>男</td> <td>188</td> </tr>
<!--再多創建幾個數據-->>
<tr><td>鬼腳七</td> <td>男</td> <td>186</td> </tr>
<tr><td>梁寬</td> <td>男</td> <td>33</td> </tr>
</table>
</body>
</html>
可以看到,就是將之前的數據進行了復制而已。
接著我們說下表頭單元格標簽,一般表頭單元格位于表頭的第一行或第一列,表頭單元格里面的文本內容,加粗居中表示。
<th>標簽表示HTML表格的表頭部分,table head的縮寫
我們先來看下效果:
再看下對應的代碼:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>20210829---</title>
</head>
<body>
<table>
<!--HTML表格的表頭標簽,內容加粗居中展示-->>
<tr> <th>姓名</th> <th>性別</th> <th>年齡</th> </tr>
<tr> <td>黃飛鴻</td> <td>男</td> <td>188</td> </tr>
<!--再多創建幾個數據-->>
<tr><td>鬼腳七</td> <td>男</td> <td>186</td> </tr>
<tr><td>梁寬</td> <td>男</td> <td>33</td> </tr>
</table>
</body>
</html>
就是將表格表頭那一行的<td>都換成了<th>,可以看到表頭每個字段都已經居中并且加粗了。
最后我們說下表格的屬性,其實表格標簽屬性這部分用的不多,一般都是用css樣式來設置。例如表格的邊框、大小等。我們需要關注的表格屬性目的,有2點:
align 屬性值: left right center 對應表格相對周圍元素的對齊方式
border 屬性值 1或"" (空) 規定表格單元是否有邊框,默認為空,表示沒有邊框
cellpadding 像素值 規定單元邊沿與其內容之間的空白,默認1像素
cellspacing 像素值 規定單元格之間的空白,默認1像素
width 像素值或百分比 規定表格的寬度
我們來看下效果:
來看下代碼:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>20210829---</title>
</head>
<body>
<table align="center" border=1 cellpadding=1 cellspacing=1 width=500>
<!--HTML表格的表頭標簽,內容加粗居中展示-->>
<tr> <th>姓名</th> <th>性別</th> <th>年齡</th> </tr>
<tr> <td>黃飛鴻</td> <td>男</td> <td>188</td> </tr>
<!--再多創建幾個數據-->>
<tr><td>鬼腳七</td> <td>男</td> <td>186</td> </tr>
<tr><td>梁寬</td> <td>男</td> <td>33</td> </tr>
</table>
</body>
</html>
記住,屬性都是在table處添加和修改的,因為我們是對整個table的設置值。
好的,今天就先到這里了,大家周末愉快
一篇文章我給大家說明了如何從零開始搭建一個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頁面中進行測試。結果如下圖所示。
經過測試,數據已經添加完成。所以數據庫連接也是正常的。
本次分享暫時先告一段落。請各位小伙伴抬起你們發財的小手,點個贊唄。下次我將會進行和大家分享對數據查改刪的方法。關注我!!!更多精彩分享不迷路。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。