wangxy 4 dagar sedan
förälder
incheckning
2e5826a5cc

+ 25 - 25
src/api/course/courseWatchComment.js

@@ -9,32 +9,32 @@ export function listCourseWatchComment(query) {
   })
 }
 
-// // 查询看课评论详细
-// export function getCourseWatchComment(commentId) {
-//   return request({
-//     url: '/course/courseWatchComment/' + commentId,
-//     method: 'get'
-//   })
-// }
+// 查询看课评论详细
+export function getCourseWatchComment(commentId) {
+  return request({
+    url: '/course/courseWatchComment/' + commentId,
+    method: 'get'
+  })
+}
+
+// 新增看课评论
+export function addCourseWatchComment(data) {
+  return request({
+    url: '/course/courseWatchComment',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改看课评论
+export function updateCourseWatchComment(data) {
+  return request({
+    url: '/course/courseWatchComment',
+    method: 'put',
+    data: data
+  })
+}
 
-// // 新增看课评论
-// export function addCourseWatchComment(data) {
-//   return request({
-//     url: '/course/courseWatchComment',
-//     method: 'post',
-//     data: data
-//   })
-// }
-//
-// // 修改看课评论
-// export function updateCourseWatchComment(data) {
-//   return request({
-//     url: '/course/courseWatchComment',
-//     method: 'put',
-//     data: data
-//   })
-// }
-//
 
 // 修改弹幕状态
 export function updateBarrageStatus(data) {

+ 6 - 0
src/api/course/userCourse.js

@@ -16,6 +16,12 @@ export function getUserCourse(courseId) {
     method: 'get'
   })
 }
+export function getCourseByProject(projectId) {
+  return request({
+    url: '/course/userCourse/getCourseByProject/'+projectId,
+    method: 'get'
+  })
+}
 
 // 新增课程
 export function addUserCourse(data) {

+ 507 - 0
src/views/course/courseComment/index.vue

@@ -0,0 +1,507 @@
+<template>
+  <div class="app-container">
+    <el-tabs v-model="activeTab" @tab-click="handleTabChange">
+      <el-tab-pane label="课程" name="course"></el-tab-pane>
+      <el-tab-pane label="视频" name="video"></el-tab-pane>
+    </el-tabs>
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="搜索" prop="keywords">
+        <el-input
+          v-model="queryParams.keywords"
+          :placeholder="searchPlaceholder"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+          style="width: 280px"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+            <el-col :span="1.5">
+              <el-button
+                type="primary"
+                plain
+                icon="el-icon-plus"
+                size="mini"
+                @click="handleAdd"
+                v-hasPermi="['course:courseWatchComment:add']"
+              >新增</el-button>
+      <!--      </el-col>-->
+      <!--      <el-col :span="1.5">-->
+      <!--        <el-button-->
+      <!--          type="success"-->
+      <!--          plain-->
+      <!--          icon="el-icon-edit"-->
+      <!--          size="mini"-->
+      <!--          :disabled="single"-->
+      <!--          @click="handleUpdate"-->
+      <!--          v-hasPermi="['course:courseWatchComment:edit']"-->
+      <!--        >修改</el-button>-->
+            </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['course:courseWatchComment:remove']"
+        >删除</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table border v-loading="loading" :data="courseWatchCommentList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <!--      <el-table-column label="评论id" align="center" prop="commentId" />-->
+      <!--      <el-table-column label="用户id" align="center" prop="userId" />-->
+      <el-table-column label="用户昵称" align="center" prop="nickName" width="130px" />
+      <!--      <el-table-column label="用户类型,1-管理员,2-用户" align="center" prop="userType" />-->
+      <!--      <el-table-column label="评论类型 1:评论,2:回复" align="center" prop="type" />-->
+      <!--      <el-table-column label="父评论id" align="center" prop="parentId" />-->
+      <el-table-column label="评论内容" align="center" prop="content" />
+      <!-- 条件显示所属课程或所属小节 -->
+      <el-table-column
+        v-if="activeTab === 'course'"
+        label="所属课程"
+        align="center"
+        prop="courseName"
+      />
+      <el-table-column
+        v-if="activeTab === 'video'"
+        label="所属小节"
+        align="center"
+        prop="title"
+      />
+      <!--      <el-table-column label="弹幕状态" align="center" prop="status">-->
+      <!--        <template slot-scope="scope">-->
+      <!--          <el-tag :type="getStatusTagType(scope.row.status)">-->
+      <!--            {{ formatBarrageStatus(scope.row.status) }}-->
+      <!--          </el-tag>-->
+      <!--        </template>-->
+      <!--      </el-table-column>-->
+      <el-table-column label="评论时间" align="center" prop="createTime" width="160px"/>
+      <!--      <el-table-column label="是否是撤回的消息,1-是,0-否" align="center" prop="isRevoke" />-->
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['course:courseWatchComment:edit']"
+          >修改
+          </el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['course:courseWatchComment:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!--    &lt;!&ndash; 添加或修改看课评论对话框 &ndash;&gt;-->
+    <el-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="100px" size="small">
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="用户id" prop="userId">
+              <el-input v-model="form.userId" placeholder="请输入用户id" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <!-- 根据tab显示不同的ID字段 -->
+            <el-form-item
+              :label="activeTab === 'course' ? '课堂id' : '小节id'"
+              :prop="activeTab === 'course' ? 'courseId' : 'videoId'">
+              <el-input
+                :value="form[activeTab === 'course' ? 'courseId' : 'videoId']"
+                @input="val => form[activeTab === 'course' ? 'courseId' : 'videoId'] = val"
+                :placeholder="activeTab === 'course' ? '请输入课堂id' : '请输入小节id'" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="评论类型" prop="type">
+              <el-select v-model="form.type" placeholder="请选择评论类型" style="width: 100%">
+                <el-option
+                  v-for="dict in typeOptions"
+                  :key="dict.dictValue"
+                  :label="dict.dictLabel"
+                  :value="parseInt(dict.dictValue)"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-form-item label="评论内容" prop="content">
+          <el-input
+            type="textarea"
+            v-model="form.content"
+            placeholder="请输入评论内容"
+            :rows="4"
+            maxlength="500"
+            show-word-limit
+          />
+        </el-form-item>
+
+        <el-form-item label="是否是撤回的消息" prop="isRevoke">
+          <el-select v-model="form.isRevoke" placeholder="请选择" style="width: 120px">
+            <el-option
+              v-for="dict in revokeOptions"
+              :key="dict.dictValue"
+              :label="dict.dictLabel"
+              :value="parseInt(dict.dictValue)"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+      </el-form>
+
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="cancel">取 消</el-button>
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  listCourseWatchComment,
+  delCourseWatchComment,
+  exportCourseWatchComment,
+  addBlack,
+  clearBlack,
+  updateBarrageStatus,
+  getCourseWatchComment,
+  updateCourseWatchComment, addCourseWatchComment
+} from "@/api/course/courseWatchComment";
+import { addKeyword } from "@/api/system/keyword";
+
+export default {
+  name: "CourseWatchComment",
+  data() {
+    return {
+      // 添加tab相关数据
+      activeTab: 'course', // 默认显示课程评论
+      // 弹幕状态选项
+      barrageStatusOptions: [
+        { dictValue: 0, dictLabel: "正常" },
+        { dictValue: 1, dictLabel: "屏蔽" },
+        { dictValue: 2, dictLabel: "人工" }
+      ],
+      // 遮罩层
+      loading: true,
+      // 导出遮罩层
+      exportLoading: false,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 看课评论表格数据
+      courseWatchCommentList: [],
+      typeOptions:[],
+      revokeOptions: [
+        { dictValue: 0, dictLabel: "否" },
+        { dictValue: 1, dictLabel: "是" }
+      ],
+      //下拉状态
+      statusOptions:[],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      updateStatus: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        keywords: null,
+        isAll: true, //判断是否属于全局查询
+        status: '',
+        userStatus: '',
+        // userId: null,
+        // userType: null,
+        // courseId: null,
+        // videoId: null,
+        // type: null,
+        // parentId: null,
+        // content: null,
+        // isRevoke: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        keyword: [
+          { required: true, message: "关键字不能为空", trigger: "blur" }
+        ]
+      }
+    };
+  },
+
+  computed: {
+    // 计算属性:根据当前tab返回搜索框提示文字
+    searchPlaceholder() {
+      return this.activeTab === 'course'
+        ? '请输入用户昵称/课程名称'
+        : '请输入用户昵称/视频名称';
+    }
+  },
+  created() {
+    this.getDicts("sys_barrage_clean_type").then((response) => {
+      this.statusOptions = response.data;
+    });
+    this.getDicts("sys_video_comment_type").then(response => {
+      this.typeOptions = response.data;
+    });
+    this.getList();
+  },
+  methods: {
+    /** 处理tab切换 */
+    handleTabChange() {
+      // 重置查询参数
+      this.queryParams = {
+        pageNum: 1,
+        pageSize: 10,
+        keywords: null,
+        isAll: true,
+        status: '',
+        userStatus: '',
+      };
+      // 重新获取数据
+      this.getList();
+    },
+    /** 查询看课评论列表 */
+    getList() {
+      this.loading = true;
+      const params = {
+        ...this.queryParams,
+        type: this.activeTab === 'course' ? 0 : 1
+      };
+      listCourseWatchComment(params).then(response => {
+        this.courseWatchCommentList = response.rows.list;
+        this.total = response.rows.total;
+        this.loading = false;
+      });
+    },
+    // 获取状态标签类型
+    getStatusTagType(status) {
+      switch(status) {
+        case 0: return 'success';
+        case 1: return 'danger';
+        case 2: return 'primary';
+        default: return 'info';
+      }
+    },
+    // 格式化状态显示
+    formatBarrageStatus(status) {
+      const dict = this.barrageStatusOptions.find(item => item.dictValue === status);
+      return dict ? dict.dictLabel : status;
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.updateStatus = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        commentId: null,
+        userId: null,
+        userType: null,
+        courseId: null,
+        videoId: null,
+        type: null,
+        parentId: null,
+        content: null,
+        createTime: null,
+        updateTime: null,
+        isRevoke: null,
+        keyword: null,
+        status: '',
+        userStatus: ''
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.commentId)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 添加关键字按钮操作 */
+    handleAddKeyWords(row) {
+      this.reset();
+      this.form.keyword = row.content; // 将评论内容设置为关键字
+      this.open = true;
+      this.title = "添加到关键字";
+    },
+    handleUpdateStatus(row) {
+      this.reset();
+      this.form.status = row.status;
+      this.form.commentId = row.commentId;
+      this.updateStatus = true;
+      this.title = "修改弹幕状态";
+    },
+    /** 解除拉黑用户按钮操作 */
+    handleClearBlack(row) {
+      this.$confirm(`谨慎操作,确定要解除"${row.nickName}"用户拉黑吗`, "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        const data = {
+          fsUserId: row.userId,
+          commentStatus: 0
+        };
+        clearBlack(data).then(response => {
+          this.msgSuccess("操作成功");
+          this.getList(); // 重新加载列表
+        }).catch(() => {
+          this.msgError("操作失败");
+        });
+      }).catch(() => {
+        // 用户取消操作
+      });
+    },
+    /** 拉黑用户按钮操作 */
+    handleAddBlack(row) {
+      this.$confirm(`谨慎操作,确定要拉黑用户"${row.nickName}"吗`, "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        const data = {
+          fsUserId: row.userId,
+          commentStatus: 1
+        };
+        addBlack(data).then(response => {
+          this.msgSuccess("操作成功");
+          this.getList(); // 重新加载列表
+        }).catch(() => {
+          this.msgError("操作失败");
+        });
+      }).catch(() => {
+        // 用户取消操作
+      });
+    },
+    updateForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          console.log(this.form)
+          updateBarrageStatus(this.form).then(response => {
+            this.msgSuccess("修改成功");
+            this.updateStatus = false;
+            this.getList();
+          }).catch(() => {
+            this.msgError("修改失败");
+          });
+        }
+      })
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.commentId != null) {
+            updateCourseWatchComment(this.form).then(response => {
+              this.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            })
+          }else {
+            addCourseWatchComment(this.form).then(response => {
+              this.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            })
+          }
+        }
+      });
+    },
+    // /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加看课评论";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const commentId = row.commentId || this.ids
+      getCourseWatchComment(commentId).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改看课评论";
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const commentIds = row.commentId || this.ids;
+      this.$confirm('是否确认删除此看课评论?删除后不可恢复', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(function() {
+        return delCourseWatchComment(commentIds);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('是否确认导出当前看课评论数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        this.exportLoading = true;
+        return exportCourseWatchComment(queryParams);
+      }).then(response => {
+        this.download(response.msg);
+        this.exportLoading = false;
+      }).catch(() => {});
+    }
+  }
+};
+</script>

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 444 - 366
src/views/his/package/index.vue


Vissa filer visades inte eftersom för många filer har ändrats