sssssjkl
vue 3.0 +axios 跨域情况下无法携带cookie?
"withCredentials" 的意思是带上本地 cookie;CORS 头的意思也是告知浏览器发起请求的时候可以携带 cookie。
"setCookie" 是服务器返回的响应头要求设置 cookie。
这俩不是一个方向。
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忽略全部证书验证,但是这样不太合适,请问是否有其他解决方案?
sssssjkl
后端为何不直接提供sql能力给前端?
前端是客户端 ,客户是一种比测试同学骚操作还多的生物。
比如说我想查应用信息,想关联出来应用下所有的服务,应用下所有的成员。我应该怎么知道有哪些表呢?
在签到的或者充值的时候,直接大手一挥。
sssssjkl
unocss 如何配置针对某个 dataset 的元素生效样式?
unocss 配置 "prefix" 后 className 显得有点长了,我希望只加一个 "data-uno" 来让 unocss 生效,而不是每个
className 都添加前缀。
请问有办法做到这种效果吗?
不生效:
生效:
sssssjkl
现有两开关电源,分别为反激式(脉冲调制)、固定负载功率式(非脉冲调制),规定采样频率<500KHz,且两种电源功率同等(如200W)的情况下,在220V端 是否可以通过电压或电流波形区分上述两种电源?
电流波形分析或者用电压波形分析,其他途径的话可以用 频谱分析、效率分析、温度分析
sssssjkl
做好的项目部署上线后,在服务器上拷贝地址到另一台服务器(同一局域网下),为何报错不显示?
"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241228/710df7b4afd1bbf5642bc2db5fb5d885.png)
报错http://assets.msn.cn/bundles/v1/edgechromium/latest/vendors
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
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
}
sssssjkl
AMH面板 》防火墙配置》常规禁止设置》勾选禁止内地,为什么不生效?
使用AMH面板,防火墙配置》常规禁止设置》勾选禁止内地,没有生效,是哪里还需要设置吗?
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:指的是事务等待获取资源等待的最长时间,超过这个时间还未分配到资源则会返回应用失败
sssssjkl
为什么使用链接法解决冲突中删除元素的时间复杂度可以是O(1)?
你主观上将"删除"和"查找"两个动作结合了。
这块的"删除"应该这样理解,当前已经拿到了具体的要删除的元素,现在要从线性表中将其移除。
* 链表只需修改指针即可,故O(1);
* 数组在清除数据后,(当需要时)还需移动后续元素以保持连续,故O(N)。
sssssjkl
为什么我vue组件已经写好了,但就是在htm中使用不了。浏览器也没有报错,这是为什么???
你是不是少引用了什么文件啊?你看看打包好后的html文件里是怎么引用的先。
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;
}
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值配置或者路由信息配置
请求大佬指教🫡🫡🫡
sssssjkl
Java中如何在导出CSV时,同时使用单引号及双引号?
我正在编写一个 Java 应用程序以将数据从 Oracle 导出到 csv 文件
但行上的某些数据可能如下所示:
"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241205/5c42b3c200a89e60d811a157288ce7f3.png)
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
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)
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)
sssssjkl
纵向展示的文字溢出如何通过 css 显示省略号?
如下 "demo", 纵向展示时,横向溢出省略的方案不适用,还有其他的 css 解决方案没?
overflow: hidden;
text-overflow: ellipsis;
"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241128/b88f9da9a4fdc036a5bb85cbbfcda66e.png)
sssssjkl
我用useModel 有个useState数据更新了 为什么在组件里面useEffect监听不到?
破案了 我拿到新数据后将旧数据修改了,旧数据和新数据一样了,cloneDeep也没用,在组件里不会触发effect,在model里可以触发
"测试代码" (https://link.segmentfault.com/?enc=mq7NFvK6bLZUYSdv7f7IVg%3D%3D.wbh310lT8KSodKuum3MKBhraQ0EpP%2FuwMJH8hMuC0GoOH8Oj3Ch%2BgcVzW4KeLOD5uUS7KHXVyl7n0bqH9WKY49tVfYMiHBRe8%2F%2FxXrdsbR8%3D)
sssssjkl
使用webpack4将vue2项目打包成lib会进行tree-shaking吗?
应该是不会进行tree shaking的,因为tree shaking是基于ES
module的静态分析来消除无用的JS,Webpack不支持直接打包为es6,所以无法使用tree shaking
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。
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);
});
sssssjkl
JavaScript 获取字符数统计方法?
"思否问答:【如何计算 javascript
中带有表情符号的字符串的正确长度?】" (https://segmentfault.com/q/1010000043069823)。
虽然机翻的味道很浓。
sssssjkl
el-table控件在全面屏手机上横向滚动失效的解决方案?
这个问题可以通过手机浏览器设置解决。亲测有效!
sssssjkl
在vue项目中如何将自己开发的组件放到当前项目中的node_modules包中呢?放进去的组件版本号如何设置呢?
在vue项目中如何将自己开发的组件放到当前项目中的node_modules包中呢?放进去的组件版本号如何设置呢?https://wmlx-new-image.oss-cn-shanghai.aliyuncs.com/images/20241110/4b2f8148c1b37a3dfbe74d1d581dd6db.png
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;
}
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;
}
需要参数
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了
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
sssssjkl
在amh部署one-api项目后,one-api日志提示数据库链接不上?
看你用的tcp 3306端口连接的mysql,
考虑安全amh的mysql默认是没监听端口的,仅本地sock连接。
要用端口连接,到数据库管理的『参数配置』开启监听。
amh也支持多个mysql同时运行,不同的mysql你也可以监听不同的端口。
sssssjkl
rollup打包,如何处理 Symbol.toPrimitive ?
首先,Symbol 是 Es6 引入的类型,如果不加 polyfill,那么在不支持 Es6 的环境下,不能正常运行。
如果不想打包为 Es5 的版本,可以检查 babel 的相关配置。
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;
});
这样写了调试了还没效果。麻烦大佬们帮我看看
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
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)
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)
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,以此类推),在渲染部分外加一个判断。
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中显示参数信息,那么可以通过更新文档中提到的这些方式来操作。
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)
sssssjkl
ubuntu 怎么删除像nginx这样的全局命令?
执行 "hash -r" 清空缓存
"hash -l"查看缓存列表
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()
}
})
})
}
})
sssssjkl
有比较推荐的基于Vue的即时通讯开源插件吗?
轻量化一点,不用太复杂的
sssssjkl
Vscode和Idea的快捷键,采用哪套比较好?
因工作需要,我需要同时使用vscode和idea。它们的快捷键,我想调成一样的,切换起来方便点。
调成哪一套比较好?vscode还是idea。
感觉它们2个的快捷键思路不一样。idea似乎是适合一手键盘一手鼠标,vscode则是双手键盘。
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开启了,控制台没有任何打印
不知道哪个环境出了问题
sssssjkl
想使用qt写一个较为复杂的多线程程序的话,尝试哪种比较好?
使用moveToThread, 线程间交互用信号和槽, 如果不用会发现程序可能不会跑在多线程上
如果遇到多个线程配合的流程自己实现一个队列来控制这个流程
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 环境?
sssssjkl
在uniapp 中引入生成条形码的插件,但是页面上无法使用,是为什么?
你位置是不是错了
"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20240929/d032ba754656cb024242419528a56993.png)
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)
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"
}
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;