功能
一. 教师管理
1.增加教师(复选框没有选择的时候出现,验空,可添加离职和在职的学生);删除教师(只有离职的教师才有删除功能);修改教师(只有在职的教师才可以修改和离职,验空,状态不可修改,跳转新路由)。增加和修改选择科目的时候可以选择也支持输入模糊搜索还有状态的选择
2. 教师离职,若该教师仍由在教学生则跳转界面转移学生教师,全部转移完成后返回教师界面可完成离职功能;可以批量修改学生也可以单独修改学生的教师信息,并且展示不同的弹窗标题,批量修改时展示前五个学生姓名,如果超过五个则显示省略号 ,当所教学生全部修改完毕可点击离职按钮进行离职
3…支持详情展示并且展示所教学生列,点击学生可以跳转到学生详情
4.列表中显示所教学生列,展示前五个学生姓名,如果超过五个则显示省略号 ;支持所教学科以的多筛选及状态的筛选,支持从业年数的排序
5.支持教师编号、教师姓名和描述的模糊查询,并且高亮显示模糊查询字段;支持教师姓名,所教学科、从业年数和状态的高级查询
二. 学生管理
1.增加学生(验空,可增加已退学也可以增加正常的学生,增加已退学的学生需要要选择退学日期,且不能小于入学日期),删除学生(只有退学的学生才可以删除),修改教师(只有正常的学生才可以修改和退学,验空,状态不可修改,跳转新路由),修改和增加使用级联来选择年级,教师姓名可以选择并且支持输入模糊搜索还有状态的选择
2.支持学生退学功能,选择退学日期之后方可退学
3.支持详情展示,点击教师可以跳转到教师详情,也可以在首页面点击教师详情
4.支持学科的多筛选和状态的筛选;支持从业年数的排序
5.支持学生姓名、年龄、入学日期、退学日期和描述的模糊查询,并且高亮显示模糊查询字段;支持学生姓名、教师姓名,年级年龄入学日期范围和状态的高级查询
三. 年级管理
1.支持一二级目录增删改,三级目录删改(验空)
2.删除叶子节点是会判断该年级下是否有学生,非叶子节点不会有删除功能,
前端teach
一.teacher
1.主页面
(1)<div class="flex-container">
整体布局
(2)
<bv-table ref="teacherTableRef":fetch-api="fetchTeacherData" pagination title="教师管理">
teacherTableRef数据如下:
this.refs.teacherTableRef.table.data.
可以查看table下的很多属性,其中这个地方展开了data和selection数据
fetchTeacherData数据如下:
fetchTeacherData(query){//query是模糊查询精确查询排序筛选的条件
console.log(getTeacherData(query));
return getTeacherData(query)
},
他是一个promise对象,没有办法调用这些属性,如果写都是undefined
res:对于promise对象的数据处理操作,
getTeacherData().then(res=>{
this.teacherListData = res.list.filter(teacher => teacher.status === '0000');
})
在这函数里面你可以调用这些属性
(3)
key-code=“字典名”
subjectCode:获取字典的方法
created(){
this.$store.dispatch('app/fetchDictionaries','subjectCode').then(res =>{
this.subjectFilters = res
}),
(4)
type:类型
step:小数形式
(5)
operates: 插槽:操作按钮,参数为 { selection },这个地方的selection在文章一开始那个地方有
show:有rule和check,使用冒号:,
view:展示的时候有的图标
type:样式颜色
icon:自定义的按钮上的图标
离职:
handleDepart(data){
this.$confirm('当前教师是否要离职,是否继续?','提示',{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(()=>{
getStudentsUnderTeacher(data.id).then(res=>{
if(res && res.list && res.list.length > 0){
this.$message.warning('该教师仍有在教学生,请先转移学生')
this.$router.push({path: '/teach/student/mobile',query:{id:data.id}})
}else{
teacherDepart(data.id).then(()=>{
this.$message.success('该教师已离职')
this.refreshData()
})
}
})
})
}
二.student
(3)
<template #search="{ filter }">
<bv-col>
<bv-form-item label="学生姓名" prop="stuName">
<bv-input v-model="filter.stuName" placeholder="请输入学生姓名" clearable filterable/>
</bv-form-item>
</bv-col>
<bv-col>
clearable :可以清空
filterable:可以在输入框中输入进行模糊搜索
filter.stuName:stuName在后端的dto中必须有一样的字段类型来接受
prop:主要用来校验,精确查询可以不用
placeholder:初始现实的东西
试验:不写prop没有影响
(4)
<!--数据需要返回后端所以数据库后端需要什么样的数据绑什么样的数据,存的是教师id不是name,teacher要找teacher表的,不能找联合的表会有重复-->
<bv-col>
<bv-form-item label="教师姓名" prop="teacherId">
<bv-select v-model="filter.teacherId" :items="teacherListData" code="id" text="name" placeholder="请选择教师姓名" clearable filterable/>
</bv-form-item>
</bv-col>
bv-select :下拉选框,:items= code= text= ,是list就行,不强行要求标准形式
array和list和arraylist和stringlist的区别是什么:
三.clazz
后端teach
一.teacher
二.student
三.clazz
数据库、环境配置准备阶段
一些知识点
在编程中,.length
和 .size
以及 .getSize()
是用于获取集合、数组或其他对象大小或长度的属性或方法。具体使用哪个取决于你使用的编程语言和上下文环境。
.length
:- 通常在JavaScript中使用,用于获取字符串或数组的长度。
- 示例:
let str = "你好世界";
console.log(str.length); // 输出:9)
.size
:- 在Java等语言中,尤其是对于一些集合类(如
HashSet
、ArrayList
等),常用.size
来获取集合中的元素数量。 - 示例:
import java.util.ArrayList;
ArrayList<String> list = new ArrayList<>();
list.add("你好");
list.add("世界");
System.out.println(list.size()); // 输出:2)
- 在Java等语言中,尤其是对于一些集合类(如
.getSize()
:- 这通常是一个方法名,而不是属性,它可能在一些自定义类或特定库中用于获取对象的大小或长度。
- 示例:
class MyClass {
int getSize() {
return 10;
}
}
MyClass obj = new MyClass();
int size = obj.getSize(); // 输出:10)
总之,选择使用哪个取决于你正在使用的编程语言和具体的应用场景。希望这可以帮助你!
tabl包含了标题,精确查询行,按钮行,列表信息行
巡察单位:
前端:
patrol—patrol-unit—index.vue和组件add-modify-dialog
//组件
//index.vue文件table表格中
:fetch-api=“fetchPatrolUnitData”
//导入从api后端传过来的数据
import {deletePatrolUnit, getPatrolUnitData} from “@/api/patrol”;
//获取巡查单位数据
fetchPatrolUnitData(query){
return getPatrolUnitData(query)
},
//删除
handleDelete(row) {
this.KaTeX parse error: Expected '}', got 'EOF' at end of input: … this.message.success(‘删除成功’)
this.refreshData()
})
})
}
//api
//删除
export function deletePatrolUnit(id) {
return http.delete(/api/patrol/unit/delete/${id}
)
}
//获取数据
export function getPatrolUnitData(params) {
return http.get(‘/api/patrol/unit/page’,{params})
}
后端:controller类一个, service接口一个,impl实现一个,
//data实体类PatrolCheckUnit
@Data
@Table(name = “patrol_check_unit”)表名
public class PatrolCheckUnit extends BaseData {
@Id
private String id;
类的属性
@Schema(description = “巡察单位编号”)
private String unitCode;
@Schema(description = "巡察单位名称")
private String unitName;
@Schema(description = "单位性质")
private String unitNature;
@Schema(description = "巡察单位联系方式")
private String unitLink;
}
//vo后端传前端
@Data
public class PatrolCheckUnitVO extends BaseData {
@Schema(description = “主键”)
private String id;
@Schema(description = "巡察单位编号")
private String unitCode;
@Schema(description = "巡察单位名称")
private String unitName;
@Schema(description = "单位性质")
private String unitNature;
@Schema(description = "巡察单位联系方式")
private String unitLink;
private Integer matterCount;
//dto前端传后端
@Data
public class PatrolCheckUnitDTO extends BaseData {
@Schema(description = “主键”)
private String id;
@Schema(description = "巡察单位编号")
private String unitCode;
@Schema(description = "巡察单位名称")
private String unitName;
@Schema(description = "单位性质")
private String unitNature;
@Schema(description = "巡察单位联系方式")
private String unitLink;
@Schema(description = "创建时间范围")
private List<String> timeRange;
//xml文件写语法实现dao中的方法
</select>
//dao数据访问类
@Repository
public interface PatrolCheckUnitDao extends Mapper<PatrolCheckUnit(实体类),String(主键类型)> {
List getPatrolUnit(PatrolCheckUnitDTO patrolCheckUnitDTO);
//List<patrolUnitInfo> getUnitList(@Param("userId") String userId);
//List<String> selectAllList();
}
//service接口
PageInfo getPatrolUnit(PatrolCheckUnitDTO patrolCheckUnitDTO);
//serviceImpl实现一些简单操作
@Override
public PageInfo getPatrolUnit(PatrolCheckUnitDTO patrolCheckUnitDTO) {
return PageHelper.startPage(patrolCheckUnitDTO.getPage(),patrolCheckUnitDTO.getLimit()).doSelectPageInfo(new ISelect() {
@Override
public void doSelect() {
patrolCheckUnitDao.getPatrolUnit(patrolCheckUnitDTO);
}
});
}
//controller
//接受前端的get请求,后端将vo返回给前端,这个函数是接受的前端的函数,返回的是service中的函数
/**
* 分页查询巡察单位
* @param patrolCheckUnitDTO
* @return
*/
@Operation(summary = “分页查询巡察单位”)
@GetMapping(“/api/patrol/unit/page”)
public PageInfo getPatrolUnit(PatrolCheckUnitDTO patrolCheckUnitDTO) {
return patrolService.getPatrolUnit(patrolCheckUnitDTO);
}
//枚举和字典
字典可以直接在标签中使用key-code,store-action是调用接口用的
枚举是使用大写英文并且定义它的code和name还有getset方法然后,定义transalate方法
然后在vo类中定义一个getXXXX方法,里面调用枚举类的transalate方法
(!!!注意:要定义变量XXXX,不然传不过去,但是运行完之后再次删除运行也传过去了,灵异
//data实体类,dto接受实体类,vo返回实体类(可能涉及到一些code对应name的translate方法)translate方法又涉及到 Enum枚举类
//发送get请求 -controller-service-impl(涉及数据的具体操作,对于dao进行函数的调用)-dao(定义函数,就是xml中的id)-xml
发送post请求,-controller-service-impl(涉及数据的具体操作也包含自定义的函数,对于dao进行函数的调用,可能是已经封装好的函数)-dao(继承mabatis提供的Mapper,已经封装好的一些方法)-xml
发送delete请求,这个的删除操作已经封装好了–写controller,service,impl(调用dao封装好的根据主键删除方法)
//bug
精确查询没有反应,模糊查询只有高亮
因为数据库xml文件没有写
<![CDATA[ AND name =(#{name}) ]]>
<![CDATA[ AND subject = #{subject} ]]>
<![CDATA[ AND years >= #{years} ]]>
<![CDATA[ AND ( name bv_like(#{fuzzy}) OR subject bv_like(#{fuzzy}) OR years bv_like(#{fuzzy}) ) ]]>
//筛选没有反应,刷新没有反应,排序也没有反应,-----后端写逻辑
详情返回界面后需要手动刷新页面,修改界面相同的问题刷新—是不是钩子函数的问题
fechData用不了是因为ref名字写错了
teacherDao的红线报错但是不影响功能,row和origin什么区别来着,
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
//班级管理
写基础的data类和dto和vo还有需要用到的enum
standard表:content—cla_name,ordernumber—sortnum,
xml文件里面注意使用数据库表中的字段,不是定义的实体类里的字段
卧槽人总是反反复复在一个坑里坠落,version——status为0!!!!!!
又犯了真服了
注意xml文件中会把下划线自动解释称驼峰形式
api加两个斜线你也是没谁了
//多种数据方式对应:
①字典(redis数据库):通过key-code
②枚举:后端写枚举类,然后利用impl中定义一个transalate方法找到对应code的属性
③字典(前端利用tems数据):key=“teacherId” text=“teacherName” :items=“fetchTeacherData”
④字典(前端写死):
看看教师可不可以使用items字典,如果可以班级也可以使用
//年级的三级选项,级联选择,
//教师选择–解决了是要取出来的教师数据然后取list
options undefined是因为form-item-static,而且是没有prop
public PageInfo<StudentVO> getMobileStudent(String id) {
logger.info("最终返回: {}", PageHelper.startPage(10,10).doSelectPageInfo(new ISelect(){
public void doSelect(){
studentDao.getMobileStudent(id);
}
}));
return PageHelper.startPage(10,10).doSelectPageInfo(new ISelect(){
public void doSelect(){
studentDao.getMobileStudent(id);
logger.info("studentDao返回的:{}", studentDao.getMobileStudent(id));
}
});
}
//移动教师信息之后页面没有刷新—缓存问题,在路由上传值,首页面进行判断然后刷新
//学生、教师修改界面之后返回没有刷新–同上
//学生界面点击详情返回后需要刷新才能查看另外一个详情—同上
//下拉树不显示—不常用要单独引组件
//判断逻辑为什么不执行–要写在语句里面,vue并不是一句句执行,所以如果在方法外面,需要判断的东西不知道是什么时候赋值
//详情界面还是不行
//filter和sortable后端在哪写逻辑–
//级联还是用的标准格式----前端处理clazzId值
//入学日期显示有问题—没有问题页面缩小之后不太显示了
filterable 是否可搜索选项 boolean — —
add—[“1”,“2”,“3”,]添加学生又不刷新了–因为在刷新代码前面写了一句废话–使用了dto中的clazzIdList
搜索–“1,2,3”
//filiter是因为prop写的是statusName而不是status,不然框架是封装好了的
//如果不用example的话如何把sort还有desc的值传到xml中,带有引号—用$–
//学生list不显示–方法没有return
//prop换绑定了之后筛选框展示的东西变了–要加options
//detail路由传值依旧缓存了–子菜单禁用缓存,传值刷新是刷新的列表,缓存还是在的
有可能刚建立也有可能之前打开过,所以两个datail都得在created和activate里面写
//index (query: {id:origin.id,changePath:‘/teach/teacher’})
------传老师id和teacher的path----------
activated() {
//this.stuComeId=this.
r
o
u
t
e
.
q
u
e
r
y
.
s
t
u
C
o
m
e
I
d
t
h
i
s
.
i
d
=
t
h
i
s
.
route.query.stuComeId this.id = this.
route.query.stuComeIdthis.id=this.route.query.id
this.changePath=this.KaTeX parse error: Expected '}', got 'EOF' at end of input: …stuComeId=this.route.query.stuComeId
this.id = this.
r
o
u
t
e
.
q
u
e
r
y
.
i
d
t
h
i
s
.
c
h
a
n
g
e
P
a
t
h
=
t
h
i
s
.
route.query.id this.changePath=this.
route.query.idthis.changePath=this.route.query.changePath
},
teacherDeiatl(query: {stuId:origin.id,teacherId:this.id,changePath:‘/teach/teacher/detail’})
----点击返回-----成功返回----
----点击学生姓名-----
activated() {
this.id = this.
r
o
u
t
e
.
q
u
e
r
y
.
s
t
u
I
d
t
h
i
s
.
t
e
a
c
h
e
r
I
d
=
t
h
i
s
.
route.query.stuId this.teacherId = this.
route.query.stuIdthis.teacherId=this.route.query.teacherId
this.changePath=this.KaTeX parse error: Expected 'EOF', got '}' at position 26: …y.changePath }̲, created() {…route.query.stuId
this.teacherId = this.
r
o
u
t
e
.
q
u
e
r
y
.
t
e
a
c
h
e
r
I
d
t
h
i
s
.
c
h
a
n
g
e
P
a
t
h
=
t
h
i
s
.
route.query.teacherId this.changePath=this.
route.query.teacherIdthis.changePath=this.route.query.changePath
},
studentDetail
=====出现问题还是点击返回都消失了但是留着缓存就会有,返回了path还有techerId没有用=,把id改为teacherId规范命名=
-----点击返回–到—teacherDeiatl---- query:{id:this.teacherId,changePath:‘/teach/teacher’}})
------点击返回回到index
//学生首页面
index
------------------点击教师------query: {id:origin.teacherId,changePath:‘/teach/student’,stuComeId:origin.id}
teacherDetail
-----点击返回----成功返沪学生首页面
-----点击学生姓名重复上述bug
-------------------点击学生----query: {stuId:origin.id,changePath:‘/teach/student’}
studentDetail
------点击教师姓名—query: {id:this.detailInfo.teacherId,changePath:‘/teach/student/detail’}
teacherDetail
------点击返回—
===出现问题
学生详情消失了再次返回也不能返回
总结:
点击教师管理-点击教师姓名–点击学生界面-(传输了teacherId还有changePath)-返回教师详情-返回教师管理
(从学生界面回到教师界面再返回的时候一定会返回到教师管理界面)
点击学生管理-点击学生姓名-点击教师姓名-(传输了stuId)–返回学生详情 数据消失且返回禁用
$
//example的模糊和精确查询—完成
//高亮显示----完成
//options filter----------不管用显示的是对象,改用filters
//list还是不显示,前端问题-----table不兼容,改用div
//筛选的话如果多选只能查到最后的—完成
//example模糊查询没有拼接%%----应该使用fuzzylike
//isEmpty和null和‘’和0
JSON parse error: Cannot construct instance of java.util.ArrayList
(although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value (‘4’); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of java.util.ArrayList
(although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value (‘4’)
at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 34] (through reference chain: com.bestvike.train.dto.TeacherDTO[“subject”])
学生界面点击修改,之后不动保存数据,班级数据丢失—不行–将所有需要调用接口的数据从created里面写可解决此问题,原来是写了一个initData,在created里调用了他
字符串默认用equals
//默认降序
//page的bug
//班级的bug
优化:
show-loading不写默认有
中KaTeX parse error: Expected 'EOF', got '&' at position 92: …-if="index < 4 &̲& index!==origi…store.dispatch(“tags/delView”, this.$route);
//1.index过来,this.changePath=/teach/teacher,后面query都为空值
//2.student-detail过来,this.changePath=/teach/student/detail,query中:stuId有值,changePath是从student-detail中传过来的/teach/student
//3.index过来再去到student-detail再回到teacher-detail,this.changePath去的是student-detail跳转goback过来query中传的changePath:this.originPath,
// 这个path是从teacher-detail去到student-detail的时候query传过去的originPath:this.changePath,此时的this.changePath是从index过来时传递的changePath即/teach/teacher
//4.从student-index过来,this.changePath=/teach/student,后面query都为空值
goBack() {
this.
s
t
o
r
e
.
d
i
s
p
a
t
c
h
(
"
t
a
g
s
/
d
e
l
V
i
e
w
"
,
t
h
i
s
.
store.dispatch("tags/delView", this.
store.dispatch("tags/delView",this.route);
this.KaTeX parse error: Expected 'EOF', got '}' at position 96: …ginPath}}) }̲, //需要传递stu…router.push({path: ‘/teach/student/detail’,query: {stuId:origin.id,teacherId:this.id,changePath:‘/teach/teacher/detail’,originPath:this.changePath}})
this.refreshData()
},
<add-dialog :teacherListData="teacherListData" :clazzList="clazzList" ref="addRef" @refresh="refreshData"/>
一般不会从父组件向子组件传复杂的值,都要重新从后端查询新的值,因为你不知道几秒之前数据是否发生改变
//关于学生没有退学,教师没有离职的情况下,是否可以删除—按理来说不能删除
只有正常的学还说呢给才可以退学和修改
handleDropout(data){
this.KaTeX parse error: Expected '}', got 'EOF' at end of input: …{ this.refs.outDateRef.show(data)
})
}
弹窗的目的是为了不走请求,所以这类可以不用写弹窗
<bv-link view="remove" @click="remove(data)" v-if="!data.children && data.children.length===0"/>
用户方便:假如某个按钮点进去之后是死路,那可以直接不显示,也不需要在js中判断逻辑出一个提示
后端:
StrUtil.toUnderlineCase(sort[0])使用工具类,一些网上的方法可能会导致一些错误
xml中不需要写<![CDATA[ ]]>这个东西,因为这个东西是用来判断什么有大于等于号的时候出现的一些问题
ORDER BY ${sortColumn} KaTeX parse error: Double subscript at position 217: …etStatus(LEFT_A_̲JOB.getCode());…refs.studentMobileTeacherRef.table.data.length === 0,可以通过表名取数据判断数据
1.批量修改学生老师以及按钮样式
2.批量修改和单个修改的弹窗样式区别,批量显示五个学生姓名超过五个加省略号
3.修改了保存时年级置空的bug,原来写的逻辑是:
if (this.formData.clazzId.length > 0) {
this.formData.clazzId = this.formData.clazzId[this.formData.clazzId.length - 1]
}
这样知识判断了长度,忽略了String类型
if(typeof this.formData.clazzId !== “string”){
this.formData.clazzId = this.formData.clazzId[this.formData.clazzId.length - 1]
}
这样就可以了,后端用String接,
没整理的之后端注释们
@Operation
注释
通常是用来标记一个方法或函数,表明它是一个操作,尤其是在面向对象编程语言中。这种注释可以帮助开发者理解和文档化代码,也常用于框架或工具中的代码分析。
具体到不同的编程语言或框架中,@Operation
注释的含义可能有所不同。例如,在某些RESTful API框架中,@Operation
注释可能用于描述一个API操作的详情,包括它的作用、请求类型、响应类型等。
如果你在特定的编程环境或框架中遇到 @Operation
注释,它可能指的是该框架或工具定义的特定功能或操作。为了获得更精确的解释,最好查阅该注释所在上下文的相关文档或资料。
标题
public PageInfo getPatrolUnit(PatrolCheckUnitDTO patrolCheckUnitDTO):这是一个公共方法的声明,方法名为 getPatrolUnit,它接受一个 PatrolCheckUnitDTO 类型的参数 patrolCheckUnitDTO,并返回一个 PageInfo 类型的对象。
PageInfo:这是方法的返回类型,之前已经解释过,它表示返回一个包含分页信息的 PatrolCheckUnitVO 对象。
getPatrolUnit:这是方法的名字,用于获取 PatrolCheckUnit 的分页信息。
PatrolCheckUnitDTO:这是方法的参数类型,它包含了一些分页查询所需的参数,比如页码(page)和每页显示的条数(limit)。
PageHelper.startPage(patrolCheckUnitDTO.getPage(),patrolCheckUnitDTO.getLimit()):这是调用 PageHelper 的 startPage 方法,它用于设置分页参数,patrolCheckUnitDTO.getPage() 和 patrolCheckUnitDTO.getLimit() 分别获取了DTO中的页码和每页限制条数。
.doSelectPageInfo(new ISelect() {…}):这是 startPage 方法的一个扩展,用于定义具体的查询逻辑。doSelectPageInfo 方法需要一个实现了 ISelect 接口的匿名内部类,这个接口只有一个 doSelect 方法需要实现。
@Override public void doSelect() {…}:这是匿名内部类的一个类签名,它覆盖了 ISelect 接口中的 doSelect 方法。在这个方法中,实际上是调用了一个叫做 patrolCheckUnitDao.getPatrolUnit(patrolCheckUnitDTO) 的方法,这个方法可能是自定义的,用于执行实际的查询逻辑。
标题
这段代码定义了一个名为 PatrolCheckUnitDao
的接口,它是一个数据访问对象(Data Access Object)接口,用于封装对数据库的操作。这个接口使用了 MyBatis 的注解 @Repository
,这意味着 MyBatis 会识别这个接口,并为其提供代理实现,以减少样板代码。
下面是对接口中方法的详细解释:
@Repository
:这是一个注解,它告诉 MyBatis 这个接口应该被作为一个数据访问对象来处理。MyBatis 会为这个接口创建一个代理实现类,这样就可以通过这个代理实现类来执行数据库操作。public interface PatrolCheckUnitDao extends Mapper<PatrolCheckUnit,String>
:这个接口继承了 MyBatis 的Mapper
接口,这意味着它可以使用 MyBatis 提供的默认方法,如insert
、delete
、update
和select
。PatrolCheckUnit
是实体类,它代表了数据库中的一个表,String
类型的参数可能是实体类的唯一标识符,例如主键。List<PatrolCheckUnitVO> getPatrolUnit(PatrolCheckUnitDTO patrolCheckUnitDTO);
:这是一个自定义方法,用于获取巡逻检查单位的信息。它接受一个PatrolCheckUnitDTO
类型的参数,并返回一个List<PatrolCheckUnitVO>
类型的对象。这个方法需要实现具体的查询逻辑,可能是根据PatrolCheckUnitDTO
中包含的查询条件来从数据库中检索数据。List<patrolUnitInfo> getUnitList(@Param("userId") String userId);
:这是另一个自定义方法,用于获取与特定用户关联的巡逻单位列表。它接受一个String
类型的参数userId
,并返回一个List<patrolUnitInfo>
类型的对象。这个方法同样需要实现具体的查询逻辑,可能是根据用户ID来检索数据库中的相关数据。List<String> selectAllList();
:这是一个默认方法,因为它没有参数和注解,它会使用 MyBatis 的select
语句来执行查询。这个方法返回一个List<String>
类型的对象,可能是返回数据库中某个表的所有字符串类型的字段值。
总的来说,这段代码定义了一个数据访问接口,包含了自定义的方法和 MyBatis 默认的 CRUD 方法,用于与数据库进行交互。
标题
这段代码是用Java语言编写的,属于一个名为com.bestvike.train.data
的包。它定义了一个名为PatrolCheckUnit
的类,这个类继承自BaseData
类。BaseData
类可能是一个包含了一些通用属性和方法的父类,例如数据的创建时间、更新时间等。
PatrolCheckUnit
类使用了Lombok库的@Data
注解,这会自动生成类的getter和setter方法,简化了代码。同时,这个类还用到了Swagger的@Schema
注解,这用于描述类的属性,方便生成API文档。
@Table
注解用于指定这个类对应的数据库表名,这里是patrol_check_unit
。
类中定义了几个属性:
id
:这是一个主键,用于唯一标识数据库中的每一条记录。unitCode
:巡察单位编号。unitName
:巡察单位名称。unitNature
:单位性质。unitLink
:巡察单位联系方式。
每个属性前都使用了@Schema
注解,描述了它们的含义和用途,这样在生成API文档时,这些信息就会被展示出来,方便开发者理解和使用。
标题
这是一个使用Java语言和Spring框架编写的RESTful API的一部分。具体来说,这是一个POST请求映射,它用于处理教师信息的添加操作。
@PostMapping("/api/teach/teacher/add")
: 这表示当接收到POST请求时,会执行teacherAdd
方法。请求的路径为/api/teach/teacher/add
。public void teacherAdd(@RequestBody TeacherDTO teacherDTO)
: 这是一个公共方法,没有返回值(void
)。它接受一个名为teacherDTO
的TeacherDTO
对象作为参数。@RequestBody
注解表示方法参数的JSON数据将自动从HTTP请求体中解析并转换为相应的Java对象。teachService.teacherAdd(teacherDTO);
: 这行代码调用了teachService
服务中的teacherAdd
方法,并将teacherDTO
对象作为参数传递。这通常是添加教师信息到数据库的操作。
简单来说,这个API用于添加教师信息,客户端需要发送一个包含教师信息的JSON格式的POST请求到/api/teach/teacher/add
路径,然后后端会处理这个请求并将教师信息添加到数据库中。
标题
这个注释是在一个Java Spring Boot应用程序的REST API接口中,用于描述一个HTTP DELETE请求的操作。这个接口的目的是删除一个特定的教师信息。下面是注释及其详细解释:
@Operation(summary = "教师信息删除")
: 这是OpenAPI 3.0规范中的一个注解,用于描述一个API操作。summary
属性提供了操作的简短描述,这里指出这个操作是用于删除教师信息。@DeleteMapping("/api/teach/teacher/delete/${id}")
: 这个注解用于将HTTP DELETE请求映射到对应的处理方法。这里的/api/teach/teacher/delete/${id}
是请求的URL路径,${id}
是一个变量,它将在请求时被具体的教师ID替换。public void teacherDelete(@PathVariable("id") String id)
: 这是处理DELETE请求的方法。方法的返回类型是void
,意味着这个方法不会返回任何内容。它接受一个@PathVariable
注解的参数id
,这个注解表明参数的值是通过URL路径变量传递的。teachService.teacherDelete(id);
: 这是方法体中的代码,它调用服务层的一个方法teacherDelete
,传递接收到的教师ID作为参数。这个调用执行了实际的删除操作,例如从数据库中删除相应的教师记录。
总的来说,这段代码定义了一个REST API接口,用于删除指定ID的教师信息。通过HTTP DELETE请求调用这个接口,并传递要删除的教师ID作为URL路径变量。
使用 @PathVariable
是为了在 URL 中使用动态部分,以便通过 URL 直接识别和定位到具体的资源。通俗地讲,如果你想根据某个特定的信息来操作一个资源,而这个信息又是不固定的,那么你就可以使用 @PathVariable
。
例如,你想删除一个教师,你需要知道这个教师的 ID。这个 ID 是唯一的,而且是不固定的,因为不同的教师有不同的 ID。如果你在 URL 中使用这个 ID,那么你就可以通过 URL 直接定位到要删除的教师资源。
假设你有一个 URL 路径是这样的:
/api/teach/teacher/delete/{id}
这里的 {id}
就是一个动态部分,它代表了要删除的教师的唯一 ID。当你想要删除某个具体的教师时,你只需要将这个 ID 替换到 URL 中即可,比如:
/api/teach/teacher/delete/12345
这个 URL 就指向了要删除的教师资源。而 @PathVariable
注解就是用来将这个 ID 绑定到控制器方法中的一个参数,这样就可以在方法内部使用这个 ID 来执行删除操作。
总结一下,使用 @PathVariable
的情况就是你需要在 URL 中使用动态部分来直接定位到具体的资源,这样可以使 URL 设计更加灵活和直观,同时也使得代码更加可维护和易于理解。、
标题
prepend 是 Elastic UI 组件库(Element UI)中的一个内置插槽名称,它告诉 组件将自定义内容插入到选项列表的前面。
需要注意的是,slot=“prepend” 只影响自定义内容的位置,不会影响 组件本身的结构和功能。此外,slot 插槽是 Vue.js 的一个特性,它允许你向组件的特定位置插入自定义内容,而不需要修改组件的源码。
没整理的之前后端数据传输格式
①fectchData是table绑定的 : fectch-api
//从api后端获取学生数据
② fetchStudentData(query){
console.log(1);
console.log(getStudentData(query))
console.log(2);
return getStudentData(query)
console.log(3); //不执行
},
fectchData数据如下:
promise对象
①data(){
return{
clazzList: [],
defaultExpandedKeys: []
}
},
② created() {
this.initData()
},
③methods: {
initData(){
getTreeClazz().then(res=>{
this.clazzList = res
if(this.clazzList && this.clazzList.length > 0) {
this.defaultExpandedKeys = this.clazzList.map(parentClazz=>parentClazz.code)
//console.log(this.defaultExpandedKeys);
}
})
},
getTreeClazz().then(res=>{ this.clazzList = res这样的数据就是list