Browse Source

枚举封装

master
安虹睿 1 year ago
parent
commit
e7361ceabe
  1. 9
      Code/Fe/src/App.vue
  2. 15
      Code/Fe/src/api/wms-interface.js
  3. 52
      Code/Fe/src/components/filterForDetailPage/index.vue
  4. 993
      Code/Fe/src/components/umyTable/index copy.vue
  5. 364
      Code/Fe/src/components/umyTable/index.vue
  6. 89
      Code/Fe/src/mixins/TableMixins.js
  7. 35
      Code/Fe/src/permission.js
  8. 2
      Code/Fe/src/router/index.js
  9. 2
      Code/Fe/src/store/getters.js
  10. 33
      Code/Fe/src/store/modules/definition.js
  11. 12
      Code/Fe/src/store/modules/permission.js
  12. 8
      Code/Fe/src/utils/detailsPageColumns_api/index.js
  13. 8
      Code/Fe/src/utils/detailsTableColumns_api/index.js
  14. 8
      Code/Fe/src/utils/tableColumns_api/index.js
  15. 8
      Code/Fe/src/utils/tabsDesTions_api/index.js
  16. 15
      Code/Fe/src/views/interfaceBoard/TestSchool.vue
  17. 10
      Code/Fe/src/views/login/index.vue

9
Code/Fe/src/App.vue

@ -16,7 +16,14 @@ localStorage.setItem('isSinglePage',window.SITE_CONFIG['isSinglePage'])
localStorage.setItem('userNameOrEmailAddress',window.SITE_CONFIG['userNameOrEmailAddress'])
localStorage.setItem('client_secret',window.SITE_CONFIG['client_secret'])
localStorage.setItem('menuHiddenConfig',window.SITE_CONFIG['menuHiddenConfig'])
//
const language_brow = (navigator.language || navigator.browserLanguage)
console.log(21,language_brow)
if(language_brow == 'zh'){
localStorage.setItem('browserLanguage','zh-Hans')
}else{
localStorage.setItem('browserLanguage','en')
}
// localStorage.setItem('user',window.SITE_CONFIG['user'])
// localStorage.setItem('print',window.SITE_CONFIG['print'])
// localStorage.setItem('warehouseCode',window.SITE_CONFIG['warehouseCode'])

15
Code/Fe/src/api/wms-interface.js

@ -8,7 +8,10 @@ export function getInterfaceBoard() {
return request({
method:'get',
url: base_api + colum_url,
params:{CultureName:'zh-Hans'}
params:{
CultureName:localStorage.getItem('browserLanguage'),
OnlyDynamics:false
}
// params:{IncludeLocalizationResources:true}
})
}
@ -22,7 +25,6 @@ export function getDefinitionMenu(IncludeTypes) {
})
}
// 获取枚举数据
export async function getApiEnumList() {
return request({
@ -32,6 +34,15 @@ export async function getApiEnumList() {
})
}
// 获取dto列数据
export async function getDtoColumnType(api) {
if(!api)return
return request({
method:'post',
url: base_api + '/api/'+ api +'/get-dto-column-type',
})
}
// 获取dto列数据
export async function getDtoColumnType(api) {
return request({

52
Code/Fe/src/components/filterForDetailPage/index.vue

@ -127,6 +127,7 @@ import { filterSelectMixins } from '@/mixins/filter-Select'
// import { TestSchoolDetailList,TestSchoolDetailList_delete } from "@/api/wms-interface"
import * as interfaceApi from "@/api/wms-interface"
import {getListDesById,getPageListForDetail} from "@/api/wms-api"
import { getDtoColumnType } from "@/api/wms-interface"
import * as allUrlOption from '@/utils/baseData/urlOption'
export default {
name: 'filterForDetailPage',
@ -174,10 +175,10 @@ props: {
default: null
},
// -
listColumns:{
type: Array,
default: null
},
// listColumns:{
// type: Array,
// default: null
// },
// -
parentColumns:{
type: Array,
@ -215,6 +216,7 @@ data () {
showParentTitle:null,//-title
showParentTableData:null,//-
showParentLoading:false,//-
listColumns:[],//
}
},
mounted(){
@ -251,23 +253,53 @@ methods: {
paging(callback){
this.Loading.tableLoading = true
this.PageListParams.SkipCount = (this.oldSkipCount - 1) * this.PageListParams.MaxResultCount
Promise.all([
getDtoColumnType(this.URLOption_detailList),
getPageListForDetail(this.PageListParams,this.URLOption_detailList)
// interfaceApi[this.URLOption_detailList](this.PageListParams)
.then(result => {
]).then((allData) => {
//
if(allData[0]){
let _parentName = this.URLOption_detailList.substr(0,this.URLOption_detailList.indexOf('/'))
let _Columns = this.initApiColumnsForDto(allData[0],allData[1].items[0],_parentName)
this.listColumns = this.initTableColumns(_Columns)
}
//
if(allData[1]){
this.Loading.tableLoading = false
this.tableData = []
result.items.forEach(item=>{
allData[1].items.forEach(item=>{
item.deleteTipVisible = false
this.tableData.push(item)
})
this.totalCount = result.totalCount
this.pagingCallback(callback)
})
.catch(err => {
this.totalCount = allData[1].totalCount
}
this.pagingCallback(callback)
}).catch(()=>{
this.Loading.tableLoading = false
this.$message.error("数据获取失败")
})
},
// paging(callback){
// this.Loading.tableLoading = true
// this.PageListParams.SkipCount = (this.oldSkipCount - 1) * this.PageListParams.MaxResultCount
// getPageListForDetail(this.PageListParams,this.URLOption_detailList)
// // interfaceApi[this.URLOption_detailList](this.PageListParams)
// .then(result => {
// this.Loading.tableLoading = false
// this.tableData = []
// result.items.forEach(item=>{
// item.deleteTipVisible = false
// this.tableData.push(item)
// })
// this.totalCount = result.totalCount
// this.pagingCallback(callback)
// })
// .catch(err => {
// this.Loading.tableLoading = false
// this.$message.error("")
// })
// },
//
showParentHandleForDetail(data){
this.showParentTitle = `${data[this.URLOption_masterName] || ''} 主表信息`

993
Code/Fe/src/components/umyTable/index copy.vue

@ -0,0 +1,993 @@
<template>
<!-- 解决el-table 数据量过大导致卡顿现象 -->
<u-table
:id="_uid"
:key="isUpdate"
v-loading="tableLoading"
element-loading-text="拼命加载中..."
@sort-change="sortChange"
@selection-change="handleSelectionChange"
ref="multipleTable"
:data="tableData"
:row-key="rowKey"
:border="tableBorder"
style="width: 100%"
:cell-style="cellStyle"
use-virtual
:row-height="50"
:height="uTableHeight"
header-row-class-name="uTableHeader"
>
<!-- :tree-props="treeProps" height 不能共存 此组件暂不支持tree的格式-->
<!-- 操作列 左侧-->
<u-table-column
v-if="buttonOperationList_left"
:fixed="'left'"
width="auto"
min-width="120px"
:align="'center'"
:header-align="'center'"
>
<template #header>
<span>操作</span>
</template>
<template slot-scope="scope">
<el-button
v-for="(itemButton, indexButton) in buttonOperationList_left"
:key="indexButton"
type="text"
size="mini"
@click="buttonOperationClick_left(scope.row, itemButton, indexButton)"
>{{itemButton.label}}</el-button>
</template>
</u-table-column>
<!-- 操作列 右侧-->
<u-table-column
v-if="buttonOperationList_right"
:fixed="'right'"
width="auto"
min-width="120px"
:align="'center'"
:header-align="'center'"
>
<template #header>
<span>操作</span>
</template>
<template slot-scope="scope">
<el-button
v-for="(itemButton, indexButton) in buttonOperationList_right(scope.row)"
v-show="!itemButton.hide"
:key="indexButton"
type="text"
size="mini"
@click="buttonOperationClick_right(scope.row, itemButton, indexButton)"
>{{itemButton.label}}</el-button>
</template>
</u-table-column>
<u-table-column v-if="selectionTable" fixed="left" type="selection" :reserve-selection="true" />
<u-table-column v-if="isShowIndex" type="index" fixed="left" label="序号" width="50" />
<template v-for="(item, index) in TableSize">
<u-table-column
min-width="150"
:key="index"
:prop="item.showProp ? item.prop + '.' + item.showProp : item.prop"
:sortable="item.sortable"
:fixed="setItemFixed(item,index)"
:show-overflow-tooltip="showOverflowTooltip"
:width="item.width"
:align="item.tableAlign"
:header-align="item.tableHeaderAlign"
v-if="item.istrue==null?true:item.istrue"
>
<template #header>
<span>{{ item.label }}</span>
<i style="color: #f56c6c" v-if="item.rules && requiredRules">*</i>
</template>
<template slot-scope="scope">
<el-form>
<el-form-item
v-if="item.type == 'input'"
:onkeyup="itemOnKeyUp(item,searchData[item.prop])"
:prop="'details.' + scope.$index + '.' + item.prop"
:rules="item.rules"
>
<el-input
:placeholder="'请输入' + item.label"
:disabled="Boolean(item.disabled) || Boolean(scope.row['disabled'])"
v-model="scope.row[item.prop]"
@blur="
inputPlaceholder($event, item, 'blur',scope.row)
"
@focus="inputPlaceholder($event, item, 'focus')"
clearable
>
</el-input>
</el-form-item>
<!-- 输入框(数字) onkeyup: 正则表达式用于前端输入校验工作-->
<el-form-item
v-if="item.type == 'inputNumber'"
:prop="'details.' + scope.$index + '.' + item.prop"
:rules="item.rules"
>
<el-input
v-model="searchData[item.prop]"
:maxlength="item.maxlength"
:onkeyup="typeNumberOnkeyup(item,searchData[item.prop])"
clearable
:disabled="Boolean(item.disabled)"
:placeholder="'请输入' + item.label"
:prefix-icon="item.icon"
:show-password="item.showPassword"
@change="changeInput(item.prop,$event)"
@clear="clearInput(item.prop,$event)"
@blur="
inputPlaceholder($event, item, 'blur',searchData)
"
@focus="inputPlaceholder($event, item, 'focus')"
></el-input>
</el-form-item>
<el-form-item
v-if="item.type == 'objectInput'"
:prop="
'details.' + scope.$index + '.' + item.prop + '.' + item.showProp
"
:rules="item.rules"
>
<el-input
:placeholder="'请输入' + item.label"
v-model="scope.row[item.prop][item.showProp]"
:disabled="Boolean(item.disabled) || Boolean(scope.row['disabled'])"
@blur="
inputPlaceholder($event, item, 'blur', scope.row)
"
@focus="inputPlaceholder($event, item, 'focus')"
clearable
>
</el-input>
</el-form-item>
<!-- 下拉框 -->
<el-select
v-if="item.type === 'select'"
v-model="scope.row[item.prop]"
:loading="selectLoading"
:clearable="item.clearable"
:multiple="item.multiple"
:disabled="Boolean(item.disabled) || Boolean(scope.row['disabled'])"
:filterable="item.filterable"
:allow-create="item.allowCreate"
style="width: 100%"
:placeholder="'请输入' + item.label"
>
<el-option
v-for="(op, index) in selectOptions(item.options) ||
searchOptions['options']"
:label="op[item.optionsLabel] || op.label"
:value="op[item.optionsValue] || op.value"
:key="index"
></el-option>
</el-select>
<!--对象下拉框 -->
<el-select
v-if="item.type === 'objectSelect'"
v-model="scope.row[item.prop][item.showProp]"
:loading="selectLoading"
:clearable="item.clearable"
:multiple="item.multiple"
:disabled="Boolean(item.disabled) || Boolean(scope.row['disabled'])"
:filterable="item.filterable"
:allow-create="item.allowCreate"
style="width: 100%"
:placeholder="'请输入' + item.label"
>
<el-option
v-for="(op, index) in selectOptions(item.options) ||
searchOptions['options']"
:label="op[item.optionsLabel] || op.label"
:value="op[item.optionsValue] || op.value"
:key="index"
></el-option>
</el-select>
<!--查询下拉-->
<el-form-item
v-if="item.type === 'autocomplete'"
:prop="'details.' + scope.$index + '.' + item.prop"
:rules="item.rules"
>
<el-autocomplete
class="inline-input"
style="width: 100%"
:disabled="Boolean(item.disabled) || Boolean(scope.row['disabled'])"
v-model="scope.row[item.prop]"
:fetch-suggestions="
(queryString, cb) => {
querySearch(queryString, cb, item, scope);
}
"
:placeholder="'请输入' + item.label"
@select="handleSelect($event, item, scope)"
>
<!-- <template slot-scope="{item}">
<div class="name" style="color:green">{{item.value = item.name}}</div>
<div class="name" >{{item.address = item.code}}</div>
</template> -->
<el-button
v-if="item.click"
slot="append"
icon="el-icon-search"
@click="item.click({ scope, item })"
style="color: #1890ff; background-color: #ffffff"
></el-button>
</el-autocomplete>
</el-form-item>
<!-- 对象查询下拉 -->
<el-form-item
v-if="item.type === 'objectAutocomplete'"
:prop="
'details.' + scope.$index + '.' + item.prop + '.' + item.showProp
"
:rules="item.rules"
>
<el-autocomplete
class="inline-input"
style="width: 100%"
:disabled="Boolean(item.disabled) || Boolean(scope.row['disabled'])"
v-model="scope.row[item.prop][item.showProp]"
:fetch-suggestions="
(queryString, cb) => {
querySearch(queryString, cb, item, scope);
}
"
:placeholder="'请输入' + item.label"
@select="handleSelect($event, item, scope)"
>
<!-- <template slot-scope="{item}">
<div class="name" style="color:green">{{item.value = item.name}}</div>
<div class="name" >{{item.address = item.code}}</div>
</template> -->
<el-button
v-if="item.click"
slot="append"
icon="el-icon-search"
@click="item.click({ scope, item })"
style="color: #1890ff; background-color: #ffffff"
></el-button>
</el-autocomplete>
</el-form-item>
<!-- <el-form-item v-if="item.type == 'inputEnum'" :prop="item.prop">
<el-input
placeholder="请输入内容"
v-model="scope.row[item.prop]"
clearable
>
</el-input>
</el-form-item> -->
<el-form-item
v-if="item.type == 'dateTimeInput'"
:prop="'details.' + scope.$index + '.' + item.prop"
:rules="item.rules"
>
<el-date-picker
type="datetime"
v-model="scope.row[item.prop]"
placeholder="选择日期"
style="width: 100%"
:disabled="Boolean(item.disabled) || Boolean(scope.row['disabled'])"
value-format="yyyy-MM-ddTHH:mm:ss.sssZ"
format="yyyy-MM-dd"
></el-date-picker>
</el-form-item>
<el-form-item
v-if="item.type == 'objectDateTimeInput'"
:prop="'details.' + scope.$index + '.' + item.prop + '.' + item.showProp"
:rules="item.rules"
>
<el-date-picker
type="datetime"
v-model="scope.row[item.prop][item.showProp]"
placeholder="选择日期"
style="width: 100%"
:disabled="Boolean(item.disabled) || Boolean(scope.row['disabled'])"
value-format="yyyy-MM-ddTHH:mm:ss.sssZ"
format="yyyy-MM-dd"
></el-date-picker>
</el-form-item>
<!-- table表添加按钮事件 v-show="scope.row.number == 'PRJ202210060001'" -->
<!-- <el-form-item v-if="item.type == 'button'" > -->
<div v-if="item.type == 'button'">
<el-button
v-show="scope.row[item.prop]==undefined?true:false"
type="primary"
size="mini"
@click="buttonClick(scope.row, scope.$index, item.label)"
>{{item.label}}</el-button>
</div>
<!-- </el-form-item> -->
<span v-if="item.type == 'object'">
{{ scope.row[item.prop] ? scope.row[item.prop][item.showProp] : "" }}
</span>
<span v-if="item.type == 'objectDateTime'">
{{ scope.row[item.prop]? scope.row[item.prop][item.showProp]: "" | formatDate }}
</span>
<span v-if="item.type == 'dateTime'">
{{ scope.row[item.prop] | formatDate }}
</span>
<!-- 调用主表信息 -->
<span v-else-if="item.type && item.type == 'outerMainFilter'">
{{ propsData[item.showProp] }}
</span>
<el-tag
v-if="item.type == 'tagFilter'"
:effect="'dark'"
size="medium"
class="tagFilterTypeDarkItem"
:color="scope.row[item.prop] | trigger(item.filters, 'background')"
>
{{ scope.row[item.prop] | trigger(item.filters, "label") }}
</el-tag>
<span
v-if="item.type == 'filter'"
:style="scope.row[item.prop]"
>
{{ scope.row[item.prop] | trigger(item.filters, "label", item.dictType) }}
</span>
<span
v-if="item.type == 'objectFilter'"
:style="scope.row[item.prop][item.showProp]"
>
{{ scope.row[item.prop][item.showProp] | trigger(item.filters, "label") }}
</span>
<span v-else-if="item.type == 'filterList'" >
{{ scope.row[item.prop] | triggerList(item.filters, "label") }}
</span>
<!-- 可点出详情 -->
<span
v-if="item.type == 'showDetail'"
@click="showDetailInfo(scope.row[item.prop])"
style="cursor: pointer;"
:title="'点击查看详情'"
:class="{ showDetailHover: item.type == 'showDetail' }"
>{{ scope.row[item.prop] ? scope.row[item.prop] + "" : scope.row[item.prop] }}</span>
<!-- 可点出json转换的table弹窗 -->
<span
v-if="item.type == 'showJsonTable'"
@click="showJsonTable(scope.row[item.prop])"
style="cursor: pointer;"
:title="'点击查看详情'"
:class="{ showDetailHover: item.type == 'showJsonTable' }"
>{{ scope.row[item.prop] ? scope.row[item.prop] + "" : scope.row[item.prop] }}</span>
<span
v-if="item.type == 'name' || !item.type"
@click="item.type == 'name' && inlineDialog(scope.row)"
:class="{ spamHover: item.type == 'name' }"
>{{ scope.row[item.prop] ? scope.row[item.prop] + "" : scope.row[item.prop] }}</span>
</el-form>
</template>
</u-table-column>
</template>
<slot></slot>
<!-- 点开查看全部弹窗 -->
<el-dialog
:visible.sync="showDetailDialog"
width="35%"
:modal-append-to-body="false"
:append-to-body="true"
:show-close="true"
:title="'内容详情'"
>
{{ showDetailData ? showDetailData + "" : showDetailData }}
</el-dialog>
<!-- json弹窗复制的json内容 -->
<el-dialog
id="copyJsonTextarea_dialog_ref"
:visible.sync="showJsonCopy"
:modal-append-to-body="false"
:append-to-body="true"
:show-close="true"
:close-on-click-modal="true"
:close-on-press-escape="true"
:title="'JSON详情'"
>
<el-input
ref="copyJsonTextarea_ref"
type="textarea"
readonly
autosize
placeholder="请输入内容"
v-model="showJsonData_str">
</el-input>
</el-dialog>
<!-- 点开查看Json转换后table弹窗 -->
<el-dialog
:visible.sync="showJsonDialog"
:modal-append-to-body="false"
:append-to-body="true"
:show-close="true"
:close-on-click-modal="true"
:close-on-press-escape="true"
:title="'内容详情'"
>
<el-button
@click="copyJsonHandle()"
type="primary"
style="margin-bottom: 10px;float: right;"
>复制JSON</el-button>
<el-table
:data="showJsonData"
:border="true"
style="width: 100%">
<el-table-column
prop="name"
width="220"
label="属性">
</el-table-column>
<el-table-column
label="值"
>
<template slot-scope="scope">
<!-- DETAILS todo:DETAILS判断条件需要优化使用传参的方式 -->
<span v-if="(scope.row.name).toUpperCase() != 'DETAILS'">{{scope.row.value}}</span>
<el-table
v-else
height="300"
:data="scope.row.value"
:border="true"
style="width: 100%">
<el-table-column
prop="name"
label="子属性"
></el-table-column>
<el-table-column
label="子值"
prop="value"
></el-table-column>
</el-table>
</template>
</el-table-column>
</el-table>
</el-dialog>
</u-table>
</template>
<script>
import { formatTimeStrToStr } from "@/utils/formatTime";
import _ from "lodash";
import { getMatchRegConformValue } from "@/utils/index"
export default {
name: "currenTable",
filters: {
formatDate(time) {
if (time == null) {
return '-'
}
return formatTimeStrToStr(time)
},
},
props: {
//
buttonOperationList_left:{
type: Array,
default: null,
},
// ()
buttonOperationList_right:{
type: Function,
default: null,
},
//
showOverflowTooltip:{
type: Boolean,
default: false,
},
// tableborder
tableBorder: {
type: Boolean,
default: false,
},
// itemfixed
firstFixed: {
type: Boolean,
default: false,
},
propsData: {
type: Object,
default: () => {
return {};
},
},
tableData: {
type: Array,
default: () => {
return [];
},
},
tableLoading: {
type: Boolean,
default: false,
},
tableColumns: {
type: Array,
default: () => {
return [];
},
},
selectionTable: {
type: Boolean,
default: true,
},
requiredRules: {
type: Boolean,
default: true,
},
searchOptions: {
type: Object,
default: () => {
return {};
},
},
treeProps: {
type: Object,
default: () => {
return {};
}
},
// table key
isUpdate: {
type: Boolean,
default: () => {
return false
}
},
rowKey:{
type: String,
default: 'id',
},
isShowIndex: {
type: Boolean,
default: false,
},
cellStyle: {
type: Function,
default: () => {
return Function;
}
},
// app-main100%
setUTableHeight: {
type: Number,
default: () => {
return 280;
}
}
},
data() {
return {
dropCol: null,
selectLoading: false,
random: '',
uTableHeight:null,//
showDetailDialog:false,//
showDetailData:null,//
showJsonDialog:false,//Jsontable
showJsonData:null,//Json
showJsonData_str:null,//Json
showJsonCopy:false,//jsonDialog
};
},
computed: {
selectOptions() {
return (val) => {
if (val) {
let options = this.$staticOptions[val];
if (options) {
return options();
} else {
return [];
}
} else {
return false;
}
};
},
TableSize(){
return this.tableColumnsFilter()
}
},
watch: {
tableData: {
handler(val, oldVal) {
this.$nextTick(() => {
if (this.$refs.multipleTable && this.$refs.multipleTable.doLayout) {
this.$refs.multipleTable.doLayout()
}
});
},
immediate: false,
},
tableColumns: {
handler(val, oldVal) {
this.$nextTick(() => {
if (this.$refs.multipleTable && this.$refs.multipleTable.doLayout) {
this.$refs.multipleTable.doLayout()
}
});
},
immediate: false,
},
setUTableHeight(n,o){
this.setTableHeightHandle(n)
}
},
activated() {
this.$refs.multipleTable.doLayout();
},
mounted() {
this.random = this._uid
this.setTableHeightHandle()
},
methods: {
//
setTableHeightHandle(height){
let _height = height || this.setUTableHeight
let _app_height = document.getElementsByClassName('app-main')[0].clientHeight
this.uTableHeight = Number(_app_height) - Number(_height)
},
//
getTableHeight(){
return this.uTableHeight
},
setItemFixed(item,index){
let _re = false
if(this.firstFixed && item.fixed == 'left'){
if(index == 0)_re = true
}else{
_re = item.fixed
}
return _re
},
// type=input
itemOnKeyUp(item,value){
if(item.onkeyup){
return item.onkeyup()
}else{
if(value && item.validType){
this.searchData[item.prop]=getMatchRegConformValue(item.validType,value,item.pointNumberFixed)
}
}
},
// inputonkeyup
typeNumberOnkeyup(item,value){
if(value){
let _match = String(value).match(/\d+/)//
this.searchData[item.prop] = _match?_match[0]:_match
}
if(this.searchData[item.prop] > item.max){
this.searchData[item.prop] = item.max
}
if(this.searchData[item.prop] && this.searchData[item.prop] < item.min){
this.searchData[item.prop] = item.min
}
if(item.onkeyup)item.onkeyup()
},
tableColumnsFilter() {
let widthSize = _.cloneDeep(this.tableColumns);
for(let i = 0;i<widthSize.length;i++){
let item = widthSize[i]
if (item.type == "autocomplete" || item.type == "objectAutocomplete") {
item.width = item.width ? item.width: "300px";
} else if (item.type == "input" || item.type == "objectInput") {
if (item.width == '100%') {
item.width = ''
} else {
item.width = item.width ? item.width: "200px";
}
} else if (
item.type == "dateTimeInput" ||
item.type == "objectDateTimeInput"
) {
item.width =item.width ? item.width: "200px";
} else if (item.type == "objectDateTime" || item.type == "dateTime") {
item.width =item.width ? item.width: "200px";
} else if (item.width == '100%') {
item.width = ''
} else {
item.width =item.width ? item.width: "auto";
}
}
return widthSize
},
inputPlaceholder(val, item, type, func) {
if (item.valueType) {
if (type == "focus") {
val.target.placeholder = "请输入" + item.label;
if (val.target.value != "") {
val.target.placeholder = val.target.value;
val.target.value = "";
}
} else if (type == "blur") {
// val.target.value = "0"
val.target.value = val.target.value.toString().replace(/[^\d.]/g,'')
if (val.target.value == "") {
// if (val.target.placeholder.indexOf('') == -1) {
val.target.value = val.target.placeholder;
// }
}
if(item.showProp){
func[item.prop][item.showProp]= Number(val.target.value)
}else{
func[item.prop]= Number(val.target.value)
}
}
}
},
//autocomplete
querySearch(queryString, cb, val, row) {
const { options, optionsValue, optionsLabel } = val;
let func = val.focus;
let data = {
scope: row,
};
if (queryString) {
data.filter = [
{
logic: "And",
column: optionsValue,
action: "Like",
value: queryString,
},
];
}
func(data).then((res) => {
var restaurants = this.searchOptions["options"];
let results = queryString
? restaurants.filter(
this.createFilter(queryString, optionsValue, optionsLabel)
)
: restaurants;
results.forEach((key) => {
if (typeof optionsValue === "string") {
key.value = key[optionsValue] + "----" + key[optionsLabel];
} else {
key.value =
key[optionsValue[0]][optionsValue[1]] +
"----" +
key[optionsLabel];
}
});
// callback
cb(results);
});
},
createFilter(queryString, optionsValue, optionsLabel) {
return (restaurant) => {
if (typeof optionsValue === "string") {
restaurant.value =
restaurant[optionsValue] + "----" + restaurant[optionsLabel];
} else {
restaurant.value =
restaurant[optionsValue[0]][optionsValue[1]] +
"----" +
restaurant[optionsLabel];
}
return (
restaurant.value.toLowerCase().indexOf(queryString.toLowerCase()) !=
-1
);
};
},
handleSelect(item, val, scope) {
let data = this.tableData[scope.$index];
if (!val.showProp) {
if (typeof val.optionsValue === "string") {
data[val.prop] = item[val.optionsValue];
} else {
data[val.prop] = item[val.optionsValue[0]][val.optionsValue[1]];
}
} else {
if (typeof val.optionsValue === "string") {
data[val.prop][val.showProp] = item[val.optionsValue];
} else {
data[val.prop][val.showProp] =
item[val.optionsValue[0]][val.optionsValue[1]];
}
}
this.$emit("push", item, scope, val);
},
getMaxLength(arr) {
return arr.reduce((acc, item) => {
if (item) {
const calcLen = this.getTexWidth(item);
if (acc < calcLen) {
acc = calcLen;
}
}
return acc;
}, 0);
},
getTexWidth(str) {
let width = 0;
const html = document.createElement("span");
html.innerText = str;
html.className = "getTextWidth";
document.querySelector("body").appendChild(html);
width = document.querySelector(".getTextWidth").offsetWidth;
document.querySelector(".getTextWidth").remove();
return width;
},
flexColumnWidth(label, prop) {
const arr = this.tableData.map((x) => {
if (typeof prop !== "string") {
return x[prop[0]][prop[1]];
} else {
return x[prop];
}
});
arr.push(label);
return this.getMaxLength(arr) + 60 + "px";
},
//
sortChange(data) {
this.$emit("sortChange", data);
},
//selection
handleSelectionChange(val) {
this.$emit("handleSelectionChange", val);
},
//nameemit
inlineDialog(row) {
this.$emit("inlineDialog", row);
},
//
showDetailInfo(row) {
this.showDetailDialog = true
this.showDetailData = row
this.$emit("showDetailInfo", row);
},
// jsontable
showJsonTable(row){
this.showJsonDialog = true
let _json = eval('(' + row + ')')
let _arr = []
let __initJson = (data) => {
let _init = []
for(let item in data){
_init.push({name:item,value:data[item]})
}
return _init
}
for(let item in _json){
//
if(!_json[item]){
_arr.push({name:item,value:_json[item]})
}else if(_json[item] && typeof _json[item] != 'object'){
_arr.push({name:item,value:_json[item] + ""})
}else{
//
if(Array.isArray(_json[item])){
// DETAILS todo:DETAILS使
let _value = (item).toUpperCase() == 'DETAILS' ? __initJson(_json[item][0]) : (_json[item]).join(",")
_arr.push({name:item,value:_value})
}
//
else{
let _obj_arr = __initJson(_json[item])
//
if(_obj_arr.length > 0){
_arr = [..._obj_arr]
}else{
//
_arr.push({name:item,value:""})
}
}
}
}
this.showJsonData = _arr
this.showJsonData_str = JSON.stringify(JSON.parse(JSON.stringify(this.showJsonData)), null, '\t')
this.$emit("showJsonTable", row);
},
// Json
copyJsonHandle(){
this.showJsonCopy = true
navigator.clipboard.writeText(this.showJsonData_str)
.then(() => {
this.$message.success('复制成功');
})
.catch(err => {
this.$message.error('复制失败');
});
this.$nextTick(()=>{
if(this.$refs.copyJsonTextarea_ref){
this.$refs.copyJsonTextarea_ref.focus()
this.$nextTick(()=>{
document.getElementById('copyJsonTextarea_dialog_ref').scrollTop = 0
})
}
})
},
//
buttonClick(row, index, label) {
this.$emit("buttonClick", row, index, label);
},
//table()
buttonOperationClick_left(row, item, index) {
this.$emit("buttonOperationClick_left", row, item, index);
},
//table()
buttonOperationClick_right(row, item, index) {
this.$emit("buttonOperationClick_right", row, item, index);
},
},
};
</script>
<style lang="scss" scoped>
::v-deep .uTableHeader th{
background: #f6f7fb !important;
border: none !important;
// &:last-child{
// background: unset !important;
// }
}
::v-deep .el-form-item__error{
position: relative;
}
::v-deep .el-table__fixed {
display: block-inline !important;
height: auto !important;
bottom: 13px !important;
.el-table__fixed-header-wrapper {
z-index: auto !important;
}
.el-table__fixed-body-wrapper {
z-index: auto !important;
}
}
::v-deep .el-table__fixed-right {
display: block-inline !important;
height: auto !important;
bottom: 13px !important;
.el-table__fixed-header-wrapper {
z-index: auto !important;
}
.el-table__fixed-body-wrapper {
z-index: auto !important;
}
}
::v-deep .el-table__fixed::before,
.el-table__fixed-right::before {
z-index: auto !important;
}
.spamHover {
color: #409eff;
cursor: pointer;
}
.spamHover:hover {
border-bottom: 1px solid #409eff;
color: blue;
}
.showDetailHover:hover{
color: #409eff;
}
span {
white-space: pre;
}
::v-deep .el-select {
.el-input__inner {
padding: 0 30px 0 15px;
}
.el-input__prefix {
width: 100% !important;
left: 0;
.el-button {
position: absolute;
top: 0;
right: 0;
}
}
}
.u-table::before {
height: 0px;
}
</style>

364
Code/Fe/src/components/umyTable/index.vue

@ -84,284 +84,36 @@
<i style="color: #f56c6c" v-if="item.rules && requiredRules">*</i>
</template>
<template slot-scope="scope">
<el-form>
<el-form-item
v-if="item.type == 'input'"
:onkeyup="itemOnKeyUp(item,searchData[item.prop])"
:prop="'details.' + scope.$index + '.' + item.prop"
:rules="item.rules"
>
<el-input
:placeholder="'请输入' + item.label"
:disabled="Boolean(item.disabled) || Boolean(scope.row['disabled'])"
v-model="scope.row[item.prop]"
@blur="
inputPlaceholder($event, item, 'blur',scope.row)
"
@focus="inputPlaceholder($event, item, 'focus')"
clearable
>
</el-input>
</el-form-item>
<!-- 输入框(数字) onkeyup: 正则表达式用于前端输入校验工作-->
<el-form-item
v-if="item.type == 'inputNumber'"
:prop="'details.' + scope.$index + '.' + item.prop"
:rules="item.rules"
>
<el-input
v-model="searchData[item.prop]"
:maxlength="item.maxlength"
:onkeyup="typeNumberOnkeyup(item,searchData[item.prop])"
clearable
:disabled="Boolean(item.disabled)"
:placeholder="'请输入' + item.label"
:prefix-icon="item.icon"
:show-password="item.showPassword"
@change="changeInput(item.prop,$event)"
@clear="clearInput(item.prop,$event)"
@blur="
inputPlaceholder($event, item, 'blur',searchData)
"
@focus="inputPlaceholder($event, item, 'focus')"
></el-input>
</el-form-item>
<el-form-item
v-if="item.type == 'objectInput'"
:prop="
'details.' + scope.$index + '.' + item.prop + '.' + item.showProp
"
:rules="item.rules"
>
<el-input
:placeholder="'请输入' + item.label"
v-model="scope.row[item.prop][item.showProp]"
:disabled="Boolean(item.disabled) || Boolean(scope.row['disabled'])"
@blur="
inputPlaceholder($event, item, 'blur', scope.row)
"
@focus="inputPlaceholder($event, item, 'focus')"
clearable
>
</el-input>
</el-form-item>
<!-- 下拉框 -->
<el-select
v-if="item.type === 'select'"
v-model="scope.row[item.prop]"
:loading="selectLoading"
:clearable="item.clearable"
:multiple="item.multiple"
:disabled="Boolean(item.disabled) || Boolean(scope.row['disabled'])"
:filterable="item.filterable"
:allow-create="item.allowCreate"
style="width: 100%"
:placeholder="'请输入' + item.label"
>
<el-option
v-for="(op, index) in selectOptions(item.options) ||
searchOptions['options']"
:label="op[item.optionsLabel] || op.label"
:value="op[item.optionsValue] || op.value"
:key="index"
></el-option>
</el-select>
<!--对象下拉框 -->
<el-select
v-if="item.type === 'objectSelect'"
v-model="scope.row[item.prop][item.showProp]"
:loading="selectLoading"
:clearable="item.clearable"
:multiple="item.multiple"
:disabled="Boolean(item.disabled) || Boolean(scope.row['disabled'])"
:filterable="item.filterable"
:allow-create="item.allowCreate"
style="width: 100%"
:placeholder="'请输入' + item.label"
>
<el-option
v-for="(op, index) in selectOptions(item.options) ||
searchOptions['options']"
:label="op[item.optionsLabel] || op.label"
:value="op[item.optionsValue] || op.value"
:key="index"
></el-option>
</el-select>
<!--查询下拉-->
<el-form-item
v-if="item.type === 'autocomplete'"
:prop="'details.' + scope.$index + '.' + item.prop"
:rules="item.rules"
>
<el-autocomplete
class="inline-input"
style="width: 100%"
:disabled="Boolean(item.disabled) || Boolean(scope.row['disabled'])"
v-model="scope.row[item.prop]"
:fetch-suggestions="
(queryString, cb) => {
querySearch(queryString, cb, item, scope);
}
"
:placeholder="'请输入' + item.label"
@select="handleSelect($event, item, scope)"
>
<!-- <template slot-scope="{item}">
<div class="name" style="color:green">{{item.value = item.name}}</div>
<div class="name" >{{item.address = item.code}}</div>
</template> -->
<el-button
v-if="item.click"
slot="append"
icon="el-icon-search"
@click="item.click({ scope, item })"
style="color: #1890ff; background-color: #ffffff"
></el-button>
</el-autocomplete>
</el-form-item>
<!-- 对象查询下拉 -->
<el-form-item
v-if="item.type === 'objectAutocomplete'"
:prop="
'details.' + scope.$index + '.' + item.prop + '.' + item.showProp
"
:rules="item.rules"
>
<el-autocomplete
class="inline-input"
style="width: 100%"
:disabled="Boolean(item.disabled) || Boolean(scope.row['disabled'])"
v-model="scope.row[item.prop][item.showProp]"
:fetch-suggestions="
(queryString, cb) => {
querySearch(queryString, cb, item, scope);
}
"
:placeholder="'请输入' + item.label"
@select="handleSelect($event, item, scope)"
>
<!-- <template slot-scope="{item}">
<div class="name" style="color:green">{{item.value = item.name}}</div>
<div class="name" >{{item.address = item.code}}</div>
</template> -->
<el-button
v-if="item.click"
slot="append"
icon="el-icon-search"
@click="item.click({ scope, item })"
style="color: #1890ff; background-color: #ffffff"
></el-button>
</el-autocomplete>
</el-form-item>
<!-- <el-form-item v-if="item.type == 'inputEnum'" :prop="item.prop">
<el-input
placeholder="请输入内容"
v-model="scope.row[item.prop]"
clearable
>
</el-input>
</el-form-item> -->
<el-form-item
v-if="item.type == 'dateTimeInput'"
:prop="'details.' + scope.$index + '.' + item.prop"
:rules="item.rules"
>
<el-date-picker
type="datetime"
v-model="scope.row[item.prop]"
placeholder="选择日期"
style="width: 100%"
:disabled="Boolean(item.disabled) || Boolean(scope.row['disabled'])"
value-format="yyyy-MM-ddTHH:mm:ss.sssZ"
format="yyyy-MM-dd"
></el-date-picker>
</el-form-item>
<el-form-item
v-if="item.type == 'objectDateTimeInput'"
:prop="'details.' + scope.$index + '.' + item.prop + '.' + item.showProp"
:rules="item.rules"
<!-- 时间转换 -->
<span v-if="item.apiBaseType == 'System.DateTime'"
@click="showDetailInfo(scope.row[item.prop],'time')"
style="cursor: pointer;"
:title="'点击查看详情'"
class="showDetailHover"
>
<el-date-picker
type="datetime"
v-model="scope.row[item.prop][item.showProp]"
placeholder="选择日期"
style="width: 100%"
:disabled="Boolean(item.disabled) || Boolean(scope.row['disabled'])"
value-format="yyyy-MM-ddTHH:mm:ss.sssZ"
format="yyyy-MM-dd"
></el-date-picker>
</el-form-item>
<!-- table表添加按钮事件 v-show="scope.row.number == 'PRJ202210060001'" -->
<!-- <el-form-item v-if="item.type == 'button'" > -->
<div v-if="item.type == 'button'">
<el-button
v-show="scope.row[item.prop]==undefined?true:false"
type="primary"
size="mini"
@click="buttonClick(scope.row, scope.$index, item.label)"
>{{item.label}}</el-button>
</div>
<!-- </el-form-item> -->
<span v-if="item.type == 'object'">
{{ scope.row[item.prop] ? scope.row[item.prop][item.showProp] : "" }}
</span>
<span v-if="item.type == 'objectDateTime'">
{{ scope.row[item.prop]? scope.row[item.prop][item.showProp]: "" | formatDate }}
</span>
<span v-if="item.type == 'dateTime'">
{{ scope.row[item.prop] | formatDate }}
</span>
<!-- 调用主表信息 -->
<span v-else-if="item.type && item.type == 'outerMainFilter'">
{{ propsData[item.showProp] }}
<!-- 枚举 -->
<span v-else-if="item.apiIsEnum">
{{ initApiEnumList(item,scope.row[item.prop]) }}
</span>
<el-tag
v-if="item.type == 'tagFilter'"
:effect="'dark'"
size="medium"
class="tagFilterTypeDarkItem"
:color="scope.row[item.prop] | trigger(item.filters, 'background')"
>
{{ scope.row[item.prop] | trigger(item.filters, "label") }}
</el-tag>
<span
v-if="item.type == 'filter'"
:style="scope.row[item.prop]"
>
{{ scope.row[item.prop] | trigger(item.filters, "label", item.dictType) }}
</span>
<span
v-if="item.type == 'objectFilter'"
:style="scope.row[item.prop][item.showProp]"
>
{{ scope.row[item.prop][item.showProp] | trigger(item.filters, "label") }}
<!-- 布尔 -->
<span v-else-if="item.apiBaseType == 'System.Boolean'">
{{ scope.row[item.prop] ? '是' : '否' }}
</span>
<span v-else-if="item.type == 'filterList'" >
{{ scope.row[item.prop] | triggerList(item.filters, "label") }}
<!-- 数值 -->
<span v-else-if="initTypeList.indexOf(item.apiBaseType.toLowerCase()) >= 0">
{{ scope.row[item.prop] }}
</span>
<!-- 可点出详情 -->
<span
v-if="item.type == 'showDetail'"
@click="showDetailInfo(scope.row[item.prop])"
style="cursor: pointer;"
:title="'点击查看详情'"
:class="{ showDetailHover: item.type == 'showDetail' }"
>{{ scope.row[item.prop] ? scope.row[item.prop] + "" : scope.row[item.prop] }}</span>
<!-- 可点出json转换的table弹窗 -->
<span
v-if="item.type == 'showJsonTable'"
@click="showJsonTable(scope.row[item.prop])"
style="cursor: pointer;"
<!-- 点击可出详情 | 点击可点出json 目前已知String|Guid-->
<span v-else
@click="showTypeHandle(initApiOtherType(scope.row[item.prop])[1],scope.row[item.prop])"
:style="initApiOtherType(scope.row[item.prop])[1] != 'show' ? 'cursor: pointer' : ''"
:title="'点击查看详情'"
:class="{ showDetailHover: item.type == 'showJsonTable' }"
>{{ scope.row[item.prop] ? scope.row[item.prop] + "" : scope.row[item.prop] }}</span>
<span
v-if="item.type == 'name' || !item.type"
@click="item.type == 'name' && inlineDialog(scope.row)"
:class="{ spamHover: item.type == 'name' }"
>{{ scope.row[item.prop] ? scope.row[item.prop] + "" : scope.row[item.prop] }}</span>
</el-form>
:class="{ showDetailHover: initApiOtherType(scope.row[item.prop])[1] != 'show' }"
>
{{ initApiOtherType(scope.row[item.prop])[0] }}
</span>
</template>
</u-table-column>
</template>
@ -375,11 +127,13 @@
:append-to-body="true"
:show-close="true"
:title="'内容详情'"
:close-on-click-modal="true"
:close-on-press-escape="true"
>
{{ showDetailData ? showDetailData + "" : showDetailData }}
</el-dialog>
<!-- json弹窗复制的json内容 -->
<!-- json弹窗 -->
<el-dialog
id="copyJsonTextarea_dialog_ref"
:visible.sync="showJsonCopy"
@ -574,6 +328,7 @@ export default {
showJsonData:null,//Json
showJsonData_str:null,//Json
showJsonCopy:false,//jsonDialog
initTypeList:['system.decimal','system.int64','system.int32','system.long']
};
},
computed: {
@ -693,7 +448,7 @@ export default {
} else if (item.width == '100%') {
item.width = ''
} else {
item.width =item.width ? item.width: "auto";
item.width =item.width ? item.width: 'auto';
}
}
return widthSize
@ -840,14 +595,15 @@ export default {
this.$emit("inlineDialog", row);
},
//
showDetailInfo(row) {
showDetailInfo(row,type) {
this.showDetailDialog = true
this.showDetailData = row
this.$emit("showDetailInfo", row);
this.showDetailData = type == 'time' ? formatTimeStrToStr(row) : row
this.$emit("showDetailInfo", this.showDetailData);
},
// jsontable
showJsonTable(row){
this.showJsonDialog = true
console.log(606,_json)
let _json = eval('(' + row + ')')
let _arr = []
let __initJson = (data) => {
@ -883,13 +639,18 @@ export default {
}
}
}
console.log(666,this.showJsonData)
this.showJsonData = _arr
this.showJsonData_str = JSON.stringify(JSON.parse(JSON.stringify(this.showJsonData)), null, '\t')
this.$emit("showJsonTable", row);
},
// Json
copyJsonHandle(){
console.log(651,window.isSecureContext)
this.showJsonCopy = true
if (navigator.clipboard && window.isSecureContext) {
navigator.clipboard.writeText(this.showJsonData_str)
.then(() => {
this.$message.success('复制成功');
@ -897,14 +658,31 @@ export default {
.catch(err => {
this.$message.error('复制失败');
});
}else {
// text area
const textArea = document.createElement('textarea')
textArea.value = this.showJsonData_str
// 使text areaviewport
document.body.appendChild(textArea)
textArea.focus()
textArea.select()
return new Promise((resolve, reject) => {
//
document.execCommand('copy') ? resolve() : reject(new Error('出错了'))
textArea.remove()
}).then(() => {
this.$nextTick(()=>{
if(this.$refs.copyJsonTextarea_ref){
this.$message.success('复制成功');
this.$refs.copyJsonTextarea_ref.focus()
this.$nextTick(()=>{
document.getElementById('copyJsonTextarea_dialog_ref').scrollTop = 0
})
}
})
},() => {
this.$message.error('复制失败');
})
}
},
//
buttonClick(row, index, label) {
@ -918,6 +696,36 @@ export default {
buttonOperationClick_right(row, item, index) {
this.$emit("buttonOperationClick_right", row, item, index);
},
//
initApiEnumList(item,data){
let _enumListOp = this.$store.getters.enumList[item.apiBaseType]
let _item_enumList = {}
_enumListOp.enumValues.forEach((item,key)=>{
_item_enumList[item] = _enumListOp.enumNames[key]
})
return _item_enumList[data] || '未定义'
},
// | | json
initApiOtherType(data){
try {
let _json = JSON.parse(data)
//
if(typeof _json == 'number' && _json){
return [data,'show']
}else{
return [data,'json']
}
}
//
catch(err){
return [data,'detail']
}
},
//
showTypeHandle(type,row){
if(type == 'detail')this.showDetailInfo(row)
if(type == 'json')this.showJsonTable(row)
},
},
};
</script>

89
Code/Fe/src/mixins/TableMixins.js

@ -48,6 +48,8 @@ export const tableMixins = {
URLOption_base:allUrlOption[this.$route.name].baseURL,
//主表-明细
URLOption_detail:allUrlOption[this.$route.name].detailURL,
//明细列表(主表明细找枚举转义使用)
URLOption_detailList:allUrlOption[this.$route.name].detailListURL,
// 主表-明细-筛选数据同步回显
detailSearchDataFE:null,
// 主表-操作列
@ -56,24 +58,16 @@ export const tableMixins = {
},
methods: {
// 获取通过api的表头数据,不可以在初始化处理,因为接口返回问题
initApiColumns(table,des,detailsTable,detailsPage){
// 赋值表头数据
// if(table && table[this.$route.name])this.apiColumns_Table = this.initTableColumns(table[this.$route.name])
if(des && des[this.$route.name])this.apiColumns_DesTions = des[this.$route.name]
if(detailsTable && detailsTable[this.$route.name])this.apiColumns_DetailsTable = this.initTableColumns(detailsTable[this.$route.name],'detail_api')
if(detailsPage && detailsPage[this.$route.name])this.apiColumns_DetailsPage = this.initTableColumns(detailsPage[this.$route.name],'detailPage_api')
},
//渲染数据
paging(callback) {
this.Loading.tableLoading = true;
this.PageListParams.SkipCount = (this.oldSkipCount - 1) * this.PageListParams.MaxResultCount
Promise.all([
getDtoColumnType(this.$route.name),
getPageList(this.PageListParams, this.URLOption_base)
]).then((allData) => {
// 表头处理
if(allData[0]){
let _coloums = allData[0].filter(item=>{
// initApiColumns(table,des,detailsTable,detailsPage){
// // 赋值表头数据
// // if(table && table[this.$route.name])this.apiColumns_Table = this.initTableColumns(table[this.$route.name])
// if(des && des[this.$route.name])this.apiColumns_DesTions = des[this.$route.name]
// if(detailsTable && detailsTable[this.$route.name])this.apiColumns_DetailsTable = this.initTableColumns(detailsTable[this.$route.name],'detail_api')
// if(detailsPage && detailsPage[this.$route.name])this.apiColumns_DetailsPage = this.initTableColumns(detailsPage[this.$route.name],'detailPage_api')
// },
// get-dto-column-type接口表头类型初始化
initApiColumnsForDto(data,list,titleName){
let _coloums = data.filter(item=>{
return item.dtoType == 'S'
})
let _Columns_Table = []
@ -81,15 +75,37 @@ export const tableMixins = {
let _data = _coloums[0].columnsTypes
_data.forEach(item=>{
let _item = {
label:initFromApiColumnsLable(this.$route.name + item.z_ColumnName) || item.z_ColumnName,
label:initFromApiColumnsLable(titleName + item.z_ColumnName) || item.z_ColumnName,
prop:firstWordSizeChange(item.z_ColumnName),
apiType:item.z_ColumnType,
isEnum:item.isEnum
apiBaseType:item.z_ColumnBaseType,
apiIsEnum:item.isEnum
}
// 如果list接口存在数据 ,与list接口返回字段比较处理,list接口存在的话则追加
let _if = firstWordSizeChange(item.z_ColumnName) != 'details'
if(list && list.length > 0){
_if = firstWordSizeChange(item.z_ColumnName) in list && firstWordSizeChange(item.z_ColumnName) != 'details'
}
if(_if){
_Columns_Table.push(_item)
}
})
}
this.apiColumns_Table = this.initTableColumns(_Columns_Table)
return _Columns_Table
},
//渲染数据
paging(callback) {
this.Loading.tableLoading = true;
this.PageListParams.SkipCount = (this.oldSkipCount - 1) * this.PageListParams.MaxResultCount
Promise.all([
getDtoColumnType(this.URLOption_base),
getPageList(this.PageListParams, this.URLOption_base)
]).then((allData) => {
// 表头处理
if(allData[0]){
let _Columns = this.initApiColumnsForDto(allData[0],allData[1].items[0] ,this.$route.name)
this.apiColumns_Table = this.initTableColumns(_Columns)
this.apiColumns_DesTions = _Columns
}
// 页面数据处理
if(allData[1]){
@ -97,17 +113,10 @@ export const tableMixins = {
this.totalCount = allData[1].totalCount
}
this.pagingCallback(callback)
console.log(111,this.apiColumns_Table,this.tableData)
}).catch(()=>{
}).catch((err)=>{
this.Loading.tableLoading = false
if(error_callback)error_callback()
})
// getPageList(this.PageListParams, this.URLOption_base).then(res => {
// this.tableData = res.items
// this.totalCount = res.totalCount
// this.pagingCallback(callback)
// }).catch(err => {
// this.Loading.tableLoading = false
// })
},
//接受排序信息并改变视图
sortChange(val) {
@ -147,7 +156,19 @@ export const tableMixins = {
this.Loading.DrawerLoading = true
this.displayDialog.detailsDialog = true;
let _url = this.URLOption_detail ? this.URLOption_detail : this.URLOption_base
getDetailed(val.id, _url).then(res => {
Promise.all([
getDtoColumnType(this.URLOption_detailList),
getDetailed(val.id, _url)
]).then((allData) => {
// 表头处理
if(allData[0]){
let _parentName = this.URLOption_detailList.substr(0,this.URLOption_detailList.indexOf('/'))
this.initApiColumnsForDto(allData[0],allData[1].details[0],_parentName)
this.apiColumns_DetailsTable = this.initTableColumns(this.initApiColumnsForDto(allData[0],allData[1].details[0],_parentName))
}
// 页面数据处理
if(allData[1]){
let res = allData[1]
// 打印使用的全部数据存储
this.tableDataDetails = JSON.parse(JSON.stringify(res))
this.propsData = res
@ -159,12 +180,11 @@ export const tableMixins = {
this.Loading.DrawerLoading = false
})
}
// 前端分页处理
// this.propsData = this.detailListPageFromFE(res)
}else{
this.Loading.DrawerLoading = false
}
}).catch(err => {
}
}).catch(()=>{
this.Loading.DrawerLoading = false
})
},
@ -277,7 +297,6 @@ export const tableMixins = {
// if( _item.name == 'search' || _item.name == 'moreList-search'){
// let _searchObj = {}
// let searchData = options.data_moreList.filters;
// console.log(299,searchData)
// searchData.forEach(item=>{
// _searchObj[item.column] = item.value
// })

35
Code/Fe/src/permission.js

@ -6,7 +6,6 @@ import 'nprogress/nprogress.css' // progress bar style
import { getToken } from '@/utils/auth' // get token from cookie
import getPageTitle from '@/utils/get-page-title'
import { asyncRoutes } from '@/router'
import { getInterfaceBoard } from "@/api/wms-interface"
import { login,getUsersByUserName } from "@/api/wms-auth"
NProgress.configure({
@ -19,6 +18,16 @@ router.beforeEach(async (to, from, next) => {
// set page title
document.title = getPageTitle()
// 获取枚举数据
if(!store.getters.enumList || store.getters.enumList.length <= 0){
await store.dispatch('definition/getEnumList')
}
// // 获取表头转义
// if(!store.getters.columZHList || store.getters.columZHList.length <= 0){
// await store.dispatch('definition/getColumZHList')
// }
// 判断是否自动登录
let isAutoLogin = JSON.parse(localStorage.getItem('isAutoLogin'))
const interfaceBoardColumnsNames = localStorage.getItem("interfaceBoardColumnsNames")
@ -52,11 +61,12 @@ router.beforeEach(async (to, from, next) => {
})
}
}else{
console.log('没有store.getters.currentUserInfo',store.getters.currentUserInfo)
// console.log('没有store.getters.currentUserInfo',store.getters.currentUserInfo)
if(!interfaceBoardColumnsNames){
console.log('没有interfaceBoardColumnsNames',interfaceBoardColumnsNames)
const accessRoutes = await store.dispatch('permission/getApiColumnsNames')
router.addRoutes(accessRoutes)
await store.dispatch('definition/getColumZHList')
// const accessRoutes = await store.dispatch('permission/getApiColumnsNames')
// router.addRoutes(accessRoutes)
next({
...to,
query:{
@ -91,14 +101,15 @@ router.beforeEach(async (to, from, next) => {
replace: true
})
}).catch(()=>{
next({
path:'/login',
query:{
isAutoLogin:to.query.isAutoLogin,
isSinglePage:to.query.isSinglePage
},
replace: true
})
next()
// next({
// path:'/login',
// query:{
// isAutoLogin:to.query.isAutoLogin,
// isSinglePage:to.query.isSinglePage
// },
// replace: true
// })
// next(`/login?loginName=${to.query.loginName}&isAutoLogin=${to.query.isAutoLogin}`)
// next(`/login`)
Message.error('获取用户信息失败,请重试!')

2
Code/Fe/src/router/index.js

@ -87,7 +87,7 @@ export let constantRoutes = [
name: 'Dashboard',
meta: {
keepAlive : true,
title: '系统首页',
title: localStorage.getItem('browserLanguage') == 'zh-Hans' ? '系统首页' : 'Dashboard',
icon: '系统首页',
outerFirst:true
// affix: true

2
Code/Fe/src/store/getters.js

@ -14,5 +14,7 @@ const getters = {
permission_routes: state => state.permission.routes,
errorLogs: state => state.errorLog.logs,
dictionaries: state => state.dictionaries.dict,
enumList: state => state.definition.enumList,
columZHList: state => state.definition.enumList,
}
export default getters

33
Code/Fe/src/store/modules/definition.js

@ -1,16 +1,39 @@
import { getInterfaceBoard,getApiEnumList } from "@/api/wms-interface"
const state = {
enumList: []
enumList: [],//枚举
columZHList:null,//表头转义
}
const mutations = {
GET_ENUM_LIST: (state, log) => {
state.logs.push(log)
GET_ENUM_LIST: (state, data) => {
state.enumList=data
},
GET_COLUMZH_LIST: (state, data) => {
state.columZHList=data
},
}
const actions = {
getEnumList({ commit }, log) {
commit('GET_ENUM_LIST', log)
// 获取枚举
getEnumList({ commit }) {
return new Promise(resolve => {
getApiEnumList().then(res=>{
commit('GET_ENUM_LIST', res.types)
resolve(res)
})
})
},
// 获取表头转义
getColumZHList({ commit }) {
return new Promise(resolve => {
getInterfaceBoard().then(res=>{
let _zh = res.resources[localStorage.getItem('columnsApiNamesZh')].texts;
localStorage.setItem("interfaceBoardColumnsNames",JSON.stringify(_zh))
commit('GET_COLUMZH_LIST', _zh)
resolve(res)
})
})
},
}

12
Code/Fe/src/store/modules/permission.js

@ -140,14 +140,14 @@ export function generaMenu(routes, data, first) {
}
// todo:接口返回的层级菜单,与查重后最终显示的菜单数组做查重及组合处理
export function initTreeMenusHandle(tree, list,zh,first) {
export function initTreeMenusHandle(tree, list,first) {
let _res = []
tree.forEach(item=>{
if(list.indexOf(item.name) >= 0){
item.title = zh[item.name] || item.name
item.title = JSON.parse(localStorage.getItem("interfaceBoardColumnsNames"))[item.name] || item.name
if(first)item.component = '@/layout'
if (item.children && item.children.length > 0) {
item.children = initTreeMenusHandle(item.children,list,zh)
item.children = initTreeMenusHandle(item.children,list)
}
_res.push(item)
}
@ -168,8 +168,6 @@ const actions = {
// resolve(accessedRoutes)
getDefinitionMenu(true).then(res => {
let _allConfig = res.auth.grantedPolicies;//所有配置
let _zh = res.localization.values[localStorage.getItem('columnsApiNamesZh')];
localStorage.setItem("interfaceBoardColumnsNames", JSON.stringify(_zh));
let _menuList = []//接口获取所有的菜单
for(let item in _allConfig){
let point_number = item.split('.').length - 1
@ -235,13 +233,13 @@ const actions = {
let _initTreeMenus = []
if(_treeMenusAll && _treeMenusAll.length > 0){
_initTreeMenus = initTreeMenusHandle(_treeMenusAll,_showMenus,_zh,true)
_initTreeMenus = initTreeMenusHandle(_treeMenusAll,_showMenus,true)
}else{
let _data = []
for(let i in _showMenus){
_data.push({name:_showMenus[i]})
}
_initTreeMenus = initTreeMenusHandle(_data,_showMenus,_zh,true)
_initTreeMenus = initTreeMenusHandle(_data,_showMenus,true)
}
// 最后查重+层级查重后的菜单
let _initEndMenus = generaMenu(asyncRoutes, _initTreeMenus,true)

8
Code/Fe/src/utils/detailsPageColumns_api/index.js

@ -3,7 +3,7 @@
import { initFromApiColumnsLable } from '@/utils/index'
// 测试数据
export const TestSchool = [
{ label: initFromApiColumnsLable('TestStudentDetailStudentName'), prop: "studentName" },
{ label: initFromApiColumnsLable('TestStudentDetailOrderType'), prop: "orderType" },
]
// export const TestSchool = [
// { label: initFromApiColumnsLable('TestStudentDetailStudentName'), prop: "studentName" },
// { label: initFromApiColumnsLable('TestStudentDetailOrderType'), prop: "orderType" },
// ]

8
Code/Fe/src/utils/detailsTableColumns_api/index.js

@ -4,7 +4,7 @@
import { initFromApiColumnsLable } from '@/utils/index'
// 测试数据
export const TestSchool = [
{ label: initFromApiColumnsLable('TestStudentDetailStudentName'), prop: "studentName" },
{ label: initFromApiColumnsLable('TestStudentDetailOrderType'), prop: "orderType" },
]
// export const TestSchool = [
// { label: initFromApiColumnsLable('TestStudentDetailStudentName'), prop: "studentName" },
// { label: initFromApiColumnsLable('TestStudentDetailOrderType'), prop: "orderType" },
// ]

8
Code/Fe/src/utils/tableColumns_api/index.js

@ -3,7 +3,7 @@
import { initFromApiColumnsLable } from '@/utils/index'
// 测试数据
export const TestSchool = [
{ label: initFromApiColumnsLable('TestSchoolSchoolName'), prop: "schoolName", fixed: "left" },
{ label: initFromApiColumnsLable('TestStudentDetailOrderType'), prop: "orderType" },
]
// export const TestSchool = [
// { label: initFromApiColumnsLable('TestSchoolSchoolName'), prop: "schoolName", fixed: "left" },
// { label: initFromApiColumnsLable('TestStudentDetailOrderType'), prop: "orderType" },
// ]

8
Code/Fe/src/utils/tabsDesTions_api/index.js

@ -3,7 +3,7 @@
import { initFromApiColumnsLable } from '@/utils/index'
// 测试数据
export const TestSchool = [
{ label: initFromApiColumnsLable('TestSchoolSchoolName'), prop: "schoolName", fixed: "left", type: "name" },
{ label: initFromApiColumnsLable('TestStudentDetailOrderType'), prop: "orderType" },
]
// export const TestSchool = [
// { label: initFromApiColumnsLable('TestSchoolSchoolName'), prop: "schoolName", fixed: "left", type: "name" },
// { label: initFromApiColumnsLable('TestStudentDetailOrderType'), prop: "orderType" },
// ]

15
Code/Fe/src/views/interfaceBoard/TestSchool.vue

@ -66,10 +66,10 @@
@goBack="goBack"
></newAndEdiDialog>
<!-- 明细查询页面 -->
<!-- :listColumns="apiColumns_DetailsPage" -->
<filterForDetailPage
@rowDropForDetail="rowDrop"
v-if="filterForDetailShow && apiColumns_DetailsPage"
:listColumns="apiColumns_DetailsPage"
v-if="filterForDetailShow"
:parentColumns="apiColumns_Table"
@closeDialog="changeFilterForDetailShow"
></filterForDetailPage>
@ -92,10 +92,10 @@ import { newAndEdiDialogMixins } from "@/mixins/newAndEdiDialogMixins"
import { mixins } from "@/mixins/mixins";
import { filterSelectMixins } from '@/mixins/filter-Select'
import { getToken } from '@/utils/auth'
import * as tableColumns_api from "@/utils/tableColumns_api/index" //
import * as tabsDesTions_api from "@/utils/tabsDesTions_api/index" //
import * as detailsTableColumns_api from "@/utils/detailsTableColumns_api/index" //-
import * as detailsPageColumns_api from "@/utils/detailsPageColumns_api/index" //
// import * as tableColumns_api from "@/utils/tableColumns_api/index" //
// import * as tabsDesTions_api from "@/utils/tabsDesTions_api/index" //
// import * as detailsTableColumns_api from "@/utils/detailsTableColumns_api/index" //-
// import * as detailsPageColumns_api from "@/utils/detailsPageColumns_api/index" //
export default {
name: "TestSchool",
@ -176,7 +176,8 @@ export default {
};
},
mounted() {
this.initApiColumns(tableColumns_api,tabsDesTions_api,detailsTableColumns_api,detailsPageColumns_api)
// 使api()
// this.initApiColumns(tableColumns_api,tabsDesTions_api,detailsTableColumns_api,detailsPageColumns_api)
this.paging();
},
}

10
Code/Fe/src/views/login/index.vue

@ -70,7 +70,6 @@
</div>
</template>
<script>
import { getInterfaceBoard } from "@/api/wms-interface"
import { login,getUsersByUserName } from "@/api/wms-auth"
export default {
name: 'Login',
@ -190,15 +189,6 @@ export default {
// // store.dispatch('user/setName',res)
// localStorage.setItem("currentUserInfo", JSON.stringify(res));
// })
getInterfaceBoard().then(result => {
localStorage.setItem("interfaceBoardColumnsNames", JSON.stringify(result.resources[_zh].texts));
this.$router.push({ path: '/'})
this.loading = false
})
.catch(err => {
this.$message.error('获取表头失败,请重试')
this.loading = false
})
// this.$router.push({ path: '/'})
// this.loading = false
})

Loading…
Cancel
Save