Vite element-plus ts 表單驗證

Vite element-plus ts 表單驗證

types資料夾新增 forms.ts

1
2
3
4
5
6
7
export interface ruleFormType {
email: string,
password: string,
checkPass?: string,
verification?: string,
}

在使用的頁面載入

  • 載入ruleFormType
  • 載入ElForm,type定義ElForm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import { ref, onMounted,watchEffect } from 'vue'
import { ruleFormType } from '../types/forms.ts'
import type { ElForm } from 'element-plus'
//找不到 ‘element-plus’ 不得使用命名空間 ‘FormInstance’ 作為類型
type FormInstance = InstanceType<typeof ElForm>
const ruleFormRef = ref<FormInstance>()
//定義表單
const ruleForm = ref<ruleFormType>({
email : '',
password : '',
checkPass: '',
verification:''
})
//驗證規則
const rules = ref<FormRules<ruleFormType>>({
email: [
{
required: true,
message : '請輸入電子信箱',
trigger : 'blur',
},
{
type : 'email',
message: '電子信箱格式不符',
trigger: [
'blur',
'change'
],
},
],
password : [{ validator: validatePassword, trigger: 'blur' }],
checkPass: [{ validator: checkPassword, trigger: 'blur' }],
})

驗證的規則與函式
一 密碼為空時,密碼不為空時驗證確認密碼
二 密碼與確認密碼不相同時
三 點擊送出沒有值時出現
四 重置表單

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
<template>
<div>
<el-form ref="ruleFormRef"
:model="ruleForm"
:rules="rules"
label-width="120px"
class="demo-ruleForm">
<el-form-item prop="email"
label="電子郵件">
<el-input v-model="ruleForm.email" />
</el-form-item>
<el-form-item label="密碼"
prop="password">
<el-input v-model="ruleForm.password"
type="password"
autocomplete="off" />
</el-form-item>
<el-form-item label="確認密碼"
prop="checkPass">
<el-input v-model="ruleForm.checkPass"
type="password"
autocomplete="off" />
</el-form-item>
<!---->
<el-form-item>
<el-button @click="resetForm(ruleFormRef)">
重置
</el-button>
<el-button type="primary"
@click="submitForm(ruleFormRef)">
送出
</el-button>
</el-form-item>
</el-form>
</div>
</template>

<script setup lang="ts">
// @ts-ignore
import { ref, onMounted } from 'vue';
// eslint-disable-next-line @typescript-eslint/no-unused-vars
import type { ElForm } from 'element-plus'
// @ts-ignore
import { ruleFormType } from '../types/forms.ts'

//找不到 ‘element-plus’ 不得使用命名空間 ‘FormInstance’ 作為類型
type FormInstance = InstanceType<typeof ElForm>
const ruleFormRef = ref<FormInstance>()

const ruleForm = ref<ruleFormType>({
email : '',
password : '',
checkPass: '',
verification:''
})
//驗證密碼
const validatePassword = (_rule: any, value: any, callback: any) => {
if (value === '') {
//如果空值時驗證
callback(new Error('請輸入密碼'))
} else {
//如果密碼不等於空
if (ruleForm.value.checkPass !== '') {
if (!ruleFormRef.value) return
ruleForm.value.validateField('checkPass', () => null)
}
callback()
}
}
// 檢查密碼是否兩次相同
const checkPassword= (_rule: any, value: any, callback: any) => {
if (value === '') {
callback(new Error('請再輸入一次密碼'))

} else if (value !== ruleForm.value.password) {
callback(new Error('兩次密碼不相同!'))
} else {
callback()
}
}
//驗證規則
type FormRules = InstanceType<typeof ElForm>
const rules = ref<FormRules>({
email: [
{
required: true,
message : '請輸入電子信箱',
trigger : 'blur',
},
{
type : 'email',
message: '電子信箱格式不符',
trigger: [
'blur',
'change'
],
},
],
password : [{ validator: validatePassword, trigger: 'blur' }],
checkPass: [{ validator: checkPassword, trigger: 'blur' }],
})

const submitForm = async (formEl: FormInstance | undefined) => {
if (!formEl) return
await formEl.validate((valid, fields) => {
if (valid) {
console.log('submit!')
} else {
console.log('驗證', fields)
}
})
}
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()
}
onMounted(() => {

});
</script>

Github 專案說明
element-plus form validation

MySql CROSS JOIN 關鍵字 (SQL CROSS JOIN Keyword) - 交叉連接

CROSS JOIN 關鍵字 (SQL CROSS JOIN Keyword) - 交叉連接

交叉連接為兩個資料表間的笛卡兒乘積 (Cartesian product),兩個資料表在結合時,不指定任何條件,即將兩個資料表中所有的可能排列組合出來,以下例而言 CROSS JOIN 出來的結果資料列數為 3×5=15 筆,因此,當有 WHERE、ON、USING 條件時不建議使用。

1
2
3
4
5
6
7
8
9
10
SELECT table_column1, table_column2...
FROM table_name1
CROSS JOIN table_name2;
//or
SELECT table_column1, table_column2...
FROM table_name1, table_name2;
//or
SELECT table_column1, table_column2...
FROM table_name1
JOIN table_name2;

Example

1
2
3
SELECT customers.Name, orders.Order_No
FROM customers
CROSS JOIN orders;

MySql FULL JOIN 即為 LEFT JOIN 與 RIGHT JOIN 的聯集,它會返回左右資料表中所有的紀錄,不論是否符合連接條件。

FULL JOIN 即為 LEFT JOIN 與 RIGHT JOIN 的聯集

FULL JOIN 即為 LEFT JOIN 與 RIGHT JOIN 的聯集,它會返回左右資料表中所有的紀錄,不論是否符合連接條件。

1
2
3
4
SELECT table_column1, table_column2...
FROM table_name1
FULL JOIN table_name2
ON table_name1.column_name=table_name2.column_name;

Example

1
2
3
4
SELECT customers.C_Id,customers.Name,customers.Address,customers.Phone,customers.Salary,orders.Order_No,orders.Product,orders.Product,orders.Quantity
FROM `customers`
RIGHT JOIN `orders`
ON customers.C_Id =orders.C_Id
LEFT JOIN 會返回左側資料表中所有資料列,就算沒有符合連接條件,而右側資料表中如果沒有匹配的資料值就會顯示為 NULL。

MySql CREATE INDEX 敘述句 (SQL CREATE INDEX Statement)

CREATE INDEX 語法 (SQL CREATE INDEX Syntax)

索引 (index)

1
CREATE INDEX index_name ON table_name (column_name);

建立多欄位索引 (Multiple-Column Index)

什麼時候建立多欄位索引比較合適?如果您常對一張資料表查詢 WHERE column_name1=’xxx’ AND column_name2=’yyy’,這時你就可以對 column_name1 及 column_name2 這兩個欄位建立一個共同索引。

1
CREATE INDEX index_name ON table_name (column_name1, column_name2...);

DROP INDEX 敘述句 (SQL DROP INDEX Statement)

移除索引

1
ALTER TABLE table_name DROP INDEX index_name;

MySql INNER JOIN And x

INNER JOIN (內部連接)

INNER JOIN (內部連接) 為等值連接,必需指定等值連接的條件,而查詢結果只會返回符合連接條件的資料。

1
2
3
4
5
6
7
8
9
10
SELECT table_column1, table_column2...
FROM table_name1
INNER JOIN table_name2
ON table_name1.column_name=table_name2.column_name;
//or
SELECT table_column1, table_column2...
FROM table_name1
INNER JOIN table_name2
USING (column_name);

Example

1
2
3
4
SELECT customers.C_Id,customers.Name,customers.Address,customers.Phone,customers.Salary,orders.Order_No,orders.Product,orders.Product,orders.Quantity
FROM `customers`
INNER JOIN `orders`
ON customers.C_Id =orders.C_Id

NATURAL JOIN

1
2
3
SELECT table_column1, table_column2...
FROM table_name1
NATURAL JOIN table_name2;

Example

1
SELECT customers.C_Id,customers.Name,customers.Address,customers.Phone,customers.Salary,orders.Order_No,orders.Product,orders.Product,orders.Quantity FROM `customers` NATURAL JOIN `orders`;

MySql INSERT INTO

INSERT INTO 語法 (SQL INSERT INTO Syntax)

1
2
3
4
5
INSERT INTO table_name (column1, column2, column3...)
VALUES (value1, value2, value3...);
//or
INSERT INTO table_name
VALUES (value1, value2, value3...);
INSERT INTO例子
1
2
3
4
5
6
INSERT INTO customers (C_Id, Name, City, Address, Phone)
VALUES (3, '李三', '高雄縣', 'ZZ路300號', '07-12345678');
or
INSERT INTO customers
VALUES (3, '李三', '高雄縣', 'ZZ路300號', '07-12345678');

MySql INTERSECT 運算子 (SQL INTERSECT Operator)

INTERSECT 語法 (SQL INTERSECT Syntax)

相對於 UNION 像是 OR (聯集),INTERSECT 運算子則像是 AND (交集),如果紀錄存在於第一個查詢結果集內同時亦存在於第二個查詢結果集內時,才會被取出。

1
2
3
SELECT column_name(s) FROM table_name1
INTERSECT
SELECT column_name(s) FROM table_name2;

查出在台灣地區及中國大陸地區皆有銷售的產品類別的資料

1
2
3
SELECT P_Name FROM `products_taiwan`
INTERSECT
SELECT P_Name FROM `products_china`;
*MySQL 目前還不支援 INTERSECT。

MySql LEFT JOIN 關鍵字 (SQL LEFT JOIN Keyword) - 左外部連接

LEFT JOIN 可以用來建立左外部連接

LEFT JOIN 可以用來建立左外部連接,查詢的 SQL 敘述句 LEFT JOIN 左側資料表 (table_name1) 的所有記錄都會加入到查詢結果中,即使右側資料表 (table_name2) 中的連接欄位沒有符合的值也一樣。

1
2
3
4
SELECT table_column1, table_column2...
FROM table_name1
LEFT JOIN table_name2
ON table_name1.column_name=table_name2.column_name;

Example

1
2
3
4
SELECT customers.C_Id,customers.Name,customers.Address,customers.Phone,customers.Salary,orders.Order_No,orders.Product,orders.Product,orders.Quantity
FROM `customers`
LEFT JOIN `orders`
ON customers.C_Id =orders.C_Id
LEFT JOIN 會返回左側資料表中所有資料列,就算沒有符合連接條件,而右側資料表中如果沒有匹配的資料值就會顯示為 NULL。

MySql SELECT WHERE LIKE

(NOT) LIKE 運算子 (SQL (NOT) LIKE Operator)

LIKE 運算子搭配 WHERE 子句可以依一特定模式 (Pattern) 為條件來搜尋資料表中的特定資料。

1
2
3
SELECT table_column1, table_column2, table_column3...
FROM table_name
WHERE column_name LIKE pattern;

例如,找住在台北市的客戶:

1
SELECT * FROM `customers` WHERE City LIKE '台北%';

NOT LIKE

相反的,NOT LIKE 就是不包含在條件裡的的資料我通通要了,如上例多加上 NOT:

1
SELECT * FROM `customers` WHERE City NOT LIKE '台北%';