实习笔记(持续更新)

本文用于记录实习过程中遇到的问题,做一个简单的笔记

问题集

7.12问题总结

1.后端返回的日期格式数据需要转换一下才能正常显示
{
    field: 'dtCreate',
    title: '反馈时间',
    formatter: function (value, row, index) {
        return (new Date(value)).Format("yyyy-MM-dd hh:mm");
    }
},
2.得到的model需要进行非空验证
3.前端接收后端数据类型需要是Page类型
@GetMapping("list")
public Page<T> list(){
    Page<T> page = new Page<>();
    return page;
}

7.13问题集

1.浏览器存储了cookie,所以如果用postman直接调用会被拦截,需要加上cookie
2.在接口实现层impl需要添加@Service注解把方法添加进IoC容器中,否则出现bean找不到异常

7.14问题集

1.Controller得到的数据要进行null或空的判断,字符串不能用==判断,例如 str == ““就是错误的,要用equals()方法,而且不能用str.equals(””)来判断,因为str如果为null,就没有equals()方法了,要用"".equals(str)判断
总结,写成: if( str != null && !( “”.equals(str ) ) ) ,注意,null的判断要写在equals的前面
2.关于Git的操作

​ 开发有三条主线,dev开发环境,test测试环境,master主要运行环境,master上的都是测试完成,可以对外使用的代码。

​ 当有一个新需求时,首先从master上拉一个分支,在此分支上进行构建项目需求,当需求完成,合并到test分支上进行测试,test测试通过才合并到master分支上线。

注意每次合并分支前先更新当前分支,防止合并时把别人的代码覆盖掉。

7.15问题集

 **1.$()是CSS标签选择器,选择标签的id或class,(id为'#'),(class为'.')。例:$('#exampleTable'),$('.exampleTable')**
2.$(function(){ })  是$(document).ready(function()的简写(JQuery写法:页面框架加载完成就执行)

7.16问题集

1.在input框中加上 οninput=“value=value.replace(/[^\d]/g,’’)” 限制只允许输入数字
<input th:value="${model?.priority}" type="text" class="form-control" id="priority" placeholder="请输入排序" name="priority" oninput="value=value.replace(/[^\d]/g,'')">
2.如何在js中得到model中的参数?
<script th:inline="javascript">
    var 参数名 = [[${model}]];
</script>
3.如何在js中得到传递给html页面的URL中的参数?
//得到URL中的sceneId
function getParams(sceneId) {
    var reg = new RegExp("(^|&)" + sceneId + "=([^&]*)(&|$)");
    var r = window.location.search.substr(1).match(reg);
    if (r != null) {
        return unescape(r[2]);
    }
    return null;
};
var sceneId=getParams("sceneId");
4.在js中的方法内可以直接引用外面的变量,不需要当成参数传递进方法内 例:
var id = "111";
layer.open({
    type: 2,
    title: '编辑元素信息+' + id,
    maxmin: true,
    shadeClose: false, // 点击遮罩关闭层
    area: ['85%', '95%'],
    content: '/cbt/element/elementInfo/edit?id=' + id,
    // btn: ['关闭'],
    success: function (layero, index) {
        var content = layero.find("iframe")[0].contentWindow;
    }
});
5.select标签与thymeleaf组合循环遍历model中的数据进行显示结果
<select  required class="form-control" id="progressName" name="progressName">
<option value=""> -- 请选择 --</option>
<option th:each="sceModel:${sceneIdModel}" th:value="${sceModel.progressId}" th:text="${sceModel.name}"
        th:selected="${(sceModel != null) and  (sceModel.name == name)}"></option>
</select>
6.判断集合是否为空
CollectionUtils.isEmpty(model)    //true为空
7.下拉框遍历数组显示数组中的内容,并选中某一个为默认值
<select  required class="form-control" id="progressId" name="progressId">
	<option th:each="sceModel:${sceneIdModel}" th:value="${sceModel.progressId}" th:text="${sceModel.name}"
th:selected="${(sceModel != null) and  (sceModel.name == name)}">
    </option>
</select>

th:selected="${(sceModel != null) and (sceModel.name == name)}" : 默认选中某个值

7.19问题集

1.提交测试注意写上用的人,陆瑾研发
2.当不确定查询结果为多少条数据时,可以分段查找
List<TherapyPlan> planModelList = new ArrayList<>();
Integer page = 1;
List<TherapyPlan> pml = therapyPlanMapper.findByComplexCondition(correlationID, therapyPlanComponentReq, page, 100).getModel();
while(pml.size() > 0){
    planModelList.addAll(pml);
    pml = therapyPlanMapper.findByComplexCondition(correlationID, therapyPlanComponentReq, ++page, 100).getModel();
}
3.得到List集合如何返回Page集合
List<TherapyAndSceneAndElementRes> myList = new ArrayList<>();
Page<TherapyAndSceneAndElementRes> pages = new Page<>();
//传过来的pageSize和page先转换为int类型
int pageSizes = Integer.parseInt(pageSize);
Integer page2 = Integer.parseInt(page);
//如果myList总数大于当前页包括之前所有页的总条数时,展示每页pageSize条数据
//如果myList总数小于当前页包括之前所有页的总条数时,List集合中剩余数量不够一页个数,只需把剩下的所有数据展示即可
if(myList.size() > page2*pageSizes){
    pages.setContent(myList.subList((page2-1)*pageSizes,page2*pageSizes));//当前页包含条数
   }else{
        pages.setContent(myList.subList((page2-1)*pageSizes,myList.size()));//当前页包含条数
   }
//总条数
long size = (long)myList.size();
pages.setTotalElement(size);//总条数
long totalPage;
//总页数
if(size % pageSizes == 0){
    totalPage = size / pageSizes;
}else{
     totalPage = size / pageSizes +1;
}
pages.setTotalPage((int)totalPage);//总页数
pages.setCurrentPage(page2);//当前页

7.23问题集

1.批量导入文本的前端写法

html页面

<div id = "fileContent"></div>
<button class="btn btn-warning" onclick="importExcel()">批量导入</button>

js页面

function importExcel() {
    //把fileContent标签置为空
    $("#fileContent").empty();
    //给fileContent标签添加html,一个文件格式的输入框
    $("#fileContent").html('<input type="file" id="fileload" name="file" style="display: none">');
    //当fileload元素的值发生改变时,会发生 change 事件。
    $("#fileload").change(function () {
        var myform = new FormData();//创建一个文件类型对象myform
        //把选中的文件添加到myfrom中
        myform.append('file', document.getElementById("fileload").files[0]);
        $.ajax({
            url: '/cbt/chat/knowledgeBase/esImportFromExcel',
            type: 'POST',
            data: myform,
            async: true,
            cache: false,
            contentType: false,
            processData: false,
            success: function (responseStr) {
                if (responseStr.code == '0000') {
                    // window.location="/api/getFile?name="+responseStr.appdata.other;
                    parent.layer.alert(responseStr.msg);
                } else {
                    alert(responseStr.msg);
                }
            },
            error: function (responseStr) {
                alert("操作失败");
            }
        });
    });
    $("#fileload").click();
}
2.在一个js页面中调用另一个js中的方法

只需要在html页面中把两个js页面都引入即可,因为虽然是两个js页面,但是如果在一个html中引用,他们都会抽象成一个js页面

8.2问题集

1.flush()方法

当对一个文件进行读写时,先把文件读取到内存,再进行输出,调用flush()方法,会把文件一次性输出到内存,等于是刷新缓存,但是并不会关闭流,是一个保存操作,而close()是保存后再关闭流

8.10问题集

1.把一个实体类转换为一个map集合

实体类中包含构造方法,get,set方法,而我们需要获取get方法的方法名和值

Map<String, Object> properties = new HashMap<>();

Method[] methods = alipayTrade.getClass().getMethods();
try{
    for (Method method: methods) {
        //1.获取所有方法
        Class<?>[] paramClass = method.getParameterTypes();
        //2.排除有参的方法,传入的参数类型>0,不需要,直接跳过,因为只需要get方法
        if (paramClass.length > 0){
            continue;
        }
        //3.获取方法名,且只要get方法
        String methodName = method.getName();
        if (methodName.startsWith("get")){
            //4.得到方法的值
            Object value = method.invoke(alipayTrade);
            if (value != null)
                //5.put进map集合
                properties.put(methodName.substring(3).toLowerCase(), String.valueOf(value));
        }
    }
}catch (IllegalArgumentException e) {
    e.printStackTrace();
} catch (IllegalAccessException e) {
    e.printStackTrace();
} catch (InvocationTargetException e) {
    e.printStackTrace();
} catch (SecurityException e) {
    e.printStackTrace();
}

8.18问题集

1.mybatis动态sql实现分页

(1).添加pom.xml

<dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>5.2.0</version>
</dependency>

(2).在config.xml中添加配置

<plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor">
        </plugin>
    </plugins>

(3).动态sql写法,动态sql中不用分页

<select id="getTopicListByCrowTag" parameterType="com.lianxin.busi.query.domain.TopicInfoDetailTagReq" resultType="com.lianxin.busi.query.domain.TopicInfoDetailTagRes">
        SELECT info.*,tag.CROWD_TAG_NAME FROM dbcontent.tb_topic_info info
        LEFT JOIN dbchnl.tb_crowd_resource res ON info.TOPIC_ID  =  res.ITEM_ID
        LEFT JOIN dbchnl.tb_crowd_tag tag ON res.CROWD_TAG_ID = tag.CROWD_TAG_ID
        <where>
            <if test="crowTagId!=null">
             tag.CROWD_TAG_ID = #{crowTagId}
            </if>
            <if test="status!=null">
                and info.status = #{status}
            </if>
            <if test="(titleMainLike != null and titleMainLike != '' )">
                and ( info.TITLE_MAIN like concat( #{titleMainLike}) )
            </if>
            <if test="topicId!=null">
                and info.TOPIC_ID = #{topicId}
            </if>
            <if test="classifyId!=null">
                and info.CLASSIFY_ID = #{classifyId}
            </if>
            <if test="dtEnableStart !=null">
                and info.DT_ENABLE &gt; #{dtEnableStart}
            </if>
            <if test="dtEnableEnd != null">
                and info.DT_ENABLE &lt; #{dtEnableEnd}
            </if>
            and res.ITEM_TYPE = '01'
            order by info.DT_ENABLE DESC
        </where>
    </select>

(4).在业务层实现分页,pagehelper通过拦截mysql语句进行分页

public ModelListResult<TopicInfoDetailTagRes> queryTopicListByCrowTagName(String correlationID, TopicInfoDetailTagReq req) {
        //PageHelper是分页的对象类,把page和pageSize传进去可以实现分页,从第一页开始
        PageHelper.startPage(req.getPage(),req.getPageSize());
        List<TopicInfoDetailTagRes> list= topicInfoTagDao.getTopicListByCrowTag(req);
        PageInfo pageInfo=new PageInfo(list);
        for(TopicInfoDetailTagRes list1:list){
            list1.setPageNum(pageInfo.getPageNum()+1);//当前页码
            list1.setSize(pageInfo.getSize());//当前页条数
            list1.setTotal(pageInfo.getTotal());//总条数
            list1.setPages(pageInfo.getPages());//总页数
        }
        return new ModelListResult<>(list);
    }

8.27问题集

1.数据库字段存储json数据

存储样式:

​ 字段page_json

​ {“title”:“首页”,“main”:“主要”}

在Java代码中将字段转为json对象,再通过getString(“key”)方法得到对应key的值,封装到model中给前端展示

if(!"".equals(channelExtend.getLoginPageJson()) && channelExtend.getLoginPageJson() != null){
    JSONObject o = JSONObject.parseObject(channelExtend.getLoginPageJson());
    if(o.getString("mainTitle") != null){
        detail.setMainTitle(o.getString("mainTitle"));
    }else{
        detail.setMainTitle("首页");
    }
    if(o.getString("consultTitle") != null){
        detail.setConsultTitle(o.getString("consultTitle"));
    }else{
        detail.setConsultTitle("心理咨询");
    }
    model.addAttribute("titleModel",detail);
}
2.js中把多个变量存储到一个json中

写一个方法来转换

function getLoginPageJson(){
    var mainTitle = $("#mainTitle").val();
    var consultTitle = $("#consultTitle").val();
    var arr = {};
    if(mainTitle != null && mainTitle != ""){
        arr['mainTitle'] = mainTitle;
    }else{
        arr['mainTitle'] = "首页";
    }
    if(consultTitle != null&& consultTitle != ""){
        arr['consultTitle'] = consultTitle;
    }else{
        arr['consultTitle'] = "心理咨询";
    }
    console.log(JSON.stringify(arr));
    return JSON.stringify(arr);

}

3.java中把字符串转为json,再把json转为map,把key转小写,再转回json,再转回字符串

JSONObject o = JSONObject.parseObject(userLabelBaseDto.getConfig());//字符串转json
Map<String,Object> map = (Map) o;//json转map
Map<String,Object> resultMap = new HashMap<>();
Set<String> keySet = map.keySet();//map得到ket集合
for(String key:keySet){
    String newKey = key.toLowerCase();//key转小写
    resultMap.put(newKey,map.get(key));
}
JSONObject jsonObject = new JSONObject(resultMap);//map转json
String config = jsonObject.toString();//json转字符串

9.1问题集

1.ajax执行成功后关闭窗口
$.ajax({
    cache: true,
    type: "POST",
    url: url,
    data: data,
    async: false,
    error: function (request) {
        parent.layer.alert("操作失败");
    },
    success: function (data) {
        if (data.code == '0000') {
            parent.reLoad();
            parent.layer.msg(msg);
            var index = parent.layer.getFrameIndex(window.name); // 获取窗口索引
            parent.layer.close(index);//关闭窗口
        } else {
            parent.layer.alert(data.msg)
        }
    }
});
2.使用alibaba的EasyExcel进行excel文件的上传与下载
  1. maven

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>easyexcel</artifactId>
        <version>2.2.3</version>
    </dependency>
    
  2. html

    <button type="button" class="btn  btn-primary"
            onclick="exportAll()">
        <i class="fa fa-plus" aria-hidden="true"></i>导出
    </button>
    

​ 3.js

function exportAll(){
    var url=prefix + "/export";
    window.open(url);
}

​ 4.LabelDefnitionDto自己封装的导出类

@Data
public class LabelDefnitionDto {
    @ExcelProperty("标签ID")
    private String labelId;
    @ExcelProperty("标签名称")
    private String labelName;
}

​ 5.Controller

@ResponseBody
@RequestMapping("/export")
public String Daochu(String correlationID, HttpServletResponse response) throws IOException {
    int page=1;
    List<LabelDefnitionDto> list=new ArrayList<LabelDefnitionDto>();
    while(true) {
        LabelDefnition labelDefnition=new LabelDefnition();
        ModelListResult<LabelDefnition> slist = labelDefnitionMapper.findByCondition(correlationID,labelDefnition,page,100);
        if(slist.getModel().size()>0){
            for(int i=0;i<slist.getModel().size();i++){
                //LabelDefnitionDto类是自己封装的导出类
                LabelDefnitionDto labelDefnitionDto=new LabelDefnitionDto();
                BeanUtils.copyProperties(slist.getModel().get(i),labelDefnitionDto);
                list.add(labelDefnitionDto);
            }
            page++;
        }else{
            break;
        }
    }try
    {
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        response.setHeader("Content-disposition", "attachment;filename=demo.xlsx");
        EasyExcel.write(response.getOutputStream(), LabelDefnitionDto.class).sheet().doWrite(list);
    } catch (Exception e){
        e.getMessage();
    }
    return null;
}

网址:https://alibaba-easyexcel.github.io/

3.带搜索的下拉框

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j35u3EZx-1637548682244)(/imgs/下拉搜索.png)]

<div class="form-group">
    <label for="groupId" class="col-sm-1 control-label">大类名称</label>
    <div class="col-sm-3">
    <select id="groupId" name="groupId"  class="selectpicker form-control" data-live-search="true"
            data-live-search-placeholder="搜索">
        <option value="">所有</option>
        <option th:each="group: ${group}" th:value="${group.groupId}"
                th:text="${group.groupName}"></option>
    </select>
    </div>
</div>

需要导入bootstrap插件

9.2问题集

1.当查询条件中有其他表的字段时,进行数组的组合,不能调整pageSize?
UserLabelTypedesc userLabelTypedesc = new UserLabelTypedesc();
if(StringUtils.isNotEmpty(id)){
    userLabelTypedesc.setId(Integer.parseInt(id));
}else if(StringUtils.isNotEmpty(associateId)){
    userLabelTypedesc.setAssociateId(Integer.parseInt(associateId));
}else if(StringUtils.isNotEmpty(typeCode)){
    userLabelTypedesc.setTypeCode(typeCode);
}else if(StringUtils.isNotEmpty(typeName)){
    userLabelTypedesc.setTypeName(typeName);
}
//查出来除了code外的总数
Integer page1 = 1;
List<UserLabelTypedesc> list = new ArrayList<>();
List<UserLabelTypedesc> byCondition = userLabelBaseTypedescMapper.findByCondition(correlationID, userLabelTypedesc, page1, 100).getModel();
while(byCondition.size() > 0){
    list.addAll(byCondition);
    byCondition = userLabelBaseTypedescMapper.findByCondition(correlationID, userLabelTypedesc, ++page1, 100).getModel();
}
//与code进行筛选
List<UserLabelTypedescDto> list1 = new ArrayList<>();
for(UserLabelTypedesc model:list){
    UserLabelAssociate userLabelAssociate = new UserLabelAssociate();
    userLabelAssociate.setAssociateId(model.getAssociateId());
    List<UserLabelAssociate> associateModel = userLabelBaseAssociateMapper.findByCondition(correlationID, userLabelAssociate, 1, 1).getModel();
    if(code.equals(associateModel.get(0).getCode())){
        UserLabelTypedescDto dto = new UserLabelTypedescDto();
        dto.setAssociateId(model.getAssociateId());
        dto.setId(model.getId());
        dto.setCode(code);
        dto.setName(associateModel.get(0).getName());
        dto.setTypeCode(model.getTypeCode());
        dto.setTypeName(model.getTypeName());
        list1.add(dto);
    }
}
//根据传进来的page决定取list中的多少条数据
//1    0,9
//            (page-1)*10   page*10-1
int start = (page-1)*10;
int end = page*10-1;
List<UserLabelTypedescDto> result = new ArrayList<>();
if(end >= list1.size()){
    //取(page-1)*10 --- list1.size
    result.addAll(list1.subList(start,list1.size()));
}else{
    //取(page-1)*10 --- page*10-1
    result.addAll(list1.subList(start,end+1));
}
Page<UserLabelTypedescDto> page2 = new Page<>();
page2.setContent(result);
long size = (long)list1.size();
long totalPage;
if(size % pageSize == 0){
    totalPage = size / pageSize;
}else{
    totalPage = size / pageSize +1;
}
page2.setTotalPage((int)totalPage);
page2.setTotalElement(size);
page2.setCurrentPage(page);

return page2;

9.8问题集

1.StopWatch计时器
public static void test1() throws InterruptedException {
     StopWatch sw = new StopWatch("test");
    
    sw.start("task1");
    // do something
    Thread.sleep(100);
    sw.stop();
    
    sw.start("task2");
    // do something
    Thread.sleep(200);
    sw.stop();
    System.out.println(sw.prettyPrint());
}

显示结果

运行结果:
StopWatch 'test': running time (millis) = 308
-----------------------------------------
ms     %     Task name
-----------------------------------------
00104  034%  task1
00204  066%  task2

9.18问题集

1.SpringData JPA 的实体类注解(公司封装过)
@Data
//排序
@OrderGroup(
        orders = {
                @OrderBy(orderSign = OrderSign.DESC,target = "dtCreate")
        }
)
public class ReplyInfoComplexReq extends BaseDto {
//主键自增,只有Integer类型的主键才能自增
@GeneratedValue(strategy= GenerationType.IDENTITY)
private Integer id;
//IN
private String collectionTargetId;
@ComplexCondition(target = "collectionTargetId" ,sign = ComplexConditionSign.IN)
private List<String> collectionTargetIds;
//Like
private String title;
@ComplexCondition(target = "title", sign = ComplexConditionSign.LIKE)
private String titleLike;
}
//封装的条件
public interface ComplexConditionSign {
    String EQ = "EQ";
    String LT = "LT";
    String LTEQ = "LTEQ";
    String GT = "GT";
    String GTEQ = "GTEQ";
    String IN = "IN";
    String LIKE = "LIKE";
}
2.时间转换
Date date = new Date();
//获取当前时间
System.out.println(new Date()); //Sat Sep 18 15:46:43 CST 2021
//Date转时间戳,单位毫秒
long time = date.getTime();
//时间戳转Date
Date date1 = new Date(time);
//时间转指定格式的字符串
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = sdf.format(date);
System.out.println(format);	//2021-09-18 15:52:14
//指定字符串时间转Date
Date parse = sdf.parse("2021-09-18 23:59:59");
//要进行时间的比较可以先转为String 类型进行compareTo()或equals()比较
//也可以转为时间戳进行比较
if(sdf.format(new Date()).compareTo(sdf.format(new Date())) == 0 ) {
            System.out.println("时间相等");
}
System.out.println(sdf.format(new Date()).equals(sdf.format(new Date())));
//得到30天后的那天的0点0分0秒
Calendar calendar = Calendar.getInstance();
     calendar.add(Calendar.DATE, 29);
     calendar.set(Calendar.HOUR_OF_DAY, 23);
     calendar.set(Calendar.MINUTE, 59);
     calendar.set(Calendar.SECOND, 59);
     System.out.println(calendar);
     System.out.println(calendar.getTime());
   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值