当前位置:网站首页>Jour 04 projet de santé mentale - gestion des rendez - vous - gestion des forfaits

Jour 04 projet de santé mentale - gestion des rendez - vous - gestion des forfaits

2022-06-23 06:21:00 Gros. ۣۖ Tigre ۣۖ

No4Chapitre Gestion des nominations-Gestion des paquets

1. Système de stockage d'images

1.1 Introduction

Dans le développement réel,Nous aurons beaucoup de serveurs qui gèrent différentes fonctions.Par exemple:

Serveur d'application:Responsable du déploiement de nos applications

Serveur de base de données:Lancez notre base de données

Serveur de fichiers:Serveur responsable du stockage des fichiers téléchargés par l'utilisateur

Veuillez ajouter une description de l'image

Le but du traitement des sous - serveurs est de permettre aux serveurs de faire leur travail,Afin d'améliorer l'efficacité opérationnelle de notre projet.

Schéma commun de stockage d'images:

Programme I:UtilisernginxConstruire un serveur d'images

Programme II:Utilisation d'un système de stockage de fichiers distribués open source,Par exempleFastdfs、HDFSAttendez.

Programme III:Utilisation du stockage en nuage,Par exemple, alicloud、Seven niuyun, etc

1.2 Seven Bull Cloud Storage

Seven Bull Cloud(Affilié à Shanghai qiniu Information Technology Co., Ltd.)Est le principal fournisseur national de services d'informatique en nuage d'entreprise axé sur l'intelligence visuelle et l'intelligence des données,En même temps, il est également un fournisseur de services en nuage vidéo intelligent bien connu en Chine.,Total cumulé 70 Plus de 10 000 entreprises offrent des services,Couverture nationale80%Utilisateurs d'Internet.Stockage d'objets autour de scénarios multimédias riches、Intégration CDN Accélération、Nuage de dispositifs Rong、Plate - forme Big Data、Plate - forme d'apprentissage profond et autres produits、Et fournir une solution de Cloud vidéo intelligente à guichet unique.Fournir un écosystème de Cloud vidéo intelligent durable pour toutes les industries et applications,Aider les entreprises à accéder rapidement au Cloud,Créer une plus grande valeur commerciale.

Site officiel:https://www.qiniu.com/

Nous pouvons savoir qu'il offre une variété de services grâce à l'introduction sur le site officiel de qiniuyun,Nous utilisons principalement le Service de stockage d'objets fourni par Seven Niu Cloud pour stocker des images.

1.2.1 Inscription、Connexion

Pour utiliser les services de Seven Bull Cloud,Vous devez d'abord vous inscrire pour devenir membre.Adresse:https://portal.qiniu.com/signup

Veuillez ajouter une description de l'image

.Une fois l'inscription terminée, vous pouvez vous connecter à Seven Niu Cloud en utilisant la boîte aux lettres et le mot de passe que vous venez d'enregistrer:

Après une connexion réussie, cliquez sur la console de gestion en haut à droite de la page:

Veuillez ajouter une description de l'image

Attention!:Une fois la connexion réussie, l'authentification du nom réel est nécessaire pour effectuer les opérations pertinentes.

1.2.2 Nouvel espace de stockage

Pour le stockage d'images,Nous devons créer un nouvel espace de stockage sur la console de gestion Seven Bull Cloud.Cliquez sur le bouton Ajouter maintenant sous le stockage d'objets sur la page d'accueil de la console d'administration,La page passe à la nouvelle page de stockage:

Veuillez ajouter une description de l'image

Plusieurs espaces de stockage peuvent être créés,Chaque espace de stockage est indépendant les uns des autres.

1.2.3 Voir les informations sur l'espace de stockage

Après la création de l'espace de stockage,Le nom de l'espace de stockage créé est affiché dans le menu liste de l'espace de stockage à gauche,.Cliquez sur le nom de l'espace de stockage pour voir des informations sur l'espace de stockage actuel

Veuillez ajouter une description de l'image

1.2.4 Centre des développeurs

Vous pouvez apprendre à utiliser le service Seven Niu Cloud via le Centre de développement fourni par Seven Niu Cloud,Adresse:https://developer.qiniu.com/

Veuillez ajouter une description de l'image

Cliquez sur le magasin d'objets,Aller à la page de développement du stockage d'objets,Adresse:https://developer.qiniu.com/kodo

Seven Niu Cloud offre plusieurs façons d'exploiter les services de stockage d'objets,Adopté dans le cadre de ce projetJava SDKComment,Adresse:https://developer.qiniu.com/kodo/sdk/1239/java

Veuillez ajouter une description de l'image

UtiliserJava SDKL'opération Seven Bull Cloud doit être importée comme suitmavenCoordonnées:

<dependency>
  <groupId>com.qiniu</groupId>
  <artifactId>qiniu-java-sdk</artifactId>
  <version>7.2.0</version>
</dependency>

1.2.5 Authentification

Java SDKToutes les fonctions de,A besoin d'une autorisation légale.La signature du certificat d'autorisation nécessite une paire valide sous le compte Seven BullAccess KeyEtSecret Key,Cette paire de clés peut être placée dans le Centre personnel de la console de gestion Seven Bull Cloud(https://portal.qiniu.com/user/key)Obtenir,Comme le montre la figure ci - dessous::
Veuillez ajouter une description de l'image

1.2.6 Java SDKOpération Seven Bull Cloud

Dans ce chapitre, nous avons besoin d'utiliser ce que Seven Bull Cloud fournitJava SDKTélécharger et supprimer les images,Nous pouvons nous référer aux exemples fournis par les autorités.

//Construire une assignation de bandeZoneClasse de configuration de l'objet
Configuration cfg = new Configuration(Zone.zone0());
//...Notes de classe de référence pour d'autres paramètres
UploadManager uploadManager = new UploadManager(cfg);
//...Générer un bon de téléchargement,Et prêt à télécharger
String accessKey = "your access key";
String secretKey = "your secret key";
String bucket = "your bucket name";
//Si ouiWindowsDans les circonstances,Le format est D:\\qiniu\\test.png
String localFilePath = "/home/qiniu/test.png";
//La valeur par défaut ne spécifie paskeyDans le cas de,Avec le contenu du fichierhashValeur comme nom de fichier
String key = null;
Auth auth = Auth.create(accessKey, secretKey);
String upToken = auth.uploadToken(bucket);
try {
    
    Response response = uploadManager.put(localFilePath, key, upToken);
    //Analyser les résultats du téléchargement réussi
    DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
    System.out.println(putRet.key);
    System.out.println(putRet.hash);
} catch (QiniuException ex) {
    
    Response r = ex.response;
    System.err.println(r.toString());
    try {
    
        System.err.println(r.bodyString());
    } catch (QiniuException ex2) {
    
        //ignore
    }
}
//Construire une assignation de bandeZoneClasse de configuration de l'objet
Configuration cfg = new Configuration(Zone.zone0());
//...Notes de classe de référence pour d'autres paramètres

String accessKey = "your access key";
String secretKey = "your secret key";

String bucket = "your bucket name";
String key = "your file key";

Auth auth = Auth.create(accessKey, secretKey);
BucketManager bucketManager = new BucketManager(auth, cfg);
try {
    
    bucketManager.delete(bucket, key);
} catch (QiniuException ex) {
    
    //Si une exception est rencontrée,Description la suppression a échoué
    System.err.println(ex.code());
    System.err.println(ex.response.toString());
}

1.2.7 Classe d'outils d'emballage

Pour faciliter le fonctionnement du Service de stockage en nuage Seven Bull,Nous pouvons simplement transformer les cas officiels en une classe d'outils,Utilisez cette classe d'outils directement dans notre projet pour fonctionner:

package com.itheima.utils;

import com.google.gson.Gson;
import com.qiniu.common.QiniuException;
import com.qiniu.common.Zone;
import com.qiniu.http.Response;
import com.qiniu.storage.BucketManager;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.util.Auth;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

/** * Seven Bull Cloud Tools */
public class QiniuUtils {
    
    public  static String accessKey = "dulF9Wze9bxujtuRvu3yyYb9JX1Sp23jzd3tO708";
    public  static String secretKey = "vZkhW7iot3uWwcWz9vXfbaP4JepdWADFDHVLMZOe";
    public  static String bucket = "qiniutest";

    public static void upload2Qiniu(String filePath,String fileName){
    
        //Construire une assignation de bandeZoneClasse de configuration de l'objet
        Configuration cfg = new Configuration(Zone.zone0());
        UploadManager uploadManager = new UploadManager(cfg);
        Auth auth = Auth.create(accessKey, secretKey);
        String upToken = auth.uploadToken(bucket);
        try {
    
            Response response = uploadManager.put(filePath, fileName, upToken);
            //Analyser les résultats du téléchargement réussi
            DefaultPutRet putRet = 
              new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
        } catch (QiniuException ex) {
    
            Response r = ex.response;
            try {
    
                System.err.println(r.bodyString());
            } catch (QiniuException ex2) {
    
                //ignore
            }
        }
    }

    //Télécharger des fichiers
    public static void upload2Qiniu(byte[] bytes, String fileName){
    
        //Construire une assignation de bandeZoneClasse de configuration de l'objet
        Configuration cfg = new Configuration(Zone.zone0());
        //...Notes de classe de référence pour d'autres paramètres
        UploadManager uploadManager = new UploadManager(cfg);
        //La valeur par défaut ne spécifie paskeyDans le cas de,Avec le contenu du fichierhashValeur comme nom de fichier
        String key = fileName;
        Auth auth = Auth.create(accessKey, secretKey);
        String upToken = auth.uploadToken(bucket);
        try {
    
            Response response = uploadManager.put(bytes, key, upToken);
            //Analyser les résultats du téléchargement réussi
            DefaultPutRet putRet = 
              new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
            System.out.println(putRet.key);
            System.out.println(putRet.hash);
        } catch (QiniuException ex) {
    
            Response r = ex.response;
            System.err.println(r.toString());
            try {
    
                System.err.println(r.bodyString());
            } catch (QiniuException ex2) {
    
                //ignore
            }
        }
    }

    //Supprimer le fichier
    public static void deleteFileFromQiniu(String fileName){
    
        //Construire une assignation de bandeZoneClasse de configuration de l'objet
        Configuration cfg = new Configuration(Zone.zone0());
        String key = fileName;
        Auth auth = Auth.create(accessKey, secretKey);
        BucketManager bucketManager = new BucketManager(auth, cfg);
        try {
    
            bucketManager.delete(bucket, key);
        } catch (QiniuException ex) {
    
            //Si une exception est rencontrée,Description la suppression a échoué
            System.err.println(ex.code());
            System.err.println(ex.response.toString());
        }
    }
}

Placer cette classe d'outils dans health_commonEn ingénierie,Il sera ensuite utilisé pour.

2. Nouveau forfait

2.1 Analyse des besoins

Le paquet est en fait une collection d'équipes d'inspection , Par exemple, il y a un paquet pour “Trousse d'examen d'entrée”, Cette trousse d'examen médical peut comprendre plusieurs groupes d'examen :Inspection générale、Les analyses de sang、Routine urinaire、 Trois fonctions hépatiques . .Vous devez donc sélectionner le Groupe d'inspection inclus dans ce paquet lors de l'ajout du paquet .

La classe d'entité du paquet est Setmeal, La Feuille de données correspondante est t_setmeal. Le paquet et l'équipe d'inspection sont Multi - à Multi - relationnels , Une table intermédiaire est donc nécessaire t_setmeal_checkgroupAssocier.

2.2 Améliorer la page

La page de gestion des paquets correspond à setmeal.htmlPage, La structure de base de la page a été écrite à partir d'un prototype conçu à partir du produit , Il faut maintenant affiner la dynamique de la page .

2.2.1 Une nouvelle fenêtre apparaît

De nouvelles fenêtres sont déjà disponibles sur la page , Juste pour se cacher. . Il suffit de contrôler les propriétés de l'état de présentation dialogFormVisibleLire comme suit:true L'interface affiche une nouvelle fenêtre . La méthode de liaison lorsque vous cliquez sur le nouveau bouton est handleCreate,Donc, danshandleCreateModification de la méthodedialogFormVisibleLa valeur de la propriété esttrueC'est tout.. Et pour augmenter l'expérience utilisateur , Vous devez effacer l'entrée du formulaire chaque fois que vous cliquez sur le nouveau bouton .

Comme vous devez également sélectionner les groupes de contrôle inclus dans ce paquet lors de l'ajout d'un nouveau paquet , La nouvelle fenêtre package est donc divisée en deux parties : Informations de base et informations sur l'équipe d'inspection ,Comme le montre la figure ci - dessous::

Veuillez ajouter une description de l'image

Nouvel événement de clic de liaison de bouton ,La fonction de traitement correspondante esthandleCreate

<el-button type="primary" class="butT" @click="handleCreate()">Nouveau</el-button>
// Réinitialiser le formulaire
resetForm() {
    
  this.formData = {
    };
  this.activeName='first';
  this.checkgroupIds = [];
  this.imageUrl = null;
}
// Popup ajouter une fenêtre
handleCreate() {
    
  this.dialogFormVisible = true;
  this.resetForm();
}

2.2.2 Afficher dynamiquement la liste des groupes de contrôle

Maintenant que vous avez terminé le popup de la nouvelle fenêtre , Cependant, toutes les données de la liste d'information de l'équipe d'inspection doivent être affichées dynamiquement dans l'onglet information de l'équipe d'inspection , Et peut être coché .Les étapes de fonctionnement spécifiques sont les suivantes::

(1)Définir les données du modèle

tableData:[],// Ajouter les données de la liste des groupes de contrôle dans la fenêtre du formulaire 
checkgroupIds:[],// La case à cocher du Groupe de contrôle dans la fenêtre Ajouter un formulaire correspond à id

(2) Afficher dynamiquement les données de la liste de contrôle , Les données proviennent de tableDataDonnées du modèle

<table class="datatable">
  <thead>
    <tr>
      <th>Sélectionner</th>
      <th>Code du projet</th>
      <th>Nom du projet</th>
      <th>Description du projet</th>
    </tr>
  </thead>
  <tbody>
    <tr v-for="c in tableData">
      <td>
        <input :id="c.id" v-model="checkgroupIds" type="checkbox" :value="c.id">
      </td>
      <td><label :for="c.id">{
   {c.code}}</label></td>
      <td><label :for="c.id">{
   {c.name}}</label></td>
      <td><label :for="c.id">{
   {c.remark}}</label></td>
    </tr>
  </tbody>
</table>

(3)Parfait.handleCreateMéthodes,Envoyerajax Demande d'interroger toutes les données de l'équipe d'inspection et d'attribuer les résultats à tableData Les données du modèle sont utilisées pour la présentation des tableaux de page

// Popup ajouter une fenêtre
handleCreate() {
    
  this.dialogFormVisible = true;
  this.resetForm();
  axios.get("/checkgroup/findAll.do").then((res)=> {
    
    if(res.data.flag){
    
      this.tableData = res.data.data;
    }else{
    
      this.$message.error(res.data.message);
    }
  });
}

(4)Séparément dansCheckGroupController、CheckGroupService、CheckGroupServiceImpl、CheckGroupDao、CheckGroupDao.xml Méthode d'extension pour interroger toutes les données de l'équipe d'inspection

CheckGroupController:

//Rechercher tout
@RequestMapping("/findAll")
public Result findAll(){
    
  List<CheckGroup> checkGroupList = checkGroupService.findAll();
  if(checkGroupList != null && checkGroupList.size() > 0){
    
    Result result = new Result(true, MessageConstant.QUERY_CHECKGROUP_SUCCESS);
    result.setData(checkGroupList);
    return result;
  }
  return new Result(false,MessageConstant.QUERY_CHECKGROUP_FAIL);
}

CheckGroupService:

List<CheckGroup> findAll();

CheckGroupServiceImpl:

public List<CheckGroup> findAll() {
    
  return checkGroupDao.findAll();
}

CheckGroupDao:

List<CheckGroup> findAll();

CheckGroupDao.xml:

<select id="findAll" resultType="com.itheima.pojo.CheckGroup">
  select * from t_checkgroup
</select>

2.2.3 Téléchargement d'images et aperçu

Ceci est utilisé iciElementUI Composants de téléchargement fournis el-upload, Offre une variété d'effets de téléchargement différents , Un aperçu peut être fait après le téléchargement réussi .

Étapes de mise en oeuvre:

(1)Définir les données du modèle, Aperçu de l'image pour télécharger le fichier plus tard :

imageUrl:null,//Données du modèle,Pour l'aperçu de l'image après le téléchargement de l'image

(2) Définir les composants de téléchargement :

<!-- el-upload:Télécharger les composants action: Adresse de soumission téléchargée  auto-upload: Téléchargement automatique après sélection du fichier  name:Nom du fichier téléchargé, Le serveur peut obtenir l'objet de fichier téléchargé par nom  show-file-list:Afficher la liste des fichiers téléchargés on-success:Crochet lorsque le fichier a été téléchargé avec succès before-upload:Crochet avant le téléchargement du fichier -->
<el-upload class="avatar-uploader" action="/setmeal/upload.do" :auto-upload="autoUpload" name="imgFile" :show-file-list="false" :on-success="handleAvatarSuccess" :before-upload="beforeAvatarUpload">
  <!-- Pour télécharger un aperçu d'image -->
  <img v-if="imageUrl" :src="imageUrl" class="avatar">
  <!-- Utilisé pour afficher l'icône de téléchargement -->
  <i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>

(3) Définir la fonction de crochet correspondante :

// Crochet après le téléchargement réussi du fichier ,response Valeur retournée pour le serveur ,file Encapsulé pour le fichier actuellement téléchargé jsObjet
handleAvatarSuccess(response, file) {
    
  this.imageUrl = "http://pqjroc654.bkt.clouddn.com/"+response.data;
  this.$message({
    
    message: response.message,
    type: response.flag ? 'success' : 'error'
  });
  //Définir les données du modèle(Nom de l'image),Présentation ultérieureajax La demande est soumise à l'arrière - plan et finalement sauvegardée dans la base de données 
  this.formData.img = response.data;
}

//Crochet avant le téléchargement du fichier
beforeAvatarUpload(file) {
    
  const isJPG = file.type === 'image/jpeg';
  const isLt2M = file.size / 1024 / 1024 < 2;
  if (!isJPG) {
    
    this.$message.error(' L'image du paquet de téléchargement ne peut être que  JPG Format!');
  }
  if (!isLt2M) {
    
    this.$message.error(' La taille de l'image du paquet de téléchargement ne peut pas dépasser  2MB!');
  }
  return isJPG && isLt2M;
}

(4)CréationSetmealController,Recevoir les fichiers téléchargés

package com.itheima.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.itheima.constant.MessageConstant;
import com.itheima.entity.PageResult;
import com.itheima.entity.QueryPageBean;
import com.itheima.entity.Result;
import com.itheima.pojo.CheckGroup;
import com.itheima.pojo.Setmeal;
import com.itheima.service.CheckGroupService;
import com.itheima.service.SetmealService;
import com.itheima.utils.QiniuUtils;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.util.List;
import java.util.UUID;
/** * Gestion des paquets */
@RestController
@RequestMapping("/setmeal")
public class SetmealController {
    
    @Reference
    private SetmealService setmealService;
  
  	//Téléchargement d'images
    @RequestMapping("/upload")
    public Result upload(@RequestParam("imgFile")MultipartFile imgFile){
    
        try{
    
            //Obtenir le nom de fichier original
            String originalFilename = imgFile.getOriginalFilename();
            int lastIndexOf = originalFilename.lastIndexOf(".");
            //Obtenir un suffixe de fichier
            String suffix = originalFilename.substring(lastIndexOf - 1);
            //UtiliserUUID Nom du fichier généré au hasard , Empêcher l'écrasement de fichiers avec le même nom 
            String fileName = UUID.randomUUID().toString() + suffix;
            QiniuUtils.upload2Qiniu(imgFile.getBytes(),fileName);
            //Image téléchargée avec succès
            Result result = new Result(true, MessageConstant.PIC_UPLOAD_SUCCESS);
            result.setData(fileName);
            return result;
        }catch (Exception e){
    
            e.printStackTrace();
            //Le téléchargement de l'image a échoué
            return new Result(false,MessageConstant.PIC_UPLOAD_FAIL);
        }
    }
}

Attention!:N'oubliez pas despring Composant de téléchargement de profil dans le profil

<!--Composant de téléchargement de fichiers-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  <property name="maxUploadSize" value="104857600" />
  <property name="maxInMemorySize" value="4096" />
  <property name="defaultEncoding" value="UTF-8"/>
</bean>

2.2.4 Soumettre une demande

Envoyé lorsque l'utilisateur clique sur le bouton OK dans la nouvelle fenêtre ajax Demander que les données soient soumises à l'arrière - plan pour une opération de base de données . Les données soumises à l'arrière - plan sont divisées en deux parties : Informations de base sur le paquet ( Les données du modèle correspondant sont: formData) Et l & apos; équipe d & apos; inspection idTableau( Les données du modèle correspondant sont: checkgroupIds).

Cliquez sur l'événement pour confirmer la liaison du bouton ,La fonction de traitement correspondante esthandleAdd

<el-button type="primary" @click="handleAdd()">C'est sûr.</el-button>

Parfait.handleAddMéthodes

//Ajouter
handleAdd () {
    
  axios.post("/setmeal/add.do?checkgroupIds=" + this.checkgroupIds,this.formData).
  then((response)=> {
    
    this.dialogFormVisible = false;
    if(response.data.flag){
    
      this.$message({
    
        message: response.data.message,
        type: 'success'
      });
    }else{
    
      this.$message.error(response.data.message);
    }
  }).finally(()=> {
    
    this.findPage();
  });
}

2.3 Code de fond

2.3.1 Controller

InSetmealControllerAjouter la méthode

//Nouveau
@RequestMapping("/add")
public Result add(@RequestBody Setmeal setmeal, Integer[] checkgroupIds){
    
  try {
    
    setmealService.add(setmeal,checkgroupIds);
  }catch (Exception e){
    
    // Impossible d'ajouter un nouveau paquet 
    return new Result(false,MessageConstant.ADD_SETMEAL_FAIL);
  }
  //Nouveau paquet réussi
  return new Result(true,MessageConstant.ADD_SETMEAL_SUCCESS);
}

2.3.2 Interface de service

CréationSetmealService Interface et ajout de méthodes

package com.itheima.service;

import com.itheima.entity.PageResult;
import com.itheima.pojo.CheckGroup;
import com.itheima.pojo.Setmeal;
import java.util.List;
/** *  Interface de service du paquet d'examen physique  */
public interface SetmealService {
    
    public void add(Setmeal setmeal, Integer[] checkgroupIds);
}

2.3.3 Classe de mise en œuvre du Service

CréationSetmealServiceImpl .Classes de mise en œuvre des services et mise en œuvre des nouvelles méthodes

package com.itheima.service;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.dao.SetmealDao;
import com.itheima.entity.PageResult;
import com.itheima.pojo.Setmeal;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/** *  Mise en œuvre du Service d'examen physique  */
@Service(interfaceClass = SetmealService.class)
@Transactional
public class SetmealServiceImpl implements SetmealService {
    
    @Autowired
    private SetmealDao setmealDao;

    //Nouveau forfait
    public void add(Setmeal setmeal, Integer[] checkgroupIds) {
    
        setmealDao.add(setmeal);
        if(checkgroupIds != null && checkgroupIds.length > 0){
    
            // Relation Multi - à - multi entre le paquet de liaison et l'équipe d'inspection 
            setSetmealAndCheckGroup(setmeal.getId(),checkgroupIds);
        }
    }
    // Relation Multi - à - multi entre le paquet de liaison et l'équipe d'inspection 
    private void setSetmealAndCheckGroup(Integer id, Integer[] checkgroupIds) {
    
        for (Integer checkgroupId : checkgroupIds) {
    
            Map<String,Integer> map = new HashMap<>();
            map.put("setmeal_id",id);
            map.put("checkgroup_id",checkgroupId);
            setmealDao.setSetmealAndCheckGroup(map);
        }
    }
}

2.3.4 DaoInterface

CréationSetmealDao Interfaces et méthodes connexes

package com.itheima.dao;

import com.itheima.pojo.Setmeal;
import java.util.Map;

public interface SetmealDao {
    
    public void add(Setmeal setmeal);
    public void setSetmealAndCheckGroup(Map<String, Integer> map);
}

2.3.5 MapperFichier de cartographie

CréationSetmealDao.xml Documentation et définition des dépendances SQLDéclarations

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.itheima.dao.SetmealDao" >
    <!--Nouveau-->
    <insert id="add" parameterType="com.itheima.pojo.Setmeal">
        <selectKey resultType="java.lang.Integer" order="AFTER" keyProperty="id">
            SELECT LAST_INSERT_ID()
        </selectKey>
        insert into t_setmeal
      		(code,name,sex,age,helpCode,price,remark,attention,img)
        		values 
      		(#{code},#{name},#{sex},#{age},#{helpCode},#{price},#{remark},#{attention},#{img})
    </insert>
    <!-- Forfait de liaison et équipe d'inspection relations multiples à multiples -->
    <insert id="setSetmealAndCheckGroup" parameterType="hashmap">
        insert into t_setmeal_checkgroup
      		(setmeal_id,checkgroup_id) 
      			values
      		(#{setmeal_id},#{checkgroup_id})
    </insert>
</mapper>

2.4 Améliorer le téléchargement de fichiers

Nous avons terminé le téléchargement de fichiers. , Les images ont été stockées dans Seven Bull Cloud Server . Mais il y a un problème avec ce processus , C'est - à - dire si l'utilisateur ne télécharge que des images sans enregistrer les informations du paquet dans notre base de données , Et puis l'image que nous avons téléchargée est devenue une image pourrie . Pour ces images pourries, nous avons besoin d'un nettoyage programmé pour libérer de l'espace disque . Pour ce faire, nous devons être en mesure de distinguer ce qui est une image pourrie , Ce ne sont pas des images pourries .Comment y parvenir?

Le plan est d'utiliser redis Pour enregistrer le nom de l'image ,La pratique spécifique est:

1、 Lorsque l'utilisateur télécharge une image , Enregistrer le nom de l'image dans redisUnSetEnsemble, Par exemple, le nom de la collection est setmealPicResources

2、 Lorsque l'utilisateur ajoute un paquet , Enregistrer le nom de l'image dans redisL'autre.SetEnsemble, Par exemple, le nom de la collection est setmealPicDbResources

3、CalculsetmealPicResourcesEnsemble etsetmealPicDbResources Différence entre les ensembles , .Le résultat est une collection de noms d'images de déchets , Nettoyez ces images.

Dans cette section, nous terminons d'abord 2Liens,No3Liens( Nettoyer la Section Image ) Il sera réalisé plus tard par des tâches programmées .

Étapes de mise en oeuvre:

(1)Inhealth_backendDisponible dans le projetSpringProfilspring-redis.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

	<!--Jedis Configuration du pool de connexion -->
	<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
		<property name="maxTotal">
			<value>200</value>
		</property>
		<property name="maxIdle">
			<value>50</value>
		</property>
		<property name="testOnBorrow" value="true"/>
		<property name="testOnReturn" value="true"/>
	</bean>
	<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
		<constructor-arg name="poolConfig" ref="jedisPoolConfig" />
		<constructor-arg name="host" value="127.0.0.1" />
		<constructor-arg name="port" value="6379" type="int" />
		<constructor-arg name="timeout" value="30000" type="int" />
	</bean>
</beans>

(2)Inhealth_common Fourni dans le cadre des travaux RedisClasse constante

package com.itheima.constant;

public class RedisConstant {
    
    // Image du paquet tous les noms d'image 
    public static final String SETMEAL_PIC_RESOURCES = "setmealPicResources";
    // Nom de l'image enregistrée dans la base de données 
    public static final String SETMEAL_PIC_DB_RESOURCES = "setmealPicDbResources";
}

(3)Parfait.SetmealController, Enregistrer le nom de l'image dans redisEnsemble

@Autowired
private JedisPool jedisPool;
//Téléchargement d'images
@RequestMapping("/upload")
public Result upload(@RequestParam("imgFile")MultipartFile imgFile){
    
  try{
    
    //Obtenir le nom de fichier original
    String originalFilename = imgFile.getOriginalFilename();
    int lastIndexOf = originalFilename.lastIndexOf(".");
    //Obtenir un suffixe de fichier
    String suffix = originalFilename.substring(lastIndexOf - 1);
    //UtiliserUUID Nom du fichier généré au hasard , Empêcher l'écrasement de fichiers avec le même nom 
    String fileName = UUID.randomUUID().toString() + suffix;
    QiniuUtils.upload2Qiniu(imgFile.getBytes(),fileName);
    //Image téléchargée avec succès
    Result result = new Result(true, MessageConstant.PIC_UPLOAD_SUCCESS);
    result.setData(fileName);
    // Enregistrer le nom de l'image téléchargée Redis,Basé surRedisDeSetStockage collectif
    jedisPool.getResource().sadd(RedisConstant.SETMEAL_PIC_RESOURCES,fileName);
    return result;
  }catch (Exception e){
    
    e.printStackTrace();
    //Le téléchargement de l'image a échoué
    return new Result(false,MessageConstant.PIC_UPLOAD_FAIL);
  }
}

(4)Inhealth_service_providerDisponible dans le projetSpringProfilapplicationContext-redis.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

	<!--Jedis Configuration du pool de connexion -->
	<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
		<property name="maxTotal">
			<value>200</value>
		</property>
		<property name="maxIdle">
			<value>50</value>
		</property>
		<property name="testOnBorrow" value="true"/>
		<property name="testOnReturn" value="true"/>
	</bean>
	<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
		<constructor-arg name="poolConfig" ref="jedisPoolConfig" />
		<constructor-arg name="host" value="127.0.0.1" />
		<constructor-arg name="port" value="6379" type="int" />
		<constructor-arg name="timeout" value="30000" type="int" />
	</bean>
</beans>

(5)Parfait.SetmealServiceImplCatégorie de services, Enregistrer le nom de l'image dans redisEnsemble

@Autowired
private JedisPool jedisPool;
//Nouveau forfait
public void add(Setmeal setmeal, Integer[] checkgroupIds) {
    
  setmealDao.add(setmeal);
  if(checkgroupIds != null && checkgroupIds.length > 0){
    
    setSetmealAndCheckGroup(setmeal.getId(),checkgroupIds);
  }
  // Enregistrer le nom de l'image dans Redis
  savePic2Redis(setmeal.getImg());
}
// Enregistrer le nom de l'image dans Redis
private void savePic2Redis(String pic){
    
  jedisPool.getResource().sadd(RedisConstant.SETMEAL_PIC_DB_RESOURCES,pic);
}

3. Page de la trousse d'examen physique

3.1 Améliorer la page

3.1.1 Définir les données du modèle liées à la pagination

pagination: {
    //Données du modèle liées à la pagination
  currentPage: 1,//Page actuelle
  pageSize:10,//Nombre d'enregistrements affichés par page
  total:0,//Total des enregistrements
  queryString:null//Critères de requête
},
dataList: [],//Données de la liste de pagination à afficher sur la page courante

3.1.2 Définir la méthode de pagination

Disponible sur la page findPage Méthode pour les requêtes pagées ,Pour pouvoirsetmeal.html Les données de pagination peuvent être affichées directement après le chargement de la page ,Ça pourrait être dansVUEFonction de crochet fourniecreatedAppel moyenfindPageMéthodes

//Fonction de crochet,VUEAuto - exécution lorsque l'initialisation de l'objet est terminée
created() {
    
  this.findPage();
}
//Requête pagée
findPage() {
    
  //Paramètres de pagination
  var param = {
    
    currentPage:this.pagination.currentPage,//Nombre de pages
    pageSize:this.pagination.pageSize,//Nombre d'enregistrements affichés par page
    queryString:this.pagination.queryString//Critères de requête
  };
  //Demander l'arrière - plan
  axios.post("/setmeal/findPage.do",param).then((response)=> {
    
    // Assigner des valeurs aux données du modèle ,Basé surVUE Affichage bidirectionnel de la liaison à la page 
    this.dataList = response.data.rows;
    this.pagination.total = response.data.total;
  });
}

3.1.3 Améliorer le calendrier d'exécution de la méthode de pagination

Sauf danscreatedAppelé dans la fonction HookfindPage Méthode de requête en plus des données de pagination , Il est également appelé lorsque l'utilisateur clique sur le bouton requête ou clique sur le numéro de page dans la barre de pagination findPage Méthode redémarrer la requête .

Cliquez sur l'événement pour la liaison du bouton requête ,AppelezfindPageMéthodes

<el-button @click="findPage()" class="dalfBut">Requête</el-button>

Lier les composants de la barre de pagination current-changeÉvénements, Cet événement est un événement défini par le composant de la barre de pagination lui - même , Déclenché lorsque le numéro de page change ,La fonction de traitement correspondante esthandleCurrentChange

<el-pagination class="pagiantion" @current-change="handleCurrentChange" :current-page="pagination.currentPage" :page-size="pagination.pageSize" layout="total, prev, pager, next, jumper" :total="pagination.total">
</el-pagination>

DéfinitionhandleCurrentChangeMéthodes

//Changer le numéro de page
handleCurrentChange(currentPage) {
    
  //currentPage Pour changer le numéro de page 
  this.pagination.currentPage = currentPage;
  this.findPage();
}

3.2 Code de fond

3.2.1 Controller

InSetmealController Ajouter une méthode de requête de pagination

//Requête pagée
@RequestMapping("/findPage")
public PageResult findPage(@RequestBody QueryPageBean queryPageBean){
    
  PageResult pageResult = setmealService.pageQuery(
    queryPageBean.getCurrentPage(), 
    queryPageBean.getPageSize(), 
    queryPageBean.getQueryString()
  );
  return pageResult;
}

3.2.2 Interface de service

InSetmealService Extension de la méthode de requête de pagination dans l'interface de service

public PageResult pageQuery(Integer currentPage, Integer pageSize, String queryString);

3.2.3 Classe de mise en œuvre du Service

InSetmealServiceImpl Mise en œuvre de la méthode de requête pagée dans la classe de mise en œuvre du service ,Basé surMybatis L'assistant de pagination implémente la pagination

public PageResult pageQuery(Integer currentPage, Integer pageSize, String queryString) {
    
  PageHelper.startPage(currentPage,pageSize);
  Page<CheckItem> page = checkGroupDao.selectByCondition(queryString);
  return new PageResult(page.getTotal(),page.getResult());
}

3.2.4 DaoInterface

InSetmealDao Extension de la méthode de requête de pagination dans l'interface

public Page<Setmeal> selectByCondition(String queryString);

3.2.5 MapperFichier de cartographie

InSetmealDao.xmlAjout deSQLDéfinition

<!--Requête par Condition-->
<select id="selectByCondition" parameterType="string" resultType="com.itheima.pojo.Setmeal">
  select * from t_setmeal
  <if test="value != null and value.length > 0">
    where code = #{value} or name = #{value} or helpCode = #{value}
  </if>
</select>

4. Composante des tâches programméesQuartz

4.1 QuartzIntroduction

Quartz- Oui.Job scheduling(Répartition des tâches)Un projet Open source dans le domaine,QuartzPeut être utilisé seul ou avecspringUtilisation intégrée du cadre,Ce dernier est généralement utilisé dans le développement pratique.UtiliserQuartzUne ou plusieurs tâches programmées peuvent être développées,Chaque tâche programmée peut être exécutée individuellement,Par exemple, tous les1Une fois par heure、Le matin du premier jour de chaque mois10Exécution ponctuelle、L'après - midi du dernier jour de chaque mois5Cliquez sur exécuter une fois.

Site officiel:http://www.quartz-scheduler.org/

mavenCoordonnées:

<dependency>
  <groupId>org.quartz-scheduler</groupId>
  <artifactId>quartz</artifactId>
  <version>2.2.1</version>
</dependency>
<dependency>
  <groupId>org.quartz-scheduler</groupId>
  <artifactId>quartz-jobs</artifactId>
  <version>2.2.1</version>
</dependency>

4.2 QuartzCas d'introduction

Cette affaire est fondée surQuartzEtspringUtilisation consolidée.Étapes spécifiques:

(1)CréationmavenIngénieriequartzdemo,ImporterQuartzEtspringCoordonnées pertinentes,pom.xmlLes documents sont les suivants

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.itheima</groupId>
    <artifactId>quartdemo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.2.1</version>
        </dependency>
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz-jobs</artifactId>
            <version>2.2.1</version>
        </dependency>
    </dependencies>
</project>

(2)Personnaliser unJob

package com.itheima.jobs;
/** * PersonnalisationJob */
public class JobDemo {
    
    public void run(){
    
        System.out.println("job execute...");
    }
}

(3)OffreSpringProfilspring-jobs.xml,Configurer la personnalisationJob、Description de la Mission、Déclencheur、Usine de répartition, etc.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
	<!-- Enregistrer les personnalisationsJob -->
    <bean id="jobDemo" class="com.itheima.jobs.JobDemo"></bean>
	<!-- InscriptionJobDetail,La fonction est responsable de la désignation par l'appel de réflexionJob -->
    <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <!-- Injecter l'objet cible -->
        <property name="targetObject" ref="jobDemo"/>
        <!-- Méthode d’injection de la cible -->
        <property name="targetMethod" value="run"/>
    </bean>
    <!-- Enregistrer un déclencheur,Précisez quand la tâche sera déclenchée -->
    <bean id="myTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <!-- InjectionJobDetail -->
        <property name="jobDetail" ref="jobDetail"/>
        <!-- Spécifier le temps de déclenchement,Basé surCronExpression -->
        <property name="cronExpression">
            <value>0/10 * * * * ?</value>
        </property>
    </bean>
    <!-- Enregistrement d'une usine d'expédition unifiée,Programmer les tâches à travers cette usine de programmation -->
    <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <!-- Injecter plusieurs déclencheurs -->
        <property name="triggers">
            <list>
                <ref bean="myTrigger"/>
            </list>
        </property>
    </bean>
</beans>

(4)CompilationmainMéthodes d'essai

package com.itheima.jobs.com.itheima.app;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    
    public static void main(String[] args) {
    
        new ClassPathXmlApplicationContext("spring-jobs.xml");
    }
}

Exécuter ci - dessusmainMéthode console d'observation,Vous pouvez trouver que chaque10Une fois par seconde,Description tous les10Secondes personnaliséesJobAppelé une fois.

4.3 cronExpression

Dans l'exemple de démarrage ci - dessus, nous avons spécifié une expression:0/10 * * * * ?

Cette expression est appeléecronExpression,AdoptioncronLes expressions peuvent définir avec souplesse le temps d'exécution d'un programme qui répond aux exigences.Nous allons étudier cette sectioncronComment utiliser l'expression.Comme le montre la figure ci - dessous::

Veuillez ajouter une description de l'image

cronL'expression est divisée en sept champs,Utilisez des espaces pour séparer.Le dernier domaine(Année)Peut être vide.Chaque champ a sa propre valeur admissible et quelques caractères spéciaux qui composent.L'utilisation de ces caractères spéciaux rend les expressions que nous définissons plus flexibles.

Voici une introduction à ces caractères spéciaux:

Virgule(,):Spécifier une liste de valeurs,Par exemple, utilisez sur le champ mois1,4,5,7Représentation1Mois、4Mois、5Mois et7Mois

Barre transversale(-):Spécifiez une plage,Par exemple, dans le domaine temporel3-6Représentation3Point.6Point(C'est - à - dire:3Point、4Point、5Point、6Point)

Astérisque(*):Indique que ce champ contient toutes les valeurs valides.Par exemple,L'utilisation d'un astérisque sur le champ mois signifie que chaque mois est déclenché

Barre oblique(/):Indique une augmentation,Par exemple, en utilisant le champ secondes0/15Représente chaque15Secondes

Point d'interrogation(?):Ne peut être utilisé que sur les domaines du jour et de la semaine,Mais vous ne pouvez pas utiliser les deux champs.Indique qu'il n'est pas spécifié

Numéro de puits(#):Ne peut être utilisé que sur le domaine hebdomadaire,Utilisé pour spécifier le jour de la semaine du mois,Par exemple6#3,Ça veut dire le troisième vendredi d'un mois (6=Vendredi,3Ça veut dire la troisième semaine du mois)

L:Dernière valeur autorisée sur un champ.Ne peut être utilisé que sur les champs de jour et de semaine.Utilisé dans le domaine solaire,Indique le dernier jour du mois spécifié sur le champ mois.Lorsqu'il est utilisé sur un domaine hebdomadaire,Représente le dernier jour de la semaine,C'est samedi.

W:W Les caractères représentent les jours ouvrables (Du lundi au vendredi),Ne peut être utilisé que sur un champ de jour,Il est utilisé pour spécifier le jour ouvrable le plus proche du jour spécifié

4.4 cronExpression générateur en ligne

Il y a une introduction àcronExpression,Mais il est difficile d'écrire vos propres expressions,Nous pouvons utilisercronExpression générateur en ligne pour générer des expressions en fonction de nos besoins.

http://cron.qqe2.com/

Veuillez ajouter une description de l'image

5. Nettoyage régulier des images de déchets

Nous avons déjà terminé la gestion du Programme d'examen physique , Lors de l'ajout d'un nouveau paquet, les informations de base et les images du paquet sont soumises à l'arrière - plan deux fois . C'est - à - dire que l'utilisateur télécharge d'abord l'image sur Seven Bull Cloud Server , Soumettre ensuite les autres informations saisies dans la nouvelle fenêtre . Si l'utilisateur a simplement téléchargé l'image sans soumettre d'autres informations saisies , L'image devient une image pourrie , Parce que sa présence n'est pas enregistrée dans la base de données . Qu'est - ce qu'on va faire avec ces photos pourries ?

La solution consiste à nettoyer ces images de déchets à un moment donné par l'intermédiaire de la composante tâches programmées . Pour pouvoir distinguer les images qui sont pourries , Nous avons sauvegardé l'image dans un redisEnsemble, Après avoir inséré les données du paquet dans la base de données, nous avons sauvegardé le nom de l'image dans un autre redisEnsemble, .En calculant la différence entre ces deux ensembles, on obtient les noms de toutes les images de déchets .

Cette section est basée sur QuartzTâches programmées,Par calculredis La différence entre les deux collections trouve toutes les images de déchets , Pour nettoyer les images de déchets .

Procédure de fonctionnement:

(1)CréationmavenIngénieriehealth_jobs,Package aswar,ImporterQuartz Coordonnées isopertinentes

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>health_parent</artifactId>
        <groupId>com.itheima</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>health_jobs</artifactId>
    <packaging>war</packaging>
    <name>health_jobs Maven Webapp</name>
    <url>http://www.example.com</url>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>com.itheima</groupId>
            <artifactId>health_interface</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
        </dependency>
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz-jobs</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <configuration>
                    <!-- Spécifier le port -->
                    <port>83</port>
                    <!-- Chemin de demande -->
                    <path>/</path>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

(2)Configurationweb.xml

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <!-- ChargementspringConteneur -->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:applicationContext*.xml</param-value>
  </context-param>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
</web-app>

(3)Configurationlog4j.properties

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=c:\\mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### set log levels - for more verbose logging change 'info' to 'debug' ###

log4j.rootLogger=info, stdout

(4)ConfigurationapplicationContext-redis.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

	<!--Jedis Configuration du pool de connexion -->
	<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
		<property name="maxTotal">
			<value>200</value>
		</property>
		<property name="maxIdle">
			<value>50</value>
		</property>
		<property name="testOnBorrow" value="true"/>
		<property name="testOnReturn" value="true"/>
	</bean>
	<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
		<constructor-arg name="poolConfig" ref="jedisPoolConfig" />
		<constructor-arg name="host" value="127.0.0.1" />
		<constructor-arg name="port" value="6379" type="int" />
		<constructor-arg name="timeout" value="30000" type="int" />
	</bean>
</beans>

(5)ConfigurationapplicationContext-jobs.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
	<context:annotation-config></context:annotation-config>
	<bean id="clearImgJob" class="com.itheima.jobs.ClearImgJob"></bean>
	<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
		<!-- Injecter l'objet cible -->
		<property name="targetObject" ref="clearImgJob"/>
		<!-- Méthode d’injection de la cible -->
		<property name="targetMethod" value="clearImg"/>
	</bean>
	<!-- Enregistrer un déclencheur,Précisez quand la tâche sera déclenchée -->
	<bean id="myTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
		<!-- InjectionJobDetail -->
		<property name="jobDetail" ref="jobDetail"/>
		<!-- Spécifier le temps de déclenchement,Basé surCronExpression -->
		<property name="cronExpression">
			<value>0 0 2 * * ?</value>
		</property>
	</bean>
	<!-- Enregistrement d'une usine d'expédition unifiée,Programmer les tâches à travers cette usine de programmation -->
	<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<!-- Injecter plusieurs déclencheurs -->
		<property name="triggers">
			<list>
				<ref bean="myTrigger"/>
			</list>
		</property>
	</bean>
</beans>

(6)CréationClearImgJobClasse de tâches programmées

package com.itheima.jobs;

import com.itheima.constant.RedisConstant;
import com.itheima.utils.QiniuUtils;
import org.springframework.beans.factory.annotation.Autowired;
import redis.clients.jedis.JedisPool;
import java.util.Set;

/** * PersonnalisationJob, Réaliser un nettoyage régulier des images de déchets  */
public class ClearImgJob {
    
    @Autowired
    private JedisPool jedisPool;
    public void clearImg(){
    
        //SelonRedis Deux sauvegardées dans set Ensemble pour le calcul de la différence , Obtenir une collection de noms d'images de déchets 
        Set<String> set = 
            jedisPool.getResource().sdiff(RedisConstant.SETMEAL_PIC_RESOURCES, 
                                          RedisConstant.SETMEAL_PIC_DB_RESOURCES);
        if(set != null){
    
            for (String picName : set) {
    
                // Supprimer l'image sur Seven Bull Cloud Server 
                QiniuUtils.deleteFileFromQiniu(picName);
                //DeRedis Supprimer le nom de l'image dans la collection 
                jedisPool.getResource().
                    srem(RedisConstant.SETMEAL_PIC_RESOURCES,picName);
            }
        }
    }
}

Veuillez ajouter une description de l'image
Veuillez ajouter une description de l'image

原网站

版权声明
本文为[Gros. ۣۖ Tigre ۣۖ]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/174/202206230438165125.html