跳到主要内容

github/tai

公开

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

浏览文件

WebSiteDetailPageVM.cs

380 行 · 12.6 KB历史下载
1using Core.Librarys;
2using Core.Models.Db;
3using Core.Servicers.Instances;
4using Core.Servicers.Interfaces;
5using System;
6using System.Collections.Generic;
7using System.Diagnostics;
8using System.Linq;
9using System.Text;
10using System.Text.RegularExpressions;
11using System.Threading.Tasks;
12using System.Windows;
13using System.Windows.Controls;
14using System.Windows.Forms.Design;
15using System.Windows.Markup;
16using UI.Controls;
17using UI.Controls.Charts.Model;
18using UI.Controls.Select;
19using UI.Models;
20using UI.Servicers;
21
22namespace UI.ViewModels
23{
24 public class WebSiteDetailPageVM : WebSiteDetailPageModel
25 {
26 private readonly IWebData _webData;
27 private readonly MainViewModel _mainVM;
28 private readonly IAppConfig _appConfig;
29 private readonly IWebFilter _webFilter;
30 private readonly IInputServicer _input;
31 private readonly IUIServicer _uIServicer;
32
33 public Command PageCommand { get; set; }
34
35 private MenuItem _setCategoryMenuItem;
36 private MenuItem _blockMenuItem;
37 public WebSiteDetailPageVM(IWebData webData_, MainViewModel mainVM_, IAppConfig appConfig_, IWebFilter webFilter_, IInputServicer input_, IUIServicer uIServicer_)
38 {
39 _webData = webData_;
40 _mainVM = mainVM_;
41 _appConfig = appConfig_;
42 _webFilter = webFilter_;
43 _input = input_;
44 _uIServicer = uIServicer_;
45
46 Init();
47 }
48
49 private void OnPageCommand(object obj)
50 {
51 if (WebPageSelectedItem == null)
52 {
53 return;
54 }
55
56 string url = WebPageSelectedItem.Url.Url.IndexOf("://") == -1 ? "http://" + WebPageSelectedItem.Url.Url : WebPageSelectedItem.Url.Url;
57 switch (obj.ToString())
58 {
59 case "Open":
60 Process.Start(url);
61 break;
62 case "CopyURL":
63 Clipboard.SetText(WebPageSelectedItem.Url.Url);
64 break;
65 case "CopyTitle":
66 Clipboard.SetText(WebPageSelectedItem.Url.Title);
67 break;
68 }
69 }
70
71 private void Init()
72 {
73 if (!(_mainVM.Data is WebSiteModel))
74 {
75 _mainVM.Error("参数错误");
76 return;
77 }
78
79 WebSite = _mainVM.Data as WebSiteModel;
80
81 TabbarData = new System.Collections.ObjectModel.ObservableCollection<string>()
82 {
83 "按天","按周","按月","按年"
84 };
85
86 var weekOptions = new List<SelectItemModel>
87 {
88 new SelectItemModel()
89 {
90 Name = "本周"
91 },
92 new SelectItemModel()
93 {
94 Name = "上周"
95 }
96 };
97
98 WeekOptions = weekOptions;
99 SelectedWeek = weekOptions[0];
100 MonthDate = DateTime.Now;
101 TabbarSelectedIndex = 0;
102 YearDate = DateTime.Now;
103 ChartDate = DateTime.Now;
104
105 Load();
106 CreateContextMenu();
107
108 PropertyChanged += WebSiteDetailPageVM_PropertyChanged;
109 _input.OnKeyUpInput += _input_OnKeyUpInput;
110
111 PageCommand = new Command(new Action<object>(OnPageCommand));
112
113 }
114
115 private void _input_OnKeyUpInput(object sender, System.Windows.Forms.Keys key)
116 {
117 if (key == System.Windows.Forms.Keys.F5)
118 {
119 Load();
120 }
121 }
122
123 private void Load()
124 {
125 IsIgnore = _webFilter.IsIgnore(WebSite.Domain);
126 LoadData();
127 LoadCategories();
128 }
129
130 private void CreateContextMenu()
131 {
132 WebSiteContextMenu = new System.Windows.Controls.ContextMenu();
133 WebSiteContextMenu.Opened += WebSiteContextMenu_Opened;
134 MenuItem open = new MenuItem();
135 open.Header = "在浏览器打开网站";
136 open.Click += Open_Click;
137
138 MenuItem copyDomain = new MenuItem();
139 copyDomain.Header = "复制域名";
140 copyDomain.Click += CopyDomain_Click;
141
142 MenuItem reLoadData = new MenuItem();
143 reLoadData.Header = "刷新";
144 reLoadData.Click += ReLoadData_Click;
145
146 MenuItem clear = new MenuItem();
147 clear.Header = "清空统计";
148 clear.Click += ClearData_Click;
149
150 _setCategoryMenuItem = new MenuItem();
151 _setCategoryMenuItem.Header = "设置分类";
152
153 MenuItem editAlias = new MenuItem();
154 editAlias.Header = "编辑别名";
155 editAlias.Click += EditAlias_ClickAsync;
156
157 _blockMenuItem = new MenuItem();
158 _blockMenuItem.Header = "忽略此网站";
159 _blockMenuItem.Click += _blockMenuItem_Click;
160 WebSiteContextMenu.Items.Add(open);
161 WebSiteContextMenu.Items.Add(reLoadData);
162 WebSiteContextMenu.Items.Add(new Separator());
163 WebSiteContextMenu.Items.Add(_setCategoryMenuItem);
164 WebSiteContextMenu.Items.Add(editAlias);
165 WebSiteContextMenu.Items.Add(new Separator());
166 WebSiteContextMenu.Items.Add(_blockMenuItem);
167 WebSiteContextMenu.Items.Add(clear);
168
169 }
170
171 private async void EditAlias_ClickAsync(object sender, RoutedEventArgs e)
172 {
173
174
175 try
176 {
177 string input = await _uIServicer.ShowInputModalAsync("修改别名", "请输入别名", WebSite.Alias, (val) =>
178 {
179 if (val.Length > 15)
180 {
181 _mainVM.Error("别名最大长度为15位字符");
182 return false;
183 }
184 return true;
185 });
186
187 // 开始更新别名
188
189 WebSite.Alias = input;
190 WebSite = _webData.Update(WebSite);
191
192 _mainVM.Success("别名已更新");
193 Debug.WriteLine("输入内容:" + input);
194 }
195 catch
196 {
197 // 输入取消,无需处理异常
198 }
199 }
200
201 private async void ClearData_Click(object sender, RoutedEventArgs e)
202 {
203 bool isConfirm = await _uIServicer.ShowConfirmDialogAsync("清空确认", "是否确定清空此站点的所有统计数据?");
204 if (isConfirm)
205 {
206 _webData.Clear(WebSite.ID);
207 Load();
208 _mainVM.Success("操作已执行");
209 }
210 }
211
212 private void CopyDomain_Click(object sender, RoutedEventArgs e)
213 {
214 Clipboard.SetText(WebSite.Domain);
215 }
216
217 private void Open_Click(object sender, RoutedEventArgs e)
218 {
219 Process.Start("http://" + WebSite.Domain);
220 }
221
222 private void ReLoadData_Click(object sender, RoutedEventArgs e)
223 {
224 Load();
225 }
226
227 private void _blockMenuItem_Click(object sender, RoutedEventArgs e)
228 {
229 var config = _appConfig.GetConfig();
230
231 if (IsIgnore)
232 {
233 // 取消忽略
234 config.Behavior.IgnoreURLList.Remove(WebSite.Domain);
235 }
236 else
237 {
238 // 添加域名忽略
239 config.Behavior.IgnoreURLList.Add(WebSite.Domain);
240 }
241
242 IsIgnore = !IsIgnore;
243
244 _mainVM.Success("操作成功");
245 }
246
247 private void WebSiteContextMenu_Opened(object sender, RoutedEventArgs e)
248 {
249 _setCategoryMenuItem.Items.Clear();
250 foreach (var category in Categories)
251 {
252 var categoryMenu = new MenuItem();
253 categoryMenu.Header = category.Name;
254 categoryMenu.IsChecked = WebSite.CategoryID == category.Id;
255 categoryMenu.Click += (s, ea) =>
256 {
257 UpdateCategory(category.Id);
258 };
259 _setCategoryMenuItem.Items.Add(categoryMenu);
260 }
261
262 _blockMenuItem.Header = IsIgnore ? "取消忽略此网站" : "忽略此网站";
263
264 _blockMenuItem.IsEnabled = !_webFilter.IsRegexIgnore(WebSite.Domain);
265 }
266
267
268 private void WebSiteDetailPageVM_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
269 {
270 string[] updateNames = { nameof(TabbarSelectedIndex), nameof(ChartDate), nameof(SelectedWeek), nameof(MonthDate), nameof(YearDate) };
271 if (updateNames.Contains(e.PropertyName))
272 {
273 LoadData();
274 }
275 if (e.PropertyName == nameof(Category) && Category != null)
276 {
277 UpdateCategory(Category.Id);
278 }
279 }
280
281 /// <summary>
282 /// 加载浏览数据
283 /// </summary>
284 private void LoadData()
285 {
286 Task.Run(() =>
287 {
288 var startDate = DateTime.Now;
289 var endDate = DateTime.Now;
290 string[] colNames = { };
291 NameIndexStart = 0;
292 if (TabbarSelectedIndex == 0)
293 {
294 // 按天
295 startDate = endDate = ChartDate;
296 }
297 else if (TabbarSelectedIndex == 1)
298 {
299 // 按周
300 var weekDateArr = SelectedWeek.Name == "本周" ? Time.GetThisWeekDate() : Time.GetLastWeekDate();
301 WeekDateStr = weekDateArr[0].ToString("yyyy年MM月dd日") + " 到 " + weekDateArr[1].ToString("yyyy年MM月dd日");
302 startDate = weekDateArr[0];
303 endDate = weekDateArr[1];
304 colNames = new string[] { "周一", "周二", "周三", "周四", "周五", "周六", "周日", };
305 }
306 else if (TabbarSelectedIndex == 2)
307 {
308 // 按月
309 var dateArr = Time.GetMonthDate(MonthDate);
310 startDate = dateArr[0];
311 endDate = dateArr[1];
312 NameIndexStart = 1;
313 }
314 else if (TabbarSelectedIndex == 3)
315 {
316 // 按年
317 startDate = new DateTime(YearDate.Year, 1, 1);
318 endDate = new DateTime(YearDate.Year, 12, DateTime.DaysInMonth(YearDate.Year, 12), 23, 59, 59);
319
320 colNames = new string[12];
321 for (int i = 0; i < 12; i++)
322 {
323 colNames[i] = (i + 1) + "月";
324 }
325 }
326 // 柱形图数据
327 var list = _webData.GetBrowseDataStatistics(startDate, endDate, WebSite.ID);
328 var chartData = new List<ChartsDataModel>
329 {
330 new ChartsDataModel()
331 {
332 Name =!string.IsNullOrEmpty(WebSite.Alias) ? WebSite.Alias :WebSite.Title,
333 Values = list.Select(m=>m.Value).ToArray(),
334 ColumnNames= colNames,
335 Color=StateData.ThemeColor
336 }
337 };
338 ChartData = chartData;
339
340 // 详细访问数据
341 WebPageData = _webData.GetBrowseLogList(startDate, endDate, WebSite.ID).OrderByDescending(m => m.ID).ToList();
342 });
343 }
344 /// <summary>
345 /// 加载所有分类
346 /// </summary>
347 private void LoadCategories()
348 {
349 var data = _webData.GetWebSiteCategories();
350 var list = new List<SelectItemModel>();
351 foreach (var category in data)
352 {
353 var item = new SelectItemModel();
354 item.Name = category.Name;
355 item.Img = category.IconFile;
356 item.Id = category.ID;
357 list.Add(item);
358 }
359
360 Categories = list;
361 Category = Categories.Where(m => m.Id == WebSite.CategoryID).FirstOrDefault();
362 }
363
364 /// <summary>
365 /// 更新分类
366 /// </summary>
367 private void UpdateCategory(int categoryId_)
368 {
369 Task.Run(() =>
370 {
371 _webData.UpdateWebSitesCategory(new int[] { WebSite.ID }, categoryId_);
372 WebSite.CategoryID = categoryId_;
373 if (Category == null || categoryId_ != Category.Id)
374 {
375 Category = Categories.Where(m => m.Id == WebSite.CategoryID).FirstOrDefault();
376 }
377 });
378 }
379 }
380}