IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> vuecli项目实战--管理系统 -> 正文阅读

[JavaScript知识库]vuecli项目实战--管理系统

一、项目搭建

HBuider直接:新建--项目--填项目名称、选地址、下拉选vue项目(2.6.10)

项目结构这个样子:

?

二、前端配置

1.路由配置(地址)

在src文件夹下创建router文件夹 在router文件夹下面创建js文件 index.js---配置组件的地址 还有导航守卫、路由嵌套也配在这里

1.组件路由

2.组件路由嵌套

3.路由导航

记得跟vue对象关联还有导出路由嗷

import Vue from 'vue'; /* 导入vue */
import router from 'vue-router'; /* 导入路由组件  实现组件切换功能  */
/* 导入自己要用的组件 */
import Login from "../views/Login.vue";
import Main from "../views/Main.vue";
import Logon from "../views/Logon.vue";
?
import Teacher from "../views/teacher/TeacherList.vue";
import Student from "../views/student/StudentList.vue";/* 后面是地址  前面名字可以自定义 */
 
Vue.use(router) /*  vue对象跟ruoter关联 */
?
/* 定义组件  主要是为他提供地址*/
var rout = new router({
    routes: [ /* 可以定义多组数据 */ 
    {
            path: '/login',
            /* 给组件配置的地址 */
            name: 'Login',
            /* 可以不写  */
            component: Login,
            /* 指定跟哪个组件对应 */
?
        },
        {
            path: '/main',
            name: 'Main',
            component: Main,
            children: [ /* 路由嵌套*/
                {
                    path: '/teacher',
                    name: 'Teacher',
                    component: Teacher,
                },
                {
                    path: '/student',
                    name: 'Student',
                    component: Student,
                }
            ]
        },
        {
            path: '/logon',
            name: 'Logon',
            component: Logon,
        },
        
    ]
});
?
?
//路由导航守卫 ? 一旦发生路由跳转就会发生此函数
rout.beforeEach((to, from, next) => {//to,from表示从哪来  到哪去  next放行  是她要跳转的地址 验证通过就可以跳转过去  不通过直接跳转回login界面
    if (to.path == '/login') { //如果用户访问的登录页,直接放行 
        return next();
    } 
    else if(to.path=='/logon'){
        return next();
    }else{
        var account = window.sessionStorage.getItem("account");//用账号查  账号不可能为空
        if (account == null) {//账号为空 ? 表明没有登录  让他去登录界面
            return next("/login");
        } else {
            next();
        }
    }
})
?
?
//导出路由对象
export default rout;
?

2.全局配置

要用的ElementUI组件 还有网络请求库axios 下载和配置 还有刚才的路由也要配置进来 还有响应拦截器

1.下载ElementUI组件、网络请求库axios:

在终端输入:npm i element-ui -s 下载ElementUI

在终端输入:npm install axios 下载axios

2.配置全局路径:

Vue.config.productionTip = false;//设置不打印生产模式
import Vue from 'vue';//导入vue.js
import App from './App.vue';//导入当前目录下的App组件
?
?
/* 导入路由功能  */
import router from "./router/index.js"
Vue.use(router);
?
/* 导入ElementUI */
import ElementUI from 'element-ui';
import "element-ui/lib/theme-chalk/index.css";
Vue.use(ElementUI);
?
?
 ?
//导入网络请求库axios
import axios from "axios"
axios.defaults.baseURL="http://localhost:8088/webBack/";//定义后端地址  发送请求的时候就只发送后面的就可以 ?
Vue.prototype.$http = axios;//将axios绑定到Vue对象中  直接this就可以用vue对象
axios.defaults.withCredentials = true;//身份认证  这样请求向后端发的时候就会将id放在请求头中一起发 自动发
/* axios怎么用: ? 直接this.$http.get或post请求 */
?
?
//添加响应拦截器
/* 后端要是响应500  就被拦截器拦截下来  然后提示系统忙 */
axios.interceptors.response.use((resp)=>{
    if(resp.data==201){
        router.replace("/login");/* 通过上面的路由对象  直接路由跳转 */
    }
    if(resp.data==500){
        ElementUI.Message({message: '系统忙,请稍后再试',type: 'warning'});
    }
    
return resp;
},(error)=>{/* 发送请求失败 ? 发都没发出去*/
    
    ElementUI.Message({message: '请求地址有误',type: 'error'});
    return Promise.reject(error);
    
}
); 
?
?
?
?
?
 
new Vue({
  render: h => h(App),
 ?
  router,
 ?
 ?
}).$mount('#app');//把Vue对象跟id为app的绑定起来 
/*即:创建一个Vue对象,并把App组件注册进去  把app标签与Vue对象绑定*/

3.显示组件

在src文件夹下面的App.vue里面 加上<router-view></router-view>让组件显示出来

<template>
  <div id="app">
<router-view></router-view><!-- 让组件显示出来 -->
?
  </div>
</template>
?
<script>
?
export default {
 ?
}//导出
</script>
?
<style>
?
</style>
?
?
<!-- App就是一张画布 -->

三、前端发送异步请求

1.get:通过id查找学生 把id传进去 resp接收返回的数据

this.$http.get("student?mark=findStudentID&id="+id).then((resp) => {
    then回调的数据resp.date.点出来就可以了 不返回数据的then可以不写
 ?  比如this.form.num=resp.data.num;拿到后端传回来的num赋给from表单的num
 ? ?
 ? ?
                }); ?
只是发送请求  没有回调  mark是为了处理doget请求的时候好分辨  因为可能有很多请求发送get请求
?
this.$http.get("student?mark=delete");

2.post:直接用jsonToString(this.form))方法把表单信息都发送过去

this.$http.post("back/student?mark=save",jsonToString(this.form)).then((resp) => {
                //发post请求  将表单发过去
                if(resp.data==200){
                    this.$message({message: '保存成功',type: 'warning'});
                    this.dialogVisible=false;//把页面关掉
                    this.$router.go();//更新界面
                }
            }); 

四、后端项目搭建

创建java项目 添加web依赖

项目名 右键 Add Rramework Support...

?

勾选 Web Application(4.0)

?

打开工具栏:点viwe ---点Appearance ---点Toolbar

?

五、后端配置

1.配置服务器:

?

点工具栏中Add Configurations 点+号

?

下拉找到Tomcat Server 点进去 点Local

?

上面的配置好了 点Deployment 把项目部署到服务器

+号 Artifact

?

?

ok 再返回Server过去 应用 ok就好了

2.导包

在WEB-INF文件夹下面创建bli文件夹 在里面导包 记得添加依赖(点包 右键 下拉)

?

gson是格式的 myspl连接数据库的 servlet服务器的

2.Servlet配置

两种方法

1.在web.xml里面配置 servlet在里面配置 过滤器也在里面配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
 ? ? ? ? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 ? ? ? ? xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
 ? ? ? ? version="4.0">
 ?  <!--xml 可扩展标记语言  主要用于记录数据  有一定规则
 ?  web.xml:是web项目的配置文件,此文件在服务器启动是,由服务器读取  加载里面的配置(servlet、过滤器、监听器...)
 ?  -->
?
 ?  <!--配置注册servlet-->
 ?  <servlet>
 ? ? ?  <servlet-name>login</servlet-name>
 ? ? ?  <servlet-class>com.ffyc.webback.servlet.LoginServlet</servlet-class>
?
 ?  </servlet>
 ? ?
 ?  <!--为servlet配置地址-->
 ?  <servlet-mapping>
 ? ? ?  <servlet-name>login</servlet-name>
 ? ? ?  <url-pattern>/login</url-pattern>
 ?  </servlet-mapping>
?
?
 ?  <!--配置跨域过滤器-->
 ? <filter>
 ? ? ? <filter-name>crossFilter</filter-name>
 ? ? ? <filter-class>com.ffyc.webback.filter.CorsFilter</filter-class>
 ? </filter>
 ?  <!--配置哪些请求进入到过滤器中-->
 ?  <filter-mapping>
 ? ? ?  <filter-name>crossFilter</filter-name>
 ? ? ?  <url-pattern>/*</url-pattern><!--所有都要进入到过滤器-->
 ?  </filter-mapping>
?
?
 ?  <!--配置编码过滤器-->
 ?  <filter>
 ? ? ?  <filter-name>encodFilter</filter-name>
 ? ? ?  <filter-class>com.ffyc.webback.filter.EncodFilter</filter-class>
 ?  </filter>
 ?  <filter-mapping>
 ? ? ?  <filter-name>encodFilter</filter-name>
 ? ? ?  <url-pattern>/*</url-pattern>
 ?  </filter-mapping>
?
 ?  <!--配置后端登录验证过滤器-->
 ?  <filter>
 ? ? ?  <filter-name>isloginFilter</filter-name>
 ? ? ?  <filter-class>com.ffyc.webback.filter.IsLoginFilter</filter-class>
 ?  </filter>
 ?  <filter-mapping>
 ? ? ?  <filter-name>isloginFilter</filter-name>
 ? ? ?  <url-pattern>/back/*</url-pattern><!--除了登录不用过滤  其他都要  路径上做文章  登录的路径是/login  其他路径可以前面都
 ? ? ?  加一个back  比如测试的 /back/test-->
 ?  </filter-mapping>
</web-app>

2.直接在servlet注解配置

@WebServlet(name=" 访问 ",urlPatters=" 地址名 ")

?

六、后端接收请求、处理

创建个servlet文件夹 把用到的各种servlet放在里面 、创建一个dao文件夹 连接数据库处理的到就放在里面

servlet接收前端传过来的请求 根据mark判断调哪个方法 根据请求的具体又调用dao类里面处理哪些数据的方法 dao里面的方法是跟数据库对接的

比如查询学生列表

1.判断mark调用哪个方法

?

2.调方法(该方法还是在servlet里面的)

3.调dao里面的方法 与数据库连接

 ? //查询学生列表的dao操作
 ? ?public List<Student> ?findList (String num,String name) throws ClassNotFoundException, SQLException {
?
 ? ? ? ?Connection connection=null;
 ? ? ? ?PreparedStatement ps=null;
 ? ? ? ?ResultSet rs=null;
 ? ? ? ?ArrayList<Student> students=new ArrayList<>();//对象储存信息  最后将这个对象返回回去
 ? ? ? ?try {
 ? ? ? ? ? ?Class.forName("com.mysql.cj.jdbc.Driver");
 ? ? ? ? ? ?connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/webdb?serverTimezone=Asia/Shanghai", "root", "root");
?
 ? ? ? ? ? ?String spl="\n" +
 ? ? ? ? ? ? ? ? ? ?"SELECT \n" +
 ? ? ? ? ? ? ? ? ? ?"s.id,\n" +
 ? ? ? ? ? ? ? ? ? ?"s.num,\n" +
 ? ? ? ? ? ? ? ? ? ?"s.name sname,\n" +
 ? ? ? ? ? ? ? ? ? ?"s.gender,\n" +
 ? ? ? ? ? ? ? ? ? ?"s.phone,\n" +
 ? ? ? ? ? ? ? ? ? ?"g.name gname,\n" +
 ? ? ? ? ? ? ? ? ? ?"a.account,\n" +
 ? ? ? ? ? ? ? ? ? ?"s.oper_time\n" +
 ? ? ? ? ? ? ? ? ? ?"FROM student s LEFT JOIN grade g ON s.gradeid=g.id \n" +
 ? ? ? ? ? ? ? ? ? ?" ? ? ? ? ? ? ? ? ? ? ?  LEFT JOIN admin a ON s.adminid=a.id "+
 ? ? ? ? ? ? ? ? ? ?"where 1=1";
/*1=1就不用考虑先后问题了*/
 ? ? ? ? ? ?if (num != null && num != ""){
 ? ? ? ? ? ? ? ?spl+=" and s.num="+num;
 ? ? ? ? ?  }
 ? ? ? ? ? ?if (name != null && name != ""){
 ? ? ? ? ? ? ? ?spl+=" and s.name='"+name+"'";
 ? ? ? ? ?  }
 ? ? ? ? ? ?ps=connection.prepareStatement(spl);
?
 ? ? ? ? ? ?
 ? ? ? ? ? ?rs=ps.executeQuery();//将查询结果封装到rs中 可能多条数据  while循环
 ? ? ? ? ? ?while (rs.next()){
 ? ? ? ? ? ? ? Student student=new Student();//每循环一次  就new一个对象
 ? ? ? ? ? ? ? ?student.setId(rs.getInt("id"));/*以别名为准*/
 ? ? ? ? ? ? ? ?student.setNum(rs.getInt("num"));
 ? ? ? ? ? ? ? ?student.setName(rs.getString("sname"));
 ? ? ? ? ? ? ? ?student.setGender(rs.getString("gender"));
 ? ? ? ? ? ? ? ?student.setPhone(rs.getString("phone"));
 ? ? ? ? ? ? ? ?student.setGradeName(rs.getString("gname"));
 ? ? ? ? ? ? ? ?student.setAccount(rs.getString("account"));
 ? ? ? ? ? ? ? ?student.setOperTime(rs.getTimestamp("oper_time"));
 ? ? ? ? ? ? ? ?students.add(student);
?
 ? ? ? ? ?  }
 ? ? ?  }finally {
 ? ? ? ? ? ?if (ps!=null){
 ? ? ? ? ? ? ? ?ps.close();
 ? ? ? ? ?  }
 ? ? ? ? ? ?if (rs!=null){
 ? ? ? ? ? ? ? ?rs.close();
 ? ? ? ? ?  }
 ? ? ? ? ? ?if (connection!=null){
 ? ? ? ? ? ? ? ?connection.close();
 ? ? ? ? ?  }
?
 ? ? ?  }
 ? ? ? ?return students;//这里的admin=null
 ?  }
?
?

七、前端接收后端的响应

1、基操

1.拿到返回的对象:resp.data拿到返回来的对象 信息都封装在里面 点就可以拿到了

比如resp.data.id拿到返回来的id

2.日期有格式问题 拿到后要格式化

(resp.data.birthday).toLocaleString();//格式化生日

3.登录成功后可以把拿到的信息放到浏览器里面 就可以显示出来 如显示账号头像昵称

window.sessionStorage.setItem("account",resp.data.account);

然后要显示的话:在要显示的vue界面 的导出里面 把数据放到data的return里面

?

想在哪里显示就{{account}} 即可

2.路由嵌套--在一个组件里打开另一个组件 即子组件

如在Main.vue组件里打开学生列表组件

1.在Main组件的路由里 加一个子组件children 地址path

?

2.打开子组件:设置index="刚设置的子组件的地址path" 点击学生管理就会显示出学生列表组件

?

让组件显示出来 在要显示的区域加<router-view></router-view>

?

3.在学生列表组件里面再打开添加学生组件

直接在添加学生组件里面 导入组件 注册 显示

1.导入组件

2.注册组件

3.显示组件

?

八、数据库的增删改查

1.增 新增学生信息

 public void save(String num, String name, String gender, String birthday, String phone, String gradeId,int id) throws SQLException, ClassNotFoundException {
?
 ? ? ? ?Connection connection=null;
 ? ? ? ?PreparedStatement ps=null;
?
 ? ? ? ?try {
 ? ? ? ? ? ?Class.forName("com.mysql.cj.jdbc.Driver");
 ? ? ? ? ? ?connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/webdb?serverTimezone=Asia/Shanghai", "root", "root");//连接数据库
 ? ? ? ? ? ?ps=connection.prepareStatement("" +
 ? ? ? ? ? ? ? ? ? ?"insert into student(num,name,gender,birthday,phone,gradeId,adminid,oper_time)"+
 ? ? ? ? ? ? ? ? ? ?"value(?,?,?,?,?,?,?,?)");
 ? ? ? ? ? ?ps.setObject(1,num);
 ? ? ? ? ? ?ps.setObject(2,name);
 ? ? ? ? ? ?ps.setObject(3,gender);
 ? ? ? ? ? ?ps.setObject(4,birthday);
 ? ? ? ? ? ?ps.setObject(5,phone);
 ? ? ? ? ? ?ps.setObject(6,gradeId);
 ? ? ? ? ? ?ps.setObject(7,id);
 ? ? ? ? ? ?ps.setObject(8,new java.util.Date());
?
 ? ? ? ? ?ps.executeUpdate();//执行spl语句
?
 ? ? ?  } finally {
 ? ? ? ? ? ? ? ?ps.close();
 ? ? ? ? ? ? ? ?connection.close();
 ? ? ? ? ?  }
?
 ? ? ?  }

2.删 删除学生信息

public void deleteStudentById(String id) throws ClassNotFoundException, SQLException {
 ? ?
 ? ? ? ?Connection connection=null;
 ? ? ? ?PreparedStatement ps=null;
?
 ? ? ? ?try {
 ? ? ? ? ? ?Class.forName("com.mysql.cj.jdbc.Driver");
 ? ? ? ? ? ?connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/webdb?serverTimezone=Asia/Shanghai", "root", "root");
 ? ? ? ? ? ?ps=connection.prepareStatement("" +
 ? ? ? ? ? ? ? ? ? ?"delete from student where id=?");
 ? ? ? ? ? ?ps.setObject(1,id);
?
 ? ? ? ? ? ?ps.executeUpdate();//执行sql语句
?
 ? ? ?  } finally {
 ? ? ? ? ? ?
 ? ? ? ? ? ? ? ?ps.close();
 ? ? ? ? ? ? ? ?connection.close();
 ? ? ? ? ?  }
?
 ? ? ?  }

3.改 修改学生信息

就是把数据库中的信息按表中的信息修改

 public void update(String id, String name, String gender, String birthday, String phone, String gradeId, int adminid) throws ClassNotFoundException, SQLException {
 ? ?//修改学生信息
 ? ? ? ?Connection connection=null;
 ? ? ? ?PreparedStatement ps=null;
?
 ? ? ? ?try {
 ? ? ? ? ? ?Class.forName("com.mysql.cj.jdbc.Driver");
 ? ? ? ? ? ?connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/webdb?serverTimezone=Asia/Shanghai", "root", "root");
 ? ? ? ? ? ?ps=connection.prepareStatement("" +
 ? ? ? ? ? ? ? ? ? ?"update student set name=?,gender=?,birthday=?,phone=?,gradeid=?,adminid=?,oper_time=?"+
 ? ? ? ? ? ? ? ? ? ?"where id=?");
 ? ? ? ? ? ?ps.setObject(1,name);
 ? ? ? ? ? ?ps.setObject(2,gender);
 ? ? ? ? ? ?ps.setObject(3,birthday);
 ? ? ? ? ? ?ps.setObject(4,phone);
 ? ? ? ? ? ?ps.setObject(5,gradeId);
 ? ? ? ? ? ?ps.setObject(6,adminid);
 ? ? ? ? ? ?ps.setObject(7,new java.util.Date());
 ? ? ? ? ? ?ps.setObject(8,id);//学生id
?
 ? ? ? ? ? ?ps.executeUpdate();
?
 ? ? ?  } finally {
 ? ? ? ? ? ?
 ? ? ? ? ? ? ? ?ps.close();
 ? ? ? ? ? ? ? ?connection.close();
 ? ? ? ? ?  }
?
 ? ? ?  }

4.查 查询学生信息

public Student findStudentById(String id) throws ClassNotFoundException, SQLException {
 ? ?
 ? ? ? ?Connection connection=null;
 ? ? ? ?PreparedStatement ps=null;
 ? ? ? ?ResultSet rs=null;
 ? ? ? ?Student student=new Student();
 ? ? ? ?try {
 ? ? ? ? ? ?Class.forName("com.mysql.cj.jdbc.Driver");
 ? ? ? ? ? ?connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/webdb?serverTimezone=Asia/Shanghai", "root", "root");
 ? ? ? ? ? ?ps=connection.prepareStatement("select s.id,s.num,s.name,s.gender,s.phone,s.gradeid,s.birthday from student s where id=?");
 ? ? ? ? ? ps.setObject(1,id);
 ? ? ? ? ? ?rs=ps.executeQuery();//将查询结果封装到rs中 可能多条数据  while循环
 ? ? ? ? ? ?while (rs.next()){
//把信息封装在学生对象  把学生对象返回去
 ? ? ? ? ? ? ? ?student.setId(rs.getInt("id"));
 ? ? ? ? ? ? ? ?student.setNum(rs.getInt("num"));
 ? ? ? ? ? ? ? ?student.setName(rs.getString("name"));
 ? ? ? ? ? ? ? ?student.setGender(rs.getString("gender"));
 ? ? ? ? ? ? ? ?student.setPhone(rs.getString("phone"));
 ? ? ? ? ? ?student.setBirthday(rs.getTimestamp("birthday"));
 ? ? ? ? ? ? ? ?student.setGradeid(rs.getInt("gradeid"));
 ? ? ? ? ?  }
 ? ? ?  }finally {
 ? ? ? ? ?
 ? ? ? ? ? ? ? ?ps.close();
 ? ? ? ? ? ? ? ?rs.close();
 ? ? ? ? ? ? ? ?connection.close();
 ? ? ? ? ?  }
 ? ? ? ? ? ?return student;//封装好了就返回回去  别写下一个括号外面  就会返回null
 ? ? ?  }
?
 ?  }

九、管理系统效果

1.登录

?

2.注册

?

3.主界面

?

4.新增

?

5.查询

?

6.修改

?

7.删除

?

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-07-03 10:40:34  更:2022-07-03 10:42:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/11 10:11:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码