diff --git a/.env.base b/.env.base index 11471c1..1c2bdc8 100644 --- a/.env.base +++ b/.env.base @@ -11,10 +11,10 @@ VITE_BASE_URL='http://localhost:48080' VITE_UPLOAD_URL='http://118.31.23.45:48080/admin-api/system/file/upload' # 接口前缀 -VITE_API_BASEPATH=/dev-api +VITE_API_BASEPATH=/crm-api # 接口地址 VITE_API_URL=/admin-api # 打包路径 -VITE_BASE_PATH=/ +VITE_BASE_PATH=/crm/ diff --git a/.env.dev b/.env.dev index d5db008..c37604e 100644 --- a/.env.dev +++ b/.env.dev @@ -10,13 +10,13 @@ VITE_BASE_URL='http://localhost:48080' VITE_UPLOAD_URL='http://118.31.23.45:48080/admin-api/system/file/upload' # 接口前缀 -VITE_API_BASEPATH=/dev-api +VITE_API_BASEPATH=/crm-api # 接口地址 VITE_API_URL=/admin-api # 打包路径 -VITE_BASE_PATH=/ +VITE_BASE_PATH=/crm/ # 是否删除debugger VITE_DROP_DEBUGGER=false diff --git a/.env.front b/.env.front index 31379fb..0ed3152 100644 --- a/.env.front +++ b/.env.front @@ -10,13 +10,13 @@ VITE_BASE_URL='http://118.31.23.45:48080' VITE_UPLOAD_URL='http://118.31.23.45:48080/admin-api/system/file/upload' # 接口前缀 -VITE_API_BASEPATH=/dev-api +VITE_API_BASEPATH=/crm-api # 接口地址 VITE_API_URL=/admin-api # 打包路径 -VITE_BASE_PATH=/ +VITE_BASE_PATH=/crm/ # 项目本地运行端口号, 与.vscode/launch.json配合 VITE_PORT=80 diff --git a/.env.pro b/.env.pro index e0b3180..118c95f 100644 --- a/.env.pro +++ b/.env.pro @@ -4,13 +4,13 @@ VITE_NODE_ENV=production VITE_DEV=false # 请求路径 -VITE_BASE_URL='http://localhost:48080' +VITE_BASE_URL='/crm-api' # 上传路径 -VITE_UPLOAD_URL='http://118.31.23.45:48080/admin-api/system/file/upload' +VITE_UPLOAD_URL='/crm-api/admin-api/system/file/upload' # 接口前缀 -VITE_API_BASEPATH= +VITE_API_BASEPATH=/crm-api # 接口地址 VITE_API_URL=/admin-api @@ -25,7 +25,7 @@ VITE_DROP_CONSOLE=true VITE_SOURCEMAP=false # 打包路径 -VITE_BASE_PATH=/ +VITE_BASE_PATH=/crm/ # 输出路径 VITE_OUT_DIR=dist-pro diff --git a/.env.stage b/.env.stage index ae34e48..d3f3995 100644 --- a/.env.stage +++ b/.env.stage @@ -10,7 +10,7 @@ VITE_BASE_URL='http://api-dashboard.yudao.iocoder.cn' VITE_UPLOAD_URL='http://118.31.23.45:48080/admin-api/system/file/upload' # 接口前缀 -VITE_API_BASEPATH= +VITE_API_BASEPATH=/crm-api # 接口地址 VITE_API_URL=/admin-api @@ -25,7 +25,7 @@ VITE_DROP_CONSOLE=true VITE_SOURCEMAP=false # 打包路径 -VITE_BASE_PATH='http://static-vue3.yudao.iocoder.cn/' +VITE_BASE_PATH='/crm' # 输出路径 VITE_OUT_DIR=dist-stage diff --git a/.env.static b/.env.static index c0cc560..446f225 100644 --- a/.env.static +++ b/.env.static @@ -10,7 +10,7 @@ VITE_BASE_URL='http://localhost:48080' VITE_UPLOAD_URL='http://118.31.23.45:48080/admin-api/system/file/upload' # 接口前缀 -VITE_API_BASEPATH= +VITE_API_BASEPATH=/crm-api # 接口地址 VITE_API_URL=/admin-api @@ -25,7 +25,7 @@ VITE_DROP_CONSOLE=true VITE_SOURCEMAP=false # 打包路径 -VITE_BASE_PATH=/admin-ui-vue3/ +VITE_BASE_PATH=/crm/ # 输出路径 VITE_OUT_DIR=dist-dev diff --git a/.env.test b/.env.test index 7af3d84..9422e59 100644 --- a/.env.test +++ b/.env.test @@ -10,7 +10,7 @@ VITE_BASE_URL='http://localhost:48080' VITE_UPLOAD_URL='http://118.31.23.45:48080/admin-api/system/file/upload' # 接口前缀 -VITE_API_BASEPATH= +VITE_API_BASEPATH=/crm-api # 接口地址 VITE_API_URL=/admin-api @@ -25,7 +25,7 @@ VITE_DROP_CONSOLE=false VITE_SOURCEMAP=true # 打包路径 -VITE_BASE_PATH=/ +VITE_BASE_PATH=/crm/ # 输出路径 VITE_OUT_DIR=dist-test diff --git a/src/api/home/index.js b/src/api/home/index.js new file mode 100644 index 0000000..ea137e1 --- /dev/null +++ b/src/api/home/index.js @@ -0,0 +1,20 @@ +import request from '@/config/axios' +// 线索情况 +export const getUserClueCount = async (params) => { + return await request.get({ url: '/admin-api/crm/home/get-user-count', params }) +} + +// 成交率 +export const getClueSignSignRate = async (params) => { + return await request.get({ url: '/admin-api/crm/home/get-sign-rate', params }) +} + +// 成交率 +export const getClueSignSignRank = async (params) => { + return await request.get({ url: '/admin-api/crm/home/get-sign-top10', params }) +} + +// 成交率 +export const getClueFollowRank = async (params) => { + return await request.get({ url: '/admin-api/crm/home/get-follow-top10', params }) +} diff --git a/src/config/axios/config.ts b/src/config/axios/config.ts index e0b2f1a..079df83 100644 --- a/src/config/axios/config.ts +++ b/src/config/axios/config.ts @@ -7,7 +7,7 @@ const config: { /** * api请求基础路径 */ - base_url: 'http://localhost' + import.meta.env.VITE_API_BASEPATH, + base_url: import.meta.env.VITE_API_BASEPATH, /** * 接口成功返回状态码 */ diff --git a/src/config/axios/service.ts b/src/config/axios/service.ts index f389b86..8adfc2f 100644 --- a/src/config/axios/service.ts +++ b/src/config/axios/service.ts @@ -200,14 +200,18 @@ service.interceptors.response.use( } else { ElNotification.error({ title: msg }) if (code == 403) { - // 无访问权限,退出登录 - const { wsCache } = useCache() - const tenantId = wsCache.get('TENANT_ID') - const appId = wsCache.get('App_ID') - resetRouter() // 重置静态路由表 - wsCache.clear() - removeToken() - window.location.href = `/login?tenantId=${tenantId}&appId=${appId}` + ElMessageBox.confirm(`${msg},是否重新登陆`, '提示', { + type: 'warning' + }).then(() => { + // 无访问权限,退出登录 + const { wsCache } = useCache() + const tenantId = wsCache.get('TENANT_ID') + const appId = wsCache.get('App_ID') + resetRouter() // 重置静态路由表 + wsCache.clear() + removeToken() + window.location.href = `/crm/login?tenantId=${tenantId}&appId=${appId}` + }) } } return Promise.reject('error') @@ -255,7 +259,7 @@ const handleAuthorized = () => { isRelogin.show = false // 干掉token后再走一次路由让它过router.beforeEach的校验 // window.location.href = window.location.href - window.location.href = `/login?tenantId=${tenantId}&appId=${appId}` + window.location.href = `/crm/login?tenantId=${tenantId}&appId=${appId}` }) } return Promise.reject(t('sys.api.timeoutMessage')) diff --git a/src/layout/components/Message/src/Message.vue b/src/layout/components/Message/src/Message.vue index 4e22635..348c47c 100644 --- a/src/layout/components/Message/src/Message.vue +++ b/src/layout/components/Message/src/Message.vue @@ -24,7 +24,7 @@ const getUnreadCount = async () => { // 跳转我的站内信 const goMyList = () => { push({ - name: 'MyNotifyMessage' + name: 'NotifyMessage' }) } diff --git a/src/layout/components/Setting/src/Setting.vue b/src/layout/components/Setting/src/Setting.vue index c4029f3..bdeb2ca 100644 --- a/src/layout/components/Setting/src/Setting.vue +++ b/src/layout/components/Setting/src/Setting.vue @@ -198,6 +198,7 @@ const clear = () => { - - - - - + + + + + @@ -146,7 +146,8 @@ import { set } from 'lodash-es' import { EChartsOption } from 'echarts' import { useUserStore } from '@/store/modules/user' import avatarImg from '@/assets/imgs/avatar.gif' -import { pieOptions, lineOptions } from './echarts-data' +import { lineOptions } from './echarts-data' +import * as HomeApi from '@/api/home/index' const { t } = useI18n() const userStore = useUserStore() @@ -154,59 +155,46 @@ const loading = ref(false) const avatar = userStore.getUser.avatar ? userStore.getUser.avatar : avatarImg const username = userStore.getUser.nickname -const followDate = ref('day') +const followDate = ref(1) // 成交线索来源 -const pieOptionsData = reactive(pieOptions) as EChartsOption -const getSaleClueSource = async () => { - const data = [ - { value: 335, name: '宝典' }, - { value: 310, name: '一点通' }, - { value: 234, name: '抖音' }, - { value: 135, name: '小红书' }, - { value: 1548, name: '转介绍' } - ] - set( - pieOptionsData, - 'legend.data', - data.map((v) => t(v.name)) - ) - pieOptionsData!.series![0].data = data.map((v) => { - return { - name: t(v.name), - value: v.value - } - }) -} +// const pieOptionsData = reactive(pieOptions) as EChartsOption +// const getSaleClueSource = async () => { +// const data = [ +// { value: 335, name: '宝典' }, +// { value: 310, name: '一点通' }, +// { value: 234, name: '抖音' }, +// { value: 135, name: '小红书' }, +// { value: 1548, name: '转介绍' } +// ] +// set( +// pieOptionsData, +// 'legend.data', +// data.map((v) => t(v.name)) +// ) +// pieOptionsData!.series![0].data = data.map((v) => { +// return { +// name: t(v.name), +// value: v.value +// } +// }) +// } // 成交率 const lineOptionsData = reactive(lineOptions) as EChartsOption const getMonthlySaleRate = async () => { - const data = [ - { estimate: 100, actual: 120, name: 'analysis.january' }, - { estimate: 120, actual: 82, name: 'analysis.february' }, - { estimate: 161, actual: 91, name: 'analysis.march' }, - { estimate: 134, actual: 154, name: 'analysis.april' }, - { estimate: 105, actual: 162, name: 'analysis.may' }, - { estimate: 160, actual: 140, name: 'analysis.june' }, - { estimate: 165, actual: 145, name: 'analysis.july' }, - { estimate: 114, actual: 250, name: 'analysis.august' }, - { estimate: 163, actual: 134, name: 'analysis.september' }, - { estimate: 185, actual: 56, name: 'analysis.october' }, - { estimate: 118, actual: 99, name: 'analysis.november' }, - { estimate: 123, actual: 123, name: 'analysis.december' } - ] + const data = await HomeApi.getClueSignSignRate() set( lineOptionsData, 'xAxis.data', - data.map((v) => t(v.name)) + data.map((v) => t(v.month)) ) set(lineOptionsData, 'series', [ { name: '个人成交率', smooth: true, type: 'line', - data: data.map((v) => v.estimate), + data: data.map((v) => v.personalRate), animationDuration: 2800, animationEasing: 'cubicInOut' }, @@ -215,33 +203,50 @@ const getMonthlySaleRate = async () => { smooth: true, type: 'line', itemStyle: {}, - data: data.map((v) => v.actual), + data: data.map((v) => v.avgRate), animationDuration: 2800, animationEasing: 'quadraticOut' } ]) } -const followList = ref([ - { sort: 1, name: '张三', count: 12, orgName: '销售1组' }, - { sort: 2, name: '张三', count: 11, orgName: '销售3组' }, - { sort: 3, name: '张三', count: 11, orgName: '销售1组' }, - { sort: 4, name: '张三', count: 10, orgName: '销售1组' }, - { sort: 5, name: '张三', count: 2, orgName: '销售2组' }, - { sort: 6, name: '张三', count: 1, orgName: '销售1组' }, - { sort: 2, name: '张三', count: 11, orgName: '销售3组' }, - { sort: 3, name: '张三', count: 11, orgName: '销售1组' }, - { sort: 4, name: '张三', count: 10, orgName: '销售1组' }, - { sort: 5, name: '张三', count: 2, orgName: '销售2组' }, - { sort: 6, name: '张三', count: 1, orgName: '销售1组' } -]) +const followList = ref([]) + +const clueInfo = ref({ + todayFollowingNum: 0, + todayFollowedNum: 0, + todaySignedNum: 0, + outFollowNum: 0, + unknownNum: 0 +}) + +function getClueInfo() { + HomeApi.getUserClueCount().then((data) => { + clueInfo.value = data + }) +} + +function getFollowList() { + HomeApi.getClueFollowRank({ type: followDate.value }).then((data) => { + followList.value = data + }) +} + +const signList = ref([]) +function getSignList() { + HomeApi.getClueSignSignRank().then((data) => { + signList.value = data + }) +} const getAllApi = async () => { - await Promise.all([getSaleClueSource(), getMonthlySaleRate()]) + await Promise.all([getClueInfo(), getSignList(), getMonthlySaleRate(), getFollowList()]) loading.value = false } -getAllApi() +onMounted(() => { + getAllApi() +}) diff --git a/src/views/Profile/components/UserSocial.vue b/src/views/Profile/components/UserSocial.vue index 5d1664e..1af0392 100644 --- a/src/views/Profile/components/UserSocial.vue +++ b/src/views/Profile/components/UserSocial.vue @@ -61,6 +61,8 @@ const bindSocial = () => { }) } const bind = (row) => { + message.info('暂未开放,敬请期待') + return const redirectUri = location.origin + '/user/profile?type=' + row.type // 进行跳转 socialAuthRedirect(row.type, encodeURIComponent(redirectUri)).then((res) => { diff --git a/vite.config.js b/vite.config.js index 6b106c5..ac78303 100644 --- a/vite.config.js +++ b/vite.config.js @@ -40,11 +40,11 @@ export default ({ command, mode }) => { changeOrigin: true, rewrite: (path) => path.replace(new RegExp(`^/call-api`), '') }, - ['/dev-api']: { + ['/crm-api']: { target: env.VITE_BASE_URL, ws: false, changeOrigin: true, - rewrite: (path) => path.replace(new RegExp(`^/dev-api`), '') + rewrite: (path) => path.replace(new RegExp(`^/crm-api`), '') } } },