㈠ webuploader分片上傳的實現代碼(前後端分離)
本文介紹了webuploader分片上傳的實現代碼(前後端分離),分享給大家,具體如下:
WebUploader是由Bai
WebFE(FEX)團隊開發的一個簡單的以HTML5為主,FLASH為輔的現代文件上傳組件。在現代的瀏覽器裡面能充分發揮HTML5的優勢,同時又不摒棄主流IE瀏覽器,沿用原來的FLASH運行時,兼容IE6+,iOS
6+,
android
4+。兩套運行時,同樣的調用方式,可供用戶任意選用。採用大文件分片並發上傳,極大的提高了文件上傳效率。(這個是從官網上直接的解釋)
功能描述
1、webuploader是網路研發的上傳組件,文檔不是特別規整,但是也夠用了。
2、前端使用官網的上傳圖片demo,在此基礎上代碼略微調整做分片。既可以上傳圖片也可以上傳文件。文件超過分片大小才啟用分片。
3、分片上傳已做md5校驗,達到秒傳的效果。分片以後需要合並,可以先分片後合並,也可以邊分片邊合並,本示例採用的是邊分片邊合並的方案。
4、後端用springboot做框架搭建。springMVC做rest服務,開啟跨域訪問。
5、容器用springboot內置的tomcat插件,運行Application的main方法即可啟動服務;
顯示效果
關鍵代碼前端
WebUploader.Uploader.register({
'name':
'webUploaderHookCommand',
'before-send-file':
'beforeSendFile',
"before-send":
"beforeSend"
},
{
beforeSendFile:
function(file)
{
var
task
=
new
WebUploader.Deferred();
fileName
=
file.name;
fileSize
=
file.size;
(new
WebUploader.Uploader()).md5File(file,
0,
10
*
1024
*
1024).progress(function(percentage)
{}).then(function(val)
{
fileMd5
=
val;
var
url
=
checkUrl;
var
data
=
{
type:
0,
fileName:
fileName,
fileMd5:
fileMd5,
fileSize:
fileSize
};
$.ajax({
type:
"POST",
url:
url,
data:
data,
cache:
false,
async:
false,
//
同步
timeout:
1000,
//
todo
超時的話,只能認為該分片未上傳過
dataType:
"json",
error:
function(XMLHttpRequest,
textStatus,
errorThrown)
{
file.statusText
=
'server_error';
task.reject();
}
}).then(function(data,
textStatus,
jqXHR)
{
if(data.rtn
==
0)
{
if(data.obj
==
1)
{
file.statusText
=
'file_existed';
task.reject();
}
else
{
task.resolve();
}
}
else
{
task.reject();
}
});
});
return
task.promise();
},
beforeSend:
function(block)
{
var
task
=
new
WebUploader.Deferred();
var
url
=
checkUrl;
var
data
=
{
type:
1,
fileName:
fileName,
fileMd5:
fileMd5,
chunk:
block.chunk,
fileSize:
block.end
-
block.start
};
$.ajax({
type:
"POST",
url:
url,
data:
data,
cache:
false,
async:
false,
//
同步
timeout:
1000,
//
todo
超時的話,只能認為該分片未上傳過
dataType:
"json"
}).then(function(data,
textStatus,
jqXHR)
{
if(data.rtn
==
0
&&
data.obj
==
1)
{
task.reject();
//
分片存在,則跳過上傳
}
else
{
task.resolve();
}
});
this.owner.options.formData.fileMd5
=
fileMd5;
this.owner.options.formData.chunkSize
=
chunkSize;
return
task.promise();
}
});
//
實例化
uploader
=
WebUploader.create({
pick:
{
id:
'#filePicker',
label:
'點擊選擇文件'
},
formData:
{
uid:
123
},
dnd:
'#dndArea',
//指定文件拖拽的區域
paste:
'#uploader',
//指定監聽paste事件的容器,如果不指定,不啟用此功能。此功能為通過粘貼來添加截屏的圖片。建議設置為document.body.
swf:
'../plugins/webuploader/Uploader.swf',
chunked:
true,
chunkSize:
chunkSize,
chunkRetry:
false,
threads:
1,
server:
uploadUrl,
//
runtimeOrder:
'flash',
//
accept:
{
//
title:
'Images',
//
extensions:
'gif,jpg,jpeg,bmp,png',
//
mimeTypes:
'image/*'
//
},
//
禁掉全局的拖拽功能。這樣不會出現圖片拖進頁面的時候,把圖片打開。
disableGlobalDnd:
true,
fileNumLimit:
300
//限制多文件上傳的個數
//fileSizeLimit:
200
*
1024
*
1024,
//
限制所有文件的大小
200
M
//fileSingleSizeLimit:
50
*
1024
*
1024
//
限制單個文件的大小
50
M
});
後端
import
java.io.File;
import
java.io.IOException;
import
org.slf4j.Logger;
import
org.slf4j.LoggerFactory;
import
org.springframework.beans.factory.annotation.Value;
import
org.springframework.stereotype.Service;
import
org.springframework.web.multipart.MultipartFile;
import
com.bear.upload.util.FileUtil;
import
com.bear.upload.util.RETURN;
import
com.bear.upload.vo.CheckMd5FileVO;
import
com.bear.upload.vo.UploadVO;
@Service
public
class
ChunkUploadService
{
private
static
Logger
LOG
=
LoggerFactory.getLogger(ChunkUploadService.class);
@Value("${file.upload.path}")
private
String
UPLOAD_PATH;
private
static
final
String
Delimiter
=
"-";
/**
*
上傳之前校驗(整個文件、分片)
*
*
@param
md5FileVO
*
@return
*/
public
Object
check(CheckMd5FileVO
md5FileVO)
{
Integer
type
=
md5FileVO.getType();
Long
chunk
=
md5FileVO.getChunk();
String
fileName
=
md5FileVO.getFileName();
Long
fileSize
=
md5FileVO.getFileSize();
if
(type
==
0)
{//
未分片校驗
String
destfilePath
=
UPLOAD_PATH
+
File.separator
+
fileName;
File
destFile
=
new
File(destfilePath);
if
(destFile.exists()
&&
destFile.length()
==
fileSize)
{
return
RETURN.success("文件已存在,跳過",
1);
}
else
{
return
RETURN.success("文件不存在",
0);
}
}
else
{//
分片校驗
String
fileMd5
=
md5FileVO.getFileMd5();
String
destFileDir
=
UPLOAD_PATH
+
File.separator
+
fileMd5;
String
destFileName
=
chunk
+
Delimiter
+
fileName;
String
destFilePath
=
destFileDir
+
File.separator
+
destFileName;
File
destFile
=
new
File(destFilePath);
if
(destFile.exists()
&&
destFile.length()
==
fileSize)
{
return
RETURN.success("分片已存在,跳過",
1);
}
else
{
return
RETURN.success("分片不存在",
0);
}
}
}
/**
*
文件上傳
*
*
@param
file
*
@param
uploadVO
*
@param
appVersion
*
@return
*/
public
Object
upload(MultipartFile
file,
UploadVO
uploadVO)
{
Long
chunk
=
uploadVO.getChunk();
if
(chunk
==
null)
{//
沒有分片
return
UnChunkUpload(file,
uploadVO);
}
else
{//
分片
return
ChunkUpload(file,
uploadVO);
}
}
/**
*
分片上傳
*
*
@param
file
*
@param
uploadVO
*
@param
appVersion
*
@return
*/
public
Object
ChunkUpload(MultipartFile
file,
UploadVO
uploadVO)
{
String
fileName
=
uploadVO.getName();
String
fileMd5
=
uploadVO.getFileMd5();
Long
chunk
=
uploadVO.getChunk();//
當前片
Long
chunks
=
uploadVO.getChunks();//
總共多少片
//
分片目錄創建
String
chunkDirPath
=
UPLOAD_PATH
+
File.separator
+
fileMd5;
File
chunkDir
=
new
File(chunkDirPath);
if
(!chunkDir.exists())
{
chunkDir.mkdirs();
}
//
分片文件上傳
String
chunkFileName
=
chunk
+
Delimiter
+
fileName;
String
chunkFilePath
=
chunkDir
+
File.separator
+
chunkFileName;
File
chunkFile
=
new
File(chunkFilePath);
try
{
file.transferTo(chunkFile);
}
catch
(Exception
e)
{
LOG.error("分片上傳出錯",
e);
return
RETURN.fail("分片上傳出錯",
1);
}
//
合並分片
Long
chunkSize
=
uploadVO.getChunkSize();
long
seek
=
chunkSize
*
chunk;
String
destFilePath
=
UPLOAD_PATH
+
File.separator
+
fileName;
File
destFile
=
new
File(destFilePath);
if
(chunkFile.length()
>
0)
{
try
{
FileUtil.randomAccessFile(chunkFile,
destFile,
seek);
}
catch
(IOException
e)
{
LOG.error("分片{}合並失敗:{}",
chunkFile.getName(),
e.getMessage());
return
RETURN.fail("分片合並失敗",
1);
}
}
if
(chunk
==
chunks
-
1)
{
//
刪除分片文件夾
FileUtil.deleteDirectory(chunkDirPath);
return
RETURN.success("上傳成功",
1);
}
else
{
return
RETURN.fail("上傳中...",
1);
}
}
/**
*
未分片上傳
*
*
@param
file
*
@param
uploadVO
*
@param
appVersion
*
@return
*/
public
Object
UnChunkUpload(MultipartFile
file,
UploadVO
uploadVO)
{
String
fileName
=
uploadVO.getName();
//
String
fileMd5
=
uploadVO.getFileMd5();
//
文件上傳
File
destFile
=
new
File(UPLOAD_PATH
+
File.separator
+
fileName);
if
(file
!=
null
&&
!file.isEmpty())
{
//
上傳目錄
File
fileDir
=
new
File(UPLOAD_PATH);
if
(!fileDir.exists())
{
fileDir.mkdirs();
}
if
(destFile.exists())
{
destFile.delete();
}
try
{
file.transferTo(destFile);
return
RETURN.success("上傳成功",
0);
}
catch
(Exception
e)
{
LOG.error("文件上傳出錯",
e);
return
RETURN.fail("文件上傳出錯",
0);
}
}
return
RETURN.fail("上傳失敗",
0);
}
}
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
您可能感興趣的文章:Vue2.0結合webuploader實現文件分片上傳功能使用WebUploader實現分片斷點上傳文件功能(二)webuploader在springMVC+jquery+Java開發環境下的大文件分片上傳的實例代碼jQuery
webuploader分片上傳大文件
㈡ 請問,電腦桌面上方出現一條線,使勁點擊後出現todo文件說明,不懂啥意思,無法檢測出病毒,且開機自啟動
1.運行—MSconfig—系統配置—啟動,找到TODO:<產品名>禁止啟動後,重啟電腦後桌面上方就不會出現橫線了!
2.在桌面空白的地方右鍵,目的是打開顯示屬性。在「桌面」選項找到「自定義桌面」,然後在「桌面項目」中找到「web」,去掉裡面的勾選試試。
如果這樣還有問題,那還是換個桌面吧。或是截圖發出來看看到底是什麼。
3.你直接把天翼寬頻卸載,卸載的時候把提示的「是否保留驅動」也勾上,就是全部清除干凈,這樣就好了。重新開機,如果還是出現那個橫線,打開任務管理器,找到進程里的TODO,點右鍵「打開文件夾位置」,然後關掉這個進程,去文件夾裡面把這個文件夾刪掉,就OK啦!(刪不了的話,就重啟後再去試,因為可能這個程序在運行,不讓刪)
㈢ 誰有好的可以和Windows同步的ToDo程序推薦
試用過TODO,2DO,好像都沒有PC或WEB端可以同步,TODO PRO的網頁端不能新增任務
㈣ 企業開源指南:開源項目管理工具
為了讓開源項目辦公室順利運行,您需要正確的工具。這些關鍵的任務工具將用於追蹤各部門的目標與指標,從工程部門和法律部門到行政領導部門、公關部門與營銷部門,同時給予員工收集數據、提供開源軟體運行快照和管理公司內部開源軟體日常使用所需要的全部資源。
-- Todo
開放源代碼的戰略性應用之路,起始於一個精心策劃、組織與授權的開源項目辦公室,以指導和管理開源的創建、分發和使用。但這僅僅只是第一步。為了讓開源項目辦公室順利運行,您需要正確的工具。這些關鍵的任務工具將用於追蹤各部門的目標與指標,從工程部門和法律部門到行政領導部門、公關部門與營銷部門,同時給予員工收集數據、提供開源軟體運行快照和管理公司內部開源軟體日常使用所需要的全部資源。
本指南提供了如何開始您的開源工具集建設的詳細信息和場景,包括用於跟蹤和管理您的開源項目的最重要工具的信息。指南中提及的許多工具已由Linux基金會和該領域的其他領導者創建並開放源代碼,可以免費且便捷地為您的項目所使用。您還可以找到一個儀表盤安裝程序的示例,該程序融合並展示了多種工具的信息。
一旦您的開源項目辦公室啟動運行,就應該同時收集合適的軟體工具,這些工具允許您的開發團隊管理、跟蹤、指導和推進其開源項目、開源貢獻與開源發布。
在您開始您的開放源代碼之路時,使用正確的目標工具還將使開發人員和其他員工的工作更為輕松,也將提供更好的結果,並將成為公司開源項目的成功協作與溝通的基礎。
公司所需的開源工具有哪些?早期的討論大多認為,這取決於公司的業務、產品和服務,以及公司如何服務它的客戶和員工。由於開源項目辦公室制定了規劃流程和戰略地圖,因此可以選擇那些能整合進公司的目標、流程和基礎架構的工具。
最終,知道您將需要使用哪些工具的唯一方法,就是了解您想要對開放源代碼進行何種操作。
以下是開源項目辦公室選擇所需管理工具的基本步驟:
這些工具一旦被選定,在落地使用之前,還需要一些額外的准備:
當您在選擇工具時,實施操作有助於記憶,當然這也可能會影響您的決定。例如,具有陡峭學習曲線的工具可能需要更多的培訓。
在認識到達成組織的目標上你團隊的需求,以及自身情況和基礎架構的潛在限制之後之後,接下來要做的就是要 探索 並了解那些已准備就緒且可供您使用現有工具。由於大多數工具本身就是開源的,所以如果它們一開始並不能滿足您的確切需求,您的開發團隊可以聯系這些工具的開發者,看看他們是否可以協作根據新的用途添加一些特性。
諷刺的是,許多開源項目辦公室並不經常直接使用其他公司開發的工具,或與其他公司合作來開發他們管理開源項目所需的工具。通常,他們想要這樣做,但包括 Facebook 和微軟在內的許多企業已經擁有現有的工具套件,這些工具套件在真正成為一個合作議題之前就已經實現。由於他們已經擁有了自己的工具集並進行了投資,他們似乎並沒有很大意願採用其他公司的工具。
這就是現在才剛開始構建自己的開源項目的公司具有顯著優勢的地方。由於他們現在正在建立自己的開源項目辦公室並進入開源領域,因此他們不必為受到這樣的限制而煩惱。
相反,他們可以聰明地利用別人的成功經驗與失敗教訓,並利用近年來領先的公司所創建的成熟工具來構建自己的開源工具箱。 Linux 基金會的開源行業組織,TODO Group,一直致力於組裝一個裝滿工具的 「Open Source Program Office in A Box」 入門套件,這將使公司能夠通過一套緊密結合的預先組裝工具開展開源工作。入門套件目前尚未開發完善,但希望最終可以讓公司付出更少的初始努力,更輕松地部署和配置他們所需的工具。從事這個項目的 TODO Group 成員包括 Adobe、Capital One、Comcast、Facebook、谷歌、eBay、IBM、微軟、三星和 Twitter。
除了適當的工具之外,公司還應該有中央儀錶板,以便他們實時監控和跟蹤他們的開源項目和開發情況。許多公司可能已經擁有了用於現有開發工作和應用程序的儀錶板,並且能夠將現有儀錶板與其開源工作整合在一起。否則,他們應該創建或採用新的儀錶板來改進其開源部署的管理。
正在出現越來越多的用於管理和報告開源項目的工具,這一趨勢已經非常明顯。如果您的開源項目剛剛開始,那麼將您的研究集中在幾個您啟動和運行所需的基本工具上會更有幫助。
隨著您的項目不斷發展,以及使用這些工具的經驗越來越豐富,您可以開始採用新的工具,來幫助自動化並簡化您的流程,響應業務需求的增長。切記,新選擇的工具將用於內部文化和流程的補充和支持——而不是引導它們。
以下章節列出了幾個基本的工具類別,幾乎所有開源項目日常使用的工具都可以劃分到這些類別。這有助於您對該研究有系統性的認識。
為滿足公司的更多需求,自動化工具變得越來越龐大且規模化。它們可以准確地告訴您誰正在為您的項目做出貢獻,並且可以幫助您消除那些減慢項目進度的程序摩擦。
據微軟表示,在其開源項目辦公室里,大約有 8000 個倉庫在 GitHub 上託管,涉及約 11,000 名貢獻者,而在 2016 年約有 40,000 個內部請求應用於開源項目。為了管理這些請求,以及所創建的代碼和正在更新的代碼版本,公司轉而使用可以自動化解決混亂的工具。不僅如此,由於數百個項目中很可能會共用同一段代碼,因此必須對其進行仔細跟蹤,以便在出現安全錯誤時,可以快速繪制並修復所有的軟體影響。在如此大規模的情況下,自動化非常關鍵,手動更新幾乎是不可能的。
那些有助於管理關鍵任務的工具,也是需要考慮和獲取的。例如用於項目管理、跟蹤項目質量狀況,以及確保開發人員、開源社區和其他公司內部人員之間的清晰且快速溝通的。
大多數通過開源項目辦公室開發的企業軟體項目都使用 GitHub 作為其集中託管和開發的平台。
GitHub 是一個在線源代碼管理站點,它允許開源開發人員在一個中央「存儲庫」或存儲空間中管理和存放他們的代碼,參與者可以協作並開發他們的代碼。如今,大約有 6400 萬個開源代碼項目在 GitHub 上託管,涉及大約 2300 萬個開發人員。
GitHub 用戶可以添加代碼、查看已提交的代碼、申請更改、獲取並提供反饋,以及使用該服務提供項目管理。GitHub 使用 Git Version Control System ,這是由 Linux 創建者 Linus Torvalds 開發的開放源代碼項目,為代碼和合作開源人員提供了組織機構。每位「貢獻者」都有他們正在處理的項目存儲庫的副本,他們可以在自己計算機中的副本里進行更改,然後將其提交回項目以供未來納入。然後,「 拉取請求(pull request)」( 示例 )或代碼貢獻會被項目組織者審查、討論、修改,最後批准或拒絕。
代碼掃描和合規工具也很重要,它們有助於追蹤代碼起源和許可要求。關注被引入自身基礎架構、產品和服務中的開放源代碼以確保符合許可證的要求,對於公司來說是很重要的。
例如,您的應用程序可能包含數千個開源組件。為了保護您的公司免於法律糾紛,了解這些細節是至關重要的。在風險較高的情況下,用戶必須根據其業務在風險譜中的所處位置,深入了解代碼,從而深入地審核並驗證他們所說的許可證。(請參閱我們關於使用和分發開放源代碼的指南。)
如前所述,GitHub 是服務於目前大多數開源項目辦公室的專業源代碼管理系統。但是 GitHub 本身並不能滿足項目代碼管理的所有需求——特別是當您大規模發展的時候。
開源世界中所使用的一些工具旨在通過添加欠缺的功能來改進GitHub本身,例如支持檢查開發者原產地證書(DCO)語句,以確保代碼可以被合法授權且應用於開源項目中。
GitHub 在代碼審查方面也存在一些不足之處,所以有其他可用的工具可以自動將有問題的代碼發回給創建它的貢獻者,然後要求他們檢查並做出必要的修改。GitHub 沒有辦法強迫任何人檢查他們的代碼,而這些聰明的工具解決了這一問題,使工作流程得以改善。
其他 GitHub 特定工具的功能用於提高 GitHub 的性能指標,這些功能通常針對特定項目,而不是提供給整個組織詳細信息。對於在多個 GitHub 項目中維護許多開源代碼庫的公司而言,需要更好的工具來組織和匯總它們,使之有意義。亞馬遜、Netflix 和微軟提供了大量這樣的工具來幫助完成這些任務。
以下是一些最流行和實用的源代碼管理工具,可以簡化並幫助您的 GitHub 運作:
隨著開源項目的發展和成熟,監控和跟蹤開源項目的整體質量是企業開源項目的核心任務。為了實現這一目標,您必須收集相應的工具,這些工具應當能夠反映單獨的開源項目的執行過程並反映單獨的開源項目在數十、數百甚至數千個項目中被它們的社區接收的過程。同時,這些工具還必須兼具轉化能力, 能夠將收集的數據轉化為體現整個開源組合中整體項目性能的有意義的、實用的且可操作的信息。
這其中的關鍵是,您收集到的數據應當可以轉化為關鍵且有用的信息 – 而不是些無用的指標,例如詳細說明項目已記錄了多少「觀察者」明星,自項目開始以來有多少貢獻者參與了該項目,亦或是缺乏重要背景資料的其他指標。
最好的項目質量監測工具還必須幫助項目團隊對支持他們工作的社區做出回應,同時鼓勵貢獻開發者的參與和多樣化。這意味著這些工具可以幫助保持人員快速響應社區成員發布的問題或反饋,以便他們保持熱情參與,且不會感到厭倦並轉向其他項目。
一些開源社區有大量的貢獻者,而其他一些開源社區則成員較少。項目質量監測工具需要能夠適用於各種規模的項目。
以下是一些最受歡迎且實用的項目數據統計和項目質量跟蹤工具:
TODO Group 還提供了一個 很好的附加工具列表 :
當然,開源的發展並不僅僅關於代碼的開發。它還需要在企業內外部從事項目工作的不同群體之間以及公司開源項目辦公室的工作人員之間建立良好的溝通與合作。
為了達到上述目標,開發人員可以依靠他們可能已經應用於其他項目的工具,例如 Internet Relay Chat(IRC) ,開發人員可以發布 與開源開發相關的問題並快速收到回復 。另一個例子是 TWiki ,它是一個開源企業 Wiki 和 Web 協作的平台,開發人員可以在其中討論代碼和項目及相關主題。
此外,企業還可以通過社交媒體平台,門戶網站,開源項目存儲庫和其他能夠進行輸入、提問和討論的平台促進溝通交流。
其他有用的工具還包括 Facebook 公司的 mention-bot ,它可以通過自動關聯潛在審查者來獲得拉取請的快速輸入周轉以審查代碼。當 GitHub 目變得太大導致社區成員無法訂閱項目的所有通知時,這一工具尤其值得推薦。
然後是 Slack ,這是一個在線團隊項目管理與溝通平台,在這一平台中用戶可以訪問和共享消息和文件,管理工作流程,搜索信息等等。Slack可以通過設置接收支持請求、代碼簽入、錯誤日誌和其他任務的通知。
除此之外,當談到公司參與和支持開源時,不要忘記您公司的公關與營銷人員。包括 Twitter、Reddit、Facebook、LinkedIn、Google+ 等網站在內的社交媒體帳戶以及企業內外部的博客和網站的使用都是非常重要的。客戶關系管理(CRM)軟體以及電子郵件群發和新聞簡報可以幫助公司讓客戶了解他們的開源進展。
當談到企業為開源項目提供並應用的工具時,按理說最重要的是那些幫助企業管理自身企業規模 GitHub 操作的工具。GitHub 是一個可以提供許多操作的完美平台,但對於谷歌、微軟、臉書、Twitter、LinkedIn 等大型的復雜公司而言,使用標準的 GitHub 產品可能會有很多限制。
大型企業通常需要更多的功能,包括如身份管理、設置和許可權管理,安全性和雙重身份驗證執行,以及深入理解和跟蹤代碼存儲庫的方法。
因此,這些大型企業常需要構建專門的自動化工具來處理諸如入職、離職、安全策略執行以及給予開發人員請求的存儲庫訪問許可權等任務。
為滿足自身的特殊需求,微軟構建了自己的工具來處理諸如此類的任務,以簡化和改進其開源項目。微軟在 GitHub 上運行良好 ,擁有約 1,345 個存儲庫,迄今為止涉及約 3,580 名開發人員。
微軟創建了一款定製的自助服務—— GitHub management and onboarding portal ,用於組織其項目、存儲庫和團隊。在其最簡單的層次上,基於 Web 的門戶允許開發人員將他們的微軟公司ID映射到他們的GitHub ID,這可以提高系統安全性並幫助簡化參與大量重要項目的大量開發人員的組織工作。
該門戶還允許員工使用 GitHub 和微軟進行身份驗證。其創建了員工身份的一個「虛擬鏈接」,以便根據他們的工作角色向他們提供任務所需許可權以完成工作。如果員工離開公司,可根據需要調整系統以刪除或重新分類其訪問許可權。
門戶運行在一台或多台雲伺服器上,並依靠緩存來幫助進行會話和減少 GitHub API 的壓力。微軟門戶平均每天可提供約 1000 名獨立用戶作為其工程師的工具,這是該公司不斷發展的開源工作的一部分,該工作現在包括超過 10,000 名正在使用、貢獻和發布開放源代碼的工程師。
沒有人認為使公司進入開源世界是一件簡單的事情。但其他許多公司,包括微軟和谷歌等巨頭已經在您前面這樣做了,而且已提供了詳細的路線圖、代碼和建議等,這將使您自己的開源旅程變得更加輕松。
開源項目辦公室的創建和選擇一系列關鍵工具來開始開源工作,選擇權掌握在您手中。它們很可能已經激發了開發人員的極大期望,開發人員中的許多人可能已經自發為開源項目做貢獻(或在工作中,隱秘地)。
通過開源項目的合作並邀請其他人與您合作,您的公司可以獲得不可估量的收益,且能通過節能和創新推動公司發展。
擁有正確的工具對於授權貴公司的開放創新至關重要。
㈤ TODO標簽是什麼
「TODO 」的英文翻譯為「to do」 。是IDE自動生成的讓用戶自己添加實現代碼的地方,就是需要去做的事情
「//TODO 「是表示這個地方還有一些事情要做,有一些代碼要寫的意思。因為用了這個注釋,TODO是加粗的,在代碼中很明顯,所以作為程序員在編寫代碼時給自己留這個備忘。出現這個標簽是因為用了代碼自動生成工具,這個標簽提示在此處添加自己的代碼。
(5)webtodo開源擴展閱讀:
一、常見的IDE:Microsoft Visual Studio(簡稱VS)和Eclipse。
VS是微軟公司的開發工具包系列產品。VS是一個基本完整的開發工具集,它包括了整個軟體生命周期中所需要的大部分工具,如UML工具、代碼管控工具、集成開發環境(IDE)等等。
Eclipse是著名的跨平台開源集成開發環境(IDE)。最初主要用來Java語言開發,目前亦有人通過插件使其作為C++、Python、PHP等其他語言的開發工具。
二、IDE優點:節省時間和精力。IDE的目的就是要讓開發更加快捷方便,通過提供工具和各種性能來幫助開發者組織資源,減少失誤,提供捷徑。建立統一標准。當一組程序員使用同一個開發環境時,就建立了統一的工作標准,當IDE提供預設的模板,或者不同團隊分享代碼庫時,這一效果就更加明顯了。
㈥ 有沒有更好的todo軟體推薦(android)
1、高效Todo。
一般的 todo 應用只是添加待辦最多再設置一下緊急不緊急,而高效 todo 則是按四象限時間管理科學的安排任務的優先順序,幫助你專注於最重要的事。就像有句說,你一天的價值不是你做完了多少事,而是你做了多少有價值的事。小美在轉戰 iOS 之前入坑時間最長的 todo 產品,每天都會在這款應用里寫總結與感悟。目前僅支持 Android 和Web。
㈦ web前端開發都包括哪些技術
1、學會HTML
HTML是網頁內容的載體內容就是網頁製作者放在頁面上想要讓用戶瀏覽的信息,可以包含文字、圖片、視頻等。要熟練掌握div、table、ul li 、p、span等這些標簽,這些都是最常用的。
2、學習CSS(Cascading Style Sheets)—樣式。
一般看到web前端開發工程師的要求裡面,有一個會使用css+html 或者 css+div 來進行界面布局,所以css是用於輔助html來布局和展示的,
稱之為「css樣式」,CSS要熟練掌握float、position、width、height,以及對於的最大最小、會使用百分百、overflow、margin、padding,標題字體、顏色變化,或為標題加入背景圖片、邊框等等,這些都是跟布局有關系的樣式,必須要掌握的。
3、JS(java)—— 行為
java是用來實現網頁上的特效效果。如:滑鼠滑過彈出下拉菜單。或滑鼠滑過表格的背景顏色改變。還有焦點新聞(新聞圖片)的輪換。可以這么理解,有動畫的,有交互的一般都是用Java來實現的。
4、學習jquery
jquery是相當於把js封裝了一套的一個js插件,目的就是操作起來更方便,代碼寫的更少,jquery入門也很簡單,那些是入門需要學的和js一樣,只是換成了jq的代碼.其他的一樣網路就夠了。
5、最好會點後台語言,比如java、php,因為前台界面的數據都是從後台來的,如果會點後台代碼,就知道怎麼跟後台交互數據是最好的, 這樣節約時間,也可以讓前端代碼更規范.不然可能因為你的寫法和後端給來的數據不能結合上,那麼前端代碼又得重新寫,那就更麻煩了。
㈧ 求一套完整的JAVA WEB項目的網路購物網站源代碼
/**
*@description:
*@authorchenshiqiangE-mail:[email protected]
*@date2014年9月7日下午2:51:50
*@version1.0
*/
packagecom.example.map;
importjava.util.ArrayList;
importjava.util.Collections;
importjava.util.HashSet;
importjava.util.List;
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.support.v4.view.PagerAdapter;
importandroid.support.v4.view.PagerTabStrip;
importandroid.support.v4.view.ViewPager;
importandroid.text.Editable;
importandroid.util.Log;
importandroid.view.LayoutInflater;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.widget.ExpandableListView;
importandroid.widget.ListView;
importcom..mapapi.map.offline.MKOLSearchRecord;
importcom..mapapi.map.offline.MKOLUpdateElement;
importcom..mapapi.map.offline.MKOfflineMap;
importcom..mapapi.map.offline.MKOfflineMapListener;
importcom.example.map.adapters.OfflineExpandableListAdapter;
importcom.example.map.adapters.OfflineMapAdapter;
importcom.example.map.adapters.OfflineMapManagerAdapter;
importcom.example.map.interfaces.;
importcom.example.map.models.OfflineMapItem;
importcom.example.map.utils.CsqBackgroundTask;
importcom.example.map.utils.ToastUtil;
importcom.example.system.R;
istener,
{
//------------------------Constants------------------------
//-------------------------Fields--------------------------
privateViewPagerviewpager;
privatePagerTabStrippagertab;
privateMySearchViewsvDown;
privateListViewlvDown;
privateMySearchViewsvAll;
;
privateListViewlvSearchResult;
privateList<View>views=newArrayList<View>(2);
privateList<String>titles=newArrayList<String>(2);
privateMKOfflineMapmOffline=null;
;
;
;
privateList<OfflineMapItem>itemsDown;//下載或下載中城市
privateList<OfflineMapItem>itemsAll;//所有城市,與熱門城市及下載管理對象相同
privateList<OfflineMapItem>itemsProvince;
privateList<List<OfflineMapItem>>itemsProvinceCity;
//-----------------------Constructors----------------------
//--------Methodsfor/fromSuperClass/Interfaces-----------
@Override
protectedvoidonCreate(BundlesavedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_offline_map);
// finalStringpackname=this.getPackageName();
// PackageInfopackageInfo;
// try
// {
// packageInfo=this.getPackageManager().getPackageInfo(packname,PackageManager.GET_SIGNATURES);
//
//
// if(code==-00)
// {
//初始化離線地圖管理
mOffline=newMKOfflineMap();
mOffline.init(this);
initViews();
viewpager.setCurrentItem(1);
// }
// }
// catch(NameNotFoundExceptione)
// {
// e.printStackTrace();
// }
}
privatebooleanisResumed=false;
@Override
protectedvoidonResume()
{
super.onResume();
if(!isResumed)
{
isResumed=true;
loadData();
}
}
@Override
protectedvoidonDestroy()
{
super.onDestroy();
mOffline.destroy();
}
/**
*
*@authorchenshiqiangE-mail:[email protected]
*@paramtype
*事件類型:MKOfflineMap.TYPE_NEW_OFFLINE,MKOfflineMap.TYPE_DOWNLOAD_UPDATE,MKOfflineMap.TYPE_VER_UPDATE.
*@paramstate
*事件狀態:當type為TYPE_NEW_OFFLINE時,表示新安裝的離線地圖數目.當type為TYPE_DOWNLOAD_UPDATE時,表示更新的城市ID.
*/
@Override
(inttype,intstate)
{
switch(type)
{
caseMKOfflineMap.TYPE_DOWNLOAD_UPDATE:
MKOLUpdateElementupdate=mOffline.getUpdateInfo(state);
if(setElement(update,true)!=null)
{
if(itemsDown!=null&&itemsDown.size()>1)
{
Collections.sort(itemsDown);
}
refreshDownList();
}
else
{
downAdapter.notifyDataSetChanged();
}
allSearchAdapter.notifyDataSetChanged();
allCountryAdapter.notifyDataSetChanged();
break;
caseMKOfflineMap.TYPE_NEW_OFFLINE:
//有新離線地圖安裝
Log.d("OfflineDemo",String.format("addofflinemapnum:%d",state));
break;
caseMKOfflineMap.TYPE_VER_UPDATE:
//版本更新提示
break;
}
}
/**
*網路下載狀態改變(暫停--》恢復)居然不回調,所以改變狀態時自己得增加介面監聽狀態改變刷新界面
*
*@authorchenshiqiangE-mail:[email protected]
*@paramitem
*有狀態改變的item
*@paramremoved
*item是否被刪除
*/
@Override
publicvoidstatusChanged(OfflineMapItemitem,booleanremoved)
{
if(removed)
{
for(inti=itemsDown.size()-1;i>=0;i--)
{
OfflineMapItemtemp=itemsDown.get(i);
if(temp.getCityId()==item.getCityId())
{
itemsDown.remove(i);
}
}
refreshDownList();
}
else
{
loadData();
downAdapter.notifyDataSetChanged();
}
allSearchAdapter.notifyDataSetChanged();
allCountryAdapter.notifyDataSetChanged();
}
//---------------------Methodspublic----------------------
publicvoidtoDownloadPage()
{
viewpager.setCurrentItem(0);
}
//---------------------Methodsprivate---------------------
privatevoidinitViews()
{
//TODO
viewpager=(ViewPager)findViewById(R.id.viewpager);
pagertab=(PagerTabStrip)findViewById(R.id.pagertab);
LayoutInflaterinf=LayoutInflater.from(this);
Viewv1=inf.inflate(R.layout.view_offline_download,null,false);
svDown=(MySearchView)v1.findViewById(R.id.svDown);
lvDown=(ListView)v1.findViewById(R.id.lvDown);
views.add(v1);
Viewv2=inf.inflate(R.layout.view_offline_countrys,null,false);
svAll=(MySearchView)v2.findViewById(R.id.svAll);
lvWholeCountry=(ExpandableListView)v2.findViewById(R.id.lvWholeCountry);
lvSearchResult=(ListView)v2.findViewById(R.id.lvSearchResult);
views.add(v2);
titles.add("下載管理");
titles.add("城市列表");
pagertab.setTabIndicatorColor(0xff00cccc);
pagertab.setDrawFullUnderline(false);
pagertab.setBackgroundColor(0xFF38B0DE);
pagertab.setTextSpacing(50);
viewpager.setOffscreenPageLimit(2);
viewpager.setAdapter(newMyPagerAdapter());
svDown.setSearchListener(newMySearchView.SearchListener()
{
@Override
publicvoidafterTextChanged(Editabletext)
{
refreshDownList();
}
@Override
publicvoidsearch(Stringtext)
{
}
});
svAll.setSearchListener(newMySearchView.SearchListener()
{
@Override
publicvoidafterTextChanged(Editabletext)
{
refreshAllSearchList();
}
@Override
publicvoidsearch(Stringtext)
{
}
});
downAdapter=newOfflineMapManagerAdapter(this,mOffline,this);
lvDown.setAdapter(downAdapter);
allSearchAdapter=newOfflineMapAdapter(this,mOffline,this);
lvSearchResult.setAdapter(allSearchAdapter);
allCountryAdapter=(this,mOffline,this);
lvWholeCountry.setAdapter(allCountryAdapter);
lvWholeCountry.setGroupIndicator(null);
}
/**
*刷新下載列表,根據搜索關鍵字及itemsDown下載管理數量變動時調用
*/
privatevoidrefreshDownList()
{
Stringkey=svDown.getInputText();
if(key==null||key.length()<1)
{
downAdapter.setDatas(itemsDown);
}
else
{
List<OfflineMapItem>filterList=newArrayList<OfflineMapItem>();
if(itemsDown!=null&&!itemsDown.isEmpty())
{
for(OfflineMapItemi:itemsDown)
{
if(i.getCityName().contains(key))
{
filterList.add(i);
}
}
}
downAdapter.setDatas(filterList);
}
}
/**
*刷新所有城市搜索結果
*/
()
{
Stringkey=svAll.getInputText();
if(key==null||key.length()<1)
{
lvSearchResult.setVisibility(View.GONE);
lvWholeCountry.setVisibility(View.VISIBLE);
allSearchAdapter.setDatas(null);
}
else
{
lvSearchResult.setVisibility(View.VISIBLE);
lvWholeCountry.setVisibility(View.GONE);
List<OfflineMapItem>filterList=newArrayList<OfflineMapItem>();
if(itemsAll!=null&&!itemsAll.isEmpty())
{
for(OfflineMapItemi:itemsAll)
{
if(i.getCityName().contains(key))
{
filterList.add(i);
}
}
}
allSearchAdapter.setDatas(filterList);
}
}
privatevoidloadData()
{
newCsqBackgroundTask<Void>(this)
{
@Override
protectedVoidonRun()
{
//TODOAuto-generatedmethodstub
//導入離線地圖包
//將從官網下載的離線包解壓,把vmp文件夾拷入SD卡根目錄下的BaiMapSdk文件夾內。
//把網站上下載的文件解壓,將BaiMapvmpl裡面的.dat_svc文件,拷貝到手機BaiMapSDK/vmp/h目錄下
intnum=mOffline.importOfflineData();
if(num>0)
{
ToastUtil.showToastInfo(BaiOfflineMapActivity.this,"成功導入"+num+"個離線包",false);
}
List<MKOLSearchRecord>all=null;
try
{
all=mOffline.getOfflineCityList();
}
catch(Exceptione)
{
e.printStackTrace();
}
if(all==null||all.isEmpty())
{
ToastUtil.showToastInfo(BaiOfflineMapActivity.this,"未獲取到離線地圖城市數據,可能有其他應用正在使用網路離線地圖功能!",false);
returnnull;
}
List<MKOLSearchRecord>hotCity=mOffline.getHotCityList();
HashSet<Integer>hotCityIds=newHashSet<Integer>();
if(!hotCity.isEmpty())
{
for(MKOLSearchRecordr:hotCity)
{
hotCityIds.add(r.cityID);
}
}
itemsAll=newArrayList<OfflineMapItem>();
itemsDown=newArrayList<OfflineMapItem>();
itemsProvince=newArrayList<OfflineMapItem>();
itemsProvinceCity=newArrayList<List<OfflineMapItem>>();
//cityType0:全國;1:省份;2:城市,如果是省份,可以通過childCities得到子城市列表
//全國概略圖、直轄市、港澳子城市列表
ArrayList<MKOLSearchRecord>childMunicipalities=newArrayList<MKOLSearchRecord>();
proHot.cityName="熱門城市";
proHot.childCities=cs;
List<MKOLUpdateElement>updates=mOffline.getAllUpdateInfo();
if(updates!=null&&updates.size()>0)
{
}
@Override
protectedvoidonResult(Voidresult)
{
//TODOAuto-generatedmethodstub
refreshDownList();
refreshAllSearchList();
allCountryAdapter.setDatas(itemsProvince,itemsProvinceCity);
}
}.execute();
}