跳到主要内容

github/tai

公开

Tai · Windows 软件与网站使用时长统计。上游 Planshit/Tai 的源码镜像,非灵栈原创;MIT 许可。来源:https://github.com/Planshit/Tai 。本次为手动同步,暂不提供安装包。

提交记录
修改Core/Core.csproj+37 −1看文件
@@ -129,6 +129,7 @@
129129 <Private>True</Private>
130130 <Private>True</Private>
131131 </Reference>
132新增: <Reference Include="System.Web" />
132133 <Reference Include="System.Windows.Forms" />
133134 <Reference Include="System.Xml.Linq" />
134135 <Reference Include="System.Data.DataSetExtensions" />
@@ -140,9 +141,15 @@
140141 </ItemGroup>
141142 <ItemGroup>
142143 <Compile Include="AppState.cs" />
144新增: <Compile Include="Enums\BrowserType.cs" />
143145 <Compile Include="Enums\SleepStatus.cs" />
146新增: <Compile Include="Enums\WebPageInfoType.cs" />
144147 <Compile Include="Event\EventHandler.cs" />
148新增: <Compile Include="Event\BrowserObserverEventHandler.cs" />
145149 <Compile Include="Event\ObserverEventHandler.cs" />
150新增: <Compile Include="Librarys\Browser\Favicon\ChromeFaviconManager.cs" />
151新增: <Compile Include="Librarys\Browser\Favicon\IFaviconManager.cs" />
152新增: <Compile Include="Librarys\Browser\UrlHelper.cs" />
146153 <Compile Include="Librarys\ProcessHelper.cs" />
147154 <Compile Include="Librarys\RegexHelper.cs" />
148155 <Compile Include="Librarys\Shortcut.cs" />
@@ -154,39 +161,68 @@
154161 <Compile Include="Librarys\Time.cs" />
155162 <Compile Include="Librarys\Win32API.cs" />
156163 <Compile Include="Models\AppModel.cs" />
164新增: <Compile Include="Models\AppObserver\AppObserverEventArgs.cs" />
157165 <Compile Include="Models\CategoryModel.cs" />
158166 <Compile Include="Models\Config\ConfigAttribute.cs" />
159167 <Compile Include="Models\Config\ConfigModel.cs" />
160168 <Compile Include="Models\Config\BehaviorModel.cs" />
161169 <Compile Include="Models\Config\GeneralModel.cs" />
162170 <Compile Include="Models\Config\Link\LinkModel.cs" />
171新增: <Compile Include="Models\Data\CommonDataModel.cs" />
163172 <Compile Include="Models\Data\HoursDataModel.cs" />
173新增: <Compile Include="Models\Db\WebBrowseLogModel.cs" />
174新增: <Compile Include="Models\Db\WebSiteCategoryModel.cs" />
175新增: <Compile Include="Models\Db\WebSiteModel.cs" />
176新增: <Compile Include="Models\Db\WebUrlModel.cs" />
164177 <Compile Include="Models\HoursLogModel.cs" />
165178 <Compile Include="Models\DailyLogModel.cs" />
179新增: <Compile Include="Models\WebPage\Site.cs" />
166180 <Compile Include="Properties\AssemblyInfo.cs" />
167181 <Compile Include="Servicers\Instances\AppConfig.cs" />
168182 <Compile Include="Servicers\Instances\AppData.cs" />
183新增: <Compile Include="Servicers\Instances\BrowserObserver.cs" />
169184 <Compile Include="Servicers\Instances\Categorys.cs" />
185新增: <Compile Include="Servicers\Instances\MSEdgeBrowserWatch.cs" />
186新增: <Compile Include="Servicers\Instances\ChromeBrowserWatch.cs" />
170187 <Compile Include="Servicers\Instances\Data.cs" />
171188 <Compile Include="Librarys\Logger.cs" />
189新增: <Compile Include="Servicers\Instances\Database.cs" />
172190 <Compile Include="Servicers\Instances\DateTimeObserver.cs" />
173191 <Compile Include="Servicers\Instances\Main.cs" />
174192 <Compile Include="Servicers\Instances\AppObserver.cs" />
193新增: <Compile Include="Librarys\SiteCache.cs" />
175194 <Compile Include="Servicers\Instances\Sleepdiscover.cs" />
195新增: <Compile Include="Servicers\Instances\WebData.cs" />
196新增: <Compile Include="Servicers\Instances\WebFilter.cs" />
176197 <Compile Include="Servicers\Interfaces\IAppConfig.cs" />
198新增: <Compile Include="Servicers\Interfaces\IBrowserWatcher.cs" />
199新增: <Compile Include="Servicers\Interfaces\IBrowserObserver.cs" />
177200 <Compile Include="Servicers\Interfaces\ICategorys.cs" />
178201 <Compile Include="Servicers\Interfaces\IAppData.cs" />
179202 <Compile Include="Servicers\Interfaces\IData.cs" />
203新增: <Compile Include="Servicers\Interfaces\IDatabase.cs" />
180204 <Compile Include="Servicers\Interfaces\IDateTimeObserver.cs" />
181205 <Compile Include="Servicers\Interfaces\IMain.cs" />
182206 <Compile Include="Servicers\Interfaces\IAppObserver.cs" />
183207 <Compile Include="Servicers\Interfaces\ISleepdiscover.cs" />
208新增: <Compile Include="Servicers\Interfaces\IWebData.cs" />
209新增: <Compile Include="Servicers\Interfaces\IWebFilter.cs" />
184210 </ItemGroup>
185211 <ItemGroup>
186212 <None Include="App.config" />
187213 <None Include="packages.config" />
188214 </ItemGroup>
189删除: <ItemGroup />
215新增: <ItemGroup>
216新增: <COMReference Include="UIAutomationClient">
217新增: <Guid>{944DE083-8FB8-45CF-BCB7-C477ACB2F897}</Guid>
218新增: <VersionMajor>1</VersionMajor>
219新增: <VersionMinor>0</VersionMinor>
220新增: <Lcid>0</Lcid>
221新增: <WrapperTool>tlbimp</WrapperTool>
222新增: <Isolated>False</Isolated>
223新增: <EmbedInteropTypes>True</EmbedInteropTypes>
224新增: </COMReference>
225新增: </ItemGroup>
190226 <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
191227 <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
192228 <PropertyGroup>
新增Core/Enums/BrowserType.cs+27 −0看文件
@@ -0,0 +1,27 @@
1新增:using System;
2新增:using System.Collections.Generic;
3新增:using System.Linq;
4新增:using System.Text;
5新增:using System.Threading.Tasks;
6新增:
7新增:namespace Core.Enums
8新增:{
9新增: /// <summary>
10新增: /// 浏览器类型
11新增: /// </summary>
12新增: public enum BrowserType
13新增: {
14新增: /// <summary>
15新增: /// 无
16新增: /// </summary>
17新增: None,
18新增: /// <summary>
19新增: /// 谷歌浏览器
20新增: /// </summary>
21新增: Chrome,
22新增: /// <summary>
23新增: /// Microsoft Edge
24新增: /// </summary>
25新增: MSEdge
26新增: }
27新增:}
新增Core/Enums/WebPageInfoType.cs+23 −0看文件
@@ -0,0 +1,23 @@
1新增:using System;
2新增:using System.Collections.Generic;
3新增:using System.Linq;
4新增:using System.Text;
5新增:using System.Threading.Tasks;
6新增:
7新增:namespace Core.Enums
8新增:{
9新增: /// <summary>
10新增: /// 网页信息类型
11新增: /// </summary>
12新增: public enum WebPageInfoType
13新增: {
14新增: /// <summary>
15新增: /// 标题
16新增: /// </summary>
17新增: Title,
18新增: /// <summary>
19新增: /// 链接
20新增: /// </summary>
21新增: URL
22新增: }
23新增:}
新增Core/Event/BrowserObserverEventHandler.cs+12 −0看文件
@@ -0,0 +1,12 @@
1新增:using Core.Enums;
2新增:using Core.Models.WebPage;
3新增:using System;
4新增:using System.Collections.Generic;
5新增:using System.Linq;
6新增:using System.Text;
7新增:using System.Threading.Tasks;
8新增:
9新增:namespace Core.Event
10新增:{
11新增: public delegate void BrowserObserverEventHandler(BrowserType browserType, Site site);
12新增:}
新增Core/Librarys/Browser/Favicon/ChromeFaviconManager.cs+118 −0看文件
@@ -0,0 +1,118 @@
1新增:using Core.Enums;
2新增:using System;
3新增:using System.Collections.Generic;
4新增:using System.Data.SQLite;
5新增:using System.Diagnostics;
6新增:using System.IO;
7新增:using System.Linq;
8新增:using System.Net;
9新增:using System.Security.Cryptography;
10新增:using System.Text;
11新增:using System.Threading;
12新增:using System.Threading.Tasks;
13新增:
14新增:namespace Core.Librarys.Browser.Favicon
15新增:{
16新增: public class ChromeFaviconManager : IFaviconManager
17新增: {
18新增: private readonly string _chromeFaviconsPath;
19新增: private readonly string _faviconsTempPath;
20新增: private readonly string _taiFaviconsPath;
21新增: public ChromeFaviconManager(BrowserType browserType = BrowserType.Chrome)
22新增: {
23新增: var localAppDataDir = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
24新增: _chromeFaviconsPath =
25新增: browserType == BrowserType.Chrome
26新增: ? Path.Combine(localAppDataDir, "Google", "Chrome", "User Data", "Default", "Favicons")
27新增: : Path.Combine(localAppDataDir, "Microsoft", "Edge", "User Data", "Default", "Favicons");
28新增: _faviconsTempPath = $"{_chromeFaviconsPath}_tai.temp";
29新增: _taiFaviconsPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "WebFavicons");
30新增: if (!File.Exists(_chromeFaviconsPath))
31新增: {
32新增: throw new FileNotFoundException("favicons文件路径没有找到");
33新增: }
34新增: if (!Directory.Exists(_taiFaviconsPath))
35新增: {
36新增: Directory.CreateDirectory(_taiFaviconsPath);
37新增: }
38新增: Debug.WriteLine(_chromeFaviconsPath);
39新增: }
40新增: public async Task<object> GetIconDataAsync(string url)
41新增: {
42新增: if (string.IsNullOrEmpty(url)) { throw new ArgumentNullException("url"); }
43新增:
44新增: url = UrlHelper.ChromeURLEncode(url);
45新增: var result = await Task.Run(() =>
46新增: {
47新增: byte[] icon = { };
48新增: try
49新增: {
50新增: File.Copy(_chromeFaviconsPath, _faviconsTempPath, true);
51新增:
52新增: using (var con = new SQLiteConnection($"Data Source={_faviconsTempPath}"))
53新增: {
54新增: con.Open();
55新增: string iconId = string.Empty;
56新增: using (var cmd = new SQLiteCommand($"select * from icon_mapping where page_url like'{url}%' LIMIT 1", con))
57新增: {
58新增: using (SQLiteDataReader dr = cmd.ExecuteReader())
59新增: {
60新增: if (dr.Read())
61新增: {
62新增: iconId = dr["icon_id"].ToString();
63新增: }
64新增: }
65新增: cmd.CommandText = "select * from ";
66新增: }
67新增: if (iconId != string.Empty)
68新增: {
69新增: using (var cmd = new SQLiteCommand($"select * from favicon_bitmaps where icon_id={iconId} order by width desc LIMIT 1", con))
70新增: {
71新增: using (SQLiteDataReader dr = cmd.ExecuteReader())
72新增: {
73新增: if (dr.Read())
74新增: {
75新增: icon = (System.Byte[])dr["image_data"];
76新增: }
77新增: }
78新增: }
79新增: }
80新增: }
81新增:
82新增: File.Delete(_faviconsTempPath);
83新增: }
84新增: catch (Exception ex)
85新增: {
86新增: Logger.Error(ex.ToString());
87新增: }
88新增: return icon;
89新增: });
90新增:
91新增: return result.Length == 0 ? null : result;
92新增: }
93新增:
94新增: public async Task<string> SaveToLocalIconAsync(object data)
95新增: {
96新增: if (data == null) { throw new ArgumentNullException("data"); }
97新增: return await Task.Run(() =>
98新增: {
99新增: var icon = data as byte[];
100新增: string iconPath = string.Empty;
101新增: using (var md5 = MD5.Create())
102新增: {
103新增: var hash = md5.ComputeHash(icon);
104新增: var md5Str = BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant();
105新增:
106新增: iconPath = Path.Combine(_taiFaviconsPath, $"{md5Str}.png");
107新增: if (!File.Exists(iconPath))
108新增: {
109新增: File.WriteAllBytes(iconPath, icon);
110新增: }
111新增: iconPath = Path.Combine("WebFavicons", $"{md5Str}.png");
112新增: }
113新增: return iconPath;
114新增: });
115新增:
116新增: }
117新增: }
118新增:}
新增Core/Librarys/Browser/Favicon/IFaviconManager.cs+24 −0看文件
@@ -0,0 +1,24 @@
1新增:using System;
2新增:using System.Collections.Generic;
3新增:using System.Linq;
4新增:using System.Text;
5新增:using System.Threading.Tasks;
6新增:
7新增:namespace Core.Librarys.Browser.Favicon
8新增:{
9新增: public interface IFaviconManager
10新增: {
11新增: /// <summary>
12新增: /// 保存图标数据到Tai目录下并返回图标相对路径
13新增: /// </summary>
14新增: /// <param name="data"></param>
15新增: /// <returns></returns>
16新增: Task<string> SaveToLocalIconAsync(object data);
17新增: /// <summary>
18新增: /// 通过URL链接获取Favicon图标数据
19新增: /// </summary>
20新增: /// <param name="url"></param>
21新增: /// <returns></returns>
22新增: Task<object> GetIconDataAsync(string url);
23新增: }
24新增:}
新增Core/Librarys/Browser/UrlHelper.cs+134 −0看文件
@@ -0,0 +1,134 @@
1新增:using System;
2新增:using System.Collections.Generic;
3新增:using System.Linq;
4新增:using System.Net;
5新增:using System.Text;
6新增:using System.Text.RegularExpressions;
7新增:using System.Threading.Tasks;
8新增:
9新增:namespace Core.Librarys.Browser
10新增:{
11新增: public static class UrlHelper
12新增: {
13新增: private static readonly Dictionary<string, string> _domainNamesDict = new Dictionary<string, string>()
14新增: {
15新增: {"www.google.com","Google" },
16新增: {"github.com","Github" },
17新增: {"translate.google.com","Google 翻译" },
18新增: {"v2ex.com","V2EX" },
19新增: {"www.bilibili.com","哔哩哔哩" },
20新增: };
21新增: /// <summary>
22新增: /// 获取链接中的域名部分
23新增: /// </summary>
24新增: /// <param name="url_">链接</param>
25新增: /// <param name="isRemovePH_">是否移除协议头(默认否)</param>
26新增: /// <returns></returns>
27新增: public static string GetDomain(string url_, bool isRemovePH_ = true)
28新增: {
29新增: if (string.IsNullOrEmpty(url_)) { return url_; }
30新增:
31新增: ChromeURLEncode(url_);
32新增:
33新增: var ph = Regex.Match(url_, @"((https|http|ftp|rtsp|mms)?:\/\/)").Value;
34新增: if (!string.IsNullOrEmpty(ph))
35新增: {
36新增: url_ = url_.Replace(ph, string.Empty);
37新增: }
38新增:
39新增: int index = url_.IndexOf("/");
40新增: if (index != -1)
41新增: {
42新增: url_ = url_.Substring(0, index);
43新增: }
44新增:
45新增: return !isRemovePH_ ? ph + url_ : url_;
46新增: }
47新增:
48新增: /// <summary>
49新增: /// 通过链接获取一个名称
50新增: /// </summary>
51新增: /// <param name="url_"></param>
52新增: /// <returns></returns>
53新增: public static string GetName(string url_)
54新增: {
55新增: string result = url_;
56新增: // 获取域名部分
57新增: result = GetDomain(result);
58新增:
59新增: // 尝试从已存储的列表中搜索
60新增: if (_domainNamesDict.ContainsKey(result))
61新增: {
62新增: return _domainNamesDict[result];
63新增: }
64新增:
65新增: var arr = result.Split('.');
66新增:
67新增: if (arr.Length == 2)
68新增: {
69新增: return arr[0];
70新增: }
71新增: else if (arr.Length >= 3)
72新增: {
73新增: return $"{arr[1]} {arr[0]}";
74新增: }
75新增: return result;
76新增: }
77新增: /// <summary>
78新增: /// 判断链接是否是域名主页
79新增: /// </summary>
80新增: /// <param name="url_"></param>
81新增: /// <returns></returns>
82新增: public static bool IsIndexUrl(string url_)
83新增: {
84新增: url_ = url_.Replace("http://", string.Empty);
85新增: url_ = url_.Replace("https://", string.Empty);
86新增: return url_.IndexOf("/") == -1;
87新增: }
88新增:
89新增: /// <summary>
90新增: /// 谷歌浏览器URL编码
91新增: /// </summary>
92新增: /// <param name="url_"></param>
93新增: /// <returns></returns>
94新增: public static string ChromeURLEncode(string url_)
95新增: {
96新增: // 韩语
97新增: url_ = Regex.Replace(url_, @"[가-힣]+", (e) =>
98新增: {
99新增: var result = WebUtility.UrlEncode(e.Value);
100新增: return result;
101新增: });
102新增: // 泰语
103新增: url_ = Regex.Replace(url_, @"[\u0E00-\u0E7F]", (e) =>
104新增: {
105新增: var result = WebUtility.UrlEncode(e.Value);
106新增: return result;
107新增: });
108新增: // 德语
109新增: url_ = Regex.Replace(url_, @"[äöüÄÖÜß]", (e) =>
110新增: {
111新增: var result = WebUtility.UrlEncode(e.Value);
112新增: return result;
113新增: });
114新增: // 俄语
115新增: url_ = Regex.Replace(url_, @"[ЁёА-я]", (e) =>
116新增: {
117新增: var result = WebUtility.UrlEncode(e.Value);
118新增: return result;
119新增: });
120新增: // 中文标点符号
121新增: url_ = Regex.Replace(url_, @"[\u3002|\uff1f|\uff01|\uff0c|\u3001|\uff1b|\uff1a|\u201c|\u201d|\u2018|\u2019|\uff08|\uff09|\u300a|\u300b|\u3008|\u3009|\u3010|\u3011|\u300e|\u300f|\u300c|\u300d|\ufe43|\ufe44|\u3014|\u3015|\u2026|\u2014|\uff5e|\ufe4f|\uffe5]", (e) =>
122新增: {
123新增: var result = WebUtility.UrlEncode(e.Value);
124新增: return result;
125新增: });
126新增: return Regex.Replace(url_, @"/[\u4e00-\u9fa5]+|[一-龠]+|[ぁ-ゔ]+|[ァ-ヴー]+|[a-zA-Z0-9]+|[々〆〤ヶ]+/u", (e) =>
127新增: {
128新增: var result = WebUtility.UrlEncode(e.Value);
129新增: return result;
130新增: });
131新增:
132新增: }
133新增: }
134新增:}
修改Core/Librarys/SQLite/TaiDbContext.cs+19 −0看文件
@@ -1,4 +1,5 @@
11using Core.Models;
2新增:using Core.Models.Db;
23using System;
34using System.Collections.Generic;
45using System.Data.Entity;
@@ -25,6 +26,24 @@ namespace Core.Librarys.SQLite
2526 /// 分类
2627 /// </summary>
2728 public DbSet<CategoryModel> Categorys { get; set; }
29新增: /// <summary>
30新增: /// 网站
31新增: /// </summary>
32新增: public DbSet<WebSiteModel> WebSites{ get; set; }
33新增: /// <summary>
34新增: /// 网站分类
35新增: /// </summary>
36新增: public DbSet<WebSiteCategoryModel> WebSiteCategories { get; set; }
37新增: /// <summary>
38新增: /// 网页浏览记录(每小时)
39新增: /// </summary>
40新增: public DbSet<WebBrowseLogModel> WebBrowserLogs { get; set; }
41新增: /// <summary>
42新增: /// 网页链接
43新增: /// </summary>
44新增: public DbSet<WebUrlModel> WebUrls { get; set; }
45新增:
46新增:
2847 // public StatisticContext(string n)
2948 //: base("StatisticContext")
3049 // {
新增Core/Librarys/SiteCache.cs+42 −0看文件
@@ -0,0 +1,42 @@
1新增:using Core.Models.WebPage;
2新增:using Core.Servicers.Interfaces;
3新增:using System;
4新增:using System.Collections.Generic;
5新增:using System.Linq;
6新增:using System.Text;
7新增:using System.Threading.Tasks;
8新增:
9新增:namespace Core.Librarys
10新增:{
11新增: public static class SiteCache
12新增: {
13新增: private static List<Site> sites = new List<Site>();
14新增: private static readonly int maxNum = 100;
15新增: public static Site Get(string key)
16新增: {
17新增: return sites.Where(m => m.Title.Equals(key)).FirstOrDefault();
18新增: }
19新增:
20新增: public static List<Site> GetAll()
21新增: {
22新增: return sites;
23新增: }
24新增:
25新增: public static void Set(string key, string value)
26新增: {
27新增: if (Get(key) == null)
28新增: {
29新增: sites.Add(new Site()
30新增: {
31新增: Title = key,
32新增: Url = value
33新增: });
34新增:
35新增: if (sites.Count > maxNum)
36新增: {
37新增: sites.RemoveAt(0);
38新增: }
39新增: }
40新增: }
41新增: }
42新增:}
修改Core/Models/Config/BehaviorModel.cs+6 −0看文件
@@ -16,5 +16,11 @@ namespace Core.Models.Config
1616 /// 忽略的进程列表
1717 /// </summary>
1818 public List<string> IgnoreProcessList { get; set; } = new List<string>();
19新增:
20新增: [Config(IsCanImportExport = true, Name = "忽略URL", Description = "过滤不需要统计的网站或链接", Group = "忽略URL", Placeholder = "URL 支持正则表达式")]
21新增: /// <summary>
22新增: /// 忽略的进程列表
23新增: /// </summary>
24新增: public List<string> IgnoreURLList { get; set; } = new List<string>();
1925 }
2026}
修改Core/Models/Config/ConfigAttribute.cs+2 −0看文件
@@ -25,6 +25,7 @@ namespace Core.Models.Config
2525 public bool IsCanRepeat;
2626 public bool IsCanImportExport;
2727 public string Options;
28新增: public bool IsBeta;
2829 public ConfigAttribute()
2930 {
3031 ToggleTrueText = "开";
@@ -34,6 +35,7 @@ namespace Core.Models.Config
3435 IsName = false;
3536 IsCanImportExport = false;
3637 Options = string.Empty;
38新增: IsBeta = false;
3739 }
3840
3941
修改Core/Models/Config/GeneralModel.cs+7 −1看文件
@@ -56,5 +56,11 @@ namespace Core.Models.Config
5656 /// </summary>
5757 [Config(Options = "1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20", Name = "更多显示条数", Description = "", Group = "概览页")]
5858 public int IndexPageMoreNum { get; set; } = 11;
59新增:
60新增: /// <summary>
61新增: /// 是否启用网站记录功能
62新增: /// </summary>
63新增: [Config(Name = "网站浏览统计", Description = "统计浏览器的网站访问数据,支持:Google Chrome、MSEdge", Group = "功能", IsBeta = true)]
64新增: public bool IsWebEnabled { get; set; } = false;
5965 }
60删除:}
66新增:}
文件末尾没有换行
新增Core/Models/Data/CommonDataModel.cs+15 −0看文件
@@ -0,0 +1,15 @@
1新增:using System;
2新增:using System.Collections.Generic;
3新增:using System.Linq;
4新增:using System.Text;
5新增:using System.Threading.Tasks;
6新增:
7新增:namespace Core.Models.Data
8新增:{
9新增: public class CommonDataModel
10新增: {
11新增: public int ID { get; set; }
12新增: public string Name { get; set; }
13新增: public double Value { get; set; }
14新增: }
15新增:}
新增Core/Models/Db/WebBrowseLogModel.cs+36 −0看文件
@@ -0,0 +1,36 @@
1新增:using System;
2新增:using System.Collections.Generic;
3新增:using System.ComponentModel.DataAnnotations;
4新增:using System.ComponentModel.DataAnnotations.Schema;
5新增:using System.Linq;
6新增:using System.Text;
7新增:using System.Threading.Tasks;
8新增:
9新增:namespace Core.Models.Db
10新增:{
11新增: /// <summary>
12新增: /// 网页浏览记录
13新增: /// </summary>
14新增: public class WebBrowseLogModel
15新增: {
16新增: [Key]
17新增: public int ID { get; set; }
18新增: public int UrlId { get; set; }
19新增: [ForeignKey("UrlId")]
20新增: public virtual WebUrlModel Url { get; set; }
21新增: /// <summary>
22新增: /// 统计时段(YYYY-MM-dd HH:00:00)
23新增: /// </summary>
24新增: public DateTime LogTime { get; set; }
25新增: /// <summary>
26新增: /// 使用时长(单位:秒)
27新增: /// </summary>
28新增: public int Duration { get; set; } = 0;
29新增: /// <summary>
30新增: /// 网站ID
31新增: /// </summary>
32新增: public int SiteId { get; set; }
33新增: [ForeignKey("SiteId")]
34新增: public virtual WebSiteModel Site { get; set; }
35新增: }
36新增:}
新增Core/Models/Db/WebSiteCategoryModel.cs+33 −0看文件
@@ -0,0 +1,33 @@
1新增:using System;
2新增:using System.Collections.Generic;
3新增:using System.ComponentModel.DataAnnotations;
4新增:using System.Linq;
5新增:using System.Text;
6新增:using System.Threading.Tasks;
7新增:
8新增:namespace Core.Models.Db
9新增:{
10新增: /// <summary>
11新增: /// 网站分类数据库模型
12新增: /// </summary>
13新增: public class WebSiteCategoryModel
14新增: {
15新增:
16新增: [Key]
17新增: public int ID { get; set; }
18新增:
19新增: /// <summary>
20新增: /// 分类名称
21新增: /// </summary>
22新增: public string Name { get; set; }
23新增:
24新增: /// <summary>
25新增: /// 分类图标路径
26新增: /// </summary>
27新增: public string IconFile { get; set; }
28新增: /// <summary>
29新增: /// 颜色
30新增: /// </summary>
31新增: public string Color { get; set; }
32新增: }
33新增:}
新增Core/Models/Db/WebSiteModel.cs+44 −0看文件
@@ -0,0 +1,44 @@
1新增:using System;
2新增:using System.Collections.Generic;
3新增:using System.ComponentModel.DataAnnotations.Schema;
4新增:using System.ComponentModel.DataAnnotations;
5新增:using System.Linq;
6新增:using System.Text;
7新增:using System.Threading.Tasks;
8新增:
9新增:namespace Core.Models.Db
10新增:{
11新增: /// <summary>
12新增: /// 网页站点数据库模型
13新增: /// </summary>
14新增: public class WebSiteModel
15新增: {
16新增: [Key]
17新增: public int ID { get; set; }
18新增:
19新增: /// <summary>
20新增: /// 名称
21新增: /// </summary>
22新增: public string Title { get; set; }
23新增: /// <summary>
24新增: /// 域名
25新增: /// </summary>
26新增: public string Domain { get; set; }
27新增: /// <summary>
28新增: /// 分类ID
29新增: /// </summary>
30新增: public int CategoryID { get; set; }
31新增:
32新增: /// <summary>
33新增: /// 图标路径
34新增: /// </summary>
35新增: public string IconFile { get; set; }
36新增: /// <summary>
37新增: /// 累计使用时长
38新增: /// </summary>
39新增: public int Duration { get; set; } = 0;
40新增:
41新增: [ForeignKey("CategoryID")]
42新增: public virtual WebSiteCategoryModel Category { get; set; }
43新增: }
44新增:}
新增Core/Models/Db/WebUrlModel.cs+21 −0看文件
@@ -0,0 +1,21 @@
1新增:using System;
2新增:using System.Collections.Generic;
3新增:using System.ComponentModel.DataAnnotations;
4新增:using System.Linq;
5新增:using System.Text;
6新增:using System.Threading.Tasks;
7新增:
8新增:namespace Core.Models.Db
9新增:{
10新增: /// <summary>
11新增: /// 网页链接模型
12新增: /// </summary>
13新增: public class WebUrlModel
14新增: {
15新增: [Key]
16新增: public int ID { get; set; }
17新增: public string Title { get; set; }
18新增: public string Url { get; set; }
19新增: public string IconFile { get; set; }
20新增: }
21新增:}
新增Core/Models/WebPage/Site.cs+33 −0看文件
@@ -0,0 +1,33 @@
1新增:using System;
2新增:using System.Collections.Generic;
3新增:using System.Linq;
4新增:using System.Text;
5新增:using System.Threading.Tasks;
6新增:
7新增:namespace Core.Models.WebPage
8新增:{
9新增: public class Site
10新增: {
11新增: public string Title { get; set; }
12新增: public string Url { get; set; }
13新增: public override string ToString()
14新增: {
15新增: return $"Title:{Title},Url:{Url}";
16新增: }
17新增:
18新增: public static Site Empty = new Site()
19新增: {
20新增: Title = string.Empty,
21新增: Url = string.Empty
22新增: };
23新增:
24新增: public Site(Site site = null)
25新增: {
26新增: if (site != null)
27新增: {
28新增: Title = site.Title;
29新增: Url = site.Url;
30新增: }
31新增: }
32新增: }
33新增:}
修改Core/Properties/AssemblyInfo.cs+2 −2看文件
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
3232//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
3333//通过使用 "*",如下所示:
3434// [assembly: AssemblyVersion("1.0.*")]
35删除:[assembly: AssemblyVersion("1.0.0.4")]
36删除:[assembly: AssemblyFileVersion("1.0.0.4")]
35新增:[assembly: AssemblyVersion("1.0.0.5")]
36新增:[assembly: AssemblyFileVersion("1.0.0.5")]
修改Core/Servicers/Instances/AppData.cs+10 −5看文件
@@ -13,10 +13,13 @@ namespace Core.Servicers.Instances
1313{
1414 public class AppData : IAppData
1515 {
16删除:
1716 private List<AppModel> _apps;
1817
19删除:
18新增: private readonly IDatabase _databse;
19新增: public AppData(IDatabase databse)
20新增: {
21新增: _databse = databse;
22新增: }
2023 public List<AppModel> GetAllApps()
2124 {
2225 return _apps;
@@ -25,7 +28,7 @@ namespace Core.Servicers.Instances
2528 public void Load()
2629 {
2730 Debug.WriteLine("加载app开始");
28删除: using (var db = new TaiDbContext())
31新增: using (var db = _databse.GetReaderContext())
2932 {
3033 _apps = (
3134 from app in db.App
@@ -55,10 +58,11 @@ namespace Core.Servicers.Instances
5558 /// <param name="app"></param>
5659 public void UpdateApp(AppModel app)
5760 {
58删除: using (var db = new TaiDbContext())
61新增: using (var db = _databse.GetWriterContext())
5962 {
6063 db.Entry(app).State = System.Data.Entity.EntityState.Modified;
6164 db.SaveChanges();
65新增: _databse.CloseWriter();
6266 }
6367 }
6468 public AppModel GetApp(string name)
@@ -76,7 +80,7 @@ namespace Core.Servicers.Instances
7680 return;
7781 }
7882
79删除: using (var db = new TaiDbContext())
83新增: using (var db = _databse.GetWriterContext())
8084 {
8185 db.App.Add(app);
8286 int res = db.SaveChanges();
@@ -84,6 +88,7 @@ namespace Core.Servicers.Instances
8488 {
8589 _apps.Add(app);
8690 }
91新增: _databse.CloseWriter();
8792 }
8893 }
8994
新增Core/Servicers/Instances/BrowserObserver.cs+311 −0看文件
@@ -0,0 +1,311 @@
1新增:using Core.Enums;
2新增:using Core.Event;
3新增:using Core.Librarys;
4新增:using Core.Librarys.Browser;
5新增:using Core.Librarys.Browser.Favicon;
6新增:using Core.Librarys.SQLite;
7新增:using Core.Models.WebPage;
8新增:using Core.Servicers.Interfaces;
9新增:using NPOI.SS.Formula.Functions;
10新增:using System;
11新增:using System.Collections.Generic;
12新增:using System.Data.SQLite;
13新增:using System.Diagnostics;
14新增:using System.IO;
15新增:using System.Linq;
16新增:using System.Security.Policy;
17新增:using System.Text;
18新增:using System.Threading;
19新增:using System.Threading.Tasks;
20新增:using System.Windows.Automation;
21新增:using System.Windows.Forms;
22新增:using System.Windows.Threading;
23新增:using Site = Core.Models.WebPage.Site;
24新增:
25新增:namespace Core.Servicers.Instances
26新增:{
27新增: public class BrowserObserver : IBrowserObserver
28新增: {
29新增: public event BrowserObserverEventHandler OnSiteChanged;
30新增:
31新增: private readonly IAppObserver _appObserver;
32新增: private readonly IWebData _webData;
33新增: private readonly IWebFilter _webFilter;
34新增: private readonly ISleepdiscover _sleepdiscover;
35新增: private readonly IDateTimeObserver _dateTimeObserver;
36新增:
37新增: private IBrowserWatcher _browserWatcher;
38新增: private bool _isStart = false;
39新增: /// <summary>
40新增: /// 忽略的URL集合
41新增: /// </summary>
42新增: private readonly string[] _ignoreURL = { "about:blank" };
43新增: /// <summary>
44新增: /// 当前浏览站点
45新增: /// </summary>
46新增: private Site _activeSite = null;
47新增: /// <summary>
48新增: /// 浏览开始时间
49新增: /// </summary>
50新增: private DateTime _activeStartTime = DateTime.MinValue;
51新增: // 已保存图标的链接
52新增: private List<string> _savedIconUrls = new List<string>();
53新增: public BrowserObserver(IAppObserver appObserver_, IWebData webData_, IWebFilter webFilter_, ISleepdiscover sleepdiscover_, IDateTimeObserver dateTimeObserver_)
54新增: {
55新增: _appObserver = appObserver_;
56新增: _webData = webData_;
57新增: _webFilter = webFilter_;
58新增: _sleepdiscover = sleepdiscover_;
59新增: _dateTimeObserver = dateTimeObserver_;
60新增: }
61新增: public void Start()
62新增: {
63新增: if (_isStart)
64新增: {
65新增: return;
66新增: }
67新增: _isStart = true;
68新增: _appObserver.OnAppActive += AppObserver_OnAppActive;
69新增: _sleepdiscover.SleepStatusChanged += _sleepdiscover_SleepStatusChanged;
70新增: _dateTimeObserver.OnDateTimeChanging += _dateTimeObserver_OnDateTimeChanging;
71新增: }
72新增:
73新增: private void _dateTimeObserver_OnDateTimeChanging(object sender, DateTime e)
74新增: {
75新增: SaveTime(false);
76新增: }
77新增:
78新增: public void Stop()
79新增: {
80新增: _appObserver.OnAppActive -= AppObserver_OnAppActive;
81新增: _sleepdiscover.SleepStatusChanged -= _sleepdiscover_SleepStatusChanged;
82新增: _dateTimeObserver.OnDateTimeChanging -= _dateTimeObserver_OnDateTimeChanging;
83新增:
84新增: _isStart = false;
85新增: StopWatch();
86新增: }
87新增:
88新增: private void _sleepdiscover_SleepStatusChanged(SleepStatus sleepStatus)
89新增: {
90新增: if (sleepStatus == SleepStatus.Sleep)
91新增: {
92新增: // 睡眠状态
93新增: Stop();
94新增: }
95新增: else
96新增: {
97新增: // 唤醒
98新增: Start();
99新增: }
100新增: }
101新增:
102新增: private void AppObserver_OnAppActive(Models.AppObserver.AppObserverEventArgs args)
103新增: {
104新增: switch (args.ProcessName)
105新增: {
106新增: case "chrome":
107新增: StartWatch(BrowserType.Chrome, args.Handle);
108新增: break;
109新增: case "msedge":
110新增: StartWatch(BrowserType.MSEdge, args.Handle);
111新增: break;
112新增: default:
113新增: StopWatch();
114新增: break;
115新增:
116新增: }
117新增: }
118新增:
119新增: private void StartWatch(BrowserType browserType, IntPtr handle)
120新增: {
121新增: StopWatch();
122新增:
123新增: switch (browserType)
124新增: {
125新增: case BrowserType.Chrome:
126新增: _browserWatcher = new ChromeBrowserWatch();
127新增: break;
128新增: case BrowserType.MSEdge:
129新增: _browserWatcher = new MSEdgeBrowserWatch();
130新增: break;
131新增: }
132新增:
133新增: if (_browserWatcher == null)
134新增: {
135新增: Logger.Error("无法启动浏览器监听,浏览器类型:" + browserType.ToString());
136新增: return;
137新增: }
138新增:
139新增: _browserWatcher.OnSiteChanged += BrowserWatcher_OnSiteChanged; ;
140新增: _browserWatcher.StartWatch(handle);
141新增: }
142新增:
143新增: private void BrowserWatcher_OnSiteChanged(BrowserType browserType, Models.WebPage.Site site)
144新增: {
145新增: Debug.WriteLine(site.ToString());
146新增:
147新增: // 过滤URL
148新增: if (_webFilter.IsIgnore(site.Url))
149新增: {
150新增: Debug.WriteLine($"已被过滤的URL {site.Url}");
151新增: return;
152新增: }
153新增: //Debug.WriteLine($"域名:{UrlHelper.GetDomain(site.Url)}");
154新增: // 更新网页时间
155新增: SaveTime();
156新增:
157新增: _activeSite = site;
158新增: _activeStartTime = DateTime.Now;
159新增:
160新增: OnSiteChanged?.Invoke(browserType, site);
161新增:
162新增: // 更新网页图标
163新增: UpdateFavicon(browserType, site);
164新增: }
165新增:
166新增:
167新增: #region saveTime
168新增: private void SaveTime(bool isReset_ = true)
169新增: {
170新增: if (_activeSite != null && _activeStartTime != DateTime.MinValue)
171新增: {
172新增: SaveTime(new Site(_activeSite), new DateTime(_activeStartTime.Ticks));
173新增:
174新增: if (isReset_)
175新增: {
176新增: _activeStartTime = DateTime.MinValue;
177新增: _activeSite = null;
178新增: }
179新增: else
180新增: {
181新增: _activeStartTime = DateTime.Now;
182新增: }
183新增: }
184新增: }
185新增: private void SaveTime(Site site_, DateTime startTime_)
186新增: {
187新增: Task.Run(() =>
188新增: {
189新增: if (!IsTrueURL(site_.Url))
190新增: {
191新增: return;
192新增: }
193新增:
194新增: TimeSpan browseTime = DateTime.Now - startTime_;
195新增: int seconds = (int)(browseTime.TotalSeconds == 0 ? 1 : browseTime.TotalSeconds);
196新增:
197新增: if (seconds > 0)
198新增: {
199新增: // 更新到数据库
200新增: _webData.AddUrlBrowseTime(site_, seconds, startTime_);
201新增: Debug.WriteLine($"网页:{site_.Title} 浏览了:{seconds}秒。开始时间:{startTime_}");
202新增: }
203新增: });
204新增: }
205新增:
206新增: #endregion
207新增:
208新增: #region updatefavicon
209新增: /// <summary>
210新增: /// 更新获取网页favicon到tai数据库中
211新增: /// </summary>
212新增: /// <param name="browserType"></param>
213新增: /// <param name="site"></param>
214新增: private void UpdateFavicon(BrowserType browserType, Models.WebPage.Site site)
215新增: {
216新增: if (!IsTrueURL(site.Url))
217新增: {
218新增: return;
219新增: }
220新增: try
221新增: {
222新增: if (_savedIconUrls.Contains(site.Url))
223新增: {
224新增: // 已经缓存的链接不再重复获取
225新增: return;
226新增: }
227新增:
228新增: if (_savedIconUrls.Count > 100)
229新增: {
230新增: // 限制缓存链接条数
231新增: _savedIconUrls.RemoveAt(0);
232新增: }
233新增:
234新增: Task.Run(async () =>
235新增: {
236新增: // 获取favicon
237新增: IFaviconManager fm = null;
238新增: switch (browserType)
239新增: {
240新增: case BrowserType.Chrome:
241新增: fm = new ChromeFaviconManager();
242新增: break;
243新增: case BrowserType.MSEdge:
244新增: fm = new ChromeFaviconManager(BrowserType.MSEdge);
245新增: break;
246新增: }
247新增:
248新增: var data = await fm.GetIconDataAsync(site.Url);
249新增: if (data == null)
250新增: {
251新增: // 浏览器可能还没更新缓存,延迟再获取一次
252新增: Thread.Sleep(3000);
253新增: data = await fm.GetIconDataAsync(site.Url);
254新增: }
255新增: if (data != null)
256新增: {
257新增: // 保存到 tai目录下
258新增: string path = await fm.SaveToLocalIconAsync(data);
259新增:
260新增: // 更新到数据库
261新增: _webData.UpdateUrlFavicon(site, path);
262新增:
263新增: _savedIconUrls.Add(site.Url);
264新增: }
265新增: else
266新增: {
267新增: // 如果无法获取则使用站点图标
268新增: string domain = UrlHelper.GetDomain(site.Url);
269新增: // 读取站点数据
270新增: var webSite = _webData.GetWebSite(domain);
271新增:
272新增: if (webSite != null)
273新增: {
274新增: _webData.UpdateUrlFavicon(site, webSite.IconFile);
275新增: }
276新增: }
277新增: });
278新增:
279新增: }
280新增: catch (Exception ex)
281新增: {
282新增: Logger.Error(ex.ToString());
283新增: }
284新增: }
285新增: #endregion
286新增:
287新增: /// <summary>
288新增: /// 指示URL是否正确
289新增: /// </summary>
290新增: /// <param name="url"></param>
291新增: /// <returns></returns>
292新增: private bool IsTrueURL(string url)
293新增: {
294新增: return !string.IsNullOrEmpty(url) && !_ignoreURL.Contains(url);
295新增: }
296新增: private void StopWatch()
297新增: {
298新增: if (_browserWatcher != null)
299新增: {
300新增: _browserWatcher.OnSiteChanged -= BrowserWatcher_OnSiteChanged;
301新增: _browserWatcher.StopWatch();
302新增: _browserWatcher = null;
303新增: }
304新增:
305新增: // 保存时间
306新增: SaveTime();
307新增: }
308新增:
309新增:
310新增: }
311新增:}
新增Core/Servicers/Instances/ChromeBrowserWatch.cs+220 −0看文件
@@ -0,0 +1,220 @@
1新增:using Core.Enums;
2新增:using Core.Event;
3新增:using Core.Librarys;
4新增:using Core.Librarys.Browser.Favicon;
5新增:using Core.Models.WebPage;
6新增:using Core.Servicers.Interfaces;
7新增:using NPOI.SS.Formula.Functions;
8新增:using System;
9新增:using System.Collections.Generic;
10新增:using System.Data.SQLite;
11新增:using System.Diagnostics;
12新增:using System.IO;
13新增:using System.Linq;
14新增:using System.Security.Cryptography;
15新增:using System.Text;
16新增:using System.Threading.Tasks;
17新增:using System.Windows.Automation;
18新增:using System.Windows.Interop;
19新增:using UIAutomationClient;
20新增:
21新增:namespace Core.Servicers.Instances
22新增:{
23新增: public class ChromeBrowserWatch : IBrowserWatcher
24新增: {
25新增: public event BrowserObserverEventHandler OnSiteChanged;
26新增: private string url, title;
27新增: CUIAutomation automation;
28新增: // 根元素(监听站点切换使用)
29新增: IUIAutomationElement rootElement;
30新增: // 主元素(寻找URL使用)
31新增: IUIAutomationElement mainElement;
32新增: // 站点切换事件
33新增: AutomationPropertyChangedEventHandler siteChangedEventHandler;
34新增:
35新增: public ChromeBrowserWatch()
36新增: {
37新增: automation = new CUIAutomation();
38新增: siteChangedEventHandler = new AutomationPropertyChangedEventHandler(OnNameChanged);
39新增: }
40新增:
41新增: public void StartWatch(IntPtr handle)
42新增: {
43新增: try
44新增: {
45新增: if (handle == IntPtr.Zero)
46新增: {
47新增: throw new Exception("未传入浏览器句柄");
48新增: }
49新增:
50新增: Win32API.GetWindowThreadProcessId(handle, out int processID);
51新增: Process process = Process.GetProcessById(processID);
52新增: if (process == null)
53新增: {
54新增: return;
55新增: }
56新增:
57新增: Debug.WriteLine("启动浏览器监听,目标:" + process.ProcessName);
58新增: // 搜索根元素
59新增: rootElement = automation.ElementFromHandle(handle);
60新增: if (rootElement == null)
61新增: {
62新增: throw new Exception("找不到根元素!");
63新增: }
64新增: // 找到窗口
65新增: var condtionPanel = automation.CreatePropertyCondition(30003, 50033);
66新增: var condtionName = automation.CreatePropertyCondition(30005, "Google Chrome");
67新增: var condtionFindWindow = automation.CreateAndCondition(condtionPanel, condtionName);
68新增: var window = rootElement.FindFirst(TreeScope.TreeScope_Children, condtionFindWindow);
69新增: if (window != null)
70新增: {
71新增: // 第二个窗口
72新增: mainElement = window.FindFirst(TreeScope.TreeScope_Children, automation.CreateTrueCondition());
73新增: }
74新增: else
75新增: {
76新增: mainElement = rootElement;
77新增: Debug.WriteLine("没有找到主窗口,使用根元素作为主元素");
78新增: }
79新增:
80新增:
81新增: if (mainElement == null)
82新增: {
83新增: throw new Exception("找不到主元素!");
84新增: }
85新增:
86新增: // 注册事件
87新增: IUIAutomationCacheRequest cacheRequest = automation.CreateCacheRequest();
88新增: cacheRequest.AddProperty(30005);
89新增: int[] props = { 30005 };
90新增:
91新增: automation.AddPropertyChangedEventHandler(rootElement, TreeScope.TreeScope_Element, cacheRequest, siteChangedEventHandler, props);
92新增: Debug.WriteLine("启动浏览器监听成功");
93新增:
94新增: Handle(process.MainWindowTitle);
95新增: }
96新增: catch (Exception e)
97新增: {
98新增: Logger.Error(e.ToString());
99新增: }
100新增: }
101新增:
102新增: private void OnNameChanged(IUIAutomationElement s, int p, object v)
103新增: {
104新增: Handle(v.ToString());
105新增: }
106新增:
107新增: #region AutomationPropertyChangedEventHandler
108新增: private class AutomationPropertyChangedEventHandler : IUIAutomationPropertyChangedEventHandler
109新增: {
110新增: public AutomationPropertyChangedEventHandler(Action<IUIAutomationElement, int, object> action)
111新增: {
112新增: if (action == null)
113新增: throw new ArgumentNullException(nameof(action));
114新增:
115新增: Action = action;
116新增: }
117新增:
118新增: public Action<IUIAutomationElement, int, object> Action { get; }
119新增: public void HandlePropertyChangedEvent(IUIAutomationElement sender, int propertyId, object newValue) => Action(sender, propertyId, newValue);
120新增: }
121新增: #endregion
122新增:
123新增: public void StopWatch()
124新增: {
125新增: try
126新增: {
127新增: Debug.WriteLine("已停止浏览器监听");
128新增: automation.RemovePropertyChangedEventHandler(rootElement, siteChangedEventHandler);
129新增: }
130新增: catch (Exception e)
131新增: {
132新增: Logger.Error(e.ToString());
133新增: }
134新增: }
135新增:
136新增: private string FormatTitle(string title)
137新增: {
138新增: if (string.IsNullOrEmpty(title))
139新增: {
140新增: return title;
141新增: }
142新增: int length = title.LastIndexOf('-') - 1;
143新增: if (length < 1)
144新增: {
145新增: length = 1;
146新增: }
147新增:
148新增: return title.Substring(0, length);
149新增: }
150新增:
151新增: private async void Handle(string title)
152新增: {
153新增: title = FormatTitle(title);
154新增: //Debug.WriteLine($"切换标题 {title}");
155新增: Site site = null;
156新增: if (!string.IsNullOrEmpty(title))
157新增: {
158新增: site = SiteCache.Get(title);
159新增: }
160新增:
161新增: if (site == null)
162新增: {
163新增: string url = await GetURLSync();
164新增: site = new Site()
165新增: {
166新增: Url = url,
167新增: Title = title
168新增: };
169新增: SiteCache.Set(title, url);
170新增: }
171新增:
172新增: ResponseEvent(site.Url, site.Title);
173新增: }
174新增:
175新增: #region 获取浏览器当前URL
176新增: /// <summary>
177新增: /// 获取浏览器当前URL
178新增: /// </summary>
179新增: /// <returns></returns>
180新增: private async Task<string> GetURLSync()
181新增: {
182新增: return await Task.Run(() =>
183新增: {
184新增: string result = string.Empty;
185新增: try
186新增: {
187新增: var condtionEdit = automation.CreatePropertyCondition(30003, 50004);
188新增: var condtionAccessKey = automation.CreatePropertyCondition(30007, "Ctrl+L");
189新增: var condtion = automation.CreateAndCondition(condtionEdit, condtionAccessKey);
190新增: var addressElement = rootElement.FindFirst(TreeScope.TreeScope_Descendants, condtion);
191新增: if (addressElement != null)
192新增: {
193新增: result = ((IUIAutomationValuePattern)addressElement.GetCurrentPattern(10002)).CurrentValue;
194新增: }
195新增: }
196新增: catch (Exception e)
197新增: {
198新增: Logger.Error(e.ToString());
199新增: }
200新增: return result;
201新增: });
202新增:
203新增: }
204新增: #endregion
205新增:
206新增: private void ResponseEvent(string url, string title)
207新增: {
208新增: if (url != this.url)
209新增: {
210新增: this.url = url;
211新增: this.title = title;
212新增: OnSiteChanged?.Invoke(BrowserType.Chrome, new Models.WebPage.Site()
213新增: {
214新增: Url = url,
215新增: Title = title
216新增: });
217新增: }
218新增: }
219新增: }
220新增:}
修改Core/Servicers/Instances/Data.cs+75 −42看文件
@@ -18,11 +18,13 @@ namespace Core.Servicers.Instances
1818{
1919 public class Data : IData
2020 {
21删除: private readonly IAppData appData;
21新增: private readonly IAppData _appData;
22新增: private readonly IDatabase _database;
2223 private readonly object setLock = new object();
23删除: public Data(IAppData appData)
24新增: public Data(IAppData appData_, IDatabase database_)
2425 {
25删除: this.appData = appData;
26新增: _appData = appData_;
27新增: _database = database_;
2628 }
2729 public void Set(string processName, int seconds, DateTime? time_ = null)
2830 {
@@ -36,7 +38,7 @@ namespace Core.Servicers.Instances
3638 return;
3739 }
3840
39删除: AppModel app = appData.GetApp(processName);
41新增: AppModel app = _appData.GetApp(processName);
4042
4143 if (app == null)
4244 {
@@ -44,9 +46,11 @@ namespace Core.Servicers.Instances
4446 }
4547 // 统计app累计使用时长
4648 app.TotalTime += seconds;
47删除: appData.UpdateApp(app);
49新增: _appData.UpdateApp(app);
4850
49删除: using (var db = new TaiDbContext())
51新增:
52新增: //using (var db = _database.GetReaderContext())
53新增: using (var db = _database.GetWriterContext())
5054 {
5155 using (var transcation = db.Database.BeginTransaction())
5256 {
@@ -76,6 +80,10 @@ namespace Core.Servicers.Instances
7680 Logger.Error(e.ToString());
7781 transcation.Rollback();
7882 }
83新增: finally
84新增: {
85新增: _database.CloseWriter();
86新增: }
7987 }
8088 }
8189
@@ -102,8 +110,8 @@ namespace Core.Servicers.Instances
102110 }
103111
104112
105删除:
106删除: using (var db = new TaiDbContext())
113新增: //using (var db = _database.GetReaderContext())
114新增: using (var db = _database.GetWriterContext())
107115 {
108116 using (var transcation = db.Database.BeginTransaction())
109117 {
@@ -160,7 +168,12 @@ namespace Core.Servicers.Instances
160168 Logger.Error(e.ToString());
161169 transcation.Rollback();
162170 }
171新增: finally
172新增: {
173新增: _database.CloseWriter();
174新增: }
163175 }
176新增: //_database.Close();
164177 }
165178 }
166179 public List<DailyLogModel> GetTodaylogList()
@@ -168,7 +181,7 @@ namespace Core.Servicers.Instances
168181
169182 //return null;
170183
171删除: using (var db = new TaiDbContext())
184新增: using (var db = _database.GetReaderContext())
172185 {
173186 var today = DateTime.Now.Date;
174187 var res = db.DailyLog.Where(m => m.Date == today && m.AppModelID != 0);
@@ -176,14 +189,14 @@ namespace Core.Servicers.Instances
176189 }
177190 }
178191
179删除: public IEnumerable<DailyLogModel> GetDateRangelogList(DateTime start, DateTime end, int take = -1)
192新增: public IEnumerable<DailyLogModel> GetDateRangelogList(DateTime start, DateTime end, int take = -1, int skip = -1)
180193 {
181194
182删除: IEnumerable<AppModel> apps = appData.GetAllApps();
195新增: IEnumerable<AppModel> apps = _appData.GetAllApps();
183196
184删除: using (var db = new TaiDbContext())
197新增: using (var db = _database.GetReaderContext())
185198 {
186删除: var data = take == -1 ? db.DailyLog
199新增: var data = db.DailyLog
187200 .Where(m => m.Date >= start && m.Date <= end && m.AppModelID != 0)
188201 .GroupBy(m => m.AppModelID)
189202 .Select(m => new
@@ -191,17 +204,37 @@ namespace Core.Servicers.Instances
191204 Time = m.Sum(a => a.Time),
192205 Date = m.FirstOrDefault().Date,
193206 AppID = m.FirstOrDefault().AppModelID
194删除: }) : db.DailyLog
195删除: .Where(m => m.Date >= start && m.Date <= end && m.AppModelID != 0)
196删除: .GroupBy(m => m.AppModelID)
197删除: .Select(m => new
207新增: });
208新增: if (skip > 0 && take > 0)
198209 {
199删除: Time = m.Sum(a => a.Time),
200删除: Date = m.FirstOrDefault().Date,
201删除: AppID = m.FirstOrDefault().AppModelID
202删除: })
203删除: .OrderByDescending(m => m.Time)
204删除: .Take(take);
210新增: data = data.OrderByDescending(m => m.Time).Skip(skip).Take(take);
211新增: }
212新增: else if (skip > 0)
213新增: {
214新增: data = data.OrderByDescending(m => m.Time).Skip(skip);
215新增: }
216新增: else if (take > 0)
217新增: {
218新增: data = data.OrderByDescending(m => m.Time).Take(take);
219新增: }
220新增: else
221新增: {
222新增: data = data.OrderByDescending(m => m.Time);
223新增: }
224新增:
225新增:
226新增:
227新增: //: db.DailyLog
228新增: //.Where(m => m.Date >= start && m.Date <= end && m.AppModelID != 0)
229新增: //.GroupBy(m => m.AppModelID)
230新增: //.Select(m => new
231新增: //{
232新增: // Time = m.Sum(a => a.Time),
233新增: // Date = m.FirstOrDefault().Date,
234新增: // AppID = m.FirstOrDefault().AppModelID
235新增: //})
236新增: //.OrderByDescending(m => m.Time)
237新增: //.Take(take);
205238
206239 var res = data
207240 .ToList()
@@ -214,7 +247,7 @@ namespace Core.Servicers.Instances
214247
215248 foreach (var log in res)
216249 {
217删除: log.AppModel = appData.GetApp(log.AppModelID);
250新增: log.AppModel = _appData.GetApp(log.AppModelID);
218251 }
219252
220253 return res;
@@ -268,7 +301,7 @@ namespace Core.Servicers.Instances
268301 //{
269302 // return new List<DailyLogModel>();
270303 //}
271删除: using (var db = new TaiDbContext())
304新增: using (var db = _database.GetReaderContext())
272305 {
273306
274307 var res = db.DailyLog.Include(m => m.AppModel).Where(
@@ -289,7 +322,7 @@ namespace Core.Servicers.Instances
289322 public void Clear(int appID, DateTime month)
290323 {
291324
292删除: using (var db = new TaiDbContext())
325新增: using (var db = _database.GetReaderContext())
293326 {
294327
295328 db.DailyLog.RemoveRange(
@@ -311,7 +344,7 @@ namespace Core.Servicers.Instances
311344 {
312345
313346
314删除: using (var db = new TaiDbContext())
347新增: using (var db = _database.GetReaderContext())
315348 {
316349
317350
@@ -338,7 +371,7 @@ namespace Core.Servicers.Instances
338371
339372 public List<ColumnDataModel> GetCategoryHoursData(DateTime date)
340373 {
341删除: using (var db = new TaiDbContext())
374新增: using (var db = _database.GetReaderContext())
342375 {
343376 // 查出有数据的分类
344377
@@ -380,7 +413,7 @@ namespace Core.Servicers.Instances
380413
381414 public List<ColumnDataModel> GetCategoryRangeData(DateTime start, DateTime end)
382415 {
383删除: using (var db = new TaiDbContext())
416新增: using (var db = _database.GetReaderContext())
384417 {
385418 // 查出有数据的分类
386419
@@ -431,7 +464,7 @@ namespace Core.Servicers.Instances
431464
432465 public List<ColumnDataModel> GetCategoryYearData(DateTime date)
433466 {
434删除: using (var db = new TaiDbContext())
467新增: using (var db = _database.GetReaderContext())
435468 {
436469 // 查出有数据的分类
437470
@@ -493,7 +526,7 @@ namespace Core.Servicers.Instances
493526
494527 public List<ColumnDataModel> GetAppDayData(int appID, DateTime date)
495528 {
496删除: using (var db = new TaiDbContext())
529新增: using (var db = _database.GetReaderContext())
497530 {
498531
499532 var data = db.Database.SqlQuery<ColumnItemDataModel>("select sum(Time) as Total,AppModelID as AppID,DataTime as Time from HoursLogModels where AppModelID=" + appID + " and DataTime>='" + date.Date.ToString("yyyy-MM-dd HH:mm:ss") + "' and DataTime<= '" + date.Date.ToString("yyyy-MM-dd 23:59:59") + "' GROUP BY AppModelID,DataTime ").ToArray();
@@ -527,7 +560,7 @@ namespace Core.Servicers.Instances
527560
528561 public List<ColumnDataModel> GetAppRangeData(int appID, DateTime start, DateTime end)
529562 {
530删除: using (var db = new TaiDbContext())
563新增: using (var db = _database.GetReaderContext())
531564 {
532565 // 查出有数据的分类
533566
@@ -566,7 +599,7 @@ namespace Core.Servicers.Instances
566599
567600 public List<ColumnDataModel> GetAppYearData(int appID, DateTime date)
568601 {
569删除: using (var db = new TaiDbContext())
602新增: using (var db = _database.GetReaderContext())
570603 {
571604 // 查出有数据的分类
572605
@@ -610,7 +643,7 @@ namespace Core.Servicers.Instances
610643 {
611644 end = new DateTime(end.Year, end.Month, DateTime.DaysInMonth(end.Year, end.Month));
612645
613删除: using (var db = new TaiDbContext())
646新增: using (var db = _database.GetReaderContext())
614647 {
615648 db.Database.ExecuteSqlCommand("delete from DailyLogModels where Date>='" + start.Date.ToString("yyyy-MM-01 00:00:00") + "' and Date<= '" + end.Date.ToString("yyyy-MM-dd 23:59:59") + "'");
616649
@@ -623,7 +656,7 @@ namespace Core.Servicers.Instances
623656 start = new DateTime(start.Year, start.Month, 1, 0, 0, 0);
624657 end = new DateTime(end.Year, end.Month, DateTime.DaysInMonth(end.Year, end.Month), 23, 59, 59);
625658
626删除: using (var db = new TaiDbContext())
659新增: using (var db = _database.GetReaderContext())
627660 {
628661 var day = db.DailyLog.Where(m => m.Date >= start.Date && m.Date <= end.Date)
629662 .Select(m => new
@@ -674,9 +707,9 @@ namespace Core.Servicers.Instances
674707
675708 public int GetDateRangeAppCount(DateTime start, DateTime end)
676709 {
677删除: IEnumerable<AppModel> apps = appData.GetAllApps();
710新增: IEnumerable<AppModel> apps = _appData.GetAllApps();
678711
679删除: using (var db = new TaiDbContext())
712新增: using (var db = _database.GetReaderContext())
680713 {
681714 var res = db.DailyLog
682715 .Where(m => m.Date >= start && m.Date <= end && m.AppModelID != 0)
@@ -690,13 +723,13 @@ namespace Core.Servicers.Instances
690723 public IEnumerable<HoursLogModel> GetTimeRangelogList(DateTime time)
691724 {
692725 time = new DateTime(time.Year, time.Month, time.Day, time.Hour, 0, 0);
693删除: using (var db = new TaiDbContext())
726新增: using (var db = _database.GetReaderContext())
694727 {
695728 var res = db.HoursLog.Where(m => m.DataTime == time).ToList();
696729
697730 foreach (var log in res)
698731 {
699删除: log.AppModel = appData.GetApp(log.AppModelID);
732新增: log.AppModel = _appData.GetApp(log.AppModelID);
700733 }
701734
702735 return res;
@@ -710,7 +743,7 @@ namespace Core.Servicers.Instances
710743 }
711744 public double[] GetRangeTotalData(DateTime start, DateTime end)
712745 {
713删除: using (var db = new TaiDbContext())
746新增: using (var db = _database.GetReaderContext())
714747 {
715748 if (start.Date == end.Date)
716749 {
@@ -751,7 +784,7 @@ namespace Core.Servicers.Instances
751784
752785 public double[] GetMonthTotalData(DateTime date)
753786 {
754删除: using (var db = new TaiDbContext())
787新增: using (var db = _database.GetReaderContext())
755788 {
756789 var dateArr = Time.GetYearDate(date);
757790 var data = db.Database.SqlQuery<TimeDataModel>("select sum(Time) as Total,Date as Time from DailyLogModels where Date>='" + dateArr[0].Date.ToString("yyyy-MM-dd HH:mm:ss") + "' and Date<= '" + dateArr[1].Date.ToString("yyyy-MM-dd HH:mm:ss") + "' GROUP BY Date").ToArray();
@@ -762,7 +795,7 @@ namespace Core.Servicers.Instances
762795 string month = i < 10 ? "0" + i : i.ToString();
763796 var dayArr = Time.GetMonthDate(new DateTime(date.Year, i, 1));
764797 var total = data.Where(m => m.Time >= dayArr[0] && m.Time <= dayArr[1]).Sum(m => m.Total);
765删除:
798新增:
766799 result[i - 1] = total;
767800 }
768801 return result;
新增Core/Servicers/Instances/Database.cs+75 −0看文件
@@ -0,0 +1,75 @@
1新增:using Core.Librarys.SQLite;
2新增:using Core.Servicers.Interfaces;
3新增:using System;
4新增:using System.Collections.Generic;
5新增:using System.Diagnostics;
6新增:using System.Linq;
7新增:using System.Text;
8新增:using System.Threading;
9新增:using System.Threading.Tasks;
10新增:
11新增:namespace Core.Servicers.Instances
12新增:{
13新增: public class Database : IDatabase
14新增: {
15新增: //private TaiDbContext _readerContext;
16新增: private TaiDbContext _writerContext;
17新增: private readonly object _locker = new object();
18新增: private bool _locked = false;
19新增: private int _outTime = 10;
20新增: private bool _isReading = false;
21新增: public TaiDbContext GetReaderContext()
22新增: {
23新增: lock (_locker)
24新增: {
25新增: int lockTime = 0;
26新增: while (_locked)
27新增: {
28新增: Thread.Sleep(100);
29新增: lockTime += 100;
30新增: if (lockTime >= _outTime * 1000)
31新增: {
32新增: _locked = false;
33新增: }
34新增: }
35新增: //_locked = true;
36新增:
37新增: //_readerContext = new TaiDbContext();
38新增: //return _readerContext;
39新增: return new TaiDbContext();
40新增: }
41新增: }
42新增:
43新增: public void CloseReader()
44新增: {
45新增: //_readerContext?.Dispose();
46新增: }
47新增:
48新增: public TaiDbContext GetWriterContext()
49新增: {
50新增: lock (_locker)
51新增: {
52新增: int lockTime = 0;
53新增: while (_locked)
54新增: {
55新增: Thread.Sleep(100);
56新增: lockTime += 100;
57新增: if (lockTime >= _outTime * 1000)
58新增: {
59新增: _locked = false;
60新增: }
61新增: }
62新增: _locked = true;
63新增:
64新增: _writerContext = new TaiDbContext();
65新增: return _writerContext;
66新增: }
67新增: }
68新增:
69新增: public void CloseWriter()
70新增: {
71新增: _writerContext?.Dispose();
72新增: _locked = false;
73新增: }
74新增: }
75新增:}
新增Core/Servicers/Instances/MSEdgeBrowserWatch.cs+243 −0看文件
@@ -0,0 +1,243 @@
1新增:using Core.Enums;
2新增:using Core.Event;
3新增:using Core.Librarys;
4新增:using Core.Librarys.Browser.Favicon;
5新增:using Core.Models.WebPage;
6新增:using Core.Servicers.Interfaces;
7新增:using NPOI.SS.Formula.Functions;
8新增:using System;
9新增:using System.Collections.Generic;
10新增:using System.Data.SQLite;
11新增:using System.Diagnostics;
12新增:using System.IO;
13新增:using System.Linq;
14新增:using System.Security.Cryptography;
15新增:using System.Text;
16新增:using System.Threading.Tasks;
17新增:using System.Windows.Automation;
18新增:using System.Windows.Interop;
19新增:using UIAutomationClient;
20新增:
21新增:namespace Core.Servicers.Instances
22新增:{
23新增: public class MSEdgeBrowserWatch : IBrowserWatcher
24新增: {
25新增: public event BrowserObserverEventHandler OnSiteChanged;
26新增: private string url, title;
27新增: CUIAutomation automation;
28新增: // 根元素(监听站点切换使用)
29新增: IUIAutomationElement rootElement;
30新增: // 主元素(寻找URL使用)
31新增: IUIAutomationElement mainElement;
32新增:
33新增: IntPtr hook;
34新增: Win32API.WinEventDelegate winEventDelegate;
35新增: public MSEdgeBrowserWatch()
36新增: {
37新增: automation = new CUIAutomation();
38新增: winEventDelegate = new Win32API.WinEventDelegate(WinEventProc);
39新增: }
40新增:
41新增: private void WinEventProc(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime)
42新增: {
43新增: //Debug.WriteLine("idObject:" + idObject + ",idChild:" + idChild);
44新增:
45新增: if (idObject == 0 && idChild == 0)
46新增: {
47新增: Debug.WriteLine("切换选项卡 -> " + dwmsEventTime);
48新增: Handle();
49新增: }
50新增: }
51新增:
52新增: public void StartWatch(IntPtr handle)
53新增: {
54新增: try
55新增: {
56新增: if (handle == IntPtr.Zero)
57新增: {
58新增: throw new Exception("未传入浏览器句柄");
59新增: }
60新增:
61新增: Win32API.GetWindowThreadProcessId(handle, out int processID);
62新增: Process process = Process.GetProcessById(processID);
63新增: if (process == null)
64新增: {
65新增: return;
66新增: }
67新增:
68新增: Debug.WriteLine("启动浏览器监听,目标:" + process.ProcessName + "," + handle);
69新增: // 搜索根元素
70新增: rootElement = automation.ElementFromHandle(handle);
71新增: if (rootElement == null)
72新增: {
73新增: throw new Exception("找不到根元素!");
74新增: }
75新增: // 找到窗口
76新增: var condtionPanel = automation.CreatePropertyCondition(30003, 50033);
77新增: var condtionName = automation.CreatePropertyCondition(30012, "BrowserRootView");
78新增: var condtionFindWindow = automation.CreateAndCondition(condtionPanel, condtionName);
79新增: var window = rootElement.FindFirst(TreeScope.TreeScope_Children, condtionFindWindow);
80新增: if (window != null)
81新增: {
82新增: // 第二个窗口
83新增: mainElement = window.FindFirst(TreeScope.TreeScope_Children, automation.CreateTrueCondition());
84新增: }
85新增: else
86新增: {
87新增: mainElement = rootElement;
88新增: Debug.WriteLine("没有找到主窗口,使用根元素作为主元素");
89新增: }
90新增:
91新增:
92新增: if (mainElement == null)
93新增: {
94新增: throw new Exception("找不到主元素!");
95新增: }
96新增:
97新增: // 注册事件
98新增:
99新增: //// 找到窗口
100新增: //var condtionTab = automation.CreatePropertyCondition(30003, 50018);
101新增: //var condtionClassName = automation.CreatePropertyCondition(30012, "TabStripRegionView");
102新增: //var tabElement = mainElement.FindFirst(TreeScope.TreeScope_Descendants, automation.CreateAndCondition(condtionTab, condtionClassName));
103新增: hook = Win32API.SetWinEventHook(0x800C, 0x800C, handle, winEventDelegate, 0, 0, 0);
104新增:
105新增: Debug.WriteLine("启动浏览器监听成功");
106新增:
107新增: Handle();
108新增: }
109新增: catch (Exception e)
110新增: {
111新增: Logger.Error(e.ToString());
112新增: }
113新增: }
114新增:
115新增: public void StopWatch()
116新增: {
117新增: try
118新增: {
119新增: Win32API.UnhookWinEvent(hook);
120新增: Debug.WriteLine("已停止浏览器监听");
121新增: }
122新增: catch (Exception e)
123新增: {
124新增: Logger.Error(e.ToString());
125新增: }
126新增: }
127新增:
128新增: private string FormatTitle(string title)
129新增: {
130新增: if (string.IsNullOrEmpty(title))
131新增: {
132新增: return title;
133新增: }
134新增: int length = title.LastIndexOf('-') - 1;
135新增: if (length < 1)
136新增: {
137新增: length = 1;
138新增: }
139新增:
140新增: return title.Substring(0, length);
141新增: }
142新增:
143新增: private async void Handle()
144新增: {
145新增: string title = await GetURLTitleSync();
146新增: title = FormatTitle(title);
147新增: Site site = null;
148新增: if (!string.IsNullOrEmpty(title))
149新增: {
150新增: site = SiteCache.Get(title);
151新增: }
152新增:
153新增: if (site == null)
154新增: {
155新增: string url = await GetURLSync();
156新增: site = new Site()
157新增: {
158新增: Url = url,
159新增: Title = title
160新增: };
161新增: SiteCache.Set(title, url);
162新增: }
163新增:
164新增: ResponseEvent(site.Url, site.Title);
165新增: }
166新增:
167新增: #region 获取浏览器当前URL
168新增: /// <summary>
169新增: /// 获取浏览器当前URL
170新增: /// </summary>
171新增: /// <returns></returns>
172新增: private async Task<string> GetURLSync()
173新增: {
174新增: return await Task.Run(() =>
175新增: {
176新增: string result = string.Empty;
177新增: try
178新增: {
179新增: var condtionEdit = automation.CreatePropertyCondition(30003, 50004);
180新增: var condtionAccessKey = automation.CreatePropertyCondition(30006, "Ctrl+L");
181新增: var condtion = automation.CreateAndCondition(condtionEdit, condtionAccessKey);
182新增: var addressElement = rootElement.FindFirst(TreeScope.TreeScope_Descendants, condtion);
183新增: if (addressElement != null)
184新增: {
185新增: result = ((IUIAutomationValuePattern)addressElement.GetCurrentPattern(10002)).CurrentValue;
186新增: }
187新增: }
188新增: catch (Exception e)
189新增: {
190新增: Logger.Error(e.ToString());
191新增: }
192新增: return result;
193新增: });
194新增:
195新增: }
196新增: #endregion
197新增:
198新增: #region 获取浏览器当前网页标题
199新增: /// <summary>
200新增: /// 获取浏览器当前网页标题
201新增: /// </summary>
202新增: /// <returns></returns>
203新增: private async Task<string> GetURLTitleSync()
204新增: {
205新增: return await Task.Run(() =>
206新增: {
207新增: string result = string.Empty;
208新增: try
209新增: {
210新增: var condtionEdit = automation.CreatePropertyCondition(30003, 50033);
211新增: var condtionCN = automation.CreatePropertyCondition(30012, "BrowserRootView");
212新增: var condtion = automation.CreateAndCondition(condtionEdit, condtionCN);
213新增: var element = rootElement.FindFirst(TreeScope.TreeScope_Descendants, condtion);
214新增: if (element != null)
215新增: {
216新增: result = element.GetCurrentPropertyValue(30005);
217新增: }
218新增: }
219新增: catch (Exception e)
220新增: {
221新增: Logger.Error(e.ToString());
222新增: }
223新增: return result;
224新增: });
225新增:
226新增: }
227新增: #endregion
228新增:
229新增: private void ResponseEvent(string url, string title)
230新增: {
231新增: if (url != this.url)
232新增: {
233新增: this.url = url;
234新增: this.title = title;
235新增: OnSiteChanged?.Invoke(BrowserType.MSEdge, new Models.WebPage.Site()
236新增: {
237新增: Url = url,
238新增: Title = title
239新增: });
240新增: }
241新增: }
242新增: }
243新增:}
修改Core/Servicers/Instances/Main.cs+44 −6看文件
@@ -21,12 +21,14 @@ namespace Core.Servicers.Instances
2121 public class Main : IMain
2222 {
2323 private readonly IAppObserver appObserver;
24新增: private readonly IBrowserObserver browserObserver;
2425 private readonly IData data;
2526 private readonly ISleepdiscover sleepdiscover;
2627 private readonly IAppConfig appConfig;
2728 private readonly IDateTimeObserver dateTimeObserver;
2829 private readonly IAppData appData;
2930 private readonly ICategorys categories;
31新增: private readonly IWebFilter _webFilter;
3032 // 忽略的进程
3133 private readonly string[] DefaultIgnoreProcess = new string[] {
3234 "Tai",
@@ -88,7 +90,9 @@ namespace Core.Servicers.Instances
8890 ISleepdiscover sleepdiscover,
8991 IAppConfig appConfig,
9092 IDateTimeObserver dateTimeObserver,
91删除: IAppData appData, ICategorys categories)
93新增: IAppData appData, ICategorys categories,
94新增: IBrowserObserver browserObserver,
95新增: IWebFilter webFilter_)
9296 {
9397 this.appObserver = appObserver;
9498 this.data = data;
@@ -97,17 +101,21 @@ namespace Core.Servicers.Instances
97101 this.dateTimeObserver = dateTimeObserver;
98102 this.appData = appData;
99103 this.categories = categories;
104新增: this.browserObserver = browserObserver;
105新增: _webFilter = webFilter_;
100106
101107 IgnoreProcessCacheList = new List<string>();
102108 ConfigIgnoreProcessRegxList = new List<string>();
103109 ConfigIgnoreProcessList = new List<string>();
104110
105删除: appObserver.OnAppActive += Observer_OnAppActive;
111新增: appObserver.OnAppActive += AppObserver_OnAppActive;
106112 sleepdiscover.SleepStatusChanged += Sleepdiscover_SleepStatusChanged;
107113 appConfig.ConfigChanged += AppConfig_ConfigChanged;
108114 dateTimeObserver.OnDateTimeChanging += DateTimeObserver_OnDateTimeChanging;
109115 }
110116
117新增:
118新增:
111119 private void DateTimeObserver_OnDateTimeChanging(object sender, DateTime time)
112120 {
113121 Logger.Info("[time changed] status:" + sleepStatus + ",process:" + activeProcess + ",start:" + activeStartTime.ToString() + ",end:" + DateTime.Now.ToString() + ",time:" + time.ToString());
@@ -130,6 +138,9 @@ namespace Core.Servicers.Instances
130138
131139 // 更新忽略规则
132140 UpdateConfigIgnoreProcess();
141新增:
142新增: // 处理web记录功能启停
143新增: HandleWebServiceConfig();
133144 }
134145 }
135146
@@ -165,6 +176,11 @@ namespace Core.Servicers.Instances
165176
166177 // 启动睡眠监测
167178 sleepdiscover.Start();
179新增:
180新增: // 初始化过滤器
181新增: _webFilter.Init();
182新增:
183新增: // 启动主服务
168184 Start();
169185
170186 OnStarted?.Invoke(this, EventArgs.Empty);
@@ -176,6 +192,11 @@ namespace Core.Servicers.Instances
176192
177193 dateTimeObserver.Start();
178194 appObserver.Start();
195新增:
196新增: if (config.General.IsWebEnabled)
197新增: {
198新增: browserObserver.Start();
199新增: }
179200 }
180201 public void Stop()
181202 {
@@ -307,16 +328,16 @@ namespace Core.Servicers.Instances
307328 return true;
308329 }
309330
310删除: private void Observer_OnAppActive(string processName, string description, string file)
331新增: private void AppObserver_OnAppActive(Models.AppObserver.AppObserverEventArgs args)
311332 {
312333 if (sleepStatus == SleepStatus.Sleep)
313334 {
314335 return;
315336 }
316337
317删除: bool isCheck = IsCheckApp(processName, description, file);
338新增: bool isCheck = IsCheckApp(args.ProcessName, args.Description, args.File);
318339
319删除: if (activeProcess != processName)
340新增: if (activeProcess != args.ProcessName)
320341 {
321342 UpdateTime();
322343 }
@@ -327,7 +348,7 @@ namespace Core.Servicers.Instances
327348 {
328349 activeStartTime = DateTime.Now;
329350 }
330删除: activeProcess = processName;
351新增: activeProcess = args.ProcessName;
331352 }
332353 else
333354 {
@@ -420,5 +441,22 @@ namespace Core.Servicers.Instances
420441 }
421442 }
422443
444新增: #region 处理网站数据记录配置项开关
445新增: /// <summary>
446新增: /// 处理网站数据记录配置项开关
447新增: /// </summary>
448新增: private void HandleWebServiceConfig()
449新增: {
450新增: if (config.General.IsWebEnabled)
451新增: {
452新增: browserObserver.Start();
453新增: }
454新增: else
455新增: {
456新增: browserObserver.Stop();
457新增: }
458新增: }
459新增: #endregion
460新增:
423461 }
424462}
新增Core/Servicers/Instances/WebData.cs+786 −0看文件
@@ -0,0 +1,786 @@
1新增:using Core.Librarys;
2新增:using Core.Librarys.Browser;
3新增:using Core.Librarys.SQLite;
4新增:using Core.Models.Data;
5新增:using Core.Models.Db;
6新增:using Core.Models.WebPage;
7新增:using Core.Servicers.Interfaces;
8新增:using Newtonsoft.Json;
9新增:using NPOI.SS.Formula.Functions;
10新增:using Org.BouncyCastle.Security;
11新增:using System;
12新增:using System.Collections.Generic;
13新增:using System.Diagnostics;
14新增:using System.Linq;
15新增:using System.Linq.Expressions;
16新增:
17新增:using System.Threading.Tasks;
18新增:using static System.Windows.Forms.AxHost;
19新增:
20新增:namespace Core.Servicers.Instances
21新增:{
22新增: public class WebData : IWebData
23新增: {
24新增: private readonly IDatabase _database;
25新增: private readonly object _createUrlLocker = new object();
26新增: public WebData(IDatabase database)
27新增: {
28新增: _database = database;
29新增: }
30新增:
31新增: #region AddUrlBrowseTime
32新增: public void AddUrlBrowseTime(Site site_, int duration_, DateTime? dateTime_ = null)
33新增: {
34新增: Debug.WriteLine("AddUrlBrowseTime");
35新增: Task.Run(() =>
36新增: {
37新增: try
38新增: {
39新增: if (string.IsNullOrEmpty(site_.Url))
40新增: {
41新增: return;
42新增: }
43新增:
44新增: var dateTime = dateTime_.HasValue ? dateTime_.Value : DateTime.Now;
45新增: var logTime = new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, dateTime.Hour, 0, 0);
46新增: if (dateTime.Minute == 59 && dateTime.Second == 59)
47新增: {
48新增: AddUrlBrowseTime(site_, duration_, logTime.AddHours(1));
49新增: return;
50新增: }
51新增: // 当前时段时长
52新增: int nowTimeDuration = duration_;
53新增: // 下一个时段时长
54新增: int nextTimeDuration = 0;
55新增:
56新增: // 当前时段最大使用时长
57新增: int nowTimeMaxDuration = (60 - dateTime.Minute) * 60;
58新增:
59新增: if (duration_ > 3600)
60新增: {
61新增: nowTimeDuration = 3600;
62新增: nextTimeDuration = duration_ - 3600;
63新增: }
64新增: if (nowTimeDuration > nowTimeMaxDuration)
65新增: {
66新增: nextTimeDuration += nowTimeDuration - nowTimeMaxDuration;
67新增:
68新增: nowTimeDuration = nowTimeMaxDuration;
69新增: }
70新增:
71新增: //var db = _database.GetContext("AddUrlBrowseTime");
72新增: //using (var db = new TaiDbContext())
73新增: using (var db = _database.GetWriterContext())
74新增: {
75新增: // 获取站点信息
76新增: string domain = UrlHelper.GetDomain(site_.Url);
77新增: var site = db.WebSites.Where(m => m.Domain == domain).FirstOrDefault();
78新增: Debug.WriteLine("AddUrlBrowseTime 获取站点数据");
79新增:
80新增: if (site == null)
81新增: {
82新增: site = db.WebSites.Add(new Models.Db.WebSiteModel()
83新增: {
84新增: Title = UrlHelper.GetName(site_.Url),
85新增: Domain = domain,
86新增: });
87新增:
88新增: db.SaveChanges();
89新增: }
90新增:
91新增: // 获取链接
92新增: var url = GetCreateUrl(db, site_);
93新增: if (url == null)
94新增: {
95新增: throw new Exception("在创建URL时异常");
96新增: }
97新增:
98新增: // 记录
99新增: var log = db.WebBrowserLogs.Where(m => m.LogTime == logTime && m.UrlId == url.ID).FirstOrDefault();
100新增:
101新增: if (log != null)
102新增: {
103新增: // 时长
104新增: int duration = log.Duration + nowTimeDuration;
105新增: // 判断是否超出
106新增: if (log.Duration + nowTimeDuration > 3600)
107新增: {
108新增: duration = 3600;
109新增: nextTimeDuration += log.Duration + nowTimeDuration - 3600;
110新增: }
111新增:
112新增: // 更新记录
113新增: log.Duration = duration;
114新增: }
115新增: else
116新增: {
117新增: // 新记录
118新增: log = new Models.Db.WebBrowseLogModel()
119新增: {
120新增: Duration = nowTimeDuration,
121新增: UrlId = url.ID,
122新增: LogTime = logTime,
123新增: SiteId = site.ID,
124新增: };
125新增:
126新增:
127新增: db.WebBrowserLogs.Add(log);
128新增: }
129新增: site.Duration += nowTimeDuration;
130新增: db.SaveChanges();
131新增: }
132新增: if (nextTimeDuration > 0)
133新增: {
134新增: AddUrlBrowseTime(site_, nextTimeDuration, logTime.AddHours(1));
135新增: }
136新增: }
137新增: catch (Exception ex)
138新增: {
139新增: Logger.Error($"在更新链接[{site_.Url}]时长[{duration_}]时异常,{ex}");
140新增: }
141新增: finally
142新增: {
143新增: _database.CloseWriter();
144新增: }
145新增: });
146新增:
147新增: }
148新增: #endregion
149新增:
150新增: #region UpdateUrlFavicon
151新增: public void UpdateUrlFavicon(Site site_, string iconFile_)
152新增: {
153新增: if (string.IsNullOrEmpty(iconFile_) || string.IsNullOrEmpty(site_.Url))
154新增: {
155新增: return;
156新增: }
157新增:
158新增: Debug.WriteLine("UpdateUrlFavicon");
159新增:
160新增: Task.Run(() =>
161新增: {
162新增:
163新增: // 判断是否是主域名
164新增: bool isIndex = UrlHelper.IsIndexUrl(site_.Url);
165新增:
166新增: //// 获取主域名
167新增: //string domain = UrlHelper.GetDomain(site_.Url);
168新增:
169新增: // 获取站点信息
170新增: using (var db = _database.GetWriterContext())
171新增: {
172新增: // 更新站点图标
173新增: var site = GetCreateWebSite(db, site_.Url);
174新增: Debug.WriteLine("UpdateUrlFavicon 获取站点数据");
175新增: if (site != null && (string.IsNullOrEmpty(site.IconFile) || (isIndex && site.IconFile != iconFile_)))
176新增: {
177新增: site.IconFile = iconFile_;
178新增: }
179新增:
180新增: // 更新链接图标
181新增: var url = GetCreateUrl(db, site_);
182新增: if (url != null)
183新增: {
184新增: url.IconFile = iconFile_;
185新增: }
186新增:
187新增: db.SaveChanges();
188新增: _database.CloseWriter();
189新增: }
190新增: });
191新增:
192新增: }
193新增: #endregion
194新增:
195新增: #region GetCreateSite
196新增: /// <summary>
197新增: /// 输入URL获取站点信息,不存在时创建
198新增: /// </summary>
199新增: /// <param name="url_">URL</param>
200新增: /// <returns></returns>
201新增: private WebSiteModel GetCreateWebSite(TaiDbContext db, string url_)
202新增: {
203新增: // 获取主域名
204新增: string domain = UrlHelper.GetDomain(url_);
205新增:
206新增: //using (var db = _database.GetWriterContext())
207新增: //{
208新增: var site = db.WebSites.Where(m => m.Domain == domain).FirstOrDefault();
209新增: if (site == null)
210新增: {
211新增: site = db.WebSites.Add(new WebSiteModel()
212新增: {
213新增: Title = UrlHelper.GetName(url_),
214新增: Domain = domain,
215新增: });
216新增: db.SaveChanges();
217新增: }
218新增:
219新增: return site;
220新增: //}
221新增: }
222新增: #endregion
223新增: #region GetCreateUrl
224新增: /// <summary>
225新增: /// 获取url数据,不存在时创建
226新增: /// </summary>
227新增: /// <param name="url_"></param>
228新增: /// <returns></returns>
229新增: private Models.Db.WebUrlModel GetCreateUrl(TaiDbContext db, Site site_)
230新增: {
231新增: lock (_createUrlLocker)
232新增: {
233新增: var result = db.WebUrls.Where(m => m.Url == site_.Url).FirstOrDefault();
234新增: if (result == null)
235新增: {
236新增: result = db.WebUrls.Add(new Models.Db.WebUrlModel()
237新增: {
238新增: Url = site_.Url,
239新增: Title = site_.Title,
240新增: });
241新增: db.SaveChanges();
242新增: }
243新增: return result;
244新增:
245新增: }
246新增: }
247新增: #endregion
248新增:
249新增: #region GetDateRangeWebSiteList
250新增: public List<WebSiteModel> GetDateRangeWebSiteList(DateTime start, DateTime end, int take = 0, int skip = -1, bool isTime_ = false)
251新增: {
252新增: if (isTime_)
253新增: {
254新增: start = new DateTime(start.Year, start.Month, start.Day, start.Hour, 0, 0);
255新增: end = new DateTime(end.Year, end.Month, end.Day, end.Hour, 59, 59);
256新增: }
257新增: else
258新增: {
259新增: start = new DateTime(start.Year, start.Month, start.Day, 0, 0, 0);
260新增: end = new DateTime(end.Year, end.Month, end.Day, 23, 59, 59);
261新增: }
262新增: using (var db = _database.GetReaderContext())
263新增: {
264新增: var data = db.WebBrowserLogs
265新增: .Where(m => m.LogTime >= start && m.LogTime <= end && m.SiteId != 0)
266新增: .GroupBy(m => m.SiteId)
267新增: .Select(s => new
268新增: {
269新增: Title = s.FirstOrDefault().Site.Title,
270新增: Domain = s.FirstOrDefault().Site.Domain,
271新增: CategoryID = s.FirstOrDefault().Site.CategoryID,
272新增: IconFile = s.FirstOrDefault().Site.IconFile,
273新增: ID = s.FirstOrDefault().Site.ID,
274新增: Duration = s.Sum(m => m.Duration),
275新增: });
276新增:
277新增: if (skip > 0 && take > 0)
278新增: {
279新增: data = data.OrderByDescending(m => m.Duration).Skip(skip).Take(take);
280新增: }
281新增: else if (skip > 0)
282新增: {
283新增: data = data.OrderByDescending(m => m.Duration).Skip(skip);
284新增: }
285新增: else if (take > 0)
286新增: {
287新增: data = data.OrderByDescending(m => m.Duration).Take(take);
288新增: }
289新增: else
290新增: {
291新增: data = data.OrderByDescending(m => m.Duration);
292新增: }
293新增: var result = JsonConvert.DeserializeObject<List<WebSiteModel>>(JsonConvert.SerializeObject(data.ToList()));
294新增: return result;
295新增: }
296新增: }
297新增:
298新增:
299新增: #endregion
300新增:
301新增: #region GetWebSiteCategories
302新增: public List<WebSiteCategoryModel> GetWebSiteCategories()
303新增: {
304新增: using (var db = _database.GetReaderContext())
305新增: {
306新增: var result = db.WebSiteCategories.ToList();
307新增: return result;
308新增: }
309新增: }
310新增:
311新增:
312新增: #endregion
313新增:
314新增: #region CreateWebSiteCategory
315新增: public WebSiteCategoryModel CreateWebSiteCategory(WebSiteCategoryModel data_)
316新增: {
317新增: using (var db = _database.GetWriterContext())
318新增: {
319新增: var result = db.WebSiteCategories.Add(data_);
320新增: db.SaveChanges();
321新增: _database.CloseWriter();
322新增: return result;
323新增: }
324新增: }
325新增: #endregion
326新增:
327新增: #region UpdateWebSiteCategory
328新增: public void UpdateWebSiteCategory(WebSiteCategoryModel data_)
329新增: {
330新增: using (var db = _database.GetWriterContext())
331新增: {
332新增: db.Entry(data_).State = System.Data.Entity.EntityState.Modified;
333新增: db.SaveChanges();
334新增: _database.CloseWriter();
335新增: }
336新增: }
337新增: #endregion
338新增:
339新增: #region DeleteWebSiteCategory
340新增: public void DeleteWebSiteCategory(WebSiteCategoryModel data_)
341新增: {
342新增: Task.Run(() =>
343新增: {
344新增: using (var db = _database.GetWriterContext())
345新增: {
346新增: // 取消网站关联分类
347新增: db.Database.ExecuteSqlCommand("update WebSiteModels set CategoryID=0 where CategoryID=" + data_.ID);
348新增:
349新增: // 删除分类
350新增: db.Entry(data_).State = System.Data.Entity.EntityState.Deleted;
351新增: db.SaveChanges();
352新增: _database.CloseWriter();
353新增: }
354新增: });
355新增: }
356新增: #endregion
357新增: #region GetWebSites
358新增: public List<WebSiteModel> GetWebSites(int categoryId_)
359新增: {
360新增: using (var db = _database.GetReaderContext())
361新增: {
362新增: var result = db.WebSites.Where(m => m.CategoryID == categoryId_).ToList();
363新增: return result;
364新增: }
365新增: }
366新增: #endregion
367新增: #region GetWebSitesCount
368新增: public int GetWebSitesCount(int categoryId_)
369新增: {
370新增: using (var db = _database.GetReaderContext())
371新增: {
372新增: var result = db.WebSites.Where(m => m.CategoryID == categoryId_).Count();
373新增: return result;
374新增: }
375新增: }
376新增:
377新增:
378新增:
379新增: //public List<WebSiteModel> GetWebSites(Expression<Func<WebSiteModel, bool>> predicate_)
380新增: //{
381新增: // using (var db = new TaiDbContext())
382新增: // {
383新增: // return db.WebSites.Where(predicate_).ToList();
384新增: // }
385新增: //}
386新增: #endregion
387新增: #region GetUnSetCategoryWebSites
388新增: public List<WebSiteModel> GetUnSetCategoryWebSites()
389新增: {
390新增: using (var db = _database.GetReaderContext())
391新增: {
392新增: var result = db.WebSites.Where(m => m.CategoryID == 0).ToList();
393新增: return result;
394新增: }
395新增: }
396新增:
397新增:
398新增: #endregion
399新增:
400新增: public void UpdateWebSitesCategory(int[] siteIds_, int categoryId_)
401新增: {
402新增: Task.Run(() =>
403新增: {
404新增: using (var db = _database.GetWriterContext())
405新增: {
406新增: string sql = $"update WebSiteModels set CategoryID={categoryId_} where ID in ({string.Join(",", siteIds_)})";
407新增: db.Database.ExecuteSqlCommand(sql);
408新增: db.SaveChanges();
409新增: _database.CloseWriter();
410新增: }
411新增: });
412新增: }
413新增:
414新增: public List<CommonDataModel> GetCategoriesStatistics(DateTime start_, DateTime end_)
415新增: {
416新增: using (var db = _database.GetReaderContext())
417新增: {
418新增: var sql = "select sum(WebBrowseLogModels.Duration) as Value,WebSiteCategoryModels.ID as ID,WebSiteCategoryModels.Name as Name from WebBrowseLogModels join WebSiteModels on WebBrowseLogModels.SiteId=WebSiteModels.ID JOIN WebSiteCategoryModels on WebSiteModels.CategoryID=WebSiteCategoryModels.ID WHERE WebBrowseLogModels.LogTime>='" + start_.ToString("yyyy-MM-dd 00:00:00") + "' and WebBrowseLogModels.LogTime<= '" + end_.ToString("yyyy-MM-dd 23:59:59") + "' GROUP BY WebSiteCategoryModels.ID";
419新增:
420新增: var data = db.Database.SqlQuery<CommonDataModel>(sql).ToList();
421新增: // 未分类
422新增:
423新增: sql = "select sum(WebBrowseLogModels.Duration) as Value,WebSiteModels.CategoryID as ID,WebSiteModels.Title as Name from WebBrowseLogModels left join WebSiteModels on WebBrowseLogModels.SiteId=WebSiteModels.ID WHERE WebSiteModels.CategoryID=0 AND WebBrowseLogModels.LogTime>='" + start_.ToString("yyyy-MM-dd 00:00:00") + "' and WebBrowseLogModels.LogTime<= '" + end_.ToString("yyyy-MM-dd 23:59:59") + "' Group BY WebSiteModels.CategoryID";
424新增: var noCategoryData = db.Database.SqlQuery<CommonDataModel>(sql).ToList();
425新增: var result = data.Concat(noCategoryData).ToList();
426新增: return result;
427新增: }
428新增: }
429新增:
430新增: public WebSiteCategoryModel GetWebSiteCategory(int categoryId_)
431新增: {
432新增: using (var db = _database.GetReaderContext())
433新增: {
434新增: var result = db.WebSiteCategories.Where(m => m.ID == categoryId_).FirstOrDefault();
435新增: return result;
436新增: }
437新增: }
438新增:
439新增: public List<CommonDataModel> GetBrowseDataStatistics(DateTime start_, DateTime end_, int siteId_ = 0)
440新增: {
441新增: using (var db = _database.GetReaderContext())
442新增: {
443新增: var start = new DateTime(start_.Year, start_.Month, start_.Day, 0, 0, 0);
444新增: var end = new DateTime(end_.Year, end_.Month, end_.Day, 23, 59, 59);
445新增: var dbResult = db.WebBrowserLogs.Where(m => m.LogTime >= start && m.LogTime <= end);
446新增: if (siteId_ > 0)
447新增: {
448新增: dbResult = dbResult.Where(m => m.SiteId == siteId_);
449新增: }
450新增:
451新增: var data = dbResult.GroupBy(m => m.LogTime)
452新增: .Select(m => new
453新增: {
454新增: Value = m.Sum(s => s.Duration),
455新增: Time = m.FirstOrDefault().LogTime
456新增: }).ToList();
457新增:
458新增: var result = new List<CommonDataModel>();
459新增:
460新增: if (start_ == end_)
461新增: {
462新增:
463新增: // 获取24小时数据
464新增: for (int i = 0; i < 24; i++)
465新增: {
466新增: var time = new DateTime(start_.Year, start_.Month, start_.Day, i, 0, 0);
467新增: var item = data.Where(m => m.Time == time).FirstOrDefault();
468新增: var dataItem = new CommonDataModel()
469新增: {
470新增: ID = i,
471新增: Name = i.ToString(),
472新增: Value = item != null ? item.Value : 0,
473新增: };
474新增: result.Add(dataItem);
475新增: }
476新增: }
477新增: else
478新增: {
479新增: // 获取日期范围数据
480新增: var days = (end_ - start_).TotalDays + 1;
481新增: if (days <= 31)
482新增: {
483新增: // 按天
484新增: for (int i = 0; i < days; i++)
485新增: {
486新增: var date = start_.AddDays(i);
487新增: var startTime = new DateTime(date.Year, date.Month, date.Day, 0, 0, 0);
488新增: var endTime = new DateTime(date.Year, date.Month, date.Day, 23, 59, 59);
489新增:
490新增: var value = data.Where(m => m.Time >= startTime && m.Time <= endTime).Sum(m => m.Value);
491新增: var dataItem = new CommonDataModel()
492新增: {
493新增: ID = i,
494新增: Name = i.ToString(),
495新增: Value = value,
496新增: };
497新增: result.Add(dataItem);
498新增: }
499新增: }
500新增: else
501新增: {
502新增: // 按月
503新增: for (int i = 0; i < 12; i++)
504新增: {
505新增: var date = new DateTime(start_.Year, i + 1, 1, 0, 0, 0);
506新增: var startTime = new DateTime(date.Year, date.Month, 1, 0, 0, 0);
507新增: var endTime = new DateTime(date.Year, date.Month, DateTime.DaysInMonth(date.Year, date.Month), 23, 59, 59);
508新增:
509新增: var value = data.Where(m => m.Time >= startTime && m.Time <= endTime).Sum(m => m.Value);
510新增: var dataItem = new CommonDataModel()
511新增: {
512新增: ID = i,
513新增: Name = i.ToString(),
514新增: Value = value,
515新增: };
516新增: result.Add(dataItem);
517新增: }
518新增: }
519新增: }
520新增: return result;
521新增: }
522新增: }
523新增:
524新增: private class CategoryStatisticModel
525新增: {
526新增: public int Duration { get; set; }
527新增: public DateTime LogTime { get; set; }
528新增: public int CategoryID { get; set; }
529新增: }
530新增: public List<ColumnDataModel> GetBrowseDataByCategoryStatistics(DateTime start_, DateTime end_)
531新增: {
532新增: using (var db = _database.GetReaderContext())
533新增: {
534新增:
535新增:
536新增: var start = new DateTime(start_.Year, start_.Month, start_.Day, 0, 0, 0);
537新增: var end = new DateTime(end_.Year, end_.Month, end_.Day, 23, 59, 59);
538新增:
539新增: // 查询分类
540新增: var categorySql = "select sum(WebBrowseLogModels.Duration) as Duration,LogTime,WebSiteModels.CategoryID as CategoryID from WebBrowseLogModels LEFT JOIN WebSiteModels on WebBrowseLogModels.SiteId=WebSiteModels.ID LEFT JOIN WebSiteCategoryModels on WebSiteModels.CategoryID=WebSiteCategoryModels.ID WHERE LogTime>='" + start.ToString("yyyy-MM-dd 00:00:00") + "' and LogTime<= '" + end.ToString("yyyy-MM-dd 23:59:59") + "' GROUP BY WebSiteModels.CategoryID";
541新增:
542新增: var categories = db.Database.SqlQuery<CategoryStatisticModel>(categorySql).ToList();
543新增:
544新增: // 查询数据
545新增: var dataSql = "select sum(WebBrowseLogModels.Duration) as Duration,LogTime,WebSiteModels.CategoryID as CategoryID from WebBrowseLogModels LEFT JOIN WebSiteModels on WebBrowseLogModels.SiteId=WebSiteModels.ID LEFT JOIN WebSiteCategoryModels on WebSiteModels.CategoryID=WebSiteCategoryModels.ID WHERE LogTime>='" + start.ToString("yyyy-MM-dd 00:00:00") + "' and LogTime<= '" + end.ToString("yyyy-MM-dd 23:59:59") + "' GROUP BY WebBrowseLogModels.LogTime,WebSiteModels.CategoryID";
546新增:
547新增: var data = db.Database.SqlQuery<CategoryStatisticModel>(dataSql).ToList();
548新增: var result = new List<ColumnDataModel>();
549新增:
550新增: if (start_ == end_)
551新增: {
552新增: // 获取24小时数据
553新增: foreach (var category in categories)
554新增: {
555新增: result.Add(new ColumnDataModel()
556新增: {
557新增: CategoryID = category.CategoryID,
558新增: Values = new double[24]
559新增: });
560新增: }
561新增: for (int i = 0; i < 24; i++)
562新增: {
563新增: var time = new DateTime(start_.Year, start_.Month, start_.Day, i, 0, 0);
564新增: foreach (var category in categories)
565新增: {
566新增: var log = data.Where(m => m.CategoryID == category.CategoryID && m.LogTime == time).FirstOrDefault();
567新增: if (log != null)
568新增: {
569新增: var resultItem = result.Where(m => m.CategoryID == category.CategoryID).FirstOrDefault();
570新增: resultItem.Values[i] = log.Duration;
571新增: }
572新增: }
573新增: }
574新增: }
575新增: else
576新增: {
577新增: // 获取日期范围数据
578新增: int days = (int)(end_ - start_).TotalDays + 1;
579新增: if (days <= 31)
580新增: {
581新增: // 按天
582新增: foreach (var category in categories)
583新增: {
584新增: result.Add(new ColumnDataModel()
585新增: {
586新增: CategoryID = category.CategoryID,
587新增: Values = new double[days]
588新增: });
589新增: }
590新增:
591新增: for (int i = 0; i < days; i++)
592新增: {
593新增: var date = start_.AddDays(i);
594新增: var startTime = new DateTime(date.Year, date.Month, date.Day, 0, 0, 0);
595新增: var endTime = new DateTime(date.Year, date.Month, date.Day, 23, 59, 59);
596新增:
597新增: foreach (var category in categories)
598新增: {
599新增: var duration = data.Where(m => m.CategoryID == category.CategoryID && m.LogTime >= startTime && m.LogTime <= endTime).Sum(m => m.Duration);
600新增:
601新增: var resultItem = result.Where(m => m.CategoryID == category.CategoryID).FirstOrDefault();
602新增: resultItem.Values[i] = duration;
603新增: }
604新增: }
605新增: }
606新增: else
607新增: {
608新增: // 按月
609新增: foreach (var category in categories)
610新增: {
611新增: result.Add(new ColumnDataModel()
612新增: {
613新增: CategoryID = category.CategoryID,
614新增: Values = new double[12]
615新增: });
616新增: }
617新增: for (int i = 0; i < 12; i++)
618新增: {
619新增: var date = new DateTime(start_.Year, i + 1, 1, 0, 0, 0);
620新增: var startTime = new DateTime(date.Year, date.Month, 1, 0, 0, 0);
621新增: var endTime = new DateTime(date.Year, date.Month, DateTime.DaysInMonth(date.Year, date.Month), 23, 59, 59);
622新增:
623新增: foreach (var category in categories)
624新增: {
625新增: var duration = data.Where(m => m.CategoryID == category.CategoryID && m.LogTime >= startTime && m.LogTime <= endTime).Sum(m => m.Duration);
626新增:
627新增: var resultItem = result.Where(m => m.CategoryID == category.CategoryID).FirstOrDefault();
628新增: resultItem.Values[i] = duration;
629新增: }
630新增: }
631新增: }
632新增: }
633新增: return result;
634新增: }
635新增: }
636新增:
637新增: public int GetBrowseDurationTotal(DateTime start_, DateTime end_)
638新增: {
639新增: start_ = new DateTime(start_.Year, start_.Month, start_.Day, 0, 0, 0);
640新增: end_ = new DateTime(end_.Year, end_.Month, end_.Day, 23, 59, 59);
641新增:
642新增: using (var db = _database.GetReaderContext())
643新增: {
644新增: var data = db.WebBrowserLogs.Where(m => m.LogTime >= start_ && m.LogTime <= end_);
645新增: var result = data.Any() ? data.Sum(m => m.Duration) : 0;
646新增: return result;
647新增: }
648新增: }
649新增:
650新增: public int GetBrowseSitesTotal(DateTime start_, DateTime end_)
651新增: {
652新增: start_ = new DateTime(start_.Year, start_.Month, start_.Day, 0, 0, 0);
653新增: end_ = new DateTime(end_.Year, end_.Month, end_.Day, 23, 59, 59);
654新增: using (var db = _database.GetReaderContext())
655新增: {
656新增: var result = db.WebBrowserLogs.Where(m => m.LogTime >= start_ && m.LogTime <= end_).GroupBy(m => m.SiteId).Count();
657新增: return result;
658新增: }
659新增: }
660新增:
661新增: public int GetBrowsePagesTotal(DateTime start_, DateTime end_)
662新增: {
663新增: start_ = new DateTime(start_.Year, start_.Month, start_.Day, 0, 0, 0);
664新增: end_ = new DateTime(end_.Year, end_.Month, end_.Day, 23, 59, 59);
665新增: using (var db = _database.GetReaderContext())
666新增: {
667新增: var result = db.WebBrowserLogs.Where(m => m.LogTime >= start_ && m.LogTime <= end_).GroupBy(m => m.UrlId).Count();
668新增: return result;
669新增: }
670新增: }
671新增:
672新增: public List<WebBrowseLogModel> GetBrowseLogList(DateTime start_, DateTime end_, int siteId_ = 0)
673新增: {
674新增: start_ = new DateTime(start_.Year, start_.Month, start_.Day, 0, 0, 0);
675新增: end_ = new DateTime(end_.Year, end_.Month, end_.Day, 23, 59, 59);
676新增: using (var db = _database.GetReaderContext())
677新增: {
678新增: var query = (from log in db.WebBrowserLogs
679新增: join url in db.WebUrls on log.UrlId equals url.ID
680新增: join site in db.WebSites on log.SiteId equals site.ID
681新增: where log.LogTime >= start_ && log.LogTime <= end_ && log.SiteId == siteId_
682新增: orderby log.LogTime descending
683新增: select new
684新增: {
685新增: Duration = log.Duration,
686新增: ID = log.ID,
687新增: LogTime = log.LogTime,
688新增: Site = site,
689新增: SiteId = log.SiteId,
690新增: Url = url,
691新增: UrlId = log.UrlId,
692新增: }).ToList().Select(s => new WebBrowseLogModel
693新增: {
694新增: Duration = s.Duration,
695新增: ID = s.ID,
696新增: LogTime = s.LogTime,
697新增: Site = s.Site,
698新增: SiteId = s.SiteId,
699新增: Url = s.Url,
700新增: UrlId = s.UrlId,
701新增: });
702新增:
703新增: var result = query.ToList();
704新增: return result;
705新增: }
706新增: }
707新增:
708新增: public WebSiteModel GetWebSite(int id_)
709新增: {
710新增: using (var db = _database.GetReaderContext())
711新增: {
712新增: var result = db.WebSites.Where(m => m.ID == id_).FirstOrDefault();
713新增: return result;
714新增: }
715新增: }
716新增:
717新增: public WebSiteModel GetWebSite(string domain)
718新增: {
719新增: using (var db = _database.GetReaderContext())
720新增: {
721新增: var result = db.WebSites.Where(m => m.Domain.ToLower() == domain.ToLower()).FirstOrDefault();
722新增: return result;
723新增: }
724新增: }
725新增:
726新增: public void Clear(DateTime start_, DateTime end_)
727新增: {
728新增: end_ = new DateTime(end_.Year, end_.Month, DateTime.DaysInMonth(end_.Year, end_.Month));
729新增:
730新增: using (var db = _database.GetReaderContext())
731新增: {
732新增: //db.Database.ExecuteSqlCommand("update WebSiteModels set Duration=0");
733新增:
734新增: db.Database.ExecuteSqlCommand("delete from WebBrowseLogModels where LogTime>='" + start_.Date.ToString("yyyy-MM-01 00:00:00") + "' and LogTime<= '" + end_.Date.ToString("yyyy-MM-dd 23:59:59") + "'");
735新增: }
736新增: }
737新增:
738新增: public List<WebSiteModel> GetWebSiteLogList(DateTime start_, DateTime end_)
739新增: {
740新增: start_ = new DateTime(start_.Year, start_.Month, start_.Day, 0, 0, 0);
741新增: end_ = new DateTime(end_.Year, end_.Month, end_.Day, 23, 59, 59);
742新增: using (var db = _database.GetReaderContext())
743新增: {
744新增: var query = (from log in db.WebBrowserLogs
745新增: where log.LogTime >= start_ && log.LogTime <= end_
746新增: join site in db.WebSites on log.SiteId equals site.ID into newSite
747新增: join category in db.WebSiteCategories on log.Site.CategoryID equals category.ID into newCategory
748新增: from nc in newCategory.DefaultIfEmpty()
749新增: select new
750新增: {
751新增: ID = log.ID,
752新增: UrlId = log.UrlId,
753新增: Duration = log.Duration,
754新增: SiteId = log.SiteId,
755新增: Site = log.Site,
756新增: Category = nc
757新增: })
758新增: .ToList();
759新增: var result = query.GroupBy(m => m.SiteId).Select(s => new WebSiteModel
760新增: {
761新增: Duration = s.Sum(m => m.Duration),
762新增: ID = s.FirstOrDefault().Site.ID,
763新增: Title = s.FirstOrDefault().Site.Title,
764新增: Domain = s.FirstOrDefault().Site.Domain,
765新增: IconFile = s.FirstOrDefault().Site.IconFile,
766新增: CategoryID = s.FirstOrDefault().Site.CategoryID,
767新增: Category = s.FirstOrDefault().Category,
768新增: }).ToList();
769新增:
770新增: //var result = query.Select(s => new WebSiteModel
771新增: //{
772新增: // Duration = s.Duration,
773新增: // ID = s.Site.ID,
774新增: // Title = s.Site.Title,
775新增: // Domain = s.Site.Domain,
776新增: // IconFile = s.Site.IconFile,
777新增: // //Category = s.Category,
778新增: // CategoryID = s.Site.CategoryID,
779新增: //}).ToList();
780新增: //return result;
781新增: //return query;
782新增: return result;
783新增: }
784新增: }
785新增: }
786新增:}
文件末尾没有换行
新增Core/Servicers/Instances/WebFilter.cs+86 −0看文件
@@ -0,0 +1,86 @@
1新增:using Core.Librarys;
2新增:using Core.Librarys.Browser;
3新增:using Core.Servicers.Interfaces;
4新增:using System;
5新增:using System.Collections.Generic;
6新增:using System.Linq;
7新增:using System.Text;
8新增:using System.Text.RegularExpressions;
9新增:using System.Threading.Tasks;
10新增:
11新增:namespace Core.Servicers.Instances
12新增:{
13新增: public class WebFilter : IWebFilter
14新增: {
15新增: private readonly IAppConfig _appConfig;
16新增: private List<string> _ignoreURLCache;
17新增: public WebFilter(IAppConfig appConfig_)
18新增: {
19新增: _appConfig = appConfig_;
20新增: }
21新增:
22新增: public void Init()
23新增: {
24新增: _ignoreURLCache = new List<string>();
25新增: _appConfig.ConfigChanged += _appConfig_ConfigChanged;
26新增: }
27新增:
28新增: private void _appConfig_ConfigChanged(Models.Config.ConfigModel oldConfig, Models.Config.ConfigModel newConfig)
29新增: {
30新增: if (oldConfig.Behavior.IgnoreURLList != newConfig.Behavior.IgnoreURLList)
31新增: {
32新增: _ignoreURLCache.Clear();
33新增: }
34新增: }
35新增:
36新增: public bool IsIgnore(string url_)
37新增: {
38新增: if (_ignoreURLCache.Contains(url_))
39新增: {
40新增: return true;
41新增: }
42新增:
43新增: if (IsDomainIgnore(url_))
44新增: {
45新增: _ignoreURLCache.Add(url_);
46新增: return true;
47新增: }
48新增:
49新增: if (IsRegexIgnore(url_))
50新增: {
51新增: _ignoreURLCache.Add(url_);
52新增: return true;
53新增: }
54新增:
55新增: return false;
56新增: }
57新增:
58新增: public bool IsDomainIgnore(string url_)
59新增: {
60新增: url_ = UrlHelper.GetDomain(url_);
61新增:
62新增: var config = _appConfig.GetConfig();
63新增: var ignoreURLList = config.Behavior.IgnoreURLList;
64新增:
65新增: return ignoreURLList.Contains(url_);
66新增: }
67新增:
68新增: public bool IsRegexIgnore(string url_)
69新增: {
70新增: var config = _appConfig.GetConfig();
71新增: var ignoreURLList = config.Behavior.IgnoreURLList;
72新增:
73新增: // 从正则表达式验证过滤
74新增: var regexList = ignoreURLList.Where(m => Regex.IsMatch(m, @"[\*|\$|\!|\(|\)|\{|\\|\[|\^|\|]"));
75新增: foreach (string reg in regexList)
76新增: {
77新增: if (RegexHelper.IsMatch(url_, reg))
78新增: {
79新增: return true;
80新增: }
81新增: }
82新增:
83新增: return false;
84新增: }
85新增: }
86新增:}
新增Core/Servicers/Interfaces/IBrowserObserver.cs+29 −0看文件
@@ -0,0 +1,29 @@
1新增:using Core.Event;
2新增:using System;
3新增:using System.Collections.Generic;
4新增:using System.Linq;
5新增:using System.Text;
6新增:using System.Threading.Tasks;
7新增:
8新增:namespace Core.Servicers.Interfaces
9新增:{
10新增: /// <summary>
11新增: /// 浏览器观察服务
12新增: /// </summary>
13新增: public interface IBrowserObserver
14新增: {
15新增: /// <summary>
16新增: /// 启动观察
17新增: /// </summary>
18新增: void Start();
19新增: /// <summary>
20新增: /// 停止观察
21新增: /// </summary>
22新增: void Stop();
23新增:
24新增: /// <summary>
25新增: /// 站点切换时发生
26新增: /// </summary>
27新增: event BrowserObserverEventHandler OnSiteChanged;
28新增: }
29新增:}
新增Core/Servicers/Interfaces/IBrowserWatcher.cs+16 −0看文件
@@ -0,0 +1,16 @@
1新增:using Core.Event;
2新增:using System;
3新增:using System.Collections.Generic;
4新增:using System.Linq;
5新增:using System.Text;
6新增:using System.Threading.Tasks;
7新增:
8新增:namespace Core.Servicers.Interfaces
9新增:{
10新增: public interface IBrowserWatcher
11新增: {
12新增: event BrowserObserverEventHandler OnSiteChanged;
13新增: void StartWatch(IntPtr handle);
14新增: void StopWatch();
15新增: }
16新增:}
修改Core/Servicers/Interfaces/IData.cs+1 −1看文件
@@ -29,7 +29,7 @@ namespace Core.Servicers.Interfaces
2929 /// <param name="start"></param>
3030 /// <param name="end"></param>
3131 /// <returns></returns>
32删除: IEnumerable<DailyLogModel> GetDateRangelogList(DateTime start, DateTime end, int take = -1);
32新增: IEnumerable<DailyLogModel> GetDateRangelogList(DateTime start, DateTime end, int take = -1, int skip = -1);
3333
3434 /// <summary>
3535 /// 获取本周的数据
新增Core/Servicers/Interfaces/IDatabase.cs+17 −0看文件
@@ -0,0 +1,17 @@
1新增:using Core.Librarys.SQLite;
2新增:using System;
3新增:using System.Collections.Generic;
4新增:using System.Linq;
5新增:using System.Text;
6新增:using System.Threading.Tasks;
7新增:
8新增:namespace Core.Servicers.Interfaces
9新增:{
10新增: public interface IDatabase
11新增: {
12新增: TaiDbContext GetReaderContext();
13新增: //void CloseReader();
14新增: TaiDbContext GetWriterContext();
15新增: void CloseWriter();
16新增: }
17新增:}
新增Core/Servicers/Interfaces/IWebData.cs+160 −0看文件
@@ -0,0 +1,160 @@
1新增:using Core.Models.Data;
2新增:using Core.Models.Db;
3新增:using Core.Models.WebPage;
4新增:using System;
5新增:using System.Collections.Generic;
6新增:using System.Linq;
7新增:using System.Linq.Expressions;
8新增:using System.Text;
9新增:using System.Threading.Tasks;
10新增:
11新增:namespace Core.Servicers.Interfaces
12新增:{
13新增: public interface IWebData
14新增: {
15新增: /// <summary>
16新增: /// 添加链接浏览时长
17新增: /// </summary>
18新增: /// <param name="site_">链接</param>
19新增: /// <param name="time_">时长(秒)</param>
20新增: void AddUrlBrowseTime(Site site_, int duration_, DateTime? dateTime_ = null);
21新增: /// <summary>
22新增: /// 更新链接的图标
23新增: /// </summary>
24新增: /// <param name="site_"></param>
25新增: /// <param name="iconFile_">本地图标相对路径</param>
26新增: void UpdateUrlFavicon(Site site_, string iconFile_);
27新增:
28新增: /// <summary>
29新增: /// 获取日期范围的站点浏览数据(浏览时长降序排序)
30新增: /// </summary>
31新增: /// <param name="start">开始日期</param>
32新增: /// <param name="end">结束日期</param>
33新增: /// <param name="take">读取条数</param>
34新增: /// <param name="isTime">是否精确到时间</param>
35新增: /// <returns></returns>
36新增: List<WebSiteModel> GetDateRangeWebSiteList(DateTime start, DateTime end, int take = 0, int skip = -1, bool isTime_ = false);
37新增: /// <summary>
38新增: /// 获取网站所有分类
39新增: /// </summary>
40新增: /// <returns></returns>
41新增: List<WebSiteCategoryModel> GetWebSiteCategories();
42新增: /// <summary>
43新增: /// 创建网站分类
44新增: /// </summary>
45新增: /// <param name="data_"></param>
46新增: /// <returns></returns>
47新增: WebSiteCategoryModel CreateWebSiteCategory(WebSiteCategoryModel data_);
48新增: /// <summary>
49新增: /// 更新网站分类
50新增: /// </summary>
51新增: /// <param name="data_"></param>
52新增: /// <returns></returns>
53新增: void UpdateWebSiteCategory(WebSiteCategoryModel data_);
54新增: /// <summary>
55新增: /// 删除网站分类
56新增: /// </summary>
57新增: /// <param name="data_"></param>
58新增: void DeleteWebSiteCategory(WebSiteCategoryModel data_);
59新增: /// <summary>
60新增: /// 通过分类ID获取网站列表
61新增: /// </summary>
62新增: /// <param name="categoryId_"></param>
63新增: /// <returns></returns>
64新增: List<WebSiteModel> GetWebSites(int categoryId_);
65新增: /// <summary>
66新增: /// 通过分类ID获取网站总数
67新增: /// </summary>
68新增: /// <param name="categoryId_"></param>
69新增: /// <returns></returns>
70新增: int GetWebSitesCount(int categoryId_);
71新增: /// <summary>
72新增: /// 获取未设置分类的站点列表
73新增: /// </summary>
74新增: /// <returns></returns>
75新增: List<WebSiteModel> GetUnSetCategoryWebSites();
76新增: /// <summary>
77新增: /// 批量更新站点分类
78新增: /// </summary>
79新增: /// <param name="siteIds_"></param>
80新增: /// <param name="categoryId_"></param>
81新增: void UpdateWebSitesCategory(int[] siteIds_, int categoryId_);
82新增: /// <summary>
83新增: /// 获取指定时间段分类统计数据
84新增: /// </summary>
85新增: /// <param name="start_"></param>
86新增: /// <param name="end_"></param>
87新增: /// <returns></returns>
88新增: List<CommonDataModel> GetCategoriesStatistics(DateTime start_, DateTime end_);
89新增: /// <summary>
90新增: /// 通过分类ID获取分类数据
91新增: /// </summary>
92新增: /// <param name="categoryId_"></param>
93新增: /// <returns></returns>
94新增: WebSiteCategoryModel GetWebSiteCategory(int categoryId_);
95新增: /// <summary>
96新增: /// 获取指定时间段的浏览时长统计数据
97新增: /// </summary>
98新增: /// <param name="start_"></param>
99新增: /// <param name="end_"></param>
100新增: /// <returns></returns>
101新增: List<CommonDataModel> GetBrowseDataStatistics(DateTime start_, DateTime end_, int siteId_ = 0);
102新增: //List<WebSiteModel> GetWebSites(Expression<Func<WebSiteModel, bool>> predicate_);
103新增: /// <summary>
104新增: /// 获取指定时间段按照分类统计的浏览时长数据
105新增: /// </summary>
106新增: /// <param name="start_"></param>
107新增: /// <param name="end_"></param>
108新增: /// <returns></returns>
109新增: List<ColumnDataModel> GetBrowseDataByCategoryStatistics(DateTime start_, DateTime end_);
110新增: /// <summary>
111新增: /// 统计指定时间段的浏览时长
112新增: /// </summary>
113新增: /// <param name="start_"></param>
114新增: /// <param name="end_"></param>
115新增: /// <returns></returns>
116新增: int GetBrowseDurationTotal(DateTime start_, DateTime end_);
117新增: /// <summary>
118新增: /// 统计指定时间段的站点浏览数量
119新增: /// </summary>
120新增: /// <param name="start_"></param>
121新增: /// <param name="end_"></param>
122新增: /// <returns></returns>
123新增: int GetBrowseSitesTotal(DateTime start_, DateTime end_);
124新增: /// <summary>
125新增: /// 统计指定时间段的网页浏览数量
126新增: /// </summary>
127新增: /// <param name="start_"></param>
128新增: /// <param name="end_"></param>
129新增: /// <returns></returns>
130新增: int GetBrowsePagesTotal(DateTime start_, DateTime end_);
131新增: /// <summary>
132新增: /// 获取指定时间段的网页浏览记录
133新增: /// </summary>
134新增: /// <param name="start_"></param>
135新增: /// <param name="end_"></param>
136新增: /// <param name="siteId_"></param>
137新增: /// <returns></returns>
138新增: List<WebBrowseLogModel> GetBrowseLogList(DateTime start_, DateTime end_, int siteId_ = 0);
139新增: /// <summary>
140新增: /// 获取网站数据
141新增: /// </summary>
142新增: /// <param name="id_"></param>
143新增: /// <returns></returns>
144新增: WebSiteModel GetWebSite(int id_);
145新增: /// <summary>
146新增: /// 通过域名获取站点数据
147新增: /// </summary>
148新增: /// <param name="domain_"></param>
149新增: /// <returns></returns>
150新增: WebSiteModel GetWebSite(string domain_);
151新增: /// <summary>
152新增: /// 清空指定日期范围数据
153新增: /// </summary>
154新增: /// <param name="start_"></param>
155新增: /// <param name="end_"></param>
156新增: void Clear(DateTime start_, DateTime end_);
157新增:
158新增: List<WebSiteModel> GetWebSiteLogList(DateTime start_, DateTime end_);
159新增: }
160新增:}
新增Core/Servicers/Interfaces/IWebFilter.cs+38 −0看文件
@@ -0,0 +1,38 @@
1新增:using System;
2新增:using System.Collections.Generic;
3新增:using System.Linq;
4新增:using System.Text;
5新增:using System.Threading.Tasks;
6新增:
7新增:namespace Core.Servicers.Interfaces
8新增:{
9新增: /// <summary>
10新增: /// 网站过滤器
11新增: /// </summary>
12新增: public interface IWebFilter
13新增: {
14新增: /// <summary>
15新增: /// 初始化过滤器
16新增: /// </summary>
17新增: void Init();
18新增: /// <summary>
19新增: /// 指示输入的URL是否已被忽略
20新增: /// </summary>
21新增: /// <param name="url_">URL</param>
22新增: /// <returns>已被忽略返回True</returns>
23新增: bool IsIgnore(string url_);
24新增: /// <summary>
25新增: /// 指示输入的URL是否被域名配置忽略
26新增: /// </summary>
27新增: /// <param name="url_">URL</param>
28新增: /// <returns>已被忽略返回True</returns>
29新增: bool IsDomainIgnore(string url_);
30新增: /// <summary>
31新增: /// 指示输入的URL是否被正则表达式匹配忽略
32新增: /// </summary>
33新增: /// <param name="url_">URL</param>
34新增: /// <returns>已被忽略返回True</returns>
35新增: bool IsRegexIgnore(string url_);
36新增:
37新增: }
38新增:}
修改UI/App.xaml.cs+12 −2看文件
@@ -182,20 +182,25 @@ namespace UI
182182 private void ConfigureServices(IServiceCollection services)
183183 {
184184 // 核心服务
185新增: services.AddSingleton<IDatabase, Database>();
185186 services.AddSingleton<IAppObserver, AppObserver>();
187新增: services.AddSingleton<IBrowserObserver, BrowserObserver>();
186188 services.AddSingleton<IMain, Main>();
187189 services.AddSingleton<IData, Data>();
190新增: services.AddSingleton<IWebData, WebData>();
188191 services.AddSingleton<ISleepdiscover, Sleepdiscover>();
189192 services.AddSingleton<IAppConfig, AppConfig>();
190193 services.AddSingleton<IDateTimeObserver, DateTimeObserver>();
191194 services.AddSingleton<IAppData, AppData>();
192195 services.AddSingleton<ICategorys, Categorys>();
196新增: services.AddSingleton<IWebFilter, WebFilter>();
193197
194198 // UI服务
195199 services.AddSingleton<IAppContextMenuServicer, AppContextMenuServicer>();
196200 services.AddSingleton<IThemeServicer, ThemeServicer>();
197201 services.AddSingleton<IMainServicer, MainServicer>();
198202 services.AddSingleton<IInputServicer, InputServicer>();
203新增: services.AddSingleton<IWebSiteContextMenuServicer, WebSiteContextMenuServicer>();
199204
200205 // 主窗口
201206 services.AddSingleton<MainViewModel>();
@@ -224,10 +229,15 @@ namespace UI
224229 // 分类app
225230 services.AddTransient<CategoryAppListPage>();
226231 services.AddTransient<CategoryAppListPageVM>();
227删除:
232新增: // 分类站点
233新增: services.AddTransient<CategoryWebSiteListPage>();
234新增: services.AddTransient<CategoryWebSiteListPageVM>();
228235 // 图表
229236 services.AddTransient<ChartPage>();
230237 services.AddTransient<ChartPageVM>();
238新增: // 网站详情
239新增: services.AddTransient<WebSiteDetailPage>();
240新增: services.AddTransient<WebSiteDetailPageVM>();
231241 }
232242
233243 private void OnStartup(object sender, StartupEventArgs e)
@@ -242,7 +252,7 @@ namespace UI
242252 main.Start();
243253
244254 var observer = serviceProvider.GetService<IAppObserver>();
245删除: observer.OnAppActive += (p, d, f) =>
255新增: observer.OnAppActive += (args) =>
246256 {
247257 Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Background, new Action(() =>
248258 {
修改UI/Base/Color/Colors.cs+3 −2看文件
@@ -1,4 +1,5 @@
1删除:using System;
1新增:using Core;
2新增:using System;
23using System.Collections.Generic;
34using System.Text;
45using System.Windows.Media;
@@ -49,7 +50,7 @@ namespace UI.Base.Color
4950 {
5051 if (string.IsNullOrEmpty(color))
5152 {
52删除: return null;
53新增: color = StateData.ThemeColor;
5354 }
5455 return new SolidColorBrush((System.Windows.Media.Color)ColorConverter.ConvertFromString(color))
5556 {
新增UI/Controls/Base/DiffValue.cs+110 −0看文件
@@ -0,0 +1,110 @@
1新增:using System;
2新增:using System.Collections.Generic;
3新增:using System.Linq;
4新增:using System.Text;
5新增:using System.Threading.Tasks;
6新增:using System.Windows;
7新增:using System.Windows.Controls;
8新增:
9新增:namespace UI.Controls.Base
10新增:{
11新增: public class DiffValue : StackPanel
12新增: {
13新增: public enum DiffType
14新增: {
15新增: /// <summary>
16新增: /// 百分比
17新增: /// </summary>
18新增: Percent,
19新增: /// <summary>
20新增: /// 数字
21新增: /// </summary>
22新增: Number
23新增: }
24新增: public double Value
25新增: {
26新增: get { return (double)GetValue(ValueProperty); }
27新增: set { SetValue(ValueProperty, value); }
28新增: }
29新增: public static readonly DependencyProperty ValueProperty =
30新增: DependencyProperty.Register("Value",
31新增: typeof(double),
32新增: typeof(DiffValue), new PropertyMetadata(new PropertyChangedCallback(OnPropertyChanged)));
33新增: public double LastValue
34新增: {
35新增: get { return (double)GetValue(LastValueProperty); }
36新增: set { SetValue(LastValueProperty, value); }
37新增: }
38新增: public static readonly DependencyProperty LastValueProperty =
39新增: DependencyProperty.Register("LastValue",
40新增: typeof(double),
41新增: typeof(DiffValue), new PropertyMetadata(new PropertyChangedCallback(OnPropertyChanged)));
42新增: public DiffType Type
43新增: {
44新增: get { return (DiffType)GetValue(TypeProperty); }
45新增: set { SetValue(TypeProperty, value); }
46新增: }
47新增: public static readonly DependencyProperty TypeProperty =
48新增: DependencyProperty.Register("Type",
49新增: typeof(DiffType),
50新增: typeof(DiffValue), new PropertyMetadata(DiffType.Percent, new PropertyChangedCallback(OnPropertyChanged)));
51新增:
52新增: private static void OnPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
53新增: {
54新增: var control = d as DiffValue;
55新增: control.Render();
56新增: }
57新增:
58新增: public DiffValue()
59新增: {
60新增: DefaultStyleKey = typeof(DiffValue);
61新增: Orientation = Orientation.Horizontal;
62新增: Render();
63新增: }
64新增:
65新增:
66新增:
67新增: private void Render()
68新增: {
69新增: Children.Clear();
70新增:
71新增: double diffValue = Value - LastValue;
72新增: double result = Type == DiffType.Percent ? diffValue / LastValue * 100 : diffValue;
73新增: if (Value > 0 && LastValue <= 0)
74新增: {
75新增: result = Type == DiffType.Percent ? 100 : Value;
76新增: }
77新增: else if (Value == LastValue)
78新增: {
79新增: result = 0;
80新增: }
81新增: var text = new TextBlock();
82新增: text.Text = Type == DiffType.Percent ? Math.Abs(result).ToString("f2") + "%" : Math.Abs(result).ToString();
83新增: text.VerticalAlignment = VerticalAlignment.Center;
84新增:
85新增: var icon = new Icon();
86新增: icon.FontSize = 10;
87新增: icon.VerticalAlignment = VerticalAlignment.Center;
88新增:
89新增: if (result > 0)
90新增: {
91新增: icon.IconType = IconTypes.ArrowUp8;
92新增: Children.Add(icon);
93新增: Children.Add(text);
94新增: }
95新增: else if (result < 0)
96新增: {
97新增: icon.IconType = IconTypes.ArrowDown8;
98新增: Children.Add(icon);
99新增: Children.Add(text);
100新增: }
101新增: else
102新增: {
103新增: icon.IconType = IconTypes.SubtractBold;
104新增: Children.Add(icon);
105新增: }
106新增:
107新增:
108新增: }
109新增: }
110新增:}
修改UI/Controls/Base/Img.cs+9 −7看文件
@@ -74,18 +74,20 @@ namespace UI.Controls.Base
7474
7575 private void Handle(string path)
7676 {
77删除: if (path != null && path.Length > 8 && path.Substring(0, 8) == "AppIcons")
77新增: string defaultIconFile = "pack://application:,,,/Tai;component/Resources/Icons/defaultIcon.png";
78新增: if (string.IsNullOrEmpty(path))
7879 {
79删除: Src = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, path);
80新增: Src = defaultIconFile;
81新增: return;
8082 }
81删除: else if (path == null || (path.IndexOf("pack://") == -1 && !File.Exists(path)))
82删除: {
83删除: Src = "pack://application:,,,/Tai;component/Resources/Icons/defaultIcon.png";
84删除: }
85删除: else
83新增: if (path.IndexOf("pack:") != -1)
8684 {
8785 Src = path;
86新增: return;
8887 }
88新增:
89新增: string src = path.IndexOf(":") != -1 ? path : System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, path);
90新增: Src = File.Exists(src) ? src : defaultIconFile;
8991 }
9092
9193 }
修改UI/Controls/Base/View.cs+3 −2看文件
@@ -77,8 +77,9 @@ namespace UI.Controls.Base
7777
7878 if (Condition.IndexOf("=") != -1)
7979 {
80删除: string val = Condition.Substring(Condition.IndexOf("=") + 1);
81删除: isShow = val == (Value == null ? string.Empty : Value.ToString());
80新增: string conditionVal = Condition.Substring(Condition.IndexOf("=") + 1);
81新增: string value = (Value == null ? string.Empty : Value.ToString());
82新增: isShow = Condition.Contains("!") ? conditionVal != value : conditionVal == value;
8283 }
8384 else if (Condition.IndexOf("not null") != -1)
8485 {
新增UI/Controls/Converters/DateTimeConverter.cs+41 −0看文件
@@ -0,0 +1,41 @@
1新增:using Core.Librarys;
2新增:using System;
3新增:using System.Collections.Generic;
4新增:using System.Globalization;
5新增:using System.Linq;
6新增:using System.Text;
7新增:using System.Threading.Tasks;
8新增:using System.Windows.Data;
9新增:using System.Windows.Media;
10新增:
11新增:namespace UI.Controls.Converters
12新增:{
13新增: [ValueConversion(typeof(object), typeof(string))]
14新增: public class DateTimeConverter : IValueConverter
15新增: {
16新增: public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
17新增: {
18新增: if (!(value is DateTime))
19新增: {
20新增: return "参数错误";
21新增: }
22新增: var dateTime = (DateTime)value;
23新增: string pre = dateTime.ToString("yyyy年MM月dd日");
24新增: if (dateTime.Date == DateTime.Now.Date)
25新增: {
26新增: pre = "今天";
27新增: }
28新增: else if (dateTime.Date == DateTime.Now.Date.AddDays(-1).Date)
29新增: {
30新增: pre = "昨天";
31新增: }
32新增:
33新增: return $"{pre} {dateTime.ToString("HH点")}";
34新增: }
35新增:
36新增: public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
37新增: {
38新增: throw new NotImplementedException();
39新增: }
40新增: }
41新增:}
新增UI/Controls/Converters/GetCountConverter.cs+28 −0看文件
@@ -0,0 +1,28 @@
1新增:using System;
2新增:using System.Collections;
3新增:using System.Collections.Generic;
4新增:using System.Globalization;
5新增:using System.Linq;
6新增:using System.Text;
7新增:using System.Threading.Tasks;
8新增:using System.Windows.Data;
9新增:using System.Windows.Media;
10新增:
11新增:namespace UI.Controls.Converters
12新增:{
13新增: [ValueConversion(typeof(object), typeof(string))]
14新增: public class GetCountConverter : IValueConverter
15新增: {
16新增: public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
17新增: {
18新增: if (value == null) return "0";
19新增: var list = value as IEnumerable<object>;
20新增: return list == null ? "0" : list.Count().ToString();
21新增: }
22新增:
23新增: public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
24新增: {
25新增: throw new NotImplementedException();
26新增: }
27新增: }
28新增:}
新增UI/Controls/Converters/TimeConverter.cs+26 −0看文件
@@ -0,0 +1,26 @@
1新增:using Core.Librarys;
2新增:using System;
3新增:using System.Collections.Generic;
4新增:using System.Globalization;
5新增:using System.Linq;
6新增:using System.Text;
7新增:using System.Threading.Tasks;
8新增:using System.Windows.Data;
9新增:using System.Windows.Media;
10新增:
11新增:namespace UI.Controls.Converters
12新增:{
13新增: [ValueConversion(typeof(object), typeof(string))]
14新增: public class TimeConverter : IValueConverter
15新增: {
16新增: public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
17新增: {
18新增: return Time.ToString(int.Parse(value.ToString()));
19新增: }
20新增:
21新增: public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
22新增: {
23新增: throw new NotImplementedException();
24新增: }
25新增: }
26新增:}
修改UI/Controls/SettingPanel/SettingPanel.cs+4 −9看文件
@@ -362,9 +362,7 @@ namespace UI.Controls.SettingPanel
362362 };
363363
364364 var item = new SettingPanelItem();
365删除: item.Name = configAttribute.Name;
366删除: item.Description = configAttribute.Description;
367删除: item.Content = control;
365新增: item.Init(configAttribute, control);
368366
369367 pi.SetValue(configData, pi.GetValue(Data));
370368 return item;
@@ -413,9 +411,7 @@ namespace UI.Controls.SettingPanel
413411 //inputControl.IsChecked = (bool)pi.GetValue(Data);
414412
415413 var item = new SettingPanelItem();
416删除: item.Name = configAttribute.Name;
417删除: item.Description = configAttribute.Description;
418删除: item.Content = control;
414新增: item.Init(configAttribute, control);
419415
420416 pi.SetValue(configData, pi.GetValue(Data));
421417 return item;
@@ -435,9 +431,8 @@ namespace UI.Controls.SettingPanel
435431 inputControl.IsChecked = (bool)pi.GetValue(Data);
436432
437433 var item = new SettingPanelItem();
438删除: item.Name = configAttribute.Name;
439删除: item.Description = configAttribute.Description;
440删除: item.Content = inputControl;
434新增: item.Init(configAttribute, inputControl);
435新增:
441436 pi.SetValue(configData, pi.GetValue(Data));
442437 return item;
443438 }
修改UI/Controls/SettingPanel/SettingPanelItem.cs+14 −0看文件
@@ -23,10 +23,24 @@ namespace UI.Controls.SettingPanel
2323 public object Content { get { return (object)GetValue(ContentProperty); } set { SetValue(ContentProperty, value); } }
2424 public static readonly DependencyProperty ContentProperty = DependencyProperty.Register("Content", typeof(object), typeof(SettingPanelItem));
2525
26新增: /// <summary>
27新增: /// 是否显示beta标识
28新增: /// </summary>
29新增: public bool IsBeta { get { return (bool)GetValue(IsBetaProperty); } set { SetValue(IsBetaProperty, value); } }
30新增: public static readonly DependencyProperty IsBetaProperty = DependencyProperty.Register("IsBeta", typeof(bool), typeof(SettingPanelItem));
31新增:
2632 public SettingPanelItem()
2733 {
2834 DefaultStyleKey = typeof(SettingPanelItem);
2935 }
36新增:
37新增: public void Init(ConfigAttribute configAttribute_, object content_)
38新增: {
39新增: Name = configAttribute_.Name;
40新增: Description = configAttribute_.Description;
41新增: IsBeta = configAttribute_.IsBeta;
42新增: Content = content_;
43新增: }
3044 public override void OnApplyTemplate()
3145 {
3246 base.OnApplyTemplate();
修改UI/Models/CategoryPageModel.cs+16 −3看文件
@@ -1,4 +1,5 @@
1删除:using System;
1新增:using Core.Models.Db;
2新增:using System;
23using System.Collections.Generic;
34using System.Collections.ObjectModel;
45using System.Linq;
@@ -18,8 +19,8 @@ namespace UI.Models
1819 set { Data_ = value; OnPropertyChanged(); }
1920 }
2021
21删除: private CategoryModel SelectedItem_;
22删除: public CategoryModel SelectedItem { get { return SelectedItem_; } set { SelectedItem_ = value; OnPropertyChanged(); } }
22新增: private CategoryModel SelectedAppCategoryItem_;
23新增: public CategoryModel SelectedAppCategoryItem { get { return SelectedAppCategoryItem_; } set { SelectedAppCategoryItem_ = value; OnPropertyChanged(); } }
2324
2425
2526 private Visibility EditVisibility_ = Visibility.Collapsed;
@@ -58,5 +59,17 @@ namespace UI.Models
5859
5960 private string EditColor_;
6061 public string EditColor { get { return EditColor_; } set { EditColor_ = value; OnPropertyChanged(); } }
62新增:
63新增: public class WebCategoryModel
64新增: {
65新增: public WebSiteCategoryModel Data { get; set; }
66新增: public int Count { get; set; }
67新增: }
68新增:
69新增: private ObservableCollection<WebCategoryModel> WebCategoryData_;
70新增: public ObservableCollection<WebCategoryModel> WebCategoryData { get { return WebCategoryData_; } set { WebCategoryData_ = value; OnPropertyChanged(); } }
71新增:
72新增: private WebCategoryModel SelectedWebCategoryItem_;
73新增: public WebCategoryModel SelectedWebCategoryItem { get { return SelectedWebCategoryItem_; } set { SelectedWebCategoryItem_ = value; OnPropertyChanged(); } }
6174 }
6275}
文件末尾没有换行
新增UI/Models/CategoryWebSiteListPageModel.cs+50 −0看文件
@@ -0,0 +1,50 @@
1新增:using Core.Models;
2新增:using Core.Models.Db;
3新增:using System;
4新增:using System.Collections.Generic;
5新增:using System.Collections.ObjectModel;
6新增:using System.Linq;
7新增:using System.Text;
8新增:using System.Threading.Tasks;
9新增:using System.Windows;
10新增:using UI.Controls.Select;
11新增:using UI.Models.CategoryAppList;
12新增:
13新增:namespace UI.Models
14新增:{
15新增: public class CategoryWebSiteListPageModel : ModelBase
16新增: {
17新增: public class OptionModel
18新增: {
19新增: public bool IsChecked { get; set; }
20新增: public WebSiteModel WebSite { get; set; }
21新增: public SelectItemModel OptionValue { get; set; } = new SelectItemModel();
22新增: }
23新增: private Visibility ChooseVisibility_ = Visibility.Hidden;
24新增: public Visibility ChooseVisibility { get { return ChooseVisibility_; } set { ChooseVisibility_ = value; OnPropertyChanged(); } }
25新增:
26新增: private WebSiteModel SelectedItem_;
27新增: public WebSiteModel SelectedItem { get { return SelectedItem_; } set { SelectedItem_ = value; OnPropertyChanged(); } }
28新增:
29新增: private string SearchInput_;
30新增: public string SearchInput { get { return SearchInput_; } set { SearchInput_ = value; OnPropertyChanged(); } }
31新增:
32新增: private ObservableCollection<WebSiteModel> CategoryWebSiteList_;
33新增: /// <summary>
34新增: /// 分类站点列表
35新增: /// </summary>
36新增: public ObservableCollection<WebSiteModel> CategoryWebSiteList { get { return CategoryWebSiteList_; } set { CategoryWebSiteList_ = value; OnPropertyChanged(); } }
37新增:
38新增: private WebSiteCategoryModel Category_;
39新增: /// <summary>
40新增: /// 当前分类
41新增: /// </summary>
42新增: public WebSiteCategoryModel Category { get { return Category_; } set { Category_ = value; OnPropertyChanged(); } }
43新增:
44新增: private List<OptionModel> WebSiteOptionList_;
45新增: /// <summary>
46新增: /// 站点可选列表
47新增: /// </summary>
48新增: public List<OptionModel> WebSiteOptionList { get { return WebSiteOptionList_; } set { WebSiteOptionList_ = value; OnPropertyChanged(); } }
49新增: }
50新增:}
修改UI/Models/ChartPageModel.cs+87 −2看文件
@@ -145,7 +145,7 @@ namespace UI.Models
145145 /// <summary>
146146 /// 时长对比上一周期变化(0无变化,1增加,-1减少)
147147 /// </summary>
148删除: public string DiffTotalTimeType { get { return DiffTotalTimeType_; } set { DiffTotalTimeType_ = value;OnPropertyChanged(); } }
148新增: public string DiffTotalTimeType { get { return DiffTotalTimeType_; } set { DiffTotalTimeType_ = value; OnPropertyChanged(); } }
149149 private string DiffAppCountType_;
150150 /// <summary>
151151 /// 应用量对比上一周期变化(0无变化,1增加,-1减少)
@@ -155,11 +155,96 @@ namespace UI.Models
155155 /// <summary>
156156 /// 时长差异值
157157 /// </summary>
158删除: public string DiffTotalTimeValue { get { return DiffTotalTimeValue_; } set { DiffTotalTimeValue_ = value;OnPropertyChanged(); } }
158新增: public string DiffTotalTimeValue { get { return DiffTotalTimeValue_; } set { DiffTotalTimeValue_ = value; OnPropertyChanged(); } }
159159 private string DiffAppCountValue_;
160160 /// <summary>
161161 /// 应用量差异值
162162 /// </summary>
163163 public string DiffAppCountValue { get { return DiffAppCountValue_; } set { DiffAppCountValue_ = value; OnPropertyChanged(); } }
164新增:
165新增: //private SelectItemModel ShowType_;
166新增: /// <summary>
167新增: /// 展示数据类型(0=应用/1=网页)
168新增: /// </summary>
169新增: //public SelectItemModel ShowType { get { return ShowType_; } set { ShowType_ = value; OnPropertyChanged(); } }
170新增:
171新增: private List<ChartsDataModel> WebCategoriesPieData_;
172新增: /// <summary>
173新增: /// 网页分类统计饼图数据
174新增: /// </summary>
175新增: public List<ChartsDataModel> WebCategoriesPieData { get { return WebCategoriesPieData_; } set { WebCategoriesPieData_ = value; OnPropertyChanged(); } }
176新增:
177新增: private List<ChartsDataModel> WebBrowseStatisticsData_;
178新增: /// <summary>
179新增: /// 网页浏览时长统计数据(柱状图)
180新增: /// </summary>
181新增: public List<ChartsDataModel> WebBrowseStatisticsData { get { return WebBrowseStatisticsData_; } set { WebBrowseStatisticsData_ = value; OnPropertyChanged(); } }
182新增:
183新增: #region 网页数据
184新增: private string WebTotalTimeText_;
185新增: /// <summary>
186新增: /// 网页浏览总时长
187新增: /// </summary>
188新增: public string WebTotalTimeText { get { return WebTotalTimeText_; } set { WebTotalTimeText_ = value; OnPropertyChanged(); } }
189新增: private double WebTotalTime_;
190新增: /// <summary>
191新增: /// 网页浏览总时长
192新增: /// </summary>
193新增: public double WebTotalTime { get { return WebTotalTime_; } set { WebTotalTime_ = value; OnPropertyChanged(); } }
194新增: private double WebSiteCount_;
195新增: /// <summary>
196新增: /// 站点浏览数量
197新增: /// </summary>
198新增: public double WebSiteCount { get { return WebSiteCount_; } set { WebSiteCount_ = value; OnPropertyChanged(); } }
199新增: private double WebPageCount_;
200新增: /// <summary>
201新增: /// 网页浏览数量
202新增: /// </summary>
203新增: public double WebPageCount { get { return WebPageCount_; } set { WebPageCount_ = value; OnPropertyChanged(); } }
204新增:
205新增: private double LastWebTotalTime_;
206新增: /// <summary>
207新增: /// 上一个周期网页浏览总时长
208新增: /// </summary>
209新增: public double LastWebTotalTime { get { return LastWebTotalTime_; } set { LastWebTotalTime_ = value; OnPropertyChanged(); } }
210新增: private double LastWebSiteCount_;
211新增: /// <summary>
212新增: /// 上一个周期站点浏览数量
213新增: /// </summary>
214新增: public double LastWebSiteCount { get { return LastWebSiteCount_; } set { LastWebSiteCount_ = value; OnPropertyChanged(); } }
215新增: private double LastWebPageCount_;
216新增: /// <summary>
217新增: /// 上一个周期网页浏览数量
218新增: /// </summary>
219新增: public double LastWebPageCount { get { return LastWebPageCount_; } set { LastWebPageCount_ = value; OnPropertyChanged(); } }
220新增:
221新增: private List<ChartsDataModel> WebSitesTopData_;
222新增: /// <summary>
223新增: /// 网页站点最为频繁
224新增: /// </summary>
225新增: public List<ChartsDataModel> WebSitesTopData { get { return WebSitesTopData_; } set { WebSitesTopData_ = value; OnPropertyChanged(); } }
226新增: private int WebColSelectedIndex_ = -1;
227新增: /// <summary>
228新增: /// 网页浏览数据柱状图选中列索引
229新增: /// </summary>
230新增: public int WebColSelectedIndex { get { return WebColSelectedIndex_; } set { WebColSelectedIndex_ = value; OnPropertyChanged(); } }
231新增:
232新增: private List<ChartsDataModel> WebSitesColSelectedData_;
233新增: /// <summary>
234新增: /// 网页浏览数据柱状图选中列数据
235新增: /// </summary>
236新增: public List<ChartsDataModel> WebSitesColSelectedData { get { return WebSitesColSelectedData_; } set { WebSitesColSelectedData_ = value; OnPropertyChanged(); } }
237新增:
238新增: private string WebSitesColSelectedTimeText_;
239新增: /// <summary>
240新增: /// 网页浏览数据柱状图选择列时间
241新增: /// </summary>
242新增: public string WebSitesColSelectedTimeText { get { return WebSitesColSelectedTimeText_; } set { WebSitesColSelectedTimeText_ = value; OnPropertyChanged(); } }
243新增: private ContextMenu WebSiteContextMenu_;
244新增: /// <summary>
245新增: /// 网站右键菜单
246新增: /// </summary>
247新增: public ContextMenu WebSiteContextMenu { get { return WebSiteContextMenu_; } set { WebSiteContextMenu_ = value; OnPropertyChanged(); } }
248新增: #endregion
164249 }
165250}
修改UI/Models/IndexPageModel.cs+39 −0看文件
@@ -6,6 +6,7 @@ using System.Text;
66using System.Threading.Tasks;
77using System.Windows.Controls;
88using UI.Controls.Charts.Model;
9新增:using UI.Controls.Select;
910
1011namespace UI.Models
1112{
@@ -63,5 +64,43 @@ namespace UI.Models
6364 /// </summary>
6465 public int MoreNum { get { return MoreNum_; } set { MoreNum_ = value; OnPropertyChanged(); } }
6566
67新增: private List<ChartsDataModel> WebFrequentUseData_;
68新增: /// <summary>
69新增: /// 网页最为频繁数据
70新增: /// </summary>
71新增: public List<ChartsDataModel> WebFrequentUseData
72新增: {
73新增: get { return WebFrequentUseData_; }
74新增: set { WebFrequentUseData_ = value; OnPropertyChanged(); }
75新增: }
76新增: private SelectItemModel MoreType_;
77新增: /// <summary>
78新增: /// 更多展示数据类型(0=应用/1=网页)
79新增: /// </summary>
80新增: public SelectItemModel MoreType { get { return MoreType_; } set { MoreType_ = value; OnPropertyChanged(); } }
81新增:
82新增: private List<ChartsDataModel> AppMoreData_;
83新增: /// <summary>
84新增: /// 应用更多数据
85新增: /// </summary>
86新增: public List<ChartsDataModel> AppMoreData
87新增: {
88新增: get { return AppMoreData_; }
89新增: set { AppMoreData_ = value; OnPropertyChanged(); }
90新增: }
91新增: private List<ChartsDataModel> WebMoreData_;
92新增: /// <summary>
93新增: /// 网页更多数据
94新增: /// </summary>
95新增: public List<ChartsDataModel> WebMoreData
96新增: {
97新增: get { return WebMoreData_; }
98新增: set { WebMoreData_ = value; OnPropertyChanged(); }
99新增: }
100新增: private ContextMenu WebSiteContextMenu_;
101新增: /// <summary>
102新增: /// 网站右键菜单
103新增: /// </summary>
104新增: public ContextMenu WebSiteContextMenu { get { return WebSiteContextMenu_; } set { WebSiteContextMenu_ = value; OnPropertyChanged(); } }
66105 }
67106}
修改UI/Models/ModelBase.cs+28 −0看文件
@@ -3,11 +3,39 @@ using System.Collections.Generic;
33using System.Linq;
44using System.Text;
55using System.Threading.Tasks;
6新增:using UI.Controls.Select;
67
78namespace UI.Models
89{
910 public class ModelBase : UINotifyPropertyChanged
1011 {
12新增: private SelectItemModel ShowType_;
13新增: /// <summary>
14新增: /// 展示类型(0=应用/1=网站)
15新增: /// </summary>
16新增: public SelectItemModel ShowType { get { return ShowType_; } set { ShowType_ = value; OnPropertyChanged(); } }
17新增:
18新增:
19新增: /// <summary>
20新增: /// 展示类型选项
21新增: /// </summary>
22新增: public List<SelectItemModel> ShowTypeOptions { get; } = new List<SelectItemModel>()
23新增: {
24新增: new SelectItemModel()
25新增: {
26新增: Id=0,
27新增: Name="应用"
28新增: },
29新增: new SelectItemModel()
30新增: {
31新增: Id=1,
32新增: Name="网站"
33新增: }
34新增: };
35新增: public ModelBase()
36新增: {
37新增: ShowType = ShowTypeOptions[0];
38新增: }
1139 public virtual void Dispose() { }
1240 }
1341}
新增UI/Models/WebSiteDetailPageModel.cs+92 −0看文件
@@ -0,0 +1,92 @@
1新增:using Core.Models.Db;
2新增:using System;
3新增:using System.Collections.Generic;
4新增:using System.Collections.ObjectModel;
5新增:using System.Linq;
6新增:using System.Text;
7新增:using System.Threading.Tasks;
8新增:using System.Windows.Controls;
9新增:using UI.Controls.Charts.Model;
10新增:using UI.Controls.Select;
11新增:
12新增:namespace UI.Models
13新增:{
14新增: public class WebSiteDetailPageModel : UINotifyPropertyChanged
15新增: {
16新增: public WebSiteModel WebSite_;
17新增: /// <summary>
18新增: /// 站点
19新增: /// </summary>
20新增: public WebSiteModel WebSite { get { return WebSite_; } set { WebSite_ = value; OnPropertyChanged(); } }
21新增:
22新增: // 图表数据
23新增: private List<ChartsDataModel> ChartData_;
24新增:
25新增: public List<ChartsDataModel> ChartData
26新增: {
27新增: get
28新增: {
29新增: return ChartData_;
30新增: }
31新增: set
32新增: {
33新增: ChartData_ = value;
34新增: OnPropertyChanged();
35新增: }
36新增: }
37新增:
38新增: private ObservableCollection<string> TabbarData_;
39新增: public ObservableCollection<string> TabbarData { get { return TabbarData_; } set { TabbarData_ = value; OnPropertyChanged(); } }
40新增:
41新增: private int TabbarSelectedIndex_;
42新增: public int TabbarSelectedIndex { get { return TabbarSelectedIndex_; } set { TabbarSelectedIndex_ = value; OnPropertyChanged(); } }
43新增: private string WeekDateStr_;
44新增: public string WeekDateStr { get { return WeekDateStr_; } set { WeekDateStr_ = value; OnPropertyChanged(); } }
45新增: private DateTime ChartDate_;
46新增: public DateTime ChartDate { get { return ChartDate_; } set { ChartDate_ = value; OnPropertyChanged(); } }
47新增:
48新增: private List<SelectItemModel> WeekOptions_;
49新增: public List<SelectItemModel> WeekOptions { get { return WeekOptions_; } set { WeekOptions_ = value; OnPropertyChanged(); } }
50新增:
51新增: private SelectItemModel SelectedWeek_;
52新增:
53新增: public SelectItemModel SelectedWeek { get { return SelectedWeek_; } set { SelectedWeek_ = value; OnPropertyChanged(); } }
54新增:
55新增: private DateTime MonthDate_;
56新增: public DateTime MonthDate { get { return MonthDate_; } set { MonthDate_ = value; OnPropertyChanged(); } }
57新增:
58新增: private DateTime YearDate_;
59新增: public DateTime YearDate { get { return YearDate_; } set { YearDate_ = value; OnPropertyChanged(); } }
60新增: private int NameIndexStart_ = 0;
61新增: public int NameIndexStart { get { return NameIndexStart_; } set { NameIndexStart_ = value; OnPropertyChanged(); } }
62新增:
63新增: private List<WebBrowseLogModel> WebPageData_;
64新增: public List<WebBrowseLogModel> WebPageData { get { return WebPageData_; } set { WebPageData_ = value; OnPropertyChanged(); } }
65新增: private WebBrowseLogModel WebPageSelectedItem_;
66新增: public WebBrowseLogModel WebPageSelectedItem { get { return WebPageSelectedItem_; } set { WebPageSelectedItem_ = value; OnPropertyChanged(); } }
67新增:
68新增: private List<SelectItemModel> Categories_;
69新增: /// <summary>
70新增: /// 分类数据
71新增: /// </summary>
72新增: public List<SelectItemModel> Categories { get { return Categories_; } set { Categories_ = value; OnPropertyChanged(); } }
73新增:
74新增: private SelectItemModel Category_;
75新增: /// <summary>
76新增: /// 当前分类
77新增: /// </summary>
78新增: public SelectItemModel Category { get { return Category_; } set { Category_ = value; OnPropertyChanged(); } }
79新增:
80新增: private ContextMenu WebSiteContextMenu_;
81新增: /// <summary>
82新增: /// 网站右键菜单
83新增: /// </summary>
84新增: public ContextMenu WebSiteContextMenu { get { return WebSiteContextMenu_; } set { WebSiteContextMenu_ = value; OnPropertyChanged(); } }
85新增:
86新增: public bool IsIgnore_;
87新增: /// <summary>
88新增: /// 是否已被忽略
89新增: /// </summary>
90新增: public bool IsIgnore { get { return IsIgnore_; } set { IsIgnore_ = value; OnPropertyChanged(); } }
91新增: }
92新增:}
修改UI/Resources/Themes/Dark.xaml+11 −0看文件
@@ -125,4 +125,15 @@
125125 <Color x:Key="ScrollBarColor">#a0a0a0</Color>
126126 <SolidColorBrush x:Key="ScrollBarBrush" Color="{StaticResource ScrollBarColor}" />
127127
128新增: <!--列表图表-->
129新增: <Color x:Key="ChartTypeListProgressBarColor">#7F777777</Color>
130新增: <SolidColorBrush x:Key="ChartTypeListProgressBarBrush" Color="{StaticResource ChartTypeListProgressBarColor}" />
131新增:
132新增: <!--危险颜色-->
133新增: <Color x:Key="DangerColor">#f51837</Color>
134新增: <SolidColorBrush x:Key="DangerBrush" Color="{StaticResource DangerColor}" />
135新增:
136新增: <!--提示颜色-->
137新增: <Color x:Key="WarningColor">#FFC408</Color>
138新增: <SolidColorBrush x:Key="WarningBrush" Color="{StaticResource WarningColor}" />
128139</ResourceDictionary>
文件末尾没有换行
修改UI/Resources/Themes/Light.xaml+12 −0看文件
@@ -124,4 +124,16 @@
124124
125125 <Color x:Key="ScrollBarColor">#8A8A8A</Color>
126126 <SolidColorBrush x:Key="ScrollBarBrush" Color="{StaticResource ScrollBarColor}" />
127新增:
128新增: <!--列表图表-->
129新增: <Color x:Key="ChartTypeListProgressBarColor">#7F777777</Color>
130新增: <SolidColorBrush x:Key="ChartTypeListProgressBarBrush" Color="{StaticResource ChartTypeListProgressBarColor}" />
131新增:
132新增: <!--危险警告颜色-->
133新增: <Color x:Key="DangerColor">#f51837</Color>
134新增: <SolidColorBrush x:Key="DangerBrush" Color="{StaticResource DangerColor}" />
135新增:
136新增: <!--提示颜色-->
137新增: <Color x:Key="WarningColor">#FFC408</Color>
138新增: <SolidColorBrush x:Key="WarningBrush" Color="{StaticResource WarningColor}" />
127139</ResourceDictionary>
文件末尾没有换行
修改UI/Servicers/AppContextMenuServicer.cs+0 −2看文件
@@ -49,8 +49,6 @@ namespace UI.Servicers
4949 if (menu != null)
5050 {
5151 menu.ContextMenuOpening -= SetCategory_ContextMenuOpening;
52删除:
53删除: var test = VisualTreeHelper.GetParent(menu);
5452 }
5553 menu = new ContextMenu();
5654 menu.Items.Clear();
新增UI/Servicers/IWebSiteContextMenuServicer.cs+15 −0看文件
@@ -0,0 +1,15 @@
1新增:using System;
2新增:using System.Collections.Generic;
3新增:using System.Linq;
4新增:using System.Text;
5新增:using System.Threading.Tasks;
6新增:using System.Windows.Controls;
7新增:
8新增:namespace UI.Servicers
9新增:{
10新增: public interface IWebSiteContextMenuServicer
11新增: {
12新增: void Init();
13新增: ContextMenu GetContextMenu();
14新增: }
15新增:}
修改UI/Servicers/MainServicer.cs+4 −1看文件
@@ -13,12 +13,14 @@ namespace UI.Servicers
1313 private readonly IThemeServicer themeServicer;
1414 private readonly IInputServicer inputServicer;
1515 private readonly IAppContextMenuServicer appContextMenuServicer;
16删除: public MainServicer(IMain main, IThemeServicer themeServicer, IInputServicer inputServicer, IAppContextMenuServicer appContextMenuServicer)
16新增: private readonly IWebSiteContextMenuServicer _webSiteContext;
17新增: public MainServicer(IMain main, IThemeServicer themeServicer, IInputServicer inputServicer, IAppContextMenuServicer appContextMenuServicer, IWebSiteContextMenuServicer webSiteContext_)
1718 {
1819 this.main = main;
1920 this.themeServicer = themeServicer;
2021 this.inputServicer = inputServicer;
2122 this.appContextMenuServicer = appContextMenuServicer;
23新增: _webSiteContext = webSiteContext_;
2224 }
2325 public void Start()
2426 {
@@ -31,6 +33,7 @@ namespace UI.Servicers
3133 themeServicer.Init();
3234 inputServicer.Start();
3335 appContextMenuServicer.Init();
36新增: _webSiteContext.Init();
3437 }
3538 }
3639}
新增UI/Servicers/WebSiteContextMenuServicer.cs+216 −0看文件
@@ -0,0 +1,216 @@
1新增:using Core.Models;
2新增:using Core.Models.Db;
3新增:using Core.Servicers.Instances;
4新增:using Core.Servicers.Interfaces;
5新增:using System;
6新增:using System.Collections.Generic;
7新增:using System.Diagnostics;
8新增:using System.IO;
9新增:using System.Linq;
10新增:using System.Text;
11新增:using System.Threading.Tasks;
12新增:using System.Windows.Controls;
13新增:using System.Windows.Documents;
14新增:using System.Windows.Media;
15新增:using UI.Controls.Charts.Model;
16新增:using UI.ViewModels;
17新增:
18新增:namespace UI.Servicers
19新增:{
20新增: public class WebSiteContextMenuServicer : IWebSiteContextMenuServicer
21新增: {
22新增:
23新增: private readonly MainViewModel _main;
24新增: private readonly IAppConfig _appConfig;
25新增: private readonly IThemeServicer _theme;
26新增: private readonly IWebData _webData;
27新增: private ContextMenu _menu;
28新增: private MenuItem _setCategory;
29新增: private MenuItem _block;
30新增: private MenuItem _site;
31新增:
32新增:
33新增: public WebSiteContextMenuServicer(
34新增: MainViewModel main_,
35新增: IAppConfig appConfig_,
36新增: IThemeServicer theme_,
37新增: IWebData webData_)
38新增: {
39新增: _main = main_;
40新增: _appConfig = appConfig_;
41新增: _theme = theme_;
42新增: _webData = webData_;
43新增: }
44新增:
45新增: public void Init()
46新增: {
47新增: CreateMenu();
48新增: _theme.OnThemeChanged += Theme_OnThemeChanged;
49新增: }
50新增:
51新增: private void CreateMenu()
52新增: {
53新增: if (_menu != null)
54新增: {
55新增: _menu.ContextMenuOpening -= _menu_ContextMenuOpening;
56新增: }
57新增: _menu = new ContextMenu();
58新增: _menu.Items.Clear();
59新增:
60新增: MenuItem open = new MenuItem();
61新增: open.Header = "在浏览器打开网站";
62新增: open.Click += Open_Click; ;
63新增:
64新增:
65新增: _setCategory = new MenuItem();
66新增: _setCategory.Header = "设置分类";
67新增:
68新增: _block = new MenuItem();
69新增: _block.Header = "忽略此网站";
70新增: _block.Click += Block_Click;
71新增:
72新增: _site = new MenuItem();
73新增: _site.IsEnabled = false;
74新增:
75新增: _menu.Items.Add(_site);
76新增: _menu.Items.Add(open);
77新增: _menu.Items.Add(new Separator());
78新增: _menu.Items.Add(_setCategory);
79新增: _menu.Items.Add(new Separator());
80新增: _menu.Items.Add(_block);
81新增: _menu.ContextMenuOpening += _menu_ContextMenuOpening;
82新增: }
83新增:
84新增: private void _menu_ContextMenuOpening(object sender, ContextMenuEventArgs e)
85新增: {
86新增: if (_menu.Tag == null)
87新增: {
88新增: return;
89新增: }
90新增: var data = _menu.Tag as ChartsDataModel;
91新增: var site = data.Data as WebSiteModel;
92新增: _site.Header = site.Title;
93新增:
94新增: var config = _appConfig.GetConfig();
95新增: if (config.Behavior.IgnoreURLList.Contains(site.Domain))
96新增: {
97新增: _block.Header = "取消忽略此站点";
98新增: }
99新增: else
100新增: {
101新增: _block.Header = "忽略此站点";
102新增: }
103新增:
104新增: UpdateCategoryMenu();
105新增: }
106新增:
107新增: private void Open_Click(object sender, System.Windows.RoutedEventArgs e)
108新增: {
109新增: var data = _menu.Tag as ChartsDataModel;
110新增: var site = data.Data as WebSiteModel;
111新增: if (!string.IsNullOrEmpty(site.Domain))
112新增: {
113新增: Process.Start($"http://{site.Domain}");
114新增: _main.Info("操作已执行");
115新增: }
116新增: }
117新增:
118新增: private void Theme_OnThemeChanged(object sender, EventArgs e)
119新增: {
120新增: _menu.UpdateDefaultStyle();
121新增: }
122新增:
123新增: private void Block_Click(object sender, System.Windows.RoutedEventArgs e)
124新增: {
125新增: var data = _menu.Tag as ChartsDataModel;
126新增: var site = data.Data as WebSiteModel;
127新增: if (site == null) { return; }
128新增:
129新增: var newBadgeList = new List<ChartBadgeModel>();
130新增: if (data.BadgeList != null)
131新增: {
132新增: var categoryBadge = data.BadgeList.Where(m => m.Type != ChartBadgeType.Ignore).ToList();
133新增: newBadgeList.AddRange(categoryBadge);
134新增: }
135新增:
136新增: var config = _appConfig.GetConfig();
137新增: if (config.Behavior.IgnoreURLList.Contains(site.Domain))
138新增: {
139新增: config.Behavior.IgnoreURLList.Remove(site.Domain);
140新增: _main.Toast($"已取消忽略此域名 {site.Domain}", Controls.Window.ToastType.Success);
141新增: }
142新增: else
143新增: {
144新增: config.Behavior.IgnoreURLList.Add(site.Domain);
145新增: _main.Toast($"已忽略此域名 {site.Domain}", Controls.Window.ToastType.Success);
146新增:
147新增: newBadgeList.Add(ChartBadgeModel.IgnoreBadge);
148新增: }
149新增: data.BadgeList = newBadgeList;
150新增: }
151新增:
152新增:
153新增:
154新增: private void UpdateCategoryMenu()
155新增: {
156新增: _setCategory.Items.Clear();
157新增:
158新增: var data = _menu.Tag as ChartsDataModel;
159新增: var site = data.Data as WebSiteModel;
160新增: var categories = _webData.GetWebSiteCategories();
161新增: foreach (var category in categories)
162新增: {
163新增: var categoryMenu = new MenuItem();
164新增: categoryMenu.Header = category.Name;
165新增: categoryMenu.IsChecked = site.CategoryID == category.ID;
166新增: categoryMenu.Click += (s, e) =>
167新增: {
168新增: UpdateSiteCategory(data, category.ID);
169新增: };
170新增: _setCategory.Items.Add(categoryMenu);
171新增: }
172新增: }
173新增:
174新增:
175新增:
176新增: private void UpdateSiteCategory(ChartsDataModel data, int categoryId_)
177新增: {
178新增: Task.Run(() =>
179新增: {
180新增: var category = _webData.GetWebSiteCategory(categoryId_);
181新增: if (category != null)
182新增: {
183新增: WebSiteModel site_ = data.Data as WebSiteModel;
184新增: _webData.UpdateWebSitesCategory(new int[] { site_.ID }, categoryId_);
185新增: site_.CategoryID = categoryId_;
186新增: site_.Category = category;
187新增:
188新增: var newBadgeList = new List<ChartBadgeModel>();
189新增: if (data.BadgeList != null)
190新增: {
191新增: var otherBadge = data.BadgeList.Where(m => m.Type != ChartBadgeType.Category).ToList();
192新增: newBadgeList.AddRange(otherBadge);
193新增: }
194新增: newBadgeList.Add(new ChartBadgeModel()
195新增: {
196新增: Name = category.Name,
197新增: Color = category.Color,
198新增: Type = ChartBadgeType.Category
199新增: });
200新增: data.BadgeList = newBadgeList;
201新增: }
202新增: });
203新增: }
204新增:
205新增:
206新增:
207新增:
208新增:
209新增: public ContextMenu GetContextMenu()
210新增: {
211新增: return _menu;
212新增: }
213新增:
214新增:
215新增: }
216新增:}
修改UI/Themes/SettingPanel/SettingPanelItem.xaml+9 −1看文件
@@ -21,7 +21,15 @@
2121
2222 <Grid>
2323 <StackPanel VerticalAlignment="Center" HorizontalAlignment="Left">
24删除: <TextBlock Text="{TemplateBinding Name}" FontSize="14" Foreground="{DynamicResource StandardTextBrush}" VerticalAlignment="Center"/>
24新增: <StackPanel Orientation="Horizontal" >
25新增: <TextBlock Text="{TemplateBinding Name}" FontSize="14" Foreground="{DynamicResource StandardTextBrush}" VerticalAlignment="Center"/>
26新增: <base:View Value="{TemplateBinding IsBeta}" VerticalAlignment="Center">
27新增: <Border Background="{DynamicResource WarningBrush}" CornerRadius="8" Padding="10,3" Margin="5,0,0,0">
28新增: <TextBlock Text="Beta" FontSize="10" ToolTip="该功能或选项处于测试阶段,可能会出现预料之外的问题" Foreground="White" VerticalAlignment="Center"/>
29新增: </Border>
30新增: </base:View>
31新增:
32新增: </StackPanel>
2533 <base:View Value="{TemplateBinding Description}" Condition="not empty">
2634 <TextBlock Text="{TemplateBinding Description}" FontSize="12" Margin="0,4,0,0" Foreground="{DynamicResource SubTextBrush}" VerticalAlignment="Center"/>
2735 </base:View>
修改UI/UI.csproj+27 −2看文件
@@ -128,6 +128,7 @@
128128 <Compile Include="Base\Color\Colors.cs" />
129129 <Compile Include="Base\Color\ColorTypes.cs" />
130130 <Compile Include="Base\UIHelper.cs" />
131新增: <Compile Include="Controls\Base\DiffValue.cs" />
131132 <Compile Include="Controls\Base\EmptyData.cs" />
132133 <Compile Include="Controls\Base\CheckBox.cs" />
133134 <Compile Include="Controls\Base\ColorSelect.cs" />
@@ -143,16 +144,20 @@
143144 <Compile Include="Controls\Button\IconButton.cs" />
144145 <Compile Include="Controls\Charts\ChartDataValueType.cs" />
145146 <Compile Include="Controls\Charts\ChartItemTypeColumn.cs" />
147新增: <Compile Include="Controls\Charts\ChartsItemTypePie.cs" />
146148 <Compile Include="Controls\Charts\ChartsItemTypeRadar.cs" />
147149 <Compile Include="Controls\Charts\ChartsItemTypeMonth.cs" />
148150 <Compile Include="Controls\Charts\ChartsItemTypeCard.cs" />
149删除: <Compile Include="Controls\Charts\ChartsItemTypeA.cs" />
151新增: <Compile Include="Controls\Charts\ChartsItemTypeList.cs" />
150152 <Compile Include="Controls\Charts\Charts.cs" />
151153 <Compile Include="Controls\Charts\ChartsType.cs" />
152154 <Compile Include="Controls\Charts\Model\ChartBadgeModel.cs" />
153155 <Compile Include="Controls\Charts\Model\ChartBadgeType.cs" />
154156 <Compile Include="Controls\Charts\Model\ChartColumnInfoModel.cs" />
155157 <Compile Include="Controls\Charts\Model\ChartsDataModel.cs" />
158新增: <Compile Include="Controls\Converters\DateTimeConverter.cs" />
159新增: <Compile Include="Controls\Converters\TimeConverter.cs" />
160新增: <Compile Include="Controls\Converters\GetCountConverter.cs" />
156161 <Compile Include="Controls\Converters\ToStringConverter.cs" />
157162 <Compile Include="Controls\Converters\HextoColorConverter.cs" />
158163 <Compile Include="Controls\DatePickerBar\DatePickerBarItem.cs" />
@@ -181,6 +186,7 @@
181186 <Compile Include="Controls\Window\ToastType.cs" />
182187 <Compile Include="Extensions\ListExtensions.cs" />
183188 <Compile Include="Librays\Image\Imager.cs" />
189新增: <Compile Include="Models\CategoryWebSiteListPageModel.cs" />
184190 <Compile Include="Models\CategoryAppListPageModel.cs" />
185191 <Compile Include="Models\CategoryAppList\ChooseAppModel.cs" />
186192 <Compile Include="Models\CategoryPageModel.cs" />
@@ -194,7 +200,10 @@
194200 <Compile Include="Models\ModelBase.cs" />
195201 <Compile Include="Models\SettingPageModel.cs" />
196202 <Compile Include="Models\UINotifyPropertyChanged.cs" />
203新增: <Compile Include="Models\WebSiteDetailPageModel.cs" />
204新增: <Compile Include="Servicers\WebSiteContextMenuServicer.cs" />
197205 <Compile Include="Servicers\AppContextMenuServicer.cs" />
206新增: <Compile Include="Servicers\IWebSiteContextMenuServicer.cs" />
198207 <Compile Include="Servicers\IAppContextMenuServicer.cs" />
199208 <Compile Include="Servicers\IInputServicer.cs" />
200209 <Compile Include="Servicers\IMainServicer.cs" />
@@ -204,6 +213,7 @@
204213 <Compile Include="Servicers\MainServicer.cs" />
205214 <Compile Include="Servicers\ThemeServicer.cs" />
206215 <Compile Include="StateData.cs" />
216新增: <Compile Include="ViewModels\CategoryWebSiteListPageVM.cs" />
207217 <Compile Include="ViewModels\CategoryAppListPageVM.cs" />
208218 <Compile Include="ViewModels\CategoryPageVM.cs" />
209219 <Compile Include="ViewModels\ChartPageVM.cs" />
@@ -212,6 +222,10 @@
212222 <Compile Include="ViewModels\IndexPageVM.cs" />
213223 <Compile Include="ViewModels\MainViewModel.cs" />
214224 <Compile Include="ViewModels\SettingPageVM.cs" />
225新增: <Compile Include="ViewModels\WebSiteDetailPageVM.cs" />
226新增: <Compile Include="Views\CategoryWebSiteListPage.xaml.cs">
227新增: <DependentUpon>CategoryWebSiteListPage.xaml</DependentUpon>
228新增: </Compile>
215229 <Compile Include="Views\CategoryAppListPage.xaml.cs">
216230 <DependentUpon>CategoryAppListPage.xaml</DependentUpon>
217231 </Compile>
@@ -233,6 +247,9 @@
233247 <Compile Include="Views\SettingPage.xaml.cs">
234248 <DependentUpon>SettingPage.xaml</DependentUpon>
235249 </Compile>
250新增: <Compile Include="Views\WebSiteDetailPage.xaml.cs">
251新增: <DependentUpon>WebSiteDetailPage.xaml</DependentUpon>
252新增: </Compile>
236253 <Page Include="MainWindow.xaml">
237254 <Generator>MSBuild:Compile</Generator>
238255 <SubType>Designer</SubType>
@@ -322,7 +339,7 @@
322339 <Generator>MSBuild:Compile</Generator>
323340 <SubType>Designer</SubType>
324341 </Page>
325删除: <Page Include="Themes\Charts\ChartsItemTypeA.xaml">
342新增: <Page Include="Themes\Charts\ChartsItemTypeList.xaml">
326343 <Generator>MSBuild:Compile</Generator>
327344 <SubType>Designer</SubType>
328345 </Page>
@@ -418,6 +435,10 @@
418435 <SubType>Designer</SubType>
419436 <Generator>MSBuild:Compile</Generator>
420437 </Page>
438新增: <Page Include="Views\CategoryWebSiteListPage.xaml">
439新增: <Generator>MSBuild:Compile</Generator>
440新增: <SubType>Designer</SubType>
441新增: </Page>
421442 <Page Include="Views\CategoryAppListPage.xaml">
422443 <SubType>Designer</SubType>
423444 <Generator>MSBuild:Compile</Generator>
@@ -446,6 +467,10 @@
446467 <SubType>Designer</SubType>
447468 <Generator>MSBuild:Compile</Generator>
448469 </Page>
470新增: <Page Include="Views\WebSiteDetailPage.xaml">
471新增: <SubType>Designer</SubType>
472新增: <Generator>MSBuild:Compile</Generator>
473新增: </Page>
449474 </ItemGroup>
450475 <ItemGroup>
451476 <Compile Include="Properties\AssemblyInfo.cs">
修改UI/ViewModels/CategoryPageVM.cs+263 −59看文件
@@ -6,6 +6,7 @@ using System.Linq;
66using System.Text;
77using System.Threading.Tasks;
88using UI.Controls;
9新增:using UI.Controls.Select;
910using UI.Models;
1011using UI.Models.Category;
1112using UI.Views;
@@ -17,7 +18,8 @@ namespace UI.ViewModels
1718 private readonly ICategorys categorys;
1819 private readonly MainViewModel mainVM;
1920 private readonly IAppData appData;
20删除: public Command GotoAppListCommand { get; set; }
21新增: private readonly IWebData _webData;
22新增: public Command GotoListCommand { get; set; }
2123 /// <summary>
2224 /// 打开编辑命令
2325 /// </summary>
@@ -34,59 +36,47 @@ namespace UI.ViewModels
3436 /// 删除分类
3537 /// </summary>
3638 public Command DelCommand { get; set; }
39新增: /// <summary>
40新增: /// 刷新
41新增: /// </summary>
42新增: public Command RefreshCommand { get; set; }
43新增:
3744
38删除: public CategoryPageVM(ICategorys categorys, MainViewModel mainVM, IAppData appData)
45新增: public CategoryPageVM(ICategorys categorys, MainViewModel mainVM, IAppData appData, IWebData webData_)
3946 {
4047 this.categorys = categorys;
4148 this.mainVM = mainVM;
4249 this.appData = appData;
50新增: _webData = webData_;
4351
44删除: GotoAppListCommand = new Command(new Action<object>(OnGotoAppList));
52新增: GotoListCommand = new Command(new Action<object>(OnGotoList));
4553 EditCommand = new Command(new Action<object>(OnEdit));
4654 EditDoneCommand = new Command(new Action<object>(OnEditDone));
4755 EditCloseCommand = new Command(new Action<object>(OnEditClose));
4856 DelCommand = new Command(new Action<object>(OnDel));
49删除:
50删除:
57新增: RefreshCommand = new Command(new Action<object>(OnRefresh));
5158 LoadData();
5259
5360 PropertyChanged += CategoryPageVM_PropertyChanged;
5461 }
5562
56删除: public override void Dispose()
63新增: private void OnRefresh(object obj)
5764 {
58删除: base.Dispose();
59删除: PropertyChanged -= CategoryPageVM_PropertyChanged;
60删除: Data = null;
65新增: LoadData();
6166 }
67新增:
68新增:
6269 private void OnDel(object obj)
6370 {
64删除: if (SelectedItem == null)
71新增: if (ShowType.Id == 0)
6572 {
66删除: return;
73新增: DelAppCategory();
6774 }
68删除: var category = categorys.GetCategory(SelectedItem.Data.ID);
69删除: if (category != null)
75新增: else if (ShowType.Id == 1)
7076 {
71删除: categorys.Delete(category);
72删除: var apps = appData.GetAppsByCategoryID(category.ID);
73删除: foreach (var app in apps)
74删除: {
75删除: app.CategoryID = 0;
76删除: app.Category = null;
77删除: appData.UpdateApp(app);
78删除: }
79删除:
80删除: // 从界面移除
81删除:
82删除: Data.Remove(SelectedItem);
83删除: if (Data.Count == 0)
84删除: {
85删除: Data = new System.Collections.ObjectModel.ObservableCollection<CategoryModel>();
86删除: }
87删除: mainVM.Toast("分类已删除", Controls.Window.ToastType.Success);
88删除:
77新增: DelWebSiteCategory();
8978 }
79新增:
9080 }
9181 private void OnEditClose(object obj)
9282 {
@@ -94,28 +84,52 @@ namespace UI.ViewModels
9484 }
9585 private void OnEditDone(object obj)
9686 {
97删除: //var c = categorys.GetCategory(123);
87新增: if (ShowType.Id == 0)
88新增: {
89新增: EditAppCategoryAction();
90新增: }
91新增: else if (ShowType.Id == 1)
92新增: {
93新增: EditWebSiteCategoryAction();
94新增: }
95新增: }
96新增:
97新增: #region 编辑校验
98新增: /// <summary>
99新增: /// 编辑校验
100新增: /// </summary>
101新增: private bool IsEditVerify()
102新增: {
98103 if (string.IsNullOrEmpty(EditName))
99104 {
100105 IsEditError = true;
101106 EditErrorText = "分类名称不能为空";
102删除: return;
107新增: return false;
103108 }
104109 if (string.IsNullOrEmpty(EditIconFile))
105110 {
106111 mainVM.Toast("请选择一个分类图标", Controls.Window.ToastType.Error, Controls.Base.IconTypes.ImportantBadge12);
107删除: return;
112新增: return false;
108113 }
109114 if (string.IsNullOrEmpty(EditColor))
110115 {
111116 mainVM.Toast("请设置一个分类颜色", Controls.Window.ToastType.Error, Controls.Base.IconTypes.ImportantBadge12);
112删除: return;
117新增: return false;
113118 }
114119 if (EditIconFile.IndexOf("pack://") == -1 && new FileInfo(EditIconFile).Length > 1000000)
115120 {
116121 mainVM.Toast("图标文件不能超过1MB", Controls.Window.ToastType.Error, Controls.Base.IconTypes.ImportantBadge12);
117删除: return;
122新增: return false;
118123 }
124新增: return true;
125新增: }
126新增: #endregion
127新增:
128新增: #region 应用分类操作
129新增: #region 编辑应用分类
130新增: private void EditAppCategoryAction()
131新增: {
132新增: if (!IsEditVerify()) return;
119133
120134 if (IsCreate)
121135 {
@@ -166,17 +180,17 @@ namespace UI.ViewModels
166180 // 编辑分类
167181
168182 // 判断重复分类名称
169删除: if (Data.Where(m => m.Data.Name == EditName && m.Data.ID != SelectedItem.Data.ID).Any())
183新增: if (Data.Where(m => m.Data.Name == EditName && m.Data.ID != SelectedAppCategoryItem.Data.ID).Any())
170184 {
171185 mainVM.Toast("分类名称已存在", Controls.Window.ToastType.Error, Controls.Base.IconTypes.ImportantBadge12);
172186 return;
173187 }
174删除: if (Data.Where(m => m.Data.Color == EditColor && m.Data.ID != SelectedItem.Data.ID).Any())
188新增: if (Data.Where(m => m.Data.Color == EditColor && m.Data.ID != SelectedAppCategoryItem.Data.ID).Any())
175189 {
176190 mainVM.Toast("颜色已存在,请重新选择", Controls.Window.ToastType.Error, Controls.Base.IconTypes.ImportantBadge12);
177191 return;
178192 }
179删除: if (EditName == SelectedItem.Data.Name && EditIconFile == SelectedItem.Data.IconFile && EditColor == SelectedItem.Data.Color)
193新增: if (EditName == SelectedAppCategoryItem.Data.Name && EditIconFile == SelectedAppCategoryItem.Data.IconFile && EditColor == SelectedAppCategoryItem.Data.Color)
180194 {
181195 mainVM.Toast("没有修改");
182196 EditVisibility = System.Windows.Visibility.Collapsed;
@@ -184,7 +198,7 @@ namespace UI.ViewModels
184198 }
185199 mainVM.Toast("已更新", Controls.Window.ToastType.Success);
186200
187删除: var category = categorys.GetCategory(SelectedItem.Data.ID);
201新增: var category = categorys.GetCategory(SelectedAppCategoryItem.Data.ID);
188202 if (category != null)
189203 {
190204 category.Name = EditName;
@@ -194,7 +208,7 @@ namespace UI.ViewModels
194208 categorys.Update(category);
195209 }
196210
197删除: var item = Data.Where(m => m.Data.ID == SelectedItem.Data.ID).FirstOrDefault();
211新增: var item = Data.Where(m => m.Data.ID == SelectedAppCategoryItem.Data.ID).FirstOrDefault();
198212
199213 var changedItem = new CategoryModel()
200214 {
@@ -217,6 +231,165 @@ namespace UI.ViewModels
217231 EditVisibility = System.Windows.Visibility.Collapsed;
218232 }
219233 }
234新增: #endregion
235新增:
236新增: #region 删除分类
237新增: private void DelAppCategory()
238新增: {
239新增: if (SelectedAppCategoryItem == null)
240新增: {
241新增: return;
242新增: }
243新增: var category = categorys.GetCategory(SelectedAppCategoryItem.Data.ID);
244新增: if (category != null)
245新增: {
246新增: categorys.Delete(category);
247新增: var apps = appData.GetAppsByCategoryID(category.ID);
248新增: foreach (var app in apps)
249新增: {
250新增: app.CategoryID = 0;
251新增: app.Category = null;
252新增: appData.UpdateApp(app);
253新增: }
254新增:
255新增: // 从界面移除
256新增:
257新增: Data.Remove(SelectedAppCategoryItem);
258新增: if (Data.Count == 0)
259新增: {
260新增: Data = new System.Collections.ObjectModel.ObservableCollection<CategoryModel>();
261新增: }
262新增: mainVM.Toast("分类已删除", Controls.Window.ToastType.Success);
263新增:
264新增: }
265新增: }
266新增: #endregion
267新增:
268新增: #endregion
269新增:
270新增: #region 网站分类操作
271新增: #region 编辑网站分类
272新增: private void EditWebSiteCategoryAction()
273新增: {
274新增: if (!IsEditVerify()) return;
275新增:
276新增: if (IsCreate)
277新增: {
278新增: // 创建分类
279新增:
280新增: // 判断重复分类名称
281新增: if (WebCategoryData.Where(m => m.Data.Name == EditName).Any())
282新增: {
283新增: mainVM.Toast("分类名称已存在", Controls.Window.ToastType.Error, Controls.Base.IconTypes.ImportantBadge12);
284新增: return;
285新增: }
286新增: if (WebCategoryData.Where(m => m.Data.Color == EditColor).Any())
287新增: {
288新增: mainVM.Toast("颜色已存在,请重新选择", Controls.Window.ToastType.Error, Controls.Base.IconTypes.ImportantBadge12);
289新增: return;
290新增: }
291新增:
292新增: var category = _webData.CreateWebSiteCategory(new Core.Models.Db.WebSiteCategoryModel()
293新增: {
294新增: Color = EditColor,
295新增: IconFile = EditIconFile,
296新增: Name = EditName,
297新增: });
298新增:
299新增: if (category != null)
300新增: {
301新增: mainVM.Toast("创建完成", Controls.Window.ToastType.Success);
302新增: EditVisibility = System.Windows.Visibility.Collapsed;
303新增:
304新增: var webCategory = new WebCategoryModel()
305新增: {
306新增: Count = 0,
307新增: Data = category,
308新增: };
309新增: if (WebCategoryData.Count == 0)
310新增: {
311新增: WebCategoryData = new System.Collections.ObjectModel.ObservableCollection<WebCategoryModel>()
312新增: {
313新增: webCategory
314新增: };
315新增: }
316新增: else
317新增: {
318新增: WebCategoryData.Add(webCategory);
319新增: }
320新增:
321新增: }
322新增: else
323新增: {
324新增: mainVM.Toast("创建失败", Controls.Window.ToastType.Error, Controls.Base.IconTypes.ImportantBadge12);
325新增: }
326新增:
327新增:
328新增:
329新增: }
330新增: else
331新增: {
332新增: // 编辑分类
333新增:
334新增: // 判断重复分类名称
335新增: if (WebCategoryData.Where(m => m.Data.Name == EditName && m.Data.ID != SelectedWebCategoryItem.Data.ID).Any())
336新增: {
337新增: mainVM.Toast("分类名称已存在", Controls.Window.ToastType.Error, Controls.Base.IconTypes.ImportantBadge12);
338新增: return;
339新增: }
340新增: if (WebCategoryData.Where(m => m.Data.Color == EditColor && m.Data.ID != SelectedWebCategoryItem.Data.ID).Any())
341新增: {
342新增: mainVM.Toast("颜色已存在,请重新选择", Controls.Window.ToastType.Error, Controls.Base.IconTypes.ImportantBadge12);
343新增: return;
344新增: }
345新增: if (EditName == SelectedWebCategoryItem.Data.Name && EditIconFile == SelectedWebCategoryItem.Data.IconFile && EditColor == SelectedWebCategoryItem.Data.Color)
346新增: {
347新增: mainVM.Toast("没有修改");
348新增: EditVisibility = System.Windows.Visibility.Collapsed;
349新增: return;
350新增: }
351新增: mainVM.Toast("已更新", Controls.Window.ToastType.Success);
352新增:
353新增: var category = SelectedWebCategoryItem.Data;
354新增: category.Name = EditName;
355新增: category.IconFile = EditIconFile;
356新增: category.Color = EditColor;
357新增:
358新增: _webData.UpdateWebSiteCategory(category);
359新增:
360新增: var item = WebCategoryData.Where(m => m.Data.ID == category.ID).FirstOrDefault();
361新增: var index = WebCategoryData.IndexOf(item);
362新增: WebCategoryData[index] = new WebCategoryModel()
363新增: {
364新增: Count = SelectedWebCategoryItem.Count,
365新增: Data = category
366新增: };
367新增: EditVisibility = System.Windows.Visibility.Collapsed;
368新增: }
369新增: }
370新增: #endregion
371新增:
372新增: #region 删除分类
373新增: private void DelWebSiteCategory()
374新增: {
375新增: if (SelectedWebCategoryItem == null)
376新增: {
377新增: return;
378新增: }
379新增:
380新增: _webData.DeleteWebSiteCategory(SelectedWebCategoryItem.Data);
381新增:
382新增: // 从界面移除
383新增: WebCategoryData.Remove(SelectedWebCategoryItem);
384新增: if (WebCategoryData.Count == 0)
385新增: {
386新增: WebCategoryData = new System.Collections.ObjectModel.ObservableCollection<WebCategoryModel>();
387新增: }
388新增: mainVM.Toast("分类已删除", Controls.Window.ToastType.Success);
389新增:
390新增: }
391新增: #endregion
392新增: #endregion
220393
221394 private void OnEdit(object obj)
222395 {
@@ -225,10 +398,12 @@ namespace UI.ViewModels
225398
226399 if (obj != null)
227400 {
228删除: var select = obj as CategoryModel;
229删除: EditName = select.Data.Name;
230删除: EditIconFile = select.Data.IconFile;
231删除: EditColor = string.IsNullOrEmpty(select.Data.Color) ? "#00FFAB" : select.Data.Color;
401新增: var appCategory = obj as CategoryModel;
402新增: var webCategory = obj as WebCategoryModel;
403新增:
404新增: EditName = appCategory == null ? webCategory.Data.Name : appCategory.Data.Name;
405新增: EditIconFile = appCategory == null ? webCategory.Data.IconFile : appCategory.Data.IconFile;
406新增: EditColor = string.IsNullOrEmpty(appCategory == null ? webCategory.Data.Color : appCategory.Data.Color) ? "#00FFAB" : appCategory == null ? webCategory.Data.Color : appCategory.Data.Color;
232407 }
233408 else
234409 {
@@ -240,38 +415,67 @@ namespace UI.ViewModels
240415
241416 private void CategoryPageVM_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
242417 {
243删除: if (e.PropertyName == nameof(SelectedItem))
418新增: if (e.PropertyName == nameof(SelectedAppCategoryItem))
244419 {
245420 //GotoAppList();
246421 }
247422 }
248423
249删除: private void OnGotoAppList(object obj)
424新增: private void OnGotoList(object obj)
250425 {
251删除: GotoAppList();
426新增: GotoList();
252427 }
253428
254429 private void LoadData()
255430 {
256删除: Data = new System.Collections.ObjectModel.ObservableCollection<CategoryModel>();
257删除: foreach (var item in categorys.GetCategories())
431新增: Task.Run(() =>
258432 {
259删除: Data.Add(new CategoryModel()
433新增: Data = new System.Collections.ObjectModel.ObservableCollection<CategoryModel>();
434新增: foreach (var item in categorys.GetCategories())
260435 {
261删除: Count = appData.GetAppsByCategoryID(item.ID).Count,
262删除: Data = item
263删除: });
264删除: }
436新增: Data.Add(new CategoryModel()
437新增: {
438新增: Count = appData.GetAppsByCategoryID(item.ID).Count,
439新增: Data = item
440新增: });
441新增: }
442新增:
443新增: var webCategories = _webData.GetWebSiteCategories();
444新增: var webCategoryData = new List<WebCategoryModel>();
445新增:
446新增: foreach (var item in webCategories)
447新增: {
448新增: webCategoryData.Add(new WebCategoryModel()
449新增: {
450新增: Data = item,
451新增: Count = _webData.GetWebSitesCount(item.ID)
452新增: });
453新增: }
454新增: WebCategoryData = new System.Collections.ObjectModel.ObservableCollection<WebCategoryModel>(webCategoryData);
455新增: });
265456 }
266457
267删除: private void GotoAppList()
458新增: private void GotoList()
268459 {
269删除: if (SelectedItem != null)
460新增: if (ShowType.Id == 0 && SelectedAppCategoryItem != null)
270461 {
271删除: mainVM.Data = SelectedItem;
462新增: mainVM.Data = SelectedAppCategoryItem;
272463 mainVM.Uri = nameof(CategoryAppListPage);
273删除: SelectedItem = null;
464新增: SelectedAppCategoryItem = null;
465新增: }
466新增: else if (ShowType.Id == 1 && SelectedWebCategoryItem != null)
467新增: {
468新增: mainVM.Data = SelectedWebCategoryItem.Data;
469新增: mainVM.Uri = nameof(CategoryWebSiteListPage);
470新增: SelectedWebCategoryItem = null;
274471 }
275472 }
473新增:
474新增: public override void Dispose()
475新增: {
476新增: base.Dispose();
477新增: PropertyChanged -= CategoryPageVM_PropertyChanged;
478新增: Data = null;
479新增: }
276480 }
277481}
新增UI/ViewModels/CategoryWebSiteListPageVM.cs+189 −0看文件
@@ -0,0 +1,189 @@
1新增:using Core.Models;
2新增:using Core.Models.Db;
3新增:using Core.Servicers.Instances;
4新增:using Core.Servicers.Interfaces;
5新增:using System;
6新增:using System.Collections.Generic;
7新增:using System.Diagnostics;
8新增:using System.Linq;
9新增:using System.Text;
10新增:using System.Threading.Tasks;
11新增:using UI.Controls;
12新增:using UI.Models;
13新增:using UI.Models.Category;
14新增:using UI.Models.CategoryAppList;
15新增:using UI.Views;
16新增:
17新增:namespace UI.ViewModels
18新增:{
19新增: public class CategoryWebSiteListPageVM : CategoryWebSiteListPageModel
20新增: {
21新增: private readonly MainViewModel _mainVM;
22新增: private readonly IWebData _webData;
23新增: public Command ShowChooseCommand { get; set; }
24新增: public Command ChoosedCommand { get; set; }
25新增: public Command GotoDetailCommand { get; set; }
26新增: public Command SearchCommand { get; set; }
27新增: public Command ChooseCloseCommand { get; set; }
28新增: public Command DelCommand { get; set; }
29新增: private List<OptionModel> _webSiteOptionsTemp;
30新增: public CategoryWebSiteListPageVM(MainViewModel mainVM_, IWebData webData_)
31新增: {
32新增: _mainVM = mainVM_;
33新增: _webData = webData_;
34新增: Category = mainVM_.Data as WebSiteCategoryModel;
35新增:
36新增: ShowChooseCommand = new Command(new Action<object>(OnShowChoose));
37新增: ChoosedCommand = new Command(new Action<object>(OnChoosed));
38新增: GotoDetailCommand = new Command(new Action<object>(OnGotoDetail));
39新增: SearchCommand = new Command(new Action<object>(OnSearch));
40新增: ChooseCloseCommand = new Command(new Action<object>(OnChooseClose));
41新增: DelCommand = new Command(new Action<object>(OnDel));
42新增:
43新增: LoadWebsiteList();
44新增: }
45新增:
46新增: private void LoadWebsiteList()
47新增: {
48新增: if (Category == null)
49新增: {
50新增: _mainVM.Toast("参数错误", Controls.Window.ToastType.Error, Controls.Base.IconTypes.Error);
51新增: return;
52新增: }
53新增: Task.Run(() =>
54新增: {
55新增: var list = _webData.GetWebSites(Category.ID);
56新增: CategoryWebSiteList = new System.Collections.ObjectModel.ObservableCollection<Core.Models.Db.WebSiteModel>(list);
57新增:
58新增: LoadWebSiteOptionList();
59新增: });
60新增: }
61新增:
62新增: /// <summary>
63新增: /// 加载可选站点列表
64新增: /// </summary>
65新增: private void LoadWebSiteOptionList()
66新增: {
67新增: var list = _webData.GetUnSetCategoryWebSites();
68新增: list = list.Concat(CategoryWebSiteList).OrderBy(m => m.Title).ToList();
69新增:
70新增: var optionList = new List<OptionModel>();
71新增: foreach (var site in list)
72新增: {
73新增: optionList.Add(new OptionModel()
74新增: {
75新增: IsChecked = site.CategoryID == Category.ID,
76新增: OptionValue = new Controls.Select.SelectItemModel
77新增: {
78新增: Name = $"{site.Title} - {site.Domain}",
79新增: Img = site.IconFile
80新增: },
81新增: WebSite = site
82新增: });
83新增: }
84新增: WebSiteOptionList = optionList;
85新增: _webSiteOptionsTemp = new List<OptionModel>(WebSiteOptionList);
86新增: }
87新增: private void OnDel(object obj)
88新增: {
89新增: if (SelectedItem != null)
90新增: {
91新增: _webData.UpdateWebSitesCategory(new int[] { SelectedItem.ID }, 0);
92新增: CategoryWebSiteList.Remove(SelectedItem);
93新增: if (CategoryWebSiteList.Count == 0)
94新增: {
95新增: CategoryWebSiteList = new System.Collections.ObjectModel.ObservableCollection<WebSiteModel>();
96新增: }
97新增:
98新增: Task.Run(() =>
99新增: {
100新增: LoadWebSiteOptionList();
101新增: });
102新增: }
103新增: }
104新增:
105新增: private void OnChooseClose(object obj)
106新增: {
107新增: ChooseVisibility = System.Windows.Visibility.Collapsed;
108新增: SearchInput = "";
109新增: }
110新增:
111新增: private void OnSearch(object obj)
112新增: {
113新增: string keyword = obj.ToString();
114新增: if (string.IsNullOrEmpty(keyword))
115新增: {
116新增: WebSiteOptionList = new List<OptionModel>(_webSiteOptionsTemp);
117新增: }
118新增: else
119新增: {
120新增: WebSiteOptionList = _webSiteOptionsTemp.Where(m => m.WebSite.Title.Contains(keyword) || m.WebSite.Domain.Contains(keyword)).ToList();
121新增: }
122新增: }
123新增:
124新增:
125新增:
126新增: private void OnGotoDetail(object obj)
127新增: {
128新增: if (SelectedItem != null)
129新增: {
130新增: _mainVM.Data = SelectedItem;
131新增: _mainVM.Uri = nameof(WebSiteDetailPage);
132新增: }
133新增: }
134新增:
135新增: private void OnChoosed(object obj)
136新增: {
137新增: ChooseVisibility = System.Windows.Visibility.Collapsed;
138新增: SearchInput = "";
139新增: _webSiteOptionsTemp = new List<OptionModel>(WebSiteOptionList);
140新增: UpdateCategory();
141新增: }
142新增:
143新增: private void UpdateCategory()
144新增: {
145新增: var removeSiteList = WebSiteOptionList.Where(m => m.IsChecked == false && CategoryWebSiteList.Where(s => s.ID == m.WebSite.ID).Any()).Select(m => m.WebSite.ID).ToList();
146新增: var addSiteList = WebSiteOptionList.Where(m => m.IsChecked == true && !CategoryWebSiteList.Where(s => s.ID == m.WebSite.ID).Any()).Select(m => m.WebSite).ToList();
147新增:
148新增: foreach (var id in removeSiteList)
149新增: {
150新增: var item = CategoryWebSiteList.Where(m => m.ID == id).FirstOrDefault();
151新增: if (item != null)
152新增: {
153新增: CategoryWebSiteList.Remove(item);
154新增: }
155新增: }
156新增:
157新增: if (CategoryWebSiteList.Count == 0)
158新增: {
159新增: CategoryWebSiteList = new System.Collections.ObjectModel.ObservableCollection<WebSiteModel>(addSiteList);
160新增: }
161新增: else
162新增: {
163新增: foreach (var item in addSiteList)
164新增: {
165新增: CategoryWebSiteList.Add(item);
166新增: }
167新增: }
168新增: // 从分类中移除
169新增: if (removeSiteList.Count > 0)
170新增: {
171新增: _webData.UpdateWebSitesCategory(removeSiteList.ToArray(), 0);
172新增: }
173新增:
174新增: // 添加到分类
175新增: if (addSiteList.Count > 0)
176新增: {
177新增: _webData.UpdateWebSitesCategory(addSiteList.Select(m => m.ID).ToArray(), Category.ID);
178新增: }
179新增: }
180新增:
181新增: private void OnShowChoose(object obj)
182新增: {
183新增: ChooseVisibility = System.Windows.Visibility.Visible;
184新增: }
185新增:
186新增:
187新增:
188新增: }
189新增:}
修改UI/ViewModels/ChartPageVM.cs+245 −17看文件
@@ -1,5 +1,6 @@
11using Core.Librarys;
22using Core.Models;
3新增:using Core.Models.Db;
34using Core.Servicers.Interfaces;
45using System;
56using System.Collections.Generic;
@@ -8,6 +9,7 @@ using System.Linq;
89using System.Text;
910using System.Text.RegularExpressions;
1011using System.Threading.Tasks;
12新增:using System.Windows.Documents;
1113using UI.Controls;
1214using UI.Controls.Charts.Model;
1315using UI.Controls.Select;
@@ -24,20 +26,24 @@ namespace UI.ViewModels
2426 private readonly MainViewModel mainVM;
2527 private readonly IAppContextMenuServicer appContextMenuServicer;
2628 private readonly IInputServicer inputServicer;
29新增: private readonly IWebData _webData;
30新增: private readonly IWebSiteContextMenuServicer _webSiteContextMenu;
2731
2832 private double totalTime_ = 0;
2933 private int appCount_ = 0;
3034 public Command ToDetailCommand { get; set; }
3135 public Command RefreshCommand { get; set; }
3236 public List<SelectItemModel> ChartDataModeOptions { get; set; }
33删除: public ChartPageVM(IData data, ICategorys categorys, MainViewModel mainVM, IAppContextMenuServicer appContextMenuServicer, IInputServicer inputServicer)
37新增:
38新增: public ChartPageVM(IData data, ICategorys categorys, MainViewModel mainVM, IAppContextMenuServicer appContextMenuServicer, IInputServicer inputServicer, IWebData webData_, IWebSiteContextMenuServicer webSiteContextMenu_)
3439 {
3540 this.data = data;
3641 this.categorys = categorys;
3742 this.mainVM = mainVM;
3843 this.appContextMenuServicer = appContextMenuServicer;
3944 this.inputServicer = inputServicer;
40删除:
45新增: _webData = webData_;
46新增: _webSiteContextMenu = webSiteContextMenu_;
4147
4248 ToDetailCommand = new Command(new Action<object>(OnTodetailCommand));
4349 RefreshCommand = new Command(new Action<object>(OnRefreshCommand));
@@ -56,7 +62,7 @@ namespace UI.ViewModels
5662 {
5763 Name = "上周"
5864 });
59删除:
65新增:
6066 var chartDataModeOptions = new List<SelectItemModel>
6167 {
6268 new SelectItemModel()
@@ -78,7 +84,7 @@ namespace UI.ViewModels
7884
7985 ChartDataModeOptions = chartDataModeOptions;
8086 ChartDataMode = chartDataModeOptions[0];
81删除:
87新增: //ShowType = ShowTypeOptions[0];
8288 WeekOptions = weekOptions;
8389 SelectedWeek = weekOptions[0];
8490 MonthDate = DateTime.Now;
@@ -90,8 +96,8 @@ namespace UI.ViewModels
9096
9197 PropertyChanged += ChartPageVM_PropertyChanged;
9298 inputServicer.OnKeyUpInput += InputServicer_OnKeyUpInput;
93删除:
9499 AppContextMenu = appContextMenuServicer.GetContextMenu();
100新增: WebSiteContextMenu = _webSiteContextMenu.GetContextMenu();
95101 }
96102
97103
@@ -108,20 +114,27 @@ namespace UI.ViewModels
108114
109115 if (data != null)
110116 {
111删除: var model = data.Data as DailyLogModel;
112删除: var app = model != null ? model.AppModel : null;
113删除:
114删除: if (model == null)
117新增: if (data.Data is WebSiteModel)
115118 {
116删除: app = (data.Data as HoursLogModel).AppModel;
119新增: mainVM.Data = data.Data;
120新增: mainVM.Uri = nameof(WebSiteDetailPage);
117121 }
118删除:
119删除: if (app != null)
122新增: else
120123 {
121删除: mainVM.Data = app;
122删除: mainVM.Uri = nameof(DetailPage);
123删除: }
124新增: var model = data.Data as DailyLogModel;
125新增: var app = model != null ? model.AppModel : null;
124126
127新增: if (model == null)
128新增: {
129新增: app = (data.Data as HoursLogModel).AppModel;
130新增: }
131新增:
132新增: if (app != null)
133新增: {
134新增: mainVM.Data = app;
135新增: mainVM.Uri = nameof(DetailPage);
136新增: }
137新增: }
125138 }
126139 }
127140 private void OnRefreshCommand(object obj)
@@ -177,6 +190,10 @@ namespace UI.ViewModels
177190 }
178191 LoadData();
179192 }
193新增: if (e.PropertyName == nameof(WebColSelectedIndex))
194新增: {
195新增: LoadWebSitesColSelectedData();
196新增: }
180197 }
181198
182199
@@ -212,10 +229,12 @@ namespace UI.ViewModels
212229 private void LoadDayData()
213230 {
214231 ColumnSelectedIndex = -1;
232新增: WebColSelectedIndex = -1;
233新增:
215234 DataMaximum = 3600;
216235 Task.Run(() =>
217236 {
218删除:
237新增: // 应用数据
219238 var chartData = new List<ChartsDataModel>();
220239 var sumData = new List<ChartsDataModel>();
221240
@@ -275,6 +294,9 @@ namespace UI.ViewModels
275294 totalTime_ = totalUse;
276295 TotalHours = Time.ToHoursString(totalUse);
277296 LoadTopData();
297新增:
298新增: // 网页数据
299新增: LoadWebData(Date, Date);
278300 });
279301 }
280302
@@ -284,6 +306,8 @@ namespace UI.ViewModels
284306 private void LoadWeekData()
285307 {
286308 ColumnSelectedIndex = -1;
309新增: WebColSelectedIndex = -1;
310新增:
287311 DataMaximum = 0;
288312 Task.Run(() =>
289313 {
@@ -352,6 +376,9 @@ namespace UI.ViewModels
352376 double totalUse = Data.Sum(m => m.Values.Sum());
353377 totalTime_ = totalUse;
354378 TotalHours = Time.ToHoursString(totalUse);
379新增:
380新增: // 网页数据
381新增: LoadWebData(weekDateArr[0], weekDateArr[1]);
355382 });
356383
357384
@@ -365,6 +392,7 @@ namespace UI.ViewModels
365392 private void LoadMonthlyData()
366393 {
367394 ColumnSelectedIndex = -1;
395新增: WebColSelectedIndex = -1;
368396 DataMaximum = 0;
369397 Task.Run(() =>
370398 {
@@ -427,6 +455,9 @@ namespace UI.ViewModels
427455 totalTime_ = totalUse;
428456 TotalHours = Time.ToHoursString(totalUse);
429457 LoadTopData();
458新增:
459新增: // 网页数据
460新增: LoadWebData(dateArr[0], dateArr[1]);
430461 });
431462
432463 }
@@ -437,6 +468,8 @@ namespace UI.ViewModels
437468 private void LoadYearData()
438469 {
439470 ColumnSelectedIndex = -1;
471新增: WebColSelectedIndex = -1;
472新增:
440473 DataMaximum = 0;
441474 Task.Run(() =>
442475 {
@@ -509,6 +542,10 @@ namespace UI.ViewModels
509542 totalTime_ = totalUse;
510543 TotalHours = Time.ToHoursString(totalUse);
511544 LoadTopData();
545新增:
546新增: // 网页数据
547新增: var dateArr = Time.GetYearDate(YearDate);
548新增: LoadWebData(dateArr[0], dateArr[1]);
512549 });
513550 }
514551
@@ -572,7 +609,6 @@ namespace UI.ViewModels
572609 var weekDateArr = Time.GetLastWeekDate();
573610 dateStart = weekDateArr[0];
574611 dateEnd = weekDateArr[1];
575删除:
576612 }
577613 else if (TabbarSelectedIndex == 2)
578614 {
@@ -631,6 +667,10 @@ namespace UI.ViewModels
631667 DiffAppCountType = "0";
632668 }
633669 DiffAppCountValue = DiffAppCountType == "0" ? string.Empty : Math.Abs(diffAppCount).ToString();
670新增:
671新增: LastWebTotalTime = _webData.GetBrowseDurationTotal(dateStart, dateEnd);
672新增: LastWebSiteCount = _webData.GetBrowseSitesTotal(dateStart, dateEnd);
673新增: LastWebPageCount = _webData.GetBrowsePagesTotal(dateStart, dateEnd);
634674 }
635675
636676 private List<ChartsDataModel> MapToChartsData(IEnumerable<Core.Models.DailyLogModel> list)
@@ -734,5 +774,193 @@ namespace UI.ViewModels
734774 }
735775
736776
777新增: #region 网页数据
778新增: private void LoadWebData(DateTime start_, DateTime end_)
779新增: {
780新增: LoadCategoriesStatistics(start_, end_);
781新增: LoadWebBrowseDataStatistics(start_, end_);
782新增: LoadWebSitesTopData(start_, end_);
783新增: WebTotalTime = _webData.GetBrowseDurationTotal(start_, end_);
784新增: WebSiteCount = _webData.GetBrowseSitesTotal(start_, end_);
785新增: WebPageCount = _webData.GetBrowsePagesTotal(start_, end_);
786新增: WebTotalTimeText = Time.ToHoursString(WebTotalTime);
787新增: }
788新增:
789新增: /// <summary>
790新增: /// 分类饼图
791新增: /// </summary>
792新增: /// <param name="start_"></param>
793新增: /// <param name="end_"></param>
794新增: private void LoadCategoriesStatistics(DateTime start_, DateTime end_)
795新增: {
796新增: Task.Run(() =>
797新增: {
798新增: var chartsDatas = new List<ChartsDataModel>();
799新增: var data = _webData.GetCategoriesStatistics(start_, end_);
800新增: foreach (var item in data)
801新增: {
802新增: var category = _webData.GetWebSiteCategory(item.ID);
803新增: var bindModel = new ChartsDataModel();
804新增: bindModel.Name = item.ID == 0 ? "未分类" : item.Name;
805新增: bindModel.Value = item.Value;
806新增: bindModel.Data = item;
807新增: bindModel.Color = item.ID == 0 ? "#ccc" : category.Color;
808新增: bindModel.PopupText = bindModel.Name + " " + Time.ToString((int)item.Value);
809新增: bindModel.Icon = item.ID == 0 ? "" : category.IconFile;
810新增: chartsDatas.Add(bindModel);
811新增: }
812新增: WebCategoriesPieData = chartsDatas.OrderByDescending(m => m.Value).ToList();
813新增:
814新增: });
815新增: }
816新增:
817新增: private void LoadWebBrowseDataStatistics(DateTime start_, DateTime end_)
818新增: {
819新增: Task.Run(() =>
820新增: {
821新增: var chartData = new List<ChartsDataModel>();
822新增: var data = _webData.GetBrowseDataByCategoryStatistics(start_, end_);
823新增: // 转换为图表格式数据
824新增: var emptyCategory = new WebSiteCategoryModel()
825新增: {
826新增: ID = 0,
827新增: Name = "未分类",
828新增: IconFile = "pack://application:,,,/Tai;component/Resources/Icons/tai32.ico"
829新增: };
830新增:
831新增: string[] colNames = { };
832新增:
833新增: if (TabbarSelectedIndex == 1)
834新增: {
835新增: colNames = new string[] { "周一", "周二", "周三", "周四", "周五", "周六", "周日", };
836新增: }
837新增: else if (TabbarSelectedIndex == 3)
838新增: {
839新增: colNames = new string[12];
840新增: for (int i = 0; i < 12; i++)
841新增: {
842新增: colNames[i] = (i + 1) + "月";
843新增: }
844新增: }
845新增:
846新增: foreach (var item in data)
847新增: {
848新增: var category = _webData.GetWebSiteCategory(item.CategoryID);
849新增: if (item.CategoryID == 0)
850新增: {
851新增: category = emptyCategory;
852新增: }
853新增: if (category != null)
854新增: {
855新增: var dataItem = new ChartsDataModel()
856新增: {
857新增:
858新增: Name = category.Name,
859新增: Icon = category.IconFile,
860新增: Values = item.Values,
861新增: Color = category.Color,
862新增: ColumnNames = colNames
863新增: };
864新增: if (category.ID == 0)
865新增: {
866新增: dataItem.Color = "#E5F7F6F2";
867新增: }
868新增: chartData.Add(dataItem);
869新增: }
870新增: }
871新增:
872新增: //var chartsDatas = new List<ChartsDataModel>();
873新增: //var bindModel = new ChartsDataModel();
874新增: //bindModel.Values = data.Select(m => m.Value).ToArray();
875新增: //bindModel.Color = StateData.ThemeColor;
876新增: //chartsDatas.Add(bindModel);
877新增: WebBrowseStatisticsData = chartData;
878新增: });
879新增: }
880新增:
881新增: private void LoadWebSitesTopData(DateTime start_, DateTime end_)
882新增: {
883新增: Task.Run(() =>
884新增: {
885新增: var data = _webData.GetDateRangeWebSiteList(start_, end_, 10);
886新增: WebSitesTopData = MapToChartData(data);
887新增: });
888新增: }
889新增: private void LoadWebSitesColSelectedData()
890新增: {
891新增: if (WebColSelectedIndex < 0)
892新增: {
893新增: WebSitesColSelectedTimeText = String.Empty;
894新增: WebSitesColSelectedData = new List<ChartsDataModel>();
895新增: return;
896新增: }
897新增: Task.Run(() =>
898新增: {
899新增:
900新增: var chartData = new List<ChartsDataModel>();
901新增: bool isTime = false;
902新增: DateTime startTime = DateTime.Now, endTime = DateTime.Now;
903新增: if (TabbarSelectedIndex == 0)
904新增: {
905新增: // 天
906新增: var time = new DateTime(Date.Year, Date.Month, Date.Day, WebColSelectedIndex, 0, 0);
907新增: WebSitesColSelectedTimeText = time.ToString("yyyy年MM月dd日 HH点");
908新增: isTime = true;
909新增: startTime = endTime = time;
910新增: }
911新增: else if (TabbarSelectedIndex == 1)
912新增: {
913新增: // 周
914新增: var weekDateArr = SelectedWeek.Name == "本周" ? Time.GetThisWeekDate() : Time.GetLastWeekDate();
915新增: var time = weekDateArr[0].AddDays(WebColSelectedIndex);
916新增: WebSitesColSelectedTimeText = time.ToString("yyyy年MM月dd日");
917新增: startTime = endTime = time;
918新增: }
919新增: else if (TabbarSelectedIndex == 2)
920新增: {
921新增: // 月
922新增: var dateArr = Time.GetMonthDate(MonthDate);
923新增: var time = dateArr[0].AddDays(WebColSelectedIndex);
924新增: WebSitesColSelectedTimeText = time.ToString("yyyy年MM月dd日");
925新增: startTime = endTime = time;
926新增: }
927新增: else if (TabbarSelectedIndex == 3)
928新增: {
929新增: // 年
930新增: var dateStart = new DateTime(YearDate.Year, WebColSelectedIndex + 1, 1);
931新增: var dateEnd = new DateTime(dateStart.Year, dateStart.Month, DateTime.DaysInMonth(dateStart.Year, dateStart.Month), 23, 59, 59);
932新增:
933新增: WebSitesColSelectedTimeText = dateStart.ToString("yyyy年MM月");
934新增:
935新增: startTime = dateStart;
936新增: endTime = dateEnd;
937新增:
938新增: }
939新增:
940新增:
941新增: chartData = MapToChartData(_webData.GetDateRangeWebSiteList(startTime, endTime, 0, -1, isTime));
942新增:
943新增: WebSitesColSelectedData = chartData;
944新增: });
945新增: }
946新增: private List<ChartsDataModel> MapToChartData(IEnumerable<Core.Models.Db.WebSiteModel> list)
947新增: {
948新增: var resData = new List<ChartsDataModel>();
949新增:
950新增: foreach (var item in list)
951新增: {
952新增: var bindModel = new ChartsDataModel();
953新增: bindModel.Data = item;
954新增: bindModel.Name = item.Title;
955新增: bindModel.Value = item.Duration;
956新增: bindModel.Tag = Time.ToString(item.Duration);
957新增: bindModel.PopupText = item.Domain;
958新增: bindModel.Icon = item.IconFile;
959新增: resData.Add(bindModel);
960新增: }
961新增:
962新增: return resData;
963新增: }
964新增: #endregion
737965 }
738966}
修改UI/ViewModels/DataPageVM.cs+86 −30看文件
@@ -15,6 +15,7 @@ using UI.Controls.Charts.Model;
1515using UI.Models;
1616using UI.Servicers;
1717using UI.Views;
18新增:using static UI.Controls.SettingPanel.SettingPanel;
1819
1920namespace UI.ViewModels
2021{
@@ -25,13 +26,17 @@ namespace UI.ViewModels
2526 private readonly MainViewModel main;
2627 private readonly IAppContextMenuServicer appContextMenuServicer;
2728 private readonly IAppConfig appConfig;
29新增: private readonly IWebData _webData;
30新增: private readonly IWebSiteContextMenuServicer _webSiteContextMenu;
2831
29删除: public DataPageVM(IData data, MainViewModel main, IAppContextMenuServicer appContextMenuServicer, IAppConfig appConfig)
32新增: public DataPageVM(IData data, MainViewModel main, IAppContextMenuServicer appContextMenuServicer, IAppConfig appConfig, IWebData webData, IWebSiteContextMenuServicer webSiteContextMenu)
3033 {
3134 this.data = data;
3235 this.main = main;
3336 this.appContextMenuServicer = appContextMenuServicer;
3437 this.appConfig = appConfig;
38新增: _webData = webData;
39新增: _webSiteContextMenu = webSiteContextMenu;
3540
3641 ToDetailCommand = new Command(new Action<object>(OnTodetailCommand));
3742
@@ -71,6 +76,11 @@ namespace UI.ViewModels
7176 main.Data = model.AppModel;
7277 main.Uri = nameof(DetailPage);
7378 }
79新增: else
80新增: {
81新增: main.Data = data.Data as Core.Models.Db.WebSiteModel;
82新增: main.Uri = nameof(WebSiteDetailPage);
83新增: }
7484 }
7585 }
7686
@@ -81,18 +91,15 @@ namespace UI.ViewModels
8191 {
8292 LoadData(DayDate);
8393 }
84删除:
85删除: if (e.PropertyName == nameof(MonthDate))
94新增: else if (e.PropertyName == nameof(MonthDate))
8695 {
8796 LoadData(MonthDate);
8897 }
89删除:
90删除: if (e.PropertyName == nameof(YearDate))
98新增: else if (e.PropertyName == nameof(YearDate))
9199 {
92100 LoadData(YearDate);
93101 }
94删除:
95删除: if (e.PropertyName == nameof(TabbarSelectedIndex))
102新增: else if (e.PropertyName == nameof(TabbarSelectedIndex))
96103 {
97104 if (TabbarSelectedIndex == 0)
98105 {
@@ -100,10 +107,6 @@ namespace UI.ViewModels
100107 {
101108 DayDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);
102109 }
103删除: //else
104删除: //{
105删除: // LoadData(DayDate);
106删除: //}
107110
108111 }
109112 else if (TabbarSelectedIndex == 1)
@@ -112,10 +115,6 @@ namespace UI.ViewModels
112115 {
113116 MonthDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
114117 }
115删除: //else
116删除: //{
117删除: // LoadData(MonthDate);
118删除: //}
119118 }
120119 else if (TabbarSelectedIndex == 2)
121120 {
@@ -123,10 +122,20 @@ namespace UI.ViewModels
123122 {
124123 YearDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
125124 }
126删除: //else
127删除: //{
128删除: // LoadData(YearDate);
129删除: //}
125新增: }
126新增: }
127新增: else if (e.PropertyName == nameof(ShowType))
128新增: {
129新增: LoadData(DayDate, 0);
130新增: LoadData(MonthDate, 1);
131新增: LoadData(YearDate, 2);
132新增: if (ShowType.Id == 0)
133新增: {
134新增: AppContextMenu = appContextMenuServicer.GetContextMenu();
135新增: }
136新增: else
137新增: {
138新增: AppContextMenu = _webSiteContextMenu.GetContextMenu();
130139 }
131140 }
132141 }
@@ -138,41 +147,54 @@ namespace UI.ViewModels
138147
139148
140149
141删除: private async void LoadData(DateTime date)
150新增: private async void LoadData(DateTime date, int dataType_ = -1)
142151 {
143删除:
144152 await Task.Run(() =>
145153 {
146154 DateTime dateStart = date, dateEnd = date;
147删除: if (TabbarSelectedIndex == 1)
155新增:
156新增: dataType_ = dataType_ == -1 ? TabbarSelectedIndex : dataType_;
157新增:
158新增: if (dataType_ == 1)
148159 {
149160 dateStart = new DateTime(date.Year, date.Month, 1);
150161 dateEnd = new DateTime(date.Year, date.Month, DateTime.DaysInMonth(date.Year, date.Month));
151162 }
152删除: else if (TabbarSelectedIndex == 0)
163新增: else if (dataType_ == 0)
153164 {
154165 dateStart = new DateTime(date.Year, date.Month, date.Day, 0, 0, 0);
155166 dateEnd = new DateTime(date.Year, date.Month, date.Day, 23, 59, 59);
156167 }
157删除: else if (TabbarSelectedIndex == 2)
168新增: else if (dataType_ == 2)
158169 {
159170 dateStart = new DateTime(date.Year, 1, 1, 0, 0, 0);
160171 dateEnd = new DateTime(date.Year, 12, DateTime.DaysInMonth(date.Year, 12), 23, 59, 59);
161172 }
162173
163删除: var list = data.GetDateRangelogList(dateStart, dateEnd);
174新增: List<ChartsDataModel> chartData = new List<ChartsDataModel>();
175新增: if (ShowType.Id == 0)
176新增: {
177新增: var result = data.GetDateRangelogList(dateStart, dateEnd);
178新增: chartData = MapToChartsData(result);
179新增: }
180新增: else
181新增: {
182新增: var result = _webData.GetWebSiteLogList(dateStart, dateEnd);
183新增: chartData = MapToChartsWebData(result);
184新增: }
185新增:
164186
165删除: if (TabbarSelectedIndex == 0)
187新增: if (dataType_ == 0)
166188 {
167删除: Data = MapToChartsData(list);
189新增: Data = chartData;
168190 }
169删除: else if (TabbarSelectedIndex == 1)
191新增: else if (dataType_ == 1)
170192 {
171删除: MonthData = MapToChartsData(list);
193新增: MonthData = chartData;
172194 }
173195 else
174196 {
175删除: YearData = MapToChartsData(list);
197新增: YearData = chartData;
176198 }
177199
178200 });
@@ -212,6 +234,40 @@ namespace UI.ViewModels
212234
213235 return resData;
214236 }
237新增:
238新增: private List<ChartsDataModel> MapToChartsWebData(IEnumerable<Core.Models.Db.WebSiteModel> list)
239新增: {
240新增: var resData = new List<ChartsDataModel>();
241新增: var config = appConfig.GetConfig();
242新增:
243新增: foreach (var item in list)
244新增: {
245新增: var bindModel = new ChartsDataModel();
246新增: bindModel.Data = item;
247新增: bindModel.Name = item.Title;
248新增: bindModel.Value = item.Duration;
249新增: bindModel.Tag = Time.ToString(item.Duration);
250新增: bindModel.PopupText = item.Domain;
251新增: bindModel.Icon = item.IconFile;
252新增: bindModel.BadgeList = new List<ChartBadgeModel>();
253新增: if (item.Category != null)
254新增: {
255新增: bindModel.BadgeList.Add(new ChartBadgeModel()
256新增: {
257新增: Name = item.Category.Name,
258新增: Color = item.Category.Color,
259新增: Type = ChartBadgeType.Category
260新增: });
261新增: }
262新增: if (config.Behavior.IgnoreURLList.Contains(item.Domain))
263新增: {
264新增: bindModel.BadgeList.Add(ChartBadgeModel.IgnoreBadge);
265新增: }
266新增: resData.Add(bindModel);
267新增: }
268新增:
269新增: return resData;
270新增: }
215271 #endregion
216272 #endregion
217273 }
修改UI/ViewModels/IndexPageVM.cs+97 −7看文件
@@ -1,6 +1,7 @@
11using Core.Librarys;
22using Core.Librarys.Image;
33using Core.Models;
4新增:using Core.Models.Db;
45using Core.Servicers.Interfaces;
56using System;
67using System.Collections.Generic;
@@ -13,6 +14,7 @@ using System.Windows;
1314using System.Windows.Media.Imaging;
1415using UI.Controls;
1516using UI.Controls.Charts.Model;
17新增:using UI.Controls.Select;
1618using UI.Models;
1719using UI.Servicers;
1820using UI.Views;
@@ -29,8 +31,18 @@ namespace UI.ViewModels
2931 private readonly IAppContextMenuServicer appContextMenuServicer;
3032 private readonly IInputServicer inputServicer;
3133 private readonly IAppConfig appConfig;
34新增: private readonly IWebData _webData;
35新增: private readonly IWebSiteContextMenuServicer _webSiteContextMenu;
36新增: public List<SelectItemModel> MoreTypeOptions { get; set; }
3237 public IndexPageVM(
33删除: IData data, MainViewModel main, IMain mainServicer, IAppContextMenuServicer appContextMenuServicer, IInputServicer inputServicer, IAppConfig appConfig)
38新增: IData data,
39新增: MainViewModel main,
40新增: IMain mainServicer,
41新增: IAppContextMenuServicer appContextMenuServicer,
42新增: IInputServicer inputServicer,
43新增: IAppConfig appConfig,
44新增: IWebData webData_,
45新增: IWebSiteContextMenuServicer webSiteContext_)
3446 {
3547 this.data = data;
3648 this.main = main;
@@ -38,6 +50,8 @@ namespace UI.ViewModels
3850 this.appContextMenuServicer = appContextMenuServicer;
3951 this.inputServicer = inputServicer;
4052 this.appConfig = appConfig;
53新增: _webData = webData_;
54新增: _webSiteContextMenu = webSiteContext_;
4155
4256 ToDetailCommand = new Command(new Action<object>(OnTodetailCommand));
4357 RefreshCommand = new Command(new Action<object>(OnRefreshCommand));
@@ -65,11 +79,26 @@ namespace UI.ViewModels
6579
6680 TabbarSelectedIndex = 0;
6781 AppContextMenu = appContextMenuServicer.GetContextMenu();
68删除:
82新增: WebSiteContextMenu = _webSiteContextMenu.GetContextMenu();
6983 PropertyChanged += IndexPageVM_PropertyChanged;
7084 inputServicer.OnKeyUpInput += InputServicer_OnKeyUpInput;
7185
7286 LoadData();
87新增:
88新增: MoreTypeOptions = new List<SelectItemModel>()
89新增: {
90新增: new SelectItemModel()
91新增: {
92新增: Id=0,
93新增: Name="应用"
94新增: },
95新增: new SelectItemModel()
96新增: {
97新增: Id=1,
98新增: Name="网页"
99新增: }
100新增: };
101新增: MoreType = MoreTypeOptions[0];
73102 }
74103
75104 private void InputServicer_OnKeyUpInput(object sender, System.Windows.Forms.Keys key)
@@ -87,11 +116,19 @@ namespace UI.ViewModels
87116
88117 if (data != null)
89118 {
90删除: var model = data.Data as DailyLogModel;
91删除: if (model != null && model.AppModel != null)
119新增: if (data.Data is DailyLogModel)
92120 {
93删除: main.Data = model.AppModel;
94删除: main.Uri = nameof(DetailPage);
121新增: var model = data.Data as DailyLogModel;
122新增: if (model != null && model.AppModel != null)
123新增: {
124新增: main.Data = model.AppModel;
125新增: main.Uri = nameof(DetailPage);
126新增: }
127新增: }
128新增: else if (data.Data is WebSiteModel)
129新增: {
130新增: main.Data = data.Data;
131新增: main.Uri = nameof(WebSiteDetailPage);
95132 }
96133
97134 }
@@ -120,10 +157,12 @@ namespace UI.ViewModels
120157 if (TabbarSelectedIndex == 0)
121158 {
122159 LoadTodayData();
160新增: LoadTodayMoreData();
123161 }
124162 else if (TabbarSelectedIndex == 1)
125163 {
126164 LoadThisWeekData();
165新增: LoadThisWeekMoreData();
127166 }
128167 //else
129168 //{
@@ -140,12 +179,26 @@ namespace UI.ViewModels
140179 {
141180 var list = data.GetDateRangelogList(DateTime.Now.Date, DateTime.Now.Date);
142181 var res = MapToChartsData(list);
182新增: var topWebList = _webData.GetDateRangeWebSiteList(DateTime.Now, DateTime.Now, FrequentUseNum);
183新增:
143184 IsLoading = false;
144185 WeekData = res;
186新增: WebFrequentUseData = MapToChartsData(topWebList);
145187 });
188新增: }
146189
190新增: private void LoadTodayMoreData()
191新增: {
192新增: IsLoading = true;
193新增: Task.Run(() =>
194新增: {
195新增: var appMoreData = data.GetDateRangelogList(DateTime.Now.Date, DateTime.Now.Date, MoreNum, FrequentUseNum);
196新增: var webMoreData = _webData.GetDateRangeWebSiteList(DateTime.Now.Date, DateTime.Now.Date, MoreNum, FrequentUseNum);
147197
148删除:
198新增: IsLoading = false;
199新增: AppMoreData = MapToChartsData(appMoreData);
200新增: WebMoreData = MapToChartsData(webMoreData);
201新增: });
149202 }
150203 #endregion
151204
@@ -158,12 +211,31 @@ namespace UI.ViewModels
158211 {
159212 var list = data.GetThisWeeklogList();
160213 var res = MapToChartsData(list);
214新增:
215新增: var week = Time.GetThisWeekDate();
216新增: var topWebList = _webData.GetDateRangeWebSiteList(week[0], week[1], FrequentUseNum);
217新增:
161218 IsLoading = false;
162219 WeekData = res;
220新增: WebFrequentUseData = MapToChartsData(topWebList);
163221 });
164222
165223
166224
225新增: }
226新增: private void LoadThisWeekMoreData()
227新增: {
228新增: IsLoading = true;
229新增: Task.Run(() =>
230新增: {
231新增: var week = Time.GetThisWeekDate();
232新增: var appMoreData = data.GetDateRangelogList(week[0], week[1], MoreNum, FrequentUseNum);
233新增: var webMoreData = _webData.GetDateRangeWebSiteList(week[0], week[1], MoreNum, FrequentUseNum);
234新增:
235新增: IsLoading = false;
236新增: AppMoreData = MapToChartsData(appMoreData);
237新增: WebMoreData = MapToChartsData(webMoreData);
238新增: });
167239 }
168240 #endregion
169241
@@ -211,6 +283,24 @@ namespace UI.ViewModels
211283
212284 return resData;
213285 }
286新增: private List<ChartsDataModel> MapToChartsData(IEnumerable<Core.Models.Db.WebSiteModel> list)
287新增: {
288新增: var resData = new List<ChartsDataModel>();
289新增:
290新增: foreach (var item in list)
291新增: {
292新增: var bindModel = new ChartsDataModel();
293新增: bindModel.Data = item;
294新增: bindModel.Name = item.Title;
295新增: bindModel.Value = item.Duration;
296新增: bindModel.Tag = Time.ToString(item.Duration);
297新增: bindModel.PopupText = item.Domain;
298新增: bindModel.Icon = item.IconFile;
299新增: resData.Add(bindModel);
300新增: }
301新增:
302新增: return resData;
303新增: }
214304 #endregion
215305 #endregion
216306 }
修改UI/ViewModels/MainViewModel.cs+25 −0看文件
@@ -129,5 +129,30 @@ namespace UI.ViewModels
129129 IsShowToast = true;
130130
131131 }
132新增:
133新增: /// <summary>
134新增: /// 显示一条错误的提醒消息
135新增: /// </summary>
136新增: /// <param name="message_">消息内容</param>
137新增: public void Error(string message_)
138新增: {
139新增: Toast(message_, ToastType.Error, IconTypes.Error);
140新增: }
141新增: /// <summary>
142新增: /// 显示一条普通提醒消息
143新增: /// </summary>
144新增: /// <param name="message_">消息内容</param>
145新增: public void Info(string message_)
146新增: {
147新增: Toast(message_, ToastType.Info, IconTypes.Info);
148新增: }
149新增: /// <summary>
150新增: /// 显示一条成功的提醒消息
151新增: /// </summary>
152新增: /// <param name="message_">消息内容</param>
153新增: public void Success(string message_)
154新增: {
155新增: Toast(message_, ToastType.Success, IconTypes.Accept);
156新增: }
132157 }
133158}
修改UI/ViewModels/SettingPageVM.cs+4 −1看文件
@@ -22,16 +22,18 @@ namespace UI.ViewModels
2222 private readonly IAppConfig appConfig;
2323 private readonly MainViewModel mainVM;
2424 private readonly IData data;
25新增: private readonly IWebData _webData;
2526 public Command OpenURL { get; set; }
2627 public Command CheckUpdate { get; set; }
2728 public Command DelDataCommand { get; set; }
2829 public Command ExportDataCommand { get; set; }
2930
30删除: public SettingPageVM(IAppConfig appConfig, MainViewModel mainVM, IData data)
31新增: public SettingPageVM(IAppConfig appConfig, MainViewModel mainVM, IData data, IWebData webData)
3132 {
3233 this.appConfig = appConfig;
3334 this.mainVM = mainVM;
3435 this.data = data;
36新增: _webData = webData;
3537
3638 OpenURL = new Command(new Action<object>(OnOpenURL));
3739 CheckUpdate = new Command(new Action<object>(OnCheckUpdate));
@@ -171,6 +173,7 @@ namespace UI.ViewModels
171173 }
172174
173175 data.ClearRange(DelDataStartMonthDate, DelDataEndMonthDate);
176新增: _webData.Clear(DelDataStartMonthDate, DelDataEndMonthDate);
174177
175178 mainVM.Toast("操作已完成", Controls.Window.ToastType.Success);
176179 }
新增UI/ViewModels/WebSiteDetailPageVM.cs+325 −0看文件
@@ -0,0 +1,325 @@
1新增:using Core.Librarys;
2新增:using Core.Models.Db;
3新增:using Core.Servicers.Instances;
4新增:using Core.Servicers.Interfaces;
5新增:using System;
6新增:using System.Collections.Generic;
7新增:using System.Diagnostics;
8新增:using System.Linq;
9新增:using System.Text;
10新增:using System.Text.RegularExpressions;
11新增:using System.Threading.Tasks;
12新增:using System.Windows;
13新增:using System.Windows.Controls;
14新增:using System.Windows.Markup;
15新增:using UI.Controls;
16新增:using UI.Controls.Charts.Model;
17新增:using UI.Controls.Select;
18新增:using UI.Models;
19新增:using UI.Servicers;
20新增:
21新增:namespace UI.ViewModels
22新增:{
23新增: public class WebSiteDetailPageVM : WebSiteDetailPageModel
24新增: {
25新增: private readonly IWebData _webData;
26新增: private readonly MainViewModel _mainVM;
27新增: private readonly IAppConfig _appConfig;
28新增: private readonly IWebFilter _webFilter;
29新增: private readonly IInputServicer _input;
30新增: public Command PageCommand { get; set; }
31新增:
32新增: private MenuItem _setCategoryMenuItem;
33新增: private MenuItem _blockMenuItem;
34新增: public WebSiteDetailPageVM(IWebData webData_, MainViewModel mainVM_, IAppConfig appConfig_, IWebFilter webFilter_, IInputServicer input_)
35新增: {
36新增: _webData = webData_;
37新增: _mainVM = mainVM_;
38新增: _appConfig = appConfig_;
39新增: _webFilter = webFilter_;
40新增: _input = input_;
41新增:
42新增: Init();
43新增: }
44新增:
45新增: private void OnPageCommand(object obj)
46新增: {
47新增: if (WebPageSelectedItem == null)
48新增: {
49新增: return;
50新增: }
51新增:
52新增: switch (obj.ToString())
53新增: {
54新增: case "Open":
55新增: Process.Start(WebPageSelectedItem.Url.Url);
56新增: break;
57新增: case "CopyURL":
58新增: Clipboard.SetText(WebPageSelectedItem.Url.Url);
59新增: break;
60新增: case "CopyTitle":
61新增: Clipboard.SetText(WebPageSelectedItem.Url.Title);
62新增: break;
63新增: }
64新增: }
65新增:
66新增: private void Init()
67新增: {
68新增: if (!(_mainVM.Data is WebSiteModel))
69新增: {
70新增: _mainVM.Error("参数错误");
71新增: return;
72新增: }
73新增:
74新增: WebSite = _mainVM.Data as WebSiteModel;
75新增:
76新增: TabbarData = new System.Collections.ObjectModel.ObservableCollection<string>()
77新增: {
78新增: "按天","按周","按月","按年"
79新增: };
80新增:
81新增: var weekOptions = new List<SelectItemModel>
82新增: {
83新增: new SelectItemModel()
84新增: {
85新增: Name = "本周"
86新增: },
87新增: new SelectItemModel()
88新增: {
89新增: Name = "上周"
90新增: }
91新增: };
92新增:
93新增: WeekOptions = weekOptions;
94新增: SelectedWeek = weekOptions[0];
95新增: MonthDate = DateTime.Now;
96新增: TabbarSelectedIndex = 0;
97新增: YearDate = DateTime.Now;
98新增: ChartDate = DateTime.Now;
99新增:
100新增: Load();
101新增: CreateContextMenu();
102新增:
103新增: PropertyChanged += WebSiteDetailPageVM_PropertyChanged;
104新增: _input.OnKeyUpInput += _input_OnKeyUpInput;
105新增:
106新增: PageCommand = new Command(new Action<object>(OnPageCommand));
107新增:
108新增: }
109新增:
110新增: private void _input_OnKeyUpInput(object sender, System.Windows.Forms.Keys key)
111新增: {
112新增: if (key == System.Windows.Forms.Keys.F5)
113新增: {
114新增: Load();
115新增: }
116新增: }
117新增:
118新增: private void Load()
119新增: {
120新增: IsIgnore = _webFilter.IsIgnore(WebSite.Domain);
121新增: LoadData();
122新增: LoadCategories();
123新增: }
124新增:
125新增: private void CreateContextMenu()
126新增: {
127新增: WebSiteContextMenu = new System.Windows.Controls.ContextMenu();
128新增: WebSiteContextMenu.Opened += WebSiteContextMenu_Opened;
129新增: MenuItem open = new MenuItem();
130新增: open.Header = "在浏览器打开网站";
131新增: open.Click += Open_Click;
132新增:
133新增: MenuItem copyDomain = new MenuItem();
134新增: copyDomain.Header = "复制域名";
135新增: copyDomain.Click += CopyDomain_Click;
136新增:
137新增: MenuItem reLoadData = new MenuItem();
138新增: reLoadData.Header = "刷新";
139新增: reLoadData.Click += ReLoadData_Click;
140新增:
141新增: _setCategoryMenuItem = new MenuItem();
142新增: _setCategoryMenuItem.Header = "设置分类";
143新增:
144新增: _blockMenuItem = new MenuItem();
145新增: _blockMenuItem.Header = "忽略此网站";
146新增: _blockMenuItem.Click += _blockMenuItem_Click;
147新增: WebSiteContextMenu.Items.Add(open);
148新增: WebSiteContextMenu.Items.Add(new Separator());
149新增: WebSiteContextMenu.Items.Add(reLoadData);
150新增: WebSiteContextMenu.Items.Add(new Separator());
151新增: WebSiteContextMenu.Items.Add(_setCategoryMenuItem);
152新增: WebSiteContextMenu.Items.Add(new Separator());
153新增: WebSiteContextMenu.Items.Add(_blockMenuItem);
154新增:
155新增: }
156新增:
157新增: private void CopyDomain_Click(object sender, RoutedEventArgs e)
158新增: {
159新增: Clipboard.SetText(WebSite.Domain);
160新增: }
161新增:
162新增: private void Open_Click(object sender, RoutedEventArgs e)
163新增: {
164新增: Process.Start("http://" + WebSite.Domain);
165新增: }
166新增:
167新增: private void ReLoadData_Click(object sender, RoutedEventArgs e)
168新增: {
169新增: Load();
170新增: }
171新增:
172新增: private void _blockMenuItem_Click(object sender, RoutedEventArgs e)
173新增: {
174新增: var config = _appConfig.GetConfig();
175新增:
176新增: if (IsIgnore)
177新增: {
178新增: // 取消忽略
179新增: config.Behavior.IgnoreURLList.Remove(WebSite.Domain);
180新增: }
181新增: else
182新增: {
183新增: // 添加域名忽略
184新增: config.Behavior.IgnoreURLList.Add(WebSite.Domain);
185新增: }
186新增:
187新增: IsIgnore = !IsIgnore;
188新增:
189新增: _mainVM.Success("操作成功");
190新增: }
191新增:
192新增: private void WebSiteContextMenu_Opened(object sender, RoutedEventArgs e)
193新增: {
194新增: _setCategoryMenuItem.Items.Clear();
195新增: foreach (var category in Categories)
196新增: {
197新增: var categoryMenu = new MenuItem();
198新增: categoryMenu.Header = category.Name;
199新增: categoryMenu.IsChecked = WebSite.CategoryID == category.Id;
200新增: categoryMenu.Click += (s, ea) =>
201新增: {
202新增: UpdateCategory(category.Id);
203新增: };
204新增: _setCategoryMenuItem.Items.Add(categoryMenu);
205新增: }
206新增:
207新增: _blockMenuItem.Header = IsIgnore ? "取消忽略此网站" : "忽略此网站";
208新增:
209新增: _blockMenuItem.IsEnabled = !_webFilter.IsRegexIgnore(WebSite.Domain);
210新增: }
211新增:
212新增:
213新增: private void WebSiteDetailPageVM_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
214新增: {
215新增: string[] updateNames = { nameof(TabbarSelectedIndex), nameof(ChartDate), nameof(SelectedWeek), nameof(MonthDate), nameof(YearDate) };
216新增: if (updateNames.Contains(e.PropertyName))
217新增: {
218新增: LoadData();
219新增: }
220新增: if (e.PropertyName == nameof(Category) && Category != null)
221新增: {
222新增: UpdateCategory(Category.Id);
223新增: }
224新增: }
225新增:
226新增: /// <summary>
227新增: /// 加载浏览数据
228新增: /// </summary>
229新增: private void LoadData()
230新增: {
231新增: Task.Run(() =>
232新增: {
233新增: var startDate = DateTime.Now;
234新增: var endDate = DateTime.Now;
235新增: string[] colNames = { };
236新增: NameIndexStart = 0;
237新增: if (TabbarSelectedIndex == 0)
238新增: {
239新增: // 按天
240新增: startDate = endDate = ChartDate;
241新增: }
242新增: else if (TabbarSelectedIndex == 1)
243新增: {
244新增: // 按周
245新增: var weekDateArr = SelectedWeek.Name == "本周" ? Time.GetThisWeekDate() : Time.GetLastWeekDate();
246新增: WeekDateStr = weekDateArr[0].ToString("yyyy年MM月dd日") + " 到 " + weekDateArr[1].ToString("yyyy年MM月dd日");
247新增: startDate = weekDateArr[0];
248新增: endDate = weekDateArr[1];
249新增: colNames = new string[] { "周一", "周二", "周三", "周四", "周五", "周六", "周日", };
250新增: }
251新增: else if (TabbarSelectedIndex == 2)
252新增: {
253新增: // 按月
254新增: var dateArr = Time.GetMonthDate(MonthDate);
255新增: startDate = dateArr[0];
256新增: endDate = dateArr[1];
257新增: NameIndexStart = 1;
258新增: }
259新增: else if (TabbarSelectedIndex == 3)
260新增: {
261新增: // 按年
262新增: startDate = new DateTime(YearDate.Year, 1, 1);
263新增: endDate = new DateTime(YearDate.Year, 12, DateTime.DaysInMonth(YearDate.Year, 12), 23, 59, 59);
264新增:
265新增: colNames = new string[12];
266新增: for (int i = 0; i < 12; i++)
267新增: {
268新增: colNames[i] = (i + 1) + "月";
269新增: }
270新增: }
271新增: // 柱形图数据
272新增: var list = _webData.GetBrowseDataStatistics(startDate, endDate, WebSite.ID);
273新增: var chartData = new List<ChartsDataModel>
274新增: {
275新增: new ChartsDataModel()
276新增: {
277新增: Name =WebSite.Title,
278新增: Values = list.Select(m=>m.Value).ToArray(),
279新增: ColumnNames= colNames,
280新增: Color=StateData.ThemeColor
281新增: }
282新增: };
283新增: ChartData = chartData;
284新增:
285新增: // 详细访问数据
286新增: WebPageData = _webData.GetBrowseLogList(startDate, endDate, WebSite.ID).OrderByDescending(m => m.ID).ToList();
287新增: });
288新增: }
289新增: /// <summary>
290新增: /// 加载所有分类
291新增: /// </summary>
292新增: private void LoadCategories()
293新增: {
294新增: var data = _webData.GetWebSiteCategories();
295新增: var list = new List<SelectItemModel>();
296新增: foreach (var category in data)
297新增: {
298新增: var item = new SelectItemModel();
299新增: item.Name = category.Name;
300新增: item.Img = category.IconFile;
301新增: item.Id = category.ID;
302新增: list.Add(item);
303新增: }
304新增:
305新增: Categories = list;
306新增: Category = Categories.Where(m => m.Id == WebSite.CategoryID).FirstOrDefault();
307新增: }
308新增:
309新增: /// <summary>
310新增: /// 更新分类
311新增: /// </summary>
312新增: private void UpdateCategory(int categoryId_)
313新增: {
314新增: Task.Run(() =>
315新增: {
316新增: _webData.UpdateWebSitesCategory(new int[] { WebSite.ID }, categoryId_);
317新增: WebSite.CategoryID = categoryId_;
318新增: if (Category == null || categoryId_ != Category.Id)
319新增: {
320新增: Category = Categories.Where(m => m.Id == WebSite.CategoryID).FirstOrDefault();
321新增: }
322新增: });
323新增: }
324新增: }
325新增:}
修改UI/Views/CategoryAppListPage.xaml+1 −1看文件
@@ -98,7 +98,7 @@
9898 <RowDefinition Height="*"/>
9999 </Grid.RowDefinitions>
100100 <StackPanel Orientation="Horizontal" Margin="0,0,0,20">
101删除: <TextBlock FontSize="18" Text="分类"/>
101新增: <TextBlock FontSize="18" Text="应用分类"/>
102102 <base:Icon IconType="ChevronRightMed" Margin="10,0" FontSize="12" Foreground="#ccc"/>
103103 <TextBlock FontSize="18" Text="{Binding Category.Data.Name}"/>
104104
修改UI/Views/CategoryPage.xaml+286 −122看文件
@@ -1,4 +1,4 @@
1删除:<Page x:Class="UI.Views.CategoryPage"
1新增:<c:TPage x:Class="UI.Views.CategoryPage"
22 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
33 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
44 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
@@ -6,16 +6,23 @@
66 xmlns:local="clr-namespace:UI.Views" xmlns:base="clr-namespace:UI.Controls.Base" xmlns:Button="clr-namespace:UI.Controls.Button" xmlns:input="clr-namespace:UI.Controls.Input" xmlns:select="clr-namespace:UI.Controls.Select"
77 mc:Ignorable="d"
88 xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:converter="clr-namespace:UI.Controls.Converters"
9新增: xmlns:c="clr-namespace:UI.Controls"
910 d:DesignHeight="450" d:DesignWidth="800"
10删除: Title="CategoryPage" Foreground="{DynamicResource StandardTextBrush}">
11新增: Title="CategoryPage" Foreground="{DynamicResource StandardTextBrush}" IsFillPage="True">
1112
1213
1314 <Grid>
14删除:
15新增:
1516 <!--编辑-->
1617 <Grid Visibility="{Binding EditVisibility}" Panel.ZIndex="2" Margin="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
17删除: <Border Background="Black" Opacity=".7"/>
18删除: <Border Height="460" Background="{DynamicResource StandardBackgroundBrush2}" CornerRadius="10" BorderBrush="{DynamicResource WindowContentBorder}" BorderThickness="1" Margin="50" VerticalAlignment="Top">
18新增: <Border Background="Black" Opacity=".7" CornerRadius="2"/>
19新增: <Border Width="{Binding ElementName=EditBorder,Path=ActualWidth}" Height="{Binding ElementName=EditBorder,Path=ActualHeight}" Background="{Binding ElementName=EditBorder,Path=Background}" CornerRadius="{Binding ElementName=EditBorder,Path=CornerRadius}">
20新增: <Border.Effect>
21新增: <DropShadowEffect BlurRadius="30" Direction="0" ShadowDepth="0" Opacity=".2" Color="{DynamicResource ThemeColor}"/>
22新增: </Border.Effect>
23新增: </Border>
24新增: <Border x:Name="EditBorder" MaxWidth="400" MaxHeight="350" Background="{DynamicResource StandardBackgroundBrush2}" CornerRadius="10" BorderBrush="{DynamicResource WindowContentBorder}" BorderThickness="1" >
25新增:
1926 <Grid>
2027 <Grid.RowDefinitions>
2128 <RowDefinition Height="40"/>
@@ -24,13 +31,18 @@
2431
2532 </Grid.RowDefinitions>
2633 <Grid>
27删除: <base:Text Content="?创建分类:编辑分类" Value="{Binding IsCreate}" VerticalAlignment="Center" Margin="10,0,0,0"/>
34新增: <StackPanel Orientation="Horizontal" Margin="10,0,0,0">
35新增: <base:Text Content="?创建:编辑" Value="{Binding IsCreate}" VerticalAlignment="Center" />
36新增: <TextBlock VerticalAlignment="Center" >
37新增: <Run Text="{Binding ShowType.Name}"/><Run Text="分类"/>
38新增: </TextBlock>
39新增: </StackPanel>
2840 <Button:IconButton Foreground="#ccc" Icon="ChromeClose" HorizontalAlignment="Right" FontSize="12" Margin="0,0,10,0" Command="{Binding EditCloseCommand}"/>
2941 </Grid>
3042 <!--<TextBlock Text="编辑" VerticalAlignment="Center" Margin="10,0,0,0"/>-->
3143 <ScrollViewer Grid.Row="1">
32删除: <StackPanel Grid.Row="1" Margin="10">
33删除: <TextBlock Text="分类名称"/>
44新增: <StackPanel Grid.Row="1" Margin="10">
45新增: <TextBlock Text="分类名称"/>
3446
3547 <Grid>
3648 <Grid.ColumnDefinitions>
@@ -41,10 +53,10 @@
4153
4254 <input:InputBox Grid.Column="1" Error="{Binding EditErrorText}" IsShowError="{Binding IsEditError,Mode=TwoWay}" Text="{Binding EditName,Mode=TwoWay}" MaxLength="10" Margin="5,10,0,0" Placeholder="请输入分类名称"/>
4355 </Grid>
44删除:
45删除: <TextBlock Text="图标" Margin="0,10,0,0"/>
46删除: <base:IconSelect URL="{Binding EditIconFile,Mode=TwoWay}" HorizontalAlignment="Left" Margin="0,10,0,0" />
47删除: </StackPanel>
56新增:
57新增: <TextBlock Text="图标" Margin="0,10,0,0"/>
58新增: <base:IconSelect URL="{Binding EditIconFile,Mode=TwoWay}" HorizontalAlignment="Left" Margin="0,10,0,0" />
59新增: </StackPanel>
4860 </ScrollViewer>
4961 <Button:Button Grid.Row="2" HorizontalAlignment="Right" Text="?创建:更新" Value="{Binding IsCreate}" Width="120" Margin="0,0,10,0" VerticalAlignment="Center" Command="{Binding EditDoneCommand}">
5062
@@ -58,133 +70,285 @@
5870
5971
6072 <!--主内容-->
61删除: <StackPanel Margin="20" Background="Transparent">
62删除: <StackPanel.ContextMenu>
73新增: <Grid Margin="20" Background="Transparent">
74新增: <Grid.RowDefinitions>
75新增: <RowDefinition Height="auto"/>
76新增: <RowDefinition Height="*"/>
77新增: </Grid.RowDefinitions>
78新增: <Grid.ContextMenu>
6379 <ContextMenu>
64删除:
80新增: <MenuItem Header="刷新" Command="{Binding RefreshCommand}" />
81新增: <Separator/>
6582 <MenuItem Header="新建分类" Command="{Binding EditCommand}" />
6683 </ContextMenu>
67删除: </StackPanel.ContextMenu>
68删除: <TextBlock Text="分类" FontSize="18" Margin="0,5,0,20"/>
69删除: <!--<TextBlock Text="管理所有应用分类"/>-->
70删除: <Button:Button Icon="CalculatorAddition" Content="新建分类" HorizontalAlignment="Right" Margin="0,0,20,0" Width="150" Command="{Binding EditCommand}"/>
71删除:
72删除: <base:View Condition="empty" Value="{Binding Data}">
73删除: <base:EmptyData/>
74删除: </base:View>
75删除:
76删除: <ListView Margin="10,20,10,0" ItemsSource="{Binding Data}" SelectedItem="{Binding SelectedItem,Mode=TwoWay}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" >
77删除: <i:Interaction.Triggers>
78删除: <i:EventTrigger EventName="MouseLeftButtonUp">
79删除: <i:InvokeCommandAction Command="{Binding GotoAppListCommand}"
80删除: CommandParameter="{Binding SelectedItem}" />
81删除: </i:EventTrigger>
82删除: </i:Interaction.Triggers>
83删除: <!--<ListView.InputBindings>
84删除: <MouseBinding Gesture="LeftClick" Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type Page}}, Path=DataContext.GotoAppListCommand}" CommandParameter="{Binding SelectedItem}"/>
85删除: </ListView.InputBindings>-->
86删除:
87删除: <ListView.ContextMenu>
88删除: <ContextMenu>
89删除: <MenuItem Header="查看分类应用列表" Command="{Binding GotoAppListCommand}" CommandParameter="{Binding SelectedItem}"/>
90删除:
91删除: <MenuItem Header="编辑" Command="{Binding EditCommand}" CommandParameter="{Binding SelectedItem}"/>
92删除: <MenuItem Header="删除分类" Command="{Binding DelCommand}" CommandParameter="{Binding SelectedItem}"/>
93删除: </ContextMenu>
94删除: </ListView.ContextMenu>
95删除: <ListBox.Resources>
96删除: <converter:HextoColorConverter x:Key="HextoColorConverter"/>
97删除:
98删除: <Style TargetType="{x:Type ListView}">
99删除: <Setter Property="OverridesDefaultStyle" Value="True"/>
84新增: </Grid.ContextMenu>
85新增: <StackPanel>
86新增: <StackPanel Orientation="Horizontal" Margin="0,5,0,20" >
87新增: <TextBlock Text="分类" FontSize="18" VerticalAlignment="Center"/>
88新增: <select:Select Margin="10,0,0,0" VerticalAlignment="Top" Padding="10,5" IsShowIcon="False" SelectedItem="{Binding ShowType,Mode=TwoWay}" Options="{Binding ShowTypeOptions}"/>
89新增: </StackPanel>
90新增: <!--<TextBlock Text="管理所有应用分类"/>-->
91新增: <Button:Button Icon="CalculatorAddition" Content="新建分类" HorizontalAlignment="Right" Margin="0,0,20,0" Width="150" Command="{Binding EditCommand}"/>
92新增: </StackPanel>
10093
94新增: <TabControl
95新增: SelectedIndex="{Binding ShowType.Id}"
96新增: BorderThickness="0"
97新增: Margin="0,10,0,0"
98新增: Padding="0"
99新增: Background="Transparent"
100新增: Grid.Row="1"
101新增: >
102新增: <TabControl.Resources>
103新增: <Style TargetType="TabItem">
101104 <Setter Property="Template">
102105 <Setter.Value>
103删除: <ControlTemplate TargetType="{x:Type ListView}">
104删除: <Border>
105删除: <ItemsPresenter />
106删除: </Border>
106新增: <ControlTemplate TargetType="TabItem">
107107 </ControlTemplate>
108108 </Setter.Value>
109109 </Setter>
110110 </Style>
111删除: <Style TargetType="{x:Type ListViewItem}">
112删除: <Setter Property="OverridesDefaultStyle" Value="True"/>
113删除: <Setter Property="Template">
114删除: <Setter.Value>
115删除: <ControlTemplate TargetType="{x:Type ListViewItem}">
116删除: <Grid>
117删除: <Border BorderBrush="{Binding ElementName=Border,Path=BorderBrush}" BorderThickness="{Binding ElementName=Border,Path=BorderThickness}" Margin="{Binding ElementName=Border,Path=Margin}" CornerRadius="{Binding ElementName=Border,Path=CornerRadius}">
118删除: <Border.Effect>
119删除: <DropShadowEffect Color="#d8d2d2" BlurRadius="10" Direction="300" ShadowDepth="4" Opacity="0.1" RenderingBias="Performance" ></DropShadowEffect>
120删除: </Border.Effect>
121删除: </Border>
122删除: <Border BorderBrush="Transparent" BorderThickness="2" x:Name="Border" Background="{DynamicResource StandardBackgroundBrush}" Margin="5" CornerRadius="20">
123删除: <ContentPresenter/>
124删除: </Border>
125删除: </Grid>
126删除:
127删除: <ControlTemplate.Triggers>
128删除: <Trigger Property="IsMouseOver" Value="True">
129删除: <!--<Setter TargetName="Border" Property="Background" Value="#FFE8E6FF"/>-->
130删除: <Setter TargetName="Border" Property="BorderBrush" Value="{DynamicResource ThemeBrush}"/>
131删除:
132删除: </Trigger>
133删除: </ControlTemplate.Triggers>
134删除: </ControlTemplate>
135删除: </Setter.Value>
136删除: </Setter>
137111
138删除: </Style>
139删除: </ListBox.Resources>
140删除: <ListBox.ItemsPanel>
141删除: <ItemsPanelTemplate>
142删除: <WrapPanel/>
143删除: </ItemsPanelTemplate>
144删除: </ListBox.ItemsPanel>
145删除: <ListView.ItemTemplate>
146删除: <DataTemplate>
147删除:
148删除:
149删除: <WrapPanel Orientation="Vertical">
150删除: <Border Width="150" Height="150">
151删除:
152删除: <Grid>
153删除: <Grid.RowDefinitions>
154删除: <RowDefinition Height="40"/>
155删除:
156删除: <RowDefinition Height="40"/>
157删除: <RowDefinition Height="30"/>
158删除: <RowDefinition Height="*"/>
159删除:
160删除: </Grid.RowDefinitions>
161删除: <Rectangle HorizontalAlignment="Left" Margin="10,0,0,0" VerticalAlignment="Center" RadiusX="20" RadiusY="20" Width="15" Height="15" Fill="{Binding Data.Color,Converter={StaticResource HextoColorConverter}}"/>
162删除: <Grid Grid.Row="1">
163删除:
164删除: <base:Img Radius="8" Width="40" Height="40" URL="{Binding Data.IconFile}"/>
165删除: </Grid>
166删除: <TextBlock Foreground="{DynamicResource StandardTextBrush}" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Row="2" Text="{Binding Data.Name}" FontSize="14"/>
167删除:
168删除: <Border Grid.Row="3" >
169删除: <Border Margin="10,0,10,0" CornerRadius="10" Background="{DynamicResource CategoryAppNumBgBrush}" HorizontalAlignment="Right" VerticalAlignment="Center" Padding="10,5">
170删除: <TextBlock Foreground="{DynamicResource DefaultTextBrush}">
112新增: </TabControl.Resources>
113新增: <TabItem>
114新增: <!--应用分类-->
115新增: <ScrollViewer>
116新增: <StackPanel>
117新增: <base:View Condition="empty" Value="{Binding Data}">
118新增: <base:EmptyData/>
119新增: </base:View>
120新增:
121新增: <ListView Margin="10,20,10,0" ItemsSource="{Binding Data}" SelectedItem="{Binding SelectedAppCategoryItem,Mode=TwoWay}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" >
122新增: <i:Interaction.Triggers>
123新增: <i:EventTrigger EventName="MouseLeftButtonUp">
124新增: <i:InvokeCommandAction Command="{Binding GotoListCommand}"
125新增: CommandParameter="{Binding SelectedAppCategoryItem}" />
126新增: </i:EventTrigger>
127新增: </i:Interaction.Triggers>
128新增:
129新增: <ListView.ContextMenu>
130新增: <ContextMenu>
131新增: <MenuItem Header="查看分类应用列表" Command="{Binding GotoListCommand}" CommandParameter="{Binding SelectedAppCategoryItem}"/>
132新增:
133新增: <MenuItem Header="编辑" Command="{Binding EditCommand}" CommandParameter="{Binding SelectedAppCategoryItem}"/>
134新增: <MenuItem Header="删除分类" Command="{Binding DelCommand}" CommandParameter="{Binding SelectedAppCategoryItem}"/>
135新增: </ContextMenu>
136新增: </ListView.ContextMenu>
137新增: <ListBox.Resources>
138新增: <converter:HextoColorConverter x:Key="HextoColorConverter"/>
139新增:
140新增: <Style TargetType="{x:Type ListView}">
141新增: <Setter Property="OverridesDefaultStyle" Value="True"/>
142新增:
143新增: <Setter Property="Template">
144新增: <Setter.Value>
145新增: <ControlTemplate TargetType="{x:Type ListView}">
146新增: <Border>
147新增: <ItemsPresenter />
148新增: </Border>
149新增: </ControlTemplate>
150新增: </Setter.Value>
151新增: </Setter>
152新增: </Style>
153新增: <Style TargetType="{x:Type ListViewItem}">
154新增: <Setter Property="OverridesDefaultStyle" Value="True"/>
155新增: <Setter Property="Template">
156新增: <Setter.Value>
157新增: <ControlTemplate TargetType="{x:Type ListViewItem}">
158新增: <Grid>
159新增: <Border BorderBrush="{Binding ElementName=Border,Path=BorderBrush}" BorderThickness="{Binding ElementName=Border,Path=BorderThickness}" Margin="{Binding ElementName=Border,Path=Margin}" CornerRadius="{Binding ElementName=Border,Path=CornerRadius}">
160新增: <Border.Effect>
161新增: <DropShadowEffect Color="#d8d2d2" BlurRadius="10" Direction="300" ShadowDepth="4" Opacity="0.1" RenderingBias="Performance" ></DropShadowEffect>
162新增: </Border.Effect>
163新增: </Border>
164新增: <Border BorderBrush="Transparent" BorderThickness="2" x:Name="Border" Background="{DynamicResource StandardBackgroundBrush}" Margin="5" CornerRadius="20">
165新增: <ContentPresenter/>
166新增: </Border>
167新增: </Grid>
168新增:
169新增: <ControlTemplate.Triggers>
170新增: <Trigger Property="IsMouseOver" Value="True">
171新增: <!--<Setter TargetName="Border" Property="Background" Value="#FFE8E6FF"/>-->
172新增: <Setter TargetName="Border" Property="BorderBrush" Value="{DynamicResource ThemeBrush}"/>
173新增:
174新增: </Trigger>
175新增: </ControlTemplate.Triggers>
176新增: </ControlTemplate>
177新增: </Setter.Value>
178新增: </Setter>
179新增:
180新增: </Style>
181新增: </ListBox.Resources>
182新增: <ListBox.ItemsPanel>
183新增: <ItemsPanelTemplate>
184新增: <WrapPanel/>
185新增: </ItemsPanelTemplate>
186新增: </ListBox.ItemsPanel>
187新增: <ListView.ItemTemplate>
188新增: <DataTemplate>
189新增:
190新增:
191新增: <WrapPanel Orientation="Vertical">
192新增: <Border Width="150" Height="150">
193新增:
194新增: <Grid>
195新增: <Grid.RowDefinitions>
196新增: <RowDefinition Height="40"/>
197新增:
198新增: <RowDefinition Height="40"/>
199新增: <RowDefinition Height="30"/>
200新增: <RowDefinition Height="*"/>
201新增:
202新增: </Grid.RowDefinitions>
203新增: <Rectangle HorizontalAlignment="Left" Margin="10,0,0,0" VerticalAlignment="Center" RadiusX="20" RadiusY="20" Width="15" Height="15" Fill="{Binding Data.Color,Converter={StaticResource HextoColorConverter}}"/>
204新增: <Grid Grid.Row="1">
205新增:
206新增: <base:Img Radius="8" Width="40" Height="40" URL="{Binding Data.IconFile}"/>
207新增: </Grid>
208新增: <TextBlock Foreground="{DynamicResource StandardTextBrush}" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Row="2" Text="{Binding Data.Name}" FontSize="14"/>
209新增:
210新增: <Border Grid.Row="3" >
211新增: <Border Margin="10,0,10,0" CornerRadius="10" Background="{DynamicResource CategoryAppNumBgBrush}" HorizontalAlignment="Right" VerticalAlignment="Center" Padding="10,5">
212新增: <TextBlock Foreground="{DynamicResource DefaultTextBrush}">
171213 <Run Text="×"/>
172214
173215 <Run Text="{Binding Count}"/>
174删除: </TextBlock>
216新增: </TextBlock>
217新增:
218新增: </Border>
219新增:
220新增: </Border>
221新增: </Grid>
222新增: </Border>
223新增:
224新增: </WrapPanel>
225新增: </DataTemplate>
226新增: </ListView.ItemTemplate>
227新增: </ListView>
228新增: </StackPanel>
229新增: </ScrollViewer>
230新增: </TabItem>
231新增: <TabItem>
232新增: <!--网页分类-->
233新增: <ScrollViewer>
234新增: <StackPanel>
235新增: <base:View Condition="empty" Value="{Binding WebCategoryData}">
236新增: <base:EmptyData/>
237新增: </base:View>
238新增:
239新增: <ListView Margin="10,20,10,0" ItemsSource="{Binding WebCategoryData}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" SelectedItem="{Binding SelectedWebCategoryItem,Mode=TwoWay}">
240新增: <i:Interaction.Triggers>
241新增: <i:EventTrigger EventName="MouseLeftButtonUp">
242新增: <i:InvokeCommandAction Command="{Binding GotoListCommand}"
243新增: CommandParameter="{Binding SelectedWebCategoryItem}" />
244新增: </i:EventTrigger>
245新增: </i:Interaction.Triggers>
246新增:
247新增: <ListView.ContextMenu>
248新增: <ContextMenu>
249新增: <MenuItem Header="查看网站列表" Command="{Binding GotoListCommand}" CommandParameter="{Binding SelectedWebCategoryItem}"/>
250新增:
251新增: <MenuItem Header="编辑" Command="{Binding EditCommand}" CommandParameter="{Binding SelectedWebCategoryItem}"/>
252新增: <MenuItem Header="删除分类" Command="{Binding DelCommand}" CommandParameter="{Binding SelectedWebCategoryItem}"/>
253新增: </ContextMenu>
254新增: </ListView.ContextMenu>
255新增: <ListBox.Resources>
256新增: <converter:HextoColorConverter x:Key="HextoColorConverter"/>
257新增:
258新增: <Style TargetType="{x:Type ListView}">
259新增: <Setter Property="OverridesDefaultStyle" Value="True"/>
260新增:
261新增: <Setter Property="Template">
262新增: <Setter.Value>
263新增: <ControlTemplate TargetType="{x:Type ListView}">
264新增: <Border>
265新增: <ItemsPresenter />
266新增: </Border>
267新增: </ControlTemplate>
268新增: </Setter.Value>
269新增: </Setter>
270新增: </Style>
271新增: <Style TargetType="{x:Type ListViewItem}">
272新增: <Setter Property="OverridesDefaultStyle" Value="True"/>
273新增: <Setter Property="Template">
274新增: <Setter.Value>
275新增: <ControlTemplate TargetType="{x:Type ListViewItem}">
276新增: <Grid>
277新增: <Border BorderBrush="{Binding ElementName=Border,Path=BorderBrush}" BorderThickness="{Binding ElementName=Border,Path=BorderThickness}" Margin="{Binding ElementName=Border,Path=Margin}" CornerRadius="{Binding ElementName=Border,Path=CornerRadius}">
278新增: <Border.Effect>
279新增: <DropShadowEffect Color="#d8d2d2" BlurRadius="10" Direction="300" ShadowDepth="4" Opacity="0.1" RenderingBias="Performance" ></DropShadowEffect>
280新增: </Border.Effect>
281新增: </Border>
282新增: <Border BorderBrush="Transparent" BorderThickness="2" x:Name="Border" Background="{DynamicResource StandardBackgroundBrush}" Margin="5" CornerRadius="20">
283新增: <ContentPresenter/>
284新增: </Border>
285新增: </Grid>
286新增:
287新增: <ControlTemplate.Triggers>
288新增: <Trigger Property="IsMouseOver" Value="True">
289新增: <!--<Setter TargetName="Border" Property="Background" Value="#FFE8E6FF"/>-->
290新增: <Setter TargetName="Border" Property="BorderBrush" Value="{DynamicResource ThemeBrush}"/>
291新增:
292新增: </Trigger>
293新增: </ControlTemplate.Triggers>
294新增: </ControlTemplate>
295新增: </Setter.Value>
296新增: </Setter>
297新增:
298新增: </Style>
299新增: </ListBox.Resources>
300新增: <ListBox.ItemsPanel>
301新增: <ItemsPanelTemplate>
302新增: <WrapPanel/>
303新增: </ItemsPanelTemplate>
304新增: </ListBox.ItemsPanel>
305新增: <ListView.ItemTemplate>
306新增: <DataTemplate>
175307
176删除: </Border>
177308
178删除: </Border>
179删除: </Grid>
180删除: </Border>
309新增: <WrapPanel Orientation="Vertical">
310新增: <Border Width="150" Height="150">
181311
182删除: </WrapPanel>
183删除: </DataTemplate>
184删除: </ListView.ItemTemplate>
185删除: </ListView>
312新增: <Grid>
313新增: <Grid.RowDefinitions>
314新增: <RowDefinition Height="40"/>
186315
187删除: </StackPanel>
316新增: <RowDefinition Height="40"/>
317新增: <RowDefinition Height="30"/>
318新增: <RowDefinition Height="*"/>
319新增:
320新增: </Grid.RowDefinitions>
321新增: <Rectangle HorizontalAlignment="Left" Margin="10,0,0,0" VerticalAlignment="Center" RadiusX="20" RadiusY="20" Width="15" Height="15" Fill="{Binding Data.Color,Converter={StaticResource HextoColorConverter}}"/>
322新增: <Grid Grid.Row="1">
323新增:
324新增: <base:Img Radius="8" Width="40" Height="40" URL="{Binding Data.IconFile}"/>
325新增: </Grid>
326新增: <TextBlock Foreground="{DynamicResource StandardTextBrush}" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Row="2" Text="{Binding Data.Name}" FontSize="14"/>
327新增:
328新增: <Border Grid.Row="3" >
329新增: <Border Margin="10,0,10,0" CornerRadius="10" Background="{DynamicResource CategoryAppNumBgBrush}" HorizontalAlignment="Right" VerticalAlignment="Center" Padding="10,5">
330新增: <TextBlock Foreground="{DynamicResource DefaultTextBrush}">
331新增: <Run Text="×"/>
332新增:
333新增: <Run Text="{Binding Count}"/>
334新增: </TextBlock>
335新增:
336新增: </Border>
337新增:
338新增: </Border>
339新增: </Grid>
340新增: </Border>
341新增:
342新增: </WrapPanel>
343新增: </DataTemplate>
344新增: </ListView.ItemTemplate>
345新增: </ListView>
346新增: </StackPanel>
347新增: </ScrollViewer>
348新增: </TabItem>
349新增: </TabControl>
350新增:
351新增: </Grid>
188352
189353 </Grid>
190删除:</Page>
354新增:</c:TPage>
修改UI/Views/CategoryPage.xaml.cs+2 −1看文件
@@ -12,6 +12,7 @@ using System.Windows.Media;
1212using System.Windows.Media.Imaging;
1313using System.Windows.Navigation;
1414using System.Windows.Shapes;
15新增:using UI.Controls;
1516using UI.ViewModels;
1617
1718namespace UI.Views
@@ -19,7 +20,7 @@ namespace UI.Views
1920 /// <summary>
2021 /// CategoryPage.xaml 的交互逻辑
2122 /// </summary>
22删除: public partial class CategoryPage : Page
23新增: public partial class CategoryPage : TPage
2324 {
2425 public CategoryPage(CategoryPageVM vm)
2526 {
新增UI/Views/CategoryWebSiteListPage.xaml+199 −0看文件
@@ -0,0 +1,199 @@
1新增:<c:TPage xmlns:Button="clr-namespace:UI.Controls.Button" x:Class="UI.Views.CategoryWebSiteListPage"
2新增: xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3新增: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4新增: xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
5新增: xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
6新增: xmlns:local="clr-namespace:UI.Views" xmlns:base="clr-namespace:UI.Controls.Base" xmlns:select="clr-namespace:UI.Controls.Select" xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:input="clr-namespace:UI.Controls.Input"
7新增: xmlns:c="clr-namespace:UI.Controls"
8新增: mc:Ignorable="d"
9新增: d:DesignHeight="450" d:DesignWidth="800"
10新增: Title="CategoryWebSiteListPage" Foreground="{DynamicResource StandardTextBrush}" IsFillPage="True">
11新增:
12新增: <Grid>
13新增: <!--选择应用-->
14新增: <Grid Visibility="{Binding ChooseVisibility}" Panel.ZIndex="2" Margin="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
15新增: <Border Background="Black" Opacity=".7"/>
16新增: <Border Background="{DynamicResource PopupBackgroundBrush}" CornerRadius="10" BorderBrush="{DynamicResource PopupBorderBrush}" BorderThickness="1" Margin="50" VerticalAlignment="Top">
17新增: <Grid>
18新增: <Grid.RowDefinitions>
19新增: <RowDefinition Height="40"/>
20新增: <RowDefinition Height="auto"/>
21新增: <RowDefinition Height="*"/>
22新增: <RowDefinition Height="80"/>
23新增:
24新增: </Grid.RowDefinitions>
25新增: <Grid>
26新增: <TextBlock Text="选择站点" VerticalAlignment="Center" Margin="10,0,0,0"/>
27新增: <Button:IconButton Foreground="#ccc" Icon="ChromeClose" HorizontalAlignment="Right" FontSize="12" Margin="0,0,10,0" Command="{Binding ChooseCloseCommand}"/>
28新增: </Grid>
29新增: <Border Grid.Row="1">
30新增: <input:InputBox Placeholder="搜索" Margin="10" x:Name="SearchBox" Text="{Binding SearchInput,Mode=TwoWay}">
31新增: <i:Interaction.Triggers>
32新增: <i:EventTrigger EventName="KeyUp">
33新增: <i:InvokeCommandAction Command="{Binding Path=SearchCommand}" CommandParameter="{Binding ElementName=SearchBox,Path=Text}"/>
34新增: </i:EventTrigger>
35新增: </i:Interaction.Triggers>
36新增: </input:InputBox>
37新增: </Border>
38新增: <ListView ItemsSource="{Binding WebSiteOptionList}" Margin="20,0" Grid.Row="2" VirtualizingPanel.IsVirtualizing="True" ScrollViewer.CanContentScroll="True">
39新增: <ListBox.Resources>
40新增: <Style TargetType="{x:Type ListView}">
41新增: <Setter Property="OverridesDefaultStyle" Value="True"/>
42新增:
43新增: <Setter Property="Template">
44新增: <Setter.Value>
45新增: <ControlTemplate TargetType="{x:Type ListView}">
46新增: <ScrollViewer>
47新增: <ItemsPresenter />
48新增: </ScrollViewer>
49新增: </ControlTemplate>
50新增: </Setter.Value>
51新增: </Setter>
52新增: </Style>
53新增: <Style TargetType="{x:Type ListViewItem}">
54新增: <Setter Property="OverridesDefaultStyle" Value="True"/>
55新增: <Setter Property="Template">
56新增: <Setter.Value>
57新增: <ControlTemplate TargetType="{x:Type ListViewItem}">
58新增: <Border>
59新增: <ContentPresenter/>
60新增: </Border>
61新增:
62新增: </ControlTemplate>
63新增: </Setter.Value>
64新增: </Setter>
65新增:
66新增: </Style>
67新增: </ListBox.Resources>
68新增: <ListBox.ItemsPanel>
69新增: <ItemsPanelTemplate>
70新增: <VirtualizingStackPanel/>
71新增: <!--<StackPanel/>-->
72新增: </ItemsPanelTemplate>
73新增: </ListBox.ItemsPanel>
74新增: <ListView.ItemTemplate>
75新增: <DataTemplate>
76新增: <!--<VirtualizingStackPanel>-->
77新增: <!--<Border HorizontalAlignment="Stretch">-->
78新增: <select:Option HorizontalAlignment="Stretch" IsChecked="{Binding IsChecked,Mode=TwoWay}" Value="{Binding OptionValue}"/>
79新增:
80新增: <!--</Border>-->
81新增:
82新增: <!--</VirtualizingStackPanel>-->
83新增: </DataTemplate>
84新增: </ListView.ItemTemplate>
85新增: </ListView>
86新增:
87新增: <Button:Button Grid.Row="3" HorizontalAlignment="Right" Content="完成" Width="120" Margin="0,0,10,0" VerticalAlignment="Center" Command="{Binding ChoosedCommand}"/>
88新增: </Grid>
89新增:
90新增: </Border>
91新增: </Grid>
92新增:
93新增:
94新增: <Grid Margin="20">
95新增: <Grid.RowDefinitions>
96新增: <RowDefinition Height="auto"/>
97新增: <RowDefinition Height="auto"/>
98新增: <RowDefinition Height="*"/>
99新增: </Grid.RowDefinitions>
100新增: <StackPanel Orientation="Horizontal" Margin="0,0,0,20">
101新增: <TextBlock FontSize="18" Text="网站分类"/>
102新增: <base:Icon IconType="ChevronRightMed" Margin="10,0" FontSize="12" Foreground="#ccc"/>
103新增: <TextBlock FontSize="18" Text="{Binding Category.Name}"/>
104新增:
105新增: </StackPanel>
106新增: <TextBlock Grid.Row="1" Text="站点列表"/>
107新增:
108新增: <Button:Button Grid.Row="1" Content="选择" HorizontalAlignment="Right" Width="150" Command="{Binding ShowChooseCommand}"/>
109新增: <base:View Grid.Row="2" Condition="empty" Value="{Binding CategoryWebSiteList}">
110新增: <base:EmptyData/>
111新增: </base:View>
112新增: <ListView Grid.Row="2" ItemsSource="{Binding CategoryWebSiteList}" SelectedItem="{Binding SelectedItem,Mode=TwoWay}" Margin="0,20,0,0" VirtualizingPanel.IsVirtualizing="True" ScrollViewer.CanContentScroll="True">
113新增: <ListView.ContextMenu>
114新增: <ContextMenu>
115新增:
116新增: <MenuItem Header="从分类中移除" Command="{Binding DelCommand}" CommandParameter="{Binding SelectedItem}"/>
117新增: </ContextMenu>
118新增: </ListView.ContextMenu>
119新增: <i:Interaction.Triggers>
120新增: <i:EventTrigger EventName="MouseLeftButtonUp">
121新增: <i:InvokeCommandAction Command="{Binding GotoDetailCommand}"
122新增: CommandParameter="{Binding SelectedItem}" />
123新增: </i:EventTrigger>
124新增: </i:Interaction.Triggers>
125新增: <ListBox.Resources>
126新增: <Style TargetType="{x:Type ListView}">
127新增: <Setter Property="OverridesDefaultStyle" Value="True"/>
128新增:
129新增: <Setter Property="Template">
130新增: <Setter.Value>
131新增: <ControlTemplate TargetType="{x:Type ListView}">
132新增: <ScrollViewer>
133新增: <ItemsPresenter />
134新增: </ScrollViewer>
135新增: </ControlTemplate>
136新增: </Setter.Value>
137新增: </Setter>
138新增: </Style>
139新增: <Style TargetType="{x:Type ListViewItem}">
140新增: <Setter Property="OverridesDefaultStyle" Value="True"/>
141新增: <Setter Property="Template">
142新增: <Setter.Value>
143新增: <ControlTemplate TargetType="{x:Type ListViewItem}">
144新增: <Grid>
145新增: <Border BorderBrush="{Binding ElementName=Border,Path=BorderBrush}" BorderThickness="{Binding ElementName=Border,Path=BorderThickness}" Background="{Binding ElementName=Border,Path=Background}" Margin="{Binding ElementName=Border,Path=Margin}" CornerRadius="{Binding ElementName=Border,Path=CornerRadius}">
146新增: <Border.Effect>
147新增: <DropShadowEffect Color="#f3f3f3" BlurRadius="1" Direction="300" ShadowDepth="4" Opacity="0.15" RenderingBias="Performance" ></DropShadowEffect>
148新增: </Border.Effect>
149新增: </Border>
150新增:
151新增: <Border BorderBrush="Transparent" BorderThickness="2" x:Name="Border" Background="{DynamicResource StandardBackgroundBrush2}" Margin="0,0,0,10" Padding="15" CornerRadius="10">
152新增:
153新增: <ContentPresenter/>
154新增: </Border>
155新增: </Grid>
156新增: <ControlTemplate.Triggers>
157新增: <Trigger Property="IsMouseOver" Value="True">
158新增: <!--<Setter TargetName="Border" Property="Background" Value="#FFE8E6FF"/>-->
159新增: <Setter TargetName="Border" Property="BorderBrush" Value="#2b20d9"/>
160新增:
161新增: </Trigger>
162新增: </ControlTemplate.Triggers>
163新增: </ControlTemplate>
164新增: </Setter.Value>
165新增: </Setter>
166新增:
167新增: </Style>
168新增: </ListBox.Resources>
169新增: <ListBox.ItemsPanel>
170新增: <ItemsPanelTemplate>
171新增: <VirtualizingStackPanel/>
172新增: </ItemsPanelTemplate>
173新增: </ListBox.ItemsPanel>
174新增: <ListView.ItemTemplate>
175新增: <DataTemplate>
176新增: <Grid>
177新增: <Grid.ColumnDefinitions>
178新增: <ColumnDefinition Width="50"/>
179新增: <ColumnDefinition Width="auto"/>
180新增: </Grid.ColumnDefinitions>
181新增: <Border>
182新增: <base:Img Width="25" Height="25" URL="{Binding IconFile}"/>
183新增: </Border>
184新增: <Grid Grid.Column="1">
185新增: <TextBlock Margin="10,0,0,0" VerticalAlignment="Center" HorizontalAlignment="Center"><Run Text="{Binding Title}"/><Run Text=" - "/><Run Text="{Binding Domain}"/>
186新增: </TextBlock>
187新增: </Grid>
188新增:
189新增:
190新增: </Grid>
191新增: </DataTemplate>
192新增: </ListView.ItemTemplate>
193新增: </ListView>
194新增: </Grid>
195新增:
196新增:
197新增: </Grid>
198新增:
199新增:</c:TPage>
新增UI/Views/CategoryWebSiteListPage.xaml.cs+31 −0看文件
@@ -0,0 +1,31 @@
1新增:using System;
2新增:using System.Collections.Generic;
3新增:using System.Linq;
4新增:using System.Text;
5新增:using System.Threading.Tasks;
6新增:using System.Windows;
7新增:using System.Windows.Controls;
8新增:using System.Windows.Data;
9新增:using System.Windows.Documents;
10新增:using System.Windows.Input;
11新增:using System.Windows.Media;
12新增:using System.Windows.Media.Imaging;
13新增:using System.Windows.Navigation;
14新增:using System.Windows.Shapes;
15新增:using UI.Controls;
16新增:using UI.ViewModels;
17新增:
18新增:namespace UI.Views
19新增:{
20新增: /// <summary>
21新增: /// CategoryWebSiteListPage.xaml 的交互逻辑
22新增: /// </summary>
23新增: public partial class CategoryWebSiteListPage : TPage
24新增: {
25新增: public CategoryWebSiteListPage(CategoryWebSiteListPageVM vm)
26新增: {
27新增: InitializeComponent();
28新增: DataContext = vm;
29新增: }
30新增: }
31新增:}
修改UI/Views/ChartPage.xaml+459 −194看文件
@@ -3,7 +3,7 @@
33 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
44 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
55 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
6删除: xmlns:local="clr-namespace:UI.Views" xmlns:charts="clr-namespace:UI.Controls.Charts" xmlns:Tabbar="clr-namespace:UI.Controls.Tabbar" xmlns:select="clr-namespace:UI.Controls.Select" xmlns:base="clr-namespace:UI.Controls.Base" xmlns:DatePickerBar="clr-namespace:UI.Controls.DatePickerBar"
6新增: xmlns:local="clr-namespace:UI.Views" xmlns:charts="clr-namespace:UI.Controls.Charts" xmlns:Tabbar="clr-namespace:UI.Controls.Tabbar" xmlns:select="clr-namespace:UI.Controls.Select" xmlns:base="clr-namespace:UI.Controls.Base" xmlns:DatePickerBar="clr-namespace:UI.Controls.DatePickerBar" xmlns:converter="clr-namespace:UI.Controls.Converters"
77 mc:Ignorable="d"
88 d:DesignHeight="450" d:DesignWidth="800"
99 Title="ChartPage" Foreground="{DynamicResource StandardTextBrush}" Background="Transparent">
@@ -13,7 +13,10 @@
1313 </ContextMenu>
1414 </Page.ContextMenu>
1515 <StackPanel Margin="20">
16删除: <TextBlock Text="统计" FontSize="18" Margin="0,5,0,20"/>
16新增: <StackPanel Orientation="Horizontal" Margin="0,5,0,20" >
17新增: <TextBlock Text="统计" FontSize="18" VerticalAlignment="Center"/>
18新增: <select:Select Margin="10,0,0,0" VerticalAlignment="Top" Padding="10,5" IsShowIcon="False" SelectedItem="{Binding ShowType,Mode=TwoWay}" Options="{Binding ShowTypeOptions}"/>
19新增: </StackPanel>
1720 <Tabbar:Tabbar Data="{Binding TabbarData}" SelectedIndex="{Binding TabbarSelectedIndex,Mode=TwoWay}" Width="180" HorizontalAlignment="Left"/>
1821 <Border Margin="0,15,0,0">
1922 <Grid>
@@ -42,217 +45,238 @@
4245 </Grid>
4346 </Border>
4447
45删除: <Grid Width="680" HorizontalAlignment="Left" Margin="0,5,0,0">
46删除: <Grid.ColumnDefinitions>
47删除: <ColumnDefinition Width="*"/>
48删除: <ColumnDefinition Width="*"/>
49删除: <ColumnDefinition Width="*"/>
50删除: </Grid.ColumnDefinitions>
51删除: <Border Margin="0,5,0,0" Background="{DynamicResource SettingPanelBgBrush}" Padding="10" CornerRadius="10">
52删除: <Grid>
53删除: <Grid.ColumnDefinitions>
54删除: <ColumnDefinition Width="auto"/>
55删除: <ColumnDefinition Width="*"/>
56删除: <ColumnDefinition Width="auto"/>
57删除:
58删除: </Grid.ColumnDefinitions>
59删除: <Border Width="40" Height="40" CornerRadius="14">
60删除: <Border.Background>
61删除: <LinearGradientBrush>
62删除: <GradientStop Offset="0" Color="{DynamicResource ThemeColor}"/>
63删除: <!--<GradientStop Color="#F4A7B9" Offset="1"/>-->
64删除: </LinearGradientBrush>
65删除: </Border.Background>
66删除: <base:Icon IconType="ScreenTime" Foreground="White"/>
67删除: </Border>
68删除: <Grid Grid.Column="1" Margin="10,0,0,0" VerticalAlignment="Center">
69删除: <Grid.RowDefinitions>
70删除: <RowDefinition Height="auto"/>
71删除: <RowDefinition Height="auto"/>
72删除: </Grid.RowDefinitions>
73删除: <TextBlock >
74删除: <Run Text="{Binding TotalHours}" FontSize="20"/>
48新增: <TabControl
49新增: SelectedIndex="{Binding ShowType.Id}"
50新增: BorderThickness="0"
51新增: Margin="0,10,0,0"
52新增: Padding="0"
53新增: Background="Transparent"
54新增: >
55新增: <TabControl.Resources>
56新增: <Style TargetType="TabItem">
57新增: <Setter Property="Template">
58新增: <Setter.Value>
59新增: <ControlTemplate TargetType="TabItem">
60新增: </ControlTemplate>
61新增: </Setter.Value>
62新增: </Setter>
63新增: </Style>
64新增:
65新增: </TabControl.Resources>
66新增: <TabItem TextElement.Foreground="{DynamicResource DefaultTextBrush}">
67新增: <!--应用数据-->
68新增: <StackPanel>
69新增: <Grid Width="680" HorizontalAlignment="Left" Margin="0,5,0,0" >
70新增: <Grid.ColumnDefinitions>
71新增: <ColumnDefinition Width="*"/>
72新增: <ColumnDefinition Width="*"/>
73新增: <ColumnDefinition Width="*"/>
74新增: </Grid.ColumnDefinitions>
75新增: <Border Margin="0,5,0,0" Background="{DynamicResource SettingPanelBgBrush}" Padding="10" CornerRadius="10">
76新增: <Grid>
77新增: <Grid.ColumnDefinitions>
78新增: <ColumnDefinition Width="auto"/>
79新增: <ColumnDefinition Width="*"/>
80新增: <ColumnDefinition Width="auto"/>
81新增:
82新增: </Grid.ColumnDefinitions>
83新增: <Border Width="40" Height="40" CornerRadius="14">
84新增: <Border.Background>
85新增: <LinearGradientBrush>
86新增: <GradientStop Offset="0" Color="{DynamicResource ThemeColor}"/>
87新增: <!--<GradientStop Color="#F4A7B9" Offset="1"/>-->
88新增: </LinearGradientBrush>
89新增: </Border.Background>
90新增: <base:Icon IconType="ScreenTime" Foreground="White"/>
91新增: </Border>
92新增: <Grid Grid.Column="1" Margin="10,0,0,0" VerticalAlignment="Center">
93新增: <Grid.RowDefinitions>
94新增: <RowDefinition Height="auto"/>
95新增: <RowDefinition Height="auto"/>
96新增: </Grid.RowDefinitions>
97新增: <TextBlock >
98新增: <Run Text="{Binding TotalHours}" FontSize="20" Foreground="{DynamicResource DefaultTextBrush}"/>
7599 <Run Text="小时" FontSize="12" Foreground="{DynamicResource SubTextBrush}"/>
76删除: </TextBlock>
77删除: <TextBlock Grid.Row="1" Margin="0,3,0,0" Text="总计" Foreground="{DynamicResource SubTextBrush}"/>
100新增: </TextBlock>
101新增: <TextBlock Grid.Row="1" Margin="0,3,0,0" Text="总计" Foreground="{DynamicResource SubTextBrush}"/>
78102
79删除: </Grid>
80删除: <Border Grid.Column="2" VerticalAlignment="Bottom">
81删除: <StackPanel Orientation="Horizontal">
82删除: <base:View Condition="=1" Value="{Binding DiffTotalTimeType}">
83删除: <base:Icon VerticalAlignment="Center" IconType="ArrowUp8" FontSize="10" />
84删除: </base:View>
85删除: <base:View Condition="=0" Value="{Binding DiffTotalTimeType}">
86删除: <base:Icon VerticalAlignment="Center" IconType="SubtractBold" FontSize="10" />
87删除: </base:View>
88删除: <base:View Condition="=-1" Value="{Binding DiffTotalTimeType}">
89删除: <base:Icon VerticalAlignment="Center" IconType="ArrowDown8" FontSize="10" />
90删除: </base:View>
91删除: <TextBlock Text="{Binding DiffTotalTimeValue}" VerticalAlignment="Center"/>
92删除: </StackPanel>
93删除: </Border>
94删除: </Grid>
95删除: </Border>
96删除: <Border Grid.Column="1" Margin="20,5,0,0" Background="{DynamicResource SettingPanelBgBrush}" Padding="10" CornerRadius="10">
97删除: <Grid>
98删除: <Grid.ColumnDefinitions>
99删除: <ColumnDefinition Width="auto"/>
100删除: <ColumnDefinition Width="*"/>
101删除: <ColumnDefinition Width="auto"/>
102删除: </Grid.ColumnDefinitions>
103删除: <Border Width="40" Height="40" CornerRadius="14">
104删除: <Border.Background>
105删除: <LinearGradientBrush>
106删除: <GradientStop Offset="0" Color="{DynamicResource ThemeColor}"/>
107删除: <!--<GradientStop Color="#2b20d9" Offset="1"/>-->
108删除: </LinearGradientBrush>
109删除: </Border.Background>
110删除: <base:Icon IconType="Apps" Foreground="White"/>
111删除: </Border>
112删除: <Grid Grid.Column="1" Margin="10,0,0,0" VerticalAlignment="Center">
113删除: <Grid.RowDefinitions>
114删除: <RowDefinition Height="auto"/>
115删除: <RowDefinition Height="auto"/>
116删除: </Grid.RowDefinitions>
117删除: <TextBlock >
118删除: <Run Text="{Binding AppCount}" FontSize="20"/>
103新增: </Grid>
104新增: <Border Grid.Column="2" VerticalAlignment="Bottom">
105新增: <StackPanel Orientation="Horizontal">
106新增: <base:View Condition="=1" Value="{Binding DiffTotalTimeType}">
107新增: <base:Icon VerticalAlignment="Center" IconType="ArrowUp8" FontSize="10" />
108新增: </base:View>
109新增: <base:View Condition="=0" Value="{Binding DiffTotalTimeType}">
110新增: <base:Icon VerticalAlignment="Center" IconType="SubtractBold" FontSize="10" />
111新增: </base:View>
112新增: <base:View Condition="=-1" Value="{Binding DiffTotalTimeType}">
113新增: <base:Icon VerticalAlignment="Center" IconType="ArrowDown8" FontSize="10" />
114新增: </base:View>
115新增: <TextBlock Text="{Binding DiffTotalTimeValue}" VerticalAlignment="Center"/>
116新增: </StackPanel>
117新增: </Border>
118新增: </Grid>
119新增: </Border>
120新增: <Border Grid.Column="1" Margin="20,5,0,0" Background="{DynamicResource SettingPanelBgBrush}" Padding="10" CornerRadius="10">
121新增: <Grid>
122新增: <Grid.ColumnDefinitions>
123新增: <ColumnDefinition Width="auto"/>
124新增: <ColumnDefinition Width="*"/>
125新增: <ColumnDefinition Width="auto"/>
126新增: </Grid.ColumnDefinitions>
127新增: <Border Width="40" Height="40" CornerRadius="14">
128新增: <Border.Background>
129新增: <LinearGradientBrush>
130新增: <GradientStop Offset="0" Color="{DynamicResource ThemeColor}"/>
131新增: <!--<GradientStop Color="#2b20d9" Offset="1"/>-->
132新增: </LinearGradientBrush>
133新增: </Border.Background>
134新增: <base:Icon IconType="Apps" Foreground="White"/>
135新增: </Border>
136新增: <Grid Grid.Column="1" Margin="10,0,0,0" VerticalAlignment="Center">
137新增: <Grid.RowDefinitions>
138新增: <RowDefinition Height="auto"/>
139新增: <RowDefinition Height="auto"/>
140新增: </Grid.RowDefinitions>
141新增: <TextBlock >
142新增: <Run Text="{Binding AppCount}" FontSize="20" Foreground="{DynamicResource DefaultTextBrush}"/>
119143 <Run Text="个" FontSize="12" Foreground="{DynamicResource SubTextBrush}"/>
120删除: </TextBlock>
121删除: <TextBlock Grid.Row="1" Margin="0,3,0,0" Text="应用量" Foreground="{DynamicResource SubTextBrush}"/>
144新增: </TextBlock>
145新增: <TextBlock Grid.Row="1" Margin="0,3,0,0" Text="应用量" Foreground="{DynamicResource SubTextBrush}"/>
122146
123147
124删除: </Grid>
125删除: <Border Grid.Column="2" VerticalAlignment="Bottom">
126删除: <StackPanel Orientation="Horizontal">
127删除: <base:View Condition="=1" Value="{Binding DiffAppCountType}">
128删除: <base:Icon VerticalAlignment="Center" IconType="ArrowUp8" FontSize="10" />
129删除: </base:View>
130删除: <base:View Condition="=0" Value="{Binding DiffAppCountType}">
131删除: <base:Icon VerticalAlignment="Center" IconType="SubtractBold" FontSize="10" />
132删除: </base:View>
133删除: <base:View Condition="=-1" Value="{Binding DiffAppCountType}">
134删除: <base:Icon VerticalAlignment="Center" IconType="ArrowDown8" FontSize="10" />
135删除: </base:View>
136删除: <TextBlock Text="{Binding DiffAppCountValue}" VerticalAlignment="Center"/>
137删除:
138删除: </StackPanel>
139删除: </Border>
140删除: </Grid>
141删除: </Border>
142删除: <Border Grid.Column="2" Margin="20,5,0,0" Background="{DynamicResource SettingPanelBgBrush}" Padding="10" CornerRadius="10" ToolTip="{Binding Top1App.Description}">
143删除: <Grid>
144删除: <Grid.ColumnDefinitions>
145删除: <ColumnDefinition Width="auto"/>
146删除: <ColumnDefinition Width="*"/>
147删除: <ColumnDefinition Width="auto"/>
148删除: </Grid.ColumnDefinitions>
149删除: <Border Width="40" Height="40" CornerRadius="14">
150删除: <Border.Background>
151删除: <LinearGradientBrush>
152删除: <GradientStop Offset="0" Color="{DynamicResource ThemeColor}"/>
153删除: <!--<GradientStop Color="#E03C8A" Offset="1"/>-->
154删除: </LinearGradientBrush>
155删除: </Border.Background>
156删除: <base:Icon IconType="StockUp" Foreground="White"/>
157删除: </Border>
158删除: <Grid Grid.Column="1" Margin="10,0,0,0" VerticalAlignment="Center">
159删除: <Grid.RowDefinitions>
160删除: <RowDefinition Height="auto"/>
161删除: <RowDefinition Height="auto"/>
162删除: </Grid.RowDefinitions>
163删除:
164删除: <TextBlock>
165删除: <Run Text="{Binding TopHours}" FontSize="20"/>
148新增: </Grid>
149新增: <Border Grid.Column="2" VerticalAlignment="Bottom">
150新增: <StackPanel Orientation="Horizontal">
151新增: <base:View Condition="=1" Value="{Binding DiffAppCountType}">
152新增: <base:Icon VerticalAlignment="Center" IconType="ArrowUp8" FontSize="10" />
153新增: </base:View>
154新增: <base:View Condition="=0" Value="{Binding DiffAppCountType}">
155新增: <base:Icon VerticalAlignment="Center" IconType="SubtractBold" FontSize="10" />
156新增: </base:View>
157新增: <base:View Condition="=-1" Value="{Binding DiffAppCountType}">
158新增: <base:Icon VerticalAlignment="Center" IconType="ArrowDown8" FontSize="10" />
159新增: </base:View>
160新增: <TextBlock Text="{Binding DiffAppCountValue}" VerticalAlignment="Center"/>
161新增:
162新增: </StackPanel>
163新增: </Border>
164新增: </Grid>
165新增: </Border>
166新增: <Border Grid.Column="2" Margin="20,5,0,0" Background="{DynamicResource SettingPanelBgBrush}" Padding="10" CornerRadius="10" ToolTip="{Binding Top1App.Description}">
167新增: <Grid>
168新增: <Grid.ColumnDefinitions>
169新增: <ColumnDefinition Width="auto"/>
170新增: <ColumnDefinition Width="*"/>
171新增: <ColumnDefinition Width="auto"/>
172新增: </Grid.ColumnDefinitions>
173新增: <Border Width="40" Height="40" CornerRadius="14">
174新增: <Border.Background>
175新增: <LinearGradientBrush>
176新增: <GradientStop Offset="0" Color="{DynamicResource ThemeColor}"/>
177新增: <!--<GradientStop Color="#E03C8A" Offset="1"/>-->
178新增: </LinearGradientBrush>
179新增: </Border.Background>
180新增: <base:Icon IconType="StockUp" Foreground="White"/>
181新增: </Border>
182新增: <Grid Grid.Column="1" Margin="10,0,0,0" VerticalAlignment="Center">
183新增: <Grid.RowDefinitions>
184新增: <RowDefinition Height="auto"/>
185新增: <RowDefinition Height="auto"/>
186新增: </Grid.RowDefinitions>
187新增:
188新增: <TextBlock>
189新增: <Run Text="{Binding TopHours}" FontSize="20" Foreground="{DynamicResource DefaultTextBrush}"/>
166190 <Run Text="小时" FontSize="12" Foreground="{DynamicResource SubTextBrush}"/>
167删除: </TextBlock>
168删除: <TextBlock Grid.Row="1" Margin="0,3,0,0" Text="最长使用" Foreground="{DynamicResource SubTextBrush}"/>
169删除: </Grid>
170删除: <Border Grid.Column="2">
171删除: <!--<Border Width="16" Height="16">
191新增: </TextBlock>
192新增: <TextBlock Grid.Row="1" Margin="0,3,0,0" Text="最长使用" Foreground="{DynamicResource SubTextBrush}"/>
193新增: </Grid>
194新增: <Border Grid.Column="2">
195新增: <!--<Border Width="16" Height="16">
172196 <Border.Background>
173197 <ImageBrush Stretch="Fill" x:Name="image" ImageSource="{Binding Top1App.IconFile}"/>
174198 </Border.Background>
175199 </Border>-->
176删除: <Border CornerRadius="6" VerticalAlignment="Bottom" >
177删除: <base:View Value="{Binding Top1App}" Condition="not null">
178删除: <base:Img URL="{Binding Top1App.IconFile}" VerticalAlignment="Center" HorizontalAlignment="Center" Width="16" Height="16"/>
179删除: </base:View>
180删除:
181删除: </Border>
200新增: <Border CornerRadius="6" VerticalAlignment="Bottom" >
201新增: <base:View Value="{Binding Top1App}" Condition="not null">
202新增: <base:Img URL="{Binding Top1App.IconFile}" VerticalAlignment="Center" HorizontalAlignment="Center" Width="16" Height="16"/>
203新增: </base:View>
182204
183删除: </Border>
184删除: </Grid>
185删除: </Border>
186删除: </Grid>
187删除:
188删除: <WrapPanel Margin="-10">
189删除:
190删除: <!--时段-->
191删除: <Grid Margin="10,0,0,0">
192删除: <Grid.RowDefinitions>
193删除: <RowDefinition Height="auto"/>
194删除: <RowDefinition Height="*"/>
195删除: </Grid.RowDefinitions>
196删除: <!--<TextBlock Text="时段" Foreground="#5c5c5c" FontSize="15" Margin="0,20,0,5"/>-->
197删除:
198删除: <Border Grid.Row="1" Margin="0,20,0,0" Width="680" HorizontalAlignment="Left" Background="{DynamicResource SettingPanelBgBrush}" Padding="20" CornerRadius="10">
199删除: <StackPanel >
200删除: <select:Select Padding="0" Height="30" IsShowIcon="False" SelectedItem="{Binding ChartDataMode,Mode=TwoWay}" Options="{Binding ChartDataModeOptions}"/>
201删除: <charts:Charts IsStack="{Binding IsChartStack}" Height="310" ColumnSelectedIndex="{Binding ColumnSelectedIndex,Mode=TwoWay}" IsShowTotal="False" DataMaximum="{Binding DataMaximum}" NameIndexStart="{Binding NameIndexStart}" ChartsType="Column" Data="{Binding Data}" IsCanColumnSelect="{Binding IsCanColumnSelect}"/>
202删除: <base:View Value="{Binding DayHoursSelectedTime}" Condition="not empty">
203删除: <StackPanel>
204删除: <Border Margin="0,10,0,5" HorizontalAlignment="Left" Padding="10" CornerRadius="10">
205删除: <Border.Background>
206删除: <SolidColorBrush Color="{DynamicResource ThemeColor}" Opacity=".05"/>
207删除: </Border.Background>
208删除: <StackPanel Orientation="Horizontal">
209删除: <base:Icon Foreground="{DynamicResource SubTextBrush}" IconType="Calendar" VerticalAlignment="Center"/>
210删除: <TextBlock Foreground="{DynamicResource SubTextBrush}" VerticalAlignment="Center" Text="{Binding DayHoursSelectedTime}" FontSize="13" Margin="5,0,0,0"/>
205新增: </Border>
211206
212删除: </StackPanel>
213207 </Border>
214删除: <base:View Value="{Binding DayHoursData}" Condition="not empty">
215删除: <charts:Charts IsSearch="True" Margin="0,0,0,0" Height="300" ItemMenu="{Binding AppContextMenu}" Data="{Binding DayHoursData}" ChartsType="HorizontalA" ClickCommand="{Binding ToDetailCommand}" />
216删除: </base:View>
217删除: <base:View Value="{Binding DayHoursData}" Condition="empty">
218删除: <base:EmptyData/>
219删除: </base:View>
220删除: </StackPanel>
221删除: </base:View>
222删除: </StackPanel>
223删除: </Border>
208新增: </Grid>
209新增: </Border>
210新增: </Grid>
224211
225删除: </Grid>
212新增: <WrapPanel Margin="-10">
226213
214新增: <!--时段-->
215新增: <Grid Margin="10,0,0,0">
216新增: <Grid.RowDefinitions>
217新增: <RowDefinition Height="auto"/>
218新增: <RowDefinition Height="*"/>
219新增: </Grid.RowDefinitions>
220新增: <!--<TextBlock Text="时段" Foreground="#5c5c5c" FontSize="15" Margin="0,20,0,5"/>-->
227221
228删除: <!--雷达图-->
229删除: <Grid Margin="10,0,0,0" Width="350" Height="400" VerticalAlignment="Top">
230删除: <Grid.RowDefinitions>
231删除: <RowDefinition Height="auto"/>
232删除: <RowDefinition Height="*"/>
233删除: </Grid.RowDefinitions>
222新增: <Border Grid.Row="1" Margin="0,20,0,0" Width="680" HorizontalAlignment="Left" Background="{DynamicResource SettingPanelBgBrush}" Padding="20" CornerRadius="10">
223新增: <StackPanel >
224新增: <select:Select Padding="0" Height="30" IsShowIcon="False" SelectedItem="{Binding ChartDataMode,Mode=TwoWay}" Options="{Binding ChartDataModeOptions}"/>
225新增: <charts:Charts IsStack="{Binding IsChartStack}" Height="310" ColumnSelectedIndex="{Binding ColumnSelectedIndex,Mode=TwoWay}" IsShowTotal="False" DataMaximum="{Binding DataMaximum}" NameIndexStart="{Binding NameIndexStart}" ChartsType="Column" Data="{Binding Data}" IsCanColumnSelect="{Binding IsCanColumnSelect}"/>
226新增: <base:View Value="{Binding DayHoursSelectedTime}" Condition="not empty">
227新增: <StackPanel>
228新增: <Border Margin="0,10,0,5" HorizontalAlignment="Left" Padding="10" CornerRadius="10">
229新增: <Border.Background>
230新增: <SolidColorBrush Color="{DynamicResource ThemeColor}" Opacity=".05"/>
231新增: </Border.Background>
232新增: <StackPanel Orientation="Horizontal">
233新增: <base:Icon Foreground="{DynamicResource SubTextBrush}" IconType="Calendar" VerticalAlignment="Center"/>
234新增: <TextBlock Foreground="{DynamicResource SubTextBrush}" VerticalAlignment="Center" Text="{Binding DayHoursSelectedTime}" FontSize="13" Margin="5,0,0,0"/>
234235
235删除: <TextBlock Text="分类" Foreground="#5c5c5c" FontSize="15" Margin="0,20,0,5"/>
236删除: <Border Margin="0,5,0,0" Grid.Row="1" Background="{DynamicResource SettingPanelBgBrush}" Padding="20" CornerRadius="10">
237删除: <charts:Charts Margin="10,20,10,10" Height="230" Width="230" ChartsType="Radar" Data="{Binding RadarData}"/>
236新增: </StackPanel>
237新增: </Border>
238新增: <base:View Value="{Binding DayHoursData}" Condition="not empty">
239新增: <charts:Charts IsSearch="True" Margin="0,0,0,0" Height="300" ItemMenu="{Binding AppContextMenu}" Data="{Binding DayHoursData}" ChartsType="List" ClickCommand="{Binding ToDetailCommand}" />
240新增: </base:View>
241新增: <base:View Value="{Binding DayHoursData}" Condition="empty">
242新增: <base:EmptyData/>
243新增: </base:View>
244新增: </StackPanel>
245新增: </base:View>
246新增: </StackPanel>
247新增: </Border>
238248
239删除: </Border>
240删除: </Grid>
249新增: </Grid>
241250
242删除: <!--最为频繁-->
243删除: <Grid Margin="10,0,0,0" Width="320" Height="400" VerticalAlignment="Top">
244删除: <Grid.RowDefinitions>
245删除: <RowDefinition Height="auto"/>
246删除: <RowDefinition Height="*"/>
247删除: </Grid.RowDefinitions>
248删除:
249删除: <TextBlock Text="最为频繁" Foreground="#5c5c5c" FontSize="15" Margin="0,20,0,5"/>
250删除: <Border Grid.Row="1" Margin="0,5,0,0" Background="{DynamicResource SettingPanelBgBrush}" Padding="20" CornerRadius="10">
251删除: <charts:Charts ItemMenu="{Binding AppContextMenu}" Data="{Binding TopData}" ChartsType="HorizontalA" ClickCommand="{Binding ToDetailCommand}" IsCanScroll="False"/>
252删除: </Border>
253删除: </Grid>
254251
255删除: <!--<Grid Width="680" HorizontalAlignment="Left">
252新增: <!--雷达图-->
253新增: <Grid Margin="10,0,0,10" Width="350" Height="400" VerticalAlignment="Top">
254新增: <Grid.RowDefinitions>
255新增: <RowDefinition Height="auto"/>
256新增: <RowDefinition Height="*"/>
257新增: </Grid.RowDefinitions>
258新增:
259新增: <TextBlock Text="分类" Foreground="#5c5c5c" FontSize="15" Margin="0,20,0,5"/>
260新增: <Border Margin="0,5,0,0" Grid.Row="1" Background="{DynamicResource SettingPanelBgBrush}" Padding="20" CornerRadius="10">
261新增: <charts:Charts Margin="10,20,10,10" Height="230" Width="230" ChartsType="Radar" Data="{Binding RadarData}"/>
262新增:
263新增: </Border>
264新增: </Grid>
265新增:
266新增: <!--最为频繁-->
267新增: <Grid Margin="10,0,0,10" Width="320" Height="400" VerticalAlignment="Top">
268新增: <Grid.RowDefinitions>
269新增: <RowDefinition Height="auto"/>
270新增: <RowDefinition Height="*"/>
271新增: </Grid.RowDefinitions>
272新增:
273新增: <TextBlock Text="最为频繁" Foreground="#5c5c5c" FontSize="15" Margin="0,20,0,5"/>
274新增: <Border Grid.Row="1" Margin="0,5,0,0" Background="{DynamicResource SettingPanelBgBrush}" Padding="20" CornerRadius="10">
275新增: <charts:Charts ItemMenu="{Binding AppContextMenu}" Data="{Binding TopData}" ChartsType="List" ClickCommand="{Binding ToDetailCommand}" IsCanScroll="False"/>
276新增: </Border>
277新增: </Grid>
278新增:
279新增: <!--<Grid Width="680" HorizontalAlignment="Left">
256280 <Grid.ColumnDefinitions>
257281 <ColumnDefinition Width="*"/>
258282 <ColumnDefinition Width="*"/>
@@ -281,6 +305,247 @@
281305 </Grid>-->
282306
283307
284删除: </WrapPanel>
308新增: </WrapPanel>
309新增:
310新增: </StackPanel>
311新增: </TabItem>
312新增: <TabItem TextElement.Foreground="{DynamicResource DefaultTextBrush}">
313新增: <!--网页数据-->
314新增: <StackPanel>
315新增: <Grid Width="680" HorizontalAlignment="Left" Margin="0,5,0,0">
316新增: <Grid.ColumnDefinitions>
317新增: <ColumnDefinition Width="*"/>
318新增: <ColumnDefinition Width="*"/>
319新增: <ColumnDefinition Width="*"/>
320新增: </Grid.ColumnDefinitions>
321新增: <Border Margin="0,5,0,0" Padding="10" CornerRadius="10" Background="{DynamicResource SettingPanelBgBrush}">
322新增: <Grid>
323新增: <Grid.ColumnDefinitions>
324新增: <ColumnDefinition Width="auto"/>
325新增: <ColumnDefinition Width="*"/>
326新增: <ColumnDefinition Width="auto"/>
327新增:
328新增: </Grid.ColumnDefinitions>
329新增: <Border Width="40" Height="40" CornerRadius="14">
330新增: <Border.Background>
331新增: <LinearGradientBrush>
332新增: <GradientStop Offset="0" Color="{DynamicResource ThemeColor}"/>
333新增: <!--<GradientStop Color="#F4A7B9" Offset="1"/>-->
334新增: </LinearGradientBrush>
335新增: </Border.Background>
336新增: <base:Icon IconType="Stopwatch" Foreground="White"/>
337新增: </Border>
338新增: <Grid Grid.Column="1" Margin="10,0,0,0" VerticalAlignment="Center">
339新增: <Grid.RowDefinitions>
340新增: <RowDefinition Height="auto"/>
341新增: <RowDefinition Height="auto"/>
342新增: </Grid.RowDefinitions>
343新增: <TextBlock >
344新增: <Run Text="{Binding WebTotalTimeText}" FontSize="20" Foreground="{DynamicResource DefaultTextBrush}"/>
345新增: <Run Text="小时" FontSize="12" Foreground="{DynamicResource SubTextBrush}"/>
346新增: </TextBlock>
347新增: <TextBlock Grid.Row="1" Margin="0,3,0,0" Text="浏览" Foreground="{DynamicResource SubTextBrush}"/>
348新增:
349新增: </Grid>
350新增: <Border Grid.Column="2" VerticalAlignment="Bottom">
351新增: <base:DiffValue Value="{Binding WebTotalTime}" LastValue="{Binding LastWebTotalTime}" />
352新增: </Border>
353新增: </Grid>
354新增: </Border>
355新增: <Border Grid.Column="1" Margin="20,5,0,0" Background="{DynamicResource SettingPanelBgBrush}" Padding="10" CornerRadius="10">
356新增: <Grid>
357新增: <Grid.ColumnDefinitions>
358新增: <ColumnDefinition Width="auto"/>
359新增: <ColumnDefinition Width="*"/>
360新增: <ColumnDefinition Width="auto"/>
361新增: </Grid.ColumnDefinitions>
362新增: <Border Width="40" Height="40" CornerRadius="14">
363新增: <Border.Background>
364新增: <LinearGradientBrush>
365新增: <GradientStop Offset="0" Color="{DynamicResource ThemeColor}"/>
366新增: <!--<GradientStop Color="#2b20d9" Offset="1"/>-->
367新增: </LinearGradientBrush>
368新增: </Border.Background>
369新增: <base:Icon IconType="WebSearch" Foreground="White"/>
370新增: </Border>
371新增: <Grid Grid.Column="1" Margin="10,0,0,0" VerticalAlignment="Center">
372新增: <Grid.RowDefinitions>
373新增: <RowDefinition Height="auto"/>
374新增: <RowDefinition Height="auto"/>
375新增: </Grid.RowDefinitions>
376新增: <TextBlock >
377新增: <Run Text="{Binding WebSiteCount}" FontSize="20" Foreground="{DynamicResource DefaultTextBrush}"/>
378新增: <Run Text="个" FontSize="12" Foreground="{DynamicResource SubTextBrush}"/>
379新增: </TextBlock>
380新增: <TextBlock Grid.Row="1" Margin="0,3,0,0" Text="站点" Foreground="{DynamicResource SubTextBrush}"/>
381新增:
382新增:
383新增: </Grid>
384新增: <Border Grid.Column="2" VerticalAlignment="Bottom">
385新增: <base:DiffValue Type="Number" Value="{Binding WebSiteCount}" LastValue="{Binding LastWebSiteCount}" />
386新增: </Border>
387新增: </Grid>
388新增: </Border>
389新增: <Border Grid.Column="2" Margin="20,5,0,0" Background="{DynamicResource SettingPanelBgBrush}" Padding="10" CornerRadius="10" >
390新增: <Grid>
391新增: <Grid.ColumnDefinitions>
392新增: <ColumnDefinition Width="auto"/>
393新增: <ColumnDefinition Width="*"/>
394新增: <ColumnDefinition Width="auto"/>
395新增: </Grid.ColumnDefinitions>
396新增: <Border Width="40" Height="40" CornerRadius="14">
397新增: <Border.Background>
398新增: <LinearGradientBrush>
399新增: <GradientStop Offset="0" Color="{DynamicResource ThemeColor}"/>
400新增: <!--<GradientStop Color="#E03C8A" Offset="1"/>-->
401新增: </LinearGradientBrush>
402新增: </Border.Background>
403新增: <base:Icon IconType="Website" Foreground="White"/>
404新增: </Border>
405新增: <Grid Grid.Column="1" Margin="10,0,0,0" VerticalAlignment="Center">
406新增: <Grid.RowDefinitions>
407新增: <RowDefinition Height="auto"/>
408新增: <RowDefinition Height="auto"/>
409新增: </Grid.RowDefinitions>
410新增:
411新增: <TextBlock>
412新增: <Run Text="{Binding WebPageCount}" FontSize="20" Foreground="{DynamicResource DefaultTextBrush}"/>
413新增: <Run Text="个" FontSize="12" Foreground="{DynamicResource SubTextBrush}"/>
414新增: </TextBlock>
415新增: <TextBlock Grid.Row="1" Margin="0,3,0,0" Text="网页" Foreground="{DynamicResource SubTextBrush}"/>
416新增: </Grid>
417新增: <Border Grid.Column="2" VerticalAlignment="Bottom">
418新增: <base:DiffValue Type="Number" Value="{Binding WebPageCount}" LastValue="{Binding LastWebPageCount}" />
419新增: </Border>
420新增: </Grid>
421新增: </Border>
422新增: </Grid>
423新增:
424新增: <WrapPanel Margin="-10,0,-10,0">
425新增: <!--柱形图-->
426新增: <Border Margin="10,10,0,0" Background="{DynamicResource SettingPanelBgBrush}" CornerRadius="10" Width="680" Padding="20" >
427新增: <StackPanel>
428新增: <charts:Charts IsCanColumnSelect="True" ColumnSelectedIndex="{Binding WebColSelectedIndex,Mode=TwoWay}" IsShowTotal="False" NameIndexStart="{Binding NameIndexStart}" IsStack="True" Height="305" ChartsType="Column" Data="{Binding WebBrowseStatisticsData}"/>
429新增:
430新增:
431新增: <!--选择列数据-->
432新增: <base:View Condition="!=-1" Value="{Binding WebColSelectedIndex}">
433新增: <StackPanel>
434新增: <Border Margin="0,10,0,10" HorizontalAlignment="Left" Padding="10" CornerRadius="10">
435新增: <Border.Background>
436新增: <SolidColorBrush Color="{DynamicResource ThemeColor}" Opacity=".05"/>
437新增: </Border.Background>
438新增: <StackPanel Orientation="Horizontal">
439新增: <base:Icon Foreground="{DynamicResource SubTextBrush}" IconType="Calendar" VerticalAlignment="Center"/>
440新增: <TextBlock Foreground="{DynamicResource SubTextBrush}" VerticalAlignment="Center" Text="{Binding WebSitesColSelectedTimeText}" FontSize="13" Margin="5,0,0,0"/>
441新增:
442新增: </StackPanel>
443新增: </Border>
444新增: <base:View Value="{Binding WebSitesColSelectedData}" Condition="not empty">
445新增: <charts:Charts IconSize="18" IsSearch="True" Margin="0,0,0,0" Height="300" Data="{Binding WebSitesColSelectedData}" ChartsType="List" ClickCommand="{Binding ToDetailCommand}" ItemMenu="{Binding WebSiteContextMenu}"/>
446新增: </base:View>
447新增: <base:View Value="{Binding WebSitesColSelectedData}" Condition="empty">
448新增: <base:EmptyData/>
449新增: </base:View>
450新增: </StackPanel>
451新增: </base:View>
452新增: </StackPanel>
453新增:
454新增: </Border>
455新增: <!--饼图-->
456新增: <Border Margin="10,10,0,0" Width="350" Height="300" Padding="20" Background="{DynamicResource SettingPanelBgBrush}" CornerRadius="10" VerticalAlignment="Top">
457新增: <Grid>
458新增: <Grid.RowDefinitions>
459新增: <RowDefinition Height="auto"/>
460新增: <RowDefinition Height="*"/>
461新增: </Grid.RowDefinitions>
462新增: <TextBlock Text="分类占比" FontSize="14"/>
463新增:
464新增: <Grid Grid.Row="1" Margin="0,20,0,0">
465新增:
466新增:
467新增: <Grid.ColumnDefinitions>
468新增: <ColumnDefinition Width="auto"/>
469新增: <ColumnDefinition Width="*"/>
470新增: </Grid.ColumnDefinitions>
471新增: <charts:Charts Width="100" Height="100" ChartsType="Pie" Data="{Binding WebCategoriesPieData}" VerticalAlignment="Center" HorizontalAlignment="Left"/>
472新增: <ListView MaxHeight="200" Margin="20,0,0,0" VerticalAlignment="Center" Grid.Column="1" ItemsSource="{Binding WebCategoriesPieData}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" >
473新增:
474新增: <ListBox.Resources>
475新增: <converter:HextoColorConverter x:Key="HextoColorConverter"/>
476新增:
477新增: <Style TargetType="{x:Type ListView}">
478新增: <Setter Property="OverridesDefaultStyle" Value="True"/>
479新增:
480新增: <Setter Property="Template">
481新增: <Setter.Value>
482新增: <ControlTemplate TargetType="{x:Type ListView}">
483新增: <Border>
484新增: <ScrollViewer>
485新增: <ItemsPresenter />
486新增: </ScrollViewer>
487新增: </Border>
488新增: </ControlTemplate>
489新增: </Setter.Value>
490新增: </Setter>
491新增: </Style>
492新增: <Style TargetType="{x:Type ListViewItem}">
493新增: <Setter Property="OverridesDefaultStyle" Value="True"/>
494新增: <Setter Property="Template">
495新增: <Setter.Value>
496新增: <ControlTemplate TargetType="{x:Type ListViewItem}">
497新增: <Grid>
498新增:
499新增: <Border BorderBrush="Transparent" BorderThickness="2" x:Name="Border" Margin="5" CornerRadius="20">
500新增: <ContentPresenter/>
501新增: </Border>
502新增: </Grid>
503新增:
504新增:
505新增: </ControlTemplate>
506新增: </Setter.Value>
507新增: </Setter>
508新增:
509新增: </Style>
510新增: </ListBox.Resources>
511新增: <ListBox.ItemsPanel>
512新增: <ItemsPanelTemplate>
513新增: <StackPanel/>
514新增: </ItemsPanelTemplate>
515新增: </ListBox.ItemsPanel>
516新增: <ListView.ItemTemplate>
517新增: <DataTemplate>
518新增: <StackPanel Orientation="Horizontal" >
519新增: <Rectangle HorizontalAlignment="Left" VerticalAlignment="Center" RadiusX="2" RadiusY="2" Width="12" Height="12" Fill="{Binding Color,Converter={StaticResource HextoColorConverter}}"/>
520新增:
521新增: <!--<base:Img Margin="5,0,0,0" Radius="8" Width="16" Height="16" URL="{Binding Icon}"/>-->
522新增: <TextBlock Margin="5,0,0,0" Foreground="{DynamicResource SubTextBrush}" HorizontalAlignment="Center" VerticalAlignment="Center" Text="{Binding Name}" FontSize="12"/>
523新增:
524新增: </StackPanel>
525新增: </DataTemplate>
526新增: </ListView.ItemTemplate>
527新增: </ListView>
528新增: </Grid>
529新增: </Grid>
530新增: </Border>
531新增:
532新增: <!--最为频繁-->
533新增: <Border Margin="10,10,0,0" Background="{DynamicResource SettingPanelBgBrush}" Padding="20" CornerRadius="10" Width="320" Height="300" VerticalAlignment="Top">
534新增: <Grid>
535新增: <Grid.RowDefinitions>
536新增: <RowDefinition Height="auto"/>
537新增: <RowDefinition Height="*"/>
538新增: </Grid.RowDefinitions>
539新增:
540新增: <TextBlock Text="最为频繁" FontSize="14" />
541新增:
542新增: <charts:Charts IconSize="18" Grid.Row="1" Margin="0,10,0,0" Data="{Binding WebSitesTopData}" ChartsType="List" ClickCommand="{Binding ToDetailCommand}" ItemMenu="{Binding WebSiteContextMenu}"/>
543新增:
544新增: </Grid>
545新增: </Border>
546新增: </WrapPanel>
547新增: </StackPanel>
548新增: </TabItem>
549新增: </TabControl>
285550 </StackPanel>
286551</Page>
修改UI/Views/DataPage.xaml+12 −8看文件
@@ -1,13 +1,14 @@
1删除:<Page
1新增:<control:TPage
22 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
33 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
44 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
55 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
66 xmlns:local="clr-namespace:UI.Views"
77 xmlns:Charts="clr-namespace:UI.Controls.Charts" xmlns:Tabbar="clr-namespace:UI.Controls.Tabbar" xmlns:DatePickerBar="clr-namespace:UI.Controls.DatePickerBar" xmlns:select="clr-namespace:UI.Controls.Select" x:Class="UI.Views.DataPage"
8新增: xmlns:control="clr-namespace:UI.Controls"
89 mc:Ignorable="d"
910 d:DesignHeight="450" d:DesignWidth="800"
10删除: Title="IndexPage" Foreground="{DynamicResource StandardTextBrush}">
11新增: Title="IndexPage" Foreground="{DynamicResource StandardTextBrush}" IsFillPage="True">
1112 <Grid Margin="20">
1213 <Grid.RowDefinitions>
1314 <RowDefinition Height="auto"/>
@@ -15,8 +16,11 @@
1516 <RowDefinition Height="*"/>
1617
1718 </Grid.RowDefinitions>
18删除: <TextBlock Text="详细" FontSize="18" Margin="0,5,0,20"/>
19删除:
19新增: <!--<TextBlock Text="详细" FontSize="18" Margin="0,5,0,20"/>-->
20新增: <StackPanel Orientation="Horizontal" Margin="0,5,0,20" >
21新增: <TextBlock Text="详细" FontSize="18" VerticalAlignment="Center"/>
22新增: <select:Select Margin="10,0,0,0" VerticalAlignment="Top" Padding="10,5" IsShowIcon="False" SelectedItem="{Binding ShowType,Mode=TwoWay}" Options="{Binding ShowTypeOptions}"/>
23新增: </StackPanel>
2024 <Tabbar:Tabbar Width="145" HorizontalAlignment="Left" Grid.Row="1" Data="{Binding TabbarData}" SelectedIndex="{Binding TabbarSelectedIndex,Mode=TwoWay}"/>
2125
2226
@@ -49,7 +53,7 @@
4953 <select:DateSelect Date="{Binding DayDate,Mode=TwoWay}"/>
5054 <!--<DatePickerBar:DatePickerBar SelectedDate="{Binding DayDate,Mode=TwoWay}" ShowType="Day"/>-->
5155
52删除: <Charts:Charts IsShowBadge="True" IsSearch="True" Grid.Row="1" ItemMenu="{Binding AppContextMenu}" Data="{Binding Data}" ChartsType="HorizontalA" Margin="0,20,0,0" ClickCommand="{Binding ToDetailCommand}"/>
56新增: <Charts:Charts IsShowBadge="True" IsSearch="True" Grid.Row="1" ItemMenu="{Binding AppContextMenu}" Data="{Binding Data}" ChartsType="List" Margin="0,20,0,0" ClickCommand="{Binding ToDetailCommand}"/>
5357 </Grid>
5458 </TabItem>
5559 <TabItem>
@@ -61,7 +65,7 @@
6165 </Grid.RowDefinitions>
6266 <!--<DatePickerBar:DatePickerBar SelectedDate="{Binding MonthDate,Mode=TwoWay}" ShowType="Month"/>-->
6367 <select:DateSelect Date="{Binding MonthDate,Mode=TwoWay}" SelectType="Month"/>
64删除: <Charts:Charts IsShowBadge="True" IsSearch="True" Grid.Row="1" ItemMenu="{Binding AppContextMenu}" Data="{Binding MonthData}" ChartsType="HorizontalA" Margin="0,20,0,0" ClickCommand="{Binding ToDetailCommand}"/>
68新增: <Charts:Charts IsShowBadge="True" IsSearch="True" Grid.Row="1" ItemMenu="{Binding AppContextMenu}" Data="{Binding MonthData}" ChartsType="List" Margin="0,20,0,0" ClickCommand="{Binding ToDetailCommand}"/>
6569 </Grid>
6670 </TabItem>
6771 <TabItem>
@@ -74,7 +78,7 @@
7478 <!--<DatePickerBar:DatePickerBar SelectedDate="{Binding YearDate,Mode=TwoWay}" ShowType="Year"/>-->
7579 <select:DateSelect Date="{Binding YearDate,Mode=TwoWay}" SelectType="Year"/>
7680
77删除: <Charts:Charts IsShowBadge="True" IsSearch="True" Grid.Row="1" ItemMenu="{Binding AppContextMenu}" Data="{Binding YearData}" ChartsType="HorizontalA" Margin="0,20,0,0" ClickCommand="{Binding ToDetailCommand}"/>
81新增: <Charts:Charts IsShowBadge="True" IsSearch="True" Grid.Row="1" ItemMenu="{Binding AppContextMenu}" Data="{Binding YearData}" ChartsType="List" Margin="0,20,0,0" ClickCommand="{Binding ToDetailCommand}"/>
7882 </Grid>
7983 </TabItem>
8084 </TabControl>
@@ -82,4 +86,4 @@
8286
8387
8488 </Grid>
85删除:</Page>
89新增:</control:TPage>
修改UI/Views/DataPage.xaml.cs+2 −1看文件
@@ -14,6 +14,7 @@ using System.Windows.Media.Imaging;
1414using System.Windows.Navigation;
1515using System.Windows.Shapes;
1616using System.Windows.Threading;
17新增:using UI.Controls;
1718using UI.Controls.Charts.Model;
1819using UI.ViewModels;
1920
@@ -22,7 +23,7 @@ namespace UI.Views
2223 /// <summary>
2324 /// IndexPage.xaml 的交互逻辑
2425 /// </summary>
25删除: public partial class DataPage : Page
26新增: public partial class DataPage : TPage
2627 {
2728 public DataPage(DataPageVM vm)
2829 {
修改UI/Views/DetailPage.xaml+3 −3看文件
@@ -16,7 +16,7 @@
1616 </ContextMenu>
1717 </Page.ContextMenu>
1818 <StackPanel Margin="20">
19删除: <TextBlock Text="查看" FontSize="18" Margin="0,0,0,20"/>
19新增: <TextBlock Text="应用" FontSize="18" Margin="0,0,0,20"/>
2020
2121 <Border
2222 Background="{DynamicResource SettingPanelBgBrush}"
@@ -140,7 +140,7 @@
140140
141141 <WrapPanel Margin="-10">
142142 <StackPanel Margin="10,10,0,0">
143删除: <TextBlock Text="使用时长" Foreground="#5c5c5c" FontSize="14" Margin="0,20,0,0"/>
143新增: <TextBlock Text="时长统计" Foreground="#5c5c5c" FontSize="14" Margin="0,20,0,0"/>
144144
145145 <Border Margin="0,10,0,0" Width="680" HorizontalAlignment="Left" Background="{DynamicResource SettingPanelBgBrush}" Padding="20" CornerRadius="10">
146146 <StackPanel>
@@ -178,7 +178,7 @@
178178 </StackPanel>
179179
180180 <StackPanel Margin="10,0,0,0" VerticalAlignment="Bottom" Width="680">
181删除: <TextBlock Text="每月" Foreground="#5c5c5c" FontSize="14" Margin="0,20,0,0"/>
181新增: <TextBlock Text="月度总览" Foreground="#5c5c5c" FontSize="14" Margin="0,20,0,0"/>
182182
183183 <Border
184184 Background="{DynamicResource SettingPanelBgBrush}"
修改UI/Views/IndexPage.xaml+95 −5看文件
@@ -5,7 +5,8 @@
55 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
66 xmlns:local="clr-namespace:UI.Views"
77 xmlns:Charts="clr-namespace:UI.Controls.Charts" xmlns:Tabbar="clr-namespace:UI.Controls.Tabbar" x:Class="UI.Views.IndexPage"
8删除: mc:Ignorable="d"
8新增: xmlns:base="clr-namespace:UI.Controls.Base" xmlns:select="clr-namespace:UI.Controls.Select"
9新增: mc:Ignorable="d"
910 d:DesignHeight="450" d:DesignWidth="800"
1011 Title="IndexPage"
1112 Foreground="{DynamicResource StandardTextBrush}" Background="Transparent">
@@ -30,10 +31,99 @@
3031 </Border>-->
3132 <TextBlock Text="概览" FontSize="18" Margin="0,5,0,20"/>
3233 <Tabbar:Tabbar Width="100" HorizontalAlignment="Left" Data="{Binding TabbarData}" SelectedIndex="{Binding TabbarSelectedIndex,Mode=TwoWay}"/>
33删除: <TextBlock Text="最为频繁" FontSize="15" Margin="0,20,0,10"/>
34删除: <Charts:Charts IsCanScroll="False" Data="{Binding WeekData}" ChartsType="HorizontalA" ShowLimit="{Binding FrequentUseNum}" IsLoading="{Binding IsLoading,Mode=TwoWay}" ClickCommand="{Binding ToDetailCommand}" ItemMenu="{Binding AppContextMenu}"/>
35删除: <TextBlock Text="更多" FontSize="15" Margin="0,20,0,10"/>
36删除: <Charts:Charts Data="{Binding WeekData}" ItemMenu="{Binding AppContextMenu}" ChartsType="Card" ShowLimit="{Binding MoreNum}" IsLoading="{Binding IsLoading,Mode=TwoWay}" ClickCommand="{Binding ToDetailCommand}"/>
34新增: <TextBlock Text="最为频繁" FontSize="14" Margin="0,10,0,10" Foreground="{DynamicResource SubTextBrush}"/>
35新增: <Grid>
36新增: <Grid.ColumnDefinitions>
37新增: <ColumnDefinition Width="6*"/>
38新增: <ColumnDefinition Width="10"/>
39新增: <ColumnDefinition Width="4*"/>
40新增: </Grid.ColumnDefinitions>
41新增: <Grid HorizontalAlignment="Right" VerticalAlignment="Bottom" Margin="0,0,10,10">
42新增: <base:Icon IconType="OEM" FontSize="80" Opacity=".1"/>
43新增: </Grid>
44新增: <Grid Grid.Column="2" HorizontalAlignment="Right" VerticalAlignment="Bottom" Margin="0,0,10,10">
45新增: <base:Icon IconType="WebSearch" FontSize="80" Opacity=".05" Foreground="{DynamicResource ThemeBrush}"/>
46新增: </Grid>
47新增: <!--应用-->
48新增: <Border CornerRadius="10" Padding="10">
49新增: <Border.Background>
50新增: <SolidColorBrush Color="{DynamicResource SettingPanelBgColor}" Opacity=".7"/>
51新增: </Border.Background>
52新增: <StackPanel>
53新增: <Border HorizontalAlignment="Left" Padding="10,5" CornerRadius="6">
54新增: <Border.Background>
55新增: <SolidColorBrush Color="{DynamicResource HoverBackgroundColor}" Opacity=".5"/>
56新增: </Border.Background>
57新增: <StackPanel Orientation="Horizontal" TextElement.Foreground="{DynamicResource SubTextBrush}">
58新增: <base:Icon VerticalAlignment="Center" IconType="Apps"/>
59新增: <TextBlock FontSize="10" VerticalAlignment="Center" Text="应用" Margin="5,0,0,0"/>
60新增: </StackPanel>
61新增: </Border>
62新增: <Charts:Charts IconSize="20" Margin="0,5,0,0" IsCanScroll="False" Data="{Binding WeekData}" ChartsType="List" ShowLimit="{Binding FrequentUseNum}" IsLoading="{Binding IsLoading,Mode=TwoWay}" ClickCommand="{Binding ToDetailCommand}" ItemMenu="{Binding AppContextMenu}"/>
63新增: </StackPanel>
64新增: </Border>
65新增: <!--网页-->
66新增: <Border Grid.Column="2" Padding="10" CornerRadius="10">
67新增: <Border.Background>
68新增: <SolidColorBrush Color="{DynamicResource ThemeColor}" Opacity=".1"/>
69新增: </Border.Background>
70新增: <Grid>
71新增: <Grid.RowDefinitions>
72新增: <RowDefinition Height="auto"/>
73新增: <RowDefinition Height="*"/>
74新增: </Grid.RowDefinitions>
75新增: <Border HorizontalAlignment="Left" Padding="10,5" CornerRadius="6">
76新增: <Border.Background>
77新增: <SolidColorBrush Color="{DynamicResource ThemeColor}" Opacity=".2"/>
78新增: </Border.Background>
79新增: <StackPanel Orientation="Horizontal" TextElement.Foreground="{DynamicResource ThemeBrush}">
80新增: <base:Icon VerticalAlignment="Center" IconType="Website"/>
81新增: <TextBlock FontSize="10" VerticalAlignment="Center" Text="网站" Margin="5,0,0,0"/>
82新增: </StackPanel>
83新增: </Border>
84新增:
85新增: <Charts:Charts IconSize="18" Grid.Row="1" Margin="0,5,0,0" IsCanScroll="False" ClickCommand="{Binding ToDetailCommand}" Data="{Binding WebFrequentUseData}" ChartsType="List" IsLoading="{Binding IsLoading,Mode=TwoWay}" ItemMenu="{Binding WebSiteContextMenu}">
86新增: <Charts:Charts.Resources>
87新增: <SolidColorBrush x:Key="ListItemIconBgBrush" Color="{StaticResource ThemeColor}" Opacity=".2"/>
88新增: <SolidColorBrush x:Key="ChartTypeListProgressBarBrush" Color="{StaticResource ThemeColor}" Opacity=".6"/>
89新增: </Charts:Charts.Resources>
90新增: </Charts:Charts>
91新增: </Grid>
92新增: </Border>
93新增: </Grid>
94新增: <StackPanel Orientation="Horizontal" Margin="0,20,0,0">
95新增: <TextBlock Text="更多" FontSize="14" VerticalAlignment="Center" Foreground="{DynamicResource SubTextBrush}"/>
96新增: <select:Select Margin="10,0,0,0" VerticalAlignment="Center" Padding="10,5" IsShowIcon="False" SelectedItem="{Binding MoreType,Mode=TwoWay}" Options="{Binding MoreTypeOptions}"/>
97新增: </StackPanel>
98新增:
99新增: <TabControl
100新增: SelectedIndex="{Binding MoreType.Id}"
101新增: BorderThickness="0"
102新增: Margin="0,10,0,0"
103新增: Padding="0"
104新增: Background="Transparent"
105新增: >
106新增: <TabControl.Resources>
107新增: <Style TargetType="TabItem">
108新增: <Setter Property="Template">
109新增: <Setter.Value>
110新增: <ControlTemplate TargetType="TabItem">
111新增: </ControlTemplate>
112新增: </Setter.Value>
113新增: </Setter>
114新增: </Style>
115新增:
116新增: </TabControl.Resources>
117新增: <TabItem>
118新增: <Charts:Charts Data="{Binding AppMoreData}" ItemMenu="{Binding AppContextMenu}" ChartsType="Card" ShowLimit="{Binding MoreNum}" IsLoading="{Binding IsLoading,Mode=TwoWay}" ClickCommand="{Binding ToDetailCommand}"/>
119新增: </TabItem>
120新增: <TabItem>
121新增: <Grid>
122新增: <Charts:Charts Data="{Binding WebMoreData}" ClickCommand="{Binding ToDetailCommand}" ChartsType="Card" ShowLimit="{Binding MoreNum}" IsLoading="{Binding IsLoading,Mode=TwoWay}" ItemMenu="{Binding WebSiteContextMenu}"/>
123新增: </Grid>
124新增: </TabItem>
125新增: </TabControl>
126新增:
37127
38128
39129 </StackPanel>
新增UI/Views/WebSiteDetailPage.xaml+198 −0看文件
@@ -0,0 +1,198 @@
1新增:<Page x:Class="UI.Views.WebSiteDetailPage"
2新增: xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3新增: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4新增: xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
5新增: xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
6新增: xmlns:local="clr-namespace:UI.Views" xmlns:base="clr-namespace:UI.Controls.Base" xmlns:charts="clr-namespace:UI.Controls.Charts" xmlns:select="clr-namespace:UI.Controls.Select" xmlns:tabbar="clr-namespace:UI.Controls.Tabbar"
7新增: mc:Ignorable="d"
8新增: d:DesignHeight="450" d:DesignWidth="800"
9新增: Title="WebSiteDetailPage" Foreground="{DynamicResource StandardTextBrush}" xmlns:converter="clr-namespace:UI.Controls.Converters">
10新增: <Page.Resources>
11新增: <converter:TimeConverter x:Key="TimeConverter"/>
12新增: <converter:DateTimeConverter x:Key="DateTimeConverter"/>
13新增: <converter:GetCountConverter x:Key="GetCountConverter"/>
14新增: </Page.Resources>
15新增: <Grid>
16新增: <StackPanel Margin="20">
17新增: <TextBlock Text="网站" FontSize="18" Margin="0,0,0,20"/>
18新增:
19新增: <!--基本信息-->
20新增: <Border
21新增: Background="{DynamicResource SettingPanelBgBrush}"
22新增: CornerRadius="12"
23新增: Padding="20"
24新增: ContextMenu="{Binding WebSiteContextMenu}">
25新增: <Grid>
26新增: <Grid.ColumnDefinitions>
27新增: <ColumnDefinition Width="auto"/>
28新增: <ColumnDefinition Width="*"/>
29新增: </Grid.ColumnDefinitions>
30新增: <base:Img URL="{Binding WebSite.IconFile}" Width="25" Height="25" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="20,0"/>
31新增: <StackPanel Grid.Column="1">
32新增: <base:View Value="{Binding IsIgnore}">
33新增: <Border Background="#f51837" Padding="10,5" CornerRadius="4" Margin="0,0,0,5" VerticalAlignment="Center" HorizontalAlignment="Left" ToolTip="该站点数据将不会被统计">
34新增: <StackPanel Orientation="Horizontal" VerticalAlignment="Center">
35新增: <base:Icon IconType="StatusCircleBlock" FontSize="12" VerticalAlignment="Center" Foreground="White"/>
36新增: <TextBlock Text="已被忽略" Foreground="White" VerticalAlignment="Center" Margin="5,0,0,0"/>
37新增: </StackPanel>
38新增: </Border>
39新增: </base:View>
40新增:
41新增: <TextBlock ToolTip="网站名称" Text="{Binding WebSite.Title}" FontSize="18" VerticalAlignment="Center" TextWrapping="WrapWithOverflow"/>
42新增: <TextBlock ToolTip="域名" Text="{Binding WebSite.Domain}" FontSize="12" Foreground="Gray" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="0,0,0,0"/>
43新增: <base:View Condition="not null" Value="{Binding Category}" HorizontalAlignment="Left">
44新增: <select:Select Margin="0,10,0,0" ToolTip="网站分类" SelectedItem="{Binding Category,Mode=TwoWay}" Options="{Binding Categories}" Padding="10,0" Height="30"/>
45新增:
46新增: </base:View>
47新增: </StackPanel>
48新增: </Grid>
49新增: </Border>
50新增:
51新增: <tabbar:Tabbar Margin="0,15,0,5" Data="{Binding TabbarData}" SelectedIndex="{Binding TabbarSelectedIndex,Mode=TwoWay}" Width="180" HorizontalAlignment="Left"/>
52新增:
53新增: <Grid >
54新增: <!--按天-->
55新增: <base:View Condition="0" Value="{Binding TabbarSelectedIndex}">
56新增: <select:DateSelect Date="{Binding ChartDate,Mode=TwoWay}"/>
57新增: </base:View>
58新增:
59新增: <!--按周-->
60新增: <base:View Condition="1" Value="{Binding TabbarSelectedIndex}">
61新增: <StackPanel Orientation="Horizontal" VerticalAlignment="Center">
62新增: <select:Select IsShowIcon="False" SelectedItem="{Binding SelectedWeek,Mode=TwoWay}" Options="{Binding WeekOptions}"/>
63新增: <TextBlock Foreground="{DynamicResource DefaultTextBrush}" Margin="20,0,0,0" FontSize="14" Text="{Binding WeekDateStr}" VerticalAlignment="Center"/>
64新增: </StackPanel>
65新增: </base:View>
66新增: <!--按月-->
67新增: <base:View Condition="2" Value="{Binding TabbarSelectedIndex}">
68新增: <select:DateSelect Date="{Binding MonthDate,Mode=TwoWay}" SelectType="Month"/>
69新增:
70新增: </base:View>
71新增: <!--按年-->
72新增: <base:View Condition="3" Value="{Binding TabbarSelectedIndex}">
73新增: <select:DateSelect Date="{Binding YearDate,Mode=TwoWay}" SelectType="Year"/>
74新增:
75新增: </base:View>
76新增: </Grid>
77新增: <!--统计图表-->
78新增: <WrapPanel Margin="-10">
79新增: <StackPanel Margin="10,10,0,0">
80新增:
81新增: <TextBlock Text="时长统计" Foreground="#5c5c5c" FontSize="14" Margin="0,20,0,0"/>
82新增:
83新增: <Border Margin="0,10,0,0" Width="680" HorizontalAlignment="Left" Background="{DynamicResource SettingPanelBgBrush}" Padding="20" CornerRadius="10">
84新增: <StackPanel>
85新增:
86新增: <charts:Charts IsShowCategory="False" DataMaximum="{Binding DataMaximum}" Height="305" NameIndexStart="{Binding NameIndexStart}" ChartsType="Column" Data="{Binding ChartData}" Margin="0,0,0,0"/>
87新增:
88新增: </StackPanel>
89新增:
90新增: </Border>
91新增: </StackPanel>
92新增:
93新增: <StackPanel Margin="10,10,0,0">
94新增: <TextBlock Text="浏览详情" Foreground="#5c5c5c" FontSize="14" Margin="0,20,0,0"/>
95新增:
96新增: <Border Margin="0,10,0,0" Width="680" HorizontalAlignment="Left" Background="{DynamicResource SettingPanelBgBrush}" Padding="20" CornerRadius="10">
97新增: <StackPanel>
98新增: <TextBlock FontSize="14" >
99新增: <Run Text="{Binding WebPageData,Converter={StaticResource GetCountConverter}}"/><Run Text=" 个网页"/>
100新增: </TextBlock>
101新增: <ListView Margin="0,20,0,0" MaxHeight="800" ItemsSource="{Binding WebPageData}" VirtualizingPanel.IsVirtualizing="True" ScrollViewer.CanContentScroll="True" SelectedItem="{Binding WebPageSelectedItem,Mode=TwoWay}">
102新增: <ListView.ContextMenu>
103新增: <ContextMenu>
104新增: <MenuItem Header="打开网页" Command="{Binding PageCommand}" CommandParameter="Open"/>
105新增: <Separator/>
106新增: <MenuItem Header="复制链接" Command="{Binding PageCommand}" CommandParameter="CopyURL"/>
107新增: <MenuItem Header="复制标题" Command="{Binding PageCommand}" CommandParameter="CopyTitle"/>
108新增: </ContextMenu>
109新增: </ListView.ContextMenu>
110新增: <ListBox.Resources>
111新增: <Style TargetType="{x:Type ListView}">
112新增: <Setter Property="OverridesDefaultStyle" Value="True"/>
113新增:
114新增: <Setter Property="Template">
115新增: <Setter.Value>
116新增: <ControlTemplate TargetType="{x:Type ListView}">
117新增: <ScrollViewer>
118新增: <ItemsPresenter />
119新增: </ScrollViewer>
120新增: </ControlTemplate>
121新增: </Setter.Value>
122新增: </Setter>
123新增: </Style>
124新增: <Style TargetType="{x:Type ListViewItem}">
125新增: <Setter Property="OverridesDefaultStyle" Value="True"/>
126新增: <Setter Property="Template">
127新增: <Setter.Value>
128新增: <ControlTemplate TargetType="{x:Type ListViewItem}">
129新增: <Grid>
130新增: <!--<Border BorderBrush="{Binding ElementName=Border,Path=BorderBrush}" BorderThickness="{Binding ElementName=Border,Path=BorderThickness}" Background="{Binding ElementName=Border,Path=Background}" Margin="{Binding ElementName=Border,Path=Margin}" CornerRadius="{Binding ElementName=Border,Path=CornerRadius}">
131新增: <Border.Effect>
132新增: <DropShadowEffect Color="#f3f3f3" BlurRadius="1" Direction="300" ShadowDepth="4" Opacity="0.15" RenderingBias="Performance" ></DropShadowEffect>
133新增: </Border.Effect>
134新增: </Border>-->
135新增:
136新增: <Border BorderBrush="Transparent" BorderThickness="2" x:Name="Border" Background="Transparent" Margin="0" Padding="0" CornerRadius="20">
137新增: <Border BorderBrush="{DynamicResource SettingPanelSpliteLineBrush}" BorderThickness="0,0,0,.5" Padding="5,10,5,10">
138新增: <ContentPresenter/>
139新增: </Border>
140新增: </Border>
141新增: </Grid>
142新增: <ControlTemplate.Triggers>
143新增: <Trigger Property="IsMouseOver" Value="True">
144新增: <Setter TargetName="Border" Property="Background" Value="{DynamicResource HoverBackgroundBrush}"/>
145新增: <!--<Setter TargetName="Border" Property="BorderBrush" Value="#2b20d9"/>-->
146新增:
147新增: </Trigger>
148新增: </ControlTemplate.Triggers>
149新增: </ControlTemplate>
150新增: </Setter.Value>
151新增: </Setter>
152新增:
153新增: </Style>
154新增: </ListBox.Resources>
155新增: <ListBox.ItemsPanel>
156新增: <ItemsPanelTemplate>
157新增: <VirtualizingStackPanel/>
158新增: </ItemsPanelTemplate>
159新增: </ListBox.ItemsPanel>
160新增: <ListView.ItemTemplate>
161新增: <DataTemplate>
162新增: <Grid>
163新增: <Grid.ColumnDefinitions>
164新增: <ColumnDefinition Width="auto"/>
165新增: <ColumnDefinition Width="*"/>
166新增: </Grid.ColumnDefinitions>
167新增: <base:Img Width="16" Height="16" URL="{Binding Url.IconFile}"/>
168新增: <Grid Margin="10,0,0,0" Grid.Column="1">
169新增: <StackPanel>
170新增: <TextBlock FontSize="14" Foreground="{DynamicResource DefaultTextBrush}" Text="{Binding Url.Title}" TextWrapping="WrapWithOverflow"/>
171新增: <TextBlock Margin="0,2,0,0" Text="{Binding Url.Url}" Foreground="{DynamicResource SubTextBrush}" TextWrapping="WrapWithOverflow"/>
172新增: <StackPanel Orientation="Horizontal" Margin="0,10,0,0" >
173新增: <Border HorizontalAlignment="Left" Padding="10,5" CornerRadius="6" ToolTip="访问时间">
174新增: <Border.Background>
175新增: <SolidColorBrush Color="{DynamicResource HoverBackgroundColor}" Opacity=".5"/>
176新增: </Border.Background>
177新增: <TextBlock Foreground="{DynamicResource SubTextBrush}" Text="{Binding LogTime,Converter={StaticResource DateTimeConverter}}" TextWrapping="WrapWithOverflow"/>
178新增: </Border>
179新增: <Border HorizontalAlignment="Left" Padding="10,5" CornerRadius="6" Margin="5,0,0,0" ToolTip="浏览时长">
180新增: <Border.Background>
181新增: <SolidColorBrush Color="{DynamicResource ThemeColor}" Opacity=".2"/>
182新增: </Border.Background>
183新增: <TextBlock Foreground="{DynamicResource ThemeBrush}" Text="{Binding Duration,Converter={StaticResource TimeConverter}}" TextWrapping="WrapWithOverflow"/>
184新增: </Border>
185新增: </StackPanel>
186新增: </StackPanel>
187新增: </Grid>
188新增: </Grid>
189新增: </DataTemplate>
190新增: </ListView.ItemTemplate>
191新增: </ListView>
192新增: </StackPanel>
193新增: </Border>
194新增: </StackPanel>
195新增: </WrapPanel>
196新增: </StackPanel>
197新增: </Grid>
198新增:</Page>
新增UI/Views/WebSiteDetailPage.xaml.cs+30 −0看文件
@@ -0,0 +1,30 @@
1新增:using System;
2新增:using System.Collections.Generic;
3新增:using System.Linq;
4新增:using System.Text;
5新增:using System.Threading.Tasks;
6新增:using System.Windows;
7新增:using System.Windows.Controls;
8新增:using System.Windows.Data;
9新增:using System.Windows.Documents;
10新增:using System.Windows.Input;
11新增:using System.Windows.Media;
12新增:using System.Windows.Media.Imaging;
13新增:using System.Windows.Navigation;
14新增:using System.Windows.Shapes;
15新增:using UI.ViewModels;
16新增:
17新增:namespace UI.Views
18新增:{
19新增: /// <summary>
20新增: /// WebSiteDetailPage.xaml 的交互逻辑
21新增: /// </summary>
22新增: public partial class WebSiteDetailPage : Page
23新增: {
24新增: public WebSiteDetailPage(WebSiteDetailPageVM vm_)
25新增: {
26新增: InitializeComponent();
27新增: DataContext = vm_;
28新增: }
29新增: }
30新增:}