CTang
请问一般数据库的表的字段是预先创建的,还是在运行项目的时候创建的?
通常是在项目启动前就预设好了,以我司的项目为例:
1. 先安装基础设施包,完成后会部署数据库服务(如MySQL)。
2. 再安装产品包,此时先执行数据库更新任务(进行建表、表结构更新等操作),再部署提供业务功能的服务(服务进程启动时做数据初始化)。
如果是服务启动时发现表不存在进行建表的话,需要在服务的代码里处理针对多种不同数据库的兼容逻辑,这样会导致后期维护的困难,所以相关处理需要在基础设施层完成,并定义一套规范给业务方按需编写数据库升级脚本参考。
CTang
git 如何实现 include 声明?
我知道了,可以用感叹号声明
*.npz
!testing/std.npz
CTang
redis里面有个map数据量太大了,怎么分割?
redis本身不提供这种命令,根据自身需求去拆解,比如要拆成10个hash,就用原本的key %
10来确定放到哪个hash里,后续查询的时候也使用相同的规则来找到对应的hash
CTang
Dell R420 服务器安装 debian 12问题?
Dell R420 服务器安装 debian 12,有两个问题,第一个问题就是如果硬件做RAID5,在安装的时候,总是卡在安装基本系统某一步骤
"80176a2aa2e1a06500fd18a6a742d12.jpg" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20250107/4613e0995d744a4cf1aad575eeec4004.png)
之后就
"0e2451572c8cd4241f2390509954460.jpg" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20250107/8c5f38e7637b82cccb47aa651cf2f5f4.png)
如果不做RAID,单独安装在一个盘上,最后一点点安装 GRUB 启动引导器的时候,安装不了dummy
"a11decf89f7cfea11fca246ae25b92c.jpg" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20250107/582e37c8dcb010871a6e055a53164f9b.png)
试了很多次,就有一次成功了,后面就一直安装不了dummy
网上有人说是 bios的nvrom满了,我有开盖用跳线的方式,重置了 bios ,还是这样
CTang
vue/uniapp中,如何将十六进制字符串转换成有符号 2 补码中的十进制?
都是 int8 呗?那直接位移更简洁一些:
function hex2dec_int8(hex) {
const BITS = 8;
const dec = parseInt(hex, 16);
return 0x80000000 >> (32 - BITS) | dec;
}
console.log(hex2dec_int8('c4'));
可以直接简化成:
const hex2dec_int8 = (hex) => -128 | parseInt(hex, 16);
console.log(hex2dec_int8('c4'));
应该不会有比这个更简便更高效的写法了。
CTang
在二维平面上,有一点p(x,y),有一个三角形ABC,顶点坐标为A(x1,y1),B(x2,y2),C(x3,y3),如何判断点P是否在三角形内或在三角形的边上?
在空间中,有两条线段,分别是线段AB和线段CD,它们的顶点坐标分别是A(x1,y1,z1),B(x2,y2,z2),C(x3,y3,z3);D(x4,y4,z4),请问如何求线段AB与线段CD的交点坐标?
CTang
docker部署前端nginx跨域不生效怎么回事?
"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241229/adb1670645e58bb8478eedd5d0850b78.png)
这里nginx虽然代理了3344端口的后端,但是前端请求的时候还是直接访问的3344这个服务。这里需要前端改一下配置,访问接口的时候不用再加3344端口了。
CTang
React 的props传递是否只能传递对象,而不能传递数组?
类似这样传数组
就是说,用一个变量传数组
如果类似 "" 这样传参,等价于 "",当然接收到的是个对象
CTang
ios微信浏览器打开的h5网页不支持pagehide?
如题,有个h5网页(使用uniapp+vue2编写)挂载在微信公众号上的,有个需求是当离开网页时保存用户填写的信息,其中的离开包括返回按钮,关闭浏览器按钮,如下图所示:
"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241227/867c2319dd512d76eae01185f7a9fedd.png)
其中最上方的关闭按钮我在ios手机上监听不到,安卓都是支持的,关键代码如下:
mounted() {
this.source = appSource()
console.log('this.source', this.source)
if (this.source === 'ios') {
window.addEventListener('pagehide', this.recordHandler)
} else {
window.addEventListener('visibilitychange', this.recordHandler)
}
this.getList()
this.getPriceModelList()
this.getProjectAddrList()
},
// 监听页面卸载
onUnload() {
if (this.source === 'ios') {
window.removeEventListener('pagehide', this.recordHandler)
} else {
window.removeEventListener('visibilitychange', this.recordHandler)
}
},
我在网上查了资料,ios是支持pagehide事件的:("https://developer.apple.com/library/archive/documentation/App..." (https://link.segmentfault.com/?enc=JNq6NMB5lz4SyWvCmdbbCw%3D%3D.Iff1ZJrVdvN%2BGcpRuaMYCZl7y08SASXpQB9ud130Hf3rAQqepy3asxPD0NgnmQQymVQOmKrNhUHAbP98gG%2BMh%2FsW8lxJ5OWXqKZXOSwlp5i9yqqNA70Jhzcb%2Fp0Q%2FS3d8tt%2FS7xsOO60vKMmBEnc7ogulrfhPxiN%2FAZ1rYybtyDbJbHi9SlhKhLnJQfzpLea1t2I6dLfk%2FKP7v3VgkvQXYUiG5KjmF%2F8ibqJbmCMLwE%3D))
"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241227/0b7a90bd159dc804ef2cbbc2f3464974.png)
但我用苹果手机测试都不行,测试代码如下:
recordHandler(e) {
if (this.source === 'ios') {
localStorage.setItem('unload', '90')
}
this.sendBack()
},
理论上来说,如果我点击左上角的关闭按钮,如果浏览器监听到了pagehide事件,它就会执行recordHandler里面的方法,就会给localStorage设置一个unload的值,但我用苹果手机测试始终没有成功,有大神知道怎么兼容吗?
CTang
曲线积分问题??
$$ x^2dx = \frac{1}{3}dx^3$$
$$ \int x^2 \sin (x^3) dx = \int \frac{1}{3}sin(x^3)dx^3 $$
CTang
React 路由插件 reactrouter 的路由匹配问题:空路由为什么匹配不到?
当前路由是:"***.com" 也就是没有 "/" 的时候居然匹配不到任何路由,但我定义了 "/"
export default function (){
return [
{
path: "/",
element: 12312313123,
component: 12312313123,
lazy: () => import("./Page/Auth"),
}
]
}
不能自动重定向么?如何解决这个问题呢?
CTang
import.meta 使用前提是什么?
"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241225/7d190486fa56c3fdf5f740dd08666e5d.png)
"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241225/498088c8fca18311e89efc0279471377.png)
除了这里还要做什么吗?
CTang
怎样用typescript表达对象的key为特定字符串和数字拼接的类型?
页面报错:
"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241218/1777ac1e56583de5295d83034e5fb976.png)
类型定义:
"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241218/4c3b5f209a2fbc2a9690a318615fd41a.png)
怎样才能正确地表达这个key的类型?
CTang
线、柱双轴图中,如何自定义不同系列的颜色?
解决方案 Solution
VChart图表提供了对应的能力,支持通过配置scale来自由控制数据与值的映射关系。在双轴图图,控制颜色就可以使用scale来控制各个图形字段使用特定的颜色值。
更具体的配置规则,可参考:"https://visactor.io/vchart/option/barChart#scales.domain" (https://link.segmentfault.com/?enc=S8gcbuQ9AkheZBfX2GacqQ%3D%3D.HosGXUdWmtNPzqfx9dfECqaQNb61iqynoDKSawY5vlpgApHxc%2FidFT9JwsmIz4n7uyhp2FxMoyXP5fUAYBFohA%3D%3D)
代码示例 Code Example
import { useEffect, useRef } from "react";
import VChart from "@visactor/vchart";
export const Chart = () => {
const containerRef = useRef(null);
useEffect(() => {
const spec = {
type: "common",
data: [
{
id: "id0",
values: [
{ x: "Monday", type: "Breakfast", y: 15 },
{ x: "Monday", type: "Lunch", y: 25 },
{ x: "Tuesday", type: "Breakfast", y: 12 },
{ x: "Tuesday", type: "Lunch", y: 30 },
{ x: "Wednesday", type: "Breakfast", y: 15 },
{ x: "Wednesday", type: "Lunch", y: 24 },
{ x: "Thursday", type: "Breakfast", y: 10 },
{ x: "Thursday", type: "Lunch", y: 25 },
{ x: "Friday", type: "Breakfast", y: 13 },
{ x: "Friday", type: "Lunch", y: 20 },
{ x: "Saturday", type: "Breakfast", y: 10 },
{ x: "Saturday", type: "Lunch", y: 22 },
{ x: "Sunday", type: "Breakfast", y: 12 },
{ x: "Sunday", type: "Lunch", y: 19 }
]
},
{
id: "id1",
values: [
{ x: "Monday", type: "Beverage", y: 22 },
{ x: "Tuesday", type: "Beverage", y: 43 },
{ x: "Wednesday", type: "Beverage", y: 33 },
{ x: "Thursday", type: "Beverage", y: 22 },
{ x: "Friday", type: "Beverage", y: 10 },
{ x: "Saturday", type: "Beverage", y: 30 },
{ x: "Sunday", type: "Beverage", y: 50 }
]
}
],
color: {
type: "ordinal",
field: "type",
domain: ["Breakfast", "Lunch", "Beverage"],
range: ["lightPink", "lightBlue", "purple"]
},
series: [
{
type: "bar",
id: "bar",
dataIndex: 0,
label: { visible: true },
seriesField: "type",
xField: ["x", "type"],
yField: "y"
},
{
type: "line",
id: "line",
dataIndex: 1,
label: { visible: true },
seriesField: "type",
xField: "x",
yField: "y",
stack: false
}
],
axes: [
{ orient: "left", seriesIndex: [0] },
{ orient: "right", seriesId: ["line"], gird: { visible: false } },
{ orient: "bottom", label: { visible: true }, type: "band" }
],
legends: {
visible: true,
orient: "bottom"
}
};
const vchart = new VChart(spec, {
dom: containerRef.current
});
vchart.renderSync();
return () => vchart.release();
}, []);
return (
);
};
结果展示 Results
https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241216/69606f53a58eeded1870c1637fd1581a.png
在线示例:"https://codesandbox.io/s/color-scale-nh89qz?file=/src/App.js:..." (https://link.segmentfault.com/?enc=flfHebWkIcwEqD3dh1uxAg%3D%3D.S9E474KE75uPNOragRRxV3LqMITWyq9yyaWwsy1P8SICIuIYbgpWbYQpSlxrpRvIl9JM1EcX5t5xnOTtPvkUrCOS6weKvLX47U6%2FcT%2F9tYk%3D)
相关文档
"VChart
Github" (https://link.segmentfault.com/?enc=tIWVp%2BoEMA1NWTVJkLcngQ%3D%3D.MWcle6PyiAvz8DDMpIL5se8nXCBywHTCHDEsQYjU8WptsaZbMcXJRuQLUKh0RXkJ)
"VChart Scale
Guide" (https://link.segmentfault.com/?enc=vWc3ZDqTZxTTozu%2FkppFiQ%3D%3D.IB6qQhCHEcLYnCRmUauloJtsi193ZQizQ5XB6flRCkIHzJSiMwGGOcuonekJwTMdmcVsIblqAMNJyRV8VjIoYw%3D%3D)
CTang
antd message 当浏览器在后台时弹出会在切到前台才关闭 有解决办法吗?
我5秒弹一次message 浏览器切到后台一段时间后 再切到前台 会看见一大排消息然后一起隐藏,我看onClose事件在后台也是正常调用的
CTang
C 语言单链表查询问题?
// ... [其它代码不变]
// 通用查找函数,找到所有匹配的数据
struct list *list_find_all_generic(struct list *head, void *key, int (*callback)(void *, void *)) {
struct list *resultHead = list_init(NULL);
struct list *p = head->next;
while (p != NULL) {
void *data = p->Data;
if (callback(data, key) == 1) {
list_add(resultHead, data);
}
p = p->next;
}
return resultHead;
}
int main() {
// ... [其它代码不变]
// 查找员工
int search_id = 1003;
struct list *searchResults = list_find_all_generic(head, &search_id, staff_id_find);
// 打印所有找到的结果
list_display_generic(searchResults, staff_printf);
//销毁查找结果链表
free(searchResults); // 这里只释放头节点,因为数据是共享的,不应该再释放
//销毁主链表
list_destroy(head, free_staff);
return 0;
}
CTang
echarts 仪表盘怎么设置数据上下滚动特效?
echarts 仪表盘怎么设置数据上下滚动特效?
ui效果
"20231010150511_rec_-convert.gif" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241214/c4507c5e587ec495e93a09a0cd1f0e86.png)
CTang
不用eval怎么把字符串的箭头函数的转为函数?
问题
不用eval怎么把字符串的箭头函数的转为函数d
原数据
var data = {
listeners: {
change: "(val) => { console.log(val); }",
},
};
期望
转换成不带双引号的
var data = {
listeners: {
change: (val) => { console.log(val); },
},
};
CTang
vscode代码格式化和配置问题?
好的工具和好的配置能有效提升自己的开发效率,好看的排版更能让人赏心悦目。
问题
目前我主要以
"Vue3"、"typeScript"为技术栈从事开发。因为代码检查和格式化,相关的插件如"volar"、"ESlint"和"prettier"已经装好了,我也自己配置了一些设置——保存时自动格式化,但我的配置并不完整。
目前有个问题不知道该怎么配置,在某一行和下一行代码里有好多个回车:
function A(){}
// 好多回车
function B(){}
保存时有格式化,但这两个方法之间并没有格式到只有一行。
另一个问题是导入提示,我装了"Path Autocomplete"插件,已配置"@"通配符,在使用时,导入是可以正确显示路径的,但是在绝对路径导入时点击导入的对象时无法跳转至该文件,且鼠标移入时无法展示用法和参数类型什么的,比如:
import { getUserInfo } from '@/api/user'
点击"getUserInfo"无法跳转至src/api/user和移入时无法显示接口名称和参数类型;不只是接口,组件,方法什么得都这样,如果用相对地址导入却可以。
如果可以的话,懒人小弟恳请大佬给一份自己常用好用的setting.json ^_^,
也可以发送至邮箱"zwm0417@qq.com" (mailto:zwm0417@qq.com),十分感谢!
CTang
vue安装rem插件(npm i px2rem-loader -D)使其自适应屏幕大小,但为什么刷新后才能达到预期效果?
在vue.config.js配置
const px2rem = require('postcss-px2rem');
const postcss = px2rem({
remUnit: 192 //基准大小 baseSize,需要和rem.js中相同
});
css: {
loaderOptions: {
postcss: {
plugins: [postcss]
}
},
},
main.js配置
import './utils/flexible';
import { setRemInit } from './utils/rem';
setRemInit(); //进行初始化立即运行
刷新前:
"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241210/98f3387a033f7263a8426b362e29f688.png)
刷新后(想要的效果):
"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241210/7bf15f37c410fa56a33636b818071e2d.png)
若是返回前一个页面,页面内容字体仍然会变小
CTang
uniapp自定义导航栏,有下面一个问题,应该怎么解决?
因为你现在的写法页面栈里面有两个B
C返回B 用navigateBack
CTang
各位大佬 如下图ui怎么实现?
献丑一下昨天刚学的
如果用css实现的话用mask属性,当然我这个不是很完美
"https://codepen.io/ing-M/pen/PoVPxoa" (https://codepen.io/ing-M/pen/PoVPxoa)
CTang
请问步骤条step加气泡卡片popover怎么实现?
如下代码已实践不能实现目的,请问该怎么实现?
{{item.title}}
CTang
一个vue项目文件结构看不懂,也不知道怎么启动,是不是分模块打包啊,有大佬知道这么启动这个项目吗?
项目启动直接看 package.json 然后你最外层这个什么东西都没有。
就往里找 package.json
里面那个有 vue.config.js 大概率是 vue-cli 创建的。
***
综合看下来是一个大仓,只不过不太规范。
CTang
请问是否有antd/tree方法可以一键展开所有节点呢?
调整一下写法就行了, "defaultExpandAll" 只会在初始化的时候生效,正确理解这句话很重要
* 初始化数据即存在的场景,直接渲染即可const [treeData, setTreeData] = useState([
{ key: '1', title: 'parent 1', chidren: [...] },
{ key: '2', title: 'parent 1', chidren: [...] }
]);return ;
* 初始化没有数据,通过异步请求获取数据的情况,增加一个判断,有数据才渲染组件const [treeData, setTreeData] = useState([]);
useEffect(() => {
fetchTreeData().then((treeData) => setTreeData(treeData))
}, [])return (
treeData.length ?
:
null
);
CTang
异步加递归问题,await被跳过?
"recursive" 方法内部实现的问题,Array 的 forEach 循环是不支持 async/await 的,所以应该把 forEach 部分换成
for 循环再配合 await ,如下:
async recursive(data) {
try {
for (let i = 0; i < data.length; i++) {
const item = data[i]
if(item.isLeaf) {// 没有下级
const data = item.data ? item.data : item
this.treeData.push(data)
}else {
const { data } = await fetchArchiveTree(this.getQueryParams(item))
for (let item of data.data) {
if(!item.isLeaf) {
const Arr = [item]
await this.recursive(Arr)
}
this.treeData.push(item)
}
}
}
} catch (error) {
console.log('获取树形数据失败',error);
}
console.log('数据收集完毕');
},
CTang
echarts图表点击下载报错?
请贴出具体的核心代码
CTang
怎么让文字到阴影上面?
给 "banner-content" 元素增加以下样式:
.banner-content {
position: relative;
z-index: 1
}
使你的 ".banner-content" 元素覆盖在你的 "overlay-3:before" 伪类上面就好了。
CTang
滚动翻页时,js添加的img为什么懒加载失败?
滚动翻页时,js添加的img为什么懒加载失败?
页面中,滚动翻页时,js添加的img为什么懒加载失败,图片不显示,如果能显示
懒加载用的是zepto+下面的代码
"https://github.com/maplejan/jquery_lazyload/blob/1.8.5/jquery.lazyload.js" (https://link.segmentfault.com/?enc=iUzKKFeweDe9cSUeP2Mu7A%3D%3D.ahBcfs0TrFNKWRGmaXljSi1DEAxyFwTuf%2B%2BrV%2BG01h6UttrYWdOmYL2FGvBir1dHw2LNV1bQM2EeItwIvcRFultaJf66yZ5dXuXvssIYgi0%3D)
首页正常加载hmtl中的图片,能通过懒加载实现,翻页js添加dom部分内容没问题,就是当内容进入可视区不能实现图片懒加载
CTang
前端如何判断用户的电脑是 arm 还是 x86?
前端如何判断用户的 mac 是 arm 还是 x86
"https://www.telerik.com/download/fiddler-everywhere" (https://link.segmentfault.com/?enc=%2BBHyfQQdK7BCzrmzwOMhtg%3D%3D.VULg3EvL8%2BI112PqiHE2LYRf5moKNI1cO0kmcL78AMWwXwywN7eBwTKYPhurwdqdAi4c17Kn7ktawo1TFbyHAA%3D%3D)
下载 fiddler-everywhere 的时候,它监测到了我的电脑是 arm
怎么实现的?浏览器的 UA 都还是谎称自己是 intel
"图片.png" (https://wmlx-new-image.oss-cn-shanghai.aliyuncs.com/images/20241104/494f538bf9c2ded5a913ffbb7a999aeb.png)
是通过 js 调用浏览器 API 获得的结果吗?对应的 API 是哪个呢?
CTang
懒加载性能问题?
现在有一个下拉列表,需要渲染的数据为十几万条,每次渲染的时候都会很卡顿,我想优化渲染性能,考虑采用懒加载的形式,先对数据获取接口进行分页处理,每次在判断快滚动到底部的时候,再加载下一页数据,加载完成之后,拼接旧数据
+ 新数据
组成要渲染的数据,再赋值给下拉框进行渲染,但是这种形式有一个问题是:当滚动到最后面的时候,这时候需要渲染的数据量也很多,会造成dom过多,页面性能也会有问题,请问我该如何优化?
CTang
Vue单页面应用 使用router-view 点击菜单切换功能 内存越来越大 有何排查方法或建议?
内存越来越大,那么你需要思考是否存在内存泄漏,所以你应该先去排查。
CTang
复杂表单和树的结构设计与编辑?
https://wmlx-new-image.oss-cn-shanghai.aliyuncs.com/images/20241027/97c242070308913e46b22559f7773fec.png
1. 线是一个数组,数组里面有 简单线 和 标记线 对象,其中 简单线 和 标记线 可以互转,也可以上下调整位置
2. 像 简单线 没有下级的就是一个对象,里面有许多需要填的的数据,然后像 标记线 这种的就是 也是一个对象,也有许多不一样的数据要填,但是这个标记线里面有个对象的值是个数组,这个数组的里面有许多对象是 简单标记 ,每个简单标记有可能又会变成 标记线 这样的解构,就是 简单标记 里面有个属性的值是数组的对象,可以嵌套
这个图片这个树下面就显示表单,这个在上面选中 简单线 就修改 简单线 的数据,选中 标记线 就修改 标记线 的数据, 选中 简单标记 就修改 简单标记
的数据
有没有大佬做过相似的,提供一下思路
目前我只会做 线 下面全是 简单线 的这种,求大佬指教
CTang
笔记本只有在重启的时候,会提示no bootable devices,正常关机启动则不会提示?
1.开机状态下,点击按钮重启的时候,每次都会提示no bootable devices,这时是不能开机成功的,会卡在这里,然后必须按电源键关掉,再开机才行;
2.开机状态下,关机,再开机,则不会提示no bootable devices
2.win10系统,已经重装过系统依然这样
CTang
UniApp H5 项目怎么定义全局变量 ?
如果你是基于Vue2的,可以在main.js文件中定义
"Vue.prototype.$abc = 123;"
如果你是基于Vue3的,类似写法
"app.config.globalProperties.$abc= 123;"
CTang
VUE自定义弹窗,使用ant-design-vue图片预览功能后,关闭弹窗时为什么会报错?
试了一下,这样似乎是可以的。
* src/components/mDialog/index.vue resetFields()">
-->
{{title}}
{{cancelText}}
{{okText}}
import { ref, reactive, watch, onBeforeMount, onBeforeUnmount } from 'vue'
const mDialogWrapperRef = ref();
const mDialogRef = ref();
const emit = defineEmits(['update:visible', 'ok', 'cancel', 'closed'])
const props = defineProps({
visible: {
type: Boolean,
default: false
},
width: {
type: String,
default: ''
},
maxWidth: {
type: String,
default: ''
},
title: {
type: String,
default: ''
},
footer: {
type: Boolean,
default: true
},
showOk: {
type: Boolean,
default: true
},
showCancel: {
type: Boolean,
default: true
},
okText: {
type: String,
default: '确认修改'
},
cancelText: {
type: String,
default: '暂不修改'
},
// 确认按钮-加载中
okLoading: {
type: Boolean,
default: false
},
// 点击蒙层是否允许关闭
maskClosable: {
type: Boolean,
default: true
},
// 内容样式
bodyStyle: {
type: Object,
default: () => ({})
},
// 层级 - 如果设置了就是固定层级,如果不设置从最多层级1000开始往上加
zIndex: {
type: Number,
default: 0
},
// 是否加到body节点下
appendToBody: {
type: Boolean,
default: true
},
// 当关闭 Dialog 时,销毁其中的元素
destroyOnClose: {
type: Boolean,
default: true
},
// 为 Dialog 启用可拖拽功能
draggable: {
type: Boolean,
default: false
}
})
const _d = reactive({
show1: false, // 控制v-if
show2: false, // 控制display
show3: false, // 控制动画
zIndex: 1000, // 最低层级
width: !props.width && !props.maxWidth ? '400px' : props.width, // 宽度
maxWidth: props.maxWidth, // 最大宽度
// 拖动参数
drag: {
// 是否点下
isDown: false,
// 整个页面你最大宽高
pageWidth: 0,
pageHeight: 0,
// 弹窗宽高
dialogWidth: 0,
dialogHeight: 0,
// 左右最大移动距离
minX: 0,
maxX: 0,
minY: 0,
maxY: 0,
// 移动结果
resultX: 0,
resultY: 0,
// 鼠标点下是历史移动距离
startX: 0,
startY: 0,
// 鼠标点下时相对于page的位置
downX: 0,
downY: 0,
// 鼠标移动位置
moveX: 0,
moveY: 0,
}
})
watch(() => props.visible, (newVal) => {
setVisible();
})
onBeforeMount(() => {
setVisible();
// 绑定鼠标事件
window.addEventListener('mousemove', dragMove);
window.addEventListener('mouseup', dragUp);
})
onBeforeUnmount(() => {
// 解绑鼠标事件
window.removeEventListener('mousemove', dragMove);
window.removeEventListener('mouseup', dragUp);
})
// 设置显示状态
function setVisible () {
if(props.visible) {
new Promise((resolve, reject) => {
if(!_d.show1) { // 第一次通过v-if添加节点到dom树
setZIndex();
_d.show1 = true;
_d.show2 = true;
setTimeout(() => {
setTimeout(() => {
resolve();
}, 15);
}, 15);
} else { // 关闭后不删除节点,再显示弹窗
_d.show2 = true;
setTimeout(() => {
resolve();
}, 30);
}
}).then(() => {
document.body.style.overflow = "hidden";
_d.show3 = true;
})
} else { // 关闭弹窗
_d.show3 = false; // 关闭时动画效果
setTimeout(() => {
_d.show2 = false; // 设置display:none
if(props.destroyOnClose) {
_d.show1 = false; // 通过v-if销毁节点
}
document.body.style.overflow = "";
emit('closed');
}, 250)
}
}
// 显示的时候设置z-index
function setZIndex() {
let max = 1000;
// 判断是否有自定义的层级
if(props.zIndex) {
max = props.zIndex;
} else {
let aMd = [...document.querySelectorAll('.m-dialog.show')];
aMd.forEach(obj => {
let num = getStyle(obj, 'z-index');
if(max 0) {
minX = 0;
}
if(minY > 0) {
minY = 0;
}
if(maxX > _d.drag.pageWidth - _d.drag.dialogWidth) {
maxX = _d.drag.pageWidth - _d.drag.dialogWidth;
}
if(maxY > _d.drag.pageHeight - _d.drag.dialogHeight) {
maxY = _d.drag.pageHeight - _d.drag.dialogHeight;
}
_d.drag.minX = minX;
_d.drag.maxX = maxX;
_d.drag.minY = minY;
_d.drag.maxY = maxY;
// 开始位置
_d.drag.startX = _d.drag.resultX;
_d.drag.startY = _d.drag.resultY;
// 鼠标点下时相对于page的位置
_d.drag.downX = e.pageX;
_d.drag.downY = e.pageY;
}
function dragMove(e) {
if(!props.draggable) {
return;
}
if(!_d.drag.isDown) {
return;
}
// 移动距离
_d.moveX = e.pageX-_d.drag.downX;
_d.moveY = e.pageY-_d.drag.downY;
// 涉及结果位置
let resultX = _d.drag.startX+_d.moveX;
let resultY = _d.drag.startY+_d.moveY;
if(resultX _d.drag.maxX) {
resultX = _d.drag.maxX;
}
if(resultY _d.drag.maxY) {
resultY = _d.drag.maxY;
}
_d.drag.resultX = resultX;
_d.drag.resultY = resultY;
}
// 鼠标抬起
function dragUp(e) {
if(!props.draggable) {
return;
}
if(!_d.drag.isDown) {
return;
}
_d.drag.isDown = false;
}
// 获取节点到body的高度
function getDistanceBody (obj) {
var oBody = document.body;
var oHtml = document.documentElement;
var oParent = null;
var oDistance = {
top: 0,
left: 0
}
do {
oDistance.top += obj.offsetTop;
oDistance.left += obj.offsetLeft;
oParent = obj.offsetParent;
obj = oParent;
} while(oParent && oParent != oBody && oParent != oHtml)
return oDistance;
}
.m-dialog-wrapper {
position: fixed;
z-index: 1000;
top: 0;
right: 0;
left: 0;
bottom: 0;
background: rgba(0,0,0,0.25);
transition: opacity .25s;
opacity: 0;
overflow: auto;
&.show {
opacity: 1;
.m-dialog {
transform: scale(1);
}
}
&.is-drag {
-moz-user-select:none; /*火狐*/
-webkit-user-select:none; /*webkit浏览器*/
-ms-user-select:none; /*IE10*/
-khtml-user-select:none; /*早期浏览器*/
user-select:none;
.m-dialog-title {
cursor: move;
}
}
.m-dialog-modal {
display: table;
padding: 20px 0 40px;
min-height: 100%;
min-width: 100%;
box-sizing: border-box;
}
.m-dialog-cell {
display: table-cell;
vertical-align: middle;
}
.m-dialog-container {
margin: 0 auto;
}
.m-dialog {
position: relative;
z-index: 2;
border-radius: 2px;
overflow: hidden;
background: #fff;
transition: transform .25s;
transform: scale(0.9);
box-shadow: 0 3px 6px -4px #0000001f, 0 6px 16px #00000014, 0 9px 28px 8px #0000000d;
.m-dialog-title {
position: relative;
box-sizing: border-box;
padding: 16px 24px;
border-bottom: 1px solid #f0f0f0;
color: #000;
font-size: 16px;
line-height: 22px;
word-wrap: break-word;
min-height: 55px;
.m-dialog-close {
position: absolute;
top: 50%;
right: 0;
margin-top: -27px;
width: 54px;
height: 54px;
display: flex;
justify-content: center;
align-items: center;
font-size: 16px;
color: #666;
cursor: pointer;
&:hover {
color: #333;
}
}
}
.m-dialog-content {
padding: 24px;
min-height: 100px;
}
.m-dialog-footer {
padding: 10px 16px;
text-align: right;
background: transparent;
border-top: 1px solid #f0f0f0;
border-radius: 0 0 2px 2px;
.btn {
padding: 4px 15px;
font-size: 14px;
color: #333;
border: 1px solid #d9d9d9;
background: #fff;
height: 32px;
font-weight: 400;
cursor: pointer;
outline: medium;
border-radius: 2px;
&:not(:last-child) {
margin-right: 8px;
}
}
}
}
}
CTang
vue能对没上传到服务器的视频文件进行预览么?
没有url构造一个就行了"video.src = URL.createObjectURL(file)"
"https://developer.mozilla.org/zh-CN/docs/Web/API/URL/createOb..." (https://link.segmentfault.com/?enc=saraVWUDMeifQby8%2FMmAwA%3D%3D.AAsvzzztugxJUijfbm%2BQaG8%2BfMhN9yeQ2zFn6DRJ4UEddhyW6AR%2BxSPUlPqKllMYn4ddT3ClzT7GMmZTVPefouzUr%2FUHiV%2FixLxgr%2FpJsWA%3D)
CTang
github action 进入终端不知道怎么退出,一直到超时后失败?
github action失败
name: Load and run Docker image on the server
uses: appleboy/ssh-action@master # 使用社区 action 来通过 SSH 连接服务器并执行命令
with:
host: ${{ secrets.DEPLOY_HOST }}
username: ${{ secrets.DEPLOY_USER }}
key: ${{ secrets.DEPLOY_KEY }}
script: |
docker stop blog-server #停止老镜像
docker rm blog-server
docker load < /tmp/lxy-blog-server.tar.gz # 加载 Docker 镜像
docker run --name blog-server --net=host server-prod # 使用 Docker Compose 启动服务
exit
就是我通过github action把最新的代码生成的docker镜像推送到服务器上
再通过script部分的命令让新镜像运行起来
这里会出现github action 无法结束的问题
一直到超时直接失败
虽然失败并没有影响我的功能,但是每次action失败也不好看
«每次会得到这样一个结果
2024/01/07 10:58:57 Run Command Timeout»
应该是我的退出方式不对,但不知道怎么修改
我尝试过的方式就是最后一行代码加上了exit
这个并没有效果
CTang
css中水平选项怎么实现?
将容器旋转-90deg,子元素旋转90deg。
«"https://stackoverflow.com/questions/18481308/set-mouse-wheel-to-horizontal-> scroll-using-> css/39573512#39573512" (https://link.segmentfault.com/?enc=mv7HstMOCTzq%2FzkRP4h1mg%3D%3D.vs6xok6KezqFiR4JXQEuk8pDM%2BPfOg9ZV%2Br94O33uL7onAN7UDWn8wYSV3ATxNYX4Qh2u%2F8%2FdSfyTbbwmbVImM6%2FF9hbG8Lv%2BoCbhZSW%2BH80dKvPq7%2Bp%2B1KxznG8fU7JmqKaP16lRY4lv4kAido1VA%3D%3D)"https://segmentfault.com/a/1190000042443056" (https://segmentfault.com/a/1190000042443056)»
CTang
一个网页的实现效果?
"https://shanghai.wellingtoncollege.cn/" (https://link.segmentfault.com/?enc=CYlXFbuq9eoVUMFWtCaY8g%3D%3D.y8qDrAWBTyZzpRkKLuuHZHVPv1t7RsgjOuKXeP9h5rmAKJIfZQzVVjWwZY2Hr%2F5z)
"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241011/d79ae192102549bd4f53ed13a86e60b9.png)
每次鼠标滚轮往下一格时, 页面就会往下滑动固定高度的一页, 这种效果是怎么实现的?
CTang
Vue.js 中如何监听通过 .sync 修饰符传递的对象变化?
vue2
父组件定义了一个对象,通过.sync方法传递给子组件,子组件会改变这个对象的值,然后想watch这个值发现产生变化的时候调用某个回调,发现watch不到。。为什么会watch不到呢?应该通过defineOxxx函数进行了监听?有什么解决方法吗https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241010/6876ec79ad07433388d5c8eeacf6bae3.pnghttps://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241010/1544e9536d9931a32298f62c56f69cea.pnghttps://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241010/5d5b8a5f1f024811c5f7a34cef4d58ca.png
在子组件也尝试监听,没监听到
CTang
docker端口映射后,外部可以直接通过宿主机未开启的端口访问到服务的问题?
我的服务器A部署了前端服务, ip为192.168.111.115,
服务器部署有nginx(非docker部署),防火墙开放有80端口以及ftp相关端口,由于前端需要node环境,于是用docker部署了nodejs环境,并在Nginx配置:
location / {
proxy_pass http://localhost:3000;
}
然后使用docker run [其它] 3000:3000 [其它] 命令 并未指定网络模式(默认为bridge模式)运行项目
项目可以正常通过192.168.111.115访问,然后一个偶然的机会发现居然可以192.168.111.115:3000也能访问到,
于是进行了以下尝试
尝试一:
在网上搜了解决方法,是在docker的配置文件daemon.json加入
{
"iptables": false
}
从新启动docker,通过docker info发现如下警告:
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
而且这样操作发现项目访问速度也比原来慢了.
于是重新启用docker的iptables.
尝试二:
使用服务器firewall-cmd 命令,设置了3000端口的入方向的限制
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" port protocol="tcp" port="3000" reject'
firewall-cmd --permanent --add-rich-rule='rule family="ipv6" port protocol="tcp" port="3000" reject'
发现不管用.仍可以通过3000端口访问到.
尝试三:
尝试在docker run 中设置 --net=host 模式,问题得到解决,但这样就没有网络隔离,安全性差了.
求助:
有没有什么方法实现, 我即使用bridge模式, 又可以限制外部仅可以通过ip访问到项目,而ip:3000 访问不了?
CTang
如何将一个并列形式的数组对象,根据字段改为嵌套形式?
我有如下代码:
Chapters = [{
level: '1',
content: '案例概况010000-170900',
url: '案例概况010000-170900.html'
},{
level: '2',
content: '案例概况010100-170901',
url: '案例概况010100-170901.html'
},{
level: '2',
content: '案例概况010200-170902',
url: '案例概况010200-170902.html'
},{
level: '3',
content: '案例概况010201-170903',
url: '案例概况010201-170903.html'
},{
level: '1',
content: '案例概况020000-170904',
url: '案例概况020000-170904.html'
},{
level: '1',
content: '案例概况030000-170905',
url: '案例概况030000-170905.html'
},{
level: '2',
content: '案例概况030100-170906',
url: '案例概况030100-170906.html'
}]
我想将上述代码按照 level 字段划分,改造成如下格式
Chapters = [{
level: '1',
content: '案例概况010000-170900',
url: '案例概况010000-170900.html',
Childs: [{
level: '2',
content: '案例概况010100-170901',
url: '案例概况010100-170901.html',
Childs: []
},{
level: '2',
content: '案例概况010200-170902',
url: '案例概况010200-170902.html',
Childs: [{
level: '3',
content: '案例概况010201-170903',
url: '案例概况010201-170903.html'
}]
}]
},{
level: '1',
content: '案例概况020000-170904',
url: '案例概况020000-170904.html',
Childs: []
},{
level: '1',
content: '案例概况030000-170905',
url: '案例概况030000-170905.html',
Childs: [{
level: '2',
content: '案例概况030100-170906',
url: '案例概况030100-170906.html'
}]
}]
层级可能不限于 3 级,所以我能想到的是使用递归,但是尝试写了几遍均已失败告终
还望解答,万分感谢!
CTang
elementui开发的表单,控件获取焦点时导致页面抖动,如何处理?
我看官方的示例"demo"在有滚动条的情况下,未出现这个问题,需要看你的代码具体分析。
建议使用注释大法,挨个元素注释,找出肇事元素。
也可以去"https://stackblitz.com/" (https://link.segmentfault.com/?enc=Oevf8%2BeRkDEDT0xeS6v%2Bvw%3D%3D.sfgNvPwhM7AFU09a%2BMM4zLYiPylxRSrhPu3S7kv29J4%3D)弄个在线"demo"贴出来,大家才好帮你看。
CTang
js for循环怎么实现如下输出?
console.log(new Array(10).fill(0).map((_, i) => Math.ceil((i + 1) / 3)))
console.log(new Array(10).fill(0).map((_, i) => (i % 3) + 1))
CTang
这道算法题怎么解?
from collections import deque
directions = {'rtl': (-1, 0), 'ltr': (1, 0), 'ttb': (0, -1), 'btt': (0, 1)}
def min_steps_to_sort(matrix):
n = len(matrix)
target = [[i for i in range(1, n*n)] + [0]]
# 将矩阵转换为易于处理的表示形式
initial_state = flatten_matrix(matrix)
queue = deque([(initial_state, [])])
visited = set()
while queue:
state, steps = queue.popleft()
if state == target:
return steps
for pos in find_zero(state): # 寻找当前状态下的空格子位置
x, y = pos
for direction, (dx, dy) in directions.items():
new_pos = (x + dx, y + dy)
if 0 <= new_pos[0] < n and 0 <= new_pos[1] < n:
new_state = move_zeros(state, pos, new_pos)
if new_state not in visited:
visited.add(new_state)
queue.append((new_state, steps + [(pos, direction, count_zeros_in_direction(state, pos, direction))]))
return None # 如果无法到达目标状态,则返回None
# 辅助函数:将矩阵展平为一维数组
def flatten_matrix(matrix):
...
# 辅助函数:查找矩阵中0的位置
def find_zero(state):
...
# 辅助函数:将空格子从一个位置移动到另一个位置
def move_zeros(state, from_pos, to_pos):
...
# 辅助函数:统计在指定方向上有多少个连续的0需要移动
def count_zeros_in_direction(state, start_pos, direction):
...
CTang
MySQL中学号字段类型选择:int还是char?
mysql:我现在想做一个用户信息表,字段中有学生学号,请问学号该用int类型还是char类型?
新手
CTang
动态添加时间范围,如何置灰已选择时间?
父组件代码
{{
item.startTime + "-" + item.endTime
}}
编辑
// 组件
import AddTime from "./component/addTime.vue";
// utils
import { deepClone } from "js-fastcode";
export default {
name: "VueTemplateIndex",
components: { AddTime },
data() {
return {
companyArr: [],
companyPos: 0,
showAddDialog: { visible: false },
idx: "", // 编辑当前行行数
tableData: [],
};
},
mounted() {
const season = ["春季", "夏季"];
const period = ["尖峰", "高峰", "低谷"];
this.tableData = Array.from({ length: season.length }, (_, i) =>
period.map((pj, j) => ({
season: season[i],
period: pj,
timeList: [],
}))
).flat();
this.merge(this.tableData);
},
methods: {
// 表格行合并方法
merge(tableData) {
// 要合并的数组的方法
this.companyArr = [];
this.companyPos = 0;
for (let i = 0; i 0 ? 1 : 0; // 如果被合并了_row=0则它这个列需要取消
return {
rowspan: _row_1,
colspan: _col_1,
};
}
},
// 新增数据
handleFormEdit(list, index) {
let arr = deepClone(this.tableData),
brr = [];
brr = arr
.filter((item) => item.season === list.season)
.map((item) => item.timeList)
.flat();
this.idx = index;
this.showAddDialog = {
visible: true,
title: "编辑",
data: brr,
list: list.timeList,
};
},
// 新增回调
getAddResult(list) {
this.tableData[this.idx].timeList = list;
},
},
};
子组件代码
取 消
确 定
import { devideTimes, deepClone } from "js-fastcode"; // 引入自定义js库
export default {
name: "",
props: {
showAddDialog: {
type: Object,
default: () => ({}),
},
},
data() {
return {
tableData: [],
propsData: [], // 存储父组件传递过来的时间段
allAddData: [], // 存储所有已选时间段
};
},
watch: {
showAddDialog: {
handler(newVal, oldVal) {
this.tableData = [];
// 如果当前行有数据,则显示当前行数据
if (newVal.list.length) {
this.tableData = newVal.list.map((item) => ({
...item,
disabled: true,
}));
} else {
// 如果当前行没有数据,则默认显示开始时间和结束时间
this.tableData = [{ startTime: "", endTime: "" }];
}
for (let i in this.endTimeList) {
this.endTimeList[i].disabled = false;
}
for (let i in this.startTimeList) {
this.startTimeList[i].disabled = false;
}
this.propsData = deepClone(newVal.data);
// 将当前季节下的所有时间段都放在数组中
this.allAddData = deepClone(newVal.data);
this.handleDisable();
},
deep: true,
},
},
computed: {
// 获取默认的1-24小时数据
timeOptions() {
return devideTimes(30, 2);
},
startTimeList() {
return this.timeOptions.map((item) => ({
value: item,
label: item,
disabled: false,
}));
},
endTimeList() {
return this.timeOptions.map((item) => ({
value: item,
label: item,
disabled: false,
}));
},
},
mounted() {},
methods: {
// 新增行
handleRowAdd(row, idx) {
this.allAddData = this.handleUnique([
...this.tableData,
...this.propsData,
]);
this.handleDisable();
// 判断开始时间所有项全部是不是禁用状态,如果是则说明所有时段已选择,否则未全部选择
let flag = this.startTimeList.every((item) => item.disabled);
if (flag) {
this.$message.warning("所有时段都已选择");
return false;
}
if (!row.startTime && !row.endTime) {
this.$message.warning("开始时段和结束时段必填");
return false;
}
this.tableData[idx].disabled = true;
this.tableData.push({
startTime: "",
endTime: "",
});
},
// 删除行
handleRowDelete(row, index) {
// 当只有一条数据时,初始化表格数据
if (this.tableData.length === 1) {
this.tableData = [{ startTime: "", endTime: "" }];
} else {
this.tableData.splice(index, 1);
}
this.propsData = this.propsData.filter(
(item) =>
!(item.startTime === row.startTime && item.endTime === row.endTime)
);
this.allAddData = this.handleUnique([
...this.tableData,
...this.propsData,
]);
this.handleDisable();
},
// 数组对象去重
handleUnique(arr) {
let obj = {};
return arr.reduce((cur, next) => {
obj[next.startTime + next.endTime]
? ""
: (obj[next.startTime + next.endTime] = true && cur.push(next));
return cur;
}, []);
},
// 切换起始时间
handleStartChange(time) {
let times = this.timeOptions;
// 找到所选开始时间的下标
let start_index = times.findIndex((value) => value === time.startTime);
// 将结束时间小于开始时间的选项禁用
for (let i = 0; i {
start.disabled = false;
});
// 遍历所有已选时间段
this.allAddData.forEach((item) => {
let start_index = times.findIndex((value) => value === item.startTime);
let end_index = times.findIndex((value) => value === item.endTime);
this.startTimeList.forEach((start, i) => {
if (i >= start_index && i = 2 &&
this.tableData.some(
(item) => item.startTime === "" || item.endTime === ""
);
if (flag) {
this.$message.warning("请将所有时段填写完整");
return false;
}
// 提交时将未填写时段的数据去除,主要是针对只有一条数据未填写情况
this.tableData = this.tableData.filter(
(item) => item.startTime && item.endTime
);
this.showAddDialog.visible = false;
this.$emit("get-add-result", this.tableData);
},
},
};
.remove-icon,
.plus-icon {
font-size: $fs22;
vertical-align: middle;
margin-left: 10px;
}
CTang
如何在Vue3+TS+Element Plus项目中实现Excel文件上传与数据导入?
后端要提供两个接口,上传和导入,前端需要把文件的数据处理好,直接传入接口里就可以。
解析excel数据,可以使用xlsx
import * as XLSX from 'xlsx';
const processExcel = (file) => {
const reader = new FileReader();
reader.onload = (e) => {
const data = new Uint8Array(e.target.result);
const workbook = XLSX.read(data, { type: 'array' });
// 处理 workbook 中的数据
const sheetName = workbook.SheetNames[0];
const worksheet = workbook.Sheets[sheetName];
const jsonData = XLSX.utils.sheet_to_json(worksheet);
console.log(jsonData);
};
reader.readAsArrayBuffer(file);
};
CTang
iOS中webview_flutter插件上下文菜单语言显示为英文的解决方法?
请教下各位大佬,在Flutter中,我使用webview_flutter插件来嵌入网页.在ios 中长按显示的上下文菜单默认显示的是英文.
请问各位大佬们有办法解决吗!
"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241004/b37cde401cc2482414b450f01cff3904.png)
1.设置 ios 系统语言:
打开ios"设置"应用。
滚动并点击"通用"。
点击"语言与地区"。
点击"iPhone语言"。
选择"中文(简体)"
结果:不起作用,但是浏览器中的上下文菜单能正确显中文
2.
class AppMobile extends StatelessWidget {
const AppMobile({super.key});
@override
Widget build(BuildContext context) {
return ScreenUtilInit(
useInheritedMediaQuery: true,
designSize: const Size(AppConfig.screenW, AppConfig.screenH),
minTextAdapt: true,
splitScreenMode: true,
builder: (context, child) {
return MaterialApp(
localizationsDelegates: [
//设置pull_to_refresh库多语言
RefreshLocalizations.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
theme: ThemeData(
// scaffoldBackgroundColor: Color(0xffF2F4F9), // 这里设置你想要的颜色
),
supportedLocales: [
const Locale('zh', 'CN'), // 添加中文(简体)支持
],
onGenerateRoute: Application.router.generator,
);
});
}
}
不起作用