From 35600498235cfa36dd86ef6fceec70002015586e Mon Sep 17 00:00:00 2001 From: "[yxf]" <[1524240689@qq.com]> Date: Wed, 15 Apr 2026 10:41:07 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=8E=B7=E5=8F=96=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=20=20=E5=9B=BE=E7=89=87=E5=8A=A8=E6=80=81=E8=8E=B7?= =?UTF-8?q?=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/views/im/code/components/alink.vue | 44 ++----------- .../src/views/im/code/components/wangye.vue | 52 +++++++-------- im-admin-ui/src/views/im/code/index.vue | 64 +++++++++++++++++-- .../im/controller/ImAgentController.java | 25 ++++++++ .../java/org/dromara/im/domain/ImAgent.java | 9 +++ .../org/dromara/im/domain/bo/ImAgentBo.java | 8 +++ .../org/dromara/im/domain/vo/ImAgentVo.java | 9 +++ .../dromara/im/service/IImAgentService.java | 5 ++ .../im/service/impl/ImAgentServiceImpl.java | 14 ++++ 9 files changed, 160 insertions(+), 70 deletions(-) diff --git a/im-admin-ui/src/views/im/code/components/alink.vue b/im-admin-ui/src/views/im/code/components/alink.vue index 2d3b861..5f6bb5d 100644 --- a/im-admin-ui/src/views/im/code/components/alink.vue +++ b/im-admin-ui/src/views/im/code/components/alink.vue @@ -11,27 +11,21 @@ - + +
点击体验 复制代码 @@ -38,38 +39,37 @@
+ + + \ No newline at end of file diff --git a/im-admin-ui/src/views/im/code/index.vue b/im-admin-ui/src/views/im/code/index.vue index 17386d4..9e5b2e4 100644 --- a/im-admin-ui/src/views/im/code/index.vue +++ b/im-admin-ui/src/views/im/code/index.vue @@ -2,12 +2,20 @@
+ + + - + - + @@ -21,11 +29,15 @@ import { ref, computed, onMounted, getCurrentInstance } from 'vue'; // import { adminAppCustomer, appReset } from '@/api/kefu'; import alink from './components/alink.vue'; import wangye from './components/wangye.vue'; +import FloatBallSetting from './components/FloatBallSetting.vue'; +import type { FloatBallConfig } from './components/FloatBallSetting.vue'; +import { getInfo } from '@/api/login'; // import kaifa from './components/kaifa'; // import setting from './components/setting'; const activeName = ref('1'); - +const floatBallSettingRef = ref>(); +const uniqueToken = ref(''); const { proxy } = getCurrentInstance() as any; // const store = useStore(); @@ -33,7 +45,11 @@ const { proxy } = getCurrentInstance() as any; // const categoryId = computed(() => store.state.userLevel?.categoryId); // const labelWidth = computed(() => (isMobile.value ? undefined : 75)); // const labelPosition = computed(() => (isMobile.value ? 'top' : 'left')); - +// 👇 定义悬浮球配置(默认空) +const floatBallConfig = ref({ + pcImage: '', + mobileImage: '', +}); const token = ref(''); const canfrime = ref(false); const srcUrl = ref(`${location.origin}/customerServer.js`); @@ -42,7 +58,10 @@ const cloneTip = ref(false); const canCustomerServer = ref(''); const linkUrl = computed(() => `${location.origin}/chat/index?token=${token.value?.token_md5}&noCanClose=1`); - +onMounted(() => { + // 页面加载就获取当前代理的 uniqueToken ✅ + fetchAgentToken(); +}); // onMounted(() => { // getAdminAppCustomer(); // }); @@ -60,6 +79,36 @@ const linkUrl = computed(() => `${location.origin}/chat/index?token=${token.valu // // ignore if module not present // } // } +// 获取当前登录用户的 uniqueToken +async function fetchAgentToken() { + try { + const res = await getInfo(); + if (res.data?.tokenInfo?.uniqueToken) { + // 拿到真正的 token! + uniqueToken.value = res.data.tokenInfo.uniqueToken; + console.log('✅ 获取成功 uniqueToken =', uniqueToken.value); + } + } catch (e) { + console.error('获取token失败', e); + } +} + +// 处理悬浮球配置更新 +function handleFloatBallConfigUpdate(config: FloatBallConfig) { + floatBallConfig.value = config; + // 这里可以将配置应用到客服组件 + console.log('悬浮球配置已更新:', config); +} + +// 处理悬浮球配置保存 +function handleFloatBallConfigSaved(config: FloatBallConfig) { + floatBallConfig.value = config; + // 可以在这里执行额外的保存逻辑,比如同步到服务器 + console.log('悬浮球配置已保存:', config); + + // 如果需要保存到服务器,可以在这里调用API + // saveFloatBallConfigToServer(config); +} function resetToken() { canfrime.value = true; @@ -144,7 +193,7 @@ function copyToClipboard(elem: HTMLElement) { } - + + \ No newline at end of file diff --git a/im-admin/ruoyi-im/src/main/java/org/dromara/im/controller/ImAgentController.java b/im-admin/ruoyi-im/src/main/java/org/dromara/im/controller/ImAgentController.java index c78b859..fcb7dff 100644 --- a/im-admin/ruoyi-im/src/main/java/org/dromara/im/controller/ImAgentController.java +++ b/im-admin/ruoyi-im/src/main/java/org/dromara/im/controller/ImAgentController.java @@ -7,6 +7,8 @@ import lombok.RequiredArgsConstructor; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.constraints.*; import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.im.domain.ImAgent; import org.springframework.web.bind.annotation.*; import org.springframework.validation.annotation.Validated; import org.dromara.common.idempotent.annotation.RepeatSubmit; @@ -91,6 +93,29 @@ public class ImAgentController extends BaseController { return toAjax(imAgentService.updateByBo(bo)); } + /** + * 更新代理悬浮球图片配置 + */ + @Log(title = "代理关联", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PostMapping("/updateFloatBall") + public R updateFloatBall(@RequestBody ImAgentBo bo) { + imAgentService.updateFloatBall(bo); + return R.ok(); + } + + /** + * 根据token获取代理悬浮球配置 + */ + @GetMapping("/infoByToken") + public R infoByToken(@RequestParam String token) { + ImAgent agent = imAgentService.getAgentByToken(token); + if (agent == null) { + return R.fail("代理不存在"); + } + return R.ok(MapstructUtils.convert(agent, ImAgentVo.class)); + } + /** * 删除代理关联 * diff --git a/im-admin/ruoyi-im/src/main/java/org/dromara/im/domain/ImAgent.java b/im-admin/ruoyi-im/src/main/java/org/dromara/im/domain/ImAgent.java index 8dbb339..595e8f5 100644 --- a/im-admin/ruoyi-im/src/main/java/org/dromara/im/domain/ImAgent.java +++ b/im-admin/ruoyi-im/src/main/java/org/dromara/im/domain/ImAgent.java @@ -66,5 +66,14 @@ public class ImAgent implements TransPojo { */ private Long maxCustomer; + /** + * PC端悬浮球图片 + */ + private String pcFloatBall; + + /** + * 移动端悬浮球图片 + */ + private String mobileFloatBall; } diff --git a/im-admin/ruoyi-im/src/main/java/org/dromara/im/domain/bo/ImAgentBo.java b/im-admin/ruoyi-im/src/main/java/org/dromara/im/domain/bo/ImAgentBo.java index b8b12fa..9541ee5 100644 --- a/im-admin/ruoyi-im/src/main/java/org/dromara/im/domain/bo/ImAgentBo.java +++ b/im-admin/ruoyi-im/src/main/java/org/dromara/im/domain/bo/ImAgentBo.java @@ -66,5 +66,13 @@ public class ImAgentBo { */ private Date packageExpireTime; + /** + * PC端悬浮球图片 + */ + private String pcFloatBall; + /** + * 移动端悬浮球图片 + */ + private String mobileFloatBall; } diff --git a/im-admin/ruoyi-im/src/main/java/org/dromara/im/domain/vo/ImAgentVo.java b/im-admin/ruoyi-im/src/main/java/org/dromara/im/domain/vo/ImAgentVo.java index 3627c16..ef03c86 100644 --- a/im-admin/ruoyi-im/src/main/java/org/dromara/im/domain/vo/ImAgentVo.java +++ b/im-admin/ruoyi-im/src/main/java/org/dromara/im/domain/vo/ImAgentVo.java @@ -77,5 +77,14 @@ public class ImAgentVo implements Serializable { */ private Date packageExpireTime; + /** + * PC端悬浮球图片 + */ + private String pcFloatBall; + /** + * 移动端悬浮球图片 + */ + private String mobileFloatBall; + } diff --git a/im-admin/ruoyi-im/src/main/java/org/dromara/im/service/IImAgentService.java b/im-admin/ruoyi-im/src/main/java/org/dromara/im/service/IImAgentService.java index 135b25a..2049e0d 100644 --- a/im-admin/ruoyi-im/src/main/java/org/dromara/im/service/IImAgentService.java +++ b/im-admin/ruoyi-im/src/main/java/org/dromara/im/service/IImAgentService.java @@ -95,4 +95,9 @@ public interface IImAgentService { * @return 如果套餐即将到期(七天内),返回到对应提示 每天只提示一次 */ String checkIsExpiredTask(Long sysId); + + /** + * 更新悬浮球图片配置 + */ + void updateFloatBall(ImAgentBo bo); } diff --git a/im-admin/ruoyi-im/src/main/java/org/dromara/im/service/impl/ImAgentServiceImpl.java b/im-admin/ruoyi-im/src/main/java/org/dromara/im/service/impl/ImAgentServiceImpl.java index b0793e7..f8d4742 100644 --- a/im-admin/ruoyi-im/src/main/java/org/dromara/im/service/impl/ImAgentServiceImpl.java +++ b/im-admin/ruoyi-im/src/main/java/org/dromara/im/service/impl/ImAgentServiceImpl.java @@ -246,4 +246,18 @@ public class ImAgentServiceImpl implements IImAgentService { return ""; } + + @Override + public void updateFloatBall(ImAgentBo bo) { + // 根据token查询当前代理 + ImAgent agent = getAgentByToken(bo.getUniqueToken()); + if (agent == null) { + throw new RuntimeException("代理不存在"+bo.getUniqueToken()); + } + + // 设置悬浮球图片 + agent.setPcFloatBall(bo.getPcFloatBall()); + agent.setMobileFloatBall(bo.getMobileFloatBall()); + baseMapper.updateById(agent); + } }