导师小jio
如何解决侧边栏菜单点击收齐时宽度回弹的问题?
分析
因为这个不涉及到js,存样式行为。所以我觉得当你折叠的时候,隐藏"菜单文字"那块还有行内元素宽度。
1、你看看用v-if与v-show方式都试试
2、或将"菜单文字"div容器不用padding用margin
3、又或"菜单文字"div容器不用padding与margin,对icon配置margin-left方式
所以我觉得问题在 "菜单文字"容器那块 F12看看"元素"的变化。仅个人猜想希望对你有帮助。
导师小jio
为什么我的小程序没有“长期订阅”?
所有非民生类型的小程序都是没有长期推送的。
«暂时仅向政务民生、医疗、交通、金融、教育等线下公共服务开放长期提醒。»
* "小程序模板消息能力调整通知" (https://link.segmentfault.com/?enc=Vl5dSesTxIGHF%2BJ%2F%2Fdkslg%3D%3D.l64AETSVXH3lorenYi0ocQl7HqM3GM9fg7yx0VjOSmbA8gVidaHgcL8sz1HHqCwoaUnIT2RL%2BnENSjRuL6AOqCL5rwfFMRqueAcWdz9JekUWgWN3hm57dwQaNXJRrfGC)
起码两三年前就是这样了,当时我也在寻找相关的解决方案,最后还是用了小程序+服务号的方式推送。
* "微信小程序学习日记 L09 消息推送" (https://link.segmentfault.com/?enc=AA8wRmqA5ZXTCEfYLQKuiw%3D%3D.LW9t73Z%2BQH6qBjvy2iYhYImGA0SjeJ7f7CV4b466EafmZn%2F2Snz%2BRKbLe87TSTI5qQLQPlxaap6Lco0oBarfsaEcFUxpxmQPjYVDLwkEdLE%3D)
但是一次性订阅消息 还是可以保持很长时间的,只是说对于推送条数有限制:
«一次调用最多可订阅3条消息»
* "开放接口 / 订阅消息 / wx.requestSubscribeMessage" (https://link.segmentfault.com/?enc=NJgTum8ycqWyB%2Bad1y0Tyg%3D%3D.8qvU7xwU6jUbtkW4zqnjVjL2MDXt1%2FEV2%2BfBd15q%2F9CZrd66tTEa%2FIBvI1h3IKyyRnn2xACcdr4Jx1dJstFEJDQ26BTgBE2zNTuNbdEuxVk8AIN9q6qBLrk%2BtrMchuZrYkU%2F5pGMT6ZyeG4JPYjslEgs9GXKUNrFwyEokgernIGyzhHhlzWv0d2xIyiYy76m)
导师小jio
VTable使用问题:怎么自定义弹出框tooltip内容?
参考这个:
«"https://www.visactor.io/vtable/demo/example/component/tooltip..." (https://link.segmentfault.com/?enc=0WEMEjWWcplF1fjZ%2BVKpXg%3D%3D.elxWS0IE1q7Ug9s4EMeByYlJrSDBlW4QIQRHE344syfjYgu7IzxVQtsAWmhsWTLVV0HY4nZy7VMm%2F0Tf77cgCsmzGi0%2Bj2hQmZpJfAxv%2BiY%3D)
»
const container=document.getElementById(CONTAINER_ID);
const popup = document.createElement('div');
Object.assign(popup.style, {
position: 'fixed',
width: '300px',
backgroundColor: '#f1f1f1',
border: '1px solid #ccc',
padding: '20px',
textAlign: 'left'
});
function showTooltip(infoList, x, y) {
popup.innerHTML = '';
popup.id = 'popup';
popup.style.left = x + 'px';
popup.style.top = y + 'px';
const heading = document.createElement('h4');
heading.textContent = '数据信息';
heading.style.margin = '0px';
popup.appendChild(heading);
for (let i = 0; i res.json())
.then(data => {
const option = {
records: data,
rowTree: [
{
dimensionKey: 'Category',
value: 'Furniture',
hierarchyState: 'expand',
children: [
{
dimensionKey: 'Sub-Category',
value: 'Bookcases',
hierarchyState: 'collapse'
},
{
dimensionKey: 'Sub-Category',
value: 'Chairs',
hierarchyState: 'collapse'
},
{
dimensionKey: 'Sub-Category',
value: 'Furnishings'
},
{
dimensionKey: 'Sub-Category',
value: 'Tables'
}
]
},
{
dimensionKey: 'Category',
value: 'Office Supplies',
children: [
{
dimensionKey: 'Sub-Category',
value: 'Appliances'
},
{
dimensionKey: 'Sub-Category',
value: 'Art'
},
{
dimensionKey: 'Sub-Category',
value: 'Binders'
},
{
dimensionKey: 'Sub-Category',
value: 'Envelopes'
},
{
dimensionKey: 'Sub-Category',
value: 'Fasteners'
},
{
dimensionKey: 'Sub-Category',
value: 'Labels'
},
{
dimensionKey: 'Sub-Category',
value: 'Paper'
},
{
dimensionKey: 'Sub-Category',
value: 'Storage'
},
{
dimensionKey: 'Sub-Category',
value: 'Supplies'
}
]
},
{
dimensionKey: 'Category',
value: 'Technology',
children: [
{
dimensionKey: 'Sub-Category',
value: 'Accessories'
},
{
dimensionKey: 'Sub-Category',
value: 'Copiers'
},
{
dimensionKey: 'Sub-Category',
value: 'Machines'
},
{
dimensionKey: 'Sub-Category',
value: 'Phones'
}
]
}
],
columnTree: [
{
dimensionKey: 'Region',
value: 'West',
children: [
{
value: 'Sales',
indicatorKey: 'Sales'
},
{
value: 'Profit',
indicatorKey: 'Profit'
}
]
},
{
dimensionKey: 'Region',
value: 'South',
children: [
{
value: 'Sales',
indicatorKey: 'Sales'
},
{
value: 'Profit',
indicatorKey: 'Profit'
}
]
},
{
dimensionKey: 'Region',
value: 'Central',
children: [
{
value: 'Sales',
indicatorKey: 'Sales'
},
{
value: 'Profit',
indicatorKey: 'Profit'
}
]
},
{
dimensionKey: 'Region',
value: 'East',
children: [
{
value: 'Sales',
indicatorKey: 'Sales'
},
{
value: 'Profit',
indicatorKey: 'Profit'
}
]
}
],
rows: [
{
dimensionKey: 'Category',
dimensionTitle: 'Catogery',
width: 'auto'
},
{
dimensionKey: 'Sub-Category',
dimensionTitle: 'Sub-Catogery',
width: 'auto'
}
],
columns: [
{
dimensionKey: 'Region',
dimensionTitle: 'Region',
headerStyle: {
textStick: true
},
width: 'auto'
}
],
indicators: [
{
indicatorKey: 'Sales',
caption: 'Sales',
width: 'auto',
showSort: false,
headerStyle: {
fontWeight: 'normal'
},
format: rec => {
if (rec) {
return '$' + Number(rec.Sales).toFixed(2);
}
return '';
},
style: {
padding: [16, 28, 16, 28],
color(args) {
if (args.dataValue >= 0) {
return 'black';
}
return 'red';
}
}
},
{
indicatorKey: 'Profit',
caption: 'Profit',
width: 'auto',
showSort: false,
headerStyle: {
fontWeight: 'normal'
},
format: rec => {
if (rec) {
return '$' + Number(rec.Profit).toFixed(2);
}
return '';
},
style: {
padding: [16, 28, 16, 28],
color(args) {
if (args.dataValue >= 0) {
return 'black';
}
return 'red';
}
}
}
],
corner: {
titleOnDimension: 'row',
headerStyle: {
textStick: true
}
},
widthMode: 'standard',
rowHierarchyIndent: 20,
rowExpandLevel: 1,
dragHeaderMode: 'all'
};
const tableInstance = new VTable.PivotTable(document.getElementById(CONTAINER_ID), option);
window.tableInstance = tableInstance;
tableInstance.on('mouseenter_cell', args => {
const { cellRange, col, row } = args;
debugger;
const value = tableInstance.getCellValue(col, row);
const cellHeaderPaths = tableInstance.getCellHeaderPaths(col, row);
const infoList= [];
cellHeaderPaths.rowHeaderPaths?.forEach((headerDimension) => {
infoList.push(
headerDimension.indicatorKey
? headerDimension.indicatorKey + ': ' + value
: headerDimension.dimensionKey + ': ' + headerDimension.value
);
});
cellHeaderPaths.colHeaderPaths?.forEach((headerDimension) => {
infoList.push(
headerDimension.indicatorKey
? headerDimension.indicatorKey + ': ' + value
: headerDimension.dimensionKey + ': ' + headerDimension.value
);
});
const container=document.getElementById(CONTAINER_ID);
const containerRect=container.getBoundingClientRect();
if (!tableInstance.isHeader(col, row)) {
showTooltip(infoList, cellRange?.left+containerRect.left, cellRange?.bottom+containerRect.top);
} else {
hideTooltip();
}
});
tableInstance.on('mouseleave_cell', args => {
const { cellRange, col, row } = args;
hideTooltip();
});
tableInstance.on('mouseleave_table', args => {
const { cellRange, col, row } = args;
hideTooltip();
});
});
导师小jio
Flutter SDK上传文件 403?
是这个原因造成:"key doesn't match with scope" 你上传的key的scope 要和token中的一致
导师小jio
如何配置坐标轴的范围?
在双轴图里,右边的坐标轴表示的是百分比,这个百分比的范围可以手动配置吗?我用的是 vchart 的,我配置了min和 max 但是没有生效。
"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20250106/47aaa9f2cee81c46909aa5d6f8e9d678.png)
具体配置:
{
type: 'common',
seriesField: 'color',
data: [
{
id: 'id0',
values: [
{ x: '2021-10-22', type: 'A', y: 10 },
{ x: '2021-10-23', type: 'B', y: 22 },
]
},
{
id: 'id1',
values: [
{ x: '2021-10-22', type: 'TA', y: 0.5 },
{ x: '2021-10-22', type: 'TB', y: 1.1 },
{ x: '2021-10-23', type: 'TA', y: 1 },
{ x: '2021-10-23', type: 'TB', y: 1.5 },
]
}
],
series: [
{
type: 'bar',
id: 'bar',
dataIndex: 0,
label: { visible: true ,position:'inside'},
seriesField: 'type',
xField: 'x',
yField: 'y',
max: 100
},
{
type: 'line',
id: 'line',
dataIndex: 1,
label: { visible: true },
seriesField: 'type',
xField: 'x',
yField: 'y',
min: 0,
max: 2,
stack: false
}
],
axes: [
{ orient: 'left', seriesIndex: [0] },
{ orient: 'right', seriesId: ['line'], gird: { visible: false }},
{ orient: 'bottom', label: { visible: true }, type: 'band' }
],
}
导师小jio
弹性布局 在允许 收缩,但是不允许换行的条件下 为什么没有收缩而是溢出了?
现象
"https://demo.cssworld.cn/new/6/2-2.php" (https://link.segmentfault.com/?enc=OxaNoTDUfhCloAvLGEWTgQ%3D%3D.zIPo24Xt9%2BxVbBxyrnLSA%2FOn%2B5jFV%2FYLzGRGTX4s59%2BOIVLP8mQ9yy5R%2Ff30iBmm)
"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20250102/b755c1a18b7f2f67571806c5a54018d7.png)
1. container容器的宽度是320px
2. 内部子元素的 累计宽度大于320px
3. 弹性子元素的 flex-shrink 值为1 ,也就是默认允许收缩
4. flex-wrap的默认值为nowrap ,表示不允许换行
问题: 既然不允许换行,但是允许收缩,为什么 子元素 没有收缩适应弹性容器,而是溢出了?
我些的测试
"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20250102/beb03cc24b7152bdc2ffc867f3ea2a4d.png)
为啥 会出现两种不同的效果?
导师小jio
echarts 堆叠柱状图 最小值怎么放大?
"barMinHeight 不管用" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241231/c200ef2732aca09edb489cf69e9e7cf6.png) 用
barMinHeight 不管用
导师小jio
vue2项目封装的表单组件传递数据的时候到底要不要传递object类型?
比如是list列表 --> detail组件 ,这样绑定,在detail修改属性值会影响list的列表数据。
可以传object,但要深拷贝一下
导师小jio
vue3setup语法糖,引入局部组件,使用短横线命名报错,什么问题,如何解决?
由于规范需要使用短横线命名组件,但是报错'EditModal' is defined but never used.eslint@typescript-eslint/no-unused-vars
import EditModal
是什么问题,如何解决
{
editModal.visible = false;
}
"
@ok="
() => {
editModal.visible = false;
reload();
}
"
/>
import EditModal from './edit-modal/index.vue';
导师小jio
python的round函数怎么用?
"round" (https://link.segmentfault.com/?enc=tYE%2FP7PDLXWnjWrg3D7EjQ%3D%3D.if%2FgpRDNdJ3fYMsxNjhaoGd2kSj76IjEvEPDYD%2BwZFa35s7IzgDM3Im28ADMNDm91b0POoH14ArUFDPRh4ej1Q%3D%3D)
«备注
对浮点数执行 round() 的行为可能会令人惊讶:例如,round(2.675, 2) 将给出 2.67 而不是期望的 2.68。
这不算是程序错误:这一结果是由于大多数十进制小数实际上都不能以浮点数精确地表示。 请参阅
"浮点算术:争议和限制" (https://link.segmentfault.com/?enc=2xsJpDch3cxgyFRrVPiwjA%3D%3D.zSNXTFndbf8ETasDqBo0MadUh5hgZqAFJZZ%2Bq2lm9%2FoYUyTXB7dOBjmXIltdjQ3rYvqo2GbKoyIZe%2BDy5V89hHkfXBMwAcd%2BgnVGZawx9xA%3D)
了解更多信息。»
浮点数不能精确十进制小数,你看的2.355 并不是 2.355。
>>> "{:.60f}".format(2.355)
'2.354999999999999982236431605997495353221893310546875000000000'
导师小jio
想请问下, 若依-vue2为什么添加本地静态路由, 在菜单里不显示呢?
因为若依的路由是从网上请求并加载的,下载后会对请求来的数据进行存储处理,导航路由侧边栏路由等路由数据都在这里
"src/permission.js"
"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241213/42e1db0844c225fc4d9d82a7fec62985.png)
这个"store.dispatch('GenerateRoutes')"的代码在"src/store/modules/permission.js",也是关键所在,有请求路由的,有对路由进行存储的,你可以把里面的getRouters去掉,里面的res.data换成你定义的路由,导航路由侧边栏路由等数据都在这里,是sidebarRoutes
"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241213/5fda3b1783b6ef56f9d616a02cc2166d.png)
导师小jio
公交卡充值问题?
问题描述
小明去公交卡充值中心为自己的公交卡充值,公交充值中心搞了一个充值优惠活动,活动详情如下:
(1)充值200元~299元,赠送50元余额到卡中;
(2)充值300元~499元,赠送100元余额到卡中;
(3)充值500元及500元以上,赠送200元余额到卡中;
(4)充值200元以下,则没有赠送活动;
比如:小明如果充值350元,那么实际卡中到账的金额将会是450元(350元充值 + 100元赠送)。
请编程帮助公交卡充值中心,根据客户的充值金额,计算实际应当到账的金额?
问题出现的平台版本及自己尝试过哪些方法
忽略了200以下充值金额没有赠送活动,只输出充值数;以及充值的大范围没有考虑进去。
相关代码
粘贴代码文本(请勿用截图)
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
if(n>=1 && n=200 && n=300 && n=500)
System.out.println(n+200);
else
System.out.println(n);
}
}
}
你期待的结果是什么?实际看到的错误信息又是什么?
小组讨论,已经解决此问题。
导师小jio
前后端 页面url与api url 如何统一命名风格?
* 打算把页面url,与api url做一个风格统一,查了许多大佬的文章和分析,最后常用的有rest,rpc风格,因为才接触这些风格,恐未掌握其精髓,所以下面定义用了似rest风格.希望得到大家的建议与使用经验,哪种风格更适合监控,更加适合应付生产线上碰到的一些url问题.
* rest,用 get,post,put,delete来定义动作,围着一个地址,好处,简洁.但多语义比较乏力.
* rpc, 完全用url定义作用.
前端页面
url | -
---|---
/content/{id:123} | 内容详细页
/contents?order=create_time,desc | 内容列表页
/contents/query?create_time=2023/09/01,2023/10/01 | 搜索
/content/{id:123}/edi | 内容编辑页
/content/create | 内空创建
/content/edit?id=123 | 创建编辑页为同一个页面
供前端调用api - 似rpc风格
method | url | -
---|---|---
get | /content/get | 单条详细,
get | /content/lists?order=file,desc | 列表
get | /content/query?type=best | 查询
post | /content/create | 新建
post | /content/update | 更新
post | /content/delete | 删除
post | /content/favorite | 收藏
供前端调用api - 似rest风格
method | url | -
---|---|---
get | /contents/{id:123} | 单条详细
get | /contents?order=file,desc | 列表
get | /contents/query?type=best | 查询
post | /contents | 新建
put | /contents/{id:123} | 更新
delete | /contents/{id:123} | 删除
post | /contents/{id:123}/favorite | 收藏
导师小jio
typeorm关联查询某个数据项的total应该怎么写?
const user = this.userRepository
.createQueryBuilder('user')
.leftJoin('user.tel', 'tel')
.addSelect('COUNT(DISTINCT tel.id)', 'totalTel')
.groupBy('user.id')
.getOne();
return user;
一个user有多个tel,是一对多的关系,现在我需要查询某个user,并且关联出tel的数量,上面的写法,user没有totalTel字段。
{
id:1,
userName: 'aaa'
}
而改成getRawOne就有totalTel字段,但是其他字段都是数据库定义的下划线,而非驼峰的形式。
{
id:1,
user_name: 'aaa',
totalTel: 1,
}
getOne应该怎么增加totalTel字段。
导师小jio
in 条件中有group by 导致无法执行?
SELECT id, user_id, item_id
FROM questionnaire_answer_old_0
WHERE item_id IN (
SELECT item_id
FROM questionnaire_answer_old_0
GROUP BY user_id, item_id
HAVING COUNT(user_id) > 1 AND COUNT(item_id) > 1
);
代码如上,子查询能正常执行。问题是整个执行时一直无反应,也不报错,一直显示正在查询,去掉子查询里的group by 就能正常执行,请问是什么原因?
导师小jio
TS2322 可以使用约束 "number" 的其他子类型实例化 "T"?
泛型T继承自number,也就是说number的子类型也符合,比如具体的某些数值1/2/3:
const n: 1 | 2 | 3 = 2;
new RawText(n)
所以你的w参数并不一定是范围更广的number,所以这里报错了,提醒你这里可能是number的子类型
导师小jio
nodejs往数据库插入数据的问题?
你先把数据库清空再插入,因为id重了,要不你就不写id把sql换成
const sql = `INSERT INTO sensitive_nems (isensitive_txt) VALUES (?);`; // 根据你的数据库表结构替换(column1, column2, ...)
const values = [ jsonData[i]]; // 将对应字段的值填入插入语句中
导师小jio
想问大家确定一个事情,h5页面嵌入小程序webview中,能否直接点击下载图片到手机相册,谢谢?
我目前已经实现了h5页面 通过html2canvas
转成画布,这种画布,我也可以把这个画布转成64位,通过接口,返回一个真正的图片线上地址,然后让用户,长按保存,
但是我现在不知道能不能直接通过点击按钮的方式,直接保存到用户相册?如果确实不能的话,我就按上面说的去做了,
导师小jio
求解一个警告?
Warning: "onSearch" should work with "showSearch" instead of use
alone.(**.ts:50)
这个警告是什么意思?如何解决呢?
import { defineStore } from "pinia";
interface AddDisplayItem {
component: string; // 组件名称
data?: any; // 传入组件的数据
transition?:
| "fade-in-linear"
| "fade-in"
| "zoom-in-center"
| "zoom-in-top"
| "zoom-in-bottom"; // 组件的显隐动画
}
interface DisplayItem extends AddDisplayItem {
zIndex: number; // 组件的zIndex 样式
show: boolean; // 组件的show 样式
}
interface SetDisplayItem {
zIndex: number;
show?: boolean;
data?: any;
}
// 作为弹窗层级 及 唯一标识
const ZINDEX = 50;
let zIndex: number = ZINDEX;
export const useCounterStore = defineStore("popups", {
state: () => {
return {
displayItem: [] as Array,
};
},
actions: {
/** 添加弹窗 dataTs 应当是全新对象 */
addPopup(dataTs: AddDisplayItem): number {
// 类型转换
let data = dataTs as DisplayItem;
// 累加弹窗层级 若要自定义zIndex,需自行在组件内部设置样式进行覆盖
data.zIndex = ++zIndex;
Object.defineProperty(data, "zIndex", {
writable: false,
configurable: false,
});
// 动画名称
data.transition = data.transition || "fade-in-linear";
// 添加展示项
this.displayItem.push(data);
// 触发 transition 动画
requestAnimationFrame(() => {
this.setPopupConfig({ zIndex: data.zIndex, show: true });
});
// 由于zIndex的唯一性,返回其作为后续操作的标识符
return zIndex;
},
/** 删除弹窗 */
deletePopup(zIndex: number) {
this.displayItem = this.displayItem.filter((e) => e.zIndex != zIndex);
// 关闭所有弹窗时复位层级
if (this.displayItem.length == 0) zIndex = ZINDEX;
},
/** 设置属性 data 应当是全新对象 */
setPopupConfig(data: SetDisplayItem) {
let item = this.displayItem.find((e) => e.zIndex === data.zIndex);
delete data.zIndex;
if (item) Object.assign(item, data);
},
},
});
导师小jio
微前端无界框架下子应用怎么使用document.documentElement.setAttribute方法?
window.document.documentElement.setAttribute可以试试
导师小jio
vue3 +element plus 表格怎么暂时一行数据中其它数组数据?
解决办法就是把 map 一下,然后 flat, 这样就是六条数据
然后合并单元格
***
另一个方法就是用 slot,一个单元格渲染两个数据, v-for 循环呗。
这个方法需要自己补一下线,也可以用hr当线,然后把最后一个隐藏。但是有可能单元格会有 padding,弄起来比较复杂
导师小jio
app是怎么主动发送通知给手机的 就算你没有启动这个app?
主要分为两个主流平台 Android,IOS 这两家其实都提供了 push 的功能,也就是开发者能通过调用系统的api,系统接收推送消息。
* Android 上有 GCM (Google Cloud Messaging)
* iOS 上有 APNs(Apple Push Notification service)
所以其实应用并不需要启动就能收到消息,因为处理通知消息的是系统,但是 Android 的GCM是依赖于 Google
服务,因为大家都知道的原因,安卓的GCM基本是处于不可用的状态,各大平台厂商开始了骚操作。
国内各大平台陆续推出了GCM的替代品但是基本都是各自为战,
有系统级的推送服务比如小米,华为,OPPO,他们都做了推送系统服务,你应用接入相关sdk,就能使用系统的推送服务,也可以实现应用没启动来收到消息,但是你需要接入各个系统的sdk,而且不一定每个系统都会做推送服务,毕竟国内的安卓百花争艳。
也有应用级的系统服务,比如说腾讯做了推送服务,在以前一个平台的app可以做到相互"拉起,唤醒,保活" 只要有一个腾讯系的产品在,就能收到消息。
推送服务商是绝大部分 APP 都会优先考虑采用方案,目前应用最为广泛的第三方推送服务提供商包括个推、极光、友盟、小米、华为、BAT
等。有这些服务商,开发者也就不需要整合这么sdk,直接有服务商整合完成,开发者只需要调用一个接口就行了。
导师小jio
如何解决mask引入本地图片导致的跨域问题?
用本地服务器启动文件,要以 http(s) 协议来访问文件,不要使用 file:// 协议
导师小jio
服务器给前端弹登录框问题,应该如何解决?
网站点击登录的时候莫名其妙的弹出了一个登录弹窗(确定不是前端弹的),这个有可能是什么原因呢
"ask.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241115/11fb9c53a560ad1cd75b3533e246c072.png)
已排除前端原因,如果是服务器接口原因,那么应该如何解决呢
导师小jio
Keep Unit Test Running如何实现热部署仅加载一次环境?
Keep Unit Test Running
如何实现热部署,加载一次spring的环境,无需多次加载执行test方法。"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241112/83a9744fe2ef8f21d09dae6136445139.png)
已经安装了两个插件,不知道如何进行整合
导师小jio
手机开启ftp远程管理,Mac笔记本只能拷贝手机上的文件,但是不能把Mac上的文件拷贝到手机上,怎么破解呢?
手机开启ftp远程管理,Mac笔记本只能拷贝手机上的文件,但是不能把Mac上的文件拷贝到手机上,怎么破解呢?
开启Mac的远程管理
导师小jio
后台管理系统浏览器内存占用过高,怎么排查?
录制然后分析代码 心里都有个大概
"image.png" (https://wmlx-new-image.oss-cn-shanghai.aliyuncs.com/images/20241108/80acd91ef306255f96329c8bdbaee935.png)
导师小jio
提升JWT安全性:如何设计有效的加盐密钥?
正常业务, jwt 本来就不推荐存储敏感的资源,一般都是存个 UserId , 然后在使用 userId 来进行用户信息的获取,而且, 如果 jwt
存储一些数据信息, 如果数据存在更新,已生成的 jwt 也无法更新于收回, 总得来说,不管 jwt 如何提高安全性, 也不推荐往 jwt 中 进行信息的传输
导师小jio
项目中使用国际化插件,设置语言对象时只能对已知内容设置,如何实现对动态获取内容的语言设置?
做不到,除非你们后端存的和给你返回的都是i18n对象的key,然后就能根据key来匹配翻译后的语言了
导师小jio
uni打包小程序提示'工具的服务端口已关闭'?
那没办法,只能你手动去开,这个控制台不支持交互
导师小jio
margin 为负边距好像没有生效???
结题
蓝色div设置border, 导致实际宽度大于200.所以margin-right=200px 不够
导师小jio
关于 promise reduce执行顺序?
问题1:为何p1和p2为什么都是打印1楼上的大佬已经给出了原因,
至于问题2:p1和p2都在runPromiseInSequence之前执行;这是由于同步代码、异步代码的微任务队列先后执行顺序;arr.reduce同步代码的执行相当于执行Promise.resolve(10).then(p1).then(p2).then(f3).then(p4);
而promise.then的程序会被加入微任务队列中执行,所以会和下面的Promise.resolve(1).then(2).then(console.log);
Promise.reject(1).then(2, 2).then(console.log, console.log);
中的.then程序交替进入微任务队列执行。同时其中return new
Promise((resolve,reject)=>{resolve()})还会带来另一个问题,可以参考这位大佬的回复
"image.png" (https://wmlx-new-image.oss-cn-shanghai.aliyuncs.com/images/20241028/a1f8a922a65ed21cf73dc32653035745.png)
导师小jio
react项目build之后的index.html有问题,怎么解决?
打包后的项目需要放到服务器上预览,或者本地起一个静态服务也行。
导师小jio
python3.12 为什么无法调用__init__中的属性?
使用了python 3.12编写下列程序 运行时报错
class GetConfig(object):
def __int__(self):
current_dir = os.path.dirname(os.path.abspath(__file__))
print(current_dir)
sys_cfg_file = os.path.join(current_dir, "sysConfig.cfg")
self.conf = configparser.ConfigParser()
self.conf.read(sys_cfg_file)
def get_db_host(self):
db_host = self.conf.get("DB", "host")
return db_host
if __name__ == "__main__":
gc1 = GetConfig()
var = gc1.get_db_host()
报错信息:
Traceback (most recent call last):
File "D:\Code\InterfaceCrawlTool\getConfig.py", line 48, in
var = gc1.get_db_host()
^^^^^^^^^^^^^^^^^
File "D:\Code\InterfaceCrawlTool\getConfig.py", line 21, in get_db_host
db_host = self.conf.get("DB", "host")
^^^^^^^^^
AttributeError: 'GetConfig' object has no attribute 'conf'
为什么会提示找不到属性呢?我尝试在__init__方法中加入self.name="test",然后使用
gc1 = GetConfig()
gc1.name 也是报同样的错误
导师小jio
页面文字一行显示,超长显示省略号,并且高亮关键字,当关键字在省略号后面,如何处理才能将关键字显示出来?
出现了省略号,说明宽度已经不够,不能存放下相应的字符内容了,这个时候肯定也就没办法显示了啊。
但是你的数据还是存在的,只要去改变宽度就展示出来。
比如在 vscode 中,当你去搜索的时候,如果字符放不下,高亮的也是不显示的,只有宽度够了才显示,除非你们能够接受换行或者其他什么操作。
"CleanShot 2024-01-10 at 10.09.15@2x.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241015/1a6c6c52ca9e00953e76f53bbd9f88ca.png)
导师小jio
docker,pm2部署nuxt项目启动报错?
项目使用 nuxt2 写的, 现在进行了 npm run build 打包, 想在生产环境中使用docker部署,部署方式如下
上传项目
将打包后的 .nuxt , static , nuxt.config.js , package.json ,
node_modules 上传至服务器 /home/wwwroot/default 下
(nginx等的配置略)
在项目目录创建启动文件
ecosystem.config.json
{
"apps": {
"name": "web",
"cwd": "/home/node",
"script": "./node_modules/nuxt/bin/nuxt.js",
"args": "-c /home/node/nuxt.config.js",
"exec_mode": "cluster",
"instances": 4,
"watch":false,
"error_file": "/home/logs/web-err.log",
"out_file": "/home/logs/web-out.log",
"log_date_format": "YYYY-MM-DD HH:mm:ss",
"autorestart": true,
"max_memory_restart": "500M"
}
}
一. 使用node镜像构建
直接基于拉取的node:16.14.0镜像运行一个容器
$ docker pull node:16.14.0
$ docker run -itd --name nuxtProject01 \
-p 3000:3000 \
-v /home/wwwroot/default:/home/node \
-v /home/logs:/home/logs node:16.14.0
然后进入容器内
$ docker exec -it nuxtProject01 bash
安装pm2
$ npm install pm2 -g
进入容器项目目录并执行ecosystem.config.json
$ cd /home/node && pm2 start ecosystem.config.json
项目可以正常运行
二. 现在使用Dockerfile的方式
Dockerfile文件:
FROM node:16.14.0
RUN npm config set registry https://registry.npm.taobao.org
RUN npm install pm2@5.2.0 -g
WORKDIR /home/node
ENV NODE_ENV=production
ENV HOST 0.0.0.0
EXPOSE 3000
CMD ["pm2-runtime", "start", "ecosystem.config.json"]
使用该 Dockerfile 构建自定义镜像:
$ docker build --no-cache -t nuxtImage:v1.0 .
基于镜像运行一个容器:
$ docker run -itd --name nuxtProject01 \
-p 3000:3000 \
-v /home/wwwroot/default:/home/node \
-v /home/logs:/home/logs nuxtImage:v1.0
现在访问服务,有以下报错:
No build files found in /home/node/ecosystem.config.json/.nuxt/dist/server. 02:09:50
Use either `nuxt build` or `builder.build()` or start nuxt in development mode.
Use either `nuxt build` or `builder.build()` or start nuxt in development mode.
at VueRenderer._ready (node_modules/@nuxt/vue-renderer/dist/vue-renderer.js:4219:13)
at async Server.ready (node_modules/@nuxt/server/dist/server.js:637:5)
at async Nuxt._init (node_modules/@nuxt/core/dist/core.js:720:7)
✖ Nuxt Fatal Error │
│ │
│ Error: No build files found in /home/node/ecosystem.config.json/.nuxt/dist/server. │
│ Use either `nuxt build` or `builder.build()` or start nuxt in development mode.
找不到原因头疼
导师小jio
window.open打开新页面localstorage为什么会丢失?
使用window.open打开同源新tab,新页面localstorage中token丢失。https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241015/2713b4ff4d275567fce126ef4ec87f37.png
导师小jio
使用docker部署lnmp环境的时候,日志问题如何解决?
docker 里的用户实际上是通过内核 namespace
技术隔离出来的,当文件映射到宿主机,他创建的日志理论是就是宿主机运行docker的用户,你其实不用担心用户匹配不上,导致宿主机不能读写日志
导师小jio
如何后台播放音乐?
解决措施
AVSession对媒体播放做了管控,当三方应用从前台切入后台或者进入锁屏状态,媒体播放会被强制暂停而应用不感知,如果要开发后台播放功能,应该启动后台任务管理的长时任务中播放音乐,同时接入AVSession能力,允许控制中心的播控面板控制三方应用的播放功能。
参考链接
"后台任务管理-长时任务,AVSession开发指导参考" (https://link.segmentfault.com/?enc=HXMZ2cH3hAM8uZZx0qie0Q%3D%3D.fFTxVDfD01pClTiAPw1SlYMadLNmnh%2Bnm77AkVN5h2MpQiiT90limc2bBT6L5FZY0P7B%2F%2FMLznsIVr0JfcgjabWqun0xINzQOJCGHrB4z22gJu9ajYIvDYgNg%2BeIqiivuD66KTEVGhlHGboYtOCvHZSwqKRw5iRl5SKpaRXG9rGxmr2fPeeu0%2FSwyuJ1nxyF)
导师小jio
gitlab迁移到docker同时恢复备份失败应该如何解决?
"https://blog.csdn.net/d_d1298/article/details/89672569" (https://link.segmentfault.com/?enc=%2Bfyw8qPYApl%2F0WSofIBVdA%3D%3D.lHABd%2Fh%2Bn7rOAb4hPQezMqcFCWFWD6%2FOoKgK5ZbbEg35r6ADR21P17NGCCP9m1HrR3hoOwOq4UScC8miD3Aw5A%3D%3D)
"https://www.gnu.org/software/tar/manual/html_section/warnings..." (https://link.segmentfault.com/?enc=D8vAkBrttBc7qOs52zqswQ%3D%3D.gQ%2B701NtufFvqX1hBWut3ZeDHYT3T%2Bf%2B9e4%2B4O4VGxeZJq4QBHdFauD%2BMS5f0wLfR3e49HUUmMrF2dTzelE4vnPc3BFBP2FuR4Vcv6wJj6rCbOCmvfI5TPPw3JxMtgfx)
"https://www.ibm.com/support/pages/lone-zero-block" (https://link.segmentfault.com/?enc=ebZKHv%2BGaRbgFKmUNBSeCw%3D%3D.HTtk7gBw26%2FJgZhTKfPZY0sYE0aA%2F%2FargZ2Uy2P3a3GtkwetzdEYuuW53z483lIaw2%2FPyzBj7x25T%2BgJgCZ2wA%3D%3D)
导师小jio
echarts 3D渐变色不生效?
echarts 3D渐变色不生效
echarts渐变色实现方法:"https://blog.csdn.net/qq_44827865/article/details/120043930" (https://link.segmentfault.com/?enc=uDGAyyfTW6lFMnn%2BfQy2Ag%3D%3D.3OjuTXBfH7QKPyjOxii5OHoHE4rbQB3EzD1xFL4qQMiNHAhI6RoXgHyZe2kMoB5QkOleySyMs40puH3UghdSKw%3D%3D)
这里面的方法都试过了,不行,要么全部变成黑色,要么变成了白色,模型是在的但是看不见
"1706167663849.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241012/7a03cfe993288da2527bd30c8b8b5113.png)
导师小jio
withDefaults使用时出现的问题?
"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241010/2b66e5b1b692012f87976e5ccbd17b8c.png)
导师小jio
如何在数据库中创建空间并解决实名认证问题?
无法创建空间https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241011/ec1648ebc571f6321b4bb7f0dd13988e.png
已经实名认证过了
导师小jio
【three.js】如何控制帧更新?
我拿到一段代码片段:
const i = this._shouldRender();
if (i) {
this._renderRequested = !1; // 将当前对象的 _renderRequested 属性设置为 false(注意:在JavaScript中 !1 等同于 false)。这可能意味着渲染请求已经被处理,或者不再需要渲染。
const i = r.Math.incrementWrap(t.frameNumber, 15e6, 1); // 这行代码再次声明了一个常量 i(这会覆盖之前声明的 i),并调用了 r.Math.incrementWrap 方法,传入了三个参数:t.frameNumber(当前的帧编号)、15e6(可能是帧编号的最大值,这里使用的是1500万)、1(增量)。incrementWrap 方法可能是用来增加帧编号,并在达到最大值时将其环绕(wrap)回到起始值。
this.updateFrameNumber(i, e), // 这行代码调用当前对象的 updateFrameNumber 方法,更新帧编号。它传入了新的帧编号 i 和另一个参数 e
t.newFrame = !0 // 将某个对象 t 的 newFrame 属性设置为 true(在JavaScript中 !0 等同于 true)。这可能意味着标记了一个新的渲染帧的开始。
}
// 综合来看,这段代码的作用是检查是否应该渲染新的一帧,如果是,则取消渲染请求标志,更新帧编号,并标记新帧的开始。这是典型的在游戏或者图形应用中用于控制帧更新和渲染的逻辑。
这段代码是用来判断是否渲染新的一帧的,这个我理解。但是,不太理解的是,为啥要给数据打上一个帧编号"t.frameNumber",并对应的进行更新。这个"t.frameNumber"在整个帧更新中的作用是什么?
难道是当前帧数与帧编号相同的就进行渲染更新?还是...?
导师小jio
css 样式求助?
"https://codepen.io/Jin-Moriarty/pen/NWmWNVm" (https://codepen.io/Jin-Moriarty/pen/NWmWNVm)
"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241009/22b35e38c56ae1c1ddac1826feb062e3.png)
导师小jio
nginx中的$rule_0 1$rule_0 是什么意思?
server {
listen 80;
server_name www.baidu.com;
root "xxx/frontend";
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With,Authorization,Content-Type,access-token,bloc-id,store-id;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS,PUT,DELETE;
location / {
index index.php index.html error/index.html;
error_page 400 /error/400.html;
include D:/nginx.htaccess;
autoindex off;
}
location ~ \.php(.*)$ {
fastcgi_pass 192.168.0.1;
fastcgi_index index.php;
}
location /api {
index index.php index.html;
if (!-e $request_filename)
{
rewrite ^/api/(.*)$ /api/index.php last;
}
if (!-f $request_filename){
set $rule_0 1$rule_0;
}
}
location /admin {
index index.php index.html;
if (!-e $request_filename)
{
rewrite ^/admin/(.*)$ /admin/index.php last;
}
if (!-f $request_filename){
set $rule_0 1$rule_0;
}
}
location /help {
index index.php index.html;
if (!-e $request_filename)
{
rewrite ^/help/(.*)$ /help/index.php last;
}
if (!-f $request_filename){
set $rule_0 1$rule_0;
}
}
}
还有一个问题 我看这里写了3个 index index.php index.html 这种写3个代表了什么
是按照顺序找么?
nginx.htaccess
好像是这个
if (!-f $request_filename){
set $rule_0 1$rule_0;
}
if ($rule_0 = "1"){
rewrite /.* /index.php;
}
导师小jio
想请问大家,关于平时用vue做后台管理系统的一些方案,谢谢?
主要是看公司的,大部分规模不大的公司,都是使用的一些低代码的开发平台,比如说
"Ruoyi" (https://link.segmentfault.com/?enc=y1b4Eq9hAdRQAd9ZNxRivA%3D%3D.T%2B0faghRZLNnuvEA%2FMhdMVItT3rqK3PmQugybqCfE91WvuY71qlONSAEhH8C33ia)、"Jeecg" (https://link.segmentfault.com/?enc=nzcoABeer3d0r%2FCu5vekxw%3D%3D.CI5JZE92Mt4Yb8HvfOyRmDRognS6VIpp98Yqkne9eOVn%2BMP0joY4f%2FJzQe6fxRCF)。就是前后端一整套的基础建设都完成了的,只需要做业务开发即可。会有比较完善的用户管理和用户权限,开发的工作量也会少很多。
并且一般都是会后端先行。所以大部分简单的CURD功能都是可以通过代码生成器直接生成好接口文档,页面和基础的弹窗编辑组件,前端开发和沟通的工作量一般都不会特别大。
***
完全依靠自己的从零开发,成本太高工期太长,并且会有很多健壮性的问题。所以在投入有限的情况下,一般不会选择从零开发。
导师小jio
antd/x6 如何自定义 minimap 背景色?
antd/x6 如何设置minimap的背景色,试了很多办法都没有成功,求解
链接:"https://x6.antv.antgroup.com/tutorial/plugins/minimap" (https://link.segmentfault.com/?enc=T3w15kmqdef1JZkqs%2F2HfA%3D%3D.aaxV0ahUlibvvOlUCnnTy4RYcURzaFONKJil9oMRNx8Ob8vm%2BMPoVYVOlXBUsMdMEcrKIXe69CzkpcK6QpAwdg%3D%3D)
"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241010/390943747590ae6b301a876407a082f0.png)
背景色随着主题色变化
导师小jio
服务CPU使用没有超过100%,报GC错误根原因是什么?
GC报错的根原因是?
服务内部报错持久层异常
"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241010/21a7d158f7e8a31c542fdb01f45336b1.png)
然后一个sql也陆续报错
"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241010/f461e5ca24ae106a5aae093e8748fc80.png)
这是这个sql代码中的mybatis-push的构造函数(这张表数据才189条)
"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241010/dd546e9ff9a097a6d6d8ba57c8855558.png)
这是其它接口的报错,同样是构造函数的报错
"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241010/e6ce608ac9a02183896bd6b9f4910671.png)
查询了报错信息的原因,可能是查询的数据量过大,导致内存不足,触发了垃圾回收,但垃圾回收效果不佳,最终导致了 GC overhead limit
exceeded 错误。可是程序就最近出现问题,用户数量没有增加很多,查看报错服务的运行情况 就5分钟内cpu的使用率最高为85%。没有内存溢出。
导师小jio
c语言,中缀式转后缀式前缀式然后求值,无法入栈?
我写了一个中缀式转化为后缀式,前缀式,并计算出中前后缀式结果的代码,但是在确保输入格式正确后(我输入的是:11+22*(9-6)/3#),输出为:Have
no target!!,我想了好久,觉得是输入的式子没有办法入栈,但是找不出来哪里有问题,能帮我看一下是哪里的问题吗?谢谢各位大佬!
以下是我的代码:
#include
#include
#include
#define STACKSIZE 100
#define SIZECRIMENT 10
typedef struct {
float *top;
float *base;
int stacksize;
}Sqstack1;
typedef struct {
char *top;
char *base;
int stacksize;
}Sqstack2;
void initstack1(Sqstack1 *s){
s->base=(float*)malloc(STACKSIZE*sizeof(float));
if(!s->base){
printf("Don't have enough space!\n");exit(1);}
s->top=s->base;
s->stacksize=STACKSIZE;}
void initstack2(Sqstack2 *s){
s->base=(char*)malloc(STACKSIZE*sizeof(char));
if(!s->base){printf("Don't have enough space!\n");exit(1);
}
s->top=s->base;
s->stacksize=STACKSIZE;
}
void GetTop1(Sqstack1 *s,float *e){
if(s->top==s->base){
printf("Have no target!\n");exit(1);
}
*e=*(s->top-1);
}
void GetTop2(Sqstack2 *s,char *e){
if(s->top==s->base){printf("Have no target!!\n");exit(1);
}
*e=*(s->top-1);
}
void Push1(Sqstack1 *s,float e){
if((s->top-s->base)>=s->stacksize){
printf("The Sqstack1 is full,we are finding more continuous space!\n");
s->base=(float*)realloc(s->base,(STACKSIZE+SIZECRIMENT)*sizeof(float));
if(!s->base){
printf("Don't have more continuous space!\n");exit(1);}
s->top=s->base+s->stacksize;
s->stacksize+=SIZECRIMENT;}
*s->top=e;s->top++;
}
void Push2(Sqstack2 *s,char e){
if((s->top-s->base)>=s->stacksize){
printf("The Sqstack2 is full,we are finding more continuous space!\n");
s->base=(char*)realloc(s->base,(STACKSIZE+SIZECRIMENT)*sizeof(char));
if(!s->base){
printf("Don't have enough continuous space!\n");exit(1);}
s->top=s->base+s->stacksize;
s->stacksize+=SIZECRIMENT;}
*s->top=e;s->top++;
}
void Pop1(Sqstack1 *s,float *e){
if(s->top==s->base){
printf("the Sqstack1 is empty!\n");exit(1);
}
*e=*--s->top;
}
void Pop2(Sqstack2 *s,char *e){
if(s->top==s->base){
printf("The Sqstack2 is empty!\n");exit(1);
}
*e=*--s->top;
}
int priority(char s1,char s2){
char chars[2]; int prioritys[2];
int i;
chars[0]=s1;
chars[1]=s2;
for(i=0;i=prioritys[1])
return 1;else return 0;
}
void suffix(char *s){
Sqstack2 S;
initstack2(&S); //s是中缀表达式数组,s1是后缀表达式数组,S用于操作栈;
char s1[100];char e;
int i=0,j=0;
Push2(&S,'$');
while(s[i]!='#'){
if((s[i]='0')){
s1[j++]=s[i];}
else switch(s[i]){
case'(':Push2(&S,s[i]);break;
case')':GetTop2(&S,&e);while(e!='('){
s1[j++]=e;
Pop2(&S,&e);}break;
default:while(GetTop2(&S,&e),priority(e,s[i])){//当操作栈不为空且中缀式指针运算符
//优先级大于操作栈顶元素时;
Pop2(&S,&e);//此时e指针内容为 操作栈顶元素;出操作栈;
s1[j++]=e;} //出操作栈的运算符写入后缀式;
Push2(&S,s[i]);}//找到比s[i]优先级小的运算符或者操作栈空时,将s[i]放入S操作栈;
i++;
}while(GetTop2(&S,&e),e!='$'){
Pop2(&S,&e);s1[j++]=e;
}
s1[j]='\0';
printf("The suffix expression is:\n");
puts(s1);
}
void reversal(char *s){
Sqstack2 S;char e;
initstack2(&S);
char s1[100];
int i=0,j=0;
Push2(&S,'a');
Push2(&S,'#');
while(s[i]!='#'){
Push2(&S,s[i]);
i++;
}
while(GetTop2(&S,&e),e!='a'){
Pop2(&S,&e);s1[j++]=e;
}
s[j]='\0';
for(i=0;i='0')){
s1[j++]=s[i];i++;
}
else switch(s[i]){
case ')':Push2(&S,')');i++;break;
case '(':while(GetTop2(&S,&e),e!=')'){//e内容为S栈顶元素;
Pop2(&S,&e);s1[j++]=e;
}Pop2(&S,&e);break;//e内容为‘)’;
default:while(GetTop2(&S,&e),priority(e,s[i])){//此时*e为S操作栈
//栈顶元素;
Pop2(&S,&e);s1[j++]=e;} //此时*e为S操作栈栈顶元素;
Push2(&S,s[i]);i++;
}
}
while(GetTop2(&S,&e),e!='$'){
Pop2(&S,&e);s1[j++]=e;
}
reversal(s1);
s1[j]='\0';
printf("The prefix expression is:\n");
puts(s1);
}
void calculate_prefix(Sqstack1 *S,char *s){
reversal(s);
initstack1(S);
float e;int i=0;
float x,y,z,m;
while(s[i]!='#'){
if((s[i]>='0')&&(s[i]='0')&&(s[i]='0'))
s1[j++]=s[i];
else switch(s[i]){
case'(':Push2(S,s[i]);break;
case')':Pop2(S,&e);while(e!='('){
s1[j++]=e;
Pop2(S,&e);}break;
default:GetTop2(S,&e);//此时的e指针内容为 操作栈顶元素;
while(GetTop2(S,&e),priority(e,s[i])){//当操作栈不为空且中缀式指针运算符
//优先级大于操作栈顶元素时;
Pop2(S,&e);//此时e指针内容为 操作栈顶元素;出操作栈;
s1[j++]=e;} //出操作栈的运算符写入后缀式;
Push2(S,s[i]);}break;//找到比s[i]优先级小的运算符或者操作栈空时,将s[i]放入S操作栈;
i++;
}while(GetTop2(S,&e),e!='$'){
Pop2(S,&e);s1[j++]=e;
}
calculate_suffix(&S1,s1);
}
int main(){
Sqstack1 S1;
Sqstack2 S;
char s[100];
printf("Please input the infix expression!");
fgets(s,100,stdin);
puts(s);
suffix(s);
prefix(s);
calculate_infix(&S,s);
printf("Please input the suffix expression!");
fgets(s,100,stdin);
calculate_suffix(&S1,s);
printf("Please input the prefix expression!");
fgets(s,100,stdin);
calculate_prefix(&S1,s);
return 0;
}
主函数中将
suffix(s);
prefix(s);
alculate_infix(&S,s);
改为
calculate_infix(&S,s);
suffix(s);
prefix(s);
输出变成了“The Sqstack2 is empty!”
试过修改initstack1(*S);为Stack1 S; initstack1(&S);输出从原来什么也没有变成了上述问题;
查了谷歌,谷歌说puts函数不稳定,试过把原来的puts函数改为fputs函数,但是问题没有解决;
试过把Pop,Push函数里参数,加删*,加删&,并调整整体相关部分运行代码,但是还是上述问题,所以我觉得是我输入的式子压根没有入栈;
希望能输出后缀式和前缀式,并输出计算结果。
////我在switch语句中加了case:‘$’:priority[i]=0;break;现在后缀表达式输出了,但是前缀表达式依旧是老问题
////谢谢,原来是我Pop,Push函数中的逻辑错误,导致该弹栈的时候把栈提前清空了,等再弹栈的时候没有元素了,把逻辑理清了就解决了。