AssessmentPlanRules.vue 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. <template>
  2. <div class="assessment-plan-rules">
  3. <div class="header">
  4. <h2>方案生成规则</h2>
  5. <el-button type="primary" @click="showDialog(null)">新增规则</el-button>
  6. </div>
  7. <el-table :data="rules" border stripe style="width: 100%" :max-height="tableHeight">
  8. <el-table-column prop="dimension" label="维度" width="120" />
  9. <el-table-column label="分数区间" width="140">
  10. <template slot-scope="{ row }">{{ row.scoreMin }} - {{ row.scoreMax }}</template>
  11. </el-table-column>
  12. <el-table-column prop="templateId" label="模板包ID" width="100" />
  13. <el-table-column prop="priority" label="优先级" width="80" />
  14. <el-table-column label="状态" width="80">
  15. <template slot-scope="{ row }">
  16. <el-tag :type="row.isActive ? 'success' : 'info'">{{ row.isActive ? '启用' : '禁用' }}</el-tag>
  17. </template>
  18. </el-table-column>
  19. <el-table-column prop="createdAt" label="创建时间" />
  20. <el-table-column label="操作" width="180">
  21. <template slot-scope="{ row }">
  22. <el-button size="mini" @click="showDialog(row)">编辑</el-button>
  23. <el-button size="mini" type="danger" @click="handleDelete(row.id)">删除</el-button>
  24. </template>
  25. </el-table-column>
  26. </el-table>
  27. <el-dialog title="规则编辑" :visible.sync="dialogVisible" width="500px">
  28. <el-form :model="form" label-width="100px">
  29. <el-form-item label="维度">
  30. <el-select v-model="form.dimension" placeholder="选择维度">
  31. <el-option label="注意力(attention)" value="attention" />
  32. <el-option label="专注力(focus)" value="focus" />
  33. <el-option label="记忆力(memory)" value="memory" />
  34. <el-option label="逻辑(logic)" value="logic" />
  35. <el-option label="情绪(emotion)" value="emotion" />
  36. </el-select>
  37. </el-form-item>
  38. <el-form-item label="分数下限">
  39. <el-input-number v-model="form.scoreMin" :min="0" :max="100" />
  40. </el-form-item>
  41. <el-form-item label="分数上限">
  42. <el-input-number v-model="form.scoreMax" :min="0" :max="100" />
  43. </el-form-item>
  44. <el-form-item label="模板包ID">
  45. <el-input-number v-model="form.templateId" :min="1" />
  46. </el-form-item>
  47. <el-form-item label="优先级">
  48. <el-input-number v-model="form.priority" :min="0" />
  49. </el-form-item>
  50. <el-form-item label="启用">
  51. <el-switch v-model="form.isActive" />
  52. </el-form-item>
  53. </el-form>
  54. <span slot="footer">
  55. <el-button @click="dialogVisible = false">取消</el-button>
  56. <el-button type="primary" @click="handleSave">保存</el-button>
  57. </span>
  58. </el-dialog>
  59. </div>
  60. </template>
  61. <script>
  62. import { listPlanRules, savePlanRule, deletePlanRule } from '@/api/assessment'
  63. export default {
  64. computed: {
  65. tableHeight() {
  66. return window.innerHeight - 300
  67. }
  68. },
  69. data() {
  70. return {
  71. rules: [],
  72. dialogVisible: false,
  73. form: { dimension: '', scoreMin: 0, scoreMax: 100, templateId: 1, priority: 0, isActive: true }
  74. }
  75. },
  76. created() {
  77. this.loadRules()
  78. },
  79. methods: {
  80. async loadRules() {
  81. const res = await listPlanRules()
  82. if (res.code === 200) this.rules = res.data || []
  83. },
  84. showDialog(row) {
  85. if (row) {
  86. this.form = { ...row }
  87. } else {
  88. this.form = { dimension: '', scoreMin: 0, scoreMax: 100, templateId: 1, priority: 0, isActive: true }
  89. }
  90. this.dialogVisible = true
  91. },
  92. async handleSave() {
  93. const res = await savePlanRule(this.form)
  94. if (res.code === 200) {
  95. this.$message.success('保存成功')
  96. this.dialogVisible = false
  97. this.loadRules()
  98. }
  99. },
  100. async handleDelete(id) {
  101. await this.$confirm('确认删除?')
  102. const res = await deletePlanRule({ id })
  103. if (res.code === 200) {
  104. this.$message.success('删除成功')
  105. this.loadRules()
  106. }
  107. }
  108. }
  109. }
  110. </script>
  111. <style scoped>
  112. .header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 20px; }
  113. </style>