sssssjkl
IP:
38关注数
0粉丝数
34获得的赞
工作年
编辑资料
链接我:

创作·95

全部
问答
动态
项目
学习
专栏
sssssjkl

vue 3.0 +axios 跨域情况下无法携带cookie?

"withCredentials" 的意思是带上本地 cookie;CORS 头的意思也是告知浏览器发起请求的时候可以携带 cookie。 "setCookie" 是服务器返回的响应头要求设置 cookie。 这俩不是一个方向。
0
0
0
浏览量0
sssssjkl

证书链完整,okhttp3请求错误?

证书情况 "myssl.com"验证证书是正常的 "https://myssl.com/ynslyszx.com" (https://link.segmentfault.com/?enc=Rl58bPUsLiXYbKR4SPkgog%3D%3D.BlyaOYBBPkulzooS98TibCDfCcm03tjWdZTvEPlpC2U%3D) 浏览器中查看 "image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20250121/0a265834b3836233c2083ad2f3fb6134.png) 使用命令查看 "image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20250121/be59a99dd5ffb7bb1928f0e025ce0bab.png) 测试代码 public static void main(String[] args) { String url = "https://ynslyszx.com/fp04/ldt-service/msp/getPublicKey.do"; OkHttpClient client = new OkHttpClient(); // 指定你要请求的URL Request request = new Request.Builder() .url(url) .build(); try (Response response = client.newCall(request).execute()) { if (!response.isSuccessful()) { throw new IOException("Unexpected code " + response); } // 打印响应体的内容 System.out.println(response.body().string()); } catch (IOException e) { e.printStackTrace(); } } 错误信息 使用okhttp请求报错: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at sun.security.ssl.Alert.createSSLException(Alert.java:131) at sun.security.ssl.TransportContext.fatal(TransportContext.java:353) at sun.security.ssl.TransportContext.fatal(TransportContext.java:296) at sun.security.ssl.TransportContext.fatal(TransportContext.java:291) at sun.security.ssl.CertificateMessage$T12CertificateConsumer.checkServerCerts(CertificateMessage.java:652) at sun.security.ssl.CertificateMessage$T12CertificateConsumer.onCertificate(CertificateMessage.java:471) at sun.security.ssl.CertificateMessage$T12CertificateConsumer.consume(CertificateMessage.java:367) at sun.security.ssl.SSLHandshake.consume(SSLHandshake.java:376) at sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:444) at sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:422) at sun.security.ssl.TransportContext.dispatch(TransportContext.java:183) at sun.security.ssl.SSLTransport.decode(SSLTransport.java:154) at sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1279) at sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1188) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:401) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:373) at okhttp3.internal.connection.RealConnection.connectTls(RealConnection.kt:379) at okhttp3.internal.connection.RealConnection.establishProtocol(RealConnection.kt:337) at okhttp3.internal.connection.RealConnection.connect(RealConnection.kt:209) at okhttp3.internal.connection.ExchangeFinder.findConnection(ExchangeFinder.kt:226) at okhttp3.internal.connection.ExchangeFinder.findHealthyConnection(ExchangeFinder.kt:106) at okhttp3.internal.connection.ExchangeFinder.find(ExchangeFinder.kt:74) at okhttp3.internal.connection.RealCall.initExchange$okhttp(RealCall.kt:255) at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.kt:32) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109) at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.kt:95) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109) at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.kt:83) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109) at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.kt:76) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109) at okhttp3.internal.connection.RealCall.getResponseWithInterceptorChain$okhttp(RealCall.kt:201) at okhttp3.internal.connection.RealCall.execute(RealCall.kt:154) at org.example.App.main(App.java:35) Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:439) at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:306) at sun.security.validator.Validator.validate(Validator.java:271) at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:312) at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:221) at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:128) at sun.security.ssl.CertificateMessage$T12CertificateConsumer.checkServerCerts(CertificateMessage.java:636) ... 29 more Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141) at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126) at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280) at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:434) ... 35 more 问题 1. 同样的代码,请求"https://baidu.com" (https://link.segmentfault.com/?enc=LAsp%2FXr6f6q8V1UnW07%2FBA%3D%3D.VaQZUVr0UBPH5NOsd9mM%2BBVBBQIxSjUsmimAlhCsqoU%3D)或"https://qq.com" (https://link.segmentfault.com/?enc=q5rFqEJ56pJ4MsdHXM%2BI7A%3D%3D.0ENTZ1%2FO3icYP0ebmhX2CQ%3D%3D)是正常的,请求ynslyszx.com就出错;使用"myssl.com"验证后,证书也是正常的,请问是哪个环节出错? 2. 服务器中尝试用"myssl.com"修复过证书,也是请求不通。 3. 目前解决办法是使okhttp3忽略全部证书验证,但是这样不太合适,请问是否有其他解决方案?
16
1
0
浏览量271
sssssjkl

后端为何不直接提供sql能力给前端?

前端是客户端 ,客户是一种比测试同学骚操作还多的生物。 比如说我想查应用信息,想关联出来应用下所有的服务,应用下所有的成员。我应该怎么知道有哪些表呢? 在签到的或者充值的时候,直接大手一挥。
0
0
0
浏览量0
sssssjkl

unocss 如何配置针对某个 dataset 的元素生效样式?

unocss 配置 "prefix" 后 className 显得有点长了,我希望只加一个 "data-uno" 来让 unocss 生效,而不是每个 className 都添加前缀。 请问有办法做到这种效果吗? 不生效: 生效:
18
1
0
浏览量273
sssssjkl

现有两开关电源,分别为反激式(脉冲调制)、固定负载功率式(非脉冲调制),规定采样频率<500KHz,且两种电源功率同等(如200W)的情况下,在220V端 是否可以通过电压或电流波形区分上述两种电源?

电流波形分析或者用电压波形分析,其他途径的话可以用 频谱分析、效率分析、温度分析
0
0
0
浏览量0
sssssjkl

做好的项目部署上线后,在服务器上拷贝地址到另一台服务器(同一局域网下),为何报错不显示?

"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241228/710df7b4afd1bbf5642bc2db5fb5d885.png) 报错http://assets.msn.cn/bundles/v1/edgechromium/latest/vendors
14
1
0
浏览量441
sssssjkl

求助一个PHP程序伪静态规则问题?

打开网址1:域名/article/359.html ,正常的内容页。 打开网址2:域名//////article/359.html ,还是正常的内容页。 正常来说 应该是 404页面或者自动跳到只有一个 /开头的该页面。 APACHE规则如下: RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule (.+) index.php?rewrite=$1 [L] Order allow,deny Deny from all NGINX规则如下: if (!-e $request_filename) { rewrite ^/(.+) /index.php?rewrite=$1 last; } 伪静态处理时: $_GET['rewrite'] 得到的内容是:article/359.html 请问如果修改规则? 打开网址2,跳转到404错误或者301跳转到网址1
13
1
0
浏览量168
sssssjkl

typescript想要组合二个对象,如何对对象进行选择组合?

现有如下对象, const nodeDataItem = { a: 1, b: 2, c: 3, d: 4 } const nodeDataItem2 = { e: 5 } 我想要组合nodeDataItem 和 nodeDataItem2: const nodeDataItem3 = { ...nodeDataItem, ...nodeDataItem2 } 但是现在想要只取出 nodeDataItem 的部分数据和nodeDataItem2进行组合,请问应该如何做呢? 比如: 结果 { a: 1, b: 2, e: 5 }
9
1
0
浏览量238
sssssjkl

AMH面板 》防火墙配置》常规禁止设置》勾选禁止内地,为什么不生效?

使用AMH面板,防火墙配置》常规禁止设置》勾选禁止内地,没有生效,是哪里还需要设置吗?
amh
8
1
0
浏览量272
sssssjkl

Nginx报504 gateway timeout?

网关超时 服务器设置中有很多地方都会设置运行时间限制,所以在使用大型应用程序的时候,需要将各种超时时间设置长一点,否则没等程序跑完就被系统掐断了。 不同性能的服务器,需要优化的参数值也不一样,所以需要自己摸索适合自己服务器的数值。 Nginx(重要) 在 nginx.conf,如宝塔地址:/www/server/nginx/conf/nginx.conf,其中找到以下参数: keepalive_timeout 3600 保持连接的时间限制,推荐 3600 fastcgi_connect_timeout 3600 指定nginx与后端fastcgi server连接超时时间,推荐 3600 fastcgi_send_timeout 3600 指定nginx向后端传送请求超时时间,推荐 3600 fastcgi_read_timeout 3600 指定nginx接受后端fastcgi响应请求超时时间,推荐 3600 特别是这4个timeout(单位:秒),时间太短容易504,除非你的服务器性能超强,可以在规定时间内跑完程序,推荐 3600。 fastcgi_buffer_size 128k 指定nginx读取fastcgi响应第一部分需要用多大的缓冲区,可以设置为 fastcgi_buffers 缓存区大小,推荐 128k fastcgi_buffers 8 128k 指nginx需要用多大的缓冲区缓冲fastcgi的应答请求,推荐 8 128k fastcgi_busy_buffers_size 256k 整个数据请求需要多大的缓存区,建议设置为 fastcgi_buffers 值的2倍,推荐 256k fastcgi_temp_file_write_size 512k 在写入缓存文件时使用多大的数据块,默认值是 fastcgi_buffers 的2倍,推荐 512k client_body_buffer_size 32k 请求主体的缓冲区大小,太小会降低速度导致超时,推荐 32k,如果没有这条可以不管,也可以加上。 如果你使用的是nginx的负载均衡Proxying,调整: proxy_buffer_size 64k 指定nginx读取代理响应第一部分需要用多大的缓冲区,可以设置为 proxy_buffers 缓存区大小,推荐 64k proxy_buffers 4 64k 指nginx需要用多大的缓冲区缓冲代理的应答请求,推荐 4 64k proxy_busy_buffers_size 128k 代理数据请求需要多大的缓存区,建议设置为 proxy_buffers 值的2倍,推荐 128k 另外如果各缓冲区太小会导致fastcgi进程被挂起从而演变为 504 甚至 502 错误,所以可以将 bufser_size 适当调大,范例中推荐增大2倍,如果不够用可以 10 倍甚至更大。 为防止填错,建议把所有数值乘以相同倍数。 有些集成环境的 Nginx 设置中可以直接修改某些参数。 CDN(重要) 如果用了CDN,就需要 修改你电脑的hosts文件,绕过CDN直连网站,否则通常CDN有1分钟的超时限制,而且无法修改。 Apache(重要) 如果用的是Nginx,就不需要修改这个了。在 httpd.conf 中找到以下参数: Timeout:接收和发送的超时限制,默认120秒,推荐3600。如果不存在,请自行添加。 PHP(不重要) 在 php.ini 中找到以下参数: 注意:通常不需要修改这里,因为在 设置 - 服务器压力 - 超时 中可以动态修改,推荐3600,即默认的1小时。 max_execution_time:脚本解析允许的最大时间(单位:秒) max_input_time:脚本解析输入数据(类似POST 和GET)允许的最大时间(单位:秒) MySQL(不重要) 在 my.cnf 中找到以下参数: 注意:通常不需要修改这里,除非你一次要保存到数据库的内容非常多。 innodb_lock_wait_timeout:指的是事务等待获取资源等待的最长时间,超过这个时间还未分配到资源则会返回应用失败
0
0
0
浏览量0
sssssjkl

为什么使用链接法解决冲突中删除元素的时间复杂度可以是O(1)?

你主观上将"删除"和"查找"两个动作结合了。 这块的"删除"应该这样理解,当前已经拿到了具体的要删除的元素,现在要从线性表中将其移除。 * 链表只需修改指针即可,故O(1); * 数组在清除数据后,(当需要时)还需移动后续元素以保持连续,故O(N)。
0
0
0
浏览量0
sssssjkl

为什么我vue组件已经写好了,但就是在htm中使用不了。浏览器也没有报错,这是为什么???

你是不是少引用了什么文件啊?你看看打包好后的html文件里是怎么引用的先。
0
0
0
浏览量0
sssssjkl

java list.toArray 方法?

看一下toArray方法的源码文档: * If the list fits in the specified array with room to spare (i.e., * the array has more elements than the list), the element in the array * immediately following the end of the list is set to null. * (This is useful in determining the length of the list only if * the caller knows that the list does not contain any null elements.) 意思就是如果数组的元素比列表多,数组中紧跟在列表末尾后面那一位置的元素设置为null, 如果调用者知道列表不包含任何null元素的情况下,方便推断得出列表的真实长度 以ArrayList为例,它的实现如下: @SuppressWarnings("unchecked") public T[] toArray(T[] a) { if (a.length size)//如果数组的长度大于列表,把列表后面的第一个位置置为null a[size] = null; return a; } 你题目里这个of生成的应该是一个UnmodifiableList? 它的实现也差不多,总之也是只把紧跟着列表后面的那个元素置为null: @SuppressWarnings("unchecked") public T[] toArray(T[] a) { // We don't pass a to c.toArray, to avoid window of // vulnerability wherein an unscrupulous multithreaded client // could get his hands on raw (unwrapped) Entries from c. Object[] arr = c.toArray(a.length==0 ? a : Arrays.copyOf(a, 0)); for (int i=0; i((Map.Entry)arr[i]); if (arr.length > a.length) return (T[])arr; System.arraycopy(arr, 0, a, 0, arr.length); if (a.length > arr.length) a[arr.length] = null;//看这里看这里 return a; }
0
0
0
浏览量0
sssssjkl

vue3中keep-alive 缓存页面如何实现??

vue3中使用keep-alive中include属性来缓存router-view 在第一层子级下缓存是生效得 但是在第二级缓存就不生效了 const keepAliveName = ["Assembil","table", "from","details1","details2"] // keepAliveName数组中的元素是组件页面上的name值、不是路由上的name值 "image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241210/8453dbd971a0c93a9d7c2f7eeb54e6b3.png) 最终想实现得是在全局layout实现个页面缓存(不仅只有两级children还会有更多)、通过组件得name值配置或者路由信息配置 请求大佬指教🫡🫡🫡
0
1
0
浏览量18
sssssjkl

Java中如何在导出CSV时,同时使用单引号及双引号?

我正在编写一个 Java 应用程序以将数据从 Oracle 导出到 csv 文件 但行上的某些数据可能如下所示: "image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241205/5c42b3c200a89e60d811a157288ce7f3.png)
0
1
0
浏览量14
sssssjkl

PyG edge index 如何转换回 邻接矩阵?

PyG的edge index形式是$[(node_1,node_2), (node_1, node_3)...]$这种edge pair。 naive 直接for循环,吧edge index里面的位置填充1: import torch def edge_index_to_adjacency_matrix(edge_index, num_nodes): # 创建大小为 (num_nodes, num_nodes) 的二维张量 adjacency_matrix = torch.zeros(num_nodes, num_nodes) # 根据边索引填充邻接矩阵的元素 for i, j in zip(*edge_index): adjacency_matrix[i, j] = 1 adjacency_matrix[j, i] = 1 return adjacency_matrix 效率很低 利用传播机制 用PyTorch的广播机制,通过将边索引直接作为索引,一次性将对应的邻接矩阵元素设置为1,避免了使用for循环进行逐个元素的填充。这种方法在大规模图形上具有更高的效率。 import torch def edge_index_to_adjacency_matrix(edge_index, num_nodes): # 构建一个大小为 (num_nodes, num_nodes) 的零矩阵 adjacency_matrix = torch.zeros(num_nodes, num_nodes, dtype=torch.uint8) # 使用索引广播机制,一次性将边索引映射到邻接矩阵的相应位置上 adjacency_matrix[edge_index[0], edge_index[1]] = 1 adjacency_matrix[edge_index[1], edge_index[0]] = 1 return adjacency_matrix
0
0
0
浏览量0
sssssjkl

clearValidate在elementplus中没有?

"clearValidate"是""暴露的方法 "https://element-plus.run/#eyJzcmMvQXBwLnZ1ZSI6Ijx0ZW1wbGF0ZT5..." (https://link.segmentfault.com/?enc=wtgMZBrbKXPSLl0lRk%2Fhxg%3D%3D.RULBBnltt3msUN1qahqZ7EKsKSukteqpDXHrsPyGCp40YeaHe8MaYcJvCkMvumxz7YdSGz0Q7zncoVzw4fBwO5PnQcSj%2FbjUNzO3GjZkuRsbK%2ByUrKc30oGhAMIDTNJl4bXv50H2HBT3l7Rk3%2BLWKV%2By%2BTgFo6nmwUJPtm1%2BsC2D6kb6KOD45etvoO9pf7kstNjXIsncuRtC4yeMWQyYeRKpq3T2efxLueupsn76iu3ZeJWvhEypNGGu8NSABmhM0kjhHXBSABVcfjc5%2FHMCIQ4%2BaJksNkXgJjZVn%2BB%2Fy%2BnDXj%2BOXJMipcoXmOzaPcd4iF8gIBouDghi9eoBkiL3gK2sY1nrGqmLEtbe66SgIxdMtgALd6Jr%2Fhgsk7rtyWh1%2F%2Bp2bCodnI0VG6EYOxu%2FeRM8rxc8r%2FTZNz%2Be3MjPYsL3tLGlKgxu3bb39TGmWgnZOtNI%2BnR0yE64mtNE2sYAsrn0uCzPhsGlYIOHifZyzNoMFIMfAQwxcsPmiWGJswmQPZAhtTU6pNf%2FwWSxnGnujNuNFVaNSEOAHvYHB%2FelDNkKomSPf0khVHOdkdvRM9cMSElmqXWLVBmsUBYeqB9VGG9nguwjvs2nDMBMwlAb48lfkHOFV%2BGAnkULCWdYC0niwuqjY%2BpDu2lQ2z3Y0HivOHzYwats7Gy%2FtRyuj6WXduBoCQHJctC%2F7UuyXqf1JDzab%2FCYHau175Uu5L%2FBaruCxm2fbOm2z7eUI3XejGbXlJoVXb4ta0893EPqM0CiGC4Xkw1SWtbnIGAMitjRaFolj59vVSpXRnJiXTtjKLwsgJywvTxl4u5VoC7GD5x%2FFj7qOOOTmcCwKEbiHud4hPvrvmQfjzp2Mf7HFqbqIKvp7Fx4KTJJbmCQvIkM0hNCAiqM87IroDMyhU%2BRvllIv6%2BOER5n9H5G9vRwaKs9jIkiBvoUGZok0kKKQqV7vhQU5q%2F3jALcUCaFo0izRUpjxxikC5VD8UFmHuzGnV71k68lkVEVIcmfNLJeUizz1PzIw735HXOtJM93L%2BfhyAotiF8tTi83Q2hzy4toVvJj9JZDxIUnphi4ucRcocQe3%2B3GZBkuJBPKOtoBHOUz6KBfWVF%2BfUysWUrLPgLfGWd7KeBSle4VvdG1HL%2BAT3dGsuYOWrLLbZfQiiNkhAIt4V6HpHoLwPcCKyeLRfcFwO93rSflhJc5s6oTE8rWiNnJGGVCPHwPgnWvUEPfSJFx0ZWc5wRQBcsTX3XKWOqRlcmXs%2BsHZvSTLPvTxNqcDiTm4jGXNrKaWHMQM7OMDC3lRyAZ6ZaUkUTVL26cvapbsE4%2Fk2GQI8T7nPUDi3SwClbGGZ0k4AyBeZQlL28LW50xQWGMUA3XXxngfyw5ArnJcu5kKT93KTjJmaLs9os38XFqc%2BzsJAe4K8OO48oEt23sjXMHcn2VQhQHV%2BMCbGlZWONY0tUJ%2FBWyiEt%2FccvYikZUnjMJTn7ynJ6%2Fn6wyJg9F85ixAFb6lRaPw3ymTRTXoBrjFOmVi25pjoEeiXADuiG8wn8I4iw72AEsu1jlqsQHI4sGrQonynq%2B84dczKj9I2OQbKByhB%2BGPpEyuJwvvFUwRaFWxdFxHRfaVZimSGI98%2FUTKUcUc1Uj4KlyqAlwxP6zGIxJi12UB4mumoU0oLf5IpQAU7uxtiEHmmoVs2atKgFMWKVunfRUqBTQDXin6qAnVsAQDjN%2BZ27qURDqNnOppJ9uyW2cBYgb7MGp6BxMF0sOCHcQYhjV4PrgSqQPj4qp4fHaPmW%2BUfgV4VKYM130JXkSGk0LX3k8urK5BqVRsGpydusSAC57oWGC5e0JfYSER3Re7edDDLpgc8mgfXE5iluF43EoPHRa50afbNCGWBJ7JaTcjS8iXqEHa1svl2ADfTuukhs9GFkqUDEsRVOLCHjIQVD2iRowgIFgScWvXETvIFVOy1WqYHu8e7xoTRctCyvZUGLwk4QJRRUjC1q7oNKUzvuoEBix8THD1CqzyMxbNSoVaLn3kihCVbZUQx54FpebPoiYRvMAGpUkV4zcYX7EQrUBc%2BhUa%2FqJKB2K8CA8QtUDvuyjWtbubBLGYBFS5R2R9jW8pq3yhcZbrsMR9p2usjzKhIWb1CFSl2v7AHH27cD1QvV6BWyD8eB7Q7JLrIAe6V9i4YKM7z251Vonu24%2FESTeWheZA8j%2BSH7HAB5fbTiPnCOkpY9pit3ib6jMr3tXVSnW8SmAU9OUXRmARHS6crCFeVr38tU0%2FIGQagZdo0qLjjc9VNwJ89ar%2FaEia9Dz6VZ%2BzZgJjvxhrGiL8plbOxXMau8b%2FImpIR5r1cuMdE9N2NTwrmh%2FdkeDZLqBO56qERymLG8Nk9%2BCoUArK5z4ibS42gMTBme03PUH8qvrwcq1ZGabCsezqIrG0G6H2csddcrjawUUlbz%2B8JCXbNDua1%2Bi5yZ6ze4KLf%2FiM90n2D%2B9cZVPkLhaapPHaYswEP8hmG%2FqJqrNoogvJfH%2BxA31vQF2N%2BvI%2BsoP6vA4rqpEbiEvzWhuCCeymrUQHXu%2BOZPuxG4fdQ%2FTNdazcQGjd21UDHqOy97oTyLBzmbT1OXf8DGq08X04VUoIqY%2FcEMwx%2B39Y044wIHxUzRyyiZLJGI68JzR2AVJg2e0io7Jpw92UY%2FRHTfM88g64KIu0BH95VIqzV3S2slq9EVbMtESDavt1c%2BxPzgKFMC2g1RHBoe8ZWvAEVZKQBV57wgLdyA%2BWtveunvU7t9R53tG6SFobUndNXCoOo%2BM6CaKi%2Bivb7PXhg1NR378KD%2BWJqjOKDORkoSia0lvYL%2B5kXIhL%2B%2FXbXwDgF8bTDS7bAkDCk%2Fp4bfxDgS59eqq61gBSKyx4xDpTEeK8bhBbtB1PpwwjnxxjlpepyDRAL0K6Dkr1W8CytNPI0j4z4eyJXs3yHcgthiJGMv4EcLbTDq1aJUDU7O5mes1g7JonIFlyO0De9CcMtSRpgDYhqW5SUqT5xes1NxY0y4jvApj0XGZe8hWmMUkNzDOKmMvckaU1RRSEE3QcqFwNuREYvW6m2F5B8oYXKxzfjFUFkHcDSWr7%2F3%2FczVGlhND%2BVUcWqEaRRmLJ9ltP9tCjnoPne5PQg%2FiCM8oX7Kr%2FbvU9h9ceKYVuw73of8X1E%2F9Cxk7bvy7XM8NnfEyd2EJ39PmyHu3yd4obW2JS1TPpP6Jk4hPvCMleV%2B08Z4Pc5pmhqTVPz57oHIB6e7dgzGECtay4RO1x1pNUbe2J%2BUJq32wJatf7Pzbwd5mhz7m3bMnuVY2JlxH0TZq7wDQLdFhdwCtun5DI%2B5P4%2FMag9km2Uc4FjtXMcmG7hUnhKQLxN4pzXZBUWr9URZYRHxt3dkSY%2FzMAIJI3TBcHXvnZbkLfnj6d6ZrIaRj2nDTdL7BTrRCSOouiJq%2F%2FDernOEEcj%2BfdiFe3zaxYQBU226SvwoCxLPmmxr2YkG%2B8wb%2Foz32%2F5ed%2BUosyhTouI0g8DmbeK5SSakew142K%2B9jhSwObE0h2GAKdh3LdoNbDTeYE42G5QDpsRHPkGAqBZJ4NgcxnbIFKkRCuEkQ1d3uwn0SFzsw5qeAwTY8rsaksI1GvXKa24NMVKADpkcZIjL0%2BhNtj%2FA8KJpAf5ltV6BQxMpbSwhBgNm7KjsH8xZT2BOaQ%2BdktEFDjMO486IPkovgeZkhvgyIog5eDpnt0IyUwu97%2FJ8LHJZLaR2wFlDlQzZ1FU9EMyWC1F2b0fKzM2TW1A8nippBzsF1sWQ6rY7D2h%2B9hZozmSa84FGes5YumGJ6rdycdVU6O5rdtb4P0n42DFzWXE3cjthXJHn1yzcRNYwQZP%2FdNVbSH%2BRooYmhCbGfc42F%2BpHrSzrFDnASkuLVQzho%2BFvpKuGGy%2FP8z7liu6XveyvrtErpl%2B47NnrAlkDU3iOiccoLx23QNi8AkWuHAKjiIytni0QmpQ4yhk7iWXIf8Iugm3q8h0mqc39hO2qqW8VwygbwZOGRj2wPAjfXrnHaIP8LUDBbC1WNfKNGi14%2FvVLEHP%2BmaXut%2BWitvgvNIB9eEH%2Ff658Fcc7j%2Fad1jDeFfmPfAgy9Sx%2BaXchHu%2Bi2TspWHS3I0MuzfYzCB0jYCdPcDM9NPUbvv041yv4Mg06BNCh8OILRk0MUrPJWSGULZIyd0xHpRpjmWROrm1lNDDBhpPs%2FM3Kd7pFe%2FpSjBAkQfQV0lEd74Pfbxl0Lu4lbvql8AdiRHLMKgbqvCWw3fyUWT7KDUtw5P6MrRsn1aU%2FtaTMriTd1%2FkvtqXTT5G3FdZ015vksYqDRqj6%2BATjXNj7pCltuafBLXSmX8ZIjTBpykVJcP2U0Sk%2BAX%2FkSw%2FAGc3nn4W5bq94jauqAeL029J9tC%2B7IQLboGxIsT1dxeaqi7MHWtcDMhJAwC%2Fe2FiRcLfS09z4CewQhSSTnCTG%2BZ6Xxmme5XU3ykZJ4SsDyltVSFeG0smb7s1a4RZHxWBQZowhOOPPxHYC079%2Btemg2JBPZAL0NRYOGhZbs9WjeBr%2BmhgAj9Evgd2hkRt6Vv%2FUnlM6EWCIC6sioKE7zuYu1R6b16AvcpcCB0tnZ%2FOgLQwTQIKpoEowh7kGe8QybjNtFYOUnubz51KW5NBS2nO06cGhfLuYuZwtIoPn%2Fp0TGy1YyVb2GVeTjF4r9%2FaQnCTqDckjDr6yS%2FQAorq5dzLBCIPkk5eCIgf3S9nJ9W8PDKpLcXQjo2qAj%2BKmGPUCcbA21JXEGa026CEswXnkWfU6oHWnely6X9ctSR307zS3rMoWTR3wRLIH%2B9zM4Q8gnbqNtBTFvlcqZpnqrzCDJW7CYhkjCycramPeVqkfzQ2nID2lv2uRKCr8reQoIFFuy2LTdV%2BGHstaDih3nh4wYZ9xfCHBacmi%2FaEYBDrzehTaE0IyMyfMPcsJSGUtVpGKI4MKeoY4U1AgUtxAT6z7e4CYXxqUAyWirSua7TZlr7lLUg7qZ5Ms0N1wwY10apR%2FpIJo7Pn948SSqQfJ4t%2F3Niic8oPnOedWStHKb8S9mmC7uVo84ad9ukGDdyH8O5roB%2BlLVlXTOe95xvlrBDNVsjQGcGQkBO1jNPbL9p%2Fmz912wIlKSQ%2BKLVaGgHQkaRzD53M%2F8TbP7uc4vOEy3xDiFl9csO5NzRsOqgIDUAGrXa%2B68XXblrf4vEIu0EfF8Fd8xqZDpFU7%2FVaDTApeVqmnOQ2phY%2Bjz8Y7%2FImQ7cF%2FrFI4PBV9RYFidS5ViA57aZfdPBaPXTdaGn9YOxEBSLIz%2Fmri9NDHtxw6fskPo7L0VeTsa58jeHoGG6PppXOOPcExIXyfmFV%2F1tdXefJSBGePAsMZW9EtEuNsEUcoakeGadjnQwKBJX5AfiTlrL6bGNamXgdmLT%2FyBbv3za%2BBjgyaAdx4cgq1iLiCBCIK4dAaJcsgEtpo1dOPrN2T5tr4hrI%2Boe%2BvBT7hu6ypNRE%2BL82Qd3tYB8mXQxQL8Bp6DiS%2FJpbvJlq804rvHYE4y%2FldLiPn7NpKEl7DfJAsUIqw0RUbvLjPnwCOAjYIa3bWyaPLamfqAZq7nKwayQa4qsAi83DxUTX88rYhFqNwOv%2FyVMtNOiVEKRcBPSj1qxxTCM5do%2Fowmpx7f5uLS6%2FDV13lJMD3SWAiy9kVBaApXGlLO3FxeV16VPmf2GKITWfSeKjkPmfojHQdvblojCEx2cHPtXH9ohfpsbBBAb%2BfFQz%2Fh5xSerkHAbLCJy35an70s%2BmHaq9wEzoRwtUR8IaIsqkljmEA06vS5InwyrrovD8RO4F2L6NVIYNDWeAl2xhmVIunt6hTZfey2FV%2BF6aWSS5m4PDdaW0J21S%2FYHSxVZ%2Fzh3Nn0jlrAKpD9u1NUnyNf%2FH9uawB1G4odZOpFKvft1WlNi%2Bn%2BeJx2zEomfcmFM4C3YzCit6CutvvELhX2CkT2hmBwkQD9hEkTS883UPpU171dKXJ8%2BF%2BAKxtaYO1WOZ7OJM8FvEEIssloUHXQegw%2BIDSXsPjnVk9eeAFkT4yKvKx3Y7yTGTVbHm2cqw4LaB04eQQSs8xel8wnvnryzQN0W5CpZrkB4x%2BW%2Fw%2FhrqO8HdWHowSvoIwJUXpsRyLya9p%2Fro%2B6r9Ju57%2B5wwcdUwaavTx7nSybklVdVN%2FrzxNgIOSrgCy7PBZxIueKvSYdhL8pfmtBB4QBdrZ%2FfsP1W3I3FdgrZD%2Fa%2FKNxUuoF3kIZorQI5W2nJdXdr21nzehdifgslLCjpwcvtRwXfDBG9gxbnLXKkJORXngQj4Wz5SY09ov7mP8e12ExclR90i27n3ugLR38sPVUmpMmFu2X612m52zZVWRsPiiGtwaKKaDOzi9LSK3JlrFsyC8UNC5X7WiYoeJvVeHCmGPco58cJsYcS9wle8EcQ%2Bjp7SsIRwV67ryR2gHULapxI%2Fgp7jO49weSKD0uthO8GtUo0W5k0IJLqNqzyq9bG1dEy6FZpEPmbRaW5UWdq0JeFbwXr175R2HYnvsxia4X2zjuuzwH8wNIGAzhL%2Fc5S8kYep5h490126rhI%2Fb8kEt9QG%2BDD%2BHdspxgQr%2Bu%2B%2Bh5AmBSHIKrDtwxV2nILVxNYM%2B1ZVVW1P7yomrmt2m6HWQVBlHjxmUnevadBpKezQ7gyyuqSgBnmBFt1SU0sz8mK2e0BrCsa2sO7OR%2F4kuZjQdRbdrudVyLbbwBoXzi0IzKhVP%2BLONnYYu4VTxLaS3gy2ZvcWmb0js0BozP3M6M5IyYslEUq93MgpJTE1ASdlMC8zlcgmmpaGbVtFSdoovmMWRaA94pP9PqqB8yHcAGd1nzB0oMav2zST4jDwMaNyPPsIkmpr9WObZqSaDEPedyS70od2hIidsR4uSmkKNt6T5p4sCiihMYOmgLNjAziavkfl0sqsENjX9ZLbolb7VQA02nypfbTdEsRl4YlSulOeemL1%2B1mmE03i9z8WY%2BCi0a60novddul4mA%2BoUGypR7Qsi1KZkSxWHu8aU9%2F7YFnrwIIOxCugJ8fZtY7PUgYK2U%2B9jO2IczGIkn527v8XciYIu89BQTzkqiA8rEXn0tP8qXvm2PnMm6cyYisnh95KA%2FLJdYCgfY%2FnCSCuAhfqi67t0%2Ff%2Fi6gkDajdE88iuvgTBu8OgJpTZlmOfbo2fHwD7DHtUIohVlMrubz8MIv%2BQ%2FcN%2F6M7Npz5K9BKI4rZANxnktAfg8H%2Bx8PlSuEYZo%2BLQhBJntqgfxnAp82D9DoVmIrp0HGytPC11PV9D1con0XGrJO3etdxMlR7pdp2UCzeJGTmVMztkMWGeuu1jBPnWPoC2NZ0mNVCtdpKGTyOurk%2BSx2IPaToP349r4DD1MSiXqX6rW4Z8T1ahLW7q%2F1evh%2FC9MkHC7SUA2HAN2bbG4yhAjV1ZCWcf%2FvtmXpoSs7JT29SmLRljEy0ggLjEGr6dl7n0RPrO13XSdG2ACOOxb0%2FHelUveR7fA4foW9nm9dlARQ56hd6IghD%2BhZ3JMRmii6976kLUJS6MsXO93G%2BJAwYWGFYKQSLIa490gJdczyeLBM1%2BOQxZBAQudePZXRbNkY0G94A8hWzKPjSllCQXJaHFf7w7XP%2BZxVLc5bUzhvkIwZdG%2Fuc3OmRBo6ICN%2BHlcZnPy%2BkjQpQQX6dxH8L9yBi7m6UEq0kLRzk7zMiUtyZhMl1t4nkO96GH9eukB0Hx3pw%2B1y9zfdvBjRpDGb2AQ1f%2BaOTikC3VNQdHX%2BIHjL6a2SCkPu6KNcCGM8MspNNDJB1VmH%2FDpsiJug4pUaRIGYfFKR9iZb9Ly4VnY%2BJjB9gvbYrC%2BO%2Bk%2F%2FhN1OG3KyLMV%2B4rCwHdJ3XwJvrp8ottWjCQiP2igwXSMQWjmGpQNB3JuXaL9uZxUrLkosQVc%2BXOqTRZp9lZuwEunB7naNgSUM1ZHFOpRACPy7XXIYGP%2Bo21beHlqBIkZdc2ZJce8oNbf7dbygvithf15tfiShnxdiOELz0h4L1%2FUnFnpe%2FcgxTllD2dQRTYuTS3%2F0srjEuoB0IIH9o61R%2BIoGcOwMUYDczyFDaIvTvyK8OngftKJcODDauUM4n9hpHKjuGXYdomOu7%2B2N9ZrBqK8Spb6F7aSJibYof%2F4ksTUw94Tt3ViZawb1yxhojZj%2BD1%2FyZcnU7fwbbQoAByKl9mhiqxh8rO%2FyOU2g%2FLngm9VYadxdyAA556zNIY1e%2ByA2hS5B3HOutljGsilwk%2FLdRfwMpBnHnbhAMLqJjd%2FqJ%2FfDGnQYeI2teDkjE2oPEC3IDbgNOpKYlOSgyDWALhQnMwYSUSIrAiI6XPfi0%2BX0juR3a3ClZSYf%2BVJ3v5gX9SBhznN%2B5VJWUl9nUINrWeOrmA4T%2Ffkh%2Fk8%2FpVE2P8swlKNhwsSgodT6v15xd4jvpHFJ3UMPdXjdNLdmB4LY4ci%2B2PpufO3hlOAGc1wlrJJGddf5aYBjeMnPzYbSEtSs%2B7WVdivVS1j1rTSkRYqiSX6YoL4OHndd5uuD2m%2FdZRnQGL%2B0mNsbOhlZeS7E%2FH5uC7FNOplg3kkDnlz8mbHzr7vS0EOVuEC5hS35yuLx5YHyXXYp9mKahJjO1ZRb0WG8rA7OE42Lt9opkwkBW%2FiCd9W4X2Usl%2BSiMzRCbWvtLBun61S2SO%2BDCgstxKH3aF3yyVdS5DzZnqhYLqgjbto47ZaoKtRp17Msg%2B0iIl6rO27Ue8P%2FfJOpsXzLtxWS8EC6QCsfRoggmAJEfjktGHiJ0dvdDengXw0%2FOCaZcTr9F9VzJEV8tcMD1pWXmxDmNrLdGYpaTHwSjs%2Bq%2BKAfNkNt8XI8lxewH6meKgoRvaQ1060KP1lUVHKsRTj2s2iRwFGPjDVR0IJBQVDMHB8Zf%2FnRPk%2FMX64W3O9H13qXTNZNNfR6c2qAx3Qrig0JJZXj9kl463xlg1h5nIWEt5PJMIEibsGdJmr6YoL3DXKutjqiZWckCq05%2FYx3fUoy7me0WDORrWiNBZy4LUelSpuQfU9ooaRA89V9QVZwC9vdTktkWRPkSwvJVHQDUeyx2ao4w75i12V%2F%2BvxGezOobMSml1LZqlh%2BDL6DVXX4e%2FxuGmtoYY8rf5ma87tErn3zp2DbOV8P530c%2B%2FWfUBnCiCUHFTpMAqa2OvBIP49dMRaCGhlQJIUZDWfHNN81iNGKWcjjiCOvDZZsVtRflL6u9ayEyiDmN2LdeQN1nV4tzTK0DSeNK3VDEDPSpGmJ%2By3Wjtf%2FFl6tbD26%2BqVQSlEY%2BVvc9PntSg2UPydeyFe8CQ2TbwHn9KSJhlWXaHlgyjqbeA7571tjk2mFQF2ioxV9igsVcE1NvyoVLFHpwOuJP6NzuH1dRJ%2FS5L6E6vPeCT9D1nV2BmRlpgwQ33qMfBqZo%2BScOGzS%2F20i3ZHw8lcDnq1FxUFCDLG%2B%2BUYeTZTqf%2Bq7cCBuBzw3Xcz0s8SH88kURs4%2FDClIm%2FYq061MtB%2FErQtcCywSLM%2BraX1u9zRXj9acEYezbULiOXk7gJ4d3rXcmC%2F%2FQoYHmOYo5PPgZ8wYcmOARZmUiVAy%2FHR9rhZTL2tu44P0WCzV6zM7v8WmFIyJSihmNP81FwDp1J8Axl38p1HpUzAE7dYr%2Bo8nbRqKT%2B7vXRQOHiLz0E99sU2VtGHu05kIqoDduUY9qmQbWeKcJDydGakdfK7PES78yoDDTio5tJXN4WQDDLAc12s4SgRMp0B0RJ2XCAjv3M%2BfchmU5XuN0qKfRJPVnT2zrKGJOnLd6wEbDiyxY%2BN8uwg%2F0%2BHfS%2B0zwELjFK7%2BbZIzeMaGFG%2FDzyO64ZODCmwLLd94JOEXaETBxQjxQXanFC5kPOHf7s05v%2B%2FQtdexCuvZHvsqbPM970bQCMtiRV8QR8Nj1%2FaZKv%2FH9ieGEjCPInPEGqTzxNf%2FzB7k6MC3xLH1tWSAR0Ik8WqRYEJWncvLDMHZkAyO9AcxMEph6GPtDSpv1bq40FgZubKVE9895%2BspFfM08rLUZV0uOF9G6B0WI6IjCzIkQxUMgf%2FzhRPq8EFzXVc%2F5%2BhUL9YoQ4jE0QVCDQULn8oimaVpvmni14X21vvNJkSH%2B%2B4k%2BLyzVIcgZBs20GJBbytZoz7wc7J4kbDzMSdTSn%2F8Ofa7mFYATsSDUhA5k%2FdQ97Iunt79eIEbyV2kMgSXFWzFYFgHSBgC9%2BgHQwPRCQ3rVkUx4%2F6obZLRg2IP%2BmWp1zVk%2FfXphT8cVyF39zPsgWPLQLk0bX5qWd8Q0OD5q7%2FJkrzfueZbBPnESmakrsJRBBvwc0Z4ImgJKlChwHe%2BG5d144zNWDsaYyJCK8%2BYPg4StfYvGYUqIxoH8kn8tD98NFEvqXHuz3InW9tem%2FNdSez5K%2FcKr8FENRflVui%2FOhyajlFe6eq56wz2WuDBjjf7BmIEFYuJ1P%2BnhH7kKPLpu9iMIr15U1s3v6IxA%3D%3D)
0
0
0
浏览量0
sssssjkl

关于electron依赖包问题?

"企业微信截图_16986478862904.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241130/db6a27793cc022865ab8eb201bee9874.png) 麻烦问下,我现在是已经安装好了node包的依赖,如何需要run dist,变异之后再运行,现在问题就是在run dist的时候,报上图的错误,很明显的是缺少了一个v,请问这个怎么处理呢, angular项目 "image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241130/d23febcd3a6961c8f7d7fb628e280031.png)
0
1
0
浏览量13
sssssjkl

纵向展示的文字溢出如何通过 css 显示省略号?

如下 "demo", 纵向展示时,横向溢出省略的方案不适用,还有其他的 css 解决方案没? overflow: hidden; text-overflow: ellipsis; "image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241128/b88f9da9a4fdc036a5bb85cbbfcda66e.png)
css
0
1
0
浏览量15
sssssjkl

我用useModel 有个useState数据更新了 为什么在组件里面useEffect监听不到?

破案了 我拿到新数据后将旧数据修改了,旧数据和新数据一样了,cloneDeep也没用,在组件里不会触发effect,在model里可以触发 "测试代码" (https://link.segmentfault.com/?enc=mq7NFvK6bLZUYSdv7f7IVg%3D%3D.wbh310lT8KSodKuum3MKBhraQ0EpP%2FuwMJH8hMuC0GoOH8Oj3Ch%2BgcVzW4KeLOD5uUS7KHXVyl7n0bqH9WKY49tVfYMiHBRe8%2F%2FxXrdsbR8%3D)
0
0
0
浏览量0
sssssjkl

使用webpack4将vue2项目打包成lib会进行tree-shaking吗?

应该是不会进行tree shaking的,因为tree shaking是基于ES module的静态分析来消除无用的JS,Webpack不支持直接打包为es6,所以无法使用tree shaking
0
0
0
浏览量0
sssssjkl

nginx 同一个server下location配置,第二个往后是失效的,为什么呢?

下面这个 "location /main" 指向的是 "/usr/share/nginx/www/main" 这个目录下的 "i.html" 如果你想要 "location /main" 默认指向 "/usr/share/nginx/www/" 目录下的 "i.html",可以把 "location /main" 下面的 "root /usr/share/nginx/www;" 改成 "alias /usr/share/nginx/www;" "root" 指令设置的是静态文件的根目录,实际读取文件时,还要在这个路径的基础上再加上URI。
0
0
0
浏览量0
sssssjkl

echarts地图阴影会在区域块内部显现出来怎么解决?

如图,我想用shadow构造一个立体效果,不希望它在右上方有绿色线条。我尝试修改透明度,但并没有用。 "image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241117/65182f0a3ac658ea63393d60cdbb22ee.png) 代码如下,这是一个"官网示例" (https://link.segmentfault.com/?enc=opzmj0LLpl2lO10PqCj6mQ%3D%3D.bBSSOx8Aj3XgLVhmR4%2BDL6IrFz5R%2B%2FF%2F0t9%2FG%2B4TIRBmDtjrtK6hu4NdOU9zIR2TYO5WhLvW1zhIyjKfysOF0Q%3D%3D) myChart.showLoading(); $.get(ROOT_PATH + '/data/asset/geo/USA.json', function (usaJson) { myChart.hideLoading(); echarts.registerMap('USA', usaJson, { Alaska: { left: -131, top: 25, width: 15 }, Hawaii: { left: -110, top: 28, width: 5 }, 'Puerto Rico': { left: -76, top: 26, width: 2 } }); option = { geo: { map: 'USA', show: true, itemStyle: { }, regions: [ { name: 'New Mexico', itemStyle: { areaColor: '#eee', shadowBlur: 2, shadowColor: 'green', shadowOffsetY: 15, shadowOffsetX: -15, opacity: 1 } } ] }, }; myChart.setOption(option); });
1
2
0
浏览量52
sssssjkl

JavaScript 获取字符数统计方法?

"思否问答:【如何计算 javascript 中带有表情符号的字符串的正确长度?】" (https://segmentfault.com/q/1010000043069823)。 虽然机翻的味道很浓。
0
0
0
浏览量0
sssssjkl

el-table控件在全面屏手机上横向滚动失效的解决方案?

这个问题可以通过手机浏览器设置解决。亲测有效!
0
0
0
浏览量0
sssssjkl

在vue项目中如何将自己开发的组件放到当前项目中的node_modules包中呢?放进去的组件版本号如何设置呢?

在vue项目中如何将自己开发的组件放到当前项目中的node_modules包中呢?放进去的组件版本号如何设置呢?https://wmlx-new-image.oss-cn-shanghai.aliyuncs.com/images/20241110/4b2f8148c1b37a3dfbe74d1d581dd6db.png
0
1
0
浏览量17
sssssjkl

怎么设置鼠标滚轮默认滚动方式为横向?

如何让鼠标滚轮默认滚动方式为横向。列表是横向显示的,需要按住shift才能横向滚动。 "image.png" (https://wmlx-new-image.oss-cn-shanghai.aliyuncs.com/images/20241110/c1c4f1bb7d2f5da0d06f41198cb33117.png) 使用js监听滚轮事件修改X轴滚动条实现,但是不太流畅 function onscroll(event){ let left = -event.wheelDelta || event.deltaY / 2; console.log(event, templateListRef.value); templateListRef.value.scrollLeft = templateListRef.value.scrollLeft + left; }
0
1
0
浏览量14
sssssjkl

使用 getter 和 setter 来控制对象的访问?

使用 getter 和 setter 来控制对象的访问 使用 class 关键字创建一个 Thermostat class。 constructor 接收一个华氏温度. 记得在 C = 5/9 (F - 32) 和 F = C 9.0 / 5 + 32 中,F 是华氏温度值,C 是摄氏温度值。 下面代码应该怎么修改? // 只修改这一行下面的代码 class Thermostat{ constructor(farenheit){ this.farenheit= 5/9 * (farenheit - 32); } get temperature(){ return this.farenheit; } set temperature(){ this.farenheit=farenheit; } } // 只修改这一行上面的代码 const thermos = new Thermostat(76); // 设置为华氏刻度 let temp = thermos.temperature; // 24.44 摄氏度 thermos.temperature = 26; temp = thermos.temperature; // 26 摄氏度 已经自己解决 set temperature(farenheit){ this.farenheit=farenheit; } 需要参数
0
1
0
浏览量15
sssssjkl

[element2 自定义主题]为什么可以覆盖/改变element的scss变量?

«自定义主题 在项目中改变 SCSS 变量 Element 的 theme-chalk 使用 SCSS 编写,如果你的项目也使用了 SCSS,那么可以直接在项目中改变 Element 的样式变量。新建一个样式文件,例如 element-variables.scss,写入以下内容:» /* 改变主题色变量 */ $--color-primary: teal; /* 改变 icon 字体路径变量,必需 */ $--font-path: '~element-ui/lib/theme-chalk/fonts'; @import "~element-ui/packages/theme-chalk/src/index"; *** 为什么可以覆盖element的scss变量?element的scss不是已经被编译好为css了吗,scss变量按说都已经变成具体的值了啊 @import "~element-ui/packages/theme-chalk/src/index"; import 'element-ui/lib/theme-chalk/index.css'; 上面这两者的关系又是什么 *** 我看到了下边这样一句,好像懂了一部分,有大佬可以确定一下我猜的对不对 «之后,在项目的入口文件中,直接引入以上样式文件即可(无需引入 Element 编译好的 CSS 文件): 需要注意的是,样式文件需要单独引入。» 所以 1 @import "~element-ui/packages/theme-chalk/src/index"; 2 import 'element-ui/lib/theme-chalk/index.css'; 上面scss的编译出来就是下边的css,上边和下边不需要同时引入,同时引入其中一个会覆盖另外一个。所以使用了1自定义了主题就不要用2了
0
1
0
浏览量16
sssssjkl

docker部署问题,COPY 命令没有成功?

docker部署项目,目录结构如下 "image.png" (https://wmlx-new-image.oss-cn-shanghai.aliyuncs.com/images/20241027/13d478cc4d1e21e146540f5a2790c6da.png) web下是三个vue打包后的文件,分别是admin,blog,datascreen web下的Dockerfile配置如下 # 使用 Nginx 作为基础镜像 FROM nginx:latest RUN mkdir -p /usr/share/nginx/html/admin RUN mkdir -p /usr/share/nginx/html/blog RUN mkdir -p /usr/share/nginx/html/datascreen # 将文件复制到 Nginx 默认的静态文件目录中 COPY admin /usr/share/nginx/html/admin/ COPY blog /usr/share/nginx/html/blog/ COPY datascreen /usr/share/nginx/html/datascreen/ docker-compose配置如下 version: '3' services: web: build: ./web container_name: web-blog-container todo-nodejs-api: build: ./todo-nodejs-api container_name: todo-nodejs-api-container restart: unless-stopped ports: - '8888:8888' depends_on: - mysql mysql: image: mysql:8.0.35 container_name: mysql-container restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: xxxxxx MYSQL_DATABASE: xxxxxx ports: - '3307:3306' volumes: - /var/lib/mysql:/var/lib/mysql nginx: image: nginx:latest container_name: nginx-container ports: - '80:80' - '443:443' volumes: - ./nginx.conf:/etc/nginx/nginx.conf:ro - /etc/nginx/cert:/etc/nginx/cert:ro depends_on: - web - todo-nodejs-api docker compose up 运行后,在nginx服务容器中(nginx-container), docker exec -it nginx-container ls /usr/share/nginx/html 发现并没有copy过来的 admin,blog,datascreen 目录,问题出在哪?该怎么办,这样配置合理吗? 我现在直接在nginx容器上挂了一下 volumes,把这三个目录映射过来,这样做合适吗?想知道上面为什么copy不过去呢???? nginx: image: nginx:latest container_name: nginx-container ports: - '80:80' - '443:443' volumes: - ./nginx.conf:/etc/nginx/nginx.conf:ro - /etc/nginx/cert:/etc/nginx/cert:ro - /home/ftpuser/my-blog/web/admin:/usr/share/nginx/html/admin:ro - /home/ftpuser/my-blog/web/blog:/usr/share/nginx/html/blog:ro - /home/ftpuser/my-blog/web/datascreen:/usr/share/nginx/html/datascreen:ro depends_on: - web - todo-nodejs-api
0
1
0
浏览量13
sssssjkl

在amh部署one-api项目后,one-api日志提示数据库链接不上?

看你用的tcp 3306端口连接的mysql, 考虑安全amh的mysql默认是没监听端口的,仅本地sock连接。 要用端口连接,到数据库管理的『参数配置』开启监听。 amh也支持多个mysql同时运行,不同的mysql你也可以监听不同的端口。
0
0
0
浏览量0
sssssjkl

rollup打包,如何处理 Symbol.toPrimitive ?

首先,Symbol 是 Es6 引入的类型,如果不加 polyfill,那么在不支持 Es6 的环境下,不能正常运行。 如果不想打包为 Es5 的版本,可以检查 babel 的相关配置。
0
0
0
浏览量0
sssssjkl

js 比较两个数组,并进行替换掉?

js 比较两个数组,并进行替换掉? let arr = [ { sk: [ { Name: '数据1', Value: '200' }, { Name: '数据2', Value: '300' }, { Name: '数据3', Value: '400' }, ], }, { sk: [ { Name: '数据5', Value: '500' }, { Name: '数据6', Value: '600' }, { Name: '数据7', Value: '700' }, ], }, ]; let arr2 = { name: '数据555', val: [200, 300, 500], }; 需要根据arr2对象里面的val数组里面的值[200, 300, 500]去匹配arr1数组下sk数组里面的Value的值,如果arr1数组下sk数组里面的Value的值和arr2对象里面的val数组里面的值相等就替换Name,把arr2 对象的name 赋值到sk数组里面的Name 期望得到 let arr = [ { sk: [ { Name: '数据555', Value: '200' }, { Name: '数据555', Value: '300' }, { Name: '数据3', Value: '400' }, ], }, { sk: [ { Name: '数据555', Value: '200' }, { Name: '数据555', Value: '500' }, { Name: '数据7', Value: '700' }, ], }, ]; let result = arr.map((item) => { if (item.sk.length == 0) return; item.sk.forEach((k) => { return { Name: arr2.val.find((t) => t == k.Value)?.name, }; }); return item; }); 这样写了调试了还没效果。麻烦大佬们帮我看看
0
1
0
浏览量12
sssssjkl

vue3 某一级路由有3个子路由,点击切换到第三个子路由,然后切换其他的一级路由再切换到开始的一级路由,要求自动选中第三个子路由 如何实现?

简单说一下思路就是使用 "pinia" 或者 "ls" 缓存一下之前的路由值,在一级路由的导航守卫的 "beforeEnter" 钩子里面做一下读取然后 "replace" 过去就好了 *** Edit import { createRouter, createWebHistory } from 'vue-router' import RouterViewer from '../components/RouterViewer.vue' const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), routes: [ { path: '/page', name: 'app', component: RouterViewer, children: [ { path: '/page/home', name: 'home', component: () => import('../views/HomeView.vue'), }, { path: '/page/about', name: 'about', component: () => import('../views/AboutView.vue') } ] } ] }) router.beforeEach((to, from) => { console.log('-----------------------------------') console.log('to => ', { ...to }) console.log('from => ', { ...from }) // 获取当前路由匹配信息,并且反转,以便获取最近的目录菜单 const reverseMatchedList = to.matched.toReversed() // 这里用的 `toReversed()`,如果不兼容使用 `reverse()` 替换时会有修改源数组的问题,需要注意。 // 获取目录菜单下标 const catalogIndex = reverseMatchedList.findIndex(ro => ro.children.length) // 获取当前匹配目录的信息 const catalogData = reverseMatchedList[catalogIndex] // 当前是否是前往有子路由的目录,即下标为 0 if(catalogIndex === 0) { // 从本地缓存中获取目录缓存的子路由路径 let cachePath = localStorage.getItem(catalogData.path) // 重定向到缓存中的路径, 如果没有则重定向到第一个子路由 return cachePath || catalogData.children[0].path } else { // 如果不是前往有子路由的目录,则缓存当前路由路径,到目录缓存下。 localStorage.setItem(catalogData.path, to.fullPath) return true } }) export default router
0
0
0
浏览量0
sssssjkl

如何限制云服务器上部署的网站只能在公司内部访问?

添加防火墙规则、内部DNS解析配置、添加IP限制等都可以 IP限制:"https://cloud.tencent.com/document/product/598/38037" (https://link.segmentfault.com/?enc=iGkTKOmoeSZ1dNySi6Re%2BQ%3D%3D.j0zTKDgnSnBLWjGESyQ%2BEEtjU5bwnBWIpzFsAgLZR6WZlFwyqNYhqXVGlvw10XjLs6qr4Q02pzZZBkhHORk8Tw%3D%3D)
0
0
0
浏览量0
sssssjkl

为什么 aliyun 的 redis 支持账号概念?

为什么 aliyun 的 redis 支持账号概念? redis 只有密码概念,是没有账号概念的 "图片.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241014/8cf2857b050056fb53e90d268e3196a0.png) 但是 aliyun 的 redis 服务却有? "图片.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241014/a51dee7740e8ee8f3f6e1549cb524af2.png)
0
1
0
浏览量167
sssssjkl

如何实现多级表头下,根据不同字段实现对应属性的渲染?

根据多级表头渲染表格数据———— 这是数据源,依据shift字段值区分白夜班数据; [ { "station_no": "OP10激光打码", "shift": "白班", "total_input": "101", "pass_count": "100", "ng_count": "1", "pass_rate": 99.01, "work_time": "2023-12-24" }, { "station_no": "OP10激光打码", "shift": "夜班", "total_input": "102", "pass_count": "100", "ng_count": "2", "pass_rate": 98.04, "work_time": "2023-12-24" }, { "station_no": "OP20CV1组装", "shift": "白班", "total_input": "130", "pass_count": "130", "ng_count": "0", "pass_rate": 100, "work_time": "2023-12-25" }, { "station_no": "OP20CV1组装", "shift": "夜班", "total_input": "135", "pass_count": "135", "ng_count": "0", "pass_rate": 100, "work_time": "2023-12-25" }, { "station_no": "OP30CV23组装", "shift": "白班", "total_input": "155", "pass_count": "150", "ng_count": "5", "pass_rate": 96.77, "work_time": "2023-12-26" }, { "station_no": "OP30CV23组装", "shift": "夜班", "total_input": "121", "pass_count": "120", "ng_count": "1", "pass_rate": 99.17, "work_time": "2023-12-26" }, { "station_no": "OP60PT组装", "shift": "白班", "total_input": "82", "pass_count": "80", "ng_count": "2", "pass_rate": 97.56, "work_time": "2023-12-27" }, { "station_no": "OP60PT组装", "shift": "夜班", "total_input": "2033", "pass_count": "2000", "ng_count": "33", "pass_rate": 98.38, "work_time": "2023-12-27" } ] 这是数据结构: tableTitle: [ { prop: 'station_no', label: '工站' }, { label: '白班', children: [ { label: '总投入', prop: 'total_input' }, { label: '合格数', prop: 'pass_rate' }, { label: '不良数', prop: 'ng_count' }, { label: '通过率', prop: 'pass_rate' } ] }, { label: '夜班', children: [ { label: '总投入', prop: 'total_input' }, { label: '合格数', prop: 'pass_rate' }, { label: '不良数', prop: 'ng_count' }, { label: '通过率', prop: 'pass_rate' } ] 模板结构: 这是渲染后的表头: "image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241013/f1a63bd2bf9148d081aaadd9d8de24c4.png) 怎么实现根据shift这个字段值,给白班和夜班分别渲染对应的数据? 查看文档,只有多级渲染。 我自己的一个方案:获取数据后,额外操作数据源做一个区分处理(根据shift值),然后修改不同班别下的属性(白班对应列表头属性改为day_total_input,以此类推),在渲染部分外加一个判断。
0
1
0
浏览量186
sssssjkl

vue-router 版本 > v4.1.4 如何优雅传参?

🙄 "params" 传递参数为什么不支持? 👉 "编程式导航 | Vue Router" (https://link.segmentfault.com/?enc=DdbkUmobjB25XboDd8U1uw%3D%3D.r%2FrHgiUjiV%2B19hwMqyoWlbmWZf6ksgn9EO206yp4bFPtB4peOKonqY4A8caVar10zJZLEZqCc45i4ANIGS3yYQ%3D%3D) 不支持的你没有在 "router" 配置的时候显式声明你的 "params" 参数啊! const routes = [{ path: '/test/:oops', name: 'somewhere', component: somewhereComoponent }] 在 "Vue2.x" 时期,也就是 "vue-router 3.x" 版本的时候我们不想在URL上面展示一些传参信息的时候会通过不在路由配置中显式声明 "params" 参数,然后通过 "router.push({ name: 'user', params: { username: 'eduardo' } })" 的方式去跳转。 这样就不会在URL中展示 "params" 参数。同时会在刷新页面时候丢失 "params" 参数,也起到一些特殊地业务处理方式。 但是在 "vue-router 4.x" 版本之后就不是这样了,如果没有显示声明 "params" 参数,在使用 "router.push({ name: 'user', params: { username: 'eduardo' } })" 的方式去跳转地时候, "vue-router" 会把 "params" 参数给抛弃,并且在控制台抛出异常提示。 这其实是因为早期我们不规范的使用 "params" 造成的。如果你不想显式的在路由表中声明,那么也可以使用 "query" 参数的形式来替代。但是如果你想要传参的同时不要想在URL中显示参数信息,那么可以通过更新文档中提到的这些方式来操作。
0
0
0
浏览量0
sssssjkl

systemctl命令找不到的解决方法?

zsh: command not found: systemctl如何解决? 前端执行docker cp dataease:/opt/dataease/plugins/default /opt/dataease/plugins/ 显示:Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? 网上搜索说是需要启动,然后执行了systemctl start docker 然后报zsh: command not found: systemctl "https://dataease.io/docs/v1/dev_manual/dev_deployment/code/" (https://link.segmentfault.com/?enc=s7f6BHOULJFnrgWjl1j%2BEQ%3D%3D.heUrv3QEi6dKPidJo4zhpxlRDHuvprEIrdcpD3WXwCW9aPAeUTB6RuCNIwNG2hrIKikGDaOC2PoBov7%2BCCvKpA%3D%3D) "image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241011/1789f744861b683ca03477d9c6c77c84.png)
0
1
0
浏览量169
sssssjkl

ubuntu 怎么删除像nginx这样的全局命令?

执行 "hash -r" 清空缓存 "hash -l"查看缓存列表
0
0
0
浏览量0
sssssjkl

请问微信小程序这种pdf文件的保存,能单独加按钮点击保存吗?

试试看 "wx.saveFileToDisk" (https://link.segmentfault.com/?enc=DEtLPXfZ0ZLY3qLFgWoDAw%3D%3D.XDgJO53sfORocpG4zUoWOML0NZLy29oQ5Ho2C5NtbfwQwxRmywha8B9nn7YDiLbexOleKh8SHJtoqoyzZOHIhNRSH4oNgIsZBVoEpT%2BnzGOjpDoHlHOb5675JeSJVxaS) 这个API? 这里是官方提供的一个Demo 👉 "开发指引 / 对象存储 / 微信小程序 / 下载文件" (https://link.segmentfault.com/?enc=mz5lgghB%2F%2Fm%2BHOCudLIWwQ%3D%3D.FLd5x4ZkFKtztCvcVbL3ltcE2OBAmQosS3qkO0kKdqn%2BQt6qB5WeaZb69gpZ9lbDH7Vg7H3kiDY1SHUpVqkL%2BE8isSqe%2FClmnM%2FIZUd7hT1ruJ%2BD6KQngex2uZP73NWyrrPUo12%2Bbab0Xos5pgr2i32AYUMGz12a9%2FNdT5kXQCe7f4QYTDSu4QwlQmxyLGn%2F) async onLoad() { const result = await this.downloadFile('cloud://test.png',function(res){ console.log(`下载进度:${res.progress}%,已下载${res.totalBytesWritten}B,共${res.totalBytesExpectedToWrite}B`) // if(res.progress > 50){ // 测试文件下载一半就终止下载 // return false // } }) wx.saveFile({ tempFilePath: result.tempFilePath }).then(console.log) }, /** * 下载微信云托管对象存储到本地 * @param {*} fileID 对象存储文件ID * @param {*} onCall 上传回调,文件上传过程监听,返回false时会中断上传 */ downloadFile(fileID, onCall = () => {}) { return new Promise((resolve, reject) => { const task = wx.cloud.downloadFile({ fileID, success: res => resolve(res), fail: e => { const info = e.toString() if (info.indexOf('abort') != -1) { reject(new Error('【文件下载失败】中断下载')) } else { reject(new Error('【文件下载失败】网络或其他错误')) } } }) task.onProgressUpdate((res) => { if (onCall(res) == false) { task.abort() } }) }) } })
0
0
0
浏览量0
sssssjkl

有比较推荐的基于Vue的即时通讯开源插件吗?

轻量化一点,不用太复杂的
0
1
0
浏览量157
sssssjkl

Vscode和Idea的快捷键,采用哪套比较好?

因工作需要,我需要同时使用vscode和idea。它们的快捷键,我想调成一样的,切换起来方便点。 调成哪一套比较好?vscode还是idea。 感觉它们2个的快捷键思路不一样。idea似乎是适合一手键盘一手鼠标,vscode则是双手键盘。
0
1
0
浏览量179
sssssjkl

vue-cli4使用terser-webpack-plugin时exclude不生效?

关于vue-cli4使用terser-webpack-plugin时, exclude不生效 我的目的就是想让utils.js文件下 console.* 都能打印 其余文件的console移除 1. vue-cli4本自带terser,使用过exclude,发现打印出来没有exclude于是安装了插件 // 原始代码 config.when(process.env.NODE_ENV === 'production', (config) => { config.optimization.minimizer('terser').tap((args) => { args[0].terserOptions.compress.drop_console = true args[0].terserOptions.compress.drop_debugger = true args[0].terserOptions.compress.pure_funcs = ['console.log'] args[0].terserOptions.output = { comments: false, } return args }) 2. 接着自行升级了cli和安装terser-webpack-plugin "@vue/cli-service": "~4.5.19", "terser-webpack-plugin": "~4.2.3", config.optimization.minimizer('terser').use(TerserPlugin, [ { minify: TerserPlugin.esbuildMinify, terserOptions: { compress: { drop_console: true, drop_debugger: true, }, mangle: { safari10: true, // 解决ie,safari10.1不支持ES6语句 }, }, exclude: /\/utils/, }, ]) 已经添加了exclude,utils.js 文件不做处理,但是正式环境还是没有打印 确认过插件是生效的,因为drop_console开启了,控制台没有任何打印 不知道哪个环境出了问题
0
1
0
浏览量121
sssssjkl

想使用qt写一个较为复杂的多线程程序的话,尝试哪种比较好?

使用moveToThread, 线程间交互用信号和槽, 如果不用会发现程序可能不会跑在多线程上 如果遇到多个线程配合的流程自己实现一个队列来控制这个流程
0
0
0
浏览量0
sssssjkl

有什么工具能把 js 字符串的链式访问符 转换成 es5 形式?

有什么工具能把 js "字符串的链式访问符" 转换成 es5 形式? 我有个在线编辑工具,当我写 "const name = data?.name " 就报错 我如何把这个字符串转换成 "const name = data && data.name" 这种形式? 大致看到了 babel 的网站 "https://babeljs.io/docs/usage" (https://link.segmentfault.com/?enc=70dCpNOTn18LVuIX4eVxkA%3D%3D.vbQ5J5D%2BJP0uernoa4yyYdMo%2FpWZPKSAYrtAgSj56G8%3D) 但是没有找到具体的使用 api... 给它一个字符串帮我转换成我想要的,还是说需要依赖 node 环境?
0
1
0
浏览量135
sssssjkl

在uniapp 中引入生成条形码的插件,但是页面上无法使用,是为什么?

你位置是不是错了 "image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20240929/d032ba754656cb024242419528a56993.png)
0
0
0
浏览量0
sssssjkl

前端表格展示十万级数量的数据,有没有好的方案?

element-plus中自带虚拟表格"https://element-plus.org/zh-CN/component/table-v2.html" (https://link.segmentfault.com/?enc=PY9MOcYE0%2Fj9KdVSxoeIGw%3D%3D.KYebFB9w46IjSuFczn6n8NRNpml3TB5e0%2FDoz9%2FUWVuIsM00KGkiz%2BgGcfmi79efHY1dow%2Fcic%2BiUANTihoGXA%3D%3D) element中可以引入第三方插件: 1、引入第三方 "vxeTable" (https://link.segmentfault.com/?enc=tAZG5oaUUJOnPoICV%2FbwHw%3D%3D.wPyICC3gI75S9K%2F8LyIEYsc%2Bgf83KxKvdrtx2F%2BSATgI2FcwYWkNyuO7iKy%2BJkp2) 2、引入第三方 "umyui" (https://link.segmentfault.com/?enc=Pm2wpXScRbiSwU5%2FItyJhA%3D%3D.fouhPbYCo%2B75lpvZzUBS78e%2FIUpLjArHPLPfGsPxvELBO4OKunY%2FajqCS7IWcrwCbUtKYnsmQy80G2PLC%2B3h1w%3D%3D)
0
0
0
浏览量0
sssssjkl

ChatGPT GPTs中请求post接口报错INVALID_REQUEST_UNKNOWN?

在gpts中发送一个post请求出现以下错误,但是调用其他的get请求是正常的,为什么?是不是gpts在发送post请求时,把格式进行了转换,导致了请求错误? 左边是GPTS在debug模式下发送的请求参数, 右边是在postman中请求的接口参数。 左边报错了,右边正常返回 "image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20240929/c6edeb3f694a9cfedeceb01c6a26fd0d.png) chatGPT GPTs中完整的报错信息如下: { "response_data": { "error": { "type": "INVALID_REQUEST_UNKNOWN", "message": "Invalid request: parameter validation failed. Check your request data." } }, "status_code": 422, "action_id": "g-fc4f5e0f9d61f1dd099ec4da991b56ab2e66012b" }
0
1
0
浏览量205
sssssjkl

React里使用Select组件的Onchange无法获取全局变量的值,怎么解决?

import React, { useRef, useState, useEffect, useCallback } from 'react'; import { Button, Card, Modal, Result, Progress, Space, Upload, Form, Popconfirm, Select, Input } from 'antd'; import { FileExcelOutlined } from '@ant-design/icons'; import { authService } from '@apps/services'; import { getDemandStoreGetShelvesImportTemplate, postSupportDictTypeList } from '@apps/apis'; import styles from './equipment.less'; const Equipment = (props) => { const { fetchdata, currentRef } = props; const [form] = Form.useForm(); const [importModal, setImportModal] = useState(false); const [modalStep, setModalStep] = useState(0); const { accessToken, memberId, memberRoleId } = authService.getAuth() || {}; const [step1DescriptState, setStep1DescriptState] = useState(null); const [exceptionContent, setExceptionContent] = useState(''); const [exceptionCheck, setExceptionCheck] = useState(false); // 默认无异常 const [loading, setLoading] = useState(false); const [tdata, settdata] = useState([]); const ref = useRef({}); const [storeShelvesListbrand, setstoreShelvesListbrand] = useState([]); const [storeShelvesListregion, setstoreShelvesListregion] = useState([]); const [storeShelvesListshelvesType, setstoreShelvesListshelvesType] = useState([]); useEffect(() => { const fetchData = async () => { const params = { dictTypes: ['storeShelvesListbrand', 'storeShelvesListregion', 'storeShelvesListshelvesType'] }; const res = await postSupportDictTypeList(params, { ctlType: 'none' }); if (res.code === 1000) { const brandList = [], regionList = [], shelvesTypeList = []; res.data.forEach((ele) => { if (ele.dictType === 'storeShelvesListbrand') { ele.dictDataList.forEach((ele2) => { brandList.push({ value: ele2.dictValue, label: ele2.dictLabel }); }); setstoreShelvesListbrand([...brandList]); } else if (ele.dictType === 'storeShelvesListregion') { ele.dictDataList.forEach((ele2) => { regionList.push({ value: ele2.dictValue, label: ele2.dictLabel }); }); setstoreShelvesListregion([...regionList]); } else if (ele.dictType === 'storeShelvesListshelvesType') { ele.dictDataList.forEach((ele2) => { shelvesTypeList.push({ value: ele2.dictValue, label: ele2.dictLabel }); }); setstoreShelvesListshelvesType([...shelvesTypeList]); } }); } }; fetchData(); }, []); useEffect(() => { if (fetchdata.length > 0) { settdata([...fetchdata]); } }, [fetchdata]); const onCellChange = useCallback((value, type, idx) => { const newData = [...tdata]; if (type === 1) { newData[idx]['brandKey'] = value; const brand = storeShelvesListbrand.find(ele => ele.value === value); newData[idx]['brand'] = brand ? brand.label : ''; } else if (type === 2) { newData[idx]['regionKey'] = value; const region = storeShelvesListregion.find(ele => ele.value === value); newData[idx]['region'] = region ? region.label : ''; } else if (type === 3) { newData[idx]['shelvesTypeKey'] = value; const shelvesType = storeShelvesListshelvesType.find(ele => ele.value === value); newData[idx]['shelvesType'] = shelvesType ? shelvesType.label : ''; } settdata(newData); }, [tdata, storeShelvesListbrand, storeShelvesListregion, storeShelvesListshelvesType]); const defaultColumns = [ { title: '品牌', dataIndex: 'brand', render: (text, record, index) => ( onCellChange(value, 1, index)} options={storeShelvesListbrand} /> ) }, { title: '区域', dataIndex: 'region', render: (text, record, index) => ( onCellChange(value, 2, index)} options={storeShelvesListregion} /> ) }, { title: '器架类型', dataIndex: 'shelvesType', render: (text, record, index) => ( onCellChange(value, 3, index)} options={storeShelvesListshelvesType} /> ) }, { title: '数量', dataIndex: 'num', render: (text, record, index) => ( onCellChange(e.target.value, 3, index)} /> ) }, { title: '操作', dataIndex: 'action', render: (_, record) => ( handleDelete(record.id)} > 删除 ), } ]; const handleCancel = () => { setImportModal(false); setModalStep(0); setExceptionCheck(false); setExceptionContent(''); }; const modalLoadTemplate = () => { let a = document.createElement('a'); document.body.appendChild(a); a.style = 'display: none'; getDemandStoreGetShelvesImportTemplate({}, { responseType: 'blob', getResponse: true }).then((res) => { const { response } = res; const filename = response.headers.get('content-disposition').split('=')[1]; let blob = new Blob([response.data], { type: 'application/vnd.ms-excel' }); const url = window.URL.createObjectURL(blob); a.href = url; a.download = filename.replaceAll('"', ''); a.click(); window.URL.revokeObjectURL(url); }); }; const step0Description = ( 点击下载 EXCEL文件模板 下载模板 按照模板整理器架信息资料 点击导入按钮,导入整理好的器架信息资料 单次最多导入1000条,文件大小不能超过10M ); const step1Exception = ( 存在错误格式数据,已生成错误日志 请导出错误日志修正数据后再次导入 ); const exportErrorLog = () => { download_txt('log.txt', exceptionContent); setModalStep(0); setImportModal(false); }; const importProps = { name: 'file', action: '/api/demand/store/importStoreShelves', headers: { Accesstoken: accessToken }, showUploadList: false, maxCount: 1, className: styles.importBtn, onChange(info) { setLoading(true); if (info.file.status === 'done') { setModalStep(1); setExceptionContent(info.file.response.message); if (info.file.response.code === 1000) { setExceptionCheck(false); setStep1DescriptState(step1DescripSuccess); settdata(info.file.response.data); } else { setExceptionContent(info.file.response.message); setExceptionCheck(true); setStep1DescriptState(step1Exception); } setLoading(false); } else if (info.file.status === 'error') { setLoading(false); } }, }; useEffect(() => { currentRef.current = { get: () => new Promise((resolve) => { resolve({ state: true, name: 'equipment', data: tdata }); }), }; }, [tdata]); return ( setImportModal(true)}>Excel导入 fetchData(params)} /> {modalStep === 0 && ( } title={step0Description} extra={ 上传 } /> )} {modalStep === 1 && !exceptionCheck && ( } title={step1DescriptState} /> )} {modalStep === 1 && exceptionCheck && ( } title={step1Exception} extra={导出错误日志} /> )} ); }; export default Equipment;
0
0
0
浏览量0

履历