提交 9afb5b2f authored 作者: 王鹏飞's avatar 王鹏飞

Merge branch 'master' into demo

...@@ -1170,9 +1170,9 @@ ...@@ -1170,9 +1170,9 @@
} }
}, },
"@ckeditor/ckeditor5-build-classic": { "@ckeditor/ckeditor5-build-classic": {
"version": "23.1.0", "version": "24.0.0",
"resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-build-classic/-/ckeditor5-build-classic-23.1.0.tgz", "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-build-classic/-/ckeditor5-build-classic-24.0.0.tgz",
"integrity": "sha512-wqJZ6yuqm48NoiciRcfs+t73YOfIKovJIiLSHf0yB2I3Mc+bL6iNhwwyJ3b6D/22IgYEXTpc6PiwsYFbGFnq2Q==" "integrity": "sha512-659ZAYbuQbPj3ElqrTSV7aqPtW4vt30Th0PiheFei7adIgmu1bFTHgcM3hqm7XGRzGmBRV6C07xSwUptxn3cvQ=="
}, },
"@ckeditor/ckeditor5-vue2": { "@ckeditor/ckeditor5-vue2": {
"version": "1.0.5", "version": "1.0.5",
...@@ -3094,9 +3094,9 @@ ...@@ -3094,9 +3094,9 @@
} }
}, },
"core-js": { "core-js": {
"version": "3.8.0", "version": "3.8.1",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.8.0.tgz", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.8.1.tgz",
"integrity": "sha512-W2VYNB0nwQQE7tKS7HzXd7r2y/y2SVJl4ga6oH/dnaLFzM0o2lB2P3zCkWj5Wc/zyMYjtgd5Hmhk0ObkQFZOIA==" "integrity": "sha512-9Id2xHY1W7m8hCl8NkhQn5CufmF/WuR30BTRewvCXc1aZd3kMECwNZ69ndLbekKfakw9Rf2Xyc+QR6E7Gg+obg=="
}, },
"core-js-compat": { "core-js-compat": {
"version": "3.6.5", "version": "3.6.5",
...@@ -8214,6 +8214,11 @@ ...@@ -8214,6 +8214,11 @@
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
"dev": true "dev": true
}, },
"qrcode.vue": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/qrcode.vue/-/qrcode.vue-1.7.0.tgz",
"integrity": "sha512-R7t6Y3fDDtcU7L4rtqwGUDP9xD64gJhIwpfjhRCTKmBoYF6SS49PIJHRJ048cse6OI7iwTwgyy2C46N9Ygoc6g=="
},
"qs": { "qs": {
"version": "6.9.4", "version": "6.9.4",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz",
......
...@@ -72,14 +72,15 @@ ...@@ -72,14 +72,15 @@
"@babel/runtime-corejs3": "^7.11.2" "@babel/runtime-corejs3": "^7.11.2"
}, },
"dependencies": { "dependencies": {
"@ckeditor/ckeditor5-build-classic": "^23.1.0", "@ckeditor/ckeditor5-build-classic": "^24.0.0",
"@ckeditor/ckeditor5-vue2": "^1.0.5", "@ckeditor/ckeditor5-vue2": "^1.0.5",
"axios": "^0.21.0", "axios": "^0.21.0",
"core-js": "^3.8.0", "core-js": "^3.8.1",
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"element-ui": "^2.14.1", "element-ui": "^2.14.1",
"js-cookie": "^2.2.1", "js-cookie": "^2.2.1",
"lodash": "^4.17.20", "lodash": "^4.17.20",
"qrcode.vue": "^1.7.0",
"qs": "^6.9.4", "qs": "^6.9.4",
"vue": "^2.6.12", "vue": "^2.6.12",
"vue-i18n": "^8.22.2", "vue-i18n": "^8.22.2",
......
...@@ -32,8 +32,8 @@ ...@@ -32,8 +32,8 @@
"updateAvatar": "人物头像", "updateAvatar": "人物头像",
"updatePwd": "Change password", "updatePwd": "Change password",
"outLogin": "Sign out", "outLogin": "Sign out",
"header1": "Learning", "header1": "My Study",
"header1Child1": "Course", "header1Child1": "My Courses",
"header1Child2": "Discussions", "header1Child2": "Discussions",
"header1Child3": "Academic Report", "header1Child3": "Academic Report",
"header2": "Grades", "header2": "Grades",
...@@ -195,7 +195,7 @@ ...@@ -195,7 +195,7 @@
"noFitCourseStr": "No eligible courses", "noFitCourseStr": "No eligible courses",
"noCourseStr": "No related courses", "noCourseStr": "No related courses",
"semeter": "Term", "semeter": "Term",
"courseType": "Type", "courseType": "Category",
"allLearn": "All", "allLearn": "All",
"mustLearn": "Required", "mustLearn": "Required",
"changeLearn": "Elective", "changeLearn": "Elective",
...@@ -204,7 +204,7 @@ ...@@ -204,7 +204,7 @@
"noChange": "未选修", "noChange": "未选修",
"alreadyChange": "Elective", "alreadyChange": "Elective",
"lastLearn": "Recent Study", "lastLearn": "Recent Study",
"updateTime": "Elective Time", "updateTime": "Selected Time",
"changeCourse": "选课广场", "changeCourse": "选课广场",
"showCourse": "View", "showCourse": "View",
"progress": "Video viewing progress" "progress": "Video viewing progress"
......
...@@ -163,8 +163,8 @@ ...@@ -163,8 +163,8 @@
"electronicreportcard": "电子成绩单", "electronicreportcard": "电子成绩单",
"Paperreportcard": "纸质成绩单", "Paperreportcard": "纸质成绩单",
"graduatetip": "毕业生可申请成绩单。", "graduatetip": "毕业生可申请成绩单。",
"msgtip": "(请仔细核查您填写的信息后提交,提交后不可修改。电子成绩单将发送至您填写的邮箱。", "msgtip": "(请仔细核查您填写的信息后提交,提交后不可修改。电子成绩单将发送至您填写的邮箱。)",
"msgtip2": "(请仔细核查您填写的信息后提交,提交后不可修改。电子成绩单将发送至您填写的邮箱。" "msgtip2": "(请仔细核查您填写的信息后提交,提交后不可修改。纸质成绩单将按您填写的地址邮寄给您。)"
}, },
"pay": { "pay": {
"Newpayment": "新增缴费凭证" "Newpayment": "新增缴费凭证"
...@@ -183,7 +183,7 @@ ...@@ -183,7 +183,7 @@
"bank1": "银行帐号:694485289", "bank1": "银行帐号:694485289",
"bank2": "银行卡转账", "bank2": "银行卡转账",
"bank3": "支付宝户名:清控紫荆(北京)教育科技股份有限公司", "bank3": "支付宝户名:清控紫荆(北京)教育科技股份有限公司",
"bank4": "支付宝户名:清控紫荆(北京)教育科技股份有限公司" "bank4": "支付宝转账"
} }
}, },
"learn": { "learn": {
......
...@@ -51,7 +51,7 @@ export default { ...@@ -51,7 +51,7 @@ export default {
id: _data.val, id: _data.val,
name: item.name name: item.name
} }
this.$emit('tapParam', param) this.$emit('tapParam', param, item)
} }
} }
} }
......
...@@ -110,7 +110,7 @@ export default { ...@@ -110,7 +110,7 @@ export default {
case '1-3': this.$router.push({ path: '/app/learn/report-active-list' }); break case '1-3': this.$router.push({ path: '/app/learn/report-active-list' }); break
case '2-1': this.$router.push({ path: '/app/grade/credit' }); break case '2-1': this.$router.push({ path: '/app/grade/credit' }); break
case '3': this.$router.push({ path: '/app/feedback/feedback-list' }); break case '3': this.$router.push({ path: '/app/feedback/feedback-list' }); break
case '4': this.$router.push({ path: '/app/affairs-hall/hall' }); break case '4': this.$router.push({ path: '/app/offices' }); break
} }
}, },
/* 修改头像 - 跳转方法 */ /* 修改头像 - 跳转方法 */
......
import Discuss from './discuss' import Discuss from './discuss'
import Viewer from './viewer' import Viewer from './viewer'
import Offices from './offices'
const components = [Discuss, Viewer] const components = [Discuss, Viewer, Offices]
const install = function(Vue, opts = {}) { const install = function(Vue, opts = {}) {
components.forEach(component => { components.forEach(component => {
......
import BaseAPI from '@/api/base_api'
const httpRequest = new BaseAPI(webConf)
// 获取事务类型列表
export function getAffairType() {
return httpRequest.get('/api/lms/v2/lobby/affairs')
}
// 获取事务列表
export function getAffairList(params) {
return httpRequest.get('/api/lms/v2/lobby/processes', params).then(response => {
const status = {
'-1': '待审批',
0: '未通过',
1: '审批通过',
2: '审批中'
}
if (response.list) {
response.list = response.list.map(item => {
item.status_name = status[item.status]
return item
})
}
return response
})
}
// 获取事务详情
export function getAffair(id) {
return httpRequest.get(`/api/lms/v2/lobby/processes/${id}`)
}
// 创建事务
export function createAffair(data) {
return httpRequest.post('/api/lms/v2/lobby/processes', data)
}
// 更新事务
export function updateAffair(id, data) {
return httpRequest.post(`/api/lms/v2/lobby/processes/${id}`, data)
}
// 删除事务
export function deleteAffair(id) {
return httpRequest.delete(`/api/lms/v2/lobby/processes/${id}`)
}
// 上传文件
export function upload(data) {
return httpRequest.post('/api/lms/v2/lobby/tools/upload', data, {
headers: { 'Content-Type': 'multipart/form-data' }
})
}
// 获取学期
export function getSemesters() {
return httpRequest.get('/api/lms/v2/lobby/semesters')
}
// 获取课程
export function getCourses(sid) {
return httpRequest.get(`/api/lms/v2/lobby/semesters/${sid}/courses`)
}
// 获取成绩单
export function getReport(params) {
return httpRequest.get('/api/lms/v2/lobby/havereport', params)
}
// 获取学生
export function getStudent() {
return httpRequest.get('/api/lms/v2/lobby/student')
}
// 获取重修课程
export function getRetakeCourses() {
return httpRequest.get('/api/lms/v2/lobby/courses')
}
// 更改事务状态
export function changeStatus(data) {
return httpRequest.post('/api/lms/v2/lobby/changestatus', data)
}
// 创建微信支付订单
export function createWxpayOrder(identity, productId, params) {
return httpRequest.get(`/api/pay/v1/wechat/qr/${identity}/${productId}`, params)
}
// 创建支付宝支付订单
export function createAlipayOrder(productId, params) {
return httpRequest.get(`/api/pay/v1/ali/unified-order/${productId}`, params)
}
// 获取订单
export function getOrder(orderId) {
return httpRequest.get(`/api/pay/v1/order/status/${orderId}`)
}
// 支付成功回调
export function paySuccess(id) {
return httpRequest.get(`/api/lms/v2/lobby/update-status-api/${id}`)
}
// 获取学术活动报告列表
export function getAcitivityReportList(id) {
return httpRequest.get(`/api/lms/v2/education/symposium/${id}/report`)
}
// 上传文件
export function uploadFile(data) {
return httpRequest.post('/api/lms/v2/lobby/tools/upload', data, {
headers: { 'Content-Type': 'multipart/form-data' }
})
}
<template>
<div class="pay">
<!-- 微信 -->
<div class="qr-pay" v-if="payment === '2'">
<qrcode-vue :value="qrcodeValue" size="200"></qrcode-vue>
<p class="tips">微信扫一扫支付</p>
</div>
<!-- 支付宝 -->
<div class="qr-pay" v-else-if="payment === '1'">
<qrcode-vue :value="qrcodeValue" size="200"></qrcode-vue>
<p class="tips">支付宝扫一扫支付</p>
</div>
<!-- 银行转账 -->
<div class="bank-pay" v-else>
<p>银行账户名称:清控紫荆(北京)教育科技股份有限公司</p>
<p>银行帐号:694485289</p>
<p>开户行:中国民生银行股份有限公司北京魏公村支行</p>
<div class="is-center">
<el-button type="primary" @click="$emit('success')">我已支付成功,已告知教务老师</el-button>
</div>
</div>
</div>
</template>
<script>
import * as api from '../api'
import QrcodeVue from 'qrcode.vue'
export default {
props: {
payment: { type: String }, // 支付方式
productId: { type: String, required: true }, // 商品ID
num: { type: [Number, String], default: 1 } // 购买数量
},
components: { QrcodeVue },
data() {
return {
order: {}, // 创建订单返回的数据
rawOrder: {}, // 获取订单返回的数据
timer: null
}
},
computed: {
qrcodeValue() {
return this.order.url
}
},
methods: {
// 创建微信订单
createWxPayOrder(productId, num = 1) {
return api.createWxpayOrder('ezijing', productId, { num }).then(response => {
this.order = response
return response
})
},
// 创建支付宝订单
createAliPayOrder(productId, num = 1) {
return api.createAlipayOrder(productId, { type: 2, num }).then(response => {
this.order = response
return response
})
},
getOrder() {
return api.getOrder(this.order.order_no).then(response => {
const { order } = response
this.rawOrder = order
return order
})
},
setTimer() {
this.timer = setInterval(() => {
this.getOrder().then(response => {
// 支付成功
if (response.status === 1) {
this.$emit('success')
this.clearTimer()
}
})
}, 5000)
},
clearTimer() {
this.timer && clearInterval(this.timer)
}
},
mounted() {
if (this.payment === '2') {
// 微信支付
this.createWxPayOrder(this.productId, this.num).then(this.setTimer)
} else if (this.payment === '1') {
// 支付宝支付
this.createAliPayOrder(this.productId, this.num).then(this.setTimer)
}
},
destroyed() {
this.clearTimer()
}
}
</script>
<style lang="scss" scoped>
.qr-pay {
text-align: center;
}
.tips {
color: #999;
}
.bank-pay {
line-height: 30px;
p {
margin: 0;
}
.el-button {
margin-top: 20px;
}
}
.is-center {
text-align: center;
}
</style>
import Offices from './src/index.vue'
import Routes from './routes'
import zhCN from './languages/zh-CN'
import en from './languages/en'
Offices.install = function(Vue, opts = {}) {
// 国际化
if (opts.i18n) {
opts.i18n.mergeLocaleMessage('zh-CN', zhCN)
opts.i18n.mergeLocaleMessage('en', en)
}
// 路由
if (opts.router) {
opts.router.addRoutes(Routes)
}
}
export default Offices
export default {
officesMain: {},
officesActivity: {
title: 'Apply for academic activity',
activityName: 'Academic activity Name',
enterActivity: 'Enter activity name',
ActivityTime: 'Activity time cannot be empty',
selectTime: 'Select date and time',
address: 'Academic activity address',
enteraddress: 'Enter the event address',
activityContent: 'Academic activity content',
entActCon: 'Enter activity content',
approvalTime: 'Approval Time',
backlist: 'Back to list',
beizhu: 'remarks',
people: 'speaker',
people2: 'Please input speaker',
savesubmit: 'Save submit'
}
}
export default {
officesMain: {},
officesActivity: {
title: '学术活动申请',
activityName: '学术活动名称',
enterActivity: '请输入活动名称',
ActivityTime: '学术活动时间',
selectTime: '选择日期时间',
address: '学术活动地址',
enteraddress: '请输入活动地址',
activityContent: '学术活动内容',
entActCon: '请输入活动内容',
approvalTime: '审批时间',
backlist: '返回列表',
beizhu: '审批备注',
people: '主 讲 人',
people2: '请输入主讲人',
savesubmit: '保存提交'
}
}
import { isFunction } from 'lodash'
import * as api from '../api'
export default {
props: {
isEdit: { type: Boolean, default: false },
isView: { type: Boolean, default: false }
},
data() {
return {
detail: {},
// 学期列表
semesterList: [
{ value: '春季学期(4月11日---7月10日)' },
{ value: '夏季学期(7月11日---10月10日)' },
{ value: '秋季学期(10月11日---1月10日)' },
{ value: '冬季学期(1月11日---4月10日)' }
],
payList: [
{ label: '微信支付', value: '2' },
{ label: '支付宝支付', value: '1' },
{ label: '银行转账', value: '3' }
],
submitLoading: false
}
},
computed: {
pid() {
return this.$route.params.id
},
affairId() {
return this.$route.query.id
},
// 撤回
hasAbort() {
return this.isEdit && this.detail.status === -1
},
// 去支付
hasPay() {
return this.isEdit && this.detail.pay === 0
},
// 已支付
isPaid() {
return this.detail.pay === 1
},
// 禁用信息部分
disabledInfo() {
return this.hasPay || this.isView || (this.isEdit && this.detail.status !== -1)
},
// 审批状态
statusText() {
const map = {
'-1': '待审批',
0: '未通过',
1: '审批通过',
2: '审批中'
}
return map[this.detail.status]
},
// 支付方式
payText() {
const map = {
1: '支付宝支付',
2: '微信支付',
3: '银行转账'
}
return map[this.ruleForm.payment]
},
// 支付状态
payStatusText() {
const map = {
'-1': '无',
0: '待支付',
1: '支付成功'
}
return map[this.detail.pay]
}
},
methods: {
// 获取学生信息
getStudent() {
api.getStudent().then(response => {
const data = this.$_.pick(response, ['personal_name', 'class_name', 'sofia_id'])
data.sofia_id = data.sofia_id || response.sno
Object.assign(this.ruleForm, data)
})
},
// 获取详情
getDetail() {
api.getAffair(this.pid).then(response => {
this.detail = response
this.ruleForm = response.form
})
},
// 返回
goBack() {
this.$router.push({ path: '/app/offices', query: { id: this.affairId } })
},
// 提交
handleSubmit(callback) {
this.$refs.ruleForm.validate().then(() => {
const params = Object.assign({}, this.ruleForm, { affair_id: this.affairId })
this.isEdit ? this.handleUpdate(params, callback) : this.handleAdd(params, callback)
})
},
// 新建
handleAdd(params, callback) {
this.submitLoading = true
api
.createAffair(params)
.then(response => {
if (response.success) {
isFunction(callback) ? callback(response) : this.handleSuccess(response)
} else {
this.handleError(response)
}
})
.catch(this.handleError)
.finally(() => {
this.submitLoading = false
})
},
// 修改
handleUpdate(params, callback) {
this.submitLoading = true
api
.updateAffair(this.pid, params)
.then(response => {
if (response.success) {
isFunction(callback) ? callback(response) : this.handleSuccess(response)
} else {
this.handleError(response)
}
})
.catch(this.handleError)
.finally(() => {
this.submitLoading = false
})
},
// 撤销的时候
onRemove() {
this.$confirm('你确定要撤回申请吗?撤回后,需要重新提交申请并由教务审批。', {
confirmButtonText: '确定',
cancelButtonText: '取消'
}).then(this.handleRemove)
},
// 撤回申请
handleRemove() {
api.deleteAffair(this.pid).then(response => {
if (response.success) {
this.$message({ type: 'success', message: '撤回成功' })
this.$router.replace({ path: '/app/offices', query: { id: this.affairId } })
}
})
},
// 成功
handleSuccess(response) {
this.$message({ type: 'success', message: response.message })
this.$router.push({ path: '/app/offices', query: { id: this.affairId } })
},
// 失败
handleError(response) {
this.$message({ type: 'error', message: response.message })
}
}
}
import TableList from '@/components/comTable/tableList'
import * as api from '../api'
export default {
props: { affairId: { type: String, required: true } },
components: { TableList },
data() {
return {
remote: {
request: api.getAffairList,
params: { offset: 1 },
beforeRequest: this.tableListbeforeRequest
}
}
},
methods: {
// 列表接口请求之前
tableListbeforeRequest(params) {
params.affair_id = this.affairId
return params
},
// 删除
handleRemove(row) {
api.deleteAffair(row.id).then(response => {
if (response.success) {
this.$message({ type: 'success', message: '删除成功' })
// 刷新列表,强刷新,返回第一页
this.$refs.tableList && this.$refs.tableList.refersh(true)
}
})
},
// 撤销
handleCancel(row) {
api.deleteAffair(row.id).then(response => {
if (response.success) {
this.$message({ type: 'success', message: '撤销成功' })
// 刷新列表,强刷新,返回第一页
this.$refs.tableList && this.$refs.tableList.refersh(true)
}
})
}
}
}
import ActivityEdit from './src/activity/edit.vue'
import ShareEdit from './src/share/edit.vue'
import RetakEdit from './src/retake/edit.vue'
import PareportEdit from './src/reportPaper/edit.vue'
import ElreportEdit from './src/reportE/edit.vue'
import PauseStudyEdit from './src/studyPause/edit.vue'
import ContinueStudyEdit from './src/studyContinue/edit.vue'
import SchoolCertEdit from './src/certSchool/edit.vue'
import StudyCertEdit from './src/certStudy/edit.vue'
export default [
{
path: '/app/offices',
component: () => import('@/pages/mainsite.vue'),
children: [
{ path: '', component: () => import(/* webpackChunkName: "offices" */ './src/index.vue') },
/**
* 学术活动
*/
{ name: 'activityAdd', path: 'activity/add', component: ActivityEdit },
{ name: 'activityEdit', path: 'activity/edit/:id', component: ActivityEdit, props: { isEdit: true } },
{ name: 'activityView', path: 'activity/view/:id', component: ActivityEdit, props: { isView: true } },
{
name: 'activityReportView',
path: 'activity/report',
component: () => import(/* webpackChunkName: "offices" */ './src/activity/reportView.vue')
},
{
name: 'activityReportEdit',
path: 'activity/report/edit',
component: () => import(/* webpackChunkName: "offices" */ './src/activity/reportEdit.vue')
},
/**
* 乐分享
*/
{ name: 'shareAdd', path: 'share/add', component: ShareEdit },
{ name: 'shareEdit', path: 'share/edit/:id', component: ShareEdit, props: { isEdit: true } },
{ name: 'shareView', path: 'share/view/:id', component: ShareEdit, props: { isView: true } },
/**
* 重修
*/
{ name: 'retakeAdd', path: 'retake/add', component: RetakEdit },
{ name: 'retakeEdit', path: 'retake/edit/:id', component: RetakEdit, props: { isEdit: true } },
{ name: 'retakeView', path: 'retake/view/:id', component: RetakEdit, props: { isView: true } },
/**
* 纸质成绩单
*/
{ name: 'pareportAdd', path: 'pareport/add', component: PareportEdit },
{ name: 'pareportEdit', path: 'pareport/edit/:id', component: PareportEdit, props: { isEdit: true } },
{ name: 'pareportView', path: 'pareport/view/:id', component: PareportEdit, props: { isView: true } },
/**
* 电子成绩单
*/
{ name: 'elreportAdd', path: 'elreport/add', component: ElreportEdit },
{ name: 'elreportEdit', path: 'elreport/edit/:id', component: ElreportEdit, props: { isEdit: true } },
{ name: 'elreportView', path: 'elreport/view/:id', component: ElreportEdit, props: { isView: true } },
/**
* 休学
*/
{ name: 'pauseStudyAdd', path: 'pause_study/add', component: PauseStudyEdit },
{ name: 'pauseStudyEdit', path: 'pause_study/edit/:id', component: PauseStudyEdit, props: { isEdit: true } },
{ name: 'pauseStudyView', path: 'pause_study/view/:id', component: PauseStudyEdit, props: { isView: true } },
/**
* 复学
*/
{ name: 'continueStudyAdd', path: 'continue_study/add', component: ContinueStudyEdit },
{
name: 'continueStudyEdit',
path: 'continue_study/edit/:id',
component: ContinueStudyEdit,
props: { isEdit: true }
},
{
name: 'continueStudyView',
path: 'continue_study/view/:id',
component: ContinueStudyEdit,
props: { isView: true }
},
/**
* Sofia在读证明
*/
{ name: 'schoolCertAdd', path: 'school_cret/add', component: SchoolCertEdit },
{ name: 'schoolCertEdit', path: 'school_cret/edit/:id', component: SchoolCertEdit, props: { isEdit: true } },
{ name: 'schoolCertView', path: 'school_cret/view/:id', component: SchoolCertEdit, props: { isView: true } },
/**
* 紫荆在读证明
*/
{ name: 'studyCertAdd', path: 'study_cret/add', component: StudyCertEdit },
{ name: 'studyCertEdit', path: 'study_cret/edit/:id', component: StudyCertEdit, props: { isEdit: true } },
{ name: 'studyCertView', path: 'study_cret/view/:id', component: StudyCertEdit, props: { isView: true } }
]
}
]
<template>
<div>
<div class="con-title">{{ $t('officesActivity.title') }}</div>
<div class="con-box">
<el-button type="text" @click="goBack">{{ $t('officesActivity.backlist') }}</el-button>
<!-- <el-page-header @back="goBack" content="学术活动"></el-page-header> -->
<el-form label-width="120px" :disabled="isView" :model="ruleForm" :rules="rules" ref="ruleForm" class="main-form">
<!-- <el-form-item label="姓名" prop="personal_name">
<el-input v-model="ruleForm.personal_name" placeholder="请输入您的姓名" type="text" />
</el-form-item>
<el-form-item label="班级" prop="class_name">
<el-input v-model="ruleForm.class_name" placeholder="请输入您的班级" type="text" />
</el-form-item> -->
<el-form-item :label="$t('officesActivity.activityName')" prop="symposium_name">
<el-input v-model="ruleForm.symposium_name" :placeholder="$t('officesActivity.enterActivity')" />
</el-form-item>
<el-form-item :label="$t('officesActivity.ActivityTime')" prop="symposium_time">
<el-date-picker
type="datetime"
v-model="ruleForm.symposium_time"
value-format="yyyy-MM-dd HH:mm:ss"
:placeholder="$t('officesActivity.selectTime')"
/>
</el-form-item>
<el-form-item :label="$t('officesActivity.people')" prop="symposium_lecturer">
<el-input v-model="ruleForm.symposium_lecturer" :placeholder="$t('officesActivity.people2')" />
</el-form-item>
<el-form-item :label="$t('officesActivity.address')" prop="symposium_address">
<el-input v-model="ruleForm.symposium_address" :placeholder="$t('officesActivity.enteraddress')" />
</el-form-item>
<el-form-item :label="$t('officesActivity.activityContent')" prop="symposium_contents">
<el-input
type="textarea"
v-model="ruleForm.symposium_contents"
maxlength="50"
:placeholder="$t('officesActivity.entActCon')"
:autosize="{ minRows: 5 }"
/>
</el-form-item>
<template v-if="isView">
<el-form-item v-if="detail.approve_time" :label="$t('officesActivity.approvalTime')">
<el-input v-model="detail.approve_time" readonly />
</el-form-item>
<el-form-item v-if="detail.remark1" :label="$t('officesActivity.beizhu')">
<el-input type="textarea" v-model="detail.remark1" maxlength="50" readonly :autosize="{ minRows: 5 }" />
</el-form-item>
</template>
<el-form-item v-if="!this.isView">
<el-button type="primary" :loading="submitLoading" @click="handleSubmit">
{{ $t('officesActivity.savesubmit') }}
</el-button>
</el-form-item>
</el-form>
</div>
</div>
</template>
<script>
import editMixins from '../../mixins/edit'
export default {
mixins: [editMixins],
data() {
return {
ruleForm: {
personal_name: '',
class_name: '',
symposium_name: '',
symposium_time: '',
symposium_lecturer: '',
symposium_address: '',
symposium_contents: ''
},
rules: {
personal_name: [{ required: true, message: '请输入您的姓名', trigger: 'blur' }],
class_name: [{ required: true, message: '请输入您的班级', trigger: 'blur' }],
symposium_name: [{ required: true, message: '活动名称不能为空', trigger: 'blur' }],
symposium_time: [{ required: true, message: '活动时间不能为空', trigger: 'blur' }],
symposium_lecturer: [{ required: true, message: '主讲人不能为空', trigger: 'blur' }],
symposium_address: [{ required: true, message: '学术活动地址不能为空', trigger: 'blur' }],
symposium_contents: [{ required: true, message: '活动内容不能为空', trigger: 'blur' }]
}
}
},
beforeMount() {
if (this.isEdit || this.isView) {
this.getDetail()
}
}
}
</script>
<style lang="scss" scoped>
.main-form {
max-width: 600px;
margin: 0 auto;
}
.el-date-editor.el-input {
width: 100%;
}
</style>
<template>
<div>
<el-button type="primary" @click="handleAdd">申请新的活动</el-button>
<div style="height: 20px"></div>
<table-list :remote="remote" :columns="columns" ref="tableList"></table-list>
</div>
</template>
<script>
import listMixins from '../../mixins/list'
export default {
mixins: [listMixins],
data() {
return {
columns: [
{ prop: 'form.symposium_name', label: '活动名称' },
{ prop: 'form.symposium_time', label: '活动时间' },
{ prop: 'form.symposium_lecturer', label: '主讲人' },
{ prop: 'status_name', label: '审批状态' },
{ prop: 'approve_time1', label: '审批时间' },
{ prop: 'remark1', label: '审批备注' },
{
label: '操作',
attrs: { width: '200' },
buttons: [
{
label: '查看报告',
isShow(row) {
return row.form.reportscount !== '0'
},
onClick: row => {
this.$router.push({
path: `/app/affairs-hall/view-report/${row.form.id}`
})
// this.$router.push({ name: 'activityReportView', query: { id: row.form.id } })
}
},
{
label: '上传报告',
isShow(row) {
const isPass = [1, 2, 4].includes(row.status)
return isPass && row.form.reportscount === '0'
},
onClick: row => {
this.$router.push({
path: `/app/affairs-hall/upload-report/${row.form.id}/-1`
})
// this.$router.push({ name: 'activityReportEdit', query: { id: row.form.id } })
}
},
{
label: '查看',
isShow(row) {
return row.status !== -1
},
onClick: row => {
this.$router.push({ name: 'activityView', params: { id: row.id }, query: { id: row.affair_id } })
}
},
{
label: '编辑',
isShow(row) {
return row.status === -1
},
onClick: row => {
this.$router.push({ name: 'activityEdit', params: { id: row.id }, query: { id: row.affair_id } })
}
},
{
label: '删除',
isShow(row) {
return row.status === -1
},
onClick: row => {
this.handleRemove(row)
}
}
]
}
]
}
},
methods: {
// 新增
handleAdd() {
this.$router.push({ name: 'activityAdd', query: { id: this.affairId } })
}
}
}
</script>
<template>
<div>
<div class="con-title">{{ $t('pages.affairsHall.uploadReport.title') }}</div>
<div class="con-box">
<el-button type="text" @click="goBack">{{ $t('pages.affairsHall.uploadReport.backText') }}</el-button>
<el-form label-width="120px" :model="ruleForm" :rules="rules" ref="ruleForm" class="main-form">
<el-form-item :label="$t('pages.affairsHall.uploadReport.name')" prop="name">
<el-input v-model="ruleForm.name" :placeholder="$t('pages.affairsHall.uploadReport.placename')" />
</el-form-item>
<el-form-item :label="$t('pages.affairsHall.uploadReport.labeltitle')" prop="title">
<el-input
type="textarea"
v-model="ruleForm.title"
:placeholder="$t('pages.affairsHall.uploadReport.placetitle')"
/>
</el-form-item>
<el-form-item :label="$t('pages.affairsHall.uploadReport.file')" prop="file">
<el-upload
action=""
:multiple="false"
:limit="1"
:show-file-list="false"
:on-change="handleChange"
:http-request="uploadFile"
:file-list="filesArr"
>
<el-button size="small" type="primary">{{
$t('pages.affairsHall.uploadReport.uploadButtonText')
}}</el-button>
<div slot="tip" class="el-upload__tip">
{{ $t('pages.affairsHall.uploadReport.uploadTips') }}
<a
href="http://zws-imgs-pub.oss-cn-beijing.aliyuncs.com/static/build/learn-mba/%E3%80%8AMBA%E5%AD%A6%E7%94%9F%E5%AD%A6%E6%9C%AF%E6%B4%BB%E5%8A%A8%E8%AE%B0%E5%BD%95%E6%8A%A5%E5%91%8A%E3%80%8B%E6%A8%A1%E6%9D%BFXXX%E5%AD%A6%E7%94%9F.docx"
target="_blank"
>{{ $t('pages.affairsHall.uploadReport.downloadTemplateText') }}</a
>
</div>
</el-upload>
<template v-if="successFileUrl">
<a :href="successFileUrl">{{ $t('pages.affairsHall.uploadReport.downloadButtonText') }}</a>
</template>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleSubmit">{{
$t('pages.affairsHall.uploadReport.savesubmit')
}}</el-button>
</el-form-item>
</el-form>
</div>
</div>
</template>
<script>
import * as api from '../../api'
export default {
data() {
return {
ruleForm: { name: '', title: '' },
rules: {
name: [{ required: true, message: '请输入报告主题', trigger: 'blur' }],
title: [{ required: true, message: '请输入报告摘要', trigger: 'blur' }]
},
submitLoading: false,
fileList: []
}
},
methods: {
handleChange(file, filelist) {
this.file.name = file.raw.name
this.file.type = file.raw.type
this.file.lastModifiedDate = file.raw.lastModifiedDate
this.file.size = file.raw.size
this.file.file = file.raw
},
uploadFile() {
api
.uploadFile(this.file)
.then(data => {
this.successFileUrl = data.url
this.filesArr.pop()
})
.catch(e => {
this.filesArr.pop()
this.$message.error(e.message)
})
},
goBack() {
this.$router.push({ path: '/app/offices' })
},
// 提交
handleSubmit(callback) {
this.$refs.ruleForm.validate().then(() => {
const params = Object.assign({}, this.ruleForm, { affair_id: this.affairId })
this.isEdit ? this.handleUpdate(params, callback) : this.handleAdd(params, callback)
})
},
// 新建
handleAdd(params, callback) {
this.submitLoading = true
api
.createAffair(params)
.then(response => {
response.success ? this.handleSuccess(response) : this.handleError(response)
})
.catch(this.handleError)
.finally(() => {
this.submitLoading = false
})
},
// 修改
handleUpdate(params, callback) {
this.submitLoading = true
api
.updateAffair(this.pid, params)
.then(response => {
response.success ? this.handleSuccess(response) : this.handleError(response)
})
.catch(this.handleError)
.finally(() => {
this.submitLoading = false
})
}
}
}
</script>
<style lang="scss" scoped>
.main-form {
max-width: 600px;
margin: 0 auto;
}
</style>
<template>
<div>
<div class="con-title">{{ $t('pages.affairsHall.uploadReport.title') }}</div>
<div class="con-box">
<el-button type="text" @click="gobackReportActiveList">{{
$t('pages.affairsHall.uploadReport.backText')
}}</el-button>
<div style="width: 100%; height: 0.2rem"></div>
<table-list v-bind="tableOptions" ref="tableList"></table-list>
</div>
</div>
</template>
<script>
import TableList from '@/components/comTable/tableList'
import * as api from '../../api'
export default {
props: {
rid: { type: String, required: true }
},
components: { TableList },
data() {
return {
tableOptions: {
remote: {
request: api.getAcitivityReportList,
beforeRequest: this.tableListbeforeRequest
},
columns: [
{ prop: 'index', label: '序号' },
{ prop: 'report_name', label: '报告名称' },
{ prop: 'report_description', label: '报告摘要' },
{ prop: 'submit_time', label: '提交时间' },
{ prop: 'file_url', label: '附件下载' },
{
label: '操作',
buttons: [
{
label: '编辑',
onClick: row => {
this.$router.push({
path: `/app/offices/view-report/${row.form.id}`
})
}
},
{
label: '删除',
onClick: row => {
this.$router.push({
path: `/app/offices/view-report/${row.form.id}`
})
}
}
]
}
]
}
}
}
}
</script>
<template>
<div>
<div class="con-title">Sofia在读证明申请</div>
<div class="con-box">
<el-button type="text" @click="goBack">返回列表</el-button>
<div class="main-form">
<el-form label-width="120px" :disabled="isView" ref="ruleForm" :model="ruleForm" :rules="rules">
<el-form-item label="姓名" prop="personal_name">
<el-input v-model="ruleForm.personal_name" readonly />
</el-form-item>
<el-form-item label="班级" prop="class_name">
<el-input v-model="ruleForm.class_name" readonly />
</el-form-item>
<el-form-item label="Sofia ID" prop="sofia_id">
<el-input v-model="ruleForm.sofia_id" readonly />
</el-form-item>
<el-form-item label="出生年月" prop="birth_date">
<el-date-picker v-model="ruleForm.birth_date" type="date" value-format="yyyy-MM-dd"> </el-date-picker>
</el-form-item>
<template v-if="isView">
<el-form-item label="审批状态" style="margin: 0">
{{ statusText }}
</el-form-item>
<el-form-item label="审批时间" style="margin: 0" v-if="detail.approve_time1">
{{ detail.approve_time1 }}
</el-form-item>
<el-form-item label="审批备注" style="margin: 0" v-if="detail.remark1 || detail.remark2">
{{ detail.remark1 || detail.remark2 }}
</el-form-item>
</template>
<el-form-item v-if="!this.isView">
<el-button type="primary" :loading="submitLoading" @click="handleSubmit">
{{ $t('pages.affairsHall.shareAdd.savesubmit') }}
</el-button>
<el-button type="info" @click="onRemove" v-if="hasAbort">撤回申请</el-button>
</el-form-item>
</el-form>
</div>
</div>
</div>
</template>
<script>
import editMixins from '../../mixins/edit'
export default {
mixins: [editMixins],
data() {
return {
ruleForm: {
affair_id: '',
personal_name: '',
class_name: '',
sofia_id: '',
birth_date: ''
},
rules: {
personal_name: [{ required: true, message: '请输入您的姓名', trigger: 'blur' }],
class_name: [{ required: true, message: '请输入您的班级', trigger: 'blur' }],
sofia_id: [{ required: true, message: '请输入Sofia ID', trigger: 'blur' }],
birth_date: [{ required: true, message: '请选择出生年月', trigger: 'blur' }]
}
}
},
beforeMount() {
if (this.isEdit || this.isView) {
this.getDetail()
} else {
// 获取学生信息
this.getStudent()
}
}
}
</script>
<style lang="scss" scoped>
.main-form {
max-width: 600px;
margin: 0 auto;
}
.el-date-editor.el-input {
width: 100%;
}
</style>
<template>
<div>
<el-button type="primary" @click="handleAdd">申请索菲亚在读证明</el-button>
<div style="height: 20px"></div>
<table-list :remote="remote" :columns="columns" ref="tableList"></table-list>
</div>
</template>
<script>
import listMixins from '../../mixins/list'
export default {
mixins: [listMixins],
data() {
return {
columns: [
{ prop: 'form.sofia_id', label: 'Sofia ID' },
{ prop: 'form.personal_name', label: '姓名' },
{ prop: 'form.class_name', label: '班级' },
{ prop: 'form.birth_date', label: '出生日期' },
{ prop: 'status_name', label: '审批状态' },
{ prop: 'approve_time1', label: '审批时间' },
{ prop: 'remark1', label: '审批备注' },
{
label: '操作',
attrs: { width: '100' },
buttons: [
{
label: '查看',
isShow(row) {
return row.status !== -1
},
onClick: row => {
this.$router.push({ name: 'schoolCertView', params: { id: row.id }, query: { id: row.affair_id } })
}
},
{
label: '下载',
isShow(row) {
return row.status === 1
},
onClick: row => {
console.log(row)
}
},
{
label: '编辑',
isShow(row) {
return row.status === -1
},
onClick: row => {
this.$router.push({ name: 'schoolCertEdit', params: { id: row.id }, query: { id: row.affair_id } })
}
},
{
label: '删除',
isShow(row) {
return row.status !== 2
},
onClick: row => {
this.handleRemove(row)
}
}
]
}
]
}
},
methods: {
// 新增
handleAdd() {
this.$router.push({ name: 'schoolCertAdd', query: { id: this.affairId } })
}
}
}
</script>
<template>
<div>
<div class="con-title">紫荆在读证明申请</div>
<div class="con-box">
<el-button type="text" @click="goBack">返回列表</el-button>
<div class="main-form">
<el-form label-width="180px" :disabled="isView" ref="ruleForm" :model="ruleForm" :rules="rules">
<el-form-item label="姓名" prop="personal_name">
<el-input v-model="ruleForm.personal_name" readonly />
</el-form-item>
<el-form-item label="班级" prop="class_name">
<el-input v-model="ruleForm.class_name" readonly />
</el-form-item>
<el-form-item label="Sofia ID" prop="sofia_id">
<el-input v-model="ruleForm.sofia_id" readonly />
</el-form-item>
<el-form-item label="在读证明收件人是否为本人" prop="is_self">
<el-radio-group v-model="ruleForm.is_self">
<el-radio label="1"></el-radio>
<el-radio label="2"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="收件人名字" prop="receive_name" v-if="ruleForm.is_self !== '1'">
<el-input v-model="ruleForm.receive_name" />
</el-form-item>
<el-form-item label="收件人联系电话" prop="telephone">
<el-input v-model="ruleForm.telephone" />
</el-form-item>
<el-form-item label="在读证明邮寄地址" prop="email">
<el-input type="textarea" v-model="ruleForm.email" :autosize="{ minRows: 3 }" />
</el-form-item>
<template v-if="isView">
<el-form-item label="审批状态" style="margin: 0">
{{ statusText }}
</el-form-item>
<el-form-item label="审批时间" style="margin: 0" v-if="detail.approve_time1">
{{ detail.approve_time1 }}
</el-form-item>
<el-form-item label="审批备注" style="margin: 0" v-if="detail.remark1 || detail.remark2">
{{ detail.remark1 || detail.remark2 }}
</el-form-item>
</template>
<el-form-item v-if="!this.isView">
<el-button type="primary" :loading="submitLoading" @click="handleSubmit">
{{ $t('pages.affairsHall.shareAdd.savesubmit') }}
</el-button>
<el-button type="info" @click="onRemove" v-if="hasAbort">撤回申请</el-button>
</el-form-item>
</el-form>
</div>
</div>
</div>
</template>
<script>
import editMixins from '../../mixins/edit'
export default {
mixins: [editMixins],
data() {
return {
ruleForm: {
affair_id: '',
personal_name: '',
class_name: '',
sofia_id: '',
is_self: '1',
receive_name: '',
telephone: '',
email: ''
},
rules: {
personal_name: [{ required: true, message: '请输入您的姓名', trigger: 'blur' }],
class_name: [{ required: true, message: '请输入您的班级', trigger: 'blur' }],
sofia_id: [{ required: true, message: '请输入Sofia ID', trigger: 'blur' }],
receive_name: [{ required: true, message: '请输入收件人名字', trigger: 'blur' }],
telephone: [{ required: true, message: '请输入收件人联系电话', trigger: 'blur' }],
email: [{ required: true, message: '请输入在读证明邮寄地址', trigger: 'blur' }]
}
}
},
beforeMount() {
if (this.isEdit || this.isView) {
this.getDetail()
} else {
// 获取学生信息
this.getStudent()
}
}
}
</script>
<style lang="scss" scoped>
.main-form {
max-width: 600px;
margin: 0 auto;
}
.el-date-editor.el-input {
width: 100%;
}
</style>
<template>
<div>
<el-button type="primary" @click="handleAdd">申请紫荆在读证明</el-button>
<div style="height: 20px"></div>
<table-list :remote="remote" :columns="columns" ref="tableList"></table-list>
</div>
</template>
<script>
import listMixins from '../../mixins/list'
export default {
mixins: [listMixins],
data() {
return {
columns: [
{ prop: 'form.student_id', label: '紫荆学号' },
{ prop: 'form.receive_name', label: '收件人' },
{ prop: 'form.telephone', label: '收件人电话' },
{ prop: 'form.email', label: '邮寄地址' },
{ prop: 'status_name', label: '审批状态' },
{ prop: 'approve_time1', label: '审批时间' },
{ prop: 'remark1', label: '审批备注' },
{
label: '操作',
attrs: { width: '100' },
buttons: [
{
label: '查看',
isShow(row) {
return row.status !== -1
},
onClick: row => {
this.$router.push({ name: 'studyCertView', params: { id: row.id }, query: { id: row.affair_id } })
}
},
{
label: '编辑',
isShow(row) {
return row.status === -1
},
onClick: row => {
this.$router.push({ name: 'studyCertEdit', params: { id: row.id }, query: { id: row.affair_id } })
}
},
{
label: '删除',
isShow(row) {
return row.status !== 2
},
onClick: row => {
this.handleRemove(row)
}
}
]
}
]
}
},
methods: {
// 新增
handleAdd() {
this.$router.push({ name: 'studyCertAdd', query: { id: this.affairId } })
}
}
}
</script>
<template>
<div>
<div class="con-title">
<div>{{ $t('pages.affairsHall.hall.title') }}</div>
</div>
<Tap :tapParam="tapParam" @tapParam="tapIndexs"></Tap>
<div class="con-box" v-if="affairId">
<component :is="currentComponent" :affairId="affairId"></component>
</div>
</div>
</template>
<script>
import * as api from '../api'
import Tap from '@/components/comTable/tap.vue'
// 学术活动
import ActivityList from './activity/list'
// 乐分享
import ShareList from './share/list'
// 重修
import RetakeList from './retake/list'
// 纸质成绩单
import PareportList from './reportPaper/list'
// 电子成绩单
import ElreportList from './reportE/list'
// 休学
import PauseStudyList from './studyPause/list'
// 复学
import ContinueStudyList from './studyContinue/list'
// 在职证明
import JobCertList from './certSchool/list'
// 在读证明
import StudyCertList from './certStudy/list'
export default {
components: {
Tap,
ActivityList,
ShareList,
RetakeList,
PareportList,
ElreportList,
PauseStudyList,
ContinueStudyList,
JobCertList,
StudyCertList
},
data() {
return {
types: [],
tapParam: [
{
name: '分类',
isShow: false,
selectIndex: 0,
key: 'cc',
arrItem: []
}
],
active: {}
}
},
computed: {
affairId() {
return this.active ? this.active.id : ''
},
currentComponent() {
const components = {
symposium: 'ActivityList',
sharing: 'ShareList',
retake: 'RetakeList',
pareport: 'PareportList',
elreport: 'ElreportList',
suspend: 'PauseStudyList',
return: 'ContinueStudyList',
job_certification: 'JobCertList',
learn_certification: 'StudyCertList'
}
return components[this.active.form_name]
}
},
methods: {
getTypes() {
api.getAffairType().then(response => {
const [first = {}] = response
this.active = first
this.types = response
const query = this.$route.query
if (query.id || query.channel) {
let index = 0
if (query.id) {
index = response.findIndex(item => item.id === query.id)
}
if (query.channel) {
index = response.findIndex(item => item.form_name === query.channel)
}
this.tapParam[0].selectIndex = index
this.active = response[index]
}
this.tapParam[0].arrItem = response.map(item => {
return Object.assign({}, item, { val: item.id, name: item.affair_name })
})
})
},
tapIndexs(data, rawData) {
this.active = rawData
}
},
beforeMount() {
this.getTypes()
}
}
</script>
<template>
<div>
<div class="con-title">电子成绩单申请</div>
<div class="con-box">
<el-button type="text" @click="goBack">返回列表</el-button>
<div class="main-form">
<el-form label-width="100px" :disabled="isView" ref="ruleForm" :model="ruleForm" :rules="rules">
<el-form-item>
<p>
电子成绩单可在从Sofia官网自行申请并获取,可参考文档:<a
href="https://zws-imgs-pub.oss-cn-beijing.aliyuncs.com/pc/sofia/Sofia%E5%A4%A7%E5%AD%A6%E7%94%B5%E5%AD%90%E6%88%90%E7%BB%A9%E5%8D%95%E7%94%B3%E8%AF%B7%E6%B5%81%E7%A8%8B.pdf"
target="_blank"
>电子成绩单说明文档</a
>
</p>
</el-form-item>
<el-form-item label="姓名" prop="personal_name">
<el-input v-model="ruleForm.personal_name" readonly />
</el-form-item>
<el-form-item label="班级" prop="class_name">
<el-input v-model="ruleForm.class_name" readonly />
</el-form-item>
<el-form-item label="Sofia ID" prop="sofia_id">
<el-input v-model="ruleForm.sofia_id" readonly />
</el-form-item>
<template v-if="isView">
<el-form-item label="审批状态" style="margin: 0">
{{ statusText }}
</el-form-item>
<el-form-item label="审批时间" style="margin: 0" v-if="detail.approve_time1">
{{ detail.approve_time1 }}
</el-form-item>
<el-form-item label="审批备注" style="margin: 0" v-if="detail.remark1 || detail.remark2">
{{ detail.remark1 || detail.remark2 }}
</el-form-item>
</template>
<el-form-item v-if="!this.isView">
<el-button type="primary" :loading="submitLoading" @click="handleSubmit">
{{ $t('pages.affairsHall.shareAdd.savesubmit') }}
</el-button>
<el-button type="info" @click="onRemove" v-if="hasAbort">撤回申请</el-button>
</el-form-item>
</el-form>
</div>
</div>
</div>
</template>
<script>
import editMixins from '../../mixins/edit'
export default {
mixins: [editMixins],
data() {
return {
ruleForm: {
affair_id: '',
personal_name: '',
class_name: '',
sofia_id: ''
},
rules: {
personal_name: [{ required: true, message: '请输入您的姓名', trigger: 'blur' }],
class_name: [{ required: true, message: '请输入您的班级', trigger: 'blur' }],
sofia_id: [{ required: true, message: '请输入Sofia ID', trigger: 'blur' }]
}
}
},
beforeMount() {
if (this.isEdit || this.isView) {
this.getDetail()
} else {
// 获取学生信息
this.getStudent()
}
}
}
</script>
<style lang="scss" scoped>
.main-form {
max-width: 600px;
margin: 0 auto;
}
.el-date-editor.el-input {
width: 100%;
}
</style>
<template>
<div>
<el-button type="primary" @click="handleAdd">申请电子成绩单</el-button>
<div style="height: 20px"></div>
<table-list :remote="remote" :columns="columns" ref="tableList"></table-list>
</div>
</template>
<script>
import listMixins from '../../mixins/list'
export default {
mixins: [listMixins],
data() {
return {
columns: [
{ prop: 'form.sofia_id', label: 'Sofia ID' },
{ prop: 'form.class_name', label: '班级' },
{ prop: 'status_name', label: '审批状态' },
{ prop: 'approve_time1', label: '审批时间' },
{ prop: 'remark1', label: '审批备注' },
{
label: '操作',
attrs: { width: '180' },
buttons: [
{
label: '查看',
isShow(row) {
return row.status !== -1
},
onClick: row => {
this.$router.push({ name: 'elreportView', params: { id: row.id }, query: { id: row.affair_id } })
}
},
{
label: '下载',
isShow(row) {
return row.status === 1
},
onClick: row => {
console.log(row)
}
},
{
label: '编辑',
isShow(row) {
return row.status === -1
},
onClick: row => {
this.$router.push({ name: 'elreportEdit', params: { id: row.id }, query: { id: row.affair_id } })
}
},
{
label: '删除',
isShow(row) {
return row.status === -1
},
onClick: row => {
this.handleRemove(row)
}
}
]
}
]
}
},
methods: {
// 新增
handleAdd() {
this.$router.push({ name: 'elreportAdd', query: { id: this.affairId } })
}
}
}
</script>
<template>
<div>
<div class="con-title">纸质成绩单申请</div>
<div class="con-box">
<el-button type="text" @click="goBack">返回列表</el-button>
<div class="main-form">
<el-form label-width="180px" :disabled="isView" ref="ruleForm" :model="ruleForm" :rules="rules">
<el-form-item label="姓名" prop="personal_name">
<el-input v-model="ruleForm.personal_name" readonly />
</el-form-item>
<el-form-item label="班级" prop="class_name">
<el-input v-model="ruleForm.class_name" readonly />
</el-form-item>
<el-form-item label="Sofia ID" prop="sofia_id">
<el-input v-model="ruleForm.sofia_id" readonly />
</el-form-item>
<el-form-item label="成绩单收件人是否为本人" prop="is_self">
<el-radio-group v-model="ruleForm.is_self">
<el-radio label="1"></el-radio>
<el-radio label="2"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="收件人名字" prop="receive_name" v-if="ruleForm.is_self !== '1'">
<el-input v-model="ruleForm.receive_name" />
</el-form-item>
<el-form-item label="收件人联系电话" prop="telephone">
<el-input v-model="ruleForm.telephone" />
</el-form-item>
<el-form-item label="邮寄地址" prop="email">
<el-input type="textarea" v-model="ruleForm.email" :autosize="{ minRows: 3 }" />
<div style="line-height: 20px">
国内大陆地区顺丰或EMS包邮,偏远地区及港澳台地区请联系班主任,根据实际情况收取快递费用。
</div>
</el-form-item>
<el-form-item label="需打印份数" prop="number">
<el-select v-model="ruleForm.number" :disabled="isPaid">
<el-option v-for="item in productList" :key="item.value" :label="item.label" :value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="支付方式" prop="payment">
<el-radio-group v-model="ruleForm.payment" :disabled="isPaid">
<div v-for="item in payList" :key="item.value" style="margin: 10px 0">
<el-radio :label="item.value">{{ item.label }}</el-radio>
</div>
</el-radio-group>
</el-form-item>
<template v-if="isView">
<el-form-item label="支付方式" style="margin: 0" v-if="detail.pay !== -1">
{{ payText }}
</el-form-item>
<el-form-item label="支付状态" style="margin: 0" v-if="detail.pay !== -1">
{{ payStatusText }}
</el-form-item>
<el-form-item label="审批状态" style="margin: 0">
{{ statusText }}
</el-form-item>
<el-form-item label="审批时间" style="margin: 0" v-if="detail.approve_time1">
{{ detail.approve_time1 }}
</el-form-item>
<el-form-item label="审批备注" style="margin: 0" v-if="detail.remark1 || detail.remark2">
{{ detail.remark1 || detail.remark2 }}
</el-form-item>
</template>
<el-form-item v-if="!this.isView">
<el-button type="primary" :loading="submitLoading" @click="handleSubmit(handleSubmitSuccess)" v-if="!isPaid"
>去支付</el-button
>
<el-button type="primary" :loading="submitLoading" @click="handleSubmit" v-else>保存并提交</el-button>
<el-button type="info" @click="onRemove" v-if="hasAbort">撤回申请</el-button>
</el-form-item>
</el-form>
</div>
</div>
<el-dialog title="支付" width="400px" :visible.sync="payVisible">
<pay :payment="ruleForm.payment" :productId="productId" @success="handlePaySuccess" v-if="payVisible"></pay>
</el-dialog>
</div>
</template>
<script>
import * as api from '../../api'
import editMixins from '../../mixins/edit'
import Pay from '../../components/pay'
export default {
mixins: [editMixins],
components: { Pay },
data() {
return {
ruleForm: {
affair_id: '',
personal_name: '',
class_name: '',
sofia_id: '',
number: '1',
is_self: '1',
receive_name: '',
telephone: '',
email: '',
payment: '2'
},
rules: {
personal_name: [{ required: true, message: '请输入您的姓名', trigger: 'blur' }],
class_name: [{ required: true, message: '请输入您的班级', trigger: 'blur' }],
sofia_id: [{ required: true, message: '请输入Sofia ID', trigger: 'blur' }],
number: [{ required: true, message: '请输入需打印份数', trigger: 'blur' }],
receive_name: [{ required: true, message: '请输入收件人名字', trigger: 'blur' }],
telephone: [{ required: true, message: '请输入收件人联系电话', trigger: 'blur' }],
email: [{ required: true, message: '请输入邮寄地址', trigger: 'blur' }]
},
productList: [
{ label: '1份—¥126元', value: '1', product_id: '6747325185390542848' },
{ label: '2份—¥201元', value: '2', product_id: '6747325279879823360' },
{ label: '3份—¥276元', value: '3', product_id: '6747325351686307840' }
],
payVisible: false
}
},
watch: {
'$route.query': {
immediate: true,
handler(query) {
this.payVisible = query.pay === '1'
}
}
},
computed: {
productId() {
const found = this.productList.find(item => item.value === this.ruleForm.number)
return found ? found.product_id : ''
}
},
methods: {
handleSubmitSuccess(response) {
if (!this.isEdit) {
this.$router
.replace({ name: 'pareportEdit', params: { id: response.data.id }, query: { id: this.affairId, pay: '1' } })
.then(this.getDetail)
}
this.handlePay()
},
// 去支付
handlePay() {
this.payVisible = true
},
// 支付成功
handlePaySuccess() {
api.paySuccess(this.pid).then(response => {
this.getDetail()
this.payVisible = false
})
}
},
beforeMount() {
if (this.isEdit || this.isView) {
this.getDetail()
} else {
// 获取学生信息
this.getStudent()
}
}
}
</script>
<style lang="scss" scoped>
.main-form {
max-width: 600px;
margin: 0 auto;
}
.el-date-editor.el-input {
width: 100%;
}
</style>
<template>
<div>
<el-button type="primary" @click="handleAdd">申请纸质成绩单</el-button>
<div style="height: 20px"></div>
<table-list :remote="remote" :columns="columns" ref="tableList"></table-list>
</div>
</template>
<script>
import listMixins from '../../mixins/list'
export default {
mixins: [listMixins],
data() {
return {
columns: [
{ prop: 'form.number', label: '份数' },
{ prop: 'form.price', label: '费用' },
{ prop: 'form.receive_name', label: '收件人' },
{ prop: 'form.telephone', label: '收件人电话' },
{ prop: 'form.email', label: '邮寄地址' },
{ prop: 'status_name', label: '审批状态' },
{ prop: 'approve_time1', label: '审批时间' },
{ prop: 'remark1', label: '审批备注' },
{
label: '操作',
attrs: { width: '160' },
buttons: [
{
label: '查看',
isShow(row) {
return row.status !== -1
},
onClick: row => {
this.$router.push({ name: 'pareportView', params: { id: row.id }, query: { id: row.affair_id } })
}
},
{
label: '编辑',
isShow(row) {
return row.status === -1
},
onClick: row => {
this.$router.push({ name: 'pareportEdit', params: { id: row.id }, query: { id: row.affair_id } })
}
},
{
label: '删除',
isShow(row) {
return row.status === -1
},
onClick: row => {
this.handleRemove(row)
}
}
]
}
]
}
},
methods: {
// 新增
handleAdd() {
this.$router.push({ name: 'pareportAdd', query: { id: this.affairId } })
}
}
}
</script>
<template>
<div>
<div class="con-title">重修申请</div>
<div class="con-box">
<el-button type="text" @click="goBack">返回列表</el-button>
<el-form
ref="ruleForm"
:model="ruleForm"
:rules="rules"
:disabled="isView"
label-width="100px"
class="main-form"
v-loading="loading"
>
<el-form-item label="姓名" prop="personal_name">
<el-input v-model="ruleForm.personal_name" :disabled="disabledInfo" readonly />
</el-form-item>
<el-form-item label="班级" prop="class_name">
<el-input v-model="ruleForm.class_name" :disabled="disabledInfo" readonly />
</el-form-item>
<el-form-item label="Sofia ID" prop="sofia_id">
<el-input v-model="ruleForm.sofia_id" :disabled="disabledInfo" readonly />
</el-form-item>
<el-form-item label="重修时间" prop="semester_name">
<el-radio-group
v-model="ruleForm.semester_name"
:disabled="disabledInfo"
style="line-height: 30px; margin-top: 10px"
>
<div v-for="item in semesterList" :key="item.value">
<el-radio :label="item.value"></el-radio>
</div>
</el-radio-group>
</el-form-item>
<el-form-item label="重修课程" prop="course_id">
<el-checkbox-group
v-model="ruleForm.course_id"
:disabled="disabledInfo"
style="line-height: 24px; margin-top: 10px"
>
<div v-for="item in currentCourseList" :key="item.id">
<el-checkbox :label="item.id">{{ item.course_name }}</el-checkbox>
</div>
</el-checkbox-group>
<div class="score" v-if="(hasPay || isView) && detail.form">{{ detail.form.credit_sum_str }}</div>
</el-form-item>
<template v-if="isView">
<el-form-item label="支付方式" style="margin: 0" v-if="detail.pay !== -1">
{{ payText }}
</el-form-item>
<el-form-item label="支付状态" style="margin: 0" v-if="detail.pay !== -1 && ruleForm.payment !== '3'">
{{ payStatusText }}
</el-form-item>
<el-form-item label="审批状态" style="margin: 0">
{{ statusText }}
</el-form-item>
<el-form-item label="审批时间" style="margin: 0" v-if="detail.approve_time1">
{{ detail.approve_time1 }}
</el-form-item>
<el-form-item label="审批备注" style="margin: 0" v-if="detail.remark1 || detail.remark2">
{{ detail.remark1 || detail.remark2 }}
</el-form-item>
</template>
<template v-if="hasPay">
<el-form-item label="支付方式" prop="payment">
<el-radio-group v-model="ruleForm.payment">
<div v-for="item in payList" :key="item.value" style="margin: 10px 0">
<el-radio :label="item.value">{{ item.label }}</el-radio>
</div>
</el-radio-group>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handlePay">去支付</el-button>
</el-form-item>
</template>
<el-form-item v-else>
<el-button type="primary" :loading="submitLoading" @click="handleSubmit" v-if="!isView">保存并提交</el-button>
<el-button type="info" @click="onRemove" v-if="hasAbort">撤回申请</el-button>
</el-form-item>
</el-form>
</div>
<el-dialog title="支付" width="400px" :visible.sync="payVisible">
<pay
:payment="ruleForm.payment"
:productId="productId"
:num="detail.form.credit"
@success="handlePaySuccess"
v-if="payVisible"
></pay>
</el-dialog>
</div>
</template>
<script>
import * as api from '../../api'
import editMixins from '../../mixins/edit'
import Pay from '../../components/pay'
export default {
mixins: [editMixins],
components: { Pay },
data() {
return {
loading: false,
ruleForm: {
personal_name: '',
class_name: '',
sofia_id: '123',
semester_name: '',
course_id: [],
payment: '2'
},
rules: {
personal_name: [{ required: true, message: '请输入您的姓名', trigger: 'blur' }],
class_name: [{ required: true, message: '请输入您的班级', trigger: 'blur' }],
sofia_id: [{ required: true, message: '请输入Sofia ID', trigger: 'blur' }],
semester_name: [{ required: true, message: '请选择您的重修时间', trigger: 'blur' }],
course_id: [{ required: true, message: '请选择您的重修课程', trigger: 'blur' }]
},
courseList: [], // 课程列表
submitedCourseList: [], // 提交的课程列表
productId: '6745273257873637376', // 商品ID
payVisible: false
}
},
computed: {
currentCourseList() {
if (this.isView) {
return this.submitedCourseList
}
return this.courseList.concat(this.submitedCourseList)
}
},
methods: {
init() {
if (this.isEdit || this.isView) {
this.getDetail()
} else {
// 获取学生信息
this.getStudent()
}
// 获取重修课程
this.getCourses()
},
// 获取课程
getCourses() {
api
.getRetakeCourses()
.then(response => {
this.courseList = response || []
if (!this.isEdit && !this.isView && !this.courseList.length) {
this.$alert('您没有需要重修的课程', {
type: 'warning',
confirmButtonText: '确定',
callback: action => {
this.goBack()
}
})
}
})
.catch(() => {
if (!this.isEdit && !this.isView) {
this.$alert('您没有需要重修的课程', {
type: 'warning',
confirmButtonText: '确定',
callback: action => {
this.goBack()
}
})
}
})
},
// 获取详情
getDetail() {
this.loading = true
api
.getAffair(this.pid)
.then(response => {
const form = response.form
if (form.course_name_arr) {
form.course_id = form.course_name_arr.map(item => item.course_id)
this.submitedCourseList = form.course_name_arr.map(item => {
item.id = item.course_id
return item
})
}
// 设置表单数据
const ruleForm = this.$_.pick(response.form, [
'personal_name',
'class_name',
'sofia_id',
'semester_name',
'course_id',
'payment'
])
Object.assign(this.ruleForm, ruleForm)
// 设置接口返回的数据
this.detail = response
})
.finally(() => {
this.loading = false
})
},
// 提交
handleSubmit(callback) {
this.$refs.ruleForm.validate().then(() => {
const params = Object.assign({}, this.ruleForm, { affair_id: this.affairId })
params.course_id = this.ruleForm.course_id.join(',')
this.isEdit ? this.handleUpdate(params, callback) : this.handleAdd(params, callback)
})
},
// 去支付
handlePay() {
this.handleSubmit(() => {
this.payVisible = true
})
},
// 支付成功
handlePaySuccess() {
api.paySuccess(this.pid).then(response => {
this.$router.replace({ name: 'retakeView', params: { id: this.pid }, query: { id: this.affairId } })
})
}
},
beforeMount() {
this.init()
}
}
</script>
<style lang="scss" scoped>
.main-form {
max-width: 600px;
margin: 0 auto;
}
::v-deep .el-form--label-top .el-form-item__label {
line-height: 2;
}
.score {
color: #b80037;
}
</style>
<template>
<div>
<el-button type="primary" @click="handleAdd">申请重修</el-button>
<div style="height: 20px"></div>
<table-list :remote="remote" :columns="columns" ref="tableList"></table-list>
</div>
</template>
<script>
import listMixins from '../../mixins/list'
export default {
mixins: [listMixins],
data() {
return {
columns: [
{ prop: 'form.sofia_id', label: 'Sofia ID' },
{ prop: 'form.semester_name', label: '重修时间' },
{ prop: 'form.course_name', label: '重修课程' },
{ prop: 'status_name', label: '审批状态', attrs: { width: '100' } },
{ prop: 'approve_time1', label: '审批时间', attrs: { width: '160' } },
{ prop: 'remark1', label: '审批备注' },
{
label: '操作',
attrs: { width: '160' },
buttons: [
{
label: '查看',
isShow(row) {
return row.status !== -1
},
onClick: row => {
this.$router.push({ name: 'retakeView', params: { id: row.id }, query: { id: row.affair_id } })
}
},
{
label: '支付',
isShow(row) {
return row.pay === 0
},
onClick: row => {
this.$router.push({ name: 'retakeEdit', params: { id: row.id }, query: { id: row.affair_id } })
}
},
{
label: '编辑',
isShow(row) {
return row.status === -1
},
onClick: row => {
this.$router.push({ name: 'retakeEdit', params: { id: row.id }, query: { id: row.affair_id } })
}
},
{
label: '撤销',
isShow(row) {
return row.status === -1
},
onClick: row => {
this.handleCancel(row)
}
}
]
}
]
}
},
methods: {
// 新增
handleAdd() {
this.$router.push({ name: 'retakeAdd', query: { id: this.affairId } })
}
}
}
</script>
<template>
<div>
<div class="con-title">{{ $t('pages.affairsHall.shareAdd.shareapplication') }}</div>
<div class="con-box">
<el-button type="text" @click="goBack">{{ $t('pages.affairsHall.shareAdd.backlist') }}</el-button>
<div class="main-form">
<el-form label-width="100px" :disabled="isView" ref="ruleForm" :model="ruleForm" :rules="rules">
<el-form-item :label="$t('pages.affairsHall.shareAdd.sname')" prop="personal_name">
<el-input v-model="ruleForm.personal_name" :placeholder="$t('pages.affairsHall.shareAdd.inputname')" />
</el-form-item>
<el-form-item :label="$t('pages.affairsHall.shareAdd.industry')" prop="trade_name">
<el-input v-model="ruleForm.trade_name" :placeholder="$t('pages.affairsHall.shareAdd.inputindustry')" />
</el-form-item>
<el-form-item :label="$t('pages.affairsHall.shareAdd.age')" prop="age">
<el-input v-model="ruleForm.age" :placeholder="$t('pages.affairsHall.shareAdd.inputage')" />
</el-form-item>
<el-form-item :label="$t('pages.affairsHall.shareAdd.classs')" prop="class_name">
<el-input v-model="ruleForm.class_name" :placeholder="$t('pages.affairsHall.shareAdd.inputclasss')" />
</el-form-item>
<el-form-item :label="$t('pages.affairsHall.shareAdd.phone')" prop="telephone">
<el-input v-model="ruleForm.telephone" :placeholder="$t('pages.affairsHall.shareAdd.inputphone')" />
</el-form-item>
<el-form-item :label="$t('pages.affairsHall.shareAdd.Sharingthemes')" prop="sharing_theme">
<el-input
v-model="ruleForm.sharing_theme"
:placeholder="$t('pages.affairsHall.shareAdd.inputSharingthemes')"
/>
</el-form-item>
<template v-if="isView">
<el-form-item v-if="detail.approve_time" :label="$t('pages.affairsHall.shareAdd.approvalTime')">
<el-input v-model="detail.approve_time" />
</el-form-item>
<el-form-item v-if="detail.remark1" :label="$t('pages.affairsHall.shareAdd.remarks')">
<el-input v-model="detail.remark1" maxlength="50" type="textarea" :autosize="{ minRows: 5 }" />
</el-form-item>
</template>
<el-form-item v-if="!this.isView">
<el-button type="primary" :loading="submitLoading" @click="handleSubmit">
{{ $t('pages.affairsHall.shareAdd.savesubmit') }}
</el-button>
</el-form-item>
</el-form>
</div>
</div>
</div>
</template>
<script>
import editMixins from '../../mixins/edit'
export default {
mixins: [editMixins],
data() {
return {
ruleForm: {
personal_name: '',
trade_name: '',
age: '',
class_name: '',
telephone: '',
sharing_theme: '',
affair_id: ''
},
rules: {
personal_name: [{ required: true, message: '请输入您的姓名', trigger: 'blur' }],
trade_name: [{ required: true, message: '请输入您的行业', trigger: 'blur' }],
age: [{ required: true, message: '请输入您的年龄', trigger: 'blur' }],
class_name: [{ required: true, message: '请输入您的班级', trigger: 'blur' }],
telephone: [{ required: true, message: '请输入您的电话', trigger: 'blur' }],
sharing_theme: [{ required: true, message: '请输入分享主题', trigger: 'blur' }]
}
}
},
beforeMount() {
if (this.isEdit || this.isView) {
this.getDetail()
}
}
}
</script>
<style lang="scss" scoped>
.main-form {
max-width: 600px;
margin: 0 auto;
}
.el-date-editor.el-input {
width: 100%;
}
</style>
<template>
<div>
<el-button type="primary" @click="handleAdd">申请新乐分享</el-button>
<div style="height: 20px"></div>
<table-list :remote="remote" :columns="columns" ref="tableList"></table-list>
</div>
</template>
<script>
import listMixins from '../../mixins/list'
export default {
mixins: [listMixins],
data() {
return {
columns: [
{ prop: 'form.sharing_theme', label: '分享主题' },
{ prop: 'form.class_name', label: '班级' },
{ prop: 'form.personal_name', label: '申请人' },
{ prop: 'form.telephone', label: '电话' },
{ prop: 'status_name', label: '审批状态' },
{ prop: 'approve_time1', label: '审批时间' },
{ prop: 'remark1', label: '审批备注' },
{
label: '操作',
attrs: { width: '100' },
buttons: [
{
label: '查看',
isShow(row) {
return row.status !== -1
},
onClick: row => {
this.$router.push({ name: 'shareView', params: { id: row.id }, query: { id: row.affair_id } })
}
},
{
label: '编辑',
isShow(row) {
return row.status === -1
},
onClick: row => {
this.$router.push({ name: 'shareEdit', params: { id: row.id }, query: { id: row.affair_id } })
}
},
{
label: '删除',
isShow(row) {
return row.status === -1
},
onClick: row => {
this.handleRemove(row)
}
}
]
}
]
}
},
methods: {
// 新增
handleAdd() {
this.$router.push({ name: 'shareAdd', query: { id: this.affairId } })
}
}
}
</script>
<template>
<div>
<div class="con-title">复学申请</div>
<div class="con-box">
<el-button type="text" @click="goBack">返回列表</el-button>
<div class="main-form">
<el-form label-width="120px" :disabled="isView" ref="ruleForm" :model="ruleForm" :rules="rules">
<el-form-item label="姓名" prop="personal_name">
<el-input v-model="ruleForm.personal_name" readonly />
</el-form-item>
<el-form-item label="班级" prop="class_name">
<el-input v-model="ruleForm.class_name" readonly />
</el-form-item>
<el-form-item label="Sofia ID" prop="sofia_id">
<el-input v-model="ruleForm.sofia_id" readonly />
</el-form-item>
<el-form-item label="复学时间" prop="semester_name">
<el-radio-group v-model="ruleForm.semester_name">
<div v-for="item in semesterList" :key="item.value" style="margin: 10px 0">
<el-radio :label="item.value">{{ item.value }}</el-radio>
</div>
</el-radio-group>
</el-form-item>
<template v-if="isView">
<el-form-item label="审批状态" style="margin: 0">
{{ statusText }}
</el-form-item>
<el-form-item label="审批时间" style="margin: 0" v-if="detail.approve_time1">
{{ detail.approve_time1 }}
</el-form-item>
<el-form-item label="审批备注" style="margin: 0" v-if="detail.remark1 || detail.remark2">
{{ detail.remark1 || detail.remark2 }}
</el-form-item>
</template>
<el-form-item v-if="!this.isView">
<el-button type="primary" :loading="submitLoading" @click="handleSubmit">
{{ $t('pages.affairsHall.shareAdd.savesubmit') }}
</el-button>
<el-button type="info" @click="onRemove" v-if="hasAbort">撤回申请</el-button>
</el-form-item>
</el-form>
</div>
</div>
</div>
</template>
<script>
import editMixins from '../../mixins/edit'
export default {
mixins: [editMixins],
data() {
return {
ruleForm: {
affair_id: '',
personal_name: '',
class_name: '',
sofia_id: '',
semester_name: ''
},
rules: {
personal_name: [{ required: true, message: '请输入您的姓名', trigger: 'blur' }],
class_name: [{ required: true, message: '请输入您的班级', trigger: 'blur' }],
sofia_id: [{ required: true, message: '请输入Sofia ID', trigger: 'blur' }],
semester_name: [{ required: true, message: '请选择复学时间', trigger: 'blur' }]
},
// 学期列表
semesterList: [
{ value: '春季学期(4月11日---7月10日)' },
{ value: '夏季学期(7月11日---10月10日)' },
{ value: '秋季学期(10月11日---1月10日)' },
{ value: '冬季学期(1月11日---4月10日)' }
]
}
},
beforeMount() {
if (this.isEdit || this.isView) {
this.getDetail()
} else {
// 获取学生信息
this.getStudent()
}
}
}
</script>
<style lang="scss" scoped>
.main-form {
max-width: 600px;
margin: 0 auto;
}
.el-date-editor.el-input {
width: 100%;
}
</style>
<template>
<div>
<el-button type="primary" @click="handleAdd">申请复学</el-button>
<div style="height: 20px"></div>
<table-list :remote="remote" :columns="columns" ref="tableList"></table-list>
</div>
</template>
<script>
import listMixins from '../../mixins/list'
export default {
mixins: [listMixins],
data() {
return {
columns: [
{ prop: 'form.sofia_id', label: 'Sofia ID' },
{ prop: 'form.class_name', label: '班级' },
{ prop: 'form.semester_name', label: '复学时间' },
{ prop: 'status_name', label: '审批状态' },
{ prop: 'approve_time1', label: '审批时间' },
{ prop: 'remark1', label: '审批备注' },
{
label: '操作',
attrs: { width: '100' },
buttons: [
{
label: '查看',
isShow(row) {
return row.status !== -1
},
onClick: row => {
this.$router.push({ name: 'continueStudyView', params: { id: row.id }, query: { id: row.affair_id } })
}
},
{
label: '编辑',
isShow(row) {
return row.status === -1
},
onClick: row => {
this.$router.push({ name: 'continueStudyEdit', params: { id: row.id }, query: { id: row.affair_id } })
}
},
{
label: '删除',
isShow(row) {
return row.status === -1
},
onClick: row => {
this.handleRemove(row)
}
}
]
}
]
}
},
methods: {
// 新增
handleAdd() {
this.$router.push({ name: 'continueStudyAdd', query: { id: this.affairId } })
}
}
}
</script>
<template>
<div>
<div class="con-title">休学申请</div>
<div class="con-box">
<el-button type="text" @click="goBack">返回列表</el-button>
<div class="main-form">
<el-form label-width="120px" :disabled="isView" ref="ruleForm" :model="ruleForm" :rules="rules">
<el-form-item label="姓名" prop="personal_name">
<el-input v-model="ruleForm.personal_name" readonly />
</el-form-item>
<el-form-item label="班级" prop="class_name">
<el-input v-model="ruleForm.class_name" readonly />
</el-form-item>
<el-form-item label="Sofia ID" prop="sofia_id">
<el-input v-model="ruleForm.sofia_id" readonly />
</el-form-item>
<el-form-item label="休学时间" prop="semester_name">
<el-radio-group v-model="ruleForm.semester_name">
<div v-for="item in semesterList" :key="item.value" style="margin: 10px 0">
<el-radio :label="item.value">{{ item.value }}</el-radio>
</div>
</el-radio-group>
</el-form-item>
<el-form-item label="休学原因" prop="reason">
<el-input type="textarea" v-model="ruleForm.reason" :autosize="{ minRows: 5 }" />
</el-form-item>
<template v-if="isView">
<el-form-item label="审批状态" style="margin: 0">
{{ statusText }}
</el-form-item>
<el-form-item label="审批时间" style="margin: 0" v-if="detail.approve_time1">
{{ detail.approve_time1 }}
</el-form-item>
<el-form-item label="审批备注" style="margin: 0" v-if="detail.remark1 || detail.remark2">
{{ detail.remark1 || detail.remark2 }}
</el-form-item>
</template>
<el-form-item v-if="!this.isView">
<el-button type="primary" :loading="submitLoading" @click="handleSubmit">
{{ $t('pages.affairsHall.shareAdd.savesubmit') }}
</el-button>
<el-button type="info" @click="onRemove" v-if="hasAbort">撤回申请</el-button>
</el-form-item>
</el-form>
</div>
</div>
</div>
</template>
<script>
import editMixins from '../../mixins/edit'
export default {
mixins: [editMixins],
data() {
return {
ruleForm: {
affair_id: '',
personal_name: '',
class_name: '',
sofia_id: '',
semester_name: '',
reason: ''
},
rules: {
personal_name: [{ required: true, message: '请输入您的姓名', trigger: 'blur' }],
class_name: [{ required: true, message: '请输入您的班级', trigger: 'blur' }],
sofia_id: [{ required: true, message: '请输入Sofia ID', trigger: 'blur' }],
semester_name: [{ required: true, message: '请选择休学时间', trigger: 'blur' }],
reason: [{ required: true, message: '请输入休学原因', trigger: 'blur' }]
},
// 学期列表
semesterList: [
{ value: '春季学期(4月11日---7月10日)' },
{ value: '夏季学期(7月11日---10月10日)' },
{ value: '秋季学期(10月11日---1月10日)' },
{ value: '冬季学期(1月11日---4月10日)' }
]
}
},
beforeMount() {
if (this.isEdit || this.isView) {
this.getDetail()
} else {
// 获取学生信息
this.getStudent()
}
}
}
</script>
<style lang="scss" scoped>
.main-form {
max-width: 600px;
margin: 0 auto;
}
.el-date-editor.el-input {
width: 100%;
}
</style>
<template>
<div>
<el-button type="primary" @click="handleAdd">申请休学</el-button>
<div style="height: 20px"></div>
<table-list :remote="remote" :columns="columns" ref="tableList"></table-list>
</div>
</template>
<script>
import listMixins from '../../mixins/list'
export default {
mixins: [listMixins],
data() {
return {
columns: [
{ prop: 'form.sofia_id', label: 'Sofia ID' },
{ prop: 'form.semester_name', label: '休学时间' },
{ prop: 'form.reason', label: '休学原因' },
{ prop: 'status_name', label: '审批状态' },
{ prop: 'approve_time1', label: '审批时间' },
{ prop: 'remark1', label: '审批备注' },
{
label: '操作',
attrs: { width: '100' },
buttons: [
{
label: '查看',
isShow(row) {
return row.status !== -1
},
onClick: row => {
this.$router.push({ name: 'pauseStudyView', params: { id: row.id }, query: { id: row.affair_id } })
}
},
{
label: '编辑',
isShow(row) {
return row.status === -1
},
onClick: row => {
this.$router.push({ name: 'pauseStudyEdit', params: { id: row.id }, query: { id: row.affair_id } })
}
},
{
label: '删除',
isShow(row) {
return row.status === -1
},
onClick: row => {
this.handleRemove(row)
}
}
]
}
]
}
},
methods: {
// 新增
handleAdd() {
this.$router.push({ name: 'pauseStudyAdd', query: { id: this.affairId } })
}
}
}
</script>
...@@ -85,7 +85,9 @@ export default { ...@@ -85,7 +85,9 @@ export default {
immediate: true, immediate: true,
handler(data) { handler(data) {
this.detail = data.paper this.detail = data.paper
this.questions = data.paper ? this.genQuestions(data.paper.examination) : [] if (!this.questions.length) {
this.questions = data.paper ? this.genQuestions(data.paper.examination) : []
}
} }
} }
}, },
...@@ -177,21 +179,30 @@ export default { ...@@ -177,21 +179,30 @@ export default {
}, },
// 获取考试结果 // 获取考试结果
getExamResult() { getExamResult() {
api.getCourseExamResult(this.sid, this.cid, this.pid, { paper_type: 0 }).then(response => { this.loading = true
// 设置问题列表数据 api
if (response.code !== 8001) { .getCourseExamResult(this.sid, this.cid, this.pid, { paper_type: 0 })
this.isStartExam = true .then(response => {
this.exam = response // 设置问题列表数据
this.questions = this.genQuestions(response.sheet) if (response.code !== 8001) {
// 自动提交 this.isStartExam = true
if (this.isStartExam && !this.isSubmited && !this.isExamComplete) { this.exam = response
this.autoSubmit() this.questions = this.genQuestions(response.sheet)
// 自动提交
if (this.isStartExam && !this.isSubmited && !this.isExamComplete) {
this.autoSubmit()
}
} }
} })
}) .finally(() => {
this.loading = false
})
}, },
// 提交校验 // 提交校验
checkSubmit() { checkSubmit() {
if (!this.questions.length) {
return
}
for (let i = 0; i < this.questions.length; i++) { for (let i = 0; i < this.questions.length; i++) {
const questions = this.questions[i] const questions = this.questions[i]
for (let k = 0; k < questions.length; k++) { for (let k = 0; k < questions.length; k++) {
......
...@@ -60,7 +60,9 @@ export default { ...@@ -60,7 +60,9 @@ export default {
chapter: { chapter: {
immediate: true, immediate: true,
handler(data) { handler(data) {
this.questions = data.homework ? this.genQuenstions(data.homework.questions) : [] if (!this.questions.length) {
this.questions = data.homework ? this.genQuestions(data.homework.questions) : []
}
} }
} }
}, },
...@@ -118,7 +120,7 @@ export default { ...@@ -118,7 +120,7 @@ export default {
} }
return item return item
}) })
this.questions = this.genQuenstions(this.questions) this.questions = this.genQuestions(this.questions)
} }
}) })
.finally(() => { .finally(() => {
...@@ -126,7 +128,7 @@ export default { ...@@ -126,7 +128,7 @@ export default {
}) })
}, },
// 组装问题数据 // 组装问题数据
genQuenstions(list) { genQuestions(list) {
if (!list) { if (!list) {
return [] return []
} }
...@@ -165,9 +167,12 @@ export default { ...@@ -165,9 +167,12 @@ export default {
}, },
// 提交校验 // 提交校验
checkSubmit() { checkSubmit() {
const quenstions = this.questions const questions = this.questions
for (let i = 0; i < quenstions.length; i++) { if (!questions.length) {
const value = quenstions[i].formModel.user_answer return
}
for (let i = 0; i < questions.length; i++) {
const value = questions[i].formModel.user_answer
if (Array.isArray(value) ? !value.length : !value) { if (Array.isArray(value) ? !value.length : !value) {
return false return false
} }
......
...@@ -53,7 +53,7 @@ ...@@ -53,7 +53,7 @@
</div> </div>
</template> </template>
<template v-else-if="detail.created_time"> <template v-else-if="detail.created_time">
<p class="help">{{ $t('viewerWork.deadline', { time: detail.created_time }) }}</p> <p class="help">{{ $t('viewerWork.submitted', { time: detail.created_time }) }}</p>
<template v-if="detail.updated_time && detail.updated_time !== detail.created_time"> <template v-if="detail.updated_time && detail.updated_time !== detail.created_time">
<p class="help">{{ $t('viewerWork.submitDateTime') }} {{ detail.updated_time }}</p> <p class="help">{{ $t('viewerWork.submitDateTime') }} {{ detail.updated_time }}</p>
</template> </template>
...@@ -116,7 +116,9 @@ export default { ...@@ -116,7 +116,9 @@ export default {
chapter: { chapter: {
immediate: true, immediate: true,
handler(data) { handler(data) {
this.questions = data.homework ? this.genQuenstions(data.homework.questions) : [] if (!this.questions.length) {
this.questions = data.homework ? this.genQuestions(data.homework.questions) : []
}
} }
} }
}, },
...@@ -183,7 +185,7 @@ export default { ...@@ -183,7 +185,7 @@ export default {
} }
return item return item
}) })
this.questions = this.genQuenstions(this.questions) this.questions = this.genQuestions(this.questions)
} }
}) })
.finally(() => { .finally(() => {
...@@ -191,7 +193,7 @@ export default { ...@@ -191,7 +193,7 @@ export default {
}) })
}, },
// 组装问题数据 // 组装问题数据
genQuenstions(list) { genQuestions(list) {
if (!list) { if (!list) {
return [] return []
} }
...@@ -230,9 +232,9 @@ export default { ...@@ -230,9 +232,9 @@ export default {
}, },
// 提交校验 // 提交校验
checkSubmit() { checkSubmit() {
const quenstions = this.questions const questions = this.questions
for (let i = 0; i < quenstions.length; i++) { for (let i = 0; i < questions.length; i++) {
const value = quenstions[i].formModel.user_answer const value = questions[i].formModel.user_answer
if (Array.isArray(value) ? !value.length : !value) { if (Array.isArray(value) ? !value.length : !value) {
return false return false
} }
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
<el-step :title="$t('viewerWork.workStep1')" status="process"> <el-step :title="$t('viewerWork.workStep1')" status="process">
<template v-slot:description> <template v-slot:description>
<div v-html="data.curriculum.curriculum_essay"></div> <div v-html="data.curriculum.curriculum_essay"></div>
<p>{{ $t('viewerWork.workDeadline') }}{{ data.essay_date }}</p> <p>{{ $t('viewerWork.workDeadline') }}{{ data.end_date }}</p>
</template> </template>
</el-step> </el-step>
<el-step :title="$t('viewerWork.workStep2')" status="process"> <el-step :title="$t('viewerWork.workStep2')" status="process">
...@@ -40,6 +40,7 @@ ...@@ -40,6 +40,7 @@
</template> </template>
</el-step> </el-step>
<el-step :title="$t('viewerWork.workStep3')" status="process"> <el-step :title="$t('viewerWork.workStep3')" status="process">
<template #title>{{ $t('viewerWork.workStep3') }}{{ data.end_date }}</p></template>
<template v-slot:description> <template v-slot:description>
<div class="work-bottom" v-if="detail"> <div class="work-bottom" v-if="detail">
<div class="info"> <div class="info">
......
...@@ -2,15 +2,23 @@ ...@@ -2,15 +2,23 @@
<div> <div>
<div class="con-title">{{ $t('pages.affairsHall.uploadReport.title') }}</div> <div class="con-title">{{ $t('pages.affairsHall.uploadReport.title') }}</div>
<div class="con-box"> <div class="con-box">
<el-button type="text" @click='gobackActiveList'>{{ $t('pages.affairsHall.uploadReport.backText') }}</el-button> <el-button type="text" @click="gobackActiveList">{{ $t('pages.affairsHall.uploadReport.backText') }}</el-button>
<el-row type="flex" justify="center"> <el-row type="flex" justify="center">
<el-col :xs="24" :sm="24" :md="16" :lg="12" :xl="8"> <el-col :xs="24" :sm="24" :md="16" :lg="12" :xl="8">
<el-form ref="setSubmitForm" :label-width="labelWidth" :model="setSubmit" :rules="submitRules"> <el-form ref="setSubmitForm" :label-width="labelWidth" :model="setSubmit" :rules="submitRules">
<el-form-item :label="$t('pages.affairsHall.uploadReport.name')" prop="name"> <el-form-item :label="$t('pages.affairsHall.uploadReport.name')" prop="name">
<el-input v-model="setSubmit.name" :placeholder="$t('pages.affairsHall.uploadReport.placename')" type="text" /> <el-input
v-model="setSubmit.name"
:placeholder="$t('pages.affairsHall.uploadReport.placename')"
type="text"
/>
</el-form-item> </el-form-item>
<el-form-item :label="$t('pages.affairsHall.uploadReport.labeltitle')" prop="title"> <el-form-item :label="$t('pages.affairsHall.uploadReport.labeltitle')" prop="title">
<el-input v-model="setSubmit.title" :placeholder="$t('pages.affairsHall.uploadReport.placetitle')" type="text" /> <el-input
v-model="setSubmit.title"
:placeholder="$t('pages.affairsHall.uploadReport.placetitle')"
type="text"
/>
</el-form-item> </el-form-item>
<el-form-item :label="$t('pages.affairsHall.uploadReport.file')" prop="file"> <el-form-item :label="$t('pages.affairsHall.uploadReport.file')" prop="file">
<el-upload <el-upload
...@@ -22,11 +30,21 @@ ...@@ -22,11 +30,21 @@
:show-file-list="false" :show-file-list="false"
:on-change="handleChange" :on-change="handleChange"
:http-request="uploadFile" :http-request="uploadFile"
:file-list="filesArr"> :file-list="filesArr"
<el-button size="small" type="primary">{{ $t('pages.affairsHall.uploadReport.uploadButtonText') }}</el-button> >
<div slot="tip" class="el-upload__tip">{{ $t('pages.affairsHall.uploadReport.uploadTips') }}<a href="http://zws-imgs-pub.oss-cn-beijing.aliyuncs.com/static/build/learn-mba/%E3%80%8AMBA%E5%AD%A6%E7%94%9F%E5%AD%A6%E6%9C%AF%E6%B4%BB%E5%8A%A8%E8%AE%B0%E5%BD%95%E6%8A%A5%E5%91%8A%E3%80%8B%E6%A8%A1%E6%9D%BFXXX%E5%AD%A6%E7%94%9F.docx">{{ $t('pages.affairsHall.uploadReport.downloadTemplateText') }}</a></div> <el-button size="small" type="primary">{{
$t('pages.affairsHall.uploadReport.uploadButtonText')
}}</el-button>
<div slot="tip" class="el-upload__tip">
{{ $t('pages.affairsHall.uploadReport.uploadTips')
}}<a
href="https://zws-imgs-pub.ezijing.com/static/build/learn-mba/%E3%80%8AMBA%E5%AD%A6%E7%94%9F%E5%AD%A6%E6%9C%AF%E6%B4%BB%E5%8A%A8%E8%AE%B0%E5%BD%95%E6%8A%A5%E5%91%8A%E3%80%8B%E6%A8%A1%E6%9D%BFXXX%E5%AD%A6%E7%94%9F.docx"
download
>{{ $t('pages.affairsHall.uploadReport.downloadTemplateText') }}</a
>
</div>
<template v-if="successFileUrl"> <template v-if="successFileUrl">
{{successFileUrl.replace(/.*\/([^\/]*\.[^.]+)$/gi, '$1')}} {{ successFileUrl.replace(/.*\/([^\/]*\.[^.]+)$/gi, '$1') }}
</template> </template>
</el-upload> </el-upload>
<template v-if="successFileUrl"> <template v-if="successFileUrl">
...@@ -34,7 +52,9 @@ ...@@ -34,7 +52,9 @@
</template> </template>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="onSubmitFrom">{{ $t('pages.affairsHall.uploadReport.savesubmit') }}</el-button> <el-button type="primary" @click="onSubmitFrom">{{
$t('pages.affairsHall.uploadReport.savesubmit')
}}</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-col> </el-col>
...@@ -52,7 +72,7 @@ export default { ...@@ -52,7 +72,7 @@ export default {
reid: { type: String, required: false } reid: { type: String, required: false }
}, },
components: {}, components: {},
data () { data() {
return { return {
labelWidth: '110px', labelWidth: '110px',
setSubmit: { setSubmit: {
...@@ -60,9 +80,7 @@ export default { ...@@ -60,9 +80,7 @@ export default {
title: '' title: ''
}, },
submitRules: { submitRules: {
name: [ name: [{ required: true, message: '报告主题不能为空', trigger: 'blur' }],
{ required: true, message: '报告主题不能为空', trigger: 'blur' }
],
title: [] title: []
}, },
successFileUrl: '', successFileUrl: '',
...@@ -77,16 +95,23 @@ export default { ...@@ -77,16 +95,23 @@ export default {
} }
} }
}, },
mounted () { mounted() {
if (this.reid !== '-1') { if (this.reid !== '-1') {
const loading = this.$loading({ lock: true, text: '', spinner: '', background: 'rgba(255, 255, 255, 0.9)' }) const loading = this.$loading({ lock: true, text: '', spinner: '', background: 'rgba(255, 255, 255, 0.9)' })
cAction.Affairs.getSubmitReport(this.rid, this.reid).then(data => { cAction.Affairs.getSubmitReport(this.rid, this.reid)
if (data.report_name) { .then(data => {
this.setSubmit.name = data.report_name if (data.report_name) {
this.setSubmit.title = data.report_description this.setSubmit.name = data.report_name
this.successFileUrl = data.file_url this.setSubmit.title = data.report_description
} this.successFileUrl = data.file_url
}).catch(e => { this.$message.error(e.message) }).finally(() => { loading.close() }) }
})
.catch(e => {
this.$message.error(e.message)
})
.finally(() => {
loading.close()
})
} }
window.addEventListener('resize', () => { window.addEventListener('resize', () => {
const width = document.documentElement.clientWidth const width = document.documentElement.clientWidth
...@@ -98,25 +123,33 @@ export default { ...@@ -98,25 +123,33 @@ export default {
}) })
}, },
methods: { methods: {
handleChange (file, filelist) { handleChange(file, filelist) {
this.file.name = file.raw.name this.file.name = file.raw.name
this.file.type = file.raw.type this.file.type = file.raw.type
this.file.lastModifiedDate = file.raw.lastModifiedDate this.file.lastModifiedDate = file.raw.lastModifiedDate
this.file.size = file.raw.size this.file.size = file.raw.size
this.file.file = file.raw this.file.file = file.raw
}, },
uploadFile () { uploadFile() {
const loading = this.$loading({ lock: true, text: '', spinner: '', background: 'rgba(255, 255, 255, 0.9)' }) const loading = this.$loading({ lock: true, text: '', spinner: '', background: 'rgba(255, 255, 255, 0.9)' })
cAction.Affairs.uploadFile(this.file).then(data => { cAction.Affairs.uploadFile(this.file)
this.successFileUrl = data.url .then(data => {
this.filesArr.pop() this.successFileUrl = data.url
}).catch(e => { this.filesArr.pop(); this.$message.error(e.message) }).finally(() => { loading.close() }) this.filesArr.pop()
})
.catch(e => {
this.filesArr.pop()
this.$message.error(e.message)
})
.finally(() => {
loading.close()
})
}, },
gobackActiveList () { gobackActiveList() {
this.$router.push({ path: '/app/affairs-hall/hall' }) this.$router.push({ path: '/app/offices' })
}, },
onSubmitFrom () { onSubmitFrom() {
this.$refs.setSubmitForm.validate((valid) => { this.$refs.setSubmitForm.validate(valid => {
if (valid) { if (valid) {
// if (!this.successFileUrl) { // if (!this.successFileUrl) {
// this.$message.error('请上传附件') // this.$message.error('请上传附件')
...@@ -130,30 +163,42 @@ export default { ...@@ -130,30 +163,42 @@ export default {
report = cAction.Affairs.updateSubmitReport(this.rid, this.reid, { report = cAction.Affairs.updateSubmitReport(this.rid, this.reid, {
report_name: this.setSubmit.name, report_name: this.setSubmit.name,
report_description: this.setSubmit.title, report_description: this.setSubmit.title,
file_url: JSON.stringify([{ file_url: JSON.stringify([
name: this.file.name, {
url: this.successFileUrl name: this.file.name,
}]) url: this.successFileUrl
}
])
}) })
} else { } else {
/* 新建 */ /* 新建 */
report = cAction.Report.submitReport(this.rid, { report = cAction.Report.submitReport(this.rid, {
report_name: this.setSubmit.name, report_name: this.setSubmit.name,
report_description: this.setSubmit.title, report_description: this.setSubmit.title,
file_url: JSON.stringify([{ file_url: JSON.stringify([
name: this.file.name, {
url: this.successFileUrl name: this.file.name,
}]) url: this.successFileUrl
}
])
}) })
} }
report.then(data => { report
if (data.flag) { .then(data => {
this.$message({ type: 'success', message: '提交成功' }) if (data.flag) {
setTimeout(() => { this.$message({ type: 'success', message: '提交成功' })
this.$router.push({ path: `/app/affairs-hall/view-report/${this.rid}` }) setTimeout(() => {
}, 500) this.$router.push({ path: `/app/affairs-hall/view-report/${this.rid}` })
} }, 500)
}).catch(e => { this.filesArr.pop(); this.$message.error(e.message) }).finally(() => { loading.close() }) }
})
.catch(e => {
this.filesArr.pop()
this.$message.error(e.message)
})
.finally(() => {
loading.close()
})
} else { } else {
this.$message.error('请检查输入项,确认无误后,重新提交') this.$message.error('请检查输入项,确认无误后,重新提交')
return false return false
......
...@@ -82,7 +82,7 @@ export default { ...@@ -82,7 +82,7 @@ export default {
this.$router.push({ path: `/app/learn/report-submit/${this.rid}/-1` }) this.$router.push({ path: `/app/learn/report-submit/${this.rid}/-1` })
}, },
gobackReportActiveList () { gobackReportActiveList () {
this.$router.push({ path: '/app/affairs-hall/hall' }) this.$router.push({ path: '/app/offices' })
} }
} }
} }
......
...@@ -4,29 +4,50 @@ ...@@ -4,29 +4,50 @@
<div class="con-box"> <div class="con-box">
<div class="total-core"> <div class="total-core">
<div class="title">{{ $t('pages.grade.credit.totalCredits') }}</div> <div class="title">{{ $t('pages.grade.credit.totalCredits') }}</div>
<div class="core">{{score.total}}</div> <div class="core">{{ score.total }}</div>
<el-progress ref="credit_total" :text-inside="true" :stroke-width="30" :percentage="percent1" color="#df9d75"></el-progress> <el-progress
ref="credit_total"
:text-inside="true"
:stroke-width="30"
:percentage="percent1"
color="#df9d75"
></el-progress>
</div> </div>
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12"> <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
<div class="compulsory-core"> <div class="compulsory-core">
<div class="title">{{ $t('pages.grade.credit.compCredits') }}</div> <div class="title">{{ $t('pages.grade.credit.compCredits') }}</div>
<div class="core">{{score.must}}</div> <div class="core">{{ score.must }}</div>
<el-progress ref="credit_must" :text-inside="true" :stroke-width="30" :percentage="percent2" color="#8ca4cf"></el-progress> <el-progress
ref="credit_must"
:text-inside="true"
:stroke-width="30"
:percentage="percent2"
color="#8ca4cf"
></el-progress>
</div> </div>
</el-col> </el-col>
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12"> <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
<div class="elective-core"> <div class="elective-core">
<div class="title">{{ $t('pages.grade.credit.eleCredits') }}</div> <div class="title">{{ $t('pages.grade.credit.eleCredits') }}</div>
<div class="core">{{score.unmust}}</div> <div class="core">{{ score.unmust }}</div>
<el-progress ref="credit_unmust" :text-inside="true" :stroke-width="30" :percentage="percent3" color="#66c6bd"></el-progress> <el-progress
ref="credit_unmust"
:text-inside="true"
:stroke-width="30"
:percentage="percent3"
color="#66c6bd"
></el-progress>
</div> </div>
</el-col> </el-col>
</el-row> </el-row>
<div class="color-box"> <div class="color-box">
<div class="color" style="background: #8ca4cf;"></div><div class="txt">{{ $t('pages.grade.credit.compCredits') }}</div> <div class="color" style="background: #8ca4cf"></div>
<div class="color" style="background: #66c6bd;"></div><div class="txt">{{ $t('pages.grade.credit.eleCredits') }}</div> <div class="txt">{{ $t('pages.grade.credit.compCredits') }}</div>
<div class="color" style="background: #df9d75;"></div><div class="txt">{{ $t('pages.grade.credit.allCredits') }}</div> <div class="color" style="background: #66c6bd"></div>
<div class="txt">{{ $t('pages.grade.credit.eleCredits') }}</div>
<div class="color" style="background: #df9d75"></div>
<div class="txt">{{ $t('pages.grade.credit.allCredits') }}</div>
</div> </div>
<m-page <m-page
:tableHead="tableHead" :tableHead="tableHead"
...@@ -35,7 +56,7 @@ ...@@ -35,7 +56,7 @@
:objFn="objFn" :objFn="objFn"
:tableConfig="tableConfig" :tableConfig="tableConfig"
/> />
<div style="height: 0.3rem;"></div> <div style="height: 0.3rem"></div>
</div> </div>
</div> </div>
</template> </template>
...@@ -45,7 +66,7 @@ import mPage from '@/components/comTable/mPage.vue' ...@@ -45,7 +66,7 @@ import mPage from '@/components/comTable/mPage.vue'
export default { export default {
components: { mPage }, components: { mPage },
data () { data() {
return { return {
percent1: 0, percent1: 0,
percent2: 0, percent2: 0,
...@@ -63,48 +84,67 @@ export default { ...@@ -63,48 +84,67 @@ export default {
}, },
tableConfig: { border: '', size: '', selection: { has: false, sels: [], width: '50px', fix: 'left', align: '' } }, // 增加选择框,has设置为true tableConfig: { border: '', size: '', selection: { has: false, sels: [], width: '50px', fix: 'left', align: '' } }, // 增加选择框,has设置为true
tableHead: [ tableHead: [
{ prop: 'index', label: this.$t('pages.grade.credit.serialNumber'), minWidth: '40', fix: false }, { prop: 'index', label: this.$t('pages.grade.credit.serialNumber'), width: '60px' },
{ prop: 'semester_name', label: this.$t('pages.grade.credit.semester'), minWidth: '60', fix: false }, { prop: 'semester_name', label: this.$t('pages.grade.credit.semester') },
{ prop: 'class_name', label: this.$t('pages.grade.credit.class'), minWidth: '120', fix: false }, { prop: 'class_name', label: this.$t('pages.grade.credit.class') },
{ prop: 'course_name', label: this.$t('pages.grade.credit.course'), minWidth: '260', fix: false }, { prop: 'course_name', label: this.$t('pages.grade.credit.course') },
{ prop: 'course_credit', label: this.$t('pages.grade.credit.courseCredits'), minWidth: '60', fix: false }, { prop: 'course_credit', label: this.$t('pages.grade.credit.courseCredits') },
{ prop: 'passed', label: this.$t('pages.grade.credit.status'), minWidth: '60', fix: false }, { prop: 'passed', label: this.$t('pages.grade.credit.status') },
{ prop: 'credit', label: this.$t('pages.grade.credit.credit'), minWidth: '40', fix: false }, { prop: 'credit', label: this.$t('pages.grade.credit.credit') },
{ prop: 'score', label: this.$t('pages.grade.credit.grade'), minWidth: '40', fix: false }, { prop: 'score', label: this.$t('pages.grade.credit.grade') },
// { prop: '', label: this.$t('pages.grade.credit')'', minWidth: '', fix: false, goObj: { routerName: '', params: {} } }, // 点击跳转页面并传参数 // { prop: '', label: this.$t('pages.grade.credit')'', minWidth: '', fix: false, goObj: { routerName: '', params: {} } }, // 点击跳转页面并传参数
{ prop: 'operate-x', label: this.$t('pages.grade.credit.operate'), width: '80px', fix: false, commandArr: [{ command: 're-start', name: '重修' }, { command: 're-start', name: '已申请' }] } {
prop: 'operate-x',
label: this.$t('pages.grade.credit.operate'),
width: '80px',
fix: false,
commandArr: [
{ command: 're-start', name: '重修' },
{ command: 're-start', name: '已申请' }
]
}
], ],
tableData: [], tableData: [],
params: { keywords: '', curPage: 1, pageSize: 100, total: '' }, params: { keywords: '', curPage: 1, pageSize: 100, total: '' },
objFn: { objFn: {
paramsFn: (_this) => { return {} }, paramsFn: _this => {
return {}
},
nameAPI: 'getCredit', nameAPI: 'getCredit',
actionClass: 'Grade', actionClass: 'Grade',
// nameExcel: 'getStatSummaryExcel', // nameExcel: 'getStatSummaryExcel',
nameExcel: 'getExportExcel3_4_14', nameExcel: 'getExportExcel3_4_14',
callback: (_this, data) => { callback: (_this, data) => {
this.score = data this.score = data
this.percent1 = Math.floor(this.score.myTotal / this.score.total * 100) || 0 this.percent1 = Math.floor((this.score.myTotal / this.score.total) * 100) || 0
this.percent2 = Math.floor(this.score.myMust / this.score.must * 100) || 0 this.percent2 = Math.floor((this.score.myMust / this.score.must) * 100) || 0
this.percent3 = Math.floor(this.score.myUnmust / (this.score.unmust ? this.score.unmust : 1) * 100) || 0 this.percent3 = Math.floor((this.score.myUnmust / (this.score.unmust ? this.score.unmust : 1)) * 100) || 0
// console.log(111, this.score, this.percent1, this.percent2, this.percent3) // console.log(111, this.score, this.percent1, this.percent2, this.percent3)
this.$refs.credit_total.$el.children[0].children[0].children[0].children[0].innerHTML = this.score.myTotal + '(分)' this.$refs.credit_total.$el.children[0].children[0].children[0].children[0].innerHTML =
this.$refs.credit_must.$el.children[0].children[0].children[0].children[0].innerHTML = this.score.myMust + '(分)' this.score.myTotal + '(分)'
this.$refs.credit_unmust.$el.children[0].children[0].children[0].children[0].innerHTML = this.score.myUnmust + '(分)' this.$refs.credit_must.$el.children[0].children[0].children[0].children[0].innerHTML =
this.score.myMust + '(分)'
this.$refs.credit_unmust.$el.children[0].children[0].children[0].children[0].innerHTML =
this.score.myUnmust + '(分)'
_this.params.total = 100 _this.params.total = 100
data = data.list data = data.list
data.forEach((elem, i) => { data.forEach((elem, i) => {
elem.index = i + 1 + (_this.params.curPage - 1) * _this.params.pageSize elem.index = i + 1 + (_this.params.curPage - 1) * _this.params.pageSize
elem.passed = elem.passed !== 0 ? (elem.passed === 2 ? this.$t('pages.grade.credit.unpublished') : this.$t('pages.grade.credit.passed')) : this.$t('pages.grade.credit.failed') elem.passed =
elem.passed !== 0
? elem.passed === 2
? this.$t('pages.grade.credit.unpublished')
: this.$t('pages.grade.credit.passed')
: this.$t('pages.grade.credit.failed')
_this.tableData.push(elem) _this.tableData.push(elem)
}) })
} }
} }
} }
}, },
mounted () { mounted() {
this.VueEvent.$off('command-tablelist-x').$on('command-tablelist-x', (data) => { this.VueEvent.$off('command-tablelist-x').$on('command-tablelist-x', data => {
if (data.command.command === 're-start') { if (data.command.command === 're-start') {
const _data = data.tableData[data.index - 1] const _data = data.tableData[data.index - 1]
window.localStorage.setItem('rebuild', JSON.stringify(_data)) window.localStorage.setItem('rebuild', JSON.stringify(_data))
...@@ -116,7 +156,9 @@ export default { ...@@ -116,7 +156,9 @@ export default {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.total-core, .compulsory-core, .elective-core { .total-core,
.compulsory-core,
.elective-core {
margin-top: 0.1rem; margin-top: 0.1rem;
font-size: 16px; font-size: 16px;
line-height: 36px; line-height: 36px;
......
...@@ -123,7 +123,8 @@ export default { ...@@ -123,7 +123,8 @@ export default {
mounted () {}, mounted () {},
methods: { methods: {
nextPage () { nextPage () {
this.isNext = false // this.isNext = false
this.$router.push({ path: '/app/offices', query: { channel: 'retake' } })
}, },
handleChange1 (file, filelist) { handleChange1 (file, filelist) {
this.file1.name = file.raw.name this.file1.name = file.raw.name
......
...@@ -273,7 +273,7 @@ ...@@ -273,7 +273,7 @@
{{ $t('pages.learn.courseDetail.Status') }}{{ tabs[3].assess.essay.status }} {{ $t('pages.learn.courseDetail.Status') }}{{ tabs[3].assess.essay.status }}
</div> </div>
<div class="status-text" v-if="tabs[3].assess.essay.created_time"> <div class="status-text" v-if="tabs[3].assess.essay.created_time">
{{ $t('pages.learn.courseDetail.Submissiontime') }}{{ tabs[3].assess.essay.created_time }} {{ $t('pages.learn.courseDetail.Submissiontime') }}{{ tabs[3].assess.essay.created_time }}
</div> </div>
<div class="status-text"> <div class="status-text">
{{ $t('pages.learn.courseDetail.score2') }}{{ tabs[3].assess.essay.score }} {{ $t('pages.learn.courseDetail.score2') }}{{ tabs[3].assess.essay.score }}
......
<template> <template>
<!-- // 整体网站结构 --> <!-- // 整体网站结构 -->
<el-container :style="{height: containerStyle.height}"> <el-container :style="{ height: containerStyle.height }">
<el-header><navigation /></el-header> <el-header><navigation /></el-header>
<el-container> <el-container>
<sidebar :obj="sidebar" /> <sidebar :obj="sidebar" />
<el-main><router-view></router-view></el-main> <el-main><router-view :key="$route.fullPath"></router-view></el-main>
</el-container>
</el-container> </el-container>
</el-container>
</template> </template>
<script> <script>
...@@ -15,7 +15,7 @@ import Sidebar from '@/components/learnSysLayout/sidebar.vue' ...@@ -15,7 +15,7 @@ import Sidebar from '@/components/learnSysLayout/sidebar.vue'
export default { export default {
components: { Navigation, Sidebar }, components: { Navigation, Sidebar },
data () { data() {
const clientHeight = document.documentElement.clientHeight - 1 + 'px' const clientHeight = document.documentElement.clientHeight - 1 + 'px'
const clientWidth = document.documentElement.clientWidth + 'px' const clientWidth = document.documentElement.clientWidth + 'px'
return { return {
...@@ -42,12 +42,12 @@ export default { ...@@ -42,12 +42,12 @@ export default {
} }
} }
}, },
mounted () { mounted() {
this.sidebar.containerStyle = this.containerStyle this.sidebar.containerStyle = this.containerStyle
/* 监听侧边栏的当前状态 */ /* 监听侧边栏的当前状态 */
this.$root.$on('updateStatus', (status) => { this.$root.$on('updateStatus', status => {
this.sidebar.status = status this.sidebar.status = status
this.sidebar.sidebarStyle.width = (status ? 'auto' : '200px') this.sidebar.sidebarStyle.width = status ? 'auto' : '200px'
}) })
} }
} }
......
...@@ -60,7 +60,7 @@ export default { ...@@ -60,7 +60,7 @@ export default {
oldPwd: [{ required: true, message: this.$t('password.oldPassword.rule'), trigger: 'blur' }], oldPwd: [{ required: true, message: this.$t('password.oldPassword.rule'), trigger: 'blur' }],
newPwd: [ newPwd: [
{ required: true, message: this.$t('password.newPassword.rule'), trigger: 'blur' }, { required: true, message: this.$t('password.newPassword.rule'), trigger: 'blur' },
{ pattern: /^[a-zA-Z0-9_+-]{6,12}$/, message: this.$t('password.newPassword.rule2'), trigger: 'change' } { min: 6, max: 20, message: this.$t('password.newPassword.rule2'), trigger: 'change' }
], ],
newPwdAgain: [ newPwdAgain: [
{ required: true, message: this.$t('password.repeatPassword.rule'), trigger: 'blur' }, { required: true, message: this.$t('password.repeatPassword.rule'), trigger: 'blur' },
......
html, body { html,
body {
font-size: 14px; // 防止html根元素 影响本身DOM元素字体大小继承 font-size: 14px; // 防止html根元素 影响本身DOM元素字体大小继承
padding: 0; padding: 0;
margin: 0; margin: 0;
...@@ -8,17 +9,8 @@ html, body { ...@@ -8,17 +9,8 @@ html, body {
} }
/* 统一字体样式 */ /* 统一字体样式 */
* { * {
font-family: font-family: 'Source Han Sans CN', 'PingFang SC', -apple-system, 'Microsoft YaHei', 'Helvetica', 'Arial', Verdana,
"Source Han Sans CN", 'Hiragino Sans GB', 'Wenquanyi Micro Hei', sans-serif;
"PingFang SC",
-apple-system,
"Microsoft YaHei",
"Helvetica",
"Arial",
Verdana,
"Hiragino Sans GB",
"Wenquanyi Micro Hei",
sans-serif;
} }
/* 公共标题 - 样式 /app/learn */ /* 公共标题 - 样式 /app/learn */
...@@ -38,50 +30,108 @@ html, body { ...@@ -38,50 +30,108 @@ html, body {
} }
/* 进度条 原始背景色 加深 */ /* 进度条 原始背景色 加深 */
.el-progress-bar__outer { background-color: #e5e5e5 !important; } .el-progress-bar__outer {
.el-progress-bar__innerText { color: #313131; } background-color: #e5e5e5 !important;
.el-progress-bar { margin-right: -65px; padding-right: 65px; } }
.el-progress__text { margin-left: 6px; } .el-progress-bar__innerText {
color: #313131;
}
.el-progress-bar {
margin-right: -65px;
padding-right: 65px;
}
.el-progress__text {
margin-left: 6px;
}
/* 学分 页面 - 进度条样式 */ /* 学分 页面 - 进度条样式 */
.el-progress-bar__outer { border-radius: 0; } .el-progress-bar__outer {
.el-progress-bar__inner { border-radius: 0; } border-radius: 0;
}
.el-progress-bar__inner {
border-radius: 0;
}
/* 富文本 */ /* 富文本 */
.course-assess .detail .b1 { display: block; max-width: 5rem; margin: 0.2rem auto; width: 100%; height: auto; } .course-assess .detail .b1 {
.course-assess .detail .h1 { font-size: 0.16rem; font-weight: 700; color: #313131; line-height: 0.38rem; } display: block;
.course-assess .detail .h2 { font-size: 0.14rem; font-weight: 700; color: #313131; line-height: 0.3rem; } max-width: 5rem;
.course-assess .detail .p { font-size: 0.14rem; color: #313131; line-height: 1.5; text-align: justify; } margin: 0.2rem auto;
.course-assess .detail .em { font-size: 0.12rem; color: #b49441; line-height: 1.5; text-align: justify; } width: 100%;
height: auto;
}
.course-assess .detail .h1 {
font-size: 0.16rem;
font-weight: 700;
color: #313131;
line-height: 0.38rem;
}
.course-assess .detail .h2 {
font-size: 0.14rem;
font-weight: 700;
color: #313131;
line-height: 0.3rem;
}
.course-assess .detail .p {
font-size: 0.14rem;
color: #313131;
line-height: 1.5;
text-align: justify;
}
.course-assess .detail .em {
font-size: 0.12rem;
color: #b49441;
line-height: 1.5;
text-align: justify;
}
/* 富文本 */ /* 富文本 */
.discuss-scroll .item-list .text p { margin: 0; padding: 0; } .discuss-scroll .item-list .text p {
margin: 0;
padding: 0;
}
/* 富文本 */ /* 富文本 */
.discuss-detail-scroll .ques .text p { margin: 0; padding: 0; } .discuss-detail-scroll .ques .text p {
.discuss-detail-scroll .ask .text p { margin: 0; padding: 0; } margin: 0;
padding: 0;
}
.discuss-detail-scroll .ask .text p {
margin: 0;
padding: 0;
}
/* Extra small devices (portrait phones, less than 576px) */ /* Extra small devices (portrait phones, less than 576px) */
@media (max-width: 575px) { @media (max-width: 575px) {
html { font-size: 80px; } html {
font-size: 80px;
}
} }
/* Small devices (landscape phones, 576px and up) */ /* Small devices (landscape phones, 576px and up) */
@media (min-width: 576px) and (max-width: 767px) { @media (min-width: 576px) and (max-width: 767px) {
html { font-size: 80px; } html {
font-size: 80px;
}
} }
/* Medium devices (tablets, 768px and up) */ /* Medium devices (tablets, 768px and up) */
@media (min-width: 768px) and (max-width: 991px) { @media (min-width: 768px) and (max-width: 991px) {
html { font-size: 80px; } html {
font-size: 80px;
}
} }
/* Large devices (desktops, 992px and up) */ /* Large devices (desktops, 992px and up) */
@media (min-width: 992px) and (max-width: 1199px) { @media (min-width: 992px) and (max-width: 1199px) {
html { font-size: 90px; } html {
font-size: 90px;
}
} }
/* Extra large devices (large desktops, 1200px and up) */ /* Extra large devices (large desktops, 1200px and up) */
@media (min-width: 1200px) { @media (min-width: 1200px) {
html { font-size: 100px; } html {
font-size: 100px;
}
} }
/* 改变主题色变量 */ /* 改变主题色变量 */
...@@ -89,16 +139,21 @@ $--color-primary: #b80037; ...@@ -89,16 +139,21 @@ $--color-primary: #b80037;
/* 改变 icon 字体路径变量,必需 */ /* 改变 icon 字体路径变量,必需 */
$--font-path: '~element-ui/lib/theme-chalk/fonts'; $--font-path: '~element-ui/lib/theme-chalk/fonts';
/* 引入element-ui对应scss文件,重新编译 */ /* 引入element-ui对应scss文件,重新编译 */
@import "~element-ui/packages/theme-chalk/src/index"; @import '~element-ui/packages/theme-chalk/src/index';
/* 引入隐藏显示样式 */ /* 引入隐藏显示样式 */
@import "~element-ui/lib/theme-chalk/display.css"; @import '~element-ui/lib/theme-chalk/display.css';
/* 引入三方 自定义图标库,方法 vue -> 第三方 自建图标库 中有 */ /* 引入三方 自定义图标库,方法 vue -> 第三方 自建图标库 中有 */
@import "~@/assets/font-icons/iconfont.css"; @import '~@/assets/font-icons/iconfont.css';
[class^="el-icon-self-"], [class*="el-icon-self-"] { [class^='el-icon-self-'],
font-family: "selfAllIcon" !important; [class*='el-icon-self-'] {
font-family: 'selfAllIcon' !important;
font-size: 16px; font-size: 16px;
font-style: normal; font-style: normal;
-webkit-font-smoothing: antialiased; -webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale; -moz-osx-font-smoothing: grayscale;
} }
.el-form--label-top .el-form-item__label {
padding: 0;
line-height: 30px;
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论