element-plus-admin の開発実績より (1) element-plus-admin ログイン

シリーズ記事ディレクトリ



序文

最近、vue2 に比べて vue3 を学習するのが多かれ少なかれ難しくなってきています。
フロントエンドプログラマなので、当然、横になっているわけにはいかないので、頑張って自分を豊かにしていきました。
GitHub でより優れたフレームワークを見つけて、探索して学習を始めました。
開発と学習には element-plus-admin を使用してください。GitHubアドレス
システムホーム
このフレームワークでは、ES2015+、vue-next、typescript、vite、postcss、element-plus のテクノロジーを使用しています
。まだ学習と探索中です。何か間違っている場合は、ご容赦ください。
あまり話さないで、始めましょう。


提示:以下是本篇文章正文内容

1.クロスドメインプロキシを解決する

element-plus-admin が使用する vite は初めての vite であり、多くの情報を参考にしました。この研究者は私のためにサービスをセットアップするために自分のサーバーを使用した友人なので、私がローカルでアクセスする彼のインターフェイスはクロスドメイン プロキシである必要があります。
vite.config.ts ファイルで直接、サーバー下のプロキシをコメントアウトして変更します。詳細は次のとおりです。

 server: {
    
    
            // proxy: env.VITE_PROXY ? proxy(JSON.parse(env.VITE_PROXY)) : {},
            proxy:{
    
    
                '/api':{
    
    
                    target:env.VITE_PROXY,
                    changeOrigin:true,
                    rewrite:(path) => path.replace(/^\/api/,'')
                }
            },
            port: env.VITE_PORT,
            host: '0.0.0.0'
        },

次に、.env.production ファイルで、VITE_PROXY を独自のものに変更します。

VITE_PROXY = [["/api","http://xxx.xxx.xx.xx:8011"]]

2. 認証コードを取得する

ここにログインするときは、ユーザー名とパスワードを入力し、グラフィック確認コードを自分で追加する必要があります。
ユーザーのログインのロジックは次のとおりです。
1. ユーザーがログイン ページを開くと、まずグラフィック検証コードを取得するリクエストを開始する必要があり、背景からイメージ アドレスと UUID が返されます。
2. ユーザーがログインするとき、userName、passWord、captchaCode、および uuid の 4 つのパラメータをログイン インターフェイスに渡す必要があります。
3. ログインに成功すると、ユーザー情報とトークンが返されます。
4. 次に、ルーティング インターフェイスを呼び出し、メニューに戻り、レンダリング後にホームページに入ります。

まず、views-user-login.vue ファイルにグラフィック検証コードを追加します。詳細なコードは次のとおりです。

<template>
    <div class='w-screen h-screen bg-gray-800'>
        <div class='layout-login' @keyup='enterSubmit'>
            <h3 class='text-2xl font-semibold text-gray-100 text-center mb-6'>系统登陆</h3>
            <el-form ref='ruleForm' label-position='right' label-width='80px' :model='form' :rules='rules'>
                <el-form-item class='mb-6 -ml-20' prop='name'>
                    <el-input v-model='form.name' placeholder='请输入用户名' prefix-icon='el-icon-user' />
                </el-form-item>
                <el-form-item class='mb-6 -ml-20' prop='pwd'>
                    <el-input v-model='form.pwd' placeholder='请输入密码' prefix-icon='el-icon-lock' show-password />
                </el-form-item>
                <el-form-item class='mb-6 -ml-20' prop='captchaCode'>
                    <el-input v-model='form.captchaCode' placeholder='请输入验证码' prefix-icon='el-icon-lock' style='width:260px' />
                    <el-image class='captchaCodeImg' style='width: 130px; height: 50px;margin-left:10px;border-radius:5px;' :src='captchaCodeImg' @click='getCaptchaCodeImg' />
                </el-form-item>
                <el-form-item class='mb-6 -ml-20'>
                    <el-button type='primary' class='w-full' @click='onSubmit'>登录</el-button>
                </el-form-item>
                
                <div class='flex justify-between'>
                    <div class='text-gray-300'>
                        <p class='leading-6 text-sm'><span class='w-24 inline-block'>账号: admin</span> 密码: 123456</p>
                        <p class='leading-6 text-sm'><span class='w-24 inline-block'>账号: dev</span> 密码: dev</p>
                        <p class='leading-6 text-sm'><span class='w-24 inline-block'>账号: test</span> 密码: test</p>
                    </div>
                    <div><el-button type='primary'>第三方登录</el-button></div>
                </div>
            </el-form>
        </div>
    </div>
</template>

<script lang="ts">
import {
    
     computed, defineComponent, reactive, ref } from 'vue'
import {
    
     useLayoutStore } from '/@/store/modules/layout'
import {
    
     ElNotification } from 'element-plus'
import {
    
     validate } from '/@/utils/formExtend'

export default defineComponent({
    
    
    name: 'Login',
    setup() {
    
    
        const {
    
     login } = useLayoutStore()
        let form = reactive({
    
    
            name: 'admin',
            pwd: '123456',
            captchaCode: '',
            uid: ''
        })
        const ruleForm = ref(null)
        const enterSubmit = (e:KeyboardEvent) => {
    
    
            if(e.key === 'Enter') {
    
    
                onSubmit()
            }
        }
        const onSubmit = async() => {
    
    
            let {
    
     name, pwd ,captchaCode ,uid } = form
            if(!await validate(ruleForm)) return
            await login({
    
     username: name, password: pwd , captchaCode: captchaCode , uid: uid })
            ElNotification({
    
    
                title: '欢迎',
                message: '欢迎回来',
                type: 'success'
            })
        }
        const rules = reactive({
    
    
            name: [
                {
    
     validator: (rule: any, value: any, callback: (arg0?: Error|undefined) => void) => {
    
    
                    if (!value) {
    
    
                        return callback(new Error('用户名不能为空'))
                    }
                    callback()
                }, trigger: 'blur' 
                }
            ],
            pwd: [
                {
    
     validator: (rule: any, value: any, callback: (arg0?: Error|undefined) => void) => {
    
    
                    if (!value) {
    
    
                        return callback(new Error('密码不能为空'))
                    }
                    callback()
                }, trigger: 'blur' 
                }
            ]
        })
        const captchaCodeImg = ref('')
        // getCaptchaCodeImg为请求图形校验码地址
        function getCaptchaCodeImg() {
    
    
            useLayoutStore().getCaptchaCodeImg()
                .then(res => {
    
    
                    console.log(res)
                    captchaCodeImg.value = res.image
                    form.uid = res.uid
                })
        }
        return {
    
    
            labelCol: {
    
     span: 4 },
            wrapperCol: {
    
     span: 14 },
            form, 
            onSubmit,
            enterSubmit,
            rules,
            ruleForm,
            captchaCodeImg,
            getCaptchaCodeImg
        }
    },
    mounted() {
    
    
        this.getCaptchaCodeImg()
    }
})
</script>

<style lang='postcss' scoped>
.layout-login {
    
    
    padding-top: 200px;
    width: 400px;
    margin: 0 auto;

    ::v-deep(.el-input__inner) {
    
    
        height: 50px;
        border: 1px solid hsla(0, 0%, 100%, 0.1);
        border-radius: 5px;
        color: #ddd;
    }
}

</style>

次に、グラフィック検証コードを取得するためのインターフェイスを api-layout-index.ts ファイルに追加します。詳細なコードは次のとおりです。

import request from '/@/utils/request'
import {
    
     AxiosResponse } from 'axios'
import {
    
     IMenubarList } from '/@/type/store/layout'

const api = {
    
    
    login: '/api/auth/login',
    getUser: '/api/auth/getUserInfo',
    getRouterList: '/api/auth/ownMenu',
    publickey: '/api/User/Publickey',
    getCaptchaCodeImg: '/api/auth/captcha' //获取图形验证码接口
}

export interface loginParam {
    
    
    username: string,
    password: string,
    captchaCode: string,
    uid: string
}

export function login(param: loginParam):Promise<AxiosResponse<IResponse<string>>> {
    
    
    return request({
    
    
        url: api.login,
        method: 'post',
        data: param
    })
}

export function publickey():Promise<AxiosResponse<IResponse<string>>> {
    
    
    return request({
    
    
        url: api.publickey,
        method: 'get'
    })
}

interface IGetuserRes {
    
    
    name: string
    role: Array<string>
}
interface ImgGetRes {
    
    
    image: string
    uuid: string
}

export function getUser(): Promise<AxiosResponse<IResponse<IGetuserRes>>> {
    
    
    return request({
    
    
        url: api.getUser,
        method: 'get'
    })
}
export function getRouterList(): Promise<AxiosResponse<IResponse<Array<IMenubarList>>>> {
    
    
    return request({
    
    
        url: api.getRouterList,
        method: 'get'
    })
}

export function getCaptchaCodeImg() {
    
    
    return request({
    
    
        url: api.getCaptchaCodeImg,
        method: 'get'
    })
}

3 番目に、store-modules-layout.ts を呼び出して getCaptchaCodeImg を導入します。

import {
    
     login, loginParam, getRouterList, getUser , getCaptchaCodeImg } from '/@/api/layout/index'

以下に追加

async getCaptchaCodeImg() {
    
    
     const res = await getCaptchaCodeImg()
     const CaptchaCode = res.data.data
     return CaptchaCode
 },

それでおしまい
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_36873710/article/details/125206868