ソースを参照

修改错题未显示的bug,PaperResultVo增加用户名、用户姓名、校区字段展示

4228306 5 年 前
コミット
b382b8ed9d

+ 431 - 0
doc/longhorn.yaml

@@ -0,0 +1,431 @@
+apiVersion: v1
+kind: Namespace
+metadata:
+  name: longhorn-system
+---
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+  name: longhorn-service-account
+  namespace: longhorn-system
+---
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRole
+metadata:
+  name: longhorn-role
+rules:
+  - apiGroups:
+      - apiextensions.k8s.io
+    resources:
+      - customresourcedefinitions
+    verbs:
+      - "*"
+  - apiGroups: [""]
+    resources: ["pods", "events", "persistentvolumes", "persistentvolumeclaims", "nodes", "proxy/nodes", "pods/log", "secrets", "services", "endpoints", "configmaps"]
+    verbs: ["*"]
+  - apiGroups: [""]
+    resources: ["namespaces"]
+    verbs: ["get", "list"]
+  - apiGroups: ["apps"]
+    resources: ["daemonsets", "statefulsets", "deployments"]
+    verbs: ["*"]
+  - apiGroups: ["batch"]
+    resources: ["jobs", "cronjobs"]
+    verbs: ["*"]
+  - apiGroups: ["storage.k8s.io"]
+    resources: ["storageclasses", "volumeattachments", "csinodes", "csidrivers"]
+    verbs: ["*"]
+  - apiGroups: ["coordination.k8s.io"]
+    resources: ["leases"]
+    verbs: ["get", "watch", "list", "delete", "update", "create"]
+  - apiGroups: ["longhorn.io"]
+    resources: ["volumes", "volumes/status", "engines", "engines/status", "replicas", "replicas/status", "settings",
+                "engineimages", "engineimages/status", "nodes", "nodes/status", "instancemanagers", "instancemanagers/status"]
+    verbs: ["*"]
+  - apiGroups: ["coordination.k8s.io"]
+    resources: ["leases"]
+    verbs: ["*"]
+  # to be removed after v0.7.0
+  - apiGroups: ["longhorn.rancher.io"]
+    resources: ["volumes", "engines", "replicas", "settings", "engineimages", "nodes", "instancemanagers"]
+    verbs: ["*"]
+---
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRoleBinding
+metadata:
+  name: longhorn-bind
+roleRef:
+  apiGroup: rbac.authorization.k8s.io
+  kind: ClusterRole
+  name: longhorn-role
+subjects:
+  - kind: ServiceAccount
+    name: longhorn-service-account
+    namespace: longhorn-system
+---
+apiVersion: apiextensions.k8s.io/v1beta1
+kind: CustomResourceDefinition
+metadata:
+  labels:
+    longhorn-manager: Engine
+  name: engines.longhorn.io
+spec:
+  group: longhorn.io
+  names:
+    kind: Engine
+    listKind: EngineList
+    plural: engines
+    shortNames:
+      - lhe
+    singular: engine
+  scope: Namespaced
+  version: v1beta1
+  subresources:
+    status: {}
+---
+apiVersion: apiextensions.k8s.io/v1beta1
+kind: CustomResourceDefinition
+metadata:
+  labels:
+    longhorn-manager: Replica
+  name: replicas.longhorn.io
+spec:
+  group: longhorn.io
+  names:
+    kind: Replica
+    listKind: ReplicaList
+    plural: replicas
+    shortNames:
+      - lhr
+    singular: replica
+  scope: Namespaced
+  version: v1beta1
+  subresources:
+    status: {}
+---
+apiVersion: apiextensions.k8s.io/v1beta1
+kind: CustomResourceDefinition
+metadata:
+  labels:
+    longhorn-manager: Setting
+  name: settings.longhorn.io
+spec:
+  group: longhorn.io
+  names:
+    kind: Setting
+    listKind: SettingList
+    plural: settings
+    shortNames:
+      - lhs
+    singular: setting
+  scope: Namespaced
+  version: v1beta1
+---
+apiVersion: apiextensions.k8s.io/v1beta1
+kind: CustomResourceDefinition
+metadata:
+  labels:
+    longhorn-manager: Volume
+  name: volumes.longhorn.io
+spec:
+  group: longhorn.io
+  names:
+    kind: Volume
+    listKind: VolumeList
+    plural: volumes
+    shortNames:
+      - lhv
+    singular: volume
+  scope: Namespaced
+  version: v1beta1
+  subresources:
+    status: {}
+---
+apiVersion: apiextensions.k8s.io/v1beta1
+kind: CustomResourceDefinition
+metadata:
+  labels:
+    longhorn-manager: EngineImage
+  name: engineimages.longhorn.io
+spec:
+  group: longhorn.io
+  names:
+    kind: EngineImage
+    listKind: EngineImageList
+    plural: engineimages
+    shortNames:
+      - lhei
+    singular: engineimage
+  scope: Namespaced
+  version: v1beta1
+  subresources:
+    status: {}
+---
+apiVersion: apiextensions.k8s.io/v1beta1
+kind: CustomResourceDefinition
+metadata:
+  labels:
+    longhorn-manager: Node
+  name: nodes.longhorn.io
+spec:
+  group: longhorn.io
+  names:
+    kind: Node
+    listKind: NodeList
+    plural: nodes
+    shortNames:
+      - lhn
+    singular: node
+  scope: Namespaced
+  version: v1beta1
+  subresources:
+    status: {}
+---
+apiVersion: apiextensions.k8s.io/v1beta1
+kind: CustomResourceDefinition
+metadata:
+  labels:
+    longhorn-manager: InstanceManager
+  name: instancemanagers.longhorn.io
+spec:
+  group: longhorn.io
+  names:
+    kind: InstanceManager
+    listKind: InstanceManagerList
+    plural: instancemanagers
+    shortNames:
+      - lhim
+    singular: instancemanager
+  scope: Namespaced
+  version: v1beta1
+  subresources:
+    status: {}
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: longhorn-default-setting
+  namespace: longhorn-system
+data:
+  default-setting.yaml: |-
+    backup-target:
+    backup-target-credential-secret:
+    create-default-disk-labeled-nodes:
+    default-data-path:
+    replica-soft-anti-affinity:
+    storage-over-provisioning-percentage:
+    storage-minimal-available-percentage:
+    upgrade-checker:
+    default-replica-count:
+    guaranteed-engine-cpu:
+    default-longhorn-static-storage-class:
+    backupstore-poll-interval:
+    taint-toleration:
+---
+apiVersion: apps/v1
+kind: DaemonSet
+metadata:
+  labels:
+    app: longhorn-manager
+  name: longhorn-manager
+  namespace: longhorn-system
+spec:
+  selector:
+    matchLabels:
+      app: longhorn-manager
+  template:
+    metadata:
+      labels:
+        app: longhorn-manager
+    spec:
+      containers:
+        - name: longhorn-manager
+          image: longhornio/longhorn-manager:v0.7.0
+          imagePullPolicy: Always
+          securityContext:
+            privileged: true
+          command:
+            - longhorn-manager
+            - -d
+            - daemon
+            - --engine-image
+            - longhornio/longhorn-engine:v0.7.0
+            - --manager-image
+            - longhornio/longhorn-manager:v0.7.0
+            - --service-account
+            - longhorn-service-account
+          ports:
+            - containerPort: 9500
+          volumeMounts:
+            - name: dev
+              mountPath: /host/dev/
+            - name: proc
+              mountPath: /host/proc/
+            - name: varrun
+              mountPath: /var/run/
+            - name: longhorn
+              mountPath: /var/lib/rancher/longhorn/
+              mountPropagation: Bidirectional
+            - name: longhorn-default-setting
+              mountPath: /var/lib/longhorn-setting/
+          env:
+            - name: POD_NAMESPACE
+              valueFrom:
+                fieldRef:
+                  fieldPath: metadata.namespace
+            - name: POD_IP
+              valueFrom:
+                fieldRef:
+                  fieldPath: status.podIP
+            - name: NODE_NAME
+              valueFrom:
+                fieldRef:
+                  fieldPath: spec.nodeName
+            # Should be: mount path of the volume longhorn-default-setting + the key of the configmap data in 04-default-setting.yaml
+            - name: DEFAULT_SETTING_PATH
+              value: /var/lib/longhorn-setting/default-setting.yaml
+      volumes:
+        - name: dev
+          hostPath:
+            path: /dev/
+        - name: proc
+          hostPath:
+            path: /proc/
+        - name: varrun
+          hostPath:
+            path: /var/run/
+        - name: longhorn
+          hostPath:
+            path: /var/lib/rancher/longhorn/
+        - name: longhorn-default-setting
+          configMap:
+            name: longhorn-default-setting
+      serviceAccountName: longhorn-service-account
+---
+kind: Service
+apiVersion: v1
+metadata:
+  labels:
+    app: longhorn-manager
+  name: longhorn-backend
+  namespace: longhorn-system
+spec:
+  selector:
+    app: longhorn-manager
+  ports:
+    - port: 9500
+      targetPort: 9500
+  sessionAffinity: ClientIP
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  labels:
+    app: longhorn-ui
+  name: longhorn-ui
+  namespace: longhorn-system
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      app: longhorn-ui
+  template:
+    metadata:
+      labels:
+        app: longhorn-ui
+    spec:
+      containers:
+        - name: longhorn-ui
+          image: longhornio/longhorn-ui:v0.7.0
+          ports:
+            - containerPort: 8000
+          env:
+            - name: LONGHORN_MANAGER_IP
+              value: "http://longhorn-backend:9500"
+      serviceAccountName: longhorn-service-account
+---
+kind: Service
+apiVersion: v1
+metadata:
+  labels:
+    app: longhorn-ui
+  name: longhorn-frontend
+  namespace: longhorn-system
+spec:
+  selector:
+    app: longhorn-ui
+  ports:
+    - port: 80
+      targetPort: 8000
+  type: LoadBalancer
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: longhorn-driver-deployer
+  namespace: longhorn-system
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      app: longhorn-driver-deployer
+  template:
+    metadata:
+      labels:
+        app: longhorn-driver-deployer
+    spec:
+      initContainers:
+        - name: wait-longhorn-manager
+          image: longhornio/longhorn-manager:v0.7.0
+          command: ['sh', '-c', 'while [ $(curl -m 1 -s -o /dev/null -w "%{http_code}" http://longhorn-backend:9500/v1) != "200" ]; do echo waiting; sleep 2; done']
+      containers:
+        - name: longhorn-driver-deployer
+          image: longhornio/longhorn-manager:v0.7.0
+          imagePullPolicy: Always
+          command:
+            - longhorn-manager
+            - -d
+            - deploy-driver
+            - --manager-image
+            - longhornio/longhorn-manager:v0.7.0
+            - --manager-url
+            - http://longhorn-backend:9500/v1
+          # manually set root directory for csi
+          #- --kubelet-root-dir
+          #- /var/lib/rancher/k3s/agent/kubelet
+          # manually specify number of CSI attacher replicas
+          #- --csi-attacher-replica-count
+          #- "3"
+          # manually specify number of CSI provisioner replicas
+          #- --csi-provisioner-replica-count
+          #- "3"
+          env:
+            - name: POD_NAMESPACE
+              valueFrom:
+                fieldRef:
+                  fieldPath: metadata.namespace
+            - name: NODE_NAME
+              valueFrom:
+                fieldRef:
+                  fieldPath: spec.nodeName
+            - name: SERVICE_ACCOUNT
+              valueFrom:
+                fieldRef:
+                  fieldPath: spec.serviceAccountName
+      serviceAccountName: longhorn-service-account
+---
+kind: StorageClass
+apiVersion: storage.k8s.io/v1
+metadata:
+  name: longhorn
+provisioner: driver.longhorn.io
+parameters:
+  numberOfReplicas: "3"
+  staleReplicaTimeout: "2880" # 48 hours in minutes
+  fromBackup: ""
+#  diskSelector: "ssd,fast"
+#  nodeSelector: "storage,fast"
+#  recurringJobs: '[{"name":"snap", "task":"snapshot", "cron":"*/1 * * * *", "retain":1},
+#                   {"name":"backup", "task":"backup", "cron":"*/2 * * * *", "retain":1,
+#                    "labels": {"interval":"2m"}}]'
+---

+ 1 - 1
src/main/java/edu/math/diagnosis/controller/PaperCommitController.java

@@ -28,7 +28,7 @@ public class PaperCommitController {
 
     @GetMapping("hasCommit")
     public Result hasCommit(Long pid, Long uid) {
-        return commitService.hasCommit(pid, uid);
+        return new Result(commitService.hasCommit(pid, uid));
     }
 
     @ApiOperation(value = "获取某学生所有做过的试卷")

+ 9 - 0
src/main/java/edu/math/diagnosis/controller/PaperController.java

@@ -1,5 +1,6 @@
 package edu.math.diagnosis.controller;
 
+import edu.math.diagnosis.config.Constants;
 import edu.math.diagnosis.entity.Paper;
 import edu.math.diagnosis.file.FileService;
 import edu.math.diagnosis.model.PaperVo;
@@ -70,6 +71,14 @@ public class PaperController {
         return paperService.update(paper);
     }
 
+    @PostMapping("/invalidate")
+    @ApiOperation(value = "作废试卷")
+    public Result invalidate(Long pid){
+        Paper paper = paperService.getOnePaper(pid);
+        paper.setStatus(Constants.PAPER_STATUS_INVALIDATE);
+        return paperService.update(paper);
+    }
+
     @PreAuthorize("hasRole('ROLE_ADMIN')")
     @ApiOperation(value = "删除试卷")
     @RequestMapping(value = "/delete", method = RequestMethod.GET)

+ 8 - 3
src/main/java/edu/math/diagnosis/controller/PaperResultController.java

@@ -4,6 +4,7 @@ import edu.math.diagnosis.dao.PaperCommitRepo;
 import edu.math.diagnosis.entity.Paper;
 import edu.math.diagnosis.entity.PaperCommit;
 import edu.math.diagnosis.entity.PaperResult;
+import edu.math.diagnosis.model.PaperResultVo;
 import edu.math.diagnosis.model.Result;
 import edu.math.diagnosis.service.PaperResultService;
 import edu.math.diagnosis.service.PaperService;
@@ -18,6 +19,8 @@ import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
 import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 @Api(tags = "试卷提交后结果生成")
 @RestController
@@ -53,14 +56,16 @@ public class PaperResultController {
     }
 
     @GetMapping("/listSimpleResult")
-    @ApiOperation("获取简单结果")
-    public Result listSimpleResult(Long pid, Long uid) {
+    @ApiOperation("获取简单结果,暂时未根据用户姓名模糊查询")
+    public Result listSimpleResult(Long pid, Long uid, String uname) {
         List<PaperResult> result = paperResultService.listSimpleResult(pid, uid);
+        List<PaperResultVo> list = paperResultService.listWithUser(result);
+
 //        result.forEach(r -> {
 //            r.setWrongAnswerContrastVo(ObjectUtil.json2List(r.getWrongAnswerContrast()));
 //            r.setWrongAnswerContrast(null);
 //        });
-        return Result.ok(result);
+        return Result.ok(list);
     }
 
 }

+ 9 - 0
src/main/java/edu/math/diagnosis/entity/PaperResult.java

@@ -199,11 +199,20 @@ public class PaperResult {
      * }]
      */
     @Lob
+    @ApiModelProperty("错误答案对比 [{\n" +
+            "     \"qid\":1,\n" +
+            "      \"number\":1,\n" +
+            "      \"options\":\"A\",\n" +
+            "      \"answer\":\"B\"\n" +
+            "     }]")
     private String wrongAnswerContrast;
 
     @Transient
     private List<AnswerContrast> wrongAnswerContrastVo;
 
+
+
+
     public PaperResult() {
     }
 

+ 11 - 1
src/main/java/edu/math/diagnosis/model/AnswerContrast.java

@@ -6,12 +6,14 @@ public class AnswerContrast {
     private Integer number;
     private String options;
     private String answer;
+    private Long useTime;
 
-    public AnswerContrast(Long qid, Integer number, String options, String answer) {
+    public AnswerContrast(Long qid, Integer number, String options, String answer,Long useTime) {
         this.qid = qid;
         this.number = number;
         this.options = options;
         this.answer = answer;
+        this.useTime = useTime;
     }
 
     public Long getQid() {
@@ -45,4 +47,12 @@ public class AnswerContrast {
     public void setAnswer(String answer) {
         this.answer = answer;
     }
+
+    public Long getUseTime() {
+        return useTime;
+    }
+
+    public void setUseTime(Long useTime) {
+        this.useTime = useTime;
+    }
 }

+ 124 - 0
src/main/java/edu/math/diagnosis/model/PaperResultVo.java

@@ -0,0 +1,124 @@
+package edu.math.diagnosis.model;
+
+import java.util.Date;
+
+public class PaperResultVo {
+    private Long id;
+    private Double score;
+    private String name;
+    private Long uid;
+    private Long pid;
+    private String code;
+    private Date createtime;
+    private String collectQuestion;
+    private String wrongQuestion;
+    private String wrongAnswerContrast;
+
+    private String uname;
+    private String username;
+    private String region;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Double getScore() {
+        return score;
+    }
+
+    public void setScore(Double score) {
+        this.score = score;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Long getUid() {
+        return uid;
+    }
+
+    public void setUid(Long uid) {
+        this.uid = uid;
+    }
+
+    public Long getPid() {
+        return pid;
+    }
+
+    public void setPid(Long pid) {
+        this.pid = pid;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public Date getCreatetime() {
+        return createtime;
+    }
+
+    public void setCreatetime(Date createtime) {
+        this.createtime = createtime;
+    }
+
+    public String getCollectQuestion() {
+        return collectQuestion;
+    }
+
+    public void setCollectQuestion(String collectQuestion) {
+        this.collectQuestion = collectQuestion;
+    }
+
+    public String getWrongQuestion() {
+        return wrongQuestion;
+    }
+
+    public void setWrongQuestion(String wrongQuestion) {
+        this.wrongQuestion = wrongQuestion;
+    }
+
+    public String getWrongAnswerContrast() {
+        return wrongAnswerContrast;
+    }
+
+    public void setWrongAnswerContrast(String wrongAnswerContrast) {
+        this.wrongAnswerContrast = wrongAnswerContrast;
+    }
+
+    public String getUname() {
+        return uname;
+    }
+
+    public void setUname(String uname) {
+        this.uname = uname;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getRegion() {
+        return region;
+    }
+
+    public void setRegion(String region) {
+        this.region = region;
+    }
+}

+ 7 - 4
src/main/java/edu/math/diagnosis/service/CommitService.java

@@ -119,6 +119,11 @@ public class CommitService {
         if (userInfo == null) {
             return Result.fail("没有找到用户");
         }
+
+        if (hasCommit(paperCommit.getPid(), paperCommit.getUid())) {
+            return Result.fail("已经提交,请勿重复提交");
+        }
+
         List<Answer> answers = paperCommit.getAnswers();
         if (CommonUtil.isEmpty(answers)) {
             return Result.fail("没有填写答案");
@@ -147,7 +152,6 @@ public class CommitService {
     }
 
 
-
     public List<PaperCommit> listPaperCommit(Long pid, String name, Long startTime, Long endTime) {
         //TODO 增加时间区间查询,待优化查询
         if (pid == null && StringUtils.isBlank(name)) {
@@ -162,9 +166,8 @@ public class CommitService {
         return paperCommitRepo.findByPidOrNameContaining(pid, name);
     }
 
-    public Result hasCommit(Long pid, Long uid) {
-        boolean exist = paperCommitRepo.existsByPidAndUid(pid, uid);
-        return new Result(exist);
+    public boolean hasCommit(Long pid, Long uid) {
+        return paperCommitRepo.existsByPidAndUid(pid, uid);
     }
 
     private String generateCode() {

+ 33 - 1
src/main/java/edu/math/diagnosis/service/PaperResultService.java

@@ -16,6 +16,8 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
 import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
@@ -47,6 +49,12 @@ public class PaperResultService {
     @Resource
     private SubjectService subjectService;
 
+    @Resource
+    private UserService userService;
+
+//    @PersistenceContext
+//    private EntityManager entityManager;
+
     private static final Logger logger = LoggerFactory.getLogger(PaperResultService.class);
 
     public Result parseResult(Long pid, Long uid) {
@@ -87,7 +95,9 @@ public class PaperResultService {
 //                    .findFirst().orElse(null);
             Answer a = mapAnswers.getOrDefault(q.getNumber(), null);
             if (a == null || StringUtils.isBlank(a.getOptions())) {
-                AnswerContrast contrast = new AnswerContrast(q.getId(), q.getNumber(), a == null ? "" : a.getOptions(), ans);
+                String options = a == null ? "" : a.getOptions();
+                Long useTime = a == null ? 0L : a.getUseTime() == null ? 0L : a.getUseTime();
+                AnswerContrast contrast = new AnswerContrast(q.getId(), q.getNumber(), options, q.getAnswer(), useTime);
                 contrasts.add(contrast);
                 continue;
             }
@@ -102,6 +112,11 @@ public class PaperResultService {
                     score += qData.getOrDefault(d, 0d);
                     pData.put(d, pData0);
                 }
+            } else {
+                String options = a.getOptions();
+                Long useTime = a.getUseTime() == null ? 0L : a.getUseTime();
+                AnswerContrast contrast = new AnswerContrast(q.getId(), q.getNumber(), options, q.getAnswer(), useTime);
+                contrasts.add(contrast);
             }
         }
         //对的选项进行升序排序
@@ -674,4 +689,21 @@ public class PaperResultService {
         }
         return paperResultRepo.findByPidOrderByCreatetimeDesc(pid);
     }
+
+    public List<PaperResultVo> listWithUser(List<PaperResult> results) {
+        Set<Long> uids = results.stream().map(PaperResult::getUid).collect(Collectors.toSet());
+        List<UserInfo> userInfos = userService.listByUids(uids);
+        Map<Long, UserInfo> userInfoMap = userInfos.stream().collect(Collectors.toMap(UserInfo::getId, Function.identity()));
+        List<PaperResultVo> list = new ArrayList<>();
+        results.forEach(r -> {
+            PaperResultVo vo = ObjectUtil.convert(r, PaperResultVo.class);
+            if (vo != null) {
+                vo.setUname(userInfoMap.getOrDefault(r.getUid(), new UserInfo()).getName());
+                vo.setUsername(userInfoMap.getOrDefault(r.getUid(), new UserInfo()).getUsername());
+                vo.setRegion(userInfoMap.getOrDefault(r.getUid(), new UserInfo()).getRegion());
+            }
+            list.add(vo);
+        });
+        return list;
+    }
 }

+ 5 - 0
src/main/java/edu/math/diagnosis/service/UserService.java

@@ -13,6 +13,7 @@ import javax.annotation.Resource;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.Set;
 
 
 /**
@@ -50,6 +51,10 @@ public class UserService {
         return userRepo.findAll(sort);
     }
 
+    public List<UserInfo> listByUids(Set<Long> uids){
+        return userRepo.findAllById(uids);
+    }
+
     public UserInfo findByUsername(String username) {
         UserInfo userInfo = userRepo.findByUsername(username);
         if (userInfo == null) {