Skip to content

全量 MR 评论汇总(按讨论发起人分组)

项目: sparkxmedia/xnurta-web (ID: 76913543) 总讨论数(非系统、非 AI): 804 条 涉及用户数: 15 人 归属规则: 每个 discussion 的第一条非系统评论的作者为发起人,后续回复归入会话记录 生成时间: 2026-04-28T08:57:49.187Z

用户概览

排名用户发起讨论数涉及 MR 数
1quint liu (@quint.liu.xnurta)268112
2Placeholder Samily.Wang (@SamilyWang_placeholder_1su4qe71)12525
3vince hu (@vince.hu.xnurta)11857
4lynn gu (@lynn.gu.xnurta)7250
5lucas lu (@lucas.lu.xnurta)6140
6samily wang (@samily.wang.xnurta)5933
7Alec Xu (@alec.xu.xnurta)4125
8Placeholder jehan.jia (@jehanjia_placeholder_1kvp16d1)2522
9liam ye (@liam.ye.xnurta)1715
10Placeholder Ghost User (@ghost_placeholder_10r6jzk1)72
11lillian yin (@lillian.yin.xnurta)65
12Placeholder liam.ye (@liamye_placeholder_a3h98g1)22
13Placeholder lynn.gu (@lynngu_placeholder_uy3spy1)11
14rick ma (@rick.ma.xnurta)11
15jehan jia (@jehan.jia.xnurta)11

quint liu (@quint.liu.xnurta)

268 个讨论,涉及 112 个 MR

评论
MR: !16998 文件: apps/xnurta/src/store/instacart/budget.js 行号: 第 1 行 评论内容: store/index.js 里面可以把 Instacart 相关的代码删掉了
MR: !16965 文件: apps/xnurta/src/omni/instacart/views/ads/components/campaignDrawer/CampaignBasicsCard.vue 行号: 第 328 行 评论内容: 这里逻辑有点怪,不应该是根据时区 offset 去判断时区名,而是应该先确定时区名,再确定时区的 offset。

最保险的做法是业务代码都不应该关心 offset,因为同一个时区名因为冬夏令时会对应成不同的 offset,最好是都通过 moment 的 api 去操作

另外 store.getters.globalCurStore/timeZoneUTC 这种全局变量主要是给亚马逊平台使用的, Instacart 不要去读

在这个场景里面,首先应该确定

const businessTimeZoneName = computed(() => 'America/Los_anglas') // prd 里有写,确认下

(如果未来是有多个不同的时区,则通过 OmniCenter.curProfiles 获取当前店铺,根据店铺的国家判断时区名。或者后端直接从店铺的数据结构里面返回时区名)

然后,假设现在你存的开始时间已经是 utc 时间戳,那就是 const startMoment = moment....
MR: !16948 文件: packages/i18n/legacy/lang/instacart/tableHead/en.json 行号: 第 4 行 评论内容: 我看已经把 tableHead.instacart 换成了 Instacart.tableHead。那前者的翻译还需要保留吗?还是为了兼容其他模块还在使用 tableHead.instacart Alec Xu: 这里主要是每个人写的i18n文件结构不同,处理冲突的时候尽量保留了所有结构 quint liu: ok, 今天上线先这样,后面再做统一
MR: !16925 文件: apps/xnurta/src/store/modules/user.js 行号: 第 47 行 评论内容: 删掉,这么做太危险了 @rick.ma.xnurta rick ma: 已经删掉了,这个是为了方便开发测试
MR: !16925 文件: apps/xnurta/src/store/getters/instacart.js 行号: 第 3 行 评论内容: Instacart 全局 store 应该都没用了吧,Instacart 的全局信息应该从 OmniCenter 去读取

store 里面的都可以删掉 @jehan.jia.xnurta
jehan jia: 已调整 quint liu: apps/xnurta/src/store/instacart/budget.js

这个还在用吗
quint liu: 看上去也是从 walmart 那边复制过来的,今天先这样,后面再优化 jehan jia: 是的、它还在用

但是它具体的作用我还没来得及考证、后面我会再审查一下这个文件的具体作用

image.png
jehan jia: 我请ai分析了一下每个key的作用、并且和walmart平台做了比对、结论如下

部分key有效、部分key无效、无效的key在walmart平台也存在类似的问题、但apps/xnurta/src/store/instacart/budget.js这个文件还是有作用的、所以我这次暂时就没动

@quint.liu.xnurta

image.png
MR: !16925 文件: apps/xnurta/.env.development 行号: 第 1 行 评论内容: 这个文件应该没用,可以删掉?

@jehan.jia.xnurta
jehan jia: 已删除
MR: !16925 文件: .codex 评论内容: 提交了一个空文件,可以删掉?

@alec.xu.xnurta
MR: !16925 文件: packages/i18n/legacy/lang/tableHead/en.json 行号: 第 788 行 评论内容: tableHead.instacart 放的是表格里面的指标字段。这些翻译不是指标,也不是一定 tableHead 用,更像是公共的文案,建议直接放到 Instacart/en.json 里面

至少放在 Instacart 目录下,避免 Instacart 的翻译散落在各个地方

@alec.xu.xnurta
Alec Xu: 上线后可能需要做一次 instacart i18n 的整体检查和修改,并同步到 test quint liu: 等发布完我建个任务
MR: !16925 文件: apps/xnurta/src/api/instacart/ads/campaigns/searched.js 行号: 第 2 行 评论内容: 是不是没用了,可以删掉 @jehan.jia.xnurta rick ma: 已修改
MR: !16925 文件: apps/xnurta/src/api/instacart/autoRule/create.js 行号: 第 1 行 评论内容: src/api/instacart/autoRule 目录可以移动到 src/omni/instacart/api/autoRule @rick.ma.xnurta rick ma: 已修改
MR: !16925 文件: apps/xnurta/src/omni/instacart/automation/utils.js 行号: 第 1 行 评论内容: automation 整个目录移动到 instacart/views 下面 @jehan.jia.xnurta @rick.ma.xnurta Alec Xu: 可以参考 @instacart/views 下面的 ads,跨模块公共部分可以抽到 @instacart 对应目录下 rick ma: 已修改
MR: !16925 文件: apps/xnurta/src/views/instacart/autoRules/components/utils.js 行号: 第 1 行 评论内容: views/instacart/autoRules 这个也是自动化相关的吗?是不是应该和 omni/instacart/automation 放在一起?

@jehan.jia.xnurta @rick.ma.xnurta
rick ma: 已修改
MR: !16925 文件: packages/i18n/legacy/views/instacart/autoRules/components/CampaignTable/Filters/en.json 行号: 第 1 行 评论内容: views/instacart/autoRules 整个目录也放到 omni/instacart 目录下面去

@jehan.jia.xnurta @rick.ma.xnurta
rick ma: 已修改 quint liu: 代码路径是改了,这一条说的是翻译文件,我看还没改
MR: !16925 文件: apps/xnurta/src/api/instacart/autoRule/utils.js 行号: 第 11 行 评论内容: 理论上后端应该支持直接读 string 格式的 id 的,确定真的需要这种转换吗 @rick.ma.xnurta rick ma: 经过我转换的基本都不支持,都是一开始传字符串报错,然后才转成Number的
MR: !16925 文件: apps/xnurta/.env.prd 行号: 第 19 行 评论内容: PRD 环境没有 VUE_APP_INSTACART_DEVELOPER_URL 吗 @jehan.jia.xnurta jehan jia:
image.png

我以为prd将来会变成真实的生产环境、所以就没有给它配、让它指向真实的instacart授权平台、prd应该要对应sandbox吗?
quint liu: 噢,所以你的做法是没有这个环境变量的情况下,兜底是真实环境的 url

为什么不把真实环境的 url 作为 .env.prd 的环境变量呢?这样使用方式更加统一
jehan jia: 嗯嗯、好呢、我会把真实环境的url也配制成环境变量

但在此之前我还是需要再确认一遍、prd环境应该指向真实环境还是sandbox呢?
quint liu: prd 指向真实环境 jehan jia: 已修复
MR: !16923 文件: apps/xnurta/src/components/xTable/components/cells/asinCardCell.js 行号: 第 30 行 评论内容: 后续有兜底,最坏的情况就是和现在一样
MR: !16923 文件: apps/xnurta/src/components/xTable/index.vue 行号: 第 648 行 评论内容: 没看懂,跟注释换了个位置?

@GitLabDuo
MR: !16923 文件: apps/xnurta/src/components/xTable/index.vue 行号: 第 1023 行 评论内容: 表格组件保证
MR: !16923 文件: apps/xnurta/src/constants/matchTypeColor.js 行号: 第 9 行 评论内容: 原来的有问题
MR: !16920 文件: apps/xnurta/src/views/allCampaigns/tabs/campaign/script.js 行号: 第 2199 行 评论内容: 批量操作是分两个字段传的
MR: !16892 文件: apps/xnurta/src/omni/instacart/platformConfig.js 行号: 第 24 行 评论内容: 两个问题:

1. 这个 export default 的对象是一个配置,不适合放 _authChecked 这种状态变量。可以把它在单独的地方进行定义。而且它本来也是一个私有变量,可以避免直接暴露出去
2. 这个 _authChecked 应该是用户维度的,所以退出登录、切换用户的场景,需要把这个变量重置掉
jehan jia: 已优化、现在把_authChecked抽离到service服务中去维护
MR: !16892 文件: apps/xnurta/src/views/login/login.vue 行号: 第 424 行 评论内容: 这个地方重复 hardcode 了权限 key 和 push 的路径,如果后面有改动,或者新增了其他的平台,容易遗漏这里的改动。

可以通过 OmniCenter.platformList 获取所有新平台的 platformConfig, 然后循环去判断,读取 platformConfig 的 permission 和 id
jehan jia: 已优化、现在采用动态匹配的方式
MR: !16885 评论内容: Form 组件和现有组件的联动:

* form disabled 禁用所有 child
* form item error 时,child 展示报错边框
* child 组件用户操作后触发 form item 报错

已处理:Input\InputNumber\InputRange\InputTag\Select\Checkbox\Radio\Button\IconBtn

后续其他组件完成以后,可以通过 /connect-form 这个 skill 接入 form 的联动逻辑

---

除联动逻辑外,对现有组件的改动:

* Select/InputTag: 增加了 error prop,用于展示报错边框
* Input/InputNumber/InputRange: 错误 icon 只在有错误信息时展示,避免重复展示 icon 和 message

另外发现了一些原本的问题,可能需要各自负责同学评估一下:

1. 现有的单元测试通不过

...
MR: !16885 文件: packages/ui-core/src/components/checkbox/ui/checkbox.vue 行号: 第 154 行 评论内容: 这个就是为了避免布局偏移而改的
MR: !16885 文件: packages/ui-core/src/components/checkbox/ui/checkbox.vue 行号: 第 172 行 评论内容: 同上
MR: !16885 文件: packages/ui-core/src/components/checkbox/ui/checkbox.vue 行号: 第 187 行 评论内容: 肉眼确认过是正确的
MR: !16885 文件: packages/ui-core/src/components/form/composables/useXFormField.ts 行号: 第 36 行 评论内容: 你说的对,所以在 skill 里面重点指出了这一点,AI 会遵循它不设置默认的 disabled 值
MR: !16885 文件: packages/ui-core/src/components/form/ui/formItem.vue 行号: 第 194 行 评论内容: 这个是为了在校验触发错误信息时,避免页面抖动,所以必须预留空间
MR: !16885 文件: packages/ui-core/src/components/input/__tests__/input.spec.ts 行号: 第 158 行 评论内容: 有意的
MR: !16885 文件: packages/ui-core/src/components/input/__tests__/inputTag.spec.ts 行号: 第 462 行 评论内容: 这里原来就是这么做的,其实只是加了一个 eslint 规则避免老是报错
MR: !16885 文件: packages/ui-core/src/components/input/ui/input.vue 行号: 第 101 行 评论内容: 有意的
MR: !16865 文件: apps/xnurta/src/components/xTable/components/cells/asinCardCell.js 行号: 第 30 行 评论内容: 即使没有 countryCode ,后续也会兜底 US,和现有逻辑一样
MR: !16865 文件: apps/xnurta/src/components/xTable/index.vue 行号: 第 648 行 评论内容: 如果表格已经销毁了, loading 不 loading 就无所谓了
MR: !16865 文件: apps/xnurta/src/components/xTable/index.vue 行号: 第 1023 行 评论内容: 同上,表格已销毁无需再刷新 footer data
MR: !16865 文件: apps/xnurta/src/constants/matchTypeColor.js 行号: 第 9 行 评论内容: 现在就是要统一 match type color 的引用,修改一些以前不统一的地方
MR: !16865 文件: apps/xnurta/src/views/allCampaigns/components/ChartsTheater/ScatterChart.vue 行号: 第 515 行 评论内容: 这是和原有行为保持一致,原有默认值也是空字符串
MR: !16788 评论内容: 任务中心页面配置 crossPlatformPages

跳转的时候不带具体平台的参数。

这里不带 platform 参数,是因为这里和偏好设置页有点不一样。偏好设置页是新窗口打开的,任务中心是在当前页跳转。在当前页跳转的时候,如果是 crossPlatformPages,不会走切换平台的逻辑,所以原来是什么平台就是什么平台。同理,也可以暂时不用处理所有的全局页面加 platform 参数

当然,如果是新窗口打开,或是刷新,会丢失平台信息,不过一方面情况比较少(偏好设置也没处理刷新),另一方面 https://gitlab.com/sparkxmedia/xnurta-web/-/merge_requests/16781 也已经处理了 tenantId = -2,问题不大
MR: !16781 评论内容: 改动兼容 -2 本身看上去没什么问题,不过我觉得还有一个地方可以补充的

就是现在的问题是从其他平台跳转到 任务中心,任务中心本身是一个全局性的页面,这时候会走 amazon 平台的逻辑,导致出现 -2

之前偏好设置页面做过一个改动,即从哪个平台跳转到偏好设置,跳过去的时候就认为在那个平台,而不是 amazon,这样就可以规避出现 -2 的问题,也可以规避如果用户没有 amazon 平台的权限时,可能会出错

我去看一下偏好设置页是怎么处理的
liam ye: 有个跨平台页面的配置crossPlatformPages,把任务中心也加进去,然后url加个platform? quint liu: 对对对,机智如你

不过我实际试了下,任务中心用的 XpLinkTab 组件还依赖了 amazon 的 url 参数,这个我在 omni channel 的需求里已经处理了多平台的逻辑,我需要再补充下 walmart 和 criteo 的逻辑。可以下周二一起发
liam ye: 1. 这个的问题是跳转其他platform的路由时带上了未被初始化的tenantId:-2;
2. 类似这种跨平台的页面还挺多,需要在路由钩子里统一再给crossPlatformPages的跳转带上platform的query,手动太麻烦还可能漏了
quint liu: 嗯,我试下来感觉问题比想象中的多

不过不影响你的这个改动,我觉得可以先把这个合了
MR: !16773 文件: apps/xnurta/src/omniCenter/store.js 行号: 第 212 行 评论内容: 为什么要前端做缓存,而不是统一根据后端接口恢复 profile jehan jia: 这个是产品给我分配的Jira、我以为是要我去改、我后来看到你在Jira的留言了、跟Martin沟通过后由他来负责修改

image.png
MR: !16737 文件: apps/xnurta/src/views/allCampaigns/tabs/campaign/script.js 行号: 第 1908 行 评论内容: intentional
MR: !16737 文件: apps/xnurta/src/views/allCampaigns/tabs/campaign/script.js 行号: 第 1941 行 评论内容: intentional
MR: !16711 文件: apps/xnurta/src/views/allCampaigns/tabs/campaign/script.js 行号: 第 2202 行 评论内容: 和原有的 Number(data.budget) 用法保持一致
MR: !16675 文件: packages/ui-core/src/components/radio/ui/radio.vue 行号: 第 34 行 评论内容: 和底层 reka-ui 库的判断逻辑一致,已有针对 NaN 的测试
MR: !16675 文件: packages/ui-core/src/components/radio/ui/radioGroup.vue 行号: 第 46 行 评论内容: 已修复,并添加对应的测试
MR: !16675 评论内容: 一些设计选择:

Checkbox Group 禁用 roving focus 的原因:

- 复选框组中每个选项是独立的,用户可以选中/取消任意项
- 用户期望用 Tab 键在各复选框之间移动(和普通表单控件一致)
- 如果启用 roving focus,按 Tab 会跳过整个组,只有箭头键能在组内移动——这对复选框来说不符合直觉
- WAI-ARIA 规范中,checkbox group 不要求 roving tabindex 模式

Radio Group 保留 roving focus 的原因:

- 单选组在语义上是一个整体控件(只能选一个值),和 类似 WAI-ARIA Radio Group Pattern 明确要求:整个组只有一个 Tab stop,组内用箭头键切换选项 这意味着 Tab 键进入组时聚焦到当前选中项(或第一项),再按 Tab 离开整个组 reka-ui 的 RadioGroupRoot 默认就启用 roving focus,这正是规范行为 简单总结: ┌──────────┬───────...
MR: !16675 评论内容: M1, M2:

orientation?: 'horizontal' | 'vertical' 在 TypeScript 里本身就等价于“该属性可缺省,因此取值范围包含 undefined”。也就是说,当前实现和文档表达的运行时语义是一致的,并不存在真实类型不匹配。

如果改成 orientation?: 'horizontal' | 'vertical' | undefined,效果上是重复表达:

* 可选属性 ? 已经隐含 undefined
* 再显式写 | undefined 不会带来更强的类型约束
* 反而会让类型定义更啰嗦,降低可读性

> 并且现在的风格和其他可选 props 也是一致的

---

M3:

已增加保护,并补充了测试

---

L1:

这样命名是和现有其他组件一致的

* _guide 里还直接举了 --_x-btn-bg 作为示例
* button、drawer 这些组件也都在用...
MR: !16663 评论内容: 先解决下冲突 lillian yin: 好了
MR: !16642 文件: apps/xnurta/src/components/xTable/index.vue 行号: 第 639 行 评论内容: 通过 loading 阻止了频繁操作
MR: !16642 文件: apps/xnurta/src/views/allCampaigns/tabs/targeting/keyword/script.js 行号: 第 1272 行 评论内容: 这是修复原来的问题
MR: !16642 文件: apps/xnurta/src/views/allCampaigns/utils/useAsyncTaskBatchOperation.js 行号: 第 60 行 评论内容: 组件内部确保存在
MR: !16642 文件: apps/xnurta/src/views/asyncTaskCenter/components/detail/index.vue 行号: 第 82 行 评论内容: 那是后端的问题
MR: !16621 文件: apps/xnurta/src/views/intelligenceCenter/ProductAdvertiseDeposit_new/AiGroupEditRedesign/log-view/AiGroupLogChart.vue 行号: 第 195 行 评论内容: 设计如此
MR: !16504 文件: apps/xnurta/src/components/XpCommonFilterV3/components/AddFilterPanel.vue 行号: 第 119 行 评论内容: 目前实测是可以运作的,watch 的 callback 本身也是一个 tick 之后的
MR: !16504 文件: apps/xnurta/src/components/XpCommonFilterV3/components/AddFilterPanel.vue 行号: 第 46 行 评论内容: 同上
MR: !16492 文件: apps/xnurta/src/omni/instacart/views/ads/components/campaignTab/useColumns.js 行号: 第 78 行 评论内容: 数字格式化统一用 xmars-ui 的 formatNumber 方法
MR: !16486 文件: apps/xnurta/src/views/allCampaigns/tabs/bidAdjustment/audience/script.js 行号: 第 379 行 评论内容: 已有翻译
MR: !16486 文件: apps/xnurta/src/views/allCampaigns/tabs/campaign/script.js 行号: 第 2142 行 评论内容: 已有翻译
MR: !16465 文件: apps/xnurta/src/views/_sp/components/adGroupDetail/script.js 行号: 第 274 行 评论内容: 你说的对,但是这里纯粹是平移原来的逻辑。而且非 detailPage 的情况,都没有这个参数
MR: !16465 文件: apps/xnurta/src/views/_sp/components/adGroupDetail/script.js 行号: 第 279 行 评论内容: intentional
MR: !16465 文件: apps/xnurta/src/views/sb/sbAdGroupDetail/script.js 行号: 第 97 行 评论内容: 同上
MR: !16465 文件: apps/xnurta/src/views/sb/sbAdGroupDetail/script.js 行号: 第 102 行 评论内容: intentional
MR: !16465 文件: apps/xnurta/src/views/sd/ad/newAdGroupPage/index.vue 行号: 第 121 行 评论内容: 同上
MR: !16462 文件: apps/xnurta/src/components/XpCommonFilterV3/components/AddFilterPanel.vue 行号: 第 14 行 评论内容: groupBy 出来的,至少会是 1
MR: !16455 文件: apps/xnurta/src/omni/instacart/components/InstacartCountrySelect.vue 行号: 第 52 行 评论内容: 这段 select 的样式修复应该可以在 el-select 上使用 class="xp-multiple-select" 代替
MR: !16455 文件: apps/xnurta/src/omniCenter/components/OmniStoreSelect.vue 行号: 第 132 行 评论内容: 改成边输入边搜索以后,这里的 onChange 是不是就没用了,没用的话就删了吧
MR: !16450 文件: apps/xnurta/src/views/allCampaigns/tabs/campaign/script.js 行号: 第 2166 行 评论内容: 拦截器会统一处理报错提示
MR: !16450 文件: apps/xnurta/src/views/allCampaigns/tabs/targeting/keyword/script.js 行号: 第 1274 行 评论内容: 同上
MR: !16443 文件: apps/xnurta/src/omniCenter/components/OmniStoreSelect.vue 行号: 第 98 行 评论内容: 首次加载时,若没有已选店铺,自动选中第一个店铺】为什么要这么做。如果是多店铺,没有已选店铺,就代表是全选,没有必要自动选中第一个店铺 rick ma: 我的 这里是因为jehan在做店铺选择器的时候,没有写代表全选的逻辑,导致出现没选择任何店铺的情况。我就想当然得添加了一个默认选中。 quint liu: 这里整个 watch 删掉吧 rick ma: 我改一下
MR: !16395 文件: .claude/settings.json 行号: 第 27 行 评论内容: 这里是看到之前的 commit 说,统一使用 commit-commands 插件,但是 settings 没列出这个插件,就让 claude 给我装了一下
MR: !16395 文件: apps/ui-docs/docs/.vitepress/theme/custom.css 行号: 第 21 行 评论内容: 这里是看到这个改动对全局都有用处。例如

image.png

这里行与行之间显得很高,加上了以后会更美观一些
MR: !16395 评论内容: 问题1:

经检查,原有 review 意见不准确。在 group 模式下,子 checkbox 的事件不会触发(已让 claude 写测试验证: 'group 内点击子 checkbox 不应触发子组件的 update:modelValue'

因此不建议做上述修改

> 两处死代码不动,没有实际收益且会增加 group/standalone 的分支复杂度。

不过 review 时发现了另一个 bug:

因为 group 模式下 modelValue 被忽略,导致 group 配合 border 使用时,已选中的 checkbox border 不会被高亮 —— 已修复
MR: !16395 评论内容: 问题2:

去看了一下 element-plus 的参考,结果发现他们的一个问题:边框高亮只和 checked 有关,和 indeterminate 无关。但 indeterminate 的展示状态是优先于 checked/unchecked 的,这就导致用户点击一个 indeterminate 的 checkbox 时,边框的高亮在切换(因为 checked/unchecked 在变),而 checkbox 样式不变(因为 indeterminate 展示更优先)

问题的本质是 indeterminate + checked/unchecked 构成了一组非正交的状态。经过调研,在常见的组件库中,element 和 ant design 采用了 checked 和 indeterminate 分开的方案,而 reka 和 radix 采用了合并的方案(modelValue 类型是 boolean | 'indeterminate'), 只是 reka 的官方文档把类型写成了 unknown,导致最开始没有意识到他们的设计决策。

根据我个人的业...
quint liu: 在重构后继续关注 indeterminate 是否需要高亮边框的问题。

element-plus 有问题,而其他组件库都没有 border,因此无从参考。从纯粹设计角度来说,高亮边框的一致性更好,因此修改为高亮,并补充对应的测试
MR: !16395 评论内容: 问题3:

是有道理的,但需要修改的原因不是所谓的两套 context 职责分裂,而是“未来如果你需要在 checkbox 侧做 disabled 相关的自定义逻辑(比如 disabled 时 border 样式、tooltip 提示等),你读不到 group 的 disabled 状态”

现在已经做了修改,但修改完以后仍然无法避免两套 context,因为你仍然要把 disabled 传递给 CheckboxGroupRoot,依赖 reka-ui 内部的一些处理。

以下是 claude 的分析:

> 但我认为保留传递给 CheckboxGroupRoot 的 disabled 是正确的,不应该去掉。
>
> 原因:
>
> 1. reka-ui 的 disabled 控制的是原生交互行为——它让 CheckboxRoot 的 button 变成 disabled 状态(aria-disabled、不响应点击)。这是我们需要的底层能力,自己实现等于重复造轮子。
> ...
quint liu: 同时增加对 group 内 x-checkbox--disabled 的测试,修复问题 9
MR: !16395 评论内容: 问题4:

将 modelValue 默认值改为 false。明确组件只支持受控模式。虽然 reka-ui 本身支持非受控,但我们在它的基础上做了很多额外的逻辑,意味着我们不能依赖 reka-ui 的非受控,要自己重新实现非受控,意义不是很大。
MR: !16395 评论内容: 问题5:

review 意见不准确

> 有道理的部分:XCheckboxValue 确实排除了 boolean,而 reka-ui 底层接受 boolean,存在类型覆盖面不一致。
>
> 不成立的部分:
>
> 1. includes() 不会产生 true == 1 的问题 — Array.prototype.includes 使用 SameValueZero 比较(严格相等),[true].includes(1) 返回 false,不会意外匹配。
> 2. 运行时绕过 TS 检查本身不是组件的问题 — 任何组件的 props 类型约束都只在编译时生效,消费者通过 any 或动态变量绕过类型是调用侧的问题,不需要组件做运行时防御。
> 3. boolean 作为 group value 在业务上没有意义 — checkbox group 的 value 用于标识"选了哪些项",string | number 是合理的建模。允许 boolean 反而会让 API 语义混乱(...
MR: !16395 评论内容: 问题6、7:

--_x-checkbox-size: 14px

这个目前确实没有对应的 design token,UI 在 figma 里面也是写死的。并且实际上不会有 small/large 变体(项目跑了这么久都没有这种需求,各个组件库也没有这样的场景),因此建议还是先维持现在局部变量的形式

其余 3.5px,7px 的问题,已改为使用 calc 实现等比缩放
MR: !16395 评论内容: 问题10:

* indeterminate + disabled 组合
* indeterminate + border 组合

已补充测试

---

* group 内 checkbox 没有 value prop 的情况(isDisabledByMinMax 会短路返回 false,但 reka-ui 会用默认值 "on")

dev 环境下增加了运行时的校验,未设置 value 时会有警告,并增加了对应测试

---

> * min: 0 或 max: 0 — min: 0 等同于不设限,无实际意义;max: 0 在业务上没有合理场景(意味着不能选任何项)。代码逻辑上 checked.length >= 0 恒为 true 所以 max: 0 会禁用所有未选项,行为上是合理的但属于"不应该传这个值"。可以测,但优先级低。
> * min > max 的非法输入 — 这是防御性编程的测试。组件库通常不在运行时校验 prop 约束(Element Plus...
MR: !16395 评论内容: 问题12:

review 意见不合理

> 这些行为由 reka-ui 的 CheckboxRoot / CheckboxGroupRoot 保证,我们的组件层只做透传,不需要在单元测试中重复验证底层库的实现。如果需要端到端的 a11y 验证,建议在文档站或集成测试中引入 axe-core<br>> 做页面级审计。

问题13:

review 意见不合理

虽然只有一个地方使用,但是有一定逻辑,拆开以后语义更清晰。而且 checkboxClasses 的其他依赖发生变化后,不会引发 isChecked 重新计算

问题14:

review 意见不合理

既然使用方可以不传,那 TypeScript 类型定义里面保持可选值是合理的,否则就变成必传了。

在经过 withDefault 包裹以后,Vue 3.5+ 的 withDefaults 已经能正确收窄类型,因此 TS 不会要求你收窄 undefined 分支

问题15:

已去除 ...
MR: !16349 文件: apps/xnurta/src/omniCenter/store.js 行号: 第 50 行 评论内容: 这里没什么关系
MR: !16329 文件: apps/xnurta/src/components/OpreationLog/script.js 行号: 第 338 行 评论内容: 操作日志是单独接口
MR: !16329 文件: apps/xnurta/src/components/OpreationLog/script.js 行号: 第 26 行 评论内容: 同上
MR: !16276 文件: apps/xnurta/src/components/XpCommonFilterV3/model/filter.js 行号: 第 148 行 评论内容: 这里为什么要加 required 的筛选项,按照 UI 规范,不可取消的应该属于固定筛选项 lynn gu: 这个是我们产品提的,我再找她沟通一下 lynn gu: 已revert掉XpCommonFilterV3相关修改,移除requiredKeys相关。通过draft参数传入必选的筛选项。
MR: !16276 文件: apps/xnurta/src/components/XpCommonFilterV3/components/NumericValueInput.vue 行号: 第 81 行 评论内容: 这里不建议在 config 里加 allowNegative,因为 config 是针对所有类型的筛选项,allowNegative 只是针对数值类型,不够通用。

allowNegative 应该是比较少见的场景,可以先在外部通过 slot 传入 NumericValueInput 进行自定义。如果后续有越来越多类似的需求,可以再考虑通用的解决方式
lynn gu: 已修改 https://gitlab.com/sparkxmedia/xnurta-web/-/merge_requests/16276/diffs?commit_id=25308c45a6ba3ff49ee77350737e021e50592359
MR: !16246 文件: apps/xnurta/src/utils/budget.js 行号: 第 6 行 评论内容: 只是一个局部变量,而且避免参数遮蔽
MR: !16235 文件: apps/xnurta/src/components/XpAd/XpAdCommonFilter/components/ProductSelector_MultiStore/main.vue 行号: 第 172 行 评论内容: cacheKey 应该是一项通用的功能,不一定只是为了用在单店铺的场景。因此建议这里不要拼 profileId,而是在 recommendKeywords 里面拼。

另外建议拼一下 userId,一是和之前的行为一致,二是不同用户享有不同的缓存也是一个通用的行为
vince hu: 已修改
MR: !16235 文件: apps/xnurta/src/components/XpAd/XpAdCommonFilter/components/ProductSelector_MultiStore/main.vue 行号: 第 291 行 评论内容: saveKey 变化时重新读缓存也是通用的,我觉得这里不需要加 **!**props.cacheKey 这个判断 vince hu: 已去掉
MR: !16214 文件: apps/xnurta/src/views/dsp/amazon-dsp-v2/components/tab/scatter-tab.vue 行号: 第 63 行 评论内容: 每个分支都直接 return 了,不需要 break
MR: !16214 文件: packages/i18n/legacy/lang/dsp/en.json 行号: 第 11 行 评论内容: 未实际使用
MR: !16214 文件: packages/i18n/legacy/lang/dsp/ja.json 行号: 第 11 行 评论内容: 未实际使用
MR: !16213 文件: apps/xnurta/src/components/XpAsinSelect_MultiStore/components/ProductLineFilter/ProductLineFilterPanel.vue 行号: 第 25 行 评论内容: 允许 undefined
MR: !16206 文件: apps/xnurta/src/components/XpGrid/index.vue 行号: 第 2307 行 评论内容: 现在 fixed 的列 visible 一定为 true
MR: !16206 文件: apps/xnurta/src/views/budgetManagement/add/components/tableList.vue 行号: 第 487 行 评论内容: 这个 column 数组是在每次运行 computed 的时候生成的,所以从整个 computed 角度来看还是纯的
MR: !16194 文件: apps/xnurta/src/components/XpGrid/components/ExportIcon.vue 行号: 第 70 行 评论内容: 现在项目统一格式化
MR: !16194 文件: apps/xnurta/src/components/XpGrid/index.vue 行号: 第 565 行 评论内容: mergeWith 是深度合并,用户没传的话就用 default 的值
MR: !16194 文件: apps/xnurta/src/components/xTable/components/toolbarIcons/export.vue 行号: 第 61 行 评论内容: 外部合并 config 的时候会保证
MR: !16194 文件: apps/xnurta/src/views/asyncTaskCenter/components/taskDownloadList/index.vue 行号: 第 112 行 评论内容: key 已经加了
MR: !16180 文件: apps/xnurta/src/components/xTable/index.vue 行号: 第 542 行 评论内容: !16169 你之前分析说是对的耶
MR: !16180 文件: apps/xnurta/src/views/allCampaigns/tabs/searchTerm/script.js 行号: 第 139 行 评论内容: 这个是原本漏掉的变量
MR: !16179 文件: apps/xnurta/src/components/XpLabelSelect/index.vue 行号: 第 1 行 评论内容: 这里新增了一个全局组件,使用场景是什么 jehan jia: image.png

我看到新平台的自动化规则部分也用了新版的下拉框、所以就把它做成全局组件了
jehan jia: image.png jehan jia: fde9fa0c-b2a9-4407-9731-96a9fa9babd7.jpeg

我看到这个组件了、下次commit我把它换回来
quint liu: 好的,现在产品很多地方都想用这个新版的组件,但是有些只是想用样式,不涉及那些复杂的保存条件组、缓存之类的功能。我昨天搞了个简版的,还没在群里说。你可以先合下最新的 filterv3-monorepo 分支,看里面的 SimpleFilterItem 组件
MR: !16179 文件: apps/xnurta/src/layout/main/components/header/components/UserMenus.vue 行号: 第 193 行 评论内容: 这个地方判断有点太累赘了, 这样的话以后每新增一个平台都要新加一段 if else, 我觉得不如 直接 const query = { ...route.query, tab: platform.value }

如果担心 tab 的值不合法,可以在跳转过去的页面里面处理,这样定义 tab 的地方和处理不合法的 tab 的逻辑也更加接近,更内聚

甚至如果按主流程不会出现 tab 不合法的情况的话,不处理也问题不大(比如用户故意搞破坏修改 url 的情况)

或者还可以考虑使用 XpTabs/XpLinkTabs.vue 组件,内部会处理 tab 不合法的情况
quint liu: 我看了一下 profile/index.vue , 加了从 url 读取 tab,和 tab 同步到 url 的逻辑,那确实最好直接改用 XpLinkTabs,把这些逻辑都处理好了
MR: !16179 文件: apps/xnurta/src/omni/instacart/utils/authStatus.js 行号: 第 7 行 评论内容: 如果需要判断整个 Instacart 的权限的话,可以从 platformConfig.js 里面取 quint liu: 如果 checkInstacartAuth 这个方法只会在 platformConfig.install 里面调用的话,就不用再判断权限了。因为只有权限校验通过才会 调用 install 方法 jehan jia: 已修复
MR: !16179 文件: apps/xnurta/src/permission.js 行号: 第 95 行 评论内容: 可以尝试一下把这个路由守卫的逻辑放到 Instacart 的 router 里面

https://v3.router.vuejs.org/zh/guide/advanced/navigation-guards.html#路由独享的守卫路由独享的守卫

这样就不用判断路径了
MR: !16179 文件: packages/i18n/legacy/lang/instacart/en.json 行号: 第 26 行 评论内容: 下面的这些 key 是不是应该放在 auth 的下面,而不是和 auth 平级?
MR: !16179 文件: apps/xnurta/src/views/login/login.vue 行号: 第 391 行 评论内容: 这个地方,要不改成 eventBus emit 一个 loginSuccess 的事件

然后在 Instacart 的 platformConfig.js 里面,install() 方法, 监听 loginSuccess 事件,调用 {+checkInstacartAuth+}) 方法

这样的好处是全局页面不依赖特定平台的逻辑,这种特殊逻辑放各平台内部使用
MR: !16179 文件: apps/xnurta/src/views/subAccount/components/table/ProfileFilter.vue 行号: 第 6 行 评论内容: 检查一下组件里用 $t 而不是 t
MR: !16179 文件: apps/xnurta/src/omni/instacart/home/AuthCard.vue 行号: 第 1 行 评论内容: 这个组件:

1. 如果只在 auth/index.vue 里面使用,应该放到 auth 目录下?
2. 如果 auth 和 logout 这两个点击事件的逻辑都是确定的,没必要 emit 出去再处理,可以直接组件内处理?
MR: !16169 文件: apps/xnurta/src/components/xTable/index.vue 行号: 第 524 行 评论内容: @GitLabDuo 你是不是说反了,按你的改法 _tableName是触发 watch 时的值,你在异步请求前保存了一份 currentTableName ,那也是触发 watch 时的值,这两个值是永远相等的
MR: !16115 文件: apps/xnurta/src/components/XpAsinSelect_MultiStore/model/store/index.js 行号: 第 145 行 评论内容: 实测 undefined 也是叶节点
MR: !16079 文件: apps/xnurta/src/views/sqp/composables/useMarketplaceSupported.js 行号: 第 6 行 评论内容: SQP 是否需要支持 DSP 店铺,如果不需要支持,则需要展示不支持的页面。如果需要支持,那么 DSP 英国店铺的 countryCode 是 GB vince hu: 已和产品留言确认 添加了对DSP类型店铺的拦截
MR: !16079 文件: apps/xnurta/src/views/sqp/components/MarketplaceNotSupported.vue 行号: 第 5 行 评论内容: 仍有遗漏未替换的 $t vince hu: 已替换
MR: !16079 文件: apps/xnurta/src/views/sqp/components/SqpAsinDataDrawer.vue 行号: 第 17 行 评论内容: AmazonHeader 那边也有硬编码 20250323 的 ,既然有多个地方出现了(并且还是明显有差异的两个地方),就不要硬编码了 lynn gu: 周筛选器已重构
MR: !16079 文件: apps/xnurta/src/views/sqp/composables/useBatchOperations.js 行号: 第 41 行 评论内容: 这里 command 应该都是 batchOperations 里面固定的,为什么要用 includes 而不是直接判全等 vince hu: 因为SQP和标签改版交叉开发 所以预留了一个标签相关的操作 标签上线后会添加这个操作
MR: !16079 文件: apps/xnurta/src/views/sqp/composables/useBatchOperations.js 行号: 第 44 行 评论内容: batchOperations 里面有,但实际未实现? vince hu: 同上
MR: !16079 文件: apps/xnurta/src/views/sqp/composables/useConditionGroup.js 行号: 第 113 行 评论内容: 这里 ai 幻觉了吧,哪来的 c_profile_ids lynn gu: 已修改
MR: !16079 文件: apps/xnurta/src/views/sqp/tabs/searchQuery/index.vue 行号: 第 195 行 评论内容: 这个地方要确认一下,因为是在请求数据的方法里做翻译,那如果切换语言,不会重新请求数据,这里的翻译会不会就不更新了 vince hu: 已修改
MR: !16079 文件: apps/xnurta/src/permission.js 行号: 第 127 行 评论内容: 如前一个 mr 所说,如果确定这么做的话,要把判断 sqp page 的判断条件统一,现在这里和其他地方的判断条件是不一致的,建议提取公共方法 lynn gu: 已提取到utils/index.js里
MR: !16079 文件: apps/xnurta/src/components/xTable/components/cells/asinCardCell.js 行号: 第 20 行 评论内容: 这里原本不展示,现在展示成 AmountCell,属于 breaking changes 了。我们不能假定 AsinCard 就一定是展示总计的,是否和其他地方一样加个 showAmount 的配置项比较好 vince hu: 已添加
MR: !16079 文件: apps/xnurta/src/components/xTable/components/xTableConfigDialog.vue 行号: 第 123 行 评论内容: 改为 $t vince hu: 已替换
MR: !16079 文件: apps/xnurta/src/components/xTable/components/xTableConfigDialog.vue 行号: 第 48 行 评论内容: 为什么这个文件里面存在大量没有实际功能改动,但是格式化和变量改动、注释删除之类的变动。我看了一下并不是项目的 lint 规则导致的 vince hu: 可能是把treeMode抽离成单独组件导致的 之前是放在这个页面中的 quint liu: 不相关的改动都回退一下,仅保留必要的改动 vince hu: 是因为加了一个冻结的功能 已回退 改为在tree-mode中实现
MR: !16079 评论内容: 我这边提的都解决了,剩下的 @samily.wang.xnurta 看下吧
MR: !16073 文件: apps/xnurta/src/components/XpGrid/index.vue 行号: 第 569 行 评论内容: 这个配置目前应该不需要了,是否可以回滚所有对 XpGrid 和 xTable 的改动 quint liu: 这样应该也能解决冲突 vince hu: xTable有一个改动是sqp表格是二级表头 所以做了修改 XpGird改动可以回滚 现在SQP用的是xTable
MR: !16073 文件: apps/xnurta/src/store/modules/app.js 行号: 第 59 行 评论内容: 在全局 store 里做具体页面的判断不太好,能否在 sqp 的业务里使用的时候,不从全局 store 读取,在使用 dow 的地方直接取 0 即可 lynn gu: sqp确实不会从store读取dow数据。

changeDow函数改的是xmars/ui里的全局dow设置。

如果原标签页在sqp页面上,点击偏好设置时会打开一个新标签页,此时在偏好设置里修改dow,会执行SET_DOW-&gt; changeDow,在不刷新页面的情况下,xmars/ui里的dow设置会被直接覆盖成偏好设置的。所以加了一个判断,让它在SET_DOW的时候,sqp页面不changeDow。

(现在的设计是进入sqp页面后,changeDow为0,离开时再change回store里面的)
MR: !16073 文件: apps/xnurta/src/permission.js 行号: 第 127 行 评论内容: 如果 sqp 的 dow 可以不读取全局 store 的话,这一块逻辑也可以不需要了。

如果还是需要处理全局 store,那么判断 isSqpRoute 的判断条件要和其他地方一致,可以抽取一个公共方法
lynn gu: 同上,目的是改xmars/ui里的全局dow设置
MR: !16073 评论内容: @samily.wang.xnurta 也一起看看吧, gitlab 对比抽风了,实际需要关注下对 xTable 、 AmazonHeader 和 全局 store 的改动
MR: !16073 文件: apps/xnurta/src/views/sqp/components/SqpFilterV3.vue 行号: 第 20 行 评论内容: 在模版里的翻译用 $t 不要用 t,之前有地方用 t 结果不知道为什么页面挂掉了
MR: !16073 文件: apps/xnurta/src/components/XpCommonFilterV3/components/SaveFilterTemplateDialog.vue 行号: 第 52 行 评论内容: tab 和 fromPage 都是后端接口的概念。对前端来说,我们只是需要一个能够定位每个 filter 的唯一 id。而这个 id 是通过 filter.cacheKey 提供的。

所以,对于这种场景,可以设 cacheKey 为 SQPInsight_campaign ,请求接口时直接从 cacheKey spilt 出来即可,不需要加这两个 prop,否则以后其他地方会变得难以复用。

还有一个问题是,现在 cacheKey 统一都是 sqp , localStorage 就会只存一份,但是条件组接口会每个 tab 存一份,导致本地缓存和后端接口存取数据的粒度不一致
quint liu: 还有就是 SaveFilterTemplateDialog** 里面不应该 useStore. 不过这个可以先缓缓,等 omni channel 用到了保存条件组再说** lynn gu: 已修改为从cacheKey split的形式
MR: !16057 文件: apps/xnurta/src/components/XpCommonFilterV3/components/DateTimeInput.vue 行号: 第 7 行 评论内容: 操作符在日期类型中是共用的,日期也可以视为一种数值类型
MR: !16057 文件: apps/xnurta/src/components/XpCommonFilterV3/components/FilterTemplateSelect.vue 行号: 第 60 行 评论内容: 暂无使用
MR: !16057 文件: apps/xnurta/src/components/XpCommonFilterV3/components/SaveFilterTemplateDialog.vue 行号: 第 71 行 评论内容: 暂无使用
MR: !16057 文件: apps/xnurta/src/components/XpCommonFilterV3/model/cache.js 行号: 第 14 行 评论内容: 确实有可能,但概率很小,并且目前线上其他地方也没有处理,先不管了
MR: !16057 文件: apps/xnurta/src/components/XpCommonFilterV3/model/filter.js 行号: 第 46 行 评论内容: 我并不需要 clean up, 继续存着 undefined 就行。最后 toDraftJson 的时候会统一做过滤的
MR: !16057 文件: apps/xnurta/src/components/XpDateTimePicker/utils.js 行号: 第 51 行 评论内容: @GitLabDuo 我把 if (!min) return undefined 改成 if (_.isEmpty(min)) return undefined 是不是就可以了
MR: !16057 文件: apps/xnurta/src/utils/composition.js 行号: 第 335 行 评论内容: 之前已讨论过,没有问题
MR: !16057 文件: apps/xnurta/src/components/XpCommonFilterV3/components/FilterTemplateSelect.vue 行号: 第 72 行 评论内容: 实际未使用
MR: !16057 文件: apps/xnurta/src/components/XpCommonFilterV3/components/FilterTemplateSelect.vue 行号: 第 88 行 评论内容: 实际未使用
MR: !16057 文件: apps/xnurta/src/components/XpCommonFilterV3/components/SaveFilterTemplateDialog.vue 行号: 第 77 行 评论内容: 实际未使用
MR: !16057 文件: apps/xnurta/src/components/XpCommonFilterV3/index.vue 行号: 第 144 行 评论内容: 实际未使用
MR: !16055 文件: apps/xnurta/src/views/intelligenceCenter/ProductAdvertiseDeposit_new/AiManagedGroup/components/BatchCreateGroupDialog/index.vue 行号: 第 105 行 评论内容: 这么判断会不会不太好,比如 localhost 的时候,或者需要把 test 部署到另一个域名的时候,就会有问题

@samily.wang.xnurta 现在代码里区分测试和生产,有推荐的做法吗?
liam ye: 看了环境变量,NODE_ENV测试环境和生产都是production quint liu: 先合并 liam ye: 改域名了,也只会影响测试环境变成使用线上的模板
MR: !16053 文件: apps/xnurta/src/components/XpSelectorLayout/store/withParent.js 行号: 第 8 行 评论内容: 这里原本的使用场景是选择 campaign 下 adGroup 这种的,不是给标签这种父节点可能也是叶节点的场景服务的,是有可能父子节点 id 冲突的,不能这么改。

这个修改是在哪里使用的,我要具体看下使用场景
MR: !16042 文件: apps/xnurta/src/components/XpCommonFilterV3/presets/searchInput/SearchInput.vue 行号: 第 83 行 评论内容: 这里虽然开放了自定义,但我看标签页面传入的也还是精确/模糊,没有自定义的必要啊 vince hu: 是为了改标签那边的日语翻译 产品提供的文案是 完全一致 あいまい quint liu: 有时候产品是因为不知道已经有公共的翻译了,所以会自己又提供一次翻译。这种情况下直接用公共的就好了。

如果产品明确认为现在公共的翻译是有问题的,那就直接改公共的翻译。

现在这种自定义的方式,表面看起来灵活了,但实际上反而造成标签管理和系统其他地方的翻译不一致。
vince hu: 那我她确认下 vince hu: 和产品确认过了 修改了组件的日文翻译 去掉了自定义配置
MR: !15977 文件: apps/xnurta/src/views/allCampaigns/tabs/targeting/ProductTargeting/script.js 行号: 第 369 行 评论内容: intentional
MR: !15895 文件: apps/xnurta/src/views/intelligenceCenter/intelligenceCreation_dsp/create/_components/AiSpaceSetting/BudgetOptimization.vue 行号: 第 81 行 评论内容: 设计如此
MR: !15885 文件: CODEOWNERS 行号: 第 4 行 评论内容: @GitLabDuo 根据 https://docs.gitlab.com/user/project/codeowners/reference/#set-default-code-owner-for-a-section 这个链接再确认下语法是否有效 quint liu: @GitLabDuo 我手动把这一节的内容粘贴给你:

### Set default Code Owner for a section

If multiple file paths inside a section share the same ownership, define default Code Owners for the section. All paths in that section inherit this default, unless you override the section default on a specific li...
MR: !15885 文件: CODEOWNERS 行号: 第 22 行 评论内容: @GitLabDuo 能不能具体介绍一下,如何针对特定的代码路径改动,在无需强制审批的情况下接收通知
MR: !15853 文件: apps/xnurta/src/views/intelligenceCenter/intelligenceCreation_dsp/create/_components/AiSpaceSetting/BudgetOptimization.vue 行号: 第 81 行 评论内容: intential
MR: !15845 文件: apps/xnurta/src/views/intelligenceCenter/intelligenceCreationV3/components/modal/KeywordList/script.js 行号: 第 62 行 评论内容: this.$props.profiles 不需要这么写, 可以直接写 this.profiles
MR: !15845 文件: apps/xnurta/src/components/NegativeKeywordTargeting/index.vue 行号: 第 75 行 评论内容: $props.profiles 这里也可以直接用 profiles
MR: !15845 文件: apps/xnurta/src/components/NegativeKeywordTargeting/script.js 行号: 第 91 行 评论内容: 这段改动的目的是啥
MR: !15845 文件: apps/xnurta/src/components/NegativeKeywordTargeting/index.vue 行号: 第 75 行 评论内容: :profiles="profiles" 这一行放到 @treeAddTarget="onChangeKeywordFromKeywordList" 上面,遵循先 :xx@xx 的顺序惯例
MR: !15845 文件: apps/xnurta/src/components/NegativeKeywordTargeting/script.js 行号: 第 126 行 评论内容: 这里做的应该都是内存操作,应该很快,await 一下有作用吗?性能瓶颈应该是在下面 setTableData 的地方吧
MR: !15845 文件: apps/xnurta/src/components/NegativeKeywordTargeting/script.js 行号: 第 165 行 评论内容: 然后这里,目前是计算新的 tableData 以后全量 loadData, 然后是想规避性能问题?我看现在操作已经区分出了 add 和 delete,可以使用 table.insertAt(rows, -1) 和 table.remove(rows) 这两个方法,避免全量 loadData
MR: !15845 文件: apps/xnurta/src/components/KeywordTargeting/script.js 行号: 第 319 行 评论内容: 这里的保护会不会有点过度了,requestAnimationFrame,和下面的 table.remove,table.insert,有什么可能性是不存在的
MR: !15788 文件: apps/xnurta/src/views/sqp/tabs/searchQuery/components/SearchQueryTable.vue 行号: 第 58 行 评论内容: UI 始终以最新的样式来画图,但我们既然用了旧的表格组件,就全盘使用,像 toolbar-right 和自定义列配置这些,不要再混搭新的样式了。本来两个表格组件都已经很重了,再这么搞,又会增加额外的理解和维护成本,没有必要
MR: !15733 文件: apps/xnurta/src/views/sd/components/campaignDetail/index.vue 行号: 第 225 行 评论内容: 暂时和 sp sb 保持一致,分页加载是另外的需求
MR: !15706 文件: apps/xnurta/src/views/portfolioNew/portfolioDetail/campaignTab/index.vue 行号: 第 90 行 评论内容: intentional

就是为了解决这么写 element ui 会报错的问题
MR: !15702 文件: apps/xnurta/src/components/XpCommonFilter/components/DimensionSelect/ValueSelect.vue 行号: 第 1031 行 评论内容: 仅 merge master
MR: !15702 文件: apps/xnurta/src/components/XpCommonFilter/components/DimensionSelect/ValueSelect.vue 行号: 第 1080 行 评论内容: 仅 merge master
MR: !15702 文件: apps/xnurta/src/components/XpCommonFilterProductCenter/components/DimensionSelect/ValueSelect.vue 行号: 第 958 行 评论内容: 仅 merge master
MR: !15702 文件: apps/xnurta/src/components/XpCommonFilterProductCenter/components/DimensionSelect/ValueSelect.vue 行号: 第 1007 行 评论内容: 仅 merge master
MR: !15684 文件: src/utils/composition.js 行号: 第 334 行 评论内容: @GitLabDuo how to add cleanup logic quint liu: @GitLabDuo 当使用这个函数的组件被销毁了,并且销毁时正确调用了 off 方法,难道它不会被 JavaScript 的垃圾回收机制自动回收吗 quint liu: @GitLabDuo 关于你提到的 2.内部循环引用, 浏览器垃圾回收并不是用的引用计数方法,怎么会因为内部循环引用导致阻止垃圾回收呢 quint liu: 没啥卵用,主要还是要确保使用方正确取消监听。我们不能假设这个方法始终用在组件实例内部
MR: !15679 文件: src/layout/main/components/NavMenus/QuickMenu.vue 行号: 第 62 行 评论内容: 我先 merge 了,不过代码里面有个 waitUntil 方法,应该正好符合你这个场景
MR: !15666 评论内容: 确认一下分支,如果是今天发布的话,合到 release/2026-02-03, 指给 samily rick ma: QA说要在pre测试一下 没问题就今天发 所以我先合到pre? quint liu: 可以的,改一下目标分支到 pre 就行 rick ma: 改了 我靠我以为我选的pre sorry quint liu: ok, gitlab duo 提的看看,有道理的改一下,不用改的备注下,都 resolve 掉,我来合代码
MR: !15623 文件: src/views/allCampaigns/tabs/negativeTargeting/negativeProducts/script.js 行号: 第 110 行 评论内容: 原来的逻辑才是有问题的,只有 asin 可以添加标签
MR: !15623 文件: src/views/label/new/components/ExternalAddToLabels/index.vue 行号: 第 221 行 评论内容: 就算父组件处理是异步的,也不会阻塞 emit,并且 btnLoading 也传了
MR: !15606 文件: src/styles/fonts/iconfont.css 行号: 第 90 行 评论内容: intentional
MR: !15606 文件: src/styles/fonts/iconfont.css 行号: 第 466 行 评论内容: intentional

代码里只有 Navbar_old 一处引用,实际未使用
MR: !15585 文件: src/components/XpFilter/filters/CampaignStatusFilter.vue 行号: 第 36 行 评论内容: 你说的是符合常理的,但是 filter 组件就是这样设计的,只能这么写
MR: !15585 文件: src/views/walmart/walmartSponsoredAd/components/tabs/adGroup/tabs.vue 行号: 第 432 行 评论内容: 这个筛选项是组件内部处理的翻译
MR: !15538 文件: src/views/dsp/amazon-dsp-v2/tabs/order/table/aiColumn/index.vue 行号: 第 109 行 评论内容: 前面的判断条件已确保存在
MR: !15537 文件: src/views/allCampaigns/tabs/ads/product/columns.js 行号: 第 141 行 评论内容: intentional
MR: !15537 文件: src/views/allCampaigns/tabs/ads/product/columns.js 行号: 第 147 行 评论内容: intentional
MR: !15528 文件: src/views/allCampaigns/tabs/ads/product/columns.js 行号: 第 141 行 评论内容: 需求就是始终展示
MR: !15527 文件: src/api/AIBoard.js 行号: 第 328 行 评论内容: intentional, falsy 值也要处理,否则展示不对
MR: !15527 文件: src/api/AIBoard.js 行号: 第 327 行 评论内容: 项目代码规范如此
MR: !15507 文件: src/api/advertisingManagement.js 行号: 第 208 行 评论内容: 你看看你在写什么
MR: !15498 文件: src/views/intelligenceCenter/intelligenceCreationV3/components/objective/script.js 行号: 第 161 行 评论内容: 意义不明
MR: !15493 文件: src/views/allCampaigns/tabs/bidAdjustment/amazon/script.js 行号: 第 307 行 评论内容: 可以考虑把这段

$refs.table?.getTableData()?.tableData || []

放到 XpGrid 内部作为一个方法暴露出来

现在连续的 $refs 调用会比较脆弱,万一 XpGrid 里面有改动,很难找到外面会被影响到的地方
MR: !15488 文件: src/api/AIBoard.js 行号: 第 328 行 评论内容: 已解释过,falsy 都要管
MR: !15488 文件: src/api/AIBoard.js 行号: 第 327 行 评论内容: 现在 code style 是不加分号的,这个是正常现象,格式化出来的,没什么好大惊小怪的
MR: !15452 文件: src/views/intelligenceCenter/Notification/components/WarnCard/index.vue 行号: 第 33 行 评论内容: props.allResourceIds 会变吗,要不要套一层 computed liam ye: 不会变的,props的东西全是接口返回的固定数据,这边交互只有点击跳转
MR: !15452 文件: src/permission.js 行号: 第 159 行 评论内容: 这里查找的时候,把这个 map 反过来会更好?

'/operationManagement/allocationGood': "errorTip.message.discontinueMessageCustomDashboard"

'/dataInsights/comparison': "errorTip.message.discontinueMessageCustomDashboard"

这样就不用循环查找了,可以直接 return keyMap[to.path]
liam ye: 这样维护对象比较简单,对象比较小,循环也还好
MR: !15452 文件: src/views/settings/components/NotificationSettings.vue 行号: 第 273 行 评论内容: 这里 css 变量应该是从 figma 复制过来的,我们系统里面没这些 css 变量。优先使用我们系统里的 css 变量,其次就直接写色值就好 liam ye: 已修改
MR: !15450 文件: src/api/AIBoard.js 行号: 第 328 行 评论内容: 只是目前这种情况后端返回的是 0,但是如果后端返回的是 falsy value,也要兼容处理,不然展示出来还是不对的
MR: !15446 文件: src/components/XpAsinSelect_MultiStore/model/config.js 行号: 第 26 行 评论内容: disabled 和 default 这两个配置项好像目前没用,可以先删掉或注释

然后新增的配置项可以在文档里加一下 https://ai-xnurta.feishu.cn/wiki/ZCeRwSLczijlzBknRY1cVXiOnJe
MR: !15441 文件: src/views/dsp/ad/tabs/common/AsinDetail/AsinDetailTable.vue 行号: 第 104 行 评论内容: 非本次改动
MR: !15441 文件: src/views/productCenter/allProductList/components/ProductLineTree.vue 行号: 第 300 行 评论内容: 非本次改动
MR: !15418 文件: src/components/XpCommonFilter/components/DimensionSelect/LabelTreeSelect.vue 行号: 第 103 行 评论内容: 没见过 vue 2.7?
MR: !15389 文件: src/views/walmart/walmartSponsoredAd/components/TrendChart/index.vue 行号: 第 90 行 评论内容: 在组件里面翻译建议使用 const { t } = useI18n() ,而不是全局 import i18n 对象

一方面,可以方便升到 vue3,和 vue-i18n 用法一致;另一方面,如果是组件局部的翻译文件(在 .vue 中使用 &lt;i18n /&gt; 引入的)也只有这种方式可以引用到
MR: !15389 文件: src/views/walmart/walmartSponsoredAd/components/TrendChart/TrendChartHeader.vue 行号: 第 14 行 评论内容: 可以直接 import from 'vue', 不需要 from '@vue/composition-api' quint liu: vue 2.6 之前需要这个包做兼容层,我们现在已经 vue 2.7 了 Alec Xu: 这个是我的编辑器自动引入规则有问题,我改下
MR: !15382 文件: src/views/intelligenceCenter/ProductAdvertiseDeposit_new/AiGroupEditRedesign/log-view/config.js 行号: 第 435 行 评论内容: vite 会构建为 baseline
MR: !15381 文件: src/views/intelligenceCenter/ProductAdvertiseDeposit_new/AiGroupEditRedesign/log-view/config.js 行号: 第 435 行 评论内容: 构建过程 vite 会编译为 baseline 支持的语法
MR: !15379 文件: src/views/intelligenceCenter/ProductAdvertiseDeposit_new/AiGroupEditRedesign/log-view/config.js 行号: 第 435 行 评论内容: 构建过程 vite 会编译为 baseline 支持的语法
MR: !15371 文件: src/views/_sp/components/campaignDetail/index.vue 行号: 第 252 行 评论内容: 非本次需求改动,这个是已经合到 master 的代码
MR: !15371 文件: src/views/sb/adDetailPage/script.js 行号: 第 284 行 评论内容: 是预期行为。和其他历史代码保持一致
MR: !15371 文件: src/views/sb/components/imageAd/script.js 行号: 第 383 行 评论内容: 视频里怎么没检查了,见你最后一条 comment
MR: !15371 文件: src/views/sb/components/imageUpload/script.js 行号: 第 186 行 评论内容: 是预期行为,registerAsset 的错误由外部处理。不同情况的错误不会处理两次
MR: !15371 文件: src/views/sb/components/imageUpload/script.js 行号: 第 219 行 评论内容: 只有一处调用,由外部 try catch,是预期行为
MR: !15371 文件: src/views/sb/components/video/script.js 行号: 第 503 行 评论内容: 历史代码如此,本次只是 bugfix 不是重构
MR: !15369 文件: src/views/sb/components/imageAd/script.js 行号: 第 384 行 评论内容: 1. 和现有代码风格保持一致
2. 可以优先校验出表单错误,可能在用户修改错误的期间,已经上传完了,就不用等待
3. 不会有 validation success 信息,不会造成用户误解
MR: !15369 文件: src/views/sb/components/imageUpload/script.js 行号: 第 191 行 评论内容: 这是两个不同的分支,一个是接口错误,promise reject,一个是业务错误,返回了上传失败
MR: !15369 文件: src/views/sb/components/video/script.js 行号: 第 503 行 评论内容: 有意的,其他用途也不允许保存
MR: !15366 文件: src/components/XpCommonFilterV2/components/DynamicFilterGroupSelect.vue 行号: 第 84 行 评论内容: 如注释,必须使用 setTimeout。nextTick 没用
MR: !15366 文件: src/components/XpCommonFilterV2/components/FilterGroupSelect.vue 行号: 第 61 行 评论内容: 本次需求不涉及,先注释了,后续等新的需求再实现
MR: !15366 文件: src/components/XpCommonFilterV2/components/SaveFilterDialog.vue 行号: 第 74 行 评论内容: 本次需求不涉及,先注释了,后续等新的需求再实现
MR: !15366 文件: src/components/XpCommonFilterV2/components/SaveFilterDialog.vue 行号: 第 78 行 评论内容: 本次需求不涉及,先注释了,后续等新的需求再实现
MR: !15366 文件: src/components/XpCommonFilterV2/cache.js 行号: 第 28 行 评论内容: 这个本来不加默认值也是为了 let it crash 的。不过这样加了错误信息,能更准确定位到错误,挺好的
MR: !15366 文件: src/views/walmart/walmartSponsoredAd/utils/filterConfig.js 行号: 第 34 行 评论内容: 这里后端参数就是传 null
MR: !15342 文件: src/views/sb/components/imageUpload/script.js 行号: 第 219 行 评论内容: 这个是原来代码的问题,loading 没有用,统一改成 imgLoading 了
MR: !15313 评论内容: 有我自己的 commit 不能 approve
MR: !15307 文件: src/components/xTable/index.vue 行号: 第 851 行 评论内容: !columnConfig.supportComparison

只留这个就好了
MR: !15294 文件: src/components/xTable/index.vue 行号: 第 663 行 评论内容: 表格重新请求完以后,record 都是新的了,不会有旧的 record.selection.checked = true 的状态
MR: !15290 文件: src/components/xTable/index.vue 行号: 第 665 行 评论内容: 这里不用加,因为刷新完以后,视觉上就是完全未勾选的状态。这回改动本来就是要改视觉上未勾选,而实际状态残留的问题
MR: !15281 文件: src/utils/request.js 行号: 第 213 行 评论内容: 这里处理错误信息的逻辑,为什么放在全局的 request 里面,因为有很多不同的接口都要处理同一个错误码吗? quint liu: 我比较担心现在后端都是微服务的,也没有全局管理错误码,可能会有其他业务的接口也用到这个错误码的情况 liam ye: 是很多不同的接口都要处理同一个错误码 liam ye: 和后端确认过这个错误码,只会是这个错 quint liu: ok
MR: !15267 文件: src/views/home_new/components/SalesOverviewNew.vue 行号: 第 182 行 评论内容: 非本次改动
MR: !15267 文件: src/views/home_new/components/SalesOverviewNew.vue 行号: 第 258 行 评论内容: 非本次改动
MR: !15232 文件: src/views/home_new/components/SalesOverviewNew.vue 行号: 第 182 行 评论内容: 非本次需求代码
MR: !15232 文件: src/views/messageCenter/components/BulletinMessage/index.vue 行号: 第 55 行 评论内容: see https://gitlab.com/sparkxmedia/xnurta-web/-/merge_requests/15220
MR: !15232 评论内容: 有一些变更,好像是 master 上有 ,release 分支上没有?
MR: !15224 文件: src/views/walmart/walmartSponsoredAd/components/TrendChart/index.vue 行号: 第 71 行 评论内容: 父组件都改过了,只需要 currData。
MR: !15220 文件: src/views/messageCenter/components/BulletinMessage/index.vue 行号: 第 55 行 评论内容: 如果 userinfo 接口挂了,那基本上整个系统都用不了了,这里加兜底也没用
MR: !15217 文件: src/components/xTable/index.vue 行号: 第 1128 行 评论内容: 这个高度是在 vtable 里面的,没法通过改布局解决,但已经替换成了 css 变量
MR: !15217 文件: src/components/xTable/index.vue 行号: 第 1093 行 评论内容: 已修改
MR: !15153 文件: src/components/XpAsinSelect_MultiStore/model/config.js 行号: 第 237 行 评论内容: 外部应该使用 unref 去取值。这么做有额外的装箱开销
MR: !15104 文件: src/components/xTable/index.vue 行号: 第 822 行 评论内容: 你说的很对,虽然实际使用中,都只是和外部的变量做同步,不会有副作用,实际不影响。但确实这样做也不是完美的做法。

至于将 watch 的 immediate 设为 true,可能影响会比较大,造成其他地方的时序问题或死循环问题。

理论上,修改 innerOrderInfo 的场景是少的,我们可以不使用 watch,而是在所有修改 innerOrderInfo 的地方手动进行 emit

从长远来看,目前的 orderInfo 并非真正的双向绑定,我们应采用 single source of truth 的原则,去除 xTable 内部维护的 innerOrderInfo 状态
MR: !15101 文件: src/components/XpAd/XpAdCommonFilter/components/ProductSelector_MultiStore/utils.js 行号: 第 89 行 评论内容: 1. sku asin parentAsin 共享相同的逻辑,是正常的
2. 处理完后已经 return 了,不会 fall through 到 productLine,不用加 break
MR: !15093 文件: src/components/XpAd/XpAdCommonFilter/components/ProductSelector_MultiStore/utils.js 行号: 第 89 行 评论内容: intentional
MR: !15084 文件: src/components/xTable/index.vue 行号: 第 1126 行 评论内容: xTable 的设计,即使滚动条不展示时,也会占据空间,因此这个意见不成立
MR: !15082 文件: src/api/AIBoard.js 行号: 第 325 行 评论内容: 在使用 parsed 的地方,已经做了判空处理
MR: !15082 文件: src/api/AIBoard.js 行号: 第 302 行 评论内容: 已经做了 scheduleTimeType 的判空。理论上这个字段存在,其他的字段也存在
MR: !15082 文件: src/views/intelligenceCenter/ProductAdvertiseDeposit_new/AiGroupEditRedesign/log-view/config.js 行号: 第 396 行 评论内容: vite 会对 baseline 做兼容
MR: !15051 文件: src/layout/main/components/Navbar.vue 行号: 第 66 行 评论内容: 瞎改
MR: !15041 文件: src/views/productCenter/allProductList/components/ProductLineTree.vue 行号: 第 139 行 评论内容: props default 可以为 null,不影响 type
MR: !14905 文件: src/views/intelligenceCenter/ProductAdvertiseDeposit_new/AiGroupEditRedesign/adapter/useOverBid.js 行号: 第 161 行 评论内容: xmarsTag 是挂在 window 上的全局对象,无需单独 import
MR: !13722 文件: src/utils/budget.js 行号: 第 34 行 评论内容: initBudgetData 和 initBidData 这两个方法,如果只是给自动化用,就不要放到这个全局的文件里,而是放到自动化的目录下面。因为现在方法里面加入了 usageContext 判断,以及 bidList 是根据我们这次需求来取的,并不是特别的通用了
MR: !13722 文件: src/views/automation/automationTemplate/addTargeting/components/CampaignGroupSelect/table/index.vue 行号: 第 377 行 评论内容: 这里不请求接口,是因为行动空间编辑中,会由托管组负责提供 campaign,而不是请求店铺下的 campaign。因此我理解这里不需要根据 usageContext 去细分,只要能区分出是行动空间编辑的场景(scope="aiActionSpace")并且 campaign 为空 就不用请求接口
MR: !13722 文件: src/views/automation/automationTemplate/addTargeting/newComponents/customSettings.vue 行号: 第 83 行 评论内容: 这里如果直接用 usageContext,意思就是说”如果是模版场景,就不按国家和广告类型取,而是取默认值“。但更好的说法是”如果是模版场景,没有用户选择的托管组,因此取不到对应的国家和广告类型,因此只能取一个兜底的值“。
这样的话,我们需要判断的就不是【是否是编辑模版】,而是【是否当前没有正在操作的托管组/国家/广告类型】。而这个条件,可以使用 isEmpty(model.aiGroupContexts) 来区分
quint liu: 更进一步地说,initBidData 方法未来就可以接受一个 { campaignType, country }[] 的参数,根据传入的参数读取配置取并集。如果参数为空自然就是取默认值。这样这个方法的逻辑就非常自然了,不会掺杂任何上层的特殊逻辑
MR: !13722 文件: src/views/automation/automationTemplate/addTargeting/newComponents/ruleAction.vue 行号: 第 111 行 评论内容: 同上
MR: !13722 文件: src/views/automation/automationTemplate/budget/components/budget.vue 行号: 第 94 行 评论内容: 同上
MR: !13722 文件: src/views/automation/automationTemplate/budget/components/calendarFormItem.vue 行号: 第 95 行 评论内容: 同上
MR: !13722 文件: src/views/automation/automationTemplate/keyword/index.vue 行号: 第 55 行 评论内容: 这里是为了判断,如果是批量操作场景,要禁用选 campaign 的一些操作。这里可以有两种解释方式:
1. 因为选了多个托管组,每个托管组的 campaign 不同,所以才禁用(即 model.aiGroupContexts?.length &gt; 1)。但这种解释方法无法解释只选一条托管组进入批量操作的场景。
2. 因为批量操作场景,我们只是针对 AI 行动空间进行批量操作,而不是针对整个托管组操作。因此在行动空间的批量操作中,我们其实根本不涉及 campaign,感知不到 campaign 的存在,所以需要禁用 campaign 相关的选项。
这种理解就是之前我们使用
<br>const isBatchOperate = computed(() =&gt; campaignList.value === undefined)<br>
这种方式判断批量操作的依据。

不过现在 campaignList 这个 prop 默认是 [],导致外部传入的时候,内部可能区分不出空(批量操作,无 campaign 概念)和空数组(...
MR: !13223 文件: src/views/home_new/components/NotificationNew.vue 行号: 第 46 行 评论内容: 里面用了 t('xx'),这里要用 computed,不能用 ref,否则切换语言时不会切换这里的翻译
MR: !13180 文件: src/views/intelligenceCenter/ProductAdvertiseDeposit_new/AiGroupEditRedesign/components/AiSpaceSettings/AdvancedView/automationRules/bidAdjustment/BidAdjustmentRuleForm.vue 行号: 第 46 行 评论内容: 这里理解错代码的意图了。这里的 model 可以理解为一个类似 pinia 的 store,不是一个 plain object,而是一个多层嵌套的响应式对象,本来就是用来直接修改的。通过 emit 去解构赋值修改不但增加了代码的复杂度,还有可能引起丢失响应性的问题
MR: !13180 文件: src/views/intelligenceCenter/ProductAdvertiseDeposit_new/AiGroupEditRedesign/components/AiSpaceSettings/AdvancedView/automationRules/bidDaypart/BidDaypartRuleForm.vue 行号: 第 47 行 评论内容: 校验失败时不应该保持原有数据不变,因为这里并不是一个页面只有这一个表单,即使用户校验失败,他也可以先切去别行动空间编辑别的内容。这个时候之前用户编辑的内容不能丢失

另外,还有一个相关的问题是,我希望 getDetail 这个方法获取表单数据是同步的。如上一段所说,获取数据应该就是单纯把数据抛出来,不应该关心校验结果,那么也自然而然是同步的。并且,因为现在行动空间交互逻辑较为复杂,层层嵌套下如果连数据都是异步的,容易产生时序问题
MR: !13180 文件: src/views/automation/automationTemplate/budget/script.js 行号: 第 193 行 评论内容: 这个 watch 的意图是什么。组件通常来说可以分为受控的和非受控的。受控的情况下,所有的改动会直接反映在 aiActionSpaceData 上。但从现在的组价逻辑来看,传入的 aiActionSpaceData 会先转换为内部的 detail,在需要时外部再调用 getDetail 提取出去,那就是非受控的逻辑,aiActionSpaceData 只用于默认值。这种情况下加这个 watch 有点意义不明。不过实际使用倒应该没什么问题
MR: !13113 文件: src/views/automation/automationTemplate/budget/methods.js 行号: 第 13 行 评论内容: detail 经过转换以后只剩两个字段了吗
MR: !13113 文件: src/views/automation/automationTemplate/budgetRule/index.vue 行号: 第 90 行 评论内容: campaignType 和 customData 这两个 props 是不是没用了
MR: !13113 文件: src/views/automation/automationTemplate/budgetRule/index.vue 行号: 第 77 行 评论内容: 需要加一个通用的功能,就是对于每个组件,增加一个 disabled 属性,为 true 时禁用所有内部的编辑
MR: !13113 文件: src/views/automation/automationTemplate/budgetRule/methods.js 行号: 第 3 行 评论内容: 这里是 【conditions】,下面那个方法的字段名又是【condition】,究竟以哪个为准
MR: !13113 文件: src/views/automation/automationTemplate/budgetRule/index.vue 行号: 第 228 行 评论内容: 没有 $refs.form
MR: !13113 文件: src/views/automation/automationTemplate/addTargeting/newTargeting.vue 行号: 第 189 行 评论内容: 1. 这个组件没有 $refs.form
2. created 时还拿不到 ref
MR: !12934 文件: src/views/intelligenceCenter/intelligenceCreation_dsp/create/_adapter/ai.js 行号: 第 195 行 评论内容: check 是否需要默认值
MR: !11659 文件: src/api/intelligenceCenter/dspSmartCreation.js 行号: 第 44 行 评论内容: 这里为什么要保留原来的 label,可以加个注释说明一下
MR: !11659 文件: src/views/intelligenceCenter/intelligenceCreation_dsp/detail/module/log/components/LogTable/EventValueCell/utils.js 行号: 第 5 行 评论内容: 看上去可以直接用 lodash capitalize
MR: !11659 文件: src/views/dsp/amazon-dsp-v2/tabs/log/components/FilterBar/AudienceFilter.vue 行号: 第 36 行 评论内容: store.getters.dspCountry
MR: !11652 文件: src/views/automation/components/chartCardHeader.vue 行号: 第 86 行 评论内容: 这个 t 不需要 return 出去
MR: !11179 文件: src/views/automation/automationTemplate/budget/script.js 行号: 第 354 行 评论内容: 这里的中文是否需要翻译 Placeholder jehan.jia: Pasted_Graphic_2

Pasted_Graphic_3

this.defaultBudget

这段代码并不是此次新增的代码、而是沿用过去的代码、此外我看到「复制1」在项目中出现多次、并且为 Autumn 开发、故暂不修改
MR: !11179 文件: src/views/automation/automationTemplate/budget/components/dailyFormItem.vue 行号: 第 17 行 评论内容: 这里可以直接 import from 'vue',无需再 from '@vue/composition-api',其他地方同理
MR: !11179 文件: src/views/automation/automationTemplate/budget/components/dailyFormItem.vue 行号: 第 64 行 评论内容: let 可以尽量用 const
MR: !11179 文件: src/views/automation/automationTemplate/budget/components/weeklyFormItem.vue 行号: 第 81 行 评论内容: let 可以尽量用 const
MR: !11179 文件: public/budget/budget.json 行号: 第 1 行 评论内容: 这个文件里面的配置内容,在 src/utils/country.js 里面已经有了。如果要读取当前店铺的配置,可以直接使用 store.getters.countryConfig

其中除了 SD Default budget 以外,其他的值都是现成的(有些不用区分 vendor)

SD Default budget,我不确定是亚马逊定义的值,还是我们这次需求定义的值,以及用处是啥。如果是前者,可以更新到 country.js 里面。如果是后者,可以放到这次需求对应的模块目录下
MR: !11179 文件: src/components/XpCurrencyInput/index.vue 行号: 第 75 行 评论内容: 有什么场景需要把金额的符号放在后面? Placeholder jehan.jia: Pasted_Graphic_4
MR: !11179 文件: src/components/XpCurrencyInput/index.vue 行号: 第 37 行 评论内容: 有什么场景会在失焦状态下触发 input 事件? Placeholder jehan.jia: 录屏2025-04-24_11.13.25 quint liu: 原来是 clearable 的情况,之前确实没有这个场景。clearable 的话也会同时调用 onChange,问题不大。我觉得不需要加这个 prop 了,直接把 onInput 里面的 if 判断删了就行
MR: !7030 文件: src/views/productCenter/productAnalysis/tabs/campaignOptimization/components/SpChartCard.vue 行号: 第 24 行 评论内容: 多打了一个 “4”?
MR: !6242 文件: src/components/XpEllipsisText/index.vue 行号: 第 46 行 评论内容: 为什么需要在这个组件里面加一个错误 icon
理论上来说,这个组件只负责文字的缩略展示,如果需要加 icon,应该放在组件外部平级展示
quint liu: 或者可以尝试把内容放到 slot 中,例如:
<br>&lt;xp-ellipsis-text :text="xxx"&gt;<br> &lt;i class="icon" /&gt;<br>&lt;/xp-ellipsis-text&gt;<br>
MR: !4622 文件: src/views/tools/rankLockV2/form/components/ChangeAsinDialog.vue 行号: 第 3 行 评论内容: suggestion:-0+0<br> &lt;el-dialog class="xp-dialog" :visible.sync="visible" :title="$t('tools.rankLockV2.monitorAsin')" :close-on-click-modal="false" width="600px"&gt;<br>

el-dialog 可以加一个 xp-dialog 的 class 便于应用一些统一的样式
MR: !4622 文件: src/views/tools/rankLockV2/form/components/RepeatDialog.vue 行号: 第 3 行 评论内容: suggestion:-0+0<br> &lt;el-dialog class="xp-dialog" :visible.sync="visible" :title="$t('repeat')" :close-on-click-modal="false" width="878px"&gt;<br>

同上
MR: !4622 文件: src/views/tools/rankLockV2/form/components/ChangeAsinDialog.vue 行号: 第 68 行 评论内容: 这里建议使用 computed 而不是 reactive,因为 label 有翻译,需要确保切换语言的时候重新翻译

虽然这里是在 dialog 里面,不可能同时切换语言,但使用 computed 是更通用的做法
MR: !4622 文件: src/views/tools/rankLockV2/task/index.vue 行号: 第 61 行 评论内容: suggestion:-0+0<br> }, { default: 0 })<br>
这里可以加一个默认值,确保 keywordCount 始终是 number 类型

Placeholder Samily.Wang (@SamilyWang_placeholder_1su4qe71)

125 个讨论,涉及 25 个 MR

评论
MR: !13288 文件: src/views/productCenter/index_v2.vue 行号: 第 834 行 评论内容: 确定有alert方法?建议改为this.t的版本,不能只有中文
MR: !13288 文件: src/views/productCenter/index_v2.vue 行号: 第 836 行 评论内容: 同上
MR: !13288 文件: src/views/productCenter/index_v2.vue 行号: 第 810 行 评论内容: 注释就删掉吧
MR: !13223 文件: src/views/allCampaigns/components/ChartsTheater/DashboardChart.vue 行号: 第 224 行 评论内容: 这边加几个翻译文件是为了干什么?
MR: !13223 文件: src/views/home_new/components/AiActionSummary.vue 行号: 第 3 行 评论内容: 不太建议这种太过宽泛的className,比较容易被外部的CSS意外影响到。建议加个前缀什么的,比如ai-action-summary-header
后面的title,data, num, unit同上
MR: !13223 文件: package.json 行号: 第 26 行 评论内容: 这边移除掉^,用固定的版本号
MR: !13223 文件: src/views/home_new/components/AiActionSummary.vue 行号: 第 45 行 评论内容: 不太建议用filters了,建议用@xmars/ui中的formatNumber方法统一做数字的格式化
MR: !13223 文件: src/views/home_new/components/AiActionSummary.vue 行号: 第 129 行 评论内容: data这种变量的命名太宽泛了,比如这边更好的变量名我觉得可以是aiActionData
MR: !13223 文件: src/views/home_new/components/AiActionSummary.vue 行号: 第 130 行 评论内容: 然后这些数字的初始化值,不太建议用'--'这种string来做初始化,看情况用null或者0更适合。
'--'这种统一交给格式化的方法去处理空值的时候返回即可
MR: !13223 文件: src/views/home_new/components/AiActionSummary.vue 行号: 第 140 行 评论内容: 这种无用的注释代码记得清理
MR: !13223 文件: src/views/home_new/components/AiActionSummary.vue 行号: 第 194 行 评论内容: 同样的,这边不需要去处理'--'的问题,统一交给formatNumber
MR: !13223 文件: src/views/home_new/components/AiActionSummary.vue 行号: 第 190 行 评论内容: 样式部分统一说一下几个问题:
1. 用css的var变量的时候可以不用填默认值
2. 宽度/高度/边距等尽量保证是4的倍数,其次是2的倍数,不需要完全按照UI图上的取值
3. 优先用td_web项目中_variables_new.scss中的变量
MR: !13223 文件: src/views/home_new/components/AiOverview.vue 行号: 第 91 行 评论内容: 格式化统一用@xmars/ui中的formatNumber
MR: !13223 文件: src/views/home_new/components/AiOverview.vue 行号: 第 97 行 评论内容: 格式化方法统一用@xmars/ui中的formatNumber,下同
另外不要把0格式化为'--',0就是0,和null这种空值的定义是不一样的。
因为类似订单数这种字段,是有可能为0的。如果后端返回了null,说明这个字段后端没有从Amazon接口那边获取到,这个时候才需要格式化为'--'
MR: !12657 文件: packages/xnurta-i18n/legacy/lang/automation/ja.json 行号: 第 143 行 评论内容: 确认下翻译,和中英文意思对不上,以及key表达的是除去最近三天 Placeholder jehan.jia: 已修复、更新后文案最终显示效果如下
image
MR: !12268 文件: src/views/amc/components/dialogs/PredataDialog.vue 行号: 第 455 行 评论内容: 这行似乎是多余的
MR: !12268 文件: src/views/amc/components/dialogs/PredataDialog.vue 行号: 第 460 行 评论内容: 这个catch没啥用
MR: !12144 文件: src/views/automation/automationTemplate/budget/components/hourlyStrategy.vue 行号: 第 37 行 评论内容: 这边注意格式化,多了空格
MR: !12144 文件: src/views/automation/automationTemplate/budgetRule/components/chartCardHeader.vue 行号: 第 88 行 评论内容: #4e5969替换为var(--color-text)
MR: !12144 文件: src/views/automation/automationTemplate/budgetRule/components/customSettings.vue 行号: 第 204 行 评论内容: padding: var(--space-16) var(--space-16) var(--space-8)
MR: !12144 文件: src/views/automation/automationTemplate/budgetRule/components/customSettings.vue 行号: 第 225 行 评论内容: color: var(--color-title);
MR: !12144 文件: src/views/automation/automationTemplate/budgetRule/components/customSettings.vue 行号: 第 235 行 评论内容: color: var(--color-text-secondary);
MR: !12144 文件: src/views/automation/automationTemplate/budgetRule/components/customSettings.vue 行号: 第 236 行 评论内容: font-size: var(--font-12);
MR: !12144 文件: src/views/automation/automationTemplate/budgetRule/components/rule.vue 行号: 第 299 行 评论内容: color: var(--color-primary);
MR: !12144 文件: src/views/automation/automationTemplate/budgetRule/components/schedule.vue 行号: 第 387 行 评论内容: var(--color-text)
MR: !12008 文件: src/utils/country.js 行号: 第 810 行 评论内容: 这块代码单独放一个文件
MR: !12008 文件: packages/xnurta-i18n/legacy/lang/ja.json 行号: 第 2739 行 评论内容: 日语少了一行
MR: !12008 文件: packages/xnurta-i18n/legacy/lang/automation/ja.json 行号: 第 107 行 评论内容: 少字段了
MR: !12008 文件: src/views/automation/automationTab/index.vue 行号: 第 178 行 评论内容: 复杂的表达式全部写成computed
不要在template中写过于复杂的逻辑
MR: !12008 文件: src/views/automation/automationTab/index.vue 行号: 第 228 行 评论内容: 同上
MR: !12008 文件: src/views/automation/automationTab/index.vue 行号: 第 184 行 评论内容: 同上
MR: !12008 文件: src/views/automation/automationTab/index.vue 行号: 第 187 行 评论内容: 同上
MR: !12008 文件: src/views/automation/automationTab/index.vue 行号: 第 199 行 评论内容: 同上, 另外最好这些magic number添加相应注释解释含义
MR: !12008 文件: src/views/automation/automationTab/index.vue 行号: 第 286 行 评论内容: :is-tab="true" 可缩写为 is-tab
MR: !12008 文件: src/views/automation/automationTab/script.js 行号: 第 19 行 评论内容: 这些magic number 添加相关注释
MR: !12008 文件: src/views/automation/automationTab/script.js 行号: 第 55 行 评论内容: 有全局方法$hasPermission
MR: !12008 文件: src/views/automation/automationTab/script.js 行号: 第 71 行 评论内容: 变量命名默认小写驼峰,首字母小写
MR: !12008 文件: src/views/automation/automationTab/script.js 行号: 第 499 行 评论内容: 本身就是boolean值了,为什么还需要判等?
this.budgetRuleOpen ? 1 : 0
MR: !12008 文件: src/views/automation/automationTemplate/budgetRule/components/RangeInput.vue 行号: 第 4 行 评论内容: 这几个XpCurrencyInput不都是配置项上的区别么???不需要重复写那么多XpCurrencyInput,直接根据type计算出来一份相关配置不就行了?
另外全局维度有张配置表的,src/utils/xmarsUiHelper.js,其中有相关维度/指标的信息
MR: !12008 文件: src/views/automation/automationTemplate/budgetRule/components/TagsInput.vue 行号: 第 2 行 评论内容: class没必要用is-disabled,含义冗余了,直接用disabled就行
MR: !12008 文件: src/views/automation/automationTemplate/budgetRule/components/TagsInput.vue 行号: 第 4 行 评论内容: 少用item这种含义不清的变量名,类似这边可以用tag作为变量名
MR: !12008 文件: src/views/automation/automationTemplate/budgetRule/components/TagsInput.vue 行号: 第 99 行 评论内容: 常见样式/颜色参考src/styles/_variables_new.scss
MR: !12008 文件: src/views/automation/automationTemplate/budgetRule/components/budget.vue 行号: 第 70 行 评论内容: 你这边是option api的写法,不需要引入useI18n,那是给composition api使用的...
如果需要翻译,在option api写法下直接用this.$t即可
MR: !12008 文件: src/views/automation/automationTemplate/budgetRule/components/budget.vue 行号: 第 95 行 评论内容: 更建议使用lodash的isEqual
MR: !12008 文件: src/views/automation/automationTemplate/budgetRule/components/budget.vue 行号: 第 110 行 评论内容: 同上
MR: !12008 文件: src/views/automation/automationTemplate/budgetRule/components/chartCardHeader.vue 行号: 第 4 行 评论内容: 为啥会直接在template里面写svg...icon级别的图片让UI写到字体文件里面,大的图片用svg文件的形式引入
MR: !12008 文件: src/views/automation/automationTemplate/budgetRule/components/conditionItem.vue 行号: 第 107 行 评论内容: 这段更建议用switch case写法,会更简洁
MR: !12008 文件: src/views/automation/automationTemplate/budgetRule/components/conditionItem.vue 行号: 第 133 行 评论内容: 同上
MR: !12008 文件: src/views/automation/automationTemplate/budgetRule/components/conditionItem.vue 行号: 第 60 行 评论内容: 这里index和index2是分别代表什么?为什么会取这种变量名
MR: !12008 文件: src/views/automation/automationTemplate/budgetRule/components/conditionItem.vue 行号: 第 167 行 评论内容: emit一般放在script部分的开头,在props后面
MR: !12008 文件: src/views/automation/automationTemplate/budgetRule/components/conditionItem.vue 行号: 第 193 行 评论内容: 这里面为什么name是impressions2 Placeholder jehan.jia: image
MR: !12008 文件: src/views/automation/automationTemplate/budgetRule/components/conditionItem.vue 行号: 第 198 行 评论内容: 同上,为什么是cr2 Placeholder jehan.jia: image
参考其他组件的命名
MR: !12008 文件: src/views/automation/automationTemplate/budgetRule/components/customSettings.vue 行号: 第 25 行 评论内容: 同之前的,不要在template里面写svg
MR: !12008 文件: src/views/automation/automationTemplate/budgetRule/components/customSettings.vue 行号: 第 48 行 评论内容: 为什么要一会用option api, 一会用composition api, 一会用composition api + setup?
MR: !12008 文件: src/views/automation/automationTemplate/budgetRule/components/customSettings.vue 行号: 第 168 行 评论内容: css代码里面做一下处理,figma里面粘贴出来的CSS很多地方变量都不对而且代码冗余
MR: !12008 文件: src/views/automation/automationTemplate/budgetRule/components/customSettings.vue 行号: 第 211 行 评论内容: 避免这种命名,语义不清
MR: !12008 文件: src/views/automation/automationTemplate/budgetRule/components/customSettings.vue 行号: 第 187 行 评论内容: 避免这种命名,语义不清
MR: !12008 文件: src/views/automation/automationTemplate/budgetRule/components/customSettings.vue 行号: 第 220 行 评论内容: 样式变量名不对
MR: !12008 文件: src/views/automation/automationTemplate/budgetRule/components/customSettings.vue 行号: 第 228 行 评论内容: 样式变量名不对
MR: !12008 文件: src/views/automation/automationTemplate/budgetRule/components/hourlyStrategy.vue 行号: 第 73 行 评论内容: 建议使用isEqual
MR: !12008 文件: src/views/automation/automationTemplate/budgetRule/components/hourlyStrategy.vue 行号: 第 193 行 评论内容: 尽量避免使用!import
MR: !12008 文件: src/views/automation/automationTemplate/budgetRule/components/hourlyStrategy.vue 行号: 第 195 行 评论内容: 同上
MR: !12008 文件: src/views/automation/automationTemplate/budgetRule/components/rule.vue 行号: 第 252 行 评论内容: 放到单独文件中去
MR: !12008 文件: src/views/automation/automationTemplate/budgetRule/components/ruleAction.vue 行号: 第 180 行 评论内容: 放到单独文件中去
MR: !12008 文件: src/views/automation/automationTemplate/budgetRule/components/ruleCondition.vue 行号: 第 201 行 评论内容: 放到单独文件中
MR: !12008 文件: src/views/automation/automationTemplate/budgetRule/components/ruleConditionForm.vue 行号: 第 19 行 评论内容: 同之前的,index2是什么鬼
MR: !12008 文件: src/views/automation/automationTemplate/budgetRule/components/ruleItem.vue 行号: 第 30 行 评论内容: 避免行内样式,另外系统全局padding没有7px和15px只有8px和16px
MR: !12008 文件: src/views/automation/automationTemplate/budgetRule/components/schedule.vue 行号: 第 110 行 评论内容: 同之前
MR: !12008 文件: src/views/automation/automationTemplate/budgetRule/components/schedule.vue 行号: 第 154 行 评论内容: 理论上无需引入currentInstance
MR: !12008 文件: src/views/automation/automationTemplate/budgetRule/components/schedule.vue 行号: 第 209 行 评论内容: 可以在文件开头const message = useMessage()
然后这边message.error(xxxx)
MR: !12008 文件: src/views/automation/automationTemplate/budgetRule/components/schedule.vue 行号: 第 219 行 评论内容: 同上
MR: !12008 文件: src/views/automation/automationTemplate/budgetRule/components/utils.js 行号: 第 79 行 评论内容: 这边为什么是impressions2
MR: !12008 文件: src/views/automation/automationTemplate/budgetRule/components/utils.js 行号: 第 99 行 评论内容: 这里为什么是cr2
MR: !11238 文件: src/views/intelligenceCenter/ProductAdvertiseDeposit_new/Notification/components/Cards/AIReadlinessCampaignCard.vue 行号: 第 219 行 评论内容: 埋点这边加上默认的2个属性
MR: !10956 文件: src/views/profile/amazon/AddOrEditProfileDialog.vue 行号: 第 45 行 评论内容: 这边的disabled的逻辑有点复杂,建议改成computed或者某个method
MR: !10178 文件: src/views/financial/billingCenter/vNewAiPro/component/overView/index.vue 行号: 第 77 行 评论内容: 这边为啥是中文?没有用翻译key
MR: !9961 文件: src/layout/main/index.vue 行号: 第 144 行 评论内容: 这里面的数字都是什么神奇的数字???
加上对应注释说明逻辑
MR: !9960 文件: src/lang/AIActionSpace/en.js 行号: 第 47 行 评论内容: 英文文案
MR: !9752 文件: src/views/financial/billingCenter/vNewAiPro/component/script.js 行号: 第 3 行 评论内容: 格式化代码...
MR: !9637 文件: src/views/financial/billingCenter/vNewAiPro/component/script.js 行号: 第 3 行 评论内容: 格式化下代码
MR: !9218 文件: src/store/modules/global.js 行号: 第 110 行 评论内容: 这里为啥要删除place: 'session'
MR: !8522 文件: src/store/modules/global.js 行号: 第 76 行 评论内容: 这边更新url中的字段改成walmartTenantId,不要和amz的tenantId混淆
MR: !8485 文件: src/store/walmart/create.js 行号: 第 49 行 评论内容: 调试代码删掉
MR: !8485 文件: src/views/walmart/walmartSponsoredAd/components/CreateCampaign/index.vue 行号: 第 127 行 评论内容: 调试代码删掉
MR: !8485 文件: src/views/walmart/walmartSponsoredAd/components/tabs/products/index.vue 行号: 第 363 行 评论内容: 调试代码
MR: !8485 文件: src/views/walmart/walmartSponsoredAd/views/adGroupDetail/tabs/BrandsTab.vue 行号: 第 161 行 评论内容: 调试代码
MR: !8485 文件: src/views/walmart/walmartSponsoredAd/views/adGroupDetail/tabs/VideoTab.vue 行号: 第 158 行 评论内容: 调试代码
MR: !8089 文件: src/views/_sp/ad/tabs/keyword/index.vue 行号: 第 33 行 评论内容: 这一行为啥会移除
MR: !7397 文件: src/layout/main/components/header/components/WalmartMultiStoreSelect.vue 行号: 第 180 行 评论内容: 这一段仅是初始化的逻辑,需要检测下oldVal===-2才执行并且执行后不再watch
MR: !6711 文件: src/components/XpGrid/index.vue 行号: 第 39 行 评论内容: 这边建议直接放到toolbar-right的slot里面去,而不是通过config的配置来控制显隐
MR: !6711 文件: src/components/XpGrid/index.vue 行号: 第 360 行 评论内容: 这个参数应该用不到了吧?
MR: !6711 文件: src/components/XpGrid/index.vue 行号: 第 1732 行 评论内容: 这些样式也应该用不到了?
MR: !6711 文件: src/components/XpGrid/index.vue 行号: 第 1838 行 评论内容: 翻译同上,应该也可以删除了
MR: !6711 文件: src/components/XpGrid/XpDeepLive.vue 行号: 第 105 行 评论内容: targetTip,命名规范尽量都是小写驼峰式
MR: !6711 文件: src/components/XpGrid/XpDeepLive.vue 行号: 第 106 行 评论内容: itemTip
MR: !6373 文件: src/views/walmart/autoRules/views/template/budgetDayParting/components/BudgetAllotController/index.vue 行号: 第 241 行 评论内容: var(--color-text)
MR: !6373 文件: src/views/walmart/autoRules/views/template/budgetDayParting/components/BudgetAllotController/AllotController/index.vue 行号: 第 872 行 评论内容: 写复杂了...可以直接简写成如下
const isPrecent = () => modelInner.value.dailyBudgetValueType == 'coefficient'
MR: !6242 文件: src/lang/en.js 行号: 第 2991 行 评论内容: 重复了,可用common.thisMonth
MR: !6242 文件: src/lang/zh.js 行号: 第 2969 行 评论内容: 重复了,可用common.thisMonth
MR: !6242 文件: src/components/XpEllipsisText/index.vue 行号: 第 4 行 评论内容: 这里为什么会有2个icon class?
MR: !6005 文件: src/lang/zh.js 行号: 第 164 行 评论内容: 这块不要修改现有翻译,在亚马逊这边,"广告活动状态"和"广告活动投放状态"是2个字段,含义不同
MR: !6005 文件: src/lang/en.js 行号: 第 164 行 评论内容: 同下,不要修改原有字段,建议新增一个字段
MR: !5467 文件: package.json 行号: 第 73 行 评论内容: 移动到devDependencies
MR: !5467 文件: src/components/BidFilter/index.vue 行号: 第 9 行 评论内容: 货币单位取 store.getters.walmartCountryConfig中国家对应的货币符号
image
MR: !5467 文件: src/components/BidFilter/index.vue 行号: 第 8 行 评论内容: :bid的绑定似乎无用
MR: !5467 文件: src/components/BidFilter/index.vue 行号: 第 37 行 评论内容: ---color-text-2 -> --color-text
MR: !5467 文件: src/components/BidFilter/index.vue 行号: 第 38 行 评论内容: 单独元素不要去设置font-family
MR: !5467 文件: src/components/XpGrid/index.vue 行号: 第 1120 行 评论内容: 正式合并前记得删除debugger
MR: !5467 文件: src/views/walmartSponsoredAd/components/CampaignInfo/index.vue 行号: 第 102 行 评论内容: var(---color-text-1) -> var(--color-title)
MR: !5467 文件: src/views/walmartSponsoredAd/components/CampaignInfo/index.vue 行号: 第 98 行 评论内容: #fff/var(--color-white)
MR: !5467 文件: src/views/walmartSponsoredAd/components/CampaignInfo/index.vue 行号: 第 55 行 评论内容: 统一采用XpEllipsisText组件
MR: !5467 文件: src/views/walmartSponsoredAd/components/CreateCampaign/index.vue 行号: 第 9 行 评论内容: show-word-limit
MR: !5467 文件: src/views/walmartSponsoredAd/components/CreateCampaign/index.vue 行号: 第 14 行 评论内容: 可以去掉这个template,把v-if放到下面组件上
MR: !5467 文件: src/views/walmartSponsoredAd/components/CreateCampaign/index.vue 行号: 第 63 行 评论内容: 提交时候记得删除
MR: !5467 文件: src/views/walmartSponsoredAd/components/CreateCampaign/index.vue 行号: 第 103 行 评论内容: common.successful
MR: !5467 文件: src/views/walmartSponsoredAd/components/CreateCampaign/index.vue 行号: 第 102 行 评论内容: createSuccess/addSuccess
MR: !5467 文件: src/views/walmartSponsoredAd/components/CreateCampaign/index.vue 行号: 第 116 行 评论内容: smooth: true
MR: !5467 文件: src/views/walmartSponsoredAd/components/CreateCampaignBase/index.vue 行号: 第 527 行 评论内容: var(--border)
MR: !5467 文件: src/views/walmartSponsoredAd/components/tabs/adGroup/index.vue 行号: 第 25 行 评论内容: 使用XpLink或者a标签
MR: !5467 文件: src/views/walmartSponsoredAd/components/tabs/adGroup/index.vue 行号: 第 68 行 评论内容: 默认插槽可省略template
MR: !5467 文件: src/views/walmartSponsoredAd/components/tabs/keywords/index.vue 行号: 第 323 行 评论内容: 没写完?
MR: !5467 文件: src/views/walmartSponsoredAd/components/KeywordPicker.vue 行号: 第 233 行 评论内容: defalut: ''/0/false
default: () => []/({})
MR: !5467 文件: src/views/walmartSponsoredAd/views/adGroupDetail/index.vue 行号: 第 40 行 评论内容: prefer ===
MR: !4421 文件: src/views/google/init/index.vue 行号: 第 45 行 评论内容: 这边理论上只需要view的权限即可,不需要限制只有编辑权限才行
MR: !3620 文件: src/views/audience/components/AdSelector/index.vue 行号: 第 88 行 评论内容: console.log清理一下...

vince hu (@vince.hu.xnurta)

118 个讨论,涉及 57 个 MR

评论
MR: !16826 文件: apps/xnurta/src/views/productCenter/components/AllProductListDialogs/AddProductDialog.vue 行号: 第 204 行 评论内容: fixed
MR: !16825 文件: apps/xnurta/src/components/SmartFilter/styles/SmartFilter.scoped.scss 行号: 第 401 行 评论内容: fixed
MR: !16604 评论内容: @lynn.gu.xnurta
MR: !16334 文件: apps/xnurta/src/models/common/amazonStore.js 行号: 第 83 行 评论内容: 已添加
MR: !16334 文件: apps/xnurta/src/models/common/amazonStore.js 行号: 第 83 行 评论内容: 数据从接口返回
MR: !16323 文件: apps/xnurta/src/views/productCenter/allProductList/components/Charts.vue 行号: 第 286 行 评论内容: 有公共报错提示
MR: !16323 文件: apps/xnurta/src/views/productCenter/allProductList/index.vue 行号: 第 445 行 评论内容: verified
MR: !16323 评论内容: 1.系统内有全局的错误拦截器,不特殊设置时会默认使用

2.确认了效果是正常的

3.表格数据的profileId和asinInfo的profileId不一定相同,这样做防御性取值可能导致跳转但不正确

4.暂不需要修改

6.已修改为v-permission
samily wang: 第3个应该不涉及"表格数据的profileId和asinInfo的profileId不一定相同"这部分,只是为了避免row.asinInfo为null/undefined的时候的报错问题 vince hu: 已添加
MR: !16320 评论内容: 1.系统定制标签不支持删除,所以显示"部分跳过"是正常的

2.如果后端行为变更,相关逻辑都要改,觉得没必要添加这个注释,而且删除父标签不删子标签也不符合逻辑
MR: !16271 文件: apps/xnurta/src/components/xTable/index.vue 行号: 第 1036 行 评论内容: fixed
MR: !16271 文件: apps/xnurta/src/components/xTable/index.vue 行号: 第 1049 行 评论内容: added
MR: !16249 文件: apps/xnurta/src/components/XpAd/XpAdCommonFilter/components/ProductSelector/index.vue 行号: 第 236 行 评论内容: 已丢弃相关更改,改用其他组件
MR: !16242 文件: apps/xnurta/src/views/label/new/components/BatchMoveLabel.vue 行号: 第 128 行 评论内容: 待产品提供文案
MR: !16138 文件: apps/xnurta/src/views/label/new/components/AutoLabelDrawer.vue 行号: 第 475 行 评论内容: 不互相依赖
MR: !16138 文件: apps/xnurta/src/views/label/new/components/ManualLabelDrawer.vue 行号: 第 512 行 评论内容: confirmed
MR: !15664 文件: src/views/label/new/components/ManualLabelDrawer.vue 行号: 第 644 行 评论内容: fixed
MR: !15658 文件: src/views/label/new/components/ExternalAddToLabels/LabelCascader.vue 行号: 第 408 行 评论内容: dont need
MR: !15658 文件: src/views/label/new/components/ExternalAddToLabels/LabelCascader.vue 行号: 第 365 行 评论内容: dont need
MR: !15651 文件: src/views/audience/components/TagsSelector/Tags/script.js 行号: 第 109 行 评论内容: dont need
MR: !15651 文件: src/views/audience/components/AudienceSegmentDialog.vue 行号: 第 301 行 评论内容: dont need
MR: !15651 文件: src/views/audience/components/BrandStoreEventConfig.vue 行号: 第 416 行 评论内容: dont need
MR: !15651 文件: src/views/audience/components/BrandStoreEventConfig.vue 行号: 第 461 行 评论内容: dont need
MR: !15651 文件: src/views/audience/detail/script.js 行号: 第 24 行 评论内容: dont need
MR: !15651 文件: src/views/audience/detail/script.js 行号: 第 509 行 评论内容: dont need
MR: !15650 文件: src/components/SmartFilter/components/composables/useFilterItemTime.js 行号: 第 81 行 评论内容: dont need
MR: !15650 文件: src/components/SmartFilter/components/FilterItem.vue 行号: 第 627 行 评论内容: dont need
MR: !15650 文件: src/components/XpCommonFilter/components/DimensionSelect/ValueSelect.vue 行号: 第 1032 行 评论内容: fixed
MR: !15650 文件: src/views/productCenter/allProductList/composables/useRadioType.js 行号: 第 49 行 评论内容: dont need
MR: !15649 文件: src/components/SmartFilter/components/composables/useFilterItemTime.js 行号: 第 82 行 评论内容: dont need
MR: !15649 文件: src/components/SmartFilter/components/FilterItem.vue 行号: 第 631 行 评论内容: dont need
MR: !15646 文件: src/components/XpAd/XpAdCommonFilter/components/ProductSelector/ByTree.vue 行号: 第 110 行 评论内容: dont need
MR: !15630 文件: src/views/audience/components/TagsSelector/Tags/script.js 行号: 第 109 行 评论内容: dont need
MR: !15630 文件: src/views/audience/components/TagsSelector/Tags/script.js 行号: 第 112 行 评论内容: dont need
MR: !15599 文件: src/views/label/new/index.vue 行号: 第 420 行 评论内容: dont need
MR: !15596 文件: src/views/label/new/components/AutoLabelDrawer.vue 行号: 第 403 行 评论内容: dont need
MR: !15594 文件: src/components/SmartFilter/components/FilterItem.vue 行号: 第 627 行 评论内容: dont need
MR: !15588 文件: src/views/label/new/index.vue 行号: 第 641 行 评论内容: dont need
MR: !15588 文件: src/views/label/new/index.vue 行号: 第 1072 行 评论内容: dont need
MR: !15588 文件: src/views/label/new/index.vue 行号: 第 626 行 评论内容: dont need
MR: !15588 文件: src/views/label/new/index.vue 行号: 第 401 行 评论内容: dont need
MR: !15571 文件: src/views/label/new/components/EditLabelDrawerContent/index.vue 行号: 第 720 行 评论内容: fixed
MR: !15571 文件: src/views/label/new/components/BatchImportDialog.vue 行号: 第 247 行 评论内容: fixed vince hu: fixed
MR: !15571 文件: src/views/label/new/components/BatchNotification.vue 行号: 第 11 行 评论内容: fixed
MR: !15571 文件: src/views/label/new/components/BatchNotification.vue 行号: 第 49 行 评论内容: fixed
MR: !15568 文件: src/views/audience/detail/script.js 行号: 第 688 行 评论内容: fixed
MR: !15564 文件: src/views/label/new/components/ManualLabelDrawer.vue 行号: 第 172 行 评论内容: fixed
MR: !15556 文件: src/views/label/new/components/EditLabelDrawerContent/index.vue 行号: 第 24 行 评论内容: 支持readonly属性
MR: !15556 文件: src/views/label/new/components/EditLabelDrawerContent/index.vue 行号: 第 365 行 评论内容: dont need
MR: !15556 文件: src/views/label/new/components/EditLabelDrawerContent/index.vue 行号: 第 669 行 评论内容: dont need
MR: !15556 文件: src/views/label/new/components/EditLabelDrawerContent/index.vue 行号: 第 704 行 评论内容: dont need
MR: !15556 文件: src/views/label/new/components/BatchImportDialog.vue 行号: 第 91 行 评论内容: dont need
MR: !15556 文件: src/views/label/new/index.vue 行号: 第 918 行 评论内容: dont need
MR: !15539 文件: src/views/label/new/components/AutoLabelDrawer.vue 行号: 第 651 行 评论内容: dont need
MR: !15529 文件: src/views/audience/components/ConversionEventConfig.vue 行号: 第 408 行 评论内容: fixed
MR: !15524 文件: src/views/productCenter/components/AllProductListDialogs/ImportProductLineDialog.vue 行号: 第 174 行 评论内容: dont need
MR: !15524 文件: src/views/productCenter/components/AllProductListDialogs/ImportProductLineDialog.vue 行号: 第 172 行 评论内容: dont need
MR: !15524 文件: src/views/productCenter/components/AllProductListDialogs/ImportProductLineDialog.vue 行号: 第 179 行 评论内容: dont need
MR: !15523 文件: src/views/audience/detail/script.js 行号: 第 475 行 评论内容: fixed
MR: !15515 文件: src/views/label/new/components/AutoLabelDrawer.vue 行号: 第 592 行 评论内容: fixed
MR: !15515 文件: src/views/label/new/components/AutoLabelDrawer.vue 行号: 第 444 行 评论内容: fixed
MR: !15515 文件: src/views/label/new/index.vue 行号: 第 64 行 评论内容: dont need
MR: !15515 文件: src/views/label/new/index.vue 行号: 第 997 行 评论内容: dont need
MR: !15511 文件: src/views/audience/detail/script.js 行号: 第 485 行 评论内容: dont need
MR: !15511 文件: src/views/audience/detail/script.js 行号: 第 486 行 评论内容: dont need
MR: !15508 文件: src/views/label/new/components/ExternalAddToLabels/index.vue 行号: 第 236 行 评论内容: Confirm
MR: !15506 文件: src/views/productCenter/index_v2.vue 行号: 第 116 行 评论内容: confirm
MR: !15494 文件: src/views/productCenter/allProductList/components/ProductLineTree.vue 行号: 第 69 行 评论内容: 不需要
MR: !15494 文件: src/views/productCenter/allProductList/components/ProductLineTree.vue 行号: 第 426 行 评论内容: 已在当前组件中修改
MR: !15494 文件: src/views/productCenter/index_v2.vue 行号: 第 116 行 评论内容: 为了更好区分 商品列表 以及 全部商品列表 以及实现不同视图/店铺类型使用不同表格配置的需求
MR: !15494 文件: src/views/productCenter/index_v2.vue 行号: 第 772 行 评论内容: 不需要修改
MR: !15482 文件: src/views/amc/editModel/components/models/CrossProductAssociation/components/AsinSelector/AsinTable.vue 行号: 第 164 行 评论内容: dont need
MR: !15482 文件: src/views/audience/detail/script.js 行号: 第 496 行 评论内容: fixed
MR: !15477 文件: src/views/label/new/index.vue 行号: 第 394 行 评论内容: fixed
MR: !15477 文件: src/views/label/new/index.vue 行号: 第 458 行 评论内容: fixed
MR: !15477 文件: src/views/label/new/index.vue 行号: 第 458 行 评论内容: fixed
MR: !15470 文件: src/views/audience/components/AudienceSegmentDialog.vue 行号: 第 289 行 评论内容: Confirm
MR: !15463 文件: src/views/label/new/components/EditLabelDrawerContent/index.vue 行号: 第 322 行 评论内容: fixed
MR: !15463 文件: src/views/label/new/components/EditLabelDrawerContent/index.vue 行号: 第 325 行 评论内容: fixed
MR: !15463 文件: src/views/label/new/components/EditLabelDrawerContent/index.vue 行号: 第 451 行 评论内容: fixed
MR: !15463 文件: src/views/label/new/components/EditLabelDrawerContent/index.vue 行号: 第 448 行 评论内容: don't need
MR: !15463 文件: src/views/label/new/components/EditLabelDrawerContent/index.vue 行号: 第 430 行 评论内容: fixed
MR: !15463 文件: src/views/label/new/components/EditLabelDrawerContent/index.vue 行号: 第 438 行 评论内容: fixed
MR: !15456 文件: src/views/audience/components/AudienceSegmentDialog.vue 行号: 第 315 行 评论内容: 提交后才会显示
MR: !15449 文件: src/views/productCenter/productAnalysis/tabs/dashboard/Table/index.vue 行号: 第 139 行 评论内容: 目前接口不支持
MR: !15447 文件: src/views/audience/components/AudienceSegmentDialog.vue 行号: 第 244 行 评论内容: fixed
MR: !15439 文件: packages/xnurta-i18n/legacy/lang/labelNew/en.json 行号: 第 67 行 评论内容: 文案修改
MR: !15439 文件: packages/xnurta-i18n/legacy/lang/labelNew/en.json 行号: 第 109 行 评论内容: 文案修改
MR: !15439 文件: src/views/label/new/components/BatchImportDialog.vue 行号: 第 239 行 评论内容: 在父组件关闭
MR: !15439 文件: src/views/label/new/index.vue 行号: 第 68 行 评论内容: 防止单店铺无法显示店铺权限
MR: !15432 文件: src/views/audience/components/BrandStoreEventConfig.vue 行号: 第 519 行 评论内容: fixed
MR: !15424 文件: src/views/dsp/ad/tabs/common/AsinDetail/AsinDetailTable.vue 行号: 第 104 行 评论内容: 不采纳
MR: !15424 文件: src/views/intelligenceCenter/ProductAdvertiseDeposit_new/AiGroupEditRedesign/model/aiSpace/spaces/targetHarvest.js 行号: 第 45 行 评论内容: 不采纳
MR: !15407 文件: src/views/productCenter/productAnalysis/tabs/dashboard/Table/index.vue 行号: 第 162 行 评论内容: fix
MR: !15407 文件: src/views/productCenter/productAnalysis/tabs/dashboard/Table/index.vue 行号: 第 167 行 评论内容: fix
MR: !15406 文件: src/views/productCenter/productAnalysis/tabs/dashboard/Table/index.vue 行号: 第 156 行 评论内容: fix
MR: !15405 文件: src/views/productCenter/allProductList/index.vue 行号: 第 3264 行 评论内容: 不需要
MR: !15405 文件: src/views/productCenter/productAnalysis/tabs/dashboard/Table/index.vue 行号: 第 162 行 评论内容: 不需要
MR: !15405 文件: src/views/productCenter/productAnalysis/tabs/dashboard/Table/index.vue 行号: 第 124 行 评论内容: 不需要
MR: !15405 文件: src/views/productCenter/productAnalysis/tabs/dashboard/Table/index.vue 行号: 第 146 行 评论内容: 不需要
MR: !15403 文件: src/views/productCenter/productAnalysis/tabs/dashboard/Table/index.vue 行号: 第 162 行 评论内容: 固定内容 没有特殊符号
MR: !15402 文件: src/views/productCenter/allProductList/components/ProductLineTree.vue 行号: 第 429 行 评论内容: 已修改
MR: !15402 文件: src/views/productCenter/allProductList/index.vue 行号: 第 313 行 评论内容: 不需要修改
MR: !15402 文件: src/views/productCenter/allProductList/index.vue 行号: 第 328 行 评论内容: 设计如此
MR: !15402 文件: src/views/productCenter/index_v2.vue 行号: 第 116 行 评论内容: bug fix
MR: !15391 文件: src/views/audience/components/BrandStoreEventConfig.vue 行号: 第 470 行 评论内容: 不需要
MR: !15388 文件: src/views/productCenter/index_v2.vue 行号: 第 116 行 评论内容: bug fix
MR: !15279 文件: src/views/allCampaigns/script.js 行号: 第 115 行 评论内容: 在 feature/7714_alecxu_change-ai-managed-campaign-tab-position 分支中,tab 结构已经改变:

managedGroup 从二级 tab 提升为一级 tab

campaignTab 变成计算属性,直接返回 activeTab

this.activeTab === AmazonAdTab.managedGroup 在新分支中是可以正确匹配的,不需要修改。
MR: !15150 文件: src/components/SmartFilter/utils/fieldConfigs.js 行号: 第 1279 行 评论内容: 以产品提供文档为准
MR: !15148 文件: src/components/SmartFilter/utils/fieldConfigs.js 行号: 第 1279 行 评论内容: 以产品提供文档为准
MR: !15129 文件: packages/xnurta-i18n/legacy/components/SmartFilter/FilterItem/en.json 行号: 第 205 行 评论内容: 与提供的文案保持一致
MR: !15129 文件: packages/xnurta-i18n/legacy/components/SmartFilter/FilterItem/ja.json 行号: 第 262 行 评论内容: 已处理
MR: !15129 文件: packages/xnurta-i18n/legacy/components/SmartFilter/FilterItem/zh.json 行号: 第 253 行 评论内容: 提供文案就是ASIN
MR: !15129 文件: packages/xnurta-i18n/legacy/components/SmartFilter/FilterItem/en.json 行号: 第 228 行 评论内容: 以文档为准
MR: !15129 文件: packages/xnurta-i18n/legacy/components/SmartFilter/FilterItem/en.json 行号: 第 251 行 评论内容: 以文档为准
MR: !15037 文件: src/components/XpAsinSelect_MultiStore/components/ProductLineFilter/ProductLineFilterPanel.vue 行号: 第 67 行 评论内容: 父组件 main.vue 定义了 profiles: { default: null },所以传下来的就是 null。不能去掉
MR: !14889 文件: src/components/SmartFilter/components/composables/useFilterItemTime.js 行号: 第 42 行 评论内容: 昨日和近7日返回的格式是一样的, 但是近7日要包含今天, 昨日则不包含今天 所以做了特殊处理
MR: !14889 文件: src/components/SmartFilter/components/composables/useFilterItemTime.js 行号: 第 148 行 评论内容: 已修改
MR: !14889 文件: src/components/SmartFilter/utils/timeFormatters.js 行号: 第 117 行 评论内容: 业务需求, "近N周"包含本周,从本周开始算 不需要修改

lynn gu (@lynn.gu.xnurta)

72 个讨论,涉及 50 个 MR

评论
MR: !17031 评论内容: 为什么是feat(sqp)...
MR: !16939 文件: apps/xnurta/.env.pre 行号: 第 14 行 评论内容: pre环境应该用`https://media.xnurta.com/templates/excel/prd/test\`的地址
MR: !16933 文件: apps/xnurta/src/views/amc/editModel/components/models/SubscribeAndSaveAnalysis/components/AudienceCreation/CreateAudienceDialog.vue 行号: 第 354 行 评论内容: @lucas.lu.xnurta gitlab duo出现了change以外的内容(摸不着头脑.gif, 你看下没问题就关了
MR: !16913 文件: apps/xnurta/src/views/insights/customBoard/sharePage/index.vue 行号: 第 103 行 评论内容: 分享页(sharePage)是一个独立入口页面,不在主应用的路由体系内,不存在需要restore的情景
MR: !16688 文件: apps/xnurta/src/store/getters/index.js 行号: 第 159 行 评论内容: it's not my change? why appear here?
MR: !16688 文件: apps/xnurta/src/views/insights/customBoard/composables/useMetricKey.js 行号: 第 20 行 评论内容: usd的话就是usd
MR: !16688 文件: apps/xnurta/src/views/insights/customBoard/sharePage/index.vue 行号: 第 222 行 评论内容: ?what's the diffenrence?????
MR: !16603 文件: apps/xnurta/src/views/subAccount/components/BatchUpload/Upload.vue 行号: 第 64 行 评论内容: it's the requirement
MR: !16436 文件: apps/xnurta/src/omni/instacart/views/home/components/AccountPerformanceTable.vue 行号: 第 19 行 评论内容: there's no international collaborator in our team
MR: !16427 文件: apps/xnurta/src/views/sqp/components/ChartsTheater/SqpBarChart.vue 行号: 第 44 行 评论内容: 实际上不是个问题。ECharts 的 tooltip.formatter 在 trigger: 'axis' 模式下,只有鼠标悬浮到有数据的 x 轴位置时才会触发回调,params 一定是非空数组,params[0] 和 dataIndex 一定存在且在 0-2 范围内(因为 xAxis.data 就三项)。
MR: !16422 文件: apps/xnurta/src/views/sqp/conditionGroupConfig.js 行号: 第 105 行 评论内容: 需求
MR: !16382 文件: packages/i18n/legacy/lang/instacart/ja.json 行号: 第 9 行 评论内容: 平台其实无日语和中文
MR: !16382 文件: packages/i18n/legacy/lang/instacart/zh.json 行号: 第 9 行 评论内容: 平台无日语和中文
MR: !16364 文件: apps/xnurta/src/omni/instacart/components/InstacartTimeZone.vue 行号: 第 48 行 评论内容: getTimeZoneByCountryCode函数里面传US就是返回America/Los_Angeles的时区
MR: !16351 文件: apps/xnurta/src/views/sqp/filterConfig.js 行号: 第 112 行 评论内容: 设计上允许checkableItems里面的项设置pinned:false来覆盖pinned: true(实际上并没有这种)
MR: !16346 文件: apps/xnurta/src/views/subAccount/components/BatchUpload/index.vue 行号: 第 73 行 评论内容: 产品需求只有中文的链接 samily wang: 这个为啥只有中文的链接? lynn gu: image.png

@samily.wang.xnurta 需求,代码里也加了英文日文不展示跳转链接
MR: !16321 文件: apps/xnurta/src/utils/xmarsUiHelper.js 行号: 第 1677 行 评论内容: 这只是获取index的工具函数,实际调用时不会出现这个问题
MR: !16321 文件: apps/xnurta/src/utils/xmarsUiHelper.js 行号: 第 1689 行 评论内容: 这只是获取index的工具函数,实际调用时不会出现这个问题
MR: !16319 文件: apps/xnurta/src/views/insights/customBoard/composables/globalFilters.js 行号: 第 36 行 评论内容: spAndDsp为1的店铺一定是sa店铺,不需要加这个逻辑
MR: !16318 文件: apps/xnurta/src/views/insights/customBoard/sharePage/index.vue 行号: 第 126 行 评论内容: There's no need to do it 'cause the logic of changeDow has already been written into SET_DOW
MR: !16276 评论内容: image.png

这个我直接改了AddPanelFilter @quint.liu.xnurta
MR: !16256 文件: apps/xnurta/src/views/insights/customBoard/sharePage/index.vue 行号: 第 126 行 评论内容: 不需要,set操作里包含了changeDow

```javascript
SET_DOW: (state, dow) => {
dow = parseInt(dow)
state.dow = isNaN(dow) ? 1 : dow
changeDow(state.dow)

// 更新element-ui中日期选择器的默认配置, 设置对应周起始日(略黑魔法... from Github Copilot)
const datePickers = document.querySelectorAll('.el-date-editor')
datePickers.forEach(picker => {
const instance = picker.vue
if (instance) {
instance._props.pickerOptions = instance._props.pickerOpti...
MR: !16226 文件: apps/xnurta/src/views/sqp/composables/useFilterParams.js 行号: 第 29 行 评论内容: 为什么不能直接用[store.getters.globalProfileId]
MR: !16207 文件: apps/xnurta/src/views/insights/customBoard/composables/globalFilters.js 行号: 第 36 行 评论内容: spAndDsp 为 1 的店铺一定是 SA 类型的
MR: !16179 文件: apps/xnurta/src/views/subAccount/components/table/ResourceTable.vue 行号: 第 499 行 评论内容: checkAll的tableRefs加了instacart,checkAllInstaCart是不是可以复用checkAll jehan jia: 代码已修复、请过目
MR: !16145 文件: apps/xnurta/src/utils/xmarsUiHelper.js 行号: 第 1680 行 评论内容: 不会有问题。

dimensionKeys 已经做了互斥处理:当 hasSpApiVendor 为 true 时,salesKey 是 'shippedTotalSales',数组里根本不会出现 'totalSales';反之亦然。tacos / shippedTacos 同理。

所以 getSalesOverviewCardIndex 虽然对 totalSales 和 shippedTotalSales 都可能返回 0,但在实际运行中,dimensionKeys 里同一时刻只会包含其中一个,不会同时传入这两个 key 去获取 cardIndex。两者永远不会同时出现在 dimensions 数组中,不存在位置冲突。

这个函数本身是"无状态的纯映射",它不关心调用侧传了哪些 key,只负责告诉你"如果传了这个 key,在当前条件下应该放在哪个位置"。互斥逻辑由 dimensionKeys 计算属性保证,职责分离是清晰的。
MR: !16125 文件: apps/xnurta/src/views/productCenter/allProductList/components/Charts.vue 行号: 第 292 行 评论内容: 设置了 responseType: 'blob', axios 返回的就已经是 Blob 了。直接 saveAs(xxx, filename) 就够了,似乎不需要再 new Blob(xxx, { type: '...' }) 包一层。
MR: !15993 文件: apps/xnurta/src/views/insights/customBoard/components/BoardCanvas/CustomCard/TableCard.vue 行号: 第 413 行 评论内容: SA+DSP里面用的时TableCard但是是dsp的dimension
MR: !15827 文件: apps/xnurta/src/views/insights/customBoard/components/BoardCanvas/CustomCard/composables/lineChart.js 行号: 第 151 行 评论内容: ?
MR: !15827 文件: apps/xnurta/src/views/insights/customBoard/components/BoardCanvas/CustomCard/composables/lineChart.js 行号: 第 162 行 评论内容: 这里是注释错误
MR: !15781 文件: apps/xnurta/src/api/customBoard/index.js 行号: 第 1182 行 评论内容: 这个担忧其实不成立。让我解释一下: 当 isLeafGroup 为 undefined 时,item.parentId || item.isLeafGroup 和 item.parentId || item.isLeafGroup === true 的行为是一样的——都依赖 item.parentId 的真假来决定结果。
MR: !15683 文件: src/views/insights/customBoard/EditBoard/index.vue 行号: 第 143 行 评论内容: 已改
MR: !15680 文件: src/views/insights/customBoard/components/CollaborationManager/CollaboratorAddDialog.vue 行号: 第 229 行 评论内容: 主账号不可选自己,此时左边列表没有主账号,selectedList为空是合理的
MR: !15680 文件: src/views/insights/customBoard/components/CollaborationManager/CollaboratorAddDialog.vue 行号: 第 230 行 评论内容: 暂时不改
MR: !15665 文件: src/views/insights/customBoard/components/CollaborationManager/CollaboratorAddDialog.vue 行号: 第 218 行 评论内容: 不同接口的返回值类型不同
MR: !15665 文件: src/views/insights/customBoard/components/CollaborationManager/CollaboratorAddDialog.vue 行号: 第 197 行 评论内容: 在多个看板的时候这个接口返回值的第一个item有且只有主账号
MR: !15665 文件: src/views/insights/customBoard/components/Empty.vue 行号: 第 5 行 评论内容: 需求
MR: !15644 文件: packages/xnurta-i18n/legacy/views/insights/customBoard/EditBoard/index/en.json 行号: 第 14 行 评论内容: fixed
MR: !15644 文件: packages/xnurta-i18n/legacy/views/insights/customBoard/EditBoard/index/ja.json 行号: 第 4 行 评论内容: fixed
MR: !15644 文件: packages/xnurta-i18n/legacy/views/insights/customBoard/EditBoard/index/zh.json 行号: 第 4 行 评论内容: fixed
MR: !15644 文件: packages/xnurta-i18n/legacy/views/insights/customBoard/components/CardEditor/FiltersDialog/ja.json 行号: 第 4 行 评论内容: fixed
MR: !15644 文件: packages/xnurta-i18n/legacy/views/insights/customBoard/components/CardEditor/FiltersDialog/zh.json 行号: 第 4 行 评论内容: fixed
MR: !15644 文件: packages/xnurta-i18n/legacy/views/insights/customBoard/components/GlobalFilters/ConfigDialog/ja.json 行号: 第 6 行 评论内容: fixed
MR: !15644 文件: packages/xnurta-i18n/legacy/views/insights/customBoard/components/GlobalFilters/ConfigDialog/zh.json 行号: 第 6 行 评论内容: fixed
MR: !15641 文件: src/views/insights/customBoard/components/CollaborationManager/CollaborationManagerDrawer.vue 行号: 第 30 行 评论内容: fixed
MR: !15641 文件: src/views/insights/customBoard/components/CollaborationManager/CollaboratorAddDialog.vue 行号: 第 398 行 评论内容: 都加了
MR: !15641 文件: src/views/insights/customBoard/BoardsDetails.vue 行号: 第 74 行 评论内容: 需求
MR: !15628 文件: src/views/insights/customBoard/components/CardSelect/index.vue 行号: 第 6 行 评论内容: these will be added in next commit later
MR: !15581 文件: src/api/customBoard/index.js 行号: 第 1160 行 评论内容: 在 filterTreeDimensionInfo 函数中(第 1176-1217 行),已经有完整的父子节点处理逻辑
MR: !15581 文件: src/api/customBoard/index.js 行号: 第 1205 行 评论内容: 代码风格问题,不影响逻辑正确性
MR: !15581 文件: src/api/customBoard/index.js 行号: 第 1190 行 评论内容: 兼容处理
MR: !15542 文件: src/views/marketInsight/v2/detail/components/composables.js 行号: 第 304 行 评论内容: 不用,和公共组件统一
MR: !15533 文件: src/api/customBoard/index.js 行号: 第 1152 行 评论内容: 已处理
MR: !15533 文件: src/api/customBoard/index.js 行号: 第 1163 行 评论内容: 已增加其他维度判断处理
MR: !15533 文件: src/api/customBoard/index.js 行号: 第 1183 行 评论内容: no need
MR: !15517 文件: src/views/marketInsight/v2/detail/components/composables.js 行号: 第 325 行 评论内容: getWeekStartDay(null, ...) 内部已经处理了 null 的情况
MR: !15516 文件: src/views/marketInsight/v2/overview/MonitorChart.vue 行号: 第 247 行 评论内容: fixed
MR: !15476 文件: src/views/insights/customReport/reportDetail/components/form/DataRangeForm/ProfileSelect/index.vue 行号: 第 192 行 评论内容: 需求
MR: !15473 文件: src/views/insights/customReport/reportDetail/components/form/DataRangeForm/ProfileSelect/index.vue 行号: 第 192 行 评论内容: 要求就是可以筛选/看到全部profile,但是最多选300个
MR: !15430 文件: src/views/subAccount/components/ResourceViewer/index.vue 行号: 第 66 行 评论内容: activeTabName has been assigned with the values in the componentMap keys
MR: !15390 文件: src/components/XpCommonFilter/components/DimensionSelect/ValueSelect.vue 行号: 第 688 行 评论内容: 这与后端API一致
MR: !15390 文件: src/views/insights/customBoard/components/BoardCanvas/CustomCard/composables/lineChart.js 行号: 第 230 行 评论内容: `size` property has already been initialized in the card object.
MR: !15348 文件: src/views/insights/customBoard/sharePage/index.vue 行号: 第 312 行 评论内容: 需求就是要在数据加载后替换页面标题
MR: !15348 文件: src/views/insights/customBoard/sharePage/index.vue 行号: 第 312 行 评论内容: 不需要国际化
MR: !15327 文件: src/components/XpCommonFilter/components/DimensionSelect/ValueSelect.vue 行号: 第 685 行 评论内容: 变量位置错了,不能加在case里
MR: !15321 文件: src/utils/permission.js 行号: 第 10 行 评论内容: 静态路由只有路径部分
MR: !15286 文件: src/components/TeamMemberSelector/index.vue 行号: 第 191 行 评论内容: 需求,已修改
MR: !15236 文件: src/components/TeamMemberSelector/index.vue 行号: 第 390 行 评论内容: resolved by commit 45b3b116
MR: !15235 文件: src/models/amazonFilterDimension/amazonFilterDimensionEnums.js 行号: 第 264 行 评论内容: This change is to adapt to the backend API.
MR: !15225 文件: src/components/TeamMemberSelector/index.vue 行号: 第 379 行 评论内容: No necessary, cause 'reachMax' is computed by 'curSelectedLabels'
MR: !14878 文件: src/components/TeamMemberSelector/index.vue 行号: 第 720 行 评论内容: fix by c083bbf1
MR: !14634 文件: src/views/insights/customBoard/components/BoardCanvas/CustomCard/MoreIcon.vue 行号: 第 200 行 评论内容: 'customBoardProductLine' is expected by the download API.

lucas lu (@lucas.lu.xnurta)

61 个讨论,涉及 40 个 MR

评论
MR: !16738 文件: apps/xnurta/src/views/keywords/modules/corpus-v2/detail/components/KeywordTable/index.vue 行号: 第 464 行 评论内容: getLocalCurrency 始终返回字符串(最差情况返回 '$')
MR: !16728 文件: apps/xnurta/src/views/keywords/components/KeywordsTable/index.vue 行号: 第 465 行 评论内容: 实际是['spKeyword', 'sbKeyword'
MR: !16348 文件: apps/xnurta/src/views/asyncTaskCenter/components/utils.js 行号: 第 129 行 评论内容: 产品要求 AMC 全部大写
MR: !16317 文件: apps/xnurta/src/views/amc/editModel/components/models/CrossProductAssociation/components/AsinSelector/AsinTable.vue 行号: 第 234 行 评论内容: 每行单独的asin
MR: !16317 文件: apps/xnurta/src/views/amc/editModel/components/models/CrossProductAssociation/components/AsinSelector/AsinTable.vue 行号: 第 238 行 评论内容: 这个抛弃过期请求可以不通知
MR: !16317 文件: apps/xnurta/src/views/amc/editModel/components/models/CrossProductAssociation/components/ChartFilter/index.vue 行号: 第 234 行 评论内容: 传值没有问题
MR: !16317 文件: apps/xnurta/src/views/amc/editModel/components/models/CrossProductAssociation/components/TopTable/script.js 行号: 第 98 行 评论内容: 父组件 index.vue 中调用 syncSelection 的场景是:

getTop20List 完成后恢复 filter 值时调用一次

onFilterUpdate 中 $nextTick 后调用一次

这两个场景不太容易产生真正的快速连续调用;

为了以防万一,用计数器替代布尔标志
MR: !16317 文件: apps/xnurta/src/views/amc/editModel/utils.js 行号: 第 147 行 评论内容: 这是一个防御性的:如果 localStorage 里存了脏数据导致某个路径中间段变成了字符串或数字(比如 modelBasicConfig.linkDimension 本该是对象路径但实际值是 'asin'),强行写入会抛 TypeError。这里选择打个 warn 然后跳过这一个有问题的 key,其余正常的 key 继续写入,保证页面不会因为一个坏数据就整体崩掉
MR: !16317 文件: apps/xnurta/src/views/amc/editModel/utils.js 行号: 第 442 行 评论内容: 如果改成返回 { id: value, name: '' },UI 上筛选标签会显示空白,用户体验反而更差
MR: !16317 文件: apps/xnurta/src/views/asyncTaskCenter/components/utils.js 行号: 第 126 行 评论内容: quint那边后续会统一处理
MR: !16288 文件: apps/xnurta/src/views/amc/editModel/components/models/PathToConversion/index.vue 行号: 第 971 行 评论内容: 项目没有对这个做约束
MR: !16233 文件: apps/xnurta/src/views/amc/editModel/components/models/CrossProductAssociation/components/AsinSelector/AsinTable.vue 行号: 第 234 行 评论内容: 把 fetchVersion++ 提到条件判断外面,让每次 getAsinCategory 调用都递增,这样任何数据刷新都会使旧请求失效
MR: !16233 文件: apps/xnurta/src/views/amc/editModel/components/models/CrossProductAssociation/components/ChartFilter/index.vue 行号: 第 37 行 评论内容: 这是之前的逻辑,现改为使用 const CATEGORY_SEPARATOR = '\u001F'
MR: !16233 文件: apps/xnurta/src/views/amc/editModel/components/models/CrossProductAssociation/components/ChartFilter/index.vue 行号: 第 221 行 评论内容: 同上
MR: !16233 文件: apps/xnurta/src/views/amc/editModel/components/timedPull/index.vue 行号: 第 440 行 评论内容: 0 != null
MR: !16194 文件: apps/xnurta/src/components/XpGrid/index.vue 行号: 第 577 行 评论内容: 如果后面有人在 defaultConfig 中新增了嵌套对象类型的配置项,深合并的行为可能不符合预期,最好注释说明一下 quint liu: 已增加注释说明
MR: !16143 文件: apps/xnurta/src/views/amc/components/modelCard/ModelCard.vue 行号: 第 59 行 评论内容: 暂定
MR: !16032 文件: apps/xnurta/src/views/amc/editModel/components/models/timeToConversion/index.vue 行号: 第 710 行 评论内容: 有对应的翻译
MR: !16032 文件: apps/xnurta/src/views/audience/config.js 行号: 第 109 行 评论内容: 业务限制
MR: !15953 文件: apps/xnurta/src/views/amc/editModel/components/modelBasicConfig/AdRangePopover.vue 行号: 第 99 行 评论内容: ad.id 唯一
MR: !15953 文件: apps/xnurta/src/views/amc/editModel/components/models/PathToConversion/columns.js 行号: 第 11 行 评论内容: 这个问题实际上不存在。subscribe 模式下不会显示没有翻译的列,因为 totalCardsConfig.metrics 会限制可见列的范围。翻译文件只定义了 subscribe 场景下实际会用到的指标
MR: !15953 文件: apps/xnurta/src/views/amc/editModel/components/models/PathToConversion/index.vue 行号: 第 1239 行 评论内容: 限制显示
MR: !15953 文件: apps/xnurta/src/views/amc/editModel/components/models/multiTouchAttribution/index.vue 行号: 第 183 行 评论内容: 不会重叠,但是V3日期修改
MR: !15953 文件: apps/xnurta/src/views/amc/editModel/components/models/timeToConversion/index.vue 行号: 第 211 行 评论内容: !this.modelBasicConfig.conversionEvent 在前面做了短路判断。如果 conversionEvent 是 undefined 或 null,前半部分为 true,|| 短路直接返回 true,根本不会执行后面的 .includes()。

而且 conversionEvent 在 data() 里初始化为 ['purchase', 'subscribe'],正常流程下不会是 undefined。防御性判断只是额外的保险。不需要改。
MR: !15953 文件: apps/xnurta/src/views/audience/components/Condition/ConditionItem.vue 行号: 第 277 行 评论内容: 代码已优化
MR: !15953 文件: apps/xnurta/src/views/audience/config.js 行号: 第 109 行 评论内容: 如果传入了一个非预期的 userType,代码根本不会进入这个分支,而是会落到最后的 else if (userType === 'Uploaded Users') 或者直接跳过所有分支,返回空的 list = []。不存在"一路向下执行最终仅返回 tracked_item"的情况。

函数的整体结构是:

if (userType === 'Impression Users') → 处理 else if (userType === 'Click Users') → 处理 else if (userType 是四种 Conversion 之一) → 里面才有 !adType 的 RFM 分支 else if (userType === 'Uploaded Users') → 处理 都不匹配 → 返回空数组
MR: !15926 文件: apps/xnurta/src/views/audience/components/Condition/ConditionItem.vue 行号: 第 243 行 评论内容: 需求变更
MR: !15864 文件: apps/xnurta/src/views/amc/editModel/components/models/timeToConversion/tab.vue 行号: 第 67 行 评论内容: 公共方法
MR: !15834 文件: apps/xnurta/src/views/amc/editModel/components/models/timeToConversion/index.vue 行号: 第 811 行 评论内容: 1. 预定义不需要选訂閱/購買,默认全跑
MR: !15814 文件: apps/xnurta/src/views/amc/editModel/components/adRangeSelector/index_new.vue 行号: 第 132 行 评论内容: 已修复
MR: !15814 文件: apps/xnurta/src/views/amc/editModel/components/modelBasicConfig/AdRangePopover.vue 行号: 第 104 行 评论内容: 已修复
MR: !15814 文件: apps/xnurta/src/views/amc/editModel/components/modelBasicConfig/AdRangePopover.vue 行号: 第 99 行 评论内容: 已修复
MR: !15790 文件: apps/xnurta/src/views/amc/editModel/components/models/timeToConversion/index.vue 行号: 第 684 行 评论内容: 下面的在子组件里有具体的翻译
MR: !15766 文件: apps/xnurta/src/components/XpCommonFilter/components/DimensionSelect/LabelTreeSelect.vue 行号: 第 238 行 评论内容: 不需要
MR: !15740 文件: apps/xnurta/src/views/label/new/components/AssociationContent/CampaignAssociation.vue 行号: 第 265 行 评论内容: fixed
MR: !15686 文件: src/views/label/new/components/AssociationContent/CampaignAssociation.vue 行号: 第 194 行 评论内容: vue<br>labelId 唯一<br>
MR: !15686 文件: src/views/label/new/components/AssociationContent/CampaignAssociation.vue 行号: 第 175 行 评论内容: 最多1000
MR: !15639 文件: src/views/amc/editModel/components/models/timeToConversion/index.vue 行号: 第 90 行 评论内容: 有定义
MR: !15617 文件: src/views/label/new/components/ExternalAddToLabels/LabelCascader.vue 行号: 第 369 行 评论内容: 固定 0
MR: !15612 文件: src/views/insights/customReport/reportDetail/components/form/DataRangeForm/CustomFilter/filterHelper.js 行号: 第 190 行 评论内容: 去除 广告组标签
MR: !15592 文件: src/views/amc/editModel/components/models/MarketingFunnelAnalysis/index.vue 行号: 第 314 行 评论内容: 防止后续逻辑变更
MR: !15592 文件: src/views/amc/editModel/components/models/MarketingFunnelAnalysis/index.vue 行号: 第 225 行 评论内容: 逻辑是当月
MR: !15590 文件: src/views/amc/editModel/components/models/MarketingFunnelAnalysis/index.vue 行号: 第 314 行 评论内容: 方便后续逻辑修改
MR: !15579 文件: src/views/audience/components/Condition/Condition.vue 行号: 第 224 行 评论内容: fix
MR: !15573 文件: src/views/amc/editModel/components/models/multiTouchAttribution/modelBaseInformation.vue 行号: 第 148 行 评论内容: 是不同的展示逻辑
MR: !15442 文件: src/views/label/new/components/AssociationContent/CampaignAssociation.vue 行号: 第 355 行 评论内容: 组件提供空数组
MR: !15426 文件: src/api/label/labelNew.js 行号: 第 242 行 评论内容: 联调中
MR: !15426 文件: src/views/label/new/components/EditLabelDrawerContent/EditContent.vue 行号: 第 165 行 评论内容: 父组件正确传递
MR: !15395 文件: src/views/amc/editModel/components/models/MarketingFunnelAnalysis/tabSection.vue 行号: 第 86 行 评论内容: 先判断是否默认显示然后才是自定义

vue<br>default<br>
MR: !15370 文件: src/views/tools/rankLockV2/strategy/list.vue 行号: 第 54 行 评论内容: 不影响
MR: !15347 文件: src/views/amc/editModel/components/models/MarketingFunnelAnalysis/tabSection.vue 行号: 第 122 行 评论内容: 父组件定义了初始属性

vue<br>const tabSearchForm = ref({<br> currentTab: '1',<br> adType: [],<br> advertiserAccount: [],<br> campaign: []<br>})<br>
MR: !15344 文件: src/views/amc/editModel/components/models/MarketingFunnelAnalysis/components/AudienceRecommendation/index.vue 行号: 第 36 行 评论内容: 在下面处理了
MR: !15252 文件: src/views/audience/detail/script.js 行号: 第 455 行 评论内容: 在其他地方有校验390天
MR: !15238 文件: src/views/amc/editModel/components/models/MarketingFunnelAnalysis/tabSection.vue 行号: 第 4 行 评论内容: 这就是 添加品牌浏览漏斗的特殊处理逻辑
MR: !15200 文件: src/views/amc/editModel/components/models/MarketingFunnelAnalysis/contentSection.vue 行号: 第 287 行 评论内容: 用户数 0不会有其他形式
MR: !15083 文件: src/views/messageCenter/components/BulletinMessage/index.vue 行号: 第 187 行 评论内容: 还有其他消息
MR: !15032 文件: src/views/audience/detail/script.js 行号: 第 678 行 评论内容: 回显数据
MR: !15014 文件: src/views/data-hub/components/task-drawer/select-data-range/schedule-type.vue 行号: 第 315 行 评论内容: 合并pre的时间已经添加了说明,周默认是按照周一算的,后端thisWeek lastWeek值有兼容处理历史数据
MR: !15006 文件: src/views/data-hub/components/task-drawer/select-data-range/schedule-type.vue 行号: 第 321 行 评论内容: 历史数据默认按周一起始算,可以不用变更
MR: !14874 文件: src/components/xTable/components/cells/campaignCell.js 行号: 第 116 行 评论内容: 两种v3
MR: !14869 评论内容: profileId 限制 只在profile 上,以前没有类似限制

samily wang (@samily.wang.xnurta)

59 个讨论,涉及 33 个 MR

评论
MR: !17005 评论内容: ## Code Review - MR !17005

MR 概述: 为 packages/ui-biz 新增首个业务组件 XSimpleLineChart——基于 XChart 封装的迷你折线图,支持自定义颜色、平滑曲线和尺寸,补充了需求文档、单元测试和文档站页面。

---

### Overall assessment: ✅ 通过(有小建议)

实现简洁干净,props 设计合理,需求文档和测试都很规范。以下是具体发现:

---

### 1. ⚠️ warning [package.json] echarts 应作为 peerDependencies 而非 dependencies

File: packages/ui-biz/package.json

```json
"dependencies": {
"@sparkx/ui-core": "workspace:*",
"echarts": "^5.6...
lillian yin: 1 、5 已修改

2 tsconfig改成了strict:true, 为了解决 pre-commit 中 typescript-eslint 的 no-useless-default-assignment 规则要求 strictNullChecks 的问题

3 没必要加,颜色值非法输入自行解决

4 目前都没加defineOptions
MR: !17003 评论内容: ## Code Review - MR !17003

MR 概述: 统一 Input 家族组件(XInput / XInputNumber / XInputRange / XInputTag)的尺寸 token,修复 error icon 在有 clearable/password 按钮时的抖动问题,完善布局(wrapper 改为 display: flex; width: 100%),更新文档站示例。

---

### Overall assessment: ✅ 通过(有小建议)

这是一个高质量的修缮 MR:尺寸从硬编码 px 统一到 --x-height-* token,error icon 改为绝对定位从根本上解决了抖动问题,wrapper 从 inline-flex 改为 flex + width: 100% 让组件默认占满容器更符合表单场景。以下是具体发现:

---

### 1. ⚠️ warning [input.vue] error icon 从文档流移出后,与 su...
shumin ye: 1. error icon 重叠 — 三个组件的 error icon 从 position: absolute 改为 visibility: hidden/visible,回到文档流,不再遮挡 suffix/clearable。
2. hasActions 副作用 — 随 1 解决,error icon 在文档流内,不存在绝对定位与 actions 的冲突。
3. setTimeout(0) 等待 — inputRange.spec.ts 6 处改为 vi.useFakeTimers() + vi.advanceTimersByTime(0)。
4. inputTag 删除...
MR: !17002 评论内容: ## Code Review - MR !17002

MR 概述: 为 XSelect 组件新增 virtual 虚拟滚动支持,抽取 SelectDropdownItem 子组件,补充单元测试和文档。

---

### Overall assessment: ✅ 通过(有小建议)

整体实现质量很高——ComboboxVirtualizer 集成合理、SelectDropdownItem 抽取干净、外部过滤逻辑正确处理了 reka-ui 虚拟模式跳过内部过滤的限制、测试覆盖全面。以下是具体发现:

---

### 1. ⚠️ warning [select-dropdown.vue / select.vue] 全局 CSS 变更影响所有 Select 实例

File: packages/ui-core/src/components/select/ui/select.vue

```scss
.x-select__dropdown {
...
lillian yin: 1:下拉框暂时统一设置400px,可覆盖变量修改高度

2:行高提取成变量备注了计算来源

3没必要改,map不会失败;4是正常的
MR: !16894 评论内容: ## 破坏者审查报告 — MR !16894

MR 概要: 新增 XChart 基础图表组件,基于 vue-echarts 封装,内置按需注册、全局主题跟随和空状态插槽
审查阶段: 已实现

---

### HIGH

- [ ] [H1] colors.ts 硬编码品牌色 hex 值,违反"禁止在组件中硬编码品牌色/语义色"规范packages/ui-core/src/components/chart/colors.ts
GRID_COLORSPIE_COLORS 数组直接写死了 #3359B5#10ABF5 等 hex 值。_guide.md 第86行明确规定:"禁止在组件中硬编码品牌色/语义色(如 #3359B5 直接写入组件)"。#3359B5 恰好是规范中举的示例。这些颜色应从 CSS 变量中读取(如在 useChartTheme 中通过 getComputedStyle 获取),或者如果确实需要静态值(ECharts ...
lillian yin: H1:Echarts需要静态值,md文档已添加说明,M3同理

H2:不需要改,没有SSR场景

H3:不需要改,once: true 触发的时候从 undefined 变成了 ECharts 实例,chartInit不会执行不到

其余问题已修改
MR: !16884 评论内容: ## 破坏者审查报告 — MR !16884

MR 概要: 实现 XCascader 级联选择器组件,包含完整的类型、实现、测试和文档站页面
审查阶段: 已实现

---

### HIGH

- [ ] [H1] width: 220px 硬编码魔法数字packages/ui-core/src/components/cascader/ui/cascader.vue:202
组件根元素硬编码 width: 220px,未使用私有变量或 token。根据规范"禁止硬编码魔法数字",应定义为私有变量 --_x-cascader-width 或使用语义 token。同时需求文档 frontmatter 中也未声明此私有变量。

- [ ] [H2] 下拉面板 max-height: 256px 和选项区域 padding 值硬编码 — `packages/ui-core/src/components/cascader/ui/cascader.vue:...
shumin ye: 1. H1 已修复, --_x-cascader-width: 100%,私有变量 + 文档声明
2. H2 已修复, max-height 提为 --_x-cascader-menu-max-height,padding/gap 引用语义 token
3. H3 已修复, teleport 改用 XTeleportTo
4. M1 已修复, YAML 拆行
5. M2 已修复,hover 叶子不触发 expandChange,代码 + 文档都改了
6. M3 不修,与 Element Plus 对齐,泛型条件类型复杂度高收益低
7. M4 已...
MR: !16828 评论内容: ## 破坏者审查报告 — MR !16828

MR 概要: 实现 Switch 组件,基于 reka-ui SwitchRoot/SwitchThumb 封装,支持三种尺寸、自定义 value 类型、loading/disabled 态、文字/图标内容变体。
审查阶段: 已实现

---

### MEDIUM

- [ ] [M1] min-width 计算公式与需求文档尺寸规格不一致packages/ui-core/src/components/switch/ui/switch.vue:82
CSS 中 min-width: calc(var(--_x-switch-dot-size) * 2 + var(--_x-switch-padding-x) * 2) 对 md 尺寸计算结果为 16*2 + 4*2 = 40px,但需求文档声明 md 无内容最小宽度为 34px。lg (40px) 和 sm (28px) 吻合。建议核实设计稿中 md 的期望宽度,若为...
shumin ye: 1. M1 — 需求文档有误,不改代码
2. M2 — 已修复,测试描述修正
3. M3 — 已修复,文档行为规则表补充了 Enter 键说明
4. L1 — 不需要修。--x-color-primary 在 contract 里 interactive: true,interactiveRules.states 包含 disabled,-disabled 变体是隐含派生的,不需要单独注册
5. L2 — 已修复,XSwitchSize = 'md' | 'sm' ,设计只有两个尺寸
6. T1 — 已修复,改用 trigger('keydown', { key...
MR: !16715 评论内容: ## 破坏者审查报告 — MR !16715

MR 概要: 实现 XAlert 组件,包含完整的需求文档、类型定义、Vue 组件实现、单元测试、文档站页面和 barrel export。

审查阶段: 已实现

---

### HIGH

- [x] [H1] Frontmatter consumed tokens 缺少 --x-text-base-line-heightpackages/ui-core/src/components/alert/ui/alert.md
CSS 中 --_x-alert-line-height: var(--x-text-base-line-height) 引用了 --x-text-base-line-height 语义 token,但 frontmatter tokens.consumed 列表未声明该 token。根据 CLAUDE.md 约束,CSS 变量使用必须与 frontmatter `tokens.cons...
shumin ye: 都已修复

H1:frontmatter 补充 --x-text-base-line-height token 声明

M1:关闭按钮添加 :focus-visible 样式

M2:contentTitle 从 slot fallback 中提出来,和 default 插槽平级渲染,两者可以共存

L1:internalExpanded 处添加注释说明 defaultExpanded 在 collapsible=false 时被忽略的设计意图

T1:补充 aria-expanded 属性变化的测试,以及 contentTitle ...
MR: !16710 评论内容: ## Code Review - MR !16710

MR overview: 为 XInputNumber 添加 prefix/suffix 色块插槽与 error 状态反馈,为 XInputRange 增加 valueType="number" 数字模式与 precision 精度控制,同时为 XInput prepend 插槽增加 XSelect 集成样式。

---

### Overall assessment: 🟡 Approve with reservations

整体实现质量较高,测试覆盖充分,文档同步完整。但存在一处明显的样式 Bug(XSelect 前缀在不同尺寸下错位)和一处数字模式下 precision 的显示格式化未生效问题,建议在合并前修复。此外 controls 默认值的 Breaking Change 需要确保调用方知情。

---

### 1. bug [packages/ui-core/src/components/input/ui/input.vue...
shumin ye: Warning 4 — controls 默认值 breaking change:XInputNumber 是新组件,不存在旧版本,'none' 是设计决策,文档已同步。Warning 5 — 输入过程中 model 与显示值不同步:这是预期行为,输入中不应截断用户正在编辑的值,blur 时才格式化。

其他都已修复
MR: !16710 评论内容: 尽量不要使用--x-space-1这种,尽量使用有语义的版本
MR: !16679 评论内容: ## 破坏者审查报告 — MR !16679

MR 概要: 新增 XRate 评分组件,支持整星/半星、预设类型(star/heart)、禁用态、键盘导航、可访问性及国际化
审查阶段: 已实现

---

### HIGH

- [x] [H1] isHalfActive 判断逻辑有缺陷,.5 精度外的小数会导致半星不显示packages/ui-core/src/components/rate/ui/rate.vue:94
isHalfActive 使用 index - 0.5 === val 严格相等判断。当 displayValue 是一个非 .5 步长的小数(例如 2.3clampedValue round 为 2.5 这没问题,但如果浮点精度导致 2.5000000000000004)严格比较会失败。更实际的场景:hoverValue 来自 resolveValueindex - 0.5,此处是整数减 0.5...
MR: !16675 评论内容: ## 破坏者审查报告 — MR !16675

MR 概要: 新增 XRadio / XRadioGroup 组件,基于 reka-ui RadioGroup 原语实现,包含需求文档、实现、测试和文档站页面。
审查阶段: 已实现

---

### MEDIUM

- [ ] [M1] orientation 类型定义与文档不一致packages/ui-core/src/components/radio/types.ts:31
types.tsorientation 类型为 'horizontal' | 'vertical',但需求文档 radioGroup.md 和文档站 radio.md 都声明类型为 'horizontal' | 'vertical' | undefinedtypes.tsorientation 是可选属性(orientation?:),所以 TypeScript 层面确实隐含了 `undefined...
MR: !16658 评论内容: ## 破坏者审查报告 — MR !16658

MR 概要: 新增 XEmpty 空状态组件(含 i18n、预设插画、文档站页面)
审查阶段: 已实现

---

### MEDIUM

- [x] [M1] 英文 locale 文案语法错误packages/ui-core/src/locale/en.ts
noSearch: 'Search no results' 语法不通顺,应为 'No search results''No results found'。这是面向用户的文案,会直接展示在 UI 中。

- [x] [M2] 文档站"自定义图片"示例不完整apps/ui-docs/docs/components/core/empty.md
"自定义图片"一节只有文字说明,没有代码示例和可交互 demo,与其他示例风格不一致。用户无法直观看到 image 插槽的使用效果。

### LOW

- [x] ...
shumin ye: L1已修复

L2不必修,这是项目的统一写法,如icon-btn、message、popconfirm
MR: !16658 文件: packages/ui-core/src/components/empty/ui/empty.md 行号: 第 16 行 评论内容: 统一规则:

- 布尔值/数字/undefined → 裸值(false, 0, undefined)
- 字符串默认值 → 单引号('md', 'body')
- 内联字面量联合类型 → 双引号包裹单引号("'button' | 'a'")
- 类型别名 → 裸标识符(XPlacement, XSize)

按照这个规则整理下
MR: !16652 评论内容: ## XBadge 组件审查报告

---

### 1. [bug] 负数 value 的行为未定义且表现异常

文件: packages/ui-core/src/components/badge/ui/badge.vue:41-43

displayValue 中当 value 为负数(如 -5)时,-5 &gt; 99 为 false,会直接显示 "-5"。从业务语义(计数徽标)看,负数不合理。

破坏场景: &lt;XBadge :value="-1" /&gt; 显示一个内容为 "-1" 的红色徽标。

修复建议: 在 showSup 中对负数做处理(如视为 0 或不显示),或在 types.ts 中增加注释说明 value 应为非负数。

---

### 2. [warning] max 为 0 或负数时的边界行为未约束

文件: `packages/ui-core/src/components/bad...
rick ma: 已修复。

1-3里面修复了3,1、2的话从业务设计角度也可以不限制,element plus也没有限制,我认为还是不限制比较简洁。

其余建议全部看了一遍,采纳了一部分。
rick ma: 1. 不采纳。负数在主场景(未读消息)里,正常情况不应出现,组件不应该为业务逻辑兜底。如果是其他奇怪的场景,我认为负数的地位更偏向于字符串而不是数字,倾向于不做限制。简单原则。element plus也不做限制。
2. 不采纳。主要是考虑到这个限制只存在于边缘case里的边缘case,且有跟没有也不造成什么大影响。这个设计我认为是冗余的。element plus也不做限制。
3. 已采纳
4. 已采纳
5. 已采纳
6. 增加了测试用例,但未增加守卫。这个设计我认为是冗余的。
7. 已采纳
8. 已采纳。
9. 不采纳。这俩ap...
MR: !16652 文件: packages/ui-core/src/components/badge/ui/badge.md 行号: 第 15 行 评论内容: 尽量不要使用--space-数字,这些是紧急逃生舱。使用有语义的版本,比如--space-inline-base等
MR: !16652 文件: packages/ui-core/src/components/badge/ui/badge.md 行号: 第 23 行 评论内容: default: ''
MR: !16652 评论内容: 前面推荐添加的几个测试用例可以增加一下 rick ma: 已修复
MR: !16608 文件: apps/xnurta/src/views/home_new/components/AiActionSummary.vue 行号: 第 171 行 评论内容: 这么多重复的逻辑...不考虑封装一下么... lynn gu: refactored in https://gitlab.com/sparkxmedia/xnurta-web/-/merge_requests/16608/diffs?commit_id=7177065b42f0eb276148d03ee2b8e7fa61c56228
MR: !16599 文件: apps/xnurta/src/views/amc/editModel/components/models/CrossProductAssociation/components/AsinSelector/AsinTable.vue 行号: 第 191 行 评论内容: 一般不要用$开头来命名这种普通变量
MR: !16452 评论内容: ## Code Review - MR !16452

MR 概述: 新增 input 组件族(XInput、XInputRange、XInputTag、XInputNumber),包含组件实现、类型定义、单元测试和文档。

---

### 整体评估: ⚠️ 建议修改后合并

组件族架构清晰,类型定义完整,测试覆盖率不错。但存在几个需要修复的 bug 和值得改进的问题。

---

### 1. 🐛 bug [inputNumber.vue] 浮点数输入过滤正则允许多个小数点和负号

File: packages/ui-core/src/components/input/ui/inputNumber.vue

ts<br>const filtered = input.value.replace(/[^\d.\-]/g, '')<br>

当前正则 /[^\d.\-]/g 只移除非数字/点/负号字符,但不阻止多个小数点或负号出现在中间...
MR: !16395 文件: packages/ui-core/src/components/checkbox/ui/checkbox.md 行号: 第 3 行 评论内容: 参考下最新的button.md进行一些格式上的优化和冗余信息的删除 quint liu: 已去除了 status
MR: !16395 文件: packages/ui-core/src/components/checkbox/ui/checkbox.md 行号: 第 58 行 评论内容: 额外支持下border属性可以渲染为带有边框的多选框,参考https://element-plus.org/zh-CN/component/checkbox quint liu: 已添加 border
MR: !16395 文件: packages/ui-core/src/components/checkbox/ui/checkboxGroup.md 行号: 第 3 行 评论内容: 同checkbox.md,参考下最新的button.md进行下简化 quint liu: 已去除了 status
MR: !16395 文件: packages/ui-core/src/components/checkbox/ui/checkboxGroup.md 行号: 第 39 行 评论内容: 支持min/max来设置最小/最大可选个数 quint liu: 已添加 min/max
MR: !16395 评论内容: Checkbox 组件代码审查 — 问题清单

严重问题 (Bugs / 错误行为)

1. Group 内 XCheckbox 的 update:modelValue 和 change 事件语义错误

checkbox.vue:74-78 — 当 XCheckbox 在 XCheckboxGroup 内使用时,handleUpdate 依然触发,emit 出一个 boolean(true/false)。但此时 checkbox 的值语义是 group 数组的成员增减,boolean 对消费者毫无意义。更糟的是,reka-ui 的 CheckboxRoot 在 group 模式下会直接绕过 modelValue prop 和 update:modelValue emit,改为操作 group context 的数组。所以:

- 单个 checkbox 的 update:modelValue emit 出的 boolean 与 group 状态无关
- 如果消费者在 group 内监听单个 checkbox 的 @chang...
MR: !16395 评论内容: 问题1:

问题的本质是:group 内 checkbox 的 handleUpdate 仍然触发,emit 出一个毫无意义的 boolean。

推荐方案:group 内不 emit 单个 checkbox 的事件。

理由:

- group 内,checked state 完全由 reka-ui 的内部 group context 管理,你传的 modelValue 被忽略
- 消费者在 group 场景下只应该监听 XCheckboxGroup 的事件,拿到的是 XCheckboxValue[]
- 单个 checkbox emit 出 boolean 在 group 内语义是错的,不如不发

改法很小 — handleUpdate 里检测 group context,有就静默:

```typescript
function handleUpdate(value: CheckboxCheckedState) {
if (groupContext) retur...
MR: !16346 评论内容: ## Code Review - MR !16346

MR 概述: 子账号资源导入功能文案调整 — 新增「覆盖导入」提示及帮助链接,更新错误提示文案为富文本展示,移除旧的 overwriteWarning 提示。

---

### 整体评估: ⚠️ 基本可以合入,有一个安全建议需要关注

改动范围清晰,i18n 三语言同步删除/新增处理得当,逻辑简洁。主要关注点在 v-html 的使用。

---

### 1. warning [ErrorInfo.vue] v-html 替代插值存在潜在 XSS 风险

File: apps/xnurta/src/views/subAccount/components/BatchUpload/ErrorInfo.vue

```html
<!-- before -->
<span></span>
<!-- after -->
&...
samily wang: 1和2均可忽略
MR: !16334 文件: apps/xnurta/src/views/label/new/components/ManualLabelDrawer.vue 行号: 第 515 行 评论内容: SponsoredDSP,有这个profileType类型么? vince hu: image.png看到代码里有这个定义 samily wang: image.png

这是一个仅在自定义看板中使用的内部枚举值,系统内其他地方不存在SponsoredDSP这个profileType

另外能用枚举值的,尽量用枚举值,不要再写具体string了
vince hu: 已修改
MR: !16332 文件: packages/ui-core/src/components/select/ui/select.md 行号: 第 31 行 评论内容: i18n的部分后补
MR: !16332 文件: packages/ui-core/src/components/select/ui/select.md 行号: 第 73 行 评论内容: option还需要支持disabledTip
MR: !16332 文件: packages/ui-core/src/components/select/ui/select.md 行号: 第 70 行 评论内容: 这边看下改版后的组件template,移除了must和should,两者合并了
MR: !16332 文件: packages/ui-core/src/components/select/ui/select.md 行号: 第 74 行 评论内容: 这些支持的部分都缺少对应的解释
MR: !16332 评论内容: ## Code Review - MR !16332

MR 概述: XSelect 组件实现,包含单选/多选、标签折叠、筛选、对象值匹配等功能

---

### Overall assessment: ⚠️ 需要修复若干问题后再合并

组件整体架构合理,基于 reka-ui Combobox 原语实现统一模板是好的设计决策。但存在一些 bug 级别的问题(SSR canvas 缓存、change 事件重复触发)和若干类型/性能隐患,建议优先修复后合并。

---

### 1. 🔴 bug [useCollapseTagsCounter.ts] Canvas context 缓存在 SSR 后永远返回 null

File: packages/ui-core/src/components/select/useCollapseTagsCounter.ts

```ts
let _canvasCtx: CanvasRender...
lillian yin: 1:Canvas context 缓存在 SSR 后永远返回 null

目前项目不存在SSR场景,不过还是改了一下

5:XSelectValue 联合类型无法区分单选/多选

不需要修改。 运行时 Array.isArray() 是跨单选/多选的正常判断,泛型改动大而且组件内部仍需运行时判断。

6:valueKeyCompareFn 只检查 options,不检查 modelValue

不需要修改。 modelValue 的值来源于 options 中的 value,两者类型一致。

9:handleAnchorC...
MR: !16326 评论内容: ## Code Review - MR !16326

MR 概述: 为 strategyList.value[0] 添加空值兜底,防止数组为空时调用 .split() 报错。

---

### 整体评估: ⚠️ 需要补充修复

修复方向正确,但当前只修复了一个访问点,同一函数中还有其他地方直接访问 strategyList.value[0],在数组为空时同样会出现问题。

---

### 1. warning [index.vue] 修复不完整 — 同函数内其他 strategyList.value[0] 访问未做保护

File: apps/xnurta/src/views/intelligenceCenter/diagnosis_new/report/AdvDiagnosis/index.vue

当前修复:
```js
// line 809 (修复后)
currStrategyType.value = (strategyLi...
MR: !16323 评论内容: ## Code Review - MR !16323

MR 概述: 产品中心全部商品列表新增趋势图下载、竞品推荐跳转、BSR列展示、SB广告数据提示等功能。

---

### 总体评价: ✅ 基本可合并,有几个建议项

整体代码质量良好,功能拆分清晰,commit 粒度合理。以下是具体 review 意见:

---

### 1. ⚠️ [Charts.vue] 下载错误处理可以更友好

文件: apps/xnurta/src/views/productCenter/allProductList/components/Charts.vue

js<br>if (error) {<br> console.error('handleDownloadChart error:', error)<br> return<br>}<br>

当前下载失败时只打印了 console.error,用户没有任何感知。建议增加一个用户可见的错误提示,例如 ...
MR: !16320 评论内容: @vince.hu.xnurta

Code Review

1. [Bug] realSkippedLabels 逻辑可能遗漏系统定制标签的级联场景

新增的 realSkippedLabels 过滤逻辑只排除了"父标签在删除列表中的自动子标签":

javascript<br>const realSkippedLabels = this.selectedList.filter( <br> item =&gt; !deletableIds.has(item.id) && !(this.isAutoGeneratedSubLabel(item) <br> && deletableIds.has(item.parentId)) <br>)<br>

但系统定制标签(customLabel === true)同样会被 deletableLabels 过滤掉。如果一个系统定制子标签的父标签也在删除列表中,后端级联删除父标签时同样会删除该子标签,但当前逻辑没有排除这种情况,仍然会将其计入 realSkippedL...
MR: !16317 评论内容: 发现 2 个问题:

1. TopTable 与 ChartFilter/CategorySelector 之间分类 key 编码不一致

TopTable/script.js 使用 row.key + '-' + row.name(连字符 -)拼接分类 key,但 ChartFilter/index.vue 和 CategorySelector/index.vue 使用 encodeCategoryValue(),该函数使用 CATEGORY_SEPARATOR = '\u001F'(ASCII 单元分隔符)进行编码。当 ChartFilter 调用 TopTable 的 syncSelection(values) 时,传入的是 \u001F 编码的值,而 TopTable 用 - 去匹配——字符串永远无法匹配。分类筛选的双向同步功能完全失效。

https://gitlab.com/sparkxmedia/xnurta-web/-/blob/65aeb05d6d1a4557d75b6262681ed77094257d6f/apps/xnurt...
MR: !16079 文件: apps/xnurta/src/components/XpMultiSelect/index.vue 行号: 第 509 行 评论内容: 这边是为了处理什么样的问题,需要引入额外立即执行的逻辑? lynn gu: 当用户滚动到底部触发加载下一页时,可能恰好有一个 pending 的 debounce 请求(比如搜索文本变化、params 变化触发的 updateOptions)还没执行。如果不 cancel 掉,就会出现竞态问题:

1. 滚动触发 → fetchOptions(page=2) 立即执行,拼接第二页数据
2. 200ms 后 debounce 的 updateOptions 触发 → fetchOptions(page=1) 执行,把列表重置回第一页

结果就是用户刚加载出来的第二页数据被覆盖掉了。

所以这里的策略是:滚动加载是...
MR: !16079 文件: apps/xnurta/src/store/modules/app.js 行号: 第 59 行 评论内容: 这一段理论上可以不用,除非在sqp页面中调用了SET_DOW,但目前所有SET_DOW相关的调用都在用户偏好设置界面 lynn gu: 但是偏好设置为了可以跨标签页同步,在这个组件这里监听了localStorage,来更新store。此时也会调用SET_DOW.

image.png
MR: !16079 文件: apps/xnurta/src/components/XpWeekDatePicker/WeekDateRangePanel.vue 行号: 第 1 行 评论内容: 关于这个日期-周的选择器

1. 为啥需要再自行实现一个周选择器
2. 这部分的代码过于复杂和混乱,需要整理
3. 最好在开头/单独文件中写清楚这个周选择器额外做了哪些限制
lynn gu: 1. 产品需求(点击一个日期自动选择当前周,点两次选N周;hover在某一行上面显示第几周;外部文案是日期-日期) samily wang: 这个选择器说实话非常不直观...我试了一下,如果想选2026-01-01这一周 ~ 2026-03-07这一周,无法做到,第二次点击就会变成2026-03-01 ~ 2026-03-07 lynn gu: 已重构
MR: !16079 文件: apps/xnurta/src/layout/main/components/header/AmazonHeader.vue 行号: 第 11 行 评论内容: 个人觉得这个周选择器并不通用,不太适合放到全局 lynn gu: 已重构
MR: !16079 文件: apps/xnurta/src/components/xTable/components/xTableConfigDialog.vue 行号: 第 42 行 评论内容: 这个文件里面的改动:

1. 如果不需要提供2种模式的动态切换,更适合作为一个新的组件,在xTable中通过传参来确认使用哪种配置弹框
2. 逻辑过于复杂,干出来700行的改动,理论上不需要这么复杂的逻辑
vince hu: 已将树型模式拆分出来
MR: !16079 文件: apps/xnurta/src/components/xTable/composables/column.js 行号: 第 61 行 评论内容: 这里的整体做了重构,代码过于复杂,需要重新梳理和简化 vince hu: 已简化
MR: !16039 文件: packages/i18n/legacy/views/budgetManagement/add/components/tableList/en.json 行号: 第 29 行 评论内容: 这边顺带把en.json里面错误修正下

先确认下这两个翻译是否还有用到,没有用到就删除,如果还在使用就enabled/paused的改成英文吧
MR: !16039 评论内容: AI 星星的判断条件 row.optimizings && (row.optimizings.ai === 1 || row.optimizings.ai === 9) 在 4 个地方 重复出现。建议提取为公共工具方法或 mixin: // 例如 utils/campaign.js export function isAiRunning(optimizings) { return optimizings && (optimizings.ai === 1 || optimizings.ai === 9) }
MR: !15893 文件: apps/xnurta/src/views/insights/customBoard/BoardsDetails.vue 行号: 第 134 行 评论内容: 竞态条件:轮询并发保护不完整

javascript<br> const pollBoardPermission = async boardId =&gt; {<br> // 并发保护<br> if (pollingInFlight.value) {<br> return // 只是返回,没有重试或队列机制<br> }<br> // ...<br> pollingInFlight.value = true<br> try {<br> const resp = await checkBoardLock(boardId) // 网络请求<br> // 更新状态...<br> } finally {<br> pollingInFlight.value = false<br> }<br> }<br>

问题描述:

- pollingInFlight 只是简单的布尔锁,如果请求失败或超时,下一个轮询周期会跳过
- 没有处理"请求正在飞行中但轮询周...
lynn gu: 1. pollingInFlight 在 finally 中重置,所以请求失败不会导致后续轮询被永久跳过。
2. 请求还在飞行中时跳过本次轮询是有意为之的 — 15s 间隔的权限检查,偶尔跳过一次不影响体验,比起引入 AbortController 的复杂度,当前方案更简单可维护。
3. 组件卸载时 onUnmounted 已经 stopPolling()(清除 interval),不会再触发新轮询。飞行中的请求响应回来后更新的 ref 已无模板引用,不会有副作用,composable 实例也会随组件被销毁回收。

引入 AbortController 会增...
MR: !15893 文件: apps/xnurta/src/views/insights/customBoard/components/CollaborationManager/CollaboratorAddDialog.vue 行号: 第 198 行 评论内容: 这边理论上可以并行执行

javascript<br> const initData = async () =&gt; {<br> initLoading.value = true<br> try {<br> // 并行执行两个请求<br> await Promise.all([<br> fetchUserList(),<br> props.boardIds.length === 1 ? fetchExistingCollaborators() : Promise.resolve()<br> ])<br> } finally {<br> initLoading.value = false<br> }<br> }<br>
lynn gu: 这两个函数不能简单并行化。fetchUserList 在单看板模式下会重置 selectedList.value = [],而 fetchExistingCollaborators 随后会填充 selectedList。并行执行存在竞态风险,可能导致协作者回显被清空。

虑到这是弹窗初始化,两个请求的耗时叠加对用户体验影响有限,当前的串行写法更安全、更易维护,改动的收益不大。
MR: !15893 文件: apps/xnurta/src/views/insights/customBoard/components/CollaborationManager/CollaboratorAddDialog.vue 行号: 第 218 行 评论内容: 这个是专门需要转成数字的么? lynn gu: 对的,因为其他接口里返回的id都是数字,为了统一
MR: !15893 评论内容: 代码重复:样式定义重复

[CollaborationManagerDrawer.vue, CollaboratorAddDialog.vue, CollaboratorEditDialog.vue]

多个组件有相同的 .el-dialog 样式覆盖:

scss<br> ::v-deep .el-dialog {<br> padding: 0;<br> border-radius: 10px;<br> .el-dialog__header {<br> border-bottom: 1px solid #e5e6eb;<br> height: 50px;<br> // ...<br> }<br> }<br>

建议: 提取为共享的 mixin 或基础组件
MR: !15893 文件: apps/xnurta/src/views/insights/customBoard/composables/boardLock.js 行号: 第 21 行 评论内容: 确认下BoardInfoCard中是否存在使用该composables lynn gu: 用了 line126
MR: !15893 评论内容: 架构/设计模式观察优点

1. 锁机制设计合理:

- 使用 "安全优先" 原则,初始状态为锁定
- 倒计时使用 endAt 时间戳而非递减秒数,避免标签页切换问题
- 正确清理定时器和事件监听器

2. Composable 拆分良好:

- useBoardLock - 查询锁定状态(只读)
- useEditLock - 编辑锁管理(写入)
- usePolling - 通用轮询逻辑
- 职责分离清晰

3. 协作权限模型清晰:

- 区分 isOwner 和 isAllowEdit\
- 主账号逻辑处理得当

改进建议

1. 缺乏统一的错误边界处理

建议添加 Error Boundary 组件处理子组件错误:

```xml
<!-- ErrorBoundary.vue -->
<template>
<div v-if="err...
MR: !15889 文件: apps/xnurta/src/views/amc/editModel/components/adRangeSelector/index_new.vue 行号: 第 9 行 评论内容: 这个single-ad-type的值应该是true吧? lucas lu: 不一定的,可选择当个广告类型,也可跨广告类型选择,现在应该是只有一个场景是当个选择,其他都是跨类型选择 samily wang: 这边是个透传参数是吧?
MR: !15436 文件: src/views/financial/billingCenter/vPlg/index.vue 行号: 第 467 行 评论内容: 不太建议用没有前缀、太常用的单词作为css class name,非常容易被全局样式污染
MR: !15284 文件: packages/xnurta-i18n/cookieConsent/ja.json 行号: 第 4 行 评论内容: 无日语版本的pdf,暂时继续日语用英文版本的pdf
MR: !15284 文件: packages/xnurta-i18n/cookieConsent/ja.json 行号: 第 37 行 评论内容: 同上
MR: !15277 文件: packages/xnurta-i18n/legacy/lang/amazonAdTab/en.json 行号: 第 24 行 评论内容: 默认英文规则是仅首单词首字母大写,其他单词首字母小写,找产品确认下,理论上应该是

AI managed campaigns
MR: !15241 文件: packages/xnurta-i18n/legacy/lang/AIActionSpace/en.json 行号: 第 116 行 评论内容: 英文一般要求是只有首单词的首字母大写,后续单词的首字母都小写,找对应产品和UI确认下
MR: !14903 文件: src/views/allCampaigns/tabs/negativeTargeting/negativeKeywords/index.vue 行号: 第 63 行 评论内容: 这边不如将v-if放到前一行上做判断,不确定iconfont-group是否会默认占据width
MR: !14619 文件: src/views/productCenter/index_v2.vue 行号: 第 1319 行 评论内容: 这边具体的需求是啥,为什么要这么复杂地去添加一个tooltip

Alec Xu (@alec.xu.xnurta)

41 个讨论,涉及 25 个 MR

评论
MR: !17044 文件: apps/xnurta/src/views/allCampaigns/tabs/campaign/script.js 行号: 第 574 行 评论内容: 目前这个文件已经接近3k行,考虑后续对文件及模块做些重构,重构时再做处理。目前先按照就近原则保持现状。
MR: !17043 文件: apps/xnurta/src/views/allCampaigns/components/AddCampaign/AdSelect.vue 行号: 第 395 行 评论内容: 参考了其他模块的样式,不需要处理
MR: !16948 文件: packages/i18n/legacy/lang/instacart/tableHead/ja.json 行号: 第 56 行 评论内容: 暂不处理日文
MR: !16831 文件: apps/xnurta/src/omni/instacart/views/ads/components/adGroupTab/AdGroupTable.vue 行号: 第 127 行 评论内容: 0 表示同步中
MR: !16831 文件: apps/xnurta/src/omni/instacart/views/ads/components/campaignTab/CampaignTable.vue 行号: 第 191 行 评论内容: 0 表示同步中,禁止编辑
MR: !16827 文件: apps/xnurta/src/omni/instacart/views/ads/components/adGroupTab/AdGroupTable.vue 行号: 第 273 行 评论内容: 暂不处理
MR: !16804 文件: apps/xnurta/src/omni/instacart/views/ads/components/campaignTab/CampaignTable.vue 行号: 第 191 行 评论内容: syncStatus 值为 0,1,2
MR: !16777 文件: apps/xnurta/src/omni/instacart/constants/instacartConstants.js 行号: 第 290 行 评论内容: instacart 枚举
MR: !16764 文件: apps/xnurta/src/omni/instacart/views/ads/components/adGroupTab/AdGroupTab.vue 行号: 第 2 行 评论内容: 特殊逻辑
MR: !16717 文件: apps/xnurta/src/omni/instacart/views/ads/components/campaignDrawer/CampaignBasicsCard.vue 行号: 第 426 行 评论内容: adapater 中会处理
MR: !16686 文件: apps/xnurta/src/omni/instacart/views/ads/components/adGroupTab/AdGroupTab.vue 行号: 第 101 行 评论内容: 暂不处理
MR: !16659 文件: apps/xnurta/src/omni/instacart/components/CampaignSingleSelect.vue 行号: 第 105 行 评论内容: 接口暂时不支持
MR: !16648 文件: apps/xnurta/src/views/allCampaigns/components/EditDialog/PlacementBidDialog.vue 行号: 第 48 行 评论内容: 业务逻辑
MR: !16648 文件: apps/xnurta/src/views/allCampaigns/tabs/bidAdjustment/placement/script.js 行号: 第 35 行 评论内容: 业务逻辑
MR: !16648 文件: apps/xnurta/src/views/sb/components/bidding/index.vue 行号: 第 16 行 评论内容: 业务逻辑
MR: !16648 文件: apps/xnurta/src/views/sb/components/campaignDetail/script.js 行号: 第 267 行 评论内容: 业务逻辑
MR: !16648 文件: packages/i18n/legacy/lang/dimension/en.json 行号: 第 458 行 评论内容: 业务逻辑
MR: !16627 文件: apps/xnurta/src/omni/instacart/views/ads/components/campaignTab/CampaignTable.vue 行号: 第 150 行 评论内容: 这里数字范围是 0 - 10
MR: !16627 文件: apps/xnurta/src/omni/instacart/views/ads/components/campaignTab/CampaignTable.vue 行号: 第 176 行 评论内容: fixed
MR: !16627 文件: apps/xnurta/src/omni/instacart/views/ads/components/campaignTab/CampaignTable.vue 行号: 第 177 行 评论内容: 语义不同,这么写没问题
MR: !16593 文件: apps/xnurta/src/omni/instacart/views/ads/components/commonFilter/BiddingStrategySelect.vue 行号: 第 24 行 评论内容: 逻辑修改
MR: !16509 文件: packages/i18n/legacy/lang/tableHead/ja.json 行号: 第 581 行 评论内容: 暂时用不到
MR: !16481 文件: apps/xnurta/src/omni/instacart/views/ads/components/addKeywordsDrawer/AddKeywordsDrawer.vue 行号: 第 59 行 评论内容: 这里暂时只会有 exact
MR: !16481 文件: apps/xnurta/src/omni/instacart/views/ads/components/campaignDrawer/AdGroupTargetsCard.vue 行号: 第 39 行 评论内容: 同上
MR: !16466 文件: apps/xnurta/src/omni/instacart/views/ads/components/addKeywordsDrawer/AddKeywordsDrawer.vue 行号: 第 58 行 评论内容: 必有类型
MR: !16466 文件: apps/xnurta/src/omni/instacart/views/ads/components/campaignDrawer/AdGroupTargetsCard.vue 行号: 第 39 行 评论内容: 同上
MR: !16426 文件: apps/xnurta/src/views/allCampaigns/tabs/bidAdjustment/placement/script.js 行号: 第 269 行 评论内容: 不需要处理
MR: !16426 文件: apps/xnurta/src/views/allCampaigns/tabs/bidAdjustment/placement/script.js 行号: 第 529 行 评论内容: 不需要处理
MR: !16416 文件: apps/xnurta/src/views/allCampaigns/tabs/bidAdjustment/placement/script.js 行号: 第 35 行 评论内容: 这里的参数有点奇怪,但是确实如此,入参和回显的参数不同。
MR: !16416 文件: apps/xnurta/src/views/allCampaigns/tabs/bidAdjustment/placement/script.js 行号: 第 361 行 评论内容: 同样是参数问题
MR: !16393 文件: apps/xnurta/src/omni/instacart/api/profile.js 行号: 第 7 行 评论内容: 后面再处理
MR: !16369 文件: apps/xnurta/src/omni/instacart/adapters/adGroupAdapter.js 行号: 第 74 行 评论内容: 暂不处理,后续迭代
MR: !16369 文件: apps/xnurta/src/omni/instacart/components/CampaignSingleSelect.vue 行号: 第 124 行 评论内容: 暂不处理,后续迭代
MR: !16369 文件: apps/xnurta/src/omni/instacart/views/ads/components/campaignDrawer/CampaignDrawer.vue 行号: 第 252 行 评论内容: 暂不处理,后续迭代
MR: !16369 文件: apps/xnurta/src/omni/instacart/views/ads/components/campaignDrawer/CampaignDrawer.vue 行号: 第 41 行 评论内容: 暂不处理,后续迭代
MR: !16369 文件: apps/xnurta/src/omni/instacart/views/ads/components/campaignDrawer/CampaignDrawer.vue 行号: 第 414 行 评论内容: 暂不处理,后续迭代
MR: !16355 文件: apps/xnurta/src/omni/instacart/adapters/adGroupAdapter.js 行号: 第 96 行 评论内容: 暂时不处理,后面再改
MR: !16355 文件: apps/xnurta/src/omni/instacart/views/ads/components/campaignDrawer/CampaignAdGroupTree.vue 行号: 第 80 行 评论内容: 暂时不处理,后面再改
MR: !16049 文件: apps/xnurta/src/components/XpFilter/filters/WalmartProductStateFilter.vue 行号: 第 36 行 评论内容: 产品需要
MR: !15410 文件: src/views/walmart/walmartSponsoredAd/components/UpdateBidsDialog.vue 行号: 第 74 行 评论内容: explain the difference between these two regex match pattern @GitLabDuo
MR: !15303 文件: src/views/allCampaigns/script.js 行号: 第 123 行 评论内容: 备注:campaignOptions 已经弃用,后续迭代更新掉,这里可以先忽略。

Placeholder jehan.jia (@jehanjia_placeholder_1kvp16d1)

25 个讨论,涉及 22 个 MR

评论
MR: !12869 评论内容: https://jira.internal.xnurta.com/browse/BC-4000
MR: !12828 评论内容: @Samily.Wang
MR: !12757 评论内容: @Samily.Wang
MR: !12657 评论内容: @Samily.Wang
MR: !12588 评论内容: @Samily.Wang
MR: !12578 评论内容: @Samily.Wang
MR: !12530 评论内容: @Samily.Wang
MR: !12467 评论内容: @Samily.Wang
MR: !12397 评论内容: @Samily.Wang
MR: !12333 评论内容: @Samily.Wang
MR: !12295 评论内容: @Samily.Wang
MR: !12144 评论内容: @Samily.Wang
MR: !12144 评论内容: 以上bug均已修复
MR: !12144 评论内容: @Samily.Wang
MR: !12114 评论内容: @Samily.Wang
MR: !12108 评论内容: @Samily.Wang
MR: !12030 评论内容: @Samily.Wang
MR: !12029 评论内容: @Samily.Wang
MR: !12028 评论内容: @Samily.Wang
MR: !11914 评论内容: @Samily.Wang
MR: !11901 评论内容: @liuquint
MR: !11652 评论内容: 分时预算等更新已提交
更新内容如下

A. 顶部文案内容调整

B. 策略校验规则调整
按日模式
总数上限24条 ✅
按周模式
总数上限 7 * 24条 ✅
单天上限24条✅

注:若24h的策略均一致则返回结果为「全天」

C. 自动化规则设置增加帮助中心入口

D. 自动化规则所有模块标题卡片风格调整为统一样式
MR: !11652 评论内容: @liuquint
MR: !11582 评论内容: @liuquint
MR: !11535 评论内容: @Samily.Wang

liam ye (@liam.ye.xnurta)

17 个讨论,涉及 15 个 MR

评论
MR: !15890 文件: apps/xnurta/src/views/intelligenceCenter/intelligenceCreationV3/batchCreation/sp/components/BeforeCreateDialog/script.js 行号: 第 86 行 评论内容: 重新打开时会重置submitting
MR: !15888 文件: apps/xnurta/src/views/intelligenceCenter/Notification/RuleSetting/model/useSettingInfo.js 行号: 第 142 行 评论内容: detail 中的 userIdstore 中的 userId ,类型可能不一致
MR: !15855 文件: apps/xnurta/src/views/settings/components/NotificationSettings.vue 行号: 第 76 行 评论内容: 后端保证是pst
MR: !15833 文件: apps/xnurta/src/views/intelligenceCenter/Notification/RuleSetting/model/useSettingInfo.js 行号: 第 145 行 评论内容: detail.value.userId 为后端返回的userId,为string,和store中的number不严格相等
MR: !15787 文件: apps/xnurta/src/views/intelligenceCenter/intelligenceCreationV3/components/groupNameInput/index.vue 行号: 第 129 行 评论内容: watch有debounce,会导致type先emit,导致外部数据不一致,改变type时,直接emit change,触发两次也可以接受
MR: !15770 文件: src/views/intelligenceCenter/intelligenceCreationV3/components/groupNameInput/useGroupList.js 行号: 第 6 行 评论内容: 托管组信息会变化,不想一直缓存对应的托管组列表信息
MR: !15694 文件: src/views/intelligenceCenter/intelligenceCreationV3/batchCreation/sp/step/Preview/index.vue 行号: 第 126 行 评论内容: 有新建托管组时不用显示,无新建托管组时,无法编辑行动空间,才需要提示
MR: !15694 文件: src/views/intelligenceCenter/intelligenceCreationV3/components/preview/script.js 行号: 第 169 行 评论内容: this.allAsinMessage 中包含input(新建托管组)和select(选择已有托管组),新建的托管组ai状态都是关闭的,或者没有新建的托管组,都无法编辑行动空间
MR: !15681 文件: src/layout/main/components/NavMenus/QuickMenu.vue 行号: 第 64 行 评论内容: 如果该组件挂载时globalInited已为true,watch回调确实会在设置期间同步执行,但是回调内部的watchStop 会等待nextTick 后异步执行,此时watchStop 已有值 quint liu: 要不直接换成 waitUntil? quint liu: waitUntil(() =&gt; store.getters.globalInited, initMenus) liam ye: 可以
MR: !15663 文件: src/components/AIBoard/common/header.vue 行号: 第 13 行 评论内容: hasEditAuth 必须要有值并且为1才有编辑权限
MR: !15602 文件: src/views/intelligenceCenter/intelligenceCreationV3/components/groupNameInput/useGroupList.js 行号: 第 4 行 评论内容: 仅需要使用的页面或组件缓存即可,智能创建后会生成新的托管组,缓存很可能有遗漏
MR: !15577 文件: src/views/home_new/components/NotificationNew.vue 行号: 第 9 行 评论内容: 原先' (UTC) ' 后有空格,保留
MR: !15558 文件: src/views/budgetManagement/add/components/hostingGroupConfig.vue 行号: 第 917 行 评论内容: 需要保留两位小数,复制的DateCalendar中的代码
MR: !15558 文件: src/views/budgetManagement/add/components/hostingGroupConfig.vue 行号: 第 935 行 评论内容: budget无法设置为小于spend的数值
MR: !15530 文件: src/views/walmart/ai/components/createAi/createAi.vue 行号: 第 222 行 评论内容: selectedCampaign也可以是props.moveNewGroupCampaign
MR: !15446 文件: src/views/intelligenceCenter/ProductAdvertiseDeposit_new/associateCampaignModalNew/AssociateCampaignCard/index.vue 行号: 第 111 行 评论内容: 防止div再次添加其他筛选器时,组长组员筛选权限会被遗忘
MR: !15241 评论内容: @samily.wang.xnurta

Placeholder Ghost User (@ghost_placeholder_10r6jzk1)

7 个讨论,涉及 2 个 MR

评论
MR: !10921 文件: src/views/walmart/walmartSponsoredAd/components/tabs/campaign/columns.js 行号: 第 132 行 评论内容: 这个时间默认是不展示的,怎么把visible配置去掉了
MR: !10921 文件: src/views/walmart/walmartSponsoredAd/components/tabs/campaign/index.vue 行号: 第 809 行 评论内容: dailyRemainingBudget、dailyOutOfBudgetDatetime 这两行逻辑应该是跟下面重复了吧。 下面会直接取当前展示的标题。不许要额外翻译
MR: !10921 文件: src/views/walmart/walmartSponsoredAd/components/tabs/hourlyData/MultiDimensionChart/XMultiDimensionChart.vue 行号: 第 25 行 评论内容: 用一下组件库的xpChart 看看符不符合预期。 符合的话,换用xpchart。新增的一些依赖js就去掉
MR: !9502 文件: src/components/XpGrid/index.vue 行号: 第 870 行 评论内容: 快速排序后滚动到指定列walmart会出现错误的情况。比如orderKey=gapSales时。由于截取的是Sales与定义的column字段sales字段匹配不上。所以这样处理。此处是将匹配上的列显示
MR: !9502 文件: src/components/XpGrid/index.vue 行号: 第 1625 行 评论内容: 同上,此处是计算尺寸终点
MR: !9502 文件: src/components/XpGrid/index.vue 行号: 第 1831 行 评论内容: 此处将commit处理放在config.comparisonBind2Vuex条件下
MR: !9502 文件: src/components/XpGrid/index.vue 行号: 第 1828 行 评论内容: 数据对比关闭时,同步清除快速排序。

lillian yin (@lillian.yin.xnurta)

6 个讨论,涉及 5 个 MR

评论
MR: !17041 文件: apps/xnurta/src/api/analysisAgent/index.js 行号: 第 10 行 评论内容: Empty string is truthy in JavaScript ??
MR: !17005 文件: apps/ui-docs/tsconfig.json 行号: 第 8 行 评论内容: 已更新为strict: true
MR: !17005 文件: packages/ui-biz/src/components/chart/utils.ts 行号: 第 2 行 评论内容: 没必要改,调用者必须传入正确的颜色值
MR: !16786 文件: apps/xnurta/src/views/agent/components/analysis/inputBox/createInfoSelectVm.js 行号: 第 24 行 评论内容: 已修改
MR: !16758 文件: apps/xnurta/src/layout/main/components/Navbar.vue 行号: 第 378 行 评论内容: 权限只在登录初始化一次
MR: !16577 文件: apps/xnurta/src/api/analysisAgent/index.js 行号: 第 90 行 评论内容: pre测试用参数

Placeholder liam.ye (@liamye_placeholder_a3h98g1)

2 个讨论,涉及 2 个 MR

评论
MR: !12977 评论内容: 开放amc入口
MR: !12477 评论内容: @Samily.Wang

Placeholder lynn.gu (@lynngu_placeholder_uy3spy1)

1 个讨论,涉及 1 个 MR

评论
MR: !14457 评论内容: 1. 新首页需求:销售总览日周月聚合
2. 一些样式修正

rick ma (@rick.ma.xnurta)

1 个讨论,涉及 1 个 MR

评论
MR: !16671 文件: apps/xnurta/src/plugins/closePopperOnScroll.js 行号: 第 30 行 评论内容: fixed

jehan jia (@jehan.jia.xnurta)

1 个讨论,涉及 1 个 MR

评论
MR: !17053 评论内容: 我从master分支拉的代码啊、按理说不该有那么多的变更吧