| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223 |
- const ComponentPathMap = new Map();
- const ComponentNameMap = new Map();
- // 商品格式用到的
- var old_attr = '' // 每次当属性获得焦点时都会获取输入框内的值,保存于此
- var old_attr_value = '' // 每次当属性值获得焦点时都会获取输入框内的值,保存于此
- let first_column_rule = [] // 第一列使用相同的合并规则 (不能存在data中)
- new Vue({
- el: "#app",
- delimiters: ["[[", "]]"],
- data() {
- return {
- currentShowPage: null,
- pages: {},
- showComponentName: "",
- componentLoaded: false,
- http_url:httpUrl,
- // 防止快速点击保存
- saveStatus:true
- };
- },
- created() {
- this.fetchData(GetGoodsDataUrl).then((pageGroup) => {
- const pages = {};
- let loadedComponentCount = 0;
- let componentCount = 0;
- pageGroup.forEach((page) => {
- const childrens = [];
- page.column.forEach((columnItem) => {
- //* 把页面的组名和页面的名称组成一个路径
- let path = columnItem.group + "/" + columnItem.template_code;
- if (!ComponentPathMap.has(columnItem.page_path)) {
- //* 生成一个页面路径别名。如果其他页面也是同样的路径就会使用同样的别名,把别名和页面路径连在起义就是加载页面组件js文件的路径
- const pageAlias = "page" + ComponentPathMap.size;
- ComponentPathMap.set(columnItem.page_path, pageAlias);
- require.config({
- paths: {
- [pageAlias]: columnItem.page_path,
- },
- });
- }
- path = ComponentPathMap.get(columnItem.page_path) + "/" + path;
- const componentName = "Component" + Date.now() + Math.round(Math.random() * 1000); //* 生成组件名称
- ComponentNameMap.set(componentName, path);
- childrens.push({
- attr_hide:columnItem.attr_hide,
- title: columnItem.title,
- name: columnItem.template_code,
- path,
- componentName,
- data: columnItem.data,
- widget_key: columnItem.widget_key,
- group: page.group,
- });
- componentCount++; //* 每加载一个组件就会递增组件数量,用于判断是否组件是否加载完成
- this.loadComponent(componentName).then((res) => {
- loadedComponentCount++;
- //* 当所有组件文件加载完成才会显示页面,因为vue的ref需要组件加载完后才能获取
- if (loadedComponentCount === componentCount) {
- this.componentLoaded = true;
- }
- });
- });
- pages[page.group] = {
- key: page.group,
- title: page.title,
- childrens,
- };
-
- });
- this.pages = pages;
- this.currentShowPage = Object.keys(pages)[0];
- });
- },
- methods: {
- fetchData(URL, requestParams) {
- return new Promise((resolve, reject) => {
- this.$http
- .post(URL, requestParams)
- .then(function (response) {
- return response.json();
- })
- .then(({ result, data, msg }) => {
- if (result == 0) {
- this.$message({
- message: msg,
- type: "error",
- });
- reject({ result, data, msg });
- }
- resolve(data);
- })
- .catch((err) => {
- reject(err);
- });
- });
- },
- loadComponent(name) {
- let conponentPath = ComponentNameMap.get(name);
- if (!conponentPath) conponentPath = name;
- return new Promise((resolve, reject) => {
- const pageLoading = this.$loading({
- target: ".goods-page_main",
- text: "页面加载中",
- });
- require([conponentPath], (options) => {
- // 注册组件
- this.$options.components[name] = options;
- if (options && options.style) {
- const styleEl = document.createElement("style");
- styleEl.innerHTML = options.style;
- document.body.append(styleEl);
- }
- // 每个组件加载
- this.showComponentName = this.pages[Object.keys(this.pages)[0]]["childrens"][0]["componentName"];
- resolve(name, options);
- pageLoading.close();
- }, (err) => {
- pageLoading.close();
- reject(err);
- });
- });
- },
- filterData(data, keys = []) {
- let returnData = {};
- for (const key in data) {
- if (!keys.includes(key)) {
- returnData[key] = data[key];
- }
- }
- return returnData;
- },
- async save() {
- const submitData = {
- goods: {},
- widgets: {},
- };
- let extraSubmitData = {}
- let isPass = true;
- for (const key in this.pages) {
- const childrens = this.pages[key].childrens;
- for (const page of childrens) {
- const component = this.$refs[page.componentName][0];
- if (!component.validate) {
- throw new Error(page.title + " 子组件必须有validate方法");
- }
- //* 执行页面组件的validate方法,如果返回false不会发送数据给后端,否则会整合页面组件传过来的数据一并发送给后端
- const data = await component.validate();
- if (data === false) {
- isPass = false;
- // 循环组件逐一跳转校验失败的页面
- this.currentShowPage = page.group;
- this.showComponentName = page.componentName;
- console.log(page.componentName);
- console.log("表单验证不通过"); //TODO 后续去掉console log
- break;
- }
- //* 如果页面的widget_key等于goods就是商品的主要数据,否则其他都是插件的数据,放进widget里
- if (page.widget_key == "goods") {
- for (const propertyKey in data) {
- submitData["goods"][propertyKey] = data[propertyKey];
- }
- } else if (submitData["widgets"][page.widget_key]) {
- for (const propertyKey in data) {
- submitData["widgets"][page.widget_key][propertyKey] = data[propertyKey];
- }
- } else {
- submitData["widgets"][page.widget_key] = data;
- }
- // 获取额外的数据
- if (component.extraDate) {
- // throw new Error(page.title + " 子组件必须有extraDate方法");
- // 额外数据设置
- const extraDate = await component.extraDate();
- if(extraDate){
- extraSubmitData = {...extraSubmitData,...extraDate}
- }
- }
- }
- if (isPass === false) break;
- }
- if (isPass === false) return;
- console.log(submitData,{...extraSubmitData,...submitData});
- console.log(SaveGoodsDataUrl,"表单验证通过"); //TODO 后续去掉console log
- if(this.saveStatus){
- this.saveGoodsData(SaveGoodsDataUrl,submitData)
- }
- },
- saveGoodsData(url,submitData){
- this.saveStatus = false
- this.$http.post(url, submitData).then(response => {
- console.log(response,'response');
- if (response.data.result) {
- this.$message({type: 'success',message: '成功!'});
- window.location.href = GoodsList;
- } else{
- console.log(response.data.msg);
- this.$message({type: 'error',message: response.data.msg});
- }
- this.saveStatus = true
- }),function(res){
- console.log(res);
- };
- },
- chooseTab(subPageItem) {
- this.showComponentName = subPageItem.componentName;
- },
- },
- computed: {
- subPages() {
- if (!this.currentShowPage) return [];
- return this.pages[this.currentShowPage]["childrens"] || [];
- },
- },
- watch: {
- currentShowPage() {
- if (this.subPages.length > 0) {
- this.showComponentName = this.subPages[0]["componentName"];
- }
- },
- },
- });
|