跳到主要内容

github/tai

公开

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

提交记录
修改.gitignore+2 −1看文件
@@ -360,4 +360,5 @@ MigrationBackup/
360360.ionide/
361361
362362# Fody - auto-generated XML schema
363删除:FodyWeavers.xsd
文件末尾没有换行
363新增:FodyWeavers.xsd
364新增:.vscode/settings.json
修改Core/Servicers/Instances/Data.cs+10 −0看文件
@@ -796,5 +796,15 @@ namespace Core.Servicers.Instances
796796 return result;
797797 }
798798 }
799新增:
800新增: public void Clear(int appID_)
801新增: {
802新增: using (var db = _database.GetReaderContext())
803新增: {
804新增: db.Database.ExecuteSqlCommand("delete from DailyLogModels where AppModelID = " + appID_);
805新增: db.Database.ExecuteSqlCommand("delete from HoursLogModels where AppModelID = " + appID_);
806新增: db.Database.ExecuteSqlCommand("update AppModels set TotalTime = 0 where ID = " + appID_);
807新增: }
808新增: }
799809 }
800810}
修改Core/Servicers/Instances/WebData.cs+9 −0看文件
@@ -782,5 +782,14 @@ namespace Core.Servicers.Instances
782782 return result;
783783 }
784784 }
785新增:
786新增: public void Clear(int siteId_)
787新增: {
788新增: using (var db = _database.GetReaderContext())
789新增: {
790新增: db.Database.ExecuteSqlCommand("delete from WebBrowseLogModels where SiteId = " + siteId_);
791新增: db.Database.ExecuteSqlCommand("update WebSiteModels set Duration = 0 where ID = " + siteId_);
792新增: }
793新增: }
785794 }
786795}
文件末尾没有换行
修改Core/Servicers/Interfaces/IData.cs+5 −2看文件
@@ -125,7 +125,10 @@ namespace Core.Servicers.Interfaces
125125 /// <param name="year"></param>
126126 /// <returns></returns>
127127 double[] GetMonthTotalData(DateTime year);
128删除:
129删除:
128新增: /// <summary>
129新增: /// 清空所有统计数据
130新增: /// </summary>
131新增: /// <param name="appID_">应用ID</param>
132新增: void Clear(int appID_);
130133 }
131134}
修改Core/Servicers/Interfaces/IWebData.cs+5 −0看文件
@@ -156,5 +156,10 @@ namespace Core.Servicers.Interfaces
156156 void Clear(DateTime start_, DateTime end_);
157157
158158 List<WebSiteModel> GetWebSiteLogList(DateTime start_, DateTime end_);
159新增: /// <summary>
160新增: /// 清空所有统计数据
161新增: /// </summary>
162新增: /// <param name="siteId_">站点ID</param>
163新增: void Clear(int siteId_);
159164 }
160165}
修改UI/Models/DetailPageModel.cs+6 −0看文件
@@ -6,6 +6,7 @@ using System.Linq;
66using System.Text;
77using System.Threading.Tasks;
88using System.Windows;
9新增:using System.Windows.Controls;
910using UI.Controls.Charts.Model;
1011using UI.Controls.Select;
1112
@@ -166,5 +167,10 @@ namespace UI.Models
166167 /// 是否已被正则忽略
167168 /// </summary>
168169 public bool IsRegexIgnore { get { return IsRegexIgnore_; } set { IsRegexIgnore_ = value; OnPropertyChanged(); } }
170新增: private ContextMenu AppContextMenu_;
171新增: /// <summary>
172新增: /// 应用右键菜单
173新增: /// </summary>
174新增: public ContextMenu AppContextMenu { get { return AppContextMenu_; } set { AppContextMenu_ = value; OnPropertyChanged(); } }
169175 }
170176}
修改UI/ViewModels/DetailPageVM.cs+125 −6看文件
@@ -1,6 +1,7 @@
11using Core.Librarys;
22using Core.Models;
33using Core.Models.Config;
4新增:using Core.Servicers.Instances;
45using Core.Servicers.Interfaces;
56using System;
67using System.Collections.Generic;
@@ -10,6 +11,7 @@ using System.Text;
1011using System.Text.RegularExpressions;
1112using System.Threading.Tasks;
1213using System.Windows;
14新增:using System.Windows.Controls;
1315using UI.Controls;
1416using UI.Controls.Charts.Model;
1517using UI.Controls.Select;
@@ -26,15 +28,21 @@ namespace UI.ViewModels
2628 private readonly ICategorys categories;
2729 private readonly IAppData appData;
2830 private readonly IInputServicer inputServicer;
31新增: private readonly IUIServicer _uIServicer;
2932
3033 private ConfigModel config;
3134 public Command BlockActionCommand { get; set; }
3235 public Command ClearSelectMonthDataCommand { get; set; }
33删除: public Command InfoMenuActionCommand { get; set; }
3436 public Command RefreshCommand { get; set; }
35删除:
37新增: private MenuItem _setCategoryMenuItem;
3638 public DetailPageVM(
37删除: IData data, MainViewModel main, IAppConfig appConfig, ICategorys categories, IAppData appData, IInputServicer inputServicer)
39新增: IData data,
40新增: MainViewModel main,
41新增: IAppConfig appConfig,
42新增: ICategorys categories,
43新增: IAppData appData,
44新增: IInputServicer inputServicer,
45新增: IUIServicer uIServicer_)
3846 {
3947 this.data = data;
4048 this.main = main;
@@ -42,10 +50,10 @@ namespace UI.ViewModels
4250 this.categories = categories;
4351 this.appData = appData;
4452 this.inputServicer = inputServicer;
53新增: _uIServicer = uIServicer_;
4554
4655 BlockActionCommand = new Command(new Action<object>(OnBlockActionCommand));
4756 ClearSelectMonthDataCommand = new Command(new Action<object>(OnClearSelectMonthDataCommand));
48删除: InfoMenuActionCommand = new Command(new Action<object>(OnInfoMenuActionCommand));
4957 RefreshCommand = new Command(new Action<object>(OnRefreshCommand));
5058
5159 Init();
@@ -110,8 +118,118 @@ namespace UI.ViewModels
110118 break;
111119 }
112120 }
121新增:
122新增: CreateContextMenu();
123新增: }
124新增:
125新增: private void CreateContextMenu()
126新增: {
127新增: AppContextMenu = new System.Windows.Controls.ContextMenu();
128新增: AppContextMenu.Opened += AppContextMenu_Opened;
129新增: MenuItem open = new MenuItem();
130新增: open.Header = "启动应用";
131新增: open.Click += (e, c) =>
132新增: {
133新增: OnInfoMenuActionCommand("open exe");
134新增: };
135新增:
136新增: MenuItem copyProcessName = new MenuItem();
137新增: copyProcessName.Header = "复制应用进程名称";
138新增: copyProcessName.Click += (e, c) =>
139新增: {
140新增: OnInfoMenuActionCommand("copy processname");
141新增: };
142新增:
143新增: MenuItem copyProcessFile = new MenuItem();
144新增: copyProcessFile.Header = "复制应用文件路径";
145新增: copyProcessFile.Click += (e, c) =>
146新增: {
147新增: OnInfoMenuActionCommand("copy process file");
148新增: };
149新增:
150新增: MenuItem openDir = new MenuItem();
151新增: openDir.Header = "打开应用所在目录";
152新增: openDir.Click += (e, c) =>
153新增: {
154新增: OnInfoMenuActionCommand("open dir");
155新增: };
156新增:
157新增: MenuItem reLoadData = new MenuItem();
158新增: reLoadData.Header = "刷新";
159新增: reLoadData.Click += async (e, c) =>
160新增: {
161新增: LoadChartData();
162新增: await LoadData();
163新增: };
164新增:
165新增: MenuItem clear = new MenuItem();
166新增: clear.Header = "清空统计";
167新增: clear.Click += ClearAppData_Click;
168新增:
169新增: _setCategoryMenuItem = new MenuItem();
170新增: _setCategoryMenuItem.Header = "设置分类";
171新增:
172新增:
173新增: AppContextMenu.Items.Add(open);
174新增: AppContextMenu.Items.Add(new Separator());
175新增: AppContextMenu.Items.Add(reLoadData);
176新增: AppContextMenu.Items.Add(new Separator());
177新增: AppContextMenu.Items.Add(_setCategoryMenuItem);
178新增: AppContextMenu.Items.Add(new Separator());
179新增: AppContextMenu.Items.Add(copyProcessName);
180新增: AppContextMenu.Items.Add(copyProcessFile);
181新增: AppContextMenu.Items.Add(openDir);
182新增: AppContextMenu.Items.Add(new Separator());
183新增: AppContextMenu.Items.Add(clear);
113184 }
114185
186新增: private async void ClearAppData_Click(object sender, RoutedEventArgs e)
187新增: {
188新增: bool isConfirm = await _uIServicer.ShowConfirmDialogAsync("清空确认", "是否确定清空此应用的所有统计数据?");
189新增: if (isConfirm)
190新增: {
191新增: data.Clear(App.ID);
192新增: LoadChartData();
193新增: await LoadData();
194新增: main.Toast("操作已执行", Controls.Window.ToastType.Success, Controls.Base.IconTypes.Accept);
195新增: }
196新增: }
197新增:
198新增: private void AppContextMenu_Opened(object sender, RoutedEventArgs e)
199新增: {
200新增: _setCategoryMenuItem.Items.Clear();
201新增:
202新增: foreach (var category in categories.GetCategories())
203新增: {
204新增: var categoryMenu = new MenuItem();
205新增: categoryMenu.Header = category.Name;
206新增: categoryMenu.IsChecked = App.CategoryID == category.ID;
207新增: categoryMenu.Click += (s, ea) =>
208新增: {
209新增: UpdateCategory(category);
210新增: };
211新增: _setCategoryMenuItem.Items.Add(categoryMenu);
212新增: }
213新增: }
214新增:
215新增: /// <summary>
216新增: /// 更新分类
217新增: /// </summary>
218新增: private void UpdateCategory(CategoryModel category_)
219新增: {
220新增: Task.Run(() =>
221新增: {
222新增: var app = appData.GetApp(App.ID);
223新增: app.CategoryID = category_.ID;
224新增: app.Category = category_;
225新增: appData.UpdateApp(app);
226新增:
227新增: if (Category == null || category_.ID != Category.Id)
228新增: {
229新增: Category = Categorys.Where(m => m.Id == category_.ID).FirstOrDefault();
230新增: }
231新增: });
232新增: }
115233
116234 private async void InputServicer_OnKeyUpInput(object sender, System.Windows.Forms.Keys key)
117235 {
@@ -130,9 +248,9 @@ namespace UI.ViewModels
130248 await LoadData();
131249 }
132250
133删除: private void OnInfoMenuActionCommand(object obj)
251新增: private void OnInfoMenuActionCommand(string action_)
134252 {
135删除: switch (obj.ToString())
253新增: switch (action_)
136254 {
137255 case "copy processname":
138256 Clipboard.SetText(App.Name);
@@ -284,6 +402,7 @@ namespace UI.ViewModels
284402 {
285403 var option = new SelectItemModel()
286404 {
405新增: Id = item.ID,
287406 Data = item,
288407 Img = item.IconFile,
289408 Name = item.Name,
修改UI/ViewModels/WebSiteDetailPageVM.cs+20 −2看文件
@@ -11,6 +11,7 @@ using System.Text.RegularExpressions;
1111using System.Threading.Tasks;
1212using System.Windows;
1313using System.Windows.Controls;
14新增:using System.Windows.Forms.Design;
1415using System.Windows.Markup;
1516using UI.Controls;
1617using UI.Controls.Charts.Model;
@@ -27,17 +28,20 @@ namespace UI.ViewModels
2728 private readonly IAppConfig _appConfig;
2829 private readonly IWebFilter _webFilter;
2930 private readonly IInputServicer _input;
31新增: private readonly IUIServicer _uIServicer;
32新增:
3033 public Command PageCommand { get; set; }
3134
3235 private MenuItem _setCategoryMenuItem;
3336 private MenuItem _blockMenuItem;
34删除: public WebSiteDetailPageVM(IWebData webData_, MainViewModel mainVM_, IAppConfig appConfig_, IWebFilter webFilter_, IInputServicer input_)
37新增: public WebSiteDetailPageVM(IWebData webData_, MainViewModel mainVM_, IAppConfig appConfig_, IWebFilter webFilter_, IInputServicer input_, IUIServicer uIServicer_)
3538 {
3639 _webData = webData_;
3740 _mainVM = mainVM_;
3841 _appConfig = appConfig_;
3942 _webFilter = webFilter_;
4043 _input = input_;
44新增: _uIServicer = uIServicer_;
4145
4246 Init();
4347 }
@@ -139,6 +143,10 @@ namespace UI.ViewModels
139143 reLoadData.Header = "刷新";
140144 reLoadData.Click += ReLoadData_Click;
141145
146新增: MenuItem clear = new MenuItem();
147新增: clear.Header = "清空统计";
148新增: clear.Click += ClearData_Click;
149新增:
142150 _setCategoryMenuItem = new MenuItem();
143151 _setCategoryMenuItem.Header = "设置分类";
144152
@@ -146,14 +154,24 @@ namespace UI.ViewModels
146154 _blockMenuItem.Header = "忽略此网站";
147155 _blockMenuItem.Click += _blockMenuItem_Click;
148156 WebSiteContextMenu.Items.Add(open);
149删除: WebSiteContextMenu.Items.Add(new Separator());
150157 WebSiteContextMenu.Items.Add(reLoadData);
151158 WebSiteContextMenu.Items.Add(new Separator());
152159 WebSiteContextMenu.Items.Add(_setCategoryMenuItem);
153160 WebSiteContextMenu.Items.Add(new Separator());
154161 WebSiteContextMenu.Items.Add(_blockMenuItem);
162新增: WebSiteContextMenu.Items.Add(clear);
155163
156164 }
165新增: private async void ClearData_Click(object sender, RoutedEventArgs e)
166新增: {
167新增: bool isConfirm = await _uIServicer.ShowConfirmDialogAsync("清空确认", "是否确定清空此站点的所有统计数据?");
168新增: if (isConfirm)
169新增: {
170新增: _webData.Clear(WebSite.ID);
171新增: Load();
172新增: _mainVM.Success("操作已执行");
173新增: }
174新增: }
157175
158176 private void CopyDomain_Click(object sender, RoutedEventArgs e)
159177 {
修改UI/Views/DetailPage.xaml+3 −15看文件
@@ -21,19 +21,8 @@
2121 <Border
2222 Background="{DynamicResource SettingPanelBgBrush}"
2323 CornerRadius="12"
24删除: Padding="0,20">
25删除: <Border.ContextMenu>
26删除: <ContextMenu>
27删除: <MenuItem Command="{Binding InfoMenuActionCommand}" CommandParameter="open exe" Header="启动应用"/>
28删除: <Separator/>
29删除: <MenuItem Command="{Binding InfoMenuActionCommand}" CommandParameter="copy processname" Header="复制应用进程名称"/>
30删除: <MenuItem Command="{Binding InfoMenuActionCommand}" CommandParameter="copy process file" Header="复制应用文件路径"/>
31删除: <MenuItem Command="{Binding InfoMenuActionCommand}" CommandParameter="open dir" Header="打开应用所在目录"/>
32删除: <!--<Separator/>-->
33删除: <!--<MenuItem Command="{Binding InfoMenuActionCommand}" CommandParameter="geticon" Header="重新获取图标"/>-->
34删除:
35删除: </ContextMenu>
36删除: </Border.ContextMenu>
24新增: Padding="0,20"
25新增: ContextMenu="{Binding AppContextMenu}">
3726 <Grid>
3827 <Grid.ColumnDefinitions>
3928 <ColumnDefinition Width="100"/>
@@ -88,7 +77,6 @@
8877
8978 <base:View Condition="not null" Value="{Binding Category}" HorizontalAlignment="Left">
9079 <Select:Select Margin="0,10,0,0" ToolTip="分类" SelectedItem="{Binding Category,Mode=TwoWay}" Options="{Binding Categorys}" Padding="10,0" Height="30"/>
91删除:
9280 </base:View>
9381
9482
@@ -141,7 +129,7 @@
141129 <WrapPanel Margin="-10">
142130 <StackPanel Margin="10,10,0,0">
143131 <TextBlock Text="时长统计" Foreground="#5c5c5c" FontSize="14" Margin="0,20,0,0"/>
144删除:
132新增:
145133 <Border Margin="0,10,0,0" Width="680" HorizontalAlignment="Left" Background="{DynamicResource SettingPanelBgBrush}" Padding="20" CornerRadius="10">
146134 <StackPanel>
147135 <Tabbar:Tabbar Margin="0,-10,0,0" Data="{Binding TabbarData}" SelectedIndex="{Binding TabbarSelectedIndex,Mode=TwoWay}" Width="180" HorizontalAlignment="Left"/>