提交 40f043fc authored 作者: pengxiaohui's avatar pengxiaohui

feat: 案例产品分析模块开发

上级 abc2055b
VITE_LOGIN_URL=https://login.ezijing.com/auth/login/index
VITE_SECRET_ID=ezijing_3ab2242d9ed709256181821cc9c05880
VITE_SECRET_KEY=aec7836687fb9cb4a67e15a493aca4f9
\ No newline at end of file
VITE_LOGIN_URL=https://login2.ezijing.com/auth/login/index
VITE_SECRET_ID=ezijing_2c9592e083613825abf2cc8ea94ee9f6
VITE_SECRET_KEY=e28af679d0def36b93275d66cccf098c
\ No newline at end of file
VITE_LOGIN_URL=https://login2.ezijing.com/auth/login/index
VITE_SECRET_ID=ezijing_2c9592e083613825abf2cc8ea94ee9f6
VITE_SECRET_KEY=e28af679d0def36b93275d66cccf098c
\ No newline at end of file
......@@ -142,7 +142,7 @@ export default {
// 是否含有翻页
hasPagination: { type: Boolean, default: true },
// 每页多少条数据
limit: { type: Number, default: 20 }
limit: { type: Number, default: 10 }
},
data() {
return {
......@@ -205,7 +205,15 @@ export default {
this.loading = true
httpRequest(params)
.then(res => {
const { data = [], total = 0 } = res.data || {}
let data, total
if (Array.isArray(res.data)) {
data = res.data
total = res.total || 0
} else {
data = res.data.data || []
total = res.data.total || 0
}
// const { data = [], total = 0 } = res.data || {}
this.page.total = total
this.dataList = callback ? callback(data) : data
})
......
......@@ -29,4 +29,79 @@ export function updateCase(id, data) {
*/
export function deleteCase(id) {
return httpRequest.delete(`/api/xtraining/admin/v1/case/${id}`)
}
\ No newline at end of file
}
/**
* 获取案例详情
*/
export function getCaseDetails(id) {
return httpRequest.get(`/api/xtraining/admin/v1/case/${id}`)
}
/* ********** 产品分析 ************ */
/**
* 获取题干列表
*/
export function getStemList(params) {
return httpRequest.get('/api/xtraining/admin/v1/completion/question-stems', { params })
}
/**
* 获取题目列表
*/
export function getQuesList(id) {
return httpRequest.get(`/api/xtraining/admin/v1/completion/questions/${id}`)
}
/**
* 创建题干
*/
export function createStem(data) {
return httpRequest.post('/api/xtraining/admin/v1/completion/question-stem', data)
}
/**
* 删除题干
*/
export function deleteStem(id) {
return httpRequest.delete(`/api/xtraining/admin/v1/completion/question-stem/${id}`)
}
/**
* 新建题目
*/
export function createQues(data) {
return httpRequest.post('/api/xtraining/admin/v1/completion/question', data)
}
/**
* 更新题目
*/
export function updateQues(id, data) {
return httpRequest.put(`/api/xtraining/admin/v1/completion/question/${id}`, data)
}
/**
* 删除题目
*/
export function deleteQues(id) {
return httpRequest.delete(`/api/xtraining/admin/v1/completion/question/${id}`)
}
/**
* 获取题目答案列表
*/
export function getQuesAnswerList(params) {
return httpRequest.get(`/api/xtraining/admin/v1/completion/rules/${params.id}`)
}
/**
* 新建题目答案
*/
export function createQuesAnswer(id, data) {
return httpRequest.post(`/api/xtraining/admin/v1/completion/rule/${id}`, data)
}
/**
* 更新题目答案
*/
export function updateQuesAnswer(id, data) {
return httpRequest.put(`/api/xtraining/admin/v1/completion/rule/${id}`, data)
}
/**
* 删除题目答案
*/
export function deleteQuesAnswer(id) {
return httpRequest.delete(`/api/xtraining/admin/v1/completion/rule/${id}`)
}
<template>
<el-descriptions class="margin-top" title="" :column="1" size="" border>
<el-descriptions-item>
<template slot="label">案件名称</template>{{ form.name }}
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">案件ID</template>{{ form.id }}
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">唯一标识</template>{{ form.tag }}
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">创建时间</template>{{ form.created_at }}
</el-descriptions-item>
</el-descriptions>
</template>
<script>
import { getCaseDetails } from '../api'
export default {
props: {
id: {
type: String
}
},
data() {
return {
form: {
id: '11111111111111',
name: '22222',
tag: '3111111111111111111',
created_at: '2021-11-16 09:30:00'
}
}
},
computed: {
},
filters: {
},
mounted() {
this.getBaseInfo()
},
methods: {
getBaseInfo() {
getCaseDetails(this.id).then(res => {
this.form = res.data
})
}
}
}
</script>
<style scoped>
.bar {
padding-bottom: 10px;
}
.item {
font-size: 16px;
line-height: 48px;
color: #494949;
}
</style>
\ No newline at end of file
......@@ -103,8 +103,7 @@ export default {
url: it
}
})
}
else this.form[key] = this.options.data[key]
} else this.form[key] = this.options.data[key]
}
})
}
......@@ -155,7 +154,6 @@ export default {
this.form.pdf_uris.splice(index, 1)
}
})
console.log(this.form.pdf_uris)
},
fetchCreateCase() {
const params = Object.assign({}, this.form)
......
<template>
<div class="product-analysis">
<div class="top-bar">
<el-button type="primary" @click="dialogVisible = true">创建题干</el-button>
</div>
<el-table :data="tableData" :row-key="getRowKey" :expand-row-keys="expands" class="stem-table" style="width: 100%" :header-cell-style="{background:'#e9e9e9'}" @expand-change="expandChange">
<!-- <el-table-column type="selection" width="55"/> -->
<el-table-column type="expand">
<template slot-scope="scope">
<el-table ref="quesTable" :data="subTableData" :header-cell-style="{background:'#f5f5f5'}" size="mini" style="width: 100%">
<el-table-column label="序号" type="index" width="50" />
<el-table-column label="名称" prop="subject" min-width="120" />
<el-table-column label="标识" prop="tag" min-width="110" />
<el-table-column label="分数" prop="score" min-width="110" />
<el-table-column label="操作" min-width="100">
<template slot-scope="subScope">
<el-button type="text" @click="handleEditQues(scope.row, subScope.row)">编辑</el-button>
<el-button type="text" @click="handleDeleteQues(scope.row, subScope.row)">删除</el-button>
<el-button type="text" @click="handleAnswer(scope.row, subScope.row)">配置答案</el-button>
</template>
</el-table-column>
</el-table>
</template>
</el-table-column>
<el-table-column label="题干名称" prop="name"/>
<el-table-column label="唯一标识" prop="tag"/>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button type="text" @click="handleDeleteStem(scope.row)">删除题干</el-button>
<el-button type="text" @click="handleCreateQues(scope.row)">创建题目</el-button>
</template>
</el-table-column>
</el-table>
<div class="pagination">
<el-pagination
@size-change="fetchStemList"
@current-change="fetchStemList"
:current-page.sync="page.page"
:page-sizes="[10, 20, 30, 50, 100]"
:page-size.sync="page.limit"
layout="total, prev, pager, next, sizes, jumper"
:total="page.total">
</el-pagination>
</div>
<el-dialog title="创建题干" :visible.sync="dialogVisible" width="460px" :destroy-on-close="true" @close="handleStemDialogClose">
<el-form :model="stemForm" ref="stemForm" label-width="90px">
<el-form-item label="题干" prop="selected" required :rules="[{required: true, message: '请选择题干', trigger: 'change'}]">
<el-select v-model="stemForm.selected" placeholder="请选择题干" size="small" value-key="tag" style="width:100%;">
<el-option v-for="item in stemOptions" :key="item.tag" :label="item.name" :value="item"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button size="mini" @click="dialogVisible = false">取消</el-button>
<el-button type="primary" @click="handleStemSubmit" size="mini">提交</el-button>
</el-form-item>
</el-form>
</el-dialog>
<el-dialog :title="isQuesCreate ? '创建题目':'编辑题目'" :visible.sync="quesDialogVisible" width="460px" :destroy-on-close="true" @close="handleQuesDialogClose">
<el-form :model="quesForm" ref="quesForm" label-width="90px">
<el-form-item label="题目" prop="subject" required :rules="[{required: true, message: '请输入题目', trigger: 'blur'}]">
<el-input v-model="quesForm.subject" size="small" placeholder="请输入题目"/>
</el-form-item>
<el-form-item label="唯一标识" prop="tag" required :rules="[{required: true, message: '请输入唯一标识', trigger: 'blur'}]">
<el-input v-model="quesForm.tag" size="small" placeholder="请输入唯一标识" :disabled="!isQuesCreate"/>
</el-form-item>
<el-form-item>
<el-button size="mini" @click="quesDialogVisible = false">取消</el-button>
<el-button type="primary" @click="handleQuesSubmit" size="mini">提交</el-button>
</el-form-item>
</el-form>
</el-dialog>
<el-drawer title="配置答案" :visible.sync="drawerVisible" :close-on-click-modal="false" :destroy-on-close="true" append-to-body size="800px" top="15px" @close="handleDrawerClose">
<ques-answer :id="curQuesId" />
</el-drawer>
</div>
</template>
<script>
//组件
import QuesAnswer from '../components/QuesAnswer.vue'
// api
import { getStemList, getQuesList, createStem, deleteStem, createQues, updateQues, deleteQues } from '../api'
const quesDefaultForm = {
subject: '',
tag: '',
question_stem_id: ''
}
export default {
components: { QuesAnswer },
props: {
id: {
type: String,
default: ''
}
},
data() {
return {
tableData: [],
subTableData: [],
expands: [],
page: {
limit: 10,
total: 0,
page: 1
},
stemForm: {
selected: null
},
stemOptions: [
{
tag: 'product_title',
name: '标题',
},
{
name: '产品概括',
tag: 'product_overview'
},
{
name: '投资目标',
tag: 'investment_objectives'
},
{
name: '投资策略',
tag: 'investment_strategy'
},
{
name: '业绩比较基准',
tag: 'performance_benchmark'
},
{
name: '风险收益特征',
tag: 'risk_return_characteristics'
},
{
name: '基金涉及费用',
tag: 'fund_related_expenses'
}
],
dialogVisible: false,
quesDialogVisible: false,
isQuesCreate: true,
quesForm: Object.assign({}, quesDefaultForm),
drawerVisible: false,
curQuesId: ''
}
},
created() {
this.fetchStemList()
},
methods: {
getRowKey (row) {
return row.id
},
expandChange(row, rows) {
if (rows.length) {
this.fetchQuesList(row.id)
} else this.expands = []
},
handleStemDialogClose() {
this.$refs.stemForm.resetFields()
this.stemForm.selected = null
},
handleStemSubmit() {
this.$refs.stemForm.validate((valid) => {
if (valid) {
this.fetchCreateStem()
}
})
},
handleDeleteStem(item) {
this.$confirm('删除题干请谨慎操作,确定删除?', '删除题干', {
confirmButtonText: '删除',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.fetchDeleteStem(item)
}).catch(() => {})
},
handleCreateQues(item) {
this.quesDialogVisible = true
this.quesForm.question_stem_id = item.id
this.isQuesCreate = true
},
handleEditQues(item, subItem) {
this.quesDialogVisible = true
this.quesForm.question_stem_id = item.id
this.quesForm.id = subItem.id
this.quesForm.subject = subItem.subject
this.quesForm.tag = subItem.tag
this.isQuesCreate = false
},
handleDeleteQues(stemItem, quesItem) {
this.$confirm('删除题目请谨慎操作,确定删除?', '删除题干', {
confirmButtonText: '删除',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.fetchDeleteQues(stemItem.id, quesItem.id)
}).catch(() => {})
},
handleQuesDialogClose() {
this.quesForm = Object.assign({}, quesDefaultForm)
},
handleQuesSubmit() {
this.$refs.quesForm.validate((valid) => {
if (valid) {
this.isQuesCreate ? this.fetchCreateQues() : this.fetchEditQues()
}
})
},
handleAnswer(item, subItem) {
this.curQuesId = subItem.id
this.drawerVisible = true
},
handleDrawerClose() {},
fetchStemList() {
const params = {
page: this.page.page,
limit: this.page.limit,
case_id: this.id
}
getStemList(params).then(res => {
if (res.data) {
this.tableData = res.data.data
this.page.total = res.data.total
}
})
},
fetchCreateStem() {
const params = {
case_id: this.id,
name: this.stemForm.selected.name,
tag: this.stemForm.selected.tag
}
createStem(params).then(res => {
if (res.data && res.data.id) {
this.$message.success('创建题干成功')
this.dialogVisible = false
this.fetchStemList()
}
})
},
fetchDeleteStem(item) {
deleteStem(item.id).then(res => {
if (res.data && res.data.status) {
this.$message.success('删除题干成功')
this.fetchStemList()
}
})
},
fetchQuesList(id, isRefetch) {
getQuesList(id).then(res => {
this.subTableData = []
if (Array.isArray(res.data)) {
console.log(res.data)
this.subTableData = res.data
}
if (!isRefetch) this.expands = [id]
})
},
fetchCreateQues() {
createQues(this.quesForm).then(res => {
if (res.data && res.data.id) {
this.fetchQuesList(this.quesForm.question_stem_id, true)
this.$message.success('创建题目成功')
this.quesDialogVisible = false
}
})
},
fetchEditQues() {
updateQues(this.quesForm.id, { subject: this.quesForm.subject }).then(res => {
if (res.data && res.data.status) {
this.fetchQuesList(this.quesForm.question_stem_id, true)
this.$message.success('更新题目成功')
this.quesDialogVisible = false
}
})
},
fetchDeleteQues(stemId, quesId) {
deleteQues(quesId).then(res => {
if (res.data && res.data.status) {
this.$message.success('删除题目成功')
this.fetchQuesList(stemId, true)
}
})
}
}
}
</script>
<style scoped>
.top-bar{
margin-bottom:20px;
text-align:right;
}
::v-deep .stem-table .el-table-column--selection .cell{
padding-left:10px;
padding-right:0;
}
::v-deep .stem-table>.el-table__header-wrapper>table>colgroup>col:first-child{
width:30px !important;
}
::v-deep .stem-table>.el-table__body-wrapper>table>colgroup>col:first-child{
width:30px !important;
}
.product-analysis ::v-deep.stem-table .el-table__expanded-cell{
padding:15px 25px !important;
}
.pagination{
padding-top:15px;
text-align:right;
}
</style>
\ No newline at end of file
<template>
<app-card>
<app-list v-bind="tableOptions" ref="list">
<template #header-aside>
<el-button type="primary" @click="handleCreate">创建答案</el-button>
</template>
<template v-slot:table-x="{ row }">
<el-button type="primary" plain @click="handleEdit(row)">编辑</el-button>
<el-button type="danger" plain @click="handleDelete(row)">删除</el-button>
</template>
</app-list>
<el-dialog :title="isCreate ? '创建答案':'编辑答案'" :visible.sync="dialogVisible" width="460px" append-to-body :destroy-on-close="true">
<el-form :model="form" :rules="rules" ref="ruleForm" label-width="120px">
<el-form-item label="答案" prop="answer">
<el-input v-model="form.answer" size="small" placeholder="请输入答案"/>
</el-form-item>
<el-form-item label="唯一标识" prop="tag">
<el-input v-model="form.tag" size="small" placeholder="请输入唯一标识" :disabled="!isCreate"/>
</el-form-item>
<el-form-item label="分数" prop="score">
<el-input-number v-model="form.score" :precision="2" :step="1" label="请输入分数" />
</el-form-item>
<el-form-item label="答案匹配度" prop="matching_degree">
<el-input-number v-model="form.matching_degree" :precision="2" :step="1" label="请输入分数" :min="0" :max="100" />
</el-form-item>
<el-form-item>
<el-button size="mini" @click="dialogVisible = false">取消</el-button>
<el-button type="primary" @click="handleSubmit" size="mini">提交</el-button>
</el-form-item>
</el-form>
</el-dialog>
</app-card>
</template>
<script>
import { getQuesAnswerList, createQuesAnswer, updateQuesAnswer, deleteQuesAnswer } from '../api'
const defaultForm = {
answer: '',
tag: '',
score: 0,
matching_degree: 0
}
export default {
props: {
id: {
type: String,
defaulut: ''
}
},
data() {
return {
form: Object.assign({}, defaultForm),
rules: {
answer: { required: true, message: '请输入答案', trigger: 'blur' },
tag: { required: true, message: '请输入唯一标识', trigger: 'blur' }
},
isCreate: true,
dialogVisible: false,
updateId: ''
}
},
computed: {
// 列表配置
tableOptions() {
return {
remote: {
httpRequest: getQuesAnswerList,
params: { id: this.id }
},
columns: [
{ label: '答案', prop: 'answer' },
{ label: '唯一标识', prop: 'tag' },
{ label: '分数', prop: 'score' },
{ label: '答案匹配度', prop: 'matching_degree' },
{ label: '创建时间', prop: 'created_at' },
{ label: '操作', slots: 'table-x', align: 'right', width: 160 }
]
}
}
},
methods: {
handleCreate() {
this.form = Object.assign({}, defaultForm)
this.dialogVisible = true
this.isCreate = true
},
handleEdit(item) {
this.dialogVisible = true
this.isCreate = false
this.updateId = item.id
this.form.answer = item.answer
this.form.tag = item.tag
this.form.score = item.score
this.form.matching_degree = item.matching_degree
},
handleDelete(item) {
this.$confirm('删除题干请谨慎操作,确定删除?', '删除题干', {
confirmButtonText: '删除',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.fetchDeleteAnswer(item)
}).catch(() => {})
},
handleSubmit() {
this.$refs.ruleForm.validate((valid) => {
if (valid) {
this.isCreate ? this.fetchCreateAnswer(): this.fetchUpdateAnswer()
}
})
},
fetchCreateAnswer() {
createQuesAnswer(this.id, this.form).then(res => {
if (res.data && res.data.id) {
this.$message.success('新建答案成功')
this.$refs.list.refetch(true)
this.dialogVisible = false
}
})
},
fetchUpdateAnswer() {
updateQuesAnswer(this.updateId, this.form).then(res => {
if (res.data && res.data.status) {
this.$message.success('更新答案成功')
this.$refs.list.refetch(true)
this.dialogVisible = false
}
})
},
fetchDeleteAnswer(item) {
deleteQuesAnswer(item.id).then(res => {
if (res.data && res.data.status) {
this.$message.success('删除答案成功')
this.$refs.list.refetch(true)
}
})
}
}
}
</script>
......@@ -4,7 +4,10 @@ const routes = [
{
path: '/case',
component: AppLayout,
children: [{ path: '', component: () => import('./views/List.vue') }]
children: [
{ path: '', component: () => import('./views/List.vue') },
{ path: 'details', component: () => import('./views/Details.vue') }
]
}
]
......
<template>
<app-card>
<h4 class="title">{{title || ''}}</h4>
<base-info :id="id" />
<el-tabs v-model="tabActive" style="margin-top:20px;">
<el-tab-pane label="产品分析" name="productAnalysis">
<product-analysis :id="id" />
</el-tab-pane>
</el-tabs>
</app-card>
</template>
<script>
// 组件
import BaseInfo from '../components/BaseInfo.vue'
import ProductAnalysis from '../components/ProductAnalysis.vue'
export default {
components: { BaseInfo, ProductAnalysis },
data() {
return {
tabActive: 'productAnalysis'
}
},
computed: {
id() {
return this.$route.query.id
},
title() {
return this.$route.query.name
}
}
}
</script>
<style lang="scss" scoped>
::v-deep.app-card{
padding-top:20px;
}
.title{
font-size:20px;
line-height:36px;
padding-bottom:10px;
}
</style>
\ No newline at end of file
......@@ -5,7 +5,7 @@
<el-button type="primary" @click="handleCreate">新建</el-button>
</template>
<template v-slot:table-x="{ row }">
<el-button plain>查看</el-button>
<el-button plain @click="handleDetails(row)">查看</el-button>
<el-button type="primary" plain @click="handleEdit(row)">编辑</el-button>
<el-button type="danger" plain @click="handleRemove(row)">删除</el-button>
</template>
......@@ -51,28 +51,6 @@ export default {
{ label: '唯一标识', prop: 'tag' },
{ label: '创建时间', prop: 'created_at' },
{ label: '操作', slots: 'table-x', align: 'right', width: 220 }
],
data: [
{
date: '2016-05-02',
name: '王小虎',
address: '上海市普陀区金沙江路 1518 弄'
},
{
date: '2016-05-04',
name: '王小虎',
address: '上海市普陀区金沙江路 1517 弄'
},
{
date: '2016-05-01',
name: '王小虎',
address: '上海市普陀区金沙江路 1519 弄'
},
{
date: '2016-05-03',
name: '王小虎',
address: '上海市普陀区金沙江路 1516 弄'
}
]
}
}
......@@ -88,6 +66,15 @@ export default {
this.formData.type = 'edit'
this.formData.data = item
},
handleDetails(item) {
this.$router.push({
path: '/case/details',
query: {
id: item.id,
name: item.name
}
})
},
handleClose() {},
handleSubmit() {
this.drawerVisible = false
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论