• Vue3+ts -01


    本节:vue3+ts的搭建

     一、vue3+ts的搭建

    这篇别人写的文章更清晰:http://t.csdn.cn/94Alu

     打开就可以看到,这样就创建成功了

     二、引入ant design

    (1) 在项目终端,输入这行命令:安装ant design

    npm i --save ant-design-vue

    (2)在main.ts文件里面引入和使用ant

    1. import Antd from 'ant-design-vue';//引入
    2. import 'ant-design-vue/dist/antd.css';
    3. const app: any = createApp(App)//把app的类型调成any
    4. app.use(router).use(Antd).mount('#app');//挂载使用

     ps:又遇到问题

     

     在eslintrc.js文件里面

    里面加上这段代码把那个检测的关掉:

    1. "rules":{
    2. "@typescript-eslint/no-explicit-any":["off"]
    3. },

    开启一下代码自动补全功能:

    发现还是不行,就又安装了这个插件就可以了

     

     修改任何配置文件都要重启项目,再重启动一下,警告就可以消失了。

    三、创建页面,搭建路由

    (1)安装VUE vscode snippets,也是可以快速生成vue代码

    (2)在view里面创建页面,vb t可以快速搭建框架

     (3)在router里面添加地址

     (4)在app.vue里面删掉一些默认样式,去掉一些默认的边框,

     四、写一个登录页面

    引入组件,然后对应文档改成自己要的属性就可以了,理解组件里面自带的很多属性来调整。

    自 3.0 版本以后,Form.Item 不再劫持子元素,而是通过 provider / inject 依赖注入的方式进行自动校验,这种方式可以提高组件性能,子元素也不会限制个数,同样子元素也可以是进一步封装的高级组件。这可能就是ts的意义。

    五、安装axios,封装axios

    在终端输入:安装axios

    npm install axios

    六、创建request文件夹,创建index.ts文件,封装axios

    1. import axios from "axios";
    2. //创建axios实例
    3. const service = axios.create({
    4. baseURL: "https://www.fastmock.site/mock/bf1fcb3c2e2945669c2c8d0ecb8009b8/api",
    5. timeout: 5000,//超时时间
    6. headers: {//编译语言
    7. "Content-type" : "application/json;charset=utf-8"
    8. }
    9. })
    10. //请求拦截
    11. //就是你请求接口的时候,我会先拦截下来,对你的数据做一个判断,或者携带个token给你
    12. service.interceptors.request.use((config) => {//请求的数据
    13. config.headers = config.headers || {} // 没有数据的话就设置为空设置为数据
    14. if(localStorage.getItem("token")){//先确保登录
    15. config.headers.token = localStorage.getItem("token") || ""
    16. }
    17. return config//必须返回出去,不然请求发不出去
    18. })
    19. //响应拦截:后端返回来的结果
    20. service.interceptors.response.use((res) => {
    21. const code : number = res.data.code//code是后端的状态码
    22. if(code != 200){
    23. return Promise.reject(res.data)
    24. //Promise.reject(res.data)可以返回失败的数据
    25. }
    26. return res.data//返回成功的数据
    27. },(err) => {
    28. console.log(err)//错误信息的处理
    29. })
    30. //因为别的地方要用,所以就把实例暴露出去,导出
    31. export default service

    写着写着发现,使用ant 跟不上视频教程的element,但是我决定还是先跟视频,了解一下vue3和typescript的基本先。所以以下又是element的写法。

    1.登录页面

    (1).使用数据,要先解构才能使用。

    因为return返回的就是一个对象,data也是对象,如果不解构就是对象包含对象,这是错误的

     (2).创建一个type文件夹,创建一个login.ts的文件,里面写接口,写类。

    写好类之后,引入,实例化,return回要用的数据。

    1. /**
    2. * 表单数据接口
    3. */
    4. export interface ILoginData{//写接口,ILoginData接口名
    5. username: string
    6. password: string
    7. }
    8. export class LoginData{//写类 LoginData是类名
    9. ruleForm: ILoginData = {//使用的对象
    10. username: "",
    11. password: ""
    12. }
    13. }

    (3)安装axios,,创建request文件夹,创建index.ts文件封装axios

    1. import axios from "axios";
    2. //创建axios实例
    3. const service = axios.create({
    4. baseURL: "https://www.fastmock.site/mock/bf1fcb3c2e2945669c2c8d0ecb8009b8/api",
    5. timeout: 5000,//超时时间
    6. headers: {//编译语言
    7. "Content-type" : "application/json;charset=utf-8"
    8. }
    9. })
    10. //请求拦截
    11. //就是你请求接口的时候,我会先拦截下来,对你的数据做一个判断,或者携带个token给你
    12. service.interceptors.request.use((config) => {//请求的数据
    13. config.headers = config.headers || {} // 没有数据的话就设置为空设置为数据
    14. if(localStorage.getItem("token")){//先确保登录
    15. config.headers.token = localStorage.getItem("token") || ""
    16. }
    17. return config//必须返回出去,不然请求发不出去
    18. })
    19. //响应拦截:后端返回来的结果
    20. service.interceptors.response.use((res) => {
    21. const code : number = res.data.code//code是后端的状态码
    22. if(code != 200){
    23. return Promise.reject(res.data)
    24. //Promise.reject(res.data)可以返回失败的数据
    25. }
    26. return res.data//返回成功的数据
    27. },(err) => {
    28. console.log(err)//错误信息的处理
    29. })
    30. //因为别的地方要用,所以就把实例暴露出去,导出
    31. export default service

    (4)写各个接口的封装,在request文件夹创建api.ts文件

    1. //我要用到的一些接口
    2. import service from "@/request/index";
    3. import {ILoginData} from "@/type/login"; //引入接口
    4. // 登录接口
    5. export function login(data: ILoginData) {//接口ILoginData接口的变量名
    6. return service({
    7. url: "/login",
    8. method: "POST",
    9. data
    10. })
    11. }
    12. // 商品列表接口
    13. export function getGoodsList(){
    14. return service({
    15. url: "/getGoodsList",
    16. method: "GET"
    17. })
    18. }
    19. // 用户列表接口
    20. export function getUserList(){
    21. return service({
    22. url: "/getUserList",
    23. method: "GET"
    24. })
    25. }
    26. // 角色列表接口
    27. export function getRoleList(){
    28. return service({
    29. url: "/getRoleList",
    30. method: "GET"
    31. })
    32. }
    33. // 权限列表接口
    34. export function getAuthorityList(){
    35. return service({
    36. url: "/getAuthorityList",
    37. method: "GET"
    38. })
    39. }

    (5)在表单点击登录的时候,再次进行一次验证,如果账号密码不正确,则无法登录跳转页面。

    1.在表单上进行ref绑定,绑定这整个表单的所有数据 ,ref="ruleFormRef",一点击传送的也是整个表单的数据

     2.引入模块,实例化模块,进行表单判断

     3.localStorage.setItem,将token保存到localStorage,并且进行路由跳转。

    (1)路由跳转的引入和实例化和路由跳转;使用 localStorage.setItem,将token保存到localStorage: localStorage.setItem("token", res.data.token);

     4.表单的提交与重置

     最后,整个登录页面的代码:

    1. <template>
    2. <div class="login-box">
    3. <div style="padding-top: 100px;width: 500px;margin:0 auto;background-color:white;border-radius:5px;height:300px;padding-top:50px;padding-left: 80px;">
    4. <el-form
    5. ref="ruleFormRef"
    6. :model="ruleForm"
    7. status-icon
    8. :rules="rules"
    9. label-width="70px"
    10. >
    11. <div style="text-align:center;margin-bottom: 30px;"> <h2>后台管理系统</h2></div>
    12. <el-form-item style="width:400px" label="用户名:" prop="username">
    13. <el-input v-model="ruleForm.username" type="text" autocomplete="off" />
    14. </el-form-item>
    15. <el-form-item style="width:400px" label="密码:" prop="password">
    16. <el-input v-model="ruleForm.password" type="password" autocomplete="off"/>
    17. </el-form-item>
    18. <el-form-item>
    19. <el-button class="login-btn" type="primary" @click="submitForm(ruleFormRef)">登录</el-button>
    20. <el-button class="login-btn" @click="resetForm(ruleFormRef)">重置</el-button>
    21. </el-form-item>
    22. </el-form>
    23. </div>
    24. </div>
    25. </template>
    26. <script lang="ts">//ts中有一个类型推断
    27. // ref有个value属性,可以获取值
    28. import { defineComponent, reactive,toRefs,ref } from 'vue'
    29. import { LoginData } from '../type/login'
    30. import type { FormInstance } from 'element-plus'
    31. import { login } from '../request/api'
    32. import { useRouter } from 'vue-router'
    33. export default defineComponent({
    34. setup () {
    35. const data = reactive(new LoginData());//调用这个类,然后实例化对象
    36. const router = useRouter();// 等于$router
    37. // 表单输入规则
    38. const rules = {
    39. username: [
    40. {
    41. required: true, //是否必须字段
    42. message: "请输入用户名", // 触发的提示信息
    43. trigger: "blur" // 触发时机: 当失去焦点时(光标不显示的时候),触发此提示
    44. },
    45. {
    46. min: 3, // 最小字符书
    47. max: 5, // 最大字符数
    48. message: "用户名长度需要在3-5个字符之间", // 触发的提示信息
    49. trigger: "blur"
    50. }
    51. ],
    52. password: [
    53. {
    54. required: true, //是否必须字段
    55. message: "请输入密码", // 触发的提示信息
    56. trigger: "blur" // 触发时机: 当失去焦点时(光标不显示的时候),触发此提示,就会进行校验
    57. },
    58. {
    59. min: 3, // 最小字符书
    60. max: 6, // 最大字符数
    61. message: "密码长度需要在3-5个字符之间", // 触发的提示信息
    62. trigger: "blur"
    63. }
    64. ]
    65. }
    66. //登录
    67. const ruleFormRef = ref<FormInstance>()//ref获取这个表单的所有值
    68. // formEl获取到的是一整个原型,里面有很多方法和属性
    69. // 比如 formEl.resetFields()就可以直接清空表单,具体可以看element的文档
    70. const submitForm = (formEl: FormInstance | undefined) => {
    71. if (!formEl) return//没有就返回
    72. // 验证表单,valid是一个布尔类型
    73. formEl.validate((valid) => {
    74. if (valid) {//如果为true,则调用接口,完成登录
    75. login(data.ruleForm).then((res) => {
    76. console.log(res)
    77. //使用 localStorage.setItem,将token保存到localStorage
    78. // res.data.token是后端返回的信息
    79. localStorage.setItem("token", res.data.token);
    80. // 并且跳转到首页
    81. router.push('/')
    82. });
    83. } else {
    84. console.log('error submit!')
    85. return false
    86. }
    87. })
    88. console.log(formEl);
    89. }
    90. // 重置
    91. const resetForm = () => {
    92. data.ruleForm.username = "";
    93. data.ruleForm.password = "";
    94. };
    95. // const resetForm = (formEl: FormInstance | undefined) => {
    96. // if (!formEl) return
    97. // formEl.resetFields()
    98. // }
    99. return {...toRefs(data),rules,ruleFormRef,submitForm,resetForm}//要用到的数据都要导出来
    100. }
    101. })
    102. </script>
    103. <style lang='scss' scoped>
    104. .login-box{
    105. width:100%;
    106. height:100%;
    107. background:url("../assets/1.jpg");
    108. padding-top: 200px;
    109. }
    110. </style>

  • 相关阅读:
    R语言矩阵操作:根据值找到行号和列号
    虚幻4学习笔记(11) 蓝图实现AI移动、AI树实现移动、看见后寻找玩家
    sed的介绍及应用
    谷粒商城-分布式基础项目环境搭建
    URLDNS利用链分析
    笔试题/面试题——数组去重--9种方法
    【OpenCV入门】第七部分——图像的几何变换
    Servlet规范之注解与可插拔性
    BP神经网络算法基本原理,bp神经网络算法的优点
    永磁材料测试仪系统全自动测量软件
  • 原文地址:https://blog.csdn.net/m0_59214979/article/details/126601008