index.vue 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. <template>
  2. <div>
  3. <page-header
  4. :loading="detailLoading"
  5. :routes="[
  6. { name: '代码作业', path: 'code' },
  7. { name: '项目列表', path: `code/${$route.params.homeworkId}` },
  8. { name: '项目详情' }
  9. ]"
  10. :tab-list="[
  11. {
  12. name: '构建',
  13. path: `code/${$route.params.homeworkId}/${$route.params.projectId}`
  14. },
  15. {
  16. name: '部署',
  17. path: `code/${$route.params.homeworkId}/${
  18. $route.params.projectId
  19. }/deploy`
  20. },
  21. {
  22. name: '测试',
  23. path: `code/${$route.params.homeworkId}/${
  24. $route.params.projectId
  25. }/test`
  26. }
  27. ]"
  28. >
  29. <template slot="title">
  30. {{ projectDetail.name }}
  31. </template>
  32. <template slot="content">
  33. <strong>git 地址 : </strong>
  34. <a :href="projectDetail.url" target="_blank">{{ projectDetail.url }}</a>
  35. <a
  36. style="margin-left:10px;"
  37. class="button is-small"
  38. v-clipboard:copy="projectDetail.url"
  39. v-clipboard:success="onCopy"
  40. v-clipboard:error="onError"
  41. >复制地址</a
  42. >
  43. </template>
  44. </page-header>
  45. <page-body>
  46. <router-view
  47. :project-detail="projectDetail"
  48. :detail-loading="detailLoading"
  49. />
  50. </page-body>
  51. </div>
  52. </template>
  53. <script>
  54. import { getProjectDetail } from "@/api/codehw";
  55. import PageHeader from "@/components/PageHeader";
  56. import PageBody from "@/components/PageBody/index";
  57. export default {
  58. components: {
  59. PageBody,
  60. PageHeader
  61. },
  62. data() {
  63. return {
  64. projectDetail: {},
  65. detailLoading: false
  66. };
  67. },
  68. methods: {
  69. onCopy() {
  70. this.$toast.open({
  71. message: "复制成功",
  72. type: "is-success"
  73. });
  74. },
  75. onError() {
  76. this.$toast.open({
  77. message: "复制失败",
  78. type: "is-danger"
  79. });
  80. }
  81. },
  82. async mounted() {
  83. const { projectId } = this.$route.params;
  84. this.detailLoading = true;
  85. const detail = await getProjectDetail(projectId);
  86. this.projectDetail = detail.data;
  87. this.detailLoading = false;
  88. }
  89. };
  90. </script>
  91. <style lang="scss" scoped>
  92. .top-nav-section {
  93. padding: 0 40px;
  94. }
  95. </style>