diff --git a/build/vite/index.ts b/build/vite/index.ts index 02067107..585759f5 100644 --- a/build/vite/index.ts +++ b/build/vite/index.ts @@ -60,18 +60,11 @@ export function createVitePlugins() { } }), Components({ - // 要搜索组件的目录的相对路径 - dirs: ['src/components'], - // 组件的有效文件扩展名 - extensions: ['vue', 'md'], - // 搜索子目录 - deep: true, - include: [/\.vue$/, /\.vue\?vue/], // 生成自定义 `auto-components.d.ts` 全局声明 dts: 'src/types/auto-components.d.ts', // 自定义组件的解析器 resolvers: [ElementPlusResolver()], - exclude: [/[\\/]node_modules[\\/]/] + globs: ["src/components/**/**.{vue, md}", '!src/components/DiyEditor/components/mobile/**'] }), EslintPlugin({ cache: false, diff --git a/src/api/crm/customerLimitConfig/index.ts b/src/api/crm/customerLimitConfig/index.ts new file mode 100644 index 00000000..22fde3ea --- /dev/null +++ b/src/api/crm/customerLimitConfig/index.ts @@ -0,0 +1,35 @@ +import request from '@/config/axios' + +export interface CustomerLimitConfigVO { + id?: number + type?: number + userIds?: string + deptIds?: string + maxCount?: number + dealCountEnabled?: boolean +} + +// 查询客户限制配置列表 +export const getCustomerLimitConfigPage = async (params) => { + return await request.get({ url: `/crm/customer-limit-config/page`, params }) +} + +// 查询客户限制配置详情 +export const getCustomerLimitConfig = async (id: number) => { + return await request.get({ url: `/crm/customer-limit-config/get?id=` + id }) +} + +// 新增客户限制配置 +export const createCustomerLimitConfig = async (data: CustomerLimitConfigVO) => { + return await request.post({ url: `/crm/customer-limit-config/create`, data }) +} + +// 修改客户限制配置 +export const updateCustomerLimitConfig = async (data: CustomerLimitConfigVO) => { + return await request.put({ url: `/crm/customer-limit-config/update`, data }) +} + +// 删除客户限制配置 +export const deleteCustomerLimitConfig = async (id: number) => { + return await request.delete({ url: `/crm/customer-limit-config/delete?id=` + id }) +} diff --git a/src/api/crm/customerPoolConf/index.ts b/src/api/crm/customerPoolConf/index.ts new file mode 100644 index 00000000..8234ba36 --- /dev/null +++ b/src/api/crm/customerPoolConf/index.ts @@ -0,0 +1,19 @@ +import request from '@/config/axios' + +export interface CustomerPoolConfigVO { + enabled?: boolean + contactExpireDays?: number + dealExpireDays?: number + notifyEnabled?: boolean + notifyDays: number +} + +// 获取客户公海规则设置 +export const getCustomerPoolConfig = async () => { + return await request.get({ url: `/crm/customer-pool-config/get` }) +} + +// 更新客户公海规则设置 +export const updateCustomerPoolConfig = async (data: ConfigVO) => { + return await request.put({ url: `/crm/customer-pool-config/update`, data }) +} diff --git a/src/api/crm/permission/index.ts b/src/api/crm/permission/index.ts new file mode 100644 index 00000000..1292f29a --- /dev/null +++ b/src/api/crm/permission/index.ts @@ -0,0 +1,48 @@ +import request from '@/config/axios' + +export interface PermissionVO { + id?: number // 数据权限编号 + userId: number | undefined // 用户编号 + bizType: number | undefined // Crm 类型 + bizId: number | undefined // Crm 类型数据编号 + level: number | undefined // 权限级别 + deptName?: string // 部门名称 // 岗位名称数组 TODO @puhui999:数组? + nickname?: string // 用户昵称 + postNames?: string // 岗位名称数组 TODO @puhui999:数组? + createTime?: Date +} + +// 查询团队成员列表 +export const getPermissionList = async (params) => { + return await request.get({ url: `/crm/permission/list`, params }) +} + +// 新增团队成员 +export const createPermission = async (data: PermissionVO) => { + return await request.post({ url: `/crm/permission/add`, data }) +} + +// 修改团队成员权限级别 +export const updatePermission = async (data) => { + return await request.put({ url: `/crm/permission/update`, data }) +} + +// 删除团队成员 +export const deletePermission = async (params) => { + return await request.delete({ url: '/crm/permission/delete', params }) +} + +// 退出团队 +export const quitTeam = async (id) => { + return await request.delete({ url: '/crm/permission/quit-team?id=' + id }) +} + +// 领取公海数据 +export const receive = async (data: { bizType: number; bizId: number }) => { + return await request.put({ url: `/crm/permission/receive`, data }) +} + +// 数据放入公海 +export const putPool = async (data: { bizType: number; bizId: number }) => { + return await request.put({ url: `/crm/permission/put-pool`, data }) +} diff --git a/src/api/system/user/index.ts b/src/api/system/user/index.ts index 6224f0e8..689fec0d 100644 --- a/src/api/system/user/index.ts +++ b/src/api/system/user/index.ts @@ -22,6 +22,11 @@ export const getUserPage = (params: PageParam) => { return request.get({ url: '/system/user/page', params }) } +// 查询所有用户列表 +export const getAllUser = () => { + return request.get({ url: '/system/user/all' }) +} + // 查询用户详情 export const getUser = (id: number) => { return request.get({ url: '/system/user/get?id=' + id }) diff --git a/src/components/ColorInput/index.vue b/src/components/ColorInput/index.vue index abd083a1..63ff73cf 100644 --- a/src/components/ColorInput/index.vue +++ b/src/components/ColorInput/index.vue @@ -1,38 +1,18 @@ + + diff --git a/src/components/DiyEditor/components/mobile/MagicCube/property.vue b/src/components/DiyEditor/components/mobile/MagicCube/property.vue new file mode 100644 index 00000000..57c0af79 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/MagicCube/property.vue @@ -0,0 +1,76 @@ + + + + + diff --git a/src/components/DiyEditor/components/mobile/MenuGrid/config.ts b/src/components/DiyEditor/components/mobile/MenuGrid/config.ts new file mode 100644 index 00000000..b5a5d97d --- /dev/null +++ b/src/components/DiyEditor/components/mobile/MenuGrid/config.ts @@ -0,0 +1,78 @@ +import { ComponentStyle, DiyComponent } from '@/components/DiyEditor/util' +import { cloneDeep } from 'lodash-es' + +/** 宫格导航属性 */ +export interface MenuGridProperty { + // 列数 + column: number + // 导航菜单列表 + list: MenuGridItemProperty[] + // 组件样式 + style: ComponentStyle +} +/** 宫格导航项目属性 */ +export interface MenuGridItemProperty { + // 图标链接 + iconUrl: string + // 标题 + title: string + // 标题颜色 + titleColor: string + // 副标题 + subtitle: string + // 副标题颜色 + subtitleColor: string + // 链接 + url: string + // 角标 + badge: { + // 是否显示 + show: boolean + // 角标文字 + text: string + // 角标文字颜色 + textColor: string + // 角标背景颜色 + bgColor: string + } +} + +export const EMPTY_MENU_GRID_ITEM_PROPERTY = { + title: '标题', + titleColor: '#333', + subtitle: '副标题', + subtitleColor: '#bbb', + badge: { + show: false, + textColor: '#fff', + bgColor: '#FF6000' + } +} as MenuGridItemProperty + +// 定义组件 +export const component = { + id: 'MenuGrid', + name: '宫格导航', + icon: 'bi:grid-3x3-gap', + property: { + column: 3, + list: [cloneDeep(EMPTY_MENU_GRID_ITEM_PROPERTY)], + style: { + bgType: 'color', + bgColor: '#fff', + marginBottom: 8, + marginLeft: 8, + marginRight: 8, + padding: 8, + paddingTop: 8, + paddingRight: 8, + paddingBottom: 8, + paddingLeft: 8, + borderRadius: 8, + borderTopLeftRadius: 8, + borderTopRightRadius: 8, + borderBottomRightRadius: 8, + borderBottomLeftRadius: 8 + } as ComponentStyle + } +} as DiyComponent diff --git a/src/components/DiyEditor/components/mobile/MenuGrid/index.vue b/src/components/DiyEditor/components/mobile/MenuGrid/index.vue new file mode 100644 index 00000000..1c5ef1dc --- /dev/null +++ b/src/components/DiyEditor/components/mobile/MenuGrid/index.vue @@ -0,0 +1,35 @@ + + + + + diff --git a/src/components/DiyEditor/components/mobile/MenuGrid/property.vue b/src/components/DiyEditor/components/mobile/MenuGrid/property.vue new file mode 100644 index 00000000..e09dd318 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/MenuGrid/property.vue @@ -0,0 +1,96 @@ + + + + + diff --git a/src/components/DiyEditor/components/mobile/MenuList/config.ts b/src/components/DiyEditor/components/mobile/MenuList/config.ts new file mode 100644 index 00000000..c42674f3 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/MenuList/config.ts @@ -0,0 +1,47 @@ +import { ComponentStyle, DiyComponent } from '@/components/DiyEditor/util' +import { cloneDeep } from 'lodash-es' + +/** 列表导航属性 */ +export interface MenuListProperty { + // 导航菜单列表 + list: MenuListItemProperty[] + // 组件样式 + style: ComponentStyle +} +/** 列表导航项目属性 */ +export interface MenuListItemProperty { + // 图标链接 + iconUrl: string + // 标题 + title: string + // 标题颜色 + titleColor: string + // 副标题 + subtitle: string + // 副标题颜色 + subtitleColor: string + // 链接 + url: string +} + +export const EMPTY_MENU_LIST_ITEM_PROPERTY = { + title: '标题', + titleColor: '#333', + subtitle: '副标题', + subtitleColor: '#bbb' +} + +// 定义组件 +export const component = { + id: 'MenuList', + name: '列表导航', + icon: 'fa-solid:list', + property: { + list: [cloneDeep(EMPTY_MENU_LIST_ITEM_PROPERTY)], + style: { + bgType: 'color', + bgColor: '#fff', + marginBottom: 8 + } as ComponentStyle + } +} as DiyComponent diff --git a/src/components/DiyEditor/components/mobile/MenuList/index.vue b/src/components/DiyEditor/components/mobile/MenuList/index.vue new file mode 100644 index 00000000..9a56fd94 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/MenuList/index.vue @@ -0,0 +1,31 @@ + + + + + diff --git a/src/components/DiyEditor/components/mobile/MenuList/property.vue b/src/components/DiyEditor/components/mobile/MenuList/property.vue new file mode 100644 index 00000000..270ca261 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/MenuList/property.vue @@ -0,0 +1,75 @@ + + + + + diff --git a/src/components/DiyEditor/components/mobile/MenuSwiper/config.ts b/src/components/DiyEditor/components/mobile/MenuSwiper/config.ts new file mode 100644 index 00000000..fe5f4e87 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/MenuSwiper/config.ts @@ -0,0 +1,66 @@ +import { ComponentStyle, DiyComponent } from '@/components/DiyEditor/util' +import { cloneDeep } from 'lodash-es' + +/** 菜单导航属性 */ +export interface MenuSwiperProperty { + // 布局: 图标+文字 | 图标 + layout: 'iconText' | 'icon' + // 行数 + row: number + // 列数 + column: number + // 导航菜单列表 + list: MenuSwiperItemProperty[] + // 组件样式 + style: ComponentStyle +} +/** 菜单导航项目属性 */ +export interface MenuSwiperItemProperty { + // 图标链接 + iconUrl: string + // 标题 + title: string + // 标题颜色 + titleColor: string + // 链接 + url: string + // 角标 + badge: { + // 是否显示 + show: boolean + // 角标文字 + text: string + // 角标文字颜色 + textColor: string + // 角标背景颜色 + bgColor: string + } +} + +export const EMPTY_MENU_SWIPER_ITEM_PROPERTY = { + title: '标题', + titleColor: '#333', + badge: { + show: false, + textColor: '#fff', + bgColor: '#FF6000' + } +} as MenuSwiperItemProperty + +// 定义组件 +export const component = { + id: 'MenuSwiper', + name: '菜单导航', + icon: 'bi:grid-3x2-gap', + property: { + layout: 'iconText', + row: 1, + column: 3, + list: [cloneDeep(EMPTY_MENU_SWIPER_ITEM_PROPERTY)], + style: { + bgType: 'color', + bgColor: '#fff', + marginBottom: 8 + } as ComponentStyle + } +} as DiyComponent diff --git a/src/components/DiyEditor/components/mobile/MenuSwiper/index.vue b/src/components/DiyEditor/components/mobile/MenuSwiper/index.vue new file mode 100644 index 00000000..6ae6439c --- /dev/null +++ b/src/components/DiyEditor/components/mobile/MenuSwiper/index.vue @@ -0,0 +1,119 @@ + + + + + diff --git a/src/components/DiyEditor/components/mobile/MenuSwiper/property.vue b/src/components/DiyEditor/components/mobile/MenuSwiper/property.vue new file mode 100644 index 00000000..2175d57e --- /dev/null +++ b/src/components/DiyEditor/components/mobile/MenuSwiper/property.vue @@ -0,0 +1,106 @@ + + + + + diff --git a/src/components/DiyEditor/components/mobile/ProductCard/config.ts b/src/components/DiyEditor/components/mobile/ProductCard/config.ts new file mode 100644 index 00000000..49dd30d0 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/ProductCard/config.ts @@ -0,0 +1,97 @@ +import { ComponentStyle, DiyComponent } from '@/components/DiyEditor/util' + +/** 商品卡片属性 */ +export interface ProductCardProperty { + // 布局类型:单列大图 | 单列小图 | 双列 + layoutType: 'oneColBigImg' | 'oneColSmallImg' | 'twoCol' + // 商品字段 + fields: { + // 商品名称 + name: ProductCardFieldProperty + // 商品简介 + introduction: ProductCardFieldProperty + // 商品价格 + price: ProductCardFieldProperty + // 商品市场价 + marketPrice: ProductCardFieldProperty + // 商品销量 + salesCount: ProductCardFieldProperty + // 商品库存 + stock: ProductCardFieldProperty + } + // 角标 + badge: { + // 是否显示 + show: boolean + // 角标图片 + imgUrl: string + } + // 按钮 + btnBuy: { + // 类型:文字 | 图片 + type: 'text' | 'img' + // 文字 + text: string + // 文字按钮:背景渐变起始颜色 + bgBeginColor: string + // 文字按钮:背景渐变结束颜色 + bgEndColor: string + // 图片按钮:图片地址 + imgUrl: string + } + // 上圆角 + borderRadiusTop: number + // 下圆角 + borderRadiusBottom: number + // 间距 + space: number + // 商品编号列表 + spuIds: number[] + // 组件样式 + style: ComponentStyle +} +// 商品字段 +export interface ProductCardFieldProperty { + // 是否显示 + show: boolean + // 颜色 + color: string +} + +// 定义组件 +export const component = { + id: 'ProductCard', + name: '商品卡片', + icon: 'system-uicons:carousel', + property: { + layoutType: 'oneColBigImg', + fields: { + name: { show: true, color: '#000' }, + introduction: { show: true, color: '#999' }, + price: { show: true, color: '#ff3000' }, + marketPrice: { show: true, color: '#c4c4c4' }, + salesCount: { show: true, color: '#c4c4c4' }, + stock: { show: false, color: '#c4c4c4' } + }, + badge: { show: false, imgUrl: '' }, + btnBuy: { + type: 'text', + text: '立即购买', + // todo: @owen 根据主题色配置 + bgBeginColor: '#FF6000', + bgEndColor: '#FE832A', + imgUrl: '' + }, + borderRadiusTop: 8, + borderRadiusBottom: 8, + space: 8, + spuIds: [], + style: { + bgType: 'color', + bgColor: '', + marginLeft: 8, + marginRight: 8, + marginBottom: 8 + } as ComponentStyle + } +} as DiyComponent diff --git a/src/components/DiyEditor/components/mobile/ProductCard/index.vue b/src/components/DiyEditor/components/mobile/ProductCard/index.vue new file mode 100644 index 00000000..a6894ed9 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/ProductCard/index.vue @@ -0,0 +1,165 @@ + + + + diff --git a/src/components/DiyEditor/components/mobile/ProductCard/property.vue b/src/components/DiyEditor/components/mobile/ProductCard/property.vue new file mode 100644 index 00000000..cfa5008b --- /dev/null +++ b/src/components/DiyEditor/components/mobile/ProductCard/property.vue @@ -0,0 +1,149 @@ + + + + + diff --git a/src/components/DiyEditor/util.ts b/src/components/DiyEditor/util.ts index 29b44cf6..8f8c2c0c 100644 --- a/src/components/DiyEditor/util.ts +++ b/src/components/DiyEditor/util.ts @@ -100,16 +100,13 @@ export const PAGE_LIBS = [ { name: '基础组件', extended: true, - components: [ - 'SearchBar', - 'NoticeBar', - 'GridNavigation', - 'ListNavigation', - 'Divider', - 'TitleBar' - ] + components: ['SearchBar', 'NoticeBar', 'MenuSwiper', 'MenuGrid', 'MenuList'] + }, + { + name: '图文组件', + extended: true, + components: ['ImageBar', 'Carousel', 'TitleBar', 'VideoPlayer', 'Divider', 'MagicCube'] }, - { name: '图文组件', extended: true, components: ['ImageBar', 'Carousel', 'VideoPlayer'] }, { name: '商品组件', extended: true, components: ['ProductCard'] }, { name: '会员组件', diff --git a/src/components/InputWithColor/index.vue b/src/components/InputWithColor/index.vue new file mode 100644 index 00000000..2bc53172 --- /dev/null +++ b/src/components/InputWithColor/index.vue @@ -0,0 +1,59 @@ + + + + diff --git a/src/components/MagicCubeEditor/index.vue b/src/components/MagicCubeEditor/index.vue new file mode 100644 index 00000000..26ea179d --- /dev/null +++ b/src/components/MagicCubeEditor/index.vue @@ -0,0 +1,270 @@ + + + diff --git a/src/components/MagicCubeEditor/util.ts b/src/components/MagicCubeEditor/util.ts new file mode 100644 index 00000000..e7c64658 --- /dev/null +++ b/src/components/MagicCubeEditor/util.ts @@ -0,0 +1,72 @@ +// 坐标点 +export interface Point { + x: number + y: number +} + +// 矩形 +export interface Rect { + // 左上角 X 轴坐标 + left: number + // 左上角 Y 轴坐标 + top: number + // 右下角 X 轴坐标 + right: number + // 右下角 Y 轴坐标 + bottom: number + // 矩形宽度 + width: number + // 矩形高度 + height: number +} + +/** + * 判断两个矩形是否重叠 + * @param a 矩形 A + * @param b 矩形 B + */ +export const isOverlap = (a: Rect, b: Rect): boolean => { + return ( + a.left < b.left + b.width && + a.left + a.width > b.left && + a.top < b.top + b.height && + a.height + a.top > b.top + ) +} +/** + * 检查坐标点是否在矩形内 + * @param hotArea 矩形 + * @param point 坐标 + */ +export const isContains = (hotArea: Rect, point: Point): boolean => { + return ( + point.x >= hotArea.left && + point.x < hotArea.right && + point.y >= hotArea.top && + point.y < hotArea.bottom + ) +} + +/** + * 在两个坐标点中间,创建一个矩形 + * + * 存在以下情况: + * 1. 两个坐标点是同一个位置,只占一个位置的正方形,宽高都为 1 + * 2. X 轴坐标相同,只占一行的矩形,高度为 1 + * 3. Y 轴坐标相同,只占一列的矩形,宽度为 1 + * 4. 多行多列的矩形 + * + * @param a 坐标点一 + * @param b 坐标点二 + */ +export const createRect = (a: Point, b: Point): Rect => { + // 计算矩形的范围 + const [left, left2] = [a.x, b.x].sort() + const [top, top2] = [a.y, b.y].sort() + const right = left2 + 1 + const bottom = top2 + 1 + const height = bottom - top + const width = right - left + + return { left, right, top, bottom, height, width } +} diff --git a/src/config/axios/service.ts b/src/config/axios/service.ts index 1a4741b6..6413e945 100644 --- a/src/config/axios/service.ts +++ b/src/config/axios/service.ts @@ -217,6 +217,10 @@ const refreshToken = async () => { const handleAuthorized = () => { const { t } = useI18n() if (!isRelogin.show) { + // 如果已经到重新登录页面则不进行弹窗提示 + if (window.location.href.includes('login?redirect=')) { + return + } isRelogin.show = true ElMessageBox.confirm(t('sys.api.timeoutMessage'), t('common.confirmTitle'), { showCancelButton: false, diff --git a/src/utils/color.ts b/src/utils/color.ts index 6888583a..13424e57 100644 --- a/src/utils/color.ts +++ b/src/utils/color.ts @@ -151,3 +151,24 @@ const subtractLight = (color: string, amount: number) => { const c = cc < 0 ? 0 : cc return c.toString(16).length > 1 ? c.toString(16) : `0${c.toString(16)}` } + +// 预设颜色 +export const PREDEFINE_COLORS = [ + '#ff4500', + '#ff8c00', + '#ffd700', + '#90ee90', + '#00ced1', + '#1e90ff', + '#c71585', + '#409EFF', + '#909399', + '#C0C4CC', + '#b7390b', + '#ff7800', + '#fad400', + '#5b8c5f', + '#00babd', + '#1f73c3', + '#711f57' +] diff --git a/src/views/crm/components/CrmPermissionForm.vue b/src/views/crm/components/CrmPermissionForm.vue new file mode 100644 index 00000000..838aa68d --- /dev/null +++ b/src/views/crm/components/CrmPermissionForm.vue @@ -0,0 +1,115 @@ + + diff --git a/src/views/crm/components/CrmTeamList.vue b/src/views/crm/components/CrmTeamList.vue new file mode 100644 index 00000000..568777f6 --- /dev/null +++ b/src/views/crm/components/CrmTeamList.vue @@ -0,0 +1,156 @@ + + diff --git a/src/views/crm/components/index.ts b/src/views/crm/components/index.ts new file mode 100644 index 00000000..c25feef3 --- /dev/null +++ b/src/views/crm/components/index.ts @@ -0,0 +1,17 @@ +import CrmTeam from './CrmTeamList.vue' + +enum CrmBizTypeEnum { + CRM_LEADS = 1, // 线索 + CRM_CUSTOMER = 2, // 客户 + CRM_CONTACTS = 3, // 联系人 + CRM_BUSINESS = 5, // 商机 + CRM_CONTRACT = 6 // 合同 +} + +enum CrmPermissionLevelEnum { + OWNER = 1, // 负责人 + READ = 2, // 读 + WRITE = 3 // 写 +} + +export { CrmTeam, CrmBizTypeEnum, CrmPermissionLevelEnum } diff --git a/src/views/crm/contact/ContactForm.vue b/src/views/crm/contact/ContactForm.vue index 94d50299..68d0030b 100644 --- a/src/views/crm/contact/ContactForm.vue +++ b/src/views/crm/contact/ContactForm.vue @@ -28,6 +28,7 @@ /> + - @@ -212,6 +212,7 @@ const formRules = reactive({ const formRef = ref() // 表单 Ref const ownerUserList = ref([]) const userList = ref([]) // 用户列表 + /** 打开弹窗 */ const open = async (type: string, id?: number) => { dialogVisible.value = true @@ -231,6 +232,8 @@ const open = async (type: string, id?: number) => { } } } +defineExpose({ open }) // 提供 open 方法,用于打开弹窗 + /** 查询列表 */ const getList = async () => { loading.value = true @@ -242,7 +245,7 @@ const getList = async () => { loading.value = false } } -defineExpose({ open }) // 提供 open 方法,用于打开弹窗 + const gotOwnerUser = (owerUserId: any) => { if (owerUserId !== null) { owerUserId.split(',').forEach((item: string) => { @@ -254,6 +257,7 @@ const gotOwnerUser = (owerUserId: any) => { }) } } + /** 提交表单 */ const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调 const submitForm = async () => { @@ -305,12 +309,13 @@ const resetForm = () => { formRef.value?.resetFields() ownerUserList.value = [] } + /** 添加/修改操作 */ +// TODO @zyna:owner?拼写要注意哈; const owerRef = ref() const openOwerForm = (type: string) => { owerRef.value.open(type, ownerUserList.value) } - const owerSelectValue = (value) => { ownerUserList.value = value.value formData.value.ownerUserId = undefined @@ -322,7 +327,7 @@ const owerSelectValue = (value) => { } }) } -//选择客户 +// 选择客户 const showCustomer = ref(false) const openCustomerSelect = () => { showCustomer.value = !showCustomer.value @@ -341,7 +346,7 @@ const selectCustomer = () => { formData.value.customerName = multipleSelection.value.name showCustomer.value = !showCustomer.value } -const allContactList = ref([]) //所有联系人列表 +const allContactList = ref([]) // 所有联系人列表 onMounted(async () => { allContactList.value = await ContactApi.simpleAlllist() }) diff --git a/src/views/crm/contact/OwerSelect.vue b/src/views/crm/contact/OwerSelect.vue index 83dd143b..5ed0fe50 100644 --- a/src/views/crm/contact/OwerSelect.vue +++ b/src/views/crm/contact/OwerSelect.vue @@ -18,6 +18,7 @@ diff --git a/src/views/crm/customerLimitConfig/CustomerLimitConfigForm.vue b/src/views/crm/customerLimitConfig/CustomerLimitConfigForm.vue new file mode 100644 index 00000000..880106f0 --- /dev/null +++ b/src/views/crm/customerLimitConfig/CustomerLimitConfigForm.vue @@ -0,0 +1,224 @@ + + diff --git a/src/views/crm/customerLimitConfig/customerLimitConf.ts b/src/views/crm/customerLimitConfig/customerLimitConf.ts new file mode 100644 index 00000000..1336e137 --- /dev/null +++ b/src/views/crm/customerLimitConfig/customerLimitConf.ts @@ -0,0 +1,14 @@ +// TODO 可以挪到它对应的 api.ts 文件里哈 +/** + * 客户限制配置类型 + */ +export enum LimitConfType { + /** + * 拥有客户数限制 + */ + CUSTOMER_QUANTITY_LIMIT = 1, + /** + * 锁定客户数限制 + */ + CUSTOMER_LOCK_LIMIT = 2 +} diff --git a/src/views/crm/customerLimitConfig/index.vue b/src/views/crm/customerLimitConfig/index.vue new file mode 100644 index 00000000..1bccf4d3 --- /dev/null +++ b/src/views/crm/customerLimitConfig/index.vue @@ -0,0 +1,20 @@ + + diff --git a/src/views/crm/customerPoolConf/index.vue b/src/views/crm/customerPoolConf/index.vue new file mode 100644 index 00000000..5fa98711 --- /dev/null +++ b/src/views/crm/customerPoolConf/index.vue @@ -0,0 +1,135 @@ + + diff --git a/src/views/mall/product/spu/components/SpuShowcase.vue b/src/views/mall/product/spu/components/SpuShowcase.vue new file mode 100644 index 00000000..a3f16fba --- /dev/null +++ b/src/views/mall/product/spu/components/SpuShowcase.vue @@ -0,0 +1,126 @@ + + + + diff --git a/src/views/mall/promotion/diy/template/decorate.vue b/src/views/mall/promotion/diy/template/decorate.vue index 8304088a..f2ae7bc0 100644 --- a/src/views/mall/promotion/diy/template/decorate.vue +++ b/src/views/mall/promotion/diy/template/decorate.vue @@ -78,7 +78,6 @@ const handleTemplateItemChange = () => { currentFormData.value = formData.value!.pages.find( (page: DiyPageApi.DiyPageVO) => page.name === templateItems[selectedTemplateItem.value].name ) - console.log(currentFormData.value) } // 提交表单