ABP module-zero +AdminLTE+Bootstrap Table+jQuery許可權管理系統第十七節--Quartz與ABP框架Abp.Quartz及擴充套件
Quartz簡介
Quartz.NET是一個開源的作業排程框架,是 OpenSymphony
的 Quartz API
的.NET移植,它用C#寫成,可用於winform
和asp.net
應用中。它提供了巨大的靈活性而不犧牲簡單性。你能夠用它來為執行一個作業而建立簡單的或複雜的排程。它有很多特徵,如:資料庫支援,叢集,外掛,支援cron-like
表示式等等。非常適合在平時的工作中,定時輪詢資料庫同步,定時郵件通知,定時處理資料等.
參考
特性
它一些很好的特性:
- 支援叢集,作業分組,作業遠端管理。
- 自定義精細的時間觸發器,使用簡單,作業和觸發分離。
- 資料庫支援,可以寄宿
Windows
服務,WebSite
winform
等。
Quartz框架的一些基礎概念解釋:
名稱 | 描述 |
---|---|
Scheduler | 作業排程器。 |
IJob | 作業介面,繼承並實現Execute, 編寫執行的具體作業邏輯。 |
JobBuilder | 根據設定,生成一個詳細作業資訊(JobDetail)。 |
TriggerBuilder | 根據規則,生產對應的Trig |
實戰
- Web.config配置
基礎概念我就懶得講了,你也懶得聽了,直接上程式碼吧。
首先配置一下Web.config
,其實這步可有可無,可以直接跳過,只是為了配置一些常量,獲取固定的時間,但是不是必要的。
<sectionGroup name="JobList"> <section name="Job" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089"/> </sectionGroup>
<JobList> <Job> <!--這裡是一個任務節點--> <add key="Url" value="http://www.baidu.com" /> <!--需要訪問的Url--> <add key="Hour" value="10" /> <!--開始時間小時--> <!--開始時間小時,注意:這裡的小時為0-23,如果是1點的話就是1,而不是01--> <add key="Minute" value="30" /> <!--開始時間分鐘--> <!--開始時間分鐘,注意:同上0-59--> </Job> </JobList>
- 建立service
建立ISystemSchedulerService
以及SystemSchedulerService
,程式碼上面都有詳細的註釋,我就不重複了。
介面:
public interface ISystemSchedulerService: IApplicationService
{
void StartScheduler();
}
service: SystemSchedulerService
public class SystemSchedulerService : ISystemSchedulerService
{
private IScheduler _scheduler;
public ILogger _Logger { get; set; }
public SystemSchedulerService()
{
_Logger = NullLogger.Instance;
}
public void StopScheduler()
{
_scheduler.Shutdown();
}
public void StartScheduler()
{
try
{
//這裡讀取配置檔案中的任務開始時間
int hour = int.Parse(((NameValueCollection)ConfigurationManager.GetSection("JobList/Job"))["Hour"]);
int minute = int.Parse(((NameValueCollection)ConfigurationManager.GetSection("JobList/Job"))["Minute"]);
ISchedulerFactory schedulerFactory = new StdSchedulerFactory();//記憶體排程
_scheduler = schedulerFactory.GetScheduler();
//建立一個Job來執行特定的任務
IJobDetail myLogJob = new JobDetailImpl("myLogJob", typeof(MyLogJob));
//建立並定義觸發器的規則(每天執行一次時間為:時:分)
ITrigger trigger =
TriggerBuilder.Create()
.WithDailyTimeIntervalSchedule(
a => a.WithIntervalInHours(24).OnEveryDay().StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(hour, minute))).Build();
_scheduler.Clear();
//將建立好的任務和觸發規則加入到Quartz中
_scheduler.ScheduleJob(myLogJob, trigger);
//開始
_scheduler.Start();
}
catch (Exception ex)
{
_Logger.Info(ex.Message);
}
}
}
Quartz API
Quartz API的關鍵介面和類是:
IScheduler
- 與排程程式互動的主要API。
-IJob
- 您希望由排程程式執行的元件實現的介面。IJobDetail
- 用於定義作業的例項。ITrigger
- 定義執行給定Job的時間表的元件。JobBuilder
- 用於定義/構建obDetail
例項,它定義了Jobs
的例項。TriggerBuilder
- 用於定義/構建觸發器例項。
一個排程程式的生命週期是由它為界的創作,通過SchedulerFactory
和其有關方法的呼叫。一旦建立了IScheduler
介面,就可以使用新增,刪除和列出作業和觸發器,並執行其他與排程相關的操作(例如暫停觸發器)。但是,排程程式不會實際上對任何觸發器(執行作業)執行操作,直到使用Start()
方法啟動它。
構建作業定義的程式碼塊使用使用流暢介面的JobBuilder
建立產品IJobDetail
。同樣,構建觸發器的程式碼塊使用TriggerBuilder
流暢的介面和特定於觸發器型別的擴充套件方法。可能的時間延長方法是:
- WithCalendarIntervalSchedule
- WithCronSchedule
- WithDailyTimeIntervalSchedule
- WithSimpleSchedule
示例中的ITrigger
其實可以不讀取配置資訊的。這就是我說的不用配置Web.config
也可以。效果如下,每隔10秒執行一次。
ITrigger trigger =
TriggerBuilder.Create()
.WithDailyTimeIntervalSchedule(
a => a.WithIntervalInSeconds(10)).Build();
工作和觸發器
程式碼:
public class MyLogJob : JobBase, ITransientDependency
{
public ILogger _Logger { get; set; }
public MyLogJob()
{
_Logger = NullLogger.Instance;
}
public override void Execute(IJobExecutionContext context)
{
try
{
_Logger.Info("QuartzJob 任務開始執行");
for (int i = 0; i < 10; i++)
{
_Logger.InfoFormat("QuartzJob 正在執行{0}", i);
}
_Logger.Info("QuartzJob任務執行結束");
}
catch (Exception ex)
{
_Logger.Error("執行異常:"+ex.Message, ex);
}
}
}
當作業的觸發器觸發,Execute(..)
方法由排程程式的工作執行緒之一呼叫。傳遞給此方法的JobExecutionContext
物件為作業例項提供有關其“執行時”環境的資訊 ( 排程程式執行的邏輯),觸發執行的觸發器的邏輯。
JobDetail
物件是在Job
新增到排程器時由Quartz.NET
客戶端建立的。它包含Job的各種屬性設定,以及一個JobDataMap
,它可以用來儲存作業類的給定例項的狀態資訊
觸發器物件用於觸發作業的執行(或“觸發”)。當你想安排一個工作,你例項化一個觸發器並“調整”它的屬性來提供你想要的排程。觸發器也可能有一個與它們相關的JobDataMap
- 這對於傳遞引數到一個特定於觸發器的觸發的Job
是很有用的。Quartz
提供了一些不同的觸發器型別,但最常用的型別是SimpleTrigger
(介面ISimpleTrigger
)和CronTrigger
(介面ICronTrigger
)。
如果您需要“一次性”執行(在某個特定時間只執行一項作業),或者您需要在給定時間開始工作,並且重複執行N次,SimpleTrigger
會很方便的T之間執行。如果您希望基於類似日曆的時間表(例如“每個星期五,中午”或“每個月的第10天的10:15”)觸發,則CronTrigger
非常有用。
public class UserInfoController : ABPCMSControllerBase
{
private readonly ISystemSchedulerService _iSystemSchedulerService;
public UserInfoController(ISystemSchedulerService iSystemSchedulerService)
{
_iSystemSchedulerService = iSystemSchedulerService;
}
[HttpGet]
[DontWrapResult]
public async Task<ActionResult> GetUserInfo()
{
_iSystemSchedulerService.StartScheduler();
}
}
然後我們在前臺控制器裡面呼叫ISystemSchedulerService
的StartScheduler()
方法。然後執行專案。
然後我們開啟日誌Web\App_Data\Logs\Logs.txt
,看下效果:
每隔十秒鐘執行一次。
Abp.Quartz
ABP有內建的持久化後臺job佇列和後臺worker
系統。如果對於後臺workers你有更高階的計劃安排需求,Quartz
會是一個更好的選擇。對於持久化後臺job佇列,Hangfire
也是一個好的選擇。
ABP中Quartz應用其實蠻簡單的。
- 然後加上引入到專案中。
[DependsOn(
typeof(AbpQuartzModule)
)]
public class ABPCMSWebModule : AbpModule
{
}
- 建立Jobs
這裡我們就用上面例子中的job,當然建立一個新job,你可以實現Quartz
的IJob
介面,或者繼承JobBase
類(定義在Abp.Quartz包),這個類包含一些幫助屬性和方法(例如日誌和本地化)。
public class MyLogJob : JobBase, ITransientDependency
{
public override void Execute(IJobExecutionContext context)
{
Logger.Info("Executed MyLogJob :)");
}
}
4.建立排程作業
IQuartzScheduleJobManager
介面被用來建立排程作業。你可以在類中注入該介面(或者你可以在你的模組的PostInitialize
方法中解析和使用它)來排程作業。這裡我們把之前建立的MyLogJob引用進來。
效果如下:
public async Task<ActionResult> ScheduleJob()
{
await _jobManager.ScheduleAsync<MyLogJob>(
job =>
{
job.WithIdentity("MyLogJobIdentity", "MyGroup")
.WithDescription("A job to simply write logs.");
},
trigger =>
{
trigger.StartNow()
.WithSimpleSchedule(schedule =>
{
schedule.RepeatForever()
.WithIntervalInSeconds(5)
.Build();
});
});
_jobManager.Start();
return Content("OK, scheduled!");
}
效果一樣。
經過上面四步,就完成Abp.Quartz運用,是挺簡單的。
擴充套件
####SimpleTrigger
說一下SimpleTrigger
,WithCronSchedule()
這裡有三種方式,一種就是上面說到的Web.config
配置,一種是WithCronSchedule
設定時間引數。還有一種是WithCronSchedule("")
擁有強大的Cron
時間表達式。
SimpleTrigge
r應滿足你的日程安排需求,如果你需要在某個特定時刻及時執行一次作業,或者在特定時間執行一次,然後在特定時間間隔重複執行。如果你想讓觸發器在2018年1月13日上午11點23分54秒執行,然後再執行5次,每10秒執行一次。
通過這個描述,你可能不會覺得奇怪的是,SimpleTrigger
的屬性包括:開始時間和結束時間,重複計數和重複間隔。所有這些屬性都與您所期望的完全相同,只有一些與結束時間屬性相關的特殊註釋。
SimpleTrigger
例項是使用TriggerBuilder
(用於觸發器的主屬性)和WithSimpleSchedule
擴充套件方法(用於SimpleTrigger
特有的屬性)構建的。
在特定的時刻建立一個觸發器,不要重複:
// trigger builder creates simple trigger by default, actually an ITrigger is returned
ISimpleTrigger trigger = (ISimpleTrigger) TriggerBuilder.Create()
.WithIdentity("trigger1", "group1")
.StartAt(myStartTime) // some Date
.ForJob("job1", "group1") // identify job with name, group strings
.Build();
建立一個特定時刻的觸發器,然後每十秒鐘重複十次:
trigger = TriggerBuilder.Create()
.WithIdentity("trigger3", "group1")
.StartAt(myTimeToStartFiring) // if a start time is not given (if this line were omitted), "now" is implied
.WithSimpleSchedule(x => x
.WithIntervalInSeconds(10)
.WithRepeatCount(10)) // note that 10 repeats will give a total of 11 firings
.ForJob(myJob) // identify job with handle to its JobDetail itself
.Build();
建立一個觸發器,將在未來五分鐘內觸發一次:
trigger = (ISimpleTrigger) TriggerBuilder.Create()
.WithIdentity("trigger5", "group1")
.StartAt(DateBuilder.FutureDate(5, IntervalUnit.Minute)) // use DateBuilder to create a date in the future
.ForJob(myJobKey) // identify job with its JobKey
.Build();
建立一個觸發器,現在會觸發,然後每隔五分鐘重複一次,直到22:00:
trigger = TriggerBuilder.Create()
.WithIdentity("trigger7", "group1")
.WithSimpleSchedule(x => x
.WithIntervalInMinutes(5)
.RepeatForever())
.EndAt(DateBuilder.DateOf(22, 0, 0))
.Build();
建立一個觸發器,將在下一個小時的頂部執行,然後每2小時重複一次:
trigger = TriggerBuilder.Create()
.WithIdentity("trigger8") // because group is not specified, "trigger8" will be in the default group
.StartAt(DateBuilder.EvenHourDate(null)) // get the next even-hour (minutes and seconds zero ("00:00"))
.WithSimpleSchedule(x => x
.WithIntervalInHours(2)
.RepeatForever())
// note that in this example, 'forJob(..)' is not called
// - which is valid if the trigger is passed to the scheduler along with the job
.Build();
await scheduler.scheduleJob(trigger, job);
另外一些常用的停止作業的指令常量
- MisfireInstruction.IgnoreMisfirePolicy
- MisfirePolicy.SimpleTrigger.FireNow
- MisfirePolicy.SimpleTrigger.RescheduleNowWithExistingRepeatCount
- MisfirePolicy.SimpleTrigger.RescheduleNowWithRemainingRepeatCount
- MisfirePolicy.SimpleTrigger.RescheduleNextWithRemainingCount
- MisfirePolicy.SimpleTrigger.RescheduleNextWithExistingCount
在構建SimpleTriggers時,可以將簡單的時間表(通過SimpleSchedulerBuilder)指定為停止作業指令:
trigger = TriggerBuilder.Create()
.WithIdentity("trigger7", "group1")
.WithSimpleSchedule(x => x
.WithIntervalInMinutes(5)
.RepeatForever()
.WithMisfireHandlingInstructionNextWithExistingCount())
.Build();
Cron時間表達式。
Cron-Expressions
用於配置CronTrigger
的例項。Cron-Expressions
是由七個子表示式組成的字串,它們描述了計劃的各個細節。這些子表示式用空格分隔,表示:
- Seconds
- Minutes
- Hours
- Day-of-Month
- Month
- Day-of-Week
- Year (optional field)
示例Cron表示式
下面是一些表示式及其含義的例子 - 你可以在CronTrigger
的API文件中找到更多的例子
CronTrigger示例1 - 建立一個觸發器的表示式,每5分鐘觸發一次
"0 0/5 * * * ?"
CronTrigger示例2 - 一個表示式,用於建立在分鐘後10秒(即上午10:00:10,上午10:05:10等)每5分鐘觸發一次的觸發器。
"10 0/5 * * * ?"
CronTrigger示例3 - 一個表示式,用於在每個星期三和星期五的10:30,11:30,12:30和13:30建立一個觸發器。
"0 30 10-13 ? * WED,FRI"
CronTrigger示例4 - 一個表示式,用於建立一個觸發器,在每個月的第5天和第20天的上午8點到上午10點之間每隔半小時觸發一次。請注意,觸發器不會在上午10點,僅在8點,8點,9點和9點30分
"0 0/30 8-9 5,20 * ?"
請注意,一些排程要求過於複雜,無法用一個觸發器來表示 - 例如“上午9點至上午10點之間每5分鐘一次,下午1點至10點之間每20分鐘一次”。在這種情況下解決方案是簡單地建立兩個觸發器,並註冊他們兩個執行相同的工作。
CronTrigger
例項使用TriggerBuilder
(用於觸發器的主屬性)和WithCronSchedule
擴充套件方法(用於CronTrigger
特定的屬性)構建。
您也可以使用CronScheduleBuilder
的靜態方法來建立計劃。
建立一個觸發器,每隔上午8點到下午5點,每隔一分鐘一次:
trigger = TriggerBuilder.Create()
.WithIdentity("trigger3", "group1")
.WithCronSchedule("0 0/2 8-17 * * ?")
.ForJob("myJob", "group1")
.Build();
建立一個觸發器,每天在上午10:42開始:
// we use CronScheduleBuilder's static helper methods here
trigger = TriggerBuilder.Create()
.WithIdentity("trigger3", "group1")
.WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(10, 42))
.ForJob(myJobKey)
.Build();
要麼 -
trigger = TriggerBuilder.Create()
.WithIdentity("trigger3", "group1")
.WithCronSchedule("0 42 10 * * ?")
.ForJob("myJob", "group1")
.Build();
建立一個觸發器,將在星期三上午10:42,在系統預設的時區以外的其他時間觸發:
trigger = TriggerBuilder.Create()
.WithIdentity("trigger3", "group1")
.WithSchedule(CronScheduleBuilder
.WeeklyOnDayAndHourAndMinute(DayOfWeek.Wednesday, 10, 42)
.InTimeZone(TimeZoneInfo.FindSystemTimeZoneById("Central America Standard Time")))
.ForJob(myJobKey)
.Build();
要麼 -
trigger = TriggerBuilder.Create()
.WithIdentity("trigger3", "group1")
.WithCronSchedule("0 42 10 ? * WED", x => x
.InTimeZone(TimeZoneInfo.FindSystemTimeZoneById("Central America Standard Time")))
.ForJob(myJobKey)
.Build();
以下指令可用於通知Quartz
在CronTrigger
發生停止作業時應該執行的操作。(本教程的“更多關於觸發器”部分介紹了停止作業情況)。這些指令被定義為常量(並且API文件具有對其行為的描述)。說明包括:
- MisfireInstruction.IgnoreMisfirePolicy
- MisfireInstruction.CronTrigger.DoNothing
- MisfireInstruction.CronTrigger.FireOnceNow
所有觸發器都有MisfireInstrution.SmartPolicy
指令可供使用,並且此指令也是所有觸發器型別的預設值。CronTrigger
將“智慧策略”指令解釋為MisfireInstruction.CronTrigger.FireOnceNow。CronTrigger.UpdateAfterMisfire()
方法的API文件解釋了此行為的確切詳細資訊。
在構建CronTriggers時,您可以將缺火指令指定為cron時間表的一部分(通過WithCronSchedule擴充套件方法):
trigger = TriggerBuilder.Create()
.WithIdentity("trigger3", "group1")
.WithCronSchedule("0 0/2 8-17 * * ?", x => x
.WithMisfireHandlingInstructionFireAndProceed())
.ForJob("myJob", "group1")
.Build();
其他
我們可以看一下,原始碼中對IQuartzScheduleJobManager
的ScheduleAsync
方法的封裝,其實就是Scheduler.ScheduleJob
處理了一下。
如果要使用模組的PostInitialize
方法中解析和使用它來排程作業,也是可以的。
using System.Reflection;
using Abp.Dependency;
using Abp.Modules;
using Abp.Quartz.Configuration;
using Abp.Threading.BackgroundWorkers;
using Quartz;
namespace Abp.Quartz
{
[DependsOn(typeof (AbpKernelModule))]
public class AbpQuartzModule : AbpModule
{
public override void PreInitialize()
{
IocManager.Register<IAbpQuartzConfiguration, AbpQuartzConfiguration>();
Configuration.Modules.AbpQuartz().Scheduler.JobFactory = new AbpQuartzJobFactory(IocManager);
}
public override void Initialize()
{
IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());
}
public override void PostInitialize()
{
IocManager.RegisterIfNot<IJobListener, AbpQuartzJobListener>();
Configuration.Modules.AbpQuartz().Scheduler.ListenerManager.AddJobListener(IocManager.Resolve<IJobListener>());
if (Configuration.BackgroundJobs.IsJobExecutionEnabled)
{
IocManager.Resolve<IBackgroundWorkerManager>().Add(IocManager.Resolve<IQuartzScheduleJobManager>());
}
}
}
}
JobBase
封裝的一些方法,繼承自IJob
相關推薦
ABP module-zero +AdminLTE+Bootstrap Table+jQuery許可權管理系統第十七節--Quartz與ABP框架Abp.Quartz及擴充套件
Quartz簡介 Quartz.NET是一個開源的作業排程框架,是 OpenSymphony 的 Quartz API 的.NET移植,它用C#寫成,可用於winform和asp.net應用中。它提供了巨大的靈活性而不犧牲簡單性。你能夠用它來為執行一個作業而建立簡單的或複雜的排程。它有很多特徵,如:資料庫支
ABP module-zero +AdminLTE+Bootstrap Table+jQuery許可權管理系統第十六節--SignalR與ABP框架Abp.Web.SignalR及擴充套件
SignalR簡介 SignalR是什麼? ASP.NET SignalR 是為 ASP.NET 開發人員提供的一個庫,可以簡化開發人員將實時 Web 功能新增到應用程式的過程。實時 Web 功能是指這樣一種功能:當所連線的客戶端變得可用時伺服器程式碼可以立即向其推送內容,而不是讓伺服器等待客戶端請求新的資
ABP module-zero +AdminLTE+Bootstrap Table+jQuery許可權管理系統第十四節--後臺工作者HangFire與ABP框架Abp.Hangfire及擴充套件
HangFire與Quartz.NET相比主要是HangFire的內建提供整合化的控制檯,方便後臺檢視及監控,對於大家來說,比較方便。 HangFire是什麼 Hangfire是一個開源框架(.NET任務排程框架),可以幫助您建立,處理和管理您的後臺作業,處理你不希望放入請求處理管道的操作: 通知/通訊;
ABP module-zero +AdminLTE+Bootstrap Table+jQuery許可權管理系統第十二節--小結,Bootstrap Table之角色管理以及module-zero角色管理
寫在前面的話 很多人說ABP不適合高併發大型,有一定的道理,但是我覺得還是可以的,就看架構師的能力了,我之前公司就是ABP絕對百萬資料級專案,是一個線上教育網站,涉及到平臺,學院,院系,班級,課程,學生等,一個平臺多少大學,一個大學多少院系,一個院系多少班級多少課程,其負責程度一
ABP module-zero +AdminLTE+Bootstrap Table+jQuery許可權管理系統第十五節--快取小結與ABP框架專案中 Redis Cache的實現
快取 為什麼要用快取 為什麼要用快取呢,說快取之前先說使用快取的優點。 減少寄宿伺服器的往返呼叫(round-trips)。 如果快取在客戶端或是代理,將減少對伺服器的請求,減少頻寬。 減少對資料庫伺服器的往返呼叫(round-trips)。 當內容快取在web伺服器,能夠減輕對資料庫的請求。 減少網路
ABP module-zero +AdminLTE+Bootstrap Table+jQuery許可權管理系統第十三節--RBAC模式及ABP許可權管理(附贈福利)
角色訪問控制(RBAC) 角色訪問控制(RBAC)應該是目前用得最多也是關注最多的許可權管理模型了。 許可權(Permission)與角色(Role)相關聯,使用者(User)通過成為適當角色的成員而得到這些角色的許可權。這就極大地簡化了許可權的管理。 RBAC引入了角色(Role)概念,目的應該是解耦了P
ABP module-zero +AdminLTE+Bootstrap Table+jQuery權限管理系統第十二節--小結,Bootstrap Table之角色管理
增刪 習慣 etc 根據 很好 這不 update 必須 virtual 返回總目錄:ABP+AdminLTE+Bootstrap Table權限管理系統一期 很多人說ABP不適合高並發大型,有一定的道理,但是我覺得還是可以的,就看架構師的能
ABP+AdminLTE+Bootstrap Table許可權管理系統第十一節--Bootstrap Table使用者管理列表以及Module Zero之使用者管理
使用者實體 使用者實體代表應用的一個使用者,它派生自AbpUser類,如下所示: public class User : AbpUser<Tenant, User> { //add your own user properties here
ABP+AdminLTE+Bootstrap Table許可權管理系統第十節--AdminLTE模板選單處理
AdminLTE選單 上節我們把佈局頁,也有的臨時的選單,但是選單不是應該動態載入的麼?,所以我們這節來寫選單.首先我們看一下AdminLTE原始碼裡面的選單以及結構. <aside class="main-sidebar"> <!--
ABP+AdminLTE+Bootstrap Table許可權管理系統第九節--AdminLTE引入及模板頁和佈局和選單
AdminLTE 首先去官網下載包下來,然後引入專案. 然後我們在web層新增區域Admin以及Common,關於AdminLTE的地址我們放在Common路勁下面. 在Common下新增LayoutController控制器. Layout 這裡選單我們先不管,在後
ABP+AdminLTE+Bootstrap Table許可權管理系統第四節--倉儲,服務,服務介面及依賴注入
AbpModule 在ABP框架中,倉儲,服務,這塊算是最為重要一塊之一了.ABP框架提供了建立和組裝模組的基礎,一個模組能夠依賴於另一個模組,一個程式集可看成一個模組, 一個模組可以通過一個類來定義這個模組,而給定義這個類要繼承自已經瘋轉好的AbpModule..net通過反射來獲取這些程
ABP+AdminLTE+Bootstrap Table許可權管理系統第七節--登入邏輯及幾種abp封裝的Javascript函式庫
簡介 經過前幾節,我們已經解決資料庫,模型,DTO,控制器和注入等問題.那麼再來看一下登入邏輯.這裡算是前面幾節的一個初次試水. 首先我們資料庫已經有的相應的資料. 新增Login方法 模型和DTO已經建好,所以我們直接在服務層新增Login方法就可
ABP+AdminLTE+Bootstrap Table許可權管理系統第三節--abp分層體系,實體相關及ABP模組系統
ABP模組系統 說了這麼久,還沒有詳細說到abp框架,abp其實基於DDD(領域驅動設計)原則的細看分層如下: 再看我們專案解決方案如下: JCmsErp.Application,應用層:進行展現層與領域層之間的協調,協調業務物件來執行特定的應用程式的任務。它不包含業務邏輯,主要包
ABP+AdminLTE+Bootstrap Table許可權管理系統第八節--ABP錯誤機制及AbpSession相關
((ClaimsPrincipal)Thread.CurrentPrincipal).Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier); 需要獲取會話資訊則必須實現IAbpSession介面。雖然你
ABP+AdminLTE+Bootstrap Table許可權管理系統第六節--abp控制器擴充套件及json封裝
一,控制器AbpController 說完了Swagger ui 我們再來說一下abp對控制器的處理和json的封裝. 首先我們定義一個控制器,在新增控制器的時候,控制器會自動繼承自AbpController,AbpController
ABP+AdminLTE+Bootstrap Table許可權管理系統第一節--使用ASP.NET Boilerplate模板建立解決方案
ABP+AdminLTE+Bootstrap Table許可權管理系統一期 Github:https://github.com/Jimmey-Jiang/ABP-ASP.NET-Boilerplate-Project-CMS 前往部落格園總目錄
ABP+AdminLTE+Bootstrap Table許可權管理系統一期
初衷 學而時習之,不亦說乎,溫顧溫知新,可以為師矣. 看懂遠不如動手去做,動手做才能發現很多自己不懂的問題,不斷的反思和總結,“樂於分享是一種境界的突破”。" 分享是很有意思,也是可以鍛鍊人的。 分享意味著自我的不斷淨化提升,不給自己後退的餘地。為什麼這麼說呢?因為:一,分
ABP+AdminLTE+Bootstrap Table許可權管理系統第二節--在ABP的基礎做資料庫指令碼處理
第一點,上一篇文章中我們講到codefirst中一些問題包括如圖,codefirst在每次執行命令的時候會生成新的類,後來會越來越多。 1,codefirst在執行的資料庫遷移過程中產生了很多檔案,對於強迫症的我而言特別不爽,這些其實是可以不用生成的。 2,在codefirst實際
[ABP開源專案]--vue+vuex+vue-router+EF的許可權管理系統
好久沒寫文字了,當然大家也不期待嘛,反正看程式碼就行了。 演示網站 首先說下這個專案吧。 如標題一樣是基於VUE+.NET開發的框架,也是群友一直吼吼吼要一個vue版本的ABP框架。 我們先來看看首頁吧: 還比較酷炫,提供下演示賬號 演示地址:http://vue.yo
多專案集中許可權管理系統 採用cas +shiro+spring mvc+mbatis+bootstrap單點登入
流程架構圖: 這裡許可權系統也可以理解為cas client專案 系統效果圖: 業務場景:多專案統一認證登入,許可權統一管理,許可權系統管理使用者資料,其他業務系統只維護業務資料,使用者資料一律來自許可權系統 該功能目前經過半個多月的努力 在巨大壓力下終於完成了! 目前國內