Utilizamos cookies propias y de terceros. Al navegar entendemos que aceptas el uso de cookies. +Info.
Política de cookies
Proyecto AjpdSoft

· Inicio
· Buscar
· Contactar
· Cookies
· Descargas
· Foros
· Historia
· Nosotros
· Temas
· Top 10
· Trucos
· Tutoriales
· Usuario
· Wiki

Nick


Contraseña


Nuevo usuario


English
Proyecto AjpdSoft: Foros

AjpdSoft :: Ver tema - crear una validacion
Foros de discusión Buscar Perfil FAQ Iniciar sesión
Information crear una validacion

Publicar nuevo tema Responder al tema
Foros de discusión » PHP, CMS, Joomla, WordPress, Alfresco, Apache, Tomcat, Drupal   
Ver tema anterior :: Ver tema siguiente
AutorMensaje
zozer
Usuario


Registrado: May 15, 2007
Mensajes: 2

Asunto: crear una validacion Responder citando

analizando diferentes paginas e llegado a la de ustedes que la encontre bastante buena.

mi pregunta es como puedo hacer un sistema de suscripcion como lo tienen ustedes en su pagina web, soy bastante nuevo en esto.

una sugerencia podrian abrir otro foro en bases de datos de file maker, hay tengo un poquito de conocimientos y aporto con algo.


muchas gracias.
MensajePublicado:
Mar May 15, 2007 1:15 pm
Top of PageVer perfil de usuario
alonsojpd
Administrador/Moderador


Registrado: Sep 16, 2003
Mensajes: 2687

Asunto: Re: crear una validacion Responder citando



Anuncios



zozer escribió:
analizando diferentes paginas e llegado a la de ustedes que la encontre bastante buena.

mi pregunta es como puedo hacer un sistema de suscripcion como lo tienen ustedes en su pagina web, soy bastante nuevo en esto.

una sugerencia podrian abrir otro foro en bases de datos de file maker, hay tengo un poquito de conocimientos y aporto con algo.


muchas gracias.


Tal vez te pueda servir esta validación de usuario que utilizábamos en nuestra web anterior:

1. Necesitarás un fichero llamado "login.html" con el siguiente contenido:

Código:

<HTML>
<head>
  <title>Inicio de sesión en AjpdSoft</title>
</head>
<body bgcolor="#FFFFFF">
  <form name="form1" method="post" action="marcoprincipal.php">

<p align=center style='text-align:left'>
<font color="#008080" size="2">
<span style="font-family: Arial; font-weight:700">Iniciar sesión</span></font>

<div class=MsoNormal align=center style='text-align:center; width:692; height:27'>

<hr size=2 width="100%" align=center>

</div>

  <table width="464" height="224">
  <tr>
  <td colspan="2" width="458" height="54" >
  <div align="left"><font face="Verdana" size="2"><b>Introduzca el código de usuario y la contraseña:</b></font></div>
  </td>
  </tr>
  <tr>
  <td width="126" height="22">
  <div align="right"><font face="Verdana" size="2">Código de usuario:</font></div>
  </td>
  <td width="328" height="22">
  <font face="Verdana">
  <input type="text" name="codigousuario" size="20"><font size="2"> </font>
  </font>
  </td>
  </tr>
  <tr>
  <td width="126" height="22">
  <div align="right"><font face="Verdana" size="2">Contraseña:</font></div>
  </td>
  <td width="328" height="22">
  <font face="Verdana">
  <input type="password" name="password" maxlength="15" size="20"><font size="2">
  </font></font>
  </td>
  </tr>
  <tr>
  <td colspan="2" width="458" height="26">
  <center>
  <font face="Verdana">
  <input type="submit" name="Submit" value="Entrar"><font size="2"> </font>
  </font>
  </center>
  </td>
  </tr>
  <tr>
  <td colspan="2" width="458" height="6">
  </td>
  </tr>
  <tr>
  <td colspan="2" width="458" height="32">
  <font face="Verdana" size="2">Si ha olvidado su código de usuario
  <a target="_self" href="../recordarcodigo.php">pulse aquí para recordarlo</a></font></td>
  </tr>
  </table>
  </form>
</body>
</HTML>





2. Un segundo fichero llamado "login.php" con el siguiente contenido:

Código:

<?
  include ("funciones.php");
  $tipoletranormal = "<font face=\"verdana\" style=\"font-size: 10pt\">";
  $encabezadoaviso = "<font size=\"2\" color=\"#008080\"><span style=\"font-family: Arial\"><b>Aviso</b></span></font><hr size=2 width=\"100%\" align=center>";
  $encabezadoerror = "<font size=\"2\" color=\"#008080\"><span style=\"font-family: Arial\"><b>Error</span></b></font><hr size=2 width=\"100%\" align=center>";
  //comprobando la contraseña
  if (!isset($password))
  {
    die ($encabezadoerror . $tipoletranormal .
        "No ha introducido la contraseña.
        XXXA href=\"javascript:history.back();\">Volver a intentarlo</A>");
  }
  if (empty($password))
  {
    die ($encabezadoerror . $tipoletranormal .
        "No ha introducido la contraseña.
        XXXA href=\"javascript:history.back();\">Volver a intentarlo</A>");
  }
  if ((strlen($password) < 5)  || (strlen($password) > 15))
  {
    die ($encabezadoerror . $tipoletranormal .
        "La longitud de la contraseña no es válida (entre 5 y 15 caracteres).
        XXXA href=\"javascript:history.back();\">Volver a intentarlo</A>");
  }
  conectarbd ("bdajpdsoft");
  //se selecciona el código de cliente y se extraen los datos
  $sqlConsulta = "
      SELECT contrasena, nombre, tipo, codigo, numerovisitas
      FROM usuarios
      WHERE codigo = " . $codigousuario;
  $sqlResultado = mysql_query($sqlConsulta);
  if ($row = mysql_fetch_array($sqlResultado))
  {
    if ($password != $row["contrasena"])
    {
      die ($encabezadoerror . $tipoletranormal .
          "La contraseña introducida no coincide con la del usuario.
          XXXA href=\"javascript:history.back();\">Volver a intentarlo</A>");
    }
  }
  else
  {
    die ($encabezadoerror . $tipoletranormal .
    "El código de usuario introducido no coincide con
    ninguno de los existentes.
    XXXA href=\"javascript:history.back();\">Volver a intentarlo</A>");
  }
  $tipousuario = $row["tipo"];

  //actualizar la hora, la fecha de la visita y el contador de visitas
  $nvisitas = $row["numerovisitas"];
  $nvisitas = $nvisitas + 1;
  $sql = "UPDATE usuarios SET " .
      "fechaultimavisita='" . fechaactual() . "'," .
      "horaultimavisita='" . horaactual() . "'," .
      "numerovisitas='" . $nvisitas . "'" .
      "WHERE codigo='" . $codigousuario . "'";
  $result = mysql_query($sql);
 
  //según el usuario mostrar página personal
  $encabezadopersonal = "<font size=\"2\" color=\"#008080\"><span style=\"font-family: Arial\">Iniciada sesión: "
      . $row["nombre"] . "</span></font><hr size=2 width=\"100%\" align=center>";
  echo $encabezadopersonal;
  echo $tipoletranormal . "<br>Seleccione la tarea a realizar:<br><br>";
  if ($tipousuario == "Administrador")  //si es el administrador
  {
    echo $tipoletranormal . "XXXA href=\"programaalta.php\">Añadir programa</A><br>";
    echo $tipoletranormal . "XXXA href=\"usuariover.php?codigousuario=" .
        $codigousuario . "\">Lista de usuarios</A><br>";
    echo $tipoletranormal . "XXXA href=\"usuariogestionar.php?codigousuario=" .
        $codigousuario . "\">Gestionar usuarios</A><br>";
    echo $tipoletranormal . "XXXA href=\"programaver.php?codigousuario=" .
        $codigousuario . "\">Lista de programas</A><br>";
  }
  echo $tipoletranormal . "XXXA href=\"incidenciagestionar.php?codigousuario=" .
      $codigousuario . "\">Gestión de Incidencias de programas</A><br>";
  echo $tipoletranormal . "<br>XXXA href=\"usuariodatos.php?" .
      "codigo=" . $codigousuario . "\">Cambiar datos del usuario</A><br>";
  echo $tipoletranormal . "<br>XXXA href=\"usuarioeliminar.php?" .
      "codigo=" . $codigousuario . "\">Eliminar usuario</A><br>";
  echo $tipoletranormal . "<br>XXXA href=\"ficherosubir.php?codigousuario=" .
      $codigousuario . "\">Subir un fichero (para resolver incidencias,
      para copia de seguridad, ...)</A><br>";

  //hipervínculo para adquirir programa
  echo $tipoletranormal . "<br>XXXA href=\"programacomprar.php?codigousuario=" .
      $codigousuario . "\">Comprar un programa</A><br>";

  if ($tipousuario == "Pago" | $tipousuario == "Pago-Lista" |
      $tipousuario == "Administrador")  //si es de pago
  {
    //pondremos un hipervinculo para configuracion.ini por cada programa
    //que tenga registrado
    if ($tipousuario == "Administrador")  //si es el administrador (todos)
    {
      $sqlConsulta = "
          SELECT codigoprograma, codigousuario, programas.nombre NombrePrograma
          FROM usuariosprograma, programas
          WHERE programas.codigo=usuariosprograma.codigoprograma";
    }
    else
    {
      $sqlConsulta = "
          SELECT codigoprograma, codigousuario, programas.nombre NombrePrograma
          FROM usuariosprograma, programas
          WHERE programas.codigo=usuariosprograma.codigoprograma AND
          codigousuario = " . $codigousuario;
    }
    $sqlResultado = mysql_query($sqlConsulta);
    while ($row = mysql_fetch_array($sqlResultado))
    {
      echo "<b><br> * Para realizar actualizaciones automáticas de " .
          $row["NombrePrograma"] . ", descargue estos dos ficheros en
          la misma carpeta y ejecute el fichero: \"actualizar.exe\":</b>";
      echo $tipoletranormal . "<br>XXXA href=\"httpdocs/usuactualiza/actualizar.exe\">
          Pulse aquí para descargar el fichero ejecutable</A><br>";
      echo $tipoletranormal . "XXXA href=\"httpdocs/usuactualiza/programa/" .
          $row["codigoprograma"] . "/configuracion.ini\">
          Pulse aquí para descargar el fichero de configuración</A><br>";
    }
  }

  //mostrar hipervínculo para lista de CD's
  if ($tipousuario == "Lista" | $tipousuario == "Pago-Lista"
      | $tipousuario == "Usuario-Lista" | $tipousuario == "Administrador")
  {
    echo $tipoletranormal . "<br>XXXA href=\"cddatosver.php?codigousuario=" .
        $codigousuario . "\">Lista de CD's de datos</A><br>";
  }
?>




Nota: no olvides reemplazar "XXXA" por "<A", tenemos que ponerlo así para poder visualizarlo en el foro, de lo contrario no aparecería.





3. El contenido del fichero "funciones.php" será (ten en cuenta que algunas de las funciones de este fichero no las necesitarás, las ponemos por si sirven de algo):

Código:

<?
  $encabezadoerror = "<font size=\"2\" color=\"#008080\"><span style=\"font-family:
      Arial\"><b>Error</span></b></font><hr size=2 width=\"100%\" align=center>";
  $encabezadoaviso = "<font size=\"2\" color=\"#008080\"><span style=\"font-family:
        Arial\"><b>Aviso</span></b></font><hr size=2 width=\"100%\"align=center>";

  //muestra encabezado y texto y continúa la ejecución
  function mostrarTexto ($textoTitulo, $textoMensaje)
  {
    echo "<link rel=\"stylesheet\" type=\"text/css\" href=\"/estilos/estilo.css\">";
//    $tipoletranormal = "<font face=\"verdana\" style=\"font-size: 10pt\">";
    $encabezado = "<font size=\"2\" color=\"#008080\"><span style=\"font-family:
        Arial\"><b>" . $textoTitulo . "</span></b></font><hr size=2 width=\"100%\"align=center>";
    echo $encabezado . $textoMensaje;
  }

  //muestra encabezado y texto y finaliza la ejecución
  function mostrarTextoError ($textoTitulo, $textoMensaje)
  {
    echo "<link rel=\"stylesheet\" type=\"text/css\" href=\"/estilos/estilo.css\">";
//    $tipoletranormal = "<font face=\"verdana\" style=\"font-size: 10pt\">";
    $encabezado = "<font size=\"2\" color=\"#008080\"><span style=\"font-family:
        Arial\"><b>" . $textoTitulo . "</span></b></font><hr size=2 width=\"100%\"align=center>";
    die ($encabezado . $textoMensaje);
  }

  //para conectarse a la base de datos
  function conectarbd($bd)
  {
//    $tipoletranormal = "<font face=\"verdana\" style=\"font-size: 10pt\">";
    echo "<link rel=\"stylesheet\" type=\"text/css\" href=\"/estilos/estilo.css\">";
    $encabezadoerror = "<font size=\"2\" color=\"#008080\"><span style=\"font-family:
        Arial\"><b>Error</span></b></font><hr size=2 width=\"100%\" align=center>";
    $link = @mysql_connect("localhost", "usuariobd","contraseñabd")
      or die ("<br>" . $encabezadoerror . $tipoletranormal .
      "No se pudo conectar a la base de datos, inténtelo en otro momento.");
    @mysql_select_db($bd, $link)
      or die ($encabezadoerror . $tipoletranormal .
      "No se pudo conectar a la base de datos, inténtelo en otro momento.");
  }
 
  //obtiene la hora actual (formato: H:M:S)
  function horaactual()
  {
    $num = 0;
    foreach (localtime() as $valor)
    {
      if($num == 0) //segundo
      {
        $segundo = $valor;
      }
      if($num == 1) //minuto
      {
        $minuto = $valor;
      }
      if($num == 2) //hora
      {
        $hora = $valor;
      }
      $num++;
    }
    $hora = $hora . ":" . $minuto . ":" . $segundo;
    return $hora;
  }

  //obtiene la fecha actual (formato: aaaa:mm:dd)
  function fechaactual()
  {
    $dia = date ("d");
    $mes = date ("m");
    $ano = date ("Y");
    $fecha = $ano . "-" . $mes . "-" . $dia;
    return $fecha;
  }
 
  //obtiene el tipo de usuario según el código
  function tipoUsuario($codigousuario)
  {
    conectarbd ("gestionintegral");
    $sqlConsulta = "SELECT tipo, codigo FROM usuarios WHERE codigo = " .
        $codigousuario;
    $sqlResultado = mysql_query($sqlConsulta);
    if ($row = mysql_fetch_array($sqlResultado))
    {
      return $row["tipo"];
    }
    else
    {
      return "0";
    }
  }

  //comprueba si existe un usuario
  function existeUsuario($codigousuario)
  {
    conectarbd ("bdajpdsoft");
    $sqlConsulta = "SELECT codigo, email FROM usuarios WHERE codigo = " .
        $codigousuario;
    $sqlResultado = mysql_query($sqlConsulta);
    if ($row = mysql_fetch_array($sqlResultado))
    {
      return $row["email"];
    }
    else
    {
      return "0";
    }
  }

  //se le pasa como parámetro un 0 ó 1 y devuelve Sí o No
  function SiNo ($valor)
  {
    if ($valor == 1)
    {
      return "Sí";
    }
    else
    {
      return "No";
    }
  }

  //muestra el detalle de una incidencia para imprimir
  function detalleincidencia($codigo, $tipo, $fecha, $programa, $estado, $usuario,
      $comentario, $fecharesolucion, $comentarioresolucion, $resuelta)
  {
    echo "<font size=\"2\" color=\"#008080\">
      <span style=\"font-family: Arial\">
      <b>DETALLE DE LA INCIDENCIA: " . $codigo .
                  "</span></font><hr size=2 width=\"100%\" align=center>";
            echo "<table border=\"2\" cellpadding=\"2\" style=\"border-collapse: collapse\" bordercolor=\"#808080\" width=\"100%\" id=\"AutoNumber1\" cellspacing=\"0\">
            <tr>
            <td width=\"21%\"><b><font face=\"Verdana\" size=\"2\">Código</font></b></td>
            <td width=\"79%\"><font face=\"Verdana\" size=\"2\">" .
            $codigo . "</font></td>" . "
            </tr>
            <tr>
            <td width=\"21%\"><b><font face=\"Verdana\" size=\"2\">Tipo</font></b></td>
            <td width=\"79%\"><font face=\"Verdana\" size=\"2\">" .
            $tipo . "</font></td>" . "
            </tr>
            <tr>
            <td width=\"21%\"><b><font face=\"Verdana\" size=\"2\">Fecha</font></b></td>
            <td width=\"79%\"><font face=\"Verdana\" size=\"2\">" .
            $fecha . "</font></td>" . "
            </tr>
            <tr>
            <td width=\"21%\"><b><font face=\"Verdana\" size=\"2\">Programa</font></b></td>
            <td width=\"79%\"><font face=\"Verdana\" size=\"2\">" .
            $programa . "</font></td>" . "
            </tr>
            <tr>
            <td width=\"21%\"><b><font face=\"Verdana\" size=\"2\">Estado</font></b></td>
            <td width=\"79%\"><font face=\"Verdana\" size=\"2\">" .
            $estado . "</font></td>" . "
            </tr>
            <tr>
            <td width=\"21%\"><b><font face=\"Verdana\" size=\"2\">Resuelta</font></b></td>
            <td width=\"79%\"><font face=\"Verdana\" size=\"2\">" .
            $resuelta . "</font></td>" . "
            </tr>
            <tr>
            <td width=\"100%\" colspan=\"2\"><b><font face=\"Verdana\" size=\"2\">Descripción</font></b></td>
            </tr>
            <tr>
            <td width=\"100%\" colspan=\"2\" align=\"left\"><font face=\"Verdana\" size=\"2\">" .
            $comentario . "
            </font></td>
            </tr>
            <tr>
            <td width=\"21%\"><b><font face=\"Verdana\" size=\"2\">Fecha resol.</font></b></td>
            <td width=\"79%\"><font face=\"Verdana\" size=\"2\">" .
            $fecharesolucion . "</font></td>" . "
            </tr>
            <tr>
            <td width=\"100%\" colspan=\"2\"><b><font face=\"Verdana\" size=\"2\">Comentario resolución</font></b></td>
            </tr>
            <tr>
            <td width=\"100%\" colspan=\"2\" align=\"left\"><font face=\"Verdana\" size=\"2\">" .
            $comentarioresolucion . "
            </font></td>
            </tr>
            </table>";
            echo "<form><input type=\"button\" name=\"Imprimir\" value=\"Imprimir\" onclick=\"window.print();\"></form>";
  }
 
 
  function subirFTP ($servidor, $usuario, $contrasena, $archivoservidor, $archivolocal)
  {
//    $tipoletranormal = "<font face=\"verdana\" style=\"font-size: 10pt\">";
    echo "<link rel=\"stylesheet\" type=\"text/css\" href=\"/estilos/estilo.css\">";
    $encabezadoerror = "<font size=\"2\" color=\"#008080\"><span style=\"font-family:
        Arial\"><b>Error</span></b></font><hr size=2 width=\"100%\" align=center>";
    $ftp = @ftp_connect($servidor)
        or die ($encabezadoerror .
        "No se ha podido conectar al servidor. Inténtelo en otro momento.
        XXXA href=\"javascript:history.back();\">Volver atrás");
    @ftp_login ($ftp, $usuario, $contrasena)
        or die ("La conexión ha sido rechazada, es posible que no tenga permisos suficientes
        para realizar esta operación. Consulte al administrador enviando un
        mensaje a: mailto:direccion@servidor.com");
    $a = @ftp_put ($ftp, $archivoservidor, $archivolocal, FTP_BINARY);
    if ($a == 1)
    {
      ftp_quit($ftp);
      return true;
    }
    else
    {
      ftp_quit($ftp);
      return false;
    }
  }
 
  function enviarEMail($destinatario, $titulo, $mensaje, $remiteEMail, $remiteNombre)
  {
    $cabecera = "From: " . $remitenteNombre . "<" . $remiteEMail . ">\n";
    if(mail($destinatario, $titulo, $mensaje, $cabecera))
    {
      return true;
    }
    else
    {
      return false;
    }
  }
 
 
  //iniciamos la sesión para LOGIN
  function iniciarSesionUsuario()
  {
    session_register('codigousuario');
    session_register('codigousuariopropio');
    session_register('tipousuario');
    session_register('nombreusuario');
    session_register('emailusuario');
    session_register('fechaultimoacceso');
    session_encode();
  }


  //iniciar sesión para las demás páginas
  function iniciarSesionPaginas()
  {
    @session_start();

    //$tipoletranormal = "<font face=\"verdana\" style=\"font-size: 10pt\">";
    $encabezadoaviso = "<font size=\"2\" color=\"#008080\"><span style=\"font-family: Arial\"><b>Aviso</b></span></font><hr size=2 width=\"100%\" align=center>";
    $encabezadoerror = "<font size=\"2\" color=\"#008080\"><span style=\"font-family: Arial\"><b>Error</span></b></font><hr size=2 width=\"100%\" align=center>";

    if (!(session_is_registered('codigousuario')))
    {
      @session_unset();
      @session_destroy();
      echo "<link rel=\"stylesheet\" type=\"text/css\" href=\"/estilos/estilo.css\">";
      die($encabezadoerror .
          "Debe inciar la sesión o registrarse (si no lo ha hecho).<br>
          XXXA target=\"_blank\" href=\"login.html\">Iniciar sesión</A><br>
          XXXA href=\"registro.html\">Registrar usuario</A>");
    }
  }
?>



Como antes, no olvides reemplazar "XXXA" por "<A".
MensajePublicado:
Lun Jun 18, 2007 6:53 am
Top of PageVer perfil de usuario
alonsojpd
Administrador/Moderador


Registrado: Sep 16, 2003
Mensajes: 2687

Asunto: Cosas que tendrás que cambiar Responder citando

Lógicamente, algunas de las comprobaciones que realizamos no te servirán o querrás cambiarlas por otras. Por ejemplo, en nuestro caso combrobamos en la tabla "usuarios" si el campo "tipo" tiene el valor "Administrador", si es así se le muestra un menú con más opciones que si no tiene este valor.

Esto lo hemos puesto porque seguramente os sirva de ejemplo para poder mostrar opciones diferentes si un usuario es administrador o no.

También hay otra opción que no es estrictamente necesaria, por la cual se guarda la fecha, la hora y un contador con el número de visitas que ha realizado cada usuario.
MensajePublicado:
Lun Jun 18, 2007 7:05 am
Top of PageVer perfil de usuario
varios
Magnífico usuario


Registrado: Oct 10, 2006
Mensajes: 2092

Asunto: Estructura de la tabla "usuarios" Responder citando

¿podrías colocar la estructura de la tabla "usuarios"?
MensajePublicado:
Lun Jun 18, 2007 7:09 am
Top of PageVer perfil de usuario
alonsojpd
Administrador/Moderador


Registrado: Sep 16, 2003
Mensajes: 2687

Asunto: Re: Estructura de la tabla "usuarios" Responder citando



Anuncios



varios escribió:
¿podrías colocar la estructura de la tabla "usuarios"?



Por supuesto, la estructura de la tabla "usuarios" en MySQL:

Código:

CREATE TABLE usuarios (
  codigo tinyint(4) NOT NULL auto_increment,
  codigousuario varchar(15) NOT NULL default '',
  dni varchar(15) default NULL,
  nombre varchar(150) NOT NULL default '',
  contrasena varchar(15) NOT NULL default '',
  direccion varchar(100) default NULL,
  localidad varchar(30) default NULL,
  codigopostal smallint(5) default NULL,
  provincia varchar(30) default NULL,
  pais varchar(30) default NULL,
  fechaalta date default NULL,
  fechaultimavisita date default NULL,
  email varchar(200) NOT NULL default '',
  envioinformacion smallint(6) default '0',
  tipo varchar(30) default 'Usuario',
  horaultimavisita time default NULL,
  numerovisitas double NOT NULL default '0',
  PRIMARY KEY  (codigo),
  UNIQUE KEY codigousuario (codigousuario),
  UNIQUE KEY email (email)
) ENGINE=MyISAM;
MensajePublicado:
Lun Jun 18, 2007 7:10 am
Top of PageVer perfil de usuario
Mostrar mensajes de anteriores:   
Todas las horas son GMT - 1 Horas
Publicar nuevo tema Responder al tema
Foros de discusión » PHP, CMS, Joomla, WordPress, Alfresco, Apache, Tomcat, Drupal  

Cambiar a:  
Key
  Puede publicar nuevos temas en este foro
No puede responder a temas en este foro
No puede editar sus mensajes en este foro
No puede borrar sus mensajes en este foro
No puede votar en encuestas en este foro
Este sitio web NO CONTIENE malware, todos los programas con código fuente aquí. Autor: Alonso Javier Pérez Díaz Google+ Síguenos en Google+