fix conflict

This commit is contained in:
caoqianming 2021-06-04 17:08:25 +08:00
commit 63017b3c4f
24 changed files with 226 additions and 40 deletions

Binary file not shown.

View File

@ -1,6 +1,6 @@
module.exports = {
title: '辐射学堂',
title: '安建环培训考试平台',
/**
* @type {boolean} true | false
@ -12,5 +12,5 @@ module.exports = {
* @type {boolean} true | false
* @description Whether show the logo in sidebar
*/
sidebarLogo: true
sidebarLogo: false
}

View File

@ -51,7 +51,7 @@
</el-table-column>
<el-table-column label="创建人">
<template slot-scope="scope">
<span>{{ scope.row.create_admin_name }}</span>
<span>{{ scope.row.create_admin_username }}</span>
</template>
</el-table-column>
<el-table-column align="center" label="操作" fixed="right">

View File

@ -70,9 +70,9 @@ App({
globalData: {
userInfo: {},
userinfo: {}, // 服务器传回的消费者信息
host: 'https://apitest.ahctc.cn',
//host: 'https://apitest.ahctc.cn',
mediahost: 'https://apitest.ahctc.cn',
//host: 'http://127.0.0.1:8000',
host: 'http://127.0.0.1:8000',
//mediahost: 'http://127.0.0.1:8000',
token : '',
}

View File

@ -1,11 +1,13 @@
// pages/admin/exam/detail.js
const api = require("../../../utils/request.js");
Page({
/**
* 页面的初始数据
*/
data: {
exam:{},
tests:[]
},
/**
@ -13,10 +15,25 @@ Page({
*/
onLoad: function (options) {
if(options.id){
console.log(options.id)
let id = options.id
api.requesta(`/examtest/exam/${id}/`, 'GET').then(res=>{
this.setData({
exam:res.data
})
})
api.requesta('/examtest/examtest/', 'GET', {exam:id, pageoff:true}).then(res=>{
this.setData({
tests:res.data
})
})
}
},
issue: function(){
wx.showLoading({
title: '正在生成...',
})
},
/**
* 生命周期函数--监听页面初次渲染完成
*/

View File

@ -1,2 +1,64 @@
<!--pages/admin/exam/detail.wxml-->
<text>pages/admin/exam/detail.wxml</text>
<view class="page">
<view class="page__bd">
<view style="height:4px"></view>
<view class="weui-panel weui-panel_access" style="margin:8px">
<view class="weui-panel__hd">{{exam.name}}</view>
<view class="weui-panel__bd">
<view class="weui-media-box weui-media-box_text">
<!-- <h4 class="weui-media-box__title">标题一</h4> -->
<view class="weui-media-box__desc">
工作类别:{{exam.workscope_name}}
</view>
<view class="weui-media-box__desc">
考试地点:{{exam.place}}
</view>
<view class="weui-media-box__desc">
开关时间:{{exam.opentime}}-{{exam.closetime}}
</view>
<view class="weui-media-box__desc">
监考人:{{exam.proctor_name}}-{{exam.proctor_phone}}
</view>
</view>
</view>
</view>
<view class="weui-panel weui-panel_access">
<view class="weui-panel__hd">共{{tests.length}}名人员参加考试</view>
<view class="weui-panel__bd">
<view class="weui-media-box weui-media-box_text" wx:for="{{tests}}" wx:key="unique">
<h4 class="weui-media-box__title">
<text style="color:green;" wx:if="{{item.is_pass}}">通过</text>
<text style="color:red;" wx:else>未过</text>
{{item.consumer_detail.name}}
</h4>
<view class="weui-media-box__desc">
{{item.consumer_detail.company_name}} {{item.consumer_detail.deptname}}
</view>
<view class="weui-media-box__desc">
身份证号:{{item.consumer_detail.ID_number}}
</view>
<view class="weui-media-box__desc">
开始答题:{{item.start_time}}-耗时:{{item.took_format}}
</view>
<view class="weui-media-box__desc">
得分:{{item.score}}
</view>
<view style="text-align:right;padding-right:8rpx">
<button type="primary" size="mini" bindtap="issue">颁发证书</button>
<button type="default" size="mini" bindtap="unbindmp" style="margin-left:4px">查看证书</button>
<button type="default" size="mini" bindtap="logout" style="margin-left:4px">答卷详情</button>
</view>
</view>
</view>
<view class="weui-loadmore weui-loadmore_line" wx:if="{{isLoadedAll}}">
<text class="weui-loadmore__tips">到底了</text>
</view>
<!-- <view class="weui-panel__ft">
<a class="weui-cell weui-cell_active weui-cell_access weui-cell_link">
<view class="weui-cell__bd">查看更多</view>
<text class="weui-cell__ft"></text>
</a>
</view> -->
</view>
</view>
</view>

View File

@ -1 +1,4 @@
/* pages/admin/exam/detail.wxss */
.weui-media-box {
padding: 12px;
}

View File

@ -1,20 +1,49 @@
// pages/admin/exam/index.js
const api = require("../../../utils/request.js");
Page({
/**
* 页面的初始数据
*/
data: {
page:1,
isLoadedAll:false,
count:0,
results:[]
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
this.getList(1)
},
getList: function(page) {
wx.showLoading({
title: '正在加载...',
})
api.requesta('/examtest/exam/', 'GET', {page:page}).then(res=>{
wx.hideLoading()
let results = this.data.results
let isLoadedAll = false
if(res.data.results){
if(page==1){results=res.data.results}else{
results = results.concat(res.data.results)
}
}
if(!res.data.next){
isLoadedAll = true
}
this.setData({
count:res.data.count,
results:results,
page:page,
isLoadedAll: isLoadedAll
})
}).catch(
wx.hideLoading()
)
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
@ -47,14 +76,17 @@ Page({
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
this.getList(1)
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
if(!this.data.isLoadedAll){
this.data.page=this.data.page+1
this.getList(this.data.page)
}
},
/**

View File

@ -1,3 +1,4 @@
{
"usingComponents": {}
"usingComponents": {},
"enablePullDownRefresh":true
}

View File

@ -1,2 +1,31 @@
<!--pages/admin/exam/index.wxml-->
<text>pages/admin/exam/index.wxml</text>
<view class="page__bd">
<view class="weui-panel weui-panel_access">
<view class="weui-panel__hd">已发布的考试,共{{count}}场</view>
<view class="weui-panel__bd">
<navigator class="weui-media-box weui-media-box_text" wx:for="{{results}}" wx:key="unique" url="detail?id={{item.id}}">
<h4 class="weui-media-box__title">
<text style="color:blue;">{{item.workscope_name}}</text>
{{item.name}}
</h4>
<view class="weui-media-box__desc">
考试地点:{{item.place}}
</view>
<view class="weui-media-box__desc">
开关时间:{{item.opentime}}-{{item.closetime}}
</view>
<view class="weui-media-box__desc">
监考人:{{item.proctor_name}}-{{item.proctor_phone}}
</view>
</navigator>
</view>
<view class="weui-loadmore weui-loadmore_line" wx:if="{{isLoadedAll}}">
<text class="weui-loadmore__tips">到底了</text>
</view>
<!-- <view class="weui-panel__ft">
<a class="weui-cell weui-cell_active weui-cell_access weui-cell_link">
<view class="weui-cell__bd">查看更多</view>
<text class="weui-cell__ft"></text>
</a>
</view> -->
</view>
</view>

View File

@ -28,13 +28,21 @@ Page({
// 发送 res.code 到后台换取 openId, sessionKey, unionId
api.requesta('/rbac/user/bindmp/','POST', {code:res.code}).then(res=>{
getApp().globalData.admininfo.mpopenid = res.data.mpopenid
wx.redirectTo({
url: '/pages/admin/index',
})
this.setData({
'admininfo.mpopenid':res.data.mpopenid
})
})
}
})
},
unbindmp: function(){
api.requesta('/rbac/user/unbindmp/','POST').then(res=>{
getApp().globalData.admininfo.mpopenid = null
this.setData({
'admininfo.mpopenid':null
})
})
},
/**
* 生命周期函数--监听页面初次渲染完成
*/

View File

@ -22,6 +22,7 @@
</view>
<view style="text-align:right;padding-right:8rpx">
<button type="primary" size="mini" bindtap="bindmp" wx:if="{{!admininfo.mpopenid}}">绑定微信</button>
<button type="default" size="mini" bindtap="unbindmp" wx:else>解绑</button>
<button type="warn" size="mini" bindtap="logout" style="margin-left:4rpx">退出</button>
</view>
</view>

View File

@ -8,7 +8,7 @@
</view>
<view class="weui-media-box__bd weui-media-box__bd_in-appmsg">
<view class="weui-media-box__title" wx:if="{{userinfo && userinfo.username}}">
<span>账号:</span>
<span>{{userinfo.role_name}}:</span>
<span style="font-weight:bold;">{{userinfo.username}}</span>
</view>
<view class="weui-media-box__title" wx:else>账号:

View File

@ -92,16 +92,31 @@ Page({
chooseWork: function (e) {
let work = e.currentTarget.dataset
api.request(`/examtest/workscope/${work.id}/chose/`, 'GET').then(res => {
//选择工作类别
// that.setData({
// workData:res.data
// })
getApp().globalData.userinfo.workscope = res.data.workscope
getApp().globalData.userinfo.workscope_name = res.data.workscope_name
wx.navigateBack({
})
wx.showModal({
title: '提示',
content: '确定修改工作类别吗?',
confirmText: '确定',
cancelText: '取消',
success: function (res) {
if (res.confirm) {
api.request(`/examtest/workscope/${work.id}/chose/`, 'GET').then(res => {
//选择工作类别
// that.setData({
// workData:res.data
// })
wx.showToast({
title: '成功',
icon:'none'
})
getApp().globalData.userinfo.workscope = res.data.workscope
getApp().globalData.userinfo.workscope_name = res.data.workscope_name
wx.navigateBack({
})
})
}
}
})
//wx.setStorageSync('nowWork', work)
},

View File

@ -8,7 +8,7 @@
<view class="weui-media-box__bd">
<h4 class="weui-media-box__title">{{item.name}}</h4>
<view class="weui-media-box__desc">
<span style="color:blue;border:1rpx solid blue;font-size:12px" wx:if="{{item.can_exam}}">公开可选</span>
<span style="color:blue;border:1rpx solid blue;font-size:10px" wx:if="{{item.can_exam}}">公开可选</span>
该类别下包含<span style="color:darkblue">{{item.questioncat.length}}</span>个科目
</view>
</view>

View File

@ -21,15 +21,13 @@
"checkSiteMap": true,
"uploadWithSourceMap": true,
"compileHotReLoad": false,
"useMultiFrameRuntime": true,
"useMultiFrameRuntime": false,
"useApiHook": true,
"useApiHostProcess": false,
"babelSetting": {
"ignore": [],
"disablePlugins": [],
"outputPath": ""
},
"enableEngineNative": false,
"bundle": false,
"useIsolateContext": true,
"useCompilerModule": true,

View File

@ -111,3 +111,4 @@ class Candidate(CommonModel):
issue_date = models.DateField('发证日期', null=True, blank=True)
start_date = models.DateField('有效期始', null=True, blank=True)
end_date = models.DateField('有效期止', null=True, blank=True)
examtest = models.ForeignKey(to='examtest.examtest', verbose_name='关联考试', null=True, blank=True, on_delete=models.CASCADE)

View File

@ -176,6 +176,12 @@ class ExamListSerializer(serializers.ModelSerializer):
model = Exam
fields = '__all__'
@staticmethod
def setup_eager_loading(queryset):
""" Perform necessary eager loading of data. """
queryset = queryset.prefetch_related('workscope','create_admin')
return queryset
class ExamSimpleSerializer(serializers.ModelSerializer):
class Meta:
model = Exam
@ -186,9 +192,10 @@ class ConsumerSimpleSerializer(serializers.ModelSerializer):
class Meta:
model = Consumer
fields = ['id', 'name', 'ID_number1', 'comanyname', 'deptname', 'username']
class ExamTestDetailSerializer(serializers.ModelSerializer):
"""
考试详情序列化(导出用)
考试详情序列化(导出用);目前是正式考试,用户详情从consumer_detail获取
"""
workscope_name = serializers.StringRelatedField(source='workscope', read_only=True)
paper_name = serializers.StringRelatedField(source='paper', )

View File

@ -33,6 +33,7 @@ from .serializers import (
WorkScopeSerializer, ExamCreateUpdateSerializer, ExamListSerializer, ExamTestDetailSerializer)
from django.utils import timezone
from django.db.models import Q
from utils.pagination import PageOrNot
# Create your views here.
class ExamViewSet(ModelViewSet):
@ -375,7 +376,7 @@ class TestRuleViewSet(ModelViewSet):
self.permission_classes = []
return [permission() for permission in self.permission_classes]
class ExamTestViewSet(ModelViewSet):
class ExamTestViewSet(PageOrNot, ModelViewSet):
"""
考试记录列表和详情
"""

1
test_server/init.json Normal file

File diff suppressed because one or more lines are too long

View File

@ -180,4 +180,14 @@ class UserViewSet(PageOrNot, ModelViewSet):
user.save()
return Response({'mpopenid':openid})
@action(methods=['post'], detail=False, permission_classes=[IsAuthenticated])
def unbindmp(self, request, pk=None):
"""
解绑微信
"""
user = request.user
user.mpopenid = None
user.save()
return Response()

Binary file not shown.

Binary file not shown.

View File

@ -9,8 +9,8 @@ class PageOrNot:
def paginate_queryset(self, queryset):
if (self.paginator is None):
return None
elif self.request.query_params.get('pageoff', None) and self.get_queryset().count()<500:
elif self.request.query_params.get('pageoff', None) and queryset.count()<500:
return None
elif self.request.query_params.get('pageoff', None) and self.get_queryset().count()>=500:
elif self.request.query_params.get('pageoff', None) and queryset.count()>=500:
return ParseError('单次请求数据量大,请求中止')
return self.paginator.paginate_queryset(queryset, self.request, view=self)