Compare commits

5 Commits

Author SHA1 Message Date
liuyuan
5da8058834 tijiao 2025-09-03 15:06:22 +08:00
liuyuan
ccffb7be6b 章节管理新增语言切换和上传并拆分文章附件的功能 2025-01-26 09:38:37 +08:00
liuyuan
e50b0ef678 Merge branch 'ly-branch' 2025-01-02 15:47:41 +08:00
liuyuan
77aa242440 Merge branch 'ly-branch' 2025-01-02 14:11:40 +08:00
liuyuan
d6170f6f48 master 2025-01-02 13:47:37 +08:00
14 changed files with 5100 additions and 5873 deletions

19
.babelrc Normal file
View File

@@ -0,0 +1,19 @@
{
"presets": [
["env", {
"modules": false
}],
"stage-2"
],
"plugins": ["transform-runtime", ["component", [
{
"libraryName": "element-ui"
}
]]],
"env": {
"test": {
"presets": ["env", "stage-2"],
"plugins": ["transform-es2015-modules-commonjs", "dynamic-import-node"]
}
}
}

9
.editorconfig Normal file
View File

@@ -0,0 +1,9 @@
root = true
[*]
charset = utf-8
indent_style = space
indent_size = 2
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true

6
.eslintignore Normal file
View File

@@ -0,0 +1,6 @@
/build/
/config/
/dist/
/*.js
/test/unit/coverage/
/src/icons/iconfont.js

25
.eslintrc.js Normal file
View File

@@ -0,0 +1,25 @@
// https://eslint.org/docs/user-guide/configuring
module.exports = {
root: true,
parser: 'babel-eslint',
parserOptions: {
sourceType: 'module'
},
env: {
browser: true,
},
// https://github.com/standard/standard/blob/master/docs/RULES-en.md
extends: 'standard',
// required to lint *.vue files
plugins: [
'html'
],
// add your custom rules here
rules: {
// allow async-await
'generator-star-spacing': 'off',
// allow debugger during development
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off'
}
}

22
.gitignore vendored Normal file
View File

@@ -0,0 +1,22 @@
.DS_Store
node_modules/
dist/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
/test/unit/coverage/
/test/e2e/reports/
selenium-debug.log
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
# common
common/common.vue
/src/views/common/common.vue

9
.postcssrc.js Normal file
View File

@@ -0,0 +1,9 @@
// https://github.com/michael-ciniawsky/postcss-load-config
module.exports = {
"plugins": {
// to edit target browsers: use "browserslist" field in package.json
"postcss-import": {},
"autoprefixer": {}
}
}

BIN
dist.zip

Binary file not shown.

10669
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -24,12 +24,12 @@
"gulp-replace": "1.0.0",
"gulp-shell": "0.8.0",
"lodash": "4.17.5",
"node-sass": "^4.0.0",
"node-sass": "^4.14.1",
"npm": "^6.9.0",
"quill-image-resize-module": "^3.0.0",
"sass-loader": "6.0.6",
"svg-sprite-loader": "3.7.3",
"vue": "^2.6.14",
"vue": "^2.7.16",
"vue-audio": "^0.0.12",
"vue-cookie": "1.1.4",
"vue-quill-editor": "^3.0.6",
@@ -50,11 +50,14 @@
"babel-preset-env": "1.3.2",
"babel-preset-stage-2": "6.22.0",
"babel-register": "6.22.0",
"braces": "^3.0.3",
"cache-base": "^4.0.2",
"chalk": "2.3.0",
"chromedriver": "2.27.2",
"chromedriver": "^2.27.2",
"copy-webpack-plugin": "4.0.1",
"cross-spawn": "5.0.1",
"css-loader": "0.28.0",
"define-property": "^2.0.2",
"eslint": "3.19.0",
"eslint-config-standard": "10.2.1",
"eslint-friendly-formatter": "3.0.0",
@@ -68,19 +71,28 @@
"extract-text-webpack-plugin": "3.0.0",
"file-loader": "1.1.4",
"friendly-errors-webpack-plugin": "1.6.1",
"gulp": "^5.0.1",
"gulp-cli": "^3.1.0",
"gulp-load-plugins": "^2.0.8",
"html-webpack-plugin": "2.30.1",
"is-absolute": "^1.0.0",
"isobject": "^4.0.0",
"jest": "21.2.0",
"jest-serializer-vue": "0.3.0",
"less": "^4.1.3",
"less-loader": "^5.0.0",
"mixin-deep": "^2.0.1",
"nightwatch": "0.9.12",
"node-notifier": "5.1.2",
"optimize-css-assets-webpack-plugin": "3.2.0",
"ora": "1.2.0",
"pascalcase": "^2.0.0",
"portfinder": "1.0.13",
"postcss-import": "11.0.0",
"postcss-loader": "2.0.8",
"ret": "^0.5.0",
"rimraf": "2.6.0",
"safe-regex": "^2.1.1",
"selenium-server": "3.0.1",
"semver": "5.3.0",
"shelljs": "0.7.6",
@@ -89,7 +101,7 @@
"vue-jest": "1.0.2",
"vue-loader": "13.3.0",
"vue-style-loader": "3.0.1",
"vue-template-compiler": "2.6.14",
"vue-template-compiler": "^2.7.16",
"webpack": "3.6.0",
"webpack-bundle-analyzer": "2.9.0",
"webpack-dev-server": "2.9.1",

View File

@@ -128,8 +128,14 @@
</el-radio-group>
</el-form-item>
<el-form-item label="付费价格" prop="abroadPrice">
<el-input v-model="dataForm.abroadPrice" placeholder="付费价格(美元)"></el-input>
<el-form-item label="付费价格" prop="abroadPriceId">
<el-select v-model="dataForm.abroadPriceId" filterable allow-create default-first-option
placeholder="请选择付费价格NZD">
<el-option v-for="item in priceList" :key="item.id + ''" :label="item.dictValue+' NZD'" :value="item.id+''">
</el-option>
</el-select>
<!-- <el-input v-model="dataForm.abroadPrice" placeholder="付费价格(美元)"></el-input> -->
</el-form-item>
<el-form-item label="付费类型" prop="isVip">
<el-radio-group v-model="dataForm.isVip">
@@ -158,13 +164,13 @@
<!-- <el-form-item label="出版商名称" prop="publisherId">
<el-input v-model="dataForm.publisherId" placeholder="出版商名称"></el-input>
</el-form-item> -->
<el-form-item label="文件上传" prop="novel">
<!-- <el-form-item label="文件上传" prop="novel">
<el-upload class="upload-demo" :action="baseUrl + '/oss/fileoss'" :on-preview="handlePreview"
:on-remove="handleRemoveNovel" :before-remove="beforeRemove" :on-success="handleNovelSuccess" multiple
:limit="3" :on-exceed="handleExceed" :file-list="fileListNovel">
<el-button size="small" type="primary">点击上传</el-button>
</el-upload>
</el-form-item>
</el-form-item> -->
<el-form-item label="插图" prop="images">
<el-upload :action="baseUrl + '/oss/fileoss'" list-type="picture-card" :on-preview="handlePictureCardPreview"
:file-list="fileList" :on-success="handlePicSuccess" :on-remove="handleRemove">
@@ -250,6 +256,7 @@
restaurants: [],
author: '',
publisherList: [],
priceList: [],
fileList: [],
fileListNovel: [],
dialogImageUrl: '',
@@ -285,7 +292,8 @@
clockIn: 2,
teachIn: 0,
relationId:0,
abroadPrice: ''
abroadPrice: '',
abroadPriceId: '',
},
splitsTypeList: [],
dataRule: {
@@ -394,6 +402,7 @@
this.dataForm.relationId = data.book.relationId
this.dataForm.abroadPrice = data.book.abroadPrice //价格
var checklist = data.book.type
this.dataForm.abroadPriceId=data.book.abroadPriceId
var medicaldeschecklist = data.book.medicaldesBookType
var authorList = data.book.authorId
var publisherlish = data.book.publisherId
@@ -409,8 +418,6 @@
for (let i = 0; i < this.dataForm.medicaldesBookType.length; i++) {
this.dataForm.medicaldesBookType[i] = parseInt(this.dataForm.medicaldesBookType[i]);
}
console.log(this.dataForm.type)
console.log('2222222222', this.dataForm.medicaldesBookType)
if (data.book.images != "") {
var img = {
name: '',
@@ -429,6 +436,9 @@
attr.push(novel)
this.fileListNovel = attr
}
}
})
}
@@ -462,9 +472,13 @@
this.$refs['dataForm'].validate((valid) => {
if (valid) {
//价格逻辑
let abroadPrice = this.formatNumber(Number(this.dataForm.abroadPrice));
if(!abroadPrice&&abroadPrice!=0){
return
// let abroadPrice = this.formatNumber(Number(this.dataForm.abroadPrice));
// if(!abroadPrice&&abroadPrice!=0){
// return
// }
if(!this.dataForm.abroadPriceId){
this.$message.error('请选择付费价格')
return false
}
this.$http({
url: this.$http.adornUrl(`/book/book/${!this.dataForm.id ? 'save' : 'update'}`),
@@ -500,7 +514,8 @@
'relationId': this.dataForm.relationId,
'clockIn': this.dataForm.clockIn,
'teachIn': this.dataForm.teachIn,
'abroadPrice': abroadPrice //价格
abroadPriceId:this.dataForm.abroadPriceId,
})
}).then(({
data
@@ -626,6 +641,19 @@
}) => {
this.publisherList = data.list
})
this.$http({
url: this.$http.adornUrl('/book/sysdictdata/getData'),
method: 'post',
data: this.$http.adornData({
'dictLabel': 'googleProduct',
})
})
.then(({
data
}) => {
this.priceList = data.sysDictDatas
})
},
// handleSelect(item) {

View File

@@ -34,7 +34,7 @@
<el-table-column prop="authorName" header-align="center" align="center" label="作者姓名" width="120">
</el-table-column>
<el-table-column prop="abroadPrice" header-align="center" align="center" label="付费价格" width="120">
<template slot-scope="scope">${{ scope.row.abroadPrice }}</template>
<template slot-scope="scope">${{ scope.row.priceData.dictValue }} NZD</template>
</el-table-column>
<el-table-column header-align="center" align="center" label="插图" width="100">
<template slot-scope="scope">
@@ -67,7 +67,7 @@
</el-table-column> -->
<!-- <el-table-column prop="publisherName" header-align="center" align="center" label="出版商名称">
</el-table-column> -->
<el-table-column prop="chapterStatus" header-align="center" align="center" label="章节拆分" width="160">
<!-- <el-table-column prop="chapterStatus" header-align="center" align="center" label="章节拆分" width="160">
<template slot-scope="scope">
<p style="margin: 0;"> <span v-if="scope.row.chapterStatus == '成功'" style="color:blue">{{scope.row.chapterStatus}}</span>
<span v-if="scope.row.chapterStatus == '失败'" style="color: red">{{scope.row.chapterStatus}}</span>
@@ -79,7 +79,7 @@
</template>
</el-table-column>
</el-table-column> -->
<!-- <el-table-column prop="contentStatus" header-align="center" align="center" label="单句拆分">
<template slot-scope="scope">
<span v-if="scope.row.contentStatus == '成功'" style="color:blue">{{scope.row.contentStatus}}</span>

View File

@@ -1,12 +1,26 @@
<template>
<div class="mod-config">
<div class="mod-config" v-loading="fileLoading">
<el-form :inline="true" :model="dataForm" @keyup.enter.native="getDataList()">
<el-form :inline="true" :model="dataForm">
<el-form-item v-if="languageList.length>0">
<el-select v-model="language" placeholder="选择语言" @change="changeLanguage">
<el-option :label="item" :value="item" v-for="(item,index) in languageList" :key="index"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-upload :limit="1" class="el-uploadvideo"
:action= "baseUrl + '/oss/fileoss'"
:file-list="fileList" accept=".docx" :on-remove="handleRemove" :http-request="handleRequest"
:show-file-list="true">
<el-button slot="trigger" size="small" type="primary">上传并拆分</el-button>
</el-upload>
</el-form-item>
<br>
<el-form-item>
<el-input v-model="dataForm.key" placeholder="参数名" clearable></el-input>
</el-form-item>
<el-form-item>
<el-button @click="getDataList()">查询</el-button>
<el-button @click="getDataList(language)">查询</el-button>
<el-button v-if="isAuth('book:bookchapter:save')" type="primary" @click="addOrUpdateHandle()">新增章节</el-button>
<!-- <el-button v-if="isAuth('book:bookchapter:delete')" type="danger" @click="deleteHandle()" :disabled="dataListSelections.length <= 0">批量删除</el-button> -->
<!-- <router-link :to="{path: 'book-book' , query:{ upPageIndex } }">
@@ -115,15 +129,19 @@
layout="total, sizes, prev, pager, next, jumper">
</el-pagination>
<!-- 弹窗, 新增 / 修改 -->
<add-or-update v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="getDataList"></add-or-update>
<add-or-update v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="getDataList(language)"></add-or-update>
</div>
</template>
<script>
import AddOrUpdate from './bookchapter-add-or-update'
import global from '../../common/common.vue' //引入共用组间
import axios from "axios";
import { Loading } from 'element-ui';
export default {
data () {
return {
baseUrl: global.baseUrl,
dataForm: {
key: ''
},
@@ -137,6 +155,11 @@
dataListSelections: [],
addOrUpdateVisible: false,
bookInfo:{},
//显示多语言下拉
languageList: [],
language: '',
fileList: [],
fileLoading: false
}
},
components: {
@@ -149,13 +172,13 @@
console.log(this.pageIndex)
}
this.upPageIndex = this.$route.query.pageIndex;
console.log(this.bookid)
this.getDataList()
this.getInfo()
this.getInfo();
this.fileList = [];
this.getEbookLanguageList();
},
methods: {
// 获取数据列表
getDataList () {
getDataList (language) {
this.dataListLoading = true
this.$http({
url: this.$http.adornUrl('/book/bookchapter/list'),
@@ -164,7 +187,8 @@
'page': this.pageIndex,
'limit': this.pageSize,
'key': this.dataForm.key,
'bookid' : this.bookid
'bookid' : this.bookid,
'language': language
})
}).then(({data}) => {
if (data && data.code === 0) {
@@ -179,27 +203,23 @@
},
// 获取数据列表
getInfo () {
this.$http({
url: this.$http.adornUrl(`/book/book/info/${this.$route.query.id}`),
method: 'post',
method: 'post'
}).then(({data}) => {
console.log('data at line 182:', data)
this.bookInfo=data.book
})
},
// 每页数
sizeChangeHandle (val) {
this.pageSize = val
this.pageIndex = 1
this.getDataList()
this.getDataList(this.language)
},
// 当前页
currentChangeHandle (val) {
this.pageIndex = val
this.getDataList()
this.getDataList(this.language)
},
// 多选
selectionChangeHandle (val) {
@@ -235,7 +255,7 @@
type: 'success',
duration: 1500,
onClose: () => {
this.getDataList()
this.getDataList(this.language)
}
})
} else {
@@ -243,7 +263,74 @@
}
})
})
}
},
// 获取数据列表
getEbookLanguageList () {
var parms = {bookId: this.bookid}
this.$http({
url: this.$http.adornUrl('/book/book/getEbookLanguageList'),
method: 'post',
data: parms
}).then(({data}) => {
if (data && data.code === 0) {
this.languageList = data.list;
//默认请求数据
this.language = this.languageList[0];
this.getDataList(this.language);
}
})
},
//下拉筛选数据
changeLanguage(e){
this.language = e;
this.getDataList(e);
},
//上传文件
handleRequest(option) {
let formdata = new FormData();
formdata.append("file", option.file);
formdata.append("bookId", this.bookid);
let name = option.file.name; //文件名称判断显示下拉的值
this.fileLoading = true;
this.$http({
url: this.$http.adornUrl('/book/book/uploadEbookAndSplit'),
method: 'post',
data: formdata
}).then(({data}) => {
this.fileLoading = false;
if (data && data.code == 0) {
this.$message({
message: '上传成功',
type: 'success',
duration: 1500,
onClose: () => {
this.getDataList(this.language)
}
})
//根据文件名称判断显示
if(name.includes('English')||name.includes('english')){
this.language = 'English';
}else if(name.includes('Spanish')||name.includes('spanish')){
this.language = 'Spanish';
}
this.getDataList(this.language);
} else {
this.$message.error("上传失败");
}
})
},
handleRemove(file) {
this.fileList = []
},
}
}
</script>
<style lang="less" scoped>
/deep/ .el-uploadvideo{
display: flex;
}
/deep/ .el-uploadvideo .el-upload-list--text{
margin-left: 20px;
}
</style>

View File

@@ -5,8 +5,8 @@
window.SITE_CONFIG = {};
// api接口请求地址
// window.SITE_CONFIG['baseUrl'] = 'http://59.110.212.44:9100/pb';
window.SITE_CONFIG['baseUrl'] = 'https://api.nuttyreading.com';
//window.SITE_CONFIG['baseUrl'] = 'http://192.168.110.100:9300/pb'; //zcc
window.SITE_CONFIG['baseUrl'] = 'https://global.nuttyreading.com';
// cdn地址 = 域名 + 版本号
window.SITE_CONFIG['domain'] = './'; // 域名

View File

@@ -5,13 +5,10 @@
window.SITE_CONFIG = {};
// api接口请求地址
// window.SITE_CONFIG['baseUrl'] = 'http://192.168.110.100:9200/pb';//张川川
// window.SITE_CONFIG['baseUrl'] = 'http://59.110.212.44:9200/pb';
// window.SITE_CONFIG['baseUrl'] = 'https://testapi.nuttyreading.com'; // 线上测试环境11
window.SITE_CONFIG['baseUrl'] = 'https://api.nuttyreading.com'; // 线上正式环境
// window.SITE_CONFIG['baseUrl'] = 'http://192.168.110.110:9200/pb';//磊哥
// window.SITE_CONFIG['baseUrl'] = 'http://59.110.212.44:9200/pb';
// window.SITE_CONFIG['baseUrl'] = 'http://192.168.110.100:9200/pb';
//window.SITE_CONFIG['baseUrl'] = 'https://testapi.nuttyreading.com'; // 线上测试环境11
window.SITE_CONFIG['baseUrl'] = 'https://global.nuttyreading.com'; //线上
//window.SITE_CONFIG['baseUrl'] = 'https://api.nuttyreading.com'; //线上正式环境
//window.SITE_CONFIG['baseUrl'] = 'http://192.168.110.100:9300/pb'; //zcc
// cdn地址 = 域名 + 版本号
window.SITE_CONFIG['domain'] = './'; // 域名