0004章:留言板功能 vue3+ts+element-puls(前端)

1.路径 :src  /  request  / indexs.ts     //   axios封装     前提安装好:npm install axios 

import axios from 'axios'

import { ElNotification } from 'element-plus' // 消息提示
//创建axios实例
const service = axios.create({
    baseURL: '/api',
    timeout: 5000,
    headers: { 'Content-Type': 'application/json;charset=utf-8' }

});

//请求拦截
service.interceptors.request.use((config) => {
    config.headers = config.headers || {}
    if (localStorage.getItem('token')) {
        config.headers.token = localStorage.getItem('token') || ''
    }
    return config
})
//响应拦截
service.interceptors.response.use((res) => {
    const code: number = res.data.code
    if (code != 200) {
        ElNotification({
            title: '请求失败了看提示',
            message: res.msg,
            type: 'warning',
        })
        return Promise.reject(res.data)
    }
    return res.data
}, (error) => {
    console.log(error)
})

export default service

 2. 路径 :src  /  request  / apis.ts      留言板api接口  

import service from "./indexs";
// 参数
interface commetData {
    name: string  
    iphone: string
    words:string
}
// 留言api
export function commetInfo(data:commetData) {
    return service({
        url: '/add',
        method: 'post',
        data
    })
}

 3. 跨域解决: vite.config.ts

 

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import  { resolve } from 'path'
export default defineConfig({
  plugins: [vue()],
  resolve:{
    alias:[
        // 路径@替换./src
      {
        find:'@',
        replacement:resolve(__dirname,"./src")
      },
        //国际化
      {
        find: 'vue-i18n',
        replacement: 'vue-i18n/dist/vue-i18n.cjs.js', //解决i8n警告
      }
    ]
  }, 
  // 留言跨域
  server: {
    proxy: {
      '/api': {
        target: 'http://localhost:9999/message', // 实际请求地址
        changeOrigin: true,
        rewrite: (path) => path.replace(/^\/api/, ""),
      },
    },
  },
  // 不跨域的写法
  /*   server: {
      host: '192.168.1.195'
      // 0.0.0.0
    }, */
  
})

4.contact / index.vue  视图层

      
</template>   

 <!-- 留言板 -->
    <el-row>
        <el-col :span="12" :offset="6">
            <div class="grid-content ep-bg-purple">
                <el-form ref="ruleFormRef" :model="ruleForm" :rules="rules" label-width="80px">
                    <el-row>
                        <el-col>
                            <el-form-item :label="t('Name')" prop="name" required>
                                <el-input v-model="ruleForm.name" :placeholder="t('Enter')" />
                            </el-form-item>
                        </el-col>
                        <el-col>
                            <el-form-item :label="t('TL')" prop="iphone" required>
                                <el-input v-model="ruleForm.iphone" :placeholder="t('TLnum')" />
                            </el-form-item>
                        </el-col>
                    </el-row>
                    <el-form-item :label="t('Con')" prop="words" required>
                        <el-input v-model="ruleForm.words" type="textarea" :placeholder="t('Nr')" />
                    </el-form-item>
                    <el-form-item>
                        <el-button class="btnss" type="primary" @click="comment(ruleFormRef)">
                            {{ t('Sub') }}
                        </el-button>
                    </el-form-item>
                </el-form>
            </div>
        </el-col>
    </el-row>
</template>


<script lang="ts" >
import { defineComponent, reactive, ref, toRefs } from 'vue'
import { commetInfo } from "@/request/apis";
import { CommetData } from "@/type/param"
import type { FormInstance, FormRules } from 'element-plus'
import { ElNotification } from 'element-plus'
import useLocale from '../../hook/useLocale' // 国际化hook

export default defineComponent({
    setup() {

        const url = 'http://47.119.202.183:8081/static/images/contactUs.jpg'
        const ruleFormRef = ref<FormInstance>()
        const data = reactive(new CommetData())
        // 国际化语言
        const {
            i18n: { t }, // 解构实例用具t 访问语言变量
        } = useLocale()
        const rules = reactive<FormRules>({
            name: [
                {
                    required: true,
                    message: "姓名未填写",
                    trigger: "change",
                },
            ],
            iphone: [
                {
                    required: true,
                    message: "电话未填写",
                    trigger: "change",
                },
            ],
            words: [
                {
                    required: true,
                    message: "内容未填写",
                    trigger: "change",
                },
            ],
        })
        const comment = (formEl: FormInstance | undefined) => {
            if (!formEl) return
            formEl.validate((valid) => {
                if (valid) {
                    commetInfo(data.ruleForm).then((res) => {
                        console.log("-------", res);
                        ElNotification({
                            message: res.message,
                            type: 'success',
                        })
                    })
                } else {
                    return false
                }
            })
        }

        return {
            ...toRefs(data),
            rules,
            ruleFormRef,
            t,
            url,
            comment

        }
    },
});
</script>

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值