提交记录修改Core/Core.csproj+37 −1看文件
新增Core/Enums/BrowserType.cs+27 −0看文件
新增Core/Enums/WebPageInfoType.cs+23 −0看文件
新增Core/Event/BrowserObserverEventHandler.cs+12 −0看文件
新增Core/Librarys/Browser/Favicon/ChromeFaviconManager.cs+118 −0看文件
新增Core/Librarys/Browser/Favicon/IFaviconManager.cs+24 −0看文件
新增Core/Librarys/Browser/UrlHelper.cs+134 −0看文件
修改Core/Librarys/SQLite/TaiDbContext.cs+19 −0看文件
新增Core/Librarys/SiteCache.cs+42 −0看文件
修改Core/Models/Config/BehaviorModel.cs+6 −0看文件
修改Core/Models/Config/ConfigAttribute.cs+2 −0看文件
修改Core/Models/Config/GeneralModel.cs+7 −1看文件
新增Core/Models/Data/CommonDataModel.cs+15 −0看文件
新增Core/Models/Db/WebBrowseLogModel.cs+36 −0看文件
新增Core/Models/Db/WebSiteCategoryModel.cs+33 −0看文件
新增Core/Models/Db/WebSiteModel.cs+44 −0看文件
新增Core/Models/Db/WebUrlModel.cs+21 −0看文件
新增Core/Models/WebPage/Site.cs+33 −0看文件
修改Core/Properties/AssemblyInfo.cs+2 −2看文件
修改Core/Servicers/Instances/AppData.cs+10 −5看文件
新增Core/Servicers/Instances/BrowserObserver.cs+311 −0看文件
新增Core/Servicers/Instances/ChromeBrowserWatch.cs+220 −0看文件
修改Core/Servicers/Instances/Data.cs+75 −42看文件
新增Core/Servicers/Instances/Database.cs+75 −0看文件
新增Core/Servicers/Instances/MSEdgeBrowserWatch.cs+243 −0看文件
修改Core/Servicers/Instances/Main.cs+44 −6看文件
新增Core/Servicers/Instances/WebData.cs+786 −0看文件
新增Core/Servicers/Instances/WebFilter.cs+86 −0看文件
新增Core/Servicers/Interfaces/IBrowserObserver.cs+29 −0看文件
新增Core/Servicers/Interfaces/IBrowserWatcher.cs+16 −0看文件
修改Core/Servicers/Interfaces/IData.cs+1 −1看文件
新增Core/Servicers/Interfaces/IDatabase.cs+17 −0看文件
新增Core/Servicers/Interfaces/IWebData.cs+160 −0看文件
新增Core/Servicers/Interfaces/IWebFilter.cs+38 −0看文件
修改UI/App.xaml.cs+12 −2看文件
修改UI/Base/Color/Colors.cs+3 −2看文件
新增UI/Controls/Base/DiffValue.cs+110 −0看文件
修改UI/Controls/Base/Img.cs+9 −7看文件
修改UI/Controls/Base/View.cs+3 −2看文件
新增UI/Controls/Converters/DateTimeConverter.cs+41 −0看文件
新增UI/Controls/Converters/GetCountConverter.cs+28 −0看文件
新增UI/Controls/Converters/TimeConverter.cs+26 −0看文件
修改UI/Controls/SettingPanel/SettingPanel.cs+4 −9看文件
修改UI/Controls/SettingPanel/SettingPanelItem.cs+14 −0看文件
修改UI/Models/CategoryPageModel.cs+16 −3看文件
新增UI/Models/CategoryWebSiteListPageModel.cs+50 −0看文件
修改UI/Models/ChartPageModel.cs+87 −2看文件
修改UI/Models/IndexPageModel.cs+39 −0看文件
修改UI/Models/ModelBase.cs+28 −0看文件
新增UI/Models/WebSiteDetailPageModel.cs+92 −0看文件
修改UI/Resources/Themes/Dark.xaml+11 −0看文件
修改UI/Resources/Themes/Light.xaml+12 −0看文件
修改UI/Servicers/AppContextMenuServicer.cs+0 −2看文件
新增UI/Servicers/IWebSiteContextMenuServicer.cs+15 −0看文件
修改UI/Servicers/MainServicer.cs+4 −1看文件
新增UI/Servicers/WebSiteContextMenuServicer.cs+216 −0看文件
修改UI/Themes/SettingPanel/SettingPanelItem.xaml+9 −1看文件
修改UI/UI.csproj+27 −2看文件
修改UI/ViewModels/CategoryPageVM.cs+263 −59看文件
新增UI/ViewModels/CategoryWebSiteListPageVM.cs+189 −0看文件
修改UI/ViewModels/ChartPageVM.cs+245 −17看文件
修改UI/ViewModels/DataPageVM.cs+86 −30看文件
修改UI/ViewModels/IndexPageVM.cs+97 −7看文件
修改UI/ViewModels/MainViewModel.cs+25 −0看文件
修改UI/ViewModels/SettingPageVM.cs+4 −1看文件
新增UI/ViewModels/WebSiteDetailPageVM.cs+325 −0看文件
修改UI/Views/CategoryAppListPage.xaml+1 −1看文件
修改UI/Views/CategoryPage.xaml+286 −122看文件
修改UI/Views/CategoryPage.xaml.cs+2 −1看文件
新增UI/Views/CategoryWebSiteListPage.xaml+199 −0看文件
新增UI/Views/CategoryWebSiteListPage.xaml.cs+31 −0看文件
修改UI/Views/ChartPage.xaml+459 −194看文件
修改UI/Views/DataPage.xaml+12 −8看文件
修改UI/Views/DataPage.xaml.cs+2 −1看文件
修改UI/Views/DetailPage.xaml+3 −3看文件
修改UI/Views/IndexPage.xaml+95 −5看文件
新增UI/Views/WebSiteDetailPage.xaml+198 −0看文件
新增UI/Views/WebSiteDetailPage.xaml.cs+30 −0看文件
| @@ -129,6 +129,7 @@ | ||
| 129 | 129 | <Private>True</Private> |
| 130 | 130 | <Private>True</Private> |
| 131 | 131 | </Reference> |
| 132 | 新增: <Reference Include="System.Web" /> | |
| 132 | 133 | <Reference Include="System.Windows.Forms" /> |
| 133 | 134 | <Reference Include="System.Xml.Linq" /> |
| 134 | 135 | <Reference Include="System.Data.DataSetExtensions" /> |
| @@ -140,9 +141,15 @@ | ||
| 140 | 141 | </ItemGroup> |
| 141 | 142 | <ItemGroup> |
| 142 | 143 | <Compile Include="AppState.cs" /> |
| 144 | 新增: <Compile Include="Enums\BrowserType.cs" /> | |
| 143 | 145 | <Compile Include="Enums\SleepStatus.cs" /> |
| 146 | 新增: <Compile Include="Enums\WebPageInfoType.cs" /> | |
| 144 | 147 | <Compile Include="Event\EventHandler.cs" /> |
| 148 | 新增: <Compile Include="Event\BrowserObserverEventHandler.cs" /> | |
| 145 | 149 | <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" /> | |
| 146 | 153 | <Compile Include="Librarys\ProcessHelper.cs" /> |
| 147 | 154 | <Compile Include="Librarys\RegexHelper.cs" /> |
| 148 | 155 | <Compile Include="Librarys\Shortcut.cs" /> |
| @@ -154,39 +161,68 @@ | ||
| 154 | 161 | <Compile Include="Librarys\Time.cs" /> |
| 155 | 162 | <Compile Include="Librarys\Win32API.cs" /> |
| 156 | 163 | <Compile Include="Models\AppModel.cs" /> |
| 164 | 新增: <Compile Include="Models\AppObserver\AppObserverEventArgs.cs" /> | |
| 157 | 165 | <Compile Include="Models\CategoryModel.cs" /> |
| 158 | 166 | <Compile Include="Models\Config\ConfigAttribute.cs" /> |
| 159 | 167 | <Compile Include="Models\Config\ConfigModel.cs" /> |
| 160 | 168 | <Compile Include="Models\Config\BehaviorModel.cs" /> |
| 161 | 169 | <Compile Include="Models\Config\GeneralModel.cs" /> |
| 162 | 170 | <Compile Include="Models\Config\Link\LinkModel.cs" /> |
| 171 | 新增: <Compile Include="Models\Data\CommonDataModel.cs" /> | |
| 163 | 172 | <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" /> | |
| 164 | 177 | <Compile Include="Models\HoursLogModel.cs" /> |
| 165 | 178 | <Compile Include="Models\DailyLogModel.cs" /> |
| 179 | 新增: <Compile Include="Models\WebPage\Site.cs" /> | |
| 166 | 180 | <Compile Include="Properties\AssemblyInfo.cs" /> |
| 167 | 181 | <Compile Include="Servicers\Instances\AppConfig.cs" /> |
| 168 | 182 | <Compile Include="Servicers\Instances\AppData.cs" /> |
| 183 | 新增: <Compile Include="Servicers\Instances\BrowserObserver.cs" /> | |
| 169 | 184 | <Compile Include="Servicers\Instances\Categorys.cs" /> |
| 185 | 新增: <Compile Include="Servicers\Instances\MSEdgeBrowserWatch.cs" /> | |
| 186 | 新增: <Compile Include="Servicers\Instances\ChromeBrowserWatch.cs" /> | |
| 170 | 187 | <Compile Include="Servicers\Instances\Data.cs" /> |
| 171 | 188 | <Compile Include="Librarys\Logger.cs" /> |
| 189 | 新增: <Compile Include="Servicers\Instances\Database.cs" /> | |
| 172 | 190 | <Compile Include="Servicers\Instances\DateTimeObserver.cs" /> |
| 173 | 191 | <Compile Include="Servicers\Instances\Main.cs" /> |
| 174 | 192 | <Compile Include="Servicers\Instances\AppObserver.cs" /> |
| 193 | 新增: <Compile Include="Librarys\SiteCache.cs" /> | |
| 175 | 194 | <Compile Include="Servicers\Instances\Sleepdiscover.cs" /> |
| 195 | 新增: <Compile Include="Servicers\Instances\WebData.cs" /> | |
| 196 | 新增: <Compile Include="Servicers\Instances\WebFilter.cs" /> | |
| 176 | 197 | <Compile Include="Servicers\Interfaces\IAppConfig.cs" /> |
| 198 | 新增: <Compile Include="Servicers\Interfaces\IBrowserWatcher.cs" /> | |
| 199 | 新增: <Compile Include="Servicers\Interfaces\IBrowserObserver.cs" /> | |
| 177 | 200 | <Compile Include="Servicers\Interfaces\ICategorys.cs" /> |
| 178 | 201 | <Compile Include="Servicers\Interfaces\IAppData.cs" /> |
| 179 | 202 | <Compile Include="Servicers\Interfaces\IData.cs" /> |
| 203 | 新增: <Compile Include="Servicers\Interfaces\IDatabase.cs" /> | |
| 180 | 204 | <Compile Include="Servicers\Interfaces\IDateTimeObserver.cs" /> |
| 181 | 205 | <Compile Include="Servicers\Interfaces\IMain.cs" /> |
| 182 | 206 | <Compile Include="Servicers\Interfaces\IAppObserver.cs" /> |
| 183 | 207 | <Compile Include="Servicers\Interfaces\ISleepdiscover.cs" /> |
| 208 | 新增: <Compile Include="Servicers\Interfaces\IWebData.cs" /> | |
| 209 | 新增: <Compile Include="Servicers\Interfaces\IWebFilter.cs" /> | |
| 184 | 210 | </ItemGroup> |
| 185 | 211 | <ItemGroup> |
| 186 | 212 | <None Include="App.config" /> |
| 187 | 213 | <None Include="packages.config" /> |
| 188 | 214 | </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> | |
| 190 | 226 | <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> |
| 191 | 227 | <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> |
| 192 | 228 | <PropertyGroup> |
| @@ -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 | 新增:} | |
| @@ -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 | 新增:} | |
| @@ -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 | 新增:} | |
| @@ -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 | 新增:} | |
| @@ -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 | 新增:} | |
| @@ -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 | 新增:} | |
| @@ -1,4 +1,5 @@ | ||
| 1 | 1 | using Core.Models; |
| 2 | 新增:using Core.Models.Db; | |
| 2 | 3 | using System; |
| 3 | 4 | using System.Collections.Generic; |
| 4 | 5 | using System.Data.Entity; |
| @@ -25,6 +26,24 @@ namespace Core.Librarys.SQLite | ||
| 25 | 26 | /// 分类 |
| 26 | 27 | /// </summary> |
| 27 | 28 | 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 | 新增: | |
| 28 | 47 | // public StatisticContext(string n) |
| 29 | 48 | //: base("StatisticContext") |
| 30 | 49 | // { |
| @@ -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 | 新增:} | |
| @@ -16,5 +16,11 @@ namespace Core.Models.Config | ||
| 16 | 16 | /// 忽略的进程列表 |
| 17 | 17 | /// </summary> |
| 18 | 18 | 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>(); | |
| 19 | 25 | } |
| 20 | 26 | } |
| @@ -25,6 +25,7 @@ namespace Core.Models.Config | ||
| 25 | 25 | public bool IsCanRepeat; |
| 26 | 26 | public bool IsCanImportExport; |
| 27 | 27 | public string Options; |
| 28 | 新增: public bool IsBeta; | |
| 28 | 29 | public ConfigAttribute() |
| 29 | 30 | { |
| 30 | 31 | ToggleTrueText = "开"; |
| @@ -34,6 +35,7 @@ namespace Core.Models.Config | ||
| 34 | 35 | IsName = false; |
| 35 | 36 | IsCanImportExport = false; |
| 36 | 37 | Options = string.Empty; |
| 38 | 新增: IsBeta = false; | |
| 37 | 39 | } |
| 38 | 40 | |
| 39 | 41 | |
| @@ -56,5 +56,11 @@ namespace Core.Models.Config | ||
| 56 | 56 | /// </summary> |
| 57 | 57 | [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 = "概览页")] |
| 58 | 58 | 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; | |
| 59 | 65 | } |
| 60 | 删除:} | |
| 66 | 新增:} | |
| 文件末尾没有换行 | ||
| @@ -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 | 新增:} | |
| @@ -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 | 新增:} | |
| @@ -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 | 新增:} | |
| @@ -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 | 新增:} | |
| @@ -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 | 新增:} | |
| @@ -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 | 新增:} | |
| @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; | ||
| 32 | 32 | //可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 |
| 33 | 33 | //通过使用 "*",如下所示: |
| 34 | 34 | // [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")] | |
| @@ -13,10 +13,13 @@ namespace Core.Servicers.Instances | ||
| 13 | 13 | { |
| 14 | 14 | public class AppData : IAppData |
| 15 | 15 | { |
| 16 | 删除: | |
| 17 | 16 | private List<AppModel> _apps; |
| 18 | 17 | |
| 19 | 删除: | |
| 18 | 新增: private readonly IDatabase _databse; | |
| 19 | 新增: public AppData(IDatabase databse) | |
| 20 | 新增: { | |
| 21 | 新增: _databse = databse; | |
| 22 | 新增: } | |
| 20 | 23 | public List<AppModel> GetAllApps() |
| 21 | 24 | { |
| 22 | 25 | return _apps; |
| @@ -25,7 +28,7 @@ namespace Core.Servicers.Instances | ||
| 25 | 28 | public void Load() |
| 26 | 29 | { |
| 27 | 30 | Debug.WriteLine("加载app开始"); |
| 28 | 删除: using (var db = new TaiDbContext()) | |
| 31 | 新增: using (var db = _databse.GetReaderContext()) | |
| 29 | 32 | { |
| 30 | 33 | _apps = ( |
| 31 | 34 | from app in db.App |
| @@ -55,10 +58,11 @@ namespace Core.Servicers.Instances | ||
| 55 | 58 | /// <param name="app"></param> |
| 56 | 59 | public void UpdateApp(AppModel app) |
| 57 | 60 | { |
| 58 | 删除: using (var db = new TaiDbContext()) | |
| 61 | 新增: using (var db = _databse.GetWriterContext()) | |
| 59 | 62 | { |
| 60 | 63 | db.Entry(app).State = System.Data.Entity.EntityState.Modified; |
| 61 | 64 | db.SaveChanges(); |
| 65 | 新增: _databse.CloseWriter(); | |
| 62 | 66 | } |
| 63 | 67 | } |
| 64 | 68 | public AppModel GetApp(string name) |
| @@ -76,7 +80,7 @@ namespace Core.Servicers.Instances | ||
| 76 | 80 | return; |
| 77 | 81 | } |
| 78 | 82 | |
| 79 | 删除: using (var db = new TaiDbContext()) | |
| 83 | 新增: using (var db = _databse.GetWriterContext()) | |
| 80 | 84 | { |
| 81 | 85 | db.App.Add(app); |
| 82 | 86 | int res = db.SaveChanges(); |
| @@ -84,6 +88,7 @@ namespace Core.Servicers.Instances | ||
| 84 | 88 | { |
| 85 | 89 | _apps.Add(app); |
| 86 | 90 | } |
| 91 | 新增: _databse.CloseWriter(); | |
| 87 | 92 | } |
| 88 | 93 | } |
| 89 | 94 | |
| @@ -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 | 新增:} | |
| @@ -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 | 新增:} | |
| @@ -18,11 +18,13 @@ namespace Core.Servicers.Instances | ||
| 18 | 18 | { |
| 19 | 19 | public class Data : IData |
| 20 | 20 | { |
| 21 | 删除: private readonly IAppData appData; | |
| 21 | 新增: private readonly IAppData _appData; | |
| 22 | 新增: private readonly IDatabase _database; | |
| 22 | 23 | private readonly object setLock = new object(); |
| 23 | 删除: public Data(IAppData appData) | |
| 24 | 新增: public Data(IAppData appData_, IDatabase database_) | |
| 24 | 25 | { |
| 25 | 删除: this.appData = appData; | |
| 26 | 新增: _appData = appData_; | |
| 27 | 新增: _database = database_; | |
| 26 | 28 | } |
| 27 | 29 | public void Set(string processName, int seconds, DateTime? time_ = null) |
| 28 | 30 | { |
| @@ -36,7 +38,7 @@ namespace Core.Servicers.Instances | ||
| 36 | 38 | return; |
| 37 | 39 | } |
| 38 | 40 | |
| 39 | 删除: AppModel app = appData.GetApp(processName); | |
| 41 | 新增: AppModel app = _appData.GetApp(processName); | |
| 40 | 42 | |
| 41 | 43 | if (app == null) |
| 42 | 44 | { |
| @@ -44,9 +46,11 @@ namespace Core.Servicers.Instances | ||
| 44 | 46 | } |
| 45 | 47 | // 统计app累计使用时长 |
| 46 | 48 | app.TotalTime += seconds; |
| 47 | 删除: appData.UpdateApp(app); | |
| 49 | 新增: _appData.UpdateApp(app); | |
| 48 | 50 | |
| 49 | 删除: using (var db = new TaiDbContext()) | |
| 51 | 新增: | |
| 52 | 新增: //using (var db = _database.GetReaderContext()) | |
| 53 | 新增: using (var db = _database.GetWriterContext()) | |
| 50 | 54 | { |
| 51 | 55 | using (var transcation = db.Database.BeginTransaction()) |
| 52 | 56 | { |
| @@ -76,6 +80,10 @@ namespace Core.Servicers.Instances | ||
| 76 | 80 | Logger.Error(e.ToString()); |
| 77 | 81 | transcation.Rollback(); |
| 78 | 82 | } |
| 83 | 新增: finally | |
| 84 | 新增: { | |
| 85 | 新增: _database.CloseWriter(); | |
| 86 | 新增: } | |
| 79 | 87 | } |
| 80 | 88 | } |
| 81 | 89 | |
| @@ -102,8 +110,8 @@ namespace Core.Servicers.Instances | ||
| 102 | 110 | } |
| 103 | 111 | |
| 104 | 112 | |
| 105 | 删除: | |
| 106 | 删除: using (var db = new TaiDbContext()) | |
| 113 | 新增: //using (var db = _database.GetReaderContext()) | |
| 114 | 新增: using (var db = _database.GetWriterContext()) | |
| 107 | 115 | { |
| 108 | 116 | using (var transcation = db.Database.BeginTransaction()) |
| 109 | 117 | { |
| @@ -160,7 +168,12 @@ namespace Core.Servicers.Instances | ||
| 160 | 168 | Logger.Error(e.ToString()); |
| 161 | 169 | transcation.Rollback(); |
| 162 | 170 | } |
| 171 | 新增: finally | |
| 172 | 新增: { | |
| 173 | 新增: _database.CloseWriter(); | |
| 174 | 新增: } | |
| 163 | 175 | } |
| 176 | 新增: //_database.Close(); | |
| 164 | 177 | } |
| 165 | 178 | } |
| 166 | 179 | public List<DailyLogModel> GetTodaylogList() |
| @@ -168,7 +181,7 @@ namespace Core.Servicers.Instances | ||
| 168 | 181 | |
| 169 | 182 | //return null; |
| 170 | 183 | |
| 171 | 删除: using (var db = new TaiDbContext()) | |
| 184 | 新增: using (var db = _database.GetReaderContext()) | |
| 172 | 185 | { |
| 173 | 186 | var today = DateTime.Now.Date; |
| 174 | 187 | var res = db.DailyLog.Where(m => m.Date == today && m.AppModelID != 0); |
| @@ -176,14 +189,14 @@ namespace Core.Servicers.Instances | ||
| 176 | 189 | } |
| 177 | 190 | } |
| 178 | 191 | |
| 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) | |
| 180 | 193 | { |
| 181 | 194 | |
| 182 | 删除: IEnumerable<AppModel> apps = appData.GetAllApps(); | |
| 195 | 新增: IEnumerable<AppModel> apps = _appData.GetAllApps(); | |
| 183 | 196 | |
| 184 | 删除: using (var db = new TaiDbContext()) | |
| 197 | 新增: using (var db = _database.GetReaderContext()) | |
| 185 | 198 | { |
| 186 | 删除: var data = take == -1 ? db.DailyLog | |
| 199 | 新增: var data = db.DailyLog | |
| 187 | 200 | .Where(m => m.Date >= start && m.Date <= end && m.AppModelID != 0) |
| 188 | 201 | .GroupBy(m => m.AppModelID) |
| 189 | 202 | .Select(m => new |
| @@ -191,17 +204,37 @@ namespace Core.Servicers.Instances | ||
| 191 | 204 | Time = m.Sum(a => a.Time), |
| 192 | 205 | Date = m.FirstOrDefault().Date, |
| 193 | 206 | 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) | |
| 198 | 209 | { |
| 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); | |
| 205 | 238 | |
| 206 | 239 | var res = data |
| 207 | 240 | .ToList() |
| @@ -214,7 +247,7 @@ namespace Core.Servicers.Instances | ||
| 214 | 247 | |
| 215 | 248 | foreach (var log in res) |
| 216 | 249 | { |
| 217 | 删除: log.AppModel = appData.GetApp(log.AppModelID); | |
| 250 | 新增: log.AppModel = _appData.GetApp(log.AppModelID); | |
| 218 | 251 | } |
| 219 | 252 | |
| 220 | 253 | return res; |
| @@ -268,7 +301,7 @@ namespace Core.Servicers.Instances | ||
| 268 | 301 | //{ |
| 269 | 302 | // return new List<DailyLogModel>(); |
| 270 | 303 | //} |
| 271 | 删除: using (var db = new TaiDbContext()) | |
| 304 | 新增: using (var db = _database.GetReaderContext()) | |
| 272 | 305 | { |
| 273 | 306 | |
| 274 | 307 | var res = db.DailyLog.Include(m => m.AppModel).Where( |
| @@ -289,7 +322,7 @@ namespace Core.Servicers.Instances | ||
| 289 | 322 | public void Clear(int appID, DateTime month) |
| 290 | 323 | { |
| 291 | 324 | |
| 292 | 删除: using (var db = new TaiDbContext()) | |
| 325 | 新增: using (var db = _database.GetReaderContext()) | |
| 293 | 326 | { |
| 294 | 327 | |
| 295 | 328 | db.DailyLog.RemoveRange( |
| @@ -311,7 +344,7 @@ namespace Core.Servicers.Instances | ||
| 311 | 344 | { |
| 312 | 345 | |
| 313 | 346 | |
| 314 | 删除: using (var db = new TaiDbContext()) | |
| 347 | 新增: using (var db = _database.GetReaderContext()) | |
| 315 | 348 | { |
| 316 | 349 | |
| 317 | 350 | |
| @@ -338,7 +371,7 @@ namespace Core.Servicers.Instances | ||
| 338 | 371 | |
| 339 | 372 | public List<ColumnDataModel> GetCategoryHoursData(DateTime date) |
| 340 | 373 | { |
| 341 | 删除: using (var db = new TaiDbContext()) | |
| 374 | 新增: using (var db = _database.GetReaderContext()) | |
| 342 | 375 | { |
| 343 | 376 | // 查出有数据的分类 |
| 344 | 377 | |
| @@ -380,7 +413,7 @@ namespace Core.Servicers.Instances | ||
| 380 | 413 | |
| 381 | 414 | public List<ColumnDataModel> GetCategoryRangeData(DateTime start, DateTime end) |
| 382 | 415 | { |
| 383 | 删除: using (var db = new TaiDbContext()) | |
| 416 | 新增: using (var db = _database.GetReaderContext()) | |
| 384 | 417 | { |
| 385 | 418 | // 查出有数据的分类 |
| 386 | 419 | |
| @@ -431,7 +464,7 @@ namespace Core.Servicers.Instances | ||
| 431 | 464 | |
| 432 | 465 | public List<ColumnDataModel> GetCategoryYearData(DateTime date) |
| 433 | 466 | { |
| 434 | 删除: using (var db = new TaiDbContext()) | |
| 467 | 新增: using (var db = _database.GetReaderContext()) | |
| 435 | 468 | { |
| 436 | 469 | // 查出有数据的分类 |
| 437 | 470 | |
| @@ -493,7 +526,7 @@ namespace Core.Servicers.Instances | ||
| 493 | 526 | |
| 494 | 527 | public List<ColumnDataModel> GetAppDayData(int appID, DateTime date) |
| 495 | 528 | { |
| 496 | 删除: using (var db = new TaiDbContext()) | |
| 529 | 新增: using (var db = _database.GetReaderContext()) | |
| 497 | 530 | { |
| 498 | 531 | |
| 499 | 532 | 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 | ||
| 527 | 560 | |
| 528 | 561 | public List<ColumnDataModel> GetAppRangeData(int appID, DateTime start, DateTime end) |
| 529 | 562 | { |
| 530 | 删除: using (var db = new TaiDbContext()) | |
| 563 | 新增: using (var db = _database.GetReaderContext()) | |
| 531 | 564 | { |
| 532 | 565 | // 查出有数据的分类 |
| 533 | 566 | |
| @@ -566,7 +599,7 @@ namespace Core.Servicers.Instances | ||
| 566 | 599 | |
| 567 | 600 | public List<ColumnDataModel> GetAppYearData(int appID, DateTime date) |
| 568 | 601 | { |
| 569 | 删除: using (var db = new TaiDbContext()) | |
| 602 | 新增: using (var db = _database.GetReaderContext()) | |
| 570 | 603 | { |
| 571 | 604 | // 查出有数据的分类 |
| 572 | 605 | |
| @@ -610,7 +643,7 @@ namespace Core.Servicers.Instances | ||
| 610 | 643 | { |
| 611 | 644 | end = new DateTime(end.Year, end.Month, DateTime.DaysInMonth(end.Year, end.Month)); |
| 612 | 645 | |
| 613 | 删除: using (var db = new TaiDbContext()) | |
| 646 | 新增: using (var db = _database.GetReaderContext()) | |
| 614 | 647 | { |
| 615 | 648 | 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") + "'"); |
| 616 | 649 | |
| @@ -623,7 +656,7 @@ namespace Core.Servicers.Instances | ||
| 623 | 656 | start = new DateTime(start.Year, start.Month, 1, 0, 0, 0); |
| 624 | 657 | end = new DateTime(end.Year, end.Month, DateTime.DaysInMonth(end.Year, end.Month), 23, 59, 59); |
| 625 | 658 | |
| 626 | 删除: using (var db = new TaiDbContext()) | |
| 659 | 新增: using (var db = _database.GetReaderContext()) | |
| 627 | 660 | { |
| 628 | 661 | var day = db.DailyLog.Where(m => m.Date >= start.Date && m.Date <= end.Date) |
| 629 | 662 | .Select(m => new |
| @@ -674,9 +707,9 @@ namespace Core.Servicers.Instances | ||
| 674 | 707 | |
| 675 | 708 | public int GetDateRangeAppCount(DateTime start, DateTime end) |
| 676 | 709 | { |
| 677 | 删除: IEnumerable<AppModel> apps = appData.GetAllApps(); | |
| 710 | 新增: IEnumerable<AppModel> apps = _appData.GetAllApps(); | |
| 678 | 711 | |
| 679 | 删除: using (var db = new TaiDbContext()) | |
| 712 | 新增: using (var db = _database.GetReaderContext()) | |
| 680 | 713 | { |
| 681 | 714 | var res = db.DailyLog |
| 682 | 715 | .Where(m => m.Date >= start && m.Date <= end && m.AppModelID != 0) |
| @@ -690,13 +723,13 @@ namespace Core.Servicers.Instances | ||
| 690 | 723 | public IEnumerable<HoursLogModel> GetTimeRangelogList(DateTime time) |
| 691 | 724 | { |
| 692 | 725 | 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()) | |
| 694 | 727 | { |
| 695 | 728 | var res = db.HoursLog.Where(m => m.DataTime == time).ToList(); |
| 696 | 729 | |
| 697 | 730 | foreach (var log in res) |
| 698 | 731 | { |
| 699 | 删除: log.AppModel = appData.GetApp(log.AppModelID); | |
| 732 | 新增: log.AppModel = _appData.GetApp(log.AppModelID); | |
| 700 | 733 | } |
| 701 | 734 | |
| 702 | 735 | return res; |
| @@ -710,7 +743,7 @@ namespace Core.Servicers.Instances | ||
| 710 | 743 | } |
| 711 | 744 | public double[] GetRangeTotalData(DateTime start, DateTime end) |
| 712 | 745 | { |
| 713 | 删除: using (var db = new TaiDbContext()) | |
| 746 | 新增: using (var db = _database.GetReaderContext()) | |
| 714 | 747 | { |
| 715 | 748 | if (start.Date == end.Date) |
| 716 | 749 | { |
| @@ -751,7 +784,7 @@ namespace Core.Servicers.Instances | ||
| 751 | 784 | |
| 752 | 785 | public double[] GetMonthTotalData(DateTime date) |
| 753 | 786 | { |
| 754 | 删除: using (var db = new TaiDbContext()) | |
| 787 | 新增: using (var db = _database.GetReaderContext()) | |
| 755 | 788 | { |
| 756 | 789 | var dateArr = Time.GetYearDate(date); |
| 757 | 790 | 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 | ||
| 762 | 795 | string month = i < 10 ? "0" + i : i.ToString(); |
| 763 | 796 | var dayArr = Time.GetMonthDate(new DateTime(date.Year, i, 1)); |
| 764 | 797 | var total = data.Where(m => m.Time >= dayArr[0] && m.Time <= dayArr[1]).Sum(m => m.Total); |
| 765 | 删除: | |
| 798 | 新增: | |
| 766 | 799 | result[i - 1] = total; |
| 767 | 800 | } |
| 768 | 801 | return result; |
| @@ -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 | 新增:} | |
| @@ -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 | 新增:} | |
| @@ -21,12 +21,14 @@ namespace Core.Servicers.Instances | ||
| 21 | 21 | public class Main : IMain |
| 22 | 22 | { |
| 23 | 23 | private readonly IAppObserver appObserver; |
| 24 | 新增: private readonly IBrowserObserver browserObserver; | |
| 24 | 25 | private readonly IData data; |
| 25 | 26 | private readonly ISleepdiscover sleepdiscover; |
| 26 | 27 | private readonly IAppConfig appConfig; |
| 27 | 28 | private readonly IDateTimeObserver dateTimeObserver; |
| 28 | 29 | private readonly IAppData appData; |
| 29 | 30 | private readonly ICategorys categories; |
| 31 | 新增: private readonly IWebFilter _webFilter; | |
| 30 | 32 | // 忽略的进程 |
| 31 | 33 | private readonly string[] DefaultIgnoreProcess = new string[] { |
| 32 | 34 | "Tai", |
| @@ -88,7 +90,9 @@ namespace Core.Servicers.Instances | ||
| 88 | 90 | ISleepdiscover sleepdiscover, |
| 89 | 91 | IAppConfig appConfig, |
| 90 | 92 | IDateTimeObserver dateTimeObserver, |
| 91 | 删除: IAppData appData, ICategorys categories) | |
| 93 | 新增: IAppData appData, ICategorys categories, | |
| 94 | 新增: IBrowserObserver browserObserver, | |
| 95 | 新增: IWebFilter webFilter_) | |
| 92 | 96 | { |
| 93 | 97 | this.appObserver = appObserver; |
| 94 | 98 | this.data = data; |
| @@ -97,17 +101,21 @@ namespace Core.Servicers.Instances | ||
| 97 | 101 | this.dateTimeObserver = dateTimeObserver; |
| 98 | 102 | this.appData = appData; |
| 99 | 103 | this.categories = categories; |
| 104 | 新增: this.browserObserver = browserObserver; | |
| 105 | 新增: _webFilter = webFilter_; | |
| 100 | 106 | |
| 101 | 107 | IgnoreProcessCacheList = new List<string>(); |
| 102 | 108 | ConfigIgnoreProcessRegxList = new List<string>(); |
| 103 | 109 | ConfigIgnoreProcessList = new List<string>(); |
| 104 | 110 | |
| 105 | 删除: appObserver.OnAppActive += Observer_OnAppActive; | |
| 111 | 新增: appObserver.OnAppActive += AppObserver_OnAppActive; | |
| 106 | 112 | sleepdiscover.SleepStatusChanged += Sleepdiscover_SleepStatusChanged; |
| 107 | 113 | appConfig.ConfigChanged += AppConfig_ConfigChanged; |
| 108 | 114 | dateTimeObserver.OnDateTimeChanging += DateTimeObserver_OnDateTimeChanging; |
| 109 | 115 | } |
| 110 | 116 | |
| 117 | 新增: | |
| 118 | 新增: | |
| 111 | 119 | private void DateTimeObserver_OnDateTimeChanging(object sender, DateTime time) |
| 112 | 120 | { |
| 113 | 121 | 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 | ||
| 130 | 138 | |
| 131 | 139 | // 更新忽略规则 |
| 132 | 140 | UpdateConfigIgnoreProcess(); |
| 141 | 新增: | |
| 142 | 新增: // 处理web记录功能启停 | |
| 143 | 新增: HandleWebServiceConfig(); | |
| 133 | 144 | } |
| 134 | 145 | } |
| 135 | 146 | |
| @@ -165,6 +176,11 @@ namespace Core.Servicers.Instances | ||
| 165 | 176 | |
| 166 | 177 | // 启动睡眠监测 |
| 167 | 178 | sleepdiscover.Start(); |
| 179 | 新增: | |
| 180 | 新增: // 初始化过滤器 | |
| 181 | 新增: _webFilter.Init(); | |
| 182 | 新增: | |
| 183 | 新增: // 启动主服务 | |
| 168 | 184 | Start(); |
| 169 | 185 | |
| 170 | 186 | OnStarted?.Invoke(this, EventArgs.Empty); |
| @@ -176,6 +192,11 @@ namespace Core.Servicers.Instances | ||
| 176 | 192 | |
| 177 | 193 | dateTimeObserver.Start(); |
| 178 | 194 | appObserver.Start(); |
| 195 | 新增: | |
| 196 | 新增: if (config.General.IsWebEnabled) | |
| 197 | 新增: { | |
| 198 | 新增: browserObserver.Start(); | |
| 199 | 新增: } | |
| 179 | 200 | } |
| 180 | 201 | public void Stop() |
| 181 | 202 | { |
| @@ -307,16 +328,16 @@ namespace Core.Servicers.Instances | ||
| 307 | 328 | return true; |
| 308 | 329 | } |
| 309 | 330 | |
| 310 | 删除: private void Observer_OnAppActive(string processName, string description, string file) | |
| 331 | 新增: private void AppObserver_OnAppActive(Models.AppObserver.AppObserverEventArgs args) | |
| 311 | 332 | { |
| 312 | 333 | if (sleepStatus == SleepStatus.Sleep) |
| 313 | 334 | { |
| 314 | 335 | return; |
| 315 | 336 | } |
| 316 | 337 | |
| 317 | 删除: bool isCheck = IsCheckApp(processName, description, file); | |
| 338 | 新增: bool isCheck = IsCheckApp(args.ProcessName, args.Description, args.File); | |
| 318 | 339 | |
| 319 | 删除: if (activeProcess != processName) | |
| 340 | 新增: if (activeProcess != args.ProcessName) | |
| 320 | 341 | { |
| 321 | 342 | UpdateTime(); |
| 322 | 343 | } |
| @@ -327,7 +348,7 @@ namespace Core.Servicers.Instances | ||
| 327 | 348 | { |
| 328 | 349 | activeStartTime = DateTime.Now; |
| 329 | 350 | } |
| 330 | 删除: activeProcess = processName; | |
| 351 | 新增: activeProcess = args.ProcessName; | |
| 331 | 352 | } |
| 332 | 353 | else |
| 333 | 354 | { |
| @@ -420,5 +441,22 @@ namespace Core.Servicers.Instances | ||
| 420 | 441 | } |
| 421 | 442 | } |
| 422 | 443 | |
| 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 | 新增: | |
| 423 | 461 | } |
| 424 | 462 | } |
| @@ -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 | 新增:} | |
| 文件末尾没有换行 | ||
| @@ -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 | 新增:} | |
| @@ -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 | 新增:} | |
| @@ -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 | 新增:} | |
| @@ -29,7 +29,7 @@ namespace Core.Servicers.Interfaces | ||
| 29 | 29 | /// <param name="start"></param> |
| 30 | 30 | /// <param name="end"></param> |
| 31 | 31 | /// <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); | |
| 33 | 33 | |
| 34 | 34 | /// <summary> |
| 35 | 35 | /// 获取本周的数据 |
| @@ -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 | 新增:} | |
| @@ -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 | 新增:} | |
| @@ -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 | 新增:} | |
| @@ -182,20 +182,25 @@ namespace UI | ||
| 182 | 182 | private void ConfigureServices(IServiceCollection services) |
| 183 | 183 | { |
| 184 | 184 | // 核心服务 |
| 185 | 新增: services.AddSingleton<IDatabase, Database>(); | |
| 185 | 186 | services.AddSingleton<IAppObserver, AppObserver>(); |
| 187 | 新增: services.AddSingleton<IBrowserObserver, BrowserObserver>(); | |
| 186 | 188 | services.AddSingleton<IMain, Main>(); |
| 187 | 189 | services.AddSingleton<IData, Data>(); |
| 190 | 新增: services.AddSingleton<IWebData, WebData>(); | |
| 188 | 191 | services.AddSingleton<ISleepdiscover, Sleepdiscover>(); |
| 189 | 192 | services.AddSingleton<IAppConfig, AppConfig>(); |
| 190 | 193 | services.AddSingleton<IDateTimeObserver, DateTimeObserver>(); |
| 191 | 194 | services.AddSingleton<IAppData, AppData>(); |
| 192 | 195 | services.AddSingleton<ICategorys, Categorys>(); |
| 196 | 新增: services.AddSingleton<IWebFilter, WebFilter>(); | |
| 193 | 197 | |
| 194 | 198 | // UI服务 |
| 195 | 199 | services.AddSingleton<IAppContextMenuServicer, AppContextMenuServicer>(); |
| 196 | 200 | services.AddSingleton<IThemeServicer, ThemeServicer>(); |
| 197 | 201 | services.AddSingleton<IMainServicer, MainServicer>(); |
| 198 | 202 | services.AddSingleton<IInputServicer, InputServicer>(); |
| 203 | 新增: services.AddSingleton<IWebSiteContextMenuServicer, WebSiteContextMenuServicer>(); | |
| 199 | 204 | |
| 200 | 205 | // 主窗口 |
| 201 | 206 | services.AddSingleton<MainViewModel>(); |
| @@ -224,10 +229,15 @@ namespace UI | ||
| 224 | 229 | // 分类app |
| 225 | 230 | services.AddTransient<CategoryAppListPage>(); |
| 226 | 231 | services.AddTransient<CategoryAppListPageVM>(); |
| 227 | 删除: | |
| 232 | 新增: // 分类站点 | |
| 233 | 新增: services.AddTransient<CategoryWebSiteListPage>(); | |
| 234 | 新增: services.AddTransient<CategoryWebSiteListPageVM>(); | |
| 228 | 235 | // 图表 |
| 229 | 236 | services.AddTransient<ChartPage>(); |
| 230 | 237 | services.AddTransient<ChartPageVM>(); |
| 238 | 新增: // 网站详情 | |
| 239 | 新增: services.AddTransient<WebSiteDetailPage>(); | |
| 240 | 新增: services.AddTransient<WebSiteDetailPageVM>(); | |
| 231 | 241 | } |
| 232 | 242 | |
| 233 | 243 | private void OnStartup(object sender, StartupEventArgs e) |
| @@ -242,7 +252,7 @@ namespace UI | ||
| 242 | 252 | main.Start(); |
| 243 | 253 | |
| 244 | 254 | var observer = serviceProvider.GetService<IAppObserver>(); |
| 245 | 删除: observer.OnAppActive += (p, d, f) => | |
| 255 | 新增: observer.OnAppActive += (args) => | |
| 246 | 256 | { |
| 247 | 257 | Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Background, new Action(() => |
| 248 | 258 | { |
| @@ -1,4 +1,5 @@ | ||
| 1 | 删除:using System; | |
| 1 | 新增:using Core; | |
| 2 | 新增:using System; | |
| 2 | 3 | using System.Collections.Generic; |
| 3 | 4 | using System.Text; |
| 4 | 5 | using System.Windows.Media; |
| @@ -49,7 +50,7 @@ namespace UI.Base.Color | ||
| 49 | 50 | { |
| 50 | 51 | if (string.IsNullOrEmpty(color)) |
| 51 | 52 | { |
| 52 | 删除: return null; | |
| 53 | 新增: color = StateData.ThemeColor; | |
| 53 | 54 | } |
| 54 | 55 | return new SolidColorBrush((System.Windows.Media.Color)ColorConverter.ConvertFromString(color)) |
| 55 | 56 | { |
| @@ -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 | 新增:} | |
| @@ -74,18 +74,20 @@ namespace UI.Controls.Base | ||
| 74 | 74 | |
| 75 | 75 | private void Handle(string path) |
| 76 | 76 | { |
| 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)) | |
| 78 | 79 | { |
| 79 | 删除: Src = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, path); | |
| 80 | 新增: Src = defaultIconFile; | |
| 81 | 新增: return; | |
| 80 | 82 | } |
| 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) | |
| 86 | 84 | { |
| 87 | 85 | Src = path; |
| 86 | 新增: return; | |
| 88 | 87 | } |
| 88 | 新增: | |
| 89 | 新增: string src = path.IndexOf(":") != -1 ? path : System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, path); | |
| 90 | 新增: Src = File.Exists(src) ? src : defaultIconFile; | |
| 89 | 91 | } |
| 90 | 92 | |
| 91 | 93 | } |
| @@ -77,8 +77,9 @@ namespace UI.Controls.Base | ||
| 77 | 77 | |
| 78 | 78 | if (Condition.IndexOf("=") != -1) |
| 79 | 79 | { |
| 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; | |
| 82 | 83 | } |
| 83 | 84 | else if (Condition.IndexOf("not null") != -1) |
| 84 | 85 | { |
| @@ -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 | 新增:} | |
| @@ -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 | 新增:} | |
| @@ -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 | 新增:} | |
| @@ -362,9 +362,7 @@ namespace UI.Controls.SettingPanel | ||
| 362 | 362 | }; |
| 363 | 363 | |
| 364 | 364 | var item = new SettingPanelItem(); |
| 365 | 删除: item.Name = configAttribute.Name; | |
| 366 | 删除: item.Description = configAttribute.Description; | |
| 367 | 删除: item.Content = control; | |
| 365 | 新增: item.Init(configAttribute, control); | |
| 368 | 366 | |
| 369 | 367 | pi.SetValue(configData, pi.GetValue(Data)); |
| 370 | 368 | return item; |
| @@ -413,9 +411,7 @@ namespace UI.Controls.SettingPanel | ||
| 413 | 411 | //inputControl.IsChecked = (bool)pi.GetValue(Data); |
| 414 | 412 | |
| 415 | 413 | var item = new SettingPanelItem(); |
| 416 | 删除: item.Name = configAttribute.Name; | |
| 417 | 删除: item.Description = configAttribute.Description; | |
| 418 | 删除: item.Content = control; | |
| 414 | 新增: item.Init(configAttribute, control); | |
| 419 | 415 | |
| 420 | 416 | pi.SetValue(configData, pi.GetValue(Data)); |
| 421 | 417 | return item; |
| @@ -435,9 +431,8 @@ namespace UI.Controls.SettingPanel | ||
| 435 | 431 | inputControl.IsChecked = (bool)pi.GetValue(Data); |
| 436 | 432 | |
| 437 | 433 | var item = new SettingPanelItem(); |
| 438 | 删除: item.Name = configAttribute.Name; | |
| 439 | 删除: item.Description = configAttribute.Description; | |
| 440 | 删除: item.Content = inputControl; | |
| 434 | 新增: item.Init(configAttribute, inputControl); | |
| 435 | 新增: | |
| 441 | 436 | pi.SetValue(configData, pi.GetValue(Data)); |
| 442 | 437 | return item; |
| 443 | 438 | } |
| @@ -23,10 +23,24 @@ namespace UI.Controls.SettingPanel | ||
| 23 | 23 | public object Content { get { return (object)GetValue(ContentProperty); } set { SetValue(ContentProperty, value); } } |
| 24 | 24 | public static readonly DependencyProperty ContentProperty = DependencyProperty.Register("Content", typeof(object), typeof(SettingPanelItem)); |
| 25 | 25 | |
| 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 | 新增: | |
| 26 | 32 | public SettingPanelItem() |
| 27 | 33 | { |
| 28 | 34 | DefaultStyleKey = typeof(SettingPanelItem); |
| 29 | 35 | } |
| 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 | 新增: } | |
| 30 | 44 | public override void OnApplyTemplate() |
| 31 | 45 | { |
| 32 | 46 | base.OnApplyTemplate(); |
| @@ -1,4 +1,5 @@ | ||
| 1 | 删除:using System; | |
| 1 | 新增:using Core.Models.Db; | |
| 2 | 新增:using System; | |
| 2 | 3 | using System.Collections.Generic; |
| 3 | 4 | using System.Collections.ObjectModel; |
| 4 | 5 | using System.Linq; |
| @@ -18,8 +19,8 @@ namespace UI.Models | ||
| 18 | 19 | set { Data_ = value; OnPropertyChanged(); } |
| 19 | 20 | } |
| 20 | 21 | |
| 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(); } } | |
| 23 | 24 | |
| 24 | 25 | |
| 25 | 26 | private Visibility EditVisibility_ = Visibility.Collapsed; |
| @@ -58,5 +59,17 @@ namespace UI.Models | ||
| 58 | 59 | |
| 59 | 60 | private string EditColor_; |
| 60 | 61 | 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(); } } | |
| 61 | 74 | } |
| 62 | 75 | } |
| 文件末尾没有换行 | ||
| @@ -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 | 新增:} | |
| @@ -145,7 +145,7 @@ namespace UI.Models | ||
| 145 | 145 | /// <summary> |
| 146 | 146 | /// 时长对比上一周期变化(0无变化,1增加,-1减少) |
| 147 | 147 | /// </summary> |
| 148 | 删除: public string DiffTotalTimeType { get { return DiffTotalTimeType_; } set { DiffTotalTimeType_ = value;OnPropertyChanged(); } } | |
| 148 | 新增: public string DiffTotalTimeType { get { return DiffTotalTimeType_; } set { DiffTotalTimeType_ = value; OnPropertyChanged(); } } | |
| 149 | 149 | private string DiffAppCountType_; |
| 150 | 150 | /// <summary> |
| 151 | 151 | /// 应用量对比上一周期变化(0无变化,1增加,-1减少) |
| @@ -155,11 +155,96 @@ namespace UI.Models | ||
| 155 | 155 | /// <summary> |
| 156 | 156 | /// 时长差异值 |
| 157 | 157 | /// </summary> |
| 158 | 删除: public string DiffTotalTimeValue { get { return DiffTotalTimeValue_; } set { DiffTotalTimeValue_ = value;OnPropertyChanged(); } } | |
| 158 | 新增: public string DiffTotalTimeValue { get { return DiffTotalTimeValue_; } set { DiffTotalTimeValue_ = value; OnPropertyChanged(); } } | |
| 159 | 159 | private string DiffAppCountValue_; |
| 160 | 160 | /// <summary> |
| 161 | 161 | /// 应用量差异值 |
| 162 | 162 | /// </summary> |
| 163 | 163 | 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 | |
| 164 | 249 | } |
| 165 | 250 | } |
| @@ -6,6 +6,7 @@ using System.Text; | ||
| 6 | 6 | using System.Threading.Tasks; |
| 7 | 7 | using System.Windows.Controls; |
| 8 | 8 | using UI.Controls.Charts.Model; |
| 9 | 新增:using UI.Controls.Select; | |
| 9 | 10 | |
| 10 | 11 | namespace UI.Models |
| 11 | 12 | { |
| @@ -63,5 +64,43 @@ namespace UI.Models | ||
| 63 | 64 | /// </summary> |
| 64 | 65 | public int MoreNum { get { return MoreNum_; } set { MoreNum_ = value; OnPropertyChanged(); } } |
| 65 | 66 | |
| 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(); } } | |
| 66 | 105 | } |
| 67 | 106 | } |
| @@ -3,11 +3,39 @@ using System.Collections.Generic; | ||
| 3 | 3 | using System.Linq; |
| 4 | 4 | using System.Text; |
| 5 | 5 | using System.Threading.Tasks; |
| 6 | 新增:using UI.Controls.Select; | |
| 6 | 7 | |
| 7 | 8 | namespace UI.Models |
| 8 | 9 | { |
| 9 | 10 | public class ModelBase : UINotifyPropertyChanged |
| 10 | 11 | { |
| 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 | 新增: } | |
| 11 | 39 | public virtual void Dispose() { } |
| 12 | 40 | } |
| 13 | 41 | } |
| @@ -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 | 新增:} | |
| @@ -125,4 +125,15 @@ | ||
| 125 | 125 | <Color x:Key="ScrollBarColor">#a0a0a0</Color> |
| 126 | 126 | <SolidColorBrush x:Key="ScrollBarBrush" Color="{StaticResource ScrollBarColor}" /> |
| 127 | 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}" /> | |
| 128 | 139 | </ResourceDictionary> |
| 文件末尾没有换行 | ||
| @@ -124,4 +124,16 @@ | ||
| 124 | 124 | |
| 125 | 125 | <Color x:Key="ScrollBarColor">#8A8A8A</Color> |
| 126 | 126 | <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}" /> | |
| 127 | 139 | </ResourceDictionary> |
| 文件末尾没有换行 | ||
| @@ -49,8 +49,6 @@ namespace UI.Servicers | ||
| 49 | 49 | if (menu != null) |
| 50 | 50 | { |
| 51 | 51 | menu.ContextMenuOpening -= SetCategory_ContextMenuOpening; |
| 52 | 删除: | |
| 53 | 删除: var test = VisualTreeHelper.GetParent(menu); | |
| 54 | 52 | } |
| 55 | 53 | menu = new ContextMenu(); |
| 56 | 54 | menu.Items.Clear(); |
| @@ -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 | 新增:} | |
| @@ -13,12 +13,14 @@ namespace UI.Servicers | ||
| 13 | 13 | private readonly IThemeServicer themeServicer; |
| 14 | 14 | private readonly IInputServicer inputServicer; |
| 15 | 15 | 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_) | |
| 17 | 18 | { |
| 18 | 19 | this.main = main; |
| 19 | 20 | this.themeServicer = themeServicer; |
| 20 | 21 | this.inputServicer = inputServicer; |
| 21 | 22 | this.appContextMenuServicer = appContextMenuServicer; |
| 23 | 新增: _webSiteContext = webSiteContext_; | |
| 22 | 24 | } |
| 23 | 25 | public void Start() |
| 24 | 26 | { |
| @@ -31,6 +33,7 @@ namespace UI.Servicers | ||
| 31 | 33 | themeServicer.Init(); |
| 32 | 34 | inputServicer.Start(); |
| 33 | 35 | appContextMenuServicer.Init(); |
| 36 | 新增: _webSiteContext.Init(); | |
| 34 | 37 | } |
| 35 | 38 | } |
| 36 | 39 | } |
| @@ -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 | 新增:} | |
| @@ -21,7 +21,15 @@ | ||
| 21 | 21 | |
| 22 | 22 | <Grid> |
| 23 | 23 | <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> | |
| 25 | 33 | <base:View Value="{TemplateBinding Description}" Condition="not empty"> |
| 26 | 34 | <TextBlock Text="{TemplateBinding Description}" FontSize="12" Margin="0,4,0,0" Foreground="{DynamicResource SubTextBrush}" VerticalAlignment="Center"/> |
| 27 | 35 | </base:View> |
| @@ -128,6 +128,7 @@ | ||
| 128 | 128 | <Compile Include="Base\Color\Colors.cs" /> |
| 129 | 129 | <Compile Include="Base\Color\ColorTypes.cs" /> |
| 130 | 130 | <Compile Include="Base\UIHelper.cs" /> |
| 131 | 新增: <Compile Include="Controls\Base\DiffValue.cs" /> | |
| 131 | 132 | <Compile Include="Controls\Base\EmptyData.cs" /> |
| 132 | 133 | <Compile Include="Controls\Base\CheckBox.cs" /> |
| 133 | 134 | <Compile Include="Controls\Base\ColorSelect.cs" /> |
| @@ -143,16 +144,20 @@ | ||
| 143 | 144 | <Compile Include="Controls\Button\IconButton.cs" /> |
| 144 | 145 | <Compile Include="Controls\Charts\ChartDataValueType.cs" /> |
| 145 | 146 | <Compile Include="Controls\Charts\ChartItemTypeColumn.cs" /> |
| 147 | 新增: <Compile Include="Controls\Charts\ChartsItemTypePie.cs" /> | |
| 146 | 148 | <Compile Include="Controls\Charts\ChartsItemTypeRadar.cs" /> |
| 147 | 149 | <Compile Include="Controls\Charts\ChartsItemTypeMonth.cs" /> |
| 148 | 150 | <Compile Include="Controls\Charts\ChartsItemTypeCard.cs" /> |
| 149 | 删除: <Compile Include="Controls\Charts\ChartsItemTypeA.cs" /> | |
| 151 | 新增: <Compile Include="Controls\Charts\ChartsItemTypeList.cs" /> | |
| 150 | 152 | <Compile Include="Controls\Charts\Charts.cs" /> |
| 151 | 153 | <Compile Include="Controls\Charts\ChartsType.cs" /> |
| 152 | 154 | <Compile Include="Controls\Charts\Model\ChartBadgeModel.cs" /> |
| 153 | 155 | <Compile Include="Controls\Charts\Model\ChartBadgeType.cs" /> |
| 154 | 156 | <Compile Include="Controls\Charts\Model\ChartColumnInfoModel.cs" /> |
| 155 | 157 | <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" /> | |
| 156 | 161 | <Compile Include="Controls\Converters\ToStringConverter.cs" /> |
| 157 | 162 | <Compile Include="Controls\Converters\HextoColorConverter.cs" /> |
| 158 | 163 | <Compile Include="Controls\DatePickerBar\DatePickerBarItem.cs" /> |
| @@ -181,6 +186,7 @@ | ||
| 181 | 186 | <Compile Include="Controls\Window\ToastType.cs" /> |
| 182 | 187 | <Compile Include="Extensions\ListExtensions.cs" /> |
| 183 | 188 | <Compile Include="Librays\Image\Imager.cs" /> |
| 189 | 新增: <Compile Include="Models\CategoryWebSiteListPageModel.cs" /> | |
| 184 | 190 | <Compile Include="Models\CategoryAppListPageModel.cs" /> |
| 185 | 191 | <Compile Include="Models\CategoryAppList\ChooseAppModel.cs" /> |
| 186 | 192 | <Compile Include="Models\CategoryPageModel.cs" /> |
| @@ -194,7 +200,10 @@ | ||
| 194 | 200 | <Compile Include="Models\ModelBase.cs" /> |
| 195 | 201 | <Compile Include="Models\SettingPageModel.cs" /> |
| 196 | 202 | <Compile Include="Models\UINotifyPropertyChanged.cs" /> |
| 203 | 新增: <Compile Include="Models\WebSiteDetailPageModel.cs" /> | |
| 204 | 新增: <Compile Include="Servicers\WebSiteContextMenuServicer.cs" /> | |
| 197 | 205 | <Compile Include="Servicers\AppContextMenuServicer.cs" /> |
| 206 | 新增: <Compile Include="Servicers\IWebSiteContextMenuServicer.cs" /> | |
| 198 | 207 | <Compile Include="Servicers\IAppContextMenuServicer.cs" /> |
| 199 | 208 | <Compile Include="Servicers\IInputServicer.cs" /> |
| 200 | 209 | <Compile Include="Servicers\IMainServicer.cs" /> |
| @@ -204,6 +213,7 @@ | ||
| 204 | 213 | <Compile Include="Servicers\MainServicer.cs" /> |
| 205 | 214 | <Compile Include="Servicers\ThemeServicer.cs" /> |
| 206 | 215 | <Compile Include="StateData.cs" /> |
| 216 | 新增: <Compile Include="ViewModels\CategoryWebSiteListPageVM.cs" /> | |
| 207 | 217 | <Compile Include="ViewModels\CategoryAppListPageVM.cs" /> |
| 208 | 218 | <Compile Include="ViewModels\CategoryPageVM.cs" /> |
| 209 | 219 | <Compile Include="ViewModels\ChartPageVM.cs" /> |
| @@ -212,6 +222,10 @@ | ||
| 212 | 222 | <Compile Include="ViewModels\IndexPageVM.cs" /> |
| 213 | 223 | <Compile Include="ViewModels\MainViewModel.cs" /> |
| 214 | 224 | <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> | |
| 215 | 229 | <Compile Include="Views\CategoryAppListPage.xaml.cs"> |
| 216 | 230 | <DependentUpon>CategoryAppListPage.xaml</DependentUpon> |
| 217 | 231 | </Compile> |
| @@ -233,6 +247,9 @@ | ||
| 233 | 247 | <Compile Include="Views\SettingPage.xaml.cs"> |
| 234 | 248 | <DependentUpon>SettingPage.xaml</DependentUpon> |
| 235 | 249 | </Compile> |
| 250 | 新增: <Compile Include="Views\WebSiteDetailPage.xaml.cs"> | |
| 251 | 新增: <DependentUpon>WebSiteDetailPage.xaml</DependentUpon> | |
| 252 | 新增: </Compile> | |
| 236 | 253 | <Page Include="MainWindow.xaml"> |
| 237 | 254 | <Generator>MSBuild:Compile</Generator> |
| 238 | 255 | <SubType>Designer</SubType> |
| @@ -322,7 +339,7 @@ | ||
| 322 | 339 | <Generator>MSBuild:Compile</Generator> |
| 323 | 340 | <SubType>Designer</SubType> |
| 324 | 341 | </Page> |
| 325 | 删除: <Page Include="Themes\Charts\ChartsItemTypeA.xaml"> | |
| 342 | 新增: <Page Include="Themes\Charts\ChartsItemTypeList.xaml"> | |
| 326 | 343 | <Generator>MSBuild:Compile</Generator> |
| 327 | 344 | <SubType>Designer</SubType> |
| 328 | 345 | </Page> |
| @@ -418,6 +435,10 @@ | ||
| 418 | 435 | <SubType>Designer</SubType> |
| 419 | 436 | <Generator>MSBuild:Compile</Generator> |
| 420 | 437 | </Page> |
| 438 | 新增: <Page Include="Views\CategoryWebSiteListPage.xaml"> | |
| 439 | 新增: <Generator>MSBuild:Compile</Generator> | |
| 440 | 新增: <SubType>Designer</SubType> | |
| 441 | 新增: </Page> | |
| 421 | 442 | <Page Include="Views\CategoryAppListPage.xaml"> |
| 422 | 443 | <SubType>Designer</SubType> |
| 423 | 444 | <Generator>MSBuild:Compile</Generator> |
| @@ -446,6 +467,10 @@ | ||
| 446 | 467 | <SubType>Designer</SubType> |
| 447 | 468 | <Generator>MSBuild:Compile</Generator> |
| 448 | 469 | </Page> |
| 470 | 新增: <Page Include="Views\WebSiteDetailPage.xaml"> | |
| 471 | 新增: <SubType>Designer</SubType> | |
| 472 | 新增: <Generator>MSBuild:Compile</Generator> | |
| 473 | 新增: </Page> | |
| 449 | 474 | </ItemGroup> |
| 450 | 475 | <ItemGroup> |
| 451 | 476 | <Compile Include="Properties\AssemblyInfo.cs"> |
| @@ -6,6 +6,7 @@ using System.Linq; | ||
| 6 | 6 | using System.Text; |
| 7 | 7 | using System.Threading.Tasks; |
| 8 | 8 | using UI.Controls; |
| 9 | 新增:using UI.Controls.Select; | |
| 9 | 10 | using UI.Models; |
| 10 | 11 | using UI.Models.Category; |
| 11 | 12 | using UI.Views; |
| @@ -17,7 +18,8 @@ namespace UI.ViewModels | ||
| 17 | 18 | private readonly ICategorys categorys; |
| 18 | 19 | private readonly MainViewModel mainVM; |
| 19 | 20 | private readonly IAppData appData; |
| 20 | 删除: public Command GotoAppListCommand { get; set; } | |
| 21 | 新增: private readonly IWebData _webData; | |
| 22 | 新增: public Command GotoListCommand { get; set; } | |
| 21 | 23 | /// <summary> |
| 22 | 24 | /// 打开编辑命令 |
| 23 | 25 | /// </summary> |
| @@ -34,59 +36,47 @@ namespace UI.ViewModels | ||
| 34 | 36 | /// 删除分类 |
| 35 | 37 | /// </summary> |
| 36 | 38 | public Command DelCommand { get; set; } |
| 39 | 新增: /// <summary> | |
| 40 | 新增: /// 刷新 | |
| 41 | 新增: /// </summary> | |
| 42 | 新增: public Command RefreshCommand { get; set; } | |
| 43 | 新增: | |
| 37 | 44 | |
| 38 | 删除: public CategoryPageVM(ICategorys categorys, MainViewModel mainVM, IAppData appData) | |
| 45 | 新增: public CategoryPageVM(ICategorys categorys, MainViewModel mainVM, IAppData appData, IWebData webData_) | |
| 39 | 46 | { |
| 40 | 47 | this.categorys = categorys; |
| 41 | 48 | this.mainVM = mainVM; |
| 42 | 49 | this.appData = appData; |
| 50 | 新增: _webData = webData_; | |
| 43 | 51 | |
| 44 | 删除: GotoAppListCommand = new Command(new Action<object>(OnGotoAppList)); | |
| 52 | 新增: GotoListCommand = new Command(new Action<object>(OnGotoList)); | |
| 45 | 53 | EditCommand = new Command(new Action<object>(OnEdit)); |
| 46 | 54 | EditDoneCommand = new Command(new Action<object>(OnEditDone)); |
| 47 | 55 | EditCloseCommand = new Command(new Action<object>(OnEditClose)); |
| 48 | 56 | DelCommand = new Command(new Action<object>(OnDel)); |
| 49 | 删除: | |
| 50 | 删除: | |
| 57 | 新增: RefreshCommand = new Command(new Action<object>(OnRefresh)); | |
| 51 | 58 | LoadData(); |
| 52 | 59 | |
| 53 | 60 | PropertyChanged += CategoryPageVM_PropertyChanged; |
| 54 | 61 | } |
| 55 | 62 | |
| 56 | 删除: public override void Dispose() | |
| 63 | 新增: private void OnRefresh(object obj) | |
| 57 | 64 | { |
| 58 | 删除: base.Dispose(); | |
| 59 | 删除: PropertyChanged -= CategoryPageVM_PropertyChanged; | |
| 60 | 删除: Data = null; | |
| 65 | 新增: LoadData(); | |
| 61 | 66 | } |
| 67 | 新增: | |
| 68 | 新增: | |
| 62 | 69 | private void OnDel(object obj) |
| 63 | 70 | { |
| 64 | 删除: if (SelectedItem == null) | |
| 71 | 新增: if (ShowType.Id == 0) | |
| 65 | 72 | { |
| 66 | 删除: return; | |
| 73 | 新增: DelAppCategory(); | |
| 67 | 74 | } |
| 68 | 删除: var category = categorys.GetCategory(SelectedItem.Data.ID); | |
| 69 | 删除: if (category != null) | |
| 75 | 新增: else if (ShowType.Id == 1) | |
| 70 | 76 | { |
| 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(); | |
| 89 | 78 | } |
| 79 | 新增: | |
| 90 | 80 | } |
| 91 | 81 | private void OnEditClose(object obj) |
| 92 | 82 | { |
| @@ -94,28 +84,52 @@ namespace UI.ViewModels | ||
| 94 | 84 | } |
| 95 | 85 | private void OnEditDone(object obj) |
| 96 | 86 | { |
| 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 | 新增: { | |
| 98 | 103 | if (string.IsNullOrEmpty(EditName)) |
| 99 | 104 | { |
| 100 | 105 | IsEditError = true; |
| 101 | 106 | EditErrorText = "分类名称不能为空"; |
| 102 | 删除: return; | |
| 107 | 新增: return false; | |
| 103 | 108 | } |
| 104 | 109 | if (string.IsNullOrEmpty(EditIconFile)) |
| 105 | 110 | { |
| 106 | 111 | mainVM.Toast("请选择一个分类图标", Controls.Window.ToastType.Error, Controls.Base.IconTypes.ImportantBadge12); |
| 107 | 删除: return; | |
| 112 | 新增: return false; | |
| 108 | 113 | } |
| 109 | 114 | if (string.IsNullOrEmpty(EditColor)) |
| 110 | 115 | { |
| 111 | 116 | mainVM.Toast("请设置一个分类颜色", Controls.Window.ToastType.Error, Controls.Base.IconTypes.ImportantBadge12); |
| 112 | 删除: return; | |
| 117 | 新增: return false; | |
| 113 | 118 | } |
| 114 | 119 | if (EditIconFile.IndexOf("pack://") == -1 && new FileInfo(EditIconFile).Length > 1000000) |
| 115 | 120 | { |
| 116 | 121 | mainVM.Toast("图标文件不能超过1MB", Controls.Window.ToastType.Error, Controls.Base.IconTypes.ImportantBadge12); |
| 117 | 删除: return; | |
| 122 | 新增: return false; | |
| 118 | 123 | } |
| 124 | 新增: return true; | |
| 125 | 新增: } | |
| 126 | 新增: #endregion | |
| 127 | 新增: | |
| 128 | 新增: #region 应用分类操作 | |
| 129 | 新增: #region 编辑应用分类 | |
| 130 | 新增: private void EditAppCategoryAction() | |
| 131 | 新增: { | |
| 132 | 新增: if (!IsEditVerify()) return; | |
| 119 | 133 | |
| 120 | 134 | if (IsCreate) |
| 121 | 135 | { |
| @@ -166,17 +180,17 @@ namespace UI.ViewModels | ||
| 166 | 180 | // 编辑分类 |
| 167 | 181 | |
| 168 | 182 | // 判断重复分类名称 |
| 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()) | |
| 170 | 184 | { |
| 171 | 185 | mainVM.Toast("分类名称已存在", Controls.Window.ToastType.Error, Controls.Base.IconTypes.ImportantBadge12); |
| 172 | 186 | return; |
| 173 | 187 | } |
| 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()) | |
| 175 | 189 | { |
| 176 | 190 | mainVM.Toast("颜色已存在,请重新选择", Controls.Window.ToastType.Error, Controls.Base.IconTypes.ImportantBadge12); |
| 177 | 191 | return; |
| 178 | 192 | } |
| 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) | |
| 180 | 194 | { |
| 181 | 195 | mainVM.Toast("没有修改"); |
| 182 | 196 | EditVisibility = System.Windows.Visibility.Collapsed; |
| @@ -184,7 +198,7 @@ namespace UI.ViewModels | ||
| 184 | 198 | } |
| 185 | 199 | mainVM.Toast("已更新", Controls.Window.ToastType.Success); |
| 186 | 200 | |
| 187 | 删除: var category = categorys.GetCategory(SelectedItem.Data.ID); | |
| 201 | 新增: var category = categorys.GetCategory(SelectedAppCategoryItem.Data.ID); | |
| 188 | 202 | if (category != null) |
| 189 | 203 | { |
| 190 | 204 | category.Name = EditName; |
| @@ -194,7 +208,7 @@ namespace UI.ViewModels | ||
| 194 | 208 | categorys.Update(category); |
| 195 | 209 | } |
| 196 | 210 | |
| 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(); | |
| 198 | 212 | |
| 199 | 213 | var changedItem = new CategoryModel() |
| 200 | 214 | { |
| @@ -217,6 +231,165 @@ namespace UI.ViewModels | ||
| 217 | 231 | EditVisibility = System.Windows.Visibility.Collapsed; |
| 218 | 232 | } |
| 219 | 233 | } |
| 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 | |
| 220 | 393 | |
| 221 | 394 | private void OnEdit(object obj) |
| 222 | 395 | { |
| @@ -225,10 +398,12 @@ namespace UI.ViewModels | ||
| 225 | 398 | |
| 226 | 399 | if (obj != null) |
| 227 | 400 | { |
| 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; | |
| 232 | 407 | } |
| 233 | 408 | else |
| 234 | 409 | { |
| @@ -240,38 +415,67 @@ namespace UI.ViewModels | ||
| 240 | 415 | |
| 241 | 416 | private void CategoryPageVM_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) |
| 242 | 417 | { |
| 243 | 删除: if (e.PropertyName == nameof(SelectedItem)) | |
| 418 | 新增: if (e.PropertyName == nameof(SelectedAppCategoryItem)) | |
| 244 | 419 | { |
| 245 | 420 | //GotoAppList(); |
| 246 | 421 | } |
| 247 | 422 | } |
| 248 | 423 | |
| 249 | 删除: private void OnGotoAppList(object obj) | |
| 424 | 新增: private void OnGotoList(object obj) | |
| 250 | 425 | { |
| 251 | 删除: GotoAppList(); | |
| 426 | 新增: GotoList(); | |
| 252 | 427 | } |
| 253 | 428 | |
| 254 | 429 | private void LoadData() |
| 255 | 430 | { |
| 256 | 删除: Data = new System.Collections.ObjectModel.ObservableCollection<CategoryModel>(); | |
| 257 | 删除: foreach (var item in categorys.GetCategories()) | |
| 431 | 新增: Task.Run(() => | |
| 258 | 432 | { |
| 259 | 删除: Data.Add(new CategoryModel() | |
| 433 | 新增: Data = new System.Collections.ObjectModel.ObservableCollection<CategoryModel>(); | |
| 434 | 新增: foreach (var item in categorys.GetCategories()) | |
| 260 | 435 | { |
| 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 | 新增: }); | |
| 265 | 456 | } |
| 266 | 457 | |
| 267 | 删除: private void GotoAppList() | |
| 458 | 新增: private void GotoList() | |
| 268 | 459 | { |
| 269 | 删除: if (SelectedItem != null) | |
| 460 | 新增: if (ShowType.Id == 0 && SelectedAppCategoryItem != null) | |
| 270 | 461 | { |
| 271 | 删除: mainVM.Data = SelectedItem; | |
| 462 | 新增: mainVM.Data = SelectedAppCategoryItem; | |
| 272 | 463 | 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; | |
| 274 | 471 | } |
| 275 | 472 | } |
| 473 | 新增: | |
| 474 | 新增: public override void Dispose() | |
| 475 | 新增: { | |
| 476 | 新增: base.Dispose(); | |
| 477 | 新增: PropertyChanged -= CategoryPageVM_PropertyChanged; | |
| 478 | 新增: Data = null; | |
| 479 | 新增: } | |
| 276 | 480 | } |
| 277 | 481 | } |
| @@ -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 | 新增:} | |
| @@ -1,5 +1,6 @@ | ||
| 1 | 1 | using Core.Librarys; |
| 2 | 2 | using Core.Models; |
| 3 | 新增:using Core.Models.Db; | |
| 3 | 4 | using Core.Servicers.Interfaces; |
| 4 | 5 | using System; |
| 5 | 6 | using System.Collections.Generic; |
| @@ -8,6 +9,7 @@ using System.Linq; | ||
| 8 | 9 | using System.Text; |
| 9 | 10 | using System.Text.RegularExpressions; |
| 10 | 11 | using System.Threading.Tasks; |
| 12 | 新增:using System.Windows.Documents; | |
| 11 | 13 | using UI.Controls; |
| 12 | 14 | using UI.Controls.Charts.Model; |
| 13 | 15 | using UI.Controls.Select; |
| @@ -24,20 +26,24 @@ namespace UI.ViewModels | ||
| 24 | 26 | private readonly MainViewModel mainVM; |
| 25 | 27 | private readonly IAppContextMenuServicer appContextMenuServicer; |
| 26 | 28 | private readonly IInputServicer inputServicer; |
| 29 | 新增: private readonly IWebData _webData; | |
| 30 | 新增: private readonly IWebSiteContextMenuServicer _webSiteContextMenu; | |
| 27 | 31 | |
| 28 | 32 | private double totalTime_ = 0; |
| 29 | 33 | private int appCount_ = 0; |
| 30 | 34 | public Command ToDetailCommand { get; set; } |
| 31 | 35 | public Command RefreshCommand { get; set; } |
| 32 | 36 | 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_) | |
| 34 | 39 | { |
| 35 | 40 | this.data = data; |
| 36 | 41 | this.categorys = categorys; |
| 37 | 42 | this.mainVM = mainVM; |
| 38 | 43 | this.appContextMenuServicer = appContextMenuServicer; |
| 39 | 44 | this.inputServicer = inputServicer; |
| 40 | 删除: | |
| 45 | 新增: _webData = webData_; | |
| 46 | 新增: _webSiteContextMenu = webSiteContextMenu_; | |
| 41 | 47 | |
| 42 | 48 | ToDetailCommand = new Command(new Action<object>(OnTodetailCommand)); |
| 43 | 49 | RefreshCommand = new Command(new Action<object>(OnRefreshCommand)); |
| @@ -56,7 +62,7 @@ namespace UI.ViewModels | ||
| 56 | 62 | { |
| 57 | 63 | Name = "上周" |
| 58 | 64 | }); |
| 59 | 删除: | |
| 65 | 新增: | |
| 60 | 66 | var chartDataModeOptions = new List<SelectItemModel> |
| 61 | 67 | { |
| 62 | 68 | new SelectItemModel() |
| @@ -78,7 +84,7 @@ namespace UI.ViewModels | ||
| 78 | 84 | |
| 79 | 85 | ChartDataModeOptions = chartDataModeOptions; |
| 80 | 86 | ChartDataMode = chartDataModeOptions[0]; |
| 81 | 删除: | |
| 87 | 新增: //ShowType = ShowTypeOptions[0]; | |
| 82 | 88 | WeekOptions = weekOptions; |
| 83 | 89 | SelectedWeek = weekOptions[0]; |
| 84 | 90 | MonthDate = DateTime.Now; |
| @@ -90,8 +96,8 @@ namespace UI.ViewModels | ||
| 90 | 96 | |
| 91 | 97 | PropertyChanged += ChartPageVM_PropertyChanged; |
| 92 | 98 | inputServicer.OnKeyUpInput += InputServicer_OnKeyUpInput; |
| 93 | 删除: | |
| 94 | 99 | AppContextMenu = appContextMenuServicer.GetContextMenu(); |
| 100 | 新增: WebSiteContextMenu = _webSiteContextMenu.GetContextMenu(); | |
| 95 | 101 | } |
| 96 | 102 | |
| 97 | 103 | |
| @@ -108,20 +114,27 @@ namespace UI.ViewModels | ||
| 108 | 114 | |
| 109 | 115 | if (data != null) |
| 110 | 116 | { |
| 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) | |
| 115 | 118 | { |
| 116 | 删除: app = (data.Data as HoursLogModel).AppModel; | |
| 119 | 新增: mainVM.Data = data.Data; | |
| 120 | 新增: mainVM.Uri = nameof(WebSiteDetailPage); | |
| 117 | 121 | } |
| 118 | 删除: | |
| 119 | 删除: if (app != null) | |
| 122 | 新增: else | |
| 120 | 123 | { |
| 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; | |
| 124 | 126 | |
| 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 | 新增: } | |
| 125 | 138 | } |
| 126 | 139 | } |
| 127 | 140 | private void OnRefreshCommand(object obj) |
| @@ -177,6 +190,10 @@ namespace UI.ViewModels | ||
| 177 | 190 | } |
| 178 | 191 | LoadData(); |
| 179 | 192 | } |
| 193 | 新增: if (e.PropertyName == nameof(WebColSelectedIndex)) | |
| 194 | 新增: { | |
| 195 | 新增: LoadWebSitesColSelectedData(); | |
| 196 | 新增: } | |
| 180 | 197 | } |
| 181 | 198 | |
| 182 | 199 | |
| @@ -212,10 +229,12 @@ namespace UI.ViewModels | ||
| 212 | 229 | private void LoadDayData() |
| 213 | 230 | { |
| 214 | 231 | ColumnSelectedIndex = -1; |
| 232 | 新增: WebColSelectedIndex = -1; | |
| 233 | 新增: | |
| 215 | 234 | DataMaximum = 3600; |
| 216 | 235 | Task.Run(() => |
| 217 | 236 | { |
| 218 | 删除: | |
| 237 | 新增: // 应用数据 | |
| 219 | 238 | var chartData = new List<ChartsDataModel>(); |
| 220 | 239 | var sumData = new List<ChartsDataModel>(); |
| 221 | 240 | |
| @@ -275,6 +294,9 @@ namespace UI.ViewModels | ||
| 275 | 294 | totalTime_ = totalUse; |
| 276 | 295 | TotalHours = Time.ToHoursString(totalUse); |
| 277 | 296 | LoadTopData(); |
| 297 | 新增: | |
| 298 | 新增: // 网页数据 | |
| 299 | 新增: LoadWebData(Date, Date); | |
| 278 | 300 | }); |
| 279 | 301 | } |
| 280 | 302 | |
| @@ -284,6 +306,8 @@ namespace UI.ViewModels | ||
| 284 | 306 | private void LoadWeekData() |
| 285 | 307 | { |
| 286 | 308 | ColumnSelectedIndex = -1; |
| 309 | 新增: WebColSelectedIndex = -1; | |
| 310 | 新增: | |
| 287 | 311 | DataMaximum = 0; |
| 288 | 312 | Task.Run(() => |
| 289 | 313 | { |
| @@ -352,6 +376,9 @@ namespace UI.ViewModels | ||
| 352 | 376 | double totalUse = Data.Sum(m => m.Values.Sum()); |
| 353 | 377 | totalTime_ = totalUse; |
| 354 | 378 | TotalHours = Time.ToHoursString(totalUse); |
| 379 | 新增: | |
| 380 | 新增: // 网页数据 | |
| 381 | 新增: LoadWebData(weekDateArr[0], weekDateArr[1]); | |
| 355 | 382 | }); |
| 356 | 383 | |
| 357 | 384 | |
| @@ -365,6 +392,7 @@ namespace UI.ViewModels | ||
| 365 | 392 | private void LoadMonthlyData() |
| 366 | 393 | { |
| 367 | 394 | ColumnSelectedIndex = -1; |
| 395 | 新增: WebColSelectedIndex = -1; | |
| 368 | 396 | DataMaximum = 0; |
| 369 | 397 | Task.Run(() => |
| 370 | 398 | { |
| @@ -427,6 +455,9 @@ namespace UI.ViewModels | ||
| 427 | 455 | totalTime_ = totalUse; |
| 428 | 456 | TotalHours = Time.ToHoursString(totalUse); |
| 429 | 457 | LoadTopData(); |
| 458 | 新增: | |
| 459 | 新增: // 网页数据 | |
| 460 | 新增: LoadWebData(dateArr[0], dateArr[1]); | |
| 430 | 461 | }); |
| 431 | 462 | |
| 432 | 463 | } |
| @@ -437,6 +468,8 @@ namespace UI.ViewModels | ||
| 437 | 468 | private void LoadYearData() |
| 438 | 469 | { |
| 439 | 470 | ColumnSelectedIndex = -1; |
| 471 | 新增: WebColSelectedIndex = -1; | |
| 472 | 新增: | |
| 440 | 473 | DataMaximum = 0; |
| 441 | 474 | Task.Run(() => |
| 442 | 475 | { |
| @@ -509,6 +542,10 @@ namespace UI.ViewModels | ||
| 509 | 542 | totalTime_ = totalUse; |
| 510 | 543 | TotalHours = Time.ToHoursString(totalUse); |
| 511 | 544 | LoadTopData(); |
| 545 | 新增: | |
| 546 | 新增: // 网页数据 | |
| 547 | 新增: var dateArr = Time.GetYearDate(YearDate); | |
| 548 | 新增: LoadWebData(dateArr[0], dateArr[1]); | |
| 512 | 549 | }); |
| 513 | 550 | } |
| 514 | 551 | |
| @@ -572,7 +609,6 @@ namespace UI.ViewModels | ||
| 572 | 609 | var weekDateArr = Time.GetLastWeekDate(); |
| 573 | 610 | dateStart = weekDateArr[0]; |
| 574 | 611 | dateEnd = weekDateArr[1]; |
| 575 | 删除: | |
| 576 | 612 | } |
| 577 | 613 | else if (TabbarSelectedIndex == 2) |
| 578 | 614 | { |
| @@ -631,6 +667,10 @@ namespace UI.ViewModels | ||
| 631 | 667 | DiffAppCountType = "0"; |
| 632 | 668 | } |
| 633 | 669 | 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); | |
| 634 | 674 | } |
| 635 | 675 | |
| 636 | 676 | private List<ChartsDataModel> MapToChartsData(IEnumerable<Core.Models.DailyLogModel> list) |
| @@ -734,5 +774,193 @@ namespace UI.ViewModels | ||
| 734 | 774 | } |
| 735 | 775 | |
| 736 | 776 | |
| 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 | |
| 737 | 965 | } |
| 738 | 966 | } |
| @@ -15,6 +15,7 @@ using UI.Controls.Charts.Model; | ||
| 15 | 15 | using UI.Models; |
| 16 | 16 | using UI.Servicers; |
| 17 | 17 | using UI.Views; |
| 18 | 新增:using static UI.Controls.SettingPanel.SettingPanel; | |
| 18 | 19 | |
| 19 | 20 | namespace UI.ViewModels |
| 20 | 21 | { |
| @@ -25,13 +26,17 @@ namespace UI.ViewModels | ||
| 25 | 26 | private readonly MainViewModel main; |
| 26 | 27 | private readonly IAppContextMenuServicer appContextMenuServicer; |
| 27 | 28 | private readonly IAppConfig appConfig; |
| 29 | 新增: private readonly IWebData _webData; | |
| 30 | 新增: private readonly IWebSiteContextMenuServicer _webSiteContextMenu; | |
| 28 | 31 | |
| 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) | |
| 30 | 33 | { |
| 31 | 34 | this.data = data; |
| 32 | 35 | this.main = main; |
| 33 | 36 | this.appContextMenuServicer = appContextMenuServicer; |
| 34 | 37 | this.appConfig = appConfig; |
| 38 | 新增: _webData = webData; | |
| 39 | 新增: _webSiteContextMenu = webSiteContextMenu; | |
| 35 | 40 | |
| 36 | 41 | ToDetailCommand = new Command(new Action<object>(OnTodetailCommand)); |
| 37 | 42 | |
| @@ -71,6 +76,11 @@ namespace UI.ViewModels | ||
| 71 | 76 | main.Data = model.AppModel; |
| 72 | 77 | main.Uri = nameof(DetailPage); |
| 73 | 78 | } |
| 79 | 新增: else | |
| 80 | 新增: { | |
| 81 | 新增: main.Data = data.Data as Core.Models.Db.WebSiteModel; | |
| 82 | 新增: main.Uri = nameof(WebSiteDetailPage); | |
| 83 | 新增: } | |
| 74 | 84 | } |
| 75 | 85 | } |
| 76 | 86 | |
| @@ -81,18 +91,15 @@ namespace UI.ViewModels | ||
| 81 | 91 | { |
| 82 | 92 | LoadData(DayDate); |
| 83 | 93 | } |
| 84 | 删除: | |
| 85 | 删除: if (e.PropertyName == nameof(MonthDate)) | |
| 94 | 新增: else if (e.PropertyName == nameof(MonthDate)) | |
| 86 | 95 | { |
| 87 | 96 | LoadData(MonthDate); |
| 88 | 97 | } |
| 89 | 删除: | |
| 90 | 删除: if (e.PropertyName == nameof(YearDate)) | |
| 98 | 新增: else if (e.PropertyName == nameof(YearDate)) | |
| 91 | 99 | { |
| 92 | 100 | LoadData(YearDate); |
| 93 | 101 | } |
| 94 | 删除: | |
| 95 | 删除: if (e.PropertyName == nameof(TabbarSelectedIndex)) | |
| 102 | 新增: else if (e.PropertyName == nameof(TabbarSelectedIndex)) | |
| 96 | 103 | { |
| 97 | 104 | if (TabbarSelectedIndex == 0) |
| 98 | 105 | { |
| @@ -100,10 +107,6 @@ namespace UI.ViewModels | ||
| 100 | 107 | { |
| 101 | 108 | DayDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day); |
| 102 | 109 | } |
| 103 | 删除: //else | |
| 104 | 删除: //{ | |
| 105 | 删除: // LoadData(DayDate); | |
| 106 | 删除: //} | |
| 107 | 110 | |
| 108 | 111 | } |
| 109 | 112 | else if (TabbarSelectedIndex == 1) |
| @@ -112,10 +115,6 @@ namespace UI.ViewModels | ||
| 112 | 115 | { |
| 113 | 116 | MonthDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1); |
| 114 | 117 | } |
| 115 | 删除: //else | |
| 116 | 删除: //{ | |
| 117 | 删除: // LoadData(MonthDate); | |
| 118 | 删除: //} | |
| 119 | 118 | } |
| 120 | 119 | else if (TabbarSelectedIndex == 2) |
| 121 | 120 | { |
| @@ -123,10 +122,20 @@ namespace UI.ViewModels | ||
| 123 | 122 | { |
| 124 | 123 | YearDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1); |
| 125 | 124 | } |
| 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(); | |
| 130 | 139 | } |
| 131 | 140 | } |
| 132 | 141 | } |
| @@ -138,41 +147,54 @@ namespace UI.ViewModels | ||
| 138 | 147 | |
| 139 | 148 | |
| 140 | 149 | |
| 141 | 删除: private async void LoadData(DateTime date) | |
| 150 | 新增: private async void LoadData(DateTime date, int dataType_ = -1) | |
| 142 | 151 | { |
| 143 | 删除: | |
| 144 | 152 | await Task.Run(() => |
| 145 | 153 | { |
| 146 | 154 | DateTime dateStart = date, dateEnd = date; |
| 147 | 删除: if (TabbarSelectedIndex == 1) | |
| 155 | 新增: | |
| 156 | 新增: dataType_ = dataType_ == -1 ? TabbarSelectedIndex : dataType_; | |
| 157 | 新增: | |
| 158 | 新增: if (dataType_ == 1) | |
| 148 | 159 | { |
| 149 | 160 | dateStart = new DateTime(date.Year, date.Month, 1); |
| 150 | 161 | dateEnd = new DateTime(date.Year, date.Month, DateTime.DaysInMonth(date.Year, date.Month)); |
| 151 | 162 | } |
| 152 | 删除: else if (TabbarSelectedIndex == 0) | |
| 163 | 新增: else if (dataType_ == 0) | |
| 153 | 164 | { |
| 154 | 165 | dateStart = new DateTime(date.Year, date.Month, date.Day, 0, 0, 0); |
| 155 | 166 | dateEnd = new DateTime(date.Year, date.Month, date.Day, 23, 59, 59); |
| 156 | 167 | } |
| 157 | 删除: else if (TabbarSelectedIndex == 2) | |
| 168 | 新增: else if (dataType_ == 2) | |
| 158 | 169 | { |
| 159 | 170 | dateStart = new DateTime(date.Year, 1, 1, 0, 0, 0); |
| 160 | 171 | dateEnd = new DateTime(date.Year, 12, DateTime.DaysInMonth(date.Year, 12), 23, 59, 59); |
| 161 | 172 | } |
| 162 | 173 | |
| 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 | 新增: | |
| 164 | 186 | |
| 165 | 删除: if (TabbarSelectedIndex == 0) | |
| 187 | 新增: if (dataType_ == 0) | |
| 166 | 188 | { |
| 167 | 删除: Data = MapToChartsData(list); | |
| 189 | 新增: Data = chartData; | |
| 168 | 190 | } |
| 169 | 删除: else if (TabbarSelectedIndex == 1) | |
| 191 | 新增: else if (dataType_ == 1) | |
| 170 | 192 | { |
| 171 | 删除: MonthData = MapToChartsData(list); | |
| 193 | 新增: MonthData = chartData; | |
| 172 | 194 | } |
| 173 | 195 | else |
| 174 | 196 | { |
| 175 | 删除: YearData = MapToChartsData(list); | |
| 197 | 新增: YearData = chartData; | |
| 176 | 198 | } |
| 177 | 199 | |
| 178 | 200 | }); |
| @@ -212,6 +234,40 @@ namespace UI.ViewModels | ||
| 212 | 234 | |
| 213 | 235 | return resData; |
| 214 | 236 | } |
| 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 | 新增: } | |
| 215 | 271 | #endregion |
| 216 | 272 | #endregion |
| 217 | 273 | } |
| @@ -1,6 +1,7 @@ | ||
| 1 | 1 | using Core.Librarys; |
| 2 | 2 | using Core.Librarys.Image; |
| 3 | 3 | using Core.Models; |
| 4 | 新增:using Core.Models.Db; | |
| 4 | 5 | using Core.Servicers.Interfaces; |
| 5 | 6 | using System; |
| 6 | 7 | using System.Collections.Generic; |
| @@ -13,6 +14,7 @@ using System.Windows; | ||
| 13 | 14 | using System.Windows.Media.Imaging; |
| 14 | 15 | using UI.Controls; |
| 15 | 16 | using UI.Controls.Charts.Model; |
| 17 | 新增:using UI.Controls.Select; | |
| 16 | 18 | using UI.Models; |
| 17 | 19 | using UI.Servicers; |
| 18 | 20 | using UI.Views; |
| @@ -29,8 +31,18 @@ namespace UI.ViewModels | ||
| 29 | 31 | private readonly IAppContextMenuServicer appContextMenuServicer; |
| 30 | 32 | private readonly IInputServicer inputServicer; |
| 31 | 33 | private readonly IAppConfig appConfig; |
| 34 | 新增: private readonly IWebData _webData; | |
| 35 | 新增: private readonly IWebSiteContextMenuServicer _webSiteContextMenu; | |
| 36 | 新增: public List<SelectItemModel> MoreTypeOptions { get; set; } | |
| 32 | 37 | 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_) | |
| 34 | 46 | { |
| 35 | 47 | this.data = data; |
| 36 | 48 | this.main = main; |
| @@ -38,6 +50,8 @@ namespace UI.ViewModels | ||
| 38 | 50 | this.appContextMenuServicer = appContextMenuServicer; |
| 39 | 51 | this.inputServicer = inputServicer; |
| 40 | 52 | this.appConfig = appConfig; |
| 53 | 新增: _webData = webData_; | |
| 54 | 新增: _webSiteContextMenu = webSiteContext_; | |
| 41 | 55 | |
| 42 | 56 | ToDetailCommand = new Command(new Action<object>(OnTodetailCommand)); |
| 43 | 57 | RefreshCommand = new Command(new Action<object>(OnRefreshCommand)); |
| @@ -65,11 +79,26 @@ namespace UI.ViewModels | ||
| 65 | 79 | |
| 66 | 80 | TabbarSelectedIndex = 0; |
| 67 | 81 | AppContextMenu = appContextMenuServicer.GetContextMenu(); |
| 68 | 删除: | |
| 82 | 新增: WebSiteContextMenu = _webSiteContextMenu.GetContextMenu(); | |
| 69 | 83 | PropertyChanged += IndexPageVM_PropertyChanged; |
| 70 | 84 | inputServicer.OnKeyUpInput += InputServicer_OnKeyUpInput; |
| 71 | 85 | |
| 72 | 86 | 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]; | |
| 73 | 102 | } |
| 74 | 103 | |
| 75 | 104 | private void InputServicer_OnKeyUpInput(object sender, System.Windows.Forms.Keys key) |
| @@ -87,11 +116,19 @@ namespace UI.ViewModels | ||
| 87 | 116 | |
| 88 | 117 | if (data != null) |
| 89 | 118 | { |
| 90 | 删除: var model = data.Data as DailyLogModel; | |
| 91 | 删除: if (model != null && model.AppModel != null) | |
| 119 | 新增: if (data.Data is DailyLogModel) | |
| 92 | 120 | { |
| 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); | |
| 95 | 132 | } |
| 96 | 133 | |
| 97 | 134 | } |
| @@ -120,10 +157,12 @@ namespace UI.ViewModels | ||
| 120 | 157 | if (TabbarSelectedIndex == 0) |
| 121 | 158 | { |
| 122 | 159 | LoadTodayData(); |
| 160 | 新增: LoadTodayMoreData(); | |
| 123 | 161 | } |
| 124 | 162 | else if (TabbarSelectedIndex == 1) |
| 125 | 163 | { |
| 126 | 164 | LoadThisWeekData(); |
| 165 | 新增: LoadThisWeekMoreData(); | |
| 127 | 166 | } |
| 128 | 167 | //else |
| 129 | 168 | //{ |
| @@ -140,12 +179,26 @@ namespace UI.ViewModels | ||
| 140 | 179 | { |
| 141 | 180 | var list = data.GetDateRangelogList(DateTime.Now.Date, DateTime.Now.Date); |
| 142 | 181 | var res = MapToChartsData(list); |
| 182 | 新增: var topWebList = _webData.GetDateRangeWebSiteList(DateTime.Now, DateTime.Now, FrequentUseNum); | |
| 183 | 新增: | |
| 143 | 184 | IsLoading = false; |
| 144 | 185 | WeekData = res; |
| 186 | 新增: WebFrequentUseData = MapToChartsData(topWebList); | |
| 145 | 187 | }); |
| 188 | 新增: } | |
| 146 | 189 | |
| 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); | |
| 147 | 197 | |
| 148 | 删除: | |
| 198 | 新增: IsLoading = false; | |
| 199 | 新增: AppMoreData = MapToChartsData(appMoreData); | |
| 200 | 新增: WebMoreData = MapToChartsData(webMoreData); | |
| 201 | 新增: }); | |
| 149 | 202 | } |
| 150 | 203 | #endregion |
| 151 | 204 | |
| @@ -158,12 +211,31 @@ namespace UI.ViewModels | ||
| 158 | 211 | { |
| 159 | 212 | var list = data.GetThisWeeklogList(); |
| 160 | 213 | var res = MapToChartsData(list); |
| 214 | 新增: | |
| 215 | 新增: var week = Time.GetThisWeekDate(); | |
| 216 | 新增: var topWebList = _webData.GetDateRangeWebSiteList(week[0], week[1], FrequentUseNum); | |
| 217 | 新增: | |
| 161 | 218 | IsLoading = false; |
| 162 | 219 | WeekData = res; |
| 220 | 新增: WebFrequentUseData = MapToChartsData(topWebList); | |
| 163 | 221 | }); |
| 164 | 222 | |
| 165 | 223 | |
| 166 | 224 | |
| 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 | 新增: }); | |
| 167 | 239 | } |
| 168 | 240 | #endregion |
| 169 | 241 | |
| @@ -211,6 +283,24 @@ namespace UI.ViewModels | ||
| 211 | 283 | |
| 212 | 284 | return resData; |
| 213 | 285 | } |
| 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 | 新增: } | |
| 214 | 304 | #endregion |
| 215 | 305 | #endregion |
| 216 | 306 | } |
| @@ -129,5 +129,30 @@ namespace UI.ViewModels | ||
| 129 | 129 | IsShowToast = true; |
| 130 | 130 | |
| 131 | 131 | } |
| 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 | 新增: } | |
| 132 | 157 | } |
| 133 | 158 | } |
| @@ -22,16 +22,18 @@ namespace UI.ViewModels | ||
| 22 | 22 | private readonly IAppConfig appConfig; |
| 23 | 23 | private readonly MainViewModel mainVM; |
| 24 | 24 | private readonly IData data; |
| 25 | 新增: private readonly IWebData _webData; | |
| 25 | 26 | public Command OpenURL { get; set; } |
| 26 | 27 | public Command CheckUpdate { get; set; } |
| 27 | 28 | public Command DelDataCommand { get; set; } |
| 28 | 29 | public Command ExportDataCommand { get; set; } |
| 29 | 30 | |
| 30 | 删除: public SettingPageVM(IAppConfig appConfig, MainViewModel mainVM, IData data) | |
| 31 | 新增: public SettingPageVM(IAppConfig appConfig, MainViewModel mainVM, IData data, IWebData webData) | |
| 31 | 32 | { |
| 32 | 33 | this.appConfig = appConfig; |
| 33 | 34 | this.mainVM = mainVM; |
| 34 | 35 | this.data = data; |
| 36 | 新增: _webData = webData; | |
| 35 | 37 | |
| 36 | 38 | OpenURL = new Command(new Action<object>(OnOpenURL)); |
| 37 | 39 | CheckUpdate = new Command(new Action<object>(OnCheckUpdate)); |
| @@ -171,6 +173,7 @@ namespace UI.ViewModels | ||
| 171 | 173 | } |
| 172 | 174 | |
| 173 | 175 | data.ClearRange(DelDataStartMonthDate, DelDataEndMonthDate); |
| 176 | 新增: _webData.Clear(DelDataStartMonthDate, DelDataEndMonthDate); | |
| 174 | 177 | |
| 175 | 178 | mainVM.Toast("操作已完成", Controls.Window.ToastType.Success); |
| 176 | 179 | } |
| @@ -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 | 新增:} | |
| @@ -98,7 +98,7 @@ | ||
| 98 | 98 | <RowDefinition Height="*"/> |
| 99 | 99 | </Grid.RowDefinitions> |
| 100 | 100 | <StackPanel Orientation="Horizontal" Margin="0,0,0,20"> |
| 101 | 删除: <TextBlock FontSize="18" Text="分类"/> | |
| 101 | 新增: <TextBlock FontSize="18" Text="应用分类"/> | |
| 102 | 102 | <base:Icon IconType="ChevronRightMed" Margin="10,0" FontSize="12" Foreground="#ccc"/> |
| 103 | 103 | <TextBlock FontSize="18" Text="{Binding Category.Data.Name}"/> |
| 104 | 104 | |
| @@ -1,4 +1,4 @@ | ||
| 1 | 删除:<Page x:Class="UI.Views.CategoryPage" | |
| 1 | 新增:<c:TPage x:Class="UI.Views.CategoryPage" | |
| 2 | 2 | xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" |
| 3 | 3 | xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" |
| 4 | 4 | xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" |
| @@ -6,16 +6,23 @@ | ||
| 6 | 6 | 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" |
| 7 | 7 | mc:Ignorable="d" |
| 8 | 8 | xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:converter="clr-namespace:UI.Controls.Converters" |
| 9 | 新增: xmlns:c="clr-namespace:UI.Controls" | |
| 9 | 10 | d:DesignHeight="450" d:DesignWidth="800" |
| 10 | 删除: Title="CategoryPage" Foreground="{DynamicResource StandardTextBrush}"> | |
| 11 | 新增: Title="CategoryPage" Foreground="{DynamicResource StandardTextBrush}" IsFillPage="True"> | |
| 11 | 12 | |
| 12 | 13 | |
| 13 | 14 | <Grid> |
| 14 | 删除: | |
| 15 | 新增: | |
| 15 | 16 | <!--编辑--> |
| 16 | 17 | <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 | 新增: | |
| 19 | 26 | <Grid> |
| 20 | 27 | <Grid.RowDefinitions> |
| 21 | 28 | <RowDefinition Height="40"/> |
| @@ -24,13 +31,18 @@ | ||
| 24 | 31 | |
| 25 | 32 | </Grid.RowDefinitions> |
| 26 | 33 | <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> | |
| 28 | 40 | <Button:IconButton Foreground="#ccc" Icon="ChromeClose" HorizontalAlignment="Right" FontSize="12" Margin="0,0,10,0" Command="{Binding EditCloseCommand}"/> |
| 29 | 41 | </Grid> |
| 30 | 42 | <!--<TextBlock Text="编辑" VerticalAlignment="Center" Margin="10,0,0,0"/>--> |
| 31 | 43 | <ScrollViewer Grid.Row="1"> |
| 32 | 删除: <StackPanel Grid.Row="1" Margin="10"> | |
| 33 | 删除: <TextBlock Text="分类名称"/> | |
| 44 | 新增: <StackPanel Grid.Row="1" Margin="10"> | |
| 45 | 新增: <TextBlock Text="分类名称"/> | |
| 34 | 46 | |
| 35 | 47 | <Grid> |
| 36 | 48 | <Grid.ColumnDefinitions> |
| @@ -41,10 +53,10 @@ | ||
| 41 | 53 | |
| 42 | 54 | <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="请输入分类名称"/> |
| 43 | 55 | </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> | |
| 48 | 60 | </ScrollViewer> |
| 49 | 61 | <Button:Button Grid.Row="2" HorizontalAlignment="Right" Text="?创建:更新" Value="{Binding IsCreate}" Width="120" Margin="0,0,10,0" VerticalAlignment="Center" Command="{Binding EditDoneCommand}"> |
| 50 | 62 | |
| @@ -58,133 +70,285 @@ | ||
| 58 | 70 | |
| 59 | 71 | |
| 60 | 72 | <!--主内容--> |
| 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> | |
| 63 | 79 | <ContextMenu> |
| 64 | 删除: | |
| 80 | 新增: <MenuItem Header="刷新" Command="{Binding RefreshCommand}" /> | |
| 81 | 新增: <Separator/> | |
| 65 | 82 | <MenuItem Header="新建分类" Command="{Binding EditCommand}" /> |
| 66 | 83 | </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> | |
| 100 | 93 | |
| 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"> | |
| 101 | 104 | <Setter Property="Template"> |
| 102 | 105 | <Setter.Value> |
| 103 | 删除: <ControlTemplate TargetType="{x:Type ListView}"> | |
| 104 | 删除: <Border> | |
| 105 | 删除: <ItemsPresenter /> | |
| 106 | 删除: </Border> | |
| 106 | 新增: <ControlTemplate TargetType="TabItem"> | |
| 107 | 107 | </ControlTemplate> |
| 108 | 108 | </Setter.Value> |
| 109 | 109 | </Setter> |
| 110 | 110 | </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> | |
| 137 | 111 | |
| 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}"> | |
| 171 | 213 | <Run Text="×"/> |
| 172 | 214 | |
| 173 | 215 | <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> | |
| 175 | 307 | |
| 176 | 删除: </Border> | |
| 177 | 308 | |
| 178 | 删除: </Border> | |
| 179 | 删除: </Grid> | |
| 180 | 删除: </Border> | |
| 309 | 新增: <WrapPanel Orientation="Vertical"> | |
| 310 | 新增: <Border Width="150" Height="150"> | |
| 181 | 311 | |
| 182 | 删除: </WrapPanel> | |
| 183 | 删除: </DataTemplate> | |
| 184 | 删除: </ListView.ItemTemplate> | |
| 185 | 删除: </ListView> | |
| 312 | 新增: <Grid> | |
| 313 | 新增: <Grid.RowDefinitions> | |
| 314 | 新增: <RowDefinition Height="40"/> | |
| 186 | 315 | |
| 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> | |
| 188 | 352 | |
| 189 | 353 | </Grid> |
| 190 | 删除:</Page> | |
| 354 | 新增:</c:TPage> | |
| @@ -12,6 +12,7 @@ using System.Windows.Media; | ||
| 12 | 12 | using System.Windows.Media.Imaging; |
| 13 | 13 | using System.Windows.Navigation; |
| 14 | 14 | using System.Windows.Shapes; |
| 15 | 新增:using UI.Controls; | |
| 15 | 16 | using UI.ViewModels; |
| 16 | 17 | |
| 17 | 18 | namespace UI.Views |
| @@ -19,7 +20,7 @@ namespace UI.Views | ||
| 19 | 20 | /// <summary> |
| 20 | 21 | /// CategoryPage.xaml 的交互逻辑 |
| 21 | 22 | /// </summary> |
| 22 | 删除: public partial class CategoryPage : Page | |
| 23 | 新增: public partial class CategoryPage : TPage | |
| 23 | 24 | { |
| 24 | 25 | public CategoryPage(CategoryPageVM vm) |
| 25 | 26 | { |
| @@ -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> | |
| @@ -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 | 新增:} | |
| @@ -3,7 +3,7 @@ | ||
| 3 | 3 | xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" |
| 4 | 4 | xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" |
| 5 | 5 | 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" | |
| 7 | 7 | mc:Ignorable="d" |
| 8 | 8 | d:DesignHeight="450" d:DesignWidth="800" |
| 9 | 9 | Title="ChartPage" Foreground="{DynamicResource StandardTextBrush}" Background="Transparent"> |
| @@ -13,7 +13,10 @@ | ||
| 13 | 13 | </ContextMenu> |
| 14 | 14 | </Page.ContextMenu> |
| 15 | 15 | <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> | |
| 17 | 20 | <Tabbar:Tabbar Data="{Binding TabbarData}" SelectedIndex="{Binding TabbarSelectedIndex,Mode=TwoWay}" Width="180" HorizontalAlignment="Left"/> |
| 18 | 21 | <Border Margin="0,15,0,0"> |
| 19 | 22 | <Grid> |
| @@ -42,217 +45,238 @@ | ||
| 42 | 45 | </Grid> |
| 43 | 46 | </Border> |
| 44 | 47 | |
| 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}"/> | |
| 75 | 99 | <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}"/> | |
| 78 | 102 | |
| 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}"/> | |
| 119 | 143 | <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}"/> | |
| 122 | 146 | |
| 123 | 147 | |
| 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}"/> | |
| 166 | 190 | <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"> | |
| 172 | 196 | <Border.Background> |
| 173 | 197 | <ImageBrush Stretch="Fill" x:Name="image" ImageSource="{Binding Top1App.IconFile}"/> |
| 174 | 198 | </Border.Background> |
| 175 | 199 | </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> | |
| 182 | 204 | |
| 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> | |
| 211 | 206 | |
| 212 | 删除: </StackPanel> | |
| 213 | 207 | </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> | |
| 224 | 211 | |
| 225 | 删除: </Grid> | |
| 212 | 新增: <WrapPanel Margin="-10"> | |
| 226 | 213 | |
| 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"/>--> | |
| 227 | 221 | |
| 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"/> | |
| 234 | 235 | |
| 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> | |
| 238 | 248 | |
| 239 | 删除: </Border> | |
| 240 | 删除: </Grid> | |
| 249 | 新增: </Grid> | |
| 241 | 250 | |
| 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> | |
| 254 | 251 | |
| 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"> | |
| 256 | 280 | <Grid.ColumnDefinitions> |
| 257 | 281 | <ColumnDefinition Width="*"/> |
| 258 | 282 | <ColumnDefinition Width="*"/> |
| @@ -281,6 +305,247 @@ | ||
| 281 | 305 | </Grid>--> |
| 282 | 306 | |
| 283 | 307 | |
| 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> | |
| 285 | 550 | </StackPanel> |
| 286 | 551 | </Page> |
| @@ -1,13 +1,14 @@ | ||
| 1 | 删除:<Page | |
| 1 | 新增:<control:TPage | |
| 2 | 2 | xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" |
| 3 | 3 | xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" |
| 4 | 4 | xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" |
| 5 | 5 | xmlns:d="http://schemas.microsoft.com/expression/blend/2008" |
| 6 | 6 | xmlns:local="clr-namespace:UI.Views" |
| 7 | 7 | 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" | |
| 8 | 9 | mc:Ignorable="d" |
| 9 | 10 | d:DesignHeight="450" d:DesignWidth="800" |
| 10 | 删除: Title="IndexPage" Foreground="{DynamicResource StandardTextBrush}"> | |
| 11 | 新增: Title="IndexPage" Foreground="{DynamicResource StandardTextBrush}" IsFillPage="True"> | |
| 11 | 12 | <Grid Margin="20"> |
| 12 | 13 | <Grid.RowDefinitions> |
| 13 | 14 | <RowDefinition Height="auto"/> |
| @@ -15,8 +16,11 @@ | ||
| 15 | 16 | <RowDefinition Height="*"/> |
| 16 | 17 | |
| 17 | 18 | </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> | |
| 20 | 24 | <Tabbar:Tabbar Width="145" HorizontalAlignment="Left" Grid.Row="1" Data="{Binding TabbarData}" SelectedIndex="{Binding TabbarSelectedIndex,Mode=TwoWay}"/> |
| 21 | 25 | |
| 22 | 26 | |
| @@ -49,7 +53,7 @@ | ||
| 49 | 53 | <select:DateSelect Date="{Binding DayDate,Mode=TwoWay}"/> |
| 50 | 54 | <!--<DatePickerBar:DatePickerBar SelectedDate="{Binding DayDate,Mode=TwoWay}" ShowType="Day"/>--> |
| 51 | 55 | |
| 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}"/> | |
| 53 | 57 | </Grid> |
| 54 | 58 | </TabItem> |
| 55 | 59 | <TabItem> |
| @@ -61,7 +65,7 @@ | ||
| 61 | 65 | </Grid.RowDefinitions> |
| 62 | 66 | <!--<DatePickerBar:DatePickerBar SelectedDate="{Binding MonthDate,Mode=TwoWay}" ShowType="Month"/>--> |
| 63 | 67 | <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}"/> | |
| 65 | 69 | </Grid> |
| 66 | 70 | </TabItem> |
| 67 | 71 | <TabItem> |
| @@ -74,7 +78,7 @@ | ||
| 74 | 78 | <!--<DatePickerBar:DatePickerBar SelectedDate="{Binding YearDate,Mode=TwoWay}" ShowType="Year"/>--> |
| 75 | 79 | <select:DateSelect Date="{Binding YearDate,Mode=TwoWay}" SelectType="Year"/> |
| 76 | 80 | |
| 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}"/> | |
| 78 | 82 | </Grid> |
| 79 | 83 | </TabItem> |
| 80 | 84 | </TabControl> |
| @@ -82,4 +86,4 @@ | ||
| 82 | 86 | |
| 83 | 87 | |
| 84 | 88 | </Grid> |
| 85 | 删除:</Page> | |
| 89 | 新增:</control:TPage> | |
| @@ -14,6 +14,7 @@ using System.Windows.Media.Imaging; | ||
| 14 | 14 | using System.Windows.Navigation; |
| 15 | 15 | using System.Windows.Shapes; |
| 16 | 16 | using System.Windows.Threading; |
| 17 | 新增:using UI.Controls; | |
| 17 | 18 | using UI.Controls.Charts.Model; |
| 18 | 19 | using UI.ViewModels; |
| 19 | 20 | |
| @@ -22,7 +23,7 @@ namespace UI.Views | ||
| 22 | 23 | /// <summary> |
| 23 | 24 | /// IndexPage.xaml 的交互逻辑 |
| 24 | 25 | /// </summary> |
| 25 | 删除: public partial class DataPage : Page | |
| 26 | 新增: public partial class DataPage : TPage | |
| 26 | 27 | { |
| 27 | 28 | public DataPage(DataPageVM vm) |
| 28 | 29 | { |
| @@ -16,7 +16,7 @@ | ||
| 16 | 16 | </ContextMenu> |
| 17 | 17 | </Page.ContextMenu> |
| 18 | 18 | <StackPanel Margin="20"> |
| 19 | 删除: <TextBlock Text="查看" FontSize="18" Margin="0,0,0,20"/> | |
| 19 | 新增: <TextBlock Text="应用" FontSize="18" Margin="0,0,0,20"/> | |
| 20 | 20 | |
| 21 | 21 | <Border |
| 22 | 22 | Background="{DynamicResource SettingPanelBgBrush}" |
| @@ -140,7 +140,7 @@ | ||
| 140 | 140 | |
| 141 | 141 | <WrapPanel Margin="-10"> |
| 142 | 142 | <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"/> | |
| 144 | 144 | |
| 145 | 145 | <Border Margin="0,10,0,0" Width="680" HorizontalAlignment="Left" Background="{DynamicResource SettingPanelBgBrush}" Padding="20" CornerRadius="10"> |
| 146 | 146 | <StackPanel> |
| @@ -178,7 +178,7 @@ | ||
| 178 | 178 | </StackPanel> |
| 179 | 179 | |
| 180 | 180 | <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"/> | |
| 182 | 182 | |
| 183 | 183 | <Border |
| 184 | 184 | Background="{DynamicResource SettingPanelBgBrush}" |
| @@ -5,7 +5,8 @@ | ||
| 5 | 5 | xmlns:d="http://schemas.microsoft.com/expression/blend/2008" |
| 6 | 6 | xmlns:local="clr-namespace:UI.Views" |
| 7 | 7 | 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" | |
| 9 | 10 | d:DesignHeight="450" d:DesignWidth="800" |
| 10 | 11 | Title="IndexPage" |
| 11 | 12 | Foreground="{DynamicResource StandardTextBrush}" Background="Transparent"> |
| @@ -30,10 +31,99 @@ | ||
| 30 | 31 | </Border>--> |
| 31 | 32 | <TextBlock Text="概览" FontSize="18" Margin="0,5,0,20"/> |
| 32 | 33 | <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 | 新增: | |
| 37 | 127 | |
| 38 | 128 | |
| 39 | 129 | </StackPanel> |
| @@ -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> | |
| @@ -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 | 新增:} | |

