+
+
+
-
+
-
+
@@ -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);
+ }
}