diff --git a/public/react/src/common/SnackbarHOC.js b/public/react/src/common/SnackbarHOC.js
index a59607bf4..d66b697ca 100644
--- a/public/react/src/common/SnackbarHOC.js
+++ b/public/react/src/common/SnackbarHOC.js
@@ -23,22 +23,31 @@ export function SnackbarHOC(options = {}) {
 			}
 
 	      	// 全局的snackbar this.props.showSnackbar调用即可
-			showSnackbar(description, message = "提示",icon) {
-				// this.setState({
-				// 	snackbarOpen: true,
-				// 	snackbarText: text,
-				// 	snackbarVertical: vertical,
-				// 	snackbarHorizontal: horizontal,
-				// })
-				const data = {
-					message,
-					description
-				}
-				if (icon) {
-					data.icon = icon;
+			// showSnackbar(description, message = "提示",icon) {
+			// 	// this.setState({
+			// 	// 	snackbarOpen: true,
+			// 	// 	snackbarText: text,
+			// 	// 	snackbarVertical: vertical,
+			// 	// 	snackbarHorizontal: horizontal,
+			// 	// })
+			// 	const data = {
+			// 		message,
+			// 		description
+			// 	}
+			// 	if (icon) {
+			// 		data.icon = icon;
+			// 	}
+			// 	notification.open(data);
+			// }
+
+				showSnackbar(text, vertical, horizontal) {
+					this.setState({
+						snackbarOpen: true,
+						snackbarText: text,
+						snackbarVertical: vertical,
+						snackbarHorizontal: horizontal,
+					})
 				}
-				notification.open(data);
-			}
 
 	      	render() {
 		        const { snackbarOpen, snackbarText, snackbarHorizontal, snackbarVertical } = this.state;
diff --git a/public/react/src/context/TPIContextProvider.js b/public/react/src/context/TPIContextProvider.js
index ae88bf865..3cb725c34 100644
--- a/public/react/src/context/TPIContextProvider.js
+++ b/public/react/src/context/TPIContextProvider.js
@@ -54,6 +54,8 @@ const testSetsExpandedArrayInitVal = [false, false, false, false, false,
 									 false, false, false, false, false, 
 									 false, false, false, false, false]
 window.__fetchAllFlag = false;	//  是否调用过fetchAll   TODO 如何多次使用provider?
+
+const $ = window.$
 class TPIContextProvider extends Component {
 	constructor(props) {
 		super(props)
@@ -592,13 +594,49 @@ pop_box_new(htmlvalue, 480, 182);
 			currentPassedGameGainExperience: experience,
 		})
 	}	
+	initDisplayInterval = () => {
+		const challenge = this.state.challenge
+		if (this.showWebDisplayButtonTimeout) {
+			window.clearTimeout(this.showWebDisplayButtonTimeout)
+		}
+		this.showWebDisplayButtonTimeout = window.setTimeout(() => {
+			this.setState({ challenge: update(challenge, 
+				{
+					showWebDisplayButton: { $set: false },
+				})
+			})
+			this.showWebDisplayButtonTimeout = null
+		}, 61 * 1000)
+
+		let remain = 60
+		if (this.displayInterval) {
+			window.clearInterval(this.displayInterval)
+		}
+		this.displayInterval = window.setInterval(() => {
+			const button = $('#showWebDisplayButton');
+			if (button.length) {
+				button.html(`查看效果(${remain})`)
+				if (remain == 0) {
+					button.html('查看效果')
+				}
+			}
+			if (remain == 0) {
+				window.clearInterval(this.displayInterval)
+				this.displayInterval = null
+				return;
+			}
+			
+			remain -= 1;
+		}, 1000)
+	}
 	language_display(data) {
 		const { game, tomcat_url } = this.state;
-		const $ = window.$;
 		const challenge = Object.assign({}, this.state.challenge)
 		if(challenge.isWeb && data.port != -1) {
             // var $result = $("#php_display");
             challenge.showWebDisplayButton = true;	// ActionView处是否出现查看效果按钮
+			this.initDisplayInterval()
+
             const path = challenge.web_route || challenge.path
             const webDisplayUrl = `${tomcat_url}:${data.port}/${path}`
             challenge.webDisplayUrl = webDisplayUrl
@@ -653,24 +691,11 @@ pop_box_new(htmlvalue, 480, 182);
 
 		const currentGamePassed = this.props.game !== 2 && status === 2
 
-		currentGamePassed && this.language_display(response);
+		
 
 		// 评测通过了,立即同步costTime
 		currentGamePassed && this._updateCostTime(true, true);
 
-		if (currentGamePassed) {
-			game.status = 2;
-			game.next_game = next_game;	
-
-		} else {
-			this.showDialog({
-				contentText: 
,
-				isSingleButton: true
-			})
-		}
 
 		const output_sets = {
 			"test_sets": test_sets,
@@ -689,6 +714,31 @@ pop_box_new(htmlvalue, 480, 182);
   		// 	output_sets.test_sets_array = test_sets_array;
   		// }
 		
+		//   检查是否编译通过
+		let compileSuccess = false;
+		if (test_sets && test_sets.length) {
+			test_sets.some((item) => {
+				if (item.compile_success) {
+					compileSuccess = true;
+					return true;
+				}
+			})
+		}
+
+		compileSuccess && this.language_display(response);
+		if (currentGamePassed) {
+			game.status = 2;
+			game.next_game = next_game;	
+		} else {
+			this.showDialog({
+				contentText: ,
+				isSingleButton: true
+			})
+		}
+		
 
 		this.setState({
 			testSetsExpandedArray: testSetsExpandedArrayInitVal.slice(0), // 重置测试集展开状态
diff --git a/public/react/src/modules/courses/Resource/Fileslistitem.js b/public/react/src/modules/courses/Resource/Fileslistitem.js
index 1af027757..6a1e16d6d 100644
--- a/public/react/src/modules/courses/Resource/Fileslistitem.js
+++ b/public/react/src/modules/courses/Resource/Fileslistitem.js
@@ -5,7 +5,8 @@ import {Link} from 'react-router-dom';
 import {getImageUrl} from 'educoder';
 import axios from 'axios'
 import {getUrl} from 'educoder';
-import moment from 'moment';
+import moment from 'moment'
+import { Base64 } from 'js-base64';
 import CoursesListType from '../coursesPublic/CoursesListType';
 import Showoldfiles from "../coursesPublic/Showoldfiles";
 import Modals from '../../modals/Modals';
@@ -26,8 +27,18 @@ class Fileslistitem extends Component{
         })
         this.props.Settingtypes(discussMessage.id)
     }
-    showfiles=(value)=>{
 
+	downloadfiles=(url,name)=>{
+		const aLink = document.createElement('a');
+		aLink.style.display='none';
+    console.log(name)
+		aLink.setAttribute('download',name)
+		aLink.href = url;
+		document.body.appendChild(aLink);
+		aLink.click();
+		// document.body.removeChild(aLink);
+	}
+    showfiles=(value)=>{
         let {discussMessage,coursesId}=this.props
         let file_id=discussMessage.id
         let url="/files/"+file_id+"/histories.json"
@@ -38,35 +49,14 @@ class Fileslistitem extends Component{
         }).then((result)=>{
 
             if(result.data.attachment_histories.length===0){
-
-              let link = document.createElement('a');
-							document.body.appendChild(link);
-              link.href = result.data.url;
-							console.log(value)
-              link.download = value;
-              //兼容火狐浏览器
-              let evt = document.createEvent("MouseEvents");
-              evt.initEvent("click", false, false);
-              link.dispatchEvent(evt);
-              document.body.removeChild(link);
-
-
-              // // window.location.href=result.data.url;
-              // let url = window.URL.createObjectURL(new Blob([result.data.url]));
-              // let link = document.createElement('a');
-              // link.style.display = 'none';
-              // link.href = url;
-              // link.setAttribute('download',result.data.title);
-              // document.body.appendChild(link);
-              // link.click();
-
-            }else{
+							this.downloadfiles(result.data.url,result.data.title)
+						}else{
                 this.setState({
                     Showoldfiles:true,
                     allfiles:result.data
                 })
             }
-            // console.log(result)
+
         }).catch((error)=>{
             console.log(error)
         })
diff --git a/public/react/src/modules/courses/poll/PollListItem.js b/public/react/src/modules/courses/poll/PollListItem.js
index 16770ce43..8e6198eae 100644
--- a/public/react/src/modules/courses/poll/PollListItem.js
+++ b/public/react/src/modules/courses/poll/PollListItem.js
@@ -21,6 +21,7 @@ class PollListItem extends Component{
     
     const IsAdmin =this.props.isAdmin();
     const isStudent = this.props.isStudent();
+    const isNotMember = this.props.isNotMember();
     
     let t= item.end_time ? moment(item.end_time) - moment() : 0;
     return(
@@ -42,7 +43,7 @@ class PollListItem extends Component{
               {item.polls_name}
             }
             {
-              item.lock_status === 0 ? :""
+              item.lock_status === 0 ? :""
             }
             
             {
diff --git a/public/react/src/modules/page/main/ActionView.js b/public/react/src/modules/page/main/ActionView.js
index e0e52de9e..fff7d416d 100644
--- a/public/react/src/modules/page/main/ActionView.js
+++ b/public/react/src/modules/page/main/ActionView.js
@@ -25,7 +25,14 @@ const styles = theme => ({
     	color: '#4CACFF',
     	border: '1px solid #4CACFF'
     }
+  },
+  hoverButton: {
+	margin: theme.spacing.unit,
+    height: '30px',
+    padding: '0 16px',
 
+	color: '#4CACFF',
+	border: '1px solid #4CACFF'
   },
   buttonText: {
   	color: '#1B4061 !important',
@@ -64,11 +71,12 @@ class ActionView extends Component {
 	      		
 
 	      		{/*将第一个按钮改为visibility方式隐藏,不然加载时测评按钮会出现没有垂直居中的情况*/}
-				  	
-				
+				  	
+						
+					
 
 				{
 					!gameBuilding &&