Commit 1bd26ba0 authored by GuanHua's avatar GuanHua

feat: 渠道能力文案抽取

parent 2b3c0332
......@@ -5,19 +5,22 @@
/** button */
'common.button.save': '保存',
'common.button.add': '新建',
'common.button.modify': '修改',
'common.button.yes': '是',
'common.button.no': '否',
'common.button.delete': '删除',
'common.button.back': '返回',
'common.button.preview': '预览',
'common.button.view.details': '查看详情',
'common.button.query': '查询',
'common.button.reset': '重置',
/** tips */
'common.tip.save.confirm': '您还有未保存的内容,是否确定要离开?',
'common.tip.option.confirm': '确定要执行这个操作?',
/** tabel */
'common.tabel.action': "操作",
/** table */
'common.table.action': "操作",
/** status */
'common.status.effective': '有效',
......@@ -27,5 +30,9 @@
'common.unit.individual.chinese': '个汉字',
/** text */
'common.text.longest': '最长'
'common.text.longest': '最长',
'common.text.select': '选择',
/** form */
'common.form.name.placeholder': '请输入姓名',
}
......@@ -14,8 +14,10 @@ export default {
'shop.form.describe.required': '请输入公司简介',
'shop.form.label.workshopPics': '厂房照片',
'shop.form.label.honorPics': '资质荣誉',
'shop.form.label.honorPics.tip': '如商标注册证书、品牌授权证书等证明材料',
'shop.form.label.albumName': '宣传画册',
'shop.form.label.shopLink': '店铺链接',
'shop.form.label.mallLink': '商城链接',
'shop.form.label.phone': '联系电话',
'shop.form.label.address': '详细地址',
'shop.form.label.currentLink': '当前链接',
......@@ -23,26 +25,28 @@ export default {
'shop.form.label.upload.tip': '一次上传一个文件,每个附件大小不能超过 50M<',
'shop.option.copy.success': '复制成功!',
'shop.seo.tabel.name': "页面名称",
'shop.seo.tabel.home': "店铺首页",
'shop.seo.tabel.about': "关于我们",
'shop.seo.table.name': "页面名称",
'shop.seo.table.home': "店铺首页",
'shop.seo.table.channelHome': '渠道商场首页',
'shop.seo.table.about': "关于我们",
'shop.seo.form.name.required': "请选择页面名称",
'shop.seo.tabel.link': "访问链接",
'shop.seo.tabel.link.tip': "访问该页面的链接",
'shop.seo.tabel.status': "状态",
'shop.seo.tabel.title': "标题",
'shop.seo.tabel.title.tip': "用于显示在页面title标签的内容,便于搜索引擎抓取",
'shop.seo.table.link': "访问链接",
'shop.seo.table.link.tip': "访问该页面的链接",
'shop.seo.table.status': "状态",
'shop.seo.table.title': "标题",
'shop.seo.table.title.tip': "用于显示在页面title标签的内容,便于搜索引擎抓取",
'shop.seo.form.title.required': "标题",
'shop.seo.tabel.description': "描述",
'shop.seo.tabel.description.tip': "用于显示在页面Description标签的内容,便于搜索引擎抓取",
'shop.seo.table.description': "描述",
'shop.seo.table.description.tip': "用于显示在页面Description标签的内容,便于搜索引擎抓取",
'shop.seo.form.description.required': "描述",
'shop.seo.tabel.keywords': "关键字",
'shop.seo.tabel.keywords.tip': "用于显示在页面Keywords标签的内容,便于搜索引擎通过关键词搜索时抓取页面,多个关键词用豆号分隔",
'shop.seo.table.keywords': "关键字",
'shop.seo.table.keywords.tip': "用于显示在页面Keywords标签的内容,便于搜索引擎通过关键词搜索时抓取页面,多个关键词用豆号分隔",
'shop.seo.form.keywords.required': "请输入关键字",
'shop.seo.tab.basic': "基本信息",
'shop.template.create.tip': '您还未创建店铺,请先创建店铺',
'shop.template.preview.edit': '暂不支持该类型模板装修',
'channel.template.create.tip': '您还未创建渠道商城,请先创建渠道商城',
'shop.template.edit.tip': '暂不支持该类型模板装修',
'shop.template.preview.tip': '暂不支持该类型模板预览',
'shop.template.detail.title': '查看模板',
......@@ -58,10 +62,48 @@ export default {
'shop.template.button.state.enable': '使用',
'shop.template.tag.default': '默认模板',
'shop.template.modal.title.use': '使用店铺模板',
'shop.tempalte.modal.use.content1': '您选择的站点',
'shop.tempalte.modal.use.content2': '现在使用的模板是',
'shop.tempalte.modal.use.content3': '模板',
'shop.tempalte.modal.use.content4': '您是否使用',
'shop.tempalte.modal.use.content5': '模板,来替换您正在使用的模板',
/** 渠道业务员 */
'channel.member.add': '新增业务员',
'channel.member.edit': '编辑业务员',
'channel.member.preview': '新增业务员',
'channel.member.table.userId': '用户ID',
'channel.member.table.name': '姓名',
'channel.member.table.account': '登录账号',
'channel.member.table.account.placeholder': '请输入登录账号',
'channel.member.table.phone': '手机号',
'channel.member.table.bindphone': '绑定手机号',
'channel.member.table.orgName': '所属机构',
'channel.member.table.jobTitle': '职位',
'channel.member.table.memberId': '会员ID',
'channel.member.table.memberName': '会员名称',
'channel.member.table.memberTypeName': '会员类型',
'channel.member.table.roleName': '会员角色',
'channel.member.table.createTime': '申请时间',
'channel.member.table.levelTag': '会员等级',
'channel.member.table.statusName': '会员状态',
'channel.member.table.memberRoleName': '所属角色',
'channel.member.relieve.confirm': '确定要解除吗',
'channel.member.relieve': '解除绑定关系',
'channel.member.relieve.batch': '批量解除绑定关系',
'channel.member.select':'请先选择业务员',
'channel.member.wait.bind.select':'选择待绑定渠道会员',
'channel.form.salesman': '业务员',
'channel.modal.member.select': '选择渠道会员',
'channel.form.name.placeholder': '输入姓名',
'channel.form.modal.salesman.title': '选择业务员',
'channel.form.salesman.placeholder': '请选择业务员',
'channel.form.orgName.placeholder': '请输入所属机构',
'channel.form.orgName.jobTitle': '请输入职位',
'channel.form.memberName.placeholder': '请搜索会员名称',
'channel.member.tab.manage.subordinate': "管理下级渠道",
'channel.template.modal.title.use': '使用渠道模板',
'channel.template.button.mall.edit': '渠道商城装修',
'channel.template.button.mall.category.edit': '渠道品类导航装修',
}
import React, { useState, useEffect } from 'react'
import { PageHeaderWrapper } from '@ant-design/pro-layout'
import { Form, Input, Button, Tooltip, Select, message, Upload, Typography } from 'antd'
import { Prompt } from 'umi'
import { Prompt, useIntl } from 'umi'
import { inject } from 'mobx-react'
import { QuestionCircleOutlined, DeleteOutlined, CopyOutlined, LinkOutlined, UploadOutlined } from '@ant-design/icons'
import CitySelect from '@/components/CitySelect'
......@@ -41,6 +41,7 @@ const ChannelInfo: React.FC<ShopInfoPropsType> = (props) => {
const [promotionPic, setPromotionPic] = useState<string>('')
const [shopInfo, setShopInfo] = useState<any>()
const [shopId, setShopId] = useState<number>()
const intl = useIntl()
/** 上传公司画册 */
const [file, setFile] = useState<any>({});
......@@ -50,10 +51,10 @@ const ChannelInfo: React.FC<ShopInfoPropsType> = (props) => {
const PDFList = ['application/pdf']
const isPDF = PDFList.includes(file.type)
if (!isLt50M) {
message.error('上传文件大小不超过 50M!');
message.error(intl.formatMessage({ id: 'shop.form.upload.size.limit' }));
}
if (!isPDF) {
message.error('请上传pdf格式文件');
message.error(intl.formatMessage({ id: 'shop.form.upload.type.required' }));
}
return isLt50M && isPDF;
}
......@@ -227,14 +228,14 @@ const ChannelInfo: React.FC<ShopInfoPropsType> = (props) => {
const checkmemberChannelAreas = (shopAreas) => {
if (isEmpty(shopAreas)) {
message.destroy()
message.error('请选择归属地市')
message.error(intl.formatMessage({ id: 'shop.form.memberShopAreas.required' }))
return false
}
return shopAreas.every(item => {
if (isEmpty(item.provinceCode)) {
message.destroy()
message.error('请选择归属地市')
message.error(intl.formatMessage({ id: intl.formatMessage({ id: 'shop.form.memberShopAreas.required' }) }))
return false
} else {
return true
......@@ -246,7 +247,7 @@ const ChannelInfo: React.FC<ShopInfoPropsType> = (props) => {
const handleCopyLinke = (link: string) => {
if (copy(link)) {
message.success('复制成功!')
message.success(intl.formatMessage({ id: 'shop.option.copy.success' }))
}
}
......@@ -319,7 +320,7 @@ const ChannelInfo: React.FC<ShopInfoPropsType> = (props) => {
return (
<PageHeaderWrapper>
<Prompt when={formIsHalfFilledOut} message="您还有未保存的内容,是否确定要离开?" />
<Prompt when={formIsHalfFilledOut} message={intl.formatMessage({ id: 'common.tip.save.confirm' })} />
<div className={styles.shop_info}>
<Form
form={form}
......@@ -330,8 +331,8 @@ const ChannelInfo: React.FC<ShopInfoPropsType> = (props) => {
<Form.Item
labelAlign="left"
name="memberChannelAreas"
label={<RequireItem label="归属地市" isRequire={true} />}
rules={[{ required: true, message: "请选择归属地市" }]}
label={<RequireItem label={intl.formatMessage({ id: 'shop.form.label.memberShopAreas' })} isRequire={true} />}
rules={[{ required: true, message: intl.formatMessage({ id: 'shop.form.memberShopAreas.required' }) }]}
>
<CitySelect
selectData={selectCityData}
......@@ -343,8 +344,8 @@ const ChannelInfo: React.FC<ShopInfoPropsType> = (props) => {
<Form.Item
labelAlign="left"
name="logo"
label={<RequireItem label="公司LOGO" isRequire={true} />}
rules={[{ required: true, message: "请上传公司LOGO" }]}
label={<RequireItem label={intl.formatMessage({ id: 'shop.form.label.logo' })} isRequire={true} />}
rules={[{ required: true, message: intl.formatMessage({ id: 'shop.form.logo.required' })}]}
>
<UploadImage
imgUrl={logo}
......@@ -361,15 +362,15 @@ const ChannelInfo: React.FC<ShopInfoPropsType> = (props) => {
<Form.Item
labelAlign="left"
name="describe"
label={<RequireItem label="公司简介" isRequire={true} />}
rules={[{ required: true, message: "请输入公司简介" }]}
label={<RequireItem label={intl.formatMessage({ id: 'shop.form.label.describe' })} isRequire={true} />}
rules={[{ required: true, message: intl.formatMessage({ id: 'shop.form.describe.required' }) }]}
>
<Input.TextArea rows={5} className={styles.form_item} placeholder="请输入公司简介" maxLength={200} />
<Input.TextArea rows={5} className={styles.form_item} placeholder={intl.formatMessage({ id: 'shop.form.describe.required' })} maxLength={200} />
</Form.Item>
<Form.Item
labelAlign="left"
name="workshopPics"
label={<RequireItem label="厂房照片" />}
label={<RequireItem label={intl.formatMessage({ id: 'shop.form.label.workshopPics' })} />}
>
<div className={styles.form_item_wrap}>
......@@ -396,7 +397,7 @@ const ChannelInfo: React.FC<ShopInfoPropsType> = (props) => {
<Form.Item
labelAlign="left"
name="honorPics"
label={<RequireItem label="资质荣誉" brief={<Tooltip placement="top" title="如商标注册证书、品牌授权证书等证明材料"><QuestionCircleOutlined /></Tooltip>} />}
label={<RequireItem label={intl.formatMessage({ id: 'shop.form.label.honorPics' })} brief={<Tooltip placement="top" title={intl.formatMessage({ id: 'shop.form.label.honorPics.tip' })}><QuestionCircleOutlined /></Tooltip>} />}
>
<div className={styles.form_item_wrap}>
......@@ -423,7 +424,7 @@ const ChannelInfo: React.FC<ShopInfoPropsType> = (props) => {
<Form.Item
labelAlign="left"
name="albumName"
label={<RequireItem label="宣传画册" />}
label={<RequireItem label={intl.formatMessage({ id: 'shop.form.label.albumName' })} />}
className={styles.revise_style}
>
<div className={styles.upload_data}>
......@@ -453,15 +454,15 @@ const ChannelInfo: React.FC<ShopInfoPropsType> = (props) => {
beforeUpload={beforeDocUpload}
onChange={handleChange}
>
<Button loading={fileLoading} icon={<UploadOutlined />}>上传文件</Button>
<div style={{ marginTop: '8px' }}>一次上传一个文件,每个附件大小不能超过 50M</div>
<Button loading={fileLoading} icon={<UploadOutlined />}>{intl.formatMessage({ id: 'shop.form.label.upload' })}</Button>
<div style={{ marginTop: '8px' }}>{intl.formatMessage({ id: 'shop.form.label.upload.tip' })}</div>
</Upload>
)}
</Form.Item>
<Form.Item
labelAlign="left"
name="shopId"
label={<RequireItem label="商城链接" />}
label={<RequireItem label={intl.formatMessage({ id: 'shop.form.label.mallLink' })} />}
>
<Select allowClear value={shopId} className={styles.form_item} onChange={handleMallSelectChange}>
{
......@@ -472,7 +473,7 @@ const ChannelInfo: React.FC<ShopInfoPropsType> = (props) => {
</Select>
{resUrl && (
<div className={styles.shop_url}>
<span>当前{door}链接:</span>
<span>{intl.formatMessage({ id: 'shop.form.label.currentLink' })}:</span>
<label>{resUrl}</label>
<CopyOutlined className={styles.copy_icon} onClick={() => handleCopyLinke(resUrl)} />
</div>
......@@ -481,14 +482,14 @@ const ChannelInfo: React.FC<ShopInfoPropsType> = (props) => {
<Form.Item
labelAlign="left"
name="address"
label={<RequireItem label="详细地址" />}
label={<RequireItem label={intl.formatMessage({ id: 'shop.form.label.address' })} />}
>
<Input allowClear autoComplete="off" className={styles.form_item} />
</Form.Item>
<Form.Item
label={<RequireItem label="" />}
>
<Button loading={confirmLoading} type="primary" style={{ marginRight: 16 }} onClick={handleSave}>保存</Button>
<Button loading={confirmLoading} type="primary" style={{ marginRight: 16 }} onClick={handleSave}>{intl.formatMessage({ id: 'common.button.save' })}</Button>
</Form.Item>
</Form>
</div>
......
import React, { useEffect, useState } from 'react';
import { history, Prompt } from 'umi';
import { history, Prompt, useIntl } from 'umi';
import { Card, Button, Tabs, Form, Select, Tooltip, Input, Typography } from 'antd';
import { PageHeaderWrapper } from '@ant-design/pro-layout';
import ReutrnEle from '@/components/ReturnEle';
......@@ -21,6 +21,7 @@ const ChannelSeoAdded = () => {
const [form] = Form.useForm()
const [confirmLoading, setConfirmLoading] = useState<boolean>(false);
const [formIsHalfFilledOut, setFormIsHalfFilledOut] = useState<boolean>(false);
const intl = useIntl()
const handleFormValueChange = () => {
setFormIsHalfFilledOut(true)
}
......@@ -55,7 +56,7 @@ const ChannelSeoAdded = () => {
useEffect(() => {
if (id) {
getTemplateWebSeoWebGet({ id }).then(res => {
getTemplateWebSeoWebGet({ id: String(id) }).then(res => {
if (res.code !== 1000) {
return
}
......@@ -67,17 +68,17 @@ const ChannelSeoAdded = () => {
return (
<PageHeaderWrapper
onBack={() => history.goBack()}
backIcon={<ReutrnEle description="返回" />}
backIcon={<ReutrnEle description={intl.formatMessage({ id: 'common.button.back' })} />}
extra={
link !== 'detail' && <Button type="primary" loading={confirmLoading} onClick={handleSave}> 保存</Button>
}
>
<Prompt when={formIsHalfFilledOut} message="您还有未保存的内容,是否确定要离开?" />
<Prompt when={formIsHalfFilledOut} message={intl.formatMessage({ id: 'common.tip.save.confirm' })} />
<Card>
<Tabs
type="card"
>
<TabPane tab='基本信息' key='1'>
<TabPane tab={intl.formatMessage({ id: 'shop.seo.tab.basic' })} key='1'>
<Form
{...layout}
form={form}
......@@ -86,40 +87,40 @@ const ChannelSeoAdded = () => {
>
<Form.Item
name='type'
label={<RequireItem label="页面名称" isRequire={true} />}
rules={[{ required: true, message: "请选择页面名称" }]}
label={<RequireItem label={intl.formatMessage({ id: 'shop.seo.table.name' })} isRequire={true} />}
rules={[{ required: true, message: intl.formatMessage({ id: 'shop.seo.form.name.required' }) }]}
>
<Select disabled={link === 'detail'}>
<Select.Option value={1}>渠道商场首页</Select.Option>
<Select.Option value={2}>关于我们</Select.Option>
<Select.Option value={1}>{intl.formatMessage({ id: 'shop.seo.table.channelHome' })}</Select.Option>
<Select.Option value={2}>{intl.formatMessage({ id: 'shop.seo.table.about' })}</Select.Option>
</Select>
</Form.Item>
<Form.Item
name='link'
label={<RequireItem label="访问链接" brief={<Tooltip placement="top" title="访问该页面的链接"><QuestionCircleOutlined /></Tooltip>} />}
label={<RequireItem label={intl.formatMessage({ id: 'shop.seo.table.link' })} brief={<Tooltip placement="top" title={intl.formatMessage({ id: 'shop.seo.table.link.tip' })}><QuestionCircleOutlined /></Tooltip>} />}
>
<Input disabled={link === 'detail'} addonBefore={<Typography.Text type='secondary'>http://</Typography.Text>} />
</Form.Item>
<Form.Item
name='title'
label={<RequireItem label="标题" isRequire={true} brief={<Tooltip placement="top" title="用于显示在页面title标签的内容,便于搜索引擎抓取"><QuestionCircleOutlined /></Tooltip>} />}
label={<RequireItem label={intl.formatMessage({ id: 'shop.seo.table.title' })} isRequire={true} brief={<Tooltip placement="top" title={intl.formatMessage({ id: 'shop.seo.table.title.tip' })}><QuestionCircleOutlined /></Tooltip>} />}
rules={[{ required: true, message: "请输入标题" }]}
>
<Input maxLength={50} disabled={link === 'detail'} placeholder='最长50个汉字' />
<Input maxLength={50} disabled={link === 'detail'} placeholder={`${intl.formatMessage({ id: 'common.text.longest' })}50${intl.formatMessage({ id: 'common.unit.individual.chinese'})}`} />
</Form.Item>
<Form.Item
name='description'
label={<RequireItem label="描述" isRequire={true} brief={<Tooltip placement="top" title="用于显示在页面Description标签的内容,便于搜索引擎抓取"><QuestionCircleOutlined /></Tooltip>} />}
rules={[{ required: true, message: "请输入描述" }]}
label={<RequireItem label={intl.formatMessage({ id: 'shop.seo.table.description' })} isRequire={true} brief={<Tooltip placement="top" title={intl.formatMessage({ id: 'shop.seo.table.description.tip' })}><QuestionCircleOutlined /></Tooltip>} />}
rules={[{ required: true, message: intl.formatMessage({ id: 'shop.seo.form.description.required' }) }]}
>
<Input.TextArea disabled={link === 'detail'} rows={5} placeholder="最长200个汉字" maxLength={200} />
<Input.TextArea disabled={link === 'detail'} rows={5} placeholder={`${intl.formatMessage({ id: 'common.text.longest' })}200${intl.formatMessage({ id: 'common.unit.individual.chinese'})}`} maxLength={200} />
</Form.Item>
<Form.Item
name='keywords'
label={<RequireItem label="关键字" isRequire={true} brief={<Tooltip placement="top" title="用于显示在页面Keywords标签的内容,便于搜索引擎通过关键词搜索时抓取页面,多个关键词用豆号分隔"><QuestionCircleOutlined /></Tooltip>} />}
rules={[{ required: true, message: "请输入关键字" }]}
label={<RequireItem label={intl.formatMessage({ id: 'shop.seo.table.keywords' })} isRequire={true} brief={<Tooltip placement="top" title={intl.formatMessage({ id: 'shop.seo.table.keywords.tip' })}><QuestionCircleOutlined /></Tooltip>} />}
rules={[{ required: true, message: intl.formatMessage({ id: 'shop.seo.form.keywords.required' }) }]}
>
<Input.TextArea disabled={link === 'detail'} rows={5} placeholder="最长100个汉字" maxLength={100} />
<Input.TextArea disabled={link === 'detail'} rows={5} placeholder={`${intl.formatMessage({ id: 'common.text.longest' })}100${intl.formatMessage({ id: 'common.unit.individual.chinese'})}`} maxLength={100} />
</Form.Item>
</Form>
</TabPane>
......
import React, { ReactNode, useRef } from 'react';
import { ISchema } from '@formily/antd';
import { history } from 'umi';
import { history, useIntl } from 'umi';
import { PageHeaderWrapper } from '@ant-design/pro-layout';
import { Card, Row, Col, Button, Popconfirm, Typography } from 'antd';
import { StandardTable } from 'god';
......@@ -16,6 +16,7 @@ import { getTemplateWebSeoWebPage, postTemplateWebSeoWebDelete, postTemplateWebS
const ChannelSeo = () => {
const ref = useRef<any>({});
const formActions = createFormActions();
const intl = useIntl()
/** 修改状态 */
const confirm = (e: any) => {
const status = e.status === 1 ? 0 : 1;
......@@ -44,19 +45,19 @@ const ChannelSeo = () => {
width: 128,
},
{
title: '页面名称',
title: intl.formatMessage({ id: 'shop.seo.table.name' }),
key: 'name',
dataIndex: 'name',
// eslint-disable-next-line react/display-name
render: (text: any,record: any) => <Typography.Link href={`/memberCenter/shopAbility/shopSeo/detail?id=${record.id}`}>{text}</Typography.Link>
},
{
title: '访问链接',
title: intl.formatMessage({ id: 'shop.seo.table.link' }),
key: 'link',
dataIndex: 'link',
},
{
title: '状态',
title: intl.formatMessage({ id: 'shop.seo.table.status' }),
key: 'status',
dataIndex: 'status',
width: 256,
......@@ -64,15 +65,15 @@ const ChannelSeo = () => {
let component: ReactNode = null
component = (
<Popconfirm
title="确定要执行这个操作?"
title={intl.formatMessage({ id: 'common.tip.option.confirm' })}
onConfirm={() => confirm(record)}
okText="是"
cancelText="否"
okText={intl.formatMessage({ id: 'common.button.yes' })}
cancelText={intl.formatMessage({ id: 'common.button.no' })}
>
<Button
type="link"
style={record.status === 1 ? { color: '#00B37A' } : { color: 'red' }}>
{record.status === 1 ? <>有效 <PlayCircleOutlined /></> : <>无效 <PauseCircleOutlined /></>}
{record.status === 1 ? <>{intl.formatMessage({ id: 'common.status.effective' })} <PlayCircleOutlined /></> : <>{intl.formatMessage({ id: 'common.status.invalid' })} <PauseCircleOutlined /></>}
</Button>
</Popconfirm>
)
......@@ -80,7 +81,7 @@ const ChannelSeo = () => {
}
},
{
title: '操作',
title: intl.formatMessage({ id: 'common.table.action' }),
key: 'action',
dataIndex: 'action',
width: 256,
......@@ -88,15 +89,15 @@ const ChannelSeo = () => {
render: (_text: any, record: any) => (
<>
<Popconfirm
title="确定要执行这个操作?"
title={intl.formatMessage({ id: 'common.tip.option.confirm' })}
onConfirm={() => handleDelete(record.id)}
disabled={record.status === 1}
okText="是"
cancelText="否"
okText={intl.formatMessage({ id: 'common.button.yes' })}
cancelText={intl.formatMessage({ id: 'common.button.no' })}
>
<Button disabled={record.status === 1} type='link'>删除</Button>
<Button disabled={record.status === 1} type='link'>{intl.formatMessage({ id: 'common.button.delete' })}</Button>
</Popconfirm>
<Button disabled={record.status === 1} type='link' onClick={() => history.push(`/memberCenter/shopAbility/shopSeo/edit?id=${record.id}`)}>修改</Button>
<Button disabled={record.status === 1} type='link' onClick={() => history.push(`/memberCenter/channelAbility/channelSeo/edit?id=${record.id}`)}>{intl.formatMessage({ id: 'common.button.modify' })}</Button>
</>
)
}
......
import React, { useEffect, useState } from 'react'
import { Row, Col, message } from 'antd'
import { history } from 'umi'
import { history, useIntl } from 'umi'
import { PageHeaderWrapper } from '@ant-design/pro-layout'
import TemplateItem from '../components/templateItem'
import styles from './index.less'
......@@ -9,7 +9,7 @@ import { getTemplateWebPageTemplateWebFindAllShelfChannelTemplate, GetTemplateWe
const ShopTemplate: React.FC = () => {
const [templateList, setTemplateList] = useState<GetTemplateWebPageTemplateWebFindAllShelfChannelTemplateResponse>([])
const intl = useIntl()
useEffect(() => {
fetchAllShelfShopTemplate()
}, [])
......@@ -20,7 +20,7 @@ const ShopTemplate: React.FC = () => {
setTemplateList(res.data)
} else {
message.destroy()
message.info("您还未创建渠道商城,请先创建渠道商城")
message.info(intl.formatMessage({ id: 'channel.template.create.tip' }))
setTimeout(() => {
history.push('/memberCenter/channelAbility/infoManage')
}, 2000);
......@@ -35,7 +35,7 @@ const ShopTemplate: React.FC = () => {
{
templateList.map(item => (
<Col xxl={6} xl={8} lg={12} key={item.id} style={{ marginBottom: 16 }}>
<TemplateItem templateInfo={item} type="shop" />
<TemplateItem templateInfo={item} type="channel" />
</Col>
))
}
......
import React from 'react'
import { PlayCircleOutlined } from '@ant-design/icons'
import cx from 'classnames'
import { Link } from 'umi'
import { Link, useIntl } from 'umi'
import styles from './index.less'
interface TemplateItemPropsType {
......@@ -29,12 +29,13 @@ const Environment_Status = {
const TemplateItem: React.FC<TemplateItemPropsType> = (props) => {
const { templateInfo, type } = props
const intl = useIntl()
return (
<div className={styles.template_item}>
<div className={styles.img_box} style={{ backgroundImage: `url(${templateInfo.templatePicUrl})` }}>
<div className={styles.img_box_mask}>
<Link to={`/memberCenter/channelAbility/template/detail?type=${type}&id=${templateInfo.id}`} className={styles.detail_btn}>查看详情</Link>
<Link to={`/memberCenter/channelAbility/template/detail?type=${type}&id=${templateInfo.id}`} className={styles.detail_btn}>{intl.formatMessage({ id: 'common.button.view.details' })}</Link>
</div>
<div className={cx(styles.type_tag, templateInfo.environment === 2 ? styles.h5 : '')}>{Environment_Status[templateInfo.environment].name}</div>
</div>
......@@ -42,24 +43,24 @@ const TemplateItem: React.FC<TemplateItemPropsType> = (props) => {
<div className={styles.template_info_name}>
<span>{templateInfo.templateName}</span>
{
templateInfo.isDefault && <div className={styles.tag}>默认模板</div>
templateInfo.isDefault && <div className={styles.tag}>{intl.formatMessage({ id: 'shop.template.tag.default' })}</div>
}
</div>
<div className={cx(styles.template_info_content, type === 'goods' ? styles.goods : '')}>
<div className={styles.template_info_content_text_wrap}>
<div className={styles.template_info_content_text_line}>
<label>使用站点:</label>
<label>{intl.formatMessage({ id: 'shop.template.form.label.siteName' })}</label>
<span>{templateInfo.siteName}</span>
</div>
<div className={styles.template_info_content_text_line}>
<label>使用商城:</label>
<label>{intl.formatMessage({ id: 'shop.template.form.label.shopName' })}</label>
<span>{templateInfo.shopName}</span>
</div>
</div>
<div className={cx(styles.template_item_btn, templateInfo.use === 1 ? styles.active : '')}>
<PlayCircleOutlined />
<label>{templateInfo.use === 1 ? '启用中' : '启用'}</label>
<label>{templateInfo.use === 1 ? intl.formatMessage({ id: 'shop.template.button.state.enabling' }) : intl.formatMessage({ id: 'shop.template.button.state.enable' })}</label>
</div>
</div>
</div>
......
import React from 'react'
import { Modal } from 'antd'
import { useIntl } from 'umi'
import styles from './index.less'
interface UseModalPropsType {
......@@ -13,7 +14,7 @@ interface UseModalPropsType {
const UseModal: React.FC<UseModalPropsType> = (props) => {
const { visible, onOk, onCancel, title, dataInfo = {}, confirmLoading = false } = props
const intl = useIntl()
return (
<Modal
......@@ -29,27 +30,26 @@ const UseModal: React.FC<UseModalPropsType> = (props) => {
dataInfo.inUseTemplateName ? (
<>
<div className={styles.text_line}>
<span>您选择的站点</span>
<span>{intl.formatMessage({ id: 'shop.tempalte.modal.use.content1' })}</span>
<label>{dataInfo.siteName}-{dataInfo.shopName}</label>
<span>现在使用的模板是</span>
<span>{intl.formatMessage({ id: 'shop.tempalte.modal.use.content2' })}</span>
<label>{dataInfo.inUseTemplateName}</label>
<span>模板</span>
<span>{intl.formatMessage({ id: 'shop.tempalte.modal.use.content3' })}</span>
</div>
<div className={styles.text_line}>
<span>您是否使用</span>
<span>{intl.formatMessage({ id: 'shop.tempalte.modal.use.content4' })}</span>
<label>{dataInfo.templateName}</label>
<span>模板,来替换您正在使用的模板</span>
<span>{intl.formatMessage({ id: 'shop.tempalte.modal.use.content5' })}</span>
</div>
</>
) : (
<div className={styles.text_line}>
<span>您是否使用</span>
<span>{intl.formatMessage({ id: 'shop.tempalte.modal.use.content4' })}</span>
<label>{dataInfo.templateName}</label>
<span>模板?</span>
<span>{intl.formatMessage({ id: 'shop.tempalte.modal.use.content3' })}?</span>
</div>
)
}
</Modal>
)
}
......
This diff is collapsed.
import React, { useRef } from 'react';
import { history } from 'umi'
import { history, useIntl } from 'umi'
import { Button, Popconfirm, Card } from 'antd';
import {
PlusOutlined,
......@@ -17,7 +17,7 @@ const fetchData = async (params) => {
const ChannelMember: React.FC<{}> = () => {
const ref = useRef<any>({})
const intl = useIntl()
const deleteItem = async (record) => {
// 删除该项
await postMemberAbilitySalesDelete({
......@@ -32,13 +32,13 @@ const ChannelMember: React.FC<{}> = () => {
const columns: ColumnType<any>[] = [
{
title: '登录账号',
title: intl.formatMessage({ id: 'channel.member.table.account' }),
dataIndex: 'account',
align: 'center',
key: 'account',
},
{
title: '姓名',
title: intl.formatMessage({ id: 'channel.member.table.name' }),
dataIndex: 'name',
align: 'center',
key: 'name',
......@@ -46,44 +46,44 @@ const ChannelMember: React.FC<{}> = () => {
render: (text, record) => <EyePreview url={`/memberCenter/channelAbility/memberList/detail?id=${record.userId}&preview=1`}>{text}</EyePreview>
},
{
title: '所属机构',
title: intl.formatMessage({ id: 'channel.member.table.orgName' }),
align: 'center',
dataIndex: 'orgName',
key: 'orgName',
},
{
title: '绑定手机号',
title: intl.formatMessage({ id: 'channel.member.table.bindphone' }),
align: 'center',
dataIndex: 'phone',
key: 'phone',
},
{
title: '职位',
title: intl.formatMessage({ id: 'channel.member.table.jobTitle' }),
align: 'center',
dataIndex: 'jobTitle',
key: 'jobTitle',
},
{
title: '所属角色',
title: intl.formatMessage({ id: 'channel.member.table.memberRoleName' }),
align: 'center',
dataIndex: 'memberRoleName',
key: 'memberRoleName',
},
{
title: '操作',
title: intl.formatMessage({ id: 'common.table.action' }),
dataIndex: 'option',
align: 'center',
render: (text:any, record:any) => {
return <>
<Button type='link' onClick={()=>updateItem(record)}>修改</Button>
<Button type='link' onClick={()=>updateItem(record)}>{intl.formatMessage({ id: 'common.button.modify' })}</Button>
{
<Popconfirm
title="确定要执行这个操作?"
title={intl.formatMessage({ id: 'common.tip.option.confirm' })}
onConfirm={() => deleteItem(record)}
okText="是"
cancelText="否"
okText={intl.formatMessage({ id: 'common.button.yes' })}
cancelText={intl.formatMessage({ id: 'common.button.no' })}
>
<Button type='link'>删除</Button>
<Button type='link'>{intl.formatMessage({ id: 'common.button.delete' })}</Button>
</Popconfirm>
}
</>
......@@ -125,13 +125,13 @@ const ChannelMember: React.FC<{}> = () => {
account: {
type: 'Search',
"x-component-props": {
placeholder: '请输入登录账号'
placeholder: intl.formatMessage({ id: 'channel.member.table.account.placeholder' })
}
},
name: {
type: 'Search',
"x-component-props": {
placeholder: '请输入姓名'
placeholder: intl.formatMessage({ id: 'channel.form.name.placeholder' })
}
}
}
......
......@@ -2,6 +2,7 @@ import React, { useState, useEffect } from 'react'
import { LayoutOutlined, EyeOutlined, PushpinOutlined } from '@ant-design/icons'
import cx from 'classnames'
import { message } from 'antd'
import { useIntl } from 'umi'
import DetailPage from '@/components/DetailPage'
import UseModal from '../components/useModal'
import { Environment_Status } from '@/constants'
......@@ -24,6 +25,7 @@ const TemplateDetail: React.FC<TemplateDetailPropsType> = (props) => {
const [useModalVisible, setUseModalVisible] = useState<boolean>(false)
const [confirmLoading, setConfirmLoading] = useState(false)
const [shopType, setShopType] = useState<number>()
const intl = useIntl()
useEffect(() => {
fetchDetail()
......@@ -70,7 +72,7 @@ const TemplateDetail: React.FC<TemplateDetailPropsType> = (props) => {
// app店铺装修
window.location.href = `/memberCenter/channelAbility/template/mobile/edit?id=${detailInfo.id}&template=${detailInfo.fileName}&type=${shopType}&shopId=${detailInfo.shopId}`
} else {
message.info("暂不支持该类型模板装修")
message.info(intl.formatMessage({ id: 'shop.template.edit.tip' }))
}
}
......@@ -80,13 +82,13 @@ const TemplateDetail: React.FC<TemplateDetailPropsType> = (props) => {
} else if(detailInfo?.environment === 4) {
window.location.href = `/memberCenter/channelAbility/template/mobile/preview?id=${detailInfo.id}&template=${detailInfo.fileName}&type=${shopType}&shopId=${detailInfo.shopId}`
} else {
message.info("暂不支持该类型模板预览")
message.info(intl.formatMessage({ id: 'shop.template.preview.tip' }))
}
}
const handleJump = () => {
if (detailInfo?.environment !== 4) {
message.info("暂不支持该类型模板预览")
message.info(intl.formatMessage({ id: 'shop.template.preview.tip' }))
return;
}
window.location.href = `/memberCenter/channelAbility/template/categoryNavigation?id=${detailInfo.id}&template=${detailInfo.fileName}&type=${shopType}&shopId=${detailInfo.shopId}`
......@@ -95,7 +97,7 @@ const TemplateDetail: React.FC<TemplateDetailPropsType> = (props) => {
return (
<DetailPage
title="查看模板"
title={intl.formatMessage({ id: 'shop.template.detail.title' })}
>
<div className={styles.template_detail}>
<div className={styles.template_info_wrap}>
......@@ -105,50 +107,50 @@ const TemplateDetail: React.FC<TemplateDetailPropsType> = (props) => {
</div>
<div className={styles.template_info}>
<div className={styles.template_info_line}>
<label>模板名称:</label>
<label>{intl.formatMessage({ id: 'shop.template.form.label.templateName' })}</label>
<span>{detailInfo?.templateName}</span>
</div>
<div className={styles.template_info_line}>
<label>适用环境:</label>
<label>{intl.formatMessage({ id: 'shop.template.form.label.environment' })}</label>
<span>{Environment_Status[detailInfo?.environment]}</span>
</div>
<div className={styles.template_info_line}>
<label>模板描述:</label>
<label>{intl.formatMessage({ id: 'shop.template.form.label.templateDescribe' })}</label>
<span>{detailInfo?.templateDescribe}</span>
</div>
<div className={styles.template_info_line}>
<label>使用站点:</label>
<label>{intl.formatMessage({ id: 'shop.template.form.label.siteName' })}</label>
<span>{detailInfo?.siteName}</span>
</div>
<div className={styles.template_info_line}>
<label>使用商城:</label>
<label>{intl.formatMessage({ id: 'shop.template.form.label.shopName' })}</label>
<span>{detailInfo?.shopName}</span>
</div>
</div>
</div>
<div className={styles.btn} onClick={() => handleLinkPreview()}>
<EyeOutlined />
<label>预览</label>
<label>{intl.formatMessage({ id: 'common.button.preview' })}</label>
</div>
<div className={cx(styles.btn, styles.fit)} onClick={() => handleLinkEdit()}>
<LayoutOutlined />
<label>渠道商城装修</label>
<label>{intl.formatMessage({ id: 'channel.template.button.mall.edit' })}</label>
</div>
{
detailInfo?.environment === 4 && (
<div className={cx(styles.btn, styles.fit)} onClick={handleJump}>
<LayoutOutlined />
<label>渠道品类导航装修</label>
<label>{intl.formatMessage({ id: 'channel.template.button.mall.category.edit' })}</label>
</div>
)
}
<div className={cx(styles.btn, detailInfo?.use === 1 ? styles.use : '')} onClick={() => detailInfo?.use !== 1 ? setUseModalVisible(true) : {}}>
<PushpinOutlined />
<label>{detailInfo?.use === 1 ? '使用中' : '使用'}</label>
<label>{detailInfo?.use === 1 ? intl.formatMessage({ id: 'shop.template.button.state.using' }) : intl.formatMessage({ id: 'shop.template.button.state.use' })}</label>
</div>
<UseModal
title="使用店铺模板"
title={intl.formatMessage({ id: 'channel.template.modal.title.use' })}
visible={useModalVisible}
dataInfo={detailInfo}
confirmLoading={confirmLoading}
......
......@@ -391,7 +391,7 @@ const ShopInfo: React.FC<ShopInfoPropsType> = (props) => {
<Form.Item
labelAlign="left"
name="honorPics"
label={<RequireItem label={intl.formatMessage({ id: 'shop.form.label.honorPics' })} brief={<Tooltip placement="top" title="如商标注册证书、品牌授权证书等证明材料"><QuestionCircleOutlined /></Tooltip>} />}
label={<RequireItem label={intl.formatMessage({ id: 'shop.form.label.honorPics' })} brief={<Tooltip placement="top" title={intl.formatMessage({ id: 'shop.form.label.honorPics.tip' })}><QuestionCircleOutlined /></Tooltip>} />}
>
<div className={styles.form_item_wrap}>
<div className={styles.img_list}>
......
......@@ -87,37 +87,37 @@ const ShopSeoAdded = () => {
>
<Form.Item
name='type'
label={<RequireItem label={intl.formatMessage({ id: 'shop.seo.tabel.name' })} isRequire={true} />}
label={<RequireItem label={intl.formatMessage({ id: 'shop.seo.table.name' })} isRequire={true} />}
rules={[{ required: true, message: intl.formatMessage({ id: 'shop.seo.form.name.required' }) }]}
>
<Select disabled={link === 'detail'}>
<Select.Option value={1}>{intl.formatMessage({ id: 'shop.seo.tabel.home' })}</Select.Option>
<Select.Option value={2}>{intl.formatMessage({ id: 'shop.seo.tabel.about' })}</Select.Option>
<Select.Option value={1}>{intl.formatMessage({ id: 'shop.seo.table.home' })}</Select.Option>
<Select.Option value={2}>{intl.formatMessage({ id: 'shop.seo.table.about' })}</Select.Option>
</Select>
</Form.Item>
<Form.Item
name='link'
label={<RequireItem label={intl.formatMessage({ id: 'shop.seo.tabel.link' })} brief={<Tooltip placement="top" title={intl.formatMessage({ id: 'shop.seo.tabel.link.tip' })}><QuestionCircleOutlined /></Tooltip>} />}
label={<RequireItem label={intl.formatMessage({ id: 'shop.seo.table.link' })} brief={<Tooltip placement="top" title={intl.formatMessage({ id: 'shop.seo.table.link.tip' })}><QuestionCircleOutlined /></Tooltip>} />}
>
<Input disabled={link === 'detail'} addonBefore={<Typography.Text type='secondary'>http://</Typography.Text>} />
</Form.Item>
<Form.Item
name='title'
label={<RequireItem label={intl.formatMessage({ id: 'shop.seo.tabel.title' })} isRequire={true} brief={<Tooltip placement="top" title={intl.formatMessage({ id: 'shop.seo.tabel.title.tip' })}><QuestionCircleOutlined /></Tooltip>} />}
label={<RequireItem label={intl.formatMessage({ id: 'shop.seo.table.title' })} isRequire={true} brief={<Tooltip placement="top" title={intl.formatMessage({ id: 'shop.seo.table.title.tip' })}><QuestionCircleOutlined /></Tooltip>} />}
rules={[{ required: true, message: intl.formatMessage({ id: 'shop.seo.form.title.required' }) }]}
>
<Input maxLength={50} disabled={link === 'detail'} placeholder={`${intl.formatMessage({ id: 'common.text.longest' })}50${intl.formatMessage({ id: 'common.unit.individual.chinese'})}`} />
</Form.Item>
<Form.Item
name='description'
label={<RequireItem label={intl.formatMessage({ id: 'shop.seo.tabel.description' })} isRequire={true} brief={<Tooltip placement="top" title={intl.formatMessage({ id: 'shop.seo.tabel.description.tip' })}><QuestionCircleOutlined /></Tooltip>} />}
label={<RequireItem label={intl.formatMessage({ id: 'shop.seo.table.description' })} isRequire={true} brief={<Tooltip placement="top" title={intl.formatMessage({ id: 'shop.seo.table.description.tip' })}><QuestionCircleOutlined /></Tooltip>} />}
rules={[{ required: true, message: intl.formatMessage({ id: 'shop.seo.form.description.required' }) }]}
>
<Input.TextArea disabled={link === 'detail'} rows={5} placeholder={`${intl.formatMessage({ id: 'common.text.longest' })}200${intl.formatMessage({ id: 'common.unit.individual.chinese'})}`} maxLength={200} />
</Form.Item>
<Form.Item
name='keywords'
label={<RequireItem label={intl.formatMessage({ id: 'shop.seo.tabel.keywords' })} isRequire={true} brief={<Tooltip placement="top" title={intl.formatMessage({ id: 'shop.seo.tabel.keywords.tip' })}><QuestionCircleOutlined /></Tooltip>} />}
label={<RequireItem label={intl.formatMessage({ id: 'shop.seo.table.keywords' })} isRequire={true} brief={<Tooltip placement="top" title={intl.formatMessage({ id: 'shop.seo.table.keywords.tip' })}><QuestionCircleOutlined /></Tooltip>} />}
rules={[{ required: true, message: intl.formatMessage({ id: 'shop.seo.form.keywords.required' }) }]}
>
<Input.TextArea disabled={link === 'detail'} rows={5} placeholder={`${intl.formatMessage({ id: 'common.text.longest' })}100${intl.formatMessage({ id: 'common.unit.individual.chinese'})}`} maxLength={100} />
......
......@@ -45,18 +45,18 @@ const ShopSeo = () => {
width: 128,
},
{
title: intl.formatMessage({ id: 'shop.seo.tabel.name' }),
title: intl.formatMessage({ id: 'shop.seo.table.name' }),
key: 'name',
dataIndex: 'name',
render: (text: any,record: any) => <Typography.Link href={`/memberCenter/shopAbility/shopSeo/detail?id=${record.id}`}>{text}</Typography.Link>
},
{
title: intl.formatMessage({ id: 'shop.seo.tabel.link' }),
title: intl.formatMessage({ id: 'shop.seo.table.link' }),
key: 'link',
dataIndex: 'link',
},
{
title: intl.formatMessage({ id: 'shop.seo.tabel.status' }),
title: intl.formatMessage({ id: 'shop.seo.table.status' }),
key: 'status',
dataIndex: 'status',
width: 256,
......@@ -80,7 +80,7 @@ const ShopSeo = () => {
}
},
{
title: intl.formatMessage({ id: 'common.tabel.action' }),
title: intl.formatMessage({ id: 'common.table.action' }),
key: 'action',
dataIndex: 'action',
width: 256,
......@@ -95,7 +95,7 @@ const ShopSeo = () => {
>
<Button disabled={record.status === 1} type='link'>{intl.formatMessage({ id: 'common.button.delete' })}</Button>
</Popconfirm>
<Button disabled={record.status === 1} type='link' onClick={() => history.push(`/memberCenter/shopAbility/shopSeo/edit?id=${record.id}`)}>修改</Button>
<Button disabled={record.status === 1} type='link' onClick={() => history.push(`/memberCenter/shopAbility/shopSeo/edit?id=${record.id}`)}>{intl.formatMessage({ id: 'common.button.modify' })}</Button>
</>
)
}
......@@ -150,7 +150,7 @@ const ShopSeo = () => {
},
"x-component-props": {
placeholder: intl.formatMessage({ id: 'shop.seo.tabel.name' }),
placeholder: intl.formatMessage({ id: 'shop.seo.table.name' }),
advanced: false
}
}
......
......@@ -66,7 +66,7 @@ const TemplateDetail: React.FC<TemplateDetailPropsType> = (props) => {
// app店铺装修
window.location.href = `/memberCenter/shopAbility/template/mobile/edit?id=${detailInfo.id}&template=${detailInfo.fileName}&shopId=${detailInfo.shopId}&environment=${detailInfo?.environment}`
} else {
message.info(intl.formatMessage({ id: 'shop.template.preview.edit' }))
message.info(intl.formatMessage({ id: 'shop.template.edit.tip' }))
}
}
......
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