add view logic

This commit is contained in:
2024-08-04 17:08:28 +03:30
parent 0e30088405
commit f5dabbdcd8
9 changed files with 100 additions and 23 deletions

View File

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data.Entity;
using System.Linq; using System.Linq;
using System.Web; using System.Web;
using System.Web.Mvc; using System.Web.Mvc;
@ -14,7 +15,7 @@ namespace WebApplication1.Controllers
public ActionResult Index() public ActionResult Index()
{ {
ViewBag.newsCount = db.news.Count(); ViewBag.newsCount = db.news.Count();
ViewBag.views = ""; ViewBag.views = db.viewlogs.Where(v => DbFunctions.TruncateTime(v.viewdate) == DateTime.Today).Count();
setTitle(); setTitle();
return View(); return View();
} }

View File

@ -15,6 +15,15 @@ namespace WebApplication1.Controllers
public class newsController : Controller public class newsController : Controller
{ {
private newswebappEntities db = new newswebappEntities(); private newswebappEntities db = new newswebappEntities();
public static string GetUserIpAddress(HttpRequestBase request)
{
string ipAddress = request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (string.IsNullOrEmpty(ipAddress))
{
ipAddress = request.ServerVariables["REMOTE_ADDR"];
}
return ipAddress;
}
// GET: news // GET: news
public ActionResult Index() public ActionResult Index()
@ -58,21 +67,31 @@ namespace WebApplication1.Controllers
} }
var user = db.users.Find(news.userID); var user = db.users.Find(news.userID);
ViewBag.user = user; ViewBag.user = user;
news.views += 1;
db.SaveChanges();
/*
var key = Request.ServerVariables["REMOTE_ADDR"];
var now = DateTime.UtcNow;
if (now - View.LastVisited > _timeLimit) // Get the user's IP address
string userIpAddress = GetUserIpAddress(Request);
// Check if this IP address has already viewed this article
DateTime thresholdDate = DateTime.Now.AddHours(-24);
bool hasViewed = db.viewlogs.Any(v => v.newsid == id && v.ipadd == userIpAddress && v.viewdate >= thresholdDate);
if (!hasViewed)
{
// Increment the view count
news.views++;
db.SaveChanges();
// Log the view
db.viewlogs.Add(new viewlog
{ {
pageView.LastVisited = now; ipadd = userIpAddress,
_pageViews[key] = pageView; newsid = news.ID,
return true; // View counted viewdate = DateTime.Now
} });
return false; // View within time limit, not counted db.SaveChanges();
*/ }
return View(news); return View(news);
} }
// GET: news/Create // GET: news/Create

View File

@ -204,7 +204,9 @@ namespace WebApplication1.Controllers
var hashedBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(user.password)); var hashedBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(user.password));
user.password = BitConverter.ToString(hashedBytes).Replace("-", "").ToLower(); user.password = BitConverter.ToString(hashedBytes).Replace("-", "").ToLower();
} }
db.Entry(user).State = EntityState.Modified; var u= db.users.Find(user.ID);
u.password = user.password;
u.displayname = user.displayname;
db.SaveChanges(); db.SaveChanges();
return RedirectToAction("Index"); return RedirectToAction("Index");
} }

View File

@ -31,5 +31,6 @@ namespace WebApplication1.Models
public virtual DbSet<ticket> tickets { get; set; } public virtual DbSet<ticket> tickets { get; set; }
public virtual DbSet<user> users { get; set; } public virtual DbSet<user> users { get; set; }
public virtual DbSet<response> responses { get; set; } public virtual DbSet<response> responses { get; set; }
public virtual DbSet<viewlog> viewlogs { get; set; }
} }
} }

View File

@ -69,6 +69,15 @@
<Property Name="displayname" Type="nvarchar" MaxLength="50" /> <Property Name="displayname" Type="nvarchar" MaxLength="50" />
<Property Name="role" Type="int" Nullable="false" /> <Property Name="role" Type="int" Nullable="false" />
</EntityType> </EntityType>
<EntityType Name="viewlog">
<Key>
<PropertyRef Name="ID" />
</Key>
<Property Name="ID" Type="int" StoreGeneratedPattern="Identity" Nullable="false" />
<Property Name="ipadd" Type="nvarchar(max)" />
<Property Name="newsid" Type="int" />
<Property Name="viewdate" Type="datetime" />
</EntityType>
<EntityContainer Name="newswebappModelStoreContainer"> <EntityContainer Name="newswebappModelStoreContainer">
<EntitySet Name="category" EntityType="Self.category" Schema="dbo" store:Type="Tables" /> <EntitySet Name="category" EntityType="Self.category" Schema="dbo" store:Type="Tables" />
<EntitySet Name="news" EntityType="Self.news" Schema="dbo" store:Type="Tables" /> <EntitySet Name="news" EntityType="Self.news" Schema="dbo" store:Type="Tables" />
@ -76,6 +85,7 @@
<EntitySet Name="tag" EntityType="Self.tag" Schema="dbo" store:Type="Tables" /> <EntitySet Name="tag" EntityType="Self.tag" Schema="dbo" store:Type="Tables" />
<EntitySet Name="ticket" EntityType="Self.ticket" Schema="dbo" store:Type="Tables" /> <EntitySet Name="ticket" EntityType="Self.ticket" Schema="dbo" store:Type="Tables" />
<EntitySet Name="user" EntityType="Self.user" Schema="dbo" store:Type="Tables" /> <EntitySet Name="user" EntityType="Self.user" Schema="dbo" store:Type="Tables" />
<EntitySet Name="viewlog" EntityType="Self.viewlog" Schema="dbo" store:Type="Tables" />
</EntityContainer> </EntityContainer>
</Schema></edmx:StorageModels> </Schema></edmx:StorageModels>
<!-- CSDL content --> <!-- CSDL content -->
@ -88,6 +98,7 @@
<EntitySet Name="tickets" EntityType="newswebappModel.ticket" /> <EntitySet Name="tickets" EntityType="newswebappModel.ticket" />
<EntitySet Name="users" EntityType="newswebappModel.user" /> <EntitySet Name="users" EntityType="newswebappModel.user" />
<EntitySet Name="responses" EntityType="newswebappModel.response" /> <EntitySet Name="responses" EntityType="newswebappModel.response" />
<EntitySet Name="viewlogs" EntityType="newswebappModel.viewlog" />
</EntityContainer> </EntityContainer>
<EntityType Name="category"> <EntityType Name="category">
<Key> <Key>
@ -153,6 +164,15 @@
<Property Name="adminid" Type="Int32" /> <Property Name="adminid" Type="Int32" />
<Property Name="ticketid" Type="Int32" /> <Property Name="ticketid" Type="Int32" />
</EntityType> </EntityType>
<EntityType Name="viewlog">
<Key>
<PropertyRef Name="ID" />
</Key>
<Property Name="ID" Type="Int32" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
<Property Name="ipadd" Type="String" MaxLength="Max" FixedLength="false" Unicode="true" />
<Property Name="newsid" Type="Int32" />
<Property Name="viewdate" Type="DateTime" Precision="3" />
</EntityType>
</Schema> </Schema>
</edmx:ConceptualModels> </edmx:ConceptualModels>
<!-- C-S mapping content --> <!-- C-S mapping content -->
@ -229,6 +249,16 @@
</MappingFragment> </MappingFragment>
</EntityTypeMapping> </EntityTypeMapping>
</EntitySetMapping> </EntitySetMapping>
<EntitySetMapping Name="viewlogs">
<EntityTypeMapping TypeName="newswebappModel.viewlog">
<MappingFragment StoreEntitySet="viewlog">
<ScalarProperty Name="viewdate" ColumnName="viewdate" />
<ScalarProperty Name="newsid" ColumnName="newsid" />
<ScalarProperty Name="ipadd" ColumnName="ipadd" />
<ScalarProperty Name="ID" ColumnName="ID" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
</EntityContainerMapping> </EntityContainerMapping>
</Mapping> </Mapping>
</edmx:Mappings> </edmx:Mappings>

View File

@ -11,6 +11,7 @@
<EntityTypeShape EntityType="newswebappModel.ticket" Width="1.5" PointX="0.75" PointY="4.75" /> <EntityTypeShape EntityType="newswebappModel.ticket" Width="1.5" PointX="0.75" PointY="4.75" />
<EntityTypeShape EntityType="newswebappModel.user" Width="1.5" PointX="2.75" PointY="4.75" /> <EntityTypeShape EntityType="newswebappModel.user" Width="1.5" PointX="2.75" PointY="4.75" />
<EntityTypeShape EntityType="newswebappModel.response" Width="1.5" PointX="4.75" PointY="4.625" /> <EntityTypeShape EntityType="newswebappModel.response" Width="1.5" PointX="4.75" PointY="4.625" />
<EntityTypeShape EntityType="newswebappModel.viewlog" Width="1.5" PointX="3.25" PointY="7.25" />
</Diagram> </Diagram>
</edmx:Diagrams> </edmx:Diagrams>
</edmx:Designer> </edmx:Designer>

22
Models/viewlog.cs Normal file
View File

@ -0,0 +1,22 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated from a template.
//
// Manual changes to this file may cause unexpected behavior in your application.
// Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace WebApplication1.Models
{
using System;
using System.Collections.Generic;
public partial class viewlog
{
public int ID { get; set; }
public string ipadd { get; set; }
public Nullable<int> newsid { get; set; }
public Nullable<System.DateTime> viewdate { get; set; }
}
}

View File

@ -19,15 +19,13 @@
<a class="btn btn-outline-dark" href="/news"> Start Reading &raquo;</a> <a class="btn btn-outline-dark" href="/news"> Start Reading &raquo;</a>
</p> </p>
</section> </section>
<section class="col-md-4" aria-labelledby="librariesTitle"> <section class="col-md-4" aria-labelledby="viewcount">
<h2 id="librariesTitle">Get more libraries</h2> <h2 id="viewcount">View count</h2>
<p>NuGet is a free Visual Studio extension that makes it easy to add, remove, and update libraries and tools in Visual Studio projects.</p> <p>
<p><a class="btn btn-outline-dark" href="https://go.microsoft.com/fwlink/?LinkId=301866">Learn more &raquo;</a></p> @ViewBag.views
</section> </p>
<section class="col-md-4" aria-labelledby="hostingTitle"> <p>
<h2 id="hostingTitle">Web Hosting</h2> <a class="btn btn-outline-dark" href="/news"> Start Reading &raquo;</a></p>
<p>You can easily find a web hosting company that offers the right mix of features and price for your applications.</p>
<p><a class="btn btn-outline-dark" href="https://go.microsoft.com/fwlink/?LinkId=301867">Learn more &raquo;</a></p>
</section> </section>
</div> </div>
</main> </main>

View File

@ -189,6 +189,9 @@
<Compile Include="Models\user.cs"> <Compile Include="Models\user.cs">
<DependentUpon>Model1.tt</DependentUpon> <DependentUpon>Model1.tt</DependentUpon>
</Compile> </Compile>
<Compile Include="Models\viewlog.cs">
<DependentUpon>Model1.tt</DependentUpon>
</Compile>
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>