Proyecto de un servicio de mensajería instantánea mediante páginas asp.net (Guasa)


1.- Diseño de la base de datos

Se crea la base de datos Guasa con las siguientes tablas y relaciones
bd

2.- Hacer un sitio protegido. (solicitud de login y password)

Creamos un nuevo WebSite en c:\inetpub\wwwroot. (crea los ficheros Default.aspx, Default.aspx.cs y web.config).

Impediremos el acceso a las páginas de aquellos usuarios que no estén dados de alta en la tabla Usuarios de la base de datos Guasa.

Incluir en el ficheroweb.config la sección siguiente:

<authentication mode="Forms">
<forms loginUrl="Default.aspx" defaultUrl="Default2.aspx"/>
</authentication>
<authorization>
<deny users="?"/>
<!-- solo los usuarios autentificados -->
</authorization>

3.- Conexion con la base de datos

Para realizar una única conexion con la base de datos para utilizar en toda la aplicación, creamos una cadena de conexion (colocarla después de la cadena <appSettings/> y antes de <system.web>)

<connectionStrings>
<add name="conexionSQLServer" connectionString="Data Source=localhost\SQLEXPRESS;Persist Security Info=True;Password=chema;User ID=chema;Initial Catalog=Guasa" />
</connectionStrings>

4.- Página de identificación Default.aspx

La página presenta un formulario solicitando login y password. Mediante un botón consultamos si existe un usuario con esos datos en la tabla Usuarios

4.1.- Cómo acceder a la base de datos mediante un método como en la programación tradicional (lo visto en PHP)

using System.Data.SqlClient;

protected void Button1_Click(object sender, EventArgs e){
        // Este metodo imprime una tabla a pedal (Comando SELECT)
        SqlConnection conexion = new SqlConnection("Data Source=(local)\\SQLEXPRESS;Initial Catalog=usuario;Persist Security Info=true;
            User ID=chema;Password=chema");
        SqlCommand orden = new SqlCommand();
        orden.CommandType = CommandType.Text;
        orden.CommandText = "SELECT nombre,apellido,salario FROM templa";
        orden.Connection = conexion;
        conexion.Open();
        SqlDataReader todo = orden.ExecuteReader();
        while (todo.Read()) {
            String n = Convert.ToString(todo[0]);
            String a = Convert.ToString(todo[1]);
            double s = Convert.ToDouble(todo[2]);
            Response.Write(n + " " + a + " " + s + "<br>");
        }
        todo.Close();
        conexion.Close();
}


 protected void Button2_Click(object sender, EventArgs e){
        // Este metodo ejecuta un SQL distinto de SELECT (INSERT, DELETE, UPDATE)
        SqlConnection conexion = new SqlConnection("Data Source=(local)\\SQLEXPRESS;Initial Catalog=usuario;Persist Security Info=true;
            User ID=chema;Password=chema");
        SqlCommand orden = new SqlCommand();
        orden.CommandType = CommandType.Text;
        orden.CommandText = "UPDATE templa SET salario=salario*1.1";
        orden.Connection = conexion;
        conexion.Open();
        orden.ExecuteNonQuery();
        conexion.Close();
}

4.2.- Método del botón de la aplicación

using System.Data.SqlClient;

protected void btnLogin_Click(object sender, EventArgs e) {
if (comprobarUsuario(this.txtUsuario.Text, this.txtClave.Text)) {
// Usuario correcto: Mandamos a la pagina por defecto (Default2.aspx)
System.Web.Security.FormsAuthentication.RedirectFromLoginPage(txtUsuario.Text, false);
}
}

private bool comprobarUsuario(string nombre, string clave){
try {
// Recuperamos los parametros de la BD
String Parametros = System.Configuration.ConfigurationManager.ConnectionStrings["conexionSQLServer"].ConnectionString;
// Conectamos
SqlConnection conexion = new SqlConnection(Parametros);
conexion.Open();
// SQL. Ejecutamos la consulta y recogemos el resultado
string consulta = "SELECT count(*) FROM Usuarios WHERE usuario='" + nombre + "' AND contrasena='" + clave + "'";
SqlCommand cmd = new SqlCommand(consulta, conexion);
int t = Convert.ToInt32(cmd.ExecuteScalar());
// Cerramos la conexión
conexion.Close();
// Si hay un usuario con ese nombre y contrasena lo metemos en sesión devolvemos true. False si no hay ninguno
if (t == 1) {
Session["usuario"] = nombre;
return true;
}
else return false;
}
catch (Exception ex) {
// Por si hay errores, mostramos la pila de mensajes
Response.Write(ex.ToString());
return false;
}
}


5.- Página de visualización de mensajes (Default2.aspx)

Una vez correctamente identificados se nos redirige a Default2.aspx. En la página de identificación se ha metido el nombre de usuario en la sesión, por lo que es accesible.

Le damos a elegir los grupos a los que pertenece el usuario y mostramos todos los mensajes de ese usuario

5.1.- Crear un SqlDataSource que seleccione los grupos a los que pertenece el usuario

Crear un SqlDataSource con la siguiente sintaxis (con QueryBuilder se realiza de manera sencilla)

Con la interrogación le indicamos que ese parámetro lo debe obtener de algún sitio. Cuando terminemos la consulta nos pedirá que lo definamos:

Le decimos que el usuario debe ser lo que exista en la variable de sesión correspondiente. Ahora basta crear un DropDownList cuyo origen sea precisamente el SqlDataSource recien creado. Habilitar el AutoPostBack para que cada vez que cambie el valor se muestren los datos del grupo elegido

5.2.- Crear un SqlDataSource que muestre los mensajes del grupo elegido

Realizamos el mismo proceso anterior, pero para mostrar los mensajes del grupo elegido

Por último insertamos un GridView que muestre tabulados los datos de este SqlDataSource y se mostrarán los datos de la conversación elegida

5.3.- Añadir mensajes

Se añaden a la aplicación un boton y un cuadro de texto para enviar un mensaje al grupo que está seleccionado (ver el código de la aplicación)

protected void Button2_Click(object sender, EventArgs e) {
// Recoge el nombre completo del pollo en cuestion (el de la sesion)
// Recuperamos de web.config la cadena de conexion con la BD
String Parametros = System.Configuration.ConfigurationManager.ConnectionStrings["conexionSQLServer"].ConnectionString;
// Conectamos con la BD
System.Data.SqlClient.SqlConnection conexion = new System.Data.SqlClient.SqlConnection(Parametros);
conexion.Open();
// A) Sacamos el numero del grupo donde estamos insertando -Ver nombre_Completo() para comprender-
String consulta = "SELECT grupo FROM Grupos WHERE denominacion='" + DropDownList1.SelectedValue + "'";
System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(consulta, conexion);
int grupo = Convert.ToInt32(cmd.ExecuteScalar());
// B) Ejecutamos el INSERT y cerramos
String sentencia = "INSERT INTO Mensajes (usuario,grupo,texto,fecha) values(";
sentencia += "'" + Session["usuario"] + "'," + grupo + ",'" + TextBox1.Text + "','" + DateTime.Now + "');";
cmd = new System.Data.SqlClient.SqlCommand(sentencia, conexion);
cmd.ExecuteNonQuery();
conexion.Close();
// C) Actualizamos la tabla de mensajes y cerramos
GridView1.DataBind();
}


5.4.- Desconectar de la sesión

protected void Button1_Click(object sender, EventArgs e) {
System.Web.Security.FormsAuthentication.SignOut();
System.Web.Security.FormsAuthentication.RedirectToLoginPage();
}

5.5.- Refrescar los mensajes sin enviar ninguno

protected void Button3_Click(object sender, EventArgs e) {
GridView1.DataBind();
}


6.- Ficheros de la aplicación

Después de identificarse con uno de los usuarios existentes en la base de datos, sale una tabla con las conversaciones entre los miembros de los grupos. Sería necesario añadir la posibilidad de suscribirse a grupos, creación de nuevos grupos, refresco automático, …

pantallazo