diff --git a/test_client/src/views/crm/consumer.vue b/test_client/src/views/crm/consumer.vue
index 71695d0..3e30c00 100644
--- a/test_client/src/views/crm/consumer.vue
+++ b/test_client/src/views/crm/consumer.vue
@@ -108,6 +108,11 @@
+
+
+ {{ scope.row.workscope_name }}
+
+
{{ scope.row.create_time }}
@@ -177,6 +182,17 @@
:value="item.value"
>
+
+
+
+
+
+
@@ -197,6 +213,7 @@ import {
importConsumer
} from "@/api/crm";
import { getSubjectAll } from "@/api/question"
+import { getWorkScopeAll } from "@/api/examtest"
import { getCompanyList } from "@/api/crm";
import { genTree, deepClone } from "@/utils";
import checkPermission from "@/utils/permission";
@@ -209,7 +226,8 @@ const defaultConsumer = {
name: "",
username: "",
company: null,
- subjects:[]
+ subjects:[],
+ workscope:null
};
const listQuery = {
page: 1,
@@ -253,6 +271,7 @@ export default {
treeLoding: false,
companyData: [],
subjectData: [],
+ workscopeData:[],
};
},
computed: {},
@@ -260,6 +279,7 @@ export default {
this.getList();
this.getCompanyList();
this.getSubjectAll();
+ this.getWorkScopeAll();
},
methods: {
checkPermission,
@@ -313,6 +333,11 @@ export default {
this.subjectData = genTree(response.data);
});
},
+ getWorkScopeAll() {
+ getWorkScopeAll().then(response => {
+ this.workscopeData = genTree(response.data);
+ });
+ },
resetFilter() {
this.listQuery = {
page: 1,
diff --git a/test_mini/app.js b/test_mini/app.js
index fc511ea..d08d795 100644
--- a/test_mini/app.js
+++ b/test_mini/app.js
@@ -20,10 +20,6 @@ App({
wx.reLaunch({
url: '/pages/login/login',
})
- }else if(res.data.userinfo.subjects){
- try {
- wx.setStorageSync('nowSubject', {id:res.data.userinfo.subjects[0],name:res.data.userinfo.subjects_name[0]})
- } catch (e) { }
}
}
})
@@ -52,9 +48,9 @@ App({
globalData: {
userInfo: null,
userinfo: null, // 服务器传回的消费者信息
- host: 'https://apitest.ctcshe.com/',
+ // host: 'https://apitest.ctcshe.com/',
mediahost: 'https://apitest.ctcshe.com/',
- // host: 'http://127.0.0.1:8000/',
+ host: 'http://127.0.0.1:8000/',
// mediahost: 'http://127.0.0.1:8000/',
token : '',
subject:null,
diff --git a/test_mini/pages/lianxi/index.js b/test_mini/pages/lianxi/index.js
index 3352f55..f6454de 100644
--- a/test_mini/pages/lianxi/index.js
+++ b/test_mini/pages/lianxi/index.js
@@ -6,27 +6,25 @@ Page({
* 页面的初始数据
*/
data: {
- questioncatData:[],
- isLoad:true
+ questioncatData: [],
+ isLoad: true
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function () {
- try {
- var value = wx.getStorageSync('nowWork')
- if (value) {
- this.setData({
- workscopeId: value.id
- })
- } else{
- wx.switchTab({
- url: '/pages/main/main',
- })
- }
- } catch (e) {
+
+ if (getApp().globalData.userinfo.workscope) {
+ this.setData({
+ workscopeId: getApp().globalData.userinfo.workscope
+ })
+ } else {
+ wx.switchTab({
+ url: '/pages/main/main',
+ })
}
+
},
/**
@@ -42,10 +40,10 @@ Page({
onShow: function () {
this.getList()
},
- getList: function (){
- var that = this
- if(that.data.workscopeId){
- api.request('question/questioncat/workscope/', 'GET', { 'id': that.data.workscopeId }).then(res => {
+ getList: function () {
+ var that = this
+ if (that.data.workscopeId) {
+ api.request('question/questioncat/workscope/', 'GET', { 'id': that.data.workscopeId }).then(res => {
let questioncatData = []
if (res.data.length > 0) {
for (var i = 0; i < res.data.length; i++) {
@@ -61,10 +59,10 @@ Page({
questioncatData: that.showYd(questioncatData)
})
}
- })
- }
-
- },
+ })
+ }
+
+ },
showYd: function (cat) {
for (var i = 0; i < cat.length; i++) {
try {
@@ -111,10 +109,10 @@ Page({
onShareAppMessage: function () {
},
-
+
startLianxi: function (e) {
wx.navigateTo({
- url: 'main?questioncat='+e.currentTarget.id,
+ url: 'main?questioncat=' + e.currentTarget.id,
})
},
restartLianxi: function (e) {
diff --git a/test_mini/pages/main/main.js b/test_mini/pages/main/main.js
index 9a0a12d..5f77206 100644
--- a/test_mini/pages/main/main.js
+++ b/test_mini/pages/main/main.js
@@ -71,11 +71,11 @@ Page({
* 生命周期函数--监听页面显示
*/
onShow: function () {
- if(wx.getStorageSync('nowWork')){
- this.setData({
- nowWork: wx.getStorageSync('nowWork')
- })
- }
+ // if(wx.getStorageSync('nowWork')){
+ // this.setData({
+ // nowWork: wx.getStorageSync('nowWork')
+ // })
+ // }
},
/**
@@ -112,36 +112,34 @@ Page({
onShareAppMessage: function () {
},
- chooseWork: function () {
- wx.navigateTo({
- url: '/pages/workscope/index',
- })
- },
+ // chooseWork: function () {
+ // wx.navigateTo({
+ // url: '/pages/workscope/index',
+ // })
+ // },
goLianxi: function () {
- let nowWork = wx.getStorageSync('nowWork')
- if (nowWork){
+ if (getApp().globalData.userinfo.workscope){
wx.navigateTo({
url: '/pages/lianxi/index',
})
}else{
wx.showToast({
- title: '请先选择工作类别',
+ title: '未开通权限\r\n请联系顾问师圆',
icon: 'none',
- duration: 1500
+ duration: 2000
})
}
},
goMoni: function () {
- let nowWork = wx.getStorageSync('nowWork')
- if (nowWork) {
+ if (getApp().globalData.userinfo.workscope) {
wx.navigateTo({
url: '/pages/moni/index',
})
} else {
wx.showToast({
- title: '请先选择工作类别',
+ title: '未开通权限\r\n请联系顾问师圆',
icon: 'none',
- duration: 1500
+ duration: 2000
})
}
},
diff --git a/test_mini/pages/main/main.wxml b/test_mini/pages/main/main.wxml
index 9d6c5d9..1a19ebd 100644
--- a/test_mini/pages/main/main.wxml
+++ b/test_mini/pages/main/main.wxml
@@ -8,11 +8,12 @@
- 选择工作类别
- 当前工作类别:
- {{nowWork.name}}
- 未选择
+ 欢迎使用中科辐射学堂!
+
+ 如有疑问请联系顾问师圆
+ 18355135390(微信同号)
+
练习
diff --git a/test_mini/pages/moni/index.js b/test_mini/pages/moni/index.js
index c8966f1..4aa5820 100644
--- a/test_mini/pages/moni/index.js
+++ b/test_mini/pages/moni/index.js
@@ -14,20 +14,13 @@ Page({
* 生命周期函数--监听页面加载
*/
onLoad: function () {
- try {
- var value = wx.getStorageSync('nowWork')
- if (value) {
- this.setData({
- workId: value.id
- })
- this.genPaper()
- }else{
- wx.navigateBack({
-
- })
- }
- } catch (e) {
- wx.navigateBack({
+ if (getApp().globalData.userinfo.workscope) {
+ this.setData({
+ workscopeId: getApp().globalData.userinfo.workscope
+ })
+ } else {
+ wx.switchTab({
+ url: '/pages/main/main',
})
}
},
diff --git a/test_mini/pages/my/index.js b/test_mini/pages/my/index.js
index a173f65..e5998a3 100644
--- a/test_mini/pages/my/index.js
+++ b/test_mini/pages/my/index.js
@@ -9,7 +9,7 @@ Page({
total:0,
avg_score:0,
pass_rate:0,
- nowSubject:'点击选择'
+ nowWork:'点击选择'
},
/**
@@ -32,15 +32,6 @@ Page({
* 生命周期函数--监听页面显示
*/
onShow: function () {
- try {
- var value = wx.getStorageSync('nowSubject')
- if (value) {
- this.setData({
- nowSubject: value.name
- })
- }
- } catch (e) {
- }
api.request('examtest/myexamtestfx', 'GET').then(res => {
this.setData(res.data)
})
diff --git a/test_mini/pages/my/index.wxml b/test_mini/pages/my/index.wxml
index 2dbee83..0c6d644 100644
--- a/test_mini/pages/my/index.wxml
+++ b/test_mini/pages/my/index.wxml
@@ -26,10 +26,15 @@
统计分析
-
- 当前学科
- {{nowSubject}}
-
+
+ 工作类别
+ {{userinfo.workscope_name}}
+ 无
+
自助模考数量
{{total}}
diff --git a/test_server/crm/migrations/0011_consumer_workscope.py b/test_server/crm/migrations/0011_consumer_workscope.py
new file mode 100644
index 0000000..bd7d803
--- /dev/null
+++ b/test_server/crm/migrations/0011_consumer_workscope.py
@@ -0,0 +1,20 @@
+# Generated by Django 3.0.4 on 2020-03-26 07:24
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('examtest', '0016_auto_20200325_1610'),
+ ('crm', '0010_auto_20200324_1621'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='consumer',
+ name='workscope',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='examtest.WorkScope', verbose_name='工作类别'),
+ ),
+ ]
diff --git a/test_server/crm/models.py b/test_server/crm/models.py
index 074f5df..c4e0b45 100644
--- a/test_server/crm/models.py
+++ b/test_server/crm/models.py
@@ -2,6 +2,7 @@ from django.db import models
import django.utils.timezone as timezone
from rbac.models import SoftCommonModel, CommonModel
from question.models import Questioncat, Question
+from examtest.models_paper import WorkScope
# Create your models here.
class Company(SoftCommonModel):
@@ -29,6 +30,7 @@ class Consumer(SoftCommonModel):
avatar = models.CharField(default='/media/default/avatar.png',max_length=1000, null=True, blank=True, verbose_name='头像')
nickname = models.CharField(max_length=200, verbose_name='昵称', null=True, blank=True)
subjects = models.ManyToManyField(Questioncat, verbose_name='付费学科', through='PaySubject')
+ workscope = models.ForeignKey(WorkScope, verbose_name='工作类别', on_delete=models.SET_NULL, null=True, blank=True)
collects = models.ManyToManyField(Question, verbose_name='收藏试题')
diff --git a/test_server/crm/serializers.py b/test_server/crm/serializers.py
index 86cda93..e4aefc3 100644
--- a/test_server/crm/serializers.py
+++ b/test_server/crm/serializers.py
@@ -22,6 +22,7 @@ class ConsumerSerializer(serializers.ModelSerializer):
update_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True)
company_name = serializers.StringRelatedField(source='company', read_only=True)
subjects_name = serializers.StringRelatedField(source='subjects', many=True, read_only=True)
+ workscope_name = serializers.StringRelatedField(source='workscope', read_only=True)
class Meta:
model = Consumer
diff --git a/test_server/crm/views.py b/test_server/crm/views.py
index 63a331b..2c96469 100644
--- a/test_server/crm/views.py
+++ b/test_server/crm/views.py
@@ -27,6 +27,7 @@ from crm.permission import IsConsumerAuthenticated
from .models import Company, Consumer, PaySubject, SendCode
from .serializers import CompanySerializer, ConsumerSerializer
from question.serializers import QuestionSerializer
+from examtest.models_paper import WorkScope
from server import settings
from question.models import Questioncat
from crm.zhenzismsclient import ZhenziSmsClient
@@ -101,8 +102,8 @@ class ConsumerViewSet(ModelViewSet):
queryset = Consumer.objects.filter(is_delete=0).all()
serializer_class = ConsumerSerializer
pagination_class = CommonPagination
- ordering_fields = ('id',)
- ordering = ['company']
+ ordering_fields = ('id','company','create_time')
+ ordering = ['company','-create_time']
filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
filterset_fields = ('company',)
search_fields = ('^name',)
@@ -145,7 +146,7 @@ class ConsumerViewSet(ModelViewSet):
url_path='sendcode', url_name='code_send')
def sendcode(self, request):
'''
- 发送二维码
+ 发送验证码
'''
client = ZhenziSmsClient(sms_url, sms_appid, sms_appsecret)
code = random.randint(1000,9999)
@@ -204,34 +205,44 @@ class ConsumerViewSet(ModelViewSet):
return Response({"error":"单位列错误!"})
if sheet['d2'].value != '付费学科':
return Response({"error":"付费学科列错误!"})
+ if sheet['e2'].value != '工作类别':
+ return Response({"error":"工作类别列错误!"})
companydict = {}
consumerdict = {}
companys = Company.objects.filter(is_delete=0)
for i in companys:
companydict[i.name] = i.id
- i = 3
- while sheet['B'+str(i)].value:
- name = sheet['A'+str(i)].value
+ m = 3
+ while sheet['B'+str(m)].value:
+ name = sheet['A'+str(m)].value
if name:
name = name.replace(' ', '')
- username = sheet['B'+str(i)].value
+ username = sheet['B'+str(m)].value
if username:
username = str(username).replace(' ', '')
- companyname = sheet['C'+str(i)].value
+ companyname = sheet['C'+str(m)].value
if companyname:
companyname = companyname.replace(' ', '')
if companyname not in companydict:
return Response({"error":"不存在单位("+companyname+")!请先新建"})
else:
companyobj = Company.objects.get(id=companydict[companyname])
- subjects = sheet['d'+str(i)].value
+ subjects = sheet['d'+str(m)].value
+ workscope = sheet['e'+str(m)].value
if Consumer.objects.filter(username = username).exists():
- consumerdict[username]=i
+ consumerdict[username]=m
else:
obj = Consumer()
obj.name = name
obj.username = username
obj.company = companyobj
+ if workscope:
+ workscope = workscope.replace(' ', '')
+ try:
+ workscopeobj = WorkScope.objects.get(name=workscope)
+ obj.workscope = workscopeobj
+ except:
+ pass
obj.save()
if subjects:
subjects_list = subjects.replace(' ','').split(',')
@@ -239,7 +250,8 @@ class ConsumerViewSet(ModelViewSet):
queryset = Questioncat.objects.filter(name=i,is_subject=True,is_delete=False)
if queryset.exists():
PaySubject.objects.create(subject=queryset.first(), consumer=obj)
- i = i + 1
+
+ m = m + 1
return Response(status=status.HTTP_200_OK)
@@ -306,4 +318,6 @@ class ConsumerRegister(APIView):
else:
return Response({'error':'验证码错误!'})
else:
- return Response({'error':'认证错误!'})
\ No newline at end of file
+ return Response({'error':'认证错误!'})
+ else:
+ return Response({'error':'信息不全!'})
\ No newline at end of file
diff --git a/test_server/examtest/models.py b/test_server/examtest/models.py
index ab5d359..b126fe3 100644
--- a/test_server/examtest/models.py
+++ b/test_server/examtest/models.py
@@ -3,46 +3,9 @@ from rbac.models import SoftCommonModel, CommonModel
from django.contrib.postgres.fields import JSONField, ArrayField
from question.models import Questioncat, Question
from crm.models import Consumer
+from .models_paper import WorkScope, Paper
-
-# Create your models here.
-class TestRule(SoftCommonModel):
- name = models.CharField(max_length=200, unique=True, verbose_name='名称')
- danxuan_count = models.IntegerField(default=0, verbose_name='单选数量')
- danxuan_score = models.FloatField(default=0, verbose_name='单选分数')
- duoxuan_count = models.IntegerField(default=0, verbose_name='多选数量')
- duoxuan_score = models.FloatField(default=0, verbose_name='多选分数')
- panduan_count = models.IntegerField(default=0, verbose_name='判断数量')
- panduan_score = models.FloatField(default=0, verbose_name='判断分数')
- limit = models.IntegerField(default=0, verbose_name='限时(分钟)')
- total_score = models.FloatField(default=0, verbose_name='满分')
- pass_score = models.FloatField(default=0, verbose_name='及格分数')
-
-
- class Meta:
- verbose_name = '出题规则'
- verbose_name_plural = verbose_name
-
- def __str__(self):
- return self.name
-
-class WorkScope(SoftCommonModel):
- name = models.CharField(max_length=200, unique=True, verbose_name='名称')
- subject = models.ForeignKey(Questioncat, verbose_name='所属学科', on_delete=models.CASCADE , related_name='workscope_subject')
- questioncat = models.ManyToManyField(Questioncat, verbose_name='所选科目')
- rule = models.ForeignKey(TestRule, on_delete=models.CASCADE, verbose_name='试卷结构')
-
- class Meta:
- verbose_name = '工作类别'
- verbose_name_plural = verbose_name
-
- def __str__(self):
- return self.name
-
-class Paper(SoftCommonModel):
- name = models.CharField(max_length=200, verbose_name='名称')
-
class ExamTest(CommonModel):
'''
硬删除
diff --git a/test_server/examtest/models_paper.py b/test_server/examtest/models_paper.py
new file mode 100644
index 0000000..7d5a079
--- /dev/null
+++ b/test_server/examtest/models_paper.py
@@ -0,0 +1,43 @@
+from django.db import models
+from rbac.models import SoftCommonModel, CommonModel
+from django.contrib.postgres.fields import JSONField, ArrayField
+from question.models import Questioncat, Question
+
+
+
+# Create your models here.
+class TestRule(SoftCommonModel):
+ name = models.CharField(max_length=200, unique=True, verbose_name='名称')
+ danxuan_count = models.IntegerField(default=0, verbose_name='单选数量')
+ danxuan_score = models.FloatField(default=0, verbose_name='单选分数')
+ duoxuan_count = models.IntegerField(default=0, verbose_name='多选数量')
+ duoxuan_score = models.FloatField(default=0, verbose_name='多选分数')
+ panduan_count = models.IntegerField(default=0, verbose_name='判断数量')
+ panduan_score = models.FloatField(default=0, verbose_name='判断分数')
+ limit = models.IntegerField(default=0, verbose_name='限时(分钟)')
+ total_score = models.FloatField(default=0, verbose_name='满分')
+ pass_score = models.FloatField(default=0, verbose_name='及格分数')
+
+
+ class Meta:
+ verbose_name = '出题规则'
+ verbose_name_plural = verbose_name
+
+ def __str__(self):
+ return self.name
+
+class WorkScope(SoftCommonModel):
+ name = models.CharField(max_length=200, unique=True, verbose_name='名称')
+ subject = models.ForeignKey(Questioncat, verbose_name='所属学科', on_delete=models.CASCADE , related_name='workscope_subject')
+ questioncat = models.ManyToManyField(Questioncat, verbose_name='所选科目')
+ rule = models.ForeignKey(TestRule, on_delete=models.CASCADE, verbose_name='试卷结构')
+
+ class Meta:
+ verbose_name = '工作类别'
+ verbose_name_plural = verbose_name
+
+ def __str__(self):
+ return self.name
+
+class Paper(SoftCommonModel):
+ name = models.CharField(max_length=200, verbose_name='名称')
\ No newline at end of file
diff --git a/test_server/examtest/serializers.py b/test_server/examtest/serializers.py
index ae2912e..16f53b6 100644
--- a/test_server/examtest/serializers.py
+++ b/test_server/examtest/serializers.py
@@ -1,7 +1,8 @@
from rest_framework import serializers
from question.models import Questioncat
from crm.models import Consumer
-from .models import TestRule, ExamTest, AnswerDetail, WorkScope
+from .models import ExamTest, AnswerDetail
+from .models_paper import TestRule, WorkScope
diff --git a/test_server/examtest/views.py b/test_server/examtest/views.py
index ee45ab3..ba34373 100644
--- a/test_server/examtest/views.py
+++ b/test_server/examtest/views.py
@@ -16,7 +16,8 @@ from utils.custom import CommonPagination
from rbac.permission import RbacPermission
from question.models import Question
from question.serializers import QuestionSerializer
-from .models import TestRule, ExamTest, AnswerDetail, WorkScope
+from .models import ExamTest, AnswerDetail
+from .models_paper import TestRule, WorkScope
from .serializers import TestRuleSerializer, MoniTestSerializer, AnswerDetailSerializer, ExamTestListSerializer, AnswerDetailCreateSerializer, WorkScopeSerializer
from server import settings
from crm.authentication import ConsumerTokenAuthentication
diff --git a/test_server/media/20200326/1b768970-6f42-11ea-86ae-90cdb685c056.xlsx b/test_server/media/20200326/1b768970-6f42-11ea-86ae-90cdb685c056.xlsx
new file mode 100644
index 0000000..fb448a0
Binary files /dev/null and b/test_server/media/20200326/1b768970-6f42-11ea-86ae-90cdb685c056.xlsx differ
diff --git a/test_server/media/20200326/4f816e5c-6f41-11ea-b9f0-90cdb685c056.xlsx b/test_server/media/20200326/4f816e5c-6f41-11ea-b9f0-90cdb685c056.xlsx
new file mode 100644
index 0000000..fb448a0
Binary files /dev/null and b/test_server/media/20200326/4f816e5c-6f41-11ea-b9f0-90cdb685c056.xlsx differ
diff --git a/test_server/media/20200326/6b392c68-6f40-11ea-a2eb-90cdb685c056.xlsx b/test_server/media/20200326/6b392c68-6f40-11ea-a2eb-90cdb685c056.xlsx
new file mode 100644
index 0000000..159ab8f
Binary files /dev/null and b/test_server/media/20200326/6b392c68-6f40-11ea-a2eb-90cdb685c056.xlsx differ
diff --git a/test_server/media/20200326/7a775c98-6f42-11ea-a076-90cdb685c056.xlsx b/test_server/media/20200326/7a775c98-6f42-11ea-a076-90cdb685c056.xlsx
new file mode 100644
index 0000000..fb448a0
Binary files /dev/null and b/test_server/media/20200326/7a775c98-6f42-11ea-a076-90cdb685c056.xlsx differ
diff --git a/test_server/media/20200326/a1d712ee-6f42-11ea-95d6-90cdb685c056.xlsx b/test_server/media/20200326/a1d712ee-6f42-11ea-95d6-90cdb685c056.xlsx
new file mode 100644
index 0000000..ee484cc
Binary files /dev/null and b/test_server/media/20200326/a1d712ee-6f42-11ea-95d6-90cdb685c056.xlsx differ
diff --git a/test_server/media/20200326/fede2092-6f41-11ea-8fd8-90cdb685c056.xlsx b/test_server/media/20200326/fede2092-6f41-11ea-8fd8-90cdb685c056.xlsx
new file mode 100644
index 0000000..599913d
Binary files /dev/null and b/test_server/media/20200326/fede2092-6f41-11ea-8fd8-90cdb685c056.xlsx differ