Commit 66cafb79 by wusiyi

feat: 帮助页内容新增

parent 23a91a5c
......@@ -1464,7 +1464,7 @@ ul li {
/* 菜单主题色 */
.el-menu {
background-color: var(--el-color-primary-light-9) !important;
background-color: #fff !important;
}
/* 评分主题色 */
......
<template>
<div
class="header bg-white sticky shadow-sm"
:class="{ shadow: !$route.path.includes('help') }"
class="header bg-white sticky"
:class="{ 'shadow-sm': !$route.path.includes('help') }"
ref="header">
<headHelper v-if="$route.path.includes('help')" />
<headerNavMobile v-else-if="$isMobile" :userInfo="userInfo" />
......
......@@ -93,10 +93,11 @@ const routes = [
require(['../views/help/pages/index.vue'], resolve),
},
{
path: 'beginner',
name: 'HelpBeginner',
path: 'picTutorial/:id',
name: 'PicTutorial',
component: (resolve) =>
require(['../views/help/pages/Beginner/beginner.vue'], resolve),
require(['../views/help/components/picTutorial.vue'], resolve),
props: true,
},
{
path: 'artical1',
......
<template>
<div>
<el-submenu
v-if="menuItem.children && menuItem.children.length > 0"
:index="String(menuItem.id)">
<template slot="title">
<span>{{ menuItem.name }}</span>
</template>
<menu-item
v-for="child in menuItem.children"
:key="child.id"
:menu-item="child" />
</el-submenu>
<el-menu-item
v-else
:index="
menuItem.url
? '/help/' + menuItem.path + '/' + menuItem.url
: '/help/' + menuItem.path
"
@click="handleMenuItemClick">
<span>{{ menuItem.name }}</span>
</el-menu-item>
</div>
</template>
<script>
import { menuList } from '../menuConfig'
export default {
name: 'MenuItem',
props: {
menuItem: {
type: Object,
required: true,
},
},
methods: {
handleMenuItemClick() {
if (this.menuItem.link) {
this.$router.push({
path: `/help/${this.menuItem.path}/${this.menuItem.url}`,
query: { url: this.menuItem.link },
})
}
const id = [...String(this.menuItem.id)].map(Number)
const result = []
let fullPath = ''
let current = menuList
id.forEach((index, i) => {
current = current?.[index - 1] || current?.children?.[index - 1]
if (i === id.length - 1 && current.url) {
fullPath = current.url
}
result.push({ name: current.name, path: fullPath || 'index' })
})
this.$store.dispatch('path/setCurrentPathNames', result)
},
},
}
</script>
<template>
<div>
<el-breadcrumb separator-class="el-icon-arrow-right">
<el-breadcrumb-item
v-for="(item, index) in breadList"
:key="item.path"
@click.native="handleBreadClick(index)">
<a href="javascript:void(0)">{{ item.name }}</a>
<el-breadcrumb-item v-for="(item, index) in breadList" :key="item.id">
<a
v-if="index === 0"
href="javascript:void(0)"
@click="handleBreadClick(index)"
:class="{ 'breadcrumb-clickable': true }">
{{ item.name }}
</a>
<span v-else class="breadcrumb-disabled">{{ item.name }}</span>
</el-breadcrumb-item>
</el-breadcrumb>
</div>
......@@ -15,7 +19,6 @@ export default {
name: 'Bread',
computed: {
breadList() {
// currentPathNames 已经包含了帮助中心作为第一项
return this.$store.getters['path/currentPathNames'] || []
},
},
......@@ -27,9 +30,31 @@ export default {
const clickedItem = currentPathNames[index]
const newPathNames = currentPathNames.slice(0, index + 1)
this.$store.dispatch('path/setCurrentPathNames', newPathNames)
// 如果是帮助中心,跳转到 /help/index
if (index === 0) {
this.$router.push('/help/index')
} else {
this.$router.push(`/help/${clickedItem.path}`)
}
}
},
},
}
</script>
<style scoped>
.breadcrumb-clickable {
color: var(--primary-color);
cursor: pointer;
text-decoration: none;
}
.breadcrumb-clickable:hover {
color: var(--el-color-primary-light-4);
}
.breadcrumb-disabled {
color: #606266;
cursor: default;
}
</style>
......@@ -92,15 +92,13 @@ export default {
this.$router.push(content.url)
},
goToMore(tab) {
const breadcrumbPath = [
{ name: '帮助中心', path: 'index' },
{ name: tab.title, path: tab.url },
]
this.$store.dispatch('path/setCurrentPathNames', breadcrumbPath)
this.$router.push(`/help/${tab.url}`)
goToMore() {
// const breadcrumbPath = [
// { name: '帮助中心', path: 'index' },
// { name: tab.title, path: tab.url },
// ]
// this.$store.dispatch('path/setCurrentPathNames', breadcrumbPath)
// this.$router.push(`/help/${tab.url}`)
},
},
}
......
<template>
<div style="height: 80vh">
<iframe :key="link" class="w-full h-full" frameborder="0" :src="link" />
</div>
</template>
<script>
import { FEISHU_BASE_URL } from '../menuConfig.js'
export default {
name: 'PicTutorial',
props: {
id: {
type: [String, Number],
required: true,
},
},
data() {
return {
isLoading: true,
}
},
computed: {
link() {
const anchor = this.$route.query.url || ''
if (!anchor) return ''
if (this.$route.name === 'PicTutorial') {
return FEISHU_BASE_URL + anchor
}
return ''
},
},
watch: {},
methods: {},
}
</script>
<style scoped></style>
<template>
<div>
<div class="top flex flex-col items-center py-16">
<div
v-if="$route.path === '/help/index'"
class="top flex flex-col items-center py-6">
<div class="text-gray-700 text-4xl font-bold">帮助中心</div>
<el-input
v-model="keyword"
......@@ -13,7 +15,8 @@
<div class="content p-5">
<sideNav />
<div
class="right-content w-full h-full p-5"
class="right-content w-full p-5"
style="height: 90vh"
:class="{ 'rounded-md bg-white': $route.path !== '/help/index' }">
<Bread v-if="$route.path !== '/help/index'" />
<router-view></router-view>
......
// 飞书文档基础 URL
const FEISHU_BASE_URL =
'https://rcntf4nac0ma.feishu.cn/wiki/OJcBwBJTLi4L0ekvFIPcrHQDnNh'
export const menuList = [
{
id: 1,
path: 'beginner',
name: '入门必看',
children: [
{
id: 11,
path: '',
name: '新手入门',
children: [
{
id: 111,
path: 'artical1',
name: '九猫erp是什么',
},
{
id: 112,
path: 'artical2',
name: '如何使用九猫erp',
},
],
},
],
},
{
id: 2,
path: '',
name: '图文教程',
children: [
{
id: 21,
path: '',
name: '基础数据维护',
children: [
{
id: 211,
path: '',
name: '管理员账号',
children: [
{
id: 2111,
path: 'picTutorial',
url: '2111',
name: '组织架构',
link: '#Om4CdLEcyoyx9MxepHOcgbYlnKC',
},
{
id: 2112,
path: 'picTutorial',
url: '2112',
name: '部门职员',
link: '#MGfGdrLr8oliLYxwb5TcqDaTnlh',
},
{
id: 2113,
path: 'picTutorial',
url: '2113',
name: '功能角色管理',
link: '#TMkTdP27Qo2gpAxLJUDcDJhonAR',
},
{
id: 2114,
path: 'picTutorial',
url: '2114',
name: '数据角色管理',
link: '#ThbNdfNIzox0fyxajRfcS6AnnKe',
},
{
id: 2115,
path: 'picTutorial',
url: '2115',
name: '系统用户',
link: '#Tuyhd5k4BoDhHUx5WJDcgaWbnZg',
},
],
},
{
id: 212,
path: '',
name: '物流信息维护',
children: [
{
id: 2121,
path: 'picTutorial',
url: '2121',
name: '物流公司',
link: '#RIUCdmRL9oLWqcxgrlKc0Y47nOd',
},
{
id: 2122,
path: 'picTutorial',
url: '2122',
name: '物流方式',
link: '#Dhw0drlWzohbz1xFGoqcQysenyf',
},
{
id: 2123,
path: 'picTutorial',
url: '2123',
name: '新申报规则',
link: '#FRqxdhzaFooCMwxiBKOcPQsynZg',
},
{
id: 2124,
path: 'picTutorial',
url: '2124',
name: '地址管理',
link: '#FwM9dGBk1ozQKixmSDccsyJBnjc',
},
],
},
{
id: 213,
path: 'picTutorial',
url: '213',
name: '供应商信息维护',
link: 'CEqQdUx6sokmq7xYlBAcrz41n1S',
},
{
id: 214,
path: '',
name: '仓库信息维护',
children: [
{
id: 2141,
path: 'picTutorial',
url: '2141',
name: '仓库管理',
link: '#A6sbdOWqLokpDkxkWtKcWJmcnpf',
},
{
id: 2142,
path: 'picTutorial',
url: '2142',
name: '区域管理',
link: '#OQ9vdrt9ToCGXhxnDvJcc9lKnlz',
},
{
id: 2143,
path: 'picTutorial',
url: '2143',
name: '仓库库位',
link: '#MxL7dqr0uopsCixOxGNcK6xTn9b',
},
],
},
],
},
{
id: 22,
path: '',
name: '店铺接入',
children: [
{
id: 221,
path: '',
name: '独立站',
children: [
{
id: 2211,
path: 'picTutorial',
url: '2211',
name: 'Shopify',
link: '#QlcSdlc5roB35dxMNQMcWDZ2nZd',
},
{
id: 2212,
path: 'picTutorial',
url: '2212',
name: 'SHOPLINE',
link: '#E2wcd7c0ho6iBrxSXfZcSBa5nAd',
},
{
id: 2213,
path: 'picTutorial',
url: '2213',
name: 'Shoplazza(店匠)',
link: '#KNRZdQuAooIK8Fx4kKScZxagnve',
},
],
},
{
id: 222,
path: '',
name: '平台',
children: [
{
id: 2221,
path: 'picTutorial',
url: '2221',
name: 'AliExpress(速卖通)',
link: '#COBCdPZnloZEL2xRbNAcV9fhnhm',
},
{
id: 2222,
path: 'picTutorial',
url: '2222',
name: 'Amazon',
link: '#PFNmdECJJowdHjxgGRrcfZQwnQh',
},
{
id: 2223,
path: 'picTutorial',
url: '2223',
name: 'temu',
link: '#VYJHdfhvjouc3kx93GmcGQCQnwc',
},
{
id: 2224,
path: 'picTutorial',
url: '2224',
name: 'eBay',
link: '#G6cxdKEANoCsFKx40G8cKRk5n0e',
},
{
id: 2225,
path: 'picTutorial',
url: '2225',
name: 'tiktokshop',
link: '#B5XCdGTeFo3MH3xOiGQcOMmXnib',
},
{
id: 2226,
path: 'picTutorial',
url: '2226',
name: '1688',
link: '#UwwAd32MIohqDzxmwUSc2jwDnAc',
},
{
id: 2227,
path: 'picTutorial',
url: '2227',
name: 'Shein',
link: '#ITCCdiML0oaBjDxYwyfc7L2jn3b',
},
],
},
{
id: 223,
path: '',
name: '自定义店铺',
link: '#CWk4dm0Prow2OxxReMdcCDI1nbd',
},
],
},
{
id: 23,
path: '',
name: '商品上品',
children: [
{
id: 231,
path: '',
name: '商品类型以及新增',
children: [
{
id: 2311,
path: 'picTutorial',
url: '2311',
name: '普通商品',
link: '#ScqwdT1vwoxzXkxlB7vcga4Ynie',
},
{
id: 2312,
path: 'picTutorial',
url: '2312',
name: '局部印',
link: '#GHnBdVMFKogfAWxAScFc4Y7BnVd',
},
{
id: 2313,
path: 'picTutorial',
url: '2313',
name: '一件定制(USA,满印,SDS,HCM)',
link: '#KJlVd3r3Jop7wJxb5QWcpTGsn1d',
},
{
id: 2314,
path: 'picTutorial',
url: '2314',
name: '组合产品',
link: '#C1QXdjn9LocZT3xvCLGcn0VOndh',
},
{
id: 2315,
path: 'picTutorial',
url: '2315',
name: '打包产品',
link: '#GGBMdtNmXocSrqxkRJ2cfy9vnSh',
},
{
id: 2316,
path: 'picTutorial',
url: '2316',
name: '虚拟产品',
link: '#TJ5tdIaudopdEOxVU0bcXRJ7nVe',
},
{
id: 2317,
path: 'picTutorial',
url: '2317',
name: '美国本土胚衣',
link: '#VoDSdFMk6oaiEJxTCSgcnWqOnRh',
},
],
},
{
id: 232,
path: '',
name: '导入店铺和维护',
children: [
{
id: 2321,
path: 'picTutorial',
name: '定制商品',
url: '#O8Nnd0SFcoRyZ1xt414csIXYn9e',
},
{
id: 2322,
path: 'picTutorial',
name: '普通商品',
url: '#JarHdL9klonIGUxVB5zcKFeYnCh',
},
],
},
],
},
{
id: 24,
path: '',
name: '订单以及生产流程',
children: [
{
id: 241,
path: '',
name: '普通商品',
link: '#OO66dfpU6oHAI0x65fKcUaJcnle',
},
{
id: 242,
path: '',
name: '局部印',
link: '#BMQId46P8oCcOdxiDQjc1QUXncg',
},
{
id: 243,
path: '',
name: '一件定制(满印,SDS,HCM)',
link: '#UONWdMJAaoGFjDx7uogcWSLjnIc',
},
{
id: 244,
path: '',
name: 'USA',
link: '#PtCadbFAsoNHnfxkHZhcqB0CnDf',
},
{
id: 245,
path: '',
name: '异常单处理',
children: [
{
id: 2451,
path: 'picTutorial',
url: '2451',
name: 'Variant异常单',
link: '#Q9GOdMni2o11gExfESocaw9Onvd',
},
{
id: 2452,
path: 'picTutorial',
url: '2452',
name: '定制单',
link: '#A9Hjd1QdgoKXIgxBHJYcwfY5nQf',
},
{
id: 2453,
path: 'picTutorial',
url: '2453',
name: 'Base异常单',
link: '#BpkldNihKoyQ2MxjdRMcSEZhn7C',
},
],
},
{
id: 246,
path: '',
name: '采购生产流程',
children: [
{
id: 2461,
path: 'picTutorial',
url: '2461',
name: '采购',
link: '#Wl19dzLxWop3jQxyfk8cc8DUnUb',
},
{
id: 2462,
path: 'picTutorial',
url: '2462',
name: '生产',
link: '#ESbndzzlSokoyMxkA3kcIk9qnUg',
},
],
},
],
},
{
id: 25,
path: '',
name: '美国生产派单流程',
children: [
{
id: 251,
path: '',
name: 'MDIU派单',
children: [
{
id: 2511,
path: 'picTutorial',
url: '2511',
name: '自有物流派单(支持独立站平台)',
link: '#UtrxdlCO0oiRoqx5WvBc6Sn2nRf',
},
{
id: 2512,
path: 'picTutorial',
url: '2512',
name: '工厂物流(支持全部平台,temu除外)',
link: '#QquxdkbpzoBIasxC6PLcfqA3n2b',
},
{
id: 2513,
path: 'picTutorial',
url: '2513',
name: 'TEMU半托管POD在线下单(TEMU)',
link: '#H1QndzgGDo5Gf1xyF0aciNyGnxe',
},
{
id: 2514,
path: 'picTutorial',
url: '2514',
name: 'TIKTOK shipping下单(TIKTOK)',
link: '#MNJGdR2THogwNJx4Wkkc0TICnzb',
},
],
},
],
},
{
id: 26,
path: '',
name: 'FBA',
children: [
{
id: 261,
path: '',
name: '发货计划',
link: '#HLbZdAx5VoJ5RlxLTVsc4F4cnJb',
},
],
},
{
id: 27,
path: '',
name: '营销',
children: [
{
id: 271,
path: '',
name: '客户管理',
children: [
{
id: 2711,
path: 'picTutorial',
url: '2711',
name: '用户画像',
link: '#Fpz0d41q8oNDMjxBxF5cDqzfnxn',
},
{
id: 2712,
path: 'picTutorial',
url: '2712',
name: '客户管理',
link: '#APSLd1LJnoqwrQxF0micEKC8ngc',
},
{
id: 2713,
path: 'picTutorial',
url: '2713',
name: '邮件模板',
link: '#VykndXqBoosFz2xQauDcDM6Znbh',
},
],
},
{
id: 272,
path: '',
name: '获取花费',
children: [
{
id: 2721,
path: 'picTutorial',
url: '2721',
name: 'FACEBOOK',
link: '#O45DdX7AeoSGbjxEKEKcwYucnGe',
},
{
id: 2722,
path: 'picTutorial',
url: '2722',
name: 'GOOGLE',
link: '#ZwDldAP4JopUYWxQGH6cuwP2nPp',
},
{
id: 2723,
path: 'picTutorial',
url: '2723',
name: 'TIKTOK',
link: '#TkrTdeVMkoCbvJxKojNcE3XonYd',
},
{
id: 2724,
path: 'picTutorial',
url: '2724',
name: '网红营销',
link: '#PCj3dR2spocJ2yxpmgncaSZGnMd',
},
{
id: 2725,
path: 'picTutorial',
url: '2725',
name: '其他费用营销',
link: '#R70sdLxtOojtl3xUApUcTJgRnsh',
},
],
},
],
},
{
id: 28,
path: '',
name: '财务',
children: [
{
id: 281,
path: '',
name: '财务管理',
children: [
{
id: 2811,
path: 'picTutorial',
url: '2811',
name: '退款',
link: '#GyOwdYUdeo5jCPxX3MbcUCQNnSf',
},
{
id: 2812,
path: 'picTutorial',
url: '2812',
name: '报销',
link: '#BWJkdK2IzoizAxxnh7TcSIoqnog',
},
{
id: 2813,
path: 'picTutorial',
url: '2813',
name: '工资管理',
link: '#FS1GdgQQ3oCUWfxNeWdcY99ZnRd',
},
],
},
{
id: 282,
path: '',
name: '对账',
children: [
{
id: 2821,
path: 'picTutorial',
url: '2821',
name: '生产对账',
link: '#Vo7VdueOZoApcTxEZuScQzkxnrc',
},
{
id: 2822,
path: 'picTutorial',
url: '2822',
name: '物流对账',
link: '#S66pdOu1DoRFZbxJogec9CJWned',
},
{
id: 2823,
path: 'picTutorial',
url: '2823',
name: '广告对账',
link: '#JptcdpT1moAFKBxNJNOcOj6BnQc',
},
{
id: 2824,
path: 'picTutorial',
url: '2824',
name: '其他营销对账',
link: '#NYKCd9R5lo65QrxlRiKcu902nMc',
},
{
id: 2825,
path: 'picTutorial',
url: '2825',
name: 'POD(cn)对账',
link: '#O4WPdKTaAodCz1xkoxZckOb4nYe',
},
{
id: 2826,
path: 'picTutorial',
url: '2826',
name: '满印对账',
link: '#OnINdMHMVoKCzsxa6sacEt8gn6c',
},
],
},
],
},
{
id: 29,
path: '',
name: '报表',
children: [
{
id: 291,
path: '',
name: '订单报表',
children: [
{
id: 2911,
path: 'picTutorial',
url: '2911',
name: '扣费明细',
link: '#ElstdqNUIoYhLCx6ePgcKPennMc',
},
],
},
],
},
],
},
// { id: 3, path: 'video', name: '视频教程' },
// { id: 4, path: 'problem', name: '常见问题' },
// { id: 5, path: 'contact', name: '联系我们' },
]
// 导出基础 URL,供组件使用
export { FEISHU_BASE_URL }
<template>
<div class="w-full h-full bg-white rounded-md">
<div class="text-xl font-bold my-10">{{ title }}</div>
<div class="content">
<a
v-for="(t, index) in titles"
:key="t"
class="content-title text-gray-600 ml-8 block mb-3 pb-3 border-b border-gray-200"
@click="goArtical(t, index)"
:href="`/help/artical${index + 1}`">
{{ t }}
</a>
</div>
</div>
</template>
<script>
export default {
components: {},
data() {
return {
title: '',
titles: [],
}
},
created() {
const currentPathNames = this.$store.getters['path/currentPathNames']
this.title = currentPathNames[currentPathNames.length - 1].name
try {
const ctx = require.context('./', false, /\.vue$/)
ctx.keys().forEach((key) => {
if (/beginner\.vue$/i.test(key)) return
const mod = ctx(key)
const comp = mod && (mod.default || mod)
if (comp && typeof comp.data === 'function') {
const dataObj = comp.data.call({}) || {}
if (dataObj.title) {
this.titles.push(dataObj.title)
}
}
})
} catch (e) {
// ignore
}
},
methods: {
goArtical(title, index) {
// 调用 vuex action 添加文章路径
this.$store.dispatch('path/addArticlePath', { title, index })
},
},
}
</script>
<style scoped lang="scss">
.content-title {
position: relative;
transition: all 0.2s ease;
&::before {
content: '';
display: block;
width: 6px;
height: 6px;
border-radius: 50%;
position: absolute;
left: -23px;
top: 10px;
background-color: var(--primary-color);
box-shadow: 0 0 0 5px #e6c07977;
}
&:hover {
color: var(--primary-color);
}
}
</style>
<template>
<div class="side-nav mr-5 rounded-md">
<div class="side-nav mr-5 rounded-md overflow-scroll">
<el-input
class="mt-3 ml-5 w-4/5 mb-5"
v-model="searchKeyword"
placeholder="在目录中搜索..."></el-input>
<el-menu
@select="handleSelect"
:key="menuKey"
router
:unique-opened="true"
:default-active="activeMenu">
<span v-for="item in menuList" :key="item.path">
<el-submenu
v-if="item.children && item.children.length > 0"
:index="item.path">
<template slot="title">
<span>{{ item.name }}</span>
</template>
<el-menu-item
v-for="child in item.children"
:key="child.path"
:index="child.path">
<span>{{ child.name }}</span>
</el-menu-item>
</el-submenu>
<el-menu-item v-else :key="item.path" :index="item.path">
<span>{{ item.name }}</span>
</el-menu-item>
</span>
:default-active="$route.path"
:default-openeds="openedMenus">
<menu-item v-for="item in menuList" :key="item.id" :menu-item="item" />
</el-menu>
</div>
</template>
<script>
import MenuItem from './components/MenuItem.vue'
import { menuList } from './menuConfig.js'
export default {
name: 'sideNav',
components: {
MenuItem,
},
data() {
return {
searchKeyword: '',
activeMenu: '',
menuList: [
{
id: 1,
path: 'mustSee',
name: '入门必看',
children: [{ id: 11, path: 'beginner', name: '新手入门' }],
},
{
id: 2,
path: 'pic',
name: '图文教程',
children: [{ id: 21, path: 'base', name: '基础数据维护' }],
},
{ id: 3, path: 'video', name: '视频教程' },
// { id: 4, path: 'problem', name: '常见问题' },
// { id: 5, path: 'contact', name: '联系我们' },
],
menuList,
menuKey: 0,
}
},
mounted() {
this.syncMenuWithRoute()
},
watch: {
$route() {
this.syncMenuWithRoute()
},
'$route.path'() {
this.$nextTick(() => {
this.menuKey += 1
})
},
methods: {
syncMenuWithRoute() {
const path = this.$route && this.$route.path ? this.$route.path : ''
const match = path.match(/^\/help\/([^/]+)/)
const currentKey = match ? match[1] : ''
this.activeMenu = currentKey
},
handleSelect(key, keyPath) {
if (key === this.activeMenu) return
const names = []
for (const item of this.menuList) {
if (item.path === keyPath[0]) {
names.push({ name: item.name, path: item.path })
if (keyPath[1] && Array.isArray(item.children)) {
for (const child of item.children) {
if (child.path === keyPath[1]) {
names.push({ name: child.name, path: child.path })
break
}
}
}
break
}
}
// 使用 vuex 保存路径名称
this.$store.dispatch('path/setCurrentPathNames', names)
const target = keyPath[1] || keyPath[0]
this.$router.push(`/help/${target}`)
computed: {
// 需要展开的父级菜单
openedMenus() {
const id = this.$route.path.split('/').pop()
const result = Array.from(id).map((_, i) => id.slice(0, i + 1))
return result
},
},
}
......@@ -102,8 +50,8 @@ export default {
<style scoped lang="scss">
.side-nav {
background-color: #ffffff;
height: 100%;
width: 13%;
height: 90vh;
width: 15%;
}
::v-deep .el-input--mini .el-input__inner {
background-color: var(--background-color);
......
......@@ -413,7 +413,7 @@
<!-- 九猫物流 -->
<div
v-else-if="activeTab === 'logistics'"
class="flex items-center justify-center bg-white lg:p-10 py-5 lg:w-3/5 w-full">
class="flex items-center justify-center bg-white lg:p-10 py-5 lg:w-3/5 w-full m-auto">
<img
class="erp-image"
src="../../assets/images/product/logistic/01.png"
......
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