项目管理更新

This commit is contained in:
Yuanjianghong 2021-11-15 00:38:53 +08:00
parent df8c6723d8
commit 66acffc8ff
12 changed files with 364 additions and 177 deletions

View File

@ -3,11 +3,8 @@ import request from '@/utils/request'
const projectApi = {
add: 'project/add',
getDict:'project/dict/get',
// get: 'sys/menu/get',
// update: 'sys/menu/update',
// del: 'sys/menu/delete',
// updateStatus: 'sys/menu/updateStatus',
list: 'project/pageList'
list: 'project/pageList',
projectCourseList: ''
}
export function projectAdd (params) {
@ -24,39 +21,10 @@ export function dictGet (params) {
params: params
})
}
// export function menuGet (params) {
// return request({
// url: menuApi.get,
// method: 'post',
// data: params
// })
// }
// export function menuUpdate (params) {
// return request({
// url: menuApi.update,
// method: 'post',
// data: params
// })
// }
// export function menuDelete (params) {
// return request({
// url: menuApi.del,
// method: 'post',
// data: params
// })
// }
export function getProjectList (params) {
console.log("------------{}",params)
return request({
url: projectApi.list,
method: 'get',
params: params
})
}
// export function menuUpdateStatus (params) {
// return request({
// url: menuApi.updateStatus,
// method: 'post',
// data: params
// })
// }

View File

@ -0,0 +1,21 @@
import request from '@/utils/request'
const projectCourseApi = {
// add: 'project/add',
// getDict:'project/dict/get',
// get: 'sys/menu/get',
// update: 'sys/menu/update',
// del: 'sys/menu/delete',
// // updateStatus: 'sys/menu/updateStatus',
// list: 'project/pageList',
projectCourseList: '/project/course/list'
}
export function getCourseList (params) {
// console.log("------------{}",params)
return request({
url: projectCourseApi.projectCourseList,
method: 'get',
params: params
})
}

View File

@ -6,7 +6,7 @@ const terminalTrainSignApi = {
}
export function terminalTrainSignList(params) {
console.log("terminalTrainList------------{}", params)
// console.log("terminalTrainList------------{}", params)
return request({
url: terminalTrainSignApi.list,
method: 'get',

View File

@ -7,16 +7,15 @@
<!-- v-if="['2', '3', '4'].includes(form.trainWay)" -->
<a-step title="选择课程" />
<a-step title="选择人员" />
<a-step title="组卷策略" />
<a-step title="完成" />
</a-steps>
<div class="content">
<keep-alive>
<step1 v-if="currentTab === 0" @nextStep="nextStep" />
<step2 v-if="currentTab === 1" @nextStep="nextStep" @prevStep="prevStep" />
<step3 v-if="currentTab === 2" @nextStep="nextStep" @prevStep="prevStep" />
<step4 v-if="currentTab === 3" @nextStep="nextStep" @prevStep="prevStep" />
<step5 v-if="currentTab === 4" @prevStep="prevStep" @finish="finish" />
</keep-alive>
<step1 v-bind:form="form" v-if="currentTab === 0" @nextStep="nextStep" />
<step2 v-bind:form="form" v-if="currentTab === 1" @nextStep="nextStep" @prevStep="prevStep" />
<step3 v-bind:form="form" v-if="currentTab === 2" @nextStep="nextStep" @prevStep="prevStep" />
<step4 v-bind:form="form" v-if="currentTab === 3" @nextStep="nextStep" @prevStep="prevStep" />
<step5 v-bind:form="form" v-if="currentTab === 4" @prevStep="prevStep" @finish="finish" />
</div>
</a-card>
</template>
@ -25,12 +24,14 @@
import Step1 from './form/ProjectForm'
import Step2 from './form/ProjectUnitSelect'
import Step3 from './form/ProjectCourseList'
import Step4 from './form/ProjectPersonForm'
export default {
components: {
Step1,
Step2,
Step3,
Step4,
},
data() {
return {
@ -68,16 +69,18 @@ export default {
// handler
//
nextStep() {
console.log('1111', this)
nextStep(childValue) {
console.log('进入下一步', childValue)
if (this.currentTab < 5) {
this.form = childValue;
this.currentTab += 1
}
},
//
prevStep() {
console.log('返回上一步')
prevStep(childValue) {
console.log('返回上一步',childValue)
if (this.currentTab > 0) {
this.form = childValue
this.currentTab -= 1
}
},

View File

@ -8,8 +8,8 @@
@cancel="handleCancel"
>
<a-form-model ref="classForm" :model="form" :rules="rules" :label-col="labelCol" :wrapper-col="wrapperCol">
<a-form-model-item ref="value" label="种类名称" prop="name">
<a-input v-model="form.value" />
<a-form-model-item ref="name" label="种类名称" prop="name">
<a-input v-model="form.name" />
</a-form-model-item>
</a-form-model>
</a-modal>
@ -33,33 +33,19 @@ export default {
visible: false,
confirmLoading: false,
form: {
value: '',
name: '',
type: 1,
},
rules: {
value: [
{
required: true,
message: '请输入种类名称',
trigger: 'blur',
},
],
name: [{equired: true,message: '请输入种类名称',trigger: 'blur', }],
},
labelCol: {
xs: {
span: 24,
},
sm: {
span: 5,
},
xs: { span: 24, },
sm: { span: 5, },
},
wrapperCol: {
xs: {
span: 24,
},
sm: {
span: 18,
},
xs: { span: 24, },
sm: { span: 18, },
},
}
},
@ -72,7 +58,12 @@ export default {
showModal() {
this.visible = true
},
//
handleOk(e) {
this.$refs.classForm.validate(valid => {
if (valid) {
// alert('submit!');
this.confirmLoading = true
classAdd(this.form).then((res) => {
if (res.code == 200) {
@ -81,14 +72,15 @@ export default {
this.handleCancel()
} else {
this.$message.error('新增失败:' + res.msg)
this.handleCancel()
}
})
} else {
return false;
}
});
},
handleCancel(e) {
// console.log('Clicked cancel button')
// this.$refs.table.refresh()
this.$parent.handleRefresh(false)
this.$emit('refreshPageData')
this.visible = false
},
},

View File

@ -15,7 +15,7 @@
</template>
</span>
</s-table>
<class-form ref="ClassForm"></class-form>
<class-form @refreshPageData="refreshPageData" ref="ClassForm"></class-form>
</a-card>
</template>
@ -35,7 +35,7 @@ export default {
},
columns: [
{ title: '序号', key: 'id', dataIndex: 'id', scopedSlots: { customRender: 'serial' } },
{ title: '项目种类名称', dataIndex: 'value', key: 'value', align: 'center' },
{ title: '项目种类名称', dataIndex: 'name', key: 'name', align: 'center' },
{
title: '操作',
align: 'center',
@ -50,19 +50,18 @@ export default {
classDel,
},
methods: {
//
handledDel(record) {
console.log('delete-id', record)
classDel({ ids: record.id }).then((res) => {
if (res.code == 200) {
this.$message.success('删除成功')
this.handleRefresh(false)
this.$refs.table.refresh(true)
}
})
},
getData() {},
//
handleRefresh(bool) {
this.$refs.table.refresh(bool)
//
refreshPageData() {
this.$refs.table.refresh(true)
},
},
created: {},

View File

@ -38,12 +38,14 @@
//import from 's'
import { STable } from '@/components'
import ProjectCourseSelect from './ProjectCourseSelect.vue'
import { getCourseList } from '@/api/project/projectCourse'
export default {
//import使
components: {
STable,
ProjectCourseSelect,
getCourseList,
},
props: {},
data() {
@ -52,11 +54,12 @@ export default {
labelCol: {},
wrapperCol: {},
vertical: 'vertical',
data1: {},
totalHours: 0, //
totalLearnHours: 0, //
totalTopicNum: 0, //
queryParam: {},//
queryParam: {
id: 1,
},//
columns: [
{ title: '序号', key: 'id', dataIndex: 'id', width: 60, scopedSlots: { customRender: 'serial' } },
{ title: '课程编号', dataIndex: 'courseNo', key: 'courseNo' },
@ -67,6 +70,7 @@ export default {
{ title: '项目名称', dataIndex: 'projectName', key: 'projectName' },
{ title: '操作', width: 200, align: 'center', scopedSlots: { customRender: 'action' }, },
], //
loadData: parameter => { return getCourseList(Object.assign(parameter, this.queryParam)).then(res => { return res }) }
}
},
// data
@ -77,20 +81,26 @@ export default {
methods: {
toNext() {
console.log('ProjectCourseSelect-toNext', this.form)
const {
form: { validateFields },
} = this
//
validateFields((err, values) => {
if (!err) {
this.$emit('nextStep')
}
})
//
// validateFields((err, values) => {
// if (!err) {
// }
// })
},
toPrep() {
console.log('toPrep', this.form)
this.$emit('prevStep', this.form)
},
getProjectCourseList(){
getCourseList(this.queryParam).then((res) => {
if(res.code == 200){
this.data1 = res.rows;
}
})
}
},
// - 访this

View File

@ -2,7 +2,8 @@
<a-modal
id="modal"
:title="modalTitle"
:width="1200"
:width="1500"
:height="750"
:visible="visible"
:confirmLoading="confirmLoading"
:destroyOnClose="true"
@ -10,10 +11,10 @@
@cancel="handleCancel"
>
<a-row type="flex" justify="center" align="top">
<a-col :span="6">
<a-col :span="4">
<a-menu v-model="current" mode="horizontal" @click="handleMenuClick">
<a-menu-item key="sys"> <a-icon type="sys" />系统课程</a-menu-item>
<a-menu-item key="self"> <a-icon type="self" />自制课程</a-menu-item>
<a-menu-item key="sys">系统课程</a-menu-item>
<a-menu-item key="self">自制课程</a-menu-item>
</a-menu>
<a-tree
:replace-fields="replaceFields"
@ -25,10 +26,10 @@
>
</a-tree>
</a-col>
<a-col :span="18">
<a-col :span="20">
<div id="content">
<a-transfer
:data-source="courseList.mockData"
:data-source="courseList.courseData"
:titles="['待选课程', '已选课程']"
:target-keys="courseList.targetKeys"
:selected-keys="courseList.selectedKeys"
@ -41,7 +42,33 @@
width: '408px',
height: '500px',
}"
>
<template
slot="children"
slot-scope="{
props: { direction, filteredItems, selectedKeys, disabled: listDisabled },
on: { itemSelectAll, itemSelect },
}"
>
<a-table
:row-selection="getRowSelection({ disabled: listDisabled, selectedKeys, itemSelectAll, itemSelect })"
:columns="direction === 'left' ? courseList.leftColumns : courseList.rightColumns"
:data-source="filteredItems"
size="default"
:style="{ pointerEvents: listDisabled ? 'none' : null }"
:custom-row="
({ key, disabled: itemDisabled }) => ({
on: {
click: () => {
if (itemDisabled || listDisabled) return
itemSelect(key, !selectedKeys.includes(key))
},
},
})
"
/>
</template>
</a-transfer>
</div>
</a-col>
</a-row>
@ -50,27 +77,43 @@
<script>
import { coursewareClassList } from '@/api/course/courseware'
import { getCourseList } from '@/api/course/course'
import difference from 'lodash/difference'
//jsjsjson
//import from ''
// const coData = [];
const leftTableColumns = [
{
dataIndex: 'courseCode',
title: '课程编号',
},
{
dataIndex: 'courseName',
title: '课程名称',
},
]
const rightTableColumns = [
{
dataIndex: 'courseCode',
title: '课程编号',
},
{
dataIndex: 'courseName',
title: '课程名称',
},
]
export default {
//import使
components: {
coursewareClassList,
difference,
getCourseList,
},
props: {},
data() {
const mockData = []
for (let i = 0; i < 20; i++) {
mockData.push({
key: i.toString(),
title: `content${i + 1}`,
description: `description of content${i + 1}`,
disabled: i % 3 < 1,
})
}
// const oriTargetKeys = mockData.filter(item => +item.key % 3 > 1).map(item => item.key);
//
return {
replaceFields: {
@ -87,10 +130,13 @@ export default {
autoExpandParent: true,
treeData: [],
courseList: {
mockData: [],
targetKeys: [],
queryParam: {},
courseData: [],
targetKeys: originTargetKeys,
selectedKeys: [],
disabled: false,
leftColumns: leftTableColumns,
rightColumns: rightTableColumns,
},
}
},
@ -163,9 +209,40 @@ export default {
console.log('direction:', direction)
console.log('target:', e.target)
},
getRowSelection({ disabled, selectedKeys, itemSelectAll, itemSelect }) {
return {
getCheckboxProps: (item) => ({ props: { disabled: disabled || item.disabled } }),
onSelectAll(selected, selectedRows) {
const treeSelectedKeys = selectedRows.filter((item) => !item.disabled).map(({ key }) => key)
const diffKeys = selected
? difference(treeSelectedKeys, selectedKeys)
: difference(selectedKeys, treeSelectedKeys)
itemSelectAll(diffKeys, selected)
},
onSelect({ key }, selected) {
itemSelect(key, selected)
},
selectedRowKeys: selectedKeys,
}
},
//
queryCourseList() {
getCourseList(this.courseList.queryParam).then((res) => {
if (res.code == 200) {
res.data.map(function (currentValue, index, arr) {
this.courseList.courseData.push({
key: currentValue.id,
courseCode: currentValue.courseCode,
courseName: currentValue.courseName,
})
})
}
})
},
},
created() {
this.handleMenuClick()
this.handleMenuClick();
// this.queryCourseList();
}, // - 访this
mounted() {}, // - 访DOM
beforeCreate() {}, // -
@ -179,8 +256,8 @@ export default {
</script>
<style scoped>
#content {
background-color: beige;
background-color: rgb(202, 221, 188);
width: 100%;
height: 500px;
height: 100%;
}
</style>

View File

@ -124,12 +124,17 @@ import { dictGet } from '@/api/project/project'
import ClassList from '../classAdd/ClassList.vue'
export default {
props: {
form: {
type: Object,
default: () => ({}),
},
},
data() {
return {
labelCol: { span: 4 },
wrapperCol: { span: 14 },
personType: [],
form: {},
modalTitle: '新增项目',
visible: false,
confirmLoading: false,
@ -140,7 +145,7 @@ export default {
ClassList,
},
created(ClassList) {
console.log('第一个表单创建了');
console.log('第一个表单创建了')
this.fetchTemplateData()
},
methods: {
@ -149,14 +154,11 @@ export default {
this.visible = true
this.formLoading = false
},
//
//,
fetchTemplateData() {
console.log('fetchTemplateData')
let formData = { type: 1 }
//
dictGet(formData).then((res) => {
console.log(res)
//
if (res.code == 200) {
const result = res.data
result.forEach((r) => {
@ -165,7 +167,6 @@ export default {
name: r.name,
})
})
console.log('----------------', this.personType)
}
})
},
@ -176,18 +177,9 @@ export default {
console.log('toNext', this.form)
this.$emit('nextStep', this.form)
},
createClass() {
console.log('-------createClass--------')
},
//
randomResit() {
this.form.resitNumber = Math.floor(Math.random() * (5 - 1) + 1)
},
},
destroyed() {
console.log('第一个表单销毁了')
}
},
}
</script>

View File

@ -0,0 +1,73 @@
<template>
<a-form-model :model="form" :label-col="labelCol" :wrapper-col="wrapperCol" layout="horizontal">
<div>
<a-row type="flex" justify="center" align="top">
<a-col :span="4" id="tree"> </a-col>
<a-col :span="20" id="content"> </a-col>
</a-row>
<a-button type="primary" @click="toNext">下一步</a-button>
<a-button type="primary" @click="toPrev">上一步</a-button>
</div>
</a-form-model>
</template>
<script>
// jsjsjson
// import from ''
export default {
// import使
components: {},
props: {},
data() {
//
return {}
},
// data
computed: {},
// data
watch: {},
//
methods: {
//
toNext() {
this.$emit('nextStep')
},
toPrev() {
this.$emit('prevStep')
},
},
// - 访this
created() {},
// - 访DOM
mounted() {},
// -
beforeCreate() {},
// -
beforeMount() {},
// -
beforeUpdate() {},
// -
updated() {},
// -
beforeDestroy() {},
// -
destroyed() {},
// keep-alive
activated() {},
}
</script>
<style scoped>
#tree {
width: 100%;
height: 100%;
background-color: beige;
}
#content {
width: 100%;
height: 100%;
background-color: bisque;
}
/* /project/form/ProjectPersonForm.vue */
</style>

View File

@ -81,7 +81,7 @@ const treeData = [
const transferDataSource = []
function flatten(list = []) {
console.log('执行了flatten函数list', list)
// console.log('flattenlist', list)
list.forEach((item) => {
transferDataSource.push(item)
flatten(item.children)
@ -90,12 +90,12 @@ function flatten(list = []) {
flatten(JSON.parse(JSON.stringify(treeData)))
function isChecked(selectedKeys, eventKey) {
console.log('执行了isChecked函数', eventKey, selectedKeys)
// console.log('isChecked', eventKey, selectedKeys)
return selectedKeys.indexOf(eventKey) !== -1
}
function handleTreeData(data, targetKeys = []) {
console.log('执行了handleTreeData函数', data, targetKeys)
// console.log('handleTreeData', data, targetKeys)
data.forEach((item) => {
item['disabled'] = targetKeys.includes(item.key)
if (item.children) {
@ -106,9 +106,14 @@ function handleTreeData(data, targetKeys = []) {
}
export default {
props: {
form:{
type: Object,
default: ()=>({}),
},
},
data() {
return {
form: this.$form.createForm(this, { name: 'project' }),
targetKeys: [],
dataSource: transferDataSource,
@ -139,7 +144,7 @@ export default {
//
validateFields((err, values) => {
if (!err) {
this.$emit('nextStep')
this.$emit('nextStep',this.form)
}
})
},

View File

@ -1,39 +1,68 @@
<template>
<a-card :bordered="false" :title="titleName">
<a-form-model @submit="handleSubmit" :model="form" :layout="layout" :labelCol="{span: 2}" :wrapperCol="{span: 10}">
<a-form-model-item label="培训名称">
<a-form-model
ref="trainForm"
@submit="handleSubmit"
:rules="rules"
:model="form"
:layout="layout"
:labelCol="{ span: 2 }"
:wrapperCol="{ span: 10 }"
>
<a-form-model-item label="培训名称" prop="name">
<a-input v-model="form.trainName" />
</a-form-model-item>
<a-form-item label="培训时间" style="margin-bottom: 0">
<a-form-item :style="{ display: 'inline-block', width: 'calc(50% - 12px)' }">
<a-form-model-item label="培训时间" style="margin-bottom: 0" porp="date" >
<a-form-model-item :style="{ display: 'inline-block', width: 'calc(50% - 12px)' }" prop="date1">
<a-date-picker v-model="form.trainSdate" style="width: 100%" valueFormat="YYYY-MM-DD HH:mm:ss" />
</a-form-item>
</a-form-model-item>
<span :style="{ display: 'inline-block', width: '24px', textAlign: 'center' }"> - </span>
<a-form-item :style="{ display: 'inline-block', width: 'calc(50% - 12px)' }">
<a-form-model-item :style="{ display: 'inline-block', width: 'calc(50% - 12px)' }" prop="date2">
<a-date-picker v-model="form.trainEdate" style="width: 100%" valueFormat="YYYY-MM-DD HH:mm:ss" />
</a-form-item>
</a-form-item>
<a-form-model-item label="主持人">
</a-form-model-item>
</a-form-model-item>
<a-form-model-item label="主持人" prop="host">
<a-input v-model="form.host" />
</a-form-model-item>
<a-form-model-item label="会议人数">
<a-form-model-item label="会议人数" prop="number">
<a-input-number v-model="form.personNum" />
</a-form-model-item>
<a-form-model-item label="学习内容">
<a-form-model-item label="学习内容" prop="content">
<a-input v-model="form.learningContent" type="textarea" />
</a-form-model-item>
<a-form-model-item label="联系人">
<a-form-model-item label="联系人" prop="contact">
<a-input v-model="form.contact" />
</a-form-model-item>
<a-form-model-item label="联系方式">
<a-form-model-item label="联系方式" prop="phone">
<a-input v-model="form.phone" />
</a-form-model-item>
<a-form-model-item label="备注">
<a-form-model-item label="备注" prop="remark">
<a-input v-model="form.remark" type="textarea" />
</a-form-model-item>
<a-form-model-item>
<a-button htmlType="submit" type="primary" @click="() => { this.form.status = 1}" style="border-left: 200px;"> 保存 </a-button>
<a-button htmlType="submit" type="primary" @click="() => { this.form.status = 2}"> 保存并发布 </a-button>
<a-button
htmlType="submit"
type="primary"
@click="
() => {
this.form.status = 1
}
"
style="border-left: 200px"
>
保存
</a-button>
<a-button
htmlType="submit"
type="primary"
@click="
() => {
this.form.status = 2
}
"
>
保存并发布
</a-button>
</a-form-model-item>
</a-form-model>
</a-card>
@ -69,7 +98,17 @@ export default {
status: 1,
},
titleName: '终端培训表单',
layout: 'horizontal'
layout: 'horizontal',
rules: {
name: [{ required: true, message: '培训名称不能为空', trigger: 'blur' }],
date1: [{ required: true, message: '培训开始时间不能为空', trigger: 'change'}],
date2: [{ required: true, message: '培训结束时间不能为空', trigger: 'change'}],
host: [{ required: true, message: '主持人不能为空', trigger: 'blur' }],
number: [{ required: true, message: '会议人数不能为空', trigger: 'blur' }],
content: [{ required: true, message: '学习内容不能为空', trigger: 'blur' }],
contact: [{ required: true, message: '联系人不能为空', trigger: 'blur' }],
phone: [{ required: true, message: '联系方式不能为空', trigger: 'blur' }],
},
}
},
// data
@ -79,25 +118,33 @@ export default {
//
methods: {
handleSubmit(e) {
console.log('提交的数据', this.form)
terminalTrainEdit(this.form).then((res) => {
if (res.code == 200) {
this.$message.success('保存成功!')
this.$router.push({
//list
path: '/project/project/terminalTrain/list',
query: {
terminalTrainName: this.$route.query.terminalTrainName,
terminalTrainStatus: this.$route.query.terminalTrainStatus,
terminalTrainStartDate: this.$route.query.terminalTrainStartDate,
terminalTrainEndDate: this.$route.query.terminalTrainEndDate,
terminalTrainPageNum: this.$route.query.terminalTrainPageNum,
},
})
this.$refs.trainForm.validate(valid => {
if (valid) {
alert('submit!');
} else {
this.$message.error('保存失败:' + res.msg)
console.log('error submit!!');
return false;
}
})
});
// console.log('', this.form)
// terminalTrainEdit(this.form).then((res) => {
// if (res.code == 200) {
// this.$message.success('')
// this.$router.push({
// //list
// path: '/project/project/terminalTrain/list',
// query: {
// terminalTrainName: this.$route.query.terminalTrainName,
// terminalTrainStatus: this.$route.query.terminalTrainStatus,
// terminalTrainStartDate: this.$route.query.terminalTrainStartDate,
// terminalTrainEndDate: this.$route.query.terminalTrainEndDate,
// terminalTrainPageNum: this.$route.query.terminalTrainPageNum,
// },
// })
// } else {
// this.$message.error('' + res.msg)
// }
// })
},
},
created() {