积累工作不会的_2024_04

20240401,

  1. 1.

    ap服务feign接口调用us服务A接口超时,排查思路:

    1. 1.

      System.currentTimeMillis()来打出feign客户端发请求、服务端接收请求时间点,算出ap服务调us服务A接口所用时间,

    2. 2.

      测试ap服务调us服务B接口所用时间,测出调us服务都有问题

    3. 3.

      测试le服务调us服务A接口所用时间

    4. 4.

      测试le服务调sy服务所用时间,定位出是us服务有问题

 20240409,

2024-04-09,

  1. 1.

    理解vue里的@

    project/  
    |-- src/  
    |   |-- components/  
    |   |   |-- MyComponent.vue  
    |   |-- views/  
    |   |   |-- MyView.vue  
    |   |-- main.js  
    |-- public/  
    |-- ...
    1. 1.

      在MyView.vue里引入MyComponent.vue:

      import MyComponent from '../components/MyComponent.vue';
      // 更方便的写法
      // import MyComponent from '@/components/MyComponent.vue';
    2. 2.

      @是别名,通常用于表示src目录的绝对路径

2.

排查地图有的图片空白:F12里排查每个获取瓦片图片请求都正常返回了图片,进而放大缩小地图排查,定位问题为图片显示错乱。原因是没引入必要的库和样式。

 

1.

需要在项目main.js中引入leaflet,挂载到Vue上,便于全局使用

2024-04-09,

/* 查业务表中 附件个数大于1的 业务记录 */
/* 先group by,再having */
select t.id, t.multi_busi_id
from 业务表 t
join 附件表 s on t.multi_busi_id = s.busi_id
group by t.multi_busi_id, t.id -- 这里需要列出业务表a中除了multi_busi_id之外的所有你想要查询的字段
having count(s.busi_id) > 1;

 

2024-04-10,

 

  1. 1.

    js文件里函数间直接调用

    function sum(a,b) {return a + b;}
    function test(a, b) {let res = sum(a, b); console.log(res);}
    test(1, 2) // 输出3
  1. 1.

    前端base64转文件:base64先转成Blob对象(假如名为a),再由a构建jpeg格式的新的Blob对象b

  2. 2.

    前端获取Blob对象(假如名为b)的大小:b.size

    1. 1.

      在JavaScript中,Blob 对象代表了一段不可变的原始数据,这些数据可以是文本或二进制数据。Blob 对象有一个 size 属性,它返回Blob对象中所包含数据的字节数。

      当你有一个 Blob 对象 b 时,你可以通过访问 b.size 来获取这个Blob对象的大小,单位是字节。

  3. 3.

    JOIN语句用于将业务表a和附件表b连接起来,基于multi_busi_idbusi_id字段的匹配。

    1. 1.

      GROUP BY语句用于按业务表的multi_busi_id字段(以及你可能想要查询的其他业务表字段)进行分组。

    2. 2.

      HAVING子句用于过滤出那些附件数量大于1的分组。

  4. 4.

    存电子签名3种方案评估:

    1. 1.

      直接保存成base64存到业务表上

      • 优点:查询方便,因为签名数据直接和业务记录关联在一起,无需额外的JOIN操作。

      • 缺点:base64编码会增加数据的大小,可能会导致业务表变得很大,影响查询和存储性能。此外,如果业务表非常大,每次查询时都需要加载额外的签名数据,可能会降低性能。

    2. 2.

      存到附件表里存成base64

      • 优点:将签名数据与业务数据分开存储,保持业务表的简洁。同时,如果需要查看或处理签名数据,可以通过与附件表的关联查询来获取。

      • 缺点:与直接保存在业务表上相似,base64编码会增加数据的大小。此外,如果经常需要查询签名数据,需要频繁进行JOIN操作,可能影响性能。

    3. 3.

      存到附件表里存成图片例如png或jpg

      • 优点:图片格式是常见的电子签名存储方式,可以方便地通过文件管理系统或CDN进行存储和访问。同时,图片格式通常比base64编码更加紧凑,节省存储空间。此外,如果需要展示签名,图片格式更加直观和方便。

      • 缺点:需要额外的存储和管理图片的设施,可能增加系统的复杂性和维护成本。同时,如果经常需要查询签名数据,仍然需要进行JOIN操作,可能影响性能。

  1. 1.

    将图片存到ftp上优于直接(例如base64格式)存数据库的分析:

    1. 1.

      存储效率:FTP服务器专门用于文件存储,通常比数据库更适合存储大量二进制数据(如图片)。数据库更适合存储结构化数据,而将文件路径存储在数据库中可以保持数据库的简洁和高效。

    2. 2.

      性能:当需要访问附件时,系统可以直接从FTP服务器获取文件,而不需要从数据库中检索大量的base64编码数据或图片二进制数据。这可以减少数据库的负载并提高性能。

  1. 1.

    先写group by还是先写having:

    1. 1.

      在SQL查询中,GROUP BY 和 HAVING 子句是经常一起使用的,但它们的使用顺序是固定的。

      正确的顺序是先写 GROUP BY,然后再写 HAVING

      GROUP BY 子句用于将结果集中的行组合成摘要行,通常与聚合函数(如 SUM()COUNT()AVG() 等)一起使用。它定义了如何对结果集进行分组。

      HAVING 子句用于过滤由 GROUP BY 子句返回的分组。它类似于 WHERE 子句,但 WHERE 子句不能用于过滤聚合函数的结果,而 HAVING 可以。

  1. 1.

    前端报错“This relative module was not found:* ./LeafletTiandituMap in ./node_modules/“,这种报错很可能是文件路劲错误导致的

  2. 2.

    浏览器地图渲染有问题,可以考虑是否是CSS样式冲突

3.

android studio打开项目报错“Missing Gradle Project Information. Please check if the IDE successfully synchronized its state with the Gradle Project Model.”:

  1. 1.

    这条消息表明你的集成开发环境(IDE,如IntelliJ IDEA、Android Studio等)未能成功地与Gradle项目模型同步其状态。Gradle是一个用于自动化构建工具,而IDE同步是确保IDE能够正确识别和理解Gradle项目结构、依赖和其他配置的过程。

2.

通过点击clean project菜单,android studio重新下载了相关包,报错解决了

 

2024-04-11,

  1. 1.

    android studio打开原生项目,项目根目录下的app文件夹是干什么的:

    1. 1.

      在 Android Studio 中,当你打开一个原生 Android 项目时,通常你会在项目的根目录下看到一个名为 app 的文件夹。这个 app 文件夹是一个模块,代表了你的 Android 应用的主要部分。具体来说,它包含了构建这个 Android 应用所需的大部分代码和资源。

      以下是 app 文件夹中通常包含的一些关键组件和文件:

      1. 1.

        src/main/: 这里存放着应用的主要源代码。

        • java/ 或 kotlin/: 存放着应用的 Java 或 Kotlin 源代码文件。

        • res/: 存放着应用的资源文件,如布局文件(XML)、图片、字符串等。

        • AndroidManifest.xml: 应用的清单文件,它描述了应用的基本属性和所需的权限。

      2. 2.

        build.gradle: 这是一个 Gradle 构建脚本,用于配置项目的构建过程。它定义了项目的依赖、构建变体、签名配置等。

      3. 3.

        libs/: 这个文件夹通常用于存放项目直接依赖的 JAR 文件或其他库文件。但在现代的 Android 项目中,依赖通常是通过 Gradle 来管理的,因此这个文件夹可能不是必需的。

      4. 4.

        proguard-rules.pro: 如果你使用了 ProGuard 来进行代码混淆,这个文件就包含了混淆规则。

      app 模块通常包含了应用的主要功能和用户界面。一个 Android 项目可以有多个模块,但 app 模块通常是主模块,包含了启动 Activity 和其他核心功能。

      在开发过程中,你大部分时间都会在这个 app 文件夹中工作,编写代码、创建布局、添加资源等。当你构建项目时,Android Studio 会根据 build.gradle 文件中的配置来编译和打包 app 模块,生成最终的 APK 文件。

  2. 2.

    app模块下src/main/java下有两个包:”cn.集团名.app.项目名“和com.customer

    1. 1.

      在 Android Studio 的项目中,src/main/java 目录是存放 Java 源代码的地方。当你看到 app 模块下的 src/main/java 目录下有两个包(package),cn.集团名.app.项目名 和 com.customer,这通常意味着项目的代码是按照某种逻辑或功能进行组织的。

      每个包(package)在 Java 中是一个命名空间,用于防止类名冲突,并帮助组织和管理代码。在大型项目中,代码会被划分到不同的包中,以便更好地管理和维护。

      cn.集团名.app.项目名 和 com.customer 这两个包可能代表了不同的功能模块或业务逻辑:

      • cn.集团名.app.项目名 可能是一个特定的功能模块。这里的命名方式暗示了 "集团名“可能是公司名称或项目名称的缩写,而 "项目名" 则代表了这个包的功能或业务领域。

      • com.customer 则可能包含与客户相关的代码,如客户信息管理、客户服务等。这里的 com 通常是一个常见的顶级域名,用于命名组织或个人的包,而 customer 则直接说明了包的功能。

      在实际开发中,你可能会根据项目的需求将代码划分到不同的包中。例如,你可能会有一个包用于处理网络请求,一个包用于处理数据库操作,另一个包用于定义 UI 组件等。

      要理解每个包的具体功能和作用,你需要查看每个包中的类和方法,并阅读相关的文档或注释。这样,你才能更好地理解项目的结构和各个组件之间的交互方式。

  3. 3.

    我在com.customer.plugins.apploc包下定义了A:public class A extends CordovaPlugin。然后在app/src/main/res/xml/config.xml里定义如下,帮我分析一下是什么意思: <feature name="S"> <param name="android-package" value="com.customer.plugins.a.A" /> </feature>

    1. 1.

      在 Apache Cordova(或 PhoneGap)项目中,config.xml 文件是项目的配置文件,它包含了应用的元数据、插件定义以及其他设置。这个文件对于 Cordova 项目的构建和运行至关重要。

      在你提供的 config.xml 片段中:

      xml复制代码<feature name="S">      <param name="android-package" value="com.customer.plugins.a.A" />  </feature>

      你定义了一个名为 S 的 Cordova 插件特性。这个定义告诉 Cordova,当应用需要用到 S功能时,它应该使用在 android-package 参数中指定的 Android 类。

      具体解释如下:

      • <feature name="S">: 这里定义了一个插件特性,其名称为 S。这个名称在 JavaScript 代码中可能会被引用,以调用该插件提供的功能。

      • <param name="android-package" value="com.customer.plugins.a.A" />: 这是一个参数标签,它指定了 Android 平台上实现这个特性的具体类。android-package 参数的值 com.customer.plugins.a.A 是你的 A 类的完整类名。这意味着,当 Cordova 应用在 Android 设备或模拟器上运行时,并且 JavaScript 代码尝试访问 S功能时,Cordova 会寻找并调用 com.customer.plugins.a.A 类中的相应方法。

      在你提供的 A 类定义中:

      java复制代码public class A extends CordovaPlugin {      // ... 类成员和方法 ...  }

      你创建了一个继承自 CordovaPlugin 的类。这意味着你的 A 类是一个 Cordova 插件,它应该实现了一些方法,这些方法可以通过 JavaScript 调用,以执行特定的原生 Android 功能。

      为了使 A 正常工作,你还需要在 A 类中重写 CordovaPlugin 的方法,如 execute 方法,以处理 JavaScript 调用,并在 Android 环境中执行相应的操作。

      总结起来,config.xml 中的这个 <feature> 定义告诉 Cordova,S 这个插件特性在 Android 上由 com.customer.plugins.a.A 这个类来实现。然后,在你的 Java 代码中,你需要确保 A 类提供了正确的实现,以便能够响应 JavaScript 端的调用。

  4. 4.

    分析jsp页面一个汉字章用代码实现或嵌入图片的优劣:

    1. 在JSP页面用代码写个“x”

    这种方式通常意味着直接在JSP文件中使用文本或CSS来显示“x”字样。这种方法的好处是简单直接,不需要额外的图片资源,加载速度快。同时,文本的样式和位置可以通过CSS灵活调整。

    然而,如果“x”章需要具有特定的视觉效果(如印章样式、颜色、字体等),仅使用文本可能无法满足设计要求。此外,如果将来需要更改“x”章的样式,可能需要修改JSP文件或CSS样式表。

    2. 在JSP里嵌入一个“x”章的图片

    这种方式意味着将“x”章预先制作成一个图片文件,并在JSP文件中通过<img>标签引用该图片。这种方法可以确保“x”章具有精确的视觉效果,与实际打印出来的效果一致。

    然而,使用图片会增加页面的加载时间,特别是当图片文件较大或网络状况不佳时。此外,如果将来需要更改“已执行”章的样式,需要更新图片文件并重新上传到服务器。

    综合考虑

    • 如果“x”章的样式简单且不需要频繁更改,使用文本方式可能更为方便和高效。

    • 如果“x”章需要具有特定的视觉效果且样式稳定,使用图片方式可能更为合适。

1.

springmvc框架。在jsp页面加载出ftp上的多张电子签名JPEG图片,分析:

1. 直接提供FTP上的图片URL

如果FTP服务器支持HTTP访问,并且您的应用有权限访问这些图片,那么可以直接在JSP页面中通过<img>标签的src属性引用这些图片的URL。

html复制代码<img src="ftp://your-ftp-server/path/to/signature1.jpg" alt="Signature 1">  <img src="ftp://your-ftp-server/path/to/signature2.jpg" alt="Signature 2">  <!-- 更多图片 -->

但是,请注意,直接使用FTP URL可能受到浏览器支持的限制,以及FTP服务器配置的影响。如果FTP不支持直接HTTP访问,则需要考虑其他方法。

2. 后端作为代理下载图片并提供HTTP访问

如果FTP服务器不支持HTTP访问,或者出于安全原因您不希望直接在前端暴露FTP服务器的细节,您可以在后端编写一个服务来作为代理,从FTP下载图片并提供给前端通过HTTP访问。

Spring MVC中,您可以创建一个Controller来处理图片请求,并在其中从FTP下载图片并作为响应返回。

java复制代码@Controller  public class ImageController {            @GetMapping("/images/{filename:.+}")      public ResponseEntity<byte[]> getImageFromFtp(@PathVariable String filename) {          // 从FTP下载图片的逻辑          byte[] imageBytes = ftpService.downloadImage(filename);                    // 设置响应头,指定内容类型为图片格式(例如image/jpeg)          HttpHeaders headers = new HttpHeaders();          headers.setContentType(MediaType.IMAGE_JPEG);                    return new ResponseEntity<>(imageBytes, headers, HttpStatus.OK);      }  }

然后在JSP页面中,您可以像下面这样引用图片:

html复制代码<img src="${pageContext.request.contextPath}/images/signature1.jpg" alt="Signature 1">  <img src="${pageContext.request.contextPath}/images/signature2.jpg" alt="Signature 2">  <!-- 更多图片 -->

3. 使用Base64编码(不推荐,除非有特殊需求)

虽然您提到了使用Base64编码,但这种方法通常不推荐用于大量或大尺寸的图片,因为它会显著增加传输的数据量,并可能导致性能问题。但如果图片非常小,或者您有特殊的传输需求,可以考虑这种方法。在后端将图片转换为Base64编码的字符串,然后将其作为数据属性嵌入到JSP页面的JavaScript中,再通过JavaScript将Base64字符串转换为图片并显示。

请注意,对于大型应用或高性能要求的应用,通常建议避免在前端传输大量的Base64编码数据。

 

2024-04-12,

2024-04-12,

  1. 1.

    目前项目中有这样的结构:app/src/main/cordovasource,下面有cordova-js-src文件夹、plugins文件夹,还有config.json、cordova.js、cordova_plugins.js,其中plugins文件夹下有例如/sys-cordova-plugin-a/S.js,cordova_plugins.js里有如下定义,请问怎样理解我上面说的这些结构和文件及内容:

    {
          "file": "plugins/sys-cordova-plugin-a/S.js",
          "id": "sys-cordova-plugin-a.S",
          "pluginId": "sys-cordova-plugin-a",
          "clobbers": [
              "window.S"
          ]
        },
 
1.

你提到的项目结构和文件内容是与 Apache Cordova 相关的。Apache Cordova 是一个开源的移动应用开发框架,它允许你使用标准的 Web 技术(HTML5, CSS3, 和 JavaScript)来构建跨平台的应用程序,并可以访问设备的原生功能。

下面是你提到的结构和文件的解释:

结构和文件

  1. 1.

    app/src/main/cordovasource

    • 这是一个目录,用于存放 Cordova 相关的源代码和插件。

  2. 2.

    cordova-js-src

    • 这个文件夹可能包含 Cordova 的 JavaScript 源代码。

  3. 3.

    plugins

    • 这个文件夹包含项目的所有 Cordova 插件。每个插件都是一个子目录,包含该插件的源代码和其他资源。

  4. 4.

    config.json

    • 这个文件可能包含项目的配置信息,例如插件列表、平台设置等。

  5. 5.

    cordova.js

    • 这是 Cordova 的核心 JavaScript 文件,它提供了与原生代码的桥接功能,使得 JavaScript 代码可以调用原生功能。

  6. 6.

    cordova_plugins.js

    • 这个文件定义了项目中使用的所有 Cordova 插件的信息。它告诉 Cordova 如何加载和使用这些插件。

cordova_plugins.js 的内容

你提供的 cordova_plugins.js 中的内容定义了一个 Cordova 插件的信息:

  • file: 指定插件的 JavaScript 文件的位置。在这个例子中,插件的 JavaScript 文件是 plugins/sys-cordova-plugin-appupdat/S.js

  • id: 插件的唯一标识符。这个标识符通常用于在 JavaScript 中引用插件。

  • pluginId: 插件的 ID,通常与插件的目录名相同。

  • clobbers: 这是一个数组,指定了插件将覆盖或扩展的全局对象。在这个例子中,S 插件将覆盖或扩展 window.S 对象。这意味着在 JavaScript 中,你可以通过 window.S 来访问和使用这个插件的功能。

总结

你提到的结构和文件是 Cordova 项目中常见的组成部分。它们共同协作,使得你可以使用 JavaScript 来调用设备的原生功能,并通过插件来扩展你的应用的功能。通过查看 cordova_plugins.js 文件,你可以了解项目中使用了哪些插件,以及这些插件如何与 JavaScript 代码进行交互。

 

2024-04-13,

  1. 1.

    webSQL和indexedDB的关系是什么?

    1. 1.

      都是浏览器提供的本地数据库存储,webSQL因安全问题等已被废弃,目前使用indexedDB。

2.

后端启动报错:java: 找不到符号 符号: 方法 setA(java.lang.String)

1.

项目已导入lombok且实体加了@Data注解。maven进行clean、install后,对idea清除缓存,然后rebuild项目还是报错。正在排查原因

2024-04-14,

1.

如何理解js代码:window.resolveLocalFileSystemURL

  1. 1.

    window.resolveLocalFileSystemURL是一个Web API,允许网页通过js访问操作用户的本地文件系统。

2.

基本功能是根据提供的URL解析出对应的本地文件系统条目,然后用于进一步的读取写入等文件操作。

2024-04-17,

1.start with connect by piror
/* 查出t表中子级数量大于1的(层级)记录的id及子级数量 */
/* 备注:t表通过fcc父层级 字段来指向其父级记录的id */
select t.fcc, count(t.id) childNum
from t
group by t.fcc
having count(t.id) > 1; 

/*start with 
  connect by prior
  遍历查找出所有祖先(或子孙)
  具体查祖先还是子孙,取决于prior后等号前是哪个字段*/
/* t.id可以理解为父行的字段,所以如下sql查的是id为01015这一级,以及其所有子孙 */
select t.*
from t
start with t.id = '8A03DF0E-8383-46D5-9AA0-6B7DAE5B29A4-01015'
connect by prior t.id = t.fcc;

/* t.fcc可以理解为子行的字段,所以如下sql查的是id为01015这一级,以及其所有祖先 */
select t.*
from t
start with t.id = '8A03DF0E-8383-46D5-9AA0-6B7DAE5B29A4-01015'
connect by prior t.fcc = t.id;

 2024-04-18,

  1. 1.

    行转列,列转行

/* 行转列 */
SELECT R.`STU_NAME`,
MAX(CASE
	WHEN R.`COURSE_NAME`='数学' THEN R.`SCORE`
	ELSE NULL
	END) 数学,
MAX(CASE
	WHEN R.`COURSE_NAME`='英语' THEN R.`SCORE`
	ELSE NULL
	END) 英语
FROM TABLE_ROW R
GROUP BY R.`STU_NAME`;

/* 列转行 */
SELECT T1.`STU_NAME`, '数学' COURSE_NAME, T1.`MATH_SCORE` SCORE FROM TABLE_COLUMN T1
UNION ALL
SELECT T2.`STU_NAME`, '英语' COUSE_NAME, T2.`ENGLISH_SCORE` SCORE FROM TABLE_COLUMN T2;
  1. 1.

    sql里union、union all区别:union all包含去重操作,所以如果确定不含重复的无需去重,则用union all(因为其更快)

// 设置对话框的z-index(堆叠顺序)
$.dialog.setting.zIndex = getzIndex(true);

// 对str进行编码,以避免str中可能包含的特殊字符(例如空格、特殊符号)在URL中有特殊含义导致解析报错
let strPenName = encodeURIComponent(strPenNameBeforeCode);

2024-04-20,

  1. 1.

    springmvc url中携带参数,后端获取:推荐@RequestParam("strPenName") String strPenName这种方式来获取,或者采用request.getParameter("strPenName")来获取,这两种方式均测试通过。

    1. 1.

      若接口Controller层是@Controller注解,那么接口方法上要加上注解@ResponseBody来标识:已测试通过。

      1. 1.

        原理:将方法返回的对象直接写入http响应体中,通常用于返回JSON或XML等格式的响应数据给前端。

      2. 2.

        区别于返回视图,避免spring MVC去解析视图名称。

    2. 2.

      但当直接在Controller层使用@RestController时,仍报错,正在排查

      1. 1.

        扔报错:org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'penRestController' must be of type [org.springframework.web.servlet.View], but was actually of type [PenRestController]

let strPenName = encodeURIComponent("Wal-Mart");
// 已测试通过
let url = "penController.do?getPenNum&strPenName="+strPenName;
// 报错,正在排查
let url2 = "penRestController.do?getPenColor&strPenName="+strPenName;
// 已测试通过
@Controller
@RequestMapping("/penController")
public class PenController extends BaseController {
	
    @RequestMapping(params = "getPenNum")
    @ResponseBody
    public AjaxJson getPenNum(@RequestParam("strPenName") String strPenName) {
        AjaxJson j = new AjaxJson();
        j.setSuccess(true);
        j.setMsg(strPenName);
        return j;
    }
    
    @RequestMapping(params = "getPenColor")
    @ResponseBody
    public AjaxJson getPenColor(HttpServletRequest request) {
    	AjaxJson j = new AjaxJson();
        String strPenName = request.getParameter("strPenName");
        j.setSuccess(true);
        j.setMsg(strPenName);
        return j;
    }
}
// 测试仍报错,正在排查
@RestController
@RequestMapping("/penRestController")
public class PenRestController extends BaseController {
	
    @RequestMapping(params = "getPenColor")
    public AjaxJson getPenColor(HttpServletRequest request) {
    	AjaxJson j = new AjaxJson();
        String strPenName = request.getParameter("strPenName");
        j.setSuccess(true);
        j.setMsg(strPenName);
        return j;
    }
}

 2024-04-21,

  1. 梳理老项目功能,h服务启动报错“找不到get/set方法”,同时另一a服务报错如下:
java: You aren't using a compiler supported by lombok, so lombok will not work and has been disabled.
  Your processor is: com.sun.proxy.$Proxy25
  Lombok supports: sun/apple javac 1.6, ECJ

但l服务能正常启动(因为在其pom中单独引入了lombok),分析pom差异,将上述所有服务的父服务pom(项目总pom)中lombok由1.18.8提高到1.18.28,问题解决。

2024-04-24,

1.学习:弄个红色的“已执行”。外部样式表 未生效 暂未找到原因,先用内部样式表来实现

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>  
<!DOCTYPE html>  
<html>
<head>  
    <meta charset="UTF-8">  
    <title>已执行标签示例</title>
    <!-- 外部样式表 未生效 暂未找到原因,先用内部样式表来实现 -->
    <!-- <link rel="stylesheet" href="executedStyles.css"> -->
    <style>
        .executed-label {
            /* inline内联, 且block块级 */
            /* inline-block使得元素可设置内padding外margin边距及边框border */
            display: inline-block;
            /* 外边距 */
            /* margin: 50px 100px; */
            padding: 5px 10px;
            /* 边框 2px,实线,红色 */
            border: 2px solid red;
            /* 3个颜色都取0,最终就是黑色 */
            color: #000;
            /* 背景色,3个颜色都取f最大值,最终就是白色 */
            background-color: #fff;
            /* 圆角边框 半径 */
            border-radius: 5px;
            /* 字体 bold:加粗;normal:常规 */
            font-weight: bold;
        }
    </style>
</head>  
<body>  
    <div class="executed-label">已执行</div>
</body>  
</html>

 2024-04-25,

1.js对对象过滤出包含某个字符串的所有属性对应的值(数组)

const multipleFile = {
            file1: 'content1',
            file2: 'content2',
            file3: 'content3',
            otherFile: 'otherContent'
          };
          const result = Object.keys(multipleFile).filter(key => key.includes('file')).map(key => multipleFile[key]);
          console.log('最终结果:' + result);
          // 输出:最终结果:content1,content2,content3

          // Object.keys获取对象的所有key(结果为一个数组)
          multipleFile.undefinedKey = undefined;
          const keyArray = Object.keys(multipleFile);
          console.log('Object.keys获取对象的所有key(结果为一个数组)' + keyArray);
          // 输出:Object.keys获取对象的所有key(结果为一个数组)file1,file2,file3,otherFile,undefinedKey

          // filter:过滤,对数组过滤出满足函数的每个元素
          // includes:判断字符串是否包含某个子串
          const subStr = 'file';
          const satisfyFunctionArray = keyArray.filter(key => key.includes(subStr));
          console.log('filter:对数组过滤出满足函数的每个元素:' + satisfyFunctionArray);
          // 输出:filter:对数组过滤出满足函数的每个元素:file1,file2,file3

          // map:返回数组中满足某个条件的所有元素组成的数组
          const valueArray = satisfyFunctionArray.map(key => multipleFile[key]);
          console.log('map:返回数组中满足某个条件的所有元素组成的数组' + valueArray);
          // 输出:map:返回数组中满足某个条件的所有元素组成的数组content1,content2,content3

2.JSP里JSTL的<c:if>控制是否显示

<!-- 需用taglib指令来引入JSTL核心库,否则<c:if>无法生效 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<body>
    <!-- <c:if> JSTL标签 控制是否显示,是JSP中的一个条件标签 -->
    <!-- test后面一定要接一个el表达式(expression language),假设isShowRgk是布尔值 -->
    <!-- test后必须是el表达式,(el表达式在JSP页面中必须用${}括起来),而不允许直接跟变量(即使是布尔值也不行)-->
    <c:if test="${ isShowRgk}">
        <div>test="true"可以显示</div>
    </c:if>
    <c:if test="${ !isShowRgk}">
        <div>test="false"不会显示</div>
    </c:if>
</body>

3.js过滤数组

const originalArray = [{
            id: 'a',
            name: '张三'
          },{
            id: 'b',
            name: '李四'
          }];
          // 过滤id='b'的
          const filterArray = originalArray.filter(key => {
            return key.id === 'b';
          });
          console.log(filterArray);

 

posted on 2024-04-01 00:02  平凡力量  阅读(18)  评论(0编辑  收藏  举报