index.vue 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. <template>
  2. <div id="index">
  3. <el-row>
  4. <el-col :span="24" class="main">
  5. <span v-if="display == 'list'">
  6. <el-col :span="24" class="btn">
  7. <el-button type="primary" size="mini" @click="add">添加信息</el-button>
  8. </el-col>
  9. <el-col :span="24" class="list">
  10. <data-table
  11. :fields="fields"
  12. :data="list"
  13. :total="total"
  14. @query="search"
  15. :opera="opera"
  16. @view="toView"
  17. @edit="toEdit"
  18. @delete="toDelete"
  19. ></data-table>
  20. </el-col>
  21. </span>
  22. <span v-else-if="display == 'detail'">
  23. <el-col :span="24" class="btn">
  24. <el-button type="primary" size="mini" @click="back">返回列表</el-button>
  25. </el-col>
  26. <el-col :span="24" class="detail">
  27. <data-form :data="form" :fields="formFields" @save="toSave">
  28. <template #custom="{item, form}">
  29. <template v-if="item.model === 'img_path'">
  30. <upload :limit="1" :data="form.img_path" type="img_path" :url="'/files/img_path/upload'" @upload="uploadSuccess"></upload>
  31. </template>
  32. <template v-if="item.model === 'file_path'">
  33. <uploadfile
  34. :limit="1"
  35. :data="form.file_path"
  36. type="file_path"
  37. listType=""
  38. :url="'/files/file_path/upload'"
  39. @upload="sucfile"
  40. @delete="delfile"
  41. ></uploadfile>
  42. </template>
  43. </template>
  44. </data-form>
  45. </el-col>
  46. </span>
  47. <span v-else-if="display == 'projectList'">
  48. <el-col :span="24" class="btn">
  49. <el-button type="primary" size="mini" @click="back">返回列表</el-button>
  50. </el-col>
  51. <el-col :span="24" class="projectList">
  52. <data-table :fields="profields" :opera="proopera" :data="prolist" :total="prototal" @query="prosearch" @view="proFetch"></data-table>
  53. </el-col>
  54. </span>
  55. <span v-else-if="display == 'projectDetail'">
  56. <el-col :span="24" class="btn">
  57. <el-button type="primary" size="mini" @click="back">返回列表</el-button>
  58. </el-col>
  59. <el-col :span="24" class="projectDetail">
  60. <projectInfo :info="projectDetail"></projectInfo>
  61. </el-col>
  62. </span>
  63. </el-col>
  64. </el-row>
  65. </div>
  66. </template>
  67. <script>
  68. import dataTable from '@/components/data-table.vue';
  69. import dataForm from '@/components/form.vue';
  70. import upload from '@/components/uploadone.vue';
  71. import uploadfile from '@/components/uploaddock.vue';
  72. import projectInfo from './parts/projectInfo.vue';
  73. import { mapState, createNamespacedHelpers } from 'vuex';
  74. const { mapActions: question } = createNamespacedHelpers('question');
  75. const { mapActions: projectsolic } = createNamespacedHelpers('projectsolic');
  76. export default {
  77. metaInfo() {
  78. return { title: this.$route.meta.title };
  79. },
  80. name: 'index',
  81. props: {},
  82. components: {
  83. dataTable,
  84. dataForm,
  85. upload,
  86. uploadfile,
  87. projectInfo,
  88. },
  89. data: function() {
  90. return {
  91. // 显示
  92. display: 'projectDetail',
  93. opera: [
  94. {
  95. label: '查看项目征集',
  96. method: 'view',
  97. },
  98. {
  99. label: '编辑',
  100. method: 'edit',
  101. },
  102. {
  103. label: '删除',
  104. method: 'delete',
  105. },
  106. ],
  107. fields: [
  108. { label: '信息标题', prop: 'title' },
  109. { label: '信息来源', prop: 'origin' },
  110. { label: '发布时间', prop: 'create_date' },
  111. ],
  112. list: [],
  113. total: 0,
  114. // 添加数据
  115. form: {},
  116. formFields: [
  117. { label: '信息标题', model: 'title' },
  118. { label: '发布时间', model: 'create_date', type: 'date' },
  119. { label: '信息来源', model: 'origin' },
  120. { label: '图片', model: 'img_path', custom: true },
  121. { label: '附件', model: 'file_path', custom: true },
  122. { label: '信息内容', model: 'content', type: 'editor' },
  123. ],
  124. // 项目征集列表
  125. proid: '',
  126. proopera: [
  127. {
  128. label: '详情',
  129. method: 'view',
  130. },
  131. ],
  132. profields: [
  133. { label: '项目名称', prop: 'name', showTip: true },
  134. { label: '项目负责人', prop: 'pro_user', showTip: true },
  135. { label: '联系电话', prop: 'pro_phone', showTip: true },
  136. ],
  137. prolist: [],
  138. prototal: 0,
  139. projectDetail: {
  140. content: '研究内容',
  141. coopera_company: '合作单位',
  142. coopera_phone: '合作单位联系电话',
  143. coopera_user: '合作单位联系人',
  144. create_time: '2021-02-08 15:01:33',
  145. field: '电子信息技术',
  146. id: '6020e30dea6754a4a83c18df',
  147. influence: '经济效益',
  148. meta: Object,
  149. name: '测试项目',
  150. pro_phone: '17096670503',
  151. pro_user: '测试单位',
  152. project_back: '项目背景',
  153. proposal_company: '建议单位',
  154. proposal_phone: '建议单位联系电话',
  155. proposal_user: '建议单位联系人',
  156. question_id: Object,
  157. quota: '核心指标',
  158. route: '技术路线',
  159. scale: '100',
  160. sign: '立项意义',
  161. techol_level: '国际领先',
  162. techol_stage: '理论研究',
  163. user_id: '601fa4ed1a45febbf084f439',
  164. work_basics: '前期基础',
  165. },
  166. };
  167. },
  168. async created() {
  169. await this.search();
  170. },
  171. methods: {
  172. ...question(['query', 'create', 'update', 'delete']),
  173. ...projectsolic({ solicQuery: 'query', solicFetch: 'fetch' }),
  174. async search({ skip = 0, limit = 10, ...info } = {}) {
  175. const res = await this.query({ skip, limit, ...info });
  176. if (this.$checkRes(res)) {
  177. this.$set(this, `list`, res.data);
  178. this.$set(this, `total`, res.total);
  179. }
  180. },
  181. // 修改
  182. toEdit({ data }) {
  183. this.$set(this, 'form', _.cloneDeep(data));
  184. this.display = 'detail';
  185. },
  186. // 删除
  187. async toDelete({ data }) {
  188. const res = await this.delete(data.id);
  189. if (this.$checkRes(res, '删除成功', '删除失败' || res.errmsg)) {
  190. this.search();
  191. }
  192. },
  193. // 添加数据
  194. add() {
  195. this.display = 'detail';
  196. },
  197. // 添加,修改
  198. async toSave({ data }) {
  199. const dup = _.cloneDeep(data);
  200. let res;
  201. if (dup.id) {
  202. res = await this.update(dup);
  203. } else {
  204. res = await this.create(dup);
  205. }
  206. if (this.$checkRes(res, '保存成功', res.errmsg || '保存失败')) {
  207. this.search();
  208. this.back();
  209. }
  210. },
  211. // 查看项目征集
  212. toView({ data }) {
  213. this.display = 'projectList';
  214. this.$set(this, `proid`, data._id);
  215. this.prosearch();
  216. },
  217. // 查看项目征集详情
  218. proFetch({ data }) {
  219. console.log(data);
  220. this.$set(this, `projectDetail`, data);
  221. this.display = 'projectDetail';
  222. },
  223. // 查看调研调查中的项目征集数据
  224. async prosearch({ skip = 0, limit = 10, ...info } = {}) {
  225. const res = await this.solicQuery({ skip, limit, question_id: this.proid });
  226. if (this.$checkRes(res)) {
  227. this.$set(this, `prolist`, res.data);
  228. this.$set(this, `prototal`, res.total);
  229. }
  230. },
  231. // 返回列表
  232. back() {
  233. this.form = {};
  234. this.display = 'list';
  235. this.search();
  236. },
  237. // 图片上传
  238. uploadSuccess({ type, data }) {
  239. this.$set(this.form, `${type}`, data.uri);
  240. },
  241. // 视频文件
  242. sucfile({ type, data }) {
  243. this.$set(this.form, `${type}`, data.uri);
  244. },
  245. delfile(index) {
  246. this.$set(this.form, `file_path`, '');
  247. },
  248. },
  249. computed: {
  250. ...mapState(['user']),
  251. },
  252. watch: {},
  253. };
  254. </script>
  255. <style lang="less" scoped>
  256. .main {
  257. padding: 0 15px 0 0;
  258. .btn {
  259. text-align: right;
  260. margin: 0 0 10px 0;
  261. }
  262. }
  263. </style>