复盘工作2024-10

复盘工作-2024-10-06

1.关于对通过Arrays.asList()获得的list执行.removeAll会报错:需先创建支持修改的集合(例如ArrayList再removeAll)

/**
         * 练习:关于对通过Arrays.asList()获得的list执行.removeAll会报错:需先创建支持修改的集合(例如ArrayList再removeAll)
         */
        // 假设该数组为前端传来,并处理后的 (前端已选的且去重的)任务负责人id 数组
        String[] distinctRwFzrIdArr = {"1", "2", "3", "4", "5"};
        // 已下发工作票的负责人id list,应从数据库查出,这里简写直接手动赋值
        List yxfGzpFzrIdList = new ArrayList<>();
        yxfGzpFzrIdList.add("2");
        yxfGzpFzrIdList.add("4");
        // 模拟我一开始的错误写法:会报错:java.lang.UnsupportedOperationException
        // 错误写法:List<String> distinctRwFzrIdList = Arrays.asList(distinctRwFzrIdArr);
        // 错误写法:distinctRwFzrIdList.removeAll(yxfGzpFzrIdList);
        // 解析:报错:java.lang.UnsupportedOperationException:意为:正在尝试对一个不支持该操作的数据结构执行某个操作。
        // 不能对不可修改的集合进行.removeAll操作。通过Arrays.asList()操作得到的是不可修改的list。
        // 解决方案:使用支持修改的集合。可以通过创建一个新的支持修改的集合(例如ArrayList)来避免这个错误:
        List<String> distinctRwFzrIdList = new ArrayList<>(Arrays.asList(distinctRwFzrIdArr));
        distinctRwFzrIdList.removeAll(yxfGzpFzrIdList);
        System.out.println("======================");
        System.out.println("移除已下发任务负责人id后的 任务负责人id list:");
        // 结果:1 3 5
        for (String rwFzrId : distinctRwFzrIdList) {
            System.out.println("rwFzrId: " + rwFzrId);
        }
        System.out.println("======================");

复盘工作-2024-10-10

1.当是”查看“页时,禁用页面所有输入元素

$(function() {
    debugger;
    /**
     * 当是”查看“页时,禁用页面所有输入元素
     *
     * location是js内置的对象,
     * location.href获取当前url
     */
    if (location.href.indexOf("&load=detail") != -1) {
        /**
         * $(':input').attr("disabled", "true");
         * 禁用页面所有输入元素
         *
         * 解析:
         * $(':input')是一个jQuery选择器,获取所有输入元素,这是jQuery文档定义的
         *         输入元素包括4类:<input>、<textarea>、<select>、<button>
         * .attr()用于获取或设置属性
         * .attr("disabled", "true");禁用元素
         */
        $(':input').attr("disabled", "true");
    }
})

复盘工作-2024-10-12

1.解除对页面上某些按钮的禁用(这里通过类选择器来选择),.removeAtrr() 对选中的元素移除某属性

/**
         * 解除对页面上某些按钮的禁用(这里通过类选择器来选择)
         * .removeAtrr() 对选中的元素移除某属性
         */
        $('.btn-search').removeAttr("disabled");
        $('.btn-print').removeAttr("disabled");

2.问题:异动模块功能里新增一个页面,查缺陷列表,这个jsp放在异动模块文件夹里?还是放在缺陷模块文件夹里更合适?

分析:本例中放在异动文件夹里更合适。原因:该jsp仅用于异动模块,(不是其他多个模块共用),所以放到异动模块文件夹更合适。备注:如果该jsp是多个模块共用,那么放到缺陷模块文件夹更合适。

复盘工作-2024-10-13

1.替换字符串中第一次出现的子串 .replaceFirst("原字符串", "新字符串");

/**
         * 练习替换字符串中第一次出现的子串 .replaceFirst("原字符串", "新字符串");
         *
         * 最终练习输出结果:
         * 输出原查询结果:
         * key: ID, value: 4028e4fa9240eb4a01924226fc300010
         * key: ID, value: 8a8a8a86922c5e7701922c6328fe0001
         * key: ID, value: 8a8a8a86921d9cb701921da075960001
         * 替换后的sql: select t.create_date, t.id from pm_lp_gzp t where t.create_date > to_date('2024-09-22 00:00:00', 'yyyy-MM-dd HH24:mi:ss')
         * 输出替换字符串,加上创建时间后的查询结果:
         * key: CREATE_DATE, value: 2024-09-30 16:58:24.0
         * key: ID, value: 4028e4fa9240eb4a01924226fc300010
         * key: CREATE_DATE, value: 2024-09-26 11:32:29.0
         * key: ID, value: 8a8a8a86922c5e7701922c6328fe0001
         * key: CREATE_DATE, value: 2024-09-23 14:45:08.0
         * key: ID, value: 8a8a8a86921d9cb701921da075960001
         */
        String sql = " select t.id from pm_lp_gzp t where " +
                "t.create_date > to_date('2024-09-22 00:00:00', 'yyyy-MM-dd HH24:mi:ss')";
        List<Map<String, Object>> mapList = systemService.findForJdbc(sql);
        System.out.println("输出原查询结果:");
        for (Map<String, Object> stringObjectMap : mapList) {
            // 输出Map<String, Object>
            for (Map.Entry<String, Object> entry : stringObjectMap.entrySet()) {
                System.out.println("key: " + entry.getKey() + ", value: " + entry.getValue());
            }
        }
        String sqlWithCreateDate = sql.replaceFirst("select", "select t.create_date,");
        System.out.println("替换后的sql:" + sqlWithCreateDate);
        List<Map<String, Object>> mapListWithCreateDate = systemService.findForJdbc(sqlWithCreateDate);
        System.out.println("输出替换字符串,加上创建时间后的查询结果:");
        for (Map<String, Object> stringObjectMap : mapListWithCreateDate) {
            // 输出Map<String, Object>
            for (Map.Entry<String, Object> entry : stringObjectMap.entrySet()) {
                System.out.println("key: " + entry.getKey() + ", value: " + entry.getValue());
            }
        }

复盘工作-2024-10-14

1.SQL中union和union:union 会对查询结果去重;而union all 不会对查询结果去重。

/* 备注:本次练习使用的数据:数据库里存在t.tdsbid='402883f18247207f018249364620009f,402883f1802cf7a90180508f6e2e04a2,402883f1824219ac018244f5001b016d,'的一条记录 */
select t.tdsbid, t.* from pm_yj_tdsqd t order by t.create_date desc;

/* 情景:需要对两个设备id值('402883f18247207f018249364620009f'、'402883f1802cf7a90180508f6e2e04a2')分别查询pm_yj_tdsqd,
获取到其关联的tdsqd实体。与此同时,如果某一条tdsqd对应的td设备同时包含着俩设备,则这条tdsqd记录仅需要展示一条。
也就是说查询出来的tdsqd列表,需要进行去重。
union 会对查询结果去重;
而union all 不会对查询结果去重。 */

/* union 去重,(本例中)返回一条记录 */
select *
  from pm_yj_tdsqd t
 where t.tdsbid like '%402883f18247207f018249364620009f%'
union
select *
  from pm_yj_tdsqd t
 where t.tdsbid like '%402883f1802cf7a90180508f6e2e04a2%';
 
/* union all 不去重,(本例中)返回两条相同的记录 */
select *
  from pm_yj_tdsqd t
 where t.tdsbid like '%402883f18247207f018249364620009f%'
union all
select *
  from pm_yj_tdsqd t
 where t.tdsbid like '%402883f1802cf7a90180508f6e2e04a2%';

复盘工作-2024-10-24

1.点击按钮,浏览器控制台报错ReferenceError: goPmSbSwbmListYsc is not defined,相关的js作用域:

/**
      * 问题:对于<%--<t:dgToolBar title="生成实物编码" icon="icon-add" url=""
      funname="goPmSbSwbmListWsc" width="100%" height="100%"></t:dgToolBar>--%>
      * 为什么当goPmSbSwbmListWsc定义在$(document).ready(function(){})内时,
      * 点击“生成实物编码”控制台报错:ReferenceError: goPmSbSwbmListYsc is not defined
      * 而当goPmSbSwbmListYsc定义在$(document).ready(function(){})外时不会报错?
      *
      * 解析:
      * 1.js有全局作用域和局部作用域。
      * 当<%--<t:dgToolBar title=""></t:dgToolBar>--%>被点击时,会在全局作用域寻找goPmSbSwbmListYsc函数,
      * 而goPmSbSwbmListYsc函数定义在$(document).ready的回调函数里,是局部作用域,所以无法被回调函数之外的地方找到,
      * 所以会报错“未定义”
      * 2.$(document).ready的回调函数里定义的函数只能在回调函数内部被访问到
      * 3.关于 $(document).ready的回调函数 这种说法的解析:
      * $(document).ready函数当文档dom对象加载完成后触发,其接受一个函数作为参数,即dom对象加载完成后执行一段函数,
      * $(document).ready(function(){}),function(){}就是回调函数,
      * function(){}内部定义的函数,只有在function(){}内部才能被访问到
      * 4.在全局作用域中定义的函数,可以在任何位置被访问
      */

2.浏览器控制台报错ReferenceError: isEmpty is not defined,相关的js的顺序依赖性问题:

/**
      * 问题:对于<%--<t:dgCol title="实物编码" formatterjs="formatterSwbm"
      field="swbm" align="center"    queryMode="single"  width="200"></t:dgCol>--%>
      其所在A.jsp里有如下脚本:
      <%--
      <script src = "webpage/com/pmis/sbtz/qrcode/pmSjbQrCode.js"></script>
      <script type="text/javascript">
            function isEmpty(value) {
                // 检查是否为null、undefined、空字符串或NaN
                return value === null || value === undefined || value === '' || Number.isNaN(value);
            }
      </script>
      --%>
      而webpage/com/pmis/sbtz/qrcode/pmSjbQrCode.js里:
      <%--
      // 格式化实物编码(将null改为空格)
      function formatterSwbm(value, row, index) {
            if (isEmpty(row.swbm)) {
                return '';
            } else {
                return row.swbm;
            }
      }
      --%>
      * 控制台报错:ReferenceError: isEmpty is not defined
      *
      * 解析:
      * 1.对于HTML页面A.jsp里<%--<script type="text/javascript"></script>--%>里定义的isEmpty函数,
      * 以及通过<%--<script src="webpage/com/pmis/sbtz/qrcode/pmSjbQrCode.js"></script>--%>引入的
      * pmSjbQrCode.js里定义的formatterSwbm函数,其作用域都是全局作用域
      * 2.这里涉及到关键的js的顺序依赖性问题。
      * 对于HTML文档,浏览器是根据脚本在HTML页面中定义顺序来依次进行加载的。
      * 即对于上述代码,浏览器解析A.jsp时会先加载pmSjbQrCode.js里的函数,然后再加载其本身<script>标签里的函数
      * (因为<%--<script src="webpage/com/pmis/sbtz/qrcode/pmSjbQrCode.js"></script>--%>这行代码在前面)
      * 所以对于通用代码,例如这里的isEmpty函数,需要先加载,即其需要放到pmSjbQrCode.js里。
      * 即被调用的函数需要定义在先被加载的js里,然后再加载调用者函数所在的js。
      * 即正确结构定义应该如下:
      * A.jsp里先定义:<%--<script src = "webpage/com/pmis/sbtz/qrcode/pmSjbQrCode.js"></script>--%>
      * 然后再是本身的<script>,
      * pmSjbQrCode.js里如下:
        function isEmpty(value) {
            // 检查是否为null、undefined、空字符串或NaN
            return value === null || value === undefined || value === '' || Number.isNaN(value);
        }
        // 格式化实物编码(将null改为空格)
        function formatterSwbm(value, row, index) {
            if (isEmpty(row.swbm)) {
                return '';
            } else {
                return row.swbm;
            }
        }
      * 这样在pmSjbQrCode.js里formatterSwbm函数就可以访问到isEmpty函数,
      * 并且A.jsp的<script>里,也能正常访问到isEmpty函数
      */

3.通过sql改oracle库里某表的某列的注释的语法;以及惯例中每个修改语句后面会加一个/然后回车的作用;以及通过sql查USER*_COL_COMMENTS表来查列注释*:

/* 需求:改表里某列的注释,例如:将PRACTICE_BOOK表ISBN字段的注释改为'ISBN号'

语法:
comment on column 表名.列名 is '';
/

分析:
comment /ˈkɒment/ 注释
column /ˈkɒləm/ 列
分析:改表结构或表注释时,惯例中每个修改语句后面会加一个/然后回车的作用:
/然后回车,表示执行该语句后(立马)提交该语句
 */
comment on column PRACTICE_BOOK.ISBN is 'ISBN号';
/

/* 查注释 */
select t.comments
  from USER_COL_COMMENTS t
 where t.table_name = 'PRACTICE_BOOK'
   and t.column_name = 'ISBN';

复盘工作-2024-10-27

1.禁用输入框:readonly是HTML中<input>元素的标准属性之一,对input设置readonnly实现禁用input的输入,变成只读。

<!-- readonly是HTML中<input>元素的标准属性之一,对input设置readonnly实现禁用input的输入,变成只读 -->
                            <input readonly id="updateName" name="updateName" type="text" style="width: 150px" class="inputxt"  value='${pmArchivePage.updateName}'>

2.js定义常量:const关键字,英文大写定义常量变量名

// js定义常量:const关键字,英文大写定义常量变量名
        // 常量:技术资料
        const TYPE_JSZL = 'JSZL';
        console.log('验证js定义常量:' + TYPE_JSZL);

复盘工作-2024-10-29

1.练习一种情况:当流程在倒数第二个环节点“传递”时,后端逻辑执行完返回前端后,前端函数里再请求后端执行某个业务逻辑:js的typeof()函数相关:

通用代码:工作流js里代码:

$.ajax({
        // 请求后端走工作流传递逻辑
        url : '',
        type: "POST", 
        data: {
        },    
        success: function(jsonObject){
                var d = $.parseJSON(jsonObject);
                if(d.success){
                    if (typeof(sbydBeforeGdCallback) === "function") {
                        // 判断是某流程的具体代码省略
                        /**
                         * 我一开始写的是错误的:报错:TypeError: Cannot set properties of undefined (setting 'msg')
                         * 错误代码:let data;
                         * 错误代码:data.msg = '测试消息';
                         * 分析:
                         * 1.let data;变量data被声明了,但没初始化。即data为undefined。
                         * 然后data.msg = '测试消息';尝试给data.msg赋值时,data仍为undefined,所以会报错。
                         * 2.正确写法:
                         * let data = {};在声明data时初始化其为一个空对象
                         * data.msg = '测试消息';data是一个对象,可以安全的给其添加属性。
                         */
                        let data = {};
                        data.msg = '测试消息';
                        sbydBeforeGdCallback(data);
                    }
                    // 剩余代码省略
                }
            }
        });

待办任务列表页面里js代码:

/**
  * 问题:练习一种情况:当流程在倒数第二个环节点“传递”时,后端逻辑执行完返回前端后,
  * 前端函数里再请求后端执行某个业务逻辑
  *
  * 分析:
  * 1.在通用流程传递前端js里,后端返回后,
  * 使用if (typeof('sbydBeforeGdCallback') === "function") {}来判断全局作用域,或当前作用域里,
  * 是否有sbydBeforeGdCallback这个函数,如果有则调用,从而避免“函数未定义”报错
  * 2.关于回调函数sbydBeforeGdCallback为什么是写在列表页而不是我之前自认为的流程工单详情页的分析:
  * 在列表页对某行点击”办理“后一系列操作,调当前页面引入的通用工作流js里如下代码打开对话框,而对话框内容是url对应的详情页,
  * 而对话框右下角的按钮(也包括其点击事件)仍是在列表页,所以要加的回调函数sbydBeforeGdCallback也应该写在列表页,
  * 如果写在url对应的详情页,则工作流js里后端返回后前端js代码里会找不到sbydBeforeGdCallback而报错。
  * 备注:当前页面引入的工作流js里打开对话框的代码:
  * function win_back(title,width,height,url,busiId){
        $.dialog({
            content: 'url:'+url,
            // 省略其他属性
            button: [
                {
                    name: "传递",
                    callback: submitBtnFunction,
                    focus: true
                }
                // 其他工作流按钮省略
            ]
        });
    }
  *
  * 如下是在待办任务列表页定义回调函数:
  */
 function sbydBeforeGdCallback(data) {
   // 最终结果:可以成功弹出:successful enter listPage sbydBeforeGdCallback!测试消息
   alert('successful enter listPage sbydBeforeGdCallback!' + data.msg);
 }

复盘工作-2024-10-31

1.关于新做菜单功能“任务池延期”、“延期任务查询”相关接口是放到原任务池controller还是新建controller:

/**
     * 1.问题:已有“任务池新建”、“任务池查询”菜单功能,在任务池控制器(controller里),现要新做菜单功能“任务池延期”、“延期任务查询”,
     * 这俩新功能相关接口是放到原任务池controller还是新建controller?
     * 2.分析:放到原controller里。
     * 3.原因:(1)这4个功能都是对同一业务实体“任务池”的操作,所以放到同一个controller里有利于保持代码的集中和一致性;
     * (2)同时基于本项目里代码惯例,对同一实体的接口基本都是放到同一个controller里。
     */

2.前端定义常量(js文件里定义,然后jsp页面引入js):

js文件里定义常量webpage/common/js/constants.js:

/**
 * 定义常量
 */
/**
 * 审核状态:未提交
 */
const SH_STATE_WTJ = 'WTJ';

jsp页面引入:WebRoot/webpage/com/项目名/ywjx/rwc/pmYjRwcListForDelay.jsp:

<!-- 引入js,<script>标签的src属性用于指定外部js文件的路径,我们项目里引入js写src都是从webpage路径开始,
这与项目的目录结构及web服务器(这里是Tomcat)的配置有关,
我自己的理解:这里pracConstants.js在我们项目目录结构里,
以及在Tomcat里,都是webapp/xxx(项目名)/webpage/common/js/pracConstants.js,以后我就记着从webpage开始写就行。 -->
<script src="webpage/common/js/pracConstants.js"></script>
<script type="text/javascript">
    let test = SH_STATE_WTJ;
    // 弹出WTJ
    alert(test);
</script>

3.对数据库表插入字段时,例如“延期原因”采用拼音首字母yqyy还是英文定义deploy_reason的分析:

/**
     * 问题:对数据库表插入字段时,例如“延期原因”采用拼音首字母yqyy还是英文定义deploy_reason的分析:
     * 分析:应采用英文定义。
     * 原因:尽管使用拼音首字母可能在短期来看写代码时速度稍微快些,
     * 但从长远看,英文定义大大提高代码可读性及可维护性,也利于团队理解协作和效率,
     * 并且另一方面,基于IDE自动补全功能,英文定义稍长对写代码速度的影响就不复存在了。
     */

 

posted on 2024-10-06 17:06  平凡力量  阅读(33)  评论(0)    收藏  举报