From 08e09565bdc15c43a49214f3c068752b2ab82724 Mon Sep 17 00:00:00 2001 From: Logaxn <logaxn@foxmail.com> Date: Mon, 11 Mar 2019 23:37:17 +0800 Subject: [PATCH] Signed-off-by: Logaxn <logaxn@foxmail.com> --- .gitignore | 2 +- .idea/codeStyles/Project.xml | 24 + .idea/codeStyles/codeStyleConfig.xml | 5 + .idea/encodings.xml | 4 + .idea/inspectionProfiles/Project_Default.xml | 15 + .idea/jsLibraryMappings.xml | 6 + .idea/misc.xml | 9 + .idea/modules.xml | 8 + .idea/zealouscrm-vue.iml | 8 + build/webpack.base.conf.js | 3 +- src/lang/index.js | 2 + src/views/gift/list.vue | 470 ++++++++++--------- src/views/gift/local.js | 11 + 13 files changed, 336 insertions(+), 231 deletions(-) create mode 100644 .idea/codeStyles/Project.xml create mode 100644 .idea/codeStyles/codeStyleConfig.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/jsLibraryMappings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/zealouscrm-vue.iml create mode 100644 src/views/gift/local.js diff --git a/.gitignore b/.gitignore index ba56a3e1..25f3edf9 100644 --- a/.gitignore +++ b/.gitignore @@ -12,7 +12,7 @@ test/e2e/reports selenium-debug.log # Editor directories and files -.idea +/.idea/workspace.xml .vscode *.suo *.ntvs* diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 00000000..055a1869 --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,24 @@ +<component name="ProjectCodeStyleConfiguration"> + <code_scheme name="Project" version="173"> + <option name="RIGHT_MARGIN" value="250" /> + <option name="WRAP_WHEN_TYPING_REACHES_RIGHT_MARGIN" value="true" /> + <codeStyleSettings language="HTML"> + <indentOptions> + <option name="INDENT_SIZE" value="2" /> + <option name="CONTINUATION_INDENT_SIZE" value="4" /> + <option name="TAB_SIZE" value="2" /> + </indentOptions> + </codeStyleSettings> + <codeStyleSettings language="JavaScript"> + <indentOptions> + <option name="INDENT_SIZE" value="2" /> + <option name="CONTINUATION_INDENT_SIZE" value="2" /> + <option name="TAB_SIZE" value="2" /> + </indentOptions> + </codeStyleSettings> + <codeStyleSettings language="PHP"> + <option name="CLASS_BRACE_STYLE" value="1" /> + <option name="METHOD_BRACE_STYLE" value="1" /> + </codeStyleSettings> + </code_scheme> +</component> \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 00000000..79ee123c --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ +<component name="ProjectCodeStyleConfiguration"> + <state> + <option name="USE_PER_PROJECT_SETTINGS" value="true" /> + </state> +</component> \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 00000000..15a15b21 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="Encoding" addBOMForNewFiles="with NO BOM" /> +</project> \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 00000000..c4e998ee --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,15 @@ +<component name="InspectionProjectProfileManager"> + <profile version="1.0"> + <option name="myName" value="Project Default" /> + <inspection_tool class="HtmlUnknownAttribute" enabled="true" level="WARNING" enabled_by_default="true"> + <option name="myValues"> + <value> + <list size="1"> + <item index="0" class="java.lang.String" itemvalue="slot-scope" /> + </list> + </value> + </option> + <option name="myCustomValuesEnabled" value="true" /> + </inspection_tool> + </profile> +</component> \ No newline at end of file diff --git a/.idea/jsLibraryMappings.xml b/.idea/jsLibraryMappings.xml new file mode 100644 index 00000000..d23208fb --- /dev/null +++ b/.idea/jsLibraryMappings.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="JavaScriptLibraryMappings"> + <includedPredefinedLibrary name="Node.js Core" /> + </component> +</project> \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 00000000..92003410 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="JavaScriptSettings"> + <option name="languageLevel" value="ES6" /> + </component> + <component name="WebPackConfiguration"> + <option name="path" value="$PROJECT_DIR$/build/webpack.dev.conf.js" /> + </component> +</project> \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 00000000..8ad00b21 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="ProjectModuleManager"> + <modules> + <module fileurl="file://$PROJECT_DIR$/.idea/zealouscrm-vue.iml" filepath="$PROJECT_DIR$/.idea/zealouscrm-vue.iml" /> + </modules> + </component> +</project> \ No newline at end of file diff --git a/.idea/zealouscrm-vue.iml b/.idea/zealouscrm-vue.iml new file mode 100644 index 00000000..c956989b --- /dev/null +++ b/.idea/zealouscrm-vue.iml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<module type="WEB_MODULE" version="4"> + <component name="NewModuleRootManager"> + <content url="file://$MODULE_DIR$" /> + <orderEntry type="inheritedJdk" /> + <orderEntry type="sourceFolder" forTests="false" /> + </component> +</module> \ No newline at end of file diff --git a/build/webpack.base.conf.js b/build/webpack.base.conf.js index 3b946b4b..b90dca78 100644 --- a/build/webpack.base.conf.js +++ b/build/webpack.base.conf.js @@ -41,7 +41,8 @@ module.exports = { }, module: { rules: [ - ...(config.dev.useEslint ? [createLintingRule()] : []), + // 暂时禁用 Eslint todo + // ...(config.dev.useEslint ? [createLintingRule()] : []), { test: /\.vue$/, loader: 'vue-loader', diff --git a/src/lang/index.js b/src/lang/index.js index 7c9c8af6..cd8d49e0 100644 --- a/src/lang/index.js +++ b/src/lang/index.js @@ -26,6 +26,8 @@ const messages = { } const i18n = new VueI18n({ + // 暂时隐藏 i18n 警告 todo + silentTranslationWarn: true, // set locale // options: en | zh | es locale: Cookies.get('language') || 'en', diff --git a/src/views/gift/list.vue b/src/views/gift/list.vue index 25cb9428..1e38b09a 100644 --- a/src/views/gift/list.vue +++ b/src/views/gift/list.vue @@ -18,14 +18,14 @@ </div> <el-table - v-loading="listLoading" - :key="tableKey" - :data="list" - border - fit - highlight-current-row - style="width: 100%;" - @sort-change="sortChange"> + v-loading="listLoading" + :key="tableKey" + :data="list" + border + fit + highlight-current-row + style="width: 100%;" + @sort-change="sortChange"> <el-table-column :label="$t('table.id')" prop="id" sortable="custom" align="center" width="65"> <template slot-scope="scope"> <span>{{ scope.row.id }}</span> @@ -42,7 +42,7 @@ <el-tag>{{ scope.row.type | typeFilter }}</el-tag> </template> </el-table-column> - <el-table-column :label="$t('table.author')" width="110px" align="center"> + <el-table-column :label="$t('giftList.giftName')" width="110px" align="center"> <template slot-scope="scope"> <span>{{ scope.row.author }}</span> </template> @@ -81,7 +81,7 @@ </el-table-column> </el-table> - <pagination v-show="total>0" :total="total" :page.sync="listQuery.page" :limit.sync="listQuery.limit" @pagination="getList" /> + <pagination v-show="total>0" :total="total" :page.sync="listQuery.page" :limit.sync="listQuery.limit" @pagination="getList"/> <el-dialog :title="textMap[dialogStatus]" :visible.sync="dialogFormVisible"> <el-form ref="dataForm" :rules="rules" :model="temp" label-position="left" label-width="70px" style="width: 400px; margin-left:50px;"> @@ -128,235 +128,247 @@ </template> <script> -import { fetchList, fetchPv, createArticle, updateArticle } from '@/api/article' -import waves from '@/directive/waves' // Waves directive -import { parseTime } from '@/utils' -import Pagination from '@/components/Pagination' // Secondary package based on el-pagination + import {fetchList, fetchPv, createArticle, updateArticle} from '@/api/article' + import waves from '@/directive/waves' // Waves directive + import {parseTime} from '@/utils' + import Pagination from '@/components/Pagination' // Secondary package based on el-pagination -const calendarTypeOptions = [ - { key: 'CN', display_name: 'China' }, - { key: 'US', display_name: 'USA' }, - { key: 'JP', display_name: 'Japan' }, - { key: 'EU', display_name: 'Eurozone' } -] + import local from './local' -// arr to obj ,such as { CN : "China", US : "USA" } -const calendarTypeKeyValue = calendarTypeOptions.reduce((acc, cur) => { - acc[cur.key] = cur.display_name - return acc -}, {}) + const viewName = 'giftList' -export default { - name: 'ComplexTable', - components: { Pagination }, - directives: { waves }, - filters: { - statusFilter(status) { - const statusMap = { - published: 'success', - draft: 'info', - deleted: 'danger' + const calendarTypeOptions = [ + {key: 'CN', display_name: 'China'}, + {key: 'US', display_name: 'USA'}, + {key: 'JP', display_name: 'Japan'}, + {key: 'EU', display_name: 'Eurozone'} + ] + + // arr to obj ,such as { CN : "China", US : "USA" } + const calendarTypeKeyValue = calendarTypeOptions.reduce((acc, cur) => { + acc[cur.key] = cur.display_name + return acc + }, {}) + + export default { + name: 'ComplexTable', + components: {Pagination}, + directives: {waves}, + filters: { + statusFilter(status) { + const statusMap = { + published: 'success', + draft: 'info', + deleted: 'danger' + } + return statusMap[status] + }, + typeFilter(type) { + return calendarTypeKeyValue[type] } - return statusMap[status] }, - typeFilter(type) { - return calendarTypeKeyValue[type] - } - }, - data() { - return { - tableKey: 0, - list: null, - total: 0, - listLoading: true, - listQuery: { - page: 1, - limit: 20, - importance: undefined, - title: undefined, - type: undefined, - sort: '+id' - }, - importanceOptions: [1, 2, 3], - calendarTypeOptions, - sortOptions: [{ label: 'ID Ascending', key: '+id' }, { label: 'ID Descending', key: '-id' }], - statusOptions: ['published', 'draft', 'deleted'], - showReviewer: false, - temp: { - id: undefined, - importance: 1, - remark: '', - timestamp: new Date(), - title: '', - type: '', - status: 'published' - }, - dialogFormVisible: false, - dialogStatus: '', - textMap: { - update: 'Edit', - create: 'Create' - }, - dialogPvVisible: false, - pvData: [], - rules: { - type: [{ required: true, message: 'type is required', trigger: 'change' }], - timestamp: [{ type: 'date', required: true, message: 'timestamp is required', trigger: 'change' }], - title: [{ required: true, message: 'title is required', trigger: 'blur' }] - }, - downloadLoading: false - } - }, - created() { - this.getList() - }, - methods: { - getList() { - this.listLoading = true - fetchList(this.listQuery).then(response => { - this.list = response.data.items - this.total = response.data.total + data() { + return { + tableKey: 0, + list: null, + total: 0, + listLoading: true, + listQuery: { + page: 1, + limit: 20, + importance: undefined, + title: undefined, + type: undefined, + sort: '+id' + }, + importanceOptions: [1, 2, 3], + calendarTypeOptions, + sortOptions: [{label: 'ID Ascending', key: '+id'}, {label: 'ID Descending', key: '-id'}], + statusOptions: ['published', 'draft', 'deleted'], + showReviewer: false, + temp: { + id: undefined, + importance: 1, + remark: '', + timestamp: new Date(), + title: '', + type: '', + status: 'published' + }, + dialogFormVisible: false, + dialogStatus: '', + textMap: { + update: 'Edit', + create: 'Create' + }, + dialogPvVisible: false, + pvData: [], + rules: { + type: [{required: true, message: 'type is required', trigger: 'change'}], + timestamp: [{type: 'date', required: true, message: 'timestamp is required', trigger: 'change'}], + title: [{required: true, message: 'title is required', trigger: 'blur'}] + }, + downloadLoading: false + } + }, + created() { + if (!this.$i18n.getLocaleMessage('en')[viewName]) { + for (let lang in local) { + const obj = {} + obj[viewName] = local[lang] + this.$i18n.mergeLocaleMessage(lang, obj) + } + } - // Just to simulate the time of the request - setTimeout(() => { - this.listLoading = false - }, 1.5 * 1000) - }) - }, - handleFilter() { - this.listQuery.page = 1 this.getList() }, - handleModifyStatus(row, status) { - this.$message({ - message: '操作成功', - type: 'success' - }) - row.status = status - }, - sortChange(data) { - const { prop, order } = data - if (prop === 'id') { - this.sortByID(order) - } - }, - sortByID(order) { - if (order === 'ascending') { - this.listQuery.sort = '+id' - } else { - this.listQuery.sort = '-id' - } - this.handleFilter() - }, - resetTemp() { - this.temp = { - id: undefined, - importance: 1, - remark: '', - timestamp: new Date(), - title: '', - status: 'published', - type: '' - } - }, - handleCreate() { - this.resetTemp() - this.dialogStatus = 'create' - this.dialogFormVisible = true - this.$nextTick(() => { - this.$refs['dataForm'].clearValidate() - }) - }, - createData() { - this.$refs['dataForm'].validate((valid) => { - if (valid) { - this.temp.id = parseInt(Math.random() * 100) + 1024 // mock a id - this.temp.author = 'vue-element-admin' - createArticle(this.temp).then(() => { - this.list.unshift(this.temp) - this.dialogFormVisible = false - this.$notify({ - title: '成功', - message: '创建成功', - type: 'success', - duration: 2000 - }) - }) - } - }) - }, - handleUpdate(row) { - this.temp = Object.assign({}, row) // copy obj - this.temp.timestamp = new Date(this.temp.timestamp) - this.dialogStatus = 'update' - this.dialogFormVisible = true - this.$nextTick(() => { - this.$refs['dataForm'].clearValidate() - }) - }, - updateData() { - this.$refs['dataForm'].validate((valid) => { - if (valid) { - const tempData = Object.assign({}, this.temp) - tempData.timestamp = +new Date(tempData.timestamp) // change Thu Nov 30 2017 16:41:05 GMT+0800 (CST) to 1512031311464 - updateArticle(tempData).then(() => { - for (const v of this.list) { - if (v.id === this.temp.id) { - const index = this.list.indexOf(v) - this.list.splice(index, 1, this.temp) - break - } - } - this.dialogFormVisible = false - this.$notify({ - title: '成功', - message: '更新成功', - type: 'success', - duration: 2000 - }) - }) - } - }) - }, - handleDelete(row) { - this.$notify({ - title: '成功', - message: '删除成功', - type: 'success', - duration: 2000 - }) - const index = this.list.indexOf(row) - this.list.splice(index, 1) - }, - handleFetchPv(pv) { - fetchPv(pv).then(response => { - this.pvData = response.data.pvData - this.dialogPvVisible = true - }) - }, - handleDownload() { - this.downloadLoading = true - import('@/vendor/Export2Excel').then(excel => { - const tHeader = ['timestamp', 'title', 'type', 'importance', 'status'] - const filterVal = ['timestamp', 'title', 'type', 'importance', 'status'] - const data = this.formatJson(filterVal, this.list) - excel.export_json_to_excel({ - header: tHeader, - data, - filename: 'table-list' + methods: { + getList() { + this.listLoading = true + fetchList(this.listQuery).then(response => { + this.list = response.data.items + this.total = response.data.total + + // Just to simulate the time of the request + setTimeout(() => { + this.listLoading = false + }, 1.5 * 1000) }) - this.downloadLoading = false - }) - }, - formatJson(filterVal, jsonData) { - return jsonData.map(v => filterVal.map(j => { - if (j === 'timestamp') { - return parseTime(v[j]) - } else { - return v[j] + }, + handleFilter() { + this.listQuery.page = 1 + this.getList() + }, + handleModifyStatus(row, status) { + this.$message({ + message: '操作成功', + type: 'success' + }) + row.status = status + }, + sortChange(data) { + const {prop, order} = data + if (prop === 'id') { + this.sortByID(order) } - })) + }, + sortByID(order) { + if (order === 'ascending') { + this.listQuery.sort = '+id' + } else { + this.listQuery.sort = '-id' + } + this.handleFilter() + }, + resetTemp() { + this.temp = { + id: undefined, + importance: 1, + remark: '', + timestamp: new Date(), + title: '', + status: 'published', + type: '' + } + }, + handleCreate() { + this.resetTemp() + this.dialogStatus = 'create' + this.dialogFormVisible = true + this.$nextTick(() => { + this.$refs['dataForm'].clearValidate() + }) + }, + createData() { + this.$refs['dataForm'].validate((valid) => { + if (valid) { + this.temp.id = parseInt(Math.random() * 100) + 1024 // mock a id + this.temp.author = 'vue-element-admin' + createArticle(this.temp).then(() => { + this.list.unshift(this.temp) + this.dialogFormVisible = false + this.$notify({ + title: '成功', + message: '创建成功', + type: 'success', + duration: 2000 + }) + }) + } + }) + }, + handleUpdate(row) { + this.temp = Object.assign({}, row) // copy obj + this.temp.timestamp = new Date(this.temp.timestamp) + this.dialogStatus = 'update' + this.dialogFormVisible = true + this.$nextTick(() => { + this.$refs['dataForm'].clearValidate() + }) + }, + updateData() { + this.$refs['dataForm'].validate((valid) => { + if (valid) { + const tempData = Object.assign({}, this.temp) + tempData.timestamp = +new Date(tempData.timestamp) // change Thu Nov 30 2017 16:41:05 GMT+0800 (CST) to 1512031311464 + updateArticle(tempData).then(() => { + for (const v of this.list) { + if (v.id === this.temp.id) { + const index = this.list.indexOf(v) + this.list.splice(index, 1, this.temp) + break + } + } + this.dialogFormVisible = false + this.$notify({ + title: '成功', + message: '更新成功', + type: 'success', + duration: 2000 + }) + }) + } + }) + }, + handleDelete(row) { + this.$notify({ + title: '成功', + message: '删除成功', + type: 'success', + duration: 2000 + }) + const index = this.list.indexOf(row) + this.list.splice(index, 1) + }, + handleFetchPv(pv) { + fetchPv(pv).then(response => { + this.pvData = response.data.pvData + this.dialogPvVisible = true + }) + }, + handleDownload() { + this.downloadLoading = true + import('@/vendor/Export2Excel').then(excel => { + const tHeader = ['timestamp', 'title', 'type', 'importance', 'status'] + const filterVal = ['timestamp', 'title', 'type', 'importance', 'status'] + const data = this.formatJson(filterVal, this.list) + excel.export_json_to_excel({ + header: tHeader, + data, + filename: 'table-list' + }) + this.downloadLoading = false + }) + }, + formatJson(filterVal, jsonData) { + return jsonData.map(v => filterVal.map(j => { + if (j === 'timestamp') { + return parseTime(v[j]) + } else { + return v[j] + } + })) + } } } -} </script> diff --git a/src/views/gift/local.js b/src/views/gift/local.js new file mode 100644 index 00000000..775ca0be --- /dev/null +++ b/src/views/gift/local.js @@ -0,0 +1,11 @@ +export default { + en: { + giftName: 'Name' + }, + zh: { + giftName: '礼品' + }, + es: { + giftName: 'Gift' + } +}