baomidou Mabatis plus引入异常
主要异常信息 Error creating bean with name 'dataSource'
但是有个重要提示
dynamic-datasource Please check the setting of primary
解决方法:增加
<dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>4.3.1</version> </dependency>
2
java.lang.NullPointerException: Cannot invoke "com.tencent.wxcloudrun.dao.UserMapper.selectList(com.baomidou.mybatisplus.core.conditions.Wrapper)" because "this.userMapper" is null
如果你在单元测试中遇到这个错误,确保在测试类上使用了正确的注解来模拟Spring容器,如@RunWith(SpringRunner.class)
和@SpringBootTest
。
3
Correct the classpath of your application so that it contains a single, compatible version of org.ap
含有batis名字的类冲突,在pom.xml删除,clean
4.PaginationInnerInterceptor
无法引入PaginationInnerInterceptor
因为 jsqlparser 5.0+
版本不再支持 jdk8
针对这个问题解耦 jsqlparser
依赖。 正确打开姿势,引入 mybatis-plus-bom
模块,然后引入 ..starter
和 ..jsqlparser..
依赖
pom.xml中增加
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-bom</artifactId>
<version>3.5.9</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-jsqlparser-4.9</artifactId>
</dependency>
前端axios
spring boot crossorigin 不起作用
Uncaught (in promise) AxiosError {message: 'Network Error', name: 'AxiosError', code: 'ERR_NETWORK', config: {…}, request: XMLHttpRequest, …}
原因:
解决springboot添加@CrossOrigin支持跨域不起作用_crossorigin注解不起作用-CSDN博客
在springboot2.x版本以后,要用
@CrossOrigin(originPatterns = "*",allowCredentials = "true")
前端+ts+vue3+axios+antdv list
antdv list主要要求有data ,data中要有title
使用antdv的列表 <a-list item-layout="horizontal" :data-source="data">
data一直报错,提示不能为null ,data因为列表要求不能更换,否则列表无法识别
<template>
<a-list item-layout="horizontal" :data-source="data">
<template #renderItem="{ item }">
<a-list-item>
<a-list-item-meta
description="Ant Design, a design language for background applications, is refined by Ant UED Team"
>
<template #title>
<a href="https://www.antdv.com/">{{ item.title }}</a>
</template>
<!-- <template #typename>
<a href="https://www.antdv.com/">{{ item.typename }}</a>
</template> -->
<template #avatar>
<a-avatar src="https://joeschmoe.io/api/v1/random" />
</template>
</a-list-item-meta>
</a-list-item>
</template>
</a-list>
</template>
<script lang="ts" setup>
import { onMounted, reactive, ref } from "vue";
import { CategoryListApi} from "../../request/api";
interface DataItem {
deep:string;
id:string;
isLeaf:string,
parentid:0,
title: string
}
// let data=reactive([{
// deep:0,
// id:1,
// isLeaf:0,
// parentid:0,
// title:"hello"
// }]
// );
let data=ref<[DataItem]|null>(
// [
// {
// deep:0,
// id:1,
// isLeaf:0,
// parentid:0,
// title:"hello1"
// }]
);
let defaultValue=ref([{
deep:0,
id:1,
isLeaf:0,
parentid:0,
title:"hello2"
}]
);
// let data: DataItem[] = [
// {
// title: 'Ant Design Title 1',
// },
// {
// title: 'Ant Design Title 2',
// },
// {
// title: 'Ant Design Title 3',
// },
// {
// title: 'Ant Design Title 4',
// },
// ];
console.log("diyibu",data)
// let x=ref<number| null>(0);
onMounted(
()=>getData()
)
const getData=async () => {
await CategoryListApi().then(
response=>{
console.log("res",response.data)
// x.value=response.data;
data.value=response.data;
}
);
// data=response.data;
}
//直接使用,一般用在进入页面入请求数据的接口
// onMounted(()=>{
// CategoryListApi().then(
// response=>{
// data=response.data??defaultValue;
// console.log("hello",data)
// }
// )
// })
// const data = (params: DataItem[]) => {
// return CategoryListApi().then(response=>{
// data= response.data;
// });
// };
console.log("sss",data);
</script>
后端返回格式:是一个对象数组
注意其中一定要有title字段
第一步:定义了interfaceDataItem
第二步:定义 let data=ref<[DataItem]|null>
<>中间的意思是使用DataItem类型数组,|null表示可以为空
此处用reactive会报错
let data=ref<[DataItem]|null>(
// [
// {
// deep:0,
// id:1,
// isLeaf:0,
// parentid:0,
// title:"hello1"
// }]
);
第三步
data.value=response.data;
data.value获得一个对象数组,antdv列表item即对应其中每一行
Unable to resolve table
Unable to resolve table 'sh_goods_category'
原因,刚加的表idea需要在FROM 后面表名处右键 refresh schema
树形控件
使用后端返回的名字
1) :field-names="fieldNames"
2) 定义
原本以为是拦截接口返回数据进行更名,实际是更换tree组件中识别名字
//给从后端返回的数据重命名
const fieldNames: TreeProps['fieldNames'] = {
// children: 'child',
key:'id',
title: 'name', //name就是后端返回的名字
};
3)更换template中名字为后端返回名字
<template #title="{ name, key }">
<span v-if="key === '1'" style="color: #1890ff">{{ name }}</span>
<template v-else>{{ name }}</template>
</template>
<template>
<a-tree
v-model:expandedKeys="expandedKeys"
v-model:selectedKeys="selectedKeys"
v-model:checkedKeys="checkedKeys"
checkable
:tree-data="treeData"
:field-names="fieldNames"
>
<template #title="{ name, key }">
<span v-if="key === '1'" style="color: #1890ff">{{ name }}</span>
<template v-else>{{ name }}</template>
</template>
</a-tree>
</template>
<script lang="ts" setup>
import { onMounted, ref, watch } from 'vue';
import type { TreeProps } from 'ant-design-vue';
import { CategoryListApi } from '../../request/api';
// let treeData=ref<TreeProps['treeData']|null|undefined>();
// let treeData: TreeProps['treeData'];
let treeData=ref<TreeProps['treeData']>();
//给从后端返回的数据重命名
const fieldNames: TreeProps['fieldNames'] = {
// children: 'child',
key:'id',
title: 'name',
};
// let treeData=ref<TreeProps|null>();
//这个代码片段是TypeScript的类型注解,用于声明一个名为treeData的常量,其类型是TreeProps接口中的treeData属性类型。这种写法通常用于定义React组件的属性类型,尤其是树形组件。
// const treeData: TreeProps['treeData'] = [
// {
// title: 'parent 1',
// key: '0-0',
// children: [
// {
// title: 'parent 1-0',
// key: '0-0-0',
// disabled: true,
// children: [
// { title: 'leaf', key: '0-0-0-0', disableCheckbox: true },
// { title: 'leaf', key: '0-0-0-1' },
// ],
// },
// {
// title: 'parent 1-1',
// key: '0-0-1',
// children: [{ key: '0-0-1-0', title: 'sss' }],
// },
// ],
// },
// ];
onMounted(
()=>getData()
)
const getData=async () => {
await CategoryListApi().then(
response=>{
console.log("res",response.data)
// x.value=response.data;
treeData.value=response.data||[];
// console.log(treeData.value)
}
);
}
// const expandedKeys = ref<string[]>(['1', '2']);
// const selectedKeys = ref<string[]>(['1', '2']);
// const checkedKeys = ref<string[]>(['1', '2']);
const expandedKeys = ref<string[]>(['1']);
const selectedKeys = ref<string[]>([]);
const checkedKeys = ref<string[]>([]);
watch(expandedKeys, () => {
console.log('expandedKeys', expandedKeys);
});
watch(selectedKeys, () => {
console.log('selectedKeys', selectedKeys);
});
watch(checkedKeys, () => {
console.log('checkedKeys', checkedKeys);
});
</script>
右键菜单不出现
注释位置影响,只是写到 <template #overlay>里面就不行
<!--{ key: treeKey, name }"原来是 { key: treeKey, title } -->
<!--treeKey指的是id+1 --> <!--menuKey指的是下面这个key 注释不能写到 a-menu @click="({ key: menuKey },不然右键不好使-->
<template #title="{ id: treeKey, name }">
<a-dropdown :trigger="['contextmenu']">
<span>{{ name }}</span>
<template #overlay>
<a-menu @click="({ key: menuKey }) => onContextMenuClick(treeKey, menuKey)">
<a-menu-item key="1">添加分类</a-menu-item>
<a-menu-item key="2">删除分类</a-menu-item>
<a-menu-item key="3">修改分类</a-menu-item>
</a-menu>
</template>
</a-dropdown>
</template>