從零開始-vue.js(1)登入介面
一、利用Vue cli快速搭建專案
(這裡假設已經安裝好所有webpack工具)
進入工程資料夾(自己建的),在終端輸入:
Vue init webpack toLogin2
其中:toLogin2是專案名,可自定義,終端將自動載入和下載必要的包,然後有一些項需要自己選擇,如下圖:
注意在“Use EsLint to lint your code?”這裡,新手一定要選no,親身經歷,選了EsLint真的很坑,少一個空格多一個空格都會報錯,無法正常執行專案,其他的選項基本預設回車就可以了。
至此,我們會在工程資料夾中看到一個專案名為toLogin2的專案資料夾,也就是我們可以啟動這個專案了!
啟動專案的方法:
基本都是進入專案資料夾→安裝專案依賴→執行專案
具體語法:
cd toLogin2
npm install
npm run dev
執行之後,會看到瀏覽器自動開啟(如果不開啟就手動複製後臺給的網址,一般是localohost:8080),如圖所示:
開啟之後的頁面:
至此,我們成功建立並運行了一個專案了,之後的專案將全部基於這個基礎的專案進行更改。
二、安裝必要的包
想要打出漂亮的介面,還需要有vue的UI元件庫,因此需要進入該專案資料夾,安裝element-ui元件庫;同時,要想實現登入之間的跳轉邏輯,還需要有axios作為和後臺的互動(類似js中的ajax)。輸入以下命令:
cd toLogin2 npm install axios -save npm install element-ui -save
這樣,我們就準備好了專案所需的所有工具,開始修改程式碼。
三、修改程式碼設計登入介面
先看專案的目錄:
需要我們做更改的是src裡面的元件,main.js中元件與路由的互動,以及App.vue中的呈現方式,index.js中的路由選擇。
1. APP.vue
專案的預設主元件,也就是專案開啟看到的頁面,需要修改為登入頁面:
(1)去掉預設圖片
(2)
2. 修改main.js:
主要是引進了元件庫:添加了如下三行程式碼:
import ElementUI from 'element-ui' import 'element-ui/lib/theme-default/index.css Vue.use(ElementUI)
3. 建立新的元件Login.vue
在components資料夾下新建一個檔案,命名為Login.vue,內容如下:
<template>
<div>
<h1>{{ msg }}</h1>
</div>
</template>
<script>
export default {
name: '登入',
data() {
return {
msg: 'welcome login'
}
}
}</script>
4. 修改router下的index.js
import Vue from 'vue'
import Router from 'vue-router'
//懶載入方式,當路由被訪問的時候才載入對應元件
const Login = resolve => require(['@/components/Login'], resolve)
Vue.use(Router)
export default new Router({
routes: [
{
path: '/',
name: '登入',
component: Login
}
]
})
來看看初步效果,頁面是否被更新:
終端執行報錯:
看描述是:找不到依賴,嘗試下面建議的解決方法,輸入
npm install -save element-ui/lib/theme-default/index.css
發現還是報錯:
複製錯誤資訊“Could not install from "element-ui/lib/theme-default/index.css" as it does not contain a package.json file.”在網上找解決方法:
嘗試著更換樣式檔案目錄,再次執行專案,編譯成功:
開啟介面,很好,已經改成我們的初始Login頁面了~
三、修改Login頁面
按照之前跟一個很厲害的前端博主學習的前端頁面構造初步構建,打算先畫一個基本的框架圖:
好的,接下來我們要按照這個粗糙的手稿開始打頁面啦~
經過修改後的Login.vue如下:
<template>
<!--背景圖-->
<!--login框,表單+tab標籤頁的組合-->
<div class = "loginFrame">
<el-form ref = "AccountForm" :model = "account" rules = "rules" label-position = "left" label-width = "0px" class = "demo-ruleForm login-container">
<!--tab標籤-->
<el-tabs v-model = "activeName" @tab-click = "handleClick" class = "users">
<el-tab-pane label = "學生" name = "students">學生</el-tab-pane>
<el-tab-pane label = "教師" name = "teacher">老師</el-tab-pane>
<el-tab-pane label = "教務老師" name = "eduTeacher">教務老師</el-tab-pane>
</el-tabs>
<el-form-item prop = "username">
<el-input type = "text" v-model = "account_username" auto-complete = "off" placeholder = "請輸入您的賬號"></el-input></el-form-item>
<el-form-item prop = "password"
<el-input type = "password" v-model = "account_password" auto-complete = "off" placeholder = "請輸入密碼"></el-input></el-form-item>
<el-checkbox v-model = "checked" checked class = "remember">記住密碼</el-checkbox>
<h3 class = "forgetpwd">忘記密碼</h3>
<el-form-item style = "width:100%;">
<el-button type = "primary" style = "width:100%;" >登入</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
export default {
name: '登入',
data() {
return {
logining : false,
account : {
username:'',
password:'',
},
rules: {
username :[
{required: true, message: '請輸入賬號',trigger: 'blur'},
//{ validator: validaePass }
],
password: [
{required: true,message: '請輸入密碼', trigger: 'blur'},
//{ validator: validaePass2 }
]
},
checked: true
};
}
}</script>
<style>
body {
background-image: url("./assets/zhongda.jpg");
background-size:100%;
background-repeat:no-repeat;
}
.login-container {
width:350px;
margin-left:35%
}</style>
執行,報錯:
在網上找了很多修改檔案路徑的方法:比如修改util.js、webpack.conf.base.js都沒有用,於是打算嘗試;另外一種引入背景圖片的方法:
在<template>標籤中設定一個單獨的div塊來裝背景圖片,與其他div塊是父子的關係,先寫在最前面,並在data裡面定義該背景div塊的樣式為全填充,如下所示:
<template>中加入:
<div class = "note" :style = "note">
data加入:
data() {
return {
logining : false,
note: {
position:"absolute",
top:"0px",
left:"0px",
width: "100%",
height:"100%",
backgroundImage: "url(" + require("../assets/zhongda.jpg") + ")",
backgroundSize: "100% 100%",
backgroundRepeat: "no-repeat",
},
再次修改了登入框的樣式,因為真的有點醜,看一下是新的login.vue檔案程式碼:
<template>
<!--背景圖-->
<div class = "note" :style = "note">
<!--login框,表單+tab標籤頁的組合-->
<div class = "loginFrame">
<el-form ref = "AccountForm" :model = "account" rules = "rules" label-position = "left" label-width = "0px" class = "demo-ruleForm login-container">
<!--tab標籤-->
<el-tabs v-model = "activeName" @tab-click = "handleClick" class = "users">
<el-tab-pane label = "學生" name = "students">學生</el-tab-pane>
<el-tab-pane label = "教師" name = "teacher">老師</el-tab-pane>
<el-tab-pane label = "教務老師" name = "eduTeacher">教務老師</el-tab-pane>
</el-tabs>
<el-form-item prop = "username">
<el-input type = "text" v-model = "account_username" auto-complete = "off" placeholder = "請輸入您的賬號"></el-input></el-form-item>
<el-form-item prop = "password"
<el-input type = "password" v-model = "account_password" auto-complete = "off" placeholder = "請輸入密碼"></el-input></el-form-item>
<el-checkbox v-model = "checked" checked class = "remember">記住密碼</el-checkbox>
<el-form-item style = "width:100%;">
<el-button type = "primary" style = "width:100%;" >登入</el-button>
</el-form-item>
</el-form>
</div>
</div>
</template>
<script>
export default {
name: '登入',
data() {
return {
logining : false,
note: {
position:"absolute",
top:"0px",
left:"0px",
width: "100%",
height:"100%",
backgroundImage: "url(" + require("../assets/zhongda.jpeg") + ")",
backgroundSize: "100% 100%",
backgroundRepeat: "no-repeat",
},
account : {
username:'',
password:'',
},
rules: {
username :[
{required: true, message: '請輸入賬號',trigger: 'blur'},
//{ validator: validaePass }
],
password: [
{required: true,message: '請輸入密碼', trigger: 'blur'},
//{ validator: validaePass2 }
]
},
checked: false
};
}
}</script>
<style>
.login-container {
box-shadow: 0 0px 8px 0 rgba(0, 0, 0, 0.06), 0 1px 0px 0 rgba(0, 0, 0, 0.02);
-webkit-border-radius: 5px;
border-radius: 5px;
-moz-border-radius: 5px;
background-clip: padding-box;
margin: 180px auto;
width: 350px;
padding: 35px 35px 15px 35px;
background: #fff
;
border: 1px solid #eaeaea;
box-shadow: 0 0 25px #cac6c6;
}</style>
由此,再次編譯執行,成功顯示背景圖!(真是太激動了哈哈哈~)
看起來再調一下登入框的樣式就可以搞定樣式部分了~
1. 需要新加一個忘記密碼的超連結,如果忘記密碼了就要跳轉到對應的頁面。
2. 需要設定頂部的tab標籤欄居中,中間各行el-form-item的間距固定並好看;
調了一下午,終於變成了醬紫:
不錯不錯,考慮到我們的主題色是綠色,因此改變一下element-ui的主題色:
1. 安裝主題生成工具
需要在專案資料夾終端內輸入:
npm i element-theme -g
npm i element-theme-chalk -D
2. 修改elementUI主題:
在終端輸入:
et -i
可以看見以下兩行提示,則編譯成功:
> ✔ build theme font
> ✔ build element theme
找到element-variables.scss檔案(安裝完後自動在該資料夾下生成),直接修改該檔案,例如這裡我只需要修改主題色,因此修改:
$--color-primary: green !default;
3. 編譯生成修改的主題:
儲存修改好的element-variables.scss檔案後,直接在終端輸入et編譯,編譯好之後,會在該目錄下生成theme資料夾,為修改之後的主題包
4.引入新的主題:
在main.js中引入新的主題:
import '../theme/index.css'
然後再次執行專案,發現主題已經按照需求更改好啦~(又是一次進步哈哈哈):
然後,小Tips:
如果對這個顏色不滿意,可以再次修改element-variables.scss檔案,然後再次編譯,編譯成功後,重新執行專案就好~
最後的最後,修改一下tab標籤欄中的字型大小和居中位置即可。
好的,可以居中,不能調字型大小,先這樣將就著看著吧,之後看看能不能再改:
持續更新……
這是初步的Login.vue
<template>
<!--背景圖-->
<div class = "note" :style = "note">
<!--login框,表單+tab標籤頁的組合-->
<div class = "loginFrame">
<!--表單元件放在外面,標籤欄在裡面-->
<el-form ref = "AccountForm" :model = "AccountForm" rules = "rules" class = "demo-ruleForm login-container">
<!--tab標籤-->
<div class = "tabsUser">
<el-tabs v-model = "activeName" @tab-click = "handleClick" class = "users" style = "height: 30px;font-size: 25px">
<el-tab-pane label = "學生" name = "students" class = "tab1"></el-tab-pane>
<el-tab-pane label = "教師" name = "teacher" class = "tab2"></el-tab-pane>
<el-tab-pane label = "教務老師" name = "eduTeacher" class = "tab3"></el-tab-pane>
</el-tabs>
</div>
<div class = "formGroup">
<el-form-item label = "賬號" prop = "user" >
<el-input type = "text" auto-complete = "off" placeholder = "請輸入您的賬號" class = "form-control" ></el-input></el-form-item>
<el-form-item label = "密碼" prop = "password" class = "form-inline">
<el-input type = "password" auto-complete = "off" placeholder = "請輸入密碼" class = "form-control" ></el-input></el-form-item>
</div>
<div class = "remFor">
<el-checkbox v-model = "checked" checked class = "remember">記住密碼</el-checkbox>
<a href ="'https://blog.csdn.net/Vanadis_outlook/article/details/72823024.html'" class = "forget">忘記密碼?</a>
</div>
<div class = "formButton">
<el-form-item style = "width:100%;">
<el-button type = "primary" style = "width:100%;" >登入</el-button>
</el-form-item>
</div>
</el-form>
</div>
</div>
</template>
<script>
export default {
name: '登入',
data() {
return {
logining : false,
note: {
position:"absolute",
top:"0px",
left:"0px",
width: "100%",
height:"100%",
backgroundImage: "url(" + require("../assets/zhongda.jpeg") + ")",
backgroundSize: "100% 100%",
backgroundRepeat: "no-repeat",
},
account : {
username:'',
password:'',
},
rules: {
username :[
{required: true, message: '請輸入賬號',trigger: 'blur'},
//{ validator: validaePass }
],
password: [
{required: true,message: '請輸入密碼', trigger: 'blur'},
//{ validator: validaePass2 }
]
},
checked: false
};
}
}</script>
<style>
.login-container {
-webkit-border-radius: 5px;
border-radius: 15px;
-moz-border-radius: 5px;
background-clip: padding-box;
margin: 180px auto;
width: 350px;
padding: 35px 35px 15px 35px;
background: rgba(255,255,255,0.7)
;
border: 1px solid #eaeaea;
box-shadow: 0 0 25px #cac6c6;
}
label{
width:70px;
text-align:left;
}
.form-control{
width:270px;
flex: 1;
-webkit-flex: 1;
-ms-flex: 1;
}
.remember{
width:250px;
text-align:left;
}
.forget{
width:500px;
text-align:right;
font-size:14px;
font-family:PingFang SC;
}
.remFor{
margin-bottom: 10px;
padding-bottom: 10px;
}
.tabsUser{
display: inline-block;
margin-left: 0px;
margin-right:0px;
text-align:center;
font-size:25px;
}
</style>