功能更新:新增Bug管理模块,完善用户角色分配,优化项目设置

This commit is contained in:
qiaoxinjiu
2026-05-07 19:43:05 +08:00
parent 916248483c
commit f8211673ee
44 changed files with 10410 additions and 437 deletions

View File

@@ -47,9 +47,12 @@
<el-form-item label="前置条件">
<el-input v-model="form.preconditions" type="textarea" :rows="3"></el-input>
</el-form-item>
<el-form-item label="步骤(JSON)" prop="steps">
<el-form-item label="步骤">
<el-input v-model="stepsText" type="textarea" :rows="10"></el-input>
</el-form-item>
<el-form-item label="预期结果">
<el-input v-model="expectedResultText" type="textarea" :rows="3" placeholder="请输入预期结果"></el-input>
</el-form-item>
<el-form-item label="优先级">
<el-select v-model="form.priority">
<el-option label="P0" :value="0"></el-option>
@@ -121,14 +124,15 @@ export default {
status: 1,
isAuto: 0
},
stepsText: '[]',
stepsText: '',
expectedResultText: '',
tagsText: '',
rules: {
productId: [{ required: true, message: '请选择产品', trigger: 'change' }],
projectId: [{ required: true, message: '请选择项目', trigger: 'change' }],
moduleId: [{ required: true, message: '请选择模块', trigger: 'change' }],
title: [{ required: true, message: '请输入标题', trigger: 'blur' }],
steps: [{ required: true, message: '请输入步骤', trigger: 'change' }]
// 步骤为文本输入,不做 JSON 校验;是否为空在 submitForm 里校验
}
}
},
@@ -201,7 +205,8 @@ export default {
status: data.status || 1,
isAuto: data.isAuto !== undefined ? data.isAuto : (data.is_auto !== undefined ? data.is_auto : 0)
})
this.stepsText = JSON.stringify(this.form.steps || [], null, 2)
this.stepsText = this.formatStepsToText(this.form.steps || [])
this.expectedResultText = data.expectedResults || data.expected_results || this.extractExpectedResultFromSteps(this.form.steps || [])
this.tagsText = Array.isArray(this.form.tags) ? this.form.tags.join(',') : (this.form.tags || '')
if (this.form.projectId) {
this.loadModuleOptions()
@@ -209,11 +214,11 @@ export default {
})
},
submitForm() {
let steps = []
try {
steps = JSON.parse(this.stepsText || '[]')
} catch (e) {
this.$message({ type: 'error', message: '步骤 JSON 格式错误' })
const expectedResult = (this.expectedResultText || '').trim()
const stepsText = String(this.stepsText || '').trim()
if (!stepsText) {
this.$message({ type: 'error', message: '请输入步骤' })
return
}
const tags = this.tagsText ? this.tagsText.split(',').map(item => item.trim()).filter(Boolean) : []
@@ -223,7 +228,8 @@ export default {
caseKey: this.form.caseKey,
title: this.form.title,
preconditions: this.form.preconditions,
steps,
steps: stepsText,
expectedResults: expectedResult,
priority: this.form.priority,
caseType: this.form.caseType,
tags,
@@ -248,8 +254,35 @@ export default {
return result
}, {})
},
formatStepsToText(steps) {
if (typeof steps === 'string') return steps
if (!Array.isArray(steps)) return ''
return steps
.map(item => {
if (item === null || item === undefined) return ''
if (typeof item === 'string') return item
return item.action || item.step || item.description || item.text || item.content || ''
})
.filter(Boolean)
.join('\n')
},
extractExpectedResultFromSteps(steps) {
if (!Array.isArray(steps) || steps.length === 0) return ''
const first = steps[0]
if (first && typeof first === 'object') {
return first.expected || first.expected_result || first.expectedResult || ''
}
return ''
},
backList() {
this.$router.push({ path: '/test-platform/case', query: { productId: this.form.productId || undefined, projectId: this.form.projectId || undefined } })
this.$router.push({
path: '/test-platform/case',
query: {
productId: this.form.productId || undefined,
projectId: this.form.projectId || undefined,
tab: 'cases'
}
})
}
},
created() {