refactor: 四端完成 Options API → script setup + vuex → pinia 迁移

- buyer(95) / seller(169) / im(53) / manager(280) 共 597 个组件全部从 Options API 转换为 <script setup>
- 四端 vuex 全部移除,状态管理统一迁移至 pinia 4(stores/ 目录)
- util.js 等基础设施去除 vm 首参依赖;全局属性($Message/$filters 等)在 script 内改为具名导入
- 被外部 ref 访问的公共组件均已补齐 defineExpose(清单见各端 MIGRATION-VUE3.md)
- 各端 eslint 启用 vue/component-api-style 防止新代码回退 Options API
- 四端 yarn build 全部通过;迁移约定与注意事项已更新至各端 MIGRATION-VUE3.md
This commit is contained in:
lifenlong
2026-10-13 07:06:59 +08:00
parent 870bacdd8c
commit 88fc1b0b2a
674 changed files with 71220 additions and 69943 deletions

View File

@@ -17,7 +17,7 @@
}
"
v-if="goodsFlag"
ref="goodsDialog"
ref="goodsDialogRef"
:selectedWay="goodsData"
/>
<linkDialog
@@ -36,68 +36,82 @@
</template>
</el-dialog>
</template>
<script>
<script setup>
import { ref } from "vue";
import goodsDialog from "./goods-dialog";
import linkDialog from "./link-dialog";
export default {
components: {
goodsDialog,
linkDialog,
},
data() {
return {
goodsFlag: false, // 是否商品选择器
goodsData: [], //选择的商品
linkData: "", //选择的链接
flag: false, // modal显隐
};
},
methods: {
clearGoodsSelected(){
this.goodsData = []
},
// 关闭弹窗
clickClose() {
this.flag = false;
this.goodsFlag = false;
this.$emit("closeFlag", false);
},
// 单选商品
singleGoods() {
var timer = setInterval(() => {
if (this.$refs.goodsDialog) {
this.$refs.goodsDialog.type = "single";
clearInterval(timer);
}
}, 100);
},
// 点击确认
clickOK() {
if (this.goodsFlag) {
this.$emit("selectedGoodsData", this.goodsData);
} else {
this.$emit("selectedLink", this.linkData);
}
this.clickClose();
},
// 打开组件方法
open(type, mutiple) {
this.flag = true;
if (type == "goods") {
this.goodsFlag = true;
if (mutiple) {
this.singleGoods();
}
} else {
this.goodsFlag = false;
}
},
// 关闭组件
close() {
this.flag = false;
},
},
};
const emit = defineEmits(["closeFlag", "selectedGoodsData", "selectedLink"]);
const goodsFlag = ref(false); // 是否商品选择器
const goodsData = ref([]); //选择的商品
const linkData = ref(""); //选择的链接
const flag = ref(false); // modal显隐
// 模板 ref:原 ref="goodsDialog" 与 import 的组件同名,改名避免互相覆盖
const goodsDialogRef = ref(null);
function clearGoodsSelected() {
goodsData.value = [];
}
// 关闭弹窗
function clickClose() {
flag.value = false;
goodsFlag.value = false;
emit("closeFlag", false);
}
// 单选商品
function singleGoods() {
var timer = setInterval(() => {
if (goodsDialogRef.value) {
goodsDialogRef.value.type = "single";
clearInterval(timer);
}
}, 100);
}
// 点击确认
function clickOK() {
if (goodsFlag.value) {
emit("selectedGoodsData", goodsData.value);
} else {
emit("selectedLink", linkData.value);
}
clickClose();
}
// 打开组件方法
function open(type, mutiple) {
flag.value = true;
if (type == "goods") {
goodsFlag.value = true;
if (mutiple) {
singleGoods();
}
} else {
goodsFlag.value = false;
}
}
// 关闭组件
function close() {
flag.value = false;
}
// 外部通过 ref 访问的成员(grep manager/src 全量确认):
// - open:page-decoration 各 modelList、modelForm/modelFormItem、hotzone/Zone、wap/advertising、alertAdvertising 等打开弹窗(goods/link)
// - singleGoods:modelList/forYour.vue、mixModel.vue 直接调用
// - clearGoodsSelected:wap/decorate.vue、modelList/goodsAndType.vue 调用
// - goodsData:modelList/newGoodsSort.vue、notEnough.vue 回写已选商品
// - goodsFlag:wap/decorate.vue 直接写入
// - flag:wap/decorate.vue 直接写入 true 打开弹窗
// - close:未被 grep 到外部调用,原 Options API 实例天然暴露,保守保留
defineExpose({
open,
close,
singleGoods,
clearGoodsSelected,
goodsData,
goodsFlag,
flag,
});
</script>
<style scoped lang="scss">
:deep(.el-dialog__body) {