2019-05-14 DAY17
明天周三要上课,可以休息又是一天的新动力。!
今天要完成,点击一个node,实现搜索对应的文件信息的功能。
问题:树形控件 不能懒加载 把data改一下,在原来的entity里面加个属性children;
后台接受一个数组。
2019-05-16 DAY18
今天周四emmm,昨天姐姐诶给我发了工资嘻嘻嘻。今天希望能解决剩下的问题。就是上面的。
then() 只有在Promise对象中才有。
then()方法是异步执行。
意思是:就是当.then()前的方法执行完后再执行then()内部的程序,这样就避免了,数据没获取到等的问题。
语法:promise.then(onCompleted, onRejected);
参数
必需。(promise)
Promise 对象。
必需。(onCompleted)
承诺成功完成时要运行的履行处理程序函数。
可选。(onRejected)
承诺被拒绝时要运行的错误处理程序函数。
报错:Cannot read property 'forEach' of undefined
//加载表格内容
if (res != null && res.code == '0000' && res.data != null) {
let ret =[];
res.data.list.forEach(el => {
const item: any = {};
item.studentCode = el.studentCode;
item.studentName = el.studentName;
item.studentScore = el.studentScore;
}
这个就是遍历数据的一个方法。
解决办法就是在遍历之前,先判断是否存在
if (!res.data.list){
return;
}
我成功了155555555555555551
2019-05-17 DAY19
今天周五嘻嘻嘻嘻,就总结一下这个项目,并且尝试修改一下再改几个不安全的地方。
成果图
数据库的设计:number在后端另外实现排序,id是auto_createment
image.png image.png实现每个level下number的递增:
count出有多少相同parentId的条数,最后再加个一就是它的number
xml里:
<select id="countByParentId" resultType="Integer">
select count(*) from project_management where
<if test="_parameter!=null">
parent_id = #{_parameter}
</if>
</select>
############service里:
public int countByParentId(int pid){
return projectManagementMapper.countByParentId(pid) + 1;
}
查着查着发现一个问题,首先,setNumber好像被我删了,然后不能updateByUrl,因为每次上传的文件相同,但是url是不同的。
image.png
一个一个解决:setNumber写在这里。
controller:在/save里面
pm.setNumber(projectManagementService.countByParentId(form.getValue("parentId")));//setNumber
文件name相同修改文件名的做法,后面加上(1)(2)(3)
在xml,修改sql语句。
完成后
贴代码不太明显,还是截图好了
完整的/save的java:如果当前parentid下的没有该name,就直接add,如果有,就重命名,这里不考虑文件相同,url不同的状态。
@PostMapping("/query")
@ResponseBody
Object selectAll(@RequestBody DynamicBean form) {
Pager pager = new Pager(form);
DynamicBean bean = new DynamicBean();
List<Integer> ll = new ArrayList<>(form.getValue("ids"));
List<ProjectManagement> list = new ArrayList<>();
String formName = form.getString("name");
Map<String, Object> map = new HashMap<String, Object>(2);
map.put("name", formName);
map.put("ids", ll);
System.out.println(map);
if (ll.size() != 0) {
if (formName != "") {
List<ProjectManagement> list2 = projectManagementService.selectByNameAndIds(map);
for (ProjectManagement j : list2) {
list.add(j);
}
} else {
for (int i : ll) {
list.add(projectManagementService.selectById(i));
}
}
} else {
if (formName != "") {
List<ProjectManagement> list2 = projectManagementService.selectByName(formName);
for (ProjectManagement j : list2) {
list.add(j);
}
} else {
list = projectManagementService.selectAll();
}
}
bean.put("list", list);
bean.put("pager", pager);
return ApiResult.build(bean);
}
接下来解决选中目录后,搜索name出现未选中文件信息的问题
问题完成后
在mybatis里传入了一个map,注意id in 某个list的写法。ids是map中list的key值。 image.png
controller里这么写: image.pngjava中判断list是否为空的用法
1、如果想判断list是否为空,可以这么判断:
if(null == list || list.size() ==0 ){
//为空的情况
}else{
//不为空的情况
}
2、list.isEmpty() 和 list.size()==0 有啥区别呢**
案:没有区别 。**isEmpty()判断有没有元素,而size()返回有几个元素, 如果判断一个集合有无元素 建议用isEmpty()方法.比较符合逻辑用法。
3、list!=null 跟 ! list.isEmpty()有什么区别?
这就相当与,你要要到商店买东西
list!=null 首先判断是否有商店
!list.isEmpty() 没有判断商店是否存在,而是判断商店是否有东西
总结用法:如果连商店都没有,何来的的东西可卖
所以一般的判断是
if(list!=null && !list.isEmpty()){
//不为空的情况
}else{
//为空的情况
}
接下来。。回忆用elementui的树形控件和怎么把后台的数据变成他这个格式的。
首先贴一段文档: image.png <el-tree
:data="data"
show-checkbox
default-expand-all
node-key="id"
ref="tree"
highlight-current
:props="defaultProps">
</el-tree>
<div class="buttons">
<el-button @click="getCheckedNodes">通过 node 获取</el-button>
<el-button @click="getCheckedKeys">通过 key 获取</el-button>
<el-button @click="setCheckedNodes">通过 node 设置</el-button>
<el-button @click="setCheckedKeys">通过 key 设置</el-button>
<el-button @click="resetChecked">清空</el-button>
</div>
<script>
export default {
methods: {
getCheckedNodes() {
console.log(this.$refs.tree.getCheckedNodes());
},
getCheckedKeys() {
console.log(this.$refs.tree.getCheckedKeys());
},
setCheckedNodes() {
this.$refs.tree.setCheckedNodes([{
id: 5,
label: '二级 2-1'
}, {
id: 9,
label: '三级 1-1-1'
}]);
},
setCheckedKeys() {
this.$refs.tree.setCheckedKeys([3]);
},
resetChecked() {
this.$refs.tree.setCheckedKeys([]);
}
},
data() {
return {
data: [{
id: 1,
label: '一级 1',
children: [{
id: 4,
label: '二级 1-1',
children: [{
id: 9,
label: '三级 1-1-1'
}, {
id: 10,
label: '三级 1-1-2'
}]
}]
}, {
id: 2,
label: '一级 2',
children: [{
id: 5,
label: '二级 2-1'
}, {
id: 6,
label: '二级 2-2'
}]
}, {
id: 3,
label: '一级 3',
children: [{
id: 7,
label: '二级 3-1'
}, {
id: 8,
label: '二级 3-2'
}]
}],
defaultProps: {
children: 'children',
label: 'label'
}
};
}
};
</script>
我主要用了getCheckedKeys来获得选中node的key值也就是id值(node-key="id"这里要写)( :data="data") 来绑定data
前端是如何通过后端提供的数据(listAll接口提供所有的数据条)生成children属性,(因为数据库设计没有children字段。)
listAll controller中的/listAll一开始用了懒加载,但是不行,因为只能点击之后才加载节点数据,不符合要求 image.png
如果是懒加载的话,方法就是这样: image.png
所以使用一开始就全部加载完成的写法
image.png
return的内容
ids用来放getcheckedkeys返回的id数组
:param="form"是传到后端的参数
后端用一个list接收 image.png
async getTreeData() {
let rs = await this.$post("projectmanagement/listAll", {});
if (rs.status == "200") {
console.log(rs.payload);
this.data = this.getListData(rs.payload, {
id: "id",
pid: "parentId",
children: "children"
});
return this.data;
}
},
getListData(data, config) {
var id = config.id || "id";
var pid = config.pid || "pid";
var children = config.children || "children";
var idMap = {};
var jsonTree = [];
if (!data) {
return;
}
data.forEach(function(v) {
idMap[v[id]] = v;
});
data.forEach(function(v) {
var parent = idMap[v[pid]];
console.log(pid);
if (parent) {
!parent[children] && (parent[children] = []);
parent[children].push(v);
} else {
jsonTree.push(v);
}
});
console.log(jsonTree);
return jsonTree;
},
用rs接收传回来的值,payload是数组。(有点头疼,看着心烦,用后端写会方便理解一点点,虽然逻辑是一样的。 不要写async,这个我还不太理解,等会看。)再在mounted里面用这个函数。
image.png
2019-05-20 DAY20
后天就去迪士尼啦~~~周末吃了太多垃圾食品。。毁容了噗。
在后端实现list有children、节点,生成树
private List<ProjectManagement> createTree(List<ProjectManagement> list){
List<ProjectManagement> rootList = new ArrayList<>();
Map<Integer,ProjectManagement> projectMap = new HashMap<>(rootList.size());
for (int i = list.size() - 1; i > 0; i --){
ProjectManagement pm = list.get(i);
if(pm.getParentId() == 1){
rootList.add(pm);
}
projectMap.put(pm.getId(),pm);
}
for (Integer key : projectMap.keySet()){
ProjectManagement pm = projectMap.get(key);
if (projectMap.get(pm.getParentId()) != null){
ProjectManagement parentPm = projectMap.get(pm.getParentId());
List<ProjectManagement> children = parentPm.getChildren();
if (children == null){
children = new ArrayList<>();
}
children.add(pm);
parentPm.setChildren(children);
}
}
List<ProjectManagement> finalList = new ArrayList<>();
ProjectManagement root = new ProjectManagement();
root.setId(0);
root.setName("文档资料");
root.setChildren(rootList);
finalList.add(root);
return finalList;
}
前端: image.png
刚刚去老大那边问了一下。。然后发现功能性错误。。哎。。
要有两个表,一个项目表,一个文档表。做吧。。
2019-05-21 DAY21
周二,同事们搬到楼上去了。。。。老大应该也是。。。。。。
明天去上海!嗯!
出现了一个问题,就是上传文件过大的过,上传不成功。
image.png
查了一下,是nginx服务器 配置问题???可是我的电脑没装这个呀。。。,大小限制应该是1M。
报错
tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededException: The field files exceeds its maximum permitted size of 1048576 bytes.]
在配置文件里面 springboot2.x之后用
http:
servlet:
multipart:
max-file-size: 100MB
max-request-size: 1000MB # 设置最大的请求文件的大小
修改完配置文件之后,在启动类App.class文件中配置Bean来设置文件大小
image.png
/**
* 文件上传配置
* @return
*/
@Bean
public MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
//单个文件最大
factory.setMaxFileSize("102400KB"); //KB,MB
/// 设置总上传数据总大小
factory.setMaxRequestSize("1024000KB");
return factory.createMultipartConfig();
}
这里也要改
image.png
然后发现删除整个项目的bug。改好了。
image.png
zuul和eureka server
参考:服务网关zuul
Eureka server提供服务注册和发现
zuul服务化
通过url映射的方式来实现zull的转发有局限性,比如每增加一个服务就需要配置一条内容,另外后端的服务如果是动态来提供,就不能采用这种方案来配置了。实际上在实现微服务架构时,服务名与服务实例地址的关系在eureka server中已经存在了,所以只需要将Zuul注册到eureka server上去发现其他服务,就可以实现对serviceId的映射。
默认情况下,Zuul会代理所有注册到Eureka Server的微服务,并且Zuul的路由规则如下:http://ZUUL_HOST:ZUUL_PORT/微服务在Eureka上的serviceId/**会被转发到serviceId对应的微服务。
2019-05-27 DAY22
解决了删除的问题。。
@PostMapping("/deleteAllDocument")
@ResponseBody
ApiResult deleteAllDocumentByProjectId(@RequestBody DynamicBean form) {
int id = form.getValue("id");
ProjectManagement pm = projectManagementService.selectById(id);
List<ProjectManagement> list = createTree(projectManagementService.listAll());
ProjectManagement q = new ProjectManagement();
for(ProjectManagement pppp : list){
if(pppp.getChildren() != null){
for(ProjectManagement ppp : pppp.getChildren()){
if(ppp.getId() == id){
q = ppp;
break;
}
if(ppp.getChildren() != null){
for(ProjectManagement ppppp : ppp.getChildren()){
if(ppppp.getId() == id){
q = ppppp;
break;
}
}
}
}
}
}
int j,i,k = 0;
List<ProjectManagement> childrenlist = q.getChildren();
if(childrenlist != null){
for(ProjectManagement pp : childrenlist){
if(projectManagementService.selectProjectDocumentByProjectId(pp.getId()).size() != 0){
i = projectManagementService.deleteAllDocumentByProjectId(pp.getId());
if( i == 0 ){ System.out.println("没删掉文档"); return ApiResult.build(500, "删除失败"); }
if (i == 1) { System.out.println("删掉了文档");}
}
k = projectManagementService.deleteById(pp.getId());
if ( k == 0){ return ApiResult.build(500, "删除失败"); }
}
} else {
if(projectManagementService.selectProjectDocumentByProjectId(pm.getId()).size() != 0){
i = projectManagementService.deleteAllDocumentByProjectId(pm.getId());
if( i == 0 ){ System.out.println("没删掉文档"); return ApiResult.build(500, "删除失败");}
if (i == 1) { System.out.println("删掉了文档");}
}
}
j = projectManagementService.deleteById(id);
return j > 0 ? ApiResult.build(200,"删除成功") : ApiResult.build(500, "删除失败");
}
很蠢的办法。。。
文档管理。
终。
新的任务:
1、选择商户、活动、规格号、、、 然后加一个是否匿名
2、渠道号增删和下拉框选择渠道号
2019-05-28 DAY23
完成了一部份
2019-05-30 DAY24
又完成了一部分,还需要数据库数据。。我还不清楚没和我说。。
好吧,,然后他让我自己写
2019-05-31 DAY25
昨天的内容写完了,但是没有新建分支。。。有点难受,wu怎么办呢,应该不急吧
2019-06-3 DAY26
invalid byte sequ
ence in US-ASCII (ArgumentError)
报错。。找不到原因
然后就新建了一个分支,加进去了。。前端的还没push上去。好了。
git指令:
新建一个branch,然后push这个branch。
先看自己的状态:git status
再git push origin develop_wtt_coupon
网友评论