This commit is contained in:
2024-07-09 16:46:43 +08:00
21 changed files with 2043 additions and 48 deletions

View File

@@ -0,0 +1,98 @@
<template>
<div>
<!-- 图片预览 -->
<div id="modal" class="modal">
<span class="close" @click="close">&times;</span>
<img class="modal-content" :src="url">
</div>
</div>
</template>
<script>
export default {
props:['url'],
methods:{
close(){
this.$emit('close')
},
}
}
</script>
<style>
.zoomable {
width: 100%;
max-width: 300px;
cursor: pointer;
}
/* 模态框 */
.modal {
/* display: none; */
display: flex; align-items: center;
position: fixed;
/* 确保层级在上 */
z-index: 1;
padding-top: 100px;
left: 0;
top: 0;
width: 100%;
height: 100%;
overflow: auto;
background-color: rgba(0, 0, 0, 0.2);
}
.modal-content {
margin: auto;
display: block; background: #fff;
/* width: 80%; */
max-width: 700px;
max-height: 80vh;
}
.modal-content {
-webkit-animation-name: zoom;
-webkit-animation-duration: 0.6s;
animation-name: zoom;
animation-duration: 0.6s;
}
@-webkit-keyframes zoom {
from {
-webkit-transform: scale(0)
}
to {
-webkit-transform: scale(1)
}
}
@keyframes zoom {
from {
transform: scale(0)
}
to {
transform: scale(1)
}
}
/* 关闭按钮 */
.close {
position: absolute;
top: 15%;
right: 35px;
color: #fff;
font-size: 40px;
font-weight: bold;
transition: 0.3s;
}
.close:hover,
.close:focus {
color: #14b3e4;
text-decoration: none;
cursor: pointer;
}
</style>

View File

@@ -64,6 +64,8 @@ const mainRoutes = {
{ path: '/course-courseChapter', component: _import('modules/course/courseChapter'), name: 'course-courseChapter', meta: { title: '课程目录章节列表', isTab: true } },
{ path: '/course-courseVideo', component: _import('modules/course/courseVideo'), name: 'course-courseVideo', meta: { title: '课程目录章节视频列表', isTab: true } },
{ path: '/course-sociologyList', component: _import('modules/course/sociologyList'), name: 'course-sociologyList', meta: { title: '国学标签列表', isTab: true } },
{ path: '/userCourse', component: _import('modules/user/userCourse'), name: 'userCourse', meta: { title: '用户课程列表', isTab: true } },
{ path: '/workOrder', component: _import('modules/workOrderLIst'), name: 'workOrder', meta: { title: '工单列表', isTab: true } },
],
beforeEnter (to, from, next) {
let token = Vue.cookie.get('token')

25
src/utils/imgPre.js Normal file
View File

@@ -0,0 +1,25 @@
var modal = document.getElementById("modal");
var modalImg = document.getElementById("modalImage");
var images = document.querySelectorAll(".zoomable");
// 遍历为每个图片元素添加事件监听器
images.forEach(function (image) {
image.addEventListener("click", function () {
modal.style.display = "block";
modalImg.src = this.src;
});
});
var span = document.querySelector(".close");
span.addEventListener("click", function () {
modal.style.display = "none";
});
modal.addEventListener("click", function (event) {
if (event.target == modal) {
modal.style.display = "none";
}
});

View File

@@ -28,7 +28,7 @@
<el-badge value="hot">
<a href="https://www.renren.io/" target="_blank">官方社区</a>
</el-badge>
</el-menu-item>
</el-menu-item>
<el-submenu index="3">
<template slot="title">Git源码</template>
<el-menu-item index="2-1"><a href="https://github.com/renrenio/renren-fast-vue" target="_blank">前端</a></el-menu-item>
@@ -59,12 +59,12 @@
export default {
data () {
return {
updatePassowrdVisible: false
updatePassowrdVisible: false
}
},
components: {
UpdatePassword
},
},
computed: {
navbarLayoutType: {
get () { return this.$store.state.common.navbarLayoutType }
@@ -82,7 +82,7 @@
}
},
methods: {
// 修改密码
// 修改密码
updatePasswordHandle () {
this.updatePassowrdVisible = true
this.$nextTick(() => {

View File

@@ -36,12 +36,15 @@
</div>
</el-form-item>
<el-form-item label="视频">
<el-form-item label="视频" v-loading="VideoLoadingFlag">
<el-upload :limit="1" class="el-uploadvideo " v-loading="videoLoading" element-loading-text="正在保存到服务器,请勿离开..."
element-loading-spinner="el-icon-loading" element-loading-background="rgba(255, 255, 255, 0.8)"
:class="{ uoloadSty: dataForm.showBtnDealImg, disUoloadSty: dataForm.noneBtnImg }"
:action="baseUrl + '/oss/fileoss'" :file-list="videoList" :on-success="videoSuccess" accept=".mp4"
:on-remove="videoRemove" :show-file-list="true" :on-progress="uploadVideo">
:action="baseUrl + '/oss/fileoss'" :file-list="videoList"
:on-error="onvideoEror"
:before-upload="beforeuploadVideo"
:on-success="videoSuccess" accept=".mp4"
:on-remove="videoRemove" :show-file-list="true">
<!-- <i class="el-icon-plus"></i> -->
<el-button slot="trigger" size="small" type="primary">上传文件</el-button>
</el-upload>
@@ -161,7 +164,7 @@
trigger: "blur"
}]
},
VideoLoadingFlag:false,
// 富文本编辑器配置
editorOption: {
modules: {
@@ -462,7 +465,22 @@
// setTimeout( () => {this.progressFlag = false}, 1000) // 一秒后关闭进度条
}
},
// 上传失败
onvideoEror(err, file, fileList){
console.log(err,'err')
this.VideoLoadingFlag = false
// this.$message.error('上传失败')
this.$notify.error({
title: '错误',
message: '上传失败',
duration: 0
});
},
// 视频上传成功前
beforeuploadVideo(){
this.VideoLoadingFlag = true
},
videoSuccess(res, file) {
console.log(res, 'res')
if (res.msg == "success") {
@@ -483,6 +501,7 @@
} else {
this.$message.error("上传失败");
}
this.VideoLoadingFlag = false
},
videoRemove(file, fileList) {

View File

@@ -66,7 +66,6 @@
:inactive-value="0"
active-text=""
inactive-text=""
>
</el-switch>
</el-form-item>
@@ -91,8 +90,57 @@
>
</quill-editor>
</el-form-item>
<!-- <el-form-item prop="sort" label-width="0"> -->
<!-- <div v-if="this.dataForm.id"> -->
<div>
<div
class="flexbox videoBox"
v-for="(item, index) in video_audio_url"
:key="index"
>
<div style="width:120px">视频/音频ID</div>
<div style="width:250px; margin-right:10px; margin-left:10px">
<el-input
style=""
v-model="item.video"
placeholder="请输入视频/音频ID"
></el-input>
</div>
<div class="flexbox" style="align-items:center;" >
<span style="display:inline-block; width:60px">排序</span>
<el-input
style=""
v-model="item.sort"
placeholder="排序"
></el-input>
</div>
<div style="margin-right:10px; height:38px">
<el-form-item label="加密类型:" prop="type" label-width="100px">
<el-select
v-model="item.type"
filterable
placeholder="请选择类型"
>
<el-option
v-for="item in typeList"
:key="item.dictType"
:label="item.dictValue"
:value="item.dictType"
>
</el-option>
</el-select>
</el-form-item>
</div>
<el-button @click="delItem(index)" plain type="danger" size="mini">删除</el-button>
</div>
<!-- </el-form-item> -->
</div>
<div style="text-align:center; padding-top:15px" >
<el-button @click="addItem">添加一条音/视频</el-button>
</div>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="handlereset">取消</el-button>
@@ -169,6 +217,21 @@ export default {
dictType: "",
dictValue: ""
},
typeList: [
//类型0普通1加密
{
dictType: 0,
dictValue: "普通"
},
{
dictType: 1,
dictValue: "加密"
},
{
dictType: 2,
dictValue: "mp3"
}
],
gushuList: [],
authorList: [],
restaurants: [],
@@ -185,10 +248,18 @@ export default {
title: "",
imgUrl: "",
content: "",
sort: 1
},
sort: 1,
// video_audio_url: [
// {url:'454545',type:0}
// ]
},
video_audio_url: [
{ video: "" ,type:1,id:0,sort:0}
],
obj:{ video: "" ,type:1,id:0,sort:0},
splitsTypeList: [],
dataRule: {}
dataRule: {},
chapterId:null,
};
},
components: {
@@ -197,6 +268,16 @@ export default {
created() {},
mounted() {},
methods: {
delItem(index){
this.video_audio_url.splice(index, 1)
// console.log(this.video_audio_url,'删除后的')
},
addItem() {
// var jj = {...this.obj}
console.log(this.video_audio_url.length,'this.dataForm.video_audio_url--------')
this.video_audio_url.push({'chapterId':this.chapterId, ...this.obj});
console.log(this.video_audio_url,'this.dataForm.video_audio_url')
},
contentUploadSuccess(res, file) {
// console.log(res)
let quill = this.$refs.myQuillEditor.quill;
@@ -231,6 +312,13 @@ export default {
this.dataForm.courseId = courseid ? courseid : "";
this.dataForm.catalogueId = catalogue_id ? catalogue_id : "";
this.visible = true;
this.chapterId = this.dataForm.id
if(this.dataForm.videoList && this.dataForm.videoList.length > 0){
this.video_audio_url = [...this.dataForm.videoList]
console.log('dedao',this.video_audio_url)
}else{
this.video_audio_url = []
}
if (this.dataForm.imgUrl && this.dataForm.imgUrl != "") {
var img = {
name: "",
@@ -265,9 +353,11 @@ export default {
content: this.dataForm.content,
sort: this.dataForm.sort,
isAudition: this.dataForm.isAudition,
videoList:this.video_audio_url,
})
}).then(({ data }) => {
if (data && data.code === 0) {
// this.video_audio_url = []
this.$message({
message: "操作成功",
type: "success",
@@ -303,7 +393,8 @@ export default {
console.log(file);
},
handlereset() {
(this.fileList = []), (this.fileListNovel = []), (this.visible = false);
// this.video_audio_url = []
(this.fileList = []), (this.fileListNovel = []), (this.visible = false),(this.video_audio_url = []);
},
handlePreview(file) {
console.log(file);
@@ -343,3 +434,11 @@ export default {
}
};
</script>
<style lang="less" scoped>
.flexbox {
display: flex;
}
.videoBox { width: 100%;
margin-bottom: 15px; align-items: center;
}
</style>

View File

@@ -45,6 +45,43 @@
<img width="100%" :src="dataForm.image" alt="" />
</el-dialog>
</el-form-item>
<div v-if="relationProducts && relationProducts.length > 0" style="margin-bottom:20px">
<el-table
:data="relationProducts"
border
style="width: 100%;"
>
<el-table-column
prop="productName"
header-align="center"
align="center"
label="商品名"
>
</el-table-column>
<el-table-column
label="课程图"
header-align="center"
align="center"
width="100"
>
<template slot-scope="scope">
<div
v-if="scope.row.productImages"
style="width:100%;display: flex;
align-items: center;justify-content: center;"
>
<img :src="scope.row.productImages" alt="" width="40px" height="40px" />
</div>
</template>
</el-table-column>
<el-table-column width="100px">
<template slot-scope="scope">
<el-button plain type="danger" size="mini" @click="delPro(scope.$index)">删除</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div style="text-align:center; margin-bottom:15px" ><el-button @click="showProTable" size="mini" type="primary">添加关联书籍</el-button></div>
<el-form-item label="课程介绍" prop="sort" style="margin-bottom: 140px;">
<div style="height: calc(620px - 120px)">
<el-upload
@@ -112,7 +149,7 @@ const toolbarOptions = [
export default {
components: {
quillEditor
},
},
data() {
return {
editorOption: {
@@ -140,6 +177,7 @@ export default {
},
placeholder: "请输入正文"
},
relationProducts :[],
baseUrl: global.baseUrl,
visible: false,
bookList: [
@@ -228,6 +266,7 @@ export default {
// relationId:0,
},
splitsTypeList: [],
courseId:undefined,
dataRule: {
// name: [
// { required: true, message: '书名不能为空', trigger: 'blur' }
@@ -286,8 +325,23 @@ export default {
created() {},
mounted() {
// this.restaurants = this.loadAll();
this.$bus.$on("linkList", (data) => {
console.log('获得列表',data)
if(data && data.length > 0){
this.relationProducts = this.relationProducts.concat(data)
}
})
},
methods: {
delPro(i){
console.log('i',i)
// this.$emit('delPro',i)
this.relationProducts.splice(i,1)
console.log('处理后的',this.relationProducts)
},
showProTable(){
this.$emit('showProTable',true)
},
contentUploadSuccess(res, file) {
// console.log(res)
let quill = this.$refs.myQuillEditor.quill;
@@ -319,6 +373,7 @@ export default {
init(row) {
console.log("11111", row);
if (row && row.id) {
this.courseId = row.id
this.$http
.request({
url: this.$http.adornUrl(this.urlList.info),
@@ -337,7 +392,11 @@ export default {
if (res && res.data.code === 0) {
var data = res.data.course;
console.log("data at line 357:", data);
if(res.data.shopProductList && res.data.shopProductList.length > 0){
this.relationProducts = res.data.shopProductList
}else{
this.relationProducts = []
}
if (data.image != "" && data.image != null) {
var img = {
name: "",
@@ -365,6 +424,15 @@ export default {
// this.$message.error("请选择图书类型");
// return
// }
let _relationProductIds = ''
if(this.relationProducts.length > 0){
let _list = [...this.relationProducts]
_list = _list.map(item => item.productId)
_relationProductIds = _list.join()
// console.log(_relationProductIds, _list,'_relationProductIds')
}
// console.log(_relationProductIds, _list,'_relationProductIds')
this.$refs["dataForm"].validate(valid => {
if (valid) {
this.$http({
@@ -381,7 +449,8 @@ export default {
title: this.dataForm.title,
sort: this.dataForm.sort,
image: this.dataForm.image,
content: this.dataForm.content
content: this.dataForm.content,
relationProductIds : _relationProductIds
})
}).then(({ data }) => {
if (data && data.code === 0) {
@@ -391,6 +460,8 @@ export default {
duration: 1500,
onClose: () => {
this.visible = false;
this.relationProductIds = []
this.relationProducts = []
this.$emit("refreshDataList");
}
});
@@ -429,6 +500,9 @@ export default {
},
handlereset() {
(this.fileList = []), (this.fileListNovel = []), (this.visible = false);
this.$emit('pclose')
this.relationProducts = []
this.courseId = undefined
},
handlePreview(file) {
console.log(file);

View File

@@ -31,6 +31,12 @@
align="center"
label="目录名称"
>
<template slot-scope="scope">
<div>
<span style="font-weight:bold; font-size:16px">{{ scope.row.title }}</span><br>
<span style="color:#999">( 创建时间{{ scope.row.createTime}} )</span>
</div>
</template>
</el-table-column>
<el-table-column
prop="sort"
@@ -77,7 +83,14 @@
</div>
</template>
</el-table-column>
<el-table-column
prop="buyPeoples"
header-align="center"
align="center"
label="购买人数"
width="80"
>
</el-table-column>
<el-table-column
prop="sort"
header-align="center"
@@ -142,6 +155,9 @@
@click.native="handleCreateProduct(scope.row.id)"
>创建商品</el-dropdown-item
>
<el-dropdown-item @click.native="migrate(scope.row)"
>迁移本部</el-dropdown-item
>
</el-dropdown-menu>
</el-dropdown>
</div>
@@ -158,6 +174,11 @@
ref="addOrUpdate"
@refreshDataList="getDataList"
></add-or-update>
<move-course
v-if="drawerVisible" :catalogueId="catalogueId" :catalogueTitle = "catalogueTitle"
ref="moveCourse"
@mycloseDrawer="mycloseDrawer"
></move-course>
<price
v-if="priceVisible"
ref="priceUpdate"
@@ -167,6 +188,7 @@
</template>
<script>
import moveCourse from "./moveCourse.vue";
import AddOrUpdate from "./catalogue-add-or-update";
import price from "./catalogue-price";
export default {
@@ -181,6 +203,7 @@ export default {
sociologyId: "",
keywords: ""
},
drawerVisible: false,
dataList: [],
delFlag: false,
pageIndex: 1,
@@ -192,12 +215,16 @@ export default {
priceVisible: false,
urlList: {
createProduct: "/master/course/createProductForCatalogue"
}
},
catalogueId:null, // 操作的目录id,
courseId:null, // 勾选的课程id,
catalogueTitle:'' //迁移的课程名称
};
},
components: {
AddOrUpdate,
price
price,
moveCourse
},
activated() {
this.courseid = this.$route.query.id;
@@ -234,6 +261,30 @@ export default {
this.dataListLoading = false;
});
},
mycloseDrawer(val) {
console.log("999999", val);
this.drawerVisible = false;
this.getDataList();
},
migrate(item) {
// 课程迁移
// console.log(item);
// this.$confirm("您正在进行课程迁移操作, 是否继续?", "提示", {
// confirmButtonText: "确定",
// cancelButtonText: "取消",
// type: "warning"
// })
// .then(() => {
this.catalogueId = item.id
this.catalogueTitle = item.title
this.drawerVisible = true;
this.$nextTick(() => {
this.$refs["moveCourse"].getDataList();
});
// })
// .catch(() => {});
},
// 每页数
sizeChangeHandle(val) {
this.pageSize = val;
@@ -258,7 +309,7 @@ export default {
});
},
handleCreateProduct(id) {
console.log('id at line 260:', id)
console.log("id at line 260:", id);
this.$http
.request({
url: this.$http.adornUrl(`${this.urlList.createProduct}`),

View File

@@ -32,6 +32,12 @@
align="center"
label="章节名称"
>
<template slot-scope="scope">
<div>
<span style="font-weight:bold; font-size:16px">{{ scope.row.title }}</span><br>
<!-- <span style="color:#999">( 创建时间{{ scope.row.createTime}} )</span> -->
</div>
</template>
</el-table-column>
<el-table-column

View File

@@ -67,6 +67,12 @@
align="center"
label="课程名"
>
<template slot-scope="scope">
<div>
<span style="font-weight:bold; font-size:16px">{{ scope.row.title }}</span><br>
<span style="color:#999">( 创建时间{{ scope.row.createTime}} )</span>
</div>
</template>
</el-table-column>
<!-- <el-table-column prop="authorName" header-align="center" align="center" label="作者姓名">
@@ -163,10 +169,7 @@
width="600"
>
<template slot-scope="scope">
<div
style=" "
v-if="scope.row.courseCatalogueEntityList.length == 0"
>
<div style=" " v-if="scope.row.courseCatalogueEntityList.length == 0">
该课程还未添加目录
</div>
<div
@@ -183,7 +186,6 @@
>
<div
style="width: 90px;float: left;font-weight: 800;border: 1px solid #bbbb; border-radius: 4px;line-height: 30px;"
>
<!-- <el-tag type="success" > -->
{{ v.title }}
@@ -198,10 +200,13 @@
}px);float: right;`
"
>
<div v-if="v.productList.length==0">
暂未关联商品
</div>
<div v-for="(item, i) in v.productList" v-if="v.productList.length>0">
<div v-if="v.productList.length == 0">
暂未关联商品
</div>
<div
v-for="(item, i) in v.productList"
v-if="v.productList.length > 0"
>
{{ item.productName }}
<span style="color: #ff5b36;"
>{{
@@ -252,7 +257,7 @@
fixed="right"
header-align="center"
align="center"
width="160"
width="240"
label="操作"
>
<template slot-scope="scope">
@@ -306,6 +311,9 @@
@click="addOrUpdateHandle(scope.row)"
>修改</el-button
>
<el-button type="text" size="small" @click="showLinkTags(scope.row)"
>查看引用</el-button
>
<el-button
type="text"
size="small"
@@ -331,12 +339,60 @@
<add-or-update
v-if="addOrUpdateVisible"
ref="addOrUpdate"
:relationProducts = relationProducts
@pclose = "pclose"
@showProTable = "showProTable"
@refreshDataList="getDataList"
></add-or-update>
<commonShopTable
ref="commonShopTable"
:currentId="courseId"
currentType="courseLinkPro"
@linkList="linkList"
></commonShopTable>
<el-dialog
title="课程引用一览"
:visible.sync="resListVisible"
width="60%"
@close="closeLink"
>
<div>
<div v-if="resList.length > 0">
<div style="margin-bottom:20px">当前课程共有 {{resList.length}} 个标签引用</div>
<div v-for="(item, index) in resList" :key="index">
{{index + 1}} {{ item.title }}
<span v-if="item.isLast != 1">
<span v-for="(item1, index1) in item.children" :key="index1"
> > {{ item1.title }}
<span v-if="item1.isLast != 1">
<span
v-for="(item2, index2) in item1.children"
:key="index2"
> > {{ item2.title }}
<span v-if="item2.isLast != 1">
<span
v-for="(item3, index3) in item2.children"
:key="index3"
> > {{ item3.title }}</span
>
</span>
</span>
</span>
</span>
</span>
</div>
</div>
<div v-else>这门课程还没有被标签引用哦~</div>
</div>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="closeLink"> </el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import commonShopTable from "./shopproductTable.vue";
import AddOrUpdate from "./course-add-or-update";
export default {
data() {
@@ -359,9 +415,11 @@ export default {
children: []
}
],
courseId:"0",
dataForm: {
key: ""
key: "",
},
relationProducts:[],
query: {
type: "",
categoryId: "",
@@ -379,11 +437,14 @@ export default {
urlList: {
medicalList: "/master/courseMedical/getCourseMedicalList", //医学
sociologyList: "/master/courseSociology/getCourseSociologyList" //国学
}
},
resList: [],
resListVisible: false
};
},
components: {
AddOrUpdate
AddOrUpdate,
commonShopTable
},
activated() {
if (this.$route.query.upPageInde != null) {
@@ -395,6 +456,53 @@ export default {
this.getTreeList(this.urlList.sociologyList, 2);
},
methods: {
delPro(val){
console.log(val,this.relationProducts)
let list = this.relationProducts
this.relationProducts = list.slice(1,1)
},
pclose(){
this.relationProducts = []
this.courseId = null
console.log('关闭了 ')
},
linkList(data){
console.log('父级',data)
if(data && data.length > 0){
this.relationProducts = data
}
},
showProTable(data){
console.log('data',data)
this.$nextTick(() => {
this.$refs.commonShopTable.open();
});
},
closeLink() {
this.resListVisible = false;
this.resList = [];
},
showLinkTags(row) {
this.$http({
url: this.$http.adornUrl("/master/course/getCourseLableLinkList"),
method: "post",
data: this.$http.adornData({
courseId: row.id
})
}).then(res => {
this.resListVisible = true;
if (res.data.code == 0 && res.data.resList.length > 0) {
this.resList = res.data.resList;
}
// console.log(row, "row" , res.data.resList,this.resList);
});
},
handleChange(value) {
console.log(value, "989999999");
},
@@ -424,6 +532,7 @@ export default {
},
// 获取数据列表
getDataList() {
this.relationProducts = []
var data = {
page: this.pageIndex,
limit: this.pageSize,
@@ -485,7 +594,9 @@ export default {
},
// 新增 / 修改
addOrUpdateHandle(row) {
this.addOrUpdateVisible = true;
this.addOrUpdateVisible = true;
row ? this.courseId = row.id : ''
// this.courseId = row.id
this.$nextTick(() => {
this.$refs.addOrUpdate.init(row);
});

View File

@@ -17,7 +17,7 @@
<span v-else>普通</span>
</template>
</el-table-column>
<el-table-column prop="createTime" header-align="center" align="center" label="上传时间">
</el-table-column>
<el-table-column prop="video" header-align="center" align="center" label="视频">
@@ -25,6 +25,23 @@
<img v-if="scope.row.imgUrl != ''" :src="scope.row.imgUrl" width="70" height="100" class="tableImg" />
</template> -->
</el-table-column>
<el-table-column
prop="sort"
width="130"
header-align="center"
align="center"
label="排序( 双击修改 )"
>
<template slot-scope="scope">
<div class="paixu" @dblclick="myDbClick(scope.row)">
<span v-show="!scope.row.isEdit">{{scope.row.sort}}</span>
<div class="inputBox" v-show="scope.row.isEdit">
<el-input @keyup.enter.native="changeSort(scope.row)" min="0" @blur="changeSort(scope.row)" v-model.number="scope.row.sort" ></el-input>
<el-tag type="danger" size="mini" @click="cancelBtn(scope.row)">×</el-tag>
</div>
</div>
</template>
</el-table-column>
<!-- <el-table-column prop="content" header-align="center" align="center" label="内容">
</el-table-column> -->
@@ -71,7 +88,8 @@ export default {
totalPage: 0,
dataListLoading: false,
dataListSelections: [],
addOrUpdateVisible: false
addOrUpdateVisible: false,
oldSort:0,
}
},
components: {
@@ -90,6 +108,43 @@ export default {
this.getDataList()
},
methods: {
cancelBtn(row){
row.isEdit = false
this.oldSort = 0
if(row.sort == ""){row.sort = 0}
},
changeSort(row){ // 确认排序
if(this.oldSort == row.sort) {return}
if(row.sort == ""){row.sort = 0}
row.isEdit = false
// console.log(row)
// return false
this.$http({
url: this.$http.adornUrl('/master/course/editCourseCatalogueChapterVideo'),
method: 'post',
data: this.$http.adornData({
"id": row.id,
'chapterId': row.chapterId,
'type': row.type,
"video": row.video,
// "content": this.dataForm.content,
"sort": row.sort,
})
})
.then(({ data }) => {
if(data.code == 0 && data.msg == "success"){
this.getDataList()
this.oldSort = 0
// console.log(this.oldSort,'复原')
}
});
},
myDbClick(row){ // 双击修改排序
this.oldSort = row.sort
console.log(this.oldSort,88888888)
row.isEdit = true
},
// 获取数据列表
getDataList() {
this.dataListLoading = true
@@ -107,6 +162,10 @@ export default {
})
}).then(({ data }) => {
if (data && data.code === 0 && data.page && data.page.records) {
var list = data.page.records
list.forEach(item => {
item.isEdit = false
});
this.dataList = data.page.records
this.totalPage = data.page.total
} else {
@@ -255,3 +314,9 @@ export default {
}
}
</script>
<style lang="less" scoped>
.paixu{cursor: pointer;}
.inputBox{display: flex; align-items:center;
.el-input{margin-right: 5px;}
}
</style>

View File

@@ -116,6 +116,7 @@
:action="baseUrl + '/oss/fileoss'"
:on-remove="audioHandleRemove"
:on-success="audioUploadSuccess"
:before-upload="onprogress"
accept=".mp3"
:limit="1"
:file-list="audioFileList"
@@ -611,6 +612,9 @@ export default {
this.getDataList();
},
methods: {
onprogress(){
this.$message('上传中,请勿关闭或进行其他操作');
},
audioHandleRemove(file, fileList) {
console.log(file, fileList);
this.audioFileList = []
@@ -619,6 +623,7 @@ export default {
audioUploadSuccess(res, file) {
this.audioFileList = []
this.audioFileList.push(file)
this.$message.success('上传成功');
console.log(this.audioFileList,res, "上传成功");
this.addForm.media = res.url

View File

@@ -0,0 +1,288 @@
<template>
<el-drawer
ref="drawer"
title="课程迁移"
:visible.sync="drawerVisible"
direction="rtl"
:before-close="drawerHandleClose"
>
<!-- ------------------------- -->
<div style="padding:15px">
<el-form
:inline="true"
:model="dataForm"
@keyup.enter.native="getDataList()"
>
<div style="display:flex;align-items:end">
<el-form-item label="课程名称">
<el-input
v-model="query.courseName"
placeholder="课程名称"
clearable
></el-input>
</el-form-item>
<el-form-item label="平台分类">
<el-cascader
clearable
:props="{
label: 'title',
value: 'id',
checkStrictly: true
}"
v-model="selectType"
:options="options"
>
</el-cascader>
</el-form-item>
<el-form-item label=" ">
<el-button
type="primary"
@click="
pageIndex = 1;
getDataList();
"
>查询</el-button
>
<!-- <el-button type="primary" @click="addOrUpdateHandle()"
>新增</el-button
> -->
</el-form-item>
</div>
</el-form>
<el-table
:data="dataList"
border
v-loading="dataListLoading"
style="width: 100%;"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55"> </el-table-column>
<el-table-column
prop="title"
header-align="center"
align="center"
label="课程名"
>
<template slot-scope="scope">
<div>
<span>{{ scope.row.title }}</span>
<!-- <el-tooltip placement="bottom" effect="light">
<div slot="content">多行信息<br />第二行信息多行信息<br />第二行信息多行信息<br />第二行信息多行信息第二行信息多行信息第二行信息</div>
<i
class="el-icon-paperclip"
style=" color:#17B3A3; margin-left:15px"
></i>
</el-tooltip> -->
</div>
</template>
</el-table-column>
</el-table>
<el-pagination
@size-change="sizeChangeHandle"
@current-change="currentChangeHandle"
:current-page="pageIndex"
:page-sizes="[10, 20, 50, 100]"
:page-size="pageSize"
:total="totalPage"
style="padding: 30px 0; text-align: center;"
layout="total, sizes, prev, pager, next, jumper"
>
</el-pagination>
<div style="text-align:center">
<el-button type="primary" @click="moveCourseBtn"> </el-button>
</div>
</div>
<!-- ----------------------------- -->
</el-drawer>
</template>
<script>
export default {
props: ["catalogueId","catalogueTitle"],
data() {
return {
drawerVisible: true,
selectType: [],
options: [
{
id: "all",
title: "全部",
children: undefined
},
{
id: 1,
title: "医学",
children: []
},
{
id: 2,
title: "国学",
children: []
}
],
dataForm: {
key: ""
},
multipleSelection: [],
query: {
type: "",
categoryId: "",
sociologyId: "",
courseName: ""
},
dataList: [],
delFlag: false,
pageIndex: 1,
pageSize: 10,
totalPage: 0,
dataListLoading: false,
dataListSelections: [],
addOrUpdateVisible: false,
urlList: {
medicalList: "/master/courseMedical/getCourseMedicalList", //医学
sociologyList: "/master/courseSociology/getCourseSociologyList" //国学
}
};
},
methods: {
init() {},
drawerHandleClose() {
this.$emit("mycloseDrawer", "drawer");
},
handleSelectionChange(val) {
if (val.length > 1) {
this.$message.error("只可以选择一门课程进行迁移哦~");
} else {
this.multipleSelection = val;
}
console.log(22, this.multipleSelection);
},
moveCourseBtn() {
if (this.multipleSelection.length == 0) {
this.$message.error("请选择您要迁移的目标课程!");
} else if (this.multipleSelection.length > 1) {
this.$message.error("只可以选择一门课程进行迁移哦~");
} else {
this.$confirm(
`${this.catalogueTitle}目录 即将迁移到 ${this.multipleSelection[0].title}课程内, 是否继续?`,
{
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}
).then(() => {
if(!this.catalogueId){
this.$message.error('请重新选择您要转移的课程目录')
return
}
// console.log(this.catalogueId, this.multipleSelection[0].id)
// 走接口 并关闭
this.$http
.request({
url: this.$http.adornUrl(
`/master/course/courseCatalogueTransfer`
),
method: "POST",
data: {
courseId: this.multipleSelection[0].id, //新课程id
catalogueId: this.catalogueId //目录id
},
header: {
//默认 无 说明:请求头
"Content-Type": "application/json"
}
})
.then(res => {
console.log("********:", res);
this.$message.success('操作成功')
this.drawerHandleClose()
}).catch(()=>{
this.$message.error('操作失败')
});
// this.$nextTick(() => {
// this.$refs["moveCourse"].getDataList();
// });
});
}
},
// checkSelectable(row){
// return row.auditStatus === '0'
// console.log(row,'row')
// },
// 获取数据列表
getDataList() {
var data = {
page: this.pageIndex,
limit: this.pageSize,
courseName: this.query.courseName //关键字
};
if (this.selectType.length == 0) {
data.type = 0;
data.medicalId = "";
data.sociologyId = "";
} else if (this.selectType.length >= 1) {
data.type = this.selectType[0] == "all" ? 0 : this.selectType[0];
if (this.selectType.length == 1) {
data.medicalId = "";
data.sociologyId = "";
}
if (this.selectType.length > 1) {
if (this.selectType[0] == 1) {
data.medicalId = this.selectType[this.selectType.length - 1];
data.sociologyId = "";
}
if (this.selectType[0] == 2) {
data.medicalId = "";
data.sociologyId = this.selectType[this.selectType.length - 1];
}
}
}
this.dataListLoading = true;
this.$http({
url: this.$http.adornUrl("/master/course/getCourseList"),
method: "post",
data: this.$http.adornData(data)
}).then(({ data }) => {
if (data && data.code === 0) {
this.dataList = data.page.records;
this.totalPage = data.page.total;
} else {
this.dataList = [];
this.totalPage = 0;
}
this.dataListLoading = false;
});
},
// 每页数
sizeChangeHandle(val) {
this.pageSize = val;
this.pageIndex = 1;
this.getDataList();
},
// 当前页
currentChangeHandle(val) {
this.pageIndex = val;
this.getDataList();
},
// 多选
selectionChangeHandle(val) {
this.dataListSelections = val;
}
// 新增 / 修改
// addOrUpdateHandle(row) {
// this.addOrUpdateVisible = true;
// this.$nextTick(() => {
// this.$refs.addOrUpdate.init(row);
// });
// }
}
};
</script>
<style></style>

View File

@@ -0,0 +1,361 @@
<template>
<div>
<el-drawer title="新增关联商品" v-if="drawer" :wrapperClosable="false" :visible.sync="drawer" :before-close="handleClose" destroy-on-close
direction="rtl" size="70%">
<div class="shop_drawer_box demo-drawer__content">
<div class="addFormBox">
<el-form ref="addForm" label-width="80px" :model="dataForm">
<el-form-item label="商品名称" prop="keywords" class="form_item">
<el-input size="small" placeholder="请输入商品名称" style="width: 100%" v-model="dataForm.keywords" clearable>
</el-input>
</el-form-item>
<el-form-item label="商品类型" prop="type" class="form_item">
<el-select size="small" v-model="dataForm.type" placeholder="请选择" style="width: 100%" clearable>
<el-option v-for="item in goodsTypeList" :key="item.dictType" :label="item.dictValue"
:value="item.dictType">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="" class="form_item" label-width="20px" style="width: 160px !important">
<el-button type="primary" plain @click="
pageIndex = 1;
getDataList(bookMarketId);
" size="small">查询</el-button>
<el-button @click="handleReset()" size="small" plain>重置</el-button>
</el-form-item>
</el-form>
</div>
<el-table ref="table" height="80%" :data="dataList" :row-key="getRowKeys" border size="mini"
v-loading="dataListLoading" @selection-change="handleSelectionChange" style="width: 100%">
<!-- <el-table-column :reserve-selection="true" type="selection" header-align="center" align="center" width="50">
</el-table-column> -->
<!-- -->
<el-table-column label="商品ID" width="70" align="center" prop="productId">
<!-- <template slot-scope="scope">
{{ (pageIndex - 1) * pageSize + scope.$index + 1 }}
</template> -->
</el-table-column>
<el-table-column prop="productName" header-align="center" align="center" label="商品名称">
</el-table-column>
<el-table-column prop="price" width="120" header-align="center" align="center" sortable label="价格">
</el-table-column>
<el-table-column prop="activityPrice" width="120" header-align="center" align="center" sortable label="活动价">
</el-table-column>
<el-table-column prop="productStock" width="120" header-align="center" align="center" sortable label="库存">
</el-table-column>
<el-table-column header-align="center" align="center" label="商品图" width="120">
<template slot-scope="scope">
<img v-if="scope.row.productImages != ''" :src="scope.row.productImages" width="25" height="35"
class="tableImg" />
</template>
</el-table-column>
<el-table-column prop="productStock" width="120" header-align="center" align="center" sortable label="操作">
<template slot-scope="scope">
<el-button type="primary" plain size="mini" @click="addLink(scope.row, scope.$index)">添加</el-button>
</template>
</el-table-column>
</el-table>
<el-pagination @size-change="sizeChangeHandle" @current-change="currentChangeHandle" :current-page="pageIndex"
:page-sizes="[10, 20, 50, 100]" :page-size="pageSize" :total="totalPage"
layout="total, sizes, prev, pager, next, jumper">
</el-pagination>
<!-- <div class="demo-drawer__footer">
<div style="float: right; margin-top: 20px">
<el-button @click="close" size="small"> </el-button>
<el-button type="primary" @click="submit" :loading="loading" size="small">{{ loading ? "提交中 ..." : "确 定"
}}</el-button>
</div>
</div> -->
<!-- 弹窗, 新增 / 修改 -->
<!-- <add-or-update v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="getDataList" @showchooseBookf = "showchooseBookf"></add-or-update>
<choose-book v-if="chooseBookVisible" :bookIds = bookIds ref="chooseBook" :chooseBookVisible = chooseBookVisible @closeBookf = "closeBookf"></choose-book> -->
</div>
</el-drawer>
</div>
</template>
<script>
// import chooseBook from './chooseBook.vue'
// import AddOrUpdate from './shopproduct-add-or-update'
export default {
props: ["currentType", "currentId"],
data() {
return {
timer: null,
drawer: false,
loading: false,
multipleSelectionAll: [], // 所有选中的数据包含跨页数据
multipleSelection: [], // 当前页选中的数据
idKey: "productId", // 标识列表数据中每一行的唯一键的名称(需要按自己的数据改一下)
dataForm: {
type:'00'
},
bookMarketId: null,
dataList: [],
publishStatus: false,
pageIndex: 1,
pageSize: 10,
totalPage: 0,
dataListLoading: false,
dataListSelections: [],
addOrUpdateVisible: false,
chooseBookVisible: false,
bookIds: [],
goodsTypeList: [],
linkList:[]
};
},
components: {
// AddOrUpdate,
// chooseBook
},
activated() {
this.getDataList();
},
methods: {
addLink(row,i){
// 添加商品绑定
this.linkList.push(row)
console.log('linkList',this.linkList)
this.dataList.splice(i,1)
// this.getDataList()
},
handleReset() {
this.dataForm = {
type:'00'
};
this.pageIndex = 1;
this.getDataList();
},
submit() {
// var ids = this.multipleSelection.map((e) => e.productId).toString(",");
// this.$emit("submit", ids);
// console.log(
// "🚀 ~ submit ~ this.multipleSelection:",
// this.multipleSelection
// );
// this.drawer = false;
},
// 获取商品类型
getGoodsTypeList() {
this.$http({
url: this.$http.adornUrl("/book/sysdictdata/selectByType/goodsType"),
method: "get",
}).then(({ data }) => {
// console.log(data.dataList)
this.goodsTypeList = data.dataList;
});
},
handleClose(done) {
this.$bus.$emit("linkList", this.linkList );
this.linkList = []
// this.$emit("linkList", this.linkList)
done();
},
async open() {
this.drawer = true;
this.dataForm = {
type:'00'
};
this.pageIndex = 1;
await this.getGoodsTypeList();
await this.getDataList();
},
close() {
this.drawer = false;
},
getRowKeys(row) {
return row.productId;
},
handleSelectionChange(val) {
console.log("🚀 ~ handleSelectionChange ~ val:", val);
// table组件选中事件,记得加上@selection-change="handleSelectionChange"
this.multipleSelection = val;
// this.changePageCoreRecordData();
},
closeBookf() {
this.chooseBookVisible = false;
},
showchooseBookf(e) {
// 显示图书列表
this.chooseBookVisible = true;
// console.log(this.bookIds,'this.bookIds')
// this.$nextTick(() => {
// this.$refs.chooseBook.getBookList()
// this.bookIds = e.bookIds
// })
},
// 获取数据列表
async getDataList() {
var form = {
...this.dataForm,
keywords:this.dataForm.keywords ? this.dataForm.keywords : '',
page: this.pageIndex,
limit: this.pageSize,
id: this.currentId
// productId: "",
};
this.dataListLoading = true;
this.clear();
// let _url = "/master/shopProduct/listByPage"
// await this.$http({
// url: this.$http.adornUrl(_url),
// method: "post",
// data: {
// "current": form.page,
// "limit": form.limit,
// "productName": form.keywords,
// "goodsType": form.type
// },
// header: {
// //默认 无 说明:请求头
// "Content-Type": "application/json"
// }
// })
await this.$http({
url: this.$http.adornUrl(`/master/course/getProductListForCourse`),
method: "post",
data: this.$http.adornData({
"page": form.page,
"limit": form.limit,
"productName": form.keywords,
"goodsType": form.type,
"courseId": form.id
}),
})
.then(({ data }) => {
if (data && data.code === 0) {
this.dataList = data.shopProductListhopProducts.records;
this.totalPage = data.shopProductListhopProducts.total;
} else {
this.dataList = [];
this.totalPage = 0;
}
this.dataListLoading = false;
});
},
clear() {
// this.$refs.table.clearSelection();
this.multipleSelection = [];
},
// 每页数
sizeChangeHandle(val) {
// this.changePageCoreRecordData();
this.pageSize = val;
this.pageIndex = 1;
this.getDataList();
},
// 当前页
currentChangeHandle(val) {
// 改变页的时候调用一次
// this.changePageCoreRecordData();
this.pageIndex = val;
this.getDataList();
},
// 多选
selectionChangeHandle(val) {
this.dataListSelections = val;
},
// 新增 / 修改
addOrUpdateHandle(id) {
this.addOrUpdateVisible = true;
this.$nextTick(() => {
this.$refs.addOrUpdate.init(id);
});
},
// 删除
deleteHandle(id) {
var ids = id
? [id]
: this.dataListSelections.map((item) => {
return item.productId;
});
this.$confirm(
`确定对[id=${ids.join(",")}]进行[${id ? "删除" : "批量删除"}]操作?`,
"提示",
{
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}
).then(() => {
this.$http({
url: this.$http.adornUrl("/book/shopproduct/delete"),
method: "post",
data: this.$http.adornData(ids, false),
}).then(({ data }) => {
if (data && data.code === 0) {
this.$message({
message: "操作成功",
type: "success",
duration: 1500,
onClose: () => {
this.getDataList();
},
});
} else {
this.$message.error(data.msg);
}
});
});
},
SwitchChange(event) {
/*点击时他会自动把你绑定的值变更,直接去请求数据就可以了*/
var parms = {
publishStatus: event.publishStatus,
productId: event.productId,
};
// console.log(parms)
this.$http({
url: this.$http.adornUrl("/book/shopproduct/update"),
method: "post",
data: parms,
})
.then((res) => {
this.$message({
message: "成功",
type: "success",
});
this.loading = false;
this.getDataList();
})
.catch((error) => {
this.loading = false;
console.log(error);
});
console.log(event);
},
},
};
</script>
<style lang="less" scoped>
.shop_drawer_box {
padding: 20px !important;
box-sizing: border-box;
width: 100%;
height: 100%;
}
.addFormBox {
width: 100%;
// overflow: hidden;
.form_item {
width: 33%;
float: left;
}
}
::v-deep.el-drawer__header {
margin-bottom: 10px !important;
}
</style>

View File

@@ -450,6 +450,7 @@ export default {
this.$message.error("请输入标签名称");
return false;
}
this.addForm.content = ''
await this.$refs[formName].validate(async valid => {
if (valid) {
await this.$http({

View File

@@ -84,6 +84,10 @@
{
dictType: 1,
dictValue: "加密"
},
{
dictType: 2,
dictValue: "mp3"
}
],
props: {

View File

@@ -13,10 +13,10 @@
:disabled="dataListSelections.length <= 0">批量删除</el-button> -->
</el-form-item>
</el-form>
<el-table :data="dataList" border v-loading="dataListLoading" @selection-change="selectionChangeHandle"
<el-table :data="dataList" border v-loading="dataListLoading"
style="width: 100%;">
<el-table-column type="selection" header-align="center" align="center" width="50">
</el-table-column>
<!-- <el-table-column type="selection" header-align="center" align="center" width="50">
</el-table-column> -->
<!-- <el-table-column label="序号" width="70" align="center">
<template slot-scope="scope">
{{ (pageIndex - 1) * pageSize + scope.$index + 1 }}
@@ -29,14 +29,21 @@
label="用户ID">
</el-table-column>
<el-table-column prop="name" header-align="center" align="center" label="姓名">
<template slot-scope="scope">
<span>{{scope.row.name ? scope.row.name : '暂无用户名'}}</span>-
<span v-if="scope.row.vip == 0">普通用户</span>
<span v-else-if="scope.row.vip == 2">吴门医述VIP</span>
<span v-else-if="scope.row.vip == 1">超级VIP</span>
<span v-else-if="scope.row.vip == 3">众妙之门VIP</span>
</template>
</el-table-column>
<!-- <el-table-column prop="age" header-align="center" align="center" label="年龄">
</el-table-column> -->
<el-table-column prop="sex" header-align="center" align="center" label="性别">
<!-- <el-table-column prop="sex" header-align="center" align="center" label="性别">
<template slot-scope="scope">
<span v-if="scope.row.sex == 0">女</span><span v-if="scope.row.sex == 1">男</span><span v-if="scope.row.sex == 2">保密</span>
</template>
</el-table-column>
</el-table-column> -->
<el-table-column prop="avatar" header-align="center" align="center" label="头像">
<template slot-scope="scope">
<img v-if="scope.row.avatar && scope.row.avatar != ''" :src="scope.row.avatar" width="50" height="50" class="tableImg" />
@@ -76,10 +83,10 @@
align="center"
label="阅读时间">
</el-table-column> -->
<el-table-column prop="lastLoginTime" header-align="center" align="center" label="最后登录时间">
<!-- <el-table-column prop="lastLoginTime" header-align="center" align="center" label="最后登录时间">
</el-table-column>
<el-table-column prop="createTime" header-align="center" align="center" label="创建时间">
</el-table-column>
</el-table-column> -->
<!-- <el-table-column prop="updateTime" header-align="center" align="center" label="更新时间">
</el-table-column> -->
<!-- <el-table-column
@@ -97,7 +104,7 @@
更多操作<i class="el-icon-arrow-down el-icon--right"></i>
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item><el-button type="text" size="small" @click="ck(scope.row)">/扣天医币</el-button></el-dropdown-item>
<el-dropdown-item><el-button type="text" size="small" @click="ck(scope.row)">/扣天医币</el-button></el-dropdown-item>
<el-dropdown-item>
<router-link :to="{ path: 'user-point-memery', query: {'tel':scope.row.tel, 'id':scope.row.id} }">
<el-button type="text" size="small">/扣天医币记录</el-button>
@@ -105,6 +112,13 @@
</el-dropdown-item>
<el-dropdown-item><el-button type="text" size="small" @click="youhui(scope.row)">优惠券列表</el-button></el-dropdown-item>
<el-dropdown-item><el-button type="text" size="small" @click="resetPassword(scope.row)">修改密码</el-button></el-dropdown-item>
<el-dropdown-item>
<router-link :to="{ path: '/userCourse', query: {id:scope.row.id} }">
<el-button type="text" size="small">
用户课程管理
</el-button>
</router-link>
</el-dropdown-item>
<!-- <el-dropdown-item divided>蚵仔煎</el-dropdown-item> -->
</el-dropdown-menu>
</el-dropdown>
@@ -232,6 +246,10 @@
this.getcourpeList()
},
methods: {
// 用户课程
userCourse(val){
},
// 获取数据列表
getDataList() {
this.dataListLoading = true

View File

@@ -0,0 +1,453 @@
<template>
<div class="mod-config">
<el-form
:inline="true"
:model="dataForm"
@keyup.enter.native="getDataList()"
>
<el-form-item>
<el-button @click="showAddD" type="primary">开通课程</el-button>
</el-form-item>
<el-form-item>
<el-input v-model="dataForm.key" placeholder="请输入课程名" clearable>
</el-input>
</el-form-item>
<el-form-item >
<el-button
@click="
pageIndex = 1;
getDataList();
"
>查询</el-button
>
</el-form-item>
<el-form-item style="float:right">
<div v-if="user.id" class="flexbox userInfo">
<div>用户信息{{ user.name }}{{ user.tel }}</div>
<div>
<span v-if="user.vip == 0">普通用户</span>
<span v-else-if="user.vip == 2">吴门医述VIP</span>
<span v-else-if="user.vip == 1">超级VIP</span>
<span v-else-if="user.vip == 3">众妙之门VIP</span>
</div>
</div>
</el-form-item>
</el-form>
<el-table
:data="dataList"
border
v-loading="dataListLoading"
style="width: 100%;"
>
<el-table-column
prop="title"
header-align="center"
align="center"
label="课程名"
>
</el-table-column>
<el-table-column
prop="catalogueName"
header-align="center"
align="center"
label="分部"
>
</el-table-column>
<el-table-column
prop="startTime"
header-align="center"
align="center"
label="开通时间"
>
</el-table-column>
<el-table-column
prop="endTime"
header-align="center"
align="center"
label="到期时间"
>
</el-table-column>
<!-- <el-table-column
fixed="right"
header-align="center"
align="center"
width="150"
label="操作"
>
<template slot-scope="scope"> </template>
</el-table-column> -->
</el-table>
<el-pagination
@size-change="sizeChangeHandle"
@current-change="currentChangeHandle"
:current-page="pageIndex"
:page-sizes="[10, 20, 50, 100]"
:page-size="pageSize"
:total="total"
layout="total, sizes, prev, pager, next, jumper"
>
</el-pagination>
<el-dialog
title="开通课程"
:close-on-click-modal="false"
:visible.sync="youVisible"
append-to-body
width="60%"
@close="dialogClose"
>
<el-form
:model="youForm"
label-width="100px"
ref="youForm"
:rules="youFormRule"
>
<el-form-item label="用户">
{{ user.tel }} <span v-if="user.name != ''">{{ user.name }}</span>
<span v-if="user.vip == 0">普通用户</span>
<span v-else-if="user.vip == 2">吴门医述VIP</span>
<span v-else-if="user.vip == 1">超级VIP</span>
<span v-else-if="user.vip == 3">众妙之门VIP</span>
</el-form-item>
<div class="flexbox">
<div>
<el-form-item label="课程名:" prop="courseId">
<el-select
v-model="youForm.courseId"
filterable
remote
reserve-keyword
placeholder="请输入课程名并选择您要添加的课程"
:remote-method="remoteMethod"
:loading="totalLaoding"
@change="selectChange"
>
<el-option
v-for="item in options"
:key="item.id"
:label="item.title"
:value="item.id"
>
</el-option>
</el-select>
<!-- <el-input v-model="youForm.key" placeholder="" clearable></el-input> -->
</el-form-item>
</div>
<div v-if="youForm.cate.length > 0" style="margin-left:20px">
<el-form-item
label="请选择开通的分部:"
label-width="150px"
prop="catalogueId"
>
<div v-for="(item, index) in youForm.cate"
:key="index">
<el-radio
v-model="youForm.catalogueId"
:label="item.id"
>{{ item.title }}</el-radio
>
</div>
</el-form-item>
</div>
</div>
<el-form-item label="开通时长:" v-if="youForm.courseId" prop="days">
<el-select v-model="youForm.days" placeholder="请选择开通时长">
<el-option
v-for="item in timeOptions"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogClose">取消</el-button>
<el-button @click="submit" type="primary">确认开通</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
// import AddOrUpdate from './user-add-or-update'
export default {
data() {
return {
dataForm: {
key: ""
},
userId: this.$route.query.id,
user: {},
pointFormRules: {
pointAmount: [
{ required: true, message: "请输入金额", trigger: "blur" }
],
pointType: {
required: true,
message: "请选择操作类型",
trigger: "blur"
}
},
youFormRule: {
catalogueId: [
{ required: true, message: "请选择开通的分部", trigger: "blur" }
],
days: [{ required: true, message: "请选择开通时长", trigger: "blur" }]
},
options: [],
timeOptions: [
// 开通时长
{
value: "30",
label: "一个月"
},
{
value: "60",
label: "两个月"
},
{
value: "90",
label: "三个月"
},
{
value: "120",
label: "四个月"
},
{
value: "150",
label: "五个月"
},
{
value: "180",
label: "六个月"
},
{
value: "365",
label: "一年"
},
{
value: "730",
label: "两年"
}
],
dataList: [],
pageIndex: 1,
pageSize: 10,
totalPage: 0,
total: 0,
totalLaoding: false,
dataListLoading: false,
dataListSelections: [],
youVisible: false,
youForm: {
courseId: null,
cate: [],
catalogueId: null,
days: ""
}
};
},
components: {
// AddOrUpdate
},
created() {
console.log(this.$route.query);
console.log(this.userId, "onsole.log(this.$route.query)");
this.init();
},
activated() {
// this.getDataList()
// this.getcourpeList()
},
methods: {
submit() {
console.log(this.youForm, "youForm");
this.$refs['youForm'].validate(valid => {
if (valid) {
let data = {
userId:this.userId,
...this.youForm
}
delete data.cate
console.log('data',data)
this.$http({
url: this.$http.adornUrl("/master/userManage/addUserCourseBuy"),
method: "post",
data: this.$http.adornData(data)
})
.then(({ data }) => {
this.$message.success('开课成功!')
this.getDataList()
this.dialogClose()
})
.catch(e => {
console.log("表单提交报错");
});
}
});
},
dialogClose() {
this.youVisible = false;
this.$nextTick(() => {
this.youForm.cate = [];
this.options = [];
this.$refs["youForm"].resetFields();
console.log(this.youForm, "youForm");
});
console.log(this.youForm, "youForm");
},
selectChange(val) {
// console.log('val',val)
console.log("options", this.options);
// const _obj = this.options.find(item => item.id == val);
// this.youForm.cate = _obj.courseCatalogueEntityList;
// console.log(this.youForm.cate, "this.youForm.cate");
this.getCate(val)
},
remoteMethod(query) {
console.log(query, "query", this.youForm.key);
// return false
if (this.youForm.key !== "") {
let data = {
// page: this.pageIndex,
// limit: this.pageSize,
title: query, //关键字
// medicalId: "",
// sociologyId: "",
// type: 0
};
this.totalLaoding = true;
this.$http({
url: this.$http.adornUrl("/master/userManage/courseAndChildrenList"),
method: "post",
data: this.$http.adornData(data)
}).then(({ data }) => {
if (data && data.code === 0) {
this.options = data.list;
} else {
this.options = [];
}
this.totalLaoding = false;
});
} else {
this.options = [];
this.totalLaoding = false;
}
},
showAddD() {
this.youVisible = true;
},
init() {
if (!this.userId) {
setTimeout(() => {
this.init();
}, 1000);
}
this.$http({
url: this.$http.adornUrl(`/book/user/info/${this.userId}`),
method: "get",
params: this.$http.adornParams()
}).then(({ data }) => {
if (data && data.code === 0) {
this.user = data.user;
this.getDataList();
// if (data.user.avatar && data.user.avatar != "") {
// var img = {
// name: '',
// url: data.user.avatar
// }
// }
}
});
},
// 获取数据列表
getDataList() {
this.dataListLoading = true;
this.$http({
// url: this.$http.adornUrl('/book/user/list'),
url: this.$http.adornUrl("/master/userManage/getUserCourseList"),
method: "post",
data: this.$http.adornData({
userId: this.userId,
page: this.pageIndex,
limit: this.pageSize,
title: this.dataForm.key
})
})
.then(({ data }) => {
if (data && data.code === 0) {
console.log(data,'data')
this.dataList = data.result.records;
this.totalPage = data.result.pages;
this.total = data.result.total;
this.dataListLoading = false;
}
});
},
// 每页数
sizeChangeHandle(val) {
this.pageSize = val;
this.pageIndex = 1;
this.getDataList();
},
// 当前页
currentChangeHandle(val) {
this.pageIndex = val;
this.getDataList();
},
// // 多选
// selectionChangeHandle(val) {
// this.dataListSelections = val
// },
// 新增 / 修改
closeDia() {
this.adc = false;
this.$refs.pointForm.resetFields();
// this.pointForm.pointType == 0
},
getCate(id) {
this.$http({
url: this.$http.adornUrl("/master/userManage/catalogueListByCourse"),
method: "post",
data: this.$http.adornData({
"courseId": id
})
}).then(({ data }) => {
if (data && data.code === 0) {
console.log('data','data++++++++++++++++++++')
this.youForm.cate = data.list
// this.youForm.cate
}else{
this.youForm.cate = []
}
}).catch(e => {
console.log('数据报错')
});
}
},
};
</script>
<style lang="less" scoped>
.flexbox {
display: flex;
}
.userInfo {
margin-bottom: 20px;
}
.userInfo * {
font-size: 16px;
}
</style>

View File

@@ -0,0 +1,315 @@
<template>
<div>
<el-form :inline="true" :model="query" @keyup.enter.native="getDataList()">
<el-form-item label="账户名">
<el-input
v-model="query.account"
placeholder="请输入账户名"
clearable
></el-input>
</el-form-item>
<el-form-item label="工单类型">
<!-- <el-input
v-model="query.type"
placeholder="出版社名称"
clearable
></el-input> -->
<el-select v-model="query.type" placeholder="请选择" clearable @change="selectChange">
<el-option
v-for="item in typeLIst"
:key="item.value"
:label="item.text"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="工单状态" >
<!-- <el-input
v-model="query.status"
placeholder="作者姓名"
clearable
></el-input> -->
<el-select v-model="query.status" placeholder="请选择" clearable @change="selectChange">
<el-option
v-for="item in statusList"
:key="item.value"
:label="item.text"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button @click="getDataList()">查询</el-button>
</el-form-item>
</el-form>
<el-table
:data="dataList"
border
v-loading="dataListLoading"
style="width: 100%;"
>
<el-table-column
prop="type" width="150"
header-align="center"
align="center"
label="工单类型"
>
<template slot-scope="scope">
{{ scope.row.type | getType }}
</template>
</el-table-column>
<el-table-column
prop="account" width="150"
header-align="center"
align="center"
label="用户账户"
>
</el-table-column>
<el-table-column
prop="content"
header-align="center"
align="left"
label="问题描述"
>
<template slot-scope="scope">
<div>问题描述{{scope.row.content}}</div>
<div>提交时间{{scope.row.createTime}}</div>
<div v-if="scope.row.type == '3'">关联订单号{{scope.row.relation}}</div>
</template>
</el-table-column>
<el-table-column width="150"
prop="contactInformation"
header-align="center"
align="center"
label="联系电话"
>
</el-table-column>
<el-table-column
header-align="center"
align="center"
label="问题截图"
>
<template slot-scope="scope">
<div v-if="scope.row.images && scope.row.images.length > 0">
<img @click="clickImg(item)" :src="item" v-for="(item, index) in scope.row.images" :key="index" style="width:60px; cursor: pointer;"/>
</div>
</template>
</el-table-column>
<el-table-column width="160" v-if="query.status == 1"
prop="updateTime"
header-align="center"
align="center"
label="处理时间"
>
</el-table-column>
<el-table-column header-align="center" align="center" label="操作" width="150px">
<template slot-scope="scope">
<el-button v-show="query.status == 0"
type="primary" plain
size="small"
@click="changeHandle(scope.row)"
>标记为已处理</el-button
>
<el-button
type="danger" style="margin-top:15px"
size="small" plain
@click="deleteHandle(scope.row)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
<img-prev-vue v-if="showImg" :url="curImg" @close="closeImg"></img-prev-vue>
</div>
</template>
<script>
import imgPrevVue from '../../components/imgPrev.vue';
export default {
data() {
return {
query: {
account: "",
type: "",
status: "0"
},
showImg:false,
curImg:'',
dataList: [],
dataListLoading: false,
statusList: [
// { value: 0, text: "请选择" },
{
value: "0",
text: "未处理"
},
{
value: "1",
text: "已处理"
}
],
// pageIndex
typeLIst: [
// { value: 0, text: "请选择" },
{
value: 1,
text: "登陆相关问题"
},
{
value: 2,
text: "账号相关问题"
},
{
value: 3,
text: "订单相关问题"
},
{
value: 4,
text: "购买相关问题"
},
{
value: 5,
text: "VIP相关问题"
},
{
value: 6,
text: "充值相关问题"
},
{
value: 7,
text: "网络暴力举报"
},
{
value: 8,
text: "其他"
}
]
};
},
created() {
this.getDataList();
},
filters: {
getType: function(value) {
var _str = "";
switch (value) {
case "1":
_str = "登陆相关问题";
break;
case "2":
_str = "账号相关问题";
break;
case "3":
_str = "订单相关问题";
break;
case "4":
_str = "购买相关问题";
break;
case "5":
_str = "VIP相关问题";
break;
case "6":
_str = "充值相关问题";
break;
case "7":
_str = "网络暴力举报";
break;
case "8":
_str = "其他";
break;
}
return _str;
}
},
components:{
imgPrevVue
},
methods: {
selectChange(){
this.getDataList()
},
closeImg(){
this.showImg = false
this.curImg = ''
},
clickImg(url){
console.log('url',url)
this.curImg = url
this.showImg = true
},
changeHandle(val){
this.$http({
url: this.$http.adornUrl("/common/sysFeedback/editStatusById"),
method: "post",
data: this.$http.adornData({ sysFeedbackId: val.id })
})
.then(({ data }) => {
this.$message.success('设置成功')
this.getDataList()
}).catch(e => {
this.$message.error("设置失败");
});
},
deleteHandle(val){
this.$http({
url: this.$http.adornUrl("/common/sysFeedback/delById"),
method: "post",
data: this.$http.adornData({ sysFeedbackId: val.id })
})
.then(({ data }) => {
this.$message.success('删除成功')
this.getDataList()
}).catch(e => {
this.$message.error("删除失败");
});
},
getDataList() {
this.dataListLoading = true;
this.$http({
url: this.$http.adornUrl("/common/sysFeedback/getList"),
method: "post",
data: this.$http.adornData({ ...this.query })
})
.then(({ data }) => {
if (data.code == 0) {
let _list = []
if(data.res.length > 0){
_list = data.res
_list.forEach(item => {
if(item.image && item.image != ''){
item.images = item.image.split(",");
// console.log('item.image',item.images)
}
})
}
console.log('_list',_list)
this.dataList = _list;
}
this.$nextTick(() => {
this.dataListLoading = false;
});
})
.catch(e => {
this.dataList = [];
this.dataListLoading = false;
this.$message.error("获取数据失败");
// console.log("表单提交报错");
});
}
}
};
</script>
<style lang="less" scoped></style>