feat: 圈子对接

This commit is contained in:
kaizheng(郑凯) 2025-02-08 23:04:37 +08:00
parent 23274c3d4a
commit 74dcb70174
24 changed files with 1726 additions and 881 deletions

View File

@ -1,7 +1,7 @@
ENV = 'development'
# 接口地址
VUE_APP_BASE_API = 'https://lczqvideodev.test.upchina.com'
VUE_APP_BASE_API = 'http://8.138.144.54:8080'
VUE_APP_WS_API = 'ws://localhost:8000'
# 是否启用 babel-plugin-dynamic-import-node插件

145
src/api/circle.js Normal file
View File

@ -0,0 +1,145 @@
import request from "@/utils/request";
// 后台查询交易圈列表
export function getCircleList(data) {
return request({
url: "/admin/group/info/list",
method: "post",
data
});
}
// 后台保存交易圈
export function saveCircle(data) {
return request({
url: "/admin/group/info/save",
method: "post",
data
});
}
// 后台更新交易圈
export function updateCircle(data) {
return request({
url: "/admin/group/info/update",
method: "post",
data
});
}
// 后台更新交易圈状态
export function updateCircleStatus(data) {
return request({
url: "/admin/group/info/updateStatus",
method: "post",
data
});
}
// 后台查询交易圈详情
export function getCircleDetail(data) {
return request({
url: "/admin/group/info/get",
method: "post",
data
});
}
// 设置互动状态
export function setInteractiveStatus(data) {
return request({
url: "/admin/group/message/setInteractiveStatus",
method: "post",
data
});
}
// 设置私聊状态
export function setPrivateStatus(data) {
return request({
url: "/admin/group/message/setPrivateStatus",
method: "post",
data
});
}
// 设置显示圈子人数
export function setShowMemberCount(data) {
return request({
url: "/admin/group/message/setShowMemberCount",
method: "post",
data
});
}
// 后台更新互动消息状态
export function updateMessageStatus(data) {
return request({
url: "/admin/group/message/updateStatus",
method: "post",
data
});
}
// 设置显示昵称
export function setShowNickName(data) {
return request({
url: "/admin/group/message/setShowNickName",
method: "post",
data
});
}
// 设置先审后发
export function setFirstAudit(data) {
return request({
url: "/admin/group/message/setFirstAudit",
method: "post",
data
});
}
// 后台获取互动消息
export function getMessageList(data) {
return request({
url: "/admin/group/message/getMessageList",
method: "post",
data
});
}
// 后台发送互动消息
export function sendAdvisorMessage(data) {
return request({
url: "/admin/group/message/sendAdvisorMessage",
method: "post",
data
});
}
// 后台获取私聊列表
export function getPrivateChatList(data) {
return request({
url: "/admin/group/message/getPrivateChatList",
method: "post",
data
});
}
// 后台设置消息精选
export function setMessageRecommend(data) {
return request({
url: "/admin/group/message/setMessageRecommend",
method: "post",
data
});
}
// 后台设置交易圈公告
export function setNotice(data) {
return request({
url: "/admin/group/info/setNotice",
method: "post",
data
});
}

View File

@ -1,654 +1,663 @@
import request from '@/utils/request'
import request from "@/utils/request";
//
export function getInfoList(data) {
return request({
url: '/admin/video/live/info/list',
method: 'post',
url: "/admin/video/live/info/list",
method: "post",
data
})
});
}
// 后台查询专栏列表
export function getColumnList(data) {
return request({
url: '/admin/video/live/column/list',
method: 'post',
url: "/admin/video/live/column/list",
method: "post",
data
})
});
}
// 后台创建视频直播
export function save(data) {
return request({
url: '/admin/video/live/info/save',
method: 'post',
url: "/admin/video/live/info/save",
method: "post",
data
})
});
}
export function batchSave(data) {
return request({
url: '/admin/video/live/info/batchSave',
method: 'post',
url: "/admin/video/live/info/batchSave",
method: "post",
data
})
});
}
// 后台更新视频信息
export function update(data) {
return request({
url: '/admin/video/live/info/update',
method: 'post',
url: "/admin/video/live/info/update",
method: "post",
data
})
});
}
// 后台标签列表
export function tagList(data) {
return request({
url: '/admin/common/tag/list',
method: 'post',
url: "/admin/common/tag/list",
method: "post",
data
})
});
}
// 后台标签列表
export function uploadSign(data) {
return request({
url: '/admin/video/live/uploadSign',
method: 'get',
url: "/admin/video/live/uploadSign",
method: "get",
data
})
});
}
// 后台标签列表
export function librarySave(data) {
return request({
url: '/admin/video/live/library/save',
method: 'post',
url: "/admin/video/live/library/save",
method: "post",
data
})
});
}
// 后台标签列表
export function livePlayInfo(params) {
return request({
url: '/admin/video/live/playInfo',
method: 'get',
url: "/admin/video/live/playInfo",
method: "get",
params
})
});
}
// 后台标签列表
export function infoSubmit(data) {
return request({
url: '/admin/video/live/info/submit',
method: 'post',
url: "/admin/video/live/info/submit",
method: "post",
data
})
});
}
// 行为数据统计
export function cartList(params) {
return request({
url: '/app/video/live/cartList',
method: 'get',
url: "/app/video/live/cartList",
method: "get",
params
})
});
}
export function infoGet(params) {
return request({
url: '/admin/video/live/info/get',
method: 'get',
url: "/admin/video/live/info/get",
method: "get",
params
})
});
}
// 后台撤回操作
export function infoRecall(data) {
return request({
url: '/admin/video/live/info/recall',
method: 'post',
url: "/admin/video/live/info/recall",
method: "post",
data
})
});
}
export function behaviorStatistic(params) {
return request({
url: '/admin/video/live/behavior-statistic',
method: 'get',
url: "/admin/video/live/behavior-statistic",
method: "get",
params
})
});
}
// 客户数据统计
export function behaviorUser(data) {
return request({
url: '/admin/video/live/behavior-user-of-one',
method: 'post',
url: "/admin/video/live/behavior-user-of-one",
method: "post",
data
})
});
}
// 行为数据统计详情(某直播客户统计)
export function behaviorStaff(data) {
return request({
url: '/admin/video/live/behavior-staff-of-one',
method: 'post',
url: "/admin/video/live/behavior-staff-of-one",
method: "post",
data
})
});
}
// 后台审核视频直播
export function updateStatus(data) {
return request({
url: '/admin/video/live/info/updateStatus',
method: 'post',
url: "/admin/video/live/info/updateStatus",
method: "post",
data
})
});
}
// 后台保存推荐位
export function recommendSave(data) {
return request({
url: '/admin/video/live/info/recommend',
method: 'post',
url: "/admin/video/live/info/recommend",
method: "post",
data
})
});
}
// 后台保存推荐位
export function rLiveWsConfig(params) {
return request({
url: '/admin/common/getWebSocketConf',
method: 'get',
url: "/admin/common/getWebSocketConf",
method: "get",
params
})
});
}
export function uVideoControl(data) {
return request({
url: '/admin/video/live/info/control',
method: 'post',
url: "/admin/video/live/info/control",
method: "post",
data
})
});
}
export function getPlayerSign(data) {
return request({
url: '/admin/video/playerSign',
method: 'post',
url: "/admin/video/playerSign",
method: "post",
data
})
});
}
export function videoMessage(data) {
return request({
url: '/admin/video/live/message/list',
method: 'post',
url: "/admin/video/live/message/list",
method: "post",
data
})
});
}
// 后台删除互动消息
export function messageDelete(data) {
return request({
url: '/admin/video/live/message/delete',
method: 'post',
url: "/admin/video/live/message/delete",
method: "post",
data
})
});
}
// 后台发送互动消息
export function messageSend(data) {
return request({
url: '/admin/video/live/message/send',
method: 'post',
url: "/admin/video/live/message/send",
method: "post",
data
})
});
}
// 添加用户禁言
export function addCommentBlack(data) {
return request({
url: '/admin/comment/addCommentBlack',
method: 'post',
url: "/admin/comment/addCommentBlack",
method: "post",
data
})
});
}
// 解除用户禁言
export function removeCommentBlack(params) {
return request({
url: '/admin/comment/removeCommentBlack',
method: 'get',
url: "/admin/comment/removeCommentBlack",
method: "get",
params
})
});
}
// 中台查询禁言列表
export function queryCommentBlackList(params) {
return request({
url: "/admin/comment/queryCommentBlackList",
method: "get",
params
});
}
// 购物车上下架
export function cartUpdateStatus(data) {
return request({
url: '/admin/video/live/cart/updateStatus',
method: 'post',
url: "/admin/video/live/cart/updateStatus",
method: "post",
data
})
});
}
// 购物车修改可销售数量
export function updateSaleLimit(data) {
return request({
url: '/admin/video/live/cart/updateSaleLimit',
method: 'post',
url: "/admin/video/live/cart/updateSaleLimit",
method: "post",
data
})
});
}
// 后台停止互动
export function messageForbidden(data) {
return request({
url: '/admin/video/live/message/forbidden',
method: 'post',
url: "/admin/video/live/message/forbidden",
method: "post",
data
})
});
}
// 后台查询观点包列表
export function packageList(data) {
return request({
url: '/admin/view/package/list',
method: 'post',
url: "/admin/view/package/list",
method: "post",
data
})
});
}
// 购物车推荐
export function cartRecommend(data) {
return request({
url: '/admin/video/live/cart/recommend',
method: 'post',
url: "/admin/video/live/cart/recommend",
method: "post",
data
})
});
}
// 后台推荐产品消息
export function productMessage(data) {
return request({
url: '/admin/video/live/message/productMessage',
method: 'post',
url: "/admin/video/live/message/productMessage",
method: "post",
data
})
});
}
// 后台查询专栏详情
export function columnGet(params) {
return request({
url: '/admin/video/live/column/get',
method: 'get',
url: "/admin/video/live/column/get",
method: "get",
params
})
});
}
// 后台查询专栏列表
export function columnList(data) {
return request({
url: '/admin/video/live/column/list',
method: 'post',
url: "/admin/video/live/column/list",
method: "post",
data
})
});
}
// 后台创建视频专栏
export function columnSave(data) {
return request({
url: '/admin/video/live/column/save',
method: 'post',
url: "/admin/video/live/column/save",
method: "post",
data
})
});
}
// 后台推荐视频专栏
export function columnRecommend(data) {
return request({
url: '/admin/video/live/column/recommend',
method: 'post',
url: "/admin/video/live/column/recommend",
method: "post",
data
})
});
}
// 专栏状态修改
export function columnUpdateStatus(data) {
return request({
url: '/admin/video/live/column/updateStatus',
method: 'post',
url: "/admin/video/live/column/updateStatus",
method: "post",
data
})
});
}
// 风控列表
export function riskList(data) {
return request({
url: '/admin/video/live/risk-list',
method: 'post',
url: "/admin/video/live/risk-list",
method: "post",
data
})
});
}
// 直播活动列表
export function activityList(data) {
return request({
url: '/admin/video/live/activity/list',
method: 'post',
url: "/admin/video/live/activity/list",
method: "post",
data
})
});
}
// 新增活动
export function activitySave(data) {
return request({
url: '/admin/video/live/activity/save',
method: 'post',
url: "/admin/video/live/activity/save",
method: "post",
data
})
});
}
// 活动状态修改
export function activityUpdateStatus(data) {
return request({
url: '/admin/video/live/activity/updateStatus',
method: 'post',
url: "/admin/video/live/activity/updateStatus",
method: "post",
data
})
});
}
// 后台部门(营业部、分公司)列表查询
export function deptColumnList(params) {
return request({
url: '/admin/rbac/dept/common/list',
method: 'get',
url: "/admin/rbac/dept/common/list",
method: "get",
params
})
});
}
// 视频直播数据概况(已对接订单)
export function dataOverview(params) {
return request({
url: '/admin/video/live/data-overview',
method: 'get',
url: "/admin/video/live/data-overview",
method: "get",
params
})
});
}
// 视频直播实时趋势
export function nowTrend(params) {
return request({
url: '/admin/video/live/nowTrend',
method: 'get',
url: "/admin/video/live/nowTrend",
method: "get",
params
})
});
}
// 客户管理列表
export function customerList(data) {
return request({
url: '/admin/video/live/customer/list',
method: 'post',
url: "/admin/video/live/customer/list",
method: "post",
data
})
});
}
// 客户详情
export function customerDetails(params) {
return request({
url: '/admin/video/live/customer/details',
method: 'get',
url: "/admin/video/live/customer/details",
method: "get",
params
})
});
}
// 直播观看记录
export function videoReadRecord(data) {
return request({
url: '/admin/video/live/customer/video-read-record',
method: 'post',
url: "/admin/video/live/customer/video-read-record",
method: "post",
data
})
});
}
// 公开、关闭消息
export function messageOpen(data) {
return request({
url: '/admin/chat/message/open',
method: 'post',
url: "/admin/chat/message/open",
method: "post",
data
})
});
}
// 关键行为提醒列表
export function notifyList(data) {
return request({
url: '/admin/video/live/behavior/notify/list',
method: 'post',
url: "/admin/video/live/behavior/notify/list",
method: "post",
data
})
});
}
// 创建问卷
export function questionSave(data) {
return request({
url: '/admin/video/live/question/save',
method: 'post',
url: "/admin/video/live/question/save",
method: "post",
data
})
});
}
// 问卷列表
export function questionList(data) {
return request({
url: '/admin/video/live/question/list',
method: 'post',
url: "/admin/video/live/question/list",
method: "post",
data
})
});
}
// 问卷状态修改
export function questionUpdateStatus(data) {
return request({
url: '/admin/video/live/question/updateStatus',
method: 'post',
url: "/admin/video/live/question/updateStatus",
method: "post",
data
})
});
}
// 问卷详情
export function questionDetails(params) {
return request({
url: '/admin/video/live/question/details',
method: 'get',
url: "/admin/video/live/question/details",
method: "get",
params
})
});
}
// 问卷导出
export function questionExport(params) {
return request({
url: '/admin/video/live/question/export',
method: 'get',
url: "/admin/video/live/question/export",
method: "get",
params
})
});
}
// 视频直播开启消息审核
export function openMessAudit(data) {
return request({
url: '/admin/video/live/openMessAudit',
method: 'post',
url: "/admin/video/live/openMessAudit",
method: "post",
data
})
});
}
// 生成短链
export function urlResize(data) {
return request({
url: '/admin/url/resize',
method: 'post',
url: "/admin/url/resize",
method: "post",
data
})
});
}
// 查询历史消息数
export function messageCountApi(params) {
return request({
url: '/admin/chat/message/count',
method: 'get',
url: "/admin/chat/message/count",
method: "get",
params
})
});
}
// 查询腾讯云在线人数
export function txonline(params) {
return request({
url: '/admin/video/live/txonline',
method: 'get',
url: "/admin/video/live/txonline",
method: "get",
params
})
});
}
// 点击转码直播视频
export function liveProcess(params) {
return request({
url: '/admin/video/live/process',
method: 'get',
url: "/admin/video/live/process",
method: "get",
params
})
});
}
// 转码视频下载地址
export function videoDownload(params) {
return request({
url: '/admin/video/download',
method: 'get',
url: "/admin/video/download",
method: "get",
params
})
});
}
// 查询视频转码进度
export function videoDownProgress(params) {
return request({
url: '/admin/video/live/download/progress',
method: 'get',
url: "/admin/video/live/download/progress",
method: "get",
params
})
});
}
// 获取投顾互动消息
export function advisorMessageList(data) {
return request({
url: '/admin/video/live/advisorMessage/list',
method: 'post',
url: "/admin/video/live/advisorMessage/list",
method: "post",
data
})
});
}
// 后台查询课程列表
export function courseInfoList(data) {
return request({
url: '/admin/course/info/list',
method: 'post',
url: "/admin/course/info/list",
method: "post",
data
})
});
}
// 后台查询合集列表
export function serialInfoList(data) {
return request({
url: '/admin/serial/info/list',
method: 'post',
url: "/admin/serial/info/list",
method: "post",
data
})
});
}
// 修改互动类型
export function updateInteractType(data) {
return request({
url: '/admin/video/live/updateInteractType',
method: 'post',
url: "/admin/video/live/updateInteractType",
method: "post",
data
})
});
}
// 设置首页参数
export function setMainPageParam(data) {
return request({
url: '/admin/video/live/setMainPageParam',
method: 'post',
url: "/admin/video/live/setMainPageParam",
method: "post",
data
})
});
}
// 修改二维码开关
export function updateQWParam(data) {
return request({
url: '/admin/video/live/updateQWParam',
method: 'post',
url: "/admin/video/live/updateQWParam",
method: "post",
data
})
});
}
// 购物车产品推送
export function cartPush(data) {
return request({
url: '/admin/video/live/cart/push',
method: 'post',
url: "/admin/video/live/cart/push",
method: "post",
data
})
});
}
// 终端类型统计
export function queryUserClientType(params) {
return request({
url: '/admin/video/live/clientType',
method: 'get',
url: "/admin/video/live/clientType",
method: "get",
params
})
});
}
// 查询上次转推信息
export function getLastPush(params) {
return request({
url: '/admin/video/live/getLastPush',
method: 'get',
url: "/admin/video/live/getLastPush",
method: "get",
params
})
});
}
// 删除转推信息
export function deletePush(data) {
return request({
url: '/admin/video/live/deletePush',
method: 'post',
url: "/admin/video/live/deletePush",
method: "post",
data
})
});
}
// 保存转推信息
export function savePush(data) {
return request({
url: '/admin/video/live/savePush',
method: 'post',
url: "/admin/video/live/savePush",
method: "post",
data
})
});
}
// 保存转推信息
export function cancelPush(params) {
return request({
url: '/admin/video/live/cart/cancelPush',
method: 'get',
url: "/admin/video/live/cart/cancelPush",
method: "get",
params
})
});
}
// 查询混流详情
export function getMixData(data) {
return request({
url: '/admin/video/mix/get',
method: 'post',
url: "/admin/video/mix/get",
method: "post",
data
})
});
}
// 保存混流信息
export function saveMixData(data) {
return request({
url: '/admin/video/mix/save',
method: 'post',
url: "/admin/video/mix/save",
method: "post",
data
})
});
}
// 修改混流主画面显示
export function updateMixShowMain(data) {
return request({
url: '/admin/video/mix/updateShowMain',
method: 'post',
url: "/admin/video/mix/updateShowMain",
method: "post",
data
})
});
}
// 修改混流连麦状态
export function updateMixStatus(data) {
return request({
url: '/admin/video/mix/updateStatus',
method: 'post',
url: "/admin/video/mix/updateStatus",
method: "post",
data
})
});
}
// 修改是否显示完整昵称
export function showNickname(data) {
return request({
url: '/admin/video/live/showNickname',
method: 'post',
url: "/admin/video/live/showNickname",
method: "post",
data
})
}
});
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

View File

@ -1,6 +1,14 @@
import variables from '@/assets/styles/element-variables.scss'
import defaultSettings from '@/settings'
const { tagsView, fixedHeader, sidebarLogo, showFooter, footerTxt, caseNumber } = defaultSettings
import Config from "@/config";
import variables from "@/assets/styles/element-variables.scss";
import defaultSettings from "@/settings";
const {
tagsView,
fixedHeader,
sidebarLogo,
showFooter,
footerTxt,
caseNumber
} = defaultSettings;
const state = {
theme: variables.theme,
@ -10,27 +18,27 @@ const state = {
sidebarLogo: sidebarLogo,
showFooter: showFooter,
footerTxt: footerTxt,
caseNumber: caseNumber
}
caseNumber: caseNumber,
settingToC: Config.settingToC
};
const mutations = {
CHANGE_SETTING: (state, { key, value }) => {
if (state.hasOwnProperty(key)) {
state[key] = value
state[key] = value;
}
}
}
};
const actions = {
changeSetting({ commit }, data) {
commit('CHANGE_SETTING', data)
commit("CHANGE_SETTING", data);
}
}
};
export default {
namespaced: true,
state,
mutations,
actions
}
};

View File

@ -4,6 +4,7 @@ import { getToken, setToken, removeToken } from "@/utils/auth";
// import checkPermission from '@/utils/permission'
import { decrypt } from "@/utils/rsaEncrypt";
import { Message } from "element-ui";
import router from "@/router/routers";
export const setUserInfo = (res, commit) => {
// 如果没有任何权限,则赋予一个默认的权限,避免请求死循环
@ -62,6 +63,7 @@ const user = {
actions: {
// 登录
Login({ commit }, userInfo) {
debugger;
// console.log('userInfo ==>', userInfo)
const {
loginName,
@ -127,9 +129,10 @@ const user = {
commit("SET_SYSTEM_SAFETY", {});
localStorage.setItem("isFirst", 0);
removeToken();
location.href = `${window.config.webAuthUrl}?redirecturl=${
location.origin
}/syzbadmin`;
// location.href = `${window.config.webAuthUrl}?redirecturl=${
// location.origin
// }/syzbadmin`;
router.push("/login");
resolve();
} catch (error) {
reject(error);

View File

@ -4,8 +4,8 @@ import Config from "@/settings";
const TokenKey = Config.TokenKey;
export function getToken() {
// return Cookies.get(TokenKey)
return "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJiYWNrZW5kVXNlciI6IntcImRlcHRJZFwiOlwiMVwiLFwibG9naW5JZFwiOjEsXCJyb2xlc1wiOlsxXSxcInVzZXJJZFwiOjEsXCJ1c2VyTmFtZVwiOlwiYWRtaW5cIn0iLCJleHAiOjE3Mzg1MDYxNDd9.jRG7GUOTYi9xOy15hA5Wbm4eqe13Ao643vx20W1BJD8";
return Cookies.get(TokenKey);
// return "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJiYWNrZW5kVXNlciI6IntcImRlcHRJZFwiOlwiMVwiLFwibG9naW5JZFwiOjEsXCJyb2xlc1wiOlsxXSxcInVzZXJJZFwiOjEsXCJ1c2VyTmFtZVwiOlwiYWRtaW5cIn0iLCJleHAiOjE3Mzg2NjgzNDN9.1M4z2E4gSBmqAvkX6qJNHNTG5DXDJs0SC14qH-3jC9Y";
}
export function setToken(token, rememberMe) {

View File

@ -1,6 +1,6 @@
import axios from "axios";
import router from "@/router/routers";
import { Notification } from "element-ui";
import { Notification, Message } from "element-ui";
import store from "../store";
import { getToken } from "@/utils/auth";
import Config from "@/settings";

View File

@ -1,14 +1,31 @@
import JSEncrypt from 'jsencrypt/bin/jsencrypt.min'
import JSEncrypt from "jsencrypt/bin/jsencrypt";
// 密钥对生成 http://web.chacuo.net/netrsakeypair
const publicKey = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANL378k3RiZHWx5AfJqdH9xRNBmD9wGD\n' +
'2iRe41HdTNF8RUhNnHit5NpMNtGL0NPTSSpPjjI1kJfVorRvaQerUgkCAwEAAQ=='
const publicKey =
"MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANL378k3RiZHWx5AfJqdH9xRNBmD9wGD\n" +
"2iRe41HdTNF8RUhNnHit5NpMNtGL0NPTSSpPjjI1kJfVorRvaQerUgkCAwEAAQ==";
const privateKey =
"MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8\n" +
"mp0f3FE0GYP3AYPaJF7jUd1M0XxFSE2ceK3k2kw20YvQ09NJKk+OMjWQl9WitG9p\n" +
"B6tSCQIDAQABAkA2SimBrWC2/wvauBuYqjCFwLvYiRYqZKThUS3MZlebXJiLB+Ue\n" +
"/gUifAAKIg1avttUZsHBHrop4qfJCwAI0+YRAiEA+W3NK/RaXtnRqmoUUkb59zsZ\n" +
"UBLpvZgQPfj1MhyHDz0CIQDYhsAhPJ3mgS64NbUZmGWuuNKp5coY2GIj/zYDMJp6\n" +
"vQIgUueLFXv/eZ1ekgz2Oi67MNCk5jeTF2BurZqNLR3MSmUCIFT3Q6uHMtsB9Eha\n" +
"4u7hS31tj1UWE+D+ADzp59MGnoftAiBeHT7gDMuqeJHPL4b+kC+gzV4FGTfhR9q3\n" +
"tTbklZkD2A==";
// 加密
export function encrypt(txt) {
const encryptor = new JSEncrypt()
encryptor.setPublicKey(publicKey) // 设置公钥
return encryptor.encrypt(txt) // 对需要加密的数据进行加密
const encryptor = new JSEncrypt();
encryptor.setPublicKey(publicKey); // 设置公钥
return encryptor.encrypt(txt); // 对需要加密的数据进行加密
}
// 解密
export function decrypt(txt) {
const encryptor = new JSEncrypt();
encryptor.setPrivateKey(privateKey);
return encryptor.decrypt(txt);
}

View File

@ -1,18 +1,31 @@
<template>
<el-select v-model="mValue" :disabled="disabled" v-bind="$attrs" style="width: 100%;" v-on="$listeners" clearable>
<el-option v-for="item in options" :key="item.id" :label="item.name" :value="item.id" />
<el-select
v-model="mValue"
:disabled="disabled"
v-bind="$attrs"
style="width: 100%;"
v-on="$listeners"
clearable
:placeholder="placeholder"
>
<el-option
v-for="item in options"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</template>
<script>
import { tgList } from '@/api/adviser.js'
import { tgList } from "@/api/adviser.js";
export default {
name: 'AdviserSelect',
name: "AdviserSelect",
props: {
value: {
type: [String, Number],
default: ''
default: ""
},
deptId: {
type: [String, Number],
@ -20,7 +33,7 @@ export default {
},
name: {
type: [String, Object],
default: ''
default: ""
},
disabled: {
type: Boolean,
@ -30,46 +43,60 @@ export default {
// 1: 2:
type: Number,
default: 2
},
placeholder: {
type: String,
default: "请选择"
}
},
data() {
return {
options: []
};
},
watch: {
deptId() {
this.getTgList();
}
},
computed: {
mValue: {
get() {
return this.value
return this.value;
},
set(val) {
this.$emit('update:value', val)
this.$emit("update:value", val);
const item = this.options.find(item => item.id === val)
const item = this.options.find(item => item.id === val);
if (item) {
this.$emit('update:name', item.name)
this.$emit("update:name", item.name);
}
}
}
},
mounted() {
tgList({
current: 1,
size: 9999,
status: 3,
userType: 1,
deptId: this.deptId,
filterSelf: this.filterSelf
}).then(res => {
this.options = res.data.list
if (!this.disabled && this.options.length === 1) {
const item = this.options[0]
this.mValue = item.id
this.$emit('update:value', item.id)
this.$emit('update:name', item.name)
this.$emit('init', item)
}
})
this.getTgList();
},
methods: {
getTgList() {
tgList({
current: 1,
size: 9999,
status: 3,
userType: 1,
deptId: this.deptId,
filterSelf: this.filterSelf
}).then(res => {
this.options = res.data.list;
if (!this.disabled && this.options.length === 1) {
const item = this.options[0];
this.mValue = item.id;
this.$emit("update:value", item.id);
this.$emit("update:name", item.name);
this.$emit("init", item);
}
});
}
}
}
};
</script>

View File

@ -1,7 +1,12 @@
<template>
<div class="message-send">
<div class="msg-content">
<el-input type="textarea" rows="5" placeholder="文本输入区" />
<el-input
type="textarea"
v-model="content"
rows="5"
placeholder="文本输入区"
/>
<el-upload
class="avatar-uploader"
:headers="headers"
@ -15,27 +20,54 @@
</el-upload>
</div>
<div class="msg-opt">
<el-checkbox v-model="checked">设为精选</el-checkbox>
<el-dropdown split-button type="primary" @click="handleClick">
<el-checkbox v-model="isRecommend" :false-label="2" :true-label="1"
>设为精选</el-checkbox
>
<el-dropdown
split-button
type="primary"
@click="sendAdvisorMessage(1)"
:disabled="!content"
>
发送并推送
<el-dropdown-menu slot="dropdown">
<!-- <el-dropdown-menu slot="dropdown">
<el-dropdown-item>仅发送</el-dropdown-item>
<el-dropdown-item>定时发送</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown-menu> -->
</el-dropdown>
<el-button
type="primary"
:disabled="!imageUrl"
@click="sendAdvisorMessage(2)"
>发送图片</el-button
>
</div>
</div>
</template>
<script>
import { sendAdvisorMessage } from "@/api/circle.js";
import { getToken } from "@/utils/auth";
export default {
props: {
interactiveType: {
type: Number // :1;2
},
groupId: {
type: Number
},
replyId: {
type: Number
}
},
data() {
return {
headers: {
Authorization: "Bearer " + getToken(),
"X-File-Size": 0
},
imageUrl: ""
imageUrl: "",
content: "",
isRecommend: 2
};
},
methods: {
@ -54,6 +86,28 @@ export default {
return flase;
}
return true;
},
async sendAdvisorMessage(contentType) {
let ret = await sendAdvisorMessage({
content: contentType === 1 ? this.content : this.imageUrl,
groupId: this.groupId,
isRecommend: this.isRecommend,
interactiveType: this.interactiveType,
replyId: this.replyId,
contentType
});
if (ret && ret.code === 0) {
this.$message({
message: "发送成功",
type: "success"
});
if (contentType === 1) {
this.content = "";
} else {
this.imageUrl = "";
}
this.$emit("sendCallBack", {});
}
}
}
};
@ -75,22 +129,22 @@ export default {
.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 116px;
height: 116px;
line-height: 116px;
width: 108px;
height: 108px;
line-height: 108px;
text-align: center;
}
.avatar {
width: 116px;
height: 116px;
width: 108px;
height: 108px;
display: block;
}
.msg-content {
display: flex;
::v-deep .el-upload--picture-card {
width: 116px;
height: 116px;
line-height: 116px;
width: 108px;
height: 108px;
line-height: 108px;
}
}
.msg-opt {
@ -101,5 +155,8 @@ export default {
::v-deep .el-checkbox {
margin-right: 16px;
}
::v-deep .el-dropdown {
margin-right: 16px;
}
}
</style>

View File

@ -1,61 +1,181 @@
<template>
<ul class="news-list">
<li>
<div class="new-header">
<img />
<div class="news-info">
<div class="news-user">
<h5>地理团队至安全</h5>
<label>老师</label>
<span><i>1</i>/4</span>
<span>已读</span>
</div>
<p>2021-10-22</p>
</div>
</div>
<div class="new-content">
<p>同学们早上好</p>
</div>
</li>
<li>
<div class="new-header">
<img />
<div class="news-info">
<div class="news-info-top">
<div class="news-user">
<h5>地理团队至安全</h5>
<label>老师</label>
<span><i>1</i>/4</span>
<span>已读</span>
</div>
<div class="news-opt">
<el-link type="success">设为精选</el-link>
<el-link type="success">引用</el-link>
<el-link type="success">取消审核</el-link>
<el-link type="success">通过审核</el-link>
<div class="news-list-wrap">
<ul
class="news-list"
infinite-scroll-disabled="disabled"
v-infinite-scroll="getMessageList"
infinite-scroll-immediate="false"
>
<li v-for="(item, index) in list" :key="item.id">
<div class="new-header">
<img
v-if="item.userType === 1"
:src="item.advisor ? item.advisor.avatar : defaultAvatar.teacher"
/>
<img v-else-if="item.userType === 3" :src="defaultAvatar.assistant" />
<img v-else-if="item.userType === 2" :src="defaultAvatar.student" />
<div class="news-info">
<div class="news-info-top">
<div class="news-user">
<h5>{{ item.userName }}</h5>
<label
v-if="[1, 3].includes(item.userType)"
:class="[item.userType === 1 ? 'blue' : 'orange']"
>{{ item.userType === 1 ? "老师" : "助教" }}</label
>
<span><i>1</i>/4</span>
<span>已读</span>
</div>
<div class="news-opt">
<el-link type="success" @click="setMessageRecommend(item)">{{
item.isRecommend === 1 ? "取消精选" : "设为精选"
}}</el-link>
<el-link
type="success"
v-if="item.userType === 2"
@click="setReplyMsg(item)"
>引用</el-link
>
<el-link
type="success"
v-if="item.userType === 2 && item.isOpen === 1"
>取消审核</el-link
>
<el-link
type="success"
v-else-if="item.userType === 2 && item.isOpen === 2"
>通过审核</el-link
>
</div>
</div>
<p>{{ item.createTime }}</p>
</div>
<p>2021-10-22</p>
</div>
</div>
<div class="new-content">
<img
src="http://gips0.baidu.com/it/u=1690853528,2506870245&fm=3028&app=3028&f=JPEG&fmt=auto?w=1024&h=1024"
alt=""
/>
</div>
</li>
</ul>
<div class="new-content">
<p v-if="item.contentType === 1">{{ item.content }}</p>
<img v-else :src="item.content" alt="" />
</div>
</li>
</ul>
<p class="load-tip" v-if="loading">加载中...</p>
<p class="load-tip" v-if="!hasNext">没有更多了...</p>
<p class="load-tip" v-else-if="!loading && hasNext">下拉加载更多...</p>
</div>
</template>
<script>
import { getMessageList } from "@/api/circle.js";
import { setMessageRecommend } from "@/api/circle";
export default {
props: {
groupId: {
type: Number
},
type: {
// :1;2;3;4;5
type: Number
},
newMsg: {
type: Object
},
userId: {
// id
type: Number
}
},
data() {
return {
keyword: "",
list: [],
loading: true,
hasNext: true,
defaultAvatar: {
teacher: require("@/assets/images/defaultAvatar/teacher.png"),
student: require("@/assets/images/defaultAvatar/student.png"),
assistant: require("@/assets/images/defaultAvatar/assistant.png")
}
};
},
computed: {
disabled() {
return this.loading || !this.hasNext;
}
},
watch: {
groupId() {
this.searchMsg("");
},
newMsg(msg) {
if (
this.type === 1 ||
(this.type === 2 && msg.userType === 1) ||
(this.type === 4 && msg.isRecommend === 1)
)
this.list.unshift(msg);
}
},
created() {
this.searchMsg("");
},
methods: {
async getMessageList() {
debugger;
this.loading = true;
let ret = await getMessageList({
groupId: this.groupId,
keyword: this.keyword,
lastId:
this.list && this.list.length
? this.list[this.list.length - 1].id
: "",
size: 10,
type: this.type,
userId: this.userId
}).catch(() => {
this.loading = false;
});
if (ret && ret.code === 0) {
this.list = this.list.concat(ret.data.list);
this.hasNext = ret.data.hasNext;
}
this.loading = false;
},
searchMsg(keyword) {
if (this.groupId) {
this.keyword = keyword;
this.list = [];
this.getMessageList();
}
},
setReplyMsg(item) {
this.$emit("setReplyMsg", item);
},
async setMessageRecommend(item) {
let ret = await setMessageRecommend({
isRecommend: item.isRecommend === 1 ? 2 : 1,
messageId: item.id
});
if (ret && ret.code === 0) {
this.$message({
message: "设置成功",
type: "success"
});
item.isRecommend = item.isRecommend === 1 ? 2 : 1;
}
}
}
};
</script>
<style lang="scss" scoped>
.news-list {
.news-list-wrap {
height: 600px;
overflow-y: scroll;
background: #fff;
}
.news-list {
list-style: none;
padding: 10px;
margin: 0;
flex: 1;
min-height: 500px;
overflow-y: scroll;
li {
margin: 0;
border-bottom: 1px dashed #999;
@ -116,4 +236,8 @@
}
}
}
.load-tip {
text-align: center;
line-height: 50px;
}
</style>

View File

@ -5,17 +5,26 @@
<el-button size="mini" type="primary" @click="closePrivateChat"
>返回群聊</el-button
>
<h5>凌琳131212</h5>
<h5>{{ userInfo.userName }}</h5>
</div>
<div>私聊中</div>
</div>
<newsList />
<newsList :type="5" :groupId="groupId" :userId="userInfo.userId" />
</div>
</template>
<script>
import newsList from "./newsList.vue";
export default {
components: { newsList },
props: {
groupId: {
type: Number
},
userInfo: {
type: Object,
default: () => {}
}
},
methods: {
closePrivateChat() {
this.$emit("closePrivateChat");
@ -48,4 +57,7 @@ export default {
margin: 0;
}
}
::v-deep .news-list-wrap {
height: 587px;
}
</style>

View File

@ -5,26 +5,72 @@
<el-button type="primary" size="mini">搜索</el-button>
</div>
<ul>
<li @click="toPrivateChat">
<div>
<el-badge is-dot class="item"><img src="" alt=""/></el-badge>
<li
@click="toPrivateChat(item)"
v-for="(item, index) in list"
:key="item.id"
>
<div class="left">
<div class="portrait">
<el-badge is-dot class="item"
><img :src="defaultAvatar.student" alt=""
/></el-badge>
</div>
<div class="user-info">
<p>{{ item.userName }}</p>
<p v-if="item.contentType === 1">{{ item.content }}</p>
<p v-if="item.contentType === 2">[图片]</p>
</div>
</div>
<div>
<p>1234</p>
<p>小可爱</p>
</div>
<div>
<p>2012-12-22 13:12:23</p>
<div class="time">
{{ item.createTime }}
</div>
</li>
</ul>
</div>
</template>
<script>
import { getPrivateChatList } from "@/api/circle.js";
export default {
props: {
groupId: {
type: Number
}
},
data() {
return {
defaultAvatar: {
teacher: require("@/assets/images/defaultAvatar/teacher.png"),
student: require("@/assets/images/defaultAvatar/student.png"),
assistant: require("@/assets/images/defaultAvatar/assistant.png")
},
list: []
};
},
watch: {
groupId() {
this.getPrivateChatList();
}
},
methods: {
toPrivateChat() {
this.$emit("toPrivateChat");
this.$emit("toPrivateChat", item);
},
async getPrivateChatList() {
this.loading = true;
let ret = await getPrivateChatList({
id: this.groupId
}).catch(() => {
this.loading = false;
});
if (ret && ret.code === 0) {
this.list = ret.data;
}
this.loading = false;
},
searchMsg() {
this.list = [];
this.getMessageList();
}
}
};
@ -50,33 +96,37 @@ ul {
display: flex;
border-bottom: 1px dashed #999;
cursor: pointer;
& > div {
padding: 8px 0;
.left {
display: flex;
flex-direction: column;
justify-content: center;
padding: 6px 0;
}
& > div:nth-child(1) {
width: 36px;
margin-right: 10px;
}
& > div:nth-child(2) {
width: 220px;
}
& > div:nth-child(5) {
flex: 1;
text-align: right;
}
p {
.portrait {
::v-deep .el-badge,
img {
width: 36px;
height: 36px;
border-radius: 50%;
}
margin-right: 6px;
}
.user-info {
p {
font-size: 14px;
margin: 0;
line-height: 14px;
width: 200px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
p:nth-child(1) {
margin-bottom: 4px;
}
}
.time {
width: 150px;
font-size: 14px;
margin: 0;
line-height: 16px;
}
::v-deep .el-badge,
img {
width: 36px;
height: 36px;
border-radius: 50%;
}
}
}

View File

@ -57,6 +57,54 @@
</dl>
</div>
</template>
<script>
import {
queryCommentBlackList,
addCommentBlack,
removeCommentBlack
} from "@/api/videoLive";
export default {
methods: {
setCommentBlack() {
this.$confirm(`您确定${item.isForbid === 2 ? "禁言" : "取消禁言"}?`, {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
.then(() => {
if (item.isForbid === 2) {
addCommentBlack(data).then(res => {
if (res.code === 0) {
this.$message({
message: "禁言成功",
showClose: false,
type: "success"
});
}
});
} else {
removeCommentBlack({ phone: item.userId }).then(res => {
if (res.code === 0) {
this.$message({
message: "取消禁言成功",
showClose: false,
type: "success"
});
}
});
}
})
.catch(() => {});
},
async getCommentBlackList() {
let ret = await CommentBlackList({
size: 10,
current: 1
});
}
}
};
</script>
<style lang="scss" scoped>
.search {
display: flex;

View File

@ -1,62 +1,132 @@
<template>
<div>
<div class="search">
<el-input size="mini" placeholder="" />
<el-button type="primary" size="mini">搜索</el-button>
<el-input size="mini" v-model="keyword" placeholder="" />
<el-button type="primary" size="mini" @click="searchMsg">搜索</el-button>
</div>
<ul class="news-list">
<li>
<div class="new-header">
<img />
<div class="news-info">
<div class="news-user">
<h5>地理团队至安全</h5>
<label>老师</label>
<span><i>1</i>/4</span>
<span>已读</span>
</div>
<p>2021-10-22</p>
</div>
</div>
<div class="new-content">
<p>同学们早上好</p>
</div>
</li>
<li>
<div class="new-header">
<img />
<div class="news-info">
<div class="news-info-top">
<div class="news-user">
<h5>地理团队至安全</h5>
<label>老师</label>
<span><i>1</i>/4</span>
<span>已读</span>
</div>
<div class="news-opt">
<div class="flex">
<el-link type="success">引用</el-link>
<el-link type="success">取消审核</el-link>
<div class="news-list-wrap">
<ul
class="news-list"
infinite-scroll-disabled="disabled"
v-infinite-scroll="getMessageList"
infinite-scroll-immediate="false"
>
<li v-for="(item, index) in list" :key="index">
<div class="new-header">
<img :src="defaultAvatar.student" />
<div class="news-info">
<div class="news-info-top">
<div class="news-user">
<h5>{{ item.userName }}</h5>
<label
v-if="[1, 3].includes(item.userType)"
:class="[item.userType === 1 ? 'blue' : 'orange']"
>{{ item.userType === 1 ? "老师" : "助教" }}</label
>
<span><i>1</i>/4</span>
<span>已读</span>
</div>
<div class="flex">
<el-link type="success">私聊</el-link>
<el-link type="success">取消禁言</el-link>
<div class="news-opt">
<div class="flex">
<el-link type="success" @click="setReplyMsg(item)"
>引用</el-link
>
<el-link type="success">取消审核</el-link>
</div>
<div class="flex">
<el-link type="success" @click="toPrivateChat(item)"
>私聊</el-link
>
<el-link type="success">取消禁言</el-link>
</div>
</div>
</div>
<p>{{ item.createTime }}</p>
</div>
<p>2021-10-22</p>
</div>
</div>
<div class="new-content">
<img
src="http://gips0.baidu.com/it/u=1690853528,2506870245&fm=3028&app=3028&f=JPEG&fmt=auto?w=1024&h=1024"
alt=""
/>
</div>
</li>
</ul>
<div class="new-content">
<p v-if="item.contentType === 1">{{ item.content }}</p>
<img v-else :src="item.content" alt="" />
</div>
</li>
</ul>
<p class="load-tip" v-if="loading">加载中...</p>
<p class="load-tip" v-if="!hasNext">没有更多了...</p>
<p class="load-tip" v-else-if="!loading && hasNext">下拉加载更多...</p>
</div>
</div>
</template>
<script>
import { getMessageList } from "@/api/circle.js";
export default {
props: {
groupId: {
type: Number
},
newMsg: {
type: Object
}
},
data() {
return {
keyword: "",
list: [],
loading: true,
hasNext: true,
defaultAvatar: {
teacher: require("@/assets/images/defaultAvatar/teacher.png"),
student: require("@/assets/images/defaultAvatar/student.png"),
assistant: require("@/assets/images/defaultAvatar/assistant.png")
}
};
},
computed: {
disabled() {
return this.loading || !this.hasNext;
}
},
watch: {
groupId() {
this.getMessageList();
},
newMsg(msg) {
if (msg.userType === 2) this.list.unshift(msg);
}
},
methods: {
async getMessageList() {
this.loading = true;
let ret = await getMessageList({
groupId: this.groupId,
keyword: this.keyword,
lastId:
this.list && this.list.length
? this.list[this.list.length - 1].id
: "",
size: 10,
type: 3 // :1;2;3;4
}).catch(() => {
this.loading = false;
});
if (ret && ret.code === 0) {
this.list = this.list.concat(ret.data.list);
this.hasNext = ret.data.hasNext;
}
this.loading = false;
},
searchMsg() {
this.list = [];
this.getMessageList();
},
setReplyMsg(item) {
this.$emit("setReplyMsg", item);
},
toPrivateChat(item) {
this.$emit("toPrivateChat", item);
}
}
};
</script>
<style lang="scss" scoped>
.search {
display: flex;
@ -65,13 +135,16 @@
margin-right: 10px;
}
}
.news-list-wrap {
height: 562px;
overflow-y: scroll;
background: #fff;
}
.news-list {
background: #fff;
list-style: none;
padding: 10px;
margin: 0;
min-height: 500px;
overflow-y: scroll;
li {
margin: 0;
border-bottom: 1px dashed #999;
@ -140,4 +213,8 @@
}
}
}
.load-tip {
text-align: center;
line-height: 50px;
}
</style>

View File

@ -2,68 +2,105 @@
<div class="app-container">
<div class="circle-change">
<h3>圈子消息</h3>
<el-form :inline="true" size="mini" :model="formInline" class="my-form">
<el-form-item label="">
<el-select v-model="formInline.region" placeholder="团队">
<el-option label="区域一" value="shanghai"></el-option>
<el-option label="区域二" value="beijing"></el-option>
</el-select>
<el-form :inline="true" size="mini" class="my-form">
<el-form-item>
<el-input :value="detail.advisor.deptName" disabled></el-input>
</el-form-item>
<el-form-item label="">
<el-select v-model="formInline.region" placeholder="主播">
<el-option label="区域一" value="shanghai"></el-option>
<el-option label="区域二" value="beijing"></el-option>
</el-select>
<el-form-item>
<el-input :value="detail.advisor.showName" disabled></el-input>
</el-form-item>
<el-form-item label="">
<el-select v-model="formInline.region" placeholder="圈子">
<el-option label="区域一" value="shanghai"></el-option>
<el-option label="区域二" value="beijing"></el-option>
<el-form-item>
<el-select
v-model="changeGroupId"
filterable
remote
reserve-keyword
placeholder="请输入关键词"
:remote-method="getCircleList"
>
<el-option
:key="detail.id"
:label="detail.name"
:value="detail.id"
disabled
>
</el-option>
<el-option
v-for="item in circleOptions"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit">切换</el-button>
<el-button type="primary" :disabled="changeGroupId === detail.id"
>切换</el-button
>
</el-form-item>
</el-form>
</div>
<div class="circle-main">
<div class="circle-main-header">
<div class="circle-info">
<img src="" alt="" />
<img :src="detail.coverImage" alt="" />
<div>
<h4>独立团专栏</h4>
<p>这里是介绍这是介绍是的是的</p>
<h4>{{ detail.name }}</h4>
<p>{{ detail.remark }}</p>
</div>
</div>
<div class="circle-set">
<div class="set-item-wrap">
<div class="set-item mb10">
<label>开放观众发言</label>
<el-switch v-model="value1"> </el-switch>
<el-switch
v-model="detail.interactiveStatus"
:active-value="1"
:inactive-value="2"
@change="changeSwitch(1)"
>
</el-switch>
</div>
<div class="set-item">
<label>先审后发</label>
<el-switch v-model="value1"> </el-switch>
<el-switch
v-model="detail.firstAudit"
:active-value="1"
:inactive-value="2"
@change="changeSwitch(2)"
>
</el-switch>
</div>
</div>
<div class="set-item-wrap">
<div class="set-item mb10">
<label>隐藏用户昵称</label>
<el-switch v-model="value1"> </el-switch>
<el-switch
v-model="detail.showNickName"
:active-value="2"
:inactive-value="1"
@change="changeSwitch(3)"
>
</el-switch>
</div>
<div class="set-item">
<label>隐藏圈子人数</label>
<el-switch v-model="value1"> </el-switch>
<el-switch
v-model="detail.showMemberCount"
:active-value="2"
:inactive-value="1"
@change="changeSwitch(4)"
>
</el-switch>
</div>
</div>
<el-badge is-dot class="item">
<img
class="icon"
@click="setNotice"
src="@/assets/images/trumpet.png"
alt=""
/>
</el-badge>
<img
class="icon"
@click="setNotice"
src="@/assets/images/trumpet.png"
alt=""
/>
<img
class="icon"
src="@/assets/images/data.png"
@ -76,27 +113,40 @@
<div class="circle-interact" v-if="chatType === 1">
<div class="circle-interact-header">
<ul class="tabs">
<li class="active">老师</li>
<li>全部</li>
<li>精选</li>
<li
:class="[msgType === item.id ? 'active' : '']"
v-for="(item, index) in msgTabs"
:key="item.id"
@click="msgType = item.id"
>
{{ item.name }}
</li>
</ul>
<el-form
:inline="true"
size="mini"
:model="formInline"
class="my-form"
>
<el-form :inline="true" size="mini" class="my-form">
<el-form-item label="">
<el-input placeholder="请输入内容搜索" />
<el-input v-model="msgKeyWord" placeholder="请输入内容搜索" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit">搜索</el-button>
<el-button type="primary" @click="onSearch">搜索</el-button>
</el-form-item>
</el-form>
</div>
<newsList />
<newsList
v-for="(item, index) in msgTabs"
:ref="`newsListRef${item.id}`"
:groupId="detail.id"
:type="item.id"
v-show="msgType === item.id"
@setReplyMsg="setReplyMsg"
:newMsg="newMsg"
/>
</div>
<privateChat v-else @closePrivateChat="() => (chatType = 1)" />
<privateChat
:userInfo="privateUserInfo"
:groupId="detail.id"
v-else
@closePrivateChat="() => (chatType = 1)"
/>
<div class="circle-user">
<ul class="tabs">
<li
@ -117,35 +167,69 @@
>
私聊列表
</li>
<li :class="[userTabIndex === 3 ? 'active' : '']">禁言列表</li>
<li
:class="[userTabIndex === 3 ? 'active' : '']"
@click="userTabIndex = 3"
>
禁言列表
</li>
</ul>
<userLnteractList v-if="userTabIndex === 0" />
<userList v-if="userTabIndex === 1" />
<privateList
v-if="userTabIndex === 2"
<userLnteractList
v-show="userTabIndex === 0"
:groupId="detail.id"
:newMsg="newMsg"
@setReplyMsg="setReplyMsg"
@toPrivateChat="toPrivateChat"
/>
<userList v-if="userTabIndex === 1" type="1" />
<privateList
v-show="userTabIndex === 2"
:groupId="detail.id"
@toPrivateChat="toPrivateChat"
/>
<userList
v-if="userTabIndex === 4"
@toPrivateChat="toPrivateChat"
type="2"
/>
</div>
</div>
</div>
<div class="quote">
<div class="quote" v-if="replyMsg.id">
<div class="quote-content">
<label>用户</label>
<p>萨达鲁大师克拉岛奥德赛拉</p>
<p>[图片]</p>
<label>用户{{ replyMsg.userName }}</label>
<p v-if="replyMsg.contentType === 1">{{ replyMsg.content }}</p>
<p v-else-if="replyMsg.contentType === 2">[图片]</p>
</div>
<i class="el-icon-close"></i>
</div>
<messageSend />
<messageSend
v-if="detail.status === 3"
:replyId="replyMsg.id"
:interactiveType="chatType"
:groupId="detail.id"
@sendCallBack="setReplyMsg"
/>
</div>
</template>
<script>
import {
getCircleList,
getCircleDetail,
setFirstAudit,
setInteractiveStatus,
setShowMemberCount,
setShowNickName,
setNotice
} from "@/api/circle.js";
import newsList from "./components/newsList.vue";
import userLnteractList from "./components/userLnteractList.vue";
import userList from "./components/userList.vue";
import privateList from "./components/privateList";
import messageSend from "./components/messageSend.vue";
import privateChat from "./components/privateChat.vue";
import { mapGetters } from "vuex";
import webSocketConnect from "./mixins/webSocketConnect";
export default {
components: {
newsList,
@ -157,12 +241,47 @@ export default {
},
data() {
return {
formInline: {},
changeGroupId: "",
msgTabs: [
{ name: "老师", id: 2 },
{ name: "全部", id: 1 },
{ name: "精选", id: 4 }
],
msgType: 1,
userTabIndex: 0,
chatType: 1
chatType: 1, // 1 2
detail: {
advisor: {}
},
circleOptions: [],
msgKeyWord: "",
replyMsg: {}, //
newMsg: {}
};
},
mixins: [webSocketConnect],
computed: {
...mapGetters(["user"])
},
async created() {
await this.getCircleDetail();
this.getCircleList();
},
methods: {
async getCircleList(name) {
const ret = await getCircleList({
advisorId: this.detail.advisor.id,
current: 1,
name,
size: 10,
userType: this.user.user.userType
});
if (ret && ret.code === 0) {
this.circleOptions = ret.data.list.filter(
item => item.id !== this.detail.id
);
}
},
setNotice() {
this.$prompt("", "圈子公告", {
confirmButtonText: "确定",
@ -170,11 +289,17 @@ export default {
inputType: "textarea",
inputPlaceholder: "请输入公告内容500字以内"
})
.then(({ value }) => {
this.$message({
type: "success",
message: "你的邮箱是: " + value
.then(async ({ value }) => {
let ret = await setNotice({
id: this.detail.id,
notice: value
});
if (ret && ret.code === 0) {
this.$message({
type: "success",
message: "公告设置成功"
});
}
})
.catch(() => {
this.$message({
@ -183,8 +308,66 @@ export default {
});
});
},
toPrivateChat() {
toPrivateChat(userInfo) {
this.privateUserInfo = userInfo;
this.chatType = 2;
},
async getCircleDetail() {
console.log(this.$route);
let ret = await getCircleDetail({ id: this.$route.params.id });
if (ret && ret.code === 0) {
this.detail = ret.data;
this.changeGroupId = this.detail.id;
this.connect(this.detail.id);
}
},
async changeSwitch(type) {
const option = {
1: {
//
key: "interactiveStatus",
fn: setInteractiveStatus
},
2: {
//
key: "firstAudit",
fn: setFirstAudit
},
3: {
//
key: "showNickName",
fn: setShowNickName
},
4: {
//
key: "showMemberCount",
fn: setShowMemberCount
}
};
let ret = await option[type].fn({
groupId: this.detail.id,
status: this.detail[option[type].key]
});
if (!ret && ret.code !== 0) {
}
},
onSearch() {
this.$refs[`newsListRef${this.msgType}`][0].searchMsg(this.msgKeyWord);
},
handleGroupChatTopic(msg) {
console.log("handleGroupChatTopic", msg);
debugger;
const body = JSON.parse(msg.body);
if ([1].includes(body.type)) {
// 1
this.newMsg = JSON.parse(msg.body).data;
}
},
handlePrivateChatTopic(msg) {
console.log("handlePrivateChatTopic", msg);
},
setReplyMsg(msg) {
this.replyMsg = msg;
}
}
};
@ -314,6 +497,9 @@ export default {
padding: 10px;
.quote-content {
display: flex;
p {
margin-left: 8px;
}
}
i {
cursor: pointer;

View File

@ -0,0 +1,80 @@
import { Client } from "@stomp/stompjs";
import { rLiveWsConfig } from "@/api/videoLive";
export default {
data() {
return {
stompClient: null
};
},
methods: {
async getConnectConfig(id) {
const res = await rLiveWsConfig({ id, type: 9 });
if (!this.stompClient && res && res.code === 0 && res.data) {
this.connect({ ...res.data, id });
}
},
// websock 链接
connect(id) {
const brokerUrl =
process.env.NODE_ENV === "development"
? "ws://8.138.144.54:8080/tgim/chat"
: `${location.protocol === "http:" ? "ws://" : "wss://"}${
location.host
}/tgim/chat`;
// 后端群组消息
const groupChatTopic = `/admin/group/topic/${id}`;
// 私聊消息
const privateChatTopic = `/admin/private/topic/${id}`;
const sessionId = Math.random()
.toString(36)
.substring(2, 8);
if (window.location.protocol === "http:") {
console.log("当前URL是HTTP");
} else if (window.location.protocol === "https:") {
console.log("当前URL是HTTPS");
brokerUrl = brokerUrl.replace("ws://", "wss://");
}
this.stompClient = new Client({
brokerURL: brokerUrl,
connectHeaders: {
sessionId,
productType: 41, // 视频ProductType=3
Authorization: "Bearer " + this.$store.state.user.token,
productId: id
},
debug: function(str) {
console.log("debug: " + str);
},
reconnectDelay: 5000,
heartbeatIncoming: 10000,
heartbeatOutgoing: 10000,
discardWebsocketOnCommFailure: true
});
this.stompClient.onConnect = async frame => {
console.log("链接成功");
console.log("Connected: ", frame);
// 后端群组消息
this.stompClient &&
this.stompClient.subscribe(groupChatTopic, msg => {
this.handleGroupChatTopic(msg);
});
// 后端私聊消息
this.stompClient &&
this.stompClient.subscribe(privateChatTopic, msg => {
this.handlePrivateChatTopic(msg);
});
};
this.stompClient.onStompError = error => {
console.log("onStompError", error);
};
this.stompClient.onDisconnect = error => {
console.log("onDisconnect", error);
};
this.stompClient.onWebSocketClose = error => {
console.log("onWebSocketClose", error);
};
this.stompClient.activate();
}
}
};

View File

@ -2,14 +2,14 @@
<div class="app-container">
<div class="head-container">
<el-input
v-model="columnName"
v-model="params.name"
clearable
placeholder="请输入课程名称"
placeholder="请输入圈子名称"
style="width: 200px;margin-right: 10px"
/>
<el-select
v-if="!yinxiao"
v-model="columnStatus"
v-model="params.status"
placeholder="请选择状态"
style="width: 200px;margin-right: 10px"
clearable
@ -34,7 +34,7 @@
style="width: 100%;"
>
<el-table-column label="序号" align="center" type="index" fixed />
<el-table-column prop="name" label="课程名称" width="180">
<el-table-column prop="name" label="交易圈名称" width="180">
<template slot-scope="scope">
<el-button
type="text"
@ -58,8 +58,6 @@
</el-popover>
</template>
</el-table-column>
<el-table-column prop="contentCount" label="内容数" width="80">
</el-table-column>
<el-table-column prop="createUserName" label="创建人" width="180">
</el-table-column>
<el-table-column prop="createTime" label="创建时间" width="180">
@ -130,7 +128,7 @@
type="text"
size="mini"
@click="copyUrl($event, scope.row)"
>复制课程链接</el-button
>复制圈子链接</el-button
>
<el-button
v-if="yunyin && scope.row.status === 5"
@ -165,42 +163,51 @@
append-to-body
width="700px"
>
<el-form label-width="80px">
<el-form-item label="圈子名称">
<el-form label-width="80px" ref="ruleForm" :model="form" :rules="rules">
<el-form-item label="圈子名称" prop="name">
<el-input
v-model="form.name"
clearable
placeholder="请输入课程名称"
placeholder="请输入圈子名称"
:maxlength="20"
show-word-limit
:disabled="isAdjust || isReadOnly"
/>
</el-form-item>
<el-form-item label="圈子投顾">
<el-form-item label="圈子投顾" prop="advisorId">
<div class="flex">
<el-select v-model="value" placeholder="请选择机构">
<!-- <el-select
v-model="form.deptId"
filterable
remote
reserve-keyword
placeholder="请选择机构"
:remote-method="getDeptList"
>
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
v-for="item in deptList"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
<el-select v-model="value" placeholder="请选择投顾">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</el-select> -->
<adviser-select
v-model="form.advisorId"
placeholder="请选择投顾"
:dept-id="user.user.deptId"
:disabled="tougu"
@init="
item => {
form.advisorId = item.id;
}
"
></adviser-select>
</div>
</el-form-item>
<el-form-item label="适用人群">
<el-form-item label="适用人群" prop="applicableUser">
<el-input
v-model="form.remark"
v-model="form.applicableUser"
clearable
type="textarea"
:autosize="{ minRows: 2, maxRows: 10 }"
@ -210,7 +217,7 @@
placeholder="请输入适用人群"
/>
</el-form-item>
<el-form-item label="圈子服务简介">
<el-form-item label="圈子服务简介" prop="remark">
<el-input
v-model="form.remark"
clearable
@ -230,7 +237,7 @@
@image-added="handleImageAdded"
/>
</el-form-item>
<el-form-item label="封面图">
<el-form-item label="封面图" prop="coverImage">
<el-upload
class="avatar-uploader"
:show-file-list="false"
@ -247,20 +254,14 @@
:src="form.coverImage"
class="avatar"
/>
<el-button v-else type="primary">上传图片</el-button>
<el-button size="mini" v-else type="primary">上传图片</el-button>
</el-upload>
</el-form-item>
<el-form-item label="讲师设置">
<adviser-select
v-model="form.advisorId"
:disabled="isAdjust || isReadOnly || !zhujiao || form.id"
:dept-id="user.user.deptId"
@init="
item => {
form.advisorId = item.id;
}
"
></adviser-select>
<el-form-item label="私聊状态">
<el-radio-group v-model="form.privateChatStatus">
<el-radio :label="1">开启</el-radio>
<el-radio :label="2">关闭</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="圈子类型">
<el-radio-group
@ -271,7 +272,11 @@
<el-radio label="0">免费</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item v-if="authority === '1'" label="权限号">
<el-form-item
v-if="authority === '1'"
label="权限号"
prop="authorityId"
>
<el-input
v-model="form.authorityId"
:disabled="isAdjust || isReadOnly"
@ -284,32 +289,41 @@
<el-option label="支付页链接" value="2"></el-option>
</el-select>
</el-form-item>
<el-form-item v-if="authority === '1'" label="链接地址">
<template v-if="linkType == '1'">
<page-select
v-model="form.pageId"
:disabled="isAdjust || isReadOnly"
/>
</template>
<template v-if="linkType == '2'">
<el-input
v-model="form.paymentUrl"
:disabled="isAdjust || isReadOnly"
/>
</template>
<el-form-item
v-if="authority === '1' && linkType == '1'"
label="链接地址"
prop="pageId"
>
<page-select
v-model="form.pageId"
:disabled="isAdjust || isReadOnly"
/>
</el-form-item>
<el-form-item
v-if="authority === '1' && linkType == '2'"
label="链接地址"
prop="paymentUrl"
>
<el-input
v-model="form.paymentUrl"
:disabled="isAdjust || isReadOnly"
/>
</el-form-item>
<el-row v-if="authority === '1'">
<el-col :span="12">
<el-form-item label="价格">
<el-input
<el-form-item label="价格" prop="originalPrice">
<el-input-number
:min="0"
v-model="form.originalPrice"
:disabled="isAdjust || isReadOnly"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="活动价">
<el-input
<el-form-item label="活动价" prop="activityPrice">
<el-input-number
min="0"
:max="form.originalPrice"
v-model="form.activityPrice"
:disabled="isAdjust || isReadOnly"
/>
@ -362,9 +376,9 @@
<!-- 分页器 -->
<el-pagination
style="margin-top: 50px;"
:current-page="page"
:current-page="params.current"
:page-sizes="[10, 20, 30, 40]"
:page-size="100"
:page-size="params.size"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
@size-change="sizeChange"
@ -375,14 +389,14 @@
<script>
import { mapGetters } from "vuex";
// import { queryTagList, tagSave, tagUpdate, updateStatus } from "@/api/tag.js";
import { getToken } from "@/utils/auth";
import {
getCourseList,
saveCourse,
updateCourse,
updateCourseStatus
} from "@/api/course.js";
getCircleList,
saveCircle,
updateCircle,
updateCircleStatus
} from "@/api/circle.js";
import { getDepts } from "@/api/channel";
import { urlResize } from "@/api/videoLive.js";
import { handleClipboard } from "@/views/liveBroadcast/manage/config.js";
import AdviserSelect from "@/views/adviser/components/select.vue";
@ -425,18 +439,15 @@ export default {
loading: false,
delLoading: false,
editLoading: false,
newTag: "",
total: 0,
page: 1,
params: {
current: 1,
size: 10,
name: "",
status: ""
},
size: 10,
data: [],
advisorList: [],
tag: {
id: "",
name: ""
},
columnName: "",
columnStatus: undefined,
RISK_LEVEL,
riskLevelList: {
0: "低风险",
@ -454,17 +465,47 @@ export default {
5: "已下架",
6: "已删除"
},
deptList: [], //
form: {
advisorId: "",
name: "",
type: 1,
remark: "",
coverImage: "",
pageId: "",
paymentUrl: "",
authorityId: "",
riskLevel: "",
weight: null
privateChatStatus: 1
},
rules: {
name: [{ required: true, message: "请输入圈子名称", trigger: "blur" }],
advisorId: [
{ required: true, message: "请选择圈子投顾", trigger: "blur" }
],
applicableUser: [
{ required: true, message: "请输入适用人群", trigger: "blur" }
],
remark: [
{ required: true, message: "请输入圈子服务简介", trigger: "blur" }
],
coverImage: [
{ required: true, message: "请上传封面图", trigger: "blur" }
],
authorityId: [
{ required: true, message: "请输入权限号", trigger: "blur" }
],
originalPrice: [
{ required: true, message: "请输入价格", trigger: "blur" }
],
activityPrice: [
{ required: true, message: "请输入活动价", trigger: "blur" }
],
pageId: [
{ required: true, message: "请选择链接地址", trigger: "blur" }
],
paymentUrl: [
{ required: true, message: "请输入链接地址", trigger: "blur" }
]
},
authority: "1",
linkType: "1",
@ -488,23 +529,32 @@ export default {
return role ? `${role}列表` : "";
}
},
watch: {
"form.deptId"() {
this.form.advisorId = "";
}
},
mounted() {
this.getLists(1);
this.getDeptList();
},
methods: {
async getDeptList(keyword) {
let ret = await getDepts({ keyword });
if (ret && ret.code === 0) {
this.deptList = ret.data;
}
},
async getLists(val) {
if (val) {
this.page = 1;
this.params.current = 1;
}
this.loading = true;
const { data } = await getCourseList({
current: this.page,
name: this.columnName,
size: this.size,
status: this.status || this.columnStatus,
userType: this.userType || this.user.user.userType
});
const { data } = await getCircleList(
Object.assign({}, this.params, {
userType: this.userType || this.user.user.userType
})
);
this.data = data.list;
this.total = data.total;
this.loading = false;
@ -554,7 +604,8 @@ export default {
pageId: "",
paymentUrl: "",
authorityId: "",
riskLevel: ""
riskLevel: "",
privateChatStatus: "1"
};
if (!this.form.advisorId && this.user.advisorInfo) {
this.form.advisorId = this.user.advisorInfo.id;
@ -577,7 +628,7 @@ export default {
});
return false;
}
const data = await updateCourseStatus({
const data = await updateCircleStatus({
...this.adjustForm,
id: this.form.id
});
@ -591,79 +642,50 @@ export default {
return;
}
if (!this.form.name) {
this.$message({
message: "课程名称不能为空",
type: "error"
});
return false;
}
if (!this.form.remark) {
this.$message({
message: "课程简介不能为空",
type: "error"
});
return false;
}
if (!this.form.coverImage) {
this.$message({
message: "封面图不能为空",
type: "error"
});
return false;
}
this.$refs.ruleForm.validate(async valid => {
if (valid) {
if (this.authority === "0") {
this.form.authorityId = "";
this.form.pageId = "";
this.form.paymentUrl = "";
this.form.originalPrice = "";
this.form.discountPrice = "";
} else if (!this.form.authorityId) {
this.$message({
message: "请输入权限号",
type: "error"
});
return false;
} else if (this.linkType === "2") {
if (!this.form.paymentUrl) {
this.$message({
message: "请输入支付链接",
type: "error"
});
return false;
}
this.form.pageId = "";
delete this.form.page;
} else {
this.form.paymentUrl = "";
}
if (!this.form.advisorId) {
if (this.user.advisorInfo) {
this.form.advisorId = this.user.advisorInfo.id;
} else {
this.$message({
message: "请选择讲师",
type: "error"
});
return false;
const data = this.form.id
? await updateCircle(this.form)
: await saveCircle(this.form);
if (data.code === 0) {
if (this.form.id) {
this.$message.success("修改成功");
} else {
this.$message.success("新增成功");
}
this.cancel();
this.getLists();
} else {
this.$message.error(data.message);
}
}
}
if (this.authority === "0") {
this.form.authorityId = "";
this.form.pageId = "";
this.form.paymentUrl = "";
this.form.originalPrice = "";
this.form.discountPrice = "";
} else if (!this.form.authorityId) {
this.$message({
message: "请输入权限号",
type: "error"
});
return false;
} else if (this.linkType === "2") {
if (!this.form.paymentUrl) {
this.$message({
message: "请输入支付链接",
type: "error"
});
return false;
}
this.form.pageId = "";
delete this.form.page;
} else {
this.form.paymentUrl = "";
}
const data = this.form.id
? await updateCourse(this.form)
: await saveCourse(this.form);
if (data.code === 0) {
if (this.form.id) {
this.$message.success("修改成功");
} else {
this.$message.success("新增成功");
}
this.cancel();
this.getLists();
} else {
this.$message.error(data.message);
}
});
},
async detail(row) {
this.$router.push("/circle/detail/" + row.id);
@ -690,12 +712,12 @@ export default {
event,
reason: ""
};
const data = await updateCourseStatus(params);
const data = await updateCircleStatus(params);
// console.log(data)
if (data.code === 0) {
this.$message.success("操作成功");
if (this.data.length === 1 && this.page !== 1) {
this.page -= 1;
if (this.data.length === 1 && this.params.current !== 1) {
this.params.current -= 1;
}
this.getLists();
} else {
@ -706,21 +728,25 @@ export default {
},
async copyUrl(event, item) {
const currentTarget = event.currentTarget;
let url = item.authorityId
? `/circle?id=${item.id}&saleUserId=${this.user.user.id}`
: `/circle/interact?id=${item.id}&saleUserId=${this.user.user.id}`;
const ret = await urlResize({
url: `/courseDetail?id=${item.id}&saleUserId=${this.user.user.id}`
url
});
if (ret.code === 0) {
handleClipboard(ret.data, event, currentTarget);
}
},
//
sizeChange(e) {
this.page = 1;
this.params.current = 1;
this.size = e;
this.getLists();
},
pageChange(e) {
this.page = e;
this.params.current = e;
this.getLists();
},
handlePictureCardPreview() {},
@ -814,7 +840,7 @@ export default {
height: 178px;
display: block;
}
.flx {
.flex {
display: flex;
}
</style>

View File

@ -230,33 +230,10 @@
</div>
</el-upload>
</el-form-item>
<el-form-item v-if="!settingToC" label="标签">
<el-select
v-model="ruleForm.tagIdList"
filterable
remote
multiple
reserve-keyword
placeholder="请选择标签"
:remote-method="remoteMethodTag"
:loading="loading"
>
<el-option
v-for="item in optionsTag"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="观看限制" prop="limitType">
<el-radio-group v-model="ruleForm.limitType">
<el-radio :label="1">无限制</el-radio>
<el-radio v-if="!settingToC" :label="2">手机号登录</el-radio>
<el-radio :label="3">邀请码观看</el-radio>
<el-radio v-if="!settingToC" :label="4">微信授权</el-radio>
<el-radio v-if="!settingToC" :label="5">产品专属直播</el-radio>
<el-radio :label="6">权限判定</el-radio>
</el-radio-group>
</el-form-item>
@ -324,10 +301,7 @@
</el-radio-group>
</el-form-item>
<!-- c端添加H5按钮 -->
<el-form-item
v-if="ruleForm.isCart === 1 && settingToC"
prop="cartList"
>
<el-form-item v-if="ruleForm.isCart === 1" prop="cartList">
<el-button type="primary" @click="dialogFormVisible = true"
>添加自定义产品</el-button
>
@ -436,65 +410,6 @@
</el-table-column>
</el-table>
</el-form-item>
<!-- 讲师设置 -->
<!-- <el-form-item label="讲师设置" prop="teacherId">
<adviser-select v-model="ruleForm.teacherId" :dept-id="user.user.deptId"
:disabled="!($route.query.isZj === '1' || ($route.query.type === '2' || $route.query.type === '3'))"
@init="(item) => { ruleForm.teacherId = item.id }"
@change="() => { ruleForm.serialIds = []; ruleForm.courseIds = []; }"></adviser-select>
</el-form-item> -->
<el-form-item v-if="ruleForm.isCart === 1 && !settingToC">
<el-select
v-model="ruleForm.cartProductType"
placeholder="请选择配置的产品类型"
style="margin-bottom:20px;"
>
<el-option
v-for="(item, index) in productTypeList"
:key="index"
:label="item.productName"
:value="item.productType"
>
</el-option>
</el-select>
<el-select
v-model="ruleForm.productListId"
filterable
remote
reserve-keyword
placeholder="请选择产品"
:remote-method="remoteMethodProduct"
:loading="loadingProduct"
prop="columnId"
@change="changeItem"
>
<el-option
v-for="item in productList"
:key="item.id"
:label="item.name"
:value="item.id"
:disabled="
(ruleForm.cartList || [])
.map(item => item.productId)
.includes(item.id)
"
>
</el-option>
</el-select>
<div>
<el-tag
v-for="(tag, index) in ruleForm.cartList"
:key="tag.name"
:disabled="$route.query.type === '2' || $route.query.type === '3'"
style="margin-right:10px"
:closable="!['2', '3'].includes($route.query.type)"
type="success"
@close="deleteCart(index, tag.id)"
>
{{ tag.name }}
</el-tag>
</div>
</el-form-item>
<el-form-item label="风险等级">
<el-select
@ -992,12 +907,12 @@ export default {
this.ruleForm.productType = null;
}
if (this.settingToC && this.ruleForm.isCart === 1) {
if (this.ruleForm.isCart === 1) {
this.ruleForm.cartList.forEach((item, index) => {
item.productId = index + 1;
});
}
if (this.settingToC && this.ruleForm.limitType === 1) {
if (this.ruleForm.limitType === 1) {
this.ruleForm.limitType === 2;
}
// id
@ -1235,7 +1150,7 @@ export default {
// this.optionsTag = [];
res.data.tagIdList = [];
}
if (this.settingToC && res.data.limitType === 2) {
if (res.data.limitType === 2) {
res.data.limitType === 1;
}
res.data.isShow = res.data.isDisplay;
@ -1556,9 +1471,6 @@ export default {
}
},
computed: {
...mapState({
settingToC: state => state.settings.settingToC
}),
...mapGetters(["user"]),
isCopy() {
return this.$route.query.isCopy;

View File

@ -1325,7 +1325,6 @@
<script>
import {
infoGet,
rLiveWsConfig,
uVideoControl,
livePlayInfo,
getPlayerSign,
@ -1569,8 +1568,8 @@ export default {
// "",
],
isShow: false,
defaultImg: require("@/assets/logo/people.png"),
userDefault: require("@/assets/logo/userDefault.png"),
defaultImg: require("@/assets/images/defaultAvatar/assistant.png"),
userDefault: require("@/assets/images/defaultAvatar/student.png"),
messageCount: 0,
dialogVisible: false,
iframeUrl: "", // iframe
@ -1997,9 +1996,20 @@ export default {
return false;
},
async getConnectConfig(id) {
const res = await rLiveWsConfig({ id, type: 3 });
if (!this.stompClient) {
this.connect({ ...res.data, id });
this.connect({
brokerUrl:
process.env.NODE_ENV === "development"
? "ws://8.138.144.54:8080/tgim/chat"
: `${location.protocol === "http:" ? "ws://" : "wss://"}${
location.host
}/tgim/chat`,
adminUserTopic: `/admin/user/topic/${id}`,
chatSubscribeDest: `/sub/video/${id}`,
notifySubscribeDest: `/sub/notify/${id}`,
videoOnlineNotifyTopic: `/admin/audience/${id}`,
id
});
}
},
playLiveStream() {
@ -2034,7 +2044,7 @@ export default {
sessionId,
productType: 3, // ProductType=3
Authorization: "Bearer " + this.$store.state.user.token,
GroupId: id
productId: id
},
debug: function(str) {
console.log("debug: " + str);

View File

@ -1,85 +1,128 @@
<template>
<div class="login" :style="'background-image:url('+ Background +');'">
<el-form ref="loginForm" :model="loginForm" :rules="loginRules" label-position="left" label-width="0px" class="login-form">
<div class="login" :style="'background-image:url(' + Background + ');'">
<el-form
ref="loginForm"
:model="loginForm"
:rules="loginRules"
label-position="left"
label-width="0px"
class="login-form"
>
<h3 class="title">
ELADMIN 后台管理系统
后台管理系统
</h3>
<el-form-item prop="username">
<el-input v-model="loginForm.username" type="text" auto-complete="off" placeholder="账号">
<svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" />
<el-input
v-model="loginForm.username"
type="text"
auto-complete="off"
placeholder="账号"
>
<svg-icon
slot="prefix"
icon-class="user"
class="el-input__icon input-icon"
/>
</el-input>
</el-form-item>
<el-form-item prop="password">
<el-input v-model="loginForm.password" type="password" auto-complete="off" placeholder="密码" @keyup.enter.native="handleLogin">
<svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon" />
<el-input
v-model="loginForm.password"
type="password"
auto-complete="off"
placeholder="密码"
@keyup.enter.native="handleLogin"
>
<svg-icon
slot="prefix"
icon-class="password"
class="el-input__icon input-icon"
/>
</el-input>
</el-form-item>
<el-form-item prop="code">
<el-input v-model="loginForm.code" auto-complete="off" placeholder="验证码" style="width: 63%" @keyup.enter.native="handleLogin">
<svg-icon slot="prefix" icon-class="validCode" class="el-input__icon input-icon" />
<el-form-item prop="captcha">
<el-input
v-model="loginForm.captcha"
auto-complete="off"
placeholder="验证码"
style="width: 63%"
@keyup.enter.native="handleLogin"
>
<svg-icon
slot="prefix"
icon-class="validCode"
class="el-input__icon input-icon"
/>
</el-input>
<div class="login-code">
<img :src="codeUrl" @click="getCode">
<img :src="codeUrl" @click="getCode" />
</div>
</el-form-item>
<el-checkbox v-model="loginForm.rememberMe" style="margin:0 0 25px 0;">
记住我
</el-checkbox>
<el-form-item style="width:100%;">
<el-button :loading="loading" size="medium" type="primary" style="width:100%;" @click.native.prevent="handleLogin">
<el-button
:loading="loading"
size="medium"
type="primary"
style="width:100%;"
@click.native.prevent="handleLogin"
>
<span v-if="!loading"> </span>
<span v-else> 中...</span>
</el-button>
</el-form-item>
</el-form>
<!-- 底部 -->
<div v-if="$store.state.settings.showFooter" id="el-login-footer">
<span v-html="$store.state.settings.footerTxt" />
<span v-if="$store.state.settings.caseNumber"> </span>
<a href="https://beian.miit.gov.cn/#/Integrated/index" target="_blank">{{ $store.state.settings.caseNumber }}</a>
</div>
</div>
</template>
<script>
import { encrypt } from '@/utils/rsaEncrypt'
import Config from '@/settings'
import { getCodeImg } from '@/api/login'
import Cookies from 'js-cookie'
import qs from 'qs'
import Background from '@/assets/images/background.jpeg'
import { encrypt } from "@/utils/rsaEncrypt";
import Config from "@/settings";
import { getCodeImg } from "@/api/login";
import Cookies from "js-cookie";
import qs from "qs";
import Background from "@/assets/images/background.jpeg";
export default {
name: 'Login',
name: "Login",
data() {
return {
Background: Background,
codeUrl: '',
cookiePass: '',
codeUrl: "",
cookiePass: "",
loginForm: {
username: 'admin',
password: '123456',
username: "admin",
password: "123456",
rememberMe: false,
code: '',
uuid: ''
captcha: "",
uuid: ""
},
loginRules: {
username: [{ required: true, trigger: 'blur', message: '用户名不能为空' }],
password: [{ required: true, trigger: 'blur', message: '密码不能为空' }],
code: [{ required: true, trigger: 'change', message: '验证码不能为空' }]
username: [
{ required: true, trigger: "blur", message: "用户名不能为空" }
],
password: [
{ required: true, trigger: "blur", message: "密码不能为空" }
],
captcha: [
{ required: true, trigger: "change", message: "验证码不能为空" }
]
},
loading: false,
redirect: undefined
}
};
},
watch: {
$route: {
handler: function(route) {
const data = route.query
const data = route.query;
if (data && data.redirect) {
this.redirect = data.redirect
delete data.redirect
if (JSON.stringify(data) !== '{}') {
this.redirect = this.redirect + '&' + qs.stringify(data, { indices: false })
this.redirect = data.redirect;
delete data.redirect;
if (JSON.stringify(data) !== "{}") {
this.redirect =
this.redirect + "&" + qs.stringify(data, { indices: false });
}
}
},
@ -88,127 +131,138 @@ export default {
},
created() {
//
this.getCode()
this.getCode();
// Cookie
this.getCookie()
this.getCookie();
// token
this.point()
this.point();
},
methods: {
getCode() {
getCodeImg().then(res => {
this.codeUrl = res.img
this.loginForm.uuid = res.uuid
})
this.codeUrl = res.data.img;
this.loginForm.uuid = res.data.uuid;
});
},
getCookie() {
const username = Cookies.get('username')
let password = Cookies.get('password')
const rememberMe = Cookies.get('rememberMe')
const username = Cookies.get("username");
let password = Cookies.get("password");
const rememberMe = Cookies.get("rememberMe");
// cookie
this.cookiePass = password === undefined ? '' : password
password = password === undefined ? this.loginForm.password : password
this.cookiePass = password === undefined ? "" : password;
password = password === undefined ? this.loginForm.password : password;
this.loginForm = {
username: username === undefined ? this.loginForm.username : username,
password: password,
rememberMe: rememberMe === undefined ? false : Boolean(rememberMe),
code: ''
}
captcha: ""
};
},
handleLogin() {
this.$refs.loginForm.validate(valid => {
const user = {
username: this.loginForm.username,
loginName: this.loginForm.username,
password: this.loginForm.password,
rememberMe: this.loginForm.rememberMe,
code: this.loginForm.code,
captcha: this.loginForm.captcha,
uuid: this.loginForm.uuid
}
};
if (user.password !== this.cookiePass) {
user.password = encrypt(user.password)
user.password = encrypt(user.password);
}
if (valid) {
this.loading = true
this.loading = true;
if (user.rememberMe) {
Cookies.set('username', user.username, { expires: Config.passCookieExpires })
Cookies.set('password', user.password, { expires: Config.passCookieExpires })
Cookies.set('rememberMe', user.rememberMe, { expires: Config.passCookieExpires })
Cookies.set("username", user.username, {
expires: Config.passCookieExpires
});
Cookies.set("password", user.password, {
expires: Config.passCookieExpires
});
Cookies.set("rememberMe", user.rememberMe, {
expires: Config.passCookieExpires
});
} else {
Cookies.remove('username')
Cookies.remove('password')
Cookies.remove('rememberMe')
Cookies.remove("username");
Cookies.remove("password");
Cookies.remove("rememberMe");
}
this.$store.dispatch('Login', user).then(() => {
this.loading = false
this.$router.push({ path: this.redirect || '/' })
}).catch(() => {
this.loading = false
this.getCode()
})
this.$store
.dispatch("Login", user)
.then(() => {
this.loading = false;
this.$router.push({ path: this.redirect || "/" });
})
.catch(() => {
this.loading = false;
this.getCode();
});
} else {
console.log('error submit!!')
return false
console.log("error submit!!");
return false;
}
})
});
},
point() {
const point = Cookies.get('point') !== undefined
const point = Cookies.get("point") !== undefined;
if (point) {
this.$notify({
title: '提示',
message: '当前登录状态已过期,请重新登录!',
type: 'warning',
title: "提示",
message: "当前登录状态已过期,请重新登录!",
type: "warning",
duration: 5000
})
Cookies.remove('point')
});
Cookies.remove("point");
}
}
}
}
};
</script>
<style rel="stylesheet/scss" lang="scss">
.login {
display: flex;
justify-content: center;
align-items: center;
height: 100%;
background-size: cover;
}
.title {
margin: 0 auto 30px auto;
text-align: center;
color: #707070;
}
.login {
display: flex;
justify-content: center;
align-items: center;
height: 100%;
background-size: cover;
}
.title {
margin: 0 auto 30px auto;
text-align: center;
color: #707070;
}
.login-form {
border-radius: 6px;
background: #ffffff;
width: 385px;
padding: 25px 25px 5px 25px;
.el-input {
height: 38px;
input {
height: 38px;
}
}
.input-icon{
height: 39px;width: 14px;margin-left: 2px;
}
}
.login-tip {
font-size: 13px;
text-align: center;
color: #bfbfbf;
}
.login-code {
width: 33%;
display: inline-block;
.login-form {
border-radius: 6px;
background: #ffffff;
width: 385px;
padding: 25px 25px 5px 25px;
.el-input {
height: 38px;
float: right;
img{
cursor: pointer;
vertical-align:middle
input {
height: 38px;
}
}
.input-icon {
height: 39px;
width: 14px;
margin-left: 2px;
}
}
.login-tip {
font-size: 13px;
text-align: center;
color: #bfbfbf;
}
.login-code {
width: 33%;
display: inline-block;
height: 38px;
float: right;
img {
cursor: pointer;
vertical-align: middle;
}
}
</style>