@@ -0,0 +1,8 @@
+# 默认忽略的文件
+/shelf/
+/workspace.xml
+# 基于编辑器的 HTTP 客户端请求
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="ProjectModuleManager">
+ <modules>
+ <module fileurl="file://$PROJECT_DIR$/.idea/xiaohongqun_company_course_app.iml" filepath="$PROJECT_DIR$/.idea/xiaohongqun_company_course_app.iml" />
+ </modules>
+ </component>
+</project>
@@ -0,0 +1,6 @@
+ <component name="VcsDirectoryMappings">
+ <mapping directory="" vcs="Git" />
@@ -0,0 +1,12 @@
+<module type="WEB_MODULE" version="4">
+ <component name="NewModuleRootManager">
+ <content url="file://$MODULE_DIR$">
+ <excludeFolder url="file://$MODULE_DIR$/.tmp" />
+ <excludeFolder url="file://$MODULE_DIR$/temp" />
+ <excludeFolder url="file://$MODULE_DIR$/tmp" />
+ </content>
+ <orderEntry type="inheritedJdk" />
+ <orderEntry type="sourceFolder" forTests="false" />
+</module>
@@ -10,19 +10,14 @@
},
onLaunch: function() {
console.log('App Launch')
- uni.hideTabBar();
- var that=this;
- uni.$on('initSocket', () => {
- that.initSocket()
- })
- uni.$on('sendMsg', (item) => {
- that.sendMsg(item)
- uni.$on('closeWebSocket', () => {
- that.closeWebSocket()
+ // uni.hideTabBar();
+ onLoad() {
+ // #ifndef MP-WEIXIN
+ uni.hideNavigationBar(); // H5 隐藏导航栏
+ // #endif
+ },
onShow: function() {
console.log('App Show')
@@ -31,105 +26,9 @@
onUnload() {
- console.log(pingpangTimes)
- clearInterval(pingpangTimes)
-
methods:{
- closeWebSocket(){
- if(socket!=null){
- uni.closeSocket();
- }
- },
- initSocket(){
- console.log("initSocket")
- //创建一个socket连接
- var userId=uni.getStorageSync('companyUserId') ;
- console.log(wsUrl)
- socket=uni.connectSocket({
- url:wsUrl+userId,
- multiple:true,
- success: res=>{
- console.log('WebSocket连接已打开!');
- isSocketOpen=true
- //先确保清除了之前的心跳定时器
- uni.onSocketMessage((res)=>{
- console.log("收到消息")
- const redata = JSON.parse(res.data);
- console.log(redata);
- if(redata.cmd=="heartbeat"){
- //心跳
- console.log("heartbeat")
- else if(redata.cmd=="getWeixinId"){
- uni.$emit('getWeixinId',redata);
- else if(redata.cmd=="getWeixinList"){
- uni.$emit('getWeixinList',redata);
- else if(redata.cmd=="sendSop"){
- uni.$emit('sendSop',redata);
- pingpangTimes=setInterval(()=>{
- var userId=uni.getStorageSync('userId') ;
- var data={cmd:"heartbeat",userId: "w-"+userId};
- console.log(data)
- uni.sendSocketMessage({
- data:JSON.stringify(data),
- success:()=>{
- console.log('WebSocket发送心条数据!');
- fail:()=>{
- isSocketOpen=false
- });
- },5000)
- error: res=>{
- console.log(res)
- //监听socket打开
- uni.onSocketOpen(()=>{
- console.log('WebSocket连接已打开!!');
- //监听socket关闭
- uni.onSocketClose(()=>{
- console.log('WebSocket连接已关闭!');
- //监听socket错误
- uni.onSocketError(()=>{
- console.log('WebSocket连接打开失败');
- sendMsg(data){
- if(isSocketOpen){
- data: JSON.stringify(data),
- console.log("发送成功")
- console.log("发送失败")
}
</script>
@@ -147,6 +46,18 @@
text-overflow: ellipsis;
white-space: nowrap;
+ .single-line-ellipsis {
+ width: 480rpx; /* 设置固定宽度 */
+ white-space: nowrap; /* 文本不换行 */
+ overflow: hidden; /* 隐藏超出部分 */
+ text-overflow: ellipsis; /* 超出部分用省略号表示 */
+ }
+ .single-ellipsis {
+ width: 260rpx; /* 设置固定宽度 */
.ellipsis2{
overflow:hidden;
text-overflow:ellipsis;
@@ -215,7 +126,7 @@
color: $--base-color-gray;
.base-color-red{
- color: $--base-color-red;
+ color:#ee0a25;
.base-color-dark {
color: $--base-color-dark;
@@ -241,10 +152,10 @@
background: $--base-bg2;
.base-bg-red{
- background: $--base-bg-red;
+ background: #ee0a25;
.base-bg-f{
- background-color: $--base-bg-f;
+ background-color:#fff;
.base-bg-f8{
background-color: $--base-color-f8;
@@ -1,24 +1,67 @@
import Request from '../common/request.js';
let request = new Request().http
- export function getCourseSopList(data) {
- return request('/app/courseSop/getCourseSopList',data,'GET');
+export function loginByMp(data) {
+ return request('/app/wx/courseLogin2',data,'POST','application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
- export function getCourseSopLogsList(data) {
- return request('/app/courseSop/getCourseSopLogsList',data,'GET');
- export function getCourseSopLogsDetail(data) {
- return request('/app/qwSop/getCourseSopLogsDetail',data,'GET');
- export function updateCourseSopLogs(data) {
- return request('/app/qwSop/updateCourseSopLogs',data,'POST','application/json;charset=UTF-8');
+
+// 获取真实链接
+export function getRealLink(data) {
+ return request('/app/course/getRealLink', data, 'GET','','https://h5api.his.cdwjyyh.com');
+}
+// h5课程简介
+export function getH5CourseByVideoId(data) {
+ return request('/app/course/getH5CourseByVideoId', data, 'GET','','https://h5api.his.cdwjyyh.com');
+// h5课程详情加问答
+export function getH5CourseVideoDetails(data) {
+ return request('/app/course/getH5CourseVideoDetails', data, 'GET','','https://h5api.his.cdwjyyh.com');
+// 答题发红包
+export function courseAnswer(data) {
+ return request('/app/course/courseAnswer', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+// // 记录看课时间(旧)
+// export function getFinishCourseVideo(data) {
+// return request('/app/course/getFinishCourseVideo', data, 'POST', 'application/json;charset=UTF-8');
+// }
+// 记录看课时间(新)
+export function getFinishCourseVideo(data) {
+ return request('/app/course/updateWatchDuration', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+// 关注客服
+export function getIsAddKf(data) {
+ return request('/app/course/isAddKf', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+// 流量(缓冲百分比)
+export function getInternetTraffic(data) {
+ return request('/app/course/getInternetTraffic', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+// 每十分钟获得积分
+export function getIntegralByH5Video(data) {
+ return request('/app/course/getIntegralByH5Video', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+// 发送奖励
+export function sendReward(data) {
+ return request('/app/course/sendReward', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+// 播放错误上报
+export function getErrMsg(data) {
+ return request('/app/course/getErrMsg', data, 'POST', 'application/x-www-form-urlencoded','https://h5api.his.cdwjyyh.com');
+// 获取getWxConfig
+export function getWxConfig(data) {
+ return request('/app/wx/mp/getWxConfig', data, 'GET','','https://h5api.his.cdwjyyh.com');
@@ -3,39 +3,29 @@ let request = new Request().http
// 统计经销商会员总数和群管总数
export function getCompanyUserAndUserCount(data) {
- return request('/fsUser/getCompanyUserAndUserCount', data,'POST','application/json;charset=UTF-8');
+ return request('/app/fs/user/firstPage/summaryCount', data,'GET','application/json;charset=UTF-8');
// 课程统计
export function getCourseCount(data) {
- return request('/fsCourseWatchLog/getCompanyUserAndUserCount', data,'POST','application/json;charset=UTF-8');
-}
-// 答题统计
-export function getQuesCount(data) {
- return request('/fsAnswerLog/getCompanyUserAndUserCount', data,'POST','application/json;charset=UTF-8');
-// 红包统计
-export function getRecPacketCount(data) {
- return request('/fsCourseRedPacket/getRecPacketCount', data,'POST','application/json;charset=UTF-8');
+ return request('/app/fs/user/firstPage/statistics', data,'GET','application/json;charset=UTF-8');
// 获取课程列表
export function getFsCourseList(data) {
- return request('/fsCourse/getFsCourseList', data,'POST','application/json;charset=UTF-8');
+ return request('/app/fs/course/courseList', data,'GET','application/json;charset=UTF-8');
// 根据训练营查询节目
export function getCourseVdieoList(data) {
- const url = '/fsCourse/getCourseVdieoPageList?courseId='+data.courseId +'&pageNum='+data.pageNum + '&pageSize='+data.pageSize+'&status='+data.status
- return request(url, null,'POST','application/json;charset=UTF-8');
+ const url = '/app/fs/course/pageList?periodId='+data.periodId +'&pageNum='+data.pageNum + '&pageSize='+data.pageSize+'&keyword='+data.keyword
+ return request(url, null,'GET','application/json;charset=UTF-8');
-// 根据观看记录查询用户
+// 根据观看记录查询用户(课程分析)
export function getUserLogListByCourseId(data) {
- const url = '/fsCourse/getUserLogListByCourseId'
- return request(url, data,'POST','application/json;charset=UTF-8');
+ const url = '/app/fs/course/participationRecord'
+ return request(url, data,'GET','application/json;charset=UTF-8');
// 修改用户
@@ -46,55 +36,43 @@ export function updateFsUser(data) {
//根据经销商或群管查询会员列表
export function getfsuserList(data){
- const url = '/fsUser/getFsUserList'
+ const url = '/app/fs/user/pageList'
return request(url, data, 'POST','application/json;charset=UTF-8')
-//查询公司标签列表
+//查询会员标签列表
export function getcompanyTaglist(data) {
- return request('/company/companyTag/list',data,'GET');
+ return request('/app/fs/user/tagList',data,'GET');
//添加黑名单
export function Addblacklist(data){
- const url = '/black'
+ const url = '/app/fs/user/disabled'
//修改公司会员打标签
export function changeLable(data){
- const url = '/company/companyTagUser/edit'
- return request(url, data, 'POST','application/json;charset=UTF-8')
- //修改公司会员打标签
- export function getBlackvipNumber(data){
- const url = '/black/blackCount'
- //查询被拉黑的用户列表
- export function getBlackvipList(data){
- const url = '/fsUser/getBlackUserList'
+ const url = '/app/fs/user/changeUserTags'
//查询答题数据(会员详情)
export function getanswerlist(data){
- const url = '/fsAnswerLog/getUserAnswerCount'
+ const url = '/app/fs/user/details'
+ return request(url, data, 'GET','application/json;charset=UTF-8')
//移除黑名单(会员详情)
export function removebalcklist(data){
- const url = '/black/delete'
- return request(url, data, 'GET','application/json;charset=UTF-8')
+ const url = '/app/fs/user/enabled'
+ return request(url, data, 'POST','application/json;charset=UTF-8')
//生成小节课程 (链接)
export function sharecourselink(data){
- const url = '/fsCourseWatchLog/createLinkUrl'
+ const url = '/app/fs/course/courseSortLink'
@@ -104,46 +82,39 @@ export function getfsuserList(data){
- //查询用户详情
- export function getuserdetail(data){
- const url = '/fsUser'
- //查询看课转化率
+ //查询看课转化率(漏斗图)
export function getcourseRate(data){
- const url = '/fsCourse/getConversion'
+ const url = '/app/fs/user/firstPage/graphic'
- //标签统计
- export function getlableNum(data){
- const url = '/company/companyTag/getTagCount'
+ //查询详情看课转化率(漏斗图)
+ export function getcourseRates(data){
+ const url = '/app/fs/user/graphic/details'
return request(url, data, 'GET','application/json;charset=UTF-8')
//根据经销商或群管查询会员总数
export function getvipNum(data){
- const url = '/fsUser/getFsUserListCount'
+ const url = '/app/fs/user/totalNumber'
//根据经销商 运营:查询课程数,群管数,参与会员
export function getshopCoursenum(data){
- const url = '/fsCourse/getCourseVdieoCount'
+ const url = '/app/fs/user/statistics/details'
//根据经销商 获取群管排名
export function getGroupRanklist(data){
- const url = '/companyUser/getCompanyUserTOP20'
+ const url = '/app/fs/user/firstPage/userRanking'
//根据经销商 获取课程排名
export function getCourseRanklist(data){
- const url = '/fsCourse/getCourseTOP20'
+ const url = '/app/fs/user/firstPage/courseRanking'
//根据经销商 获取红包领取记录
@@ -160,20 +131,20 @@ export function getuserbalance(data){
//根据经销商 查询所属群管
export function getusergroup(data){
- const url = '/companyUser/getCompanyUserList'
+ const url = '/app/companyUser/getCompanyUserList'
//根据经销商 新增公司标签
export function addCompanyLabel(data){
- const url = '/company/companyTag'
+ const url = '/app/companyTag/add'
//根据经销商 删除公司标签
export function deleteCompanyLabel(data){
- const url = '/company/companyTag/delete'
+ const url = '/app/companyTag/delete?tagIds='+data
//根据经销商 获取红包价格表
@@ -184,44 +155,38 @@ export function getredPrice(data){
//根据经销商 查询所属群管列表
export function getgroupList(data){
- const url = '/companyUser/CompanyUserListByCompanyId'
+ const url = '/app/companyUser/companyUserListByCompanyId'
//根据经销商 查询群管的课程
export function getcourseList(data){
- const url = '/fsCourse/courseList'
+ const url = '/app/fs/user/courseAnalysis'
//根据经销商 修改群管信息
export function updategroupinfo(data){
- const url = '/companyUser/updateCompanyUser'
+ const url = '/app/companyUser/updateUserInfo'
//根据经销商 获取群管详情
export function getGroupDetail(data){
- const url = '/companyUser/getCompanyUser'
+ const url = '/app/companyUser/getCompanyUserInfo?companyUserId'
-//根据经销商 批量更换会员归属
-export function changevipUser(data){
- const url = '/companyUser/updateCompanyUseruser'
//根据经销商 修改全部会员群管
export function changevipUserAll(data){
- const url = '/companyUser/updateAllCompanyUser'
+ const url = '/app/companyUser/changeUserParentApply'
//根据经销商 查询标签下会员
export function gettagsUser(data){
- const url = '/company/companyTagUser/getUserList'
+ const url = '/app/companyTag/tagSubUsers'
// h5课程简介
@@ -256,7 +221,7 @@ export function getaddcourseLog(data) {
// 生成海报和看图二维码
export function buildCode(data) {
- return request('/fsCourse/generatePostAndQrCode',data, 'POST', 'application/json;charset=UTF-8');
+ return request('/app/fs/course/courseImage',data, 'POST', 'application/json;charset=UTF-8');
//是否可以看课
@@ -281,10 +246,81 @@ export function becomeVipuser(data) {
//生成分享海报,新建会员
export function becomeVipuserImg(data) {
- return request('/companyUser/generatePostAndQrCode', data, 'POST', 'application/json;charset=UTF-8');
+ return request('/app/fs/user/userImage', data, 'POST', 'application/json;charset=UTF-8');
//获取jssdk
export function getSDK(data){
- return request('/app/wx/mp/authPage', data, 'GET', 'application/json;charset=UTF-8');
+ return request('/app/wx/mp/getWeiXinConfig', data, 'GET', 'application/json;charset=UTF-8');
+//获取公司所有销售
+export function getusersales(data){
+ return request('/app/fs/user/allCompanyUser', data, 'GET', 'application/json;charset=UTF-8');
+//获取催课面板
+export function geturgeCourse(data){
+ return request('/app/qwWorkTask/list', data, 'GET', 'application/json;charset=UTF-8');
+//获取企微账号
+export function geturgeqiwei(data){
+ return request('/app/qwWorkTask/getMyQwUserList', data, 'GET', 'application/json;charset=UTF-8');
+//获取课程视频详情
+export function getcourseDetail(data){
+ return request('/app/fs/course/videoDetails', data, 'GET', 'application/json;charset=UTF-8');
+//通过销售审核
+export function subsalesaudit(data){
+ return request('/app/user/audit?userIds='+data, data, 'POST', 'application/json;charset=UTF-8');
+//解除销售黑名单
+export function changesalesState(data){
+ return request('/app/user/changeUserState?userIds='+data,data, 'POST', 'application/json;charset=UTF-8');
+//注册销售账户
+export function loginsales(data){
+ return request('/app/companyUser/resisterCompanyUser',data, 'POST', 'application/json;charset=UTF-8');
+//获取课程小节下拉列表
+export function getvideolist(data){
+ return request('/app/fs/course/videoList',data, 'GET', 'application/json;charset=UTF-8');
+//获取公司所有标签
+export function getallTags(data){
+ return request('/app/companyTag/list',data, 'GET', 'application/json;charset=UTF-8');
+//获取更换会员归属审核列表
+export function getchangeslist(data){
+ return request('/app/companyUser/applyList',data, 'GET', 'application/json;charset=UTF-8');
+//更改用户姓名,备注
+export function getchangesUserInfo(data){
+ return request('/app/fs/user/changeUserInfo',data, 'POST', 'application/json;charset=UTF-8');
+//管理 获取会员人数等
+export function getmanagepopnum(data){
+ return request('/app/fs/user/companyUser/summaryCount',data, 'GET', 'application/json;charset=UTF-8');
+//管理 获取管理课程统计
+export function getmanagecourse(data){
+ return request('/app/fs/user/companyUser/details',data, 'GET', 'application/json;charset=UTF-8');
+//催课 获取会员注册
+export function getWorkTask(data){
+ return request('/app/qwWorkTask/getUserList',data, 'GET', 'application/json;charset=UTF-8');
@@ -1,25 +0,0 @@
-import Request from '../common/request.js';
-let request = new Request().http
- export function getLineCustomerList(data) {
- return request('/app/crmCustomer/getLineCustomerList',data,'GET');
- export function getMyCustomerList(data) {
- return request('/app/crmCustomer/getMyCustomerList',data,'GET');
- export function getCustomerDetails(data) {
- return request('/app/crmCustomer/getCustomerDetails',data,'GET');
- export function editCrmCustomer(data) {
- return request('/app/crmCustomer/editCrmCustomer',data,'POST','application/json;charset=UTF-8');
- export function addCrmCustomer(data) {
- return request('/app/crmCustomer/addCrmCustomer',data,'POST','application/json;charset=UTF-8');
@@ -1,28 +0,0 @@
- export function getConfigSignature(data) {
- return request('/qw/qwJsApi/getConfigSignature',data,'GET');
- export function getQwSopList(data) {
- return request('/app/qwSop/getQwSopList',data,'GET');
- export function getQwSopLogsList(data) {
- return request('/app/qwSop/getQwSopLogsList',data,'GET');
- export function getQwSopLogsDetail(data) {
- return request('/app/qwSop/getQwSopLogsDetail',data,'GET');
- export function updateQwSopLogs(data) {
- return request('/app/qwSop/updateQwSopLogs',data,'POST','application/json;charset=UTF-8');
@@ -24,8 +24,17 @@ let request = new Request().http
export function loginByMp(data) {
- return request('/app/user/loginByMp',data,'POST','application/json;charset=UTF-8');
+ return request('/app/wx/h5/mp/loginByMp',data,'POST','application/json;charset=UTF-8');
+ // 成为会员
+ export function registerCourses(data) {
+ return request('/app/fs/user/beMember',data,'POST','application/json;charset=UTF-8');
+ export function setUserInfo(data) {
+ return request('/app/user/setUserInfo',data,'POST','application/json;charset=UTF-8');
+ //微信小程序登录
+ export function loginByMiniApp(data) {
+ return request('/app/wx/miniapp/login',data,'POST','application/json;charset=UTF-8');
@@ -2,10 +2,10 @@
export default class Request {
http(router, data = {}, method,contentType) {
let that = this;
- // let path = 'http://42.194.245.189:8007';
- // let path = 'http://192.168.10.155:8007'
- let path = 'https://h5api.wxcourse.cdwjyyh.com'
+ // let path = 'http://1.95.39.2:7015'
+ let path = 'http://192.168.10.131:7015'
+ // let path = 'http://192.168.10.150:7015'
+ // let path = 'http://120.46.11.55:7015'//正式
uni.setStorageSync('requestPath',path)
// uni.showLoading({
// title: '加载中'
@@ -34,17 +34,26 @@ export default class Request {
//收到开发者服务器成功返回的回调函数
if(res.data.code==401){//没有权限直接退出到登录界面
let pages = getCurrentPages();
- let url = pages[ pages.length - 1]; //当前页页面实例
+ let currentPage = pages[ pages.length - 1]; //当前页页面实例
+ // 条件编译判断平台,设置不同登录页路径
+ let loginPage = '';
+ // #ifdef H5
+ loginPage = '/pages/auth/login';
+ // #ifdef MP-WEIXIN
+ loginPage = '/pages/auth/wxlogin';
//如果登录界面已打开,自动关闭
- if(url!=undefined&&url.route=="pages/auth/login"){
- resolve(res.data)
- return;
+ if (currentPage.route === loginPage.replace(/^\//, '')) {
+ resolve(res.data);
+ return;
uni.reLaunch({
- url:'/pages/auth/login',
+ url:loginPage,
success: () => {
uni.hideLoading();
fail: () => {
@@ -7,7 +7,7 @@
</view>
<view class="courselist-con-r">
<view @click.passive.stop>
- <text class="more-t">{{info.title}}</text>
+ <text class="more-t ">{{info.title}}</text>
<view class="btn_icon" style="margin-left: 5px;" @click="copyId">ID
<image src="@/static/images/copy_icon.png" mode="aspectFill"></image>
@@ -21,23 +21,26 @@
- <view class="courselist-footer x-f">
- <view class="courselist-footer-item x-c" v-show="user.userType==1" @click="handleShare"><u-icon
+ <view class="courselist-footer x-f ">
+ <view class="courselist-footer-item x-c " @click="handleShare"><u-icon
name="share-square" color="#1677ff" size="18"></u-icon>分享课程</view>
<view class="courselist-footer-item x-c shishi" v-show="activeTab == 1" @click="handleStatistics"><u-icon
- name="share-square" color="#1677ff" size="18"></u-icon>实时统计</view>
+ name="share-square" color="#1677ff" size="18"></u-icon>课程统计</view>
<view class="courselist-footer-item x-c shuju" v-show="activeTab == 2" @click="handleStatistics"><u-icon
name="share-square" color="#1677ff" size="18"></u-icon>数据统计</view>
<!-- 分享弹窗 -->
<u-popup :show="showShare" :closeOnClickOverlay="true" :round='20' @close="closeShare" @open="openShare">
<view class="sharePop x-ac">
- <view class="sharePop-item y-f" @click="shareimg">
+ <!--#ifdef MP-WEIXIN-->
+ <view class="sharePop-item y-f card-share" >
<image src="@/static/images/card_icon.png" mode="aspectFill"
style="width: 80rpx; height: 80rpx;margin-top: 20rpx;"></image>
<view style="font-weight: bold;margin-bottom: 4px;">生成卡片</view>
<view style="font-size: 12px;color: #888;">指导分享轻松转发</view>
+ <button open-type="share" class="share" @click="handleClick()">分享课程</button>
+ <!--#endif-->
<view class="sharePop-item y-f" @click="buildimg">
<image src="@/static/images/poster_icon.png" mode="aspectFill"></image>
<view style="font-weight: bold;margin-bottom: 4px;">生成海报</view>
@@ -64,17 +67,17 @@
<u-notify ref="uNotify" message=""></u-notify>
<!-- 生成海报 -->
<u-popup :show="setImg" @close="closeimg" :round="12" style="z-index: 999;">
- <view class="w100 h400">
- <image :src="codeLink.url" class="codeimg w660" mode="widthFix"></image>
+ <view class="w100 h540 center">
+ <image :src="codeLink.url" mode="aspectFill" ></image>
- <view class="justify-around mtb40">
+ <view class="justify-around mb40">
<!-- <view class="column justify-center align-center" @click="shareimg">
<image src='@/static/image/wechat.png' class="w80 h80"></image>
<view class="mt10">微信好友</view>
</view> -->
<view class="column justify-center align-center" @click="downimg">
<image src='@/static/image/downicon.png' class="w80 h80"></image>
- <view class="mt10 mb100">长按海报保存</view>
+ <view class=" mb10">长按图片保存</view>
</u-popup>
@@ -86,7 +89,7 @@
<view class="column colorf fs32 xu-box fs40
align-center justify-center">
<view class="justify-center">点击右上角
- <image src="../../../static/image/wxmore.png" class="w50 h50 mlr10"></image>
+ <image src="@/static/image/wxmore.png" class="w50 h50 mlr10"></image>
<view class="mt20">选择 “转发给朋友”</view>
<view style="color: #cbcbcb;" class="fs28 mt40">点击任意位置关闭弹窗</view>
@@ -121,6 +124,9 @@
return {}
+ parentMethod:{
+ type: Function
data() {
return {
@@ -138,7 +144,7 @@
isLongPress: false,
painterSrc: '',
showzhidao: false,
- imgs:'https://h5.wxcourse.cdwjyyh.com/icon/20250214100002.png'
+ imgs:'https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/fs/20250416/1744811256845.png'
onLoad() {},
@@ -147,6 +153,17 @@
methods: {
+ handleClick(){
+ console.log(123)
+ this.parentMethod();
+ this.$emit('trigger-share', {
+ title: this.info.courseName+this.info.title,
+ path: "/pages_course/viedo",
+ params: { companyId: this.user.companyId, companyUserId: this.user.userId,
+ courseId:this.info.courseId,videoId:this.info.courseId },
+ img:this.info.thumbnail||this.imgs
+ });
// 获取jssdk
getjssdklist() {
const param = {
@@ -163,16 +180,16 @@
});
})
shareimg() {
let self = this
//分享好友
- // 配置--你到时候把配置全局 --就是这些东西 调接口拿
+ // 配置--配置全局
console.log(self.info.thumbnail + self.copylink, 11111)
wx.ready(function() { //需在用户可能点击分享按钮前就先调用
wx.updateAppMessageShareData({
title: self.info.courseName + self.info.title, // 分享标题
- desc: self.info.title, // 分享描述
+ desc: self.info.description, // 分享描述
+ // link: self.copylink,
link: self.copylink,
// 分享链接,该链接域名或路径必须与当前页面对应的公众 号JS安全域名一致
imgUrl: self.info.thumbnail||self.imgs, // 分享图标
@@ -188,21 +205,6 @@
duration: 1000
- // fail: function(err) {
- // console.log(err);
- // uni.showToast({
- // title: JSON.stringify(err),
- // icon: 'none',
- // duration: 2000
- // })
- // },
- // complete: function(res) {
- // title: JSON.stringify(res),
@@ -288,14 +290,17 @@
companyId: this.user.companyId,
companyUserId: this.user.userId,
courseId: this.info.courseId,
- time: this.time,
- type: this.type,
+ effectiveDuration: this.time,
videoId: this.info.videoId,
+ imgUrl:this.info.thumbnail,
+ title:this.info.title,
+ duration:this.info.duration
}).then(res => {
if (res.code == 200) {
- this.codeLink = res.data
+ this.codeLink = res.posterImage
this.setImg = true
this.getlink()
+ console.log(this.codeLink)
} else {
uni.showToast({
icon: 'none',
@@ -305,18 +310,19 @@
toCourseDetail(info) {
uni.navigateTo({
// url: '/pages/courseManage/course/learning?course='+JSON.stringify(info)
- url: `/pages/courseManage/course/learning?course=${JSON.stringify(info)}&isvip=1`
- // url:'/pages/courseManage/course/learning?course=JSON.stringify(info)¶m2=2'
+ // url: `/pages/courseManage/course/learning?course=${JSON.stringify(info)}&isvip=1`
+ url:'/pages/courseManage/course/courseVideo?videoId='+info.videoId
handleShare() {
this.showShare = true
this.getjssdklist()
- this.getlink('preload'); // 提前加载链接
+ // this.getlink('preload'); // 提前加载链接
closeShare() {
this.showShare = false
@@ -338,16 +344,15 @@
time: this.time,
sharecourselink(params).then(res => {
- this.copylink = res.data
+ this.copylink = res.url
if (this.copylink.startsWith('http://')) {
this.copylink = this.copylink.replace('http://', 'https://');
- console.log(this.copylink)
+ // console.log(this.copylink)
setTimeout(() => {
uni.setClipboardData({
data: this.copylink,
@@ -382,12 +387,12 @@
+ // type: this.type,
// 强制使用 HTTPS
@@ -409,6 +414,7 @@
duration: this.info.duration,
fileId: this.info.fileId,
courseName: this.info.courseName,
+ videoId:this.info.videoId,
url: '/pages/courseManage/statistics?info=' + JSON.stringify(info)
@@ -416,17 +422,21 @@
copyId() {
- data: this.info.fileId,
+ data: this.info.title,
- this.$refs.uNotify.show({
- top: 0,
- type: 'success',
- // color: '#000',
- // bgColor: '#e8e8e8',
- message: '复制课程ID成功',
- duration: 1000 * 2,
- fontSize: 20,
- safeAreaInsetTop: true
+ // this.$refs.uNotify.show({
+ // top: 0,
+ // type: 'success',
+ // // color: '#000',
+ // // bgColor: '#e8e8e8',
+ // message: '复制课程标题成功',
+ // duration: 1000 * 2,
+ // fontSize: 20,
+ // safeAreaInsetTop: true
+ // })
+ uni.showToast({
+ icon: 'none',
+ title: '复制课程标题成功'
@@ -436,6 +446,18 @@
<style scoped lang="scss">
+ .card-share{
+ position: relative;
+ .share{
+ display: inline-block;
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ opacity: 0;
.imgshe {
display: flex;
flex-direction: row-reverse
@@ -451,13 +473,6 @@
- .codeimg {
- position: absolute;
- z-index: 99999;
- left: 40rpx;
- top: 40rpx;
#codeurl {
position: relative;
@@ -470,8 +485,8 @@
.sharePop {
background-color: #fff;
- padding: 50px 0;
- padding-bottom: 100px;
+ padding: 20px 0;
+ padding-bottom: 60px;
border-radius: 20px 20px 0 0;
&-item {
@@ -7,13 +7,13 @@
v-for="(item, index) in navData" :key="index" @click="navClick(item,index)">
<view v-if="item.special&&item.name=='批量'" class="x-f" style="align-items: end;">
<u-icon name="file-text" :color="index === actNav ?'#2979ff':'#222'" size="20"></u-icon>
- {{index === actNav ? '取消批量':'批量'}}
+ {{index === actNav ? '取消':'批量'}}
<template v-else>
<text style="width: max-content;">{{item.name}}</text>
- <image src="https://i.loli.net/2020/07/15/QsHxlr1gbSImvWt.png" mode="" class="icon-triangle"
- v-if="index === actNav"></image>
- <image src="https://i.loli.net/2020/07/15/xjVSvzWcH9NO7al.png" mode="" class="icon-triangle"
+ <image src="/static/manergevip/icon-pullup.png" mode="" class="icon-triangle"
+ v-if="index === actNav"></image>
+ <image src="/static/manergevip/icon-down.png" mode="" class="icon-triangle"
v-else></image>
</template>
@@ -39,10 +39,10 @@
type: Number,
default: 40
- // top: {
- // type: String,
- // default: 'calc(var(--window-statsu-bar) + 44px)'
+ top: {
+ type: String,
+ default: ''
border: {
type: Boolean,
default: false
@@ -72,7 +72,6 @@
navData: [],
popupShow: false,
showMask: false,
@@ -97,13 +96,13 @@
mounted() {
const query = uni.createSelectorQuery().in(this);
- query
- .select(".filter-wrapper")
- .boundingClientRect((data) => {
- // console.log(data)
- this.top = data.top + 'px'
- .exec();
+ // query
+ // .select(".filter-wrapper")
+ // .boundingClientRect((data) => {
+ // // console.log(data)
+ // this.top = data.top + 'px'
+ // .exec();
reset() {
@@ -23,28 +23,41 @@
<text>{{item.name}}</text><u-icon class="arrow-down" name="arrow-down" :color="searchbarNav == index ?'#1677ff':'#999'" size="12"></u-icon>
- <view>
- <dropdownPanel :filterData='filterData' @onChange="onChange" @confirm="confirm" @reset="reset">
+ <dropdownPanel :filterData='filterData' @onChange="onChange" @confirm="confirm" @reset="reset">
+ <scroll-view scroll-y="true" class="hb" :refresher-enabled="isEnableds"
+ :refresher-triggered="triggereds" refresher-background="rgba(0,0,0,0)"
+ @refresherrefresh="pullDownRefreshs" @refresherrestore="triggereds = false"
+ :upper-threshold="100" :lower-threshold="100" @refresherabort="triggereds = false"
+ @scrolltolower="reachBottoms">
+ <view class="justify-between align-center mb20 mlr20 ">
+ <u-search placeholder="搜索训练营" v-model="keyword" :showAction="false" height="30px"
+ @search='searchKeyword'></u-search>
+ </view>
<view v-if="searchbarNav == 0">
<view class="boxnav x-bc">
<view class="boxnav-item" v-for="(item,index) in courseList" :key="index">
<view class="boxnav-item-info one-t"
- :class="courserIndex == item.courseId ? 'boxnav-active':''"
- @click="handleCourse(item)">{{item.courseName}}</view>
+ :class="courserIndex == index ? 'boxnav-active':''"
+ @click="handleCourse(item,index)">{{item.periodName}}</view>
- </dropdownPanel>
- </view>
+ <u-loadmore :status="status" />
+ </scroll-view>
+ </dropdownPanel>
+ <view class="justify-between align-center mb20 mlr20 mt20 ">
+ <u-search placeholder="请输入课程名称" v-model="keywordlist" :showAction="false" height="30px"
+ @search='searchKeywordlist' bgColor='#fff'></u-search>
<view class="container-right" >
<scroll-view style="height:100%" :scroll-y="true" :refresher-enabled="true" :refresher-triggered="triggered"
- refresher-background="rgba(0,0,0,0)" @refresherrefresh="pullDownRefresh"
+ refresher-background="rgba(0,0,0,0)" @refresherrefresh="pullDownRefresh" :scroll-top='scrollTop'
@refresherrestore="triggered = false" :upper-threshold="100" :lower-threshold="100"
- @refresherabort="triggered = false" @scrolltolower="reachBottom">
+ @refresherabort="triggered = false" @scrolltolower="reachBottom" @scroll="scroll">
<view class="list">
<courseItem :from="'course'" :activeTab="1" v-for="(item,index) in dataList" :key="index"
- :info="item" />
+ :info="item" @trigger-share="handleShare" :parent-method="parentMethod"/>
<u-loadmore :status="loadStatus" />
</scroll-view>
@@ -53,19 +66,19 @@
<script>
- import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
import {
getFsCourseList,
getCourseVdieoList
} from "@/api/courseManage.js"
- import dropdownPanel from "../components/dropdownPanel.vue"
- import courseItem from "../components/courseItem.vue"
+ import dropdownPanel from "@/components/dropdownPanel.vue"
+ import courseItem from "@/components/courseItem.vue"
export default {
- mixins: [MescrollMixin],
+ name:"liveCourse",
components: {
courseItem,
dropdownPanel
+ props: ['parentMethod'],
user: {},
@@ -78,13 +91,12 @@
// value: 1,
// },
],
- defaultIndex: [0, 0],
contentH: 0,
activeTab: 1,
courseList: [],
courseId: '',
searchbarNav: 0,
- courserIndex: 0,
+ courserIndex: '',
searchbar: [{
name: '训练营-营期'
@@ -119,6 +131,20 @@
triggered: false,
loadStatus: 'loadmore',
+ //课程选择列表
+ pageNum:1,
+ pageSize: 10,
+ triggereds: false,
+ status: 'loadmore',
+ keyword:'',
+ isEnableds:true,
+ keywordlist:'',
+ actid:'',
+ scrollTop: 0,
+ old: {
+ scrollTop: 0
+ shareConfig:''
@@ -128,35 +154,96 @@
this.getFsCourseList()
+ handleShare(config) {
+ // 保存分享配置到父页面数据
+ this.shareConfig = config;
+ console.log(config)
+ this.$emit('child-data-update', this.shareConfig);
+ // 调起分享面板(微信小程序需主动调用)
+ uni.showShareMenu();
+ scroll: function(e) {
+ // console.log(e)
+ this.old.scrollTop = e.detail.scrollTop
onChange(index) {
this.searchbarNav = index
- this.courserIndex = ''
+ this.courseId = ''
+ this.keyword=''
+ this.courseList=[]
+ this.getFsCourseList()
- handleCourse(item) {
- this.courserIndex = item.courseId
+ handleCourse(item,index) {
+ this.courserIndex = index
+ this.actid=item.periodId
confirm() {
- this.courseId = this.courserIndex
+ this.courseId = this.actid
console.log(this.courseId)
+ this.params.pageNum=1
+ this.getListData()
+ searchKeyword(value){
+ this.keyword = value
+ searchKeywordlist(value){
+ this.dataList=[]
+ this.keywordlist = value
+ pullDownRefreshs() {
+ // 下拉
+ this.triggereds = true; //下拉了状态为true
+ setTimeout(() => {
+ this.triggereds = false;
+ uni.stopPullDownRefresh()
+ this.pageNum = 1;
+ this.getFsCourseList('refresh') //触底 不穿执行else
+ // 请求接口里面需要判断是不是最后一页 是最后一页 status赋值为‘loadmore’没有更多了
+ // 请求接口
+ }, 1000)
+ reachBottoms() {
+ // status这个是加载状态
+ if (this.status === 'loadmore') {
+ this.status = 'loading'
+ uni.showNavigationBarLoading()
+ this.pageNum++
+ this.getFsCourseList() //触底 不穿执行else
+ uni.hideNavigationBarLoading()
+ }, 1000);
// 训练营
- getFsCourseList() {
+ getFsCourseList(type) {
const day = uni.$u.timeFormat(new Date(), 'yyyy-mm-dd')
- companyId: this.user.companyId,
- companyUserId: this.user.userId,
- type: this.user.userType == '00' ? 0 : 1, // 0:经销商/1:群管
+ pageNum:this.pageNum,
+ pageSize:this.pageSize,
+ keyword:this.keyword
getFsCourseList(param).then(res => {
- this.courseList = res.data || []
- // this.courseId = this.courseList && this.courseList.length > 0 ? this.courseList[0]
- // .courseId : ''
- // this.searchbar[0].name = this.courseList && this.courseList.length > 0 ? this.courseList[0]
- // .courseName : '训练营-营期'
+ if (type == 'refresh') {
+ this.courseList = res.data.list
+ } else {
+ // 加载更多 当前页和下一页合并
+ this.courseList = [...this.courseList, ...res.data.list]
+ if ( res.data.isLastPage) {
+ this.status = 'nomore'
+ this.status = 'loadmore'
+ this.searchbar[0].name = this.courseList && this.courseList.length > 0 ? this.courseList[0]
+ .courseName : '训练营-营期'
// this.mescroll.resetUpScroll()
this.getListInit()
@@ -187,8 +274,8 @@
this.loadStatus = 'loading'
const result = await getCourseVdieoList({
- courseId: this.courseId,
- status: '',
+ periodId: this.courseId,
+ keyword:this.keywordlist,
...this.params
if (result) {
@@ -207,6 +294,14 @@
this.loadStatus = 'loadmore';
+ // 当页数为1时,重置滚动位置
+ if (this.params.pageNum === 1) {
+ console.log(this.scrollTop)
+ this.scrollTop = this.old.scrollTop
+ this.$nextTick(function() {
+ this.scrollTop = 0
uni.hideLoading()
@@ -254,6 +349,7 @@
color: #222;
flex-direction: column;
+ height: 100vh;
.boxnav {
@@ -367,7 +463,7 @@
flex: 1;
height: calc(100% - 80rpx);
overflow-y: scroll;
- padding-bottom: 80rpx;
+ // padding-bottom: 80rpx;
.list {
padding: 10px;
box-sizing: border-box;
@@ -0,0 +1,439 @@
+<template>
+ <view class="container">
+ <view class="headbox">
+ <view class="headnav x-bc">
+ <view :class="activeTab == 0 ? 'headnav-item headnav-active':'headnav-item'" @click="handleNav(0)">
+ <view>直播计划</view>
+ <view class="headnav-num">3</view>
+ <image src="@/static/images/idle.png" mode="aspectFill"></image>
+ <view :class="activeTab == 1? 'headnav-item headnav-active':'headnav-item'" @click="handleNav(1)">
+ <view>今日直播</view>
+ <image src="@/static/images/streaming.png" mode="aspectFill"></image>
+ <view :class="activeTab == 2 ? 'headnav-item headnav-active':'headnav-item'" @click="handleNav(2)">
+ <view>往日直播</view>
+ <image src="@/static/images/finished.png" mode="aspectFill"></image>
+ <view>
+ <view class="p20 fs28 column flex-1 hb hidden" v-if="searchbarNav == 0">
+ <view v-for="(item,index) in courseList" class="m10 p10 center"
+ :key="index" style="border-bottom: 2rpx solid #eee;" :class="courserIndex == index ? 'select':''"
+ @click="handleCourse(item,index)">{{item.courseName}}
+ <view v-if="searchbarNav == 1">
+ ///
+ <!-- <view class="justify-between align-center mb20 mlr20 mt20 ">
+ </view> -->
+ <view class="container-right" >
+ <scroll-view style="height:100%" :scroll-y="true" :refresher-enabled="true" :refresher-triggered="triggered"
+ @refresherrestore="triggered = false" :upper-threshold="100" :lower-threshold="100"
+ @refresherabort="triggered = false" @scrolltolower="reachBottom" @scroll="scroll()">
+ <view class="list">
+ <courseItem :from="'course'" :activeTab="1" v-for="(item,index) in dataList" :key="index"
+ :info="item" />
+ <u-loadmore :status="loadStatus" />
+</template>
+<script>
+ import {
+ getFsCourseList,
+ getCourseVdieoList
+ } from "@/api/courseManage.js"
+ export default {
+ name:"living",
+ components: {
+ courseItem,
+ dropdownPanel
+ data() {
+ return {
+ user: {},
+ filterData: [{
+ name: '训练营-营期',
+ value: 0,
+ {
+ name: '课程状态',
+ value: 1,
+ ],
+ defaultIndex: [0, 0],
+ contentH: 0,
+ activeTab: 1,
+ courseList: [],
+ courseId: '',
+ searchbarNav: 0,
+ searchbar: [{
+ name: '训练营-营期'
+ name: '课程状态'
+ downOption: {
+ use: true,
+ auto: false
+ upOption: {
+ onScroll: false,
+ use: true, // 是否启用上拉加载; 默认true
+ auto: true,
+ page: {
+ pae: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始
+ size: 10 // 每页数据的数量,默认10
+ noMoreSize: 10, // 配置列表的总数量要大于等于5条才显示'-- END --'的提示
+ textNoMore: "已经到底了",
+ empty: {
+ icon: 'https://cos.his.cdwjyyh.com/fs/20240423/cf4a86b913a04341bb44e34bb4d37aa2.png',
+ tip: '暂无数据'
+ dataList: [],
+ params: {
+ pageNum: 1,
+ pageSize: 10
+ triggered: false,
+ loadStatus: 'loadmore',
+ scrollTop:'',//控制滚动位置
+ mounted() {
+ const windowHeight = uni.getSystemInfoSync().windowHeight
+ this.contentH = `calc(${windowHeight}px - 132px - 56px)`
+ this.user = uni.getStorageSync("companyUserInfo") ? JSON.parse(uni.getStorageSync("companyUserInfo")) : {}
+ methods: {
+ console.log(e)
+ goTop: function(e) {
+ onChange(index) {
+ this.searchbarNav = index
+ reset() {
+ this.actid=item.courseId
+ confirm() {
+ // console.log(this.courseId)
+ this.$nextTick(()=>{
+ })
+ // 训练营
+ const day = uni.$u.timeFormat(new Date(), 'yyyy-mm-dd')
+ const param = {
+ getFsCourseList(param).then(res => {
+ if (res.code == 200) {
+ // this.mescroll.resetUpScroll()
+ this.getListInit()
+ title: res.msg,
+ handleNav(type) {
+ this.activeTab = type
+ clickSearchbar(type) {
+ this.searchbarNav = type == this.searchbarNav ? 'colse' : type
+ mescrollInit(mescroll) {
+ this.mescroll = mescroll;
+ getListInit() {
+ this.params.pageNum = 1
+ this.getListData('refresh')
+ async getListData(type = 'refresh') {
+ uni.showLoading({
+ title: "加载中..."
+ this.loadStatus = 'loading'
+ const result = await getCourseVdieoList({
+ courseId: this.courseId,
+ ...this.params
+ if (result) {
+ const {
+ isLastPage,
+ total,
+ list,
+ } = result.data
+ this.dataList = list
+ this.dataList = [...this.dataList, ...list]
+ if (isLastPage) {
+ this.loadStatus = 'nomore';
+ this.loadStatus = 'loadmore';
+ this.$nextTick(() => {
+ this.scrollTop = 0; // 确保DOM更新后重置
+ uni.hideLoading()
+ title: "请求失败",
+ this.dataList = []
+ /**
+ * 触底添加下一页
+ */
+ reachBottom(options) {
+ if (this.loadStatus === 'loadmore') {
+ this.params.pageNum += 1;
+ this.getListData('more')
+ }, 500);
+ * 下拉列表页
+ pullDownRefresh(options) {
+ this.triggered = true;
+ this.triggered = false;
+ this.params.pageNum = 1;
+ }, 500)
+</script>
+<style lang="scss">
+ .container {
+ font-family: PingFang SC, PingFang SC;
+ font-weight: 400;
+ font-size: 14px;
+ color: #222;
+ // display: flex;
+ // flex-direction: column;
+ .headbox {
+ background-color: #fff;
+ .headnav {
+ padding: 15px 12px;
+ margin: 0 -10px -10px 0;
+ box-sizing: border-box;
+ image {
+ height: 60px;
+ width: 50px;
+ z-index: 0;
+ bottom: 0;
+ right: 0;
+ display: none;
+ &-item {
+ flex: 1;
+ font-size: 16px;
+ padding: 10px;
+ border-radius: 10px;
+ background: #f5f5f5;
+ margin: 0 10px 10px 0;
+ z-index: 1;
+ overflow: hidden;
+ color: #555;
+ &-active {
+ background-color: rgb(231, 241, 255) !important;
+ .headnav-num {
+ color: #1677ff !important;
+ display: block !important;
+ &-num {
+ font-family: DIN, DIN;
+ font-weight: bold;
+ font-size: 25px;
+ margin: 5px 0;
+ .searchbar {
+ padding-bottom: 10px;
+ .arrow-down {
+ margin-left: 5px;
+ transform: rotate(180deg);
+ .coursebox {
+ overflow-y: auto;
+ .courselist {
+ padding: 12px;
+ .container-right {
+ height: calc(100% - 80rpx);
+ overflow-y: scroll;
+ .list {
+ .select {
+ color: #1773ff;
+ background-color: #e6ecff;
+</style>
@@ -0,0 +1,347 @@
+ <view class="column " style="height: 100%;">
+ <view class="bgf justify-between pb16 flex-1" style="z-index:2;">
+ <dropdownPanel :filterData='filterData' @confirm="confirm" @reset="reset" @onChange="onChange"
+ style="flex: 1;">
+ <view class="p20 fs28 column flex-1 scrolly hb hidden" v-if="searchbarNav == 0">
+ <scroll-view scroll-y="true" class="hb" :refresher-enabled="isEnabledC"
+ :refresher-triggered="triggeredC" refresher-background="rgba(0,0,0,0)"
+ @refresherrefresh="pullDownRefreshC" @refresherrestore="triggeredC = false"
+ :upper-threshold="100" :lower-threshold="100" @refresherabort="triggeredC = false"
+ @scrolltolower="reachBottomC">
+ <view v-for="(item,index) in qiweilist" :key="item.index" class="m10 p10 center"
+ :class="qiweiuser.dictLabel==item.dictLabel?'select':''"
+ style="border-bottom: 2rpx solid #eee;" @click="getCourseOne(item)">
+ {{item.dictLabel}}
+ <u-loadmore :status="statusC" />
+ <view class="bgf p20 justify-between align-center ">
+ <view style="color: #666;font-size: 24rpx;" @click="showtime=!showtime">{{date||"请选择时间"}}</view>
+ <view class="justify-between">
+ <view :class="timeact==index?'tabtime selecttime':'tabtime'" v-for="(item,index) in timeTab"
+ :key="index" @click="seltime(index)">
+ {{item}}
+ <view class="justify-between align-center p20 ">
+ <view class="fs24">共{{list.length}}条数据</view>
+ <view class="column hb hidden">
+ style="height: calc(100vh - 300rpx);" :refresher-triggered="triggereds"
+ refresher-background="rgba(0,0,0,0)" @refresherrefresh="pullDownRefreshs"
+ @refresherrestore="triggereds = false" :upper-threshold="100" :lower-threshold="100"
+ @refresherabort="triggereds = false" @scrolltolower="reachBottoms">
+ <view class="list-box" v-for="(item,index) in list" :key="index">
+ <view class="justify-between align-center ptb40">
+ <view>{{item.title}}</view>
+ <view class="justify-start align-center">
+ <u-icon name="file-text" color="#999999" size="20" class="mr10"></u-icon>
+ <u-icon name="more-circle" color="#999999" size="16"></u-icon>
+ <u-loadmore :status="statusA" />
+ <view class="">
+ <u-calendar :show="showtime" :maxDate='maxDate' :minDate='minDate' @confirm="confirmData"
+ :closeOnClickOverlay='true' @close="closedata"></u-calendar>
+ geturgeCourse,
+ geturgeqiwei
+ } from "@/api/courseManage.js";
+ name: "qiweiUrgeCourse",
+ actnav: 0,
+ showsel: false,
+ timeTab: ['今天', '昨天'],
+ timeact: 0,
+ isAgreement: false,
+ littleTime: ['01', '02', '03', '04', '05', '06', '07'],
+ qiweilist: [],
+ qiweiuser: [],
+ valuetime: '',
+ showtime: false,
+ todayday: uni.$u.timeFormat(new Date(), 'yyyy-mm-dd'),
+ maxDate: '',
+ minDate: '',
+ date: '',
+ list: [],
+ //分页
+ isEnableds: true,
+ statusA: 'nomore',
+ pageSize: 8,
+ name: '选择企微账号',
+ }, ],
+ //企微分页
+ triggeredC: false,
+ isEnabledC: true,
+ statusC: 'nomore',
+ pageNumC: 1,
+ pageSizeC: 6,
+ this.getCourselist()
+ this.getqiweilist()
+ this.gettimeDate()
+ getCourseOne(e) {
+ this.qiweiuser = e
+ reachBottomC() {
+ console.log(12345)
+ if (this.statusC === 'loadmore') {
+ this.statusC = 'loading'
+ this.pageNumC++
+ this.getqiweilist() //触底 不穿执行else
+ //列表展示下拉
+ pullDownRefreshC() {
+ this.triggeredC = true; //下拉了状态为true
+ this.triggeredC = false;
+ this.pageNumC = 1;
+ this.getqiweilist('refresh') //触底 不穿执行else
+ this.filterData[0].name = this.qiweiuser.dictLabel
+ this.qiweiuser = []
+ this.filterData[0].name = '请选择企微账号'
+ if (this.statusA === 'loadmore') {
+ this.statusA = 'loading'
+ this.getCourselist() //触底 不穿执行else
+ this.getCourselist('refresh') //触底 不穿执行else
+ confirmData(e) {
+ this.showtime = !this.showtime
+ this.date = e[0]
+ this.pageNum = 1
+ gettimeDate() {
+ // 获取当前时间
+ const currentDate = new Date();
+ // 获取一个月前的时间
+ const oneMonthAgo = new Date(currentDate);
+ oneMonthAgo.setMonth(oneMonthAgo.getMonth() - 1);
+ this.minDate = oneMonthAgo.getTime();
+ // 获取一个月后的时间
+ const oneMonthLater = new Date(currentDate);
+ oneMonthLater.setMonth(oneMonthLater.getMonth() + 1);
+ this.maxDate = oneMonthLater.getTime();
+ selcourse() {
+ this.showsel = !this.showsel
+ close() {
+ seltime(index) {
+ this.timeact = index
+ if (index == 0) {
+ this.date = this.todayday
+ let yesterday = new Date();
+ yesterday.setDate(yesterday.getDate() - 1);
+ this.date = uni.$u.timeFormat(yesterday, 'yyyy-mm-dd')
+ handleget() {
+ this.isAgreement = !this.isAgreement
+ getCourselist(type) {
+ // console.log(this.qiweiuser.dictValue)
+ if (this.qiweiuser.dictValue == undefined) {
+ title: '请选择企微账号'
+ return
+ const parmas = {
+ qwUserId: this.qiweiuser.dictValue,
+ corpId: this.qiweiuser.corpId,
+ date: this.date,
+ pageNum: this.pageNum,
+ pageSize: this.pageSize
+ geturgeCourse(parmas).then(res => {
+ const dataList = res.data.list
+ this.list = dataList
+ this.list = [...this.list, ...dataList]
+ this.statusC = res.data.isLastPage ? 'nomore' : 'loadmore';
+ console.log(this.list)
+ title: res.msg
+ getqiweilist(type) {
+ const data = {
+ pageNum: this.pageNumC,
+ pageSize: this.pageSizeC
+ geturgeqiwei(data).then(res => {
+ this.qiweilist = res.data.list
+ this.qiweilist = [...this.qiweilist, ...res.data.list]
+ if (res.data.isLastPage) {
+ this.statusC = 'nomore'
+ this.statusC = 'loadmore'
+ confirmuser(e) {
+ this.qiweiuser = e.value[0]
+ canceluser() {
+ closeuser() {
+ closedata() {
+<style lang="scss" scoped>
+ .icon-triangle {
+ width: 16rpx;
+ height: 16rpx;
+ margin-left: 10rpx;
+ .tabtime {
+ background-color: #f0f0f0;
+ text-align: center;
+ width: 140rpx;
+ padding: 12rpx 0;
+ border-radius: 200rpx;
+ margin-left: 20rpx;
+ font-size: 24rpx;
+ .selecttime {
+ color: #fff;
+ background-color: #1773ff;
+ /deep/ .uni-checkbox-input {
+ border-radius: 50% !important;
+ .timelitle {
+ background-color: #c2c2c2;
+ border-radius: 50%;
+ width: 40rpx;
+ line-height: 40rpx;
+ height: 40rpx;
+ margin-right: 6rpx;
+ .list-box {
+ padding: 28rpx;
+ margin-bottom: 12rpx;
@@ -0,0 +1,79 @@
+ <!-- 使用得时候必须加上style 不然没有--colorxxxxx之类得变量 -->
+ <view class="tabbar align-center">
+ <view v-for="(item, index) in tabbarList" :key="index" @click="switchTabs(item)" class="tablist">
+ <view class="column align-center justify-center" >
+ <image :src="actindex==index?item.selectedIconPath:item.iconPath" class="w48 h48"></image>
+ <text class="fs24 base-textcol" :class="actindex==index?'actcolor':'morecolor'">{{item.Text}}</text>
+ name: "tabbar",
+ props: {
+ actindex: {
+ type: Number,
+ default: 0
+ tabbarList: [],
+ };
+ this.themeicon()
+ switchTabs(item) {
+ // 到时候要设置两个tabbar 但是一教育页面得隐藏掉 这里得页面不能配置到tabbar得list里面
+ uni.navigateTo({
+ url: item.url
+ themeicon() {
+ const theme = this.themes
+ this.tabbarList = [{
+ iconPath: '/static/manageTabIcon/training.png',
+ selectedIconPath: '/static/manageTabIcon/training_on.png',
+ Text: '企业理念',
+ url: '/pages/enterprise/enterprise'
+ iconPath: '/static/manageTabIcon/manage.png',
+ selectedIconPath: '/static/manageTabIcon/manage_on.png',
+ Text: '我的',
+ url: '/pages/user/wxuser'
+ ]
+ .tabbar {
+ display: flex;
+ position: fixed;
+ z-index: 1000;
+ height: 120rpx;
+ padding-bottom: 20rpx;
+ .tablist {
+ width: 50%;
+ .morecolor{
+ color: #626468;
+ .actcolor {
@@ -0,0 +1,303 @@
+ <dropdownPanel :filterData='filterData' @confirm="confirmA" @reset="resetA" @onChange="onChangeA"
+ <scroll-view scroll-y="true" class="hb" :refresher-enabled="isEnabledA"
+ :refresher-triggered="triggeredA" refresher-background="rgba(0,0,0,0)"
+ @refresherrefresh="pullDownRefreshA" @refresherrestore="triggeredA = false" :upper-threshold="100"
+ :lower-threshold="100" @refresherabort="triggeredA = false" @scrolltolower="reachBottomA">
+ <view v-for="(item,index) in courseListA" :key="item.index" class="m10 p10 center"
+ :class="courseListAid==item.periodId?'select':''" style="border-bottom: 2rpx solid #eee;"
+ @click="getCourseOne(item)">
+ {{item.periodName}}
+ <view class="p20 fs28 column flex-1 hb hidden" v-if="searchbarNav == 1">
+ @refresherrefresh="pullDownRefreshC" @refresherrestore="triggeredC = false" :upper-threshold="100"
+ :lower-threshold="100" @refresherabort="triggeredC = false" @scrolltolower="reachBottomC">
+ <view v-for="(item,index) in courseListC" :key="item.index" class="m10 p10 center"
+ :class="actC==index?'select':''" style="border-bottom: 2rpx solid #eee;"
+ @click="getCoursetwo(item,index)">
+ {{item.courseName}}
+ <scroll-view scroll-y="true" class="hb" :refresher-enabled="isEnabled"
+ :refresher-triggered="triggered" refresher-background="rgba(0,0,0,0)"
+ @refresherrefresh="pullDownRefresh" @refresherrestore="triggere = false" :upper-threshold="100"
+ :lower-threshold="100" @refresherabort="triggered = false" @scrolltolower="reachBottom">
+ <view class="list-box" v-for="(item,index) in userlist" :key="index">
+ <u-avatar :src="item.avatar" size="50"></u-avatar>
+ <view class="ml20">
+ <view>{{item.name}}</view>
+ <view class="fs24 mt10 base-color">{{item.title}}</view>
+ getCourseVdieoList,
+ getWorkTask
+ name: "userUrgeCourse",
+ name: '营期',
+ }, {
+ name: '课程',
+ }],
+ //营期分页
+ triggeredA: false,
+ isEnabledA: true,
+ pageNumA: 1,
+ pageSizeA: 6,
+ //课程分页
+ //获取营期/课程列表
+ courseListA: [],
+ courseListAid: '',
+ courseListC: [],
+ courseListCid: '',
+ actC: '',
+ //获取会员列表
+ isEnabled: true,
+ status: 'nomore',
+ userlist:[]
+ this.getcourseA()
+ this.getlist()
+ reachBottom() {
+ pullDownRefresh() {
+ this.triggered = true; //下拉了状态为true
+ this.getlist('refresh')
+ getlist(type){
+ const data={
+ pageSize:this.pageSize
+ getWorkTask(data).then(res=>{
+ this.userlist = res.data.list
+ this.userlist = [...this.userlist, ...res.data.list]
+ onChangeA(index) {
+ if(index==1){
+ if(this.courseListAid==''){
+ title: '请先选择营期'
+ confirmA() {
+ resetA() {
+ this.courseListAid = ''
+ getCourseOne(item) {
+ //获取营期列表
+ this.courseListAid = item.periodId
+ this.filterData[0].name = item.periodName
+ this.courseListC=[]
+ this.pageNumC=1
+ this.getcourseB()
+ // console.log(this.courseListAid)
+ getCoursetwo(item, index) {
+ //获取课程列表
+ this.actC = index
+ this.courseListCid = item.courseId
+ this.filterData[1].name = item.courseName
+ // console.log(item)
+ reachBottomA() {
+ this.pageNumA++
+ this.getcourseA() //触底 不穿执行else
+ pullDownRefreshA() {
+ this.triggeredA = true; //下拉了状态为true
+ this.triggeredA = false;
+ this.pageNumA = 1;
+ this.getcourseA('refresh') //触底 不穿执行else
+ this.getcourseB() //触底 不穿执行else
+ this.getcourseB('refresh') //触底 不穿执行else
+ getcourseA(type) {
+ pageNum: this.pageNumA,
+ pageSize: this.pageSizeA,
+ getFsCourseList(data).then(res => {
+ this.courseListA = res.data.list
+ this.courseListA = [...this.courseListA, ...res.data.list]
+ this.statusA = 'nomore'
+ this.statusA = 'loadmore'
+ getcourseB(type) {
+ pageSize: this.pageSizeC,
+ periodId: this.courseListAid,
+ keyword: ''
+ getCourseVdieoList(data).then(res => {
+ this.courseListC = res.data.list
+ this.courseListC = [...this.courseListC, ...res.data.list]
+<style scoped lang="scss">
@@ -1,5 +1,5 @@
<template>
- <view class="pb130 column flex-1 hb">
+ <view class=" column flex-1 hb" style="height: 100vh;">
<scroll-view scroll-y="true" class="hb" :refresher-enabled="isEnabled" :refresher-triggered="triggered"
refresher-background="rgba(0,0,0,0)" @refresherrefresh="pullDownRefresh"
@@ -15,11 +15,13 @@
<u-avatar :src='item.avatar'></u-avatar>
<view class="list-item-head-l">
<view style="flex: 1;overflow: hidden;display: flex;" @click.passive.stop>
- <text class="list-item-name one-t">{{item.nickName}}</text>
+ <text class="list-item-name one-t single-line-ellipsis"
+ style="width: fit-content;">{{item.nickname}}</text>
<image class="list-item-copy" src="@/static/images/copy_icon.png" mode="aspectFill"
- @click="copyId(item.userId)">
+ @click="copyId(item.nickname)">
</image>
+ <text class="list-item-name one-t fs24 base-color-9 ">备注:{{item.remark}}</text>
<view class="list-item-re">注册时间:{{item.createTime?item.createTime.substring(0,10):'--'}}
@@ -28,40 +30,34 @@
v-if="!isShowSelectAll" @click="tophone(item.phone)" @click.passive.stop></image>
<view class="list-item-desc">
- <view class="taglist">
- <!-- <view><u-tag text="停止看课三天" size="mini" color="#1677ff" bgColor="#fff" borderColor="#fff"></u-tag></view>
- <view v-for="(tag,i) in item.tags ? item.tags.split(',') : []" >
+ <view class="taglist ">
+ <view><u-tag :text="item.companyUserNickName"
+ size="mini" color="#029aff" bgColor="#fff" borderColor="#fff"></u-tag></view>
+ <view v-for="(tag,i) in item.tag ? item.tag.split(',') : []" :key="index">
<u-tag :text="tag" size="mini" color="#999" bgColor="#fff" borderColor="#fff"></u-tag>
- </view> -->
- <!-- <view class="base-color-red">停止看课 3 天</view>
- <view class="u-border-right u-border-left plr10 base-color-9">
- 参与营期 <text class="bold pl6 base-color-3">1</text></view>
- <view class="base-color-9">缺课数量 <text class="base-color-red pl8">2</text></view> -->
- <!-- <view style="margin-top: 5px;">
- <text class="label" style="color:red;margin-right: 20px;">停止看课{{item.watchCount || 0}}天</text>
- <text class="label">参与营期</text><text class="value-num">{{item.watchCount || 0}}</text>
- <text class="label">缺课数量</text><text class="value-num" style="color:red">{{item.watchComlpleteCount || 0}}</text>
- <view class="justify-start">
- <view class="base-color mr8 pr8 u-border-right" v-if="user.userType==0">
- {{item.companyUsernickName}}
- <view class="justify-around">
- <view v-for="(item,index) in item.tagsName" :key="index" class="mlr4">{{item}}</view>
+ <view style="margin-top: 5px;" v-if="item.status==1">
+ <text class="label u-border-right pr20" style="color:#00af05;" v-if="item.courseCountStatus==1">正常看课</text>
+ <text class="label u-border-right pr20" style="color:#ff8921;"
+ v-else-if="item.courseCountStatus==2">停止看课{{item.stopWatchDays || 0}}天</text>
+ <text class="label u-border-right pr20" style="color:#f00;" v-else>未看过课</text>
+ <text class="label pl20 ">参与营期</text><text class="value-num ">{{item.partCourseCount || 0}}</text>
+ <text class="label u-border-left pl20">缺课数量</text><text class="value-num" style="color:red">{{item.missCourseCount || 0}}</text>
- <view class="justify-between" v-if="!isShowSelectAll" @click.passive.stop>
- <view @click="morepage(item)">更多</view>
+ <view class="justify-between align-center" v-if="!isShowSelectAll" @click.passive.stop>
+ <view @click="changemore(item)"
+ class="fs24 u-border ptb4 plr18 radius40 base-color-6">更多</view>
<view class="justify-start">
<view class="btn-box base-color base-bg-sure bor-blue" @click="openModel('label',item)"
- v-if="item.isBlack==0">改标签</view>
+ v-if="item.status==1">改标签</view>
+ <view class="btn-box base-color-red base-bg-false bor-red"
+ @click="openModel('disable',item)" v-if="item.status==1">禁用</view>
<view class="btn-box base-color-red base-bg-false bor-red"
- @click="openModel('disable',item)" v-if="item.isBlack==0">禁用</view>
- <view class="btn-box base-color-red base-bg-false bor-red" @click="openModel('change',item)"
- v-if="item.isBlack==0 && user.userType==0">更换归属</view>
+ @click="openModel('disabled',item)" v-if="item.status==0">取消禁用</view>
+ <!-- <view class="btn-box base-color-red base-bg-false bor-red" @click="openModel('change',item)"
+ v-if="item.status!=7 && user.userType==0">更换归属</view> -->
@@ -69,11 +65,25 @@
<u-loadmore :status="status" />
+ <u-popup :show="showmore" @close="closemore" @open="openmore" >
+ <view class="column align-center">
+ <view class="m20" v-for="(items,index) in morelist"
+ :key="items.value" @click="nameMore(items)">
+ {{items.name}}</view>
+ <u-modal :show="showlist" :title="titlelist" @confirm="confirmchange" >
+ <view class="slot-content">
+ <u-input :placeholder="contpl" v-model="changelist" v-if="selnum==0"></u-input>
+ <u-input :placeholder="contpl" v-model="changeremark" v-if="selnum==1"></u-input>
+ </u-modal>
+ </u-popup>
+ import {getchangesUserInfo} from '@/api/courseManage.js'
props: {
viplist: {
@@ -88,7 +98,7 @@
type: Object,
default: () => ({
pageNum: 1,
- pageSize: 12,
status: {
@@ -104,12 +114,90 @@
user: [],
isEnabled: true,
+ stopWatchDays:'停止看课三天',
+ showmore:false,
+ contpl:'',
+ changelist:'',
+ changeremark:'',
+ selnum:'',
+ titlelist:'',
+ showlist:false,
+ groupid:'',
+ openData:[],
+ morelist:[
+ name:'改姓名',
+ value:0,
+ text:'请输入姓名'
+ name:'改备注',
+ value:1,
+ text:'请输入备注'
this.user = uni.getStorageSync("companyUserInfo") ? JSON.parse(uni.getStorageSync("companyUserInfo")) : {}
+ changemore(data){
+ this.openData=data
+ this.groupid=data.userId,
+ this.showmore=!this.showmore
+ confirmchange(){
+ this.updatagroup()
+ console.log(this.openData.userId)
+ console.log(this.changeremark)
+ console.log(this.changelist)
+ this.showlist=false
+ setTimeout(()=>{
+ this.showmore=false
+ },200)
+ updatagroup(){
+ fsUserId:this.openData.userId,
+ remark:this.changeremark,
+ nickName:this.changelist
+ getchangesUserInfo(data).then(res=>{
+ if(res.code==200){
+ title: "修改成功"
+ this.$emit('changelistname')
+ }else{
+ nameMore(item){
+ console.log(item)
+ this.titlelist=item.name
+ this.contpl=item.text
+ this.selnum=item.value
+ console.log(this.openData)
+ if(item.value==0){
+ this.changelist=this.openData.nickname
+ this.changeremark=this.openData.remark
+ this.showlist=true
+ }else if(item.value==1){
+ closemore(){
+ openmore(){},
tophone(phone){
console.log(phone)
if(phone==null){
@@ -186,7 +274,7 @@
morepage(item) {
- url: '/pages/courseManage/vip/ManageDetail'
+ url: '/pages/courseManage/vip/ManageDetail?id='+item.userId
uni.setStorageSync('detailUser', item)
@@ -195,6 +283,8 @@
this.$emit('getlableId', item.userId)
} else if (tag == 'disable') {
this.$emit('getuserId', item.userId)
+ }else if (tag == 'disabled') {
+ this.$emit('getuserIds', item.userId)
console.log(item.userId)
this.$emit('change', item.userId)
@@ -283,7 +373,7 @@
&-re {
font-size: 10px;
- margin-top: 5px;
+ // margin-top: 5px;
&-desc {
@@ -308,9 +398,8 @@
flex-wrap: wrap;
color: #555;
padding-top: 5px;
view {
- margin: 0 5px 5px 0;
+ margin: 0 5px 0 0;
{
- "name" : "御君方管理",
+ "name" : "直播管理",
"appid" : "__UNI__7F50713",
"description" : "",
"versionName" : "1.0.8",
@@ -109,7 +109,7 @@
"quickapp" : {},
/* 小程序特有相关 */
"mp-weixin" : {
- "appid" : "wx93ce67750e3cfba3",
+ "appid" : "wxd70f99287830cb51",
"setting" : {
"urlCheck" : true
@@ -137,6 +137,9 @@
"locale" : "zh-Hans",
"fallbackLocale" : "zh-Hans",
"h5" : {
+ "devServer" : {
+ "disableHostCheck" : true
"router" : {
"mode" : "hash",
"base" : "./"
@@ -26,10 +26,12 @@
"path": "pages/index/index",
"style": {
- "navigationBarBackgroundColor": "#ffffff",
- "navigationBarTextStyle": "black",
- "navigationBarTitleText": "首页",
- "enablePullDownRefresh": false
+ "navigationBarTextStyle": "white",
+ "enablePullDownRefresh": false,
+ "navigationStyle": "custom",
+ "app-plus": {
+ "bounce": "none"
,{
@@ -37,8 +39,11 @@
"style" :
"navigationBarTextStyle": "white",
- "navigationBarTitleText": "",
@@ -48,8 +53,12 @@
"navigationBarBackgroundColor": "#ffffff",
"navigationBarTextStyle": "black",
- "navigationBarTitleText": "客户",
+ "navigationBarTitleText": "会员数据",
+ // "navigationStyle": "custom",
@@ -63,17 +72,6 @@
"enablePullDownRefresh": false
- ,{
- "path" : "pages/user/ai/index",
- "style" :
- {
- "navigationBarTitleText": "AI智能客服",
"path" : "pages/user/about",
@@ -82,7 +80,16 @@
"navigationBarTitleText": "关于我们",
+ // #ifndef H5
+ "navigationStyle": "default",
@@ -103,8 +110,17 @@
- "navigationBarTitleText": "用户信息",
+ "navigationBarTitleText": "设置",
@@ -115,73 +131,16 @@
"navigationBarTitleText": "用户信息",
- "path" : "pages/user/qwSop/sop",
- "navigationBarTitleText": "群发列表",
- "path" : "pages/user/qwSop/sopLosList",
- "navigationBarTitleText": "群发记录",
- "path" : "pages/user/qwSop/sopLogsDetails",
- "navigationBarTitleText": "记录详情",
- "path" : "pages/user/courseSop/sop",
- "path" : "pages/user/courseSop/sopLosList",
- "path" : "pages/user/courseSop/sopLogsDetails",
@@ -189,14 +148,19 @@
"path" : "pages/user/users/users",
+ "navigationBarTitleText": "销售审核",
- "navigationBarTitleText": "员工列表",
- "enablePullDownRefresh": false,
- "navigationStyle": "custom",
- "app-plus": {
- "bounce": "none"
@@ -214,75 +178,42 @@
- "path" : "pages/user/crm/lineCustomer",
- "navigationBarTitleText": "线索客户",
- "path" : "pages/user/crm/myCustomer",
- "navigationBarTitleText": "我的客户",
- "path" : "pages/user/crm/customerDetails",
- "navigationBarTitleText": "客户详情",
- "path" : "pages/user/crm/importWxUser",
- "navigationBarTitleText": "导入客户",
},{
- "path" : "pages/courseManage/index",
+ "path" : "pages/courseManage/statistics",
"navigationBarTitleText": "",
"enablePullDownRefresh": false,
"app-plus": {
"bounce": "none"
- },{
- "path" : "pages/courseManage/statistics",
+ "path" : "pages/courseManage/operation/index",
+ "navigationBarTitleText": "课程数据详情",
@@ -293,34 +224,36 @@
- "path" : "pages/courseManage/course/learning",
+ "path" : "pages/courseManage/manage/exprotList",
+ "navigationBarTitleText" : "审核列表",
- "navigationBarTitleText": "课程详情",
- "path" : "pages/courseManage/manage/exprotList",
- "navigationBarTitleText" : "导出列表",
- "navigationBarBackgroundColor": "#ffffff"
"path" : "pages/courseManage/manage/lableSetup",
@@ -329,7 +262,12 @@
@@ -357,7 +295,13 @@
+ // 小程序保留默认
@@ -371,7 +315,12 @@
"navigationStyle": "custom",
@@ -405,54 +354,175 @@
- "path" : "pages/courseManage/course/living",
+ "path" : "pages/courseManage/manage/manageIndex",
+ "style" :
+ "navigationBarTitleText" : "管理",
+ "navigationBarBackgroundColor": "#ffffff",
+ "navigationBarTextStyle": "black",
+ "path" : "pages/courseManage/course/courseVideo",
+ "navigationBarTitleText" : "课程详情",
+ "path" : "pages/courseManage/course/becomeSale",
+ "navigationBarTitleText" : "注册"
+ "path" : "pages/course/course",
+ "navigationBarTitleText" : "课程库",
+ "enablePullDownRefresh": true,
+ "path" : "pages/urgeCourse/urgeCourse",
+ "navigationBarTitleText" : "催课面板",
+ "path" : "pages/user/users/becomeVIP",
+ "navigationBarTitleText" : "注册会员",
+ "path" : "pages/auth/wxlogin",
- "navigationBarTitleText" : ""
+ "navigationBarTitleText" : "登录",
+ "navigationStyle": "custom"
+ "path" : "pages/enterprise/enterprise",
+ "navigationBarTitleText" : "",
+ "path" : "pages/user/wxuser",
+ "subPackages": [
+ "root": "pages_course",
+ "pages": [
+ "path": "video",
+ "style": {
+ "navigationBarTitleText": "看课",
+ "titleNView": false
"globalStyle": {
- // "navigationStyle": "custom", // 设置成 custom 即可解决微信H5双标题的问题
- "navigationBarTitleText": "销售管理端",
- "navigationBarBackgroundColor": "#115296",
- "backgroundColor": "#ffffff"
+ "navigationBarTitleText": "看课管理",
+ "navigationBarBackgroundColor": "#FFFFFF",
+ "backgroundColor": "#FFFFFF"
"tabBar": {
- "animation": false,
"color": "#7e7e7e",
- "selectedColor": "#115296",
+ "selectedColor": "#1773ff",
"borderStyle": "white",
"backgroundColor": "#ffffff",
- "height": "64px",
+ "height": "70px",
"fontSize":"12px",
- "iconWidth":"18px",
- "spacing": "4px",
+ "iconWidth":"20px",
+ "spacing": "8px",
"list": [
- // {
- // "pagePath": "pages/index/index",
- // "iconPath": "/static/images/home.png",
- // "selectedIconPath": "/static/images/home_select.png",
- // "text": "首页"
+ "pagePath": "pages/index/index",
+ "iconPath": "/static/manageTabIcon/data.png",
+ "selectedIconPath": "/static/manageTabIcon/data_on.png",
+ "text": "数据"
+ "pagePath": "pages/course/course",
+ "iconPath": "/static/manageTabIcon/liveclasses.png",
+ "selectedIconPath": "/static/manageTabIcon/liveclasses_on.png",
+ "text": "课程库"
"pagePath": "pages/customer/index",
- "iconPath": "/static/images/order.png",
- "selectedIconPath": "/static/images/order_select.png",
- "text": "客户"
+ "iconPath": "/static/manageTabIcon/vip.png",
+ "selectedIconPath": "/static/manageTabIcon/vip_on.png",
+ "text": "会员"
- "pagePath": "pages/msg/index",
- "iconPath": "/static/images/report.png",
- "selectedIconPath": "/static/images/report_select.png",
- "text": "消息"
+ "pagePath": "pages/urgeCourse/urgeCourse",
+ "iconPath": "/static/manageTabIcon/training.png",
+ "selectedIconPath": "/static/manageTabIcon/training_on.png",
+ "text": "催课"
"pagePath": "pages/user/index",
- "iconPath": "/static/images/my.png",
- "selectedIconPath": "/static/images/my_select.png",
- "text": "我的"
+ "iconPath": "/static/manageTabIcon/manage.png",
+ "selectedIconPath": "/static/manageTabIcon/manage_on.png",
+ "text": "管理"
]
@@ -12,7 +12,7 @@
<!-- <text>帐号</text> -->
<view class="input-account">
<input v-model="account"
- placeholder="请输入帐号" type="text" ></input>
+ placeholder="请输入帐号/手机号" type="text" ></input>
<view class="login-item">
@@ -45,11 +45,26 @@ export default {
password:"",
- onLoad(option)
+ onLoad(option) {
+ onShow() {
+ // let loginPage = '';
+ // // #ifdef MP-WEIXIN
+ // loginPage = '/pages/auth/wxlogin';
+ // // #endif
+ // loginPage = '/pages/auth/login';
+ // uni.reLaunch({
+ // url:loginPage,
+ // success: () => {
+ // uni.hideLoading();
+ // },
+ // fail: () => {
+ // }
login(){
@@ -84,7 +99,8 @@ export default {
uni.setStorageSync('companyUserInfo',JSON.stringify(res.data.user));
uni.$emit('initSocket');
- url: '../user/index',
+ // url: '../user/index',
+ url: "/pages/index/index",
animationType: 'pop-in',
animationDuration: 100
@@ -191,14 +207,14 @@ page{
justify-content: center;
width: 100%;
height: 80rpx;
- background: linear-gradient(to right, #115296 0%, #115296 100%);
- background: -moz-linear-gradient(to right, #115296 0%, #115296 100%);
- box-shadow: 0px 7rpx 6rpx 0px rgba(229, 138, 0, 0.22);
+ // background: linear-gradient(to bottom, #cfe3ff, #cabbfd);
+ background: #5c82ff;
+ box-shadow: 0px 7rpx 6rpx 0px rgba(0, 0, 0, 0.2);
border-radius: 40rpx;
font-size: 30rpx;
font-family: PingFang SC;
font-weight: 500;
- color: rgba(255, 255, 255, 1);
+ color: rgba(255, 255, 255, 1.0);
@@ -0,0 +1,563 @@
+ <!-- #ifdef MP-WEIXIN -->
+ <view class="force-login-wrap">
+ <view class="force-login__content y-f">
+ <view class="logo">
+ <view class="logo-img">
+ <image src="/static/logo.png"></image>
+ <!-- <image src="https://rk-hw079058881.obs.cn-north-9.myhuaweicloud.com/fs/20250424/1745461007445.png"></image> -->
+ <view class="title">壹道正气</view>
+ <view class="login-notice">为了提供更优质的服务,请先登录</view>
+ <!-- <button
+ class="author-btn"
+ @click="wxLogin()" >微信授权登录</button> -->
+ <view class="btns">
+ <button
+ open-type="getPhoneNumber"
+ @getphonenumber="phoneLogin" >一键授权手机号登录</button>
+ <button class="author-btn" v-if="isAgreement==false" @click="handleAgree()">一键授权手机号登录</button>
+ @getphonenumber="phoneLogin" >微信授权登录</button> -->
+ <button class="close-btn" @tap="back">暂不登录</button>
+ <view class="tips">
+ <checkbox :checked="isAgreement" @click="handleAgreement()" iconColor="#48a2e1"
+ style="transform:scale(0.9)"/>
+ <view @click="handleAgreement()">您同意并接受</view>
+ <view class="btn" @click="openH5('/h5/userAgreement')">《用户协议》</view>
+ <view class="btn" @click="openH5('/h5/privacyPolicy')">《隐私保护》</view>
+ <!-- #endif -->
+import { loginByMiniApp,getUserInfo } from '@/api/user'
+export default {
+ code:null,
+ isAgreement:false,
+ computed: {
+ onLoad(option)
+ uni.$on('refreshLogin', () => {
+ uni.navigateBack({
+ delta:1
+ //选获取CODE,防止后请求的时候腾讯服务端未同步报错
+ this.getCode();
+ if (this.checkWeixin()) {
+ this.getWxCode()
+ icon:'none',
+ title: "请在微信中打开",
+ //跳转到手机号密码登录
+ onUnload() {
+ handleAgree(){
+ if(!this.isAgreement){
+ title: "请先同意协议后再登录",
+ checkWeixin(){
+ var ua = window.navigator.userAgent.toLowerCase();
+ if (ua.match(/micromessenger/i) == 'micromessenger') {
+ return true;
+ return false;
+ //URL地址是否存在CODE
+ getUrlCode(name) {
+ return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.href) || [, ''])[1]
+ .replace(/\+/g, '%20')) || null
+ //获取微信CODE
+ getWxCode() {
+ //在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的“开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息”的配置选项中,修改授权回调域名。请注意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加 http:// 等协议头;
+ //http://shequ.natapp1.cc/#/pages/index/index?deviceId=8
+ var appId="wxd70f99287830cb51";
+ var url="https://api.zxfh.cdwjyyh.com";
+ window.location.href ='https://open.weixin.qq.com/connect/oauth2/authorize?appid='+appId+'&redirect_uri=' +encodeURIComponent(url+"/#/pages/auth/wxLogin") +'&response_type=code&scope=snsapi_userinfo&state=JeffreySu-954&connect_redirect=1#wechat_redirect';
+ //console.log('https://open.weixin.qq.com/connect/oauth2/authorize?appid='+appId+'&redirect_uri=' +encodeURIComponent("http://shequ.natapp1.cc/#/pages/index/index?deviceId="+this.deviceId) +'&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect')
+ // redirect_uri是授权成功后,跳转的url地址,微信会帮我们跳转到该链接,并且通过?的形式拼接code
+ handleAgreement(){
+ this.isAgreement=!this.isAgreement;
+ openH5(url){
+ var requestPath = uni.getStorageSync('requestPath');
+ uni.setStorageSync('url',requestPath+url);
+ url: '../home/h5'
+ getCode(){
+ var that=this;
+ this.utils.getProvider()
+ .then(provider => {
+ console.log('当前的环境商',provider)
+ if (!provider) {
+ reject()
+ // uni登录
+ uni.login({
+ provider: provider,
+ success: async loginRes => {
+ that.code = loginRes.code
+ .catch(err => {
+ wxLogin() {
+ title:"处理中..."
+ console.log(loginRes)
+ let code = loginRes.code // 获取开发code
+ var userCode=uni.getStorageSync('userCode');
+ loginByMiniApp({
+ encryptedData: e.mp.detail.encryptedData,
+ iv: e.mp.detail.iv,
+ code: code,
+ userCode:userCode
+ .then( res => {
+ uni.hideLoading();
+ title: "登录成功",
+ console.log(res);
+ uni.setStorageSync('AppToken',res.token);
+ uni.setStorageSync('userInfo',JSON.stringify(res.user));
+ //that.getUserInfo()
+ uni.$emit('refreshLogin');
+ else{
+ title: "授权登录失败,请重新登录",
+ .catch(error => {
+ console.log(error)
+ title: "登录接口调用失败",
+ title: err,
+ // 微信用户手机号登录
+ phoneLogin(e) {
+ if (e.mp.detail.errMsg == 'getPhoneNumber:ok') {
+ // userCode:userCode
+ console.log(res)
+ uni.setStorageSync('userInfo',JSON.stringify(res.companyUser));
+ // uni.navigateBack({
+ // delta:1
+ url:'/pages/enterprise/enterprise'
+ title: '已拒绝授权',
+ duration: 2000,
+ back() {
+ uni.navigateBack()
+ radio .wx-radio-input{
+ width: 36rpx;
+ height: 36rpx;
+ border: 1px solid #CCCCCC;
+ /* 选中后的 背景样式 */
+ radio .wx-radio-input.wx-radio-input-checked{
+ background: linear-gradient(135deg, #48a2e1 0%, #60CDC3 100%);
+ border: 1px solid #48a2e1;
+ /* 选中后的 对勾样式 (白色对勾) */
+ radio .wx-radio-input.wx-radio-input-checked::before{
+ color: #ffffff;
+ checkbox .wx-checkbox-input{
+ checkbox .wx-checkbox-input.wx-checkbox-input-checked {
+ checkbox .wx-checkbox-input.wx-checkbox-input-checked::before {
+.container {
+ flex-direction: column;
+ justify-content: flex-start;
+.force-login-wrap {
+ z-index: 11111;
+ .force-login__content {
+ left: 50%;
+ top: 40%;
+ transform: translate(-50%, -50%);
+ .logo{
+ justify-content: center;
+ align-items: center;
+ .logo-img{
+ border: 4upx solid #FFFFFF;
+ box-shadow: 0px 5px 15px 2px rgba(0,0,0,0.1);
+ width: 80px;
+ height: 80px;
+ image{
+ .title{
+ margin-top: 20rpx;
+ font-size: 35rpx;
+ font-family: PingFang SC;
+ color: #000;
+ margin-bottom: 30rpx;
+ .login-notice {
+ font-size: 28rpx;
+ line-height: 44rpx;
+ width: 500rpx;
+ margin-bottom: 80rpx;
+ .btns{
+ width: 630rpx;
+ height: 80rpx;
+ .author-btn{
+ z-index:100;
+ background: linear-gradient(to right, #48a2e1 0%, #2aa7B9 100%);
+ background: -moz-linear-gradient(to right, #48a2e1 0%, #2aa7B9 100%);
+ // box-shadow: 0px 7rpx 6rpx 0px rgba(229, 138, 0, 0.22);
+ border-radius: 40rpx;
+ font-size: 30rpx;
+ font-weight: 500;
+ color: rgba(255, 255, 255, 1);
+ // position: absolute;
+ .author-btn {
+ .close-btn {
+ margin-top: 30rpx;
+ border: 2rpx solid #48a2e1;
+ background: none;
+ color: #48a2e1;
+.tips{
+ checkbox{
+ .btn{
+.wx-login{
+ background: rgba(0,0,0,0.7);
+ z-index: 99999;
+ .form{
+ border-radius: 20rpx;
+ padding: 60rpx 30rpx;
+ width: 500upx;
+ height: 300upx;
+ font-size: 32upx;
+ .desc{
+ font-size: 28upx;
+ margin: 60upx 0upx 60upx 0upx;
+ .btn-box{
+ margin-left: 10upx;
+ border-radius: 5rpx;
+ background-color: #48a2e1;
+ .btn-close{
+ margin-right: 10upx;
+.auth_btn{
+ top:0upx;
+ opacity:0.0;
@@ -1,11 +1,13 @@
<view class="content">
+ <view class="loadding" v-if="loadding==true">
+ <image src="https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/fs/20250416/1744811256845.png"></image>
+ <text class="text">壹道正气</text>
- import { getConfigSignature } from '@/api/qw.js'
@@ -24,13 +26,29 @@
navigatHandler() {
if (!this.utils.isLogin()) {
- url: '../auth/login',
+ url: '/pages/auth/login',
+ uni.reLaunch({
+ url: '/pages/auth/wxlogin',
+ url: '/pages/index/index',
+ console.log('现在')
+ url: '/pages/enterprise/enterprise',
getUserId() {
@@ -110,7 +128,7 @@
};
-<style>
page{
@@ -119,5 +137,28 @@
height: 100%;
+ .loadding{
+ z-index: 9999;
+ animation: load linear 1s infinite;
+ width: 120rpx;
+ height:120rpx;
+ .text{
</style>
@@ -0,0 +1,102 @@
+ <view class="column hidden" style="height: 100%;">
+ <!-- <view class="p20 bgf" style="z-index: 999;">
+ <u-subsection class="subsection" :list="list" :current="current" bgColor="#e7f1fe" activeColor="#1677ff"
+ :fontSize="15" :bold="false" @change="sectionChange" ></u-subsection>
+ <living v-if="current==0" style="margin-top: -240rpx;"></living> -->
+ <liveCourse @child-data-update="onChildDataUpdate" :parent-method="handleParentMethod"></liveCourse>
+ import liveCourse from "@/components/liveCourse.vue"
+ import living from "@/components/living.vue"
+ living,
+ liveCourse
+ list: [{
+ name: '直播课',
+ name: '训练营'
+ current:0,
+ childdata:[]
+ wx.showShareMenu({
+ withShareTicket: true, // 支持群聊分享带shareTicket
+ menus: ['shareAppMessage'] // 同时启用两种分享
+ handleParentMethod() {
+ uni.showToast({ title: '父组件方法被调用' });
+ if (!this.childdata || Object.keys(this.childdata).length === 0) {
+ uni.showToast({ title: '数据未准备好,无法分享', icon: 'none' });
+ uni.share({
+ provider: 'weixin',
+ scene: 'WXSceneSession', // 分享到会话
+ type: 0,
+ title: this.childdata.title,
+ path: this.childdata.path+"?course="+this.childdata.params,
+ imageUrl: this.childdata.img,
+ success: (res) => {
+ console.log('分享成功', res);
+ title: '分享成功',
+ icon: 'none'
+ fail: (err) => {
+ console.log('分享失败', err);
+ title: '分享失败,请稍后再试',
+ onChildDataUpdate(data){
+ this.childdata=data
+ console.log('父组件',data)
+ onShareAppMessage() {
+ title:this.childdata.title , // 分享卡片标题
+ path:this.childdata.path+"?course="+this.childdata.params, // 目标页面路径
+ // 携带参数:将当前页面的数据拼接到路径中
+ imageUrl: this.childdata.img, // 分享卡片封面图(可选)
+ console.log("分享成功", res);
+ console.log("分享失败", err);
+ sectionChange(index){
+ this.current=index
@@ -0,0 +1,205 @@
+ <view class="centerV hb base-bg-f">
+ <image src="/static/logo.png" class="w110 h110"></image>
+ <view class="fs48 bold mt30">注册账户</view>
+ <view class="login">
+ <view class="login-item">
+ <view class="input-pwd input-phone">
+ <input v-model="phoneNumber" maxlength="11"
+ placeholder="请输入电话号码" type="number" ></input>
+ <view class="input-account">
+ <input v-model="nickName"
+ placeholder="请输入名字" type="text" ></input>
+ <!-- <text>密码</text> -->
+ <view class="input-pwd">
+ <input v-model="password" maxlength="16"
+ placeholder="请输入密码" type="password" ></input>
+ <view class="login-btn" @click="login">注册账号</view>
+ <u-popup :show="showvip" @close="close" @open="open"
+ mode='center' round='20' style="flex: 0;" >
+ <view class="VIPvie w600 h600 column justify-center align-center">
+ <image src="../../../static/manergevip/becomeTrue.png" class="h400 w400"></image>
+ <view class="bold fs50 center mt100">{{tips}}!</view>
+ <view class="gologin" @click="loginNav">去登录</view>
+ import { loginsales } from '@/api/courseManage.js'
+ tips:'',
+ showvip:false,
+ companyId:'',
+ phoneNumber:'',
+ nickName:'',
+ password:''
+ this.companyId = option.id
+ close() {},
+ open() {},
+ login(){
+ companyId:this.companyId,
+ phoneNumber:this.phoneNumber,
+ nickName:this.nickName,
+ password:this.password
+ if(this.phoneNumber==''){
+ uni.showToast({ title: '请输入手机号!', icon: 'none' });
+ if(this.nickName==''){
+ uni.showToast({ title: '请输入名字!', icon: 'none' });
+ if(this.password==''){
+ uni.showToast({ title: '请输入密码!', icon: 'none' });
+ if(!uni.$u.test.mobile(this.phoneNumber)){
+ uni.showToast({ title: '请输入正确的手机号码!', icon: 'none' });
+ loginsales(data).then(res=>{
+ this.showvip=true
+ this.tips='恭喜账户注册成功'
+ title: '注册成功',
+ duration: 2000
+ loginNav(){
+ url:loginPage
+.VIPvie {
+ width: 580rpx;
+ background: linear-gradient(to bottom, #c3dbfe 2%, #f6fbfe 50%);
+ height: 640rpx;
+ top: -120rpx;
+ left: 16%;
+.login{
+width: 100%;
+padding: 30rpx 50rpx;
+.login-item{
+ text-align: left;
+ .input-account{
+ margin-bottom: 20rpx;
+ border-radius:40rpx;
+ border:solid 1rpx #e4e4e4;
+ background:url('/static/account.png') no-repeat 0 center;
+ background-size: 30rpx 30rpx;
+ background-position: 30rpx;
+ input{
+ margin-left: 80rpx;
+ line-height: 80rpx
+ .input-pwd{
+ background:url('/static/password.png') no-repeat 0 center;
+ .input-phone{
+ background:url('/static/manergevip/companyphone.png') no-repeat 0 center;
+ background-size: 40rpx 40rpx;
+ background-position: 24rpx;
+.btns{
+ margin: 60rpx 0rpx;
+ .login-btn {
+.gologin{
+ color: #80b9ff;
+ margin-top: 40rpx;
+ border: #80b9ff solid 2rpx;
+ padding:10rpx 30rpx;
@@ -0,0 +1,255 @@
+ <view class="column">
+ <view class="video-box" >
+ <video id="myVideo" :src='listdetail.videoUrl' show-mute-btn='false'
+ vslide-gesture-in-fullscreen='true' loop='true' enable-progress-gesture='true'
+ enable-danmu controls='true' autoplay="true" object-fit='contain' show-center-play-btn='true'
+ class="videotop" ></video>
+ <view class="title-content" id="title-content">
+ <!-- 课程标题 -->
+ <view >
+ {{listdetail.title}}
+ <view class="fs24" style="color: #666;font-weight: normal;">
+ {{listdetail.description}}
+ <view class="fs24" style="color: #999;font-weight: normal;">课程视频时长:{{formatSeconds(listdetail.duration)}}</view>
+ <!-- 问题 -->
+ <view class="ques-content ">
+ <view class="ques-content-tit">问答题</view>
+ <view class="center fs32" v-if="listdetail.questionBankList.length<1" style="color: #666;">暂无问答题</view>
+ <view v-for="(item,index) in listdetail.questionBankList" :key="index">
+ <view class="ques-title">
+ <text>{{index + 1}}.</text>
+ <view class="ques-type" v-show="item.type == 1 || item.type == 2">
+ {{item.type == 1 ? '单选' : item.type == 2 ? '多选' : ''}}
+ <text >{{item.title}}</text>
+ <view :class="option.isAnswer== 1 ?'ques-option ques-option-active':'ques-option'"
+ v-for="(option,idx) in item.question" :key="idx">
+ {{numberToLetter(idx)}}.
+ <view>{{option.name}}</view>
+ <view class="footer">
+ <view class="justify-between" >
+ <!-- <view class="copybtn flex-1 mr40" @click="buildimg">生成海报</view> -->
+ <view class="copybtn flex-1" @click="copyshareLink()">复制分享链接</view>
+ getcourseDetail,
+ sharecourselink
+ } from '@/api/courseManage'
+ numberToLetter
+ } from "@/utils/tools.js"
+ videoId:'',
+ listdetail:[],
+ user:{},
+ copylink:''
+ this.videoId=option.videoId
+ this.getdetail()
+ numberToLetter(num) {
+ // 将数字转换为字母的 ASCII 码
+ let letterCode = num + 65;
+ // 将 ASCII 码转换为大写字母
+ let letter = String.fromCharCode(letterCode);
+ return letter;
+ //转化时间格式
+ formatSeconds(seconds) {
+ const hours = Math.floor(seconds / 3600);
+ const minutes = Math.floor((seconds % 3600) / 60);
+ const remainingSeconds = seconds % 60;
+ // 补零函数:确保两位数显示
+ const pad = (num) => num.toString().padStart(2, '0');
+ return `${pad(hours)}:${pad(minutes)}:${pad(remainingSeconds)}`;
+ // 获取视频详情
+ getdetail() {
+ videoId:this.videoId
+ getcourseDetail(param).then(res => {
+ this.listdetail=res.data
+ this.listdetail.questionBankList= this.listdetail.questionBankList.map(item => ({
+ ...item,
+ question: JSON.parse(item.question),
+ answer: '',
+ }))
+ copyshareLink(){
+ const params = {
+ companyId: this.user.companyId,
+ companyUserId: this.user.userId,
+ courseId: this.listdetail.courseId,
+ time: this.time,
+ videoId: this.listdetail.videoId,
+ sharecourselink(params).then(res => {
+ // if (this.copylink.startsWith('http://')) {
+ // this.copylink = this.copylink.replace('http://', 'https://');
+ uni.setClipboardData({
+ data: this.copylink,
+ success: () => {
+ title: '链接已复制',
+ fail: () => {
+ title: '复制失败',
+ }, 100)
+ console.log(this.copylink)
+.video-box {
+ height: 420rpx;
+ #myVideo {
+.title-content {
+ padding: 20rpx 32rpx;
+ line-height: 1.6;
+.ques-content-tit {
+ font-weight: 600;
+ font-size: 36rpx;
+ color: #222222;
+.ques-content {
+ padding: 32rpx 32rpx;
+ padding-bottom: 140rpx;
+ ont-family: PingFang SC, PingFang SC;
+.ques-title {
+ margin: 32rpx 0 34rpx 0;
+ font-size: 32rpx;
+ white-space: normal;
+.ques-type {
+ flex-shrink: 0;
+ min-width: 72rpx;
+ padding: 0 12rpx;
+ margin: 0 12rpx;
+ background: #ff8901;
+ border-radius: 8rpx 8rpx 8rpx 8rpx;
+ color: #FFFFFF;
+.ques-option {
+ min-height: 88rpx;
+ padding: 24rpx 32rpx;
+ margin-bottom: 24rpx;
+ background: #F5F7FA;
+ border-radius: 16rpx 16rpx 16rpx 16rpx;
+ color: #1db131 !important;
+ background: #e8fcee !important;
+.footer {
+ border-top: 1rpx solid #ededef;
+ background: #fff;
+ z-index: 9;
+ .copybtn {
+ background: #FF5C03;
+ border-radius: 80rpx;
+ padding: 20rpx 0;
@@ -1,263 +0,0 @@
-<template>
- <view class="training-camp">
- <view class="training-camp-btn" @click="choose">{{title}}</view>
- <u-picker ref="upicker" :show="show" :columns="columns" title="训练营选择" keyName="courseName" @confirm="confirm"
- @cancel="cancel"></u-picker>
- <view class="container-body x-start" :style="{height: contentH,width:'100%'}">
- <view class="container-right">
- <scroll-view style="height:100%" :scroll-y="true" :refresher-enabled="true"
- :refresher-triggered="triggered" refresher-background="rgba(0,0,0,0)"
- @refresherrefresh="pullDownRefresh" @refresherrestore="triggered = false" :upper-threshold="100"
- :lower-threshold="100" @refresherabort="triggered = false" @scrolltolower="reachBottom">
- <view class="list">
- <courseItem :from="'course'" :activeTab="0" v-for="(item,index) in dataList" :key="index"
- <u-loadmore :status="loadStatus" />
- </scroll-view>
-</template>
-<script>
- import {
- getFsCourseList,
- getCourseVdieoList
- } from "@/api/courseManage.js"
- import MescrollMoreItemMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mixins/mescroll-more-item.js";
- export default {
- mixins: [MescrollMixin, MescrollMoreItemMixin],
- components: {
- courseItem
- data() {
- return {
- title: '请选择训练营',
- contentH: 0,
- show: false,
- columns: [
- []
- ],
- downOption: {
- auto: false // 不自动加载 (mixin已处理第一个tab触发downCallback)
- upOption: {
- auto: false, // 不自动加载
- page: {
- num: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始
- size: 10 // 每页数据的数量
- noMoreSize: 4, //如果列表已无数据,可设置列表的总数量要大于半页才显示无更多数据;避免列表数据过少(比如只有一条数据),显示无更多数据会不好看; 默认5
- toTop: {
- width: 0,
- keyword: "",
- dataList: [],
- user: {},
- courseList: [],
- chooseIndex: [0],
- courseId: '',
- mescroll: null,
- params: {
- pageNum: 1,
- pageSize: 10
- triggered: false,
- loadStatus: 'loadmore',
- mounted() {
- console.log("======cou")
- const windowHeight = uni.getSystemInfoSync().windowHeight
- this.contentH = `calc(${windowHeight}px - 52px - 56px)`
- this.user = uni.getStorageSync("companyUserInfo") ? JSON.parse(uni.getStorageSync("companyUserInfo")) : {}
- this.getFsCourseList()
- methods: {
- choose() {
- this.show = true
- this.$refs.upicker.setIndexs(this.chooseIndex)
- cancel() {
- this.show = false
- confirm(e) {
- this.chooseIndex = e.indexs
- this.courseId = e.value[0].courseId
- this.title = e.value[0].courseName
- // this.mescroll.resetUpScroll()
- this.getListInit()
- // 训练营
- const day = uni.$u.timeFormat(new Date(), 'yyyy-mm-dd')
- const param = {
- getFsCourseList(param).then(res => {
- if (res.code == 200) {
- this.columns = [this.courseList]
- this.courseId = this.courseList && this.courseList.length > 0 ? this.courseList[0]
- .courseId : ''
- this.title = this.courseList && this.courseList.length > 0 ? this.courseList[0]
- .courseName : '请选择训练营'
- } else {
- uni.showToast({
- icon: 'none',
- title: res.msg,
- getListInit() {
- this.params.pageNum = 1
- this.getListData('refresh')
- async getListData(type = 'refresh') {
- uni.showLoading({
- title: "加载中..."
- this.loadStatus = 'loading'
- const result = await getCourseVdieoList({
- ...this.params
- if (result) {
- const {
- isLastPage,
- total,
- list,
- } = result.data
- if (type == 'refresh') {
- this.dataList = list
- this.dataList = [...this.dataList, ...list]
- if (isLastPage) {
- this.loadStatus = 'nomore';
- this.loadStatus = 'loadmore';
- uni.hideLoading()
- title: "请求失败",
- this.dataList = []
- /**
- * 触底添加下一页
- */
- reachBottom(options) {
- if (this.loadStatus === 'loadmore') {
- uni.showNavigationBarLoading()
- setTimeout(() => {
- this.params.pageNum += 1;
- this.getListData('more')
- uni.hideNavigationBarLoading()
- }, 500);
- * 下拉列表页
- pullDownRefresh(options) {
- this.triggered = true;
- this.triggered = false;
- uni.stopPullDownRefresh()
- this.params.pageNum = 1;
- }, 500)
-</script>
- page {
- background-color: #f5f4f5;
-</style>
-<style lang="scss" scoped>
- .training-camp {
- padding: 10px;
- font-family: PingFang SC, PingFang SC;
- font-weight: 400;
- font-size: 14px;
- color: #222222;
- &-btn {
- font-size: 15px;
- width: 100%;
- height: 32px;
- line-height: 32px;
- text-align: center;
- background-color: #fff;
- border-radius: 50px;
- border: 1px solid #ccc;
- .container-left {
- flex-shrink: 0;
- width: 80px;
- height: 100%;
- overflow-y: auto;
- .active {
- font-weight: bold;
- position: relative;
- &::after {
- content: "";
- height: 15px;
- width: 4px;
- background-color: #1677ff;
- top: 50%;
- left: 0;
- transform: translateY(-50%);
- .classification {
- padding: 20px 16px;
- box-sizing: border-box;
- .container-right {
- flex: 1;
- overflow-y: scroll;
- .list {
@@ -1,22 +0,0 @@
- <view class="column">
@@ -1,736 +0,0 @@
-<!-- 数据组件页面 -->
- <view class="column flex-1 hb">
- <view class="topdata">
- <view class="topdata-box">
- <view>数据汇总</view>
- <view class="x-bc">
- <view class="topdata-item">
- <view class="topdata-item-num"><text>{{companyUserUserCount}}</text>人</view>
- <view>会员总数</view>
- <view class="topdata-item-num"><text>{{companyUserCount}}</text>人</view>
- <view>今日新增会员</view>
- <u-collapse ref="puyaodameinvRef" :value="['0']" :border='false' @change='changelable'>
- <u-collapse-item name="0" :border='false'>
- <view slot="title">
- <text class="bold fs32">标签统计</text>
- <text class="fs24 base-color-9 ml12">左滑查看更多</text>
- <text slot="value" class="statistics-slot-title">{{collapseLable?'展开':'收回'}}</text>
- <view slot="right-icon">
- <u-icon name="arrow-right" color="#1677ff" size="12"></u-icon>
- <view class="">
- <view class=" mb20 morelable">
- <view class="base-bg-f5 p20 radius20 boxlable mr40"
- v-for="(item,index) in lablelistnum" :key="index" style="display: inline-block;">
- <view class="base-color-3 ">{{item.tag}}</view>
- <view class="base-color mt8">
- <text class="fs40 bold">{{item.count}}</text>
- 人
- </u-collapse-item>
- </u-collapse>
- <view class="searchbox">
- <view class="searchbox-bar x-ac">
- <view :class="queryParam.type == index ? 'searchbox-item searchbox-active':'searchbox-item'"
- v-for="(item,index) in typeOption" :key="index" @click="handleType(index)">{{item.label}}</view>
- <view class="x-ac ss" v-show="queryParam.type == 3">
- <view class="calendar-day x-c" @click="showCalendar = true"><u-icon name="calendar" color="#999"
- size="20"></u-icon>{{startTime}}</view>
- size="20"></u-icon>{{endTime}}</view>
- <u-calendar :show="showCalendar" :mode="mode" @confirm="confirmCalendar" style="flex: 0;"
- @close="closeCalendar"></u-calendar>
- <view class="statistics pb120" :style="{height: contentH}">
- <u-collapse :border='false' :value='collapseValue' @change="changeCollapse">
- <u-collapse-item name="course">
- <text slot="title" class="statistics-title">课程统计</text>
- <text slot="value"
- class="statistics-slot-title">{{collapseValue.includes('course')?'收回':'展开'}}</text>
- <view class="collapse-content x-ac">
- <view class="collapse-content-item">
- <view class="collapse-content-title">观看人数</view>
- <view class="collapse-content-num"><text>{{courseCount.count || 0}}</text>人</view>
- <view style="color: #1677ff;" v-show="queryParam.type == 0">
- 较昨天持平{{compare(courseCount.count,courseCount.yesterdayCount)}}</view>
- <view v-show="queryParam.type == 0">昨天{{courseCount.yesterdayCount || 0}}</view>
- <view class="collapse-content-title">完播人数</view>
- <view class="collapse-content-num"><text>{{courseCount.completeCount || 0}}</text>人</view>
- 较昨天持平{{compare(courseCount.completeCount,courseCount.yesterdayCountCompleteCount)}}
- <view v-show="queryParam.type == 0">昨天{{courseCount.yesterdayCountCompleteCount || 0}}
- <view class="collapse-content-title">完播率</view>
- <view class="collapse-content-num"><text>{{courseCount.rate || 0}}</text>%</view>
- 较昨天持平{{compare(courseCount.rate,courseCount.yesterdayRate)}}</view>
- <view v-show="queryParam.type == 0">昨天{{courseCount.yesterdayRate || 0}}</view>
- <u-collapse-item name="questions">
- <text slot="title" class="statistics-title">答题统计</text>
- class="statistics-slot-title">{{collapseValue.includes('questions')?'收回':'展开'}}</text>
- <view class="collapse-content-title">答题人数</view>
- <view class="collapse-content-num"><text>{{quesCount.count || 0}}</text>人</view>
- 较昨天持平{{compare(quesCount.count,quesCount.yesterdayCount)}}</view>
- <view v-show="queryParam.type == 0">昨天{{quesCount.yesterdayCount || 0}}</view>
- <view class="collapse-content-title">正确人数</view>
- <view class="collapse-content-num"><text>{{quesCount.completeCount || 0}}</text>人</view>
- 较昨天持平{{compare(quesCount.completeCount,quesCount.yesterdayCountCompleteCount)}}</view>
- <view v-show="queryParam.type == 0">昨天{{quesCount.yesterdayCountCompleteCount || 0}}</view>
- <view class="collapse-content-title">正确率</view>
- <view class="collapse-content-num"><text>{{quesCount.rate || 0}}</text>%</view>
- 较昨天持平{{compare(quesCount.rate,quesCount.yesterdayRate)}}</view>
- <view v-show="queryParam.type == 0">昨天{{quesCount.yesterdayRate || 0}}</view>
- <u-collapse-item name="redenvelope">
- <text slot="title" class="statistics-title">红包统计</text>
- class="statistics-slot-title">{{collapseValue.includes('redenvelope')?'收回':'展开'}}</text>
- <view class="collapse-content-title">答题红包数</view>
- <view class="collapse-content-num"><text>{{redPacketCount.count || 0}}</text>个</view>
- 较昨天持平{{compare(redPacketCount.count,redPacketCount.yesterdayCount)}}</view>
- <view v-show="queryParam.type == 0">昨天{{redPacketCount.yesterdayCount || 0}}</view>
- <view class="collapse-content-title">答题红包金额</view>
- <view class="collapse-content-num"><text>{{redPacketCount.amount || '0.00'}}</text>元
- 较昨天持平{{compare(redPacketCount.amount,redPacketCount.yesterdayAmount,1)}}</view>
- <view v-show="queryParam.type == 0">昨天{{redPacketCount.yesterdayAmount || '0.00'}}
- <view class="collapse-content x-ac" style="padding: 8px 0;">
- <view class="collapse-content-title">新会员奖励数</view>
- <view class="collapse-content-num"><text>{{redPacketCount.newCount || 0}}</text>个</view>
- 较昨天持平{{compare(redPacketCount.newCount,redPacketCount.yesterdayNewCount)}}</view>
- <view v-show="queryParam.type == 0">昨天{{redPacketCount.yesterdayNewCount || 0}}</view>
- <view class="collapse-content-title">新会员奖励金额</view>
- <view class="collapse-content-num">
- <text>{{redPacketCount.totalAmount || '0.00'}}</text>元
- 较昨天持平{{compare(redPacketCount.totalAmount,redPacketCount.yesterdayTotalAmount,1)}}
- <view v-show="queryParam.type == 0">昨天{{redPacketCount.yesterdayTotalAmount || '0.00'}}
- <u-collapse-item name="funnel" v-if="user.userType==0">
- <text slot="title" class="statistics-title">转化漏斗图</text>
- class="statistics-slot-title">{{collapseValue.includes('funnel')?'收回':'展开'}}</text>
- <view >
- <funnelChart :getratelist="getrateimg" />
- <u-collapse-item name="rank" v-if="user.userType==0">
- <text slot="title" class="statistics-title">排行榜</text>
- class="statistics-slot-title">{{collapseValue.includes('rank')?'收回':'展开'}}</text>
- <view class="flex-1">
- <view class="mt40">
- <view class="justify-between align-center">
- <view class="base-color-3 bold fs32">群管排行榜</view>
- <view class="justify-start" @click="ordergroup(1)"
- v-if="orderGroup=='asc'">
- <u-icon name="list-dot" size="20"></u-icon>
- <view>按正序(前20名)</view>
- <view class="justify-start" @click="ordergroup(0)" v-else>
- <view>按倒序(后20名)</view>
- <view class="centerV">
- <u-tabs :list="list1" @click="clickTab" lineColor='#1773ff' lineWidth='40'
- activeStyle="font-weight:bold"></u-tabs>
- <view class="justify-start align-center mtb28"
- v-for="(item,index) in rankListA"
- :key="index">
- <u-avatar :src="item.avatar" size="40"></u-avatar>
- <view class="flex-1 ml20">
- <view class="justify-between mb16">
- <view class="base-color-3">{{item.name}}</view>
- <view>{{item.rate}}%</view>
- <u-line-progress :percentage="30" activeColor='#1773ff'/>
- <view v-if="rankListA.length==0" class="center mtb32">暂无数据</view>
- <view class="mt60 column flex-1">
- <view class="base-color-3 bold fs32">课程排行榜</view>
- <view class="justify-start" @click="ordergroupB(1)"
- v-if="orderGroupB=='asc'">
- <view class="justify-start" @click="ordergroupB(0)" v-else>
- <u-tabs :list="list1" @click="clickTabB" lineColor='#1773ff' lineWidth='40'
- <view class="justify-start align-center"
- v-for="(item,index) in rankListB"
- <u-line-progress :percentage="30" activeColor='#ed0922'/>
- <view v-if="rankListB.length==0" class="center mtb32">暂无数据</view>
- import code from "../../../uni_modules/uview-ui/libs/config/props/code"
- import funnelChart from "../components/chart.vue"
- getCompanyUserAndUserCount,
- getCourseCount,
- getQuesCount,
- getRecPacketCount,
- getlableNum,
- getcourseRate,
- getGroupRanklist,
- getCourseRanklist
- funnelChart,
- list1: [{
- name: '按完播率',
- }, {
- name: '按正确率'
- }],
- orderGroup:'asc',
- orderGroupB:'asc',
- showCalendar: false,
- mode: 'range',
- typeOption: [{
- label: '今日',
- value: 0
- label: '昨日',
- value: 1
- label: '本月',
- value: 2
- label: '自定义',
- value: 3
- queryParam: {
- type: 0
- collapseValue: ['course', 'questions', 'redenvelope', 'funnel','rank'],
- todayday: uni.$u.timeFormat(new Date(), 'yyyy-mm-dd'),
- startTime: '',
- endTime: '',
- companyUserCount: 0,
- companyUserUserCount: 0,
- courseCount: {},
- quesCount: {},
- redPacketCount: {},
- collapseLable: false,
- lablelistnum: [],
- getrateimg: {},
- rankListA:[],
- rankListB:[],
- activeA:0,
- activeB:0
- computed: {
- compare() {
- return (today, yesterday, type) => {
- const num = Number(yesterday || 0) - Number(today || 0)
- return type == 1 ? num.toFixed(2) : 0
- this.getHeight()
- // this.getUserCount()
- // this.resetDate()
- this.getlableData()
- this.getrateList()
- this.getrankCourse()
- this.getrankgroup()
- clickTab(item) {
- this.activeA=item.index+1
- console.log(this.activeA)
- clickTabB(item) {
- this.activeB=item.index+1
- ordergroup(item){
- if(item==0){
- this.orderGroup='asc'
- }else{
- this.orderGroup='desc'
- ordergroupB(item){
- this.orderGroupB='asc'
- this.orderGroupB='desc'
- getrankCourse(){
- //获取课程排行
- this.startTime = this.todayday
- this.endTime = this.todayday
- this.resetDate()
- const params = {
- endTime: this.endTime+' 23:59:59',
- startTime: this.startTime+' 00:00:00',
- order:this.orderGroupB,
- type: this.activeB, // 0:经销商/1:群管
- getCourseRanklist(params).then(res=>{
- this.rankListB = res.data
- title: res.msg
- getrankgroup(){
- //获取群管排行
- order:this.orderGroup,
- type: this.activeA, // 0:经销商/1:群管
- getGroupRanklist(params).then(res=>{
- this.rankListA = res.data
- getrateList() {
- //获取漏斗图
- courseId: this.courseid,
- videoId: this.courseids,
- getcourseRate(params).then(res => {
- this.getrateimg = res
- getlableData() {
- getlableNum(params).then(res => {
- this.lablelistnum = res.data
- this.$nextTick(() => {
- this.$refs.puyaodameinvRef.init()
- changelable(e) {
- if (e[0].status = 'open') {
- this.collapseLable = true
- getHeight() {
- const query = uni.createSelectorQuery().in(this);
- .select(".topdata")
- this.contentH = `calc(${windowHeight}px - ${data.height}px - 56px)`
- resetDate() {
- if (this.queryParam.type == 0) {
- } else if (this.queryParam.type == 1) {
- let yesterday = new Date();
- yesterday.setDate(yesterday.getDate() - 1);
- this.startTime = uni.$u.timeFormat(yesterday, 'yyyy-mm-dd')
- this.endTime = uni.$u.timeFormat(yesterday, 'yyyy-mm-dd')
- } else if (this.queryParam.type == 2) {
- let today = new Date();
- let lastDayOfMonth = new Date(today.getFullYear(), today.getMonth() + 1, 0);
- this.startTime = uni.$u.timeFormat(this.todayday, 'yyyy-mm') + '-01'
- this.endTime = uni.$u.timeFormat(lastDayOfMonth, 'yyyy-mm-dd')
- } else if (this.queryParam.type == 3) {
- this.getCount()
- handleType(type) {
- if (this.queryParam.type == type) {
- return
- this.queryParam.type = type
- if (this.queryParam.type == 3) {
- changeCollapse(e) {
- this.collapseValue = e.filter(item => item.status == 'open').map(it => it.name)
- closeCalendar() {
- this.showCalendar = false
- confirmCalendar(e) {
- this.startTime = e[0]
- this.endTime = e[e.length - 1]
- getUserCount() {
- endTime: day + ' 23:59:59',
- startTime: day + ' 00:00:00',
- getCompanyUserAndUserCount(param).then(res => {
- this.companyUserCount = res.data.companyUserCount || 0
- this.companyUserUserCount = res.data.companyUserUserCount || 0
- getCount() {
- endTime: this.endTime + ' 23:59:59',
- startTime: this.startTime + ' 00:00:00',
- this.getCourseCount(param)
- this.getQuesCount(param)
- this.getRecPacketCount(param)
- getCourseCount(param) {
- getCourseCount(param).then(res => {
- this.courseCount = res.data
- getQuesCount(param) {
- getQuesCount(param).then(res => {
- this.quesCount = res.data
- getRecPacketCount(param) {
- getRecPacketCount(param).then(res => {
- this.redPacketCount = res.data
-<style scoped lang="scss">
- .boxlable {
- width: 47%;
- .morelable {
- overflow-x: auto;
- /* 添加横向滚动条 */
- white-space: nowrap;
- .container {
- .calendar-day {
- font-size: 12px;
- color: #999;
- margin: 10px 10px 0 10px;
- background-color: #f5f5f5;
- border-radius: 4px;
- .topdata {
- padding-top: 25px;
- background: linear-gradient(to right, rgba(225, 238, 255, 1), rgba(223, 224, 254, 1));
- &-box {
- padding: 12px;
- margin: 0 12px 0 12px;
- background-color: rgba(255, 255, 255, 0.5);
- border-radius: 8px 8px;
- &-item {
- width: 50%;
- padding: 8px;
- &-num {
- color: #1677ff;
- text {
- font-family: DIN, DIN;
- font-size: 25px;
- .searchbox {
- border-radius: 8rpx 8rpx 0 0;
- padding: 15px;
- height: 23px;
- line-height: 23px;
- width: 65px;
- background: #f5f5f5;
- border-radius: 5px;
- color: #888;
- &-active {
- color: #fff !important;
- background-color: #1677ff !important;
- .statistics {
- &-title {
- font-size: 16px;
- &-slot-title {
- .collapse-content {
- margin: 0 -8px -8rpx 0;
- border-radius: 10px;
- font-size: 10px;
- margin: 0 8px 8rpx 0;
- margin-bottom: 10px;
@@ -1,132 +0,0 @@
- <view class="app-wrapper" :style="{height: '100vh'}">
- <dataIndex v-if="templateView == 'dataIndex'"></dataIndex>
- <liveIndex ref="mescrollItem1" v-show="templateView == 'liveIndex'"></liveIndex>
- <operationIndex ref="mescrollItem1" :key="templateView" v-show="templateView == 'operationIndex'">
- </operationIndex>
- <courseIndex ref="mescrollItem2" v-show="templateView == 'courseIndex'"></courseIndex>
- <vipIndex ref="mescrollItem3" v-show="templateView == 'vipIndex'"></vipIndex>
- <manageIndex ref="mescrollItem3" v-show="templateView == 'manageIndex'"></manageIndex>
- <view class="myTabBar x-f x-bc">
- <view class="myTabBar-item x-f y-f" @click="handleTab('dataIndex')">
- <image src="@/static/manageTabIcon/data.png" mode="aspectFill" v-if="templateView!=='dataIndex'">
- </image>
- <image src="@/static/manageTabIcon/data_on.png" mode="aspectFill" v-else></image>
- <text :class="templateView=='dataIndex'?'base-color':''">数据</text>
- <view class="myTabBar-item x-f y-f" @click="handleTab('operationIndex')" v-if="user.userType==0">
- <image src="@/static/manageTabIcon/liveclasses.png" mode="aspectFill"
- v-if="templateView!=='operationIndex'"></image>
- <image src="@/static/manageTabIcon/liveclasses_on.png" mode="aspectFill" v-else></image>
- <text :class="templateView=='operationIndex'?'base-color':''">运营</text>
- <view class="myTabBar-item x-f y-f" @click="handleTab('liveIndex')" v-if="user.userType==1">
- <image src="@/static/manageTabIcon/liveclasses.png" mode="aspectFill" v-if="templateView!=='liveIndex'">
- <text :class="templateView=='liveIndex'?'base-color':''">直播课</text>
- <view class="myTabBar-item x-f y-f" @click="handleTab('courseIndex')">
- <image src="@/static/manageTabIcon/training.png" mode="aspectFill" v-if="templateView!=='courseIndex'">
- <image src="@/static/manageTabIcon/training_on.png" mode="aspectFill" v-else></image>
- <text :class="templateView=='courseIndex'?'base-color':''" v-if="user.userType==1">训练营</text>
- <text :class="templateView=='courseIndex'?'base-color':''" v-else>课程库</text>
- <view class="myTabBar-item x-f y-f" @click="handleTab('vipIndex')">
- <image src="@/static/manageTabIcon/vip.png" mode="aspectFill" v-if="templateView!=='vipIndex'"></image>
- <image src="@/static/manageTabIcon/vip_on.png" mode="aspectFill" v-else></image>
- <text :class="templateView=='vipIndex'?'base-color':''">会员</text>
- <view class="myTabBar-item x-f y-f" @click="handleTab('manageIndex')" v-if="user.userType==0">
- <image src="@/static/manageTabIcon/manage.png" mode="aspectFill" v-if="templateView!=='manageIndex'">
- <image src="@/static/manageTabIcon/manage_on.png" mode="aspectFill" v-else></image>
- <text :class="templateView=='manageIndex'?'base-color':''">管理</text>
- import MescrollCompMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mixins/mescroll-comp.js";
- import MescrollMoreMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mixins/mescroll-more.js";
- import dataIndex from "./dataIndex/index.vue"
- import liveIndex from "./live/index.vue"
- import courseIndex from "./course/index.vue"
- import vipIndex from "./vip/index.vue"
- import operationIndex from './operation/index.vue'
- import manageIndex from './manage/index.vue'
- mixins: [ MescrollCompMixin,MescrollMoreMixin], //mescroll-body写在子组件时
- dataIndex,
- liveIndex,
- courseIndex,
- vipIndex,
- operationIndex,
- manageIndex
- templateView: 'vipIndex',
- statusBarHeight: uni.getSystemInfoSync().statusBarHeight,
- windowHeight: uni.getSystemInfoSync().windowHeight,
- bodyHeight: 0,
- tabIndex: 0,
- user: []
- onLoad() {
- // console.log(this.windowHeight);
- this.bodyHeight = `calc(${this.windowHeight}px - 56px)`
- uni.setNavigationBarTitle({
- title: '数据'
- if (this.user.userType == 0) {
- this.templateView = 'manageIndex'
- this.templateView = 'vipIndex'
- handleTab(tem) {
- this.templateView = tem
- // console.log(tem)
- .app-wrapper {
- .myTabBar {
- height: 64px;
- border-top: 1px solid #f5f5f5;
- position: fixed;
- bottom: var(--window-bottom);
- image {
- width: 24px;
- height: 24px;
- margin-bottom: 3px;
@@ -8,10 +8,10 @@
<view class="pl20 " v-if="active==0">
- <view class="mb20 fs28">选择接收群管</view>
+ <view class="mb20 fs28">选择接收销售</view>
<view class="base-bg-f8 p10 justify-between align-center mr20 pl20">
- <text class="mr20">接收群管</text>
- <u-input placeholder="请选择接收群管" @focus="selsome" border="none"
+ <text class="mr20">接收销售</text>
+ <u-input placeholder="请选择接收销售" @focus="selsome" border="none"
v-model="username"></u-input>
<view class='fs24 mtb12 base-color base-bg-sure mr20 pl20 ptb4'>
@@ -30,10 +30,10 @@
<u-input placeholder="请选择会员" border="none" @focus='changelabelvip'
v-model="tagsuser"></u-input>
- <view class="mb20 fs28 mt20">选择接收群管</view>
+ <view class="mb20 fs28 mt20">选择接收销售</view>
- <u-input placeholder="请选择接收群管" border="none" @focus='changeuser'
+ <u-input placeholder="请选择接收销售" border="none" @focus='changeuser'
@@ -44,21 +44,19 @@
<u-picker :show="show" :columns="columns" @cancel='show=!show'
@confirm='receiveA' keyName="nickName"
></u-picker>
- <u-picker :show="showa" :columns="columnsa" @cancel='showa=!showa'
- @confirm='receiveB' keyName="tag"
- ></u-picker>
<u-picker :show="showb" :columns="columnsb" @cancel='showb=!showb'
@confirm='receiveC' keyName="nickName"
<u-popup :show="showvip" @close="close" @open="open" >
<view class="p20 h400">
- <view class="justify-between mb20" style="flex-direction: row-reverse">
- <u-icon name="close-circle" color="#ccc" size="28"
- @click="showvip=!showvip"></u-icon>
+ <view class="mb20" style="text-align: center;">
+ <view style="display: inline-block; ">选择会员</view>
+ <u-icon name="close-circle" color="#ccc" size="28"
+ @click="showvip=!showvip" style="display: inline-block;float: right;"></u-icon>
<view class="justify-start wrap">
<view class="p16 mlr12" v-for="(item,index) in tagsuserlist" :key="index">
- <u-tag :text="item.nickName" :plain="!item.checked" type="primary" :name="index"
+ <u-tag :text="item.userName" :plain="!item.checked" type="primary" :name="index"
@click="checkboxClick">
</u-tag>
@@ -68,14 +66,48 @@
+ <u-popup :show="showPop" :round="12" @close="closePop" class="model" :zIndex="10076" style="flex: 0;">
+ <view class="popbox">
+ <view class="popbox-head">
+ <u-icon class="close-circle" name="close-circle" color="#ccc" size="24" @click="showPop=!showPop"></u-icon>
+ 标签筛选
+ <view class="popbox-body">
+ <view class="mb20" >
+ <u-search placeholder="请输入标签 多个标签用 , 隔开" v-model="tagkeywords" :showAction="false" height="30px"
+ @search='getcompanyTag'></u-search>
+ @refresherrefresh="pullDownRefreshs" @refresherrestore="triggereds = false" :upper-threshold="100"
+ :lower-threshold="100" @refresherabort="triggereds = false" @scrolltolower="reachBottoms">
+ <view class="tagbox-list x-f" style="white-space: nowrap;flex-wrap: wrap;">
+ <view class="tagbox-item x-f tag-active" v-if="columnsa.length<=0">暂无标签</view>
+ <view class="mlr10 mb10" v-for="(item,index) in columnsa" :key='item.tagId'>
+ <u-tag :text="item.tag" :plain="!item.checked" :name="index"
+ @click="chooseTag(index)"></u-tag>
+ <view class="center fs24 mt20">
+ <text class="mr20" @click="getTagpage('last')">上一页</text>
+ <text class="base-color-red">{{pagetag.pageNum}}/{{pagetag.pages}}</text>
+ <text class="ml20" @click="getTagpage('next')">下一页</text>
+ <view class="popbox-footer x-bc">
+ <button class="popbox-footer-btn" @click="resetPop" >重置</button>
+ <button class="popbox-footer-btn con-btn" @click="confirmPop">确定</button>
getgroupList,
- changevipUser,
- getcompanyTaglist,
+ getallTags,
changevipUserAll,
gettagsUser,
@@ -107,7 +139,16 @@
tagsuser:'',
tagsuserlist:[],
user:[],
- usertagsid:[]
+ usertagsid:[],
+ showPop:false,
+ tagkeywords:'',
+ tagpageNum:1,
+ tagpageSize:10,
+ triggereds:false,
+ statusA: 'loadmore',
+ pagetag:[],
+ ids:[]
onLoad(option) {
@@ -118,15 +159,81 @@
+ resetPop(){
+ this.tagkeywords=''
+ this.usertag=''
+ this.tagpageNum=1
+ this.gettaglist()
+ getcompanyTag(value){
+ this.tagkeywords=value
+ confirmPop() {
+ // this.queryParam.typeIndex = this.typeIndex
+ this.showPop = false
+ this.usertag = this.columnsa.filter(item => item.checked).map(v => v.tag).join(',')
+ this.tagsid = this.columnsa.filter(item => item.checked).map(v => v.tagId).join(',')
+ this.ids= this.columnsa.filter(item => item.checked).map(v => v.tagId)
+ //filtter(过滤) 筛选所有checked==true的 然后map返回每一项的id
+ // if (this.idx.length == 0) {
+ // this.showCompanytag = this.companytag
+ chooseTag(i) {
+ this.columnsa[i].checked = !this.columnsa[i].checked
+ getTagpage(type){
+ //标签页数选择
+ if(type=='last'){
+ if(this.tagpageNum>=2){
+ this.tagpageNum--
+ title: '已经是第一页',
+ duration: 1000
+ if(this.tagpageNum<this.pagetag.pages){
+ this.tagpageNum++
+ title: '已经是最后一页',
+ //标签展示下拉
+ this.tagpageNum = 1;
+ this.gettaglist('refresh') //触底 不穿执行else
+ closePop(){
+ this.showPop=!this.showPop
checkboxClick(name){
- console.log(name)
this.tagsuserlist[name].checked = !this.tagsuserlist[name].checked
- console.log(this.tagsuser)
getuserid(){
this.tagsuser = this.tagsuserlist.filter(item => item.checked)
- .map(v => v.nickName).join(',')
- this.usertagsid = this.tagsuserlist.filter(item => item.checked)
+ .map(v => v.userName).join(',')
+ this.ids = this.tagsuserlist.filter(item => item.checked)
.map(v => v.userId)
this.showvip=!this.showvip
@@ -148,11 +255,9 @@
gettagUserlist(){
+ console.log(this.tagsid)
const param={
- companyId:this.user.companyId,
- // companyUserId:this.groupid,
- tagIds:this.tagsid,
- companyUserId:this.userid
+ tagId:this.tagsid,
gettagsUser(param).then(res=>{
if(res.code==200){
@@ -166,33 +271,13 @@
- changesomevip(){
- //更换部分会员归属
- const param={
- companyUserId:this.groupid,
- userId:this.usertagsid
- changevipUser(param).then(res=>{
- if(res.code==200){
- title: '更换会员归属成功'
changeall(){
- //更换全部会员
+ //更换会员归属
- newCompanyUserId:this.userid,
- oldCompanyUserId:this.groupid
+ from:this.groupid,
+ to:this.userid,
+ type:this.active,
+ ids:this.ids
changevipUserAll(param).then(res=>{
@@ -213,7 +298,7 @@
if(this.userid==''){
- title: '请选择接收群管'
+ title: '请选择接收销售'
}else{
this.changeall()
@@ -224,13 +309,18 @@
title: '请选择标签'
- }else if(this.usertagsid==''){
+ }else if(this.ids==''){
title: '请选择会员'
+ }else if(this.userid==''){
- this.changesomevip()
+ this.changeall()
@@ -259,17 +349,41 @@
changelabel(){
this.tagsuser=''
- this.showa=true
+ this.showPop=true
this.gettaglist()
changeuser(){
this.showb=true
this.getgrouplist()
- gettaglist(){
- getcompanyTaglist().then(res=>{
+ gettaglist(type){
+ //获取标签列表
+ pageNum:this.tagpageNum,
+ pageSize:this.tagpageSize,
+ keyword:this.tagkeywords
+ getallTags(data).then(res=>{
- this.columnsa=[res.data]
+ const dataList = res.data.list.map(item => {
+ checked: false,
+ this.columnsa = dataList
+ }else {
+ // this.columnsa = [...this.columnsa, ...dataList]
+ this.pagetag=res.data
+ this.changetag = this.columnsa
@@ -279,7 +393,7 @@
getgrouplist(){
- //获取群管列表
+ //获取销售列表
getgroupList().then(res=>{
this.columns=[res.data]
@@ -298,6 +412,100 @@
<style lang="scss" scoped>
+ .popbox {
+ border-radius: 12px;
+ color: #333;
+ &-head {
+ padding: 15px;
+ font-size: 15px;
+ .close-circle {
+ right: 10px;
+ top: 50%;
+ transform: translateY(-50%);
+ &-body {
+ padding: 10px 10px;
+ .radiobox {
+ padding: 10px 0;
+ border-bottom: 1px solid #f5f5f5;
+ &:last-child {
+ border-bottom: none;
+ &-footer {
+ padding: 15px 0;
+ &-footer-btn {
+ height: 44px;
+ line-height: 44px;
+ margin: 0 10px;
+ border-radius: 50px;
+ border: none;
+ &::after {
+ .con-btn {
+ background-color: #1677ff;
+ .choosetitle {
+ .invitetip {
+ margin-top: 10px;
+ background-color: #ebf5fb;
+ color: #1677ff;
+ padding: 5px 10px;
+ border-radius: 5px;
+ .sharePop-item {
+ padding: 0 10px;
+ display: inline-flex !important;
+ height: 48px;
+ width: 48px;
+ margin-bottom: 10px;
@@ -1,47 +1,163 @@
<view class="column flex-1 hb">
- <view class="p20">
- <view class="fs28 base-color-6 justify-between">
- <view>今日</view>
- <view class="justify-start align-center base-color">
- <image src="../../../static/manergevip/Refresh.png"
- class="w30 h30" ></image>
- <text class="ml8">刷新</text>
- <view class="justify-start mtb20 pb20" style="border-bottom: #eee solid 2rpx;">
- <image src="../../../static/images/send.png" class="w60 h60"></image>
- <view class="ml20">
- <view class="fs28">数据表格名称</view>
- <view class="justify-start fs24 base-color-6">
- <view>0MB</view>
- <view class="plr12 mlr12"
- style="border-right: 2rpx solid #ddd;border-left: 2rpx solid #ddd">2024-01-26 16:37:30</view>
- <view>已过期</view>
+ <view class="p20 bgf">
+ <u-subsection :list="list" :current="actnav" @change="sectionChange" bgColor='#def1ff' inactiveColor="#666"></u-subsection>
+ <view class="column scrolly">
+ <scroll-view scroll-y="true" class="hb" :refresher-enabled="isEnabled" :refresher-triggered="triggered"
+ refresher-background="rgba(0,0,0,0)" @refresherrefresh="pullDownRefresh"
+ @refresherabort="triggered = false" @scrolltolower="reachBottom">
+ <view v-for="(item,index) in listgood" :key="index" class="listcss" @click="getlist(item)">
+ <view class="justify-between align-center">
+ <view class="w180 justify-between fs28 align-center ">
+ <u-avatar :src="item.fromAvatar" size="25"></u-avatar>
+ <text class="ml10 single-ellipsis">{{item.fromName}}</text>
+ <text class="fs24 base-color-9">更换为</text>
+ <image src="/static/images/jiantou.png" class="w60 h40"></image>
+ <u-avatar :src="item.toAvatar" size="25"></u-avatar>
+ <text class="ml10 single-ellipsis">{{item.toName}}</text>
+ <view class="fs24 base-color-9">{{item.applyTime}}</view>
+ <view class="fs24 base-color-9 " style="color: orange;" v-if="actnav==0">待审核</view>
+ <view class="fs24 base-color-9 base-color" v-if="actnav==1">审核通过</view>
+ <view class="fs24 base-color-9 base-color-red" v-if="actnav==2">审核未通过</view>
- <view class="fs28 base-color-6">昨日</view>
- <view class="fs28 base-color-6">以往</view>
+ <u-popup :show="show" @close="close" @open="open" :closeOnClickOverlay="true"
+ mode="center" round='10'>
+ <view class="poplist scrolly">
+ <view class="center mb20">更换会员</view>
+ <view v-for="(item,index) in nowlist" :key="index" class="justify-start align-center">
+ <u-avatar :src="item.avatar" size="25"></u-avatar>
+ <view class="fs28 ml16 base-color-6">昵称:</view>
+ <view class="fs28 base-color-6">{{item.userName}}</view>
+ getchangeslist
+ list: ['待审核', '通过审核', '审核未通过'],
+ actnav:0,
+ listgood:[],
+ show:false,
+ nowlist:[]
+ this.getexaminelist()
+ getlist(item){
+ this.show=!this.show
+ this.nowlist=item.users
+ console.log(this.nowlist)
+ close(){
+ console.log(this.show)
+ open(){},
+ // 下拉刷新
+ this.getexaminelist('refresh') //触底 不穿执行else
+ console.log(111);
+ this.getexaminelist() //触底 不穿执行else
+ this.listgood=[]
+ this.actnav=index
+ getexaminelist(type){
+ pageSize: this.pageSize,
+ status:this.actnav
+ getchangeslist(data).then(res=>{
+ // refresh 下拉
+ this.listgood = res.data.list
+ this.listgood = [...this.listgood, ...res.data.list]
- page{
+ // page{
+ // background-color: #fff;
+ .listcss{
+ margin: 20rpx;
+ padding: 20rpx;
+ border-radius: 10rpx;
+ .poplist{
+ height: 600rpx;
@@ -1,6 +1,6 @@
- <view class="align-center justify-between p20">
+ <view class="column hb bgf">
+ <view class="align-center justify-between p20 bgf ">
<view class="justify-start fs28 align-center">
<u-icon name="bookmark-fill" color="#1677ff" size="28"></u-icon>
<view>自定义标签</view>
@@ -8,22 +8,33 @@
<view class="fs28" @click="isShowSelectAll=!isShowSelectAll">
{{isShowSelectAll?'取消多选':'多选'}}</view>
+ <view class="mtb20 mlr20" >
+ @search='getcompanyTag' ></u-search>
<view class="column flex-1 scrolly plr20" >
- <view class="justify-start" v-for="(item,index) in companylabel"
- <u-checkbox-group @change="selectlist(index)">
- <u-checkbox :checked="item.checked" shape="circle" activeColor="#FF6C47" :name="true"
- label="" labelColor="#333" v-if="isShowSelectAll"/>
- </u-checkbox-group>
- <view class="justify-start align-center ptb16 flex-1"
- style="border-bottom: 2rpx solid #e7e7e7;" >
- <u-icon name="list" color="#666" size="24"></u-icon>
- <view class="fs28 ml12">{{item.tag}}</view>
+ <scroll-view scroll-y="true" class="hb" :refresher-enabled="isEnabled" :refresher-triggered="triggereds"
+ <view class="justify-start " v-for="(item,index) in companylabel"
+ :key="index">
+ <u-checkbox-group @change="selectlist(index)">
+ <u-checkbox :checked="item.checked" shape="circle" activeColor="#FF6C47" :name="true"
+ label=" " labelColor="#333" v-if="isShowSelectAll"/>
+ </u-checkbox-group>
+ <view class="justify-start align-center ptb16 flex-1"
+ style="border-bottom: 2rpx solid #e7e7e7;" >
+ <u-icon name="list" color="#666" size="24"></u-icon>
+ <view class="fs28 ml12">{{item.tag}}</view>
+ <view class="h120"></view>
<view class="footbtn">
- <view v-if="isShowSelectAll" class="justify-between p20">
+ <view v-if="isShowSelectAll" class="justify-between p20 bgf">
<view class="align-center justify-between" v-if="isShowSelectAll">
<u-checkbox-group @change="selectAll">
<u-checkbox :checked="isSelectAll" shape="circle" activeColor="#FF6C47"
@@ -40,18 +51,20 @@
<view class='base-bg radius50 m20 p20 center colorf'
@click="addLable" v-else>新增标签</view>
- <u-modal :show="showlist" title="新增标签" @confirm="confirmchange"
- :showCancelButton="true" @cancel="cancel" style="flex: 0;">
- <view class="slot-content">
- <u-input placeholder="请输入新增标签" v-model="addlable"></u-input>
- </u-modal>
+ <u-modal :show="showlist" title="新增标签" @confirm="confirmchange"
+ :showCancelButton="true" @cancel="cancel" style="flex: 0;">
+ <u-input placeholder="请输入新增标签" v-model="addlable"></u-input>
addCompanyLabel,
deleteCompanyLabel
@@ -65,21 +78,77 @@
isSelectAll:false,
isSelected:false,
selectedCount:0,
- selectidAll:[]
+ selectidAll:[],
+ tagpageSize:13,
+ statusA:"nomore",
+ isEnabled:true
this.getcompanylabel()
+ watch:{
+ selectedCount(oldVal,newVal){
+ return oldVal
+ console.log('message changed from', oldVal, 'to', newVal)
+ this.companylabel=[]
+ this.tagkeywords = value
+ this.getcompanylabel()
+ this.getcompanylabel() //触底 不穿执行else
+ this.getcompanylabel('refresh') //触底 不穿执行else
changeProhibit(){
+ const alltag=this.selectidAll.join(',')
+ console.log(this.selectidAll)
//删除标签
+ if(this.selectidAll==''){
+ title: '请选择标签'
const params={
- tagIds:this.selectidAll
+ tagIds:alltag
console.log(this.selectidAll)
- deleteCompanyLabel(params).then(res=>{
+ deleteCompanyLabel(alltag).then(res=>{
+ this.selectidAll=[]
title: '标签删除成功'
@@ -93,15 +162,31 @@
- getcompanylabel(){
+ getcompanylabel(type ){
+ this.tagkeywords =this.tagkeywords.replace(/,/g,',')
+ const data ={
- this.companylabel = res.data.map(item => {
...item,
checked: false,
+ this.companylabel = dataList
+ this.companylabel = [...this.companylabel, ...dataList]
}else {
@@ -116,6 +201,9 @@
addCompanyLabel(params).then(res=>{
+ this.addlable=''
title: '标签添加成功'
@@ -134,14 +222,14 @@
selectlist(i){
// 单选 /反选
- console.log(i)
let arr = {
...this.companylabel[i],
checked: !this.companylabel[i].checked
this.$set(this.companylabel, i, arr)
+ const seletnum = this.companylabel.filter(item => item.checked).map(item => item.tagId)
this.selectidAll = this.companylabel.filter(item => item.checked).map(item => item.tagId)
- console.log(this.selectidAll)
+ this.selectedCount=seletnum.length
this.isSelectAll = this.companylabel.every(item => item.checked)
if (this.isSelectAll) {
this.companylabel = this.companylabel.map(item => {
@@ -163,6 +251,8 @@
checked: this.isSelectAll
console.log(this.companylabel)
confirmchange(){
@@ -184,5 +274,10 @@
<style lang="scss">
+.footbtn{
@@ -1,16 +1,17 @@
<view class="header p20">
<u-avatar :src="grouplist.avatar" size="50"></u-avatar>
- <view class="justify-start align-center ml20">
+ <view class="justify-start align-center ">
<text class="fs32 bold mr8">{{grouplist.nickName}}</text>
<image class="w40 h40" src="@/static/images/copy_icon.png" @click="copyId" mode="aspectFill">
+ <view class="fs24 base-color-9 mt10">备注:{{grouplist.remark ||'暂无'}}</view>
- <view class="ptb20">-</view>
+ <view class="ptb20 fs24 base-color-6">手机号码:{{grouplist.phonenumber||'暂无'}}</view>
<view class="bgf">
<view class="centerV">
@@ -21,35 +22,50 @@
<view class="base-bg-sure boxs">
<view class="bold">会员总数</view>
<view class="base-color fs28">
- <text class="fs40 bold">{{companyUserUserCount}}</text>人
+ <text class="fs40 bold">{{companyUserCount.userTotal}}</text>人
<view class="bold">今日新增会员</view>
- <text class="fs40 bold">{{companyUserCount}}</text>人
+ <text class="fs40 bold">{{companyUserCount.todayNewUser}}</text>人
<view class="bold">会员红包数</view>
- <view class="base-color fs28"><text class="fs40 bold">{{redbaglist.count}}</text>个</view>
+ <view class="base-color fs28"><text class="fs40 bold">{{companyUserCount.userRedPacketNum}}</text>个</view>
<view class="bold">新会员红包金额</view>
- <view class="base-color fs28"><text class="fs40 bold">{{redbaglist.amount}}</text>元</view>
+ <view class="base-color fs28"><text class="fs40 bold">{{companyUserCount.todayUserRedPacketAmount}}</text>元</view>
<dropdownPanel :filterData='filterData' @onChange="onChange" @confirm="confirm" @reset="reset">
+ <u-search placeholder="请输入标签 多个标签用 , 隔开" v-model="keywordC" :showAction="false" height="30px"
+ @search='getcompanyTagC'></u-search>
<view class="p20 fs28 column flex-1 scrolly">
- <view v-for="(item,index) in courseOne" :key="item.index"
- :class="courseid==item.courseId?'actNav':''" class="m10 p10 center"
- style="border-bottom: 2rpx solid #eee;" @click="getCourseOne(item.courseId)">
- {{item.courseName}}
+ <view v-for="(item,index) in courseOne" :key="item.index"
+ :class="courseid==item.courseId?'actNav':''" class="m10 p10 center"
+ style="border-bottom: 2rpx solid #eee;" @click="getCourseOne(item.courseId)">
<view class="p20 fs28 column flex-1 hidden h100" v-if="searchbarNav == 1">
+ <u-search placeholder="请输入标签 多个标签用 , 隔开" v-model="keyword" :showAction="false" height="30px"
<scroll-view scroll-y="true" class="hb" :refresher-enabled="isEnableds"
:refresher-triggered="triggereds" refresher-background="rgba(0,0,0,0)"
@refresherrefresh="pullDownRefreshs" @refresherrestore="triggereds = false"
@@ -75,14 +91,15 @@
v-for="(item,index) in courselist" :key="index">
<view class="justify-start align-center pb20" style="border-bottom: #eee solid 2rpx;">
<view class="doingimg">
- <image src="../../../static/manergevip/book.png" class='w150 h90 radius16'></image>
+ <!-- <image src="../../../static/manergevip/book.png" class='w150 h90 radius16'></image> -->
+ <image :src="item.thumbnail" class='w150 h90 radius16'></image>
<view class="doing">进行中</view>
<view class="ml20">
<view class="justify-start align-center">
<view>{{item.courseName}}</view>
<view class="justify-start align-center base-color">ID
- <image class="w40 h40" @click="copyCourseId(item.courseId)"
+ <image class="w40 h40" @click="copyCourseId(item.courseName)"
src="@/static/images/copy_icon.png" mode="aspectFill">
@@ -95,42 +112,42 @@
<view class="justify-between fs28 mt20">
<view class="flex-1">
<view class="mb8 base-color-6">观看人数</view>
- <view>{{item.count}}</view>
+ <view>{{item.countVO.courseWatchNum}}</view>
<view class="mb8 base-color-6">完播人数</view>
- <view>{{item.completeCount}}
- <text class="base-color-red ml16">完播率{{item.completeRate.toFixed(2)}}%</text>
+ <view>{{item.countVO.courseCompleteNum}}
+ <text class="base-color-red ml16">完播率{{item.countVO.completeRate}}%</text>
<view class="justify-between fs28 mt20 pb20" style="border-bottom: #eee solid 2rpx;">
<view class="mb8 base-color-6">答题红包数</view>
- <view>{{item.redPacketCount}}</view>
+ <view>{{item.countVO.redPacketNum}}</view>
<view class="mb8 base-color-6">答题红包金额</view>
- <view>{{item.amount}}元</view>
+ <view>{{item.countVO.redPacketAmount}}元</view>
<view class="justify-between mt20">
<view class="base-color-6 mb8 ">答题人数</view>
- <view>{{item.answerCount}}</view>
+ <view>{{item.countVO.answerNum}}</view>
<view class="base-color-6 mb8 ">正确人数</view>
- <view>{{item.answerRightCount}}</view>
+ <view>{{item.countVO.answerRightNum}}</view>
- <view class="base-color-6 mb8 ">正确率</view>
- <view>{{item.answerRightRate.toFixed(2)}}%</view>
+ <!-- <view class="base-color-6 mb8 ">正确率</view>
+ <view>{{item.answerRightRate.toFixed(2)||0}}%</view> -->
- <view class="centerV mt20">
+ <!-- <view class="centerV mt20">
<view class="colorf base-bg ptb12 w400 radius80 center ">课程数据</view>
<view class="h90 "></view>
@@ -139,8 +156,13 @@
<view class="column flex-1 scrolly " v-show="showCont==1"
style="height: calc(100% - 100rpx);padding-bottom: 100rpx;">
<u-collapse ref="collapseRef" :border="false" :value="collapseValue" @change="changeCollapse">
- <text slot="title" class="bold fs32">课程统计</text>
+ <u-collapse-item name="course" title="课程统计">
+ <!-- #ifndef MP-WEIXIN -->
+ <u-collapse-item name="course">
+ <text slot="title" class="bold fs32">课程统计</text>
<text slot="value" class="base-color fs24">{{collapseValue.includes('course')?'收回':'展开'}}</text>
<view slot="right-icon">
<u-icon name="arrow-right" color="#1677ff" size="12"></u-icon>
@@ -149,23 +171,28 @@
<view class="base-bg-f radius16 p30 flex-1">
<view class="mb12 bold">营期</view>
<view class="base-color">
- <text class="bold fs40">{{courseCount.course}}</text>期
+ <text class="bold fs40">{{courseCount.courseNum}}</text>期
<view class="base-bg-f radius16 p20 flex-1 mlr20">
<view class="mb12 bold">课程数</view>
- <view class="base-color"><text class="bold fs40">{{courseCount.count}}
+ <view class="base-color"><text class="bold fs40">{{courseCount.videoNum}}
</text>课</view>
<view class="base-bg-f radius16 p20 flex-1">
<view class="mb12 bold">参与会员</view>
<view class="base-color"><text class="bold fs40">
- {{courseCount.watchCount}}</text>人</view>
+ {{courseCount.courseUserNum}}</text>人</view>
</u-collapse-item>
- <text slot="title" class="bold fs32">答题统计</text>
+ <u-collapse-item name="redenvelope" title="答题统计">
+ <u-collapse-item name="redenvelope">
+ <text slot="title" class="bold fs32">答题统计</text>
<text slot="value"
class="base-color fs24">{{collapseValue.includes('redenvelope')?'收回':'展开'}}</text>
@@ -173,24 +200,29 @@
<view class="justify-around ">
- <view class="mb12 bold">答题人次</view>
+ <view class="mb12 bold">答题人数</view>
- {{answerlist.count}}</text>人</view>
+ {{courseCount.answerNum}}</text>人</view>
- <view class="mb12 bold">正确人次</view>
+ <view class="mb12 bold">正确人数</view>
- {{answerlist.completeCount}}</text>人</view>
+ {{courseCount.answerRightNum}}</text>人</view>
<view class="mb12 bold">正确率</view>
- {{answerlist.rate.toFixed(2)}}</text>%</view>
+ {{courseCount.answerRightRate}}</text>%</view>
- <u-collapse-item name="live">
- <text slot="title" class="bold fs32">红包统计</text>
+ <u-collapse-item name="live" title="红包统计">
+ <u-collapse-item name="live">
+ <text slot="title" class="bold fs32">红包统计</text>
<text slot="value" class="base-color fs24">{{collapseValue.includes('live')?'收回':'展开'}}</text>
@@ -199,7 +231,7 @@
<view class="mb12 bold">红包个数</view>
- {{redbaglist.count}}</text>个</view>
+ {{courseCount.redPacketNum}}</text>个</view>
<view class="base-bg-f radius16 p20 mlr20 justify-start align-center">
<image src="../../../static/images/redenvelope.png" class="w102 h102"></image>
@@ -207,7 +239,7 @@
<view class="mb12 bold">答题红包金额</view>
<text class="bold fs40">
- {{redbaglist.amount}}
+ {{courseCount.redPacketAmount}}
</text>元
@@ -218,37 +250,37 @@
<view class="foot-box justify-between bgf p20 align-center">
- <view class="fs28 base-color-6" @click="showmore=!showmore">更多</view>
+ <view class="fs28 base-color-6" @click="showmore=true">更多</view>
<view class="base-color-red base-bg-false plr20 fs28 ptb8 radius40 bold" @click="changevipDetail()">更换会员归属
- <u-popup :show="showmore" @close="closemore" @open="openmore" style="flex: 0;">
- <view class="column align-center">
- <view class="m20" v-for="(item,index) in morelist" :key="item.value" @click="nameMore(item)">
- {{item.name}}
- <u-modal :show="showlist" :title="titlelist" @confirm="confirmchange">
- <u-input :placeholder="contpl" v-model="changelist" v-if="selnum==1"></u-input>
- <u-input :placeholder="contpl" v-model="changephone" v-if="selnum==2"></u-input>
- <u-input :placeholder="contpl" v-model="changeremark" v-if="selnum==3"></u-input>
+ <u-popup :show="showmore" @close="closemore" @open="openmore" style="flex: 0;">
+ <view class="m20" v-for="(item,index) in morelist" :key="item.value" @click="nameMore(item)">
+ {{item.name}}
- </u-popup>
+ <u-modal :show="showlist" :title="titlelist" @confirm="confirmchange">
+ <u-input :placeholder="contpl" v-model="changelist" v-if="selnum==1"></u-input>
+ <u-input :placeholder="contpl" v-model="changephone" v-if="selnum==2" maxlength="11" ></u-input>
+ <u-input :placeholder="contpl" v-model="changeremark" v-if="selnum==3"></u-input>
getCourseVdieoList,
+ getmanagepopnum,
getRecPacketCount,
- getshopCoursenum,
+ getmanagecourse,
getcourseList,
updategroupinfo,
getGroupDetail
@@ -264,7 +296,7 @@
list1: [{
name: '课程分析'
}, {
- name: '群管数据'
+ name: '销售数据'
}],
filterData: [{
name: '训练营-营期',
@@ -315,8 +347,7 @@
pageNums: 1,
pageSizes: 5,
redprice: '',
+ companyUserCount: [],
redbaglist: [],
courseCount: [],
answerlist: [],
@@ -327,7 +358,14 @@
pageSize: 3,
grouplist: [],
- selnum: 0
+ selnum: 0,
+ statusC: 'loadmore',
+ pageSizeC: 10,
+ keywordC:'',
@@ -337,30 +375,63 @@
this.grouplist = uni.getStorageSync("grouplist")
this.getvipcount()
- this.getredbaglist()
this.getcout()
this.getcoursegroup()
this.getgroupdetail()
+ getcompanyTagC(value){
+ this.keywordC=value
+ this.getCourseList()
+ this.getCourseList('refresh') //触底 不穿执行else
+ this.getCourseList() //触底 不穿执行else
+ this.keyword=value
+ this.getCourseListsmall()
- data: String(this.groupid),
+ data: String(this.grouplist.nickName),
- title: '用户id复制成功',
+ title: '用户昵称复制成功',
duration: 2000
+ this.showmore = false
copyCourseId(id) {
+ console.log(id)
data: String(id),
- title: '课程id复制成功',
+ title: '课程标题复制成功',
@@ -369,7 +440,7 @@
getgroupdetail() {
- userId: this.groupid
+ companyUserId : this.groupid
getGroupDetail(param).then(res => {
this.grouplist = res.data
@@ -379,7 +450,7 @@
console.log(Number(this.groupid))
nickName: this.changelist,
- phonenumber: this.changephone,
+ phoneNumber: this.changephone,
remark: this.changeremark,
userId: this.groupid
@@ -423,15 +494,11 @@
getcoursegroup(type) {
companyUserId: this.groupid,
courseId: this.courseid,
videoId: this.courseids,
pageNum: this.pageNum,
pageSize: this.pageSize,
getcourseList(param).then(res => {
console.log(res)
@@ -458,32 +525,14 @@
getcout() {
this.getCourselist(param)
- this.getanswer(param)
- getanswer(param) {
- // console.log(res)
- this.answerlist = res.data
getCourselist(param) {
- getshopCoursenum(param).then(res => {
+ getmanagecourse(param).then(res => {
this.courseCount = res.data
@@ -494,43 +543,14 @@
- getredbaglist() {
- //红包统计
- companyUserId: this.groupid,
- getRecPacketCount(params).then(res => {
- this.redbaglist = res.data
getvipcount() {
//获取会员总数
+ getmanagepopnum(param).then(res => {
+ this.companyUserCount=res.data
@@ -569,17 +589,29 @@
getCourseTwo(id) {
this.courseids = id
- getCourseList() {
+ getCourseList(type) {
+ this.courseOne=[]
//获取课程列表
+ keyword:this.keywordC,
- this.courseOne = res.data
+ // this.courseOne = res.data.list
// console.log(res)
+ this.courseOne = res.data.list
+ this.courseOne = [...this.courseOne, ...res.data.list]
@@ -593,8 +625,8 @@
pageNum: this.pageNums,
- pageSize: this.pageSizes, //
- status: ''
+ pageSize: this.pageSizes,
getCourseVdieoList(param).then(res => {
@@ -620,6 +652,12 @@
this.$nextTick(() => {
this.$refs?.collapseRef?.init()
+ this.courseid=''
+ this.courseids=''
+ this.getvipcount()
+ this.getcout()
+ this.getcoursegroup()
console.log(e.index)
@@ -641,13 +679,13 @@
if (this.searchbarNav == 0) {
this.courseid = ''
+ // this.getredbaglist()
this.courselist = []
this.courseids = ''
@@ -667,7 +705,7 @@
this.contpl = item.text
this.selnum = item.value
if (item.value == 0) {
+ this.copyId()
} else if (item.value == 1) {
this.changelist = this.grouplist.nickName
this.showlist = true
@@ -1,20 +1,20 @@
- <view class="header-box ptb32 pl20">
+ <view class="header-box ptb52 pl20">
<view class="justify-between align-center">
<u-avatar :src="user.avatar" size="50"></u-avatar>
- <view class="column colorf ml16">
+ <view class="column colorf ml16" style="color: #666;">
<text>{{user.userName}}</text>
<text class="mt20 fs24">ID:{{user.companyId}}</text>
- <view class="column justify-between mr4 ">
- <!-- <view class="box-btn base-color" @click="exportlist">导出列表</view> -->
- <view class="box-btn base-color" @click="lableSetup">标签设置</view>
+ <view class="column justify-between mr20 ">
+ <view class="box-btn base-color mb16" @click="exportlist">审核详情</view>
+ <!-- <view class="box-btn base-color centerV" @click="lableSetup">标签设置</view> -->
- <view class="base-bg-f8 mr4 radius20 p32 mt32 justify-start pb32">
+ <!-- <view class="bgf mr4 radius20 p32 mt32 justify-start pb32">
<view class="flex-1 pb20" @click="userdataDetail">
<view class="bold">账户可用余额</view>
<view class="bold fs48 base-color">{{balanceuserDay.balance}}</view>
@@ -24,7 +24,7 @@
{{PickerName}}</text>已发金额</view>
<view class="bold fs48 base-color">{{balanceuserDay.todayMoney}}</view>
<view class="bgf centerV" style="border-radius: 10rpx 10rpx 0 0; margin-top: -8rpx;">
<u-tabs :list="list1" @click="clickTab" lineColor='#1773ff' lineWidth='40'
@@ -43,38 +43,45 @@
<text class="fs28 bold">{{item.nickName}}</text>
<image class="w40 h40" src="@/static/images/copy_icon.png"
- @click="copyId(item.userId)" mode="aspectFill">
+ @click="copyId(item.nickName)" mode="aspectFill">
- <view class="fs24 base-color-6">id:{{item.userId}}</view>
+ <view class="fs24 base-color-6">备注:{{item.remark}}</view>
<view class="justify-around mt32">
<view class="column align-center">
<view class="fs24 base-color-3">今日观看人数</view>
- <text class="bold fs40 base-color">{{item.count}}</text>人
+ <text class="bold fs40 base-color">{{item.todayWatchCount}}</text>人
<view class="fs24 base-color-3">今日完播人数</view>
- <text class="bold fs40 base-color">{{item.completeCount}}</text>人
+ <text class="bold fs40 base-color">{{item.todayFinishCount}}</text>人
<view class="fs24 base-color-3">今日完播率</view>
- <text class="bold fs40 base-color">{{item.rate.toFixed(2)}}</text>%
+ <text class="bold fs40 base-color" >{{item.todayFinishRate.toFixed(2)}}</text>%
<view class="fs24 base-color-3">今日红包金额</view>
- <text class="bold fs40 base-color">{{item.amount}}</text>元
+ <text class="bold fs40 base-color">{{item.todayRedPacketAmount}}</text>元
- <view class="base-bg-f8 pl20">-</view>
+ <view class="base-bg-f8 pl20 fs24 ptb8 mt4 radius20" >
+ <text class="base-color-6">更换归属状态:</text>
+ <text style="color: orange;" v-if="item.applyStatus==0">待审核</text>
+ <text style="color: green;" v-if="item.applyStatus==1">审核通过</text>
+ <text class="base-color-red" v-if="item.applyStatus==2">审核未通过</text>
+ <text class=" base-color" v-if="item.applyStatus==3">暂无</text>
<view class="justify-between fs24 mt20 align-center" @click.passive.stop>
<view >
<text @click="showmoreA(item)">更多</text></view>
@@ -87,7 +94,7 @@
- <view class="ptb80"></view>
+ <view class="ptb20"></view>
<!-- <image class="invite-member" src="@/static/images/invite-member-icon.png" mode="aspectFill" @click="vipInvite">
@@ -109,8 +116,10 @@
- <u-picker :show="showday" :columns="columns" keyName="label" style="flex:0;" @cancel="cancel"
- @confirm='confirm'></u-picker>
+ <u-picker :show="showday" :columns="columns" keyName="label" style="flex:0;" @cancel="cancel"
+ @confirm='confirm'></u-picker>
@@ -124,7 +133,7 @@
- name: '群管理员(0)',
+ name: '销售员(0)',
// {
// name: '待审群管(0)'
@@ -201,7 +210,7 @@
this.getredlist()
- this.getuserbalancelist()
+ // this.getuserbalancelist()
showmoreA(data){
@@ -219,7 +228,7 @@
console.log( Number(this.groupid))
nickName:this.changelist,
- phonenumber:this.changephone,
+ phoneNumber:this.changephone,
remark:this.changeremark,
@@ -229,6 +238,7 @@
title: "修改成功"
+ this.getredlist('refresh')
@@ -270,8 +280,6 @@
this.showlist=false
setTimeout(()=>{
this.showmore=false
- this.getredlist()
- console.log(this.getredlist())
},200)
copyId(id) {
@@ -336,7 +344,7 @@
getusergroup(params).then(res => {
- this.list1[0].name = '群管理员(' + res.data.total + ')'
+ this.list1[0].name = '销售员(' + res.data.total + ')'
// refresh 下拉
if (type == 'refresh') {
this.redpacklist = res.data.list
@@ -428,14 +436,17 @@
.header-box {
- background: linear-gradient(to right, rgba(66, 144, 240, 1.0), rgba(39, 107, 254, 1));
+ // background: linear-gradient(to right, rgba(66, 144, 240, 1.0), rgba(39, 107, 254, 1));
+ background: linear-gradient(to bottom, #dae9ff, #e1e1fd);
.box-btn {
font-size: 28rpx;
- background-color: #f8f8f8;
border-radius: 8rpx;
padding: 4rpx 20rpx;
+ width: fit-content;
.invite-member {
@@ -112,7 +112,7 @@
@@ -21,13 +21,20 @@
<view class="column flex-1 hb hidden">
- <view class="p20 fs28 column flex-1 scrolly">
+ <view class="p20 fs28 column flex-1 scrolly">
<view v-else class="p20 fs28 column flex-1 hidden">
<scroll-view scroll-y="true" class="hb" :refresher-enabled="isEnabled"
@@ -50,8 +57,13 @@
<view class="bgf m20 radius8 column flex-1 scrolly" style="max-height: 100%;">
<view class="column flex-1 scrolly">
@@ -60,22 +72,27 @@
<view class="base-bg-f8 radius16 p30 flex-1">
- {{courselist.course}}</text>期</view>
+ {{courselist.courseNum}}</text>期</view>
<view class="base-bg-f8 radius16 p20 flex-1 mlr20">
- {{courselist.count}}</text>课</view>
+ {{courselist.videoNum}}</text>课</view>
<view class="base-bg-f8 radius16 p20 flex-1">
- {{courselist.watchCount}}</text>人</view>
+ {{courselist.courseUserNum}}</text>人</view>
- <!-- <u-collapse-item name="questions">
- <text slot="title" class="bold fs32">直播统计</text>
+ <u-collapse-item name="questions" title="看课统计">
+ <u-collapse-item name="questions">
+ <text slot="title" class="bold fs32">看课统计</text>
class="base-color fs24">{{collapseValue.includes('questions')?'收回':'展开'}}</text>
@@ -83,21 +100,26 @@
- <view class="mb12 bold">观看人次</view>
- <view class="base-color"><text class="bold fs40">3</text>人</view>
+ <view class="mb12 bold">观看人数</view>
+ <view class="base-color"><text class="bold fs40">{{courselist.courseWatchNum}}</text>人</view>
- <view class="mb12 bold">完播人次</view>
+ <view class="mb12 bold">完播人数</view>
+ <view class="base-color"><text class="bold fs40">{{courselist.courseCompleteNum}}</text>人</view>
<view class="mb12 bold">完播率</view>
- <view class="base-color"><text class="bold fs40">3</text>%</view>
+ <view class="base-color"><text class="bold fs40">{{courselist.courseCompleteRate}}</text>%</view>
- </u-collapse-item> -->
+ </u-collapse-item>
@@ -105,24 +127,29 @@
+ {{courselist.answerNum}}</text>人</view>
+ {{courselist.answerRightNum}}</text>人</view>
- {{answerlist.rate}}</text>%</view>
+ {{courselist.answerRightRate}}</text>%</view>
@@ -131,31 +158,42 @@
+ {{courselist.redPacketNum}}</text>个</view>
<view class="base-bg-f8 radius16 p20 mlr20 justify-start align-center">
- <text class="bold fs40">{{redbaglist.amount}}</text>元
+ <text class="bold fs40">{{courselist.redPacketAmount}}</text>元
- <u-collapse-item name="funnel">
- <text slot="title" class="bold fs32">转化漏斗图</text>
+ <u-collapse-item name="funnel" title="转化漏斗图" v-if="!ratelistState">
+ <u-collapse-item name="funnel" v-if="!ratelistState">
+ <text slot="title" class="bold fs32">转化漏斗图</text>
<text slot="value" class="base-color fs24">{{collapseValue.includes('funnel')?'收回':'展开'}}</text>
+ <view v-show="!ratelistState">
<funnelChart :getratelist="getrateimg" />
+ <view v-show="ratelistState" class="center">暂无数据</view>
- <u-collapse-item name="rank">
- <text slot="title" class="bold fs32">排行榜</text>
+ <u-collapse-item name="rank" title="排行榜">
+ <u-collapse-item name="rank">
+ <text slot="title" class="bold fs32">排行榜</text>
<text slot="value" class="base-color fs24">{{collapseValue.includes('rank')?'收回':'展开'}}</text>
@@ -177,15 +215,16 @@
activeStyle="font-weight:bold"></u-tabs>
- <view class="justify-start align-center mtb28" v-for="(item,index) in rankListA"
+ <view class="justify-start align-center mtb28" v-for="(items,index) in rankListA"
:key="index">
+ <u-avatar :src="items.avatar" size="40"></u-avatar>
<view class="flex-1 ml20">
<view class="justify-between mb16">
+ <view class="base-color-3 single-line-ellipsis">{{items.userName}}</view>
+ <view v-if="activeA==1">{{items.completeRate}}%</view>
+ <view v-else>{{items.answerRightRate}}%</view>
- <u-line-progress :percentage="30" activeColor='#1773ff' />
+ <u-line-progress :percentage="activeA==1?items.completeRate:items.answerRightRate" activeColor='#ed0922' />
<view v-if="rankListA.length==0" class="center mtb32">暂无数据</view>
@@ -206,13 +245,14 @@
<u-tabs :list="list1" @click="clickTabB" lineColor='#1773ff' lineWidth='40'
- <view class="justify-start align-center" v-for="(item,index) in rankListB" :key="index">
+ <view class="justify-start align-center" style="height: fit-content;" v-for="(item,index) in rankListB" :key="index">
+ <view class="base-color-3 single-line-ellipsis">{{item.videoName}}</view>
+ <view v-if="activeB==1">{{item.completeRate}}%</view>
+ <view v-else>{{item.answerRightRate}}%</view>
- <u-line-progress :percentage="30" activeColor='#ed0922' />
+ <u-line-progress :percentage="activeB==1?item.completeRate:item.answerRightRate" activeColor='#ed0922' />
<view v-if="rankListB.length==0" class="center mtb32">暂无数据</view>
@@ -221,7 +261,6 @@
</u-collapse>
- <view class="h120"></view>
@@ -229,17 +268,15 @@
- getCourseVdieoList,
+ getvideolist,
getshopCoursenum,
+ getcourseRates,
getGroupRanklist,
getCourseRanklist
import parse from "../../../uni_modules/uview-ui/libs/config/props/parse"
+ import funnelChart from "@/components/chart.vue"
dropdownPanel,
@@ -272,7 +309,6 @@
pageSize: 10,
courselist: [],
- redbaglist: [],
getrateimg: {},
name: '按完播率',
@@ -285,13 +321,17 @@
rankListB: {},
activeA: 1,
activeB: 1,
+ pageNums: 1,
+ pageSizes: 10,
+ ratelistState:false
async mounted() {
this.getCoursestatistics()
- this.getquslist()
this.getrateList()
this.getrankgroup()
await this.getrankCourse()
@@ -327,7 +367,7 @@
endTime: '',
startTime: '',
+ periodId: this.courseid,
order: this.orderGroupB,
type: this.activeB, // 0:经销商/1:群管
@@ -348,9 +388,7 @@
//获取群管排行
const params = {
order: this.orderGroup,
type: this.activeA, // 0:经销商/1:群管
@@ -370,16 +408,12 @@
getrateList() {
//获取漏斗图
+ getcourseRates(params).then(res => {
+ this.ratelistState = res.data.every(item => item.value === 0);
this.getrateimg = res
@@ -389,62 +423,11 @@
- getquslist() {
- //答题统计
- getQuesCount(params).then(res => {
getCoursestatistics() {
//课程统计
- // videoId:this.courseids,
+ videoId:this.courseids,
getshopCoursenum(params).then(res => {
@@ -459,6 +442,31 @@
+ this.pageNums = 1;
+ this.pageNums++
pullDownRefresh() {
// 下拉
this.triggered = true; //下拉了状态为true
@@ -490,16 +498,25 @@
+ pageNum: this.pageNums,
@@ -513,9 +530,8 @@
pageSize: this.pageSize, //
- getCourseVdieoList(param).then(res => {
+ getvideolist(param).then(res => {
@@ -558,8 +574,6 @@
this.getrankCourse()
@@ -571,6 +585,10 @@
+ this.getCoursestatistics()
+ this.getrateList()
+ this.getrankgroup()
+ this.getrankCourse()
clickTab(item) {
this.activeA = item.index + 1
@@ -4,24 +4,22 @@
<view class="container-body">
<view class="coursebox">
<view class="coursebox-info">
- <!-- <view class="status">进行中</view> -->
- <!-- <view class="status" style="background-color: #ff4746;">已结束</view> -->
<view class="coursebox-name">
+ <text class="more-t">{{info.title}}-{{info.courseName}}</text>
<view class="btn_icon" @click="copyId">ID
- <!-- <view class="coursebox-name">7.明医有话说-杜老师给您讲讲抑郁杜老师给您讲讲抑郁</view> -->
<view style="margin-top: 5px;">{{info.courseName}}</view>
<view class="coursebox-time x-start">
- <view class="coursebox-time-item" style="margin-right: 14px;">
+ <!-- <view class="coursebox-time-item" style="margin-right: 14px;">
<view>直播时间</view>
<view class="coursebox-time-t">{{info.createTime}}</view>
<view class="coursebox-time-item duration">
- <view>课程时长</view>
- <view class="coursebox-time-t">{{$formatSeconds(info.duration || 0,1)}}</view>
+ <view class="fs24">课程时长</view>
+ <view class="coursebox-time-t">
+ {{formatSeconds(info.duration || 0,1)}}</view>
@@ -30,9 +28,13 @@
<u-tabs :list="list1" :current='current' :scrollable="false" :lineWidth="40" lineColor="#1677ff"
:activeStyle="activeStyle" :inactiveStyle="inactiveStyle" @click="clickTab"></u-tabs>
<u-collapse :border='false' :value='collapseValue' @change="changeCollapse" v-if="current == 0">
+ <u-collapse-item name="live" title="课程数据">
<u-collapse-item name="live">
- <view slot="title" class="statistics-title">直播数据<text
- class="statistics-title-tip">2分钟自动更新</text></view>
+ <text slot="title" class="bold fs32">课程数据</text>
<view slot="value"
class="statistics-slot-title">{{collapseValue.includes('live')?'收回':'展开'}}</view>
@@ -41,22 +43,26 @@
<view class="collapse-content x-ac">
<view class="collapse-content-item">
<view class="collapse-content-title">观看人数</view>
+ <view class="collapse-content-num"><text>{{courseCount.courseWatchNum || 0}}</text>人</view>
<view class="collapse-content-title">完播人数</view>
- <view class="collapse-content-num"><text>{{courseCount.completeCount || 0}}</text>人
+ <view class="collapse-content-num"><text>{{courseCount.courseCompleteNum || 0}}</text>人
<view class="collapse-content-title">完播率</view>
+ <view class="collapse-content-num"><text>{{courseCount.courseCompleteRate || 0}}</text>%</view>
+ <u-collapse-item name="questions" title="答题数据">
<u-collapse-item name="questions">
- <view slot="title" class="statistics-title">答题数据<view
- class="statistics-title-tip">2分钟自动更新</view></view>
+ <text slot="title" class="bold fs32">答题数据</text>
class="statistics-slot-title">{{collapseValue.includes('questions')?'收回':'展开'}}</view>
@@ -66,16 +72,16 @@
<view class="x-ac">
<view class="collapse-content-title">答题人数</view>
+ <view class="collapse-content-num"><text>{{courseCount.answerNum || 0}}</text>人</view>
<view class="collapse-content-title">正确人数</view>
- <view class="collapse-content-num"><text>{{quesCount.completeCount || 0}}</text>人
+ <view class="collapse-content-num"><text>{{courseCount.answerRightNum || 0}}</text>人
<view class="collapse-content-title">答题红包数</view>
- <view class="collapse-content-num"><text>{{redPacketCount.count || 0}}</text>个
+ <view class="collapse-content-num"><text>{{courseCount.redPacketNum || 0}}</text>个
@@ -84,22 +90,27 @@
<image src="@/static/images/redenvelope.png" mode="aspectFill"></image>
<text>答题红包金额</text>
+ <view class="collapse-content-num"><text>{{courseCount.redPacketAmount || '0.00'}}</text>元
+ <u-collapse-item name="funnelplot" title="转化漏斗图">
<u-collapse-item name="funnelplot">
- <view slot="title" class="statistics-title">转化漏斗图<view
class="statistics-slot-title">{{collapseValue.includes('funnelplot')?'收回':'展开'}}</view>
- <view style="height: 600rpx;">
+ <view style="height: 600rpx;" v-if="!ratelistState">
<funnelChart :getratelist="getrateimg"/>
@@ -107,10 +118,15 @@
<view v-if="current == 1">
<view class="participate-search">
<view class="x-bc">
- <u-search placeholder="会员ID、昵称、姓名、手机" v-model="keyword" :showAction="false"
- height="30px"></u-search>
- <u-button type="primary" class="refresh" color='#1677ff' size="small" :disabled="disabled"
- text="刷新" @click="refresh"></u-button>
+ <view class="flex-1">
+ <u-search placeholder="会员ID、昵称、姓名、手机" v-model="keyword" :showAction="false"
+ height="30px" @search="getkeyword"></u-search>
+ <u-button type="primary" class="refresh" color='#1677ff' size="small" :disabled="disabled"
+ text="刷新" @click="refresh"></u-button>
<u-tabs :list="list2" :current='currentType' :lineWidth="40" lineColor="#1677ff"
@@ -146,8 +162,8 @@
<view class="taglist">
- <view v-for="(tag,i) in item.tags ? item.tags.split(',') : []">
- <u-tag :text="tag" size="mini" color="#999" bgColor="#f5f5f5"
+ <view v-for="(e,i) in item.tags">
+ <u-tag :text="e.tag" size="mini" color="#999" bgColor="#f5f5f5"
borderColor="#f5f5f5"></u-tag>
@@ -155,9 +171,10 @@
<text class="label">观看次数</text><text
class="value-num">{{item.watchCount || 0}}</text>
<text class="label">完播次数</text><text
- class="value-num">{{item.watchComlpleteCount || 0}}</text>
+ class="value-num">{{item.finishCount || 0}}</text>
<text class="label">累计时长</text><text
- class="value-num">{{item.watchTime || '--'}}</text>
+ class="value-num"> {{$formatSeconds(item.watchTime,1)}}</text>
<view style="margin-top: 5px;">
<text class="label">红包领取状态</text>
@@ -168,12 +185,12 @@
<view style="margin-top: 5px;"><text class="label">观看时间</text><text
class="value-num">{{item.watchDate}}</text></view>
- <view class="list-item-footer x-f">
+ <!-- <view class="list-item-footer x-f">
<view class="list-item-footer-btn x-f" @click="openModel('name',item)">改姓名</view>
<view class="list-item-footer-btn x-f" @click="openModel('remark',item)">改备注</view>
<view class="list-item-footer-btn footer-tagbtn x-f" @click="openModel('tag',item)">改标签
</mescroll-body>
@@ -211,18 +228,15 @@
getCompanyUserAndUserCount,
+ getshopCoursenum,
getUserLogListByCourseId,
updateFsUser,
getcompanyTaglist,
changeLable,
changeUserName,
- getuserdetail,
- getcourseRate
+ getcourseRates
- import funnelChart from './components/chart.vue'
+ import funnelChart from '@/components/chart.vue'
funnelChart,
@@ -296,17 +310,19 @@
todayday: uni.$u.timeFormat(new Date(), 'yyyy-mm-dd'),
courseCount: {},
chooseUserId: '',
companytag:[],
selectidtag:[],
- getrateimg:[]
+ getrateimg: {},
+ ratelistState:false,
+ videoId:''
- this.info = option.info ? JSON.parse(option.info) : {}
+ this.info = option.info ? JSON.parse(option.info) : {},
+ this.videoId=this.info.videoId
+ console.log(this.info)
uni.setNavigationBarTitle({
title: '数据统计'
@@ -317,19 +333,29 @@
this.getCount()
+ getkeyword(value){
+ this.upCallback()
getrateList(){
- companyUserId: '',
- courseId:this.info.courseId,
- endTime:'',
- startTime:'',
- type:this.user.userType == '00' ? 0 : 1, // 0:经销商/1:群管
- userId:'',
+ videoId:this.info.courseId,
- getcourseRate(params).then(res=>{
+ getcourseRates(params).then(res=>{
this.getrateimg=res
@@ -401,11 +427,11 @@
+ data: this.info.courseName,
- title: '复制课程ID成功',
- icon: 'success'
+ title: '复制课程标题成功',
@@ -438,17 +464,16 @@
//联网加载数据
var that = this;
var data = {
- order: this.typeoptionOrder[this.searchTypeIndex],
- tagIds: [],
+ videoId: this.videoId,
type: this.list2[this.currentType].value, // 0:答题正确 1:未完播 2:已完播 3:未播放
pageNum: page.num,
- pageSize: page.size
+ pageSize: page.size,
uni.showLoading({
title: "加载中..."
- this.list2[this.currentType].name = this.list2[this.currentType].label
+ // this.list2[this.currentType].name = this.list2[this.currentType].label
getUserLogListByCourseId(data).then(res => {
@@ -460,7 +485,7 @@
that.dataList = that.dataList.concat(res.data.list);
- this.list2[this.currentType].name = this.list2[this.currentType].label + (res.data.total)
+ // this.list2[this.currentType].name = this.list2[this.currentType].label + (res.data.total)
that.mescroll.endBySize(res.data.list.length, res.data.total);
@@ -475,19 +500,14 @@
getCount() {
- endTime: this.todayday + ' 23:59:59',
- startTime: this.todayday + ' 00:00:00',
+ videoId: this.courseId,
+ // endTime: this.todayday + ' 23:59:59',
+ // startTime: this.todayday + ' 00:00:00',
this.getCourseCount(param)
getCourseCount(param) {
+ getshopCoursenum(param).then(res => {
@@ -498,30 +518,6 @@
openModel(type, item) {
this.chooseUserId = item.userId
if (type == 'name') {
@@ -609,7 +605,7 @@
top: 0;
left: 0;
- height: 210px;
+ height: 280px;
&-body {}
@@ -619,7 +615,7 @@
font-family: PingFang SC, PingFang SC;
font-weight: 400;
font-size: 14px;
+ color: #888;
.status {
position: absolute;
@@ -638,7 +634,7 @@
&-info {
padding: 12px;
- background-color: rgba(255, 255, 255, 0.88);
+ background-color: rgba(255, 255, 255, 0.8);
border-radius: 12px;
overflow: hidden;
@@ -672,7 +668,7 @@
.duration {
- padding-left: 14px;
+ // padding-left: 14px;
&::after {
content: "";
@@ -4,19 +4,24 @@
<view class="justify-start p30 bgcolf radius12">
<u-avatar :src='detailUser.avatar'></u-avatar>
<view class="ml16">
- <view class="bold fs28">{{detailUser.nickName?detailUser.nickName:detailUser.phone}}</view>
+ <view class="bold fs28">{{detailUser.nickname}}</view>
<view class="fs24 base-color-3">注册时间:{{detailUser.createTime}}</view>
- <view class="plr20 ptb32 justify-around">
+ <view class="plr20 ptb32 justify-around bgf">
<view v-for="(item,index) in typeOption" :key="item.value" class='fs24 base-color-3 ptb4 plr20 radius4'
- @click="tabActive(index)" :class="tabindex==index?'actsel':'notact'">{{item.label}}</view>
+ @click="tabActive(item)" :class="tabindex==index?'actsel':'notact'">{{item.label}}</view>
+ <view class="bgf pb40">
<u-collapse :border='false' :value='collapseValue' @change="changeCollapse">
- <!-- <u-collapse-item name="course">
- <text slot="title" >直播统计</text>
+ <u-collapse-item name="course" title="看课统计">
+ <text slot="title" class="bold">看课统计</text>
@@ -24,16 +29,21 @@
<view class="justify-between">
<view class="justify-between livebox">
<view class="base-color-3">观看次数</view>
- <view class="base-color fs24"><text class="fs32 bold">0</text>次</view>
+ <view class="base-color fs24"><text class="fs32 bold">{{answerlist.watchTimes}}</text>次</view>
<view class="livebox justify-between">
<view class="base-color-3">完播次数</view>
+ <view class="base-color fs24"><text class="fs32 bold">{{answerlist.completeWatchCount}}</text>次</view>
- <text slot="title">答题统计</text>
+ <u-collapse-item name="questions" title="答题统计">
+ <text slot="title" class="bold">答题统计</text>
@@ -42,19 +52,19 @@
<view class=" liveboxs">
<view class="base-color-3">答题次数</view>
<view class="base-color fs24">
- <text class="fs32 bold">{{answerlist.answerCount}}</text>次
+ <text class="fs32 bold">{{answerlist.answerTime}}</text>次
<view class="liveboxs ">
<view class="base-color-3">正确次数</view>
- <text class="fs32 bold">{{answerlist.rightCount}}</text>次
+ <text class="fs32 bold">{{answerlist.answerRightTime}}</text>次
<view class="base-color-3">答题红包数</view>
- <text class="fs32 bold">{{answerlist.redSize}}</text>次
+ <text class="fs32 bold">{{answerlist.answerRedPacketTime}}</text>次
@@ -65,15 +75,15 @@
<view class="base-color-3">答题红包金额</view>
<view class="base-color fs24"><text class="fs32 bold mr4">
- {{answerlist.totalAmount==0?'00.00':answerlist.totalAmount}}</text>元</view>
+ {{answerlist.answerRedPacketAmount==0?'00.00':answerlist.answerRedPacketAmount}}</text>元</view>
<view class="justify-center botfun">
<view class="justify-start align-center bottom-btns" style="border: 2rpx solid #ee0a25;"
- @click="disableUser" :class="this.detailUser.isBlack==0?'':'base-bg-red'">
- <u-icon name="close-circle" :color="this.detailUser.isBlack==0?'#ee0a25':'#fff'" size="22" ></u-icon>
- <view class=" ml12" :class="this.detailUser.isBlack==0?'base-color-red':'colorf'">{{answerText}}</view>
+ @click="disableUser" :class="this.detailUser.status==1?'bgf':'base-bg-red'">
+ <u-icon name="close-circle" :color="this.detailUser.status==1?'#ee0a25':'#fff'" size="22" ></u-icon>
+ <view class=" ml12" :class="this.detailUser.status==1?'base-color-red':'colorf'">{{answerText}}</view>
<!-- <view class="justify-start align-center bottom-btns" style="border: 2rpx solid #1677ff;">
<u-icon name="pushpin" color="#1677ff" size="22"></u-icon>
@@ -116,69 +126,45 @@
collapseValue: ['course', 'questions', 'redenvelope'],
detailUser: [],
answerlist:[],
answerText:'禁用',
- userId:[]
+ userId:[],
+ id:'',
+ dateTag:''
- this.detailUser = uni.getStorageSync('detailUser')
- console.log(this.detailUser)
this.getAnswerlists()
+ this.detailUser =uni.getStorageSync('detailUser')
+ if(this.detailUser.status==0){
+ this.answerText='取消禁用'
+ this.id=option.id
- tabActive(index) {
- console.log(index)
- this.tabindex = index
- if(index==0){
- this.startTime=''
- this.endTime=''
- this.getAnswerlists()
- }else if(index==1){
- this.startTime = this.todayday + ' 00:00:00'
- this.endTime = this.todayday + ' 23:59:59'
- }else if(index==2){
- this.startTime = uni.$u.timeFormat(yesterday, 'yyyy-mm-dd') + ' 00:00:00'
- this.endTime = uni.$u.timeFormat(yesterday, 'yyyy-mm-dd') + ' 23:59:59'
- }else if(index==3){
- yesterday.setDate(yesterday.getDate() - 2);
- yesterday.setDate(yesterday.getDate() - 6);
+ tabActive(item) {
+ this.tabindex = item.value
+ this.dateTag=item.label
+ console.log(item.label)
+ this.getAnswerlists()
changeCollapse(e) {
this.collapseValue = e.filter(item => item.status == 'open').map(it => it.name)
getAnswerlists() {
- courseId: this.tabindex,
- startTime: this.startTime,
- endTime: this.endTime,
- userId: this.detailUser.userId
+ dateTag:this.dateTag,
+ userId: this.id
getanswerlist(params).then(res => {
this.answerlist=res.data
+ console.log(this.answerlist)
@@ -188,13 +174,13 @@
disableUser(){
- if(this.detailUser.isBlack==0){
+ if(this.detailUser.status==1){
this.addblack()
- this.detailUser.isBlack=1
+ this.detailUser.status=0
this.answerText='已禁用'
this.deleteblack()
- this.detailUser.isBlack=0
+ this.detailUser.status==1
this.answerText='禁用'
@@ -202,12 +188,9 @@
//添加到黑名单
this.userId[0]=this.detailUser.userId
- id:'',
- userId: this.userId
+ array: this.userId
- Addblacklist(params).then(res=>{
+ Addblacklist(this.userId).then(res=>{
@@ -215,8 +198,9 @@
title: '用户成功被禁用'
- uni.navigateTo({
- url:'/pages/courseManage/index'
+ console.log(1232)
+ data:1
},500)
@@ -229,18 +213,16 @@
deleteblack(){
//移除黑名单
- const params={
- userId:this.detailUser.userId
- removebalcklist(params).then(res=>{
+ this.userId[0]=this.detailUser.userId
+ removebalcklist(this.userId).then(res=>{
if(res.code){
title: '用户成功取消禁用'
+ uni.switchTab({
+ url:'/pages/customer/index'
@@ -256,9 +238,9 @@
+ // page {
.topBgline {
background: linear-gradient(to right, rgba(225, 238, 255, 1), rgba(223, 224, 254, 1));
- <!-- 必须保证父组件高度是确认的 -->
- <view class="dropd_own_list column">
-<style lang="scss">
- .dropd_own_list {
@@ -1,1420 +0,0 @@
- <view class="container column">
- <view class="headbox">
- <view style="padding: 10px 10px 0 10px;" class="mb20">
- <u-subsection class="subsection" :list="list" :current="current" bgColor="#e7f1fe" activeColor="#1677ff"
- :fontSize="15" :bold="false" @change="sectionChange"></u-subsection>
- <view style="margin-top: 10px;" v-if="current==0">
- <u-search placeholder="会员ID、昵称、姓名、手机" v-model="keyword" :showAction="false" height="30px"
- @search='searchKeyword'></u-search>
- <view class="x-bc" v-if="current==0">
- <u-tabs :list="list2" :current='currentType' :lineWidth="40" lineColor="#1677ff"
- :activeStyle="activeStyle" :inactiveStyle="inactiveStyle" @click="clickTypeTab"></u-tabs>
- <!-- <view class="participate-order x-f">
- <image src="@/static/images/order_icon2.png" mode="aspectFill"
- v-if="searchTypeIndex == 0 || searchTypeIndex == 2"></image>
- <image src="@/static/images/order_icon.png" mode="aspectFill" v-else></image>
- <picker @change="bindPickerChange" :value="searchTypeIndex" :range="typeArray">
- {{typeoption[searchTypeIndex]}}
- </picker>
- <view class="tagbox x-bc" v-if="current==0">
- <view class="tagbox-left x-f">
- <!-- <view class="x-f" @click="openPop('search')">{{array[queryParam.typeIndex].name}}<u-icon name="arrow-down-fill" color="#2979ff" size="11" style="margin: 0 3px;"></u-icon></view> -->
- <view class="tagbox-list x-f">
- <view class="tagbox-item x-f" v-for="(item,index) in showCompanytag" :key='item.tagId'
- :class="item.checked?'checked-bg':''">
- {{item.tag}}
- <view class="tagbox-right x-f" @click="openPop('tag')">筛选<u-icon name="arrow-down" color="#1677ff"
- size="12"></u-icon></view>
- <view v-if="current==0">
- <dropdownPanel :filterData='filterData' @onClick="getactNav" :itemname='itemname' @onChange="onChange"
- @confirm="confirm" @reset="reset" :ispopshow='ispopshow'>
- <view v-if="filterData[searchbarNav].type == 'registerTime'">
- <view class="boxnav x-bc ">
- <view class="boxnav-item" style="width: 25%;"
- v-for="(item,index) in filterData[searchbarNav].option" :key="index">
- <view class="boxnav-item-info one-t"
- :class="registerTimeIndex == index ? 'boxnav-active':''"
- @click="handleParamItem('registerTime',index)">{{item.label}}</view>
- <view class="boxnav-item x-ac" style="width: 100%;" v-show="registerTimeIndex == 4">
- <view class="calendar-day x-c" @click="$refs.calendar.open()">
- <u-icon name="calendar" color="#999"
- size="20"></u-icon>{{queryParam.startTime || '选择日期'}}
- size="20"></u-icon>{{queryParam.endTime || '选择日期'}}
- <view v-if="filterData[searchbarNav].type == 'watchStatus'">
- <view class="boxnav x-bc">
- <view class="boxnav-item" v-for="(item,index) in filterData[searchbarNav].option"
- :class="watchStatusIndex == index ? 'boxnav-active':''"
- @click="handleParamItem('watchStatus',index)">{{item.label}}</view>
- <view v-if="filterData[searchbarNav].type == 'nowatchStatus'">
- :class="nowatchStatusIndex == index ? 'boxnav-active':''"
- @click="handleParamItem('nowatchStatus',index)">{{item.label}}</view>
- <uni-calendar ref="calendar" :clear-date="true" :date="date" :insert="false" :lunar="false"
- :startDate="$u.timeFormat(new Date().getTime() - (3600 * 24 * 365 * 1000), 'yyyy-mm-dd')" :range='true'
- @confirm="confirmCalendar" :endDate="$u.timeFormat(new Date().getTime(), 'yyyy-mm-dd')" />
- <!-- 搜索选择弹窗/标签筛选 -->
- <u-popup :show="showPop" :round="12" @close="closePop" class="model" :zIndex="10076" style="flex: 0;">
- <view class="popbox">
- <view class="popbox-head">
- <u-icon class="close-circle" name="close-circle" color="#ccc" size="24" @click="closePop"></u-icon>
- {{popTitle}}
- <view class="popbox-body">
- <view class="radiobox" v-show="popTitle == '搜索选择'">
- <label class="radiobox-item x-bc mbline" v-for="(item, index) in array" :key="item.value"
- @click="bindTypeChange(index)">
- <view>{{item.name}}</view>
- <radio :value="item.value" :checked="index === typeIndex" style="transform:scale(0.75)" />
- </label>
- <!-- <view class="tagbox-item x-f tag-active" @click="chooseTag">未打标签</view> -->
- <view class="mlr10 " v-for="(item,index) in companytag" :key='item.tagId'>
- <u-tag :text="item.tag" :plain="!item.checked" :name="index"
- @click="chooseTag(index)"></u-tag>
- <view class="popbox-footer x-bc">
- <button class="popbox-footer-btn" @click="resetPop" v-show="popTitle == '标签筛选'">重置</button>
- <button class="popbox-footer-btn" @click="closePop" v-show="popTitle == '搜索选择'">取消</button>
- <button class="popbox-footer-btn con-btn" @click="confirmPop">确定</button>
- <view class="userbox column hb hidden">
- <!-- <mescroll-body bottom="0" ref="mescrollRef" @init="mescrollInit" :down="downOption" :up="upOption" @down="downCallback" @up="upCallback"> -->
- <view class="userlist column hb hidden">
- <!-- <dropDownList /> -->
- <vipUserItem :viplist='userList' :isShowSelectAll="isShowSelectAll" @changeItem="changeItem"
- @getuserId='singleChange' @getlableId='singleChangeLable' @change='changesinglevip'
- @pullDownRefresh="current==0?getfsuserListdata('refresh'):getbalckList('refresh')"
- @reachBottom="current==0?getfsuserListdata('more'):getbalckList('more')"
- @changePageOptions="e=>pageOptions=e" :pageOptions="pageOptions" :status="status"
- @changeStatus="e=>status=e" />
- <u-empty mode="list" icon="http://cdn.uviewui.com/uview/empty/car.png" v-if="userList.length==0">
- </u-empty>
- <view class="justify-between base-bg-f foot-select" v-if="isShowSelectAll">
- <view class="align-center justify-between" v-if="isShowSelectAll">
- <u-checkbox-group @change="selectAll">
- <u-checkbox :checked="isSelectAll" shape="circle" activeColor="#FF6C47" :name="true"
- label="全选" labelColor="#333" /><text class="fs24 base-color-9 ml12">已选 {{selectedCount}}
- 个</text>
- <view class="justify-center ">
- <button class="base-bg-red radius100 colorf h62 fs28 lh62 mlr10"
- @click="changeProhibit">禁用</button>
- <button class="base-bg-blue radius100 colorf h62 fs28 lh62"
- @click="showTagSelect=!showTagSelect">改标签</button>
- <button class="base-bg-f radius100 base-color-red h62 ml10 fs28 lh60"
- style="border: #ef4c50 solid 2rpx;" v-if="user.userType==0"
- @click="changevipuser">更换归属</button>
- <!-- </mescroll-body> -->
- <!-- <u-picker :show="showTagSelect" :columns="companytag" keyName="tag" @cancel='showTagSelect=false'
- @confirm='singleChangeLable' ></u-picker> -->
- <u-popup :show="showTagSelect" @close='closetagselect' :closeOnClickOverlay='true'
- mode="bottom" style="z-index: 99999;">
- <view class=" w100 bgf">
- <view class="plr28 ptb16 justify-between" style="flex-direction: row-reverse">
- <u-icon class="" name="close-circle" color="#ccc" size="24" @click="closetagselect"></u-icon>
- <view class="justify-start p32">
- <view class="mlr10 " v-for="(item,index) in changetag" :key='item.tagId'>
- <u-tag :text="item.tag" :plain="!item.checked" :name="index" @click="choosechangeTag"></u-tag>
- <view class="justify-between p32">
- <view class="changetagbtn base-bg-f8" @click="showTagSelect=!showTagSelect">取消</view>
- <view class="changetagbtn colorf base-bg-blue" @click="suretagchangeAll">确定</view>
- <image class="invite-member" src="@/static/images/invite-member-icon.png" mode="aspectFill" @click="vipInvite"
- v-if='!isShowSelectAll && user.userType==1'>
- <!-- 邀请弹窗 -->
- <u-popup :show="invitePop" :round="12" @close="invitePop = false" :zIndex="10074" style="flex: 0;">
- <u-icon class="close-circle" name="close-circle" color="#ccc" size="24"
- @click="invitePop = false"></u-icon>
- 分享方式
- <view class="choosetitle x-bc">
- <view>选择标签</view>
- <view v-if="sharetaglist" style="color:#1677ff"
- @click="addtag(0)">{{zhanshitag}}</view>
- <view class="x-f" style="color:#1677ff;"v-else
- @click="addtag(0)">
- <u-icon name="plus" color="#1677ff" size="14"
- style="margin-right: 5px;"></u-icon>添加标签
- <view class="invitetip">选择标签,当会员注册成功后,即可自动打标签</view>
- <!-- <view class="tagbox-list x-f" style="margin-top: 10px;margin-left: 0px;">
- <view class="tagbox-item x-f" @click="chooseTag">未打标签</view>
- <view class="tagbox-item x-f tag-active">未打标签</view>
- <view class="x-bc" style="margin-top: 30px;">
- <view class="sharePop-item y-f " @click="shareimg" style="text-align: center;">
- <image src="@/static/images/card_icon.png" mode="aspectFill"
- style="width: 80rpx; height: 80rpx;margin-top: 20rpx;"></image>
- <view style="font-weight: bold;margin-bottom: 4px;">生成卡片</view>
- <view style="font-size: 12px;color: #888;">指导分享轻松转发</view>
- <view class="sharePop-item y-f " @click="buildimg" style="text-align: center;">
- <image src="@/static/images/poster_icon.png" mode="aspectFill"></image>
- <view style="font-weight: bold;margin-bottom: 4px;">生成海报</view>
- <view style="font-size: 12px;color: #888;">保存海报美观宣传</view>
- <view class="sharePop-item y-f " @click="copyLink" style="text-align: center;">
- <image src="@/static/images/link_icon.png" mode="aspectFill"></image>
- <view style="font-weight: bold;margin-bottom: 4px;">复制链接</view>
- <view style="font-size: 12px;color: #888; " >生成链接一键复制</view>
- <!-- 设置链接有效时长弹窗 -->
- <u-modal :show="setTimeShow" content='content' class="model" @confirm="confirmTime">
- <view class="setTimebox">
- <view class="timetip">不传默认以系统参数为准</view>
- <view class="x-f">
- <text style="margin-right: 20px;">链接有效时长(分钟)</text>
- <u-input fontSize="14px" placeholder="链接有效时长" border="none" v-model="time" maxlength="5"></u-input>
- <!-- 长按保存海报 -->
- <u-popup :show="setImg" @close="closeimg" :round="12">
- <view class="w100 h500">
- <view class="column justify-center align-center" @click="downimg">
- <image src='@/static/image/downicon.png' class="w80 h80"></image>
- <view class="mt10">长按图片保存</view>
- <!-- 卡片分享引导 -->
- <u-overlay :show="showzhidao" @click="showzhidao = false" style="z-index: 9999;">
- <view class="point-box">
- <view class="imgshe" >
- <image src='@/static/image/point.png' class="w300 h300"></image>
- <view class="column colorf fs32 xu-box fs40
- align-center justify-center">
- <view class="justify-center">点击右上角
- <image src="../../../static/image/wxmore.png"
- class="w50 h50 mlr10"></image>
- <view class="mt20">选择 “转发给朋友”</view>
- <view style="color: #cbcbcb;" class="fs28 mt40">点击任意位置关闭弹窗</view>
- </u-overlay>
- <!-- 更改归属 -->
- <u-picker :show="showcol" :columns="columns" @cancel='showcol=!showcol' @confirm='receiveA'
- keyName="nickName"></u-picker>
- getfsuserList,
- Addblacklist,
- changeLable,
- getBlackvipNumber,
- getBlackvipList,
- getvipNum,
- getgroupList,
- becomeVipuser,
- becomeVipuserImg,
- getSDK
- } from "@/api/courseManage.js";
- import vipUserItem from "../components/vipUserItem.vue"
- import dropDownList from "./dropDownList.vue"
- data
- } from "../../../uni_modules/uview-ui/libs/mixin/mixin";
- import html2canvas from 'html2canvas'
- import wx from 'weixin-js-sdk'
- vipUserItem,
- dropdownPanel,
- dropDownList
- showcol: false,
- setImg:false,
- columns: [],
- showTagSelect: false,
- list: [{
- name: '会员(0)',
- name: '小黑屋(0)'
- userList: [],
- current: 0,
- companytag: [],
- showCompanytag: [],
- selectedList: [], //已经选中标签列表
- list2: [{
- name: '全部',
- name: '今日新增',
- name: '今日完播'
- name: '未看过课'
- currentType: 0,
- activeStyle: {
- color: '#1677ff',
- fontSize: '14px',
- fontWeight: 'bold'
- inactiveStyle: {
- fontSize: '14px'
- searchTypeIndex: 0,
- typeArray: ['连续缺课天数多到少', '连续缺课天数少到多', '按注册时间晚到早', '会员姓名0-9-A-Z'],
- typeoption: ['连续缺课', '连续缺课', '注册时间', '会员姓名'],
- array: [{
- value: '0',
- name: '关联搜索',
- value: '1',
- name: '精准搜索'
- typeIndex: 0,
- popTitle: '搜索选择',
- showPop: false,
- filterData: [{
- name: '注册时间',
- value: 0,
- type: 'registerTime',
- option: [{
- label: '全部',
- label: '今天',
- label: '昨天',
- label: '近7天',
- }]
- name: '看课状态',
- value: 1,
- type: 'watchStatus',
- label: '未看过课',
- label: '正常看课',
- label: '停止看课',
- name: '批量',
- value: 3,
- type: 'piliang',
- special: true,
- stopPrevent: true
- searchbarNav: 0,
- registerTimeIndex: 0,
- watchStatusIndex: 0,
- date: '',
- endTime: ''
- use: true,
- auto: false
- onScroll: false,
- use: true, // 是否启用上拉加载; 默认true
- auto: true,
- pae: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始
- size: 10 // 每页数据的数量,默认10
- noMoreSize: 10, // 配置列表的总数量要大于等于5条才显示'-- END --'的提示
- textNoMore: "已经到底了",
- empty: {
- icon: 'https://cos.his.cdwjyyh.com/fs/20240423/cf4a86b913a04341bb44e34bb4d37aa2.png',
- tip: '暂无数据'
- invitePop: false,
- setTimeShow: false,
- time: "",
- idx: [],
- isShowSelectAll: false, //是否显示全选
- isSelectAll: false, //是否全选
- ispopshow: false,
- selectidAll: [],
- changetag: [],
- selectidtag: '',
- itemname: '',
- userid: '',
- groupid: [],
- pageOptions: {
- pageSize: 5,
- status: 'loadmore',
- sharetag:1,
- sharetaglist:[],
- codeLink: [],
- zhanshitag:'',
- copyLinks:'',
- showzhidao:false,
- title: '数据统计'
- // this.getjssdklist()
- onShow() {
- this.getfsuserListdata()
- this.getcompanyTag()
- this.getblacknum()
- selectedCount() {
- return this.userList.filter(item => item.checked).length;
- getjssdklist() {
- url: window.location.href
- getSDK(param).then(res => {
- wx.config({
- appId: res.data.appId, // 必填,公众号的唯一标识
- timestamp: res.data.timestamp, // 必填,生成签名的时间戳
- nonceStr: res.data.nonceStr, // 必填,生成签名的随机串
- signature: res.data.signature, // 必填,签名
- jsApiList: ["updateAppMessageShareData"] // 必填,需要使用的JS接口列表
- shareimg(){
- //分享好友
- let self = this
- wx.ready(function() { //需在用户可能点击分享按钮前就先调用
- wx.updateAppMessageShareData({
- title: self.user.userName+"邀请您成为会员", // 分享标题
- desc: self.user.deptName, // 分享描述
- link:self.copyLinks,
- imgUrl: self.codeLink.url ||self.imgs, // 分享图标
- success: function(res) {
- self.showzhidao=true
- self.setImg=false
- self.showShare=false
- // 设置成功
- title: '卡片已生成',
- duration: 1000
- fail: function(err) {
- console.log(err);
- title: '卡片生成失败,请重试',
- duration: 2000
- downimg(){
- closeimg(){
- this.setImg=false
- this.invitePop=false
- buildimg() {
- this.setImg=!this.setImg
- this.getshareimg()
- addtag(add){
- this.sharetag=add
- this.showTagSelect=!this.showTagSelect
- changevipuser() {
- this.showcol = !this.showcol
- this.getgrouplist()
- getgrouplist() {
- getgroupList().then(res => {
- this.columns = [res.data]
- // console.log(this.columns)
- changeall() {
- console.log(1)
- companyUserId: this.userid,
- changevipUser(param).then(res => {
- receiveA(e) {
- console.log(e)
- this.userid = e.value[0].userId
- if (this.isShowSelectAll == true) {
- this.groupid = this.selectidAll
- this.changeall()
- }, 200)
- this.isSelectAll = false
- getvipListnum() {
- queryValue: this.currentType,
- regiesterStartTime: this.startTime,
- regiesterEndTime: this.endTime,
- searchValue: this.keyword,
- watchCourseType: this.watchStatusIndex,
- tagIds: this.idx
- getvipNum(param).then(res => {
- this.list[0].name = "会员" + '(' + res.data + ')'
- getactNav(data) {
- if (data.value == 3) {
- this.itemname = data.name
- this.isShowSelectAll = !this.isShowSelectAll
- this.isShowSelectAll = false
- getblacknum() {
- //获取小黑屋数量
- getBlackvipNumber(params).then(res => {
- this.list[1].name = "小黑屋" + '(' + res.data + ')'
- getbalckList(type = "refresh") {
- //获取小黑屋用户列表
- getBlackvipList(params).then(res => {
- this.userList = res.data.list
- this.userList = [...this.userList, ...res.data.list]
- if (res.data.isLastPage) {
- this.status = 'nomore'
- this.status = 'loadmore'
- closetagselect() {
- this.showTagSelect = !this.showTagSelect
- suretagchangeAll() {
- if(this.sharetag==0){
- this.sharetaglist = this.changetag.filter(item => item.checked).map(v => v.tagId).join(',')
- this.zhanshitag = this.changetag.filter(item => item.checked).map(v => v.tag).join(',')
- console.log(this.sharetaglist)
- //多选改标签确认按钮
- if (this.selectidAll.length == 0) {
- title: '未选中用户'
- this.selectidtag = this.changetag.filter(item => item.checked).map(v => v.tagId).join(',')
- this.changeLabelmore()
- singleChangeLable(data) {
- this.selectidAll[0] = data
- changesinglevip(data) {
- this.groupid[0] = data
- changeLabelmore() {
- //改标签选择按钮
- creatTime: '',
- createBy: '',
- createTime: '',
- id: '',
- params: {},
- remark: '',
- searchValue: '',
- updateBy: '',
- tagIds: this.selectidtag,
- updateTime: '',
- userId: this.selectidAll
- changeLable(params).then(res => {
- const timer = setTimeout(function() {
- title: '标签更改成功'
- changeOwnership() {
- //更换归属(经销商功能)
- getcompanyTag() {
- getcompanyTaglist().then(res => {
- this.showCompanytag = res.data
- this.companytag = res.data.map(item => {
- ...item,
- checked: false,
- this.changetag = this.companytag
- getfsuserListdata(type = "refresh") {
- tagIds: this.idx,
- ...this.pageOptions
- getfsuserList(param).then(res => {
- let dataList = res.data.list.map(item => {
- this.userList = dataList
- this.userList = [...this.userList, ...dataList]
- this.list[0].name = "会员" + '(' + res.data.total + ')'
- // this.getvipListnum()
- onChange(index) {
- if (index == 2) return
- this.searchbarNav = index
- searchKeyword(value) {
- this.keyword = value
- singleChange(data) {
- this.changeProhibit()
- changeProhibit() {
- //批量禁用选择按钮
- Addblacklist(params).then(res => {
- // 创建一个在**秒后执行的定时器
- title: '禁用成功'
- // 全选
- selectAll() {
- // 先设置全选
- this.isSelectAll = !this.isSelectAll
- // 然后设置列表 checked没得this不会报错吗 这是返回新数组
- console.log(this.isSelectAll)
- this.userList = this.userList.map(item => {
- // 每一项的 checked为 全选的状态
- checked: this.isSelectAll
- this.selectidAll = this.userList.filter(item => item.checked).map(item => item.userId)
- // 单选 /反选
- changeItem(i) {
- let arr = {
- ...this.userList[i],
- checked: !this.userList[i].checked
- this.$set(this.userList, i, arr)
- this.isSelectAll = this.userList.every(item => item.checked)
- if (this.isSelectAll) {
- reset() {
- //重置时间选择等筛选
- const type = this.filterData[this.searchbarNav].type
- console.log(this.registerTimeIndex)
- if (type == 'registerTime') {
- this.registerTimeIndex = ''
- this.endTime = ''
- this.startTime = ''
- // console.log(this.getfsuserListdata())
- } else if (type == 'watchStatus') {
- this.watchStatusIndex = 0
- this.pageOptions.pageNum=1
- const value = this.registerTimeIndex
- if (value == 0) {
- } else if (value == 1) {
- } else if (value == 2) {
- } else if (value == 3) {
- // this.watchStatusIndex=value
- console.log(this.watchStatusIndex)
- handleParamItem(type, index) {
- this.registerTimeIndex = index
- this.watchStatusIndex = index
- this.ispopshow = false
- sectionChange(index) {
- this.current = index;
- if (index == 0) {
- this.getbalckList()
- clickTypeTab(e) {
- this.currentType = e.index
- bindPickerChange(e) {
- console.log('picker发送选择改变,携带值为', e.detail.value)
- this.searchTypeIndex = e.detail.value
- openPop(type) {
- this.popTitle = type == 'search' ? '搜索选择' : type == 'tag' ? '标签筛选' : ''
- this.typeIndex = this.queryParam.typeIndex
- this.showPop = true
- if (type == 'tag') {
- closePop() {
- this.showPop = false
- resetPop(i) {
- this.idx = []
- this.companytag.forEach(tag => {
- tag.checked = false; // 将所有标签的show属性重置为true
- this.$nextTick(()=>{
- // this.startTime = e[0]
- // this.endTime = e[e.length-1]
- this.queryParam.startTime = e.range.after
- this.queryParam.endTime = e.range.before
- this.endTime = e.range.before + ' 23:59:59'
- this.startTime = e.range.after + ' 00:00:00'
- // this.getCount()
- bindTypeChange(i) {
- this.typeIndex = i
- confirmPop() {
- this.queryParam.typeIndex = this.typeIndex
- this.showCompanytag = this.companytag.filter(item => item.checked)
- this.idx = this.showCompanytag.map(v => v.tagId)
- //filtter(过滤) 筛选所有checked==true的 然后map返回每一项的id
- if (this.idx.length == 0) {
- this.showCompanytag = this.companytag
- this.getfsuserListdata("refresh")
- chooseTag(i) {
- this.companytag[i].checked = !this.companytag[i].checked
- choosechangeTag(i) {
- this.changetag[i].checked = !this.changetag[i].checked
- vipInvite() {
- this.invitePop = true
- this.sharetaglist=null
- this.getlink('preload')
- this.getjssdklist()
- copyLink() {
- this.setTimeShow = true
- confirmTime() {
- this.setTimeShow = false
- this.showShare = false
- this.getshareLink()
- getshareimg(){
- //生成海报
- title: '正在生成中...'
- code:'',
- companyUserId:this.user.userId
- becomeVipuserImg(param).then(res=>{
- this.codeLink=res.data
- this.getlink()
- getlink(type){
- //生成链接
- companyUserId:this.user.userId,
- tagids:this.sharetaglist,
- limitTime:this.time
- becomeVipuser(param).then(res=>{
- this.copyLinks=res.data
- if (this.copyLinks.startsWith('http://')) {
- this.copyLinks = this.copyLinks.replace('http://', 'https://');
- console.log('28835',this.copyLinks)
- console.log(this.copyLinks,'235')
- getshareLink(){
- console.log(this.copyLinks)
- setTimeout(()=>{
- uni.setClipboardData({
- data: String(this.copyLinks),
- success: () => {
- title: '复制成功',
- },200)
- },100)
- mescrollInit(mescroll) {
- this.mescroll = mescroll;
- /*下拉刷新的回调 */
- downCallback(mescroll) {
- mescroll.resetUpScroll()
- upCallback(page) {
- //联网加载数据
- var that = this;
- var data = {
- pageNum: page.num,
- };
- .imgshe{
- display: flex;
- flex-direction: row-reverse
- .point-box{
- .xu-box{
- border: #f5f5f5 4rpx dashed;
- padding: 20rpx 20rpx;
- z-index: 9999;
- #codeurl {
- .checked-bg {
- border: 1px solid #1677ff !important;
- color: #1677ff !important;
- background-color: #e7f1fe !important;
- .changetagbtn {
- width: 45%;
- height: 80rpx;
- border-radius: 50rpx;
- line-height: 80rpx;
- ::v-deep {
- .foot-select {
- z-index: 10000 !important;
- bottom: 0;
- margin-left: -24rpx !important;
- .model .u-fade-enter-active {
- z-index: 10075 !important;
- .uni-calendar__mask {
- z-index: 11000 !important;
- .uni-calendar__content {
- z-index: 12000 !important;
- overflow: hidden;
- .boxnav {
- flex-wrap: wrap;
- padding: 0 0 0 10px;
- &-item-info {
- border: 1px solid #f5f5f5;
- color: #222;
- border-radius: 3px;
- padding: 5px;
- margin: 0 10px 10px 0;
- min-height: 30px;
- .setTimebox {
- width: fit-content;
- height: fit-content;
- .timetip {
- color: #2979ff;
- margin-bottom: 5px;
- .popbox {
- border-radius: 12px;
- color: #333;
- &-head {
- .close-circle {
- right: 10px;
- &-body {
- padding: 10px 10px;
- .radiobox {
- padding: 10px 0;
- border-bottom: 1px solid #f5f5f5;
- &:last-child {
- border-bottom: none;
- &-footer {
- padding: 15px 0;
- &-footer-btn {
- height: 44px;
- line-height: 44px;
- margin: 0 10px;
- border: none;
- .con-btn {
- color: #fff;
- .choosetitle {
- .invitetip {
- margin-top: 10px;
- background-color: #ebf5fb;
- padding: 5px 10px;
- .sharePop-item {
- padding: 0 10px;
- display: inline-flex !important;
- height: 48px;
- width: 48px;
- .headbox {
- .subsection {
- height: 45px;
- padding: 4px;
- .participate-order {
- width: 15px;
- .tag-active {
- background-color: #ffeceb !important;
- color: #f93e3e !important;
- border: 1px solid #f93e3e !important;
- .tagbox {
- &-list {
- margin: 0 0 -6px 6px;
- height: 26px;
- padding: 0 8px;
- margin: 0 6px 6px 0;
- .invite-member {
- height: 55px;
- width: 50px;
- bottom: 80px;
- cursor: pointer;
- .userlist {
- padding: 24rpx;
@@ -0,0 +1,142 @@
+ <view class="column" style="height: 100%;position: relative;">
+ <view class="top-content ">
+ <view class="status_bar" :style="{height: statusBarHeight+'px'}"></view>
+ <!-- 这里是状态栏 -->
+ <view class="top-title">企业理念</view>
+ <view :style="{marginTop: `calc(${statusBarHeight}px + 88rpx)`}">
+ <view class="imgbox">
+ <image :src="enterpriseimg[0]" mode="widthFix"></image>
+ <view class="myVideobox">
+ <video id="myVideo" :src='enterpriseurl'
+ show-mute-btn='true' @fullscreenchange='changvideo'
+ vslide-gesture-in-fullscreen='true' :muted='muted' loop='true'
+ @error="videoErrorCallback" enable-danmu controls autoplay="true"
+ class="videotop"></video>
+ <!-- <video class="myVideo" id="myVideo" :src="enterpriseurl"
+ @error="videoErrorCallback" controls></video> -->
+ <view class="imgbox column">
+ <image :src="enterpriseimg[1]" mode="widthFix"></image>
+ <image :src="enterpriseimg[2]" mode="widthFix"></image>
+ <image :src="enterpriseimg[3]" mode="widthFix"></image>
+ <tabbar :actindex="0"></tabbar>
+ // import{getenterprise} from '@/api/index.js'
+ import tabbar from '@/components/tabbar/tabbar.vue'
+ tabbar
+ statusBarHeight: uni.getSystemInfoSync().statusBarHeight,
+ enterpriseurl:'https://hylj-1323137866.cos.ap-chongqing.myqcloud.com/userVideo/2025328/1743138661878.mp4',
+ enterpriseimg:[
+ 'https://cos.his.cdwjyyh.com/fs/20250328/35a52839074940cb9ba7c1208140e3c7.png',
+ 'https://cos.his.cdwjyyh.com/fs/20250328/39f2e5fc37da4240850313e69caa120c.png',
+ 'https://cos.his.cdwjyyh.com/fs/20250328/628f59a6f3864541a0599886fae8e54e.png',
+ 'https://cos.his.cdwjyyh.com/fs/20250328/f13448a48d3c491ab40b44e749983fed.png'
+ muted:true,
+ //发送给朋友
+ onShareAppMessage(res) {
+ title: "御君方互联网医院",
+ path: '/pages/index/index',
+ imageUrl: 'https://hos-1309931967.cos.ap-chongqing.myqcloud.com/fs/20230106/6b459adfb1004c1a96219bcdf07e337c.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+ //分享到朋友圈
+ onShareTimeline(res) {
+ const imgs = []
+ // this.enterpriseimg= imgs.split(',')
+ // this.enterpriseurl='https://beiliyo-2025.obs.cn-north-4.myhuaweicloud.com/fs/20250115/1736925706514.mp4'
+ // this.getenterprise()
+ changvideo(e){
+ if(e.target.fullScreen==true){
+ this.muted=false
+ this.muted=true
+ e.target.fullScreen
+ getenterprise(){
+ getenterprise().then(res=>{
+ this.enterpriseurl=res.data.videoUrl
+ this.enterpriseimg=res.data.images
+ const url=this.enterpriseimg.split(',')
+ this.enterpriseimg=url
+ uni.setStorageSync('enterpriseurl',this.enterpriseurl)
+ videoErrorCallback: function(e) {
+ // navToTest() {
+ // const course = {"companyId":100,"companyUserId":6806,"corpId":"ww5a88c4f879f204c5","courseId":63,"link":"1899022782092541952","linkType":3,"qwExternalId":9914983,"qwUserId":"18931","videoId":409}
+ // uni.navigateTo({
+ // url: '/pages_course/video?course='+JSON.stringify(course)
+.top-content {
+ z-index: 10;
+ background-color: #FFFFFF;
+ .top-title {
+ height: 88rpx;
+ line-height: 88rpx;
+ font-size: 42rpx;
+ font-family: Source Han Sans CN;
+ padding-left: 41rpx;
+.imgbox{
+ display: block;
+.videotop{
+ width: calc(100% - 60rpx);
+ height: 421rpx;
+ bottom: 30rpx;
+ transform: translateX(-50%);
@@ -1,22 +1,760 @@
+<!-- 数据组件页面 -->
+ <view class="column flex-1 hb">
+ <view class="topdata">
+ <view class="h110"></view>
+ <view class="topdata-box" @click="operation">
+ <view>数据汇总</view>
+ <view class="justify-between center">
+ <text class="fs24 " style="color: #666;">查看详细数据</text>
+ <u-icon name="arrow-right-double" color="#666666" size="14"></u-icon>
+ <view class="x-bc">
+ <view class="topdata-item">
+ <view class="topdata-item-num"><text>{{companyUserUserCount}}</text>人</view>
+ <view>会员总数</view>
+ <view class="topdata-item-num"><text>{{companyUserCount}}</text>人</view>
+ <view>今日新增会员</view>
+ <u-collapse ref="pydameinvRef" :value="['show']" :border='false' @change='changelable'>
+ <u-collapse-item name="show" title="标签统计">
+ <u-collapse-item name="show">
+ <view slot="title">
+ <text class="bold fs32">标签统计</text>
+ <text class="fs24 base-color-9 ml12">左滑查看更多</text>
+ <text slot="value" class="statistics-slot-title">{{collapseLable?'展开':'收回'}}</text>
+ <view slot="right-icon">
+ <u-icon name="arrow-right" color="#1677ff" size="12"></u-icon>
+ <view class="fs24 mb12">左滑查看更多</view>
+ <view class=" mb20 morelable">
+ <view class="base-bg-f5 p20 radius20 boxlable mr40"
+ v-for="(item,index) in lablelistnum" :key="index"
+ style="display: inline-block;">
+ <view class="base-color-3 ">{{item.tagName}}</view>
+ <view class="base-color mt8">
+ <text class="fs40 bold">{{item.number}}</text>
+ 人
+ </u-collapse>
+ <view class="searchbox">
+ <view class="searchbox-bar x-ac">
+ <view :class="queryParam.type == index ? 'searchbox-item searchbox-active':'searchbox-item'"
+ v-for="(item,index) in typeOption" :key="index" @click="handleType(index)">{{item.label}}</view>
+ <view class="x-ac ss" v-show="queryParam.type == 3">
+ <view class="calendar-day x-c" @click="showCalendar = true"><u-icon name="calendar" color="#999"
+ size="20"></u-icon>{{startTime}}</view>
+ size="20"></u-icon>{{endTime}}</view>
+ <u-calendar :show="showCalendar" :mode="mode" @confirm="confirmCalendar" style="flex: 0; overflow: hidden;"
+ @close="closeCalendar"></u-calendar>
+ <view class="statistics pb120" :style="{height: contentH}">
+ <u-collapse :border='false' :value='collapseValue' @change="changeCollapse">
+ <text slot="title" class="statistics-title">课程统计</text>
+ <text slot="value"
+ class="statistics-slot-title">{{collapseValue.includes('course')?'收回':'展开'}}</text>
+ <view class="collapse-content x-ac">
+ <view class="collapse-content-item">
+ <view class="collapse-content-title">观看人数</view>
+ <view class="collapse-content-num"><text>{{courseCount.courseWatchNum || 0}}</text>人
+ <view style="color: #1677ff;" v-show="queryParam.type == 0">
+ 较昨天持平{{compare(courseCount.courseWatchNum,yesterdayVO.courseWatchNum)}}</view>
+ <view v-show="queryParam.type == 0">昨天{{yesterdayVO.courseWatchNum || 0}}</view>
+ <view class="collapse-content-title">完播人数</view>
+ 较昨天持平{{compare(courseCount.courseCompleteNum,yesterdayVO.courseCompleteNum)}}
+ <view v-show="queryParam.type == 0">昨天{{yesterdayVO.courseCompleteNum || 0}}
+ <view class="collapse-content-title">完播率</view>
+ <view class="collapse-content-num"><text>{{courseCount.courseCompleteRate || 0}}</text>%
+ 较昨天持平{{compare(courseCount.courseCompleteRate,yesterdayVO.courseCompleteRate)}}
+ <view v-show="queryParam.type == 0">昨天{{yesterdayVO.courseCompleteRate || 0}}</view>
+ <text slot="title" class="statistics-title">答题统计</text>
+ class="statistics-slot-title">{{collapseValue.includes('questions')?'收回':'展开'}}</text>
+ <view class="collapse-content-title">答题人数</view>
+ <view class="collapse-content-num"><text>{{courseCount.answerNum || 0}}</text>人
+ 较昨天持平{{compare(courseCount.answerNum,yesterdayVO.answerNum)}}</view>
+ <view v-show="queryParam.type == 0">昨天{{yesterdayVO.answerNum || 0}}</view>
+ <view class="collapse-content-title">正确人数</view>
+ 较昨天持平{{compare(courseCount.answerRightNum,yesterdayVO.answerRightNum)}}</view>
+ <view v-show="queryParam.type == 0">昨天{{yesterdayVO.answerRightNum || 0}}</view>
+ <view class="collapse-content-title">正确率</view>
+ <view class="collapse-content-num">
+ <text>{{courseCount.answerRightRate || 0}}</text>%
+ 较昨天持平{{compare(courseCount.answerRightRate,yesterdayVO.answerRightRate)}}</view>
+ <view v-show="queryParam.type == 0">昨天{{yesterdayVO.answerRightRate || 0}}</view>
+ <u-collapse-item name="redenvelope" title="红包统计">
+ <text slot="title" class="statistics-title">红包统计</text>
+ class="statistics-slot-title">{{collapseValue.includes('redenvelope')?'收回':'展开'}}</text>
+ <view class="collapse-content-title">答题红包数</view>
+ <text>{{courseCount.redPacketNum || 0}}</text>个
+ 较昨天持平{{compare(courseCount.redPacketNum,yesterdayVO.redPacketNum)}}
+ <view v-show="queryParam.type == 0">昨天{{yesterdayVO.redPacketNum || 0}}
+ <view class="collapse-content-title">答题红包金额</view>
+ <text>{{courseCount.redPacketAmount || '0.00'}}</text>元
+ 较昨天持平{{compare(courseCount.redPacketAmount,yesterdayVO.redPacketAmount,1)}}
+ <view v-show="queryParam.type == 0">
+ 昨天{{yesterdayVO.redPacketAmount || '0.00'}}
+ <!-- <view class="collapse-content x-ac" style="padding: 8px 0;">
+ <view class="collapse-content-title">新会员奖励数</view>
+ <view class="collapse-content-num"><text>{{redPacketCount.newCount || 0}}</text>个</view>
+ 较昨天持平{{compare(redPacketCount.newCount,redPacketCount.yesterdayNewCount)}}</view>
+ <view v-show="queryParam.type == 0">昨天{{redPacketCount.yesterdayNewCount || 0}}</view>
+ <view class="collapse-content-title">新会员奖励金额</view>
+ <text>{{redPacketCount.totalAmount || '0.00'}}</text>元
+ 较昨天持平{{compare(redPacketCount.totalAmount,redPacketCount.yesterdayTotalAmount,1)}}
+ <view v-show="queryParam.type == 0">昨天{{redPacketCount.yesterdayTotalAmount || '0.00'}}
+ <text slot="title" class="statistics-title">转化漏斗图</text>
+ class="statistics-slot-title">{{collapseValue.includes('funnel')?'收回':'展开'}}</text>
+ <funnelChart :getratelist="getrateimg" />
+ <text slot="title" class="statistics-title">排行榜</text>
+ class="statistics-slot-title">{{collapseValue.includes('rank')?'收回':'展开'}}</text>
+ <view class="mt40">
+ <view class="base-color-3 bold fs32">群管排行榜</view>
+ <view class="justify-start" @click="ordergroup(1)"
+ v-if="orderGroup=='asc'">
+ <u-icon name="list-dot" size="20"></u-icon>
+ <view>按正序(前20名)</view>
+ <view class="justify-start" @click="ordergroup(0)" v-else>
+ <view>按倒序(后20名)</view>
+ <view class="centerV">
+ <u-tabs :list="list1" @click="clickTab" lineColor='#1773ff'
+ lineWidth='40' activeStyle="font-weight:bold"></u-tabs>
+ <view class="justify-start align-center mtb28"
+ v-for="(item,index) in rankListA" :key="index">
+ <u-avatar :src="item.avatar" size="40"></u-avatar>
+ <view class="flex-1 ml20">
+ <view class="justify-between mb16">
+ <view class="base-color-3 single-line-ellipsis">
+ {{item.userName}}
+ <view v-if="index==0">{{item.completeRate}}%</view>
+ <u-line-progress :percentage="item.completeRate"
+ activeColor='#1773ff' v-if="index==0" />
+ <u-line-progress :percentage="item.answerRightRate"
+ activeColor='#1773ff' v-else />
+ <view v-if="rankListA.length==0" class="center mtb32">暂无数据</view>
+ <view class="mt60 column flex-1">
+ <view class="base-color-3 bold fs32">课程排行榜</view>
+ <view class="justify-start" @click="ordergroupB(1)"
+ v-if="orderGroupB=='asc'">
+ <view class="justify-start" @click="ordergroupB(0)" v-else>
+ <u-tabs :list="list1" @click="clickTabB" lineColor='#1773ff'
+ <view class="justify-start align-center"
+ v-for="(item,index) in rankListB" :key="index">
+ {{item.videoName}}
+ <view v-if="rankListB.length==0" class="center mtb32">暂无数据</view>
+ import code from "@/uni_modules/uview-ui/libs/config/props/code"
+ getCompanyUserAndUserCount,
+ getCourseCount,
+ getcourseRate,
+ getGroupRanklist,
+ getCourseRanklist
+ funnelChart,
+ list1: [{
+ name: '按完播率',
+ name: '按正确率'
+ orderGroup: 'asc',
+ orderGroupB: 'asc',
+ showCalendar: false,
+ mode: 'range',
+ typeOption: [{
+ label: '今日',
+ value: 0
+ label: '昨日',
+ value: 1
+ label: '本月',
+ value: 2
+ label: '自定义',
+ value: 3
+ queryParam: {
+ type: 0
+ contentHs: 0,
+ collapseValue: ['course', 'questions', 'redenvelope', 'funnel', 'rank'],
+ startTime: '',
+ endTime: '',
+ companyUserCount: 0,
+ companyUserUserCount: 0,
+ courseCount: {
+ courseWatchNum: 0
+ collapseLable: false,
+ lablelistnum: [],
+ rankListA: [],
+ rankListB: [],
+ activeA: 0,
+ activeB: 0,
+ yesterdayVO: [],
+ ratelistState: false
+ compare() {
+ return (today, yesterday, type) => {
+ const num = Number(yesterday || 0) - Number(today || 0)
+ return type == 1 ? num.toFixed(2) : 0
+ // this.resetDate()
+ this.getUserCount()
+ this.getHeight()
+ operation() {
+ url: '/pages/courseManage/operation/index'
+ clickTab(item) {
+ this.activeA = item.index + 1
+ console.log(this.activeA)
+ clickTabB(item) {
+ this.activeB = item.index + 1
+ ordergroup(item) {
+ if (item == 0) {
+ this.orderGroup = 'asc'
+ this.orderGroup = 'desc'
+ ordergroupB(item) {
+ this.orderGroupB = 'asc'
+ this.orderGroupB = 'desc'
+ getrankCourse() {
+ //获取课程排行
+ this.startTime = this.todayday
+ this.endTime = this.todayday
+ endTime: this.endTime + ' 23:59:59',
+ startTime: this.startTime + ' 00:00:00',
+ order: this.orderGroupB,
+ type: this.activeB, // 1-按完播率,2-按正确率
+ getCourseRanklist(params).then(res => {
+ this.rankListB = res.data
+ getrankgroup() {
+ //获取群管排行
+ order: this.orderGroup,
+ type: this.activeA, // 1-按完播率,2-按正确率
+ getGroupRanklist(params).then(res => {
+ this.rankListA = res.data
+ getrateList() {
+ //获取漏斗图
+ this.resetDate()
+ getcourseRate(params).then(res => {
+ this.getrateimg = res
+ // console.log('漏斗',allZero)
+ changelable(e) {
+ if (e[0].status == 'open') {
+ this.collapseLable = false
+ this.collapseLable = true
+ getHeight() {
+ const query = uni.createSelectorQuery().in(this);
+ query
+ .select(".topdata")
+ .boundingClientRect((data) => {
+ this.contentH = `calc(${windowHeight}px - ${data.height}px - 0px)`
+ .exec()
+ resetDate() {
+ if (this.queryParam.type == 0) {
+ } else if (this.queryParam.type == 1) {
+ this.startTime = uni.$u.timeFormat(yesterday, 'yyyy-mm-dd')
+ this.endTime = uni.$u.timeFormat(yesterday, 'yyyy-mm-dd')
+ } else if (this.queryParam.type == 2) {
+ let today = new Date();
+ let lastDayOfMonth = new Date(today.getFullYear(), today.getMonth() + 1, 0);
+ this.startTime = uni.$u.timeFormat(this.todayday, 'yyyy-mm') + '-01'
+ this.endTime = uni.$u.timeFormat(lastDayOfMonth, 'yyyy-mm-dd')
+ } else if (this.queryParam.type == 3) {
+ this.getCount()
+ handleType(type) {
+ if (this.queryParam.type == type) {
+ this.queryParam.type = type
+ if (this.queryParam.type == 3) {
+ changeCollapse(e) {
+ this.collapseValue = e.filter(item => item.status == 'open').map(it => it.name)
+ closeCalendar() {
+ this.showCalendar = false
+ confirmCalendar(e) {
+ this.startTime = e[0]
+ this.endTime = e[e.length - 1]
+ getUserCount() {
+ getCompanyUserAndUserCount().then(res => {
+ this.companyUserCount = res.data.todayNewUser || 0
+ this.companyUserUserCount = res.data.userTotal || 0
+ this.lablelistnum = res.data.tagList
+ this.$refs.pydameinvRef.init()
+ getCount() {
+ this.getCourseCount(param)
+ getCourseCount(param) {
+ getCourseCount(param).then(res => {
+ this.courseCount = res.data
+ this.yesterdayVO = res.data.yesterdayVO
+ .boxlable {
+ width: 47%;
+ .morelable {
+ overflow-x: auto;
+ /* 添加横向滚动条 */
+ white-space: nowrap;
+ .calendar-day {
+ font-size: 12px;
+ color: #999;
+ margin: 10px 10px 0 10px;
+ background-color: #f5f5f5;
+ border-radius: 4px;
+ .topdata {
+ padding-top: 25px;
+ background: linear-gradient(to right, rgba(225, 238, 255, 1), rgba(223, 224, 254, 1));
+ &-box {
+ margin: 0 12px 0 12px;
+ background-color: rgba(255, 255, 255, 0.5);
+ border-radius: 8px 8px;
+ padding: 8px;
+ text {
+ .searchbox {
+ border-radius: 8rpx 8rpx 0 0;
+ height: 23px;
+ line-height: 23px;
+ width: 65px;
+ color: #fff !important;
+ background-color: #1677ff !important;
+ .statistics {
+ &-title {
+ &-slot-title {
+ .collapse-content {
+ margin: 0 -8px -8rpx 0;
+ font-size: 10px;
+ margin: 0 8px 8rpx 0;
@@ -0,0 +1,41 @@
+ <view class="p20 bgf" style="z-index: 999;">
+ :fontSize="15" :bold="false" @change="sectionChange"></u-subsection>
+ <qiweiUrgeCourse v-if="current==0"></qiweiUrgeCourse>
+ <userUrgeCourse v-else></userUrgeCourse>
+ import qiweiUrgeCourse from "@/components/qiweiUrgeCourse.vue"
+ import userUrgeCourse from "@/components/userUrgeCourse.vue"
+ qiweiUrgeCourse,
+ userUrgeCourse
+ name: '企微',
+ name: '注册会员'
+ current:0
@@ -1,43 +0,0 @@
- <view class="content">
- <web-view v-if="webUrl!=null" :src="webUrl"></web-view>
-import {getConfigByKey} from '@/api/common'
-export default {
- components: { },
- webUrl:null,
- onLoad(options) {
- var companyUserId=uni.getStorageSync('companyUserId');
- setTimeout(function(){
- that.webUrl="https://ai.cdwjyyh.com/#/pages/ai/conversation?userType=3&userId="+companyUserId+"&companyUserId="+companyUserId
- console.log(that.webUrl);
- },500)
- methods:{
-page{
-.content{
- padding: 30rpx;
@@ -1,168 +0,0 @@
- <mescroll-body top="0rpx" bottom="0" ref="mescrollRef" @init="mescrollInit" :down="downOption" :up="upOption" @down="downCallback" @up="upCallback">
- <view class="sop-list">
- <view class="sop-item" v-for="(item) in dataList" @click.stop="navTo('/pages/user/courseSop/sopLosList?sopId='+item.id)" >
- <view class="name-box">
- <view class="name">{{item.name}}</view>
- <view class="desc-box">
- <view class="label">创建时间:</view>
- <view class="value">{{item.createTime}}</view>
- </mescroll-body>
- import {getCourseSopList} from '@/api/course.js'
- mixins: [MescrollMixin], // 使用mixin
- mescroll:null,
- auto:false//不要自动加载
- onScroll:false,
- textNoMore:"已经到底了",
- icon:'/static/images/empty.png',
- dataList: []
- var data={
- title:"加载中..."
- getCourseSopList(data).then(res => {
- //设置列表数据
- if (page.num == 1) {
- that.dataList = res.data.list;
- that.dataList = that.dataList.concat(res.data.list);
- that.mescroll.endBySize(res.data.list.length, res.data.total);
- icon:'none',
- that.dataList = null;
- that.mescroll.endErr();
- navTo(url){
- url: url
- background: #f6f6f6;
- .content{
- padding: 0rpx;
- .tabs{
- z-index: 10000;
- top:0rpx;
- left:0rpx;
- height: 88rpx;
- .sop-list{
- flex-direction: column;
- padding: 15rpx;
- .sop-item{
- border-radius: 15rpx;
- margin-bottom: 15rpx;
- .name-box{
- align-items: center;
- justify-content: flex-start;
- .name{
- font-size: 32rpx;
- color:#111;
- .btns{
- .btn{
- margin-left: 10rpx;
- width: 40rpx;
- height:40rpx;
- .desc-box{
- margin-top: 15rpx;
- .label{
- font-size: 28rpx;
- color: #a8a8a8;
- .value{
@@ -1,89 +0,0 @@
- <view class="info-detail" v-if="item!=null">
- <view class="item">
- <text class="label">接收者:</text>
- <text class="text">{{item.externalUserName}}</text>
- <text class="label">发送时间:</text>
- <text class="text">{{item.sendTime}}</text>
- <text class="label">实际发送时间:</text>
- <text class="text">{{item.realSendTime}}</text>
- <view class="item" v-for="(cont,index ) in contents">
- <text class="label">发送内容({{index+1}}):</text>
- <text class="text" v-html="cont.value"> </text>
- import {getCourseSopLogsDetail} from '@/api/course.js'
- id:null,
- item:null,
- contents:[],
- onLoad(option) {
- // this.id = option.id;
- this.item=JSON.parse(uni.getStorageSync("sop"));
- console.log(this.item)
- this.contents=JSON.parse(this.item.contentJson);
- getUserInfoByUserId(userId){
- var data = {userId:userId};
- getUserInfoByUserId(data).then(
- res => {
- that.bindUser(res);
- rej => {}
- );
- // 详细信息
- .info-detail{
- padding: 0 24upx;
- .item{
- padding: 20upx 0;
- border-bottom: 1px solid #f7f7f7;
- font-size: 30upx;
- margin-right: 20upx;
- .text{
@@ -1,302 +0,0 @@
- <view class="top-box">
- <view class="tabs">
- <u-tabs
- :scrollable="false"
- :list="tabs"
- lineColor="#115296"
- @change="tagChange">
- </u-tabs>
- <mescroll-body top="88rpx" bottom="0" ref="mescrollRef" @init="mescrollInit" :down="downOption" :up="upOption" @down="downCallback" @up="upCallback">
- <view class="sop-item" v-for="(item) in dataList" @click.stop="openDetails(item)" >
- <view class="name">{{item.externalUserName}}</view>
- <view class="label">发送时间:</view>
- <view class="value">{{item.sendTime}}</view>
- <view class="label">所属销售:</view>
- <view class="value">{{item.userName}}</view>
- <view class="footer-btns">
- <u-button :disabled="!sendFlag" type="success" wid @click="sendMsg()" text="启动群发"></u-button>
- import { getCourseSopLogsList} from '@/api/course.js'
- sendFlag:true,
- hasNextPage:false,
- totalCount:0,
- sopId:null,
- status:3,
- tabs:[
- id:3,
- name:'待发送'
- id:1,
- name:'发送成功'
- id:0,
- name:'发送失败'
- this.sopId=option.sopId;
- uni.$on('sendSop', (item) => {
- console.log(JSON.parse(item.data))
- var data=JSON.parse(item.data);
- var param={
- sendStatus:1,
- id: data.id,
- receivingStatus: data.receivingStatus,
- remark:item.remark
- updateCourseSopLogs(param).then(res => {
- that.sendMsgOp();
- sendMsgOp(){
- if(this.sendFlag){
- //循环发送 先获取一条,更新一条这样发送
- this.mescroll.resetUpScroll()
- if(that.dataList.length>0){
- var data={cmd:"sendSop", data:that.dataList[0],userId:"p-"+userId};
- uni.$emit('sendMsg',data);
- else{
- that.sendFlag=true;
- title: "已完成",
- },5000);
- sendMsg(){
- if(!this.sendFlag){
- title: "运行中...",
- uni.showModal({
- title:"提示",
- content:"确认启动自动发送吗?",
- showCancel:true,
- cancelText:'取消',
- confirmText:'确定',
- success:res=>{
- if(res.confirm){
- this.sendFlag=false;
- that.sendMsgOp()
- // 否则点击了取消
- openDetails(item){
- uni.setStorageSync("sop",JSON.stringify(item))
- url:"sopLogsDetails"
- tagChange(item){
- this.status=item.id
- sopId:this.sopId,
- sendStatus:this.status,
- getCourseSopLogsList(data).then(res => {
- that.hasNextPage=res.data.hasNextPage
- .top-box{
- .footer-btns{
- padding:15rpx;
- bottom:30rpx;
- font-size: 38rpx;
@@ -1,131 +0,0 @@
- <view class="info-detail" v-if="item!=null" >
- <text class="label">客户姓名</text>
- <text class="text">{{item.customerName}}</text>
- <text class="label">创建时间</text>
- <text class="text">{{item.createTime}}</text>
- <text class="label">客户微信</text>
- <view class="right">
- <view class="text ellipsis" >{{item.weixin}}</view>
- <view class="btn" @click="sendMsg()">
- 自动获取
- import {getCustomerDetails} from '@/api/crm.js'
- var data={cmd:"getWeixinId", data:{},userId:"p-"+userId};
- getCustomerDetails(customerId) {
- customerId: customerId
- getCustomerDetails(data).then(res => {
- this.item=res.customer;
- border-bottom: 1rpx solid #f3f3f3;
- min-width: 150rpx;
- font-size: 28upx;
- .right{
- justify-content: flex-end;
- max-width: 200rpx;
- height: 66rpx;
- border-radius: 8rpx;
- padding: 5rpx 15rpx;
- justify-content: center;
- border: 1rpx solid #e9e9e9;
- color: #909399;
@@ -1,225 +0,0 @@
- <view class="top-box" v-if="item!=null">
- <view class="customer-box">
- <view class="left">
- <view class="name">{{item.customerName}}</view>
- <view class="value"> {{item.createTime}}</view>
- <view class="label">地址:</view>
- <view class="value">{{item.address}} </view>
- <view class="btns">
- <image class="btn" src="../../../static/images/sms.png"></image>
- <image class="btn" src="../../../static/images/phone.png"></image>
- :scrollable="true"
- <view class="cont-box">
- <customer-info ref="customerInfo" v-if="tabId==1"></customer-info>
- <u-modal :show="show" ref="uModal" :asyncClose="true" :showCancelButton="true" title="提示" @cancel="close" @confirm="confirm" :content='content'></u-modal>
- import customerInfo from './components/customerInfo.vue'
- import {getCustomerDetails,editCrmCustomer} from '@/api/crm.js'
- components:{
- customerInfo, // 基本信息
- wxNickName:null,
- show:false,
- content:"",
- customerId:null,
- tabId:1,
- name:'用户资料'
- id:2,
- name:'联系人'
- name:'跟进记录'
- id:4,
- name:'通话记录'
- id:5,
- name:'短信记录'
- uni.$on('getWeixinId', (item) => {
- console.log(item)
- that.content="用户昵称:"+item.data+",是否更新";
- that.wxNickName=item.data;
- that.show=true;
- this.customerId=option.customerId
- console.log(this.customerId)
- this.getCustomerDetails()
- close(){
- this.show=false;
- confirm(){
- customerId:this.customerId,
- weixin:this.wxNickName
- //更新用户昵称
- editCrmCustomer(data).then(res => {
- title: "操作成功",
- if(this.tabId==1){
- that.$refs.customerInfo.getCustomerDetails(that.customerId)
- },200);
- this.tabId=item.id
- getCustomerDetails() {
- customerId:this.customerId
- uni.navigateBack()
- },2000);
- padding: 20rpx;
- .customer-box{
- align-items: flex-start;
- .left{
- font-size: 42rpx;
- width: 45rpx;
- height:45rpx;
@@ -1,235 +0,0 @@
- <view class="customer-list">
- <view class="customer-item" v-for="(item,index) in dataList" >
- <view class="name">昵称:{{item.nickName}}</view>
- <view class="btn" @click="delItem(index)" >删除</view>
- <view class="label">微信号:</view>
- <view class="value">{{item.id}}</view>
- <view class="bottom-btns">
- <view class="btn1" @click="getWxUsers()">获取客户</view>
- <view class="btn2" @click="addWxUsers()">导入客户</view>
- import {addCompanyWxUser} from '@/api/companyWxUser.js'
- flag:true,
- uni.$on('getWeixinList', (items) => {
- console.log(JSON.parse(items.data))
- that.dataList=JSON.parse(items.data);
- that.flag=true;
- title: "获取微信任务已完成,共获取"+that.dataList.length+"个",
- delItem(index){
- this.dataList.splice(index,1);
- importUsers(){
- var index=0;
- that.dataList.forEach(item => {
- index++;
- var data={nickName:item.nickName,weixinId:item.id};
- addCompanyWxUser(data).then(res => {
- if(index>=that.dataList.length){
- that.dataList=[];
- title: "导入成功",
- title: "导入"+item.nickName,
- addWxUsers(){
- if(!this.flag){
- title: "正在同步获取微信用户...",
- if(this.dataList.length==0){
- title: "没有可导入的数据",
- content:"确认导入用户列表吗?",
- that.importUsers();
- getWxUsers(){
- content:"确认开始获取微信用户?",
- that.flag=false;
- var data={cmd:"getWeixinList", data:{},userId:"p-"+userId};
- title: "开始获取微信用户...",
- .bottom-btns{
- height: 50px;
- .btn1{
- flex:1;
- background-color: red;
- .btn2{
- background-color: green;
- .customer-list{
- padding: 15rpx 15rpx 100rpx;
- .customer-item{
@@ -1,193 +0,0 @@
- <view class="top">
- <u-search placeholder="输入名称搜索" v-model="searchKey" @custom="search()" @search="search()"></u-search>
- <view class="customer-item" v-for="(item) in dataList" @click="navTo('/pages/user/crm/customerDetails?customerId='+item.customerId)" >
- <view class="label">所在地区:</view>
- <view class="value">{{item.address}}</view>
- <view class="label">备 注:</view>
- <view class="value">{{item.remark}}</view>
- import {getLineCustomerList} from '@/api/crm.js'
- searchKey:"",
- search(){
- customerName:this.searchKey,
- getLineCustomerList(data).then(res => {
- .top{
- padding: 0rpx 15rpx;
- <view class="label">最后跟进:</view>
- <view class="value">{{item.startTime}}</view>
- import {getMyCustomerList} from '@/api/crm.js'
- getMyCustomerList(data).then(res => {
@@ -4,7 +4,8 @@
<view class="info-item">
<view class="label">头像</view>
<view class="right">
- <image class="head" @tap="chooseImage()" :src="headImg" mode=""></image>
+ <u-avatar :src="headImg" size="40" @tap="chooseImage()" ></u-avatar>
+ <!-- <image class="head" @tap="chooseImage()" :src="headImg" mode=""></image> -->
@@ -94,7 +95,7 @@
var that=this;
getCompanyUser(data).then(
res => {
- that.bindUser(res.data);
+ that.bindUser(res.user);
rej => {}
@@ -1,158 +1,73 @@
+ <view class="content container">
<view class="bg"></view>
<view class="cont-box">
<view class="user-cont" @click="navTo('/pages/user/userInfo')">
<view class="user-box" v-if="user!=null">
<view class="left">
- <image src="../../static/images/default.png"></image>
+ <u-avatar :src="user.avatar" size="50"></u-avatar>
+ <!-- <image class="img" :src="user.avatar" mode="aspectFill"></image> -->
<view class="user" >
<view class="username">{{user.nickName}}</view>
- <view class="account">{{user.deptName}}</view>
+ <view class="account">{{user.email}}</view>
<view class="right" >
- <image src="../../static/images/right_arrow.png"></image>
+ <image src="/static/images/right_arrow.png"></image>
<view class="company" v-if="user!=null">
- <image src="../../static/images/icon_comp.png"></image>
- <view class="name">{{user.deptName}}</view>
+ <image src="/static/images/icon_comp.png"></image>
+ <view class="name">{{user.createBy||'暂无数据'}}</view>
- <view class="menu-box">
+ <view class="menu-box" style="margin-top: -20rpx;">
<view class="title-box">
- <image class="icon" src="../../static/manergevip/chang.png"></image>
+ <image class="icon" src="/static/manergevip/chang.png"></image>
<view class="title">常用功能</view>
<view class="line"></view>
<view class="menus">
- <!-- <view class="menu-item" @click="navTo('/pages/user/ai/index')">
- <image src="../../static/manergevip/serve.png"></image>
- <view class="m-name">AI客服</view>
- <view class="menu-item" @click="navTo('/pages/user/qwSop/sop')">
- <image src="../../static/manergevip/sop.png"></image>
- <view class="m-name">群发SOP</view>
- <!-- <view class="menu-item" @click="navTo('/pages/user/courseSop/sop')">
- <image src="../../static/images/menu_info.png"></image>
- <view class="m-name">课程群发SOP</view>
- <view class="menu-item" @click="navTo('/pages/courseManage/index')">
- <view class="m-name">看课管理</view>
+ <view class="menu-item" @click="navTo('/pages/courseManage/manage/manageIndex')">
+ <image src="/static/images/menu_info.png"></image>
+ <view class="m-name">销售管理</view>
<view class="menu-item" @click="navTo('/pages/user/users/users')">
- <image src="../../static/manergevip/qudao.png"></image>
- <view class="m-name">渠道管理</view>
+ <image src="/static/manergevip/qudao.png"></image>
+ <view class="m-name">审核销售</view>
<view class="menu-item" @click="handleShare">
- <image src="../../static/manergevip/share-manage.png"></image>
- <view class="m-name">渠道邀请</view>
- <!-- <view class="menu-box">
- <view class="title-box">
- <image class="icon" src="../../static/images/office.png"></image>
- <view class="title">客户管理</view>
- <view class="line"></view>
- <view class="menus">
- <view class="menu-item" @click="navTo('/pages/user/crm/lineCustomer')">
- <view class="m-name">线索客户</view>
- <view class="menu-item" @click="navTo('/pages/user/crm/myCustomer')">
- <view class="m-name">我的客户</view>
- <view class="menu-item" @click="navTo('/pages/user/crm/importWxUser')">
- <view class="m-name">导入微信用户</view>
- <view class="title">常用工具</view>
- <view class="menu-item" >
- <view class="m-name">制单</view>
- <view class="m-name">微信收款</view>
- <view class="m-name">支付宝收款</view>
- <view class="m-name">订单管理</view>
- <view class="m-name">商品套餐包</view>
+ <image src="/static/manergevip/share-manage.png"></image>
+ <view class="m-name">邀请销售</view>
- <view class="m-name">优惠券</view>
+ <view class="menu-item" @click="navTo('/pages/courseManage/manage/lableSetup')">
+ <image src="/static/images/changeLable.png"></image>
+ <view class="m-name">标签设置</view>
<view class="menu-box">
- <image class="icon" src="../../static/manergevip/qita.png"></image>
+ <image class="icon" src="/static/manergevip/qita.png"></image>
<view class="title">其它工具</view>
- <!-- <view class="menus">
- <view class="menu-item" @click="navTo('/pages/user/users/users')">
- <view class="m-name">通讯录</view>
<view class="menu-item" @click="navTo('/pages/user/about')">
- <image src="../../static/manergevip/about.png"></image>
+ <image src="/static/manergevip/about.png"></image>
<view class="m-name">关于我们</view>
<view class="menu-item" @click="navTo('/pages/user/editUser')">
- <image src="../../static/manergevip/setup.png"></image>
+ <image src="/static/manergevip/setup.png"></image>
<view class="m-name">设置</view>
- <!-- <view class="menu-box1">
- <view class="menu-item" @click="navTo('/pages/user/about')">
- <image src="../../static/images/icon_about_us.png"></image>
- <view class="label">关于我们</view>
- <view class="menu-item" @click="navTo('/pages/user/editUser')">
- <image src="../../static/images/icon_set.png"></image>
- <view class="label">设置</view>
<view class="btn-box" >
<view class="sub-btn" @click="showLogout()">退出登录</view>
@@ -160,7 +75,7 @@
+ <!-- <view class="sharePop-item y-f" @click="shareimg">
@@ -170,8 +85,8 @@
<view style="font-size: 12px;color: #888;">保存海报美观宣传</view>
- <view class="sharePop-item y-f" @click="setTimeShow=true">
+ <view class="sharePop-item y-f" @click="shareSale">
<image src="@/static/images/link_icon.png" mode="aspectFill"></image>
<view style="font-weight: bold;margin-bottom: 4px;">复制链接</view>
<view style="font-size: 12px;color: #888;">生成链接一键复制</view>
@@ -191,7 +106,7 @@
<!-- 设置链接有效时长弹窗 -->
+ <!-- <u-modal :show="setTimeShow" content='content' class="model" @confirm="confirmTime">
<view class="setTimebox">
<view class="timetip">不传默认以系统参数为准</view>
<view class="x-f">
@@ -199,7 +114,7 @@
<u-input fontSize="14px" placeholder="链接有效时长" border="none" v-model="time" maxlength="5"></u-input>
+ </u-modal> -->
<!-- 卡片分享引导 -->
<u-overlay :show="showzhidao" @click="showzhidao = false" style="z-index: 9999;">
<view class="point-box">
@@ -244,14 +159,40 @@
setImg:false,
codeLink:'',
showzhidao:false,
+ imgs:'https://h5.wxcourse.cdwjyyh.com/icon/20250214100002.png',
onShow() {
- this.getCompanyUser()
+ this.getCompanyUsers()
+ shareSale(){
+ const fullUrl = location.href;
+ const Path = fullUrl.split('/#')[0] || '';
+ data: Path+'/#/pages/courseManage/course/becomeSale?id='+this.user.companyId,
+ title: '邀请链接已复制',
+ // this.setTimeShow = !this.setTimeShow
+ this.showShare = false
+ // console.log(res)
@@ -271,7 +212,7 @@
shareimg(){
title: self.user.userName+"邀请您成为群管", // 分享标题
@@ -290,7 +231,7 @@
fail: function(err) {
+ // console.log(err);
title: '卡片生成失败,请重试',
@@ -302,8 +243,8 @@
+ // this.getjssdklist()
//设置链接时长
confirmTime() {
@@ -335,7 +276,7 @@
this.codeLink=res.data
title: res.msg,
@@ -359,12 +300,13 @@
if (this.copyLinks.startsWith('http://')) {
this.copyLinks = this.copyLinks.replace('http://', 'https://');
- console.log(this.copyLinks,'分享链接')
+ // console.log(this.copyLinks,'分享链接')
copyLink(){
+ console.log(this.showShare)
data: this.copyLinks,
@@ -388,11 +330,9 @@
- // console.log('open');
openShare() {
// this.showShare = false
- // console.log('close');
showLogout(){
this.show=true;
@@ -402,26 +342,37 @@
logout(){
this.utils.logout();
- uni.$emit('closeWebSocket');
- url: '/pages/auth/login',
+ url: loginPage,
navTo(url){
- console.log(url)
url
- getCompanyUser(){
+ getCompanyUsers(){
getCompanyUser(data).then(res => {
- this.user=res.data;
- console.log(this.user)
+ this.user=res.user;
+ if(this.user.avatar){
+ this.user.avatar=uni.getStorageSync('requestPath')+res.user.avatar
+ this.user.avatar=='';
@@ -438,6 +389,14 @@
.imgshe{
@@ -477,22 +436,23 @@
.bg{
- height: 200upx;
+ height: 360upx;
z-index: 1;
- background: linear-gradient(to bottom,#115296, #b4d8ff);
- // border-radius: 0rpx 0rpx 60rpx 60rpx;
+ // background: linear-gradient(to bottom, #8bbfff, #1773ff);
+ border-radius: 0rpx 0rpx 60rpx 60rpx;
.cont-box{
z-index: 2;
padding: 30rpx 30rpx 200rpx;
.user-cont{
- box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
+ // box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
padding: 30rpx;
border-radius: 15rpx;
.user-box{
@@ -523,13 +483,12 @@
font-weight: bold;
.account{
- padding: 5rpx 20rpx;
+ padding: 5rpx 0rpx;
border-radius: 30rpx;
- background-color: #115296;
margin-top: 20rpx;
font-size: 24rpx;
+ color: #515151;
@@ -670,8 +629,7 @@
- <view class="sop-item" v-for="(item) in dataList" @click.stop="navTo('/pages/user/qwSop/sopLosList?sopId='+item.id)" >
- import {getQwSopList} from '@/api/qw.js'
- getQwSopList(data).then(res => {
@@ -1,90 +0,0 @@
- import {getQwSopSendCustomerList} from '@/api/qw.js'
- import {updateQwSopLogs,getQwSopLogsList} from '@/api/qw.js'
- updateQwSopLogs(param).then(res => {
- getQwSopLogsList(data).then(res => {
@@ -3,9 +3,9 @@
<!-- 个人信息 -->
<view class="user-info">
<view class="info-box">
- <view class="head-box">
- <image class="img" :src="avatar" mode="aspectFill"></image>
+ <view class="left justify-center align-center">
+ <view class="head-box center">
+ <u-avatar :src="avatar" size="50"></u-avatar>
<view class="info">
<text class="name">{{nickName}}</text>
@@ -35,7 +35,6 @@
<text class="label">手机</text>
<text class="text">{{phonenumber}}</text>
- <image class="img" src="/static/images/icon_phone.png" mode="aspectFill" ></image>
<view class="item">
<text class="label">邮箱</text>
@@ -109,8 +108,7 @@
);
@@ -140,7 +138,8 @@
.content{
// 个人信息
.user-info{
- background: #115296;
+ // background: #115296;
+ background: linear-gradient(to right, #dae9ff, #e1e1fd);
padding: 0 30upx;
.info-box{
@@ -172,11 +171,11 @@
justify-content: space-between;
.name{
font-size: 30upx;
+ color: #878787;
.title{
font-size: 28upx;
@@ -196,7 +195,7 @@
.text{
@@ -218,10 +217,13 @@
&.column{
align-items: center;
- justify-content: space-between;
+ align-items: flex-start;
+ flex-direction: row;
.img{
width: 50upx;
height: 50upx;
+ margin-right: 20rpx;
@@ -0,0 +1,201 @@
+ <view class="content hb column justify-center align-center bgf">
+ <image src="/static/image/becomevip.png" mode="widthFix"></image>
+ <view class="bold">成为会员,享受更多权益</view>
+ <view class="sure" @click="registerCourse">{{isVip==1?'您已成为会员':'申请成为会员'}}</view>
+ import { loginByMp,registerCourses } from '@/api/user'
+ isVip: 0,
+ isWechat: false,
+ isLogin: false,
+ companyid:'',
+ companyUserId:'',
+ userInfo:{},
+ tagIds:[]
+ if(uni.getStorageSync('userInfo')&&JSON.stringify(uni.getStorageSync('userInfo'))!='{}') {
+ this.userInfo = JSON.parse(uni.getStorageSync('userInfo'))
+ this.userInfo = {}
+ // this.userInfo=JSON.parse(uni.getStorageSync('userInfo')) || {};
+ let obj=uni.getStorageSync('AppToken');
+ this.isLogin = !!obj;
+ this.companyid = option.companyId || ''
+ this.companyUserId=option.companyUserId || 0
+ if(option.tagids=="null"){
+ this.tagIds=[]
+ this.tagIds=option.tagids
+ const arr =this.tagIds.split(",")
+ .map(item => parseInt(item.trim(), 10))
+ .filter(num => !isNaN(num)); // 过滤无效转换
+ this.tagIds =arr
+ console.log(this.tagIds); // [66, 78]
+ this.isWechat = String(navigator.userAgent.toLowerCase().match(/MicroMessenger/i)) === "micromessenger"
+ this.code = option.code
+ if(this.code&&!this.isLogin) {
+ this.loginByMp()
+ if(this.isLogin&&this.isVip!=1) {
+ this.registerCourse()
+ getWechatCode() {
+ if (this.isWechat) {
+ let appid = "wx961fadab9bcb792b"; //微信APPid
+ let code = this.getUrlCode().code; //是否存在code
+ let local = window.location.href;
+ if (code == null || code === "") {
+ let urlPaths = local.split("/registerCourse");
+ uni.setStorageSync('beforLoginPage', urlPaths[1]);
+ //不存在就打开上面的地址进行授权
+ window.location.href =
+ "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" +
+ appid +
+ "&redirect_uri=" +
+ encodeURIComponent(local) +
+ "&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect";
+ this.code = code;
+ title: '请在微信浏览器中打开',
+ icon:'error'
+ getUrlCode() {
+ // 截取url中的code方法
+ var url = location.search;
+ var theRequest = new Object();
+ if (url.indexOf("?") != -1) {
+ var str = url.substr(1);
+ var strs = str.split("&");
+ for (var i = 0; i < strs.length; i++) {
+ theRequest[strs[i].split("=")[0]] = strs[i].split("=")[1];
+ return theRequest;
+ loginByMp() {
+ if (this.code == null) {
+ title: "处理中..."
+ loginByMp({code:this.code}).then(res => {
+ uni.setStorageSync('AppToken', res.token);
+ uni.setStorageSync('userInfo', JSON.stringify(res.user));
+ this.userInfo= res.user
+ let beforLoginUrl = uni.getStorageSync('beforLoginPage');
+ this.isLogin = true
+ err => {}
+ );
+ registerCourse() {
+ this.isVip = 0
+ // 确保从本地存储重新获取最新数据
+ // if(uni.getStorageSync('userInfo')){
+ // this.userInfo=JSON.parse(uni.getStorageSync('userInfo'));
+ // if (!this.userInfo.userId) {
+ // // 空值检查
+ // uni.showToast({ title: '用户未登录或信息不完整', icon: 'none' });
+ // return;
+ if(this.tagIds==null){
+ this.tagIds=""
+ console.log(this.tagIds)
+ userId:this.userInfo.userId,
+ companyUserId:this.companyUserId,
+ companyId:this.companyid,
+ tagIds:this.tagIds
+ if(this.isLogin) {
+ registerCourses(data).then(res=>{
+ if(res.code == 200) {
+ this.isVip = 1
+ title: '恭喜你!成为会员',
+ icon:'none'
+ this.getWechatCode()
+ .content {
+ width: 300rpx;
+ height: 300rpx;
+ .bold {
+ height: auto;
+ line-height: inherit;
+ margin-bottom: 0;
+ width: 304px;
+ word-break: break-all;
+ margin: 50rpx 0 100rpx 0;
+ .sure {
+ background-color: #1777ff;
+ border-radius: 8rpx;
@@ -23,7 +23,7 @@
<view class="comp-info">
<image class="img" src="/static/images/icon_comp.png" mode="aspectFill"></image>
- <text class="fs24 base-color-6">{{deptName}}</text>
+ <text class="fs24 base-color-6">{{userinfo.deptName}}</text>
<image class="img" src="/static/images/phone.png" mode="aspectFill"></image>
@@ -37,41 +37,42 @@
<view class="base-bg-sure radius12 pl20 ptb12 item">
<view class="mt12 base-color">
- <text class="fs40 bold">98</text>
+ <text class="fs40 bold">{{userinfo.vipCount}}</text>
<text class="fs28">人</text>
+ <text class="fs40 bold">{{userinfo.newVipCount}}</text>
+ <text class="fs40 bold">{{userinfo.redPacketCount}}</text>
<text class="fs28">个</text>
+ <text class="fs40 bold">{{userinfo.newVipRedPackAmount}}</text>
<text class="fs28">元</text>
<view class="footer-btn ">
- <view :class="shenhe?'shenhed':'notshenhe'" @click="submitshen">{{shenhe?'已审核':'待审核'}}</view>
- <view class="base-bg-false base-color-red bor-red" @click="submitjin">{{jinyong?'禁用':'未禁用'}}</view>
+ <view :class="userinfo.isAudit==1?'shenhed':'notshenhe'" @click="submitshen">{{userinfo.isAudit==1?'已审核':'待审核'}}</view>
+ <view :class="userinfo.status==1?'notshenhe':'shenhed'" @click="submitjin">{{userinfo.status==1?'禁用':'未禁用'}}</view>
import {getUserInfoByUserId,getUserInfo} from '@/api/user.js';
+ import {subsalesaudit,changesalesState} from '@/api/courseManage.js';
@@ -83,10 +84,10 @@
email:"",
sex:"",
isShow:false,
- userId:undefined,
+ userId:'',
userinfo:[],
shenhe:false,
- jinyong:false
+ jinyong:false,
@@ -101,6 +102,7 @@
// })
if(!this.utils.isEmpty(option.userId)){
this.userId = option.userId;
this.isShow=true;
@@ -115,10 +117,68 @@
submitshen(){
+ if(this.userinfo.isAudit==1){
+ title: "用户已经通过审核,无需多次审核",
+ this.subsalesaudits()
submitjin(){
+ if(this.userinfo.status==0){
+ title: "用户已经解除禁用,无需多次解除",
+ this.changesalesStates()
+ subsalesaudits(){
+ userIds:this.userId
+ subsalesaudit(this.userId).then(res=>{
+ title: "用户通过审核,成为销售!",
+ delta: 1
+ changesalesStates(){
+ changesalesState(this.userId).then(res=>{
+ title: "用户解除禁用!",
bindUser(data){
@@ -154,6 +214,7 @@
getUserInfoByUserId(data).then(
that.bindUser(res);
@@ -10,15 +10,15 @@
class="flex-1 center ptb20">批量</view>
+ <view v-if='list.length<1' class="center mt60" style="color: #666;">暂无用户</view>
<scroll-view scroll-y class="indexes flex-1 pb60" :scroll-into-view="'indexes-'+ listCurID" :style="[{height:'calc(100vh - 300rpx)'}]"
:scroll-with-animation="true" :enable-back-to-top="true" >
<view v-for="(item,index) in list" :key="index">
- <view :class="'indexItem-' + item.firstLetter" :id="'indexes-' + item.firstLetter" :data-index="item.firstLetter">
+ <view :class="'indexItem-' + item.firstLetter" :id="'indexes-' + item.firstLetter" :data-index="item.firstLetter" @click.passive.stop>
<view class="zm">{{item.firstLetter}}</view>
<view class="user-list">
- <view class="user-item justify-start" v-for="(subitem,index) in item.list"
- @click="navTo(subitem)" :key="index">
+ <view class="user-item justify-start" v-for="(subitem,indexs) in item.list"
+ @click="navTo(subitem)" :key="indexs">
<u-checkbox-group @change="changeitem(subitem.userId)" v-if="selectact">
<u-checkbox :checked="subitem.checked" shape="circle" activeColor="#1773ff" :name="subitem.userId"
labelColor="#1773ff" />
@@ -34,22 +34,24 @@
{{subitem.nickName}}
<view class="dept justify-start align-center">
- <u-icon name="phone"></u-icon><view>1576984582</view> </view>
- <view class="dept">注册时间:2025-01-24</view>
+ <u-icon name="phone"></u-icon><view>{{subitem.phoneNumber}}</view> </view>
+ <view class="dept">注册时间:{{subitem.registerTime}}</view>
- <view class="base-color fs24">未禁用</view>
+ <view class="base-color fs24" v-if="subitem.status==0">未禁用</view>
+ <view class="base-color-red fs24" v-else>禁用</view>
- <view class="justify-between mt10">
+ <view class="justify-between mt10" @click.passive.stop>
<view class="fs24 mt20 ml10" style="color: #115296;">
{{subitem.deptName}}
<!-- <view class="fs24 base-color-red mr10 bor-red
base-bg-false plr20 radius40 ptb4">已禁用</view> -->
<view class="fs24 base-color mr10 bor-blue h52 lh50
- base-bg-sure plr20 radius40 " style="width: fit-content;" v-if="act==0">已审核</view>
+ base-bg-sure plr20 radius40 " style="width: fit-content;" v-if="subitem.isAudit==1">已审核</view>
<view class="fs24 base-color-red mr10 bor-red h52 lh50
- base-bg-false plr20 radius40 " style="width: fit-content;" v-if="!selectact&&act==1">待审核</view>
+ base-bg-false plr20 radius40 " style="width: fit-content;z-index: 999;" @click="getidshen(subitem.userId)"
+ v-else-if="subitem.isAudit==0&&!selectact">待审核</view>
@@ -81,12 +83,13 @@
<!--选择显示-->
<view v-show="!hidden" class="indexToast">
{{listCur}}
- import {getAllUsers} from '@/api/user.js';
+ import {getAllUsers} from '@/api/user.js';
+ import {subsalesaudit} from '@/api/courseManage.js';
@@ -102,7 +105,9 @@
act:0,
selectact:false,
- selectedUsers:[]
+ selectedUsers:[],
+ isAudits:1,
+ ids:''
onLoad() {
@@ -118,6 +123,11 @@
}).exec()
+ getidshen(id){
+ this.ids=id
batchApprove(){
if (this.selectedUsers.length === 0) {
@@ -126,6 +136,29 @@
return;
+ this.ids=this.selectedUsers.join(',')
+ userIds:this.ids
+ subsalesaudit(this.ids).then(res=>{
+ this.getUser()
// 全选
selectAll() {
@@ -165,13 +198,23 @@
return this.list.reduce((total, group) => total + group.list.length, 0);
tabact(index){
+ this.list=[]
this.act=index
+ if(this.act==0){
this.selectact=false
+ this.isAudits=1
+ this.getUser();
+ }else if(this.act==1){
+ this.isAudits=0
getUser(){
- var data = {searchKey:this.searchContent};
+ var data = {
+ searchKey:this.searchContent,
+ isAudit:this.isAudits
getAllUsers(data).then(
@@ -0,0 +1,223 @@
+ <view class="top-title">我的</view>
+ <view class="user-cont" :style="{marginTop: `calc(${statusBarHeight}px + 88rpx)`}">
+ <view class="user-box" v-if="user!=null">
+ <view class="left">
+ <view class="user" >
+ <view class="username">{{user.nickName}}</view>
+ <view class="company" v-if="user!=null">
+ <view class="p20">
+ <view class="menu-box" style="margin-top: -40rpx;">
+ <view class="title-box">
+ <view class="title">常用功能</view>
+ <view class="line"></view>
+ <view class="menus">
+ <view class="menu-item" @click="navTo()">
+ <tabbar :actindex="1"></tabbar>
+ import { getCompanyUser } from '@/api/user.js'
+ user:[]
+ navTo(url){
+ if(uni.getStorageSync('companyUserInfo')){
+ url:'/pages/index/index'
+ url:'/pages/auth/login'
+ getCompanyUser(data).then(res => {
+.menu-box{
+ box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
+ padding: 30rpx;
+ border-radius: 15rpx;
+ .title-box{
+ .icon{
+ height:40rpx;
+ color: #111;
+ .line{
+ margin-top: 15rpx;
+ height: 0.5rpx;
+ background-color: #efefef;
+ .menus{
+ flex-wrap: wrap;
+ .menu-item{
+ width: 25%;
+ width:60rpx;
+ height:60rpx;
+ .m-name{
+ margin-top: 10rpx;
+.user-cont{
+ border-radius: 0px 0px 30px 30px;
+ .user-box{
+ .left{
+ flex:1;
+ width:120rpx;
+ .user{
+ width: calc(100% - 140rpx);
+ .username{
+ font-size: 38rpx;
+ .account{
+ border-radius: 30rpx;
+ .company{
+ width:40rpx;
+ .name{
+ margin-left: 15rpx;
- "appid": "wx93ce67750e3cfba3",
+ "appid": "wxa5b19147cb4d515e",
"compileType": "miniprogram",
"libVersion": "3.7.3",
"packOptions": {
@@ -24,5 +24,6 @@
"editorSetting": {
"tabIndent": "insertSpaces",
"tabSize": 2
+ "simulatorPluginLibVersion": {}
@@ -15,6 +15,7 @@ router.beforeEach((to, from, next) => {
console.log("路由进入")
console.log(to)
let index = filters.indexOf(to.path);
//过滤
console.log(index)
if (index > -1) {
@@ -28,7 +29,15 @@ router.beforeEach((to, from, next) => {
next();
else{
- next({path: "/pages/auth/login"});
+ next({path: loginPage});
//判断是否校验路由
// if (to.meta.isAure) {