diff --git a/.metadata/.log b/.metadata/.log
index 0cb16378c..ea77ea8b9 100644
--- a/.metadata/.log
+++ b/.metadata/.log
@@ -209,3 +209,60 @@ java.lang.UnsupportedOperationException: Not supported yet.
at com.aptana.index.core.IndexRequestJob.indexFileStores(IndexRequestJob.java:205)
at com.aptana.index.core.IndexContainerJob.run(IndexContainerJob.java:114)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54)
+!SESSION 2015-01-17 11:30:30.655 -----------------------------------------------
+eclipse.buildId=unknown
+java.version=1.6.0_24
+java.vendor=Sun Microsystems Inc.
+BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=zh_CN
+Command-line arguments: -os win32 -ws win32 -arch x86
+
+!ENTRY org.eclipse.core.resources 4 567 2015-01-17 11:30:37.624
+!MESSAGE Workspace restored, but some problems occurred.
+!SUBENTRY 1 org.eclipse.core.resources 4 567 2015-01-17 11:30:37.624
+!MESSAGE Could not read metadata for 'demo'.
+!STACK 1
+org.eclipse.core.internal.resources.ResourceException: The project description file (.project) for 'demo' is missing. This file contains important information about the project. The project will not function properly until this file is restored.
+ at org.eclipse.core.internal.localstore.FileSystemResourceManager.read(FileSystemResourceManager.java:851)
+ at org.eclipse.core.internal.resources.SaveManager.restoreMetaInfo(SaveManager.java:874)
+ at org.eclipse.core.internal.resources.SaveManager.restoreMetaInfo(SaveManager.java:854)
+ at org.eclipse.core.internal.resources.SaveManager.restore(SaveManager.java:703)
+ at org.eclipse.core.internal.resources.SaveManager.startup(SaveManager.java:1528)
+ at org.eclipse.core.internal.resources.Workspace.startup(Workspace.java:2503)
+ at org.eclipse.core.internal.resources.Workspace.open(Workspace.java:2251)
+ at org.eclipse.core.resources.ResourcesPlugin.start(ResourcesPlugin.java:439)
+ at org.eclipse.osgi.framework.internal.core.BundleContextImpl$1.run(BundleContextImpl.java:711)
+ at java.security.AccessController.doPrivileged(Native Method)
+ at org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:702)
+ at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:683)
+ at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:381)
+ at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:299)
+ at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:440)
+ at org.eclipse.osgi.internal.loader.BundleLoader.setLazyTrigger(BundleLoader.java:268)
+ at org.eclipse.core.runtime.internal.adaptor.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107)
+ at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(ClasspathManager.java:463)
+ at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(DefaultClassLoader.java:216)
+ at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:400)
+ at org.eclipse.osgi.internal.loader.SingleSourcePackage.loadClass(SingleSourcePackage.java:35)
+ at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:473)
+ at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:429)
+ at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:417)
+ at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107)
+ at java.lang.ClassLoader.loadClass(Unknown Source)
+ at com.aptana.rcp.IDEApplication.start(IDEApplication.java:125)
+ at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
+ at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
+ at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
+ at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:344)
+ at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
+ at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+ at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
+ at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
+ at java.lang.reflect.Method.invoke(Unknown Source)
+ at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:622)
+ at org.eclipse.equinox.launcher.Main.basicRun(Main.java:577)
+ at org.eclipse.equinox.launcher.Main.run(Main.java:1410)
+!SUBENTRY 2 org.eclipse.core.resources 4 567 2015-01-17 11:30:37.626
+!MESSAGE The project description file (.project) for 'demo' is missing. This file contains important information about the project. The project will not function properly until this file is restored.
+
+!ENTRY org.eclipse.core.jobs 2 2 2015-01-17 11:33:58.913
+!MESSAGE Job found still running after platform shutdown. Jobs should be canceled by the plugin that scheduled them during shutdown: com.aptana.usage.internal.DefaultAnalyticsEventHandler$1
diff --git a/.metadata/.plugins/com.aptana.core.io/connections.9 b/.metadata/.plugins/com.aptana.core.io/connections.9
deleted file mode 100644
index 4371c4759..000000000
--- a/.metadata/.plugins/com.aptana.core.io/connections.9
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
\ No newline at end of file
diff --git a/.metadata/.plugins/com.aptana.syncing.core/defaultConnection.9 b/.metadata/.plugins/com.aptana.syncing.core/defaultConnection.9
deleted file mode 100644
index 375897785..000000000
--- a/.metadata/.plugins/com.aptana.syncing.core/defaultConnection.9
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-Default
-file:/C:/Users/nudt
-
-
\ No newline at end of file
diff --git a/.metadata/.plugins/com.aptana.syncing.core/sites.9 b/.metadata/.plugins/com.aptana.syncing.core/sites.9
deleted file mode 100644
index d9b475695..000000000
--- a/.metadata/.plugins/com.aptana.syncing.core/sites.9
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
\ No newline at end of file
diff --git a/.metadata/.plugins/com.aptana.webserver.core/webservers.8 b/.metadata/.plugins/com.aptana.webserver.core/webservers.8
deleted file mode 100644
index 5c07542b1..000000000
--- a/.metadata/.plugins/com.aptana.webserver.core/webservers.8
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-demo
-
-
\ No newline at end of file
diff --git a/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index b/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index
index fddafcbcd..83f5328be 100644
Binary files a/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index and b/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index differ
diff --git a/.metadata/.plugins/org.eclipse.core.resources/.root/2.tree b/.metadata/.plugins/org.eclipse.core.resources/.root/2.tree
deleted file mode 100644
index 5b2529389..000000000
Binary files a/.metadata/.plugins/org.eclipse.core.resources/.root/2.tree and /dev/null differ
diff --git a/.metadata/.plugins/org.eclipse.core.resources/.safetable/com.aptana.core.io.9 b/.metadata/.plugins/org.eclipse.core.resources/.safetable/com.aptana.core.io.9
deleted file mode 100644
index 0b4ef3b47..000000000
--- a/.metadata/.plugins/org.eclipse.core.resources/.safetable/com.aptana.core.io.9
+++ /dev/null
@@ -1,3 +0,0 @@
-#safe table
-#Tue Mar 11 17:27:27 CST 2014
-connections=connections.9
diff --git a/.metadata/.plugins/org.eclipse.core.resources/.safetable/com.aptana.syncing.core.9 b/.metadata/.plugins/org.eclipse.core.resources/.safetable/com.aptana.syncing.core.9
deleted file mode 100644
index 371e94161..000000000
--- a/.metadata/.plugins/org.eclipse.core.resources/.safetable/com.aptana.syncing.core.9
+++ /dev/null
@@ -1,4 +0,0 @@
-#safe table
-#Tue Mar 11 17:27:27 CST 2014
-defaultConnection=defaultConnection.9
-sites=sites.9
diff --git a/.metadata/.plugins/org.eclipse.core.resources/.safetable/com.aptana.webserver.core.8 b/.metadata/.plugins/org.eclipse.core.resources/.safetable/com.aptana.webserver.core.8
deleted file mode 100644
index 1af4b85d6..000000000
--- a/.metadata/.plugins/org.eclipse.core.resources/.safetable/com.aptana.webserver.core.8
+++ /dev/null
@@ -1,3 +0,0 @@
-#safe table
-#Tue Mar 11 17:27:27 CST 2014
-webservers=webservers.8
diff --git a/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources b/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources
index b3b591e28..b756a6952 100644
Binary files a/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources and b/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources differ
diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/com.aptana.explorer.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/com.aptana.explorer.prefs
index 752d73cf4..992cdf2bf 100644
--- a/.metadata/.plugins/org.eclipse.core.runtime/.settings/com.aptana.explorer.prefs
+++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/com.aptana.explorer.prefs
@@ -1,2 +1,2 @@
-activeProject=demo
+activeProject=trustie
eclipse.preferences.version=1
diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/com.aptana.portal.ui.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/com.aptana.portal.ui.prefs
index a710d7ff4..e78c19c52 100644
--- a/.metadata/.plugins/org.eclipse.core.runtime/.settings/com.aptana.portal.ui.prefs
+++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/com.aptana.portal.ui.prefs
@@ -1,2 +1,2 @@
eclipse.preferences.version=1
-last_known_studio_version=3.4.0.1358388620
+last_known_studio_version=3.4.2.1368863613
diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/com.aptana.theme.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/com.aptana.theme.prefs
index 590c84632..bc6c0d7c7 100644
--- a/.metadata/.plugins/org.eclipse.core.runtime/.settings/com.aptana.theme.prefs
+++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/com.aptana.theme.prefs
@@ -1,7 +1,7 @@
ACTIVE_HYPERLINK_COLOR=84,143,160
ACTIVE_THEME=Aptana Studio
HYPERLINK_COLOR=84,143,160
-THEME_CHANGED=1394527579080
+THEME_CHANGED=1421465443240
eclipse.preferences.version=1
hyperlinkColor=84,143,160
hyperlinkColor.SystemDefault=false
diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.ide.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.ide.prefs
index 71a846af6..310adab05 100644
--- a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.ide.prefs
+++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.ide.prefs
@@ -2,6 +2,6 @@ PROBLEMS_FILTERS_MIGRATE=true
SHOW_COOLBAR=true
SHOW_PERSPECTIVEBAR=true
eclipse.preferences.version=1
-platformState=1394526372425
+platformState=1420528131671
quickStart=false
tipsAndTricks=true
diff --git a/.metadata/.plugins/org.eclipse.debug.core/.launches/Firefox - Internal Server.launch b/.metadata/.plugins/org.eclipse.debug.core/.launches/Firefox - Internal Server.launch
index 678ced8a0..08a9581b9 100644
--- a/.metadata/.plugins/org.eclipse.debug.core/.launches/Firefox - Internal Server.launch
+++ b/.metadata/.plugins/org.eclipse.debug.core/.launches/Firefox - Internal Server.launch
@@ -3,7 +3,7 @@
-
+
diff --git a/.metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml b/.metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml
index 4868ecd96..eba54f80b 100644
--- a/.metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml
+++ b/.metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml
@@ -1,14 +1,14 @@
diff --git a/.metadata/.plugins/org.eclipse.ui.workbench/workbench.xml b/.metadata/.plugins/org.eclipse.ui.workbench/workbench.xml
index 88eaacee1..cd47216f4 100644
--- a/.metadata/.plugins/org.eclipse.ui.workbench/workbench.xml
+++ b/.metadata/.plugins/org.eclipse.ui.workbench/workbench.xml
@@ -1,5 +1,5 @@
-
+
@@ -8,14 +8,14 @@
-
+
-
-
-
+
+
+
-
+
@@ -37,7 +37,7 @@
demo
-E:\code\demo
+C:\Users\zh
@@ -66,10 +66,10 @@
-
-
+
+
-
+
@@ -78,7 +78,7 @@
-
+
@@ -124,14 +124,19 @@
-
-
-
-
+
+
+
+
+
+
+
+
+
-
+
@@ -166,15 +171,11 @@
-
-
-
-
-
-
-
-
-
+
+
+
+
+
@@ -188,6 +189,9 @@
+
+
+
diff --git a/app/controllers/applied_project_controller.rb b/app/controllers/applied_project_controller.rb
index 3d061ef74..d7b65174f 100644
--- a/app/controllers/applied_project_controller.rb
+++ b/app/controllers/applied_project_controller.rb
@@ -3,7 +3,24 @@ class AppliedProjectController < ApplicationController
#申请加入项目
def applied_join_project
@user_id = params[:user_id]
- @project = Project.find(params[:project_id])
+ @project = Project.find_by_id(params[:project_id])
+ if params[:project_join]
+ if @project
+ @applieds = AppliedProject.where("user_id = ? and project_id = ?", params[:user_id],params[:project_id])
+ if @applieds.count == 0
+ appliedproject = AppliedProject.create(:user_id => params[:user_id], :project_id => params[:project_id])
+ Mailer.applied_project(appliedproject).deliver
+ end
+ @status = 1
+ else
+ @status = 0
+ end
+ respond_to do |format|
+ format.js
+ end
+ return
+ end
+
@applieds = AppliedProject.where("user_id = ? and project_id = ?", params[:user_id],params[:project_id])
if @applieds.count == 0
appliedproject = AppliedProject.create(:user_id => params[:user_id], :project_id => params[:project_id])
diff --git a/app/views/applied_project/applied_join_project.js.erb b/app/views/applied_project/applied_join_project.js.erb
new file mode 100644
index 000000000..9fd358ede
--- /dev/null
+++ b/app/views/applied_project/applied_join_project.js.erb
@@ -0,0 +1,7 @@
+<% if @status == 0%>
+ alert("您申请的项目不存在");
+<% elsif @status == 1%>
+ alert("申请成功");
+<%else%>
+ alert("申请失败");
+<%end%>
\ No newline at end of file
diff --git a/app/views/poll/_poll_form.html.erb b/app/views/poll/_poll_form.html.erb
index 1d0dee837..4742028d5 100644
--- a/app/views/poll/_poll_form.html.erb
+++ b/app/views/poll/_poll_form.html.erb
@@ -69,7 +69,7 @@
else{
$('#ajax-modal').html('<%= escape_javascript(render :partial => 'poll_submit', locals: { :poll => @poll,:is_remote => false}) %>');
showModal('ajax-modal', '310px');
- $('#ajax-modal').css('height','115px');
+ $('#ajax-modal').css('height','120px');
$('#ajax-modal').siblings().remove();
$('#ajax-modal').before("" +
"
");
diff --git a/app/views/poll/index.html.erb b/app/views/poll/index.html.erb
index 3962768da..29a5ec51f 100644
--- a/app/views/poll/index.html.erb
+++ b/app/views/poll/index.html.erb
@@ -15,7 +15,7 @@
"" +
"");
showModal('ajax-modal', '310px');
- $('#ajax-modal').css('height','115px');
+ $('#ajax-modal').css('height','120px');
$('#ajax-modal').siblings().remove();
$('#ajax-modal').before("" +
"
");
@@ -47,7 +47,7 @@
"" +
"");
showModal('ajax-modal', '310px');
- $('#ajax-modal').css('height','115px');
+ $('#ajax-modal').css('height','120px');
$('#ajax-modal').siblings().remove();
$('#ajax-modal').before("" +
"
");
diff --git a/app/views/projects/_join_project.html.erb b/app/views/projects/_join_project.html.erb
index c7ce29dae..d30ec73e1 100644
--- a/app/views/projects/_join_project.html.erb
+++ b/app/views/projects/_join_project.html.erb
@@ -1,4 +1,3 @@
-
@@ -34,7 +33,7 @@
{
hideModal(obj);
$("#new-watcher-form").submit();
- alert("申请成功");
+// alert("申请成功");
}
function hidden_join_course_form()
@@ -60,6 +59,7 @@
-
项 目 ID:
+
diff --git a/public/plugin_assets/redmine_code_review/stylesheets/window_js/nuncio.css b/public/plugin_assets/redmine_code_review/stylesheets/window_js/nuncio.css
index e2700e5b7..2c439bd00 100644
--- a/public/plugin_assets/redmine_code_review/stylesheets/window_js/nuncio.css
+++ b/public/plugin_assets/redmine_code_review/stylesheets/window_js/nuncio.css
@@ -1,164 +1,164 @@
-.overlay_nuncio img { border: none; }
-
-.overlay_nuncio {
- background-color: #666666;
-}
-
-.nuncio_nw {
- width: 12px;
- height: 28px;
- background: url(nuncio/top_left.png) no-repeat;
-}
-
-.nuncio_n {
- background: url(nuncio/top_mid.png) repeat-x;
- height: 28px;
-}
-
-.nuncio_ne {
- width: 21px;
- height: 28px;
- background: url(nuncio/top_right.png) no-repeat;
-}
-
-.nuncio_e {
- width: 21px;
- background: url(nuncio/center_right.png) repeat-y top right;
-}
-
-.nuncio_w {
- width: 12px;
- background: url(nuncio/center_left.png) repeat-y top left;
-}
-
-.nuncio_sw {
- width: 12px;
- height: 18px;
- background: url(nuncio/bottom_left.png) no-repeat;
-}
-
-.nuncio_s {
- background: url(nuncio/bottom_mid.png) repeat-x 0 0;
- height: 18px;
-}
-
-.nuncio_se, .nuncio_sizer {
- width: 21px;
- height: 18px;
- background: url(nuncio/bottom_right.png) no-repeat;
-}
-
-.nuncio_close {
- width: 14px;
- height: 14px;
- background: url(nuncio/close.png) no-repeat;
- position:absolute;
- top:10px;
- right:22px;
- cursor:pointer;
- z-index:2000;
-}
-
-.nuncio_minimize {
- width: 14px;
- height: 15px;
- background: url(nuncio/minimize.png) no-repeat;
- position:absolute;
- top:10px;
- right:40px;
- cursor:pointer;
- z-index:2000;
-}
-
-.nuncio_title {
- float:left;
- font-size:11px;
- font-weight: bold;
- font-style: italic;
- color: #fff;
- width: 100%
-}
-
-.nuncio_content {
- background: url(nuncio/overlay.png) repeat;
- overflow:auto;
- color: #ddd;
- font-family: Tahoma, Arial, "sans-serif";
- font-size: 10px;
-}
-
-.nuncio_sizer {
- cursor:se-resize;
-}
-
-
-.top_draggable, .bottom_draggable {
- cursor:move
-}
-/* FOR IE */
-* html .nuncio_nw {
- background-color: transparent;
- background-image: none;
- filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/nuncio/top_left.png", sizingMethod="crop");
-}
-
-* html .nuncio_n {
- background-color: transparent;
- background-image: none;
- filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/nuncio/top_mid.png", sizingMethod="scale");
-}
-
-* html .nuncio_ne {
- background-color: transparent;
- background-image: none;
- filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/nuncio/top_right.png", sizingMethod="crop");
-}
-
-* html .nuncio_w {
- background-color: transparent;
- background-image: none;
- filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/nuncio/center_left.png", sizingMethod="scale");
-}
-
-* html .nuncio_e {
- background-color: transparent;
- background-image: none;
- filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/nuncio/center_right.png", sizingMethod="scale");
-}
-
-* html .nuncio_sw {
- background-color: transparent;
- background-image: none;
- filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/nuncio/bottom_left.png", sizingMethod="crop");
-}
-
-* html .nuncio_s {
- background-color: transparent;
- background-image: none;
- filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/nuncio/bottom_mid.png", sizingMethod="scale");
-}
-
-* html .nuncio_se {
- background-color: transparent;
- background-image: none;
- filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/nuncio/bottom_right.png", sizingMethod="crop");
-}
-
-* html .nuncio_sizer {
- background-color: transparent;
- background-image: none;
- filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/nuncio/bottom_right.png", sizingMethod="crop");
-}
-
-* html .nuncio_close {
- background-color: transparent;
- background-image: none;
- filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/nuncio/close.png", sizingMethod="crop");
-}
-
-* html .nuncio_minimize {
- background-color: transparent;
- background-image: none;
- filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/nuncio/minimize.png", sizingMethod="crop");
-}
-
+.overlay_nuncio img { border: none; }
+
+.overlay_nuncio {
+ background-color: #666666;
+}
+
+.nuncio_nw {
+ width: 12px;
+ height: 28px;
+ background: url(nuncio/top_left.png) no-repeat;
+}
+
+.nuncio_n {
+ background: url(nuncio/top_mid.png) repeat-x;
+ height: 28px;
+}
+
+.nuncio_ne {
+ width: 21px;
+ height: 28px;
+ background: url(nuncio/top_right.png) no-repeat;
+}
+
+.nuncio_e {
+ width: 21px;
+ background: url(nuncio/center_right.png) repeat-y top right;
+}
+
+.nuncio_w {
+ width: 12px;
+ background: url(nuncio/center_left.png) repeat-y top left;
+}
+
+.nuncio_sw {
+ width: 12px;
+ height: 18px;
+ background: url(nuncio/bottom_left.png) no-repeat;
+}
+
+.nuncio_s {
+ background: url(nuncio/bottom_mid.png) repeat-x 0 0;
+ height: 18px;
+}
+
+.nuncio_se, .nuncio_sizer {
+ width: 21px;
+ height: 18px;
+ background: url(nuncio/bottom_right.png) no-repeat;
+}
+
+.nuncio_close {
+ width: 14px;
+ height: 14px;
+ background: url(nuncio/close.png) no-repeat;
+ position:absolute;
+ top:10px;
+ right:22px;
+ cursor:pointer;
+ z-index:2000;
+}
+
+.nuncio_minimize {
+ width: 14px;
+ height: 15px;
+ background: url(nuncio/minimize.png) no-repeat;
+ position:absolute;
+ top:10px;
+ right:40px;
+ cursor:pointer;
+ z-index:2000;
+}
+
+.nuncio_title {
+ float:left;
+ font-size:11px;
+ font-weight: bold;
+ font-style: italic;
+ color: #fff;
+ width: 100%
+}
+
+.nuncio_content {
+ background: url(nuncio/overlay.png) repeat;
+ overflow:auto;
+ color: #ddd;
+ font-family: Tahoma, Arial, "sans-serif";
+ font-size: 10px;
+}
+
+.nuncio_sizer {
+ cursor:se-resize;
+}
+
+
+.top_draggable, .bottom_draggable {
+ cursor:move
+}
+/* FOR IE */
+* html .nuncio_nw {
+ background-color: transparent;
+ background-image: none;
+ filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/nuncio/top_left.png", sizingMethod="crop");
+}
+
+* html .nuncio_n {
+ background-color: transparent;
+ background-image: none;
+ filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/nuncio/top_mid.png", sizingMethod="scale");
+}
+
+* html .nuncio_ne {
+ background-color: transparent;
+ background-image: none;
+ filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/nuncio/top_right.png", sizingMethod="crop");
+}
+
+* html .nuncio_w {
+ background-color: transparent;
+ background-image: none;
+ filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/nuncio/center_left.png", sizingMethod="scale");
+}
+
+* html .nuncio_e {
+ background-color: transparent;
+ background-image: none;
+ filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/nuncio/center_right.png", sizingMethod="scale");
+}
+
+* html .nuncio_sw {
+ background-color: transparent;
+ background-image: none;
+ filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/nuncio/bottom_left.png", sizingMethod="crop");
+}
+
+* html .nuncio_s {
+ background-color: transparent;
+ background-image: none;
+ filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/nuncio/bottom_mid.png", sizingMethod="scale");
+}
+
+* html .nuncio_se {
+ background-color: transparent;
+ background-image: none;
+ filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/nuncio/bottom_right.png", sizingMethod="crop");
+}
+
+* html .nuncio_sizer {
+ background-color: transparent;
+ background-image: none;
+ filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/nuncio/bottom_right.png", sizingMethod="crop");
+}
+
+* html .nuncio_close {
+ background-color: transparent;
+ background-image: none;
+ filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/nuncio/close.png", sizingMethod="crop");
+}
+
+* html .nuncio_minimize {
+ background-color: transparent;
+ background-image: none;
+ filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../themes/nuncio/minimize.png", sizingMethod="crop");
+}
+
diff --git a/public/plugin_assets/redmine_code_review/stylesheets/window_js/spread.css b/public/plugin_assets/redmine_code_review/stylesheets/window_js/spread.css
index d7d722e8a..9bda2a68d 100644
--- a/public/plugin_assets/redmine_code_review/stylesheets/window_js/spread.css
+++ b/public/plugin_assets/redmine_code_review/stylesheets/window_js/spread.css
@@ -1,108 +1,108 @@
-.overlay_spread {
- background-color: #85BBEF;
- filter:alpha(opacity=60);
- -moz-opacity: 0.6;
- opacity: 0.6;
-}
-
-.spread_nw {
- background: transparent url(spread/left-top.gif) no-repeat 0 0;
- width:10px;
- height:25px;
-}
-
-.spread_n {
- background: transparent url(spread/top-middle.gif) repeat-x 0 0;
- height:25px;
-}
-
-.spread_ne {
- background: transparent url(spread/right-top.gif) no-repeat 0 0;
- width:10px;
- height:25px;
-}
-
-.spread_w {
- background: transparent url(spread/frame-left.gif) repeat-y top left;
- width:7px;
-}
-
-.spread_e {
- background: transparent url(spread/frame-right.gif) repeat-y top right;
- width:7px;
-}
-
-.spread_sw {
- background: transparent url(spread/bottom-left-c.gif) no-repeat 0 0;
- width:7px;
- height:7px;
-}
-
-.spread_s {
- background: transparent url(spread/bottom-middle.gif) repeat-x 0 0;
- height:7px;
-}
-
-.spread_se, .spread_sizer {
- background: transparent url(spread/bottom-right-c.gif) no-repeat 0 0;
- width:7px;
- height:7px;
-}
-
-.spread_sizer {
- cursor:se-resize;
-}
-
-.spread_close {
- width: 23px;
- height: 23px;
- background: transparent url(spread/button-close-focus.gif) no-repeat 0 0;
- position:absolute;
- top:0px;
- right:11px;
- cursor:pointer;
- z-index:1000;
-}
-
-.spread_minimize {
- width: 23px;
- height: 23px;
- background: transparent url(spread/button-min-focus.gif) no-repeat 0 0;
- position:absolute;
- top:0px;
- right:55px;
- cursor:pointer;
- z-index:1000;
-}
-
-.spread_maximize {
- width: 23px;
- height: 23px;
- background: transparent url(spread/button-max-focus.gif) no-repeat 0 0;
- position:absolute;
- top:0px;
- right:33px;
- cursor:pointer;
- z-index:1000;
-}
-
-.spread_title {
- float:left;
- height:14px;
- font-family: Tahoma, Arial, sans-serif;
- font-size:14px;
- font-weight:bold;
- text-align:left;
- margin-top:2px;
- width:100%;
- color:#E47211;
-}
-
-.spread_content {
- overflow:auto;
- color: #222;
- font-family: Tahoma, Arial, sans-serif;
- font-size: 10px;
- background:#A9EA00;
-}
-
+.overlay_spread {
+ background-color: #85BBEF;
+ filter:alpha(opacity=60);
+ -moz-opacity: 0.6;
+ opacity: 0.6;
+}
+
+.spread_nw {
+ background: transparent url(spread/left-top.gif) no-repeat 0 0;
+ width:10px;
+ height:25px;
+}
+
+.spread_n {
+ background: transparent url(spread/top-middle.gif) repeat-x 0 0;
+ height:25px;
+}
+
+.spread_ne {
+ background: transparent url(spread/right-top.gif) no-repeat 0 0;
+ width:10px;
+ height:25px;
+}
+
+.spread_w {
+ background: transparent url(spread/frame-left.gif) repeat-y top left;
+ width:7px;
+}
+
+.spread_e {
+ background: transparent url(spread/frame-right.gif) repeat-y top right;
+ width:7px;
+}
+
+.spread_sw {
+ background: transparent url(spread/bottom-left-c.gif) no-repeat 0 0;
+ width:7px;
+ height:7px;
+}
+
+.spread_s {
+ background: transparent url(spread/bottom-middle.gif) repeat-x 0 0;
+ height:7px;
+}
+
+.spread_se, .spread_sizer {
+ background: transparent url(spread/bottom-right-c.gif) no-repeat 0 0;
+ width:7px;
+ height:7px;
+}
+
+.spread_sizer {
+ cursor:se-resize;
+}
+
+.spread_close {
+ width: 23px;
+ height: 23px;
+ background: transparent url(spread/button-close-focus.gif) no-repeat 0 0;
+ position:absolute;
+ top:0px;
+ right:11px;
+ cursor:pointer;
+ z-index:1000;
+}
+
+.spread_minimize {
+ width: 23px;
+ height: 23px;
+ background: transparent url(spread/button-min-focus.gif) no-repeat 0 0;
+ position:absolute;
+ top:0px;
+ right:55px;
+ cursor:pointer;
+ z-index:1000;
+}
+
+.spread_maximize {
+ width: 23px;
+ height: 23px;
+ background: transparent url(spread/button-max-focus.gif) no-repeat 0 0;
+ position:absolute;
+ top:0px;
+ right:33px;
+ cursor:pointer;
+ z-index:1000;
+}
+
+.spread_title {
+ float:left;
+ height:14px;
+ font-family: Tahoma, Arial, sans-serif;
+ font-size:14px;
+ font-weight:bold;
+ text-align:left;
+ margin-top:2px;
+ width:100%;
+ color:#E47211;
+}
+
+.spread_content {
+ overflow:auto;
+ color: #222;
+ font-family: Tahoma, Arial, sans-serif;
+ font-size: 10px;
+ background:#A9EA00;
+}
+
diff --git a/spec/factories/users.rb b/spec/factories/users.rb
new file mode 100644
index 000000000..369e60f48
--- /dev/null
+++ b/spec/factories/users.rb
@@ -0,0 +1,10 @@
+require 'faker'
+
+FactoryGirl.define do
+ factory :user do
+ login "ExampleUser"
+ mail "user@example.com"
+ password "foobar"
+ password_confirmation "foobar"
+ end
+end
\ No newline at end of file
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
new file mode 100644
index 000000000..6b8c962bd
--- /dev/null
+++ b/spec/models/user_spec.rb
@@ -0,0 +1,140 @@
+require 'spec_helper'
+describe User do
+ #测试数据验证
+ # before { @user = User.new(login: "ExampleUser" ,mail: "user@example.com",
+ # password: "foobar",password_confirmation: "foobar" ) }
+ before :each do
+ @user = User.new(login: "ExampleUser" ,mail: "user@example.com",
+ password: "foobar",password_confirmation: "foobar" )
+ end
+ subject { @user }#指定@user为测试对象
+ #属性存在性的测试
+ it { should respond_to(:login) }
+ it { should respond_to(:mail) }
+
+ #此处采用与构建的方式生成数据
+ # it"is invalid without login" do
+ # user=FactoryGirl.build(:user,login: nil)
+ # expect(user).to_not be_valid
+ # end
+ #用户名唯一性的测试
+ describe "when login is already taken" do
+ before do
+ user_with_same_login=@user.dup
+ user_with_same_login.save
+ end
+ it{should_not be_valid}
+ # it "should be valid" do
+ # expect(@user).to be_valid
+ # end
+ end
+
+ #邮箱唯一性测试
+ describe "when mail address is already taken " do
+ before do
+ user_with_same_mail=@user.dup#dup method copy mail
+ user_with_same_mail.mail=@user.mail.upcase#转大写
+ user_with_same_mail.save
+ end
+ it{should_not be_valid}
+ end
+ #邮箱唯一性测试2
+ # describe " is invalid with a same email address" do
+ # User.create(login:'peter',mail:'test@qq.com')#先保存一个合法的对象
+ # user1=User.new(login:'jim',mail:'testqq@.com')#再创建user1作为测试的对比对象
+ # # expect(user1).to have(1).errors_on(:mail)
+ # it{should_not be_valid}
+ # end
+
+ #login长度测试(login最大25字符)
+ describe "when the login is too long " do
+ before{@user.login='a'*25}
+ it{should be_valid}
+ end
+ #姓和名的长度测试
+ describe "when the first name is too long " do
+ before{@user.firstname='a'*30}
+ it{should_not be_valid}
+ end
+ describe "when the last name is too long " do
+ before{@user.lastname='a'*30}
+ it{should_not be_valid}
+ end
+
+ #login合法性的测试(符合正则表达式规则的用户名:数字英文)
+ describe "when login format is invalid" do
+ it"should be invalid" do
+ username=%w[aa!3 aaa%$&*! 1111==!]
+ username.each do |valid_username|
+ @user.login=valid_username
+ expect(@user).not_to be_valid
+ end
+ end
+ end
+
+ describe "when login format is valid" do
+ it"should be valid" do
+ username = %w[jim123 123456 aaaaaa]
+ username.each do |valid_username|
+ @user.login=valid_username
+ expect(@user).to be_valid
+ end
+ end
+ end
+
+ #邮箱合法性测试,在模型user中邮箱使用了正则表达式
+ describe "is the mail valid" do
+ context "when mail format is invalid" do
+ it"should be invalid" do
+ address=%w[user@foo,com user_at_foo.org example.user@foo.foo@bar_baz.com foo@bar+baz.com]
+ address.each do |valid_address|
+ @user.mail=valid_address
+ expect(@user).not_to be_valid
+ end
+ end
+ end
+
+ context "when mail format is valid" do
+ it"should be valid" do
+ addresses = %w[user@foo.COM A_US-ER@f.b.org frst.lst@foo.jp a+b@baz.cn]
+ addresses.each do |valid_address|
+ @user.mail=valid_address
+ expect(@user).not_to be_valid
+ end
+ end
+ end
+ end
+
+ describe "when the mail is too long" do#邮箱长度验证的测试
+ before{@user.mail='a'*60}
+ it{should_not be_valid}
+ end
+
+ #验证两次输入的密码是否一致的测试
+ describe "when the password does not match confirmation" do
+ before{@user.password_confirmation="admin123"}
+ it{should_not be_valid}
+ end
+
+ #调用相关方法是否能返回期待的结果
+ #userInfo方法,选择项目成员时显示的用户信息的文字
+ describe "returns the user info when choice the members of the project" do
+ context "第一种情况" do
+ @user=User.new()
+ expect(@user.userInfo).to eq ''
+ end
+ context "二种情况" do
+ @user=User.new()
+ expect(@user.userInfo).to eq ''
+ end
+ end
+
+ # def name
+ # [firstname, lastname].join(' ')
+ # end
+ # it "returns a contact's full name as a string" do
+ # contact = Contact.new(firstname: 'John', lastname: 'Doe',
+ # email: 'johndoe@example.com')
+ # expect(contact.name).to eq 'John Doe'#调用contact的name方法
+ # end
+end
\ No newline at end of file