各們廣大的前端小伙伴們,大家好,作為 vue-admin-work系列的衍生版,vue-amdin-work-p 版本現在正式和大家見面了。
vue-admin-work-p采用當時流行的開發技術棧:
vite2 + vue3 + typescript + naive-ui
在 css處理上采用了
sass + tailwindcss
無論是在項目結構上還是代碼編寫上都和其它版本有很大的不同。
總之,你只要想學,這個框架總能幫助到你。
濟資助是幫助學生支付大學學費的任何形式的資助,如佩爾助學金或以成績為基礎的獎學金。美國留學經濟費用較高,最好了解大學能提供的財政資助,順順進行了下文整理,請看介紹(有點多哦~)。
前言:許多家庭對大學學費的價碼感到震驚。學費價格雖然可能是一筆巨額數字,但大學財政援助可以使高等教育負擔得起。
事實上,根據Sallie Mae/Ipsos的調查,收入和儲蓄只是家庭用于支付學生大學費用的資源中的一小部分。調查發現,在2018-2019年期間,對于一個普通家庭來說,獎學金和助學金覆蓋了其31%的大學費用。獎學金和助學金是兩種不需要償還的大學經濟資助方式。
由于支付大學學費的復雜性,順利通過獎助學金獲取程序似乎頗具挑戰性。以下是一些常見的經濟援助問題的答案。
大學助學金幫助學生和他們的家庭支付高等教育費用,如學費和雜費、食宿費、書本費和交通費。
· 補助金-Grants.
· 獎學金-Scholarships.
· 勤工儉學-Work-study.
· 聯邦或私人貸款-Federal or private loans.
不同類型的援助是通過各種渠道提供的,如聯邦和州機構、大學、高中、基金會和公司等。學生獲得的資助取決于聯邦、州和高等教育機構的指導方針。
請記住,聯邦財政資助的運作方式是,學生必須首先通過回答一系列用來確定他們支付大學費用能力的問題來申請資助。
然后,根據申請情況給予資助,學生可以選擇接受或拒絕資助。所提供的援助的種類決定了它是否必須得到償還。有時,存在一些其他獎學金或私人資助,學生還需要完成額外的一些申請。
第一步是提交聯邦政府助學金免費申請,即FAFSA。這一申請被許多國家機構和學院和大學用來確定大學資助。
FAFSA可以通過教育部的網站免費獲得。家長們最早可于10月1日開始填寫下一學年的申請表格。FAFSA的最后提交期限是6月30日。但這個最后期限只針對聯邦財政援助。許多利用FAFSA來決定援助的學校會將最后期限提前。
一些學校——主要是私立大學——使用一種叫做“大學獎學金服務簡況(CSS Profile)”的補充表格來決定如何發放他們自己的助學金。該表單的信息項目比FAFSA更詳細,而且完成起來很耗時。
CSS簡況的初始提交費用為25美元;每個額外的申請報告需要額外的16美元。需要使用CSS的學校列表可以在大學理事會(College Board)的網站上找到,該組織負責管理和維護這一申請。
只有大約250所大學要求CSS配置文件。一般來說,更多的精英大學需要CSS文件。“記住,CSS文件將比FAFSA更深入地挖掘你家庭的財務狀況。”
例如,CSS中考慮了一些FAFSA中排除的資產。舉幾個不同的例子,它計算家庭住宅、小型企業或祖父母資助的529計劃的價值。
有兩種類型的援助:基于需求的援助和基于優秀的援助。
例如,根據FAFSA的計算,以聯邦需求為基礎的資助是由家庭支付大學學費的能力決定的。
另一方面,獎學金可以由機構、學院或私人組織頒發給具有特殊才能或運動或學術能力的學生。這些獎勵的授予不基于經濟需要。
大學生可能有資格獲得聯邦、州或教育機構的資助。機構援助是由學院提供的財政援助,因學院而異,因為每個學院都使用自己的政策和公式來決定如何發放財政援助。
根據教育部的說法,大多數學生有資格獲得某種形式的聯邦學生資助。對于聯邦財政援助,有三種類型的資金:貸款、補助金和勤工儉學。
●聯邦學生貸款。這些是來自政府的固定利率貸款。每個學年的利率在7月1日確定,并且該利率在貸款期限內是有擔保的。學生貸款的主要項目是直接貸款。根據該計劃,如果本科生是受撫養人,他們可以直接借到補貼貸款或非補貼貸款,總額最高可達3.1萬美元。被劃為獨立人士的本科生最多可以借到5.75萬美元。
●聯邦補助金。這筆聯邦資金不需要償還。最著名的高等教育補助金是佩爾補助金。獲得Pell的資格是基于家庭的預期家庭貢獻(EFC),并根據FAFSA計算。大多數家庭收入低于5萬美元的家庭通常有資格獲得一定數額的Pell。2019-2020學年的最高佩爾補助金為6195美元。例如,EFC為0的家庭將有資格獲得完全的Pell資助。
●勤工助學。這個項目提供兼職工作,通常是在校園里進行的一些工作,以幫助學生支付與大學有關的費用。并非所有學生都有資格參加聯邦勤工儉學。學生需要通過FAFSA獲得資格,并證明他們有經濟上的需要。在勤工儉學制度下,學生每小時至少賺7.25美元,這是聯邦最低工資。根據《美國如何支付大學學費報告》(How America Pays for college report),在2018-2019年間,聯邦政府用于支付大學學費的勤工儉學平均費用為1808美元。
當涉及到州援助時,大多數州將其援助限制在州內居民。北科羅拉多大學(University of Northern Colorado)經濟援助主任馬蒂?索梅洛(Marty Somero)表示:“總的來說,學生必須是該州的居民,并留在該州就讀高等教育,才能獲得助學金。”
大學援助專家說,雖然FAFSA應該在學生的雷達范圍內,使他們有資格獲得聯邦和州基金的以需求為基礎的援助,但上大學的學生可以更進一步,利用潛在成績基礎使援助最大化。這是因為獎學金是縮小出勤成本和基于需求的經濟援助之間差距的一種方式。
但并不是所有的學校都頒發獎學金。有些學校只在特殊情況下才提供獎學金。在一項年度調查中,向《美國新聞與世界報道》提交數據的上榜學校中,2018-2019年獲得獎學金的全日制學生平均比例為15%。一些學校,比如佛蒙特州的明德學院和馬薩諸塞州的阿默斯特學院,都有不頒發獎學金的政策。
專家建議,要注意最后期限。滿足大學財政資助的最后期限是很重要的,因為不同的學校有不同的申請截止期限。
例如,佛羅里達大學(University of Florida)將其財政援助的最后期限定在12月15日,這比許多其他學校提前了。事實上,學校網站鼓勵學生在截止日期前申請。根據佛羅里達大學學生金融事務辦公室的網站,“在12月15日前申請,以確保聯邦處理器有時間進行分析并將你的FAFSA結果發送到我們的辦公室。”
還有其他學校推遲了截止日期。例如,北科羅拉多大學將最后期限定在3月1日。
Somero說:“學生想要知道他們每一所申請學校的截止日期。例如,在北卡羅來納大學,如果錯過一天的最后期限,學生可能會損失5000至6000美元的免費援助,而不是家長貸款或其他類型的學生貸款。所以最后期限很重要,學校之間可能有所不同。所以學生們想要確保他們在優先期限之前提交申請。”
但家長和學生應該注意和考慮的不僅僅是制度上的最后期限。
艾奧瓦州格林內爾學院(Grinnell College)負責入學和助學金的副校長助理布拉德·林德伯格(Brad Lindberg)說:“有些州對州助學金資格有較早的最后期限,如果申請晚了,有些學校可能無法提供同樣慷慨的助學金。對截止日期和申請要求進行組織是任何申請過程的第一步。
大學財政援助官員說,雖然學校發放資助的方式有很多相似之處,但在處理申請和發放資助方面,每個學校都有自己獨特的流程。有些學校提供的助學金比其他學校多,就像有些學校收取的學費比其他學校高一樣。
“每個學院和大學在分配援助的方式上都是獨一無二的。俄亥俄代頓大學(university of Dayton)招生和財政援助主任羅布?德克爾(Rob Durkle)表示:“與各個學院和大學合作,是了解援助在特定學校如何發揮作用的最佳方式。”
杜克爾鼓勵學生家長詢問每所學校的獎助學金發放方法。例如,一些學校聲稱,他們已經完全滿足了學生出勤費的財政需求,但這些一攬子計劃可能包括貸款。包括羅德島的布朗大學(Brown University)和新澤西州的普林斯頓大學(Princeton University)在內的少數幾所大學,不管一個家庭的年收入如何,都提供不提供貸款的助學金。
德克爾說,在代頓大學,學校每年都會提高學生的經濟資助,以應對學費的上漲。從本質上講,學生大一的學費與大四的學費是一樣的。
助學金通常會在早春的時候寄到學生的郵箱里,通常是在大學錄取通知書發出之后,或者是在同一時間。索梅洛說:“從12月到4月,學生陸續可以收到自己的獎助學金獲取結果了,具體時間取決于學校。”
上訴裁決的過程被稱為職業判斷審查。
然而,學生們可能不知道上訴裁決是有可能的。根據Barnes & Noble College Insights在2019年對College Ave學生貸款的調查,大約有三分之一的學生事后會向經濟資助辦公室尋求更多的資助。
但據奧索里尼說,“你需要的不僅僅是闡述出‘我需要更多的錢’而來申請助學金。”奧索里尼說,申請上訴家庭需要一個合理的理由,讓學校重新檢查學生的財務狀況。
TEAK Fellowship是一家為來自紐約市低收入家庭的學生提供服務的非營利組織。該組織的大學指導主任丹?布萊德尼克(Dan Blednick)說,要想在上訴中獲得成功,申請者需要證明,自他們提交申請以來,他們的財務狀況確實發生了重大變化。
大學援助專家說,一個家庭通常會被要求提交一封信,概述影響他們支付能力發生變化的特殊情況。這類特殊情況可能是父母最近失業、離婚、家庭人員去世、醫療費用花費或年邁父母所需的護理費用等。
“我建議學生聯系學校經濟資助辦公室里負責你的案子的某個人,”Blednick說,他建議提供反映額外資金需求的文件。
他說,比如,如果最近家庭收入下降了,一些學校可能會考慮在有足夠證明文件的基礎上修改他們的財務計劃。他補充稱,在某些情況下,一些學校可能會提供與同行機構相當的獎勵。“如果所有這些措施都失敗了,家長可以詢問家長加貸款的可行性,增加學生聯邦貸款的可能性,或者調查私人貸款選項。”
本來在Swagger的基礎上,前后端開發人員在開發生產期間,可以借此進行更加便捷的溝通交流。可是總有些時候,遇到一些難纏的,又不講道理,偏偏覺得將Swagger文檔地址丟給客戶會不夠正式!死活要一份word文檔。
可是這個時候,如果接口數量上百個,甚至更多,一個一個手動輸入word,那將是一筆耗時的工作。但卻有什么辦法可以解決呢?
對了,利用Swagge生成的Json文件轉換為word文檔不就可以了嗎?
1. 獲取Swagger接口文檔的Json文件
2. 解析Json文件數據填充到Html的表格中
3.根據生成的html轉work文檔
1.通過Swagger源碼文件可以看到
可以拿到swagger生成的文檔數據,所以我們可以新建一個控制器SwaggerController.cs,
private readonly SwaggerGenerator _swaggerGenerator;
public SwaggerController(SwaggerGenerator swaggerGenerator)
{
_swaggerGenerator=swaggerGenerator;
}
/// <summary>
/// 導出文件
/// </summary>
/// <param name="type">文件類型</param>
/// <param name="version">版本號V1</param>
/// <returns></returns>
[HttpGet]
public FileResult ExportWord(string type,string version)
{
string contenttype=string.Empty;
var model=_swaggerGenerator.GetSwagger(version); //1. 根據指定版本獲取指定版本的json對象。
}
2. 在Startup.cs文件中,利用net core的ioc容器,注入SwaggerGenerator實例化,這樣在后面的調用中可以直接使用這個方法
services.AddScoped<SwaggerGenerator>(); //注入SwaggerGenerator,后面可以直接使用這個方法
根據上面獲取的model文件數據,這個時候,我們利用Razor文件,結合html的table模板,將數據遍歷填充到頁面中,生成完整的頁面
Html模板
@using Swashbuckle.AspNetCore.Swagger;
<!DOCTYPE html>
<html>
<head>
<title>Swagger API文檔代碼文件</title>
<style type='text/css'>
table, table td, table th {
border: 1px solid #000000;
border-collapse: collapse;
}
table {
table-layout: fixed;
word-break: break-all;
}
tr {
height: 20px;
font-size: 12px;
}
</style>
</head>
<body>
<div style='width:1000px; margin: 0 auto'>
<span><i>Word接口文檔</i></span>
<h1 align="center">@Model.Info.Title</h1>
<h1 align="center">接口文檔 @Model.Info.Version</h1>
<h4>聯系方式</h4>
<span>作者:@Model.Info.Contact.Name</span>
<br>
<a href="mailto:@Model.Info.Contact.Email" rel="noopener noreferrer" class="link">Send email to Xunit.Core</a>
<br>
<a href="@Model.Info.Contact.Url" target="_blank" rel="noopener noreferrer" class="link">@Model.Info.Contact.Name - Website</a>
<br>
<h3>接口描述</h3>
<span>@Model.Info.Description</span>
<br>
<table border='1' cellspacing='0' cellpadding='0' style="table-layout: fixed; word-break: break-all;border: 1px solid #000000;border-collapse: collapse;" width='100%'>
<tr style="border: 1px solid #000000;border-collapse: collapse;">
<td align="center" style="background-color: rgb(84, 127, 177);">說明</td>
<td></td>
</tr>
<tr style="border: 1px solid #000000;border-collapse: collapse;">
<td align="center" style="background-color: rgb(84, 127, 177);">類型</td>
<td></td>
</tr>
</table>
@foreach (var item in Model.Paths)
{
if (item.Value.Operations !=null)
{
foreach (var operation in item.Value.Operations)
{
<h3>@operation.Value.Summary</h3>
<table border='1' cellspacing='0' cellpadding='0' width='100%' style="table-layout: fixed; word-break: break-all;border: 1px solid #000000;border-collapse: collapse;">
<tr style="background-color: rgb(84, 127, 177);" align="center">
<td colspan='5'></td>
</tr>
<tr style="border: 1px solid #000000;border-collapse: collapse;">
<td style="border: 1px solid #000000;border-collapse: collapse;">URL</td>
<td colspan='4'>@item.Key</td>
</tr>
<tr style="border: 1px solid #000000;border-collapse: collapse;">
<td style="border: 1px solid #000000;border-collapse: collapse;">請求方式</td>
<td colspan='4'>
@operation.Key
</td>
</tr>
@if (operation.Value.Parameters !=null && operation.Value.Parameters.Count > 0)
{
<tr style="background-color: rgb(84, 127, 177);" align='center'>
<td style="border: 1px solid #000000;border-collapse: collapse;">參數名</td>
<td style="border: 1px solid #000000;border-collapse: collapse;">參數類型</td>
<td style="border: 1px solid #000000;border-collapse: collapse;">是否必填</td>
<td style="border: 1px solid #000000;border-collapse: collapse;" colspan='2'>說明</td>
</tr>
@foreach (var param in operation.Value.Parameters)
{
<tr align='center' style="border: 1px solid #000000;border-collapse: collapse;">
<td style="border: 1px solid #000000;border-collapse: collapse;">@param.Name</td>
<td style="border: 1px solid #000000;border-collapse: collapse;">@param.In</td>
<td style="border: 1px solid #000000;border-collapse: collapse;">@param.Required</td>
<td style="border: 1px solid #000000;border-collapse: collapse;" colspan='2'>@param.Description</td>
</tr>
}
}
<tr style="background-color: rgb(84, 127, 177);" align='center'>
<td style="border: 1px solid #000000;border-collapse: collapse;">狀態碼</td>
<td style="border: 1px solid #000000;border-collapse: collapse;" colspan='4'>說明</td>
</tr>
@if (operation.Value.Responses !=null && operation.Value.Responses.Count > 0)
{
foreach (var response in operation.Value.Responses)
{
<tr align='center' style="border: 1px solid #000000;border-collapse: collapse;">
<td style="border: 1px solid #000000;border-collapse: collapse;">@response.Key</td>
<td style="border: 1px solid #000000;border-collapse: collapse;" colspan='4'>@response.Value.Description</td>
</tr>
}
}
<tr style="background-color: rgb(84, 127, 177);">
<td style="border: 1px solid #000000;border-collapse: collapse;" colspan='5'>示例</td>
</tr>
<tr style="height: 40px;" style="border: 1px solid #000000;border-collapse: collapse;">
<td style="background-color: rgb(84, 127, 177);">請求參數</td>
<td style="border: 1px solid #000000;border-collapse: collapse;" colspan='4'></td>
</tr>
<tr style="height: 40px;" style="border: 1px solid #000000;border-collapse: collapse;">
<td style="background-color: rgb(84, 127, 177);">返回值</td>
<td style="border: 1px solid #000000;border-collapse: collapse;" colspan='4'></td>
</tr>
</table>
<br>
}
}
}
</div>
</body>
</html>
將數據遍歷到靜態頁面中,
/// <summary>
/// 將數據遍歷靜態頁面中
/// </summary>
/// <param name="templatePath">靜態頁面地址</param>
/// <param name="model">獲取到的文件數據</param>
/// <returns></returns>
public static string GeneritorSwaggerHtml(string templatePath, OpenApiDocument model)
{
var template=System.IO.File.ReadAllText(templatePath);
var result=Engine.Razor.RunCompile(template, "i3yuan", typeof(OpenApiDocument), model);
return result;
}
/// <summary>
/// 靜態頁面轉文件
/// </summary>
/// <param name="html">靜態頁面html</param>
/// <param name="type">文件類型</param>
/// <param name="contenttype">上下文類型</param>
/// <returns></returns>
public Stream SwaggerConversHtml(string html, string type, out string contenttype)
{
string fileName=Guid.NewGuid().ToString() + type;
//文件存放路徑
string webRootPath=_hostingEnvironment.WebRootPath;
string path=webRootPath + @"\Files\TempFiles\";
var addrUrl=path + $"{fileName}";
FileStream fileStream=null;
var provider=new FileExtensionContentTypeProvider();
contenttype=provider.Mappings[type];
try
{
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
var data=Encoding.Default.GetBytes(html);
var stream=ByteHelper.BytesToStream(data);
//創建Document實例
Document document=new Document();
//加載HTML文檔
document.LoadFromStream(stream, FileFormat.Html, XHTMLValidationType.None);
//保存為Word
document.SaveToFile(addrUrl, FileFormat.Docx);
document.Close();
fileStream=File.Open(addrUrl, FileMode.OpenOrCreate);
var filedata=ByteHelper.StreamToBytes(fileStream);
var outdata=ByteHelper.BytesToStream(filedata);
return outdata;
}
catch (Exception)
{
throw;
}
finally
{
if (fileStream !=null)
fileStream.Close();
if (File.Exists(addrUrl))
File.Delete(addrUrl);//刪掉文件
}
}
public class ByteHelper
{
public static byte[] StreamToBytes(Stream stream)
{
byte[] bytes=new byte[stream.Length];
stream.Read(bytes, 0, bytes.Length);
// 設置當前流的位置為流的開始
stream.Seek(0, SeekOrigin.Begin);
return bytes;
}
/// 將 byte[] 轉成 Stream
public static Stream BytesToStream(byte[] bytes)
{
Stream stream=new MemoryStream(bytes);
return stream;
}
}
將html轉換為word后,我們就可以看到帶有 .doc 的效果了!差不多是如下效果
1. 到這基本就結束了,通過簡易的幾個接口的方式,展示了如何通過將Swagger接口文檔生成word文檔。可以根據自己的html模板生成各式的word樣式文檔說明。
2.寫這篇番外主要是因為之前介紹了關于如何使用Swagger生成在線文檔,但實際工作中,可能也會遇到這種要各種正式word文檔的客戶,所以在此分享一些想法和思路,同時希望大家不吝指教。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。