提交记录修改.gitignore+2 −1看文件
修改Core/Servicers/Instances/Data.cs+10 −0看文件
修改Core/Servicers/Instances/WebData.cs+9 −0看文件
修改Core/Servicers/Interfaces/IData.cs+5 −2看文件
修改Core/Servicers/Interfaces/IWebData.cs+5 −0看文件
修改UI/Models/DetailPageModel.cs+6 −0看文件
修改UI/ViewModels/DetailPageVM.cs+125 −6看文件
修改UI/ViewModels/WebSiteDetailPageVM.cs+20 −2看文件
修改UI/Views/DetailPage.xaml+3 −15看文件
| @@ -360,4 +360,5 @@ MigrationBackup/ | ||
| 360 | 360 | .ionide/ |
| 361 | 361 | |
| 362 | 362 | # Fody - auto-generated XML schema |
| 363 | 删除:FodyWeavers.xsd | |
| 文件末尾没有换行 | ||
| 363 | 新增:FodyWeavers.xsd | |
| 364 | 新增:.vscode/settings.json | |
| @@ -796,5 +796,15 @@ namespace Core.Servicers.Instances | ||
| 796 | 796 | return result; |
| 797 | 797 | } |
| 798 | 798 | } |
| 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 | 新增: } | |
| 799 | 809 | } |
| 800 | 810 | } |
| @@ -782,5 +782,14 @@ namespace Core.Servicers.Instances | ||
| 782 | 782 | return result; |
| 783 | 783 | } |
| 784 | 784 | } |
| 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 | 新增: } | |
| 785 | 794 | } |
| 786 | 795 | } |
| 文件末尾没有换行 | ||
| @@ -125,7 +125,10 @@ namespace Core.Servicers.Interfaces | ||
| 125 | 125 | /// <param name="year"></param> |
| 126 | 126 | /// <returns></returns> |
| 127 | 127 | double[] GetMonthTotalData(DateTime year); |
| 128 | 删除: | |
| 129 | 删除: | |
| 128 | 新增: /// <summary> | |
| 129 | 新增: /// 清空所有统计数据 | |
| 130 | 新增: /// </summary> | |
| 131 | 新增: /// <param name="appID_">应用ID</param> | |
| 132 | 新增: void Clear(int appID_); | |
| 130 | 133 | } |
| 131 | 134 | } |
| @@ -156,5 +156,10 @@ namespace Core.Servicers.Interfaces | ||
| 156 | 156 | void Clear(DateTime start_, DateTime end_); |
| 157 | 157 | |
| 158 | 158 | List<WebSiteModel> GetWebSiteLogList(DateTime start_, DateTime end_); |
| 159 | 新增: /// <summary> | |
| 160 | 新增: /// 清空所有统计数据 | |
| 161 | 新增: /// </summary> | |
| 162 | 新增: /// <param name="siteId_">站点ID</param> | |
| 163 | 新增: void Clear(int siteId_); | |
| 159 | 164 | } |
| 160 | 165 | } |
| @@ -6,6 +6,7 @@ using System.Linq; | ||
| 6 | 6 | using System.Text; |
| 7 | 7 | using System.Threading.Tasks; |
| 8 | 8 | using System.Windows; |
| 9 | 新增:using System.Windows.Controls; | |
| 9 | 10 | using UI.Controls.Charts.Model; |
| 10 | 11 | using UI.Controls.Select; |
| 11 | 12 | |
| @@ -166,5 +167,10 @@ namespace UI.Models | ||
| 166 | 167 | /// 是否已被正则忽略 |
| 167 | 168 | /// </summary> |
| 168 | 169 | 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(); } } | |
| 169 | 175 | } |
| 170 | 176 | } |
| @@ -1,6 +1,7 @@ | ||
| 1 | 1 | using Core.Librarys; |
| 2 | 2 | using Core.Models; |
| 3 | 3 | using Core.Models.Config; |
| 4 | 新增:using Core.Servicers.Instances; | |
| 4 | 5 | using Core.Servicers.Interfaces; |
| 5 | 6 | using System; |
| 6 | 7 | using System.Collections.Generic; |
| @@ -10,6 +11,7 @@ using System.Text; | ||
| 10 | 11 | using System.Text.RegularExpressions; |
| 11 | 12 | using System.Threading.Tasks; |
| 12 | 13 | using System.Windows; |
| 14 | 新增:using System.Windows.Controls; | |
| 13 | 15 | using UI.Controls; |
| 14 | 16 | using UI.Controls.Charts.Model; |
| 15 | 17 | using UI.Controls.Select; |
| @@ -26,15 +28,21 @@ namespace UI.ViewModels | ||
| 26 | 28 | private readonly ICategorys categories; |
| 27 | 29 | private readonly IAppData appData; |
| 28 | 30 | private readonly IInputServicer inputServicer; |
| 31 | 新增: private readonly IUIServicer _uIServicer; | |
| 29 | 32 | |
| 30 | 33 | private ConfigModel config; |
| 31 | 34 | public Command BlockActionCommand { get; set; } |
| 32 | 35 | public Command ClearSelectMonthDataCommand { get; set; } |
| 33 | 删除: public Command InfoMenuActionCommand { get; set; } | |
| 34 | 36 | public Command RefreshCommand { get; set; } |
| 35 | 删除: | |
| 37 | 新增: private MenuItem _setCategoryMenuItem; | |
| 36 | 38 | 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_) | |
| 38 | 46 | { |
| 39 | 47 | this.data = data; |
| 40 | 48 | this.main = main; |
| @@ -42,10 +50,10 @@ namespace UI.ViewModels | ||
| 42 | 50 | this.categories = categories; |
| 43 | 51 | this.appData = appData; |
| 44 | 52 | this.inputServicer = inputServicer; |
| 53 | 新增: _uIServicer = uIServicer_; | |
| 45 | 54 | |
| 46 | 55 | BlockActionCommand = new Command(new Action<object>(OnBlockActionCommand)); |
| 47 | 56 | ClearSelectMonthDataCommand = new Command(new Action<object>(OnClearSelectMonthDataCommand)); |
| 48 | 删除: InfoMenuActionCommand = new Command(new Action<object>(OnInfoMenuActionCommand)); | |
| 49 | 57 | RefreshCommand = new Command(new Action<object>(OnRefreshCommand)); |
| 50 | 58 | |
| 51 | 59 | Init(); |
| @@ -110,8 +118,118 @@ namespace UI.ViewModels | ||
| 110 | 118 | break; |
| 111 | 119 | } |
| 112 | 120 | } |
| 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); | |
| 113 | 184 | } |
| 114 | 185 | |
| 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 | 新增: } | |
| 115 | 233 | |
| 116 | 234 | private async void InputServicer_OnKeyUpInput(object sender, System.Windows.Forms.Keys key) |
| 117 | 235 | { |
| @@ -130,9 +248,9 @@ namespace UI.ViewModels | ||
| 130 | 248 | await LoadData(); |
| 131 | 249 | } |
| 132 | 250 | |
| 133 | 删除: private void OnInfoMenuActionCommand(object obj) | |
| 251 | 新增: private void OnInfoMenuActionCommand(string action_) | |
| 134 | 252 | { |
| 135 | 删除: switch (obj.ToString()) | |
| 253 | 新增: switch (action_) | |
| 136 | 254 | { |
| 137 | 255 | case "copy processname": |
| 138 | 256 | Clipboard.SetText(App.Name); |
| @@ -284,6 +402,7 @@ namespace UI.ViewModels | ||
| 284 | 402 | { |
| 285 | 403 | var option = new SelectItemModel() |
| 286 | 404 | { |
| 405 | 新增: Id = item.ID, | |
| 287 | 406 | Data = item, |
| 288 | 407 | Img = item.IconFile, |
| 289 | 408 | Name = item.Name, |
| @@ -11,6 +11,7 @@ using System.Text.RegularExpressions; | ||
| 11 | 11 | using System.Threading.Tasks; |
| 12 | 12 | using System.Windows; |
| 13 | 13 | using System.Windows.Controls; |
| 14 | 新增:using System.Windows.Forms.Design; | |
| 14 | 15 | using System.Windows.Markup; |
| 15 | 16 | using UI.Controls; |
| 16 | 17 | using UI.Controls.Charts.Model; |
| @@ -27,17 +28,20 @@ namespace UI.ViewModels | ||
| 27 | 28 | private readonly IAppConfig _appConfig; |
| 28 | 29 | private readonly IWebFilter _webFilter; |
| 29 | 30 | private readonly IInputServicer _input; |
| 31 | 新增: private readonly IUIServicer _uIServicer; | |
| 32 | 新增: | |
| 30 | 33 | public Command PageCommand { get; set; } |
| 31 | 34 | |
| 32 | 35 | private MenuItem _setCategoryMenuItem; |
| 33 | 36 | 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_) | |
| 35 | 38 | { |
| 36 | 39 | _webData = webData_; |
| 37 | 40 | _mainVM = mainVM_; |
| 38 | 41 | _appConfig = appConfig_; |
| 39 | 42 | _webFilter = webFilter_; |
| 40 | 43 | _input = input_; |
| 44 | 新增: _uIServicer = uIServicer_; | |
| 41 | 45 | |
| 42 | 46 | Init(); |
| 43 | 47 | } |
| @@ -139,6 +143,10 @@ namespace UI.ViewModels | ||
| 139 | 143 | reLoadData.Header = "刷新"; |
| 140 | 144 | reLoadData.Click += ReLoadData_Click; |
| 141 | 145 | |
| 146 | 新增: MenuItem clear = new MenuItem(); | |
| 147 | 新增: clear.Header = "清空统计"; | |
| 148 | 新增: clear.Click += ClearData_Click; | |
| 149 | 新增: | |
| 142 | 150 | _setCategoryMenuItem = new MenuItem(); |
| 143 | 151 | _setCategoryMenuItem.Header = "设置分类"; |
| 144 | 152 | |
| @@ -146,14 +154,24 @@ namespace UI.ViewModels | ||
| 146 | 154 | _blockMenuItem.Header = "忽略此网站"; |
| 147 | 155 | _blockMenuItem.Click += _blockMenuItem_Click; |
| 148 | 156 | WebSiteContextMenu.Items.Add(open); |
| 149 | 删除: WebSiteContextMenu.Items.Add(new Separator()); | |
| 150 | 157 | WebSiteContextMenu.Items.Add(reLoadData); |
| 151 | 158 | WebSiteContextMenu.Items.Add(new Separator()); |
| 152 | 159 | WebSiteContextMenu.Items.Add(_setCategoryMenuItem); |
| 153 | 160 | WebSiteContextMenu.Items.Add(new Separator()); |
| 154 | 161 | WebSiteContextMenu.Items.Add(_blockMenuItem); |
| 162 | 新增: WebSiteContextMenu.Items.Add(clear); | |
| 155 | 163 | |
| 156 | 164 | } |
| 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 | 新增: } | |
| 157 | 175 | |
| 158 | 176 | private void CopyDomain_Click(object sender, RoutedEventArgs e) |
| 159 | 177 | { |
| @@ -21,19 +21,8 @@ | ||
| 21 | 21 | <Border |
| 22 | 22 | Background="{DynamicResource SettingPanelBgBrush}" |
| 23 | 23 | 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}"> | |
| 37 | 26 | <Grid> |
| 38 | 27 | <Grid.ColumnDefinitions> |
| 39 | 28 | <ColumnDefinition Width="100"/> |
| @@ -88,7 +77,6 @@ | ||
| 88 | 77 | |
| 89 | 78 | <base:View Condition="not null" Value="{Binding Category}" HorizontalAlignment="Left"> |
| 90 | 79 | <Select:Select Margin="0,10,0,0" ToolTip="分类" SelectedItem="{Binding Category,Mode=TwoWay}" Options="{Binding Categorys}" Padding="10,0" Height="30"/> |
| 91 | 删除: | |
| 92 | 80 | </base:View> |
| 93 | 81 | |
| 94 | 82 | |
| @@ -141,7 +129,7 @@ | ||
| 141 | 129 | <WrapPanel Margin="-10"> |
| 142 | 130 | <StackPanel Margin="10,10,0,0"> |
| 143 | 131 | <TextBlock Text="时长统计" Foreground="#5c5c5c" FontSize="14" Margin="0,20,0,0"/> |
| 144 | 删除: | |
| 132 | 新增: | |
| 145 | 133 | <Border Margin="0,10,0,0" Width="680" HorizontalAlignment="Left" Background="{DynamicResource SettingPanelBgBrush}" Padding="20" CornerRadius="10"> |
| 146 | 134 | <StackPanel> |
| 147 | 135 | <Tabbar:Tabbar Margin="0,-10,0,0" Data="{Binding TabbarData}" SelectedIndex="{Binding TabbarSelectedIndex,Mode=TwoWay}" Width="180" HorizontalAlignment="Left"/> |

