跳到主要内容

github/tai

公开

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

提交记录
修改Core/Core.csproj+7 −4看文件
@@ -73,9 +73,6 @@
7373 <HintPath>..\packages\SQLitePCLRaw.core.2.0.6\lib\netstandard2.0\SQLitePCLRaw.core.dll</HintPath>
7474 </Reference>
7575 <Reference Include="System" />
76删除: <Reference Include="System.Buffers, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
77删除: <HintPath>..\packages\System.Buffers.4.4.0\lib\netstandard2.0\System.Buffers.dll</HintPath>
78删除: </Reference>
7976 <Reference Include="System.ComponentModel.DataAnnotations" />
8077 <Reference Include="System.Core" />
8178 <Reference Include="System.Data.SQLite, Version=1.0.115.5, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=MSIL">
@@ -88,6 +85,7 @@
8885 <HintPath>..\packages\System.Data.SQLite.Linq.1.0.115.5\lib\net46\System.Data.SQLite.Linq.dll</HintPath>
8986 </Reference>
9087 <Reference Include="System.Drawing" />
88新增: <Reference Include="System.Management" />
9189 <Reference Include="System.Memory, Version=4.0.1.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
9290 <HintPath>..\packages\System.Memory.4.5.3\lib\netstandard2.0\System.Memory.dll</HintPath>
9391 </Reference>
@@ -98,6 +96,7 @@
9896 <Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
9997 <HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.4.5.2\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
10098 </Reference>
99新增: <Reference Include="System.Windows.Forms" />
101100 <Reference Include="System.Xml.Linq" />
102101 <Reference Include="System.Data.DataSetExtensions" />
103102 <Reference Include="Microsoft.CSharp" />
@@ -115,8 +114,10 @@
115114 <Compile Include="Librarys\Iconer.cs" />
116115 <Compile Include="Librarys\SQLite\SQLiteBuilder.cs" />
117116 <Compile Include="Librarys\SQLite\SQLiteConfiguration.cs" />
118删除: <Compile Include="Librarys\SQLite\StatisticContext.cs" />
117新增: <Compile Include="Librarys\SQLite\TaiDbContext.cs" />
119118 <Compile Include="Librarys\Win32API.cs" />
119新增: <Compile Include="Models\AppModel.cs" />
120新增: <Compile Include="Models\CategoryModel.cs" />
120121 <Compile Include="Models\Config\ConfigAttribute.cs" />
121122 <Compile Include="Models\Config\ConfigModel.cs" />
122123 <Compile Include="Models\Config\BehaviorModel.cs" />
@@ -126,6 +127,7 @@
126127 <Compile Include="Models\DailyLogModel.cs" />
127128 <Compile Include="Properties\AssemblyInfo.cs" />
128129 <Compile Include="Servicers\Instances\AppConfig.cs" />
130新增: <Compile Include="Servicers\Instances\AppData.cs" />
129131 <Compile Include="Servicers\Instances\Data.cs" />
130132 <Compile Include="Librarys\Logger.cs" />
131133 <Compile Include="Servicers\Instances\DateObserver.cs" />
@@ -133,6 +135,7 @@
133135 <Compile Include="Servicers\Instances\Observer.cs" />
134136 <Compile Include="Servicers\Instances\Sleepdiscover.cs" />
135137 <Compile Include="Servicers\Interfaces\IAppConfig.cs" />
138新增: <Compile Include="Servicers\Interfaces\IAppData.cs" />
136139 <Compile Include="Servicers\Interfaces\IData.cs" />
137140 <Compile Include="Servicers\Interfaces\IDateObserver.cs" />
138141 <Compile Include="Servicers\Interfaces\IMain.cs" />
改名Core/Librarys/SQLite/StatisticContext.cs → Core/Librarys/SQLite/TaiDbContext.cs+14 −3看文件
@@ -3,13 +3,14 @@ using System;
33using System.Collections.Generic;
44using System.Data.Entity;
55using System.Data.SQLite;
6新增:using System.Diagnostics;
67using System.Linq;
78using System.Text;
89using System.Threading.Tasks;
910
1011namespace Core.Librarys.SQLite
1112{
12删除: public class StatisticContext : DbContext
13新增: public class TaiDbContext : DbContext
1314 {
1415 /// <summary>
1516 /// 每日数据
@@ -20,13 +21,18 @@ namespace Core.Librarys.SQLite
2021 /// </summary>
2122 public DbSet<HoursLogModel> HoursLog { get; set; }
2223 public DbSet<AppModel> App { get; set; }
23删除:
24新增: /// <summary>
25新增: /// 分类
26新增: /// </summary>
27新增: public DbSet<CategoryModel> Categorys { get; set; }
2428 // public StatisticContext(string n)
2529 //: base("StatisticContext")
2630 // {
2731 // DbConfiguration.SetConfiguration(new SQLiteConfiguration());
2832 // }
29删除: public StatisticContext()
33新增:
34新增:
35新增: public TaiDbContext()
3036 : base(new SQLiteConnection()
3137 {
3238 ConnectionString = "Data Source=.\\Data\\data.db"
@@ -40,5 +46,10 @@ namespace Core.Librarys.SQLite
4046 var model = modelBuilder.Build(Database.Connection);
4147 new SQLiteBuilder(model).SelfCheck();
4248 }
49新增:
50新增: public void SelfCheck()
51新增: {
52新增: Database.ExecuteSqlCommand("select count(*) from sqlite_master where type='table' and name='tai'");
53新增: }
4354 }
4455}
文件末尾没有换行
新增Core/Models/AppModel.cs+50 −0看文件
@@ -0,0 +1,50 @@
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
10新增:{
11新增: /// <summary>
12新增: /// 应用信息模型
13新增: /// </summary>
14新增: public class AppModel
15新增: {
16新增:
17新增: [Key]
18新增: public int ID { get; set; }
19新增:
20新增: /// <summary>
21新增: /// 名称
22新增: /// </summary>
23新增: public string Name { get; set; }
24新增: /// <summary>
25新增: /// 描述
26新增: /// </summary>
27新增: public string Description { get; set; }
28新增: /// <summary>
29新增: /// 文件
30新增: /// </summary>
31新增: public string File { get; set; }
32新增:
33新增: /// <summary>
34新增: /// 分类ID
35新增: /// </summary>
36新增: public int CategoryID { get; set; }
37新增:
38新增: /// <summary>
39新增: /// 图标路径
40新增: /// </summary>
41新增: public string IconFile { get; set; }
42新增: /// <summary>
43新增: /// 累计使用时长
44新增: /// </summary>
45新增: public int TotalTime { get; set; }
46新增:
47新增: [ForeignKey("CategoryID")]
48新增: public virtual CategoryModel Category { get; set; }
49新增: }
50新增:}
修改Core/Models/DailyLogModel.cs+16 −10看文件
@@ -1,5 +1,6 @@
11using System;
22using System.Collections.Generic;
3新增:using System.ComponentModel.DataAnnotations.Schema;
34using System.Linq;
45using System.Text;
56using System.Threading.Tasks;
@@ -21,16 +22,21 @@ namespace Core.Models
2122 /// </summary>
2223 public int Time { get; set; } = 0;
2324 /// <summary>
24删除: /// 进程名称
25新增: /// 应用ID
2526 /// </summary>
26删除: public string ProcessName { get; set; }
27删除: /// <summary>
28删除: /// 进程描述
29删除: /// </summary>
30删除: public string ProcessDescription { get; set; }
31删除: /// <summary>
32删除: /// 进程文件
33删除: /// </summary>
34删除: public string File { get; set; }
27新增: public int AppModelID { get; set; }
28新增: ///// <summary>
29新增: ///// 进程名称
30新增: ///// </summary>
31新增: //public string ProcessName { get; set; }
32新增: ///// <summary>
33新增: ///// 进程描述
34新增: ///// </summary>
35新增: //public string ProcessDescription { get; set; }
36新增: ///// <summary>
37新增: ///// 进程文件
38新增: ///// </summary>
39新增: //public string File { get; set; }
40新增: public virtual AppModel AppModel { get; set; }
3541 }
3642}
修改Core/Models/HoursLogModel.cs+15 −7看文件
@@ -20,14 +20,22 @@ namespace Core.Models
2020 /// 使用时长(单位:秒)
2121 /// </summary>
2222 public int Time { get; set; } = 0;
23新增: ///// <summary>
24新增: ///// 【已弃用】进程名称
25新增: ///// </summary>
26新增: //public string ProcessName { get; set; }
27新增:
28新增: ///// <summary>
29新增: ///// 【已弃用】进程文件(记录以防止进程名称重复)
30新增: ///// </summary>
31新增: //public string File { get; set; }
32新增:
2333 /// <summary>
24删除: /// 进程名称
25删除: /// </summary>
26删除: public string ProcessName { get; set; }
27删除:
28删除: /// <summary>
29删除: /// 进程文件(记录以防止进程名称重复)
34新增: /// 应用ID
3035 /// </summary>
31删除: public string File { get; set; }
36新增: public int AppModelID { get; set; }
37新增:
38新增: public virtual AppModel AppModel { get; set; }
39新增:
3240 }
3341}
新增Core/Servicers/Instances/AppData.cs+126 −0看文件
@@ -0,0 +1,126 @@
1新增:using Core.Librarys.SQLite;
2新增:using Core.Models;
3新增:using Core.Servicers.Interfaces;
4新增:using System;
5新增:using System.Collections.Generic;
6新增:using System.Diagnostics;
7新增:using System.Linq;
8新增:using System.Text;
9新增:using System.Threading.Tasks;
10新增:using System.Windows.Threading;
11新增:
12新增:namespace Core.Servicers.Instances
13新增:{
14新增: public class AppData : IAppData
15新增: {
16新增:
17新增: private List<AppModel> _apps;
18新增:
19新增: /// <summary>
20新增: /// 有数据更新的app
21新增: /// </summary>
22新增: private List<AppModel> _updateTempApps;
23新增: public AppData()
24新增: {
25新增: DispatcherTimer dispatcherTimer = new DispatcherTimer();
26新增: dispatcherTimer.Interval = new TimeSpan(0, 30, 0);
27新增: dispatcherTimer.Tick += DispatcherTimer_Tick;
28新增: dispatcherTimer.Start();
29新增: }
30新增:
31新增:
32新增: private void DispatcherTimer_Tick(object sender, EventArgs e)
33新增: {
34新增: SaveAppChanges();
35新增: }
36新增: public List<AppModel> GetAllApps()
37新增: {
38新增: return _apps;
39新增: }
40新增:
41新增: public void Load()
42新增: {
43新增: Debug.WriteLine("加载app开始");
44新增: using (var db = new TaiDbContext())
45新增: {
46新增: _apps = (
47新增: from app in db.App
48新增: join c in db.Categorys
49新增: on app.CategoryID equals c.ID into itdata
50新增: from n in itdata.DefaultIfEmpty()
51新增: select app
52新增: ).ToList()
53新增: .Select(m => new AppModel
54新增: {
55新增: ID = m.ID,
56新增: Category = m.Category != null ? m.Category : null,
57新增: CategoryID = m.CategoryID,
58新增: Description = m.Description,
59新增: File = m.File,
60新增: IconFile = m.IconFile,
61新增: Name = m.Name,
62新增: TotalTime = m.TotalTime
63新增: })
64新增: .ToList();
65新增: }
66新增:
67新增: _updateTempApps = new List<AppModel>();
68新增: }
69新增:
70新增: /// <summary>
71新增: /// 更新app数据,要先调用GetApp获得后更改并传回才有效
72新增: /// </summary>
73新增: /// <param name="app"></param>
74新增: public void UpdateApp(AppModel app)
75新增: {
76新增: if (!_updateTempApps.Where(m => m.ID == app.ID).Any())
77新增: {
78新增: _updateTempApps.Add(app);
79新增: }
80新增: }
81新增: public AppModel GetApp(string name)
82新增: {
83新增: return _apps.Where(m => m.Name == name).FirstOrDefault();
84新增: }
85新增:
86新增: public void AddApp(AppModel app)
87新增: {
88新增: if (_apps.Where(m => m.Name == app.Name).Any())
89新增: {
90新增: return;
91新增: }
92新增:
93新增: using (var db = new TaiDbContext())
94新增: {
95新增: db.App.Add(app);
96新增: int res = db.SaveChanges();
97新增: if (res > 0)
98新增: {
99新增: _apps.Add(app);
100新增: }
101新增: }
102新增: }
103新增:
104新增: public void SaveAppChanges()
105新增: {
106新增: using (var db = new TaiDbContext())
107新增: {
108新增: foreach (var item in _updateTempApps)
109新增: {
110新增: var app = db.App.Find(item.ID);
111新增: if (app != null)
112新增: {
113新增: app.TotalTime = item.TotalTime;
114新增: app.File = item.File;
115新增: app.IconFile = item.IconFile;
116新增: app.Name = item.Name;
117新增: app.CategoryID = item.CategoryID;
118新增: app.Description = item.Description;
119新增: app.Category = item.Category;
120新增: }
121新增: }
122新增: db.SaveChanges();
123新增: }
124新增: }
125新增: }
126新增:}
修改Core/Servicers/Instances/Data.cs+118 −44看文件
@@ -1,17 +1,22 @@
11using Core.Librarys.SQLite;
22using Core.Models;
3删除:using Core.Models.Config;
43using Core.Servicers.Interfaces;
54using System;
65using System.Collections.Generic;
6新增:using System.Diagnostics;
77using System.Linq;
8删除:using System.Text;
9删除:using System.Threading.Tasks;
8新增:using System.Data.Entity;
9新增:using System.Windows.Threading;
1010
1111namespace Core.Servicers.Instances
1212{
1313 public class Data : IData
1414 {
15新增: private readonly IAppData appData;
16新增: public Data(IAppData appData)
17新增: {
18新增: this.appData = appData;
19新增: }
1520 public void Set(string processName, string processDescription, string file, int seconds)
1621 {
1722 if (string.IsNullOrEmpty(processName) || seconds <= 0)
@@ -19,19 +24,26 @@ namespace Core.Servicers.Instances
1924 return;
2025 }
2126 processDescription = processDescription == null ? string.Empty : processDescription;
22删除: using (var db = new StatisticContext())
27新增:
28新增: AppModel app = appData.GetApp(processName);
29新增:
30新增: if (app == null)
2331 {
24删除: var today = DateTime.Now.Date;
25删除: var res = db.DailyLog.SingleOrDefault(m => m.Date == today && m.ProcessName == processName);
32新增: return;
33新增: }
34新增:
35新增:
36新增: var today = DateTime.Now.Date;
37新增: using (var db = new TaiDbContext())
38新增: {
39新增: var res = db.DailyLog.SingleOrDefault(m => m.Date == today && m.AppModelID == app.ID);
2640 if (res == null)
2741 {
2842 //数据库中没有时则创建
2943 db.DailyLog.Add(new Models.DailyLogModel()
3044 {
3145 Date = today,
32删除: File = file,
33删除: ProcessDescription = processDescription,
34删除: ProcessName = processName,
46新增: AppModelID = app.ID,
3547 Time = seconds,
3648 });
3749 }
@@ -47,7 +59,7 @@ namespace Core.Servicers.Instances
4759 var hourslog = db.HoursLog.SingleOrDefault(
4860 m =>
4961 m.DataTime == nowtime
50删除: && m.ProcessName == processName
62新增: && m.AppModelID == app.ID
5163 );
5264 if (hourslog == null)
5365 {
@@ -55,8 +67,7 @@ namespace Core.Servicers.Instances
5567 db.HoursLog.Add(new Models.HoursLogModel()
5668 {
5769 DataTime = nowtime,
58删除: ProcessName = processName,
59删除: File = file,
70新增: AppModelID = app.ID,
6071 Time = seconds
6172 });
6273 }
@@ -65,32 +76,61 @@ namespace Core.Servicers.Instances
6576 hourslog.Time += seconds;
6677 }
6778
79新增: // 统计使用时长
80新增: app.TotalTime += seconds;
81新增:
82新增: appData.UpdateApp(app);
83新增:
6884 db.SaveChanges();
6985 }
7086 }
7187
7288 public List<DailyLogModel> GetTodaylogList()
7389 {
74删除: using (var db = new StatisticContext())
90新增:
91新增: //return null;
92新增:
93新增: using (var db = new TaiDbContext())
7594 {
7695 var today = DateTime.Now.Date;
77删除: var res = db.DailyLog.Where(m => m.Date == today);
96新增: var res = db.DailyLog.Where(m => m.Date == today && m.AppModelID != 0);
7897 return res.ToList();
7998 }
8099 }
81100
82删除: public List<DailyLogModel> GetDateRangelogList(DateTime start, DateTime end)
101新增: public IEnumerable<DailyLogModel> GetDateRangelogList(DateTime start, DateTime end)
83102 {
103新增: //using (var db = new StatisticContext())
104新增: //{
105新增:
84106
85删除: using (var db = new StatisticContext())
107新增: // //var test = db.DailyLog.Include(m=>m.AppModel).Where(m => m.AppModelID != 0).Take(4).ToList();
108新增: // //var res = db.DailyLog.Include(m => m.AppModel).SqlQuery("Select *,Sum(Time) as Time,DailyLogModels.ID,AppModelID,Date,AppModels.ID,AppModels.Name,AppModels.Description,AppModels.File,AppModels.CategoryID,AppModels.IconFile,AppModels.TotalTime from DailyLogModels LEFT OUTER JOIN AppModels ON AppModels.ID=DailyLogModels.ID WHERE AppModelID<>0 AND Date between '" + start.ToString("yyyy-MM-dd HH:mm:ss") + "' AND '" + end.ToString("yyyy-MM-dd HH:mm:ss") + "' GROUP BY AppModelID ").ToList();
109新增: using (var db = new TaiDbContext())
86110 {
87删除: var today = DateTime.Now.Date;
88删除: var res = db.DailyLog.SqlQuery("Select Sum(Time) as Time,ProcessName,File,ID,Date,ProcessDescription from DailyLogModels WHERE Date between '" + start.ToString("yyyy-MM-dd HH:mm:ss") + "' AND '" + end.ToString("yyyy-MM-dd HH:mm:ss") + "' GROUP BY ProcessName ").ToList();
89删除: return res.ToList();
111新增: var res = db.DailyLog
112新增: .Include(m => m.AppModel)
113新增: .Where(m => m.Date >= start && m.Date <= end && m.AppModelID != 0)
114新增: .GroupBy(m => m.AppModelID)
115新增: .Select(m => new
116新增: {
117新增: Time = m.Sum(a => a.Time),
118新增: App = m.FirstOrDefault().AppModel,
119新增: Date = m.FirstOrDefault().Date,
120新增: })
121新增: .ToList()
122新增: .Select(m => new DailyLogModel
123新增: {
124新增: Time = m.Time,
125新增: AppModel = m.App,
126新增: Date = m.Date
127新增: });
128新增:
129新增: return res;
90130 }
91131 }
92132
93删除: public List<DailyLogModel> GetThisWeeklogList()
133新增: public IEnumerable<DailyLogModel> GetThisWeeklogList()
94134 {
95135 DateTime weekStartDate = DateTime.Now, weekEndDate = DateTime.Now;
96136 if (DateTime.Now.DayOfWeek == DayOfWeek.Monday)
@@ -113,7 +153,7 @@ namespace Core.Servicers.Instances
113153 return GetDateRangelogList(weekStartDate, weekEndDate);
114154 }
115155
116删除: public List<DailyLogModel> GetLastWeeklogList()
156新增: public IEnumerable<DailyLogModel> GetLastWeeklogList()
117157 {
118158 DateTime weekStartDate = DateTime.Now, weekEndDate = DateTime.Now;
119159
@@ -136,10 +176,17 @@ namespace Core.Servicers.Instances
136176 {
137177 return;
138178 }
139删除: using (var db = new StatisticContext())
179新增:
180新增: AppModel app = appData.GetApp(processName);
181新增: if (app == null)
182新增: {
183新增: return;
184新增: }
185新增:
186新增: using (var db = new TaiDbContext())
140187 {
141188 var today = DateTime.Now.Date;
142删除: var res = db.DailyLog.SingleOrDefault(m => m.Date == today && m.ProcessName == processName);
189新增: var res = db.DailyLog.SingleOrDefault(m => m.Date == today && m.AppModelID == app.ID);
143190 if (res != null)
144191 {
145192 res.Time += seconds;
@@ -152,29 +199,41 @@ namespace Core.Servicers.Instances
152199 var hourslog = db.HoursLog.SingleOrDefault(
153200 m =>
154201 m.DataTime == nowtime
155删除: && m.ProcessName == processName);
202新增: && m.AppModelID == app.ID);
156203 if (hourslog != null)
157204 {
158205 hourslog.Time += seconds;
159206 }
160删除: db.SaveChanges();
161207
208新增:
209新增: // 统计使用时长
210新增:
211新增: app.TotalTime += seconds;
212新增:
213新增: appData.UpdateApp(app);
214新增:
215新增:
216新增: db.SaveChanges();
162217 }
218新增:
163219 }
164220
165221 public List<DailyLogModel> GetProcessMonthLogList(string processName, DateTime month)
166222 {
167删除: using (var db = new StatisticContext())
223新增: var app = appData.GetApp(processName);
224新增: if (app == null)
225新增: {
226新增: return new List<DailyLogModel>();
227新增: }
228新增: using (var db = new TaiDbContext())
168229 {
169230
170删除: var res = db.DailyLog.Where(
171删除: m =>
172删除: m.Date.Year == month.Year
173删除: && m.Date.Month == month.Month
174删除: && m.ProcessName == processName
175删除: //&& m.ProcessDescription == processDescription
176删除: //&& m.File == file
177删除: );
231新增: var res = db.DailyLog.Include(m => m.AppModel).Where(
232新增: m =>
233新增: m.Date.Year == month.Year
234新增: && m.Date.Month == month.Month
235新增: && m.AppModelID == app.ID
236新增: );
178237 if (res != null)
179238 {
180239 return res.ToList();
@@ -190,29 +249,42 @@ namespace Core.Servicers.Instances
190249 {
191250 return;
192251 }
193删除: using (var db = new StatisticContext())
252新增:
253新增: var app = appData.GetApp(processName);
254新增: if (app == null)
255新增: {
256新增: return;
257新增: }
258新增: using (var db = new TaiDbContext())
194259 {
195260
196261 db.DailyLog.RemoveRange(
197删除: db.DailyLog.Where(m =>
198删除: m.ProcessName == processName
199删除: && m.Date.Year == month.Year
200删除: && m.Date.Month == month.Month));
262新增: db.DailyLog.Where(m =>
263新增: m.AppModelID == app.ID
264新增: && m.Date.Year == month.Year
265新增: && m.Date.Month == month.Month));
201266 db.SaveChanges();
202267 }
203268 }
204269
205270 public DailyLogModel GetProcess(string processName, DateTime day)
206271 {
207删除: using (var db = new StatisticContext())
272新增: var app = appData.GetApp(processName);
273新增:
274新增: if (app == null)
275新增: {
276新增: return null;
277新增: }
278新增:
279新增: using (var db = new TaiDbContext())
208280 {
209281
210282
211283 var res = db.DailyLog.Where(m =>
212删除: m.ProcessName == processName
213删除: && m.Date.Year == day.Year
214删除: && m.Date.Month == day.Month
215删除: && m.Date.Day == day.Day);
284新增: m.AppModelID == app.ID
285新增: && m.Date.Year == day.Year
286新增: && m.Date.Month == day.Month
287新增: && m.Date.Day == day.Day);
216288 if (res != null)
217289 {
218290 return res.FirstOrDefault();
@@ -220,5 +292,7 @@ namespace Core.Servicers.Instances
220292 return null;
221293 }
222294 }
295新增:
296新增:
223297 }
224298}
修改Core/Servicers/Instances/Main.cs+31 −27看文件
@@ -24,6 +24,7 @@ namespace Core.Servicers.Instances
2424 private readonly ISleepdiscover sleepdiscover;
2525 private readonly IAppConfig appConfig;
2626 private readonly IDateObserver dateObserver;
27新增: private readonly IAppData appData;
2728 // 忽略的进程
2829 private readonly string[] IgnoreProcess = new string[] {
2930 "Tai",
@@ -77,13 +78,16 @@ namespace Core.Servicers.Instances
7778 IObserver observer,
7879 IData data,
7980 ISleepdiscover sleepdiscover,
80删除: IAppConfig appConfig, IDateObserver dateObserver)
81新增: IAppConfig appConfig,
82新增: IDateObserver dateObserver,
83新增: IAppData appData)
8184 {
8285 this.observer = observer;
8386 this.data = data;
8487 this.sleepdiscover = sleepdiscover;
8588 this.appConfig = appConfig;
8689 this.dateObserver = dateObserver;
90新增: this.appData = appData;
8791
8892 observer.OnAppActive += Observer_OnAppActive;
8993 sleepdiscover.SleepStatusChanged += Sleepdiscover_SleepStatusChanged;
@@ -117,34 +121,34 @@ namespace Core.Servicers.Instances
117121 }
118122 }
119123
120删除: public void Run()
124新增: public async void Run()
121125 {
122删除: Task.Run(() =>
123删除: {
124删除: Debug.WriteLine("start");
125删除: // 数据库自检
126删除: using (var db = new StatisticContext())
127删除: {
128删除: db.Database.ExecuteSqlCommand("select count(*) from sqlite_master where type='table' and name='tai'");
129删除: }
130删除: // 加载app信息
131删除: data.LoadAppList();
126新增: await Task.Run(() =>
127新增: {
128新增: Debug.WriteLine("db self check start");
129新增: // 数据库自检
130新增: using (var db = new TaiDbContext())
131新增: {
132新增: db.SelfCheck();
133新增: }
134新增: Debug.WriteLine("db self check over!");
135新增: });
132136
133删除: // 加载应用配置(确保配置文件最先加载
134删除: appConfig.Load();
135删除: config = appConfig.GetConfig();
137新增: // 加载app信息
138新增: appData.Load();
136139
137删除: // 日期变化观察
138删除: dateObserver.Start();
140新增: // 加载应用配置(确保配置文件最先加载
141新增: appConfig.Load();
142新增: config = appConfig.GetConfig();
139143
140删除: // 启动进程观察
141删除: observer.Start();
144新增: // 日期变化观察
145新增: dateObserver.Start();
142146
143删除: // 启动睡眠监测
144删除: sleepdiscover.Start();
145删除: Debug.WriteLine("over!");
147新增: // 启动进程观察
148新增: observer.Start();
146149
147删除: });
150新增: // 启动睡眠监测
151新增: sleepdiscover.Start();
148152
149153 }
150154
@@ -152,7 +156,7 @@ namespace Core.Servicers.Instances
152156 {
153157 observer?.Stop();
154158
155删除: data.SaveAppChanges();
159新增: appData.SaveAppChanges();
156160 }
157161
158162
@@ -172,7 +176,7 @@ namespace Core.Servicers.Instances
172176 //activeTimer.Stop();
173177
174178 // 更新app数据
175删除: data.SaveAppChanges();
179新增: appData.SaveAppChanges();
176180 }
177181 else if (sleepStatus == SleepStatus.Wake)
178182 {
@@ -199,13 +203,13 @@ namespace Core.Servicers.Instances
199203 if (!config.Behavior.IgnoreProcessList.Contains(processName)
200204 && !IgnoreProcess.Contains(processName))
201205 {
202删除: AppModel app = data.GetApp(processName);
206新增: AppModel app = appData.GetApp(processName);
203207 if (app == null)
204208 {
205209 // 提取icon
206210 string iconFile = Iconer.ExtractFromFile(file, processName, description);
207211
208删除: data.AddApp(new AppModel()
212新增: appData.AddApp(new AppModel()
209213 {
210214 Name = processName,
211215 Description = description,
新增Core/Servicers/Interfaces/IAppData.cs+37 −0看文件
@@ -0,0 +1,37 @@
1新增:using Core.Models;
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 IAppData
11新增: {
12新增: /// <summary>
13新增: /// 更新app数据,要先调用GetApp获得后更改并传回才有效
14新增: /// </summary>
15新增: void UpdateApp(AppModel app);
16新增: /// <summary>
17新增: /// 保存app数据更改
18新增: /// </summary>
19新增: void SaveAppChanges();
20新增: /// <summary>
21新增: /// 通过进程名称获取app
22新增: /// </summary>
23新增: /// <param name="name"></param>
24新增: /// <returns></returns>
25新增: AppModel GetApp(string name);
26新增: /// <summary>
27新增: /// 获取所有app
28新增: /// </summary>
29新增: /// <returns></returns>
30新增: List<AppModel> GetAllApps();
31新增: void AddApp(AppModel app);
32新增: /// <summary>
33新增: /// 加载已存储的app列表,仅建议在启动时调用一次,无必要请勿再次调用
34新增: /// </summary>
35新增: void Load();
36新增: }
37新增:}
修改Core/Servicers/Interfaces/IData.cs+4 −3看文件
@@ -9,6 +9,7 @@ namespace Core.Servicers.Interfaces
99{
1010 public interface IData
1111 {
12新增:
1213 /// <summary>
1314 /// 设置进程数据
1415 /// </summary>
@@ -29,18 +30,18 @@ namespace Core.Servicers.Interfaces
2930 /// <param name="start"></param>
3031 /// <param name="end"></param>
3132 /// <returns></returns>
32删除: List<DailyLogModel> GetDateRangelogList(DateTime start, DateTime end);
33新增: IEnumerable<DailyLogModel> GetDateRangelogList(DateTime start, DateTime end);
3334
3435 /// <summary>
3536 /// 获取本周的数据
3637 /// </summary>
3738 /// <returns></returns>
38删除: List<DailyLogModel> GetThisWeeklogList();
39新增: IEnumerable<DailyLogModel> GetThisWeeklogList();
3940 /// <summary>
4041 /// 获取上周的数据
4142 /// </summary>
4243 /// <returns></returns>
43删除: List<DailyLogModel> GetLastWeeklogList();
44新增: IEnumerable<DailyLogModel> GetLastWeeklogList();
4445 /// <summary>
4546 /// 设置进程数据(仅通过进程名可能会出现重复的问题
4647 /// </summary>
修改UI/App.xaml.cs+11 −3看文件
@@ -39,6 +39,10 @@ namespace UI
3939 private ContextMenu contextMenu;
4040
4141 private DefaultWindow mainWindow;
42新增:
43新增: private IAppData appData;
44新增:
45新增:
4246 public App()
4347 {
4448 InitStatusBarIcon();
@@ -56,9 +60,8 @@ namespace UI
5660 {
5761 base.OnExit(e);
5862
59删除: var data = serviceProvider.GetService<IData>();
6063
61删除: data.SaveAppChanges();
64新增: appData.SaveAppChanges();
6265
6366 Logger.Save(true);
6467
@@ -66,6 +69,8 @@ namespace UI
6669 }
6770 private void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
6871 {
72新增: appData.SaveAppChanges();
73新增:
6974 // 记录崩溃错误
7075 Logger.Error("[程序崩溃异常] " + e.Exception.Message);
7176
@@ -109,7 +114,7 @@ namespace UI
109114 CreateStatusBarIconMenu();
110115
111116 statusBarIcon = new System.Windows.Forms.NotifyIcon();
112删除: statusBarIcon.Text = "Tai! [数据库自检中...请稍后]";
117新增: statusBarIcon.Text = "Tai! [数据加载中...请稍后]";
113118 Stream iconStream = GetResourceStream(new Uri("pack://application:,,,/Tai;component/Resources/Icons/taibusy.ico")).Stream;
114119 statusBarIcon.Icon = new Icon(iconStream);
115120 //statusBarIcon.Icon = System.Drawing.Icon.ExtractAssociatedIcon(System.Reflection.Assembly.GetEntryAssembly().ManifestModule.Name);
@@ -177,6 +182,7 @@ namespace UI
177182 services.AddSingleton<ISleepdiscover, Sleepdiscover>();
178183 services.AddSingleton<IAppConfig, AppConfig>();
179184 services.AddSingleton<IDateObserver, DateObserver>();
185新增: services.AddSingleton<IAppData, AppData>();
180186
181187 // 主窗口
182188 services.AddSingleton<MainViewModel>();
@@ -219,6 +225,8 @@ namespace UI
219225 // 创建保活窗口
220226 keepaliveWindow = new HideWindow();
221227
228新增:
229新增: appData = serviceProvider.GetService<IAppData>();
222230 }
223231
224232 private void ShowMainWindow()
修改UI/ViewModels/DataPageVM.cs+5 −4看文件
@@ -167,19 +167,20 @@ namespace UI.ViewModels
167167 }
168168
169169 #region 处理数据
170删除: private List<ChartsDataModel> MapToChartsData(List<Core.Models.DailyLogModel> list)
170新增: private List<ChartsDataModel> MapToChartsData(IEnumerable<Core.Models.DailyLogModel> list)
171171 {
172172 var resData = new List<ChartsDataModel>();
173173
174174 foreach (var item in list)
175175 {
176新增:
176177 var bindModel = new ChartsDataModel();
177178 bindModel.Data = item;
178删除: bindModel.Name = string.IsNullOrEmpty(item.ProcessDescription) ? item.ProcessName : item.ProcessDescription;
179新增: bindModel.Name = item.AppModel?.Name;
179180 bindModel.Value = item.Time;
180181 bindModel.Tag = Timer.Fromat(item.Time);
181删除: bindModel.PopupText = item.File;
182删除: bindModel.Icon = Iconer.Get(item.ProcessName, item.ProcessDescription);
182新增: bindModel.PopupText = item.AppModel?.File;
183新增: bindModel.Icon = item.AppModel?.IconFile;
183184 resData.Add(bindModel);
184185 }
185186
修改UI/ViewModels/DetailPageVM.cs+6 −5看文件
@@ -130,7 +130,7 @@ namespace UI.ViewModels
130130 var info = Process.Data as DailyLogModel;
131131 if (info != null)
132132 {
133删除: ProcessName = info.ProcessName;
133新增: ProcessName = info.AppModel?.Name;
134134 // 判断是否是忽略的进程
135135 IsIgnore = config.Behavior.IgnoreProcessList.Contains(ProcessName);
136136 }
@@ -187,8 +187,9 @@ namespace UI.ViewModels
187187 {
188188 if (Process != null)
189189 {
190新增:
190191 var info = Process.Data as DailyLogModel;
191删除: var monthData = data.GetProcessMonthLogList(info.ProcessName, Date);
192新增: var monthData = data.GetProcessMonthLogList(info.AppModel.Name, Date);
192193 int monthTotal = monthData.Sum(m => m.Time);
193194 Total = Timer.Fromat(monthTotal);
194195
@@ -252,11 +253,11 @@ namespace UI.ViewModels
252253 {
253254 var bindModel = new ChartsDataModel();
254255 bindModel.Data = item;
255删除: bindModel.Name = string.IsNullOrEmpty(item.ProcessDescription) ? item.ProcessName : item.ProcessDescription;
256新增: bindModel.Name =item.AppModel.Name;
256257 bindModel.Value = item.Time;
257258 bindModel.Tag = Timer.Fromat(item.Time);
258删除: bindModel.PopupText = item.File;
259删除: bindModel.Icon = Iconer.Get(item.ProcessName, item.ProcessDescription);
259新增: bindModel.PopupText = item.AppModel.File;
260新增: bindModel.Icon = item.AppModel.IconFile;
260261 bindModel.DateTime = item.Date;
261262 resData.Add(bindModel);
262263 }
修改UI/ViewModels/IndexPageVM.cs+4 −4看文件
@@ -122,7 +122,7 @@ namespace UI.ViewModels
122122 #endregion
123123
124124 #region 处理数据
125删除: private List<ChartsDataModel> MapToChartsData(List<Core.Models.DailyLogModel> list)
125新增: private List<ChartsDataModel> MapToChartsData(IEnumerable<Core.Models.DailyLogModel> list)
126126 {
127127 var resData = new List<ChartsDataModel>();
128128
@@ -130,11 +130,11 @@ namespace UI.ViewModels
130130 {
131131 var bindModel = new ChartsDataModel();
132132 bindModel.Data = item;
133删除: bindModel.Name = string.IsNullOrEmpty(item.ProcessDescription) ? item.ProcessName : item.ProcessDescription;
133新增: bindModel.Name = item.AppModel?.Name;
134134 bindModel.Value = item.Time;
135135 bindModel.Tag = Timer.Fromat(item.Time);
136删除: bindModel.PopupText = item.File;
137删除: bindModel.Icon = Iconer.Get(item.ProcessName, item.ProcessDescription);
136新增: bindModel.PopupText = item.AppModel?.File;
137新增: bindModel.Icon = item.AppModel?.IconFile;
138138 bindModel.DateTime = item.Date;
139139 resData.Add(bindModel);
140140 }