卑微实习僧
推荐一个发布npm包的工具?
可以在 "package.json" 中的 "scripts" 下添加一个脚本命令,示例如下:
{
"scripts": {
"release": "npm run build && npm publish"
}
}
也可以根据需要加上其他命令,例如更新版本号:
npm version [ | major | minor | patch | premajor | preminor | prepatch | prerelease | from-git]
然后执行 "release" 即可
npm run release
卑微实习僧
JS 可否使用字符串传输文件?
用Blob对象:
function stringToBlob(str, contentType) {
return new Blob([new Uint8Array([...str].map(ch => ch.charCodeAt(0)))], { type: contentType });
}
const blob = stringToBlob(textData, 'application/zip');
const url = URL.createObjectURL(blob);
用ArrayBuffer和DataView来控制二进制数据的读写:
function stringToArrayBuffer(str) {
const buffer = new ArrayBuffer(str.length);
const view = new DataView(buffer);
for (let i = 0; i < str.length; i++) {
view.setUint8(i, str.charCodeAt(i));
}
return buffer;
}
const buffer = stringToArrayBuffer(textData);
修复ISO-8859-1编码:
function encodeIso8859_1(arrayBuffer) {
const uint8Array = new Uint8Array(arrayBuffer);
return String.fromCharCode(...uint8Array);
}
function decodeIso8859_1(str) {
const uint8Array = new Uint8Array(str.length);
for (let i = 0; i < str.length; i++) {
uint8Array[i] = str.charCodeAt(i);
}
return uint8Array.buffer;
}
卑微实习僧
如何从一级路由访问二级路由上的设备?
如图所示,要如何设置,从一级路由访问二级路由上的设备。
https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241230/f381ccc6aa015b8596ad590ef34c02f0.png
卑微实习僧
命令行npm create vue@latest创建的vue3+ts项目能运行成功,但是为什么会出现各种警告?
"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241225/4b01ed6191702e5b761996fe53163db7.png)
"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241225/6731b121859cdbdfb09e717d0459b710.png)
"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241225/edeca031f3f5da74f177f4b0ba03c0c4.png)
"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241225/7a537f49063d32042c9f6a5fd151f5d9.png)
"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241225/a45e9f8be58fe3f71514fe36f8c87b29.png)
"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241225/9b49602118059a56ac4b87b18c89bb99.png)
卑微实习僧
请问前端如何选择目录进而得到路径呢?
拿不到完整路径,因为隐私和安全问题。
选择文件/文件夹获取到的是一个虚拟路径或者说是一个短目录。
«注意事项:当使用 "" 选择文件时,出于明显的安全原因,源文件的实际路径没有显示在 "input" 的
"value" 属性中。实际上显示了文件名,并用 "C:\fakepath\"
附加在路径的开头。这种怪癖有一些历史原因,但它在所有现代浏览器中都受到支持,而且实际上"在规范中也有定义" (https://link.segmentfault.com/?enc=0YSzPsIE8Y2%2B9rQVuHiVKA%3D%3D.%2B15HrCCY%2B0LyShL2%2F%2FTho5Nz27Mf1MXeyx0nNIGIVDayflIVjGzFi1ud5Qha1Br6zzaOslDROnUU2RqX15b8VAxtrGeCoMtJi%2FxRCjM%2FnGI%3D)。»
" - HTML(超文本标记语言) | MDN" (https://link.segmentfault.com/?enc=%2Bl1%2ByCy8qyBc7Ks2s%2FUwDg%3D%3D.x9ysS4LiafIg1geGt%2Fs42zTSSWdGeI51c9d%2BBvbAL0OtTtVo9uWewhuJjQWBtB77bo7cZHuMt7uPR5bQpRgyGOZ4ZkLeeOcMA6ahMGUkCOw%3D)
«特别提醒:假设文件路径是 "C:\f1\f2\f3\file.txt", 用户选择的是 f1 文件夹,则 Chrome、Firefox、Edge
都能正确返回 "f2/f3/file.txt" 值。而国产的 QQ 浏览器、360 浏览器、UC 浏览器、搜狗浏览器都只能返回
"f3/file.txt"。也就是国产浏览器调用 "webkitRelativePath" 返回的结果都不会是你希望得到的路径,请注意使用时的细微差距。»
"File.webkitRelativePath - Web API 接口参考 | MDN" (https://link.segmentfault.com/?enc=0gifamwU24wmofUe%2Fks%2BnQ%3D%3D.GhzxRhezlIYb%2FyY8mREKf42ZkvhQ%2FLjjJRq23yLMm558uOcab9zjJ%2BqaAh%2BEOScj8XVC8xqdyDR4FqGOY4ifK36bZFlg8XtQ4cGN9iZh3%2Bs%3D)
卑微实习僧
我做了个纯html页面的网站,怎么让客户在本地浏览?
用户直接双击HTML文件就可以了,但是记得JS文件和CSS文件引入都得是相对路径的方式。
或者说直接让用户的账户注册一个有静态Web托管服务的平台。让后把HTML页面推送上去客户就可以看到了。
卑微实习僧
请问现在最新的小程序 是不是不能直接通过任何接口获取用户昵称了,只能靠用户手动填写么 ?
getUserInfo和getUserProfile
不管是上面哪种方法,都不行了,只能靠用户自己填写用户昵称吗?
现在一般大家都是如何处理的,
卑微实习僧
markdown编辑器中关于图片删除是如何处理的?
如题
比如我写文章的时候插入了两张图片A和B
编辑的时候,删除了图片B
后端如何知道删除的图片?从而将图片数据从数据库删除和图片文件从ftp删除?
通过前端提交的文本中图片的连接,和数据库的对比获取?
卑微实习僧
开发后台的时候,在使用element-ui的情况,还可以使用ant-design-vue中的组件吗?
可以啊,我刚开始写前端的时候用weui+antd-mobile去写的😂😂😂,只是代码写的有点丑,打包出来大了一些。
现在都是按需打包了,查一下按需编译的怎么用你说的那个组建
卑微实习僧
Win10 鼠标重影?
如果不是硬件问题(比较显卡拖影之类的),那就可能是 Windows 设置。在控制面板设置里找到鼠标设置,或者直接运行
"main.cpl",取消「显示指针轨迹」
"snipaste_2023-10-16_09-46-23.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241208/9cb50467e316defd148926e555725c6a.png)
卑微实习僧
css有没有办法实现斑马线的边框样式?
使用CSS Paint API,想要什么就有什么
demo:"https://houdini.how/" (https://link.segmentfault.com/?enc=rTp1iufOG5xy4ztfKvTR1Q%3D%3D.GO%2B3QAMgwnlmKkwaXMXf0z2xVvXZaq0WYAl6jcaHx%2Bw%3D)
卑微实习僧
无法把protoc编译为js,win11 提示缺少运行库?
你可以使用windows子系统WSL2或者windows的hyper-v虚拟机,通过linux编译protobuf
不推荐使用windows哈。
缺少dll可以去这里找:"https://www.dll-files.com/" (https://link.segmentfault.com/?enc=uX5hytHjfKuxTv5HngXwbA%3D%3D.6o1VvnBsagQlA0SDc4SyhsCaecTzIh3G%2FvPPdY9b57s%3D)
卑微实习僧
vscode 如何配置浏览器插件开发的提示?
浏览器插件开发中会用到 chrome 等这些对象,如何让 vscode 有这些对象的提示,有没有对应的类型库可以安装
卑微实习僧
爬虫爬取到标签内容有时为空有时正常,请问怎么解决?
在爬取人民网领导留言板数据时,在留言详情页面按照xpath提取留言时间的信息,但是有的留言可以提取出时间,有的留言提取出来是空,看起来非常随机,不明白这是为什么...当提取时间内容为空时,反复提取十几次,有时候是三十几次,又可以提取出来,不知道这是为什么?应该如何解决呢
此外不知道大家还有没有什么可以提高爬取速度的修改建议,或者可以实现爬取一部分存储一部分,中断后可以继续爬取不用从头再来的修改建议,希望能指点一下
问题图片:
"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241127/5bf11d4aa9074896a36ff37997a24c01.png)
代码图片:
"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241127/9415a3f4e013879df7762e2be384d6ea.png)
网页网址:
"https://liuyan.people.com.cn/threads/list?fid=539" (https://link.segmentfault.com/?enc=9C%2FZo16TAHJede8rCW9xDQ%3D%3D.71JojNWSrwDkI6YSZUmnGeVT6qJLwFk53Y1vI%2BhUbw7Bos5wYEftk75PIKJYZdC7VFWcG5jsKy2HP64ftRM6AQ%3D%3D)
代码为:
# !/user/bin/env python3
# -*- coding: utf-8 -*- # 多进程版本
import csv
import os
import random
import re
import time
import traceback
import dateutil.parser as dparser
from random import choice
from multiprocessing import Pool
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.chrome.options import Options
from selenium.common.exceptions import TimeoutException
# 时间节点
start_date = dparser.parse('2023-11-01')
# 浏览器设置选项
chrome_options = Options()
chrome_options.add_argument('blink-settings=imagesEnabled=false')
def get_time():
'''获取随机时间'''
return round(random.uniform(3, 6), 1)
def get_user_agent():
'''获取随机用户代理'''
user_agents = [
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)",
"Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
"Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)",
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)",
"Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)",
"Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)",
"Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0",
"Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5",
"Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20",
"Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER",
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; LBBROWSER)",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E; LBBROWSER)",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 LBBROWSER",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)",
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; QQBrowser/7.0.3698.400)",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SV1; QQDownload 732; .NET4.0C; .NET4.0E; 360SE)",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)",
"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1",
"Mozilla/5.0 (iPad; U; CPU OS 4_2_1 like Mac OS X; zh-cn) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5",
"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b13pre) Gecko/20110307 Firefox/4.0b13pre",
"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:16.0) Gecko/20100101 Firefox/16.0",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11",
"Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10",
"MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
"Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1",
"Mozilla/5.0 (Linux; Android 5.1.1; Nexus 6 Build/LYZ28E) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.23 Mobile Safari/537.36",
"Mozilla/5.0 (iPod; U; CPU iPhone OS 2_1 like Mac OS X; ja-jp) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.1 Mobile/5F137 Safari/525.20",
"Mozilla/5.0 (Linux;u;Android 4.2.2;zh-cn;) AppleWebKit/534.46 (KHTML,like Gecko) Version/5.1 Mobile Safari/10600.6.3 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)",
"Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"
]
# 在user_agent列表中随机产生一个代理,作为模拟的浏览器
user_agent = choice(user_agents)
return user_agent
def get_fid():
'''获取所有领导id'''
with open('省级领导.txt', 'r') as f:
content = f.read()
fids = content.split()
return fids
def get_detail_urls(position, list_url):
'''获取每个领导的所有留言链接'''
print("get_detail_Url开始")
user_agent = get_user_agent()
chrome_options.add_argument('user-agent=%s' % user_agent)
drivertemp = webdriver.Chrome(options=chrome_options)
drivertemp.maximize_window()
drivertemp.get(list_url)
print("在detail函数中temp 打开了网页")
time.sleep(2)
tids = []
# 建言:循环加载页面
while True:
try:
next_page_button = WebDriverWait(drivertemp, 15, 2).until(EC.element_to_be_clickable((By.CLASS_NAME, "mordList")))
datestr = WebDriverWait(drivertemp, 10).until(lambda driver: driver.find_element(By.XPATH, '//*[@class="replyList"]/li[last()]/div[2]/div[1]/p')).text.strip()
datestr = re.search(r'\d{4}-\d{2}-\d{2}', datestr).group()
date = dparser.parse(datestr, fuzzy=True)
print('爬取detailurl --', position, '--', date)
# 模拟点击加载
if date > start_date:
next_page_button.click()
else:
break
except TimeoutException:
'''有时候网不好会超时,这时候就重新再访问一次'''
drivertemp.quit()
get_detail_urls(position, list_url)
time.sleep(get_time())
message_elements_label1 = drivertemp.find_elements(By.XPATH, '//div[@class="headMainS fl"]//span[@class="t-mr1 t-ml1"]')
for element in message_elements_label1:
tid = element.text.strip().split(':')[-1]
tids.append(tid)
# 投诉/求助:循环加载页面
WebDriverWait(drivertemp, 50, 2).until(EC.element_to_be_clickable((By.ID, "tab-second"))).click()
while True:
try:
next_page_button = WebDriverWait(drivertemp, 50, 2).until(EC.element_to_be_clickable((By.CLASS_NAME, "mordList")))
datestr = WebDriverWait(drivertemp, 10).until(lambda driver: driver.find_element(By.XPATH, '//*[@class="replyList"]/li[last()]/div[2]/div[1]/p')).text.strip()
datestr = re.search(r'\d{4}-\d{2}-\d{2}', datestr).group()
date = dparser.parse(datestr, fuzzy=True)
print('爬取detailurl --', position, '--', date)
# 模拟点击加载
if date > start_date:
next_page_button.click()
else:
break
except TimeoutException:
'''有时候网不好会超时,这时候就重新再访问一次'''
drivertemp.quit()
get_detail_urls(position, list_url)
time.sleep(get_time())
message_elements_label2 = drivertemp.find_elements(By.XPATH, '//div[@class="headMainS fl"]//span[@class="t-mr1 t-ml1"]')
for element in message_elements_label2:
tid = element.text.strip().split(':')[-1]
tids.append(tid)
# 咨询:循环加载页面
WebDriverWait(drivertemp, 50, 2).until(EC.element_to_be_clickable((By.ID, "tab-third"))).click()
while True:
try:
next_page_button = WebDriverWait(drivertemp, 50, 2).until(EC.element_to_be_clickable((By.CLASS_NAME, "mordList")))
datestr = WebDriverWait(drivertemp, 10).until(lambda driver: driver.find_element(By.XPATH, '//*[@class="replyList"]/li[last()]/div[2]/div[1]/p')).text.strip()
datestr = re.search(r'\d{4}-\d{2}-\d{2}', datestr).group()
date = dparser.parse(datestr, fuzzy=True)
print('爬取detailurl --', position, '--', date)
# 模拟点击加载
if date > start_date:
next_page_button.click()
else:
break
except TimeoutException:
'''有时候网不好会超时,这时候就重新再访问一次'''
drivertemp.quit()
get_detail_urls(position, list_url)
time.sleep(get_time())
message_elements_label3 = drivertemp.find_elements(By.XPATH, '//div[@class="headMainS fl"]//span[@class="t-mr1 t-ml1"]')
for element in message_elements_label3:
tid = element.text.strip().split(':')[-1]
tids.append(tid)
# 获取所有链接
print(position+"的tid列表为"+str(tids))
for tid in tids:
detail_url ="https://liuyan.people.com.cn/threads/content?tid={}".format(tid)
yield detail_url
drivertemp.quit()
def get_message_detail(driver, detail_url, writer, position):
'''获取留言详情'''
print("get_message函数开始")
print('正在爬取留言 --', position, '--', detail_url)
driver.get(detail_url)
print("打开某一个detail_url"+detail_url)
# 获取留言各部分内容
print("开始获取留言具体内容")
'''.find_elements()没有.text或者.get_attribute的属性,只能用.find_element()'''
try:
# 1留言时间
message_date_temp = WebDriverWait(driver, 5).until(lambda driver: driver.find_element(By.XPATH, '//li[@class="replyMsg"]/span[2]')).text
print("获取到时间temp为"+message_date_temp)
message_date = re.search(r'\d{4}-\d{2}-\d{2}', message_date_temp).group()
print("留言时间为"+message_date)
message_datetime = dparser.parse(message_date, fuzzy=True)
'''
if message_datetime < start_date:
return
'''
# 2留言标题
message_title = WebDriverWait(driver, 2.5).until(lambda driver: driver.find_element(By.XPATH, '//div[@class="replyInfoHead clearfix"]//h1[@class="fl"]')).text.strip()
print("留言标题为"+message_title)
# 3留言类型:建言、投诉、咨询
message_type = WebDriverWait(driver, 2.5).until(lambda driver: driver.find_element(By.XPATH,'//p[@class="typeNameD"]')).text.strip()
print("留言类型为"+message_type)
# 4留言标签:城建、医疗、...
message_label = WebDriverWait(driver, 2.5).until(lambda driver: driver.find_element(By.XPATH,'//p[@class="domainName"]')).text.strip()
print("留言标签为"+message_label)
# 5留言状态:已回复、已办理、未回复、办理中
message_state = WebDriverWait(driver, 2.5).until(lambda driver: driver.find_element(By.XPATH,'//p[@class="stateInfo"]')).text.strip()
print("留言状态为"+message_state)
# 6留言内容
message_content = WebDriverWait(driver, 2.5).until(lambda driver: driver.find_element(By.XPATH, '//div[@class="clearfix replyContent"]//p[@id="replyContentMain"]')).text.strip()
print("留言内容为"+message_content)
try:
# 7回复内容
reply_content = WebDriverWait(driver, 2.5).until(lambda driver: driver.find_element(By.XPATH, '//div[@class="replyHandleMain fl"]//p[@class="handleContent noWrap sitText"]')).text.strip()
print("回复内容为" + reply_content)
# 8回复时间
reply_date_temp = WebDriverWait(driver, 2.5).until(
lambda driver: driver.find_element(By.XPATH, '//div[@class="handleTime"]')).text
reply_date = re.search(r'\d{4}-\d{2}-\d{2}', reply_date_temp).group()
print("回复时间为" + reply_date)
# 9回复机构
reply_institute = WebDriverWait(driver, 2.5).until(
lambda driver: driver.find_element(By.XPATH, '//div[@class="replyHandleMain fl"]/div/h4')).text.strip()
print("回复机构为" + reply_institute)
except:
print("这是一条无回复留言,url为 "+str(detail_url))
reply_content = ""
print("回复内容赋值为空")
reply_date = ""
print("回复时间赋值为空")
reply_institute = ""
print("回复机构赋值为空")
# 存入CSV文件
writer.writerow([position, message_title, message_type, message_label, message_datetime, message_content, reply_content, reply_date,reply_institute])
except Exception as e:
print(f"An error occurred: {str(e)}")
# 页面加载失败,刷新页面
driver.refresh()
# get_message_detail(driver, detail_url, writer, position)
time.sleep(3) # 等待5秒,或根据需要进行调整
def get_officer_messages(args):
'''获取并保存领导的所有留言'''
print("get_officer_messagages开始执行")
user_agent = get_user_agent()
chrome_options.add_argument('user-agent=%s' % user_agent)
driver = webdriver.Chrome(options=chrome_options)
index, fid = args
list_url = "http://liuyan.people.com.cn/threads/list?fid={}".format(fid)
driver.get(list_url) #浏览器中加载url
try:
position = WebDriverWait(driver, 10).until(lambda driver: driver.find_element(By.XPATH, "/html/body/div[1]/div[2]/main/div/div/div[2]/div/div[1]/h2")).text
print(index, '-- officer --', position)
start_time = time.time()
csv_name = str(fid) + '.csv'
# 文件存在则删除重新创建
if os.path.exists(csv_name):
os.remove(csv_name)
with open(csv_name, 'a+', newline='', encoding='gb18030') as f:
writer = csv.writer(f, dialect="excel")
writer.writerow(['职位', '留言标题', '留言类型', '留言标签', '留言日期', '留言内容', '回复内容', '回复日期', '回复人'])
for detail_url in get_detail_urls(position, list_url):
get_message_detail(driver, detail_url, writer, position)
time.sleep(get_time())
end_time = time.time()
crawl_time = int(end_time - start_time)
crawl_minute = crawl_time // 60
crawl_second = crawl_time % 60
print(position, '已爬取结束!!!')
print('该领导用时:{}分钟{}秒。'.format(crawl_minute, crawl_second))
driver.quit()
time.sleep(5)
except:
driver.quit()
get_officer_messages(args)
def main():
'''主函数'''
fids = get_fid()
print('爬虫程序开始执行:')
s_time = time.time()
# 处理传入的参数,使之对应索引合并并且可迭代
itera_merge = list(zip(range(1, len(fids) + 1), fids))
# 创建进程池
pool = Pool(3)
# 将任务传入进程池并通过映射传入参数
pool.map(get_officer_messages, itera_merge)
print('爬虫程序执行结束!!!')
e_time = time.time()
c_time = int(e_time - s_time)
c_minute = c_time // 60
c_second = c_time % 60
print('{}位领导共计用时:{}分钟{}秒。'.format(len(fids), c_minute, c_second))
if __name__ == '__main__':
'''执行主函数'''
main()
卑微实习僧
tsconfig.vitest.json 别名配置?
"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241123/3b46a8ae23407ee51b2183e3ee6d699a.png)
"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241123/65496810f875df5f8997cb9e0523ddf5.png)
{
"exclude": [
"node_modules",
"dist",
"**/*.md"
],
"compilerOptions": {
"module": "esnext",
"moduleResolution": "bundler",
"esModuleInterop": true,
"ignoreDeprecations": "5.0",
"composite": true,
"lib": [],
"types": [
"node",
"jsdom"
],
"baseUrl": ".",
"paths": {
"@/*": [
"src/*",
],
}
}
}
这是我现在的配置。
要怎么配置才行呢?
"vue": "^3.2.45",
"vite": "^4.4.9",
"typescript": "~5.2.2",
卑微实习僧
在前端遇到的小问题??
用的vue3 和element plus,在代码中
const find = async () => {
const res = await axios.put('http://localhost:8080/travel/find/' + id);
categorys.value = res.data.data;
console.log(res.data.data);
const code = res.data.data[0].ydcode;
localStorage.setItem('code', code);
// console.log(categorys.value.id)
// console.log(code.ydcode);
};
find();
console.log(localStorage.getItem('code'));
const code1 = localStorage.getItem('code');
console.log(code1);
const flag = code1 == 1 ? true : false;
console.log(flag);
每次code1获取到的值都是上一次存入的值,网上搜说是因为异步的关系,具体应该怎么修改请大佬指导!
卑微实习僧
window.postMessage 可以跨域传递不能被序列化的数据吗?
如题
mdn 上介绍 window.postmessage 传递的 message 是它将会被结构化克隆算法 (en-US)序列化。
那么对于复杂对象,对于Error以及Function等是不能传递的,会导致克隆数据出错。
那有没有什么办法可以传递这类不能结构化的数据?
卑微实习僧
MYSQL如何在某一列中存储多值类数据,如多个用户id?
问题背景
MySQL中有三个表,分别是“题库表”、“错题表”和“用户表”,现在需要实现不同用户存储不同的错题,不同用户存储的错题可能会重复,同一用户错题不会重复
请问MySQL中如何想在某一列中存储多值类数据,如多个用户id,应该如何设置表结构及类型?
卑微实习僧
如何在Java中实现调用B接口时监听A接口执行状态?
Java
想实现调用B接口时,监听A接口是否已经执行完成
调用B接口时,能监听到A有没有执行完
卑微实习僧
java怎么处理服务订阅到期?
不借助中间件的话。参考Redis中Key过期策略,定期删除+惰性删除。当然这是面对数据量可能比较大时,采用的策略。
单纯订阅逻辑,也可以采用不记录状态,改成状态动态计算方式。即 数据库记录一个订阅结束时间,每次查询时跟当前时间做下比较。
另外,还可以借助第三方中间件来实现。如RabbitMQ,使用其死信队列方式,来完成该功能。大概思路就是,有新订阅时,发送一个带过期时间的消息,当消息到期后会转发至配置的交换机然后再进入指定队列,消费消息再去库中查询并做相应操作。
***
不过技术实现要综合考虑,假设数据量不太多,单纯的采用数据库扫表,每隔5秒扫描一次也可。再假设业务层次对时间没那么敏感,每天凌晨统一扫表处理也没啥问题。再或者说,假如后端就你一人,能实现功能就不错了,还要啥自行车。
卑微实习僧
关于一个从来没做过的css 效果 两行溢出 自动加展开的问题,想请教下大家?
此刻就必须要祭出本站大佬的文章了:"CSS
实现多行文本“展开收起”" (https://segmentfault.com/a/1190000040030723)
开头就是你的痛点:
实现这一类布局和交互难点主要有以下几点:
* 位于多行文本右下角的“展开收起”按钮
* “展开”和“收起”两种状态的切换
* 当文本不超过指定行数时,不显示“展开收起”按钮
卑微实习僧
everywhere 开启中间人读取的时候,如何避免被发现?
"图片.png" (https://wmlx-new-image.oss-cn-shanghai.aliyuncs.com/images/20241104/e383d2874653055663fda65dc8421b2a.png)
«有软件正在阻止 Firefox 安全地连接至此网站
segmentfault.com 很像是一个安全(连接加密)的网站,但我们未能与它建立安全连接。这个问题是由 Fiddler Root
Certificate Authority 所造成,它是您的计算机或您所在网络中的软件。
您可以做什么?
segmentfault.com 启用了被称为
HTTP严格传输安全(HSTS)的安全策略,Firefox只能与其建立安全连接。您无法为此网站添加例外,以访问此网站。
·如果您的防病毒软件包含扫描加密连接的功能(名称通常为"Web 扫描"或"HTTPS 扫描")
,您该考虑禁用该功能。若上述操作无效,您可以尝试卸载并重新安装该防病毒软件,
如果您在使用公司网络,可以联系您的IT 部门以寻求帮助。
·如果您并不熟悉 Fiddler Root Certificate Authority,这可能是一起攻击,无法通过您的操作来访问此网站»
everywhere 开启中间人读取的时候,如何避免被发现
我现在想使用 everywhere 抓包,但访问任何网站都会像上面那样,我需要做什么才能正常访问网站?
"图片.png" (https://wmlx-new-image.oss-cn-shanghai.aliyuncs.com/images/20241104/0ca5491b1a70c94f8ec62e454213c368.png)
***
下面是 chatGPT 的回答
«这个问题是由于 Fiddler Everywhere 根证书(Fiddler Root Certificate
Authority)引起的。这个证书被安装在您的计算机上,并用于拦截和解析 HTTPS 流量。但有些网站启用了被称为HTTP Strict
Transport Security(HSTS)的安全策略,要求浏览器只能通过安全连接访问。为解决这个问题,您可以尝试以下几种方法:1. 禁用或暂时关闭 Fiddler Everywhere: 关闭 Fiddler Everywhere 代理可能会解决这个问题。停止
Fiddler Everywhere 的中间人代理模式后,浏览器可能能够正常访问网站。
2. 卸载或删除 Fiddler Everywhere 根证书: 在操作系统中找到并删除或卸载 Fiddler Everywhere
根证书。这可能需要在操作系统的证书管理工具中进行。
3. 检查并禁用防病毒软件中的 HTTPS 扫描功能: 如果您使用的防病毒软件具有扫描加密连接的功能(通常称为“Web 扫描”或“HTTPS
扫描”),尝试禁用该功能。这可能会影响 Fiddler Everywhere 的拦截行为。
4. 联系网络管理员或技术支持:
如果您在工作环境中,特别是在公司网络中使用计算机,可能需要联系网络管理员或技术支持寻求帮助。有时候,公司网络中的安全策略可能会干扰 Fiddler
Everywhere 的工作。»
«请谨慎操作,并记住,修改系统或删除证书可能对系统安全性产生影响。在做出任何更改之前,最好备份重要的数据,并确保您理解正在执行的操作。»
但是我感觉都在胡扯
* 「禁用或暂时关闭 Fiddler Everywhere」,我要的就是中间人读取,关了 Fiddler 我咋读取?
* 「卸载或删除 Fiddler Everywhere 根证书」这应该会导致 Fiddler 无法正常工作吧?
卑微实习僧
nginx配置多个站点共用80端口,不算端口冲突吗?
你可以想象一下,你有一个邮局,这个邮局只有一个信箱(这个信箱就像服务器上的80端口)。现在,你负责处理两个不同的地方的信件,一个是“A镇”,另一个是“B村”。
每封信件都会写明是发给“A镇”还是“B村”的。所以,就算所有的信都投到同一个信箱(80端口)里,邮局工作人员(就像Nginx服务器)也可以通过查看信件上的地址(这就是server_name,比如
www.aa.com 或 www.bb.com),然后把信分别送到“A镇”或“B村”。
"企业微信截图_17023627641101.png" (https://wmlx-new-image.oss-cn-shanghai.aliyuncs.com/images/20241101/45824eadc322102159f596d0533b11af.png)
卑微实习僧
用户退出登录时JWT的处理方式?
系统后端采用springboot,jwt认证,jwt设置了过期时间,并已实现jwt自动续签功能
请教一下:当用户退出登录时,是直接让前端删除用户jwt还是说后端将退出登录用户jwt添加到黑名单中?以及他们各自的安全性及其他考量?
卑微实习僧
请问vue3+vite怎么实现动态插入svg代码?
1. 直接问题看起来是你要插入 xml,但是 Vue3 帮你把 xml 转换了,所以插入了文本。可以用 "v-html" 来插入,应该就好了。
2. 但是我觉得这里完全不需要插入 svg 源码,有很多引用方式,都更合适
卑微实习僧
有哪些能够提升模型训练速度、提升GPU利用率的组件或方法?
提升模型训练速度和GPU利用率,可以通过多种方法和组件来实现。
1. 优化数据传输 :减少数据从CPU到GPU的传输次数,使用批量传输数据,并使用固定内存(pinned memory)以减少数据传输开销。
2. 使用更大的batch size :增加batch size可以提高GPU的利用率,但需注意避免内存溢出或训练时间增加。
3. 合理分配内存 :确保为每个进程分配适量的内存,避免过度分配导致GPU利用率降低。
4. 优化操作顺序 :确保GPU上执行的操作之前的操作都在CPU上完成,减少CPU和GPU之间的数据传输。
5. 使用优化库 :启用如CUDA显存优化库(CUDNN)等优化库,提高GPU利用率。
6. 多GPU并行计算 :使用"torch.nn.DataParallel"或"torch.nn.parallel.DistributedDataParallel"分布训练任务,提高计算速度和GPU利用率。
7. 使用适当的硬件 :对于大型模型或数据训练,选择更高级别的GPU(如Tesla而非GTX系列)。
8. 注意其他系统资源 :关闭可能占用GPU资源的应用,如浏览器、视频播放器等。
9. 升级PyTorch和CUDA版本 :使用最新版本以获得针对提高GPU利用率的优化。
10. 使用梯度累积 :通过少量的梯度更新模拟更大的batch size,减少显存占用和提高GPU利用率。
11. 动态调整学习率 :使用学习率调度器动态调整学习率,更好地利用显存和GPU计算能力。
12. 分布式训练 :使用分布式训练框架如Horovod,提高整体计算速度和GPU利用率。
13. 监控GPU利用率 :使用工具如"nvidia-smi"或PyTorch的"torch.cuda"模块监控GPU使用情况,找出问题并改进代码。
14. 简化模型和代码 :复杂的模型和代码可能导致计算效率降低,简化它们可以提高效率。
卑微实习僧
van-picker columns属性支持字符串数组吗?
看了下文档 "V1-V3"是支持的,V4是固定格式,不过你可以试试
"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241016/9d005d0cc8202fac46067b0bd77350bd.png)
卑微实习僧
parseInt在ts文件中编译报错?
跟ts有关系吗?js也会报错吧,parseInt针对的是字符串
卑微实习僧
前端项目部署,想要自动检测更新后通知用户刷新页面,但是发版后main.js入口文件不调用为什么?
在掘金看到的监测页面更新的方法,使用了new Worker,直接去请求页面获取etag、last-modified,判断和之前的是否相等,实测可用,定时器时间可以自定。
try {
const worker = new Worker(new URL('./utils/autoUpdate.ts', import.meta.url), {
type: 'module',
});
worker.postMessage({
url: `${window.location.protocol}//${window.location.host}`,
});
worker.onmessage = (e) => {
if (e.data === 1) {
ElMessageBox.alert('页面已更新,点击刷新页面', {
confirmButtonText: '刷新',
showClose: false,
callback: (action: any) => {
window.location.reload();
},
});
}
};
worker.onerror = (err) => {
console.error('->>>err', err);
};
} catch (Err) {
console.error('11111->>>err', Err);
}
utils/autoUpdate.ts
export let previousTimeTag: string | null; // 时间戳,响应头中的tag和last-modified字段之一
let url: string; // 请求的url
let intervalTimer: number; // 轮询的定时器
// 获取当前最新时间戳
async function getTimeTag() {
const res = await fetch(url, {
method: 'HEAD',
cache: 'no-cache',
});
return res.headers.get('etag') || res.headers.get('last-modified');
}
// 判断Tag是否发生变化
async function juede() {
const currentTimeTag: string | null = await getTimeTag();
console.log('currentTimeTag--> ' + currentTimeTag, ' ________ ' + 'previousTimeTag--> ' + previousTimeTag);
if (currentTimeTag !== previousTimeTag) {
intervalTimer && clearInterval(intervalTimer);
self.postMessage(1);
}
}
self.onmessage = function (e): void {
const data = e.data;
if ('url' in data) {
try {
url = data['url'];
(async function () {
// 通过立即执行函数,记录首次请求的时间戳,以便与后面轮询得出的时间戳进行对比
previousTimeTag = await getTimeTag();
intervalTimer && clearInterval(intervalTimer);
// 执行轮询juede函数
intervalTimer = setInterval(juede, 60 * 1000 * 5);
})();
} catch (err) {
console.log('Worker got unknown message:111' + err);
}
} else {
console.log('Worker got unknown message:' + data);
}
};
卑微实习僧
请问在 Vim 中如何跳到某一行首个字符,而不是首个非空字符?
一、问题的起源
我是一名 Vim 的初学者,我碰到一个这样的需求:
复制如下代码的第49行~第51行
"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241015/64c8b06478f651bc44873bb27f5191ad.png)
二、我的操作
1. "49G" 跳转到第49行
2. "v" 进入 Visual Mode
3. "52G" 跳转到52行
4. "y" 进行复制
三、具体问题描述
"NG" 对于行的移动是选中下一行首个非空字符,导致我在复制时会把第52行第一个字母 "i"
也复制进去,如何修改配置文件使其变成第一个字符,而不是非空字符?利用 "Nj" 可以跳到下面第 N 行,但我不想计算相对位置。利用 "0"
也可以跳到该行行首,但多一步比较麻烦。
卑微实习僧
解决子元素浮动到父元素的父元素的问题?
看起来像是初学者,描述的问题阅读起来也比较吃力。
简单来说就是因为:
1. 你的 ".box1" 元素下有两个元素 "p" 标签和 "span" 标签。
2. "p" 是块级元素,所以它会占满整行,导致让 "span" 标签换行到下一行展示。
3. 因为已经换行了,所以你浮动的时候也只是在本行向右浮动。
4. 另外你的 ".box" 元素的高度你设置为了固定的 "35px",文字行高也设置为了 "34px"。
5. 所以 ".box" “看起来” 会在 ".part1" 元素上,但其实它还是在 ".box1" 元素上的只是看起来脱离了 ".box1" 元素。
所以简单的调整就是把你的 "span" 标签移动到 "p" 标签之前就可以了
学院标签
2
"图片.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241014/7c026f8c319b548f7e0ef9fcfb11eb36.png)
卑微实习僧
请教mysql查询时创建中间表的效率问题?
"MySQL子查询(IN)碰到的问题,深入分析" (https://segmentfault.com/a/1190000005742843)
不加 中间表的 IN
select A from B IN (select C FROM D);
* "select A from B" 的每行结果 都会执行一次查下 "select C FROM D"
加了中间表的 IN
select A from B IN (select E FROM (select C FROM D)F);
只执行一次 "select C FROM D"
卑微实习僧
vue-cli的vue.config 添加自定义loader,引入无效?
写的自定义loader,匹配configCss文件夹下的index.css文件,vue.config.js配置如图,我感觉我配置的是正确的,但是终端控制台不显示我写的自定义loader的console,这是为什么啊~~~
"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241014/c249718438bb9ac59c9b06226441ab8b.png)
"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241014/11522f3cb9abd9948c46da435e11db1c.png)
"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241014/9dd4e1b9fa00b16954e3c83cff46c5b0.png)
希望写的自定义loader能读取index.css文件
卑微实习僧
在移动端设置了overflow:auto|scroll,当子元素超过的父元素的高度内容就会模糊发虚?
在移动端设置了overflow:auto|scroll,当子元素超过的父元素的高度内容就会模糊发虚"07677ad3a878f07130298a91276cdd0.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241009/ec536925fca871e92e3b1518eb5559e0.png)
如果没超过或者移除overflow就正常,如下图
"16b651c6e645d5040689cd914329bf8.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241009/cbfbc85d131c9c1df6bfccc80a1d77c5.png)
"fa93c96d9fea111333417f61c8460d9.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241009/af20ff484eb56faf550514730e9f8aa3.png)
我尝试过加
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
卑微实习僧
求取排行榜列表需求的redis缓存方案?
zset 存产品排行榜,存前20个产品ID,然后
string 来存{key: 产品ID,value:产品信息的JSON字符串}
如果你的产品信息不是每次读取都是全部读取(比如名称,销售数量,价格,评价数,好评率全部都读),有的时候只读名称和销售数量,可以考虑hash存,hash的key则是每种产品信息为key,
hash 产品ID name "abc" price "100"
不过排行榜其实产品信息你就缓存排行榜显示和操作需要的那一部分产品信息就好了。
卑微实习僧
yarn 安装 qmarkdown 报 yarn 网络错误?
yarn 安装 qmarkdown 报 yarn 网络错误
想使用 quasar 的 qmarkdown "https://qmarkdown.netlify.app/developing/using-qmarkdown" (https://link.segmentfault.com/?enc=wVU%2FOrCcroGLe8tifoSu1Q%3D%3D.v7LEyRLmYwaYM3yNCVWPZ01RJI5WbguDkyT6gjbEiLbAXSUBeTkB2wQBY03Y%2Bb4AXOPjaFfEIvJ7kQl65IMOrg%3D%3D)
感觉用法很优雅
所以我参考
"https://madewith.cn/649" (https://link.segmentfault.com/?enc=AijeKT2lkkZaNfaps52t%2Bw%3D%3D.pjAy3h5Ub2RXGfnm1V0gKeQcCSybm8XQYGccihboGeU%3D)
使用 yarn 安装 qmarkdown
但是报错了,莫名其妙
─➤ yarn add @quasar/qmarkdown 130 ↵
yarn add v1.22.21
[1/4] 🔍 Resolving packages...
info There appears to be trouble with your network connection. Retrying...
info There appears to be trouble with your network connection. Retrying...
info There appears to be trouble with your network connection. Retrying...
info There appears to be trouble with your network connection. Retrying...
error Error: read ECONNRESET
at TLSWrap.onStreamRead (node:internal/stream_base_commons:217:20)
info Visit https://yarnpkg.com/en/docs/cli/add for documentation about this command.
然后我参考 "https://segmentfault.com/a/1190000040660323" (https://segmentfault.com/a/1190000040660323) 设置了淘宝镜像,在安装更加不行了
╰─➤ yarn config set registry https://registry.npm.taobao.org 1 ↵
yarn config v1.22.21
success Set "registry" to "https://registry.npm.taobao.org".
✨ Done in 0.02s.
─➤ yarn add @quasar/qmarkdown
yarn add v1.22.21
[1/4] 🔍 Resolving packages...
error Error: certificate has expired
at TLSSocket.onConnectSecure (node:_tls_wrap:1539:34)
at TLSSocket.emit (node:events:513:28)
at TLSSocket._finishInit (node:_tls_wrap:953:8)
at TLSWrap.ssl.onhandshakedone (node:_tls_wrap:734:12)
info Visit https://yarnpkg.com/en/docs/cli/add for documentation about this command.
是因为不存在这个包,还是真的是网络问题?
"图片.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241006/3a1460ecdceddbab791c465faebc4ddb.png)
"https://www.npmjs.com/search?q=qmarkdown" (https://link.segmentfault.com/?enc=XbSVAmCImgAV6W5HlESlqA%3D%3D.yU1UkGnQoml%2Fieigx51QZQ%2BCXxL%2B9YnWm7Ynt9HOXDkgrmVaheELdIVGFaFRb%2B0y)
***
重新找了一个包:"https://qmarkdown.netlify.app/all-about-qmarkdown/installatio..." (https://link.segmentfault.com/?enc=WkeX2YaRYDYnY%2FYidmILuA%3D%3D.wYHFiEMXBz93rFn78XwmZBDO6VPUQfvRtBQ%2B30ESXid6YAesL%2FA88i1lCIv8TnAH0CTU38T8c5pnzy%2BfNIyJ0qKTnDSk1eWrLwujGL2Bv58%3D)
安装还是报错
─➤ yarn add @quasar/quasar-ui-qmarkdown@next 1 ↵
yarn add v1.22.21
info No lockfile found.
[1/4] 🔍 Resolving packages...
info There appears to be trouble with your network connection. Retrying...
info There appears to be trouble with your network connection. Retrying...
info There appears to be trouble with your network connection. Retrying...
info There appears to be trouble with your network connection. Retrying...
error Error: read ECONNRESET
at TLSWrap.onStreamRead (node:internal/stream_base_commons:217:20)
info Visit https://yarnpkg.com/en/docs/cli/add for documentation about this command.
我按照 "https://stackoverflow.com/questions/51508364/yarn-there-appears-to-be-trouble-with-your-network-connection-retrying" (https://link.segmentfault.com/?enc=ifeyT7Wl0OvMD%2FJEP58oZw%3D%3D.j%2FMsWCWUSVziUSL1mmkJ%2FxFignRjba5uLUGJgwwYtoEq4Gc4o1dHuGRuiaOW5hciTWvh%2FXMKwD31BQnhVmwN4R22kBxcKLvzLiFbc02%2BlLC1mmymIbSoOr96e0c5K2ixsYajzTclSBL3ZoYH0hE0iFLA7ngsQx5X20fsz%2Bb1vT8%3D)
里面的把 yarn.lock 删除之后,重新执行 "yarn add @quasar/quasar-ui-qmarkdown@next" 还是一样的报错
卑微实习僧
网页打印样式不显示的解决方案?
页面没有跨域资源的话,用 "dom2img" 截个图先,然后打印这张图片就行了。
卑微实习僧
Flutter如何实现带有图标和文字的自定义标签?
首先把SingleChildScrollView的scrollDirection属性设置为:Axis.horizontal试试看;
不行你再看下面的代码
class THomePage extends StatelessWidget {
const THomePage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
centerTitle: true,
title: const Text('Flutter如何实现带有图标和文字的自定义标签?'),
backgroundColor: Colors.yellow,
),
body: const Center(
child: SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: Row(
children: [
SizedBox(
width: 20,
),
Row(
children: [
Icon(Icons.add),
Text('AAAAAAAA'),
],
),
SizedBox(
width: 20,
),
Row(
children: [
Icon(
Icons.add,
),
Text('BBBBBBBBB'),
],
),
SizedBox(
width: 20,
),
Row(
children: [
Icon(Icons.add),
Text('CCCCCCCC'),
],
),
SizedBox(
width: 20,
),
Row(
children: [
Icon(Icons.add),
Text('DDDDDDDDDD'),
],
),
SizedBox(
width: 20,
),
Row(
children: [
Icon(Icons.add),
Text('EEEEEEEEEEEEEEEEEEE'),
],
),
SizedBox(
width: 20,
),
Text('F'),
SizedBox(
width: 20,
),
],
),
),
),
);
}
}
卑微实习僧
每次编程语言都是python排前三,但是国内的招工python需求都不高。难道大家都用python自已搞事情吗? python都用在哪些方面呢?
“排前三”你指的是什么?TIOBE?那玩意儿就一互联网热力榜,跟微博热搜没啥区别。而且因为众所周知的原因,在国内的数据严重失准,看一乐就行了。
至于岗位问题,在国内很多编程语言你要单独去搜“XXX 语言工程师”这种岗位,数量肯定比 Java
这种基数大的要少一个甚至几个数量级。招聘网站上大部分某某语言工程师,其实就专指 Web
后端工程师,别的语言数量少很正常,毕竟生态在那儿摆着呢。再加上现在整体市场萎缩,本来就啥 HC 都少。
Python 目前的应用更多的在爬虫采集、数据清洗/挖掘、机器学习等方向,但这些方向的岗位基本都不会把自己叫 “Python 工程师”,而是会叫
“数据挖掘工程师”、“算法工程师”等等。但另一个问题来了,比如你是做推荐算法的,算法本身用 Python
实现,这没什么问题。但算法实现完了总得和业务系统相结合然后落地吧?有能力上自研推荐算法的项目一般都比较复杂了,大概率也不会是基于 Python
的,这就要求你还得懂业务系统里所需要的技术栈。所以往往 Python 只是这类岗位的所需技能之一,而非岗位本身。
P.S. 所以说不要把自己定位成“XXX 语言工程师”,没有前途的,哪怕 JAVAer 也一样。
卑微实习僧
用eclipse.paho的MqttAsyncClient连接本地部署的emqx,用户名密码认证失败,如何解决?
在java上试图使用org.eclipse.paho.client.mqttv3连接连接本地部署的emq,emqx服务端的认证配置如下
* 内置数据库Password-Based,
* 密码加密方式为plain,
* 加盐方式为disable
使用"emqx_test"作为用户名,使用"emqx_test_password"作为密码。测试连接时,总是连接失败,提示如下异常org.eclipse.paho.client.mqttv3.MqttSecurityException: 错误的用户名或密码
at org.eclipse.paho.client.mqttv3.internal.ExceptionHelper.createMqttException(ExceptionHelper.java:28)
at org.eclipse.paho.client.mqttv3.internal.ClientState.notifyReceivedAck(ClientState.java:1053)
at org.eclipse.paho.client.mqttv3.internal.CommsReceiver.run(CommsReceiver.java:151)
at java.base/java.lang.Thread.run(Thread.java:840)
我在mqttx的mqtt协议调试软件上确定了"emqx_test"和"emqx_test_password"的用户名密码时没有问题的
截图:
"mqttx测试" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241004/abd565a57dc62205dcd9519bfc29901d.png)
"认证配置" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241004/365bf12260b88fdb975ac75c9baac904.png)
"emqx内置数据库用户密码配置截图" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241004/aedab974d7175b386fc3f71690845820.png)
相关java设置代码
var brokerUrl="tcp://127.0.0.1:1883";
mqttClient = new MqttAsyncClient(brokerUrl, "test");
MqttConnectOptions connOpts = new MqttConnectOptions();
connOpts.setUserName("emqx_test");
connOpts.setPassword("emqx_test_password".toCharArray());
connOpts.setServerURIs(new String[] { brokerUrl });
connOpts.setCleanSession(true);
// 设置回调函数
mqttClient.connect(connOpts, connStatus);
连接失败回调代码,连接总是响应REASON_CODE_FAILED_AUTHENTICATION的状态码
@Override
public void onFailure(IMqttToken asyncActionToken, Throwable e) {
// System.out.println("Failed to connect to the broker: " +
// exception.getMessage());
if (e instanceof MqttException) {
MqttException mqttEx = (MqttException) e;
int reasonCode = mqttEx.getReasonCode();
if (reasonCode == MqttException.REASON_CODE_CLIENT_TIMEOUT) {
log.error("mqtt连接失败,等待超时");
} else if (reasonCode == MqttException.REASON_CODE_FAILED_AUTHENTICATION) {
log.error("连接失败,认证无效:",e);
} else {
System.out.println("Other connection failure reason: " + reasonCode);
}
} else {
log.error("连接失败", e);
}
}
请问问题出在哪里?
我把emqx上的内置数据库认证功能关了,java的mqtt连接就能成功了。然后打开emqx网站,进入客户端那一页面查看连接的客户端,在用户名那一列发现java的mqtt客户端缺少用户名,是MqttConnectOptions配置缺失了什么东西吗?
"无认证模式下的java连接成功的mqtt服务端" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241004/831fcd467e7454c701aaa11e16f4b1ea.png)
emqx测试的版本是emqx-5.3.2-windows-amd64
卑微实习僧
如何解决在Next.js中document未定义的问题?
let img: document.getElementById("admire");// 这里的:应该是=吧
你的函数名不需要首字母大写,因为这不是一个组件,它只是实现了一个点击动画的逻辑。将这个逻辑整理之后放到""出现的组件中就好了。通过"useRef"关联到这个dom,然后在"useEffect"中给这个dom添加事件监听,来实现点击动画的效果。
卑微实习僧
使用 html2canvas 生成图片时如何避免原页面的图片放大?
html2canvas生成图片时,原HTML的图片被放大
"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241002/04de68144434a258f94c7d394c741df1.png)
"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241002/17b20df5c8faa4084a0a5173c75f0a11.png)
"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241002/e9c6afa1dc97712c3833c6f6f38a55ab.png)
卑微实习僧
npm 安装依赖electron报错?
"RequestError: certificate has expired" 检查一下你的镜像地址 👉 "【望周知】淘宝 NPM 镜像站喊你切换新域名啦
-知乎" (https://link.segmentfault.com/?enc=vXeKpVpf6OimX%2FyyaAYU1w%3D%3D.fbfp7aMeV2obg6N8BTnbDa%2Fwq10kDCRiVQmUyjpOfztiCwh7ftCy6vPW9Kt9V3vj)
如果镜像地址没问题,并且你的项目是老项目,那么修改一下 "ELECTRON_MIRROR" 这个环境变量为 ""https://npmmirror.com/mirrors/electron/"" 👉 "安装指导 | Electron" (https://link.segmentfault.com/?enc=YD6YDSFk0AZ4pz3UImlHWA%3D%3D.WqaScCmcWTRlf4lVp%2FKa%2BN6ouHR2UC62HkbYrUnpTfp%2FOn5aoYj9NBvJ1%2FoEF7qckqO6kd2g6cNN%2FCvk9%2BllD3CxRwfLu1SwWJ7NpMsxpf%2FdCfmqY%2BE%2F91cFeyuXeuFpFK35AKe1KCa6BJ8QwYGCVCkPDO%2Bcs9vLHv9kV9gsBnJfEt0gxTYk8z60vSnJTac8)
卑微实习僧
请问小程序, 如何让物理返回键跟自定义导航返回的页面 保持一致?
为啥必须使用 "reLaunch" 啊,关闭其他页面,那不应该把那些该关闭的页面在路由的时候就是用 "redirectTo"
关闭掉嘛?其实应该设计一下页面路由栈。
反正据我所知现在是没有办法拦截物理返回和滑动返回。官方的答复是这样的:
«会有某些开发者,阻止用户退出某些页面,以达到一些xxx目的,所以官方为了防止开发者滥用,并不打算开放该功能。»
或者你一定要做,可以看看微信开发者社区的一些相关文章?
* "【交互方案】针对不小心触发返回按钮的交互 | 微信开放社区" (https://link.segmentfault.com/?enc=LDPr7ndtM1JCD9U3BknGDw%3D%3D.6gj4ddA5354aWnoGTKZI4DOb10cWNGxUoNgu6Tfbdi4CbpfWmqzJFOpzMLN%2B2syOJj6jBVbtTMWjDKUPjGB50N8O5J%2FZTWHqxNqGQIKymkQa6u5DmuIn%2Bov9vZIQ1eMM)
卑微实习僧
pnpm workspace,管理项目monorepo问题?
* 首先,确保你定义了Workspace,在项目根目录下应该有个 "pnpm-workspaces.yaml"文件,其中包含了当前workspace下的项目结构。
* 其次, pnpm安装依赖时,如果没有特殊指定,它更倾向于使用远程的。确保你的根目录下有个 ".npmrc"配置文件,其内容是优先使用Workspace中的packagelink-workspace-packages = true
prefer-workspace-packages = true
recursive-install = true
然后,在根目录下执行你之前的安装命令就可以嘞。
卑微实习僧
打包后文件,appendChild一个script标签(执行完这些js)之后,又.parentNode.removeChild把这个标签移除了,为什么要这么做?
查看一段打包后的js代码,appendChild一个script标签(执行完这些js)之后,又.parentNode.removeChild把这个标签移除了,为什么要这么做,为什么要移除了?
var s, c;
if (void 0 !== r)
for (var l = document.getElementsByTagName("script"), u = 0; u < l.length; u++) {
var d = l[u];
if (d.getAttribute("src") == o || d.getAttribute("data-webpack") == t + r) {
s = d;
break
}
}
s || (c = !0,
s = document.createElement("script"),
s.charset = "utf-8",
s.timeout = 120,
n.nc && s.setAttribute("nonce", n.nc),
s.setAttribute("data-webpack", t + r),
s.src = o),
e[o] = [a];
var m = function(t, n) {
s.onerror = s.onload = null,
clearTimeout(p);
var a = e[o];
if (delete e[o],
s.parentNode && s.parentNode.removeChild(s), // 这里
a && a.forEach((function(e) {
return e(n)
}
)),
t)
return t(n)
}
, p = setTimeout(m.bind(null, void 0, {
type: "timeout",
target: s
}), 12e4);
s.onerror = m.bind(null, s.onerror),
s.onload = m.bind(null, s.onload),
c && document.head.appendChild(s) // 这里
卑微实习僧
React与Node.js前后端分离项目部署问题?
这是一个前后端分离的项目:前端是React,后端是Node.js
本地测试没有任何问题,上传到云服务器之后,测试后端没有任何问题。但是React却无法把数据发给后端
网上查询用Nginx部署前端,我的nginx核心配置文件如下
server {
listen 80;
server_name www.xiaoyangst.top;
root /home/xyst/XrtcDemo/myapp/build;
index index.html;
location / {
try_files $uri %uri/ /index.html;
}
location /api{
proxy_pass http://www.xiaoyangst.top:8888;
}
}
外网访问"http://www.xiaoyangst.top" (https://link.segmentfault.com/?enc=t1ZRhyBjwKJxkQjLYstCfg%3D%3D.mDwgyD1isq6a%2BlDZwzzXgT5oymJQfjQPFFwrt%2BW1EFI%3D)能够看到前端,说明nginx配置没有问题,但是代理配置应该存在问题,即跨域问题
本地测试环境跨域问题没有,因为可以添加文件setupProxy.js
const { createProxyMiddleware } = require('http-proxy-middleware');
module.exports = function(app) {
app.use(
'/api',
createProxyMiddleware({
target: 'http://www.xiaoyangst.top:8888',
changeOrigin: true,
pathRewrite: {'^/api': ''}
})
);
};
本地前端能够正常与云服务器后端通信,但是云服务器上部署的前端却不行,希望各位能给个解决方案
卑微实习僧
Vite 4.x + React 批量导入图片打包部署不显示?
图片不要用 vite 来处理,直接扔到 public 里。
上线之后如果需要处理,写服务器脚本或者在服务器端来做。
卑微实习僧
如何系统学习并使用mybatis-plus框架及其API文档?
菜鸟求教:mybatis-plus的api文档在哪?
目前只是通过一些视频教程和博客了解了一些基本用法。看了官网,没有找到api的文档,请问该如何系统学习并使用该框架?
卑微实习僧
闲鱼首页轮播动画的技术实现细节是什么?
闲鱼首页轮播动画的技术实现细节主要涉及到UI动画和视图管理的技术。以下是一个简要的分点归纳和说明:
动画准备阶段:
初始化界面:在界面初始化时,将轮播的控件(如图片或按钮)以及相关的视图元素都添加到父View中。这些元素的坐标、大小等属性可以根据需要进行设定。
设置初始状态:对于需要轮播的控件,通常设置其初始透明度为0,这样在页面加载时只显示背景或其他默认元素,轮播的控件处于不可见状态。
动画触发阶段:
添加点击方法:为触发轮播动画的控件(如一个特定的按钮)添加点击事件处理方法。当用户点击这个控件时,触发轮播动画的播放。
动画执行阶段:
使用UIView动画方法:通过调用UIView的动画方法来实现轮播效果。例如,可以使用[UIView animateWithDuration:...]系列方法来实现动画的播放。
设置动画参数:
duration:动画的持续时间,如1.0秒。
delay:动画的延迟时间,用于控制轮播控件的先后出现顺序。
usingSpringWithDamping:设置类似弹簧振动效果的阻尼系数,范围在0到1之间。这个参数决定了动画的“弹性”程度。
initialSpringVelocity:弹簧振动的初始速度,通常设置为0。
options:动画的过渡效果选项,如UIViewAnimationOptionCurveEaseInOut,它定义了动画的速度曲线。
执行动画:在animations代码块中设置轮播控件的目标状态,如设置控件的透明度为1(使其可见),并设置其目标位置。
动画完成阶段:
完成回调:在completion代码块中,可以编写动画完成后需要执行的代码,如进行下一个动画的预加载或处理其他逻辑。
循环播放:
对于需要循环播放的轮播动画,可以在动画完成后通过递归调用动画方法或使用定时器(如NSTimer)来实现动画的连续播放。
内存管理和性能优化:
在实现轮播动画时,需要注意内存管理和性能优化。例如,对于图片资源,可以使用适当的图片格式和压缩率来减小资源大小;同时,通过合理地复用视图元素和避免不必要的视图重绘来提高性能。