SSM整合Vue

article/2025/10/28 2:07:11

昨日知识点总结

今日总结

文章目录

  • 一.昨日知识

    • 1.表单验证
    • 2.上传组件
    • 3.时间插件
    • 4.ElementUI简介
  • 二.今日总结

    • 1.页面静态化
      • 通过html页面,制作展示所有
      • 制作添加页面
      • 制作修改页面以及批量删除
      • 制作分页
      • 制作多条件查询

一、昨日重点复习

1.表单验证

在vue中使用rules对表单字段进行验证

vue 中表单字段验证的写法和方式有多种,以下是 我们今天用到的其中之一

写在data中验证:

        表单内容:

 <!-- 表单 -->
<el-form :model="form" :rules="rules" ref="ruleForm"><el-form-item label="姓名" :label-width="formLabelWidth" prop="name"><el-input v-model="form.name" autocomplete="off" placeholder="姓名(*必填)"></el-input></el-form-item></el-form><!-- 表单 -->
<el-form ref="rulesForm" :rules="formRules" :model="rulesForm" label-width="200px"><el-form-item label="用户名称:" prop="userName"><el-input v-model="rulesForm.userName" style="width:300px" maxlength="50"/></el-form-item>
</el-form><!-- 第二种为常用的有这几种 -->
  • <el-form>:代表这是一个表单
  • <el-form> -> ref:表单被引用时的名称,标识
  • <el-form> -> rules:表单验证规则
  • <el-form> -> model:表单数据对象
  • <el-form> -> label-width:表单域标签的宽度,作为 Form 直接子元素的 form-item 会继承该值
  • <el-form> -> <el-form-item>:表单中的每一项子元素
  • <el-form-item> -> label:标签文本
  • <el-form-item> -> prop:表单域 model 字段,在使用 validate、resetFields 方法的情况下,该属性是必填的
  • <el-input>:输入框
  • <el-input> -> v-model:绑定的表单数据对象属性
  • <el-input> -> style:行内样式
  • <el-input> -> maxlength:最大字符长度限制
     

2.上传组件

upload上传是前端开发很常用的一个功能,在Vue开发中常用的Element组件库也提供了非常好用的upload组件。

基本用法:

<el-upload :action="uploadActionUrl"><el-button size="small" type="primary">点击上传</el-button>
</el-upload>

属性含义:action是执行上传动作的后台接口,el-button是触发上传的按钮

常用案例如下:

  <!--添加头像--><!--multiple--><!--accept="image/jpeg,image/gif,image/png"-->
<el-form-item label="头像" :label-width="formLabelWidth" prop="img"><!--选择路径--><!--:limit将值变为数字limit字符串--><el-upload:limit="1"action="/upload/AddUrl.action"list-type="picture-card":file-list="fileList":on-success="AddUrlSuccess":on-preview="handlePictureCardPreview":on-remove="handleRemove"><i class="el-icon-plus"></i></el-upload><!--文件大小--><el-dialog :visible.sync="dialogVisible" append-to-body><img width="100%" :src="dialogImageUrl" alt=""></el-dialog></el-form-item>

上传文件数量

首先是设置是否可以同时选中多个文件上传,这个也是的属性,添加multiple即可。另外el-upload组件提供了:limit属性来设置最多可以上传的文件数量,超出此数量后选择的文件是不会被上传的。:on-exceed绑定的方法则是处理超出数量后的动作。

但因为我们做了最大的上传处理  (limit=”1“),所以我只能选择性上传1个;

上传格式及大小限制

如果需要限制上传文件的格式,需要添加accept属性,这个是直接使用一样的属性了,accept属性的值可以是accept="image/gif, image/jpeg, text/plain, application/pdf"等等。文件格式的提示,则可以使用slot。

上传过程中的各种钩子

官网上的说明:如图所示

 3.时间插件

案例如下:

 <!--日期选择添加生日--><!--切记表单路径--><el-form-item label="生日" :label-width="formLabelWidth" prop="birth"><el-date-pickerv-model="form.birth"type="date"placeholder="选择生日"></el-date-picker></el-form-item>

选用elementui常用的日期插件

日期格式

用于控制输入框中显示的文本格式。用于控制绑定值的格式。formatvalue-format

默认情况下,组件接受并发出一个对象。

测量值由属性确定。您可以通过创建具有属性的对象来启用快速选项

4.ElementUI简介

ElementUI是一套基于VUE2.0的桌面端组件库,ElementUI提供了丰富的组件帮助开发人员快速构建功能强大、风格统一的页面。Element UI由饿了么前端开源维护,当前版本是2.13.2,是最流行的Vue框架之一。

案例:

Dropdown 下拉菜单:将动作或菜单折叠到下拉菜单中 可设置触发方式,点击或者鼠标放上去就显示 也可设置下拉列表分割等等

Table 表格:用于展示多条结构类似的数据,可对数据进行排序、筛选、对比或其他自定义操作

Pagination 分页:当数据量过多时,使用分页分解数据
 


二、页面静态化

1.页面静态化有哪些优势

我们在使用购物网站的时候,会选择相应的商品点击查看详情,其实会发现每件商品的商品详情页面都是差不多的,除了一些数据外,其余结构布局都是一模一样的,那么是为每件商品都写一个详情页面吗?很显然这是不可能的,数以百万千万的商品都写页面,会把人逼疯。既然结构布局都一样,只是数据不同,那么就可以用页面静态技术很完美的解决。

而为什么要进行页面静态化

像电商网站的商品详细页来说,至少几百万个商品,每个商品又有大量的信息,这样的情况同样也适用于使用网页静态化来解决。页面静态化的好处如下:

静态页面相对于动态页面更容易被搜索引擎收录。
访问静态页面不需要经过程序处理,因此可以提高运行速度。
减轻服务器负担。
HTML页面不会受Asp相关漏洞的影响。
网页静态化技术是为了减轻数据库的访问压力,比较适合大规模且相对变化不太频繁的数据。另外网页静态化还有利于SEO。

如何进行页面静态化

一个页面等于模板加数据。页面静态化就是将页面模板和数据通过技术手段将二者合二为一,生成一个html网页文件。因此,我们需要获取模板,然后获取数据模型,那么模板+数据模型就可以生成一个html页面了。

2.通过html页面,制作展示所有

制作展示所有的后台,通过ajax完成数据的获取

1.Vue中的js代码

var app = new Vue({el:"#app",data:{list:[]},methods:{findAll(){axios.get("emp.findAll").then(function(response){app.list = response.data;	});}},created(){this.findAll();}
});

控制层代码


@RestController
@RequestMapping("emp")
public class EmpController {@AutowiredEmpService empService;@AutowiredDeptService deptService;@RequestMapping("findAllDept")public List<Dept> findAllDept() {return deptService.findAll();}@RequestMapping("add")public void add(@RequestBody Emp emp) {empService.add(emp);}@RequestMapping("edit")public void edit(@RequestBody Emp emp) {empService.edit(emp);}@RequestMapping("del")public void del(Integer id) {empService.del(id);}@RequestMapping("delAll")public void delAll(String ids) {for (String id : ids.split(",")) {empService.del(Integer.parseInt(id));}}@RequestMapping("queryEmp")public PageInfo<EmpVo> queryEmp(@RequestBody EmpVo empVo, Integer page, Integer size) {return empService.findEmp(page, size, empVo);}
}

3.制作添加弹窗页面

页面展示效果

  <!--添加--><el-dialog :title="mode.title" :visible.sync="dialogFormVisible":close-on-click-modal="false" top="5px" :before-close="closeDialog"><el-form :model="form" :rules="rules" ref="ruleForm"><!--输入框添加名字--><el-form-item label="姓名" :label-width="formLabelWidth" prop="name"><el-input v-model="form.name" autocomplete="off" placeholder="姓名(*必填)"></el-input></el-form-item><el-form-item label="年龄" :label-width="formLabelWidth"><el-input v-model="form.age" type="number" autocomplete="off"></el-input></el-form-item><el-form-item label="性别" :label-width="formLabelWidth"><el-radio-group v-model="form.sex"><el-radio :label="1">男</el-radio><el-radio :label="2">女</el-radio></el-radio-group></el-form-item><el-form-item label="爱好" :label-width="formLabelWidth"><el-checkbox-group v-model="formHobby"><el-checkbox label="吃" name="type"></el-checkbox><el-checkbox label="喝" name="type"></el-checkbox><el-checkbox label="玩" name="type"></el-checkbox><el-checkbox label="乐" name="type"></el-checkbox></el-checkbox-group></el-form-item><el-form-item label="部门" :label-width="formLabelWidth"><el-select v-model="form.did" clearable placeholder="请选择部门"><el-option :label="d.name" :value="d.id" v-for="d in deptList   "></el-option></el-select></el-form-item><!--日期选择添加生日--><!--切记表单路径--><el-form-item label="生日" :label-width="formLabelWidth" prop="birth"><el-date-pickerv-model="form.birth"type="date"placeholder="选择生日"></el-date-picker></el-form-item><!--添加头像--><el-form-item label="头像" :label-width="formLabelWidth" prop="img"><!--选择路径--><!--:limit将值变为数字limit字符串--><el-uploadlimit="1"action="/upload/AddUrl.action"list-type="picture-card":file-list="fileList":on-success="AddUrlSuccess":on-preview="handlePictureCardPreview":on-remove="handleRemove"><i class="el-icon-plus"></i></el-upload><!--文件大小--><el-dialog :visible.sync="dialogVisible" append-to-body><img width="100%" :src="dialogImageUrl" alt=""></el-dialog></el-form-item></el-form><div slot="footer" class="dialog-footer"><el-button @click="initFormDate">取 消</el-button><el-button type="primary" @click="addStu">确 定</el-button></div></el-dialog>

完成双向数据绑定内容

*注意处理复选框

data: {dialogFormVisible: false,form: {name: "",age: "",sex: "",did: "",hobby: "",birth: "",img: ""},formHobby: [],//用于姓名formLabelWidth: "100px",

 4.制作修改与删除以及批量删除

完成编辑按钮的功能

 <template slot-scope="scope"><el-button size="mini" @click="toEdit(scope.row)">编辑</el-button><el-button size="mini" type="danger" @click="delOne(scope.row.id)">删除</el-button></template>

完成按钮功能之后再次点击触发添加的弹出窗口调用添加弹窗即可

注意js里的路径和处理复选以及回显图片

//修改回显toEdit(s) {this.mode = {title: "修改员工",url: "/emp/edit.action"};this.form = JSON.parse(JSON.stringify(s));//处理复选this.form.hobby = this.formHobby.split(",");//回显对象(图片),有几个图片加几个对象this.fileList = [{url: this.form.img}];this.dialogFormVisible = true;},

删除方法:

 //删除delOne(id) {this.$confirm('是否删除数据?', '提示', {confirmButtonText: '确定',cancelButtonText: '取消',type: 'warning'}).then(() => {axios.post("/emp/del.action?id=" + id).then(res => {this.initData();})this.$message({type: 'success',message: '删除成功!'});}).catch(() => {this.$message({type: 'info',message: '已取消删除'});});},

全选删除方法:

 //批量删除delAll() {if (this.multipleSelection.length > 0) {this.$confirm('是否删除这些数据?', '提示', {confirmButtonText: '确定',cancelButtonText: '取消',type: 'warning'}).then(() => {//让每个元素都执行的回到函数,把每次执行的结果组装成一个数组返回let idsArr = this.multipleSelection.map((value) => value.id)axios.post("/emp/delAll.action?ids=" + idsArr.join(",")).then(res => {this.initData();})this.$message({type: 'success',message: '删除成功!'});}).catch(() => {this.$message({type: 'info',message: '已取消删除'});});} else {this.$message({type: 'info',message: '请选择数据'});}},

5.制作分页

页面的代码:

  <el-pagination@size-change="handleSizeChange"@current-change="handleCurrentChange":current-page="query.page":page-sizes="[1, 2, 3, 4]":page-size="query.size"layout="total, sizes, prev, pager, next, jumper":total="pageInfo.total"></el-pagination>

js代码:

 //分页handleSelectionChange(val) {this.multipleSelection = val;},handleSizeChange(val) {//当pagesize发生变化回调的函数this.query.size = val;},handleCurrentChange(val) {//当前页发生变化回调的函数this.query.page = val;},initDeptList() {axios.post(`/emp/findAllDept.action`).then(res => {this.deptList = res.data;})},

6.制作多条件查询

*注意:

写此法时需要在控制层单独写方法调其中间类来方便于查询时使用

前端代码:

 <!--输入框,查询区域-->姓名:<el-input style="width: 200px" v-model="query.name" clearable placeholder="姓名、部门模糊查询"></el-input>年龄区间:<el-input style="width: 80px" v-model="query.age1" type="number" clearable placeholder="age1"></el-input>--<el-input style="width: 80px" v-model="query.age2" type="number" clearable placeholder="age2"></el-input>日期区间:<el-date-picker v-model="query.birth1" type="date" placeholder="选择日期1"></el-date-picker>--<el-date-picker v-model="query.birth2" type="date" placeholder="选择日期2"></el-date-picker>部门选择:<el-select v-model="query.did" clearable placeholder="请选择部门"><el-option label="" value="">请选择</el-option><el-option :label="d.name" :value="d.id" v-for="d in deptList"></el-option></el-select><el-button type="primary" @click="toadd">添加</el-button><el-button type="danger" @click="delAll">批量删除</el-button>

mapper层代码:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.jiyun.dao.EmpMapper"><select id="findEmp" parameterType="cn.jiyun.vo.EmpVo" resultType="cn.jiyun.vo.EmpVo">select e.*,d.name dname from emp e,dept d where e.did=d.id<if test="name !=null and name !=''">and (e.name like '%${name}%'or d.name like '%${name}%')</if><if test="age1!=null">and e.age &gt;=#{age1}</if><if test="age2!=null">and e.age &lt;=#{age2}</if><if test="birth1 != null">and e.birth &gt;=#{birth1}</if><if test="birth2 != null">and e.birth &lt;=#{birth2}</if><if test="did != null">and e.did = #{did}</if></select>
</mapper>


总结

以上就是今天要讲的内容,本文仅仅简单介绍了页面静态化的双表的使用,以及昨日讲述的重要知识。


http://chatgpt.dhexx.cn/article/rWovRR0X.shtml

相关文章

SSM整合过程梳理

文章目录 前言一.SSM整合流程二.整合配置2.1添加依赖2.2创建项目包结构2.3创建SpringConfig配置类2.4创建JdbcConfig配置类2.5创建MybatisConfig配置类2.6创建jdbc.properties2.7创建SpringMVC配置类2.8创建Web项目入口配置类 三.功能模块3.1创建模型类3.2编写Dao接口3.3编写Se…

ssm整合详解

最近做项目用到了ssm,虽然以前用过ssm但这段时间发现&#xff0c;用过不代表就会了&#xff0c;即使以前用过&#xff0c;但现在要搭一个ssm框架不看教程还是很难&#xff0c;最基本的maven仓库需要哪些坐标都搞不清楚&#xff0c;所以今天打算写篇博客梳理一下。 一.基础梳理…

SSM整合分页插件

目录 一.环境配置 1.分页插件依赖 2.在Mybatis里面配置的内容 二.使用分页插件 1.在ServiceImpl层开启分页插件&#xff08;即查询数据库前开启&#xff09; 2.控制器方法 3.jsp页面进行整理 4.效果 5. 样式 6.常用的数据说明 一.环境配置 1.分页插件依赖 <depend…

SSM整合总结

这几天学完spring&#xff0c;springMVC&#xff0c;mybatis后&#xff0c;这两天试着去整合ssm&#xff0c;整合过程并不顺利&#xff0c;一是基础知识有的忘了&#xff0c;细节不能把握住&#xff0c;造成各种报错.看了各种视频&#xff0c;翻阅各种文章&#xff0c;多多少少…

SSM整合shiro

1.完成ssm整合shiro 企业中老项目还在使用ssm框架。 准备数据库 数据结构 张三 -user:query user:add user:update user:delete 李四 ---》user:query user:add user:update 王五-----》user:query user:export 搭建ssm的环境 &#xff08;1&#xff09;创建一个maven的web工…

SSM整合

1、ssm整合原理 SSM框架是spring MVC &#xff0c;spring和mybatis框架的整合&#xff0c;是标准的MVC模式&#xff0c;将整个系统划分为表现层&#xff0c;controller层&#xff0c;service层&#xff0c;DAO层四层。 使用spring MVC负责请求的转发和视图管理 spring实现业…

SSM整合,手把手教程,详解思路讲解

前言 一&#xff0c;工程创建 1.新建Maven项目&#xff0c;项目架构增加web支持 2.Maven本地仓库配置 3.集成Tomcat&#xff0c;搭建web环境 二&#xff0c;导入依赖 三&#xff0c;配置文件编写 1.web环境配置文件 2.spring整合环境配置文件 2.1 controller层(spring…

SSM整合完整流程讲解

目录 一、SSM整合说明 1、各个框架担任的角色 2、两个Ioc容器的创建顺序 1&#xff09;SpringMVC中IOC容器的创建时间 2&#xff09;Spring中IOC容器的创建时间 3&#xff09;Spring提供的监听器ContextLoaderListener 二、SSM整合步骤 1、准备工作 1&#xff09;导入…

Unresolved Dependencies

在Android Studio的开发中&#xff0c;在软件中集成了ButterKnife插件&#xff0c;另外需要集成ButterKnife的jar包。因为本地没有现成的&#xff0c;所以在module的build.gradle文件中添加了如下代码&#xff1a; compile com.jakewharton:butterknife:7.0.1 结果报了如下错误…

Pycharm 出现Unresolved reference ‘‘ 错误的解决方法 --- 亲测有效

在用Pycharm写项目的时候的时候碰到一个很无语的问题 路径明明没有问题&#xff0c;运行也没有出错&#xff0c;但就是爆红&#xff0c;逼死强迫症啊。。。 多方查找最后解决了。步骤如下&#xff1a; File–>Settings–>Project Structure–>找到问题目录–>Sou…

PyCharm错误提示- Unresolved reference 的解决

使用PyCharm加载工程时,发生解析错误 原本这个工程是可以通过 python manange.py runserver 方式运行的,说明文件是正常的。关键在于PyCharm环境的问题。 查找了半天,安装一些网上的解决方式,尝试了以下几种方式: 1,修改忽略文件 File –>Settings –>Editor –…

Goland 提示 Unresolved reference 错误解决

之前一直正常的项目&#xff0c;莫名其妙的 database/sql 包下的方法、结构体等等IDE都无法识别&#xff0c;出现一堆Unresolved reference错误提示&#xff0c;但包导入路径可以正确定位&#xff0c;而且项目运行也正常&#xff0c;其他包都正常&#xff0c;另一个项目下同样使…

error LNK2019: unresolved external symbol

error LNK2019: unresolved external symbol&#xff1a;链接器找不到所需要的东西 此时ctrlF7进行编译&#xff0c;没有报错&#xff0c;在这个程序中调用的是Log函数&#xff0c;我们实际上并没有这个函数&#xff0c; 我们有的函数是Logr函数&#xff0c;在编译过程中编译器…

Unresolved reference ‘matplotlib‘解决方法

首先打开最左边的file-settings 然后点这个添加 找想添加的 最后点最下面的install Package 就可以啦

快速解决Pycharm中unresolved reference

在用Pycharm时老是报红&#xff0c;虽然不影响运行&#xff0c;但是真的很不好看。 如下&#xff1a; 根据网上大部分教程设置source root&#xff0c;设置之后还是没有变化。 然后我发现了这个东西&#xff0c;真的是立即生效&#xff0c;就是不知道改了之后有没有什么后遗症…

解决unresolved symbol _RamfuncsLoadEnd

问题描述 移植大佬的文件之后&#xff0c;发现报错 问题解决 添加F28335.cmd到工程中

Redisson cannot use an unresolved DNS server address问题解决

概述 本文记录Mac IDEA开发&#xff0c;公司 远程办公时遇到的两个问题&#xff0c;记录一下。 问题 cannot use an unresolved DNS server address: [fe80::1%en0]:53 在家里&#xff0c;连上公司的VPN后&#xff0c;即可打开公司内网&#xff0c;远程办公。一切正常。某…

解决模块Unresolved Link问题

修改内容为下面的&#xff0c;请复制以下内容&#xff08;图中大小写有误&#xff09;&#xff01;&#xff01; Solver_SF/CarSim S-Function 此时就可以修改Simfile name了

c语言1 unresolved externals,出现了 unresolved external symbol _main和1 unresolved externals这是什么问题?...

满意答案 nyjspj 2014.01.18 采纳率&#xff1a;53% 等级&#xff1a;12 已帮助&#xff1a;5918人 {} 数量不匹配 #include #include "process.h" #include "stdio.h" #include "sqstack.h" template void convert(T n,T m) { T e; char c; …

AndroidStudio Unresolved reference

在学习Kotlin过程中&#xff0c;出现了两次在activity_main.xml中已注册id&#xff0c;但是在MainActivity.kt中无法找到该Button的情况。 后面发现是没有在build.gradle中导入 kotin-android-extensions’的包&#xff0c;导致无法 import kotlinx.android.synthetic.main.a…