Commit 3c7921fc authored by GuanHua's avatar GuanHua

feat: B端APP商城装修开发

parent 38ce8f02
...@@ -71,7 +71,7 @@ ...@@ -71,7 +71,7 @@
"core-js": "^3.6.5", "core-js": "^3.6.5",
"crypto-js": "^4.0.0", "crypto-js": "^4.0.0",
"god": "^0.2.9", "god": "^0.2.9",
"lingxi-design-ui": "^2.0.16", "lingxi-design-ui": "^2.0.19",
"lint-staged": "^10.0.7", "lint-staged": "^10.0.7",
"mobx": "^5.15.4", "mobx": "^5.15.4",
"mobx-react": "^6.2.2", "mobx-react": "^6.2.2",
......
import React from 'react'; import React, { useEffect } from 'react';
import { PageConfigType } from '@lingxi-disign/core'; import { PageConfigType } from '@lingxi-disign/core';
import { BrickDesign, useSelector } from '@lingxi-disign/react'; import { BrickDesign, useSelector } from '@lingxi-disign/react';
...@@ -10,8 +10,7 @@ interface DesignPanelPropsType { ...@@ -10,8 +10,7 @@ interface DesignPanelPropsType {
} }
const DesignPanel: React.FC<DesignPanelPropsType> = (props) => { const DesignPanel: React.FC<DesignPanelPropsType> = (props) => {
const { theme, pageName = 'index', onlyEidt } = props; const { pageConfig, theme, pageName = 'index', onlyEidt } = props;
const { pageConfig } = useSelector(['pageConfig']);
return <BrickDesign return <BrickDesign
pageName={pageName} pageName={pageName}
......
import React, { useEffect } from 'react';
import { PageConfigType } from '@lingxi-disign/core';
import { BrickDesign, useSelector } from '@lingxi-disign/react';
interface DesignPanelPropsType {
pageConfig?: PageConfigType,
theme: string,
onlyEidt?: boolean,
pageName?: string
}
const DesignPanel: React.FC<DesignPanelPropsType> = (props) => {
const { theme, pageName = 'index', onlyEidt } = props;
const { pageConfig } = useSelector(['pageConfig']);
useEffect(() => {
console.log(pageConfig, 'pageConfig')
}, [pageConfig])
return <BrickDesign
pageName={pageName}
initState={{ pageConfig }}
themeName={theme}
onlyEidt={onlyEidt}
/>;
};
export default DesignPanel;
import React from 'react'; import React from 'react';
import { PageConfigType } from '@lingxi-disign/core'; import { PageConfigType } from '@lingxi-disign/core';
// import MobileUIDemo from './mobileUIDemo' // import MobileUIDemo from './mobileUIDemo'
import DesignPanel from './DesignPanel'; import DesignPanel from './MobileDesign';
import DesignPreview from './DesignPreview'; import DesignPreview from './MobilePreview';
import styles from './index.less'; import styles from './index.less';
import { useSelector } from '@lingxi-disign/react'; import { useSelector } from '@lingxi-disign/react';
interface MobileDesignPanelPropsType { interface MobileDesignPanelPropsType {
......
import React from 'react';
import { PageConfigType } from '@lingxi-disign/core';
import { BrickPreview } from '@lingxi-disign/react';
interface DesignPanelPropsType {
pageConfig?: PageConfigType,
theme: string,
onlyEidt?: boolean,
pageName?: string
}
const DesignPanel: React.FC<DesignPanelPropsType> = (props) => {
const { pageConfig, theme, pageName = 'index', onlyEidt } = props;
return <BrickPreview
pageName={pageName}
initState={{ pageConfig }}
themeName={theme}
onlyEidt={onlyEidt}
/>;
};
export default DesignPanel;
...@@ -500,21 +500,39 @@ export const paramsBusiness = (templateId: number, pageConfig: PageConfigType) = ...@@ -500,21 +500,39 @@ export const paramsBusiness = (templateId: number, pageConfig: PageConfigType) =
const { propsConfig } = getComponentConfig(configItem.componentName) const { propsConfig } = getComponentConfig(configItem.componentName)
if (propsConfig.componentType) { if (propsConfig.componentType) {
let tempProps: any = undefined
switch (propsConfig.componentType.type) { switch (propsConfig.componentType.type) {
case PROPS_SETTING_TYPES.mobileHeaderNavAction: case PROPS_SETTING_TYPES.mobileHeaderNavAction:
_params.adornContent['headerNav'] = contactList(_params.adornContent['headerNav'], configItem.props?.data) _params.adornContent['headerNav'] = contactList(_params.adornContent['headerNav'], configItem.props?.data)
break break
case PROPS_SETTING_TYPES.bannerItems: case PROPS_SETTING_TYPES.bannerItems:
tempProps = configItem.props
_params.adornContent['banner'] = contactList(_params.adornContent['banner'], {
id: tempProps.id,
name: tempProps.name,
type: tempProps.type,
img: tempProps.img,
})
break
break break
case PROPS_SETTING_TYPES.mobileNavCardNavItem: case PROPS_SETTING_TYPES.mobileNavCardNavItem:
const data: any = configItem.props tempProps = configItem.props
_params.adornContent['navList'] = contactList(_params.adornContent['navList'], { _params.adornContent['navList'] = contactList(_params.adornContent['navList'], {
id: data.id, id: tempProps.id,
name: data.name, name: tempProps.name,
type: data.type, type: tempProps.type,
url: data.url, url: tempProps.url,
icon: data.icon, icon: tempProps.icon,
})
break
case PROPS_SETTING_TYPES.mobileShowCase:
tempProps = configItem.props
_params.adornContent['showCase'] = contactList(_params.adornContent['showCase'], {
idList: tempProps.idList || [],
name: tempProps.name,
type: tempProps.type,
banner: tempProps.banner,
inner: tempProps.inner,
}) })
break break
} }
......
import { ComponentSchemaType, PROPS_TYPES, PROPS_SETTING_TYPES } from '@lingxi-disign/core';
const ShowCaseBanner: ComponentSchemaType = {
propsConfig: {
children: {
label: '内容',
type: PROPS_TYPES.string,
},
styleType: {
label: "样式",
type: PROPS_TYPES.number,
},
},
};
const Item: ComponentSchemaType = {
fatherNodesRule: ['ShowCaseBanner.children'],
propsConfig: {
children: {
label: '内容',
type: PROPS_TYPES.string,
},
componentType: {
label: '内容',
type: PROPS_SETTING_TYPES.mobileShowCase,
},
},
};
export default {
ShowCaseBanner,
'ShowCaseBanner.Item': Item,
};
...@@ -25,6 +25,7 @@ import MobileQuality from './MobileQuality'; ...@@ -25,6 +25,7 @@ import MobileQuality from './MobileQuality';
import MobileQuickNav from './MobileQuickNav'; import MobileQuickNav from './MobileQuickNav';
import MobileRecommendShops from './MobileRecommendShops'; import MobileRecommendShops from './MobileRecommendShops';
import MobileShowCase from './MobileShowCase'; import MobileShowCase from './MobileShowCase';
import ShowCaseBanner from './ShowCaseBanner';
import Category from './Category'; import Category from './Category';
import PlatformQuickNav from './PlatformQuickNav'; import PlatformQuickNav from './PlatformQuickNav';
import PlatformAdvert from './PlatformAdvert'; import PlatformAdvert from './PlatformAdvert';
...@@ -78,6 +79,7 @@ export default { ...@@ -78,6 +79,7 @@ export default {
MobileQuickNav, MobileQuickNav,
MobileRecommendShops, MobileRecommendShops,
MobileShowCase, MobileShowCase,
...ShowCaseBanner,
Category, Category,
PlatformQuickNav, PlatformQuickNav,
PlatformAdvert, PlatformAdvert,
......
import React, { useEffect, useState } from 'react'; import React, { useEffect, useState } from 'react';
import { BrickProvider } from '@lingxi-disign/react'; import { BrickProvider } from '@lingxi-disign/react';
import { updatePageConfig } from '@lingxi-disign/core'
import { Prompt } from 'umi'; import { Prompt } from 'umi';
import { message } from 'antd'; import { message } from 'antd';
import { GlobalConfig } from '@/global/config'; import { GlobalConfig } from '@/global/config';
...@@ -322,6 +323,7 @@ const MallEdit: React.FC<MallEditPropsType> = (props) => { ...@@ -322,6 +323,7 @@ const MallEdit: React.FC<MallEditPropsType> = (props) => {
}; };
setComponentConfigs(config); setComponentConfigs(config);
setLoading(false); setLoading(false);
updatePageConfig(config)
}; };
return !loading ? ( return !loading ? (
...@@ -333,7 +335,7 @@ const MallEdit: React.FC<MallEditPropsType> = (props) => { ...@@ -333,7 +335,7 @@ const MallEdit: React.FC<MallEditPropsType> = (props) => {
> >
<Prompt message="你确定要离开么?" /> <Prompt message="你确定要离开么?" />
<div className={styles['wrapper']}> <div className={styles['wrapper']}>
<ToolBar /> <ToolBar templateId={id} />
<div className={styles['content']}> <div className={styles['content']}>
<div className={styles['canvas-container']}> <div className={styles['canvas-container']}>
<DesignPanel onlyEidt theme={theme} pageConfig={componentConfigs} /> <DesignPanel onlyEidt theme={theme} pageConfig={componentConfigs} />
......
...@@ -3,10 +3,7 @@ import { resolveMappingPageConfig } from '@lingxi-disign/react' ...@@ -3,10 +3,7 @@ import { resolveMappingPageConfig } from '@lingxi-disign/react'
import styleThemeImgDefault from './imgs/style_theme_default.png' import styleThemeImgDefault from './imgs/style_theme_default.png'
import styleThemeImgScience from './imgs/style_theme_science.png' import styleThemeImgScience from './imgs/style_theme_science.png'
import categoryNavTemplateDefault from './imgs/category_template_default.png' import categoryNavTemplateDefault from './imgs/category_template_default.png'
import showCaseTemplateDefault from './imgs/showcase_template_default.jpg'
import mineIcon from './imgs/mine_icon.png'
import orderIcon from './imgs/order_icon.png'
import kefuIcon from './imgs/kefu_icon.png'
export const defaultHeaderNavData = [ export const defaultHeaderNavData = [
{ {
...@@ -48,7 +45,7 @@ export const defaultConfig: PageConfigType = { ...@@ -48,7 +45,7 @@ export const defaultConfig: PageConfigType = {
position: 'relative', position: 'relative',
}, },
}, },
childNodes: ['1', '3', '5'] childNodes: ['1', '3', '5', '7']
}, },
'1': { '1': {
title: '头部导航栏', title: '头部导航栏',
...@@ -87,18 +84,22 @@ export const defaultConfig: PageConfigType = { ...@@ -87,18 +84,22 @@ export const defaultConfig: PageConfigType = {
margin: '8px', margin: '8px',
}, },
}, },
childNodes: [], childNodes: ['4'],
childComponentName: 'Banner.Items', childComponentName: 'Banner.Items',
addBtnText: '添加广告', addBtnText: '添加广告',
}, },
// '4': { '4': {
// loop: '${navList}', loop: '${banner}',
// title: '广告图', title: '${item.name}',
// componentName: 'Banner.Items', componentName: 'Banner.Items',
// props: { props: {
id: '${item.name}',
// }, type: '${item.type}',
// }, img: '${item.img}',
name: '${item.name}',
isNull: false,
},
},
'5': { '5': {
title: '分类导航', title: '分类导航',
componentName: 'MobileNavCard', componentName: 'MobileNavCard',
...@@ -132,6 +133,35 @@ export const defaultConfig: PageConfigType = { ...@@ -132,6 +133,35 @@ export const defaultConfig: PageConfigType = {
empty: false, empty: false,
}, },
}, },
'7': {
title: '橱窗广告',
componentName: 'ShowCaseBanner',
childComponentName: 'ShowCaseBanner.Item',
props: {
stylesthemelist: [
{
key: 0,
width: 152,
height: 105,
img: showCaseTemplateDefault,
},
]
},
addBtnText: '添加橱窗',
childNodes: ['8'],
},
'8': {
loop: '${showCase}',
title: '${item.name}',
componentName: 'ShowCaseBanner.Item',
props: {
name: '${item.name}',
banner: '${item.banner}',
inner: '${item.inner}',
type: '${item.type}',
idList: '${item.idList}',
},
},
} }
// const allState = { headerNav: defaultHeaderNavData } // const allState = { headerNav: defaultHeaderNavData }
......
...@@ -202,8 +202,10 @@ const appMallEdit: React.FC<ShopPreviewPropsType> = (props) => { ...@@ -202,8 +202,10 @@ const appMallEdit: React.FC<ShopPreviewPropsType> = (props) => {
const appConfig: any = await getAppEnterpriseConfig(); const appConfig: any = await getAppEnterpriseConfig();
const allState = { const allState = {
headerNav: appConfig?.headerNav ? appConfig.headerNav : defaultHeaderNavData, headerNav: appConfig?.headerNav ? appConfig.headerNav : defaultHeaderNavData,
banner: appConfig?.banner ? appConfig?.banner : [],
categoryList: await getFirstCategoryList(), categoryList: await getFirstCategoryList(),
navList: appConfig?.navList ? appConfig?.navList : [] navList: appConfig?.navList ? appConfig?.navList : [],
showCase: appConfig?.showCase ? appConfig?.showCase : [],
} }
const finalConfig = resolveMappingPageConfig(defaultConfig, allState) const finalConfig = resolveMappingPageConfig(defaultConfig, allState)
console.log(finalConfig, 'finalConfig') console.log(finalConfig, 'finalConfig')
......
@import "../../../../../../global//styles/utils.less";
@import "../../common.less"; @import "../../common.less";
.selectBtn { .banner {
display: block; &-box {
width: 100%; margin-bottom: 16px;
background-color: #FAFBFC;
border: 1px dashed #D8DDE6;
}
.uploadPreview { :global {
border: 1px solid #EBECF0; .ant-upload {
} width: 100%;
}
}
&-label {
font-size: 12px;
color: #91959B;
margin-bottom: 8px;
}
&-icon {
height: 96px;
background-color: #FAFBFC;
border-radius: 4px;
display: flex;
align-items: center;
justify-content: center;
position: relative;
overflow: hidden;
&>img {
width: 100%;
}
&-add {
width: 24px;
height: 24px;
}
&:hover {
.banner-box-icon-cover {
display: block;
}
}
&-cover {
position: absolute;
height: 100%;
width: 100%;
background-color: rgba(0, 0, 0, .1);
display: none;
z-index: 1;
&-delete {
position: absolute;
right: 10px;
top: 10px;
font-size: 20px;
color: #fff;
}
&-bottom {
position: absolute;
height: 24px;
line-height: 24px;
text-align: center;
background-color: rgba(0, 0, 0, 0.24);
font-size: 12px;
color: #fff;
width: 100%;
bottom: 0;
left: 0;
}
}
}
}
&-record {
&-shop {
height: 56px;
border: 1px solid #EDEEEF;
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
padding: 0 8px;
img {
width: 40px;
height: 40px;
margin-right: 8px;
}
span {
flex: 1;
color: #303133;
font-size: 12px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
&-integral {
height: 56px;
border: 1px solid #EDEEEF;
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
padding: 0 8px;
img {
width: 40px;
height: 40px;
margin-right: 8px;
}
&-right {
flex: 1;
display: flex;
flex-direction: column;
&-top {
flex: 1;
color: #303133;
font-size: 12px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
&-bottom {
flex: 1;
color: #EA8000;
font-size: 12px;
}
}
}
&-activity {
height: 56px;
border: 1px solid #EDEEEF;
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
padding: 0 8px;
position: relative;
img {
width: 40px;
height: 40px;
border-radius: 4px;
margin-right: 8px;
}
&-right {
flex: 1;
display: flex;
flex-direction: column;
font-size: 12px;
&-top {
flex: 1;
color: #303133;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
&-bottom {
flex: 1;
color: #91959B;
}
}
&-tag{
position: absolute;
right: 0;
top: -3px;
}
}
}
}
/* eslint-disable no-case-declarations */ /* eslint-disable no-case-declarations */
import React, { useEffect, useState } from 'react'; import React, { useEffect, useState } from 'react';
import { BrickProvider } from '@lingxi-disign/react'; import { BrickProvider } from '@lingxi-disign/react';
import { PROPS_SETTING_TYPES } from '@lingxi-disign/core'; import { PROPS_SETTING_TYPES, updatePageConfig } from '@lingxi-disign/core';
import { Prompt } from 'umi'; import { Prompt } from 'umi';
import { message } from 'antd'; import { message } from 'antd';
import { GlobalConfig } from '@/global/config'; import { GlobalConfig } from '@/global/config';
...@@ -701,6 +701,8 @@ const getInformationByIds = (idList: number[]) => { ...@@ -701,6 +701,8 @@ const getInformationByIds = (idList: number[]) => {
setComponentConfigs(config); setComponentConfigs(config);
setLoading(false); setLoading(false);
updatePageConfig(config)
} }
}; };
...@@ -718,7 +720,7 @@ const getInformationByIds = (idList: number[]) => { ...@@ -718,7 +720,7 @@ const getInformationByIds = (idList: number[]) => {
</div> </div>
<div className={styles['content']}> <div className={styles['content']}>
<div className={styles['canvas-container']}> <div className={styles['canvas-container']}>
<DesignPanel onlyEidt theme={theme} pageConfig={componentConfigs} /> <DesignPanel onlyEidt theme={theme} />
</div> </div>
</div> </div>
</div> </div>
......
declare module '*.css'; declare module '*.css';
declare module '*.less'; declare module '*.less';
declare module "*.png"; declare module "*.png";
declare module "*.jpg";
declare module '*.svg' { declare module '*.svg' {
export function ReactComponent(props: React.SVGProps<SVGSVGElement>): React.ReactElement export function ReactComponent(props: React.SVGProps<SVGSVGElement>): React.ReactElement
const url: string const url: string
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment