上传签到和现场图片

This commit is contained in:
caoqianming 2021-06-13 22:46:59 +08:00
parent 1d9c3b2fc8
commit ee8c64f169
13 changed files with 405 additions and 44 deletions

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 : '',
rlogin:true

View File

@ -39,7 +39,8 @@
"pages/admin/exam/index",
"pages/candidate/show",
"pages/admin/candidate/index",
"pages/candidate/my"
"pages/candidate/my",
"pages/admin/exam/upimg"
],
"window": {
"backgroundTextStyle": "light",

View File

@ -16,11 +16,7 @@ Page({
onLoad: function (options) {
if(options.id){
let id = options.id
api.requesta(`/examtest/exam/${id}/`, 'GET').then(res=>{
this.setData({
exam:res.data
})
})
that.data.exam.id = id
api.requesta('/examtest/examtest/', 'GET', {exam:id, pageoff:true}).then(res=>{
this.setData({
tests:res.data
@ -28,6 +24,14 @@ Page({
})
}
},
getExam: function(){
let id = this.data.exam.id
api.requesta(`/examtest/exam/${id}/`, 'GET').then(res=>{
this.setData({
exam:res.data
})
})
},
issue: function(){
wx.showLoading({
title: '正在生成...',
@ -45,7 +49,7 @@ Page({
* 生命周期函数--监听页面显示
*/
onShow: function () {
this.getExam()
},
/**
@ -108,5 +112,10 @@ Page({
wx.navigateTo({
url: '/pages/candidate/show?id='+candidate_.id,
})
},
upImg: function(){
wx.navigateTo({
url: '/pages/admin/exam/upimg?id='+this.data.exam.id,
})
}
})

View File

@ -1,39 +1,42 @@
<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">
<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">
<view class="weui-media-box__desc">
考试地点:{{exam.place}}
</view>
<view class="weui-media-box__desc">
<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 style="text-align:right;padding-right:8rpx">
<button type="primary" size="mini" bindtap="upImg" data-id="{{exam.id}}">上传图片</button>
</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}}
<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">
<view class="weui-media-box__desc">
身份证号:{{item.consumer_detail.ID_number}}
</view>
<view class="weui-media-box__desc">
@ -47,22 +50,25 @@
<text style="color:darkblue">{{item.candidate_.number}}</text>
</view>
<view style="text-align:right;padding-right:8rpx">
<button type="default" size="mini" bindtap="goCandidate" style="margin-left:4px" data-id="{{item.id}}" data-candidate_="{{item.candidate_}}" wx:if="{{item.candidate_}}">查看证书</button>
<button type="primary" size="mini" bindtap="issue" data-id="{{item.id}}" data-index="{{index}}" wx:else>颁发证书</button>
<button type="default" size="mini" bindtap="godetail" style="margin-left:4px" data-id="{{item.id}}">答卷详情</button>
</view>
<button type="default" size="mini" bindtap="goCandidate" style="margin-left:4px" data-id="{{item.id}}"
data-candidate_="{{item.candidate_}}" wx:if="{{item.candidate_}}">查看证书</button>
<button type="primary" size="mini" bindtap="issue" data-id="{{item.id}}" data-index="{{index}}"
wx:else>颁发证书</button>
<button type="default" size="mini" bindtap="godetail" style="margin-left:4px"
data-id="{{item.id}}">答卷详情</button>
</view>
</view>
</view>
<!-- <view class="weui-panel__ft">
</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 class="weui-loadmore weui-loadmore_line" wx:if="{{isLoadedAll}}">
<text class="weui-loadmore__tips">到底了</text>
</view>
</view>
</view>
<text class="weui-loadmore__tips">到底了</text>
</view>
</view>
</view>

View File

@ -0,0 +1,207 @@
// pages/admin/exam/u'p.js
const api = require("../../../utils/request.js");
Page({
/**
* 页面的初始数据
*/
data: {
exam:0,
qdimgs: [],
xcimgs: [],
upqdimgs:[],
upxcimgs:[]
},
chooseImage: function (e) {
var that = this;
wx.chooseImage({
sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
success: function (res) {
// 返回选定照片的本地文件路径列表tempFilePath可以作为img标签的src属性显示图片
console.log(e.currentTarget.dataset.type)
if(e.currentTarget.dataset.type == 'qdimgs'){
that.setData({
qdimgs: that.data.qdimgs.concat(res.tempFilePaths)
});
}else{
that.setData({
xcimgs: that.data.xcimgs.concat(res.tempFilePaths)
});
}
}
})
},
previewImage: function (e) {
if(e.currentTarget.dataset.type=='qdimgs'){
wx.previewImage({
current: e.currentTarget.id, // 当前显示图片的http链接
urls: this.data.qdimgs // 需要预览的图片http链接列表
})
}else{
wx.previewImage({
current: e.currentTarget.id, // 当前显示图片的http链接
urls: this.data.xcimgs // 需要预览的图片http链接列表
})
}
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
this.data.exam = options.id
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
},
deleteImg: function(e){
var that = this
wx.showModal({
content: '确认删除该图片?',
success (res) {
if (res.confirm) {
if(e.currentTarget.dataset.type=='qdimgs'){
var qdimgs = that.data.qdimgs
qdimgs.splice(e.currentTarget.dataset.index, 1);
that.setData({
qdimgs:qdimgs
})
}else{
var xcimgs = that.data.xcimgs
xcimgs.splice(e.currentTarget.dataset.index, 1);
that.setData({
xcimgs:xcimgs
})
}
}
}
})
},
confirm: function(){
if(this.data.upqdimgs.length>0 && this.data.upxcimgs.length>0){
let formdata={
qdimgs:this.data.upqdimgs,
xcimgs:this.data.upxcimgs
}
let id = this.data.exam
wx.showLoading({
title: '正在提交...',
})
api.requesta(`/examtest/exam/${id}/upimgs/`,'POST', formdata).then(res=>{
wx.hideLoading({
success: (res) => {},
})
wx.navigateBack({
delta: 0,
})
})
}
else if(this.data.qdimgs.length>0 && this.data.xcimgs.length>0){
this.upImgx(0, 'qdimgs')
}
else{
wx.showToast({
title: '图片信息不全',
})
}
},
upImgx: function(index, type){
var that = this
if(type=='qdimgs'){
let x = index+1
wx.showLoading({
title: '正在上传签到图片',
})
wx.uploadFile({
filePath: that.data.qdimgs[index],
name: 'file',
url: getApp().globalData.host+'/uploadfile/',
header:{
'Authorization': 'JWT ' + getApp().globalData.admintoken
},
success (res){
wx.hideLoading()
let data = JSON.parse(res.data);
that.data.upqdimgs.push(data.data.path)
if(x == that.data.qdimgs.length){
that.upImgx(0, 'xcimgs')
}else{
that.upImgx(index+1, 'qdimgs')
}
}
})
}else{
let x = index+1
wx.showLoading({
title: '正在上传现场图片',
})
wx.uploadFile({
filePath: that.data.xcimgs[index],
name: 'file',
url: getApp().globalData.host+'/uploadfile/',
header:{
'Authorization': 'JWT ' + getApp().globalData.admintoken
},
success (res){
wx.hideLoading()
let data = JSON.parse(res.data);
that.data.upxcimgs.push(data.data.path)
if(x == that.data.xcimgs.length){
that.confirm()
}else{
that.upImgx(index+1, 'xcimgs')
}
}
})
}
}
})

View File

@ -0,0 +1,4 @@
{
"usingComponents": {
}
}

View File

@ -0,0 +1,65 @@
<view class="page">
<view class="page__bd">
<view class="weui-cells">
<view class="weui-cell">
<view class="weui-cell__bd">
<view class="weui-uploader">
<view class="weui-uploader__hd">
<view class="weui-uploader__overview">
<view class="weui-uploader__title">签到表图片</view>
<!-- <view class="weui-uploader__info">{{files.length}}/2</view> -->
</view>
<view class="weui-uploader__tips">
长按删除
</view>
</view>
<view class="weui-uploader__bd">
<view class="weui-uploader__files" id="uploaderFiles">
<block wx:for="{{qdimgs}}" wx:key="*this">
<view class="weui-uploader__file" bindtap="previewImage" id="{{item}}" data-type="qdimgs" bindlongpress="deleteImg"
data-index="{{index}}">
<image class="weui-uploader__img" src="{{item}}" mode="aspectFill" />
</view>
</block>
</view>
<view class="weui-uploader__input-box">
<view class="weui-uploader__input" bindtap="chooseImage" data-type="qdimgs"></view>
</view>
</view>
</view>
</view>
</view>
<view class="weui-cell">
<view class="weui-cell__bd">
<view class="weui-uploader">
<view class="weui-uploader__hd">
<view class="weui-uploader__overview">
<view class="weui-uploader__title">现场照片</view>
<!-- <view class="weui-uploader__info">{{files.length}}/2</view> -->
</view>
<view class="weui-uploader__tips">
长按删除
</view>
</view>
<view class="weui-uploader__bd">
<view class="weui-uploader__files" id="uploaderFiles">
<block wx:for="{{xcimgs}}" wx:key="*this">
<view class="weui-uploader__file" bindtap="previewImage" id="{{item}}" data-type="xcimgs" bindlongpress="deleteImg"
data-index="{{index}}">
<image class="weui-uploader__img" src="{{item}}" mode="aspectFill" />
</view>
</block>
</view>
<view class="weui-uploader__input-box">
<view class="weui-uploader__input" bindtap="chooseImage" data-type="xcimgs"></view>
</view>
</view>
</view>
</view>
</view>
</view>
<view style="margin-top:4px">
<button type="primary" bindtap="confirm" >确定上传</button>
</view>
</view>
</view>

View File

@ -0,0 +1 @@
/* pages/admin/exam/u'p.wxss */

View File

@ -23,20 +23,20 @@
"compileHotReLoad": false,
"useMultiFrameRuntime": true,
"useApiHook": true,
"useApiHostProcess": false,
"babelSetting": {
"ignore": [],
"disablePlugins": [],
"outputPath": ""
},
"enableEngineNative": false,
"bundle": false,
"useIsolateContext": true,
"useCompilerModule": true,
"userConfirmedUseCompilerModuleSwitch": false,
"userConfirmedBundleSwitch": false,
"packNpmManually": false,
"packNpmRelationList": [],
"minifyWXSS": true
"minifyWXSS": true,
"useApiHostProcess": false
},
"compileType": "miniprogram",
"libVersion": "2.15.0",

View File

@ -0,0 +1,24 @@
# Generated by Django 3.0.4 on 2021-06-13 14:29
import django.contrib.postgres.fields.jsonb
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('examtest', '0030_examtest_consumer_detail'),
]
operations = [
migrations.AddField(
model_name='examtest',
name='qdimgs',
field=django.contrib.postgres.fields.jsonb.JSONField(default=list, verbose_name='签到图片'),
),
migrations.AddField(
model_name='examtest',
name='xcimgs',
field=django.contrib.postgres.fields.jsonb.JSONField(default=list, verbose_name='现场图片'),
),
]

View File

@ -0,0 +1,32 @@
# Generated by Django 3.0.4 on 2021-06-13 14:34
import django.contrib.postgres.fields.jsonb
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('examtest', '0031_auto_20210613_2229'),
]
operations = [
migrations.RemoveField(
model_name='examtest',
name='qdimgs',
),
migrations.RemoveField(
model_name='examtest',
name='xcimgs',
),
migrations.AddField(
model_name='exam',
name='qdimgs',
field=django.contrib.postgres.fields.jsonb.JSONField(default=list, verbose_name='签到图片'),
),
migrations.AddField(
model_name='exam',
name='xcimgs',
field=django.contrib.postgres.fields.jsonb.JSONField(default=list, verbose_name='现场图片'),
),
]

View File

@ -20,7 +20,9 @@ class Exam(CommonModel):
proctor_phone = models.CharField('监考人联系方式', max_length=100)
create_admin = models.ForeignKey(UserProfile, on_delete=models.SET_NULL, null=True, blank=True, related_name='exam_create_admin')
chance = models.IntegerField('考试机会', default=3)
qdimgs = JSONField('签到图片', default=list)
xcimgs = JSONField('现场图片', default=list)
def __str__(self):
return self.name
@ -49,6 +51,7 @@ class ExamTest(CommonModel):
is_pass = models.BooleanField(default=True, verbose_name='是否通过')
exam = models.ForeignKey(Exam, verbose_name='关联的正式考试', null=True, blank=True, related_name='examtest_exam', on_delete= models.SET_NULL)
class Meta:
verbose_name = '模拟考试'
verbose_name_plural = verbose_name

View File

@ -157,6 +157,13 @@ class ExamViewSet(ModelViewSet):
return Response(ret)
return Response({'error':'生成试卷失败'})
@action(methods=['post'], detail = True ,perms_map=[{'post':'exam_update'}])
def upimgs(self, request, *args, **kwargs):
obj = self.get_object()
obj.qdimgs = request.data.get('qdimgs', [])
obj.xcimgs = request.data.get('xcimgs', [])
obj.save()
return Response()
class AnswerDetailView(APIView):
@ -392,8 +399,9 @@ class ExamTestViewSet(PageOrNot, ModelViewSet):
filterset_fields = ['type','is_pass', 'exam']
def get_serializer_class(self):
if self.request.query_params.get('exam', None) or self.request.query_params.get('type') == '正式考试':
return ExamTestExamListSerializer
if self.request:
if self.request.query_params.get('exam', None) or self.request.query_params.get('type') == '正式考试':
return ExamTestExamListSerializer
return ExamTestListSerializer
def filter_queryset(self, queryset):
@ -535,6 +543,7 @@ class ExamTestViewSet(PageOrNot, ModelViewSet):
candidate.create_admin = request.user
candidate.save()
return Response({"id":candidate.pk, "number":candidate.number})
class PaperViewSet(ModelViewSet):
"""