文档服务地址:http://47.92.0.57:3000/ 周报索引地址:http://47.92.0.57:3000/s/NruNXRYmV

Commit d6995e80 by 李严凡

完成任务后提交任务接口添加及文档修改

parents f1a46b82 deb97ea6
<<<<<<< HEAD
<template>
<div class="pieces-table-container">
<el-table
......@@ -188,3 +189,195 @@ export default {
transform: scale(0.5);
}
</style>
=======
<template>
<div class="pieces-table-container">
<el-table
ref="multipleTable"
style="width: 100%"
default-expand-all
:data="tableData"
:row-class-name="tableRowClassName"
@selection-change="selectionChange"
>
<el-table-column v-if="showSelection" type="selection" :selectable="selectable" width="55"></el-table-column>
<el-table-column prop="id" label="分片id" width="120"></el-table-column>
<el-table-column prop="type" label="文件类别" width="120"></el-table-column>
<el-table-column prop="fileNum" label="文件数量" width="120"></el-table-column>
<el-table-column prop="template" label="模板/说明" :width="showProgress ? 240 : ''"></el-table-column>
<el-table-column v-if="showProgress" label="进度">
<template slot-scope="props">
<el-progress :percentage="percentage(props.row)" style="width:150px"></el-progress>
</template>
</el-table-column>
<el-table-column type="expand">
<template slot-scope="props">
<div class="fileList" v-loading="!map[props.row.id]">
<div class="file" v-for="item in map[props.row.id]" :key="item.id">
<i class="el-icon-document"></i>
<span class="file-name">{{item.name}}</span>{{item.size}}
<slot name='option' :file='item' :piece='props.row'></slot>
</div>
</div>
</template>
</el-table-column>
</el-table>
<el-button v-if="showSelection" v-loading="loading" type="primary" style="margin-top:20px" @click="complete">完成选择</el-button>
</div>
</template>
<script>
import '@/mock/api.js'
export default {
name: 'pieces-table',
props: {
taskId: Number, // 接收任务的id
isCheck: { // showProgess为false时忽略此属性,为true时,是审核页面,为false标注页面
type: Boolean,
default: false
},
showSelection: {
type: Boolean,
default: false
},
showProgress: {
type: Boolean,
default: false
},
withExecutor: {
type: Boolean,
default: false
}
},
data () {
return {
tableData: [],
multipleSelection: [],
map: {},
loading: false
}
},
computed: {
userId () { return this.$store.state.userInfo.userId }
},
/*
没有userId返回所有,有userId返回user所选的,我的任务和已完成任务需要有userId
isCheck表明是审核页发出的请求,多返回totalNum属性
*/
async beforeMount () {
// 拉取分片信息
var params = { taskId: this.taskId }, self = this
if (this.isCheck) params.isCheck = true
if (this.withExecutor) params.userId = this.userId
var res = await this.axios.get('/slice/getPieces', { params })
this.tableData = res.data
// 拉取文件信息
res.data.forEach(piece => { self.getFiles(piece.id) })
},
methods: {
selectionChange (val) {
this.multipleSelection = val
},
selectable (row, index) {
return row.selectable
},
complete () {
// todo 未登录选择分片
if (this.loading) return
if (this.multipleSelection.length === 0) {
// 提示未选择分片
this.$alert('请选择分片', '提示', {
confirmButtonText: '确定',
type: 'warning'
})
} else {
var selected = this.multipleSelection.map((item) => { return item.id })
var userId = this.userId, self = this; this.loading = true
this.axios.post('/slice/selectPieces', {
userId,
selected
}).then((res) => {
self.loading = false
if (res.code === 1) {
self.$message({ message: '选择成功', type: 'success' })
self.$router.push('/ongoing')
} else {
console.log(res)
self.$message.error(res.message)
}
})
}
},
getFiles (pieceId) {
var params = { pieceId }
if (this.withExecutor) params.executor = this.userId
var self = this
this.axios.get('/file/getFiles', {
params
}).then(res => {
self.$set(self.map, pieceId, res.data.map((item) => {
item.size = self.unitTransform(item.size) // 单位转换
return item
}))
})
},
unitTransform (n) { // 单位转换
var unit = ['B', 'KB', 'MB', 'GB'], i = 0
while (n >= 1024 && i < 3) {
n /= 1024
i++
}
return n.toFixed(2) + unit[i]
},
tableRowClassName ({row}) {
if (row.type === '图片') {
return 'image-row'
} else if (row.type === '图层') {
return 'coverage-row'
} else {
return 'text-row'
}
},
percentage (piece) {
var self = this
if (piece.fileNum === 0 || piece.totalNum === 0) return 100
return Math.floor(piece.completedNum / (self.isCheck ? piece.totalNum : piece.fileNum) * 100)
}
}
}
</script>
<style>
.el-table .image-row {
background: oldlace;
}
.el-table .coverage-row {
background: #fef0f0;
}
.el-table .text-row {
background: #ecf5ff;
}
</style>
<style lang="scss" scopde>
.file{
position: relative;
height: 40px;
line-height: 40px;
.file-name{
display: inline-block;
min-width: 240px;
}
.el-button{
float: right;
margin-top: 5px;
margin-left: 10px;
}
}
.el-loading-spinner{
transform: scale(0.5);
}
</style>
>>>>>>> deb97ea6d64cbf5fb4d2d09302f70996e638e63b
......@@ -215,10 +215,32 @@ def get_relation_id(uid, did):
else:
return r.relation_id
# 用于前端显示分片是否可选择,当在relation中找到slice相关记录,即已有人选中,则返回False(不可选)
def find_slice(slice_id):
try:
Relation.get(Relation.slice_id == slice_id)
except:
return True
else:
return False
# 删除user_id用户与slice_id有关的relation
def delete_by_sliceid(user_id, slice_id):
try:
list = Relation.select().where(Relation.user_id == user_id, Relation.slice_id == slice_id).execute()
if len(list) != 0:
Slice.minus_annotation(slice_id, len(list))
Relation.delete().where(Relation.user_id == user_id, Relation.slice_id == slice_id).execute()
except:
return False
else:
return True
if __name__ == '__main__':
# Relation.drop_table()
# Relation.create_table()
Relation.delete().where(Relation.relation_id == 67).execute()
Relation.drop_table()
Relation.create_table()
# Relation.delete().where(Relation.relation_id == 67).execute()
# print(get_state(1, 5))
# create_relation(3, 1, 2)
......@@ -117,7 +117,6 @@ def find_slice_by_task(task_id):
index = 0
list = []
while index < len(find):
num = Relation.get_flag_count2(find[index].slice_id)
if find[index].type == '0':
t = "文本"
template = find[index].model_id
......@@ -133,7 +132,7 @@ def find_slice_by_task(task_id):
'fileNum': find[index].document_number,
'type': t,
'template': template,
'completedNum': num
'selectable': Relation.find_slice(find[index].slice_id)
}
)
index += 1
......@@ -242,6 +241,18 @@ def add_annotation(slice_id):
return True
# 减少标注关系
def minus_annotation(slice_id, num):
try:
s = Slice.get(Slice.slice_id == slice_id)
except:
return False
else:
s.Annotation_number -= num
s.save()
return True
# 查找任务下的分片id及描述(用于修改任务时的返回)
def find_slice_annotation_by_task(task_id, type):
try:
......@@ -300,6 +311,19 @@ def find_task_by_slicelist(slice_list):
return task_list
# 通过taskId寻找slicelist
def find_slicelist_by_taskId(taskId):
try:
slicelist = Slice.select(Slice.task_id, Slice.slice_id, Slice.document_number, Slice.type, Slice.model_id,
Slice.illustration).where(
Slice.task_id == taskId
)
except:
return False
else:
return slicelist
if __name__ == '__main__':
Slice.drop_table()
Slice.create_table()
......@@ -267,6 +267,6 @@ def set_state(task_id, state):
if __name__ == '__main__':
# print(find_task_my_task(1,1,1))
# Task.drop_table()
# Task.create_table()
Task.drop_table()
Task.create_table()
print(judge_completed(49, 1))
......@@ -154,5 +154,6 @@ def get_username(id):
if __name__ == '__main__':
User.drop_table()
User.create_table()
木里县白碉苗族乡呷米坪村麦架坪组滑坡情况。
  8月2日,记者从省地质灾害指挥部办公室获悉,当天上午11时30分左右,因连续降雨,凉山州木里县白碉苗族乡呷米坪村麦架坪组发生滑坡,由于群测群防体系完善,监测人员监测到位,预报预警及时,信息传递畅通,临灾处置措施得当, 及时撤离转移了63户280人,避免了10户44人的因灾伤亡。
  灾害规模约50000立方米,属小型滑坡。发生的原因是由于持续降雨,土体雨水饱和、自重加大,诱发滑坡。虽然没有人员伤亡,但滑坡地质灾害共造成1户7间房屋严重受损,9户9间房屋轻微受损,直接经济损失35万元。
  能够实现成功避险,关键在一个“早”字。7月30日,凉山州地灾办发布了木里县地质灾害气象风险预警等级为“风险高”的二级预警,随后几天,县乡村各级防灾部门都没有放松警惕,严格落实防范责任和措施,严格值班值守,加强巡查排查,实时监测预警。
  8月2日8时,呷米坪村监测员苏采莫发现监测点有滑坡迹象,并立即报告乡政府,当地立刻组织村民提前主动避让,并于8时10分将受威胁区群众全部转移至安全地带。11时30分,木里县白碉苗族乡呷米坪村麦架坪组发生滑坡,由于提前撤离转移,临灾处置措施得当,避免了10户44人的因灾伤亡,实现了成功避险。
  复盘此次滑坡灾害,成功避险还得益于平时的防灾演练和培训。今年7月中下旬,白碉乡各隐患点再次组织地质灾害隐患点的演练和培训。通过不断组织地质灾害宣传培训和避险演练,进一步增强了乡镇干部、村组干部、受威胁区群众的识灾、防灾、避灾、救灾意识和能力。在重要天气时段,广大干部群众积极配合,主动参与到防灾避险工作中。
\ No newline at end of file
新滩滑坡位于湖北省秭归县屈原镇(原新滩镇),长江北岸,下距三峡大坝27千米。在葛洲坝蓄水前,枯水季节该处江面宽约200余米,流速每秒6米以上,落差8米,轮船逆水上行至此,均须船工拉纤或绞滩牵引过滩,素有“楚蜀诸滩,首显新滩,见新滩知瞿塘滟滪关非险关”之称,是川江航道上著名的急流险滩。
据《归州志》、《水经注》等史料记载:新滩原名“豪三峡”、“始平坦”、“无大滩”。因汉晋时山崩,石雍江心,堆积成滩而得名。公元100年,“汉永元十二年庚子夏间四月,……,秭归山高400丈崩,填溪水,压杀百余人”。公元377年(晋太元二年),“山又崩,当崩之日,水逆流百余里,涌起数十丈”。公元1030年,“蛟出山崩,水石喷薄”,“害舟不可胜计”,堵江21年,至1051年才疏凿通。公 元1542年,久雨、暴雨过后发生大规模岩崩,冲压居民百余家,堵江82年,至1624年才疏凿通。
1985年6月12日凌晨3点52至56分,沿新滩镇北广家崖坡脚→窝塘坑→姜家坡→新滩镇一线,发生了前后缘高程70米至910米,南北长约1900米,东西宽约210米至710米,滑坡面积约0.73平方千米,体积约3000万立方米土石的特大型滑坡,高速下滑的土石将具有千年历史的新滩古镇推毁入江,毁坏457户居民计1569间房屋。约有340万方土石入江,激起涌浪高54米,波及上游15公里的秭归县城关,下游27公里的三斗坪,形成高出江水面东西长约250米,南北宽约93米的碍航滑舌,被迫停航12天。
由于我站科学预测预报准确及时、上级主管部门决策果断、当地政府组织撤离措施有效,使滑坡区内457户计1371人在滑坡前夕全部安全撤离,无一人伤亡;正在险水区长江上下游航行的11艘客货船及时避险、免遇灾难。使这场不可抗拒的地质灾害损失减少到最低程度,被誉为“我国滑坡预测预报防灾史上罕见的奇迹!”。
\ No newline at end of file
新滩滑坡位于湖北省秭归县屈原镇(原新滩镇),长江北岸,下距三峡大坝27千米。在葛洲坝蓄水前,枯水季节该处江面宽约200余米,流速每秒6米以上,落差8米,轮船逆水上行至此,均须船工拉纤或绞滩牵引过滩,素有“楚蜀诸滩,首显新滩,见新滩知瞿塘滟滪关非险关”之称,是川江航道上著名的急流险滩。
据《归州志》、《水经注》等史料记载:新滩原名“豪三峡”、“始平坦”、“无大滩”。因汉晋时山崩,石雍江心,堆积成滩而得名。公元100年,“汉永元十二年庚子夏间四月,……,秭归山高400丈崩,填溪水,压杀百余人”。公元377年(晋太元二年),“山又崩,当崩之日,水逆流百余里,涌起数十丈”。公元1030年,“蛟出山崩,水石喷薄”,“害舟不可胜计”,堵江21年,至1051年才疏凿通。公 元1542年,久雨、暴雨过后发生大规模岩崩,冲压居民百余家,堵江82年,至1624年才疏凿通。
1985年6月12日凌晨3点52至56分,沿新滩镇北广家崖坡脚→窝塘坑→姜家坡→新滩镇一线,发生了前后缘高程70米至910米,南北长约1900米,东西宽约210米至710米,滑坡面积约0.73平方千米,体积约3000万立方米土石的特大型滑坡,高速下滑的土石将具有千年历史的新滩古镇推毁入江,毁坏457户居民计1569间房屋。约有340万方土石入江,激起涌浪高54米,波及上游15公里的秭归县城关,下游27公里的三斗坪,形成高出江水面东西长约250米,南北宽约93米的碍航滑舌,被迫停航12天。
由于我站科学预测预报准确及时、上级主管部门决策果断、当地政府组织撤离措施有效,使滑坡区内457户计1371人在滑坡前夕全部安全撤离,无一人伤亡;正在险水区长江上下游航行的11艘客货船及时避险、免遇灾难。使这场不可抗拒的地质灾害损失减少到最低程度,被誉为“我国滑坡预测预报防灾史上罕见的奇迹!”。
\ No newline at end of file
参加过一次软院心理讲座,但是未录入
有博雅记录的一共4次
总共5次博雅
\ No newline at end of file
1.做笔记
在任务1中做好笔记非常重要,尤其是在听力段落中。有两个原因:
阅读文章将在演讲后重新出现,并且在你写作时可见。因此,尽管注意作者的立场和要点很重要,但你无需在阅读文章中做大量注释。
与阅读相比,你应该写更多有关听力的文章。那就对了!在你的回答中,关于教授的观点和反驳的文章应多于作者两倍。因此,在演讲过程中做好笔记至关重要。
这一点必须要强调:在听力文章中记下好的笔记!
关于听力段落的内容,你所写的内容将比阅读内容多两倍。
聆听并将你的笔记与聆听中的笔记进行比较。
2.不要引用
对于TOEFL综合写作任务,要求你用自己的话来解释作者和教授的观点!因此,把一切都解释一下是非常重要的。
阅读文章尤其如此。请记住,在撰写论文时,阅读部分就在你眼前。如果你直接引用作者的阅读段落,那么TOEFL电子评分系统把这部分内容辨认出来,并直接导致你的分数降低。
例如,假设阅读段落指出:
“ there are many who argue that corn ethanol should replace fossil fuel gas as the primary source for running cars.”
不要在你的作文中写: “The author discusses howthere are many who argue that corn ethanol should replace fossil fuel gas as the primary source for running cars.”
加粗的部分是完全一样的,这是许多同学会犯的错误!
那么怎么写呢?我们可以对作者的观点进行阐述,进行paraphrase,例如可以这么写:“The author discusses the advantages of switching from fossil fuels to the alternative energy source: corn-based ethanol”
3.要使用过渡词和短语
过渡性单词和短语是写作的关键组成部分,尤其是在托福写作任务一中。在阅读和听力文章中,你需要在形成鲜明对比的观点之间转换。保持文章连贯性的最佳方法是在不同观点之间使用过渡词。
对过渡词的良好使用,能够向TOEFL评分者和电子评分者证明,你对英语和北美学术论文结构掌握良好。以下是一些常见的过渡性单词和短语:
给各个要点和理由进行排序
位置:
整理各段落中的要点/每个正文段落的第一句
and then, first of all, firstly, in the first place, first and foremost,firstly, secondly, thirdly, next, after that, meanwhile, lastly, later, finally, while
阐述、添加想法
位置:
在正文中论述听力的要点
在解释你的理由时,通常是正文的第二句话
在阐述例子时
above all, actually, additionally, as well as, as a matter of fact, in addition, believe it or not, furthermore, indeed, in fact, just as, moreover
举例说明
位置:
介绍你的个人例子或轶事时
as an illustration, for example, for instance, I remember when, such as
显示因果关系
位置:
在正文结尾处和/或将您的故事与主题相关时,在每个正文段落的末尾
as a result, because, consequently, due to, hence, so, therefore, thus, for this reason
对比
位置:
在每个段落中介绍听力段落的观点时
在介绍和结论中认识相反的论点
although, at the same time, but, contrary to, even though, however, nevertheless, nonetheless, on the other hand, still, when in fact, yet, whereas, besides, despite the fact that, conversely
总结
位置:
结论段落/每个正文段落的最后一句
all in all, as noted above, finally, in conclusion, in short, in the end, on the whole, to conclude, to sum up
\ No newline at end of file
参加过一次软院心理讲座,但是未录入
有博雅记录的一共4次
总共5次博雅
\ No newline at end of file
前端:
区分已被选择三次的分片和其他可选分片
发布者终止任务按钮
标注者我的任务界面区分被终止任务
标注者主动删除任务
后端:
限制对已选择三次的分片的再选
终止任务的后端删除
......@@ -4,7 +4,7 @@ import traceback
import zipfile
from flask import Blueprint, request, make_response, send_file
from dao import Image, Relation
from dao import Image
image = Blueprint("image", __name__, url_prefix="/api")
......@@ -39,12 +39,12 @@ def save_image():
'message': ret.message,
'data': ret.data
}
if ret.code != 0:
rid = image_list[0]['relationId']
if not Relation.set_result_pic(rid):
res['code'] = 0
res['message'] = '保存失败,更改标注关系状态失败,不存在此标注任务'
Image.delete_image(rid)
# if ret.code != 0:
# rid = image_list[0]['relationId']
# if not Relation.set_result_pic(rid):
# res['code'] = 0
# res['message'] = '保存失败,更改标注关系状态失败,不存在此标注任务'
# Image.delete_image(rid)
return json.dumps(res, ensure_ascii=False)
......@@ -72,12 +72,12 @@ def save_layer():
'message': ret.message,
'data': ret.data
}
if ret.code != 0:
rid = layer_info['relationId']
if not Relation.set_result_pic(rid):
res['code'] = 0
res['message'] = '保存失败,更改标注关系状态失败,不存在此标注任务'
Image.delete_layer(rid)
# if ret.code != 0:
# rid = layer_info['relationId']
# if not Relation.set_result_pic(rid):
# res['code'] = 0
# res['message'] = '保存失败,更改标注关系状态失败,不存在此标注任务'
# Image.delete_layer(rid)
return json.dumps(res, ensure_ascii=False)
......
......@@ -225,3 +225,33 @@ def grade():
'data': ret.data
}
return json.dumps(res)
# 放弃任务
@task.route("/giveUpTask", methods=["GET"])
def give_up_task():
# data = request.get_json(silent=True)
# userId = int(data['userId'])
# piecesIdList = list(data['piecesIdList'])
userId = request.args['userId']
taskId = request.args['taskId']
# for taskId in piecesIdList:
# print("taskId", taskId)
slicelist = Slice.find_slicelist_by_taskId(taskId)
for sliceItem in slicelist:
sliceId = sliceItem.slice_id
ret_delete = Relation.delete_by_sliceid(userId, sliceId)
if ret_delete == False:
res = {
'code': 0,
'message': "Abandon task failed",
'data': {}
}
return json.dumps(res)
res = {
'code': 1,
'message': "Abandon the task successfully",
'data': {}
}
return json.dumps(res)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment