Quellcode durchsuchen

Merge branch 'develop' of http://52.130.252.100:10000/TEAMMODEL/TEAMModelOS into develop

zhouj1203@hotmail.com vor 1 Jahr
Ursprung
Commit
0ab4728e38

+ 5 - 23
TEAMModelOS/ClientApp/src/router/routes.js

@@ -1452,7 +1452,7 @@ export const routes = [{
     {
         path: 'activityManage',
         name: 'activityManage',
-        component: () => import('@/view/signupActivity/manageActivity.vue'),
+        component: () => import('@/view/signupActivity/processActivity.vue'),
         meta: {
             activeName: 'activityManage',
         },
@@ -1461,7 +1461,7 @@ export const routes = [{
     {
         path: 'infoActivity',
         name: 'infoActivity',
-        component: () => import('@/view/signupActivity/infoActivity copy.vue'),
+        component: () => import('@/view/signupActivity/infoGoing.vue'),
         meta: {
             activeName: 'infoActivity',
         }
@@ -1475,33 +1475,15 @@ export const routes = [{
             activeName: 'createActivity',
         }
     },
-    // 报名系统:活动审核
-    {
-        path: 'activityProcess',
-        name: 'activityProcess',
-        component: () => import('@/view/signupActivity/processActivity.vue'),
-        meta: {
-            activeName: 'activityProcess',
-        }
-    },
     // 报名系统:活动审核详情
     {
         path: 'infoProcess',
         name: 'infoProcess',
-        component: () => import('@/view/signupActivity/infoActivity.vue'),
+        component: () => import('@/view/signupActivity/infoReleased.vue'),
         meta: {
             activeName: 'infoProcess',
         }
     },
-    // 报名系统:基础设置
-    {
-        path: 'activitySet',
-        name: 'activitySet',
-        component: () => import('@/view/signupActivity/setActivity.vue'),
-        meta: {
-            activeName: 'activitySet',
-        }
-    }
     ]
 },
 //学生端
@@ -1920,7 +1902,7 @@ export const routes = [{
         {
             path: 'areaInfoActivity',
             name: 'areaInfoActivity',
-            component: () => import('@/view/signupActivity/infoActivity copy.vue'),
+            component: () => import('@/view/signupActivity/infoGoing.vue'),
             meta: {
                 activeName: 'areaInfoActivity',
             }
@@ -1947,7 +1929,7 @@ export const routes = [{
         {
             path: 'areaInfoProcess',
             name: 'areaInfoProcess',
-            component: () => import('@/view/signupActivity/infoActivity.vue'),
+            component: () => import('@/view/signupActivity/infoReleased.vue'),
             meta: {
                 activeName: 'areaInfoProcess',
             }

+ 824 - 0
TEAMModelOS/ClientApp/src/view/signupActivity/infoGoing.vue

@@ -0,0 +1,824 @@
+<template>
+    <div class="info-box">
+        <div v-if="actInfo" style="height: 100%;">
+            <div class="info-header">
+                <div @click="$router.go(-1)">
+                    <Icon type="ios-arrow-back" />
+                    返回活动列表
+                </div>
+                <p class="title">
+                    <span class="type-box" :style="{'background-color': actInfo.scope === 'area' ? '#ff9900' : (actInfo.scope === 'school' ? '#19be6b' : '#a8a8a8')}">
+                        {{ actInfo.scope === 'area' ? '区级' : (actInfo.scope === 'school' ? '校级' : '公开') }}
+                    </span>
+                    {{ actInfo.name }}
+                </p>
+                <!-- <div class="btn-box">
+                    <Steps :current="2" size="small">
+                        <Step title="报名"></Step>
+                        <Step title="上传"></Step>
+                        <Step title="评审"></Step>
+                        <Step title="公示"></Step>
+                    </Steps>
+                </div> -->
+            </div>
+            <Tabs value="info">
+                <TabPane label="基本信息" name="info">
+                    <vuescroll>
+                        <img :src="actInfo.poster" alt="">
+                        <div class="sk-info">
+                            <!-- <div class="info-title">基本信息</div> -->
+                            <p>主题:{{ actInfo.subject }}</p>
+                            <p>简介:{{ actInfo.description }}</p>
+                            <p>地点:{{ actInfo.address }}</p>
+                            <p>时间:{{ actInfo.startTime }} - {{ actInfo.endTime }}</p>
+                            <p>主办:
+                                <span v-for="(item, index) in actInfo.zb" :key="index" style="margin-right: 10px;">{{ item }}</span>
+                            </p>
+                            <p>承办:
+                                <span v-for="(item, index) in actInfo.cb" :key="index" style="margin-right: 10px;">{{ item }}</span>
+                            </p>
+                            <p v-if="actInfo.scope === 'area' && isArea">学校:
+                                <span>
+                                    <span v-for="item in actInfo.invitedSchools" :key="item.id" style="margin-right: 10px;">{{ item.name }}</span>
+                                </span>
+                            </p>
+                            <p v-else-if="actInfo.scope === 'school'">
+                                老师:
+                                <span>
+                                    <span v-for="item in inviteTeachers" :key="item.id" style="margin-right: 10px;">{{ item.name }}</span>
+                                </span>
+                            </p>
+                            <p>免责声明:{{ actInfo.mzsm }}</p>
+                            <p>附件:
+                                <span v-for="item in actInfo.attachment" :key="item.blob">{{ item.name }}</span>
+                            </p>
+                        </div>
+                        <div class="sk-info" v-if="contestInfo">
+                            <div class="info-title">优课评选</div>
+                            <p>
+                                报名时间:
+                                <span>{{ contestInfo.sign.startTime }} - {{ contestInfo.sign.endTime }}</span>
+                            </p>
+                            <p v-if="contestInfo.upload">
+                                上传作品:
+                                <span>{{ contestInfo.upload.startTime }} - {{ contestInfo.upload.endTime }}</span>
+                            </p>
+                            <p v-if="contestInfo.review">
+                                作品评审:
+                                <span>{{ contestInfo.review.startTime }} - {{ contestInfo.review.endTime }}</span>
+                            </p>
+                            <p v-if="contestInfo.score">
+                                成绩公示:
+                                <span>{{ contestInfo.score.startTime }} - {{ contestInfo.score.endTime }}</span>
+                            </p>
+                        </div>
+                        <!-- <div class="sk-info">
+                            <div class="info-title">研修中心</div>
+                            <p>
+                                活动时间:<span>2023.08.01</span>-<span>2023.09.10</span>
+                            </p>
+                        </div> -->
+                    </vuescroll>
+                </TabPane>
+                <TabPane label="优课评选" name="sk" v-if="contestInfo">
+                    <div style="margin: 20px 10px;">
+                        <Steps :current="2">
+                            <Step title="报名"></Step>
+                            <Step title="上传"></Step>
+                            <Step title="评审"></Step>
+                            <Step title="公示"></Step>
+                        </Steps>
+                    </div>
+                    <vuescroll>
+                        <div>
+                            <div class="data-box">
+                                <div class="module-title">报名数据</div>
+                                <div class="module-data">
+                                    <div class="tab-header join-data">
+                                        <!-- <div>
+                                            <p>报名方式</p>
+                                            <p>报名制</p>
+                                        </div> -->
+                                        <div>
+                                            <p>参赛方式</p>
+                                            <p>{{ contestInfo.sign.type ? '团队赛' : '个人赛' }}</p>
+                                        </div>
+                                        <div>
+                                            <p>已报名</p>
+                                            <p style="color: #14b53b;">
+                                                {{ '-' }}
+                                                <span style="font-size: 16px; color: #737373;">/{{ contestInfo.sign.limit || '不限' }}</span>
+                                            </p>
+                                        </div>
+                                        <div>
+                                            <p>已上传</p>
+                                            <p style="color: #4b93ff;">{{ '-' }}</p>
+                                        </div>
+                                        <div>
+                                            <p>已评审</p>
+                                            <p style="color: #ff9900;">{{ '-' }}</p>
+                                        </div>
+                                        <!-- <div>
+                                            <p>成绩发布</p>
+                                            <p style="color: #5f5f5f;">未发布</p>
+                                        </div> -->
+                                    </div>
+                                    <Input placeholder="搜索醍摩豆帐号" style="width: 300px" />
+                                    <Table :columns="applicationColumns" :data="applicationList" row-key="id" stripe>
+                                        <template #action="{row, index}">
+                                            <Button type="error" size="small" @click="deleteApplica(row, index, 'join')">删除</Button>
+                                        </template>
+                                    </Table>
+                                </div>
+                            </div>
+                            <div class="data-box">
+                                <div class="module-title">评审管理</div>
+                                <div class="module-data">
+                                    <div class="tab-header">
+                                        <Button @click="processShow = true">添加评审专家</Button>
+                                        <Button style="margin-left: 20px;" @click="workPro = true">自动分配评审作品</Button>
+                                        <Button style="float: right;" @click="ruleDrawer = true">评审规则</Button>
+                                    </div>
+                                    <Table :columns="processColumns" :data="processList">
+                                        <template #process="{}">
+                                            <Progress :percent="25" :stroke-width="10" />
+                                        </template>
+                                        <template #actions="{row, index}">
+                                            <Button type="error" size="small" @click="deleteApplica(row, index, 'process')">删除</Button>
+                                        </template>
+                                    </Table>
+                                </div>
+                            </div>
+                            <div class="data-box">
+                                <div class="module-title">成绩统计</div>
+                                <div class="module-data">
+                                    <div class="tab-header">
+                                        <div v-show="!awardsing">
+                                            <Button @click="setAwards()">设置奖项</Button>
+                                            <Button @click="openAch()" style="margin-left: 20px;">公示成绩</Button>
+                                        </div>
+                                        <div v-show="awardsing">
+                                            <Button @click="awardsShow = true">批量设置</Button>
+                                            <Button @click="awardTypes()" style="margin-left: 20px;">取消</Button>
+                                        </div>
+                                    </div>
+                                    <Table :columns="scoreColumns" :data="scoreList" height="600">
+                                        <template #score1="{row}">
+                                            <div v-show="!row.edit">
+                                                <span>{{ row.score1 }}</span>
+                                                <Icon type="md-nutrition" @click="row.edit = true" />
+                                            </div>
+                                            <div v-show="row.edit">
+                                                <InputNumber :min="0" v-model="row.score1" />
+                                                <Icon type="md-checkmark-circle" @click="row.edit = false" />
+                                                <Icon type="md-close-circle" @click="row.edit = false" />
+                                            </div>
+                                        </template>
+                                        <template #awards="{row}">
+                                            <span v-if="!awardsing">{{ row.awards ? row.awards : '-' }}</span>
+                                            <div v-else>
+                                                <Select v-model="row.awards" style="width:200px" :transfer="true">
+                                                    <Option v-for="item in awardsList" :value="item.value" :key="item.value">{{ item.label }}</Option>
+                                                </Select>
+                                                <Icon type="md-add-circle" @click="addAward = true" />
+                                            </div>
+                                        </template>
+                                    </Table>
+                                </div>
+                            </div>
+                        </div>
+                    </vuescroll>
+                </TabPane>
+            </Tabs>
+        </div>
+    </div>
+</template>
+
+<script>
+export default {
+    data () {
+        return {
+            contestInfo: undefined,
+            ruleInfo: undefined,
+            infoArr: [
+                {
+                    value: 'name',
+                    label: '姓名',
+                },
+                {
+                    value: 'sex',
+                    label: '性别',
+                },
+                {
+                    value: 'phone',
+                    label: '手机号码',
+                },
+                {
+                    value: 'email',
+                    label: '电子邮箱',
+                },
+                {
+                    value: 'school',
+                    label: '学校',
+                },
+                {
+                    value: 'duties',
+                    label: '职务',
+                },
+                {
+                    value: 'period',
+                    label: '学段',
+                },
+                {
+                    value: 'subject',
+                    label: '学科',
+                },
+            ],
+            inviteTeachers: [],
+
+
+            applicationColumns: [
+                {
+                    title: '姓名',
+                    key: 'name',
+                    tree: true,
+                    // width: 120,
+                    // fixed: 'left'
+                },
+                {
+                    title: '性别',
+                    key: 'sex',
+                    // width: 80,
+                },
+                {
+                    title: '手机号码',
+                    key: 'phone',
+                    // width: 100,
+                },
+                {
+                    title: '电子邮箱',
+                    key: 'email',
+                    // width: 500,
+                },
+                {
+                    title: '学校',
+                    key: 'school',
+                    // width: 100,
+                    filters: [
+                        {
+                            label: '醍摩豆学校',
+                            value: '醍摩豆学校'
+                        },
+                        {
+                            label: '研发学校',
+                            value: '研发学校'
+                        },
+                    ],
+                    filterMultiple: false,
+                    filterMethod (value, row) {
+                        return row.school === value
+                    }
+                },
+                {
+                    title: '职务',
+                    key: 'zhiwu',
+                    // width: 100,
+                },
+                {
+                    title: '学段',
+                    key: 'period',
+                    // width: 100,
+                },
+                {
+                    title: '学科',
+                    key: 'subject',
+                    // width: 100,
+                },
+                {
+                    title: '组名',
+                    key: 'team',
+                    // width: 100,
+                    filters: [
+                        {
+                            label: '数学组',
+                            value: '数学组'
+                        },
+                        {
+                            label: '语文组',
+                            value: '语文组'
+                        },
+                    ],
+                    filterMultiple: false,
+                    filterMethod (value, row) {
+                        return row.team === value
+                    }
+                },
+                {
+                    title: '组内身份',
+                    key: 'identity',
+                    // width: 100,
+                    filters: [
+                        {
+                            label: '组长',
+                            value: '组长'
+                        },
+                        {
+                            label: '组员',
+                            value: '组员'
+                        },
+                    ],
+                    filterMultiple: false,
+                    filterMethod (value, row) {
+                        return row.identity === value
+                    }
+                },
+                {
+                    title: '报名时间',
+                    key: 'time',
+                    // width: 100,
+                },
+                {
+                    title: '作品',
+                    key: 'work',
+                    // width: 100,
+                    // fixed: 'right',
+                },
+                {
+                    title: '操作',
+                    slot: 'action',
+                    align: 'center',
+                    // width: 100,
+                    // fixed: 'right',
+                },
+            ],
+            applicationList: [
+                {
+                    id: '000',
+                    name: '张三',
+                    sex: '男',
+                    phone: '110',
+                    email: '111222@qq.com',
+                    school: '醍摩豆学校',
+                    zhiwu: '年级主任',
+                    period: '初中',
+                    subject: '数学',
+                    time: '2023-08-08',
+                    team: '数学组',
+                    identity: '组长',
+                    work: '',
+                    _showChildren: true,
+                    children: [
+                        {
+                            id: '001',
+                            name: '李四',
+                            sex: '女',
+                            phone: '911',
+                            email: '331321@qq.com',
+                            school: '醍摩豆学校',
+                            zhiwu: '普通教师',
+                            period: '初中',
+                            subject: '数学',
+                            time: '2023-08-10',
+                            team: '数学组',
+                            identity: '组员',
+                            work: '',
+                        },
+                        {
+                            id: '002',
+                            name: '李四',
+                            sex: '女',
+                            phone: '911',
+                            email: '331321@qq.com',
+                            school: '醍摩豆学校',
+                            zhiwu: '普通教师',
+                            period: '初中',
+                            subject: '数学',
+                            time: '2023-08-10',
+                            team: '数学组',
+                            identity: '组员',
+                            work: '',
+                        },
+                    ],
+                },
+                {
+                    id: '010',
+                    name: '柳五',
+                    sex: '女',
+                    phone: '110',
+                    email: '111222@qq.com',
+                    school: '醍摩豆学校',
+                    zhiwu: '语文组长',
+                    period: '初中',
+                    subject: '语文',
+                    time: '2023-08-09',
+                    team: '语文组',
+                    identity: '组长',
+                    work: '',
+                    children: [
+                        {
+                            id: '011',
+                            name: '李四',
+                            sex: '女',
+                            phone: '911',
+                            email: '331321@qq.com',
+                            school: '研发学校',
+                            zhiwu: '普通教师',
+                            period: '初中',
+                            subject: '数学',
+                            time: '2023-08-10',
+                            team: '数学组',
+                            identity: '组员',
+                            work: '',
+                        },
+                        {
+                            id: '012',
+                            name: '李四',
+                            sex: '女',
+                            phone: '911',
+                            email: '331321@qq.com',
+                            school: '研发学校',
+                            zhiwu: '普通教师',
+                            period: '初中',
+                            subject: '数学',
+                            time: '2023-08-10',
+                            team: '数学组',
+                            identity: '组员',
+                            work: '',
+                        },
+                    ],
+                },
+                
+            ],
+            processColumns: [
+                {
+                    title: '姓名',
+                    key: 'name'
+                },
+                {
+                    title: '性别',
+                    key: 'sex'
+                },
+                {
+                    title: '手机号码',
+                    key: 'phone'
+                },
+                {
+                    title: '电子邮箱',
+                    key: 'email'
+                },
+                /* {
+                    title: '擅长学段',
+                    key: 'period'
+                },
+                {
+                    title: '擅长学科',
+                    key: 'subject'
+                }, */
+                {
+                    title: '评审数量',
+                    key: 'num'
+                },
+                {
+                    title: '评审进度',
+                    slot: 'process',
+                    align: 'center',
+                },
+                {
+                    title: '操作',
+                    slot: 'actions',
+                    width: 150,
+                    align: 'center',
+                },
+            ],
+            processList: [
+                {
+                    name: '张专家',
+                    sex: '男',
+                    phone: '110',
+                    email: '111222@qq.com',
+                    period: '初中',
+                    subject: '英语、数学',
+                    num: 4,
+                },
+                {
+                    name: '赵专家',
+                    sex: '女',
+                    phone: '110',
+                    email: '111222@qq.com',
+                    period: '初中',
+                    subject: '语文、生物',
+                    num: 3,
+                },
+            ],
+            scoreColumns: [
+                {
+                    title: '姓名/组名',
+                    key: 'name',
+                },
+                {
+                    title: '专家评分',
+                    key: 'score'
+                },
+                {
+                    title: '建议分数',
+                    slot: 'score1'
+                },
+                {
+                    title: '奖项',
+                    slot: 'awards'
+                },
+                /* {
+                    title: '操作',
+                    slot: 'actions',
+                    width: 150,
+                    align: 'center',
+                }, */
+            ],
+            scoreList: [
+                {
+                    name: '数学组',
+                    score: '67',
+                    score1: '85',
+                    awards: '',
+                    edit: false,
+                },
+                {
+                    name: '语文组',
+                    score: '92',
+                    score1: '85',
+                    awards: '',
+                    edit: false,
+                },
+                {
+                    name: '数学组',
+                    score: '67',
+                    score1: '85',
+                    awards: '',
+                    edit: false,
+                },
+                {
+                    name: '语文组',
+                    score: '92',
+                    score1: '85',
+                    awards: '',
+                    edit: false,
+                },
+                {
+                    name: '数学组',
+                    score: '67',
+                    score1: '85',
+                    awards: '',
+                    edit: false,
+                },
+                {
+                    name: '语文组',
+                    score: '92',
+                    score1: '85',
+                    awards: '',
+                    edit: false,
+                },
+            ],
+            sasData: {
+                sas: ''
+            },
+            awardsing: false,
+        }
+    },
+    created () {
+        if(this.actInfo.scope === 'area') {
+            this.sasData.sas = this.$store.state.user.userProfile.areas.find(item => {
+                return item.areaId === this.actInfo.owner
+            }).sas
+        } else {
+            this.sasData.sas = this.$store.state.user.schoolProfile.blob_sas
+        }
+        this.getActInfo()
+        this.getInviteTea()
+    },
+    computed: {
+        actInfo() {
+            return this.$route.params.info
+        },
+        isArea() {
+            return localStorage.getItem('platform') === 'area'
+        },
+    },
+    mounted () {
+    },
+    methods: {
+        getActInfo() {
+            let params = {
+                grant_type: 'read-contest',
+                activityId: this.actInfo.id
+            }
+            this.$api.areaActivity.manageAct(params).then(res => {
+                if(res.code === 200) {
+                    res.contest.modules.forEach(item => {
+                        if(item === 'sign') {
+                            res.contest[item].fieldName = []
+                            res.contest[item].field.forEach(field => {
+                                let existing = this.infoArr.find(info => {
+                                    return info.value === field
+                                })
+                                if(existing) {
+                                    res.contest[item].fieldName.push(existing.label)
+                                } else {
+                                    res.contest[item].fieldName.push(field)
+                                }
+                            })
+                        }
+                        res.contest[item].startTime = this.$tools.formatTime(res.contest[item].stime, 'yyyy-MM-dd')
+                        res.contest[item].endTime = this.$tools.formatTime(res.contest[item].etime, 'yyyy-MM-dd')
+                    })
+                    this.contestInfo = res.contest
+                    this.ruleInfo = res.reviewRule
+                }
+            })
+        },
+        getInviteTea() {
+            let params = {
+                grant_type: 'invited-teachers',
+                activityId: this.actInfo.id,
+                activityOwner: this.actInfo.owner
+            }
+            this.$api.areaActivity.manageAct(params).then(res => {
+                if(res.inviteTeachers) {
+                    this.inviteTeachers = res.inviteTeachers
+                }
+            })
+        },
+        deleteApplica(data, index, type) {
+            console.log(data, index);
+            if(type === 'join') {
+                this.$Message.warning('团队赛不可删除报名选手!')
+            } else if(type === 'process') {
+                this.$Modal.confirm({
+                    title: '删除专家',
+                    content: `确认删除${data.name}专家吗?`,
+                    onOk: () => {
+                        this.processList.splice(index, 1)
+                    }
+                })
+            } else if(type === 'score') {
+                /* this.$Modal.confirm({
+                    title: '修改成绩',
+                    content: ``,
+                    render: (h, {datas}) => {
+                        return h('div', [
+                            h('p', data.name),
+                            h('Input', {
+                                props: {
+                                    value: data.score,
+                                },
+                                style: {
+                                    width: '100px',
+                                    marginRight: '10px',
+                                },
+                                on: {
+                                    'on-change': value => {
+                                        console.log(data, value);
+                                        data.score = value.target._value
+                                    }
+                                },
+                            }),
+                        ])
+                    },
+                    onOk: () => {
+                        this.scoreList[index].splice(index, 1)
+                    }
+                }) */
+            }
+        },
+    }
+}
+</script>
+
+<style lang="less" scoped>
+.info-box {
+    height: 100%;
+    .info-header {
+        height: 45px;
+        line-height: 45px;
+        box-shadow: 0px 2px 5px #e9e9e9;
+        padding-left: 10px;
+        text-align: center;
+        position: relative;
+
+        &>div:first-of-type{
+            /* display: inline-block;
+            float: left; */
+            cursor: pointer;
+            position: absolute;
+            top: 0;
+            left: 10px;
+        }
+        .title{
+            font-size: 18px;
+            font-weight: bold;
+            margin-right: 7%;
+            .type-box{
+                background-color: #FF9900;
+                font-size: 15px;
+                font-weight: normal;
+                color: #fff;
+                padding: 3px 6px;
+                border-radius: 5px;
+                margin-right: 5px;
+            }
+        }
+        .btn-box {
+            position: absolute;
+            top: 12px;
+            right: 5px;
+            width: 320px;
+        }
+    }
+
+    img{
+        width: 70%;
+        height: 400px;
+        margin-left: 15%;
+    }
+    
+    .sk-title{
+        background-color: #eaeaea;
+        padding: 10px;
+        margin-bottom: 10px;
+        margin-top: 25px;
+    }
+    .sk-info{
+        // padding: 0 10px;
+        &>p {
+            margin: 10px;
+        }
+        .info-title {
+            background-color: #eaeaea;
+            padding: 10px;
+            margin-bottom: 10px;
+            margin-top: 25px;
+        }
+    }
+    
+    .tab-header{
+        margin-bottom: 10px;
+    }
+    .join-data{
+        display: flex;
+        justify-content: space-around;
+        width: 100%;
+        padding-bottom: 30px;
+        padding-top: 30px;
+        // border-bottom: 1px dashed #d0d0d0;
+        &>div {
+            // text-align: center;
+            margin: 0 30px;
+
+            &>p:first-of-type {
+                border-left: 5px solid #70B1F0;
+                padding-left: 5px;
+                height: 15px;
+                line-height: 15px;
+                margin-bottom: 5px;
+            }
+            &>p:nth-child(2){
+                font-size: 30px;
+                font-weight: bold;
+                color: #6a6a6a;
+            }
+        }
+    }
+    .data-box {
+        // border-top: 1px dashed #d0d0d0;
+        padding-top: 10px;
+        margin-bottom: 30px;
+
+        .ivu-input-wrapper {
+            margin-bottom: 10px;
+        }
+        .module-title {
+            background: linear-gradient(45deg, #7ab6f5, #f3fbff);
+            color: #fff;
+            font-size: 18px;
+            padding: 10px 15px;
+            // border-top-left-radius: 10px;
+            border-radius: 5px;
+            margin-bottom: 10px;
+        }
+        .module-data  {
+            margin: 0 20px;
+        }
+    }
+}
+</style>
+
+<style lang="less">
+.info-box{
+    .ivu-tabs{
+        height: 94%;
+        margin: 0 20px;
+    }
+    .ivu-tabs-content{
+        height: 90%;
+    }
+}
+</style>

+ 380 - 0
TEAMModelOS/ClientApp/src/view/signupActivity/infoReleased.vue

@@ -0,0 +1,380 @@
+<template>
+    <div>
+        <div v-if="actInfo">
+            <div class="info-header">
+                <div @click="$router.go(-1)">
+                    <Icon type="ios-arrow-back" />
+                    返回活动列表
+                </div>
+                <p class="title">
+                    <span class="type-box" :style="{'background-color': actInfo.scope === 'area' ? '#ff9900' : (actInfo.scope === 'school' ? '#19be6b' : '#a8a8a8')}">
+                        {{ actInfo.scope === 'area' ? '区级' : (actInfo.scope === 'school' ? '校级' : '公开') }}
+                    </span>
+                    {{ actInfo.name }}
+                </p>
+                <div class="btn-box">
+                    <Button type="success" size="small" @click="publishNow()">立即发布</Button>
+                    <Button type="primary" size="small">修改</Button>
+                </div>
+            </div>
+            <div class="info-box">
+                <div class="activity-info">
+                    <template>
+                        <img :src="actInfo.poster" alt="">
+                        <div>
+                            <span>主题:</span>
+                            <span>{{ actInfo.subject }}</span>
+                        </div>
+                        <div>
+                            <span>简介:</span>
+                            <span>{{ actInfo.description }}</span>
+                        </div>
+                        <div>
+                            <span>地点:</span>
+                            <span>{{ actInfo.address }}</span>
+                        </div>
+                        <div>
+                            <span>时间:</span>
+                            <span class="time-border">{{ actInfo.startTime }} - {{ actInfo.endTime }}</span>
+                        </div>
+                        <div>
+                            <span>主办:</span>
+                            <span>
+                                <span v-for="(item, index) in actInfo.zb" :key="index" style="margin-right: 10px;">{{ item }}</span>
+                            </span>
+                        </div>
+                        <div>
+                            <span>承办:</span>
+                            <span>
+                                <span v-for="(item, index) in actInfo.cb" :key="index" style="margin-right: 10px;">{{ item }}</span>
+                            </span>
+                        </div>
+                        <div v-if="actInfo.scope === 'area' && isArea">
+                            <span>学校:</span>
+                            <span>
+                                <span v-for="item in actInfo.invitedSchools" :key="item.id">{{ item.name }}</span>
+                            </span>
+                        </div>
+                        <div>
+                            <span>免责声明:</span>
+                            <span>{{ actInfo.mzsm }}</span>
+                        </div>
+                        <div style="display: flex;">
+                            <p style="min-width: 50px;">附件:</p>
+                            <div>
+                                <p v-for="item in actInfo.attachment" :key="item.blob">{{ item.name }}</p>
+                            </div>
+                        </div>
+                    </template>
+                </div>
+                <div class="check-module">
+                    <Tabs value="sk" class="sk-box">
+                        <TabPane key="sk" label="优课评选" name="sk" v-if="contestInfo">
+                            <div class="sk-info">
+                                <p>报名时间:
+                                    <span class="time-border">
+                                        {{ contestInfo.sign.startTime }} - {{ contestInfo.sign.endTime }}
+                                    </span>
+                                </p>
+                                <p>填报信息:
+                                    <span class="info-border" v-for="(item, index) in contestInfo.sign.fieldName" :key="index">{{ item }}</span>
+                                </p>
+                                <p>报名人数:
+                                    <!-- <span class="info-border">{{ '28' }}人</span> -->
+                                    {{ contestInfo.sign.limit }}人
+                                </p>
+                                <p>参赛方式:
+                                    <!-- <span class="info-border">{{ '团队赛' }}</span> -->
+                                    {{ contestInfo.sign.type ? '团队赛' : '个人赛' }}
+                                </p>
+                            </div>
+                            <template v-if="contestInfo.upload">
+                                <p class="sk-title">
+                                    <span>上传作品</span>
+                                    <span class="time-border">
+                                        {{ contestInfo.upload.startTime }} - {{ contestInfo.upload.endTime }}
+                                    </span>
+                                </p>
+                                <div class="sk-info">
+                                    <!-- <p>上传时间:
+                                        <span class="time-border">{{ '2023.08.06 - 2023.08.20' }}</span>
+                                    </p> -->
+                                    <p>作品类型:
+                                        <span v-if="contestInfo.upload.type === 'file'">
+                                            <span style="margin-right: 10px;">文件</span>
+                                            <span class="info-border" v-for="(item, index) in contestInfo.upload.fileType" :key="index">
+                                                {{ item }}
+                                            </span>
+                                        </span>
+                                        <span v-else>苏格拉底影片</span>
+                                    </p>
+                                    <p>作品要求:{{ contestInfo.upload.desc }}</p>
+                                    <p>上传方式:{{ contestInfo.upload.captainUpload ? '由队长统一上传' : '个人上传作品' }}</p>
+                                </div>
+                            </template>
+                            <template v-if="contestInfo.review">
+                                <p class="sk-title">
+                                    <span>作品评审</span>
+                                    <span class="time-border">
+                                        {{ contestInfo.review.startTime }} - {{ contestInfo.review.endTime }}
+                                    </span>
+                                </p>
+                                <div class="sk-info">
+                                    <!-- <p>评审时间:
+                                        <span class="time-border">{{ '2023.08.21 - 2023.08.30' }}</span>
+                                    </p> -->
+                                    <p>评审规则:
+                                        <span @click="ruleDrawer = true" style="cursor: pointer;">{{ contestInfo.review.ruleName }}</span>
+                                    </p>
+                                </div>
+                            </template>
+                            <template v-if="contestInfo.score">
+                                <p class="sk-title">
+                                    <span>成绩公示</span>
+                                    <span class="time-border">
+                                        {{ contestInfo.score.startTime }} - {{ contestInfo.score.endTime }}
+                                    </span>
+                                </p>
+                                <div class="sk-info">
+                                    <!-- <p>公示时间:
+                                        <span class="time-border">{{ '2023.08.31 - 2023.09.10' }}</span>
+                                    </p> -->
+                                </div>
+                            </template>
+                        </TabPane>
+                        <!-- <TabPane key="jy" label="教研活动" name="jy">
+                            暂未填写内容
+                        </TabPane> -->
+                    </Tabs>
+                </div>
+            </div>
+        </div>
+        <Drawer title="评审规则" :width="50" :closable="false" v-model="ruleDrawer" class="light-iview-form" @on-close="closeRule()">
+            <p style="font-size: 18px; font-weight: bold;">{{ ruleInfo.name }}</p>
+            <p style="margin: 5px 0 10px 0;">描述:{{ ruleInfo.desc }}</p>
+            <!-- <p style="margin: 5px 0;">总分:{{ ruleInfo.score }}</p> -->
+            <div class="create-form">
+                <div class="rule-header">
+                    <span>分项</span>
+                    <span>描述</span>
+                    <span>分值</span>
+                </div>
+                <el-tree :data="ruleInfo.trees" node-key="id" default-expand-all :expand-on-click-node="false">
+                    <div class="custom-tree-node" slot-scope="{ data }">
+                        <div style="width: 275px;">{{ data.label }}</div>
+                        <div style="width: 100%;">{{ data.desc }}</div>
+                        <div style="width: 150px;">{{ data.score }}</div>
+                    </div>
+                </el-tree>
+            </div>
+        </Drawer>
+    </div>
+</template>
+
+<script>
+export default {
+    data () {
+        return {
+            contestInfo: undefined,
+            infoArr: [
+                {
+                    value: 'name',
+                    label: '姓名',
+                },
+                {
+                    value: 'sex',
+                    label: '性别',
+                },
+                {
+                    value: 'phone',
+                    label: '手机号码',
+                },
+                {
+                    value: 'email',
+                    label: '电子邮箱',
+                },
+                {
+                    value: 'school',
+                    label: '学校',
+                },
+                {
+                    value: 'duties',
+                    label: '职务',
+                },
+                {
+                    value: 'period',
+                    label: '学段',
+                },
+                {
+                    value: 'subject',
+                    label: '学科',
+                },
+            ],
+            ruleInfo: undefined,
+            ruleDrawer: false,
+        }
+    },
+    created () {
+        if(this.actInfo) {
+            this.getActInfo()
+        }
+    },
+    computed: {
+        actInfo() {
+            return this.$route.params.info || undefined
+        },
+        isArea() {
+            return localStorage.getItem('platform') === 'area'
+        },
+    },
+    methods: {
+        getActInfo() {
+            let params = {
+                grant_type: 'read-contest',
+                activityId: this.$route.params.info.id
+            }
+            this.$api.areaActivity.manageAct(params).then(res => {
+                if(res.code === 200) {
+                    res.contest.modules.forEach(item => {
+                        if(item === 'sign') {
+                            res.contest[item].fieldName = []
+                            res.contest[item].field.forEach(field => {
+                                let existing = this.infoArr.find(info => {
+                                    return info.value === field
+                                })
+                                if(existing) {
+                                    res.contest[item].fieldName.push(existing.label)
+                                } else {
+                                    res.contest[item].fieldName.push(field)
+                                }
+                            })
+                        }
+                        res.contest[item].startTime = this.$tools.formatTime(res.contest[item].stime, 'yyyy-MM-dd')
+                        res.contest[item].endTime = this.$tools.formatTime(res.contest[item].etime, 'yyyy-MM-dd')
+                    })
+                    
+                    this.contestInfo = res.contest
+                    this.ruleInfo = res.reviewRule
+                }
+            })
+        },
+        publishNow() {
+            let params = {
+                grant_type: 'update-publish',
+                activityId: this.actInfo.id,
+                publish: 1,
+            }
+            this.$api.areaActivity.manageAct(params).then(res => {
+                if(res.code === 200) {
+                    this.$Message.success('发布成功')
+                    this.$router.push({
+                        name: this.actInfo.scope === 'area' ? 'areaInfoActivity' : 'infoActivity',
+                        params: {
+                            info: res.activity
+                        }
+                    })
+                } else {
+                    this.$Message.error('发布失败')
+                }
+            })
+        },
+    }
+
+}
+</script>
+
+<style lang="less" scoped>
+.info-header {
+    height: 45px;
+    line-height: 45px;
+    box-shadow: 0px 2px 5px #e9e9e9;
+    padding-left: 10px;
+    text-align: center;
+    position: relative;
+
+    &>div:first-of-type{
+        /* display: inline-block;
+        float: left; */
+        cursor: pointer;
+        position: absolute;
+        top: 0;
+        left: 10px;
+    }
+    .title{
+        font-size: 18px;
+        font-weight: bold;
+        margin-right: 7%;
+        .type-box{
+            background-color: #a8a8a8;
+            font-size: 15px;
+            font-weight: normal;
+            color: #fff;
+            padding: 3px 6px;
+            border-radius: 5px;
+            margin-right: 5px;
+        }
+    }
+    .btn-box {
+        position: absolute;
+        top: 0;
+        right: 5px;
+        .ivu-btn {
+            margin-right: 10px;
+        }
+    }
+}
+.info-box {
+    display: flex;
+
+    .time-border {
+        background-color: #319be7;
+        border-radius: 5px;
+        padding: 2px 10px;
+        color: #fff;
+        font-weight: 100;
+    }
+
+    .info-border {
+        background-color: #8cb553;
+        border-radius: 5px;
+        padding: 2px 10px;
+        color: #fff;
+        margin-right: 5px;
+    }
+
+    .activity-info {
+        width: 40%;
+        margin: 10px 20px;
+        margin-right: 30px;
+        img {
+            width: 100%;
+        }
+        &>div {
+            margin: 10px 0;
+            font-size: 16px;
+        }
+    }
+
+    .check-module {
+        width: 60%;
+        .sk-title{
+            background-color: #eaeaea;
+            padding: 10px;
+            margin-bottom: 10px;
+            margin-top: 25px;
+            font-weight: bold;
+            border-radius: 10px;
+
+            &>span:first-child {
+                margin-right: 15px;
+            }
+        }
+        .sk-info{
+            // padding: 0 10px;
+            &>p {
+                margin: 10px;
+            }
+        }
+    }
+}
+</style>

+ 49 - 123
TEAMModelOS/ClientApp/src/view/signupActivity/processActivity.vue

@@ -4,7 +4,8 @@
             <RadioGroup v-model="processType" type="button" button-style="solid">
                 <Radio :label="-1">全部</Radio>
                 <Radio :label="0">未发布</Radio>
-                <Radio :label="1">已发布</Radio>
+                <Radio :label="1">进行中</Radio>
+                <Radio :label="2">已结束</Radio>
             </RadioGroup>
             <span class="creat-activity" @click="createActivity">
                 <Icon type="md-add" />
@@ -14,23 +15,23 @@
         <vuescroll>
             <div class="activitya-list">
                 <div class="activity-box" v-for="(item, index) in activityListShow" :key="index" @click="goInfo(item)">
-                    <div :class="['train-img-box',item.owner == 'area' ? 'area-train-bg': item.owner == 'school' ? 'school-train-bg' : '']">
-                        <img :src="item.img" />
+                    <div :class="['train-img-box',item.scope == 'area' ? 'area-train-bg': item.scope == 'school' ? 'school-train-bg' : '']">
+                        <img :src="item.poster" />
                         <span class="train-type-label">
-                            {{item.owner == 'area' ? $t('train.mgt.areaLabel') : item.owner == 'school' ? $t('train.mgt.schoolLabel') : '公开'}}
+                            {{item.scope == 'area' ? $t('train.mgt.areaLabel') : item.scope == 'school' ? $t('train.mgt.schoolLabel') : '公开'}}
                         </span>
                     </div>
                     <div class="content-box">
                         <p>{{ item.name }}</p>
-                        <p>主题:{{ item.title }}</p>
+                        <p>主题:{{ item.subject }}</p>
                         <p>地点:{{ item.address }}</p>
-                        <p>主办:{{ item.host }}</p>
+                        <p>时间:{{ item.startTime }} - {{ item.endTime }}</p>
+                        <p>主办:{{ item.zb.length }}</p>
                         <!-- <p>简介:{{ item.jianjie }}</p> -->
                         <div class="process-type">
-                            <span v-show="!item.type" style="color: #ec8130;">待发布</span>
-                            <!-- <span v-show="item.type === 1" style="color: #1e9a1e;">已通过</span>
-                            <span v-show="item.type === 2" style="color: #e03f3f;">不通过</span> -->
-                            <span v-show="item.type === 2" style="color: #696969;">已结束</span>
+                            <span v-show="!item.publish" style="color: #ec8130;">待发布</span>
+                            <span v-show="item.publish === 1" style="color: #1e9a1e;">进行中</span>
+                            <span v-show="item.publish === 2" style="color: #696969;">已结束</span>
                         </div>
                     </div>
                 </div>
@@ -43,7 +44,7 @@
 export default {
     data () {
         return {
-            processType: -1,
+            processType: -1,//发布状态 0未发布 1已发布 2已结束
             activityList: [],
             activityListShow: [],
         }
@@ -53,7 +54,7 @@ export default {
     },
     computed: {
         isArea() {
-            return localStorage.getItem('platform')
+            return localStorage.getItem('platform') === 'area'
         },
     },
     watch: {
@@ -63,7 +64,7 @@ export default {
                     this.activityListShow = this.activityList
                 } else {
                     this.activityListShow = this.activityList.filter(item => {
-                        return n ? (item.type === 1 || item.type === 2) : item.type === 0
+                        return n ? (n === 1 ? item.publish === 1 : item.publish === 2) : item.publish === 0
                     })
                 }
             },
@@ -71,124 +72,48 @@ export default {
     },
     methods: {
         getActivityList() {
-            this.activityList = [
-                {
-                    id: 111,
-                    name: "第一个活动",
-                    title: '推动创新教学,全球智慧教师齐聚一堂,切磋交流、提炼优质智慧课堂',
-                    address: '办公大楼',
-                    host: '全球醍摩豆智慧教育研究院',
-                    jianjie: "「智慧課堂創新獎」選拔活動,匯集海內外全球智慧教師課堂影像,由專家學者評選出優秀作品,在全球智慧教師之夜頒獎,並收錄其作品成為經典課例,發展「可複製、會擴散」的智慧教室創新教學模式,散播智慧教育的種子。",
-                    tag: 1,
-                    type: 0,
-                    owner: 'area',
-                    img: require("./demo.jpeg"),
-                },
-                {
-                    id: 222,
-                    name: "第一个活动",
-                    title: "第一个活动",
-                    address: '办公大楼',
-                    host: '全球醍摩豆智慧教育研究院',
-                    jianjie:
-                        "这是一段简介,这是一段简介,这是一段简介,这是一段简介,这是一段简介,这是一段简介,",
-                    tag: 1,
-                    type: 1,
-                    owner: 'school',
-                    img: require("./demo.jpeg"),
-                },
-                {
-                    id: 333,
-                    name: "第一个活动",
-                    title: "第一个活动",
-                    address: '办公大楼',
-                    host: '全球醍摩豆智慧教育研究院',
-                    jianjie:
-                        "这是一段简介,这是一段简介,这是一段简介,这是一段简介,这是一段简介,这是一段简介,这是一段简介,这是一段简介,这是一段简介,这是一段简介,这是一段简介,这是一段简介,这是一段简介,这是一段简介,这是一段简介,这是一段简介,这是一段简介,这是一段简介,",
-                    tag: 1,
-                    type: 2,
-                    owner: 'open',
-                    img: require("./demo.jpeg"),
-                },
-                {
-                    id: 444,
-                    name: "某一城市的某个大学的某一学院的某个礼堂",
-                    title: "第一个活动",
-                    address: '办公大楼',
-                    host: '全球醍摩豆智慧教育研究院',
-                    jianjie:
-                        "这是一段简介,这是一段简介,这是一段简介,这是一段简介,这是一段简介,这是一段简介,",
-                    tag: 1,
-                    type: 1,
-                    owner: 'area',
-                    img: require("./demo.jpeg"),
-                },
-                {
-                    id: 444,
-                    name: "某一城市的某个大学的某一学院的某个礼堂",
-                    title: "第一个活动",
-                    address: '办公大楼',
-                    host: '全球醍摩豆智慧教育研究院',
-                    jianjie:
-                        "这是一段简介,这是一段简介,这是一段简介,这是一段简介,这是一段简介,这是一段简介,",
-                    tag: 1,
-                    type: 1,
-                    owner: 'area',
-                    img: require("./demo.jpeg"),
-                },
-                {
-                    id: 444,
-                    name: "某一城市的某个大学的某一学院的某个礼堂",
-                    title: "第一个活动",
-                    address: '办公大楼',
-                    host: '全球醍摩豆智慧教育研究院',
-                    jianjie:
-                        "这是一段简介,这是一段简介,这是一段简介,这是一段简介,这是一段简介,这是一段简介,",
-                    tag: 1,
-                    type: 1,
-                    img: require("./demo.jpeg"),
-                },
-                {
-                    id: 444,
-                    name: "某一城市的某个大学的某一学院的某个礼堂",
-                    title: "第一个活动",
-                    address: '办公大楼',
-                    host: '全球醍摩豆智慧教育研究院',
-                    jianjie:
-                        "这是一段简介,这是一段简介,这是一段简介,这是一段简介,这是一段简介,这是一段简介,",
-                    tag: 1,
-                    type: 1,
-                    owner: 'school',
-                    img: require("./demo.jpeg"),
-                },
-                {
-                    id: 444,
-                    name: "某一城市的某个大学的某一学院的某个礼堂",
-                    title: "第一个活动",
-                    address: '办公大楼',
-                    host: '全球醍摩豆智慧教育研究院',
-                    jianjie:
-                        "这是一段简介,这是一段简介,这是一段简介,这是一段简介,这是一段简介,这是一段简介,",
-                    tag: 1,
-                    type: 1,
-                    owner: 'area',
-                    img: require("./demo.jpeg"),
-                },
-            ]
-            this.activityListShow = this.activityList
+            let params = {
+                grant_type: this.isArea ? 'list-area' : 'list-school',
+                year: localStorage.getItem('curSemester').year,
+            }
+            if(this.isArea) {
+                params.areaId = sessionStorage.getItem('areaId')
+            }
+            this.$api.areaActivity.manageAct(params).then(res => {
+                if(res.activities) {
+                    let sasData = {sas: ''}
+                    if(this.isArea) {
+                        sasData.sas = this.$store.state.user.userProfile.areas.find(item => {
+                            return item.areaId === params.areaId
+                        }).sas
+                    } else {
+                        sasData.sas = this.$store.state.user.schoolProfile.blob_sas
+                    }
+                    this.activityList = res.activities.map(item => {
+                        item.startTime = this.$tools.formatTime(item.stime, 'yyyy-MM-dd')
+                        item.endTime = this.$tools.formatTime(item.etime, 'yyyy-MM-dd')
+                        item.poster = !item.poster ? require('@/assets/image/no-poster-cn1.png') : `${item.poster}?${sasData.sas}`
+                        item.attachment.forEach(attach => {
+                            attach.url = `${attach.url}?${sasData.sas}`
+                        })
+                        return item
+                    })
+                    this.activityListShow = this.activityList
+                }
+            })
         },
         goInfo(data) {
-            if(data.type) {
+            if(data.publish) {
                 this.$router.push({
-                    name: this.isArea === 'area' ? 'areaInfoActivity' : 'infoActivity',
+                    name: this.isArea ? 'areaInfoActivity' : 'infoActivity',
                     params: {
-                        id: data
+                        info: data
                     }
                 })
             } else {
                 this.$router.push(
                 {
-                    name: this.isArea === 'area' ? 'areaInfoProcess' : 'infoProcess',
+                    name: this.isArea ? 'areaInfoProcess' : 'infoProcess',
                     params: {
                         info: data
                     },
@@ -197,7 +122,7 @@ export default {
         },
         createActivity() {
             this.$router.push({
-                name: this.isArea === 'area' ? 'areaCreateActivity' : "createActivity",
+                name: this.isArea ? 'areaCreateActivity' : "createActivity",
             })
         },
     }
@@ -267,6 +192,7 @@ export default {
             height: 150px; */
             overflow: hidden;   
             position: relative;
+            height: 165px;
             .train-type-label{
                 position: absolute;
                 left: -2px;