123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328 |
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <meta name="keywords"
- content="工时管理,工时统计,工时填报,项目成本统计,生产工时管理系统,工时成本管理,工时管理软件,研发工时管理系统,企业工时管理系统,项目工时统计,项目工时统计软件,项目工时统计系统,工时统计系统,工时统计表" />
- <meta name="description" content="工时管家提供专业的工时填报和统计报表。支持PC和手机端。可按项目,部门,岗位等多维度统计成本。" />
- <title>工时管家-专注工时管理,手机移动填报,核算项目投入人力成本,企业IPO利器!</title>
- <link rel="shortcut icon" type="image/x-icon" href="./favicon.ico" />
- <link href="https://fonts.googleapis.com/css?family=Open+Sans:400,400i,700&display=swap&subset=latin-ext"
- rel="stylesheet">
- <link href="css/bootstrap.css" rel="stylesheet">
- <link href="css/font-awesome.css" rel="stylesheet">
- <link href="css/swiper.css" rel="stylesheet">
- <link href="css/magnific-popup.css" rel="stylesheet">
- <link href="css/styles.css" rel="stylesheet">
- <link rel="stylesheet" href="css/reset.css">
- <link rel="stylesheet" href="css/tongyong.css">
- <link rel="stylesheet" href="css/knowledgeField.css">
- <!-- 底部重写 -->
- <link rel="stylesheet" href="css/bottom.css">
- <link rel="stylesheet" href="./css/element-uiCss.css">
- <script src="./js/vue.min.js"></script>
- <script src="./js/element-ui.js"></script>
- </head>
- <body data-spy="scroll" data-target=".fixed-top">
- <div class="spinner-wrapper">
- <div class="spinner">
- <div class="bounce1"></div>
- <div class="bounce2"></div>
- <div class="bounce3"></div>
- </div>
- </div>
- <!-- 头部 -->
- <iframe id="headerIframe" src="./moduleView/header.html" class="iframeClass" onLoad="reinitIframe();"></iframe>
- <!-- 主体内容 -->
- <div class="knowledgeFieldCon" id="app">
- <div v-loading="detailsSwitchingLoading" class="wh100 flex">
- <!-- 知识园地 -->
- <div class="knowledgeField" v-if="!isItForDetails">
- <div class="knowledgeField-header">
- <div class="knowledgeField-header-text">知识园地</div>
- <div class="flex">
- <el-input placeholder="请输入内容" v-model.trim="info" size="small" class="elInput"
- @keyup.enter="getKnowledgeFieldTable()">
- </el-input>
- <el-button type="primary" size="mini" @click="getKnowledgeFieldTable()">确定</el-button>
- </div>
- </div>
- <div class="flex1 knowledgeField-content" v-loading="knowledgeFieldTableLoading">
- <div v-for="(item,index) in knowledgeFieldTableList" :key="index">
- <div class="knowledgeField-content-item">
- <div class="image"><el-image :src="item.coverImg" class="wh100"></el-image></div>
- <div class="textContent">
- <div>{{ item.title }}</div>
- <p>{{ item.profile }}</p>
- <span @click="learnMore(item, true)">了解详情></span>
- </div>
- </div>
- <el-divider v-if="index < knowledgeFieldTableList.length - 1"></el-divider>
- </div>
- </div>
- <div class="knowledgeField-bottom flex-center">
- <el-pagination background layout="total, prev, pager, next, sizes" :page-sizes="[4, 8, 12, 20]"
- :page-size="pageSize" :current-page.sync="pageIndex" @size-change="handleSizeChange"
- @current-change="handleCurrentChange" :total="total">
- </el-pagination>
- </div>
- </div>
- <!-- 知识详情 -->
- <div v-if="isItForDetails" class="knowledgeDetails">
- <div class="returnIcon" @click="back()">
- <i class="el-icon-arrow-left"></i>
- </div>
- <div class="knowledgeDetails-left">
- <div class="knowledgeDetails-left-title">{{ articleDetails.title }}</div>
- <el-divider></el-divider>
- <div class="knowledgeDetails-left-con">
- <div class="flex distribution">
- <ul class="flex">
- <li class="grey">标签:</li>
- <li class="blue" v-for="(item, index) in articleDetails.categoryNamesList" :key="index">{{ item }}</li>
- </ul>
- </div>
- <div class="flex-center distribution timeContent">
- <p>发布时间</p>
- <span>{{ articleDetails.createTime }}</span>
- </div>
- <div class="flex-center distribution readUse" style="justify-content: flex-end;">
- <div class="text">推荐使用:</div>
- <div><img src="./image/detailWork.png" alt=""></div>
- </div>
- </div>
- <div class="hypertextContent" v-html="articleDetails.content">
- </div>
- <div class="knowledgeDetails-left-bottom flex-center"></div>
- </div>
- <div class="knowledgeDetails-right">
- <div class="latestArticles">
- <div class="knowledgeDetails-right-title">
- <div>最新文章</div>
- <span @click="learnMore({}, false, true)">查看更多></span>
- </div>
- <div class="line"></div>
- <div class="latestList">
- <div class="latestList-item" v-for="(item, index) in latestArticles" :key="index"
- @click="detailsJump(item)">
- <div class="latestList-item-image">
- <el-image :src="item.coverImg" class="wh100"></el-image>
- </div>
- <div class="latestList-item-text">
- <div class="latestList-item-text-title">{{ item.title }}</div>
- <div class="data">{{ item.createTime }}</div>
- </div>
- </div>
- </div>
- </div>
- <div class="relatedRecommendations">
- <div class="knowledgeDetails-right-title">
- <div>相关推荐</div>
- <span @click="learnMore({}, false, true)">查看更多></span>
- </div>
- <div class="line"></div>
- <div class="latestList">
- <div class="latestList-item" v-for="(item, index) in relatedRecommendations" :key="index"
- @click="detailsJump(item)">
- <div class="latestList-item-image">
- <el-image :src="item.coverImg" class="wh100"></el-image>
- </div>
- <div class="latestList-item-text">
- <div class="latestList-item-text-title">{{ item.title }}</div>
- <div class="data">{{ item.createTime }}</div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <!-- Scripts -->
- <script src="js/js/jquery.min.js"></script> <!-- jQuery for Bootstrap's JavaScript plugins -->
- <script src="js/js/popper.min.js"></script> <!-- Popper tooltip library for Bootstrap -->
- <script src="js/js/bootstrap.min.js"></script> <!-- Bootstrap framework -->
- <script src="js/js/jquery.easing.min.js"></script> <!-- jQuery Easing for smooth scrolling between anchors -->
- <script src="js/js/swiper.min.js"></script> <!-- Swiper for image and text sliders -->
- <script src="js/js/jquery.magnific-popup.js"></script> <!-- Magnific Popup for lightboxes -->
- <script src="js/js/validator.min.js"></script> <!-- Validator.js - Bootstrap plugin that validates forms -->
- <script src="js/js/scripts.js"></script>
- <script>
- new Vue({
- el: "#app",
- data: {
- info: '',
- pageIndex: 1,
- pageSize: 4,
- total: 0,
- // requestPrefix: 'http://192.168.2.17:8080',
- requestPrefix: 'http://47.101.180.183:9049',
- // requestPrefix: '',
- knowledgeFieldTableList: [],
- latestArticles: [],
- relatedRecommendations: [],
- detailRow: {},
- articleDetails: {},
- isItForDetails: false,
- knowledgeFieldTableLoading: false,
- detailsSwitchingLoading: false,
- },
- methods: {
- getArticleDetails() {
- const url = `${this.requestPrefix}/article/getArticleById`
- const params = { id: this.detailRow.id }
- this.httpRequest(this.addQueryParams(url, params)).then(res => {
- const row = {
- ...res.data,
- categoryNamesList: res.data.categoryNames ? res.data.categoryNames.split(',') : []
- };
- this.articleDetails = row
- })
- },
- getLatestArticles() {
- const url = `${this.requestPrefix}/article/latestList`;
- const params = { id: this.detailRow.id }
- this.httpRequest(this.addQueryParams(url, params)).then(res => {
- this.latestArticles = res.data.map(item => {
- if(item.coverImg) {
- item.coverImg = `data:image/jpeg;base64, ${item.coverImg}`
- }
- return { ...item }
- })
- })
- },
- getRelatedRecommendations() {
- const url = `${this.requestPrefix}/article/relatedList`
- const params = { id: this.detailRow.id }
- this.httpRequest(this.addQueryParams(url, params)).then(res => {
- this.relatedRecommendations = res.data.map(item => {
- if(item.coverImg) {
- item.coverImg = `data:image/jpeg;base64, ${item.coverImg}`
- }
- return { ...item }
- })
- })
- },
- getKnowledgeFieldTable() {
- const url = `${this.requestPrefix}/article/pageList`
- const params = { pageIndex: this.pageIndex, pageSize: this.pageSize, info: this.info }
- this.knowledgeFieldTableLoading = true
- this.httpRequest(this.addQueryParams(url, params)).then(res => {
- const { total = 0, data = [] } = res
- data.forEach(item => {
- if(item.coverImg) {
- item.coverImg = `data:image/jpeg;base64, ${item.coverImg}`
- }
- })
- this.total = total
- this.knowledgeFieldTableList = [...data]
- }).finally(() => {
- this.knowledgeFieldTableLoading = false
- }).catch(err => {
- console.log(err, '<==== 请求失败')
- })
- },
- back() {
- this.detailRow = {}
- this.detailsSwitchingLoading = true
- setTimeout(() => {
- this.isItForDetails = false
- }, 500)
- setTimeout(() => {
- this.detailsSwitchingLoading = false
- }, 1000)
- },
- detailsJump(item) {
- this.detailRow = item
- this.detailsSwitchingLoading = true
- this.getArticleDetails()
- this.getLatestArticles()
- this.getRelatedRecommendations()
- setTimeout(() => {
- this.detailsSwitchingLoading = false
- }, 1000)
- },
- learnMore(item, flag = false, reset = false) {
- this.detailRow = item
- this.detailsSwitchingLoading = true
- if (reset) {
- this.pageIndex = 1
- this.pageSize = 4
- this.info = ''
- this.getKnowledgeFieldTable()
- }
- if (flag) {
- this.getArticleDetails()
- this.getLatestArticles()
- this.getRelatedRecommendations()
- }
- setTimeout(() => {
- this.isItForDetails = flag
- }, 500)
- setTimeout(() => {
- this.detailsSwitchingLoading = false
- }, 1000)
- },
- handleSizeChange(val) {
- this.pageIndex = 1
- this.pageSize = val
- this.getKnowledgeFieldTable()
- },
- handleCurrentChange(val) {
- this.pageIndex = val
- this.getKnowledgeFieldTable()
- },
- // 封装请求接口
- httpRequest(url, options = {}, method = 'GET') {
- // 默认配置
- const defaultOptions = {
- method,
- headers: {
- 'Content-Type': 'application/json',
- },
- body: null,
- };
- const requestOptions = { ...defaultOptions, ...options };
- if (requestOptions.body && typeof requestOptions.body !== 'string') {
- requestOptions.body = JSON.stringify(requestOptions.body);
- }
- return fetch(url, requestOptions)
- .then(response => {
- if (!response.ok) {
- throw new Error(`HTTP错误: ${response.status}`);
- }
- return response.json();
- })
- .catch(error => {
- console.error('请求失败:', error);
- throw error;
- });
- },
- addQueryParams(url, params) {
- const urlWithParams = new URL(url);
- Object.keys(params).forEach(key => {
- urlWithParams.searchParams.append(key, params[key]);
- });
- return urlWithParams.toString();
- }
- },
- mounted: function () {
- this.getKnowledgeFieldTable()
- }
- })
- </script>
- <script src="js/iframe.js"></script>
- </body>
- </html>
|