快速搭建前端页面并与后端交互

这篇具有很好参考价值的文章主要介绍了快速搭建前端页面并与后端交互。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

快速搭建前端页面

1 Vue

前置:需要先包含node环境
如果没有,可去node官网下载一个并配置
node官网地址:https://nodejs.org/zh-cn/

# 检测是否安装成功
node -v 

1.1 vue脚手架

  1. 检测是否有node环境,如果没有则去node官网下载配置【进入cmd执行以下命令】
node -v
  1. 安装vue脚手架
npm install -g @vue/cli
# 检测是否安装成功
vue --version 
  1. 创建项目
# 全局安装初始化命令
npm i -g @vue/cli-init
# 创建项目
vue init webpack 文件夹名称

如果当前文件夹已经存在会提示Target directory exists. Continue? 是否在当前目录下创建,输入yes表示同意

# 项目名
Project name -- testpro
# 项目描述
Project description -- A Vue.js project
# 作者
Author -- ziyi
# build选项
Vue build ("通过上下箭头选择")
	- Runtime+Compiler 运行加编译【建议】
	- Runtime-only 仅运行
# 是否安装路由【输入y或者n即可】
Install vue-router(Y/n) 
# 是否使用ESLint(代码风格校验工具)
Use ESLint to lint your code?(Y/n) 
# 是否设置单元测试
Set up unit tests (Y/n) 
# 是否设置端到端测试
Setup e2e tests with Nightwatch (Y/n) 
# 使用什么管理包
Should we run `npm install` for you after the project has been created?
	- Yes, use NPM (使用npm包管理)
	- Yes, use Yarn (使用yarn包管理)
	- No, I will handle that myself (自己处理)
  1. 项目初始化并启动

切记一定要进入项目的文件夹,否则会报找不到package.json

cd work(进入项目所在文件夹)

# 启动项目
npm run dev

网页前端和后端怎么连接起来,template,前端,webpack,vue.js,前后端分离,前后端交互
网页前端和后端怎么连接起来,template,前端,webpack,vue.js,前后端分离,前后端交互
5. 连接链接,访问
网页前端和后端怎么连接起来,template,前端,webpack,vue.js,前后端分离,前后端交互
项目结构:
网页前端和后端怎么连接起来,template,前端,webpack,vue.js,前后端分离,前后端交互

1.2 vue+elementUi实现注册登录

首先已经通过1.1的vue脚手架搭建好了vue基本框架,通是编写对应js

# 安装element-ui
npm i element-ui -S

vue项目结构介绍:
网页前端和后端怎么连接起来,template,前端,webpack,vue.js,前后端分离,前后端交互

①新建vue文件

新建两个Vue文件,Login.vue和Register.vue

Login.vue:

<template>
  <div class="loginbody">
    <div class="logindata">
      <div class="logintext">
        <h2>Welcome</h2>
      </div>
      <div class="formdata">
        <el-form ref="form" :model="form" :rules="rules">
          <el-form-item prop="username">
            <el-input
              v-model="form.username"
              clearable
              placeholder="请输入账号"
            ></el-input>
          </el-form-item>
          <el-form-item prop="password">
            <el-input
              v-model="form.password"
              clearable
              placeholder="请输入密码"
              show-password
            ></el-input>
          </el-form-item>
        </el-form>
      </div>
      <div class="tool">
        <div>
          <el-checkbox v-model="checked" @change="remenber"
            >记住密码</el-checkbox
          >
        </div>
        <div>
          <span class="shou" @click="forgetpas">忘记密码?</span>
        </div>
      </div>
      <div class="butt">
        <el-button type="primary" @click.native.prevent="login('form')"
          >登录</el-button
        >
        <el-button class="shou" @click="register">注册</el-button>
      </div>
    </div>
  </div>
</template>

<script>
import { login } from "@/api/login";

export default {
  name: "Login",
  data() {
    return {
      form: {
        password: "",
        username: "",
      },
      checked: false,
      rules: {
        username: [
          { required: true, message: "请输入用户名", trigger: "blur" },
          { max: 10, message: "不能大于10个字符", trigger: "blur" },
        ],
        password: [
          { required: true, message: "请输入密码", trigger: "blur" },
          { max: 10, message: "不能大于10个字符", trigger: "blur" },
        ],
      },
    };
  },
  mounted() {
    if (localStorage.getItem("news")) {
      this.form = JSON.parse(localStorage.getItem("news"));
      this.checked = true;
    }
  },
  methods: {
    login(form) {
      this.$refs[form].validate((valid) => {
        if (valid) {
          login(this.form)
            .then((res) => {
              if (res.code === 200) {
                setToken(res.data.token);
                localStorage.setItem("USERNAME", res.data.username);
                this.$message({
                  message: "登录成功啦",
                  type: "success",
                  showClose: true,
                });
                this.$router.replace("/");
              } else {
                this.$message({
                  message: "账户名或密码错误",
                  type: "error",
                  showClose: true,
                });
              }
            })
            .catch((err) => {
              this.$message({
                message: "账户名或密码错误",
                type: "error",
                showClose: true,
              });
            });
        } else {
          return false;
        }
      });
    },
    remenber(data) {
      this.checked = data;
      if (this.checked) {
        localStorage.setItem("news", JSON.stringify(this.form));
      } else {
        localStorage.removeItem("news");
      }
    },
    forgetpas() {
      this.$message({
        type: "info",
        message: "功能尚未开发额😥",
        showClose: true,
      });
    },
    register() {
      //跳转到注册页面
      this.$router.push({path:`register`})
    },
  },
};
</script>

<style scoped>
.loginbody {
  width: 100%;
  height: 100%;
  min-width: 1000px;
  background-image: url("../assets/login.png");
  background-size: 100% 100%;
  background-position: center center;
  overflow: auto;
  background-repeat: no-repeat;
  position: fixed;
  line-height: 100%;
  padding-top: 150px;
}

.logintext {
  margin-bottom: 20px;
  line-height: 50px;
  text-align: center;
  font-size: 30px;
  font-weight: bolder;
  color: white;
  text-shadow: 2px 2px 4px #000000;
}

.logindata {
  width: 400px;
  height: 300px;
  transform: translate(-50%);
  margin-left: 50%;
}

.tool {
  display: flex;
  justify-content: space-between;
  color: #606266;
}

.butt {
  margin-top: 10px;
  text-align: center;
}

.shou {
  cursor: pointer;
  color: #606266;
}
</style>

Register.vue:

<template>
  <div class="login clearfix">
    <div class="login-wrap">
      <el-row type="flex" justify="center">
        <el-form ref="loginForm" :model="user" status-icon label-width="80px">
          <h3>注册</h3>
          <hr>
          <el-form-item prop="username" label="用户名">
            <el-input v-model="user.username" placeholder="请输入用户名"></el-input>
          </el-form-item>
          <el-form-item prop="email" label="邮箱">
            <el-input v-model="user.email" placeholder="请输入邮箱"></el-input>
          </el-form-item>
          <el-form-item prop="password" label="设置密码">
            <el-input v-model="user.password" show-password placeholder="请输入密码"></el-input>
          </el-form-item>
          <el-form-item>
            <el-button type="primary" icon @click="doRegister()">注册账号</el-button>
          </el-form-item>
        </el-form>
      </el-row>
    </div>
  </div>
</template>
 
<script>
import axios from "axios";
export default {
  name: "login",
  data() {
    return {
      user: {
        username: "",
        email: "",
        password: ""
      },
    };
  },
  created() {
    // console.log($);
    // console.log("1111");
  },
  methods: {
    doRegister() {
      if (!this.user.username) {
        this.$message.error("请输入用户名!");
        return;
      } else if (!this.user.email) {
        this.$message.error("请输入邮箱!");
        return;
      } else if (this.user.email != null) {
        var reg = /^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/;
        if (!reg.test(this.user.email)) {
          this.$message.error("请输入有效的邮箱!");
        } else if (!this.user.password) {
          this.$message.error("请输入密码!");
          return;
        } else {
          // this.$router.push({ path: "/" }); //无需向后台提交数据,方便前台调试
          axios
            .post("/register/", {
              name: this.user.username,
              email: this.user.email,
              password: this.user.password
            })
            .then(res => {
              // console.log("输出response.data", res.data);
              // console.log("输出response.data.status", res.data.status);
              if (res.data.status === 200) {
                this.$router.push({ path: "/" });
              } else {
                alert("您输入的用户名已存在!");
              }
            });
        }
      }
    }
  }
};
</script>
 
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
.login {
  width: 100%;
  height: 740px;
  background-size: cover;
  overflow: hidden;
}
.login-wrap {
  background-size: cover;
  width: 400px;
  height: 300px;
  margin: 215px auto;
  overflow: hidden;
  padding-top: 10px;
  line-height: 20px;
}
 
h3 {
  color: #0babeab8;
  font-size: 24px;
}
hr {
  background-color: #444;
  margin: 20px auto;
}
 
.el-button {
  width: 80%;
  margin-left: -50px;
}
</style>
②新建js文件

login.js:

登录请求是通过引入外部js实现,注册请求则是通过写入vue页面中的script实现,没有做复用【当然也可以封装到外部,写在login.js或register.js中】

import Axios from "axios";
import {get, post} from "./http";

// post 请求
export const login = (params) => post(`login`, params)

网页前端和后端怎么连接起来,template,前端,webpack,vue.js,前后端分离,前后端交互

③添加路由配置

添加路由配置router文件夹下的index.js
一定要加上mode: "history",同时要import组件

index.js:

import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'
import Register from '@/components/Register'
import Login from '@/components/Login'

Vue.use(Router)

export default new Router({
  routes: [
    // {
    //   path: '/',
    //   name: 'HelloWorld',
    //   component: HelloWorld
    // },
    {
      path:'/',
      name: 'Login',
      component: Login
    },
    {
      path: '/register',
      name: 'Register',
      component: Register
    }
  ],
  mode: "history"
})

path:是指跳转路径,name是名称,component是组件名(对应.vue文件)

例如:/register表示如果路径是localhost:8080/register,就跳转到Register.vue文件夹下

④实例化vue对象,引入axios

实例化vue对象,引入需要使用的工具,如:axios、element-ui等

main.js:

import Vue from 'vue'
import App from './App'
import router from './router'
import axios from 'axios'
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
 
Vue.use(ElementUI)
//全局配置
Vue.prototype.$axios = axios
Vue.config.productionTip = false
 
/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  components: { App },
  template: '<App/>'
})
⑤效果

登录页面:
网页前端和后端怎么连接起来,template,前端,webpack,vue.js,前后端分离,前后端交互

注册页面:
网页前端和后端怎么连接起来,template,前端,webpack,vue.js,前后端分离,前后端交互

图片自取,页面图片,放在assets下,并命名为login.png:
网页前端和后端怎么连接起来,template,前端,webpack,vue.js,前后端分离,前后端交互

拓展:操作js(与后端交互)

①封装http请求

src/api/http.js
网页前端和后端怎么连接起来,template,前端,webpack,vue.js,前后端分离,前后端交互

http.js:

// 封装通用请求
import axios from 'axios'
import router from '../router'
axios.defaults.timeout = 5000 // 超时时间:5s
axios.defaults.withCredentials = true// 允许跨域
// Content-Type 响应头
axios.defaults.headers.post['Content-Type'] = 'application/x-www.form-urlencoded;charset=UTF-8'
// 访问基础url
axios.defaults.baseURL = 'http://localhost:8090'

// 响应拦截器
axios.interceptors.response.use(
  response => {
    // 如果response里面的status是200,说明访问到接口了,否则失败
    if (response.status === 200) {
      // Promise:异步框架
      return Promise.resolve(response)
    } else {
      return Promise.reject(response)
    }
  },
  error => {
    if (error.response.status) {
      // 根据访问失败返回的状态码,分别做不同的处理
      switch (error.response.status) {
        case 401: // 未登录
          router.replace({
            path: '/',
            query: {
              redirect: router.currentRoute.fullPath // 存之前访问地址
            }
          })
          break
        case 404: // not found
          break
      }
      return Promise.reject(error.response)
    }
  }
)

/**
 * 封装get请求
 */
export function get (url, params = {}) {
  return new Promise((resolve, reject) => {
    axios.get(url, {params: params})
      .then(response => {
        resolve(response.data)
      })
      .catch(err => {
        reject(err)
      })
  })
}

/**
 * 封装post请求
 */
export function post (url, data = {}) {
  return new Promise((resolve, reject) => {
    axios.post(url, data)
      .then(response => {
        resolve(response.data)
      })
      .catch(err => {
        reject(err)
      })
  })
}

②定义请求的js

例如文件为:index.js【文件放在src/api/index.js】

//查询所有歌手【普通的get请求,不带参数】
export const getAllSinger = () => get(`singer/selectAll`)

//根据歌手性别查询【带参数的get请求】
export const getSingerOfSex = (sex) => get(`singer/selectSingerOfSex?sex=${sex}`)

//返回当前的评论列表【根据传参发送不同请求】
export const getAllComment = (type, id) => {
  if(type == 0){ //type: 0 歌曲
    return get(`comment/commentOfSongId?songId=${id}`);
  }else{ //歌单
    return get(`comment/commentOfSongListId?songListId=${id}`);
  }
}

//新增收藏【post请求】
export const setCollect = (params) => post(`collect/add`, params);

//下载音乐【异步请求】
export const download = (url) => Axios({
  method: 'get',
  url: url,
  responseType: 'blob'
})
③在页面中引入并使用

在xxx.vue的<script>标签中引入对应的js

  • import {getAllSinger} from '../api/index';

在Singer.vue中的script标签中引入对应的js方法,一般我们都会多封装一层【getAllSinger被封装为getSingerList】

// export const getAllSinger = () => get(`singer/selectAll`)
<script>
import ContentList from "../components/ContentList";
import {getAllSinger} from '../api/index';
import {mixin} from "../mixins";
import {singerStyle} from '../assets/data/singer';

export default {
    name: 'singer',
    components:{
      ContentList
    },
  data(){
      return {
        albumDatas: [],   //歌手数据
        pageSize: 10,     //页面大小
        currentPage: 1,
        singerStyle:[],   //歌手类型
        activeName: '全部歌手', //当前风格【类型】
      }
  },
  computed:{
      //计算当前表格中的数据
    data(){
      return this.albumDatas.slice((this.currentPage - 1) * this.pageSize, this.currentPage*this.pageSize)
    }
  },
  mounted() {
      this.singerStyle = singerStyle;
      this.getSingerList();
  },
  methods:{
      //获取歌手列表
    getSingerList() {
      getAllSinger()
      .then(res => {
        this.currentPage = 1;
        this.albumDatas = res;
      })
    }
  }

}
</script>

2 Element-UI

2.1 提交表单

SongListPage.vue:

//html部分
<el-dialog title="添加歌单" :visible.sync="centerDialogVisible" width="400px" center>
 <el-form :model="registerForm" ref="registerForm" label-width="80px">
   <el-form-item prop="title" label="标题" size="mini">
       <el-input v-model="registerForm.title" placeholder="标题"></el-input>
             </el-form-item>
     <el-form-item label="歌单风格" prop="style">
         <el-select v-model="registerForm.style" placeholder="请选择歌曲风格">
           <el-option label="流行" :value="'流行'"></el-option>
           <el-option label="摇滚" :value="'摇滚'"></el-option>
           <el-option label="古典" :value="'古典'"></el-option>
         </el-select>                    
     </el-form-item>
 </el-form>
    <span slot="footer">
        <el-button size="mini" @click="centerDialogVisible = false">取消</el-button>
        <el-button size="mini" @click="addSongList">确定</el-button>
    </span>
</el-dialog>

其中,el-select的registerForm.style对应的是script中data的registerForm的style,el-form-item对应传给后端的属性名文章来源地址https://www.toymoban.com/news/detail-756234.html

//js 部分
<script>
import { getAllSongList, setSongList, updateSongList, delSongList} from '../api/index';
import {mixin} from '../mixins/index';

export default {
    mixins:[mixin],
    data: function(){
        return{
            registerForm:{  //添加框
                title:'',
                introduction:'',
                style: ''
            },
        };
    },
    methods:{

        //添加歌单
        addSongList(){
            let params = new URLSearchParams();
            params.append('title', this.registerForm.title);
            params.append('pic', '/img/songListPic/songList1.png');
            params.append('introduction', this.registerForm.introduction);
            params.append('style', this.registerForm.style);

            setSongList(params)
            .then(res => {
                if(res.code == 1){
                    this.getData();
                    this.notify("添加成功", "success");
                } else {
                    this.notify("添加失败", "error");
                }
            })
            .catch(err => {
                console.log(err);
            });
            //添加成功之后清除添加框
            this.registerForm = {}
        },
    }
}
</script>

到了这里,关于快速搭建前端页面并与后端交互的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • uniapp微信小程序+echarts简单图表以及与后端交互

    效果图:   需要的两个主要文件就是  echarts.min.js   和  echarts.vue  1、 echarts.min.js 可以去官网定制 链接   ECharts 在线构建   或者直接去GitHub - Tawesome666/echarts: echarts 下载 (注意:我这个只有柱状图和折线图) 2、 echarts.vue  可以使用 Visual Studio Code  打开你的文件夹使用命

    2024年02月09日
    浏览(33)
  • 前端与后端的交互--请求与响应

    讲解基于springboot + vue + axios项目。 Content-Type位于请求头和响应头,在请求中指示请求体的数据类型;在响应中指示响应体的数据类型。在HTTP请求中,默认的Content-Type类是\\\"application/x-www-form-urlencoded\\\",而在HTTP响应中,默认的Content-Type类型取决于所返回的内容类型,如HTML、纯文

    2024年02月20日
    浏览(32)
  • web开发中,简单的案例说明前端页面和后端以及mysql数据库的交互过程

            首先这是一个基于 web开发 的稿子,作者也是转java20天左右,以前也一直迷惑起那段页面是如何和后端进行交互,数据提交提交到了哪里?后端开发如何获取到前端提交的数据呢?后端数据提交到数据库中应该如何处理,接下来通过一个简单的例子,登录案例 (实

    2024年02月03日
    浏览(44)
  • Socket.D v2.3 发布(打通前端与后端)

    基于事件和语义消息流的网络应用层协议。 有用户说,“Socket.D 之于 Socket,尤如 Vue 之于 Js、Mvc 之于 Http”。支持 tcp, udp, ws, kcp 传输。 主要特性 基于事件,每个消息都可事件路由 所谓语义,通过元信息进行语义描述 流关联性,来回相关的消息会串成一个流 语言无关,使用

    2024年02月01日
    浏览(28)
  • 安防视频监控平台EasyCVR前端解码与后端解码的区别介绍

    视频监控平台/视频存储/视频分析平台EasyCVR基于云边端一体化管理,支持多类型设备、多协议方式接入,具体包括:国标GB28181协议、RTMP、RTSP/Onvif、海康Ehome,以及海康SDK、大华SDK、华为SDK、宇视SDK、乐橙SDK、萤石SDK等,可覆盖市面上绝大多数的视频源设备。 前两期我们介绍

    2024年02月07日
    浏览(30)
  • 路由hash模式改成history模式的前端vue配置与后端配置

    示例项目地址:http://172.00.00.000:8888/Web/static/index.html/index ,其中: /Web/static/ 表示项目部署路径,每个人的路径不一样,vue默认路径是根路径/,如果你项目不是部署在根路径,那就需要修改一些配置 index.html 表示项目入口文件 /index 表示项目首页的路由地址 vue前端配置 1.配置路

    2024年02月15日
    浏览(37)
  • 构建高效的BFF(Backend for Frontend):优化前端与后端协作

    2023最新面试合集链接 2023大厂面试题PDF 面试题PDF版本 java、python面试题 项目实战:AI文本 OCR识别最佳实践 AI Gamma一键生成PPT工具直达链接 玩转cloud Studio 在线编码神器 玩转 GPU AI绘画、AI讲话、翻译,GPU点亮AI想象空间 史上最全文档AI绘画stablediffusion资料分享 AI绘画关于SD,MJ,GPT,

    2024年02月09日
    浏览(37)
  • Vue入门三(表单控制|购物车案例|v-model进阶|与后端交互|计算属性|监听属性|Vue生命周期)

    v-model双向数据绑定,还可以对输入框数据进行一定的限定。 v-modle 释义 lazy 等待input框的数据绑定时区焦点之后再变化 number 以数字开头并只保留后面的数字,不保留字母;字母开头都保留 trim 去除首位的空格 与后端交互统一使用json编码格式 与后端交互涉及到跨域问题后,

    2024年01月21日
    浏览(38)
  • 使用代码生成工具快速开发应用-结合后端Web API提供接口和前端页面快速生成,实现通用的业务编码规则管理

    在前面随笔《在Winform应用中增加通用的业务编码规则生成》,我介绍了基于Winform和WPF的一个通用的业务编码规则的管理功能,本篇随笔介绍基于后端Web API接口,实现快速的Vue3+ElementPlus前端界面的开发整合,同样是基于代码生成工具实现快速的前端代码的生成处理。 在前面

    2024年02月04日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包