Change Password

Please enter the password.
Please enter the password. Between 8-64 characters. Not identical to your email address. Contain at least 3 of: uppercase, lowercase, numbers, and special characters.
Please enter the password.
Submit

Change Nickname

Current Nickname:
Submit

Apply New License

License Detail

Please complete this required field.

  • Ultipa Graph V4

Standalone

Please complete this required field.

Please complete this required field.

The MAC address of the server you want to deploy.

Please complete this required field.

Please complete this required field.

Cancel
Apply
ID
Product
Status
Cores
Applied Validity Period(days)
Effective Date
Excpired Date
Mac Address
Apply Comment
Review Comment
Close
Profile
  • Full Name:
  • Phone:
  • Company:
  • Company Email:
  • Country:
  • Language:
Change Password
Apply

You have no license application record.

Apply
Certificate Issued at Valid until Serial No. File
Serial No. Valid until File

Not having one? Apply now! >>>

Product Created On ID Amount (USD) Invoice
Product Created On ID Amount (USD) Invoice

No Invoice

v4.5
Search
    Français
    v4.5

      Gestion de Schema et de Property

      Cette section présente des méthodes sur un objet Connection pour gérer les schemas et les properties des nodes et des edges dans un graphset.

      Chaque exemple se concentre uniquement sur l'utilisation de la méthode. Pour un exemple de code complet, veuillez vous référer à l'exemple complet.

      Schema

      ShowSchema()

      Récupère tous les schemas de nodes et d'edges du graphset actuel.

      Paramètres :

      • RequestConfig (Optional) : Paramètres de configuration pour la requête.

      Retours :

      • List<Schema> : La liste de tous les schemas dans le graphset actuel.

      // Récupère tous les schemas dans le graphset 'UltipaTeam' et imprime leurs noms et types
      
      RequestConfig requestConfig = new RequestConfig() { Graph = "UltipaTeam" };
      var schemaInfo = await ultipa.ShowSchema(requestConfig);
      
      foreach (var schema in schemaInfo)
      {
          Console.WriteLine(schema.DbType + ": " + schema.Name);
      }
      

      Dbnode: default
      Dbnode: member
      Dbnode: organization
      Dbedge: default
      Dbedge: reportsTo
      Dbedge: relatesTo
      

      GetSchema()

      Récupère un node ou un edge schema du graphset actuel.

      Paramètres :

      • string : Nom du schema.
      • DBType : Type du schema (node ou edge).
      • RequestConfig (Optional) : Paramètres de configuration pour la requête.

      Retours :

      • Schema : Le schema récupéré.

      // Récupère le node schema 'member' et le edge schema 'connectsTo' dans le graphset 'UltipaTeam', et imprime toutes leurs informations
      
      RequestConfig requestConfig = new RequestConfig() { Graph = "UltipaTeam" };
      
      var schema1 = await ultipa.GetSchema("member", DBType.Dbnode, requestConfig);
      Console.WriteLine("schema1: " + JsonConvert.SerializeObject(schema1));
      
      var schema2 = await ultipa.GetSchema("connectsTo", DBType.Dbedge, requestConfig);
      Console.WriteLine("schema2: " + JsonConvert.SerializeObject(schema2));
      

      schema1: {"Name":"member","Desc":"","DbType":0,"Total":0,"Properties":[{"Name":"title","Desc":"","Lte":false,"Read":true,"Write":true,"Schema":"member","Type":7,"SubTypes":[],"Extra":"{}","Encrypt":""},{"Name":"profile","Desc":"","Lte":false,"Read":true,"Write":true,"Schema":"member","Type":7,"SubTypes":[],"Extra":"{}","Encrypt":""},{"Name":"startDate","Desc":"","Lte":false,"Read":true,"Write":true,"Schema":"member","Type":8,"SubTypes":[],"Extra":"{}","Encrypt":""}]}
      schema2: null
      

      ShowNodeSchema()

      Récupère tous les schemas de nodes du graphset actuel.

      Paramètres :

      • RequestConfig (Optional) : Paramètres de configuration pour la requête.

      Retours :

      • List<Schema> : La liste de tous les schemas de nodes dans le graphset actuel.

      // Récupère tous les schemas de nodes dans le graphset 'UltipaTeam' et imprime leurs noms
      
      RequestConfig requestConfig = new RequestConfig() { Graph = "UltipaTeam" };
      
      var schemaList = await ultipa.ShowNodeSchema(requestConfig);
      foreach (var schema in schemaList)
      {
          Console.WriteLine(schema.Name);
      }
      

      default
      member
      organization
      

      ShowEdgeSchema()

      Récupère tous les schemas d'edges du graphset actuel.

      Paramètres :

      • RequestConfig (Optional) : Paramètres de configuration pour la requête.

      Retours :

      • List<Schema> : La liste de tous les schemas d'edges dans le graphset actuel.

      // Récupère tous les schemas d'edges dans le graphset 'UltipaTeam' et imprime leurs noms
      
      var schemaList = await ultipa.ShowEdgeSchema(requestConfig);
      foreach (var schema in schemaList)
      {
          Console.WriteLine(schema.Name);
      }
      

      default
      reportsTo
      relatesTo
      

      GetNodeSchema()

      Récupère un node schema du graphset actuel.

      Paramètres :

      • string : Nom du schema.
      • RequestConfig (Optional) : Paramètres de configuration pour la requête.

      Retours :

      • Schema : Le node schema récupéré.

      // Récupère le node schema 'member' dans le graphset 'UltipaTeam' et imprime ses properties
      
      RequestConfig requestConfig = new RequestConfig() { Graph = "UltipaTeam" };
      
      var schema = await ultipa.GetNodeSchema("member", requestConfig);
      
      foreach (var item in schema.Value.Properties)
      {
          Console.WriteLine(JsonConvert.SerializeObject(item));
      }
      

      {"Name":"title","Desc":"","Lte":false,"Read":true,"Write":true,"Schema":"member","Type":7,"SubTypes":[],"Extra":"{}","Encrypt":""}
      {"Name":"profile","Desc":"","Lte":false,"Read":true,"Write":true,"Schema":"member","Type":7,"SubTypes":[],"Extra":"{}","Encrypt":""}
      {"Name":"startDate","Desc":"","Lte":false,"Read":true,"Write":true,"Schema":"member","Type":8,"SubTypes":[],"Extra":"{}","Encrypt":""}
      

      GetEdgeSchema()

      Récupère un edge schema du graphset actuel.

      Paramètres :

      • string : Nom du schema.
      • RequestConfig (Optional) : Paramètres de configuration pour la requête.

      Retours :

      • Schema : Le edge schema récupéré.

      // Récupère le edge schema 'relatesTo' dans le graphset 'UltipaTeam' et imprime ses properties
      
      RequestConfig requestConfig = new RequestConfig() { Graph = "UltipaTeam" };
      
      var schema = await ultipa.GetEdgeSchema("relatesTo", requestConfig);
      
      foreach (var item in schema.Value.Properties)
      {
          Console.WriteLine(JsonConvert.SerializeObject(item));
      }
      

      {"Name":"type","Desc":"","Lte":false,"Read":true,"Write":true,"Schema":"relatesTo","Type":7,"SubTypes":[],"Extra":"{}","Encrypt":""}
      

      CreateSchema()

      Crée un nouveau schema dans le graphset actuel.

      Paramètres :

      • Schema : Le schema à créer ; le champ Name doit être défini, DbType (si non spécifié, Dbnode est utilisé par défaut), Desc (court pour description) et Properties sont optionnels.
      • bool (Optional) : Indique si les propriétés doivent être créées, la valeur par défaut est false.
      • RequestConfig (Optional) : Paramètres de configuration pour la requête.

      Retours :

      • UqlResponse : Résultat de la requête.

      RequestConfig requestConfig = new RequestConfig() { Graph = "UltipaTeam" };
      
      // Crée le node schema 'utility' (avec properties) dans le graphset 'UltipaTeam' et imprime toutes ses informations
      
      var new1 = await ultipa.CreateSchema(
          new Schema()
          {
              Name = "utility",
              DbType = DBType.Dbnode,
              Properties = new List<Property>()
              {
                  new Property() { Name = "name", Type = PropertyType.String },
                  new Property() { Name = "purchaseDate", Type = PropertyType.Datetime },
              },
          },
          true,
          requestConfig
      );
      Console.WriteLine(new1.Status.ErrorCode);
      Thread.Sleep(3000);
      var show1 = await ultipa.GetNodeSchema("utility", requestConfig);
      Console.WriteLine(JsonConvert.SerializeObject(show1.Value));
      
      // Crée le edge schema 'managedBy' (sans properties) dans le graphset 'UltipaTeam' et imprime toutes ses informations
      
      var new2 = await ultipa.CreateSchema(
          new Schema()
          {
              Name = "managedBy",
              Desc = "office utilities",
              DbType = DBType.Dbedge,
          },
          requestConfig
      );
      Console.WriteLine(new2.Status.ErrorCode);
      Thread.Sleep(3000);
      var show2 = await ultipa.GetEdgeSchema("managedBy", requestConfig);
      Console.WriteLine(JsonConvert.SerializeObject(show2.Value));
      

      Success
      {"Name":"utility","Desc":"","DbType":0,"Total":0,"Properties":[{"Name":"name","Desc":"","Lte":false,"Read":true,"Write":true,"Schema":"utility","Type":7,"SubTypes":[],"Extra":"{}","Encrypt":""},{"Name":"purchaseDate","Desc":"","Lte":false,"Read":true,"Write":true,"Schema":"utility","Type":8,"SubTypes":[],"Extra":"{}","Encrypt":""}]}
      Success
      {"Name":"managedBy","Desc":"office utilities","DbType":1,"Total":0,"Properties":[]}
      

      CreateSchemaIfNotExist()

      Crée un nouveau schema dans le graphset actuel, en gérant les cas où le nom du schema donné existe déjà en ignorant l'erreur.

      Paramètres :

      • Schema : Le schema à créer ; les champs Name et DBType doivent être définis, Desc et Properties sont optionnels.
      • bool (Optional) : Indique si les propriétés doivent être créées, la valeur par défaut est false.
      • RequestConfig (Optional) : Paramètres de configuration pour la requête.

      Retours :

      • UqlResponse : Résultat de la requête.
      • bool : Indique si le schema existe.

      RequestConfig requestConfig = new RequestConfig() { Graph = "UltipaTeam" };
      
      
      // Crée un schema dans le graphset 'UltipaTeam' et imprime si le schema existe déjà
      
      var new1 = await ultipa.CreateSchemaIfNotExist(
          new Schema() { Name = "utility", DbType = DBType.Dbnode },
          requestConfig
      );
      Console.WriteLine("Schema already exists: " + new1.Item2);
      Thread.Sleep(3000);
      
      // Crée le même schema à nouveau et imprime si le schema existe déjà
      
      var new2 = await ultipa.CreateSchemaIfNotExist(
          new Schema() { Name = "utility", DbType = DBType.Dbnode },
          requestConfig
      );
      Console.WriteLine("Schema already exists: " + new2.Item2);
      

      Schema already exists: False
      Schema already exists: True
      

      AlterSchema()

      Modifie le nom et la description d'un schema existant dans le graphset actuel par son nom.

      Paramètres :

      • Schema : Le schema existant à modifier ; les champs Name et DbType doivent être définis.
      • Schema : La nouvelle configuration pour le schema existant ; les champs Name et DbType doivent être définis.
      • RequestConfig (Optional) : Paramètres de configuration pour la requête.

      Retours :

      • UqlResponse : Résultat de la requête.

      // Renomme le node schema 'utility' en 'securityUtility' et supprime sa description dans le graphset 'UltipaTeam'
      
      RequestConfig requestConfig = new RequestConfig() { Graph = "UltipaTeam" };
      
      var alter = await ultipa.AlterSchema(
          new Schema() { Name = "utility", DbType = DBType.Dbnode },
          new Schema()
          {
              Name = "securityUtility",
              DbType = DBType.Dbnode,
              Desc = "yyyy",
          },
          requestConfig
      );
      Console.WriteLine(alter.Status.ErrorCode);
      

      Success
      

      DropSchema()

      Supprime un schema du graphset actuel par son nom.

      Paramètres :

      • Schema : Le schema existant à supprimer ; les champs Name et DbType doivent être définis.
      • RequestConfig (Optional) : Paramètres de configuration pour la requête.

      Retours :

      • UqlResponse : Résultat de la requête.

      // Supprime le node schema 'utility' dans le graphset 'UltipaTeam'
      
      RequestConfig requestConfig = new RequestConfig() { Graph = "UltipaTeam" };
      
      var res = await ultipa.DropSchema(
          new Schema() { Name = "utility", DbType = DBType.Dbnode },
          requestConfig
      );
      Console.WriteLine(res.Status.ErrorCode);
      

      Success
      

      Property

      ShowProperty()

      Récupère les properties personnalisées des nodes ou edges du graphset actuel.

      Paramètres :

      • DBType : Type de la propriété (node ou edge).
      • string (Optional) : Nom du schema.
      • RequestConfig (Optional) : Paramètres de configuration pour la requête.

      Retours :

      • List<Property> : La liste de toutes les properties récupérées dans le graphset actuel.

      // Récupère toutes les properties de node dans le graphset 'UltipaTeam' et imprime leurs noms et schemas associés
      
      RequestConfig requestConfig = new RequestConfig() { Graph = "UltipaTeam" };
      
      var res = await ultipa.ShowProperty(DBType.Dbnode, requestConfig);
      foreach (var item in res)
      {
          Console.WriteLine(
              $"{item.Name}({item.Type}) is associated with schema named {item.Schema}"
          );
      }
      

      name(String) is associated with schema named member
      title(String) is associated with schema named member
      profile(String) is associated with schema named member
      name(String) is associated with schema named organization
      logo(String) is associated with schema named organization
      

      ShowNodeProperty()

      Récupère les properties personnalisées des nodes du graphset actuel.

      Paramètres :

      • string (Optional) : Nom du schema.
      • RequestConfig (Optional) : Paramètres de configuration pour la requête.

      Retours :

      • List<Property> : La liste de toutes les properties récupérées dans le graphset actuel.

      // Récupère toutes les properties personnalisées du node schema 'member' dans le graphset 'UltipaTeam' et imprime le compte
      
      RequestConfig requestConfig = new RequestConfig() { Graph = "UltipaTeam" };
      
      var res = await ultipa.ShowNodeProperty("member", requestConfig);
      Console.WriteLine(res.Count);
      

      3
      

      ShowEdgeProperty()

      Récupère les properties personnalisées des edges du graphset actuel.

      Paramètres :

      • RequestConfig (Optional) : Paramètres de configuration pour la requête.

      Retours :

      • string (Optional) : Nom du schema.
      • List<Property> : La liste de toutes les properties récupérées dans le graphset actuel.

      // Récupère toutes les properties personnalisées du edge schema 'relatesTo' dans le graphset 'UltipaTeam' et imprime leurs noms
      
      RequestConfig requestConfig = new RequestConfig() { Graph = "UltipaTeam" };
      
      var res = await ultipa.ShowEdgeProperty("relatesTo", requestConfig);
      foreach (var item in res)
      {
          Console.WriteLine(item.Name);
      }
      

      type
      

      GetProperty()

      Récupère une propriété personnalisée des nodes ou edges du graphset actuel.

      Paramètres :

      • DBType : Type de la propriété (node ou edge).
      • string : Nom du schema.
      • string : Nom de la propriété.
      • RequestConfig (Optional) : Paramètres de configuration pour la requête.

      Retours :

      • Property : La propriété récupérée.

      // Récupère la propriété node @member.title dans le graphset 'UltipaTeam' et imprime toutes ses informations
      
      RequestConfig requestConfig = new RequestConfig() { Graph = "UltipaTeam" };
      
      var res = await ultipa.GetProperty(DBType.Dbnode, "member", "title", requestConfig);
      Console.WriteLine(JsonConvert.SerializeObject(res));
      

      {"Name":"title","Desc":"","Lte":false,"Read":true,"Write":true,"Schema":"member","Type":7,"SubTypes":[],"Extra":"{}","Encrypt":""}
      

      GetNodeProperty()

      Récupère une propriété personnalisée des nodes du graphset actuel.

      Paramètres :

      • string : Nom du schema.
      • string : Nom de la propriété.
      • RequestConfig (Optional) : Paramètres de configuration pour la requête.

      Retours :

      • Property : La propriété récupérée.

      // Récupère la propriété node @member.title dans le graphset 'UltipaTeam' et imprime toutes ses informations
      
      RequestConfig requestConfig = new RequestConfig() { Graph = "UltipaTeam" };
      
      var res = await ultipa.GetNodeProperty("member", "title", requestConfig);
      Console.WriteLine(JsonConvert.SerializeObject(res));
      

      {"Name":"title","Desc":"","Lte":false,"Read":true,"Write":true,"Schema":"member","Type":7,"SubTypes":[],"Extra":"{}","Encrypt":""}
      

      GetEdgeProperty()

      Récupère une propriété personnalisée des edges du graphset actuel.

      Paramètres :

      • string : Nom du schema.
      • string : Nom de la propriété.
      • RequestConfig (Optional) : Paramètres de configuration pour la requête.

      Retours :

      • Property : La propriété récupérée.

      // Récupère la propriété edge @relatesTo.type dans le graphset 'UltipaTeam' et imprime toutes ses informations
      
      RequestConfig requestConfig = new RequestConfig() { Graph = "UltipaTeam" };
      
      var res = await ultipa.GetEdgeProperty("relatesTo", "type", requestConfig);
      Console.WriteLine(JsonConvert.SerializeObject(res));
      

      {"Name":"type","Desc":"","Lte":false,"Read":true,"Write":true,"Schema":"relatesTo","Type":7,"SubTypes":[],"Extra":"{}","Encrypt":""}
      

      CreateProperty()

      Crée une nouvelle propriété pour un node ou un edge schema dans le graphset actuel.

      Paramètres :

      • DBType : Type de la propriété (node ou edge).
      • Property : La propriété à créer ; les champs Schema, Name et Type doivent être définis ; écrire * dans Schema pour spécifier tous les schemas.
      • RequestConfig (Optional) : Paramètres de configuration pour la requête.

      Retours :

      • UqlResponse : Résultat de la requête.

      // Crée deux propriétés pour le node schema 'member' dans le graphset 'UltipaTeam' et imprime les codes d'erreur
      
      RequestConfig requestConfig = new RequestConfig() { Graph = "UltipaTeam" };
      
      var res1 = await ultipa.CreateProperty(
          DBType.Dbnode,
          new Property()
          {
              Name = "startDate",
              Schema = "member",
              Type = PropertyType.Datetime,
          },
          requestConfig
      );
      Console.WriteLine(res1.Status.ErrorCode);
      
      var res2 = await ultipa.CreateProperty(
          DBType.Dbnode,
          new Property()
          {
              Name = "age",
              Schema = "member",
              Type = PropertyType.Int32,
          },
          requestConfig
      );
      Console.WriteLine(res2.Status.ErrorCode);
      

      Success
      Success
      

      CreatePropertyIfNotExist()

      Crée une nouvelle propriété pour un node ou un edge schema dans le graphset actuel, en gérant les cas où le nom de la propriété donné existe déjà en ignorant l'erreur.

      Paramètres :

      • DBType : Type de la propriété (node ou edge).
      • Property : La propriété à créer ; les champs Name et Type doivent être définis.
      • RequestConfig (Optional) : Paramètres de configuration pour la requête. Si nil est fourni, la fonction utilisera les paramètres de configuration par défaut.

      Retours :

      • UqlResponse : Résultat de la requête.
      • bool : Indique si la propriété existe.

      RequestConfig requestConfig = new RequestConfig() { Graph = "UltipaTeam" };
      
      // Crée une propriété pour le node schema 'member' dans le graphset 'UltipaTeam' et imprime si le schema existe déjà
      
      var res1 = await ultipa.CreatePropertyIfNotExist(
          DBType.Dbnode,
          new Property()
          {
              Name = "startDate",
              Schema = "member",
              Type = PropertyType.Datetime,
          },
          requestConfig
      );
      Console.WriteLine("Property already exists: " + res1.Item2);
      
      // Crée la même propriété à nouveau dans le graphset 'UltipaTeam' et imprime si le schema existe déjà
      
      var res2 = await ultipa.CreatePropertyIfNotExist(
          DBType.Dbnode,
          new Property()
          {
              Name = "startDate",
              Schema = "member",
              Type = PropertyType.Datetime,
          },
          requestConfig
      );
      Console.WriteLine("Property already exists: " + res2.Item2);
      

      Property already exists: False
      Property already exists: True
      

      AlterProperty()

      Modifie le nom et la description d'une propriété personnalisée existante dans le graphset actuel par son nom.

      Paramètres :

      • DBType : Type de la propriété (node ou edge).
      • Property : La propriété existante à modifier ; les champs Name et Schema (écrire * pour spécifier tous les schemas) doivent être définis.
      • Property : La nouvelle configuration pour la propriété existante ; l'un ou les deux champs Name et Desc doivent être définis.
      • RequestConfig (Optional) : Paramètres de configuration pour la requête.

      Retours :

      • UqlResponse : Résultat de la requête.

      RequestConfig requestConfig = new RequestConfig() { Graph = "UltipaTeam" };
      
      // Renomme les propriétés 'name' associées à tous les node schemas à `Name` dans le graphset 'UltipaTeam'
      
      var res = await ultipa.AlterProperty(
          DBType.Dbnode,
          new Property() { Name = "name", Schema = "*" },
          new Property() { Name = "Name", Schema = "*" },
          requestConfig
      );
      Console.WriteLine(res.Status.ErrorCode);
      

      Success
      

      DropProperty()

      Supprime une propriété personnalisée du graphset actuel par son nom et le schema associé.

      Paramètres :

      • DBType : Type de la propriété (node ou edge).
      • string : Nom du schema.
      • string : Nom de la propriété.
      • RequestConfig (Optional) : Paramètres de configuration pour la requête.

      Retours :

      • UqlResponse : Résultat de la requête.

      RequestConfig requestConfig = new RequestConfig() { Graph = "UltipaTeam" };
      
      // Supprime les propriétés 'startDate' associées à tous les node schemas dans le graphset 'UltipaTeam' et imprime le code d'erreur
      
      var res1 = await ultipa.DropProperty(DBType.Dbnode, "*", "startDate", requestConfig);
      Console.WriteLine(res1.Status.ErrorCode);
      
      // Supprime la propriété node @member.name dans le graphset 'UltipaTeam' et imprime le code d'erreur
      
      var res2 = await ultipa.DropProperty(DBType.Dbnode, "member", "name", requestConfig);
      Console.WriteLine(res2.Status.ErrorCode);
      

      Success
      Success
      

      Exemple Complet

      using System.Security.Cryptography.X509Certificates;
      using System.Threading;
      using System.Xml.Linq;
      using Microsoft.Extensions.Logging;
      using Newtonsoft.Json;
      using UltipaService;
      using UltipaSharp;
      using UltipaSharp.api;
      using UltipaSharp.configuration;
      using UltipaSharp.connection;
      using UltipaSharp.exceptions;
      using UltipaSharp.structs;
      using UltipaSharp.utils;
      using Logger = UltipaSharp.utils.Logger;
      using Property = UltipaSharp.structs.Property;
      using Schema = UltipaSharp.structs.Schema;
      
      class Program
      {
          static async Task Main(string[] args)
          {
              // Connection configurations
              //URI example: Hosts=new[]{"mqj4zouys.us-east-1.cloud.ultipa.com:60010"}
              var myconfig = new UltipaConfig()
              {
                  Hosts = new[] { "192.168.1.85:60061", "192.168.1.86:60061", "192.168.1.87:60061" },
                  Username = "***",
                  Password = "***",
              };
      
              // Etablit la connexion à la base de données
              var ultipa = new Ultipa(myconfig);
              var isSuccess = ultipa.Test();
              Console.WriteLine(isSuccess);
             
              // Configurations de requête
              RequestConfig requestConfig = new RequestConfig() { UseMaster = true };
      
              // Crée le node schema 'utility' (avec properties) dans le graphset 'UltipaTeam' et imprime le code d'erreur
              var res = await ultipa.CreateSchema(
                  new Schema()
                  {
                      Name = "utility",
                      DbType = DBType.Dbnode,
                      Properties = new List<Property>()
                      {
                          new Property() { Name = "name", Type = PropertyType.String },
                          new Property() { Name = "purchaseDate", Type = PropertyType.Datetime },
                      },
                      Desc = "Office utilities",
                  },
                  true,
                  requestConfig
              );
              Console.WriteLine("Node schema creation : " + res.Status.ErrorCode);
              Console.WriteLine(
                  JsonConvert.SerializeObject(
                      (await ultipa.GetNodeSchema("utility", requestConfig)).Value
                  )
              );
      
          }
      }
      
      Please complete the following information to download this book
      *
      公司名称不能为空
      *
      公司邮箱必须填写
      *
      你的名字必须填写
      *
      你的电话必须填写