数字化园区前端项目
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470
  1. <!-- 园区企业详情 -->
  2. <template>
  3. <div class="" v-loading="pageLoading">
  4. <section class="nav_box">
  5. <Nav></Nav>
  6. <div class="second_nv">
  7. <div>
  8. <div class="position">
  9. <img src="@assets/image/company/icon_address.png" alt="地址" />
  10. <span>
  11. 当前位置:
  12. <span class="pointer" @click="$router.push('/company-list')">
  13. 园区企业
  14. </span>
  15. <span style="margin:0 4px;">></span>
  16. <span class="current pointer">详情</span>
  17. </span>
  18. </div>
  19. </div>
  20. </div>
  21. <div class="detail_box" v-if="companyInfo">
  22. <section class="top_box">
  23. <div class="company_img_box">
  24. <img class="company_img" src="" alt="" />
  25. <div class="tip_img">
  26. <span
  27. :class="[
  28. 'claim_state',
  29. companyInfo.claimState.text === '已认领'
  30. ? 'claimed'
  31. : 'not_claim',
  32. ]"
  33. >
  34. {{ companyInfo.claimState.text }}
  35. </span>
  36. </div>
  37. </div>
  38. <div class="right_box">
  39. <div class="top_row">
  40. <span>{{ companyInfo.companyName }}</span>
  41. <div>
  42. <template v-if="canEdit == 1">
  43. <template v-if="isEditing">
  44. <span class="pointer" @click="updateCompany">
  45. <img
  46. src="@assets/image/company/icon_save.png"
  47. alt="保存"
  48. />
  49. 保存
  50. </span>
  51. <span class="pointer" @click="cancelEdit">
  52. <img
  53. src="@assets/image/company/icon_cancel.png"
  54. alt="取消"
  55. />
  56. 取消
  57. </span>
  58. </template>
  59. <span v-else class="pointer" @click="isEditing = true">
  60. <img src="@assets/image/company/icon_edit.png" alt="编辑" />
  61. 编辑
  62. </span>
  63. </template>
  64. <span
  65. class="pointer"
  66. v-if="!canEdit && companyInfo.claimState.text !== '已认领'"
  67. @click="setClaimDialog"
  68. >
  69. <img src="@assets/image/company/icon_claim.png" alt="认领" />
  70. 认领
  71. </span>
  72. </div>
  73. </div>
  74. <div class="middle_row">
  75. <div class="company_type">
  76. <template v-if="enterpriseLabel.length > 0">
  77. <span v-for="item in enterpriseLabel" :key="item">
  78. {{ item }}
  79. </span>
  80. </template>
  81. </div>
  82. <div class="time">
  83. <img src="@assets/image/company/icon_update.png" alt="保存" />
  84. <span>
  85. 更新时间:{{
  86. companyInfo.modifiedOn | formatDate("YYYY-MM-DD")
  87. }}
  88. </span>
  89. </div>
  90. </div>
  91. <div class="company_info">
  92. <div>
  93. 法人代表:
  94. <span>{{ companyInfo.legalPerson }}</span>
  95. </div>
  96. <div>
  97. 统一社会信用代码:
  98. <span>{{ companyInfo.creditCode }}</span>
  99. </div>
  100. <div>
  101. 电话:
  102. <span>{{ companyInfo.companyMobilePhone }}</span>
  103. </div>
  104. <div>
  105. 法人代表:
  106. <span>www.hhrchina.com</span>
  107. </div>
  108. <div>
  109. 成立日期:
  110. <span>
  111. {{ companyInfo.establishOn | formatDate("YYYY-MM-DD") }}
  112. </span>
  113. </div>
  114. <div>
  115. 邮箱:
  116. <span>{{ companyInfo.email || "--" }}</span>
  117. </div>
  118. </div>
  119. </div>
  120. </section>
  121. <div class="tab_box">
  122. <span
  123. :class="['pointer', activeTab === item.value ? 'active' : '']"
  124. v-for="(item, index) in tabs"
  125. :key="item.value"
  126. @click="changeTab(item, index)"
  127. >
  128. {{ item.name }}
  129. </span>
  130. </div>
  131. </div>
  132. </section>
  133. <section class="content_box" v-if="companyInfo">
  134. <basic-info class="content_item" ref="content1" :companyInfo="companyInfo"></basic-info>
  135. <company-dev
  136. class="content_item"
  137. ref="content2"
  138. :companyInfo="companyInfo"
  139. ></company-dev>
  140. <!-- <intellectual-property :companyInfo="companyInfo"></intellectual-property> -->
  141. <other-info
  142. class="content_item"
  143. ref="content4"
  144. :companyInfo="companyInfo"
  145. :isEditing="isEditing"
  146. ></other-info>
  147. </section>
  148. <Footer></Footer>
  149. <claim-dialog v-if="showClaimDialog" :claimDialog="claimDialog"></claim-dialog>
  150. </div>
  151. </template>
  152. <script>
  153. //这里可以导入其他文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
  154. //例如:import 《组件名称》 from '《组件路径》';
  155. import Nav from "@components/Header.vue";
  156. import Footer from "@components/Footer.vue";
  157. import BasicInfo from "./components/BasicInfo.vue";
  158. import CompanyDev from "./components/CompanyDev.vue";
  159. // import IntellectualProperty from "./components/IntellectualProperty.vue";
  160. import OtherInfo from "./components/OtherInfo.vue";
  161. import ClaimDialog from "./components/ClaimDialog.vue";
  162. import { getCompanyById, updateCompany } from "@api/company";
  163. import { mapGetters } from "vuex";
  164. export default {
  165. //import引入的组件需要注入到对象中才能使用
  166. components: {
  167. Nav,
  168. Footer,
  169. BasicInfo,
  170. CompanyDev,
  171. // IntellectualProperty,
  172. OtherInfo,
  173. ClaimDialog,
  174. },
  175. data() {
  176. //这里存放数据
  177. return {
  178. companyId: "",
  179. tabs: [
  180. {
  181. name: "基本信息",
  182. value: 1,
  183. },
  184. {
  185. name: "企业发展",
  186. value: 2,
  187. },
  188. // {
  189. // name: "知识产权",
  190. // value: 3,
  191. // },
  192. {
  193. name: "其他信息(可编辑)",
  194. value: 4,
  195. },
  196. ],
  197. activeTab: 1,
  198. companyInfo: null,
  199. showClaimDialog: false,
  200. claimDialog: false,
  201. canEdit: 0,
  202. isEditing: false,
  203. };
  204. },
  205. //监听属性 类似于data概念
  206. computed: {
  207. enterpriseLabel() {
  208. return this.companyInfo?.enterpriseLabel?.text ?? [];
  209. },
  210. ...mapGetters({
  211. currentAccount: "currentAccount",
  212. }),
  213. },
  214. //监控data中的数据变化
  215. watch: {},
  216. //方法集合
  217. methods: {
  218. // 锚点点击事件
  219. changeTab(item, index) {
  220. this.activeTab = item.value;
  221. let jumpDom = document.querySelectorAll(".content_item")[index];
  222. let scrollTop = jumpDom.offsetTop; // 获取需要滚动的距离
  223. window.scrollTo({
  224. top: scrollTop,
  225. behavior: "smooth", // 平滑滚动
  226. });
  227. // location.href = `#content${this.activeTab}`;
  228. },
  229. getData() {
  230. let params = {
  231. companyId: this.companyId,
  232. };
  233. this.pageLoading = true;
  234. getCompanyById(params)
  235. .then(res => {
  236. console.log(res.data);
  237. if (res.data.status == 0) {
  238. this.companyInfo = res.data.data;
  239. } else {
  240. this.$message.error(`获取数据失败,请刷新重试!`);
  241. }
  242. this.pageLoading = false;
  243. })
  244. .catch(err => {
  245. this.$message.error(`获取数据失败,失败原因${err},请刷新重试!`);
  246. });
  247. },
  248. setClaimDialog() {
  249. // 是否登录
  250. console.log(this.currentAccount, "this.currentAccount");
  251. if (!this.currentAccount) {
  252. this.$router.push("/login");
  253. }
  254. this.showClaimDialog = true;
  255. this.claimDialog = true;
  256. },
  257. cancelEdit() {
  258. this.isEditing = false;
  259. },
  260. updateCompany() {
  261. this.companyInfo.enterpriseFeatures = this.$refs.content4.$data.uploadFileList.join(
  262. ","
  263. );
  264. updateCompany(this.companyInfo)
  265. .then(res => {
  266. console.log(res.data);
  267. if (res.data.status == 0) {
  268. this.isEditing = false;
  269. this.$message.success(`保存成功!`);
  270. this.getData();
  271. } else {
  272. this.$message.error(`保存失败,请刷新重试!`);
  273. }
  274. })
  275. .catch(err => {
  276. this.$message.error(`保存失败,失败原因${err},请刷新重试!`);
  277. });
  278. },
  279. },
  280. //生命周期 - 创建完成(可以访问当前this实例)
  281. created() {
  282. this.canEdit = this.$route.query.canEdit;
  283. this.companyId = this.$route.query.companyId;
  284. this.getData();
  285. },
  286. //生命周期 - 挂载完成(可以访问DOM元素)
  287. mounted() {},
  288. };
  289. </script>
  290. <style lang="scss" scoped>
  291. //@import url(); 引入公共css类
  292. .nav_box {
  293. background: url("~@assets/image/company/bg_company.png") no-repeat;
  294. position: relative;
  295. overflow: visible;
  296. // position: sticky;
  297. // top: 0;
  298. // z-index: 2;
  299. .second_nv {
  300. @include size(100%, 250px);
  301. > div {
  302. @include size($wrapWidth, 100%);
  303. margin: 0 auto;
  304. @include flex(column, flex-start, flex-start, null);
  305. position: relative;
  306. }
  307. .position {
  308. @include flex(row, flex-start, center, null);
  309. img {
  310. // @include size(16px, 16px);
  311. margin-right: 6px;
  312. }
  313. padding-top: 10px;
  314. @include border-box;
  315. @include font(16px, #ffffff);
  316. .current {
  317. font-weight: 600;
  318. }
  319. }
  320. }
  321. }
  322. .detail_box {
  323. @include size($wrapWidth, 320px);
  324. padding: 30px 30px 10px;
  325. @include border-box;
  326. background-image: linear-gradient(0deg, #ffffff 0%, #cce7fa 100%);
  327. position: absolute;
  328. left: 50%;
  329. bottom: -50%;
  330. transform: translateX(-50%);
  331. @include flex(column, space-between, flex-start, nowrap);
  332. .tab_box {
  333. width: 100%;
  334. @include flex(row, flex-start, flex-start, null);
  335. border: solid 1px #bcd8e9;
  336. @include border-box;
  337. background: #ffffff;
  338. position: sticky;
  339. top: 0;
  340. z-index: 2;
  341. span {
  342. @include size(200px, 50px);
  343. @include font(16px, #637485);
  344. @include flex(row, center, center, null);
  345. border-right: solid 1px #bcd8e9;
  346. @include border-box;
  347. }
  348. .active {
  349. background-image: linear-gradient(0deg, #ffffff 0%, #cce7fa 100%);
  350. }
  351. }
  352. .top_box {
  353. @include flex(row, space-between, center, nowrap);
  354. .company_img_box {
  355. @include size(220px, 200px);
  356. position: relative;
  357. .company_img {
  358. background: pink;
  359. @include size(200px, 100%);
  360. }
  361. .tip_img {
  362. @include size(68px, 22px);
  363. position: absolute;
  364. top: 20px;
  365. left: 0;
  366. .claim_state {
  367. @include size(100%, 100%);
  368. @include flex(row, flex-start, center, null);
  369. @include font(14px, #fff);
  370. padding-left: 6px;
  371. @include border-box;
  372. }
  373. .claimed {
  374. background: url("~@assets/image/company/bg_claimed.png") no-repeat;
  375. }
  376. .not_claim {
  377. background: url("~@assets/image/company/bg_not_claim.png") no-repeat;
  378. }
  379. }
  380. }
  381. .right_box {
  382. height: 200px;
  383. flex: 1;
  384. @include flex(column, space-between, flex-start, nowrap);
  385. .top_row {
  386. width: 100%;
  387. @include flex(row, space-between, center, null);
  388. > span {
  389. @include font(24px, #334a5f);
  390. font-weight: 600;
  391. }
  392. > div {
  393. @include flex(row, flex-start, center, null);
  394. @include font(16px, #ffffff);
  395. > span {
  396. img {
  397. @include size(20px, 20px);
  398. margin-right: 8px;
  399. }
  400. @include size(90px, 30px);
  401. background-image: linear-gradient(135deg, #42a6fe 0%, #0070d2 100%);
  402. border-radius: 15px;
  403. margin-left: 10px;
  404. @include flex(row, center, center, null);
  405. @include border-box;
  406. }
  407. }
  408. }
  409. .middle_row {
  410. width: 100%;
  411. @include flex(row, space-between, center, null);
  412. .company_type {
  413. flex: 1;
  414. @include text-ellipsis;
  415. > span {
  416. display: inline-block;
  417. @include font(14px, #0086e7);
  418. padding: 2px 8px;
  419. border: solid 1px #0086e7;
  420. @include border-box;
  421. margin-right: 10px;
  422. }
  423. }
  424. .time {
  425. @include flex(row, center, center, null);
  426. img {
  427. // @include size(20px, 20px);
  428. margin-right: 8px;
  429. }
  430. @include font(14px, #637485);
  431. }
  432. }
  433. .company_info {
  434. @include size(100%, 100px);
  435. @include font(14px, #637485);
  436. background-color: #f4fafe;
  437. @include flex(row, space-between, center, wrap);
  438. padding: 20px;
  439. @include border-box;
  440. > div {
  441. width: 30%;
  442. span {
  443. color: #334a5f;
  444. font-weight: 600;
  445. }
  446. }
  447. > div:nth-child(3n + 2) {
  448. width: 40%;
  449. }
  450. }
  451. }
  452. }
  453. }
  454. .content_box {
  455. width: $wrapWidth;
  456. margin: 0 auto;
  457. padding: 200px 0 30px 0;
  458. @include border-box;
  459. }
  460. </style>