|
@@ -40,14 +40,6 @@
|
|
|
</el-row>
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="类型" prop="type">
|
|
|
- <el-select v-if="isModifyMode" v-model="project.type" placeholder="请选择类型">
|
|
|
- <el-option label="类型一" value="type1"></el-option>
|
|
|
- <el-option label="类型二" value="type2"></el-option>
|
|
|
- </el-select>
|
|
|
- <span v-if="!isModifyMode">{{project.type}}</span>
|
|
|
- </el-form-item>
|
|
|
-
|
|
|
<el-form-item label="平台" prop="platform">
|
|
|
<el-checkbox-group v-if="isModifyMode" v-model="project.platform">
|
|
|
<el-checkbox label="0">IOS</el-checkbox>
|
|
@@ -64,6 +56,61 @@
|
|
|
<el-input v-if="isModifyMode" type="textarea" v-model="project.desc"></el-input>
|
|
|
<span v-if="!isModifyMode">{{project.desc}}</span>
|
|
|
</el-form-item>
|
|
|
+ <el-form-item label="价格" prop="price">
|
|
|
+ <el-input v-if="isModifyMode" type="number" v-model="project.price">
|
|
|
+ <template slot="append">¥</template>
|
|
|
+ </el-input>
|
|
|
+ <span v-if="!isModifyMode">{{project.price}}¥</span>
|
|
|
+ </el-form-item>
|
|
|
+
|
|
|
+ <el-form-item label="服务类型" prop="type">
|
|
|
+ <el-checkbox-group v-if="isModifyMode" v-model="project.type">
|
|
|
+ <el-checkbox label="接口测试" name="type"></el-checkbox>
|
|
|
+ <el-checkbox label="安全漏洞扫描" name="type"></el-checkbox>
|
|
|
+ <el-checkbox label="风险评估服务" name="type"></el-checkbox>
|
|
|
+ <el-checkbox label="源代码安全审计服务" name="type"></el-checkbox>
|
|
|
+ <el-checkbox label="功能测试服务" name="type"></el-checkbox>
|
|
|
+ <el-checkbox label="性能测试" name="type"></el-checkbox>
|
|
|
+ <el-checkbox label="功能和易用性测试" name="type"></el-checkbox>
|
|
|
+ </el-checkbox-group>
|
|
|
+ <span v-if="!isModifyMode" class="badge" v-for="item in project.type">{{item}}</span>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="用途" prop="useage">
|
|
|
+ <el-input v-if="isModifyMode" v-model="project.useage"></el-input>
|
|
|
+ <span v-if="!isModifyMode">{{project.useage}}</span>
|
|
|
+ </el-form-item>
|
|
|
+
|
|
|
+ <el-form-item label="预算" prop="budget">
|
|
|
+ <el-input v-if="isModifyMode" type="number" v-model="project.budget">
|
|
|
+ <template slot="append">¥</template>
|
|
|
+ </el-input>
|
|
|
+ <span v-if="!isModifyMode">{{project.budget}}¥</span>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="项目可见性" prop="resource">
|
|
|
+ <div v-if="!isModifyMode">
|
|
|
+ <div v-if="project.resource=='定向'">{{project.institution}}</div>
|
|
|
+ <div v-if="project.resource=='非定向'">{{project.resource}}</div>
|
|
|
+ </div>
|
|
|
+ <el-tabs
|
|
|
+ :tab-position="tabPosition"
|
|
|
+ v-model="project.resource"
|
|
|
+ style="max-height: 200px;"
|
|
|
+ v-if="isModifyMode"
|
|
|
+ >
|
|
|
+ <el-tab-pane label="定向" name="定向">
|
|
|
+ <el-radio-group v-model="project.institution">
|
|
|
+ <el-radio
|
|
|
+ :label="item"
|
|
|
+ name="type"
|
|
|
+ v-for="item,index in institutionArray"
|
|
|
+ :key="index"
|
|
|
+ ></el-radio>
|
|
|
+ </el-radio-group>
|
|
|
+ </el-tab-pane>
|
|
|
+ <el-tab-pane label="非定向" name="非定向"></el-tab-pane>
|
|
|
+ </el-tabs>
|
|
|
+ </el-form-item>
|
|
|
+
|
|
|
<el-form-item label="需求文档" prop="doc">
|
|
|
<el-upload
|
|
|
v-if="isModifyMode"
|
|
@@ -99,6 +146,18 @@
|
|
|
</el-upload>
|
|
|
<span v-if="!isModifyMode">{{project.file}}</span>
|
|
|
</el-form-item>
|
|
|
+ <el-form-item label="项目截止时间" prop="datetime">
|
|
|
+ <div class="block" v-if="isModifyMode">
|
|
|
+ <el-date-picker
|
|
|
+ v-model="project.datetime"
|
|
|
+ type="datetime"
|
|
|
+ placeholder="选择截止时间"
|
|
|
+ align="right"
|
|
|
+ :picker-options="pickerOptions"
|
|
|
+ ></el-date-picker>
|
|
|
+ </div>
|
|
|
+ <span v-if="!isModifyMode">{{new Date(project.datetime)}}</span>
|
|
|
+ </el-form-item>
|
|
|
<el-form-item v-if="isModifyMode">
|
|
|
<div class="btn btn-medium btn-info" @click="submitForm('project')">确认修改</div>
|
|
|
<div class="btn btn-medium" @click="resetForm('project')">重置</div>
|
|
@@ -106,11 +165,61 @@
|
|
|
</el-form-item>
|
|
|
<el-form-item v-if="!isModifyMode">
|
|
|
<div class="btn btn-medium btn-info" @click="modifyForm()">修改</div>
|
|
|
+ <div class="btn btn-medium btn-info" @click="analyseDemand()">分析需求</div>
|
|
|
<div class="btn btn-medium btn-info" @click="createTask()">新建任务</div>
|
|
|
<div class="btn btn-medium btn-info" @click="createReport()">上传报告</div>
|
|
|
</el-form-item>
|
|
|
</el-form>
|
|
|
</div>
|
|
|
+
|
|
|
+ <div class="create-body" v-if="!isModifyMode">
|
|
|
+ <div class="title h2">分析需求</div>
|
|
|
+ <div class="task-list">
|
|
|
+ <el-table :data="analyseDemandList" style="width: 100%" max-height="400">
|
|
|
+ <el-table-column prop="institution" label="承接单位" title="承接单位"></el-table-column>
|
|
|
+ <el-table-column prop="feasibilityReport" sortable label="可行性分析报告">
|
|
|
+ <template slot-scope="scope">
|
|
|
+ <span v-if="!scope.row.feasibilityReport.url">暂无文件</span>
|
|
|
+ <a
|
|
|
+ :href="scope.row.feasibilityReport.url"
|
|
|
+ v-if="scope.row.feasibilityReport.url"
|
|
|
+ target="_blank"
|
|
|
+ >
|
|
|
+ <i class="fa fa-file-text-o"></i>
|
|
|
+ {{scope.row.feasibilityReport.name}}
|
|
|
+ </a>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column prop="priceAuditReport" sortable label="可行性分析报告">
|
|
|
+ <template slot-scope="scope">
|
|
|
+ <span v-if="!scope.row.priceAuditReport.url">暂无文件</span>
|
|
|
+ <a
|
|
|
+ :href="scope.row.priceAuditReport.url"
|
|
|
+ v-if="scope.row.priceAuditReport.url"
|
|
|
+ target="_blank"
|
|
|
+ >
|
|
|
+ <i class="fa fa-file-text-o"></i>
|
|
|
+ {{scope.row.priceAuditReport.name}}
|
|
|
+ </a>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+
|
|
|
+ <el-table-column align="right" label="操作">
|
|
|
+ <template slot-scope="scope">
|
|
|
+ <div
|
|
|
+ class="btn btn-small btn-info"
|
|
|
+ @click="handleAccept(scope.$index, scope.row.id)"
|
|
|
+ >接受</div>
|
|
|
+ <div
|
|
|
+ class="btn btn-small btn-danger"
|
|
|
+ @click="handleReject(scope.$index, scope.row.id)"
|
|
|
+ >拒绝</div>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
<div class="create-body" v-if="!isModifyMode">
|
|
|
<div class="title h2">任务列表</div>
|
|
|
<div class="task-list">
|
|
@@ -145,6 +254,7 @@
|
|
|
</el-table>
|
|
|
</div>
|
|
|
</div>
|
|
|
+
|
|
|
<div class="create-body" v-if="!isModifyMode">
|
|
|
<div class="title h2">报告列表</div>
|
|
|
<report-list/>
|
|
@@ -153,6 +263,7 @@
|
|
|
</template>
|
|
|
|
|
|
<script>
|
|
|
+import Enum from "@/constants/enum/index";
|
|
|
import PlatformType from "@/constants/enum/platform-type";
|
|
|
import provinceCity from "@/constants/provinceCity.json";
|
|
|
import ReportList from "@/components/report/ReportList";
|
|
@@ -172,6 +283,8 @@ export default {
|
|
|
};
|
|
|
return {
|
|
|
projectId: 0,
|
|
|
+ tabPosition: "top",
|
|
|
+ institutionArray: Enum.institution,
|
|
|
isModifyMode: false,
|
|
|
platformType: [],
|
|
|
project: {
|
|
@@ -181,11 +294,17 @@ export default {
|
|
|
name: "小王",
|
|
|
phone: "12426177281"
|
|
|
},
|
|
|
- type: "type1",
|
|
|
+ type: ["安全漏洞扫描"],
|
|
|
platform: ["0", "1"],
|
|
|
desc: "需求描述文字",
|
|
|
doc: "",
|
|
|
file: "http://a.apk",
|
|
|
+ resource: "非定向",
|
|
|
+ institution: "",
|
|
|
+ datetime: new Date("2018-11-11 23:11:11"),
|
|
|
+ price: "400",
|
|
|
+ useage: "练习",
|
|
|
+ budget: "100",
|
|
|
task: [
|
|
|
{
|
|
|
id: "1",
|
|
@@ -222,13 +341,55 @@ export default {
|
|
|
}
|
|
|
]
|
|
|
},
|
|
|
+ analyseDemandList: [
|
|
|
+ {
|
|
|
+ id: "1",
|
|
|
+ institution: "上软",
|
|
|
+ feasibilityReport: {
|
|
|
+ name: "可行性分析报告",
|
|
|
+ url: "feasibilityReport.docx"
|
|
|
+ },
|
|
|
+ priceAuditReport: { name: "价格审核告", url: "priceAuditReport.docx" }
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ pickerOptions: {
|
|
|
+ shortcuts: [
|
|
|
+ {
|
|
|
+ text: "今天",
|
|
|
+ onClick(picker) {
|
|
|
+ picker.$emit("pick", new Date());
|
|
|
+ }
|
|
|
+ },
|
|
|
+ {
|
|
|
+ text: "昨天",
|
|
|
+ onClick(picker) {
|
|
|
+ const date = new Date();
|
|
|
+ date.setTime(date.getTime() - 3600 * 1000 * 24);
|
|
|
+ picker.$emit("pick", date);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ {
|
|
|
+ text: "一周前",
|
|
|
+ onClick(picker) {
|
|
|
+ const date = new Date();
|
|
|
+ date.setTime(date.getTime() - 3600 * 1000 * 24 * 7);
|
|
|
+ picker.$emit("pick", date);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ]
|
|
|
+ },
|
|
|
rules: {
|
|
|
name: [
|
|
|
{ required: true, message: "请输入项目名称", trigger: "blur" }
|
|
|
// { min: 3, max: 5, message: "长度在 3 到 5 个字符", trigger: "blur" }
|
|
|
],
|
|
|
type: [
|
|
|
- { required: true, message: "请选择项目类型", trigger: "change" }
|
|
|
+ {
|
|
|
+ type: "array",
|
|
|
+ required: true,
|
|
|
+ message: "请至少选择一种服务类型",
|
|
|
+ trigger: "change"
|
|
|
+ }
|
|
|
],
|
|
|
platform: [
|
|
|
{
|
|
@@ -239,7 +400,14 @@ export default {
|
|
|
}
|
|
|
],
|
|
|
desc: [{ required: true, message: "请填写活动形式", trigger: "blur" }],
|
|
|
- contact: [{ validator: validatePass, trigger: "blur" }]
|
|
|
+ contact: [{ validator: validatePass, trigger: "blur" }],
|
|
|
+ resource: [
|
|
|
+ {
|
|
|
+ required: true,
|
|
|
+ message: "请选择项目可见性",
|
|
|
+ trigger: "change"
|
|
|
+ }
|
|
|
+ ]
|
|
|
}
|
|
|
};
|
|
|
},
|
|
@@ -248,7 +416,14 @@ export default {
|
|
|
this.init();
|
|
|
});
|
|
|
},
|
|
|
- watch: {},
|
|
|
+ watch: {
|
|
|
+ "project.resource"() {
|
|
|
+ if (this.project.resource == "非定向") {
|
|
|
+ this.project.institution = "";
|
|
|
+ }
|
|
|
+ },
|
|
|
+ deep: true
|
|
|
+ },
|
|
|
methods: {
|
|
|
updateLocation(location) {
|
|
|
var provinceName = "";
|
|
@@ -287,7 +462,7 @@ export default {
|
|
|
resetForm(formName) {
|
|
|
this.$refs[formName].resetFields();
|
|
|
this.project.name = "";
|
|
|
- this.project.type = "";
|
|
|
+ this.project.type = [];
|
|
|
this.project.platform = [];
|
|
|
this.project.desc = "";
|
|
|
this.project.doc = "";
|
|
@@ -296,6 +471,12 @@ export default {
|
|
|
name: "",
|
|
|
phone: ""
|
|
|
};
|
|
|
+ this.project.resource = "非定向";
|
|
|
+ this.project.institution = "";
|
|
|
+ this.project.datetime = "";
|
|
|
+ this.project.price = "";
|
|
|
+ this.project.useage = "";
|
|
|
+ this.project.budget = "";
|
|
|
},
|
|
|
modifyForm() {
|
|
|
this.isModifyMode = true;
|
|
@@ -305,13 +486,19 @@ export default {
|
|
|
code: "27382hdsjkfdskfK",
|
|
|
contact: {
|
|
|
name: "小王",
|
|
|
- phone: "12426177281"
|
|
|
+ phone: "13818022817"
|
|
|
},
|
|
|
- type: "type1",
|
|
|
+ type: ["安全漏洞扫描"],
|
|
|
platform: ["0", "1"],
|
|
|
desc: "需求描述文字",
|
|
|
doc: "",
|
|
|
file: "http://a.apk",
|
|
|
+ resource: "非定向",
|
|
|
+ institution: "",
|
|
|
+ datetime: new Date("2018-11-11 23:11:11"),
|
|
|
+ price: "400",
|
|
|
+ useage: "练习",
|
|
|
+ budget: "100",
|
|
|
task: [
|
|
|
{
|
|
|
id: "1",
|
|
@@ -357,13 +544,19 @@ export default {
|
|
|
code: "27382hdsjkfdskfK",
|
|
|
contact: {
|
|
|
name: "小王",
|
|
|
- phone: "12426177281"
|
|
|
+ phone: "13818022817"
|
|
|
},
|
|
|
- type: "type1",
|
|
|
+ type: ["安全漏洞扫描"],
|
|
|
platform: ["0", "1"],
|
|
|
desc: "需求描述文字",
|
|
|
doc: "",
|
|
|
file: "http://a.apk",
|
|
|
+ resource: "非定向",
|
|
|
+ institution: "",
|
|
|
+ datetime: new Date("2018-11-11 23:11:11"),
|
|
|
+ price: "400",
|
|
|
+ useage: "练习",
|
|
|
+ budget: "100",
|
|
|
task: [
|
|
|
{
|
|
|
id: "1",
|
|
@@ -424,6 +617,15 @@ export default {
|
|
|
this.$message.error("上传安装包只能是 APK 或 DMG 格式!");
|
|
|
}
|
|
|
return isAPK && isDMG;
|
|
|
+ },
|
|
|
+ analyseDemand() {
|
|
|
+ this.$router.push({ name: "AnalyseDemand" });
|
|
|
+ },
|
|
|
+ handleAccept(index, id) {
|
|
|
+ console.log("接受");
|
|
|
+ },
|
|
|
+ handleReject(index, id) {
|
|
|
+ console.log("拒绝");
|
|
|
}
|
|
|
}
|
|
|
};
|