20241225 XlVirtualList解决数据量大,滚动后,再点下拉会出现空白
setTimeout(() => {
document.querySelector('.vxe-table--body').style.marginTop = 0
})
20241224双向数据绑定问题
- 加key
- 是否已有这个元素
- $set
- 慢半拍加$nextTick
:key="isPlan?scope.row.dblamount:null"
- 有结算计划时只能输入一个字就会失去焦点
20241213vue中Import加{}和不加{},有什么区别?
默认导出(default export)每个模块可以有一个默认导出,它可以是一个变量、函数或组件。当你导入默认导出时,不需要使用大括号{}
// MyComponent.js
export default function MyComponent() {
// ...
}
// App.js
import MyComponent from './MyComponent';
命名导出(named export):一个模块可以有多个命名导出。当你导入命名导出时,需要使用大括号{}。
// utils.js
export function funcA() {
// ...
}
export function funcB() {
// ...
}
// App.js
import { funcA, funcB } from './utils';
20211203 scoped样式穿透
<style lang="scss" scoped>
.menu-wrapper /deep/ .el-submenu__title
</style>
20241128 PinyinMatch
思路一:
computed: {
filterList() {
if (this.fieldtypesearch.length) {
return this.detailList.filter(val => {
return PinyinMatch.match(val.strdicttypecodeandname, this.fieldtypesearch)
})
} else {
return this.detailList
}
}
},
思路二:
<el-input
slot="reference"
v-model="currVal"
placeholder="请输入"
maxlength="250"
clearable
@change="changeEvent"
@input="inputEvent"
@focus="focusEvent"
/>
inputEvent(val) {
if (val) {
this.employeesList = this.copyList.filter((item) => {
return PinyinMatch.match(item.strfullname, val)
})
} else {
this.employeesList = this.copyList
}
},
20241113 提取后缀.ofd
function checkFile(fileValue) {
var index = fileValue.lastIndexOf(".");
var fileValueSuffix = fileValue.substring(index); // 获取文件后缀
if (fileValueSuffix.toLowerCase() === ".ofd") {
return "OFD"; // 文件是 OFD 类型
} else {
return "其他类型"; // 文件不是 OFD 类型
}}
// 示例用法var fileName = "example.ofd";var fileType = checkFile(fileName);
console.log("文件类型:" + fileType);
export function getFileExtendingName(filename) {
// 文件扩展名匹配正则
var reg = /\.[^\.]+$/
var matches = reg.exec(filename)
if (matches) {
return matches[0]
}
return ''
}
20241112 Vxe-table判断校验是第几行问题
<vxe-table
@valid-error="errorEvent"
>
方法一:
errorEvent({ row, rowIndex }) {
this.cellClickVxe({ row })
},
方法二:
errMap[Object.keys(errMap)[0]][0].row
20241107账套登录
http://192.168.0.115:9527/book/
system
gold12#$
用户组下新增
点新建
密码必须是gold
一键更新dblink
Portainer重启 xlykcb_global
如果启不来可能是.dmp比较旧
把最新打包的/xlykpub/发版记录/资金支出管控系统/V11.9.9.20250110/ce/空账套 下载XLYKCE.dmp
放到ftp 115里
/hrp/dbmanage/dbfiles里
.dmp要换成新的
登录:admin XLyk888888
20241106 Portainer登录
118上 admin goldgold
115上 admin jsp123456
20241106财政一体化数据中台登录
http://192.168.0.115:9527/fiscal/#/login?redirect=%2Fdashboard
admin XLyk888888
20241105北京CA
我这有个工具,你对比一下试试
https://demo-system.isignet.cn/signHelper/sign.html
20241028 el-tooltip
<el-tooltip v-if="widths !== 'auto'" class="item" effect="dark" :visible-arrow="false" :content="node.label" placement="top-start">
<span>{{ node.label }}</span>
</el-tooltip>
20240814formula计算
我把 表头和标题的 数字类型 合并成一个json variables 然后把 公式转成${variables.p212}*10 然后用eval(eval('`' + str + '`')) 计算
20241013replaceAll
if (column.property === 'strmainno') {
return value.replaceAll(',', '\n')
// return value.split(',').join('\n')
}
let str = "我是一段文本aaa";
let newStr = str.replace(/aaa/gm,"bbb")
//let newStr = str.replace(new RegExp("aaa","gm"),"bbb")
console.log(newStr) //我是一段文本bbb
if(!String.prototype.replaceAll){
String.prototype.replaceAll = function(str1,str2){
return this.replace(new RegExp(str1,"gm"),str2);
}
}
//用法:
let str = "我是一段文本aaa";
let newStr = str.replaceAll('aaa','bbb')
console.log(newStr) //我是一段文本bbb
20240813 12位整数两位小数校验
rules: {
dblquantity: [
{ required: true, message: '必填字段', trigger: 'blur' },
{
pattern: '^[1-9]\\d{0,11}(\\.\\d{1,2})?$|^0(\\.\\d{1,2})?$',
message: '整数最多12位小数2位',
trigger: 'blur',
transform: (value) => String(value)
}
],
Dblquantity2: [
{ required: true, message: '必填字段', trigger: 'blur' },
{
pattern: '^[1-9]\\d{0,11}$',
message: '整数最多12位',
trigger: 'blur',
transform: (value) => String(value)
}
],
}
checkQuantity(val, scope, item) {
if (
!/^(0\.(?!0+$)\d{1,2}|^[1-9][0-9]{0,11}(\.\d{0,2})?)$/.test(
scope.row.dblquantity * 1
)
) {
this.$message.error('输入最多12位整数2位小数!')
scope.row.dblquantity = ''
scope.row.totalprice = ''
return false
}
if (
!/^[1-9]\d{0,11}$/.test(
scope.row.dblquantity * 1
)
) {
this.$message.error('输入最多12位整数!')
scope.row.dblquantity = ''
scope.row.totalprice = ''
return false
}
}
dblcheckquantity: [
{ required: true, message: '必填字段', trigger: 'blur' },
{
pattern: '^[1-9]\\d{0,11}(\\.\\d{1,2})?$|^0(\\.\\d{1,2})?$',
message: '仅可输入最多12位整数+2位小数的正数',
trigger: 'change'
}
],
dblcurrprice: [
{ required: true, message: '必填字段', trigger: 'blur' },
{
pattern: '^[1-9]\\d{0,11}(\\.\\d{1,4})?$|^0(\\.\\d{1,4})?$',
message: '仅可输入最多12位整数+4位小数的正数',
trigger: 'change'
}
]
20240730vue自写组件可输入,可下拉选择
<el-popover
v-model="visible"
width="300"
trigger="focus"
:disabled="disabled"
>
<vxe-grid
ref="grid"
border
highlight-hover-row
auto-resize
height="300"
class="vxecss"
:show-overflow="true"
:data="employeesList"
:columns="tableColumn"
@cell-click="cellClickEvent"
@scroll="xTableScroll"
/>
<el-input
slot="reference"
v-model="currVal"
placeholder="请输入"
maxlength="250"
clearable
@change="changeEvent"
@input="inputEvent"
@focus="focusEvent"
/>
</el-popover>
methods: {
xTableScroll({ scrollTop }) {
this.xTableScrollTop = scrollTop
},
focusEvent() {
setTimeout(() => {
this.$refs.grid.scrollTo(0, this.xTableScrollTop)
if (this.lngemployeeid) {
const curRow = this.employeesList.filter(item => {
return item.lngemployeeid === this.lngemployeeid
})
this.$refs.grid.setCurrentRow(curRow[0])
}
})
},
cellClickEvent({ row }) {
this.visible = false
this.curRow = row
this.$emit('select', row)
},
20240730点击空白处,下拉隐藏(print)
this.$refs.select.blur() // 使select失去焦点 隐藏下拉框
<el-popover
v-if="!onlyStream"
v-model="showPrint"
placement="bottom"
trigger="manual"
>ddddd</el-popvoer>
mounted() {
document.addEventListener('click', this.closePop)
},
methods: {
// 点击空白处所有popover消失
closePop(e) {
if (e.target.className !== 'el-input__inner' && e.target.className !== 'el-input__clear'
) {
this.showPrint = false
}
}
}
20240704密码
/hrp/dbmanage/oracle
http://192.168.8.100:9527/book/#/index
GOLDgold1
admin
XLyk888888
供应商0100020/1qaz2wsx!@
公司wifi: xlyk123*#789
账号苗倩倩,密码abc123abc
公司外部禅道
http://81.68.150.48:900/zentao/my/
jiayufang
Aa@1123456789
20240726vxe-table 滚动到当前行,选中当前行
:key="tableKey"
return {
tableKey: 0,
this.tableKey = +new Date()
this.$refs.table.setActiveRow(addList)
this.$refs.table.setCurrentRow(addList)
0240703 sql
财政一体化数据库
select * from xlykfl0001.sysmenu t ;
动态列宽整体修改
select t.strtitle,t.intwidth from baselistcolumn t where t.lngmenuid=600038 for update;
update baselistcolumn t set t.intwidth=100 where t.strtitle='状态';
改变字段的sql
update sysmenu t set t.strurl='cashier-payments',t.strmenuen='CashierPayments',t.strviewurl='/second/index' where t.lngmenuid=600043;
update sysmenu t set t.strurl='cashier-payment',t.strmenuen='CashierPayment',t.strviewurl='/cashier-payment/cashier-payment/index' where t.lngmenuid=600044;
xlykce0001 gold yun
资金支出细表数据
select * from otherexecutedetail t order by t.lngotherexecuteid desc for update
查找身份证为空的人
update employee t set t.strcardno='Rqd/puyXhGX/ndGGhUyhW/5a3pKebU9DArWZ7vF1DyY=' where t.strcardno is null
Select * FROM (select *
from sysmenu t
where t.lngproductid = 313
start with t.strmenuname = '教学项目预算'
connect by prior t.lngmenuid = t.lngparentid) WHERE strmenuname = '生成预算方案';
select * from sysmenu t where t.lngmenuid=1015 or t.lngmenuid=1045 for update
select t.*,t.rowid
from sysmenu t
where t.lngproductid = 315
and (t.lngmenuid in (600038, 600040, 600057, 600058, 600063, 600065,600208)
or t.lngparentid in (600038, 600040, 600057, 600058, 600063, 600065,600208))
order by t.lngmenuid
select t.*,t.rowid
from sysmenu t
where t.lngproductid = 315
and (t.lngmenuid in (600060,600250, 600251,600252,600253)
or strmenuname like '%还款审批%')
order by t.lngmenuid
select t.*, t.rowid from SYSMENU t where t.lngproductid=311 order by lngmenuid desc
select t.*, t.rowid from SYSMENU t where t.lngproductid=311 and t.lngparentid=200003
select t.*, t.rowid from SYSMENU t where t.lngproductid=311 and t.strmenuname like '%平衡计分卡%'
select t.*, t.rowid from LISTSTYLE t where t.strkey like '%borrowapply%'
select t.strqrcode,t.lngreceipttypeid from xlykce0001.costexecute t where t.bytstatus=2;
用户解锁
alter user xlykcb0001 account unlock;
select * from sysmenu t where t.lngproductid=324 and t.lngmenuid in (1100302,1100202) for update
资金支出iframe数据库
select * from RECEIPTTYPEROUTE
SELECT * FROM XLYKCB0014.DEPARTMENT d WHERE STRDEPARTMENTCODE like '5501' FOR UPDATE ;
20240621数据库查询
20240610 部署
cd /hrp/publish
sh unistall
sh install
20240620部署gz包
tar –czvf ce.gz ce
http://192.168.8.188:9090/#/index
用户名:root 密码:gold
2024.6.17图片预览
export function pdfPreview(url) {
this.pdfUrl = (process.env.NODE_ENV === 'development' ? process.env.VUE_APP_BASEURL : `${this.baseapi}`) + '/fileweb/download/previewFileByUniqFileName?filename=' + url + '&dbKey=' + sessionStorage.getItem('dbKey')
window.open(this.pdfUrl)
}
this.pdfPreview(item.url)
2024.5.30 千位分割符,两位小数
this.sum= this.sumNum(data, column.property).toLocaleString('en', { minimumFractionDigits: column.editRender.props.limit })
// 千分位小数formatter
export function formatterThousandDecimal(row, column, cellValue) {
if ((cellValue !== null && cellValue) || cellValue === 0) {
cellValue = Number(cellValue).toFixed(2)
cellValue += ''
if (!cellValue.includes('.')) cellValue += '.'
return cellValue.replace(/(\d)(?=(\d{3})+\.)/g, function($0, $1) {
return $1 + ','
}).replace(/\.$/, '')
}
}
<el-table-column
v-if="bodyIntpreset.dblpriceIsview===0"
key="dblprice"
prop="dblprice"
:label="bodyIntpreset.dblpriceshowname"
min-width="140"
align="right"
:width="headWidth.dblprice"
:formatter="formatterThousandDecimal"
/>
<span v-if="pageType==='detail'">
{{ formatterThousandDecimal(null,null,scope.row.dblpayprice) }}
{{dblamount |currency}}
</span>
<div v-if="pageType === 'detail' && !isEdit('dblamount')">{{ scope.row.dblamount| currency }}</div>
import XEUtils from 'xe-utils'
export function formatterCommafyFixed(row, column, cellValue) {
return cellValue && XEUtils.commafy(XEUtils.toFixed(cellValue, 2))
}
this.allDblamount = XEUtils.commafy(XEUtils.toFixed(allDblamount, 2))
formatterThousandNews(cellValue) {
return cellValue && parseFloat(cellValue).toLocaleString('en-US', {
minimumFractionDigits: 0,
maximumFractionDigits: 4
})
},
{{ formatterThousandNews(scope.row[item.fieldname]) }}
合计:{{ choiceTotal }}
computed: {
choiceTotal() {
const sum = this.multipleSelection.reduce((acc, cur) => { acc += cur.dblamount; return acc }, 0)
return parseFloat(sum.toFixed(2)).toLocaleString()
}
},
computed: {
computedDblamount() {
return parseFloat(this.dblamount.toFixed(2)).toLocaleString()
},
2024.5.21 表头排序过滤
<vxe-table-column
min-width="260"
field="stritemname"
title="物品名称"
show-overflow
header-align="center"
:edit-render="{
name: '$select',
enabled: !(pageType === 'detail'),
}"
:filters="[{ data: '' }]"
:filter-method="filterItemMethod"
:filter-recover-method="filterItemRecoverMethod"
sortable
>
<template #header="{ column }">
<span>{{ column.title }}</span>
<DynamicFilter
ref="DynamicFilter"
:table-list="mainForm.consumedetailList"
:unique-value="mainForm.strreceiptno"
:default-list="copydetailList"
:column-name="'stritem'"
:is-filter="1"
:isinput="1"
:type-list="[1, 2, 3, 4]"
@setFilter="setFilterEvent"
@reset="reset"
@sort="sort"
/>
</template>
<!-- <template #filter="{ $panel, column }">
<input v-for="(option, index) in column.filters" :key="index" v-model="option.data" class="my-input" type="type" placeholder="按回车确认筛选" @input="$panel.changeOption($event, !!option.data, option)" @keyup.enter="$panel.confirmFilter()">
</template> -->
<template #default="{row}">
<span>{{ row.stritem }}</span>
</template>
<template #edit="scope">
<span>{{ scope.row.stritem }}</span>
</template>
</vxe-table-column>
2024.03.05数据库知识
密码:gold
20240308可用额计算
出差申请单/专项四个单子
第二行可用额=上一行可用额-申请金额
删除第一行,第一行可用额为最大可用额,所有额度重新计算
差旅报销单
第二行可用额=上一行可用额-报销金额
删除第一行,第一行可用额为最大可用额,所有额度重新计算
删除其他行,所有额度重新计算
如果是删除,并有申请金额
每组的第一条改变资金来源后,第二条要是预算额的最大值
最大可用额=最大可用额-申请金额
如果有原始申请额度,并且改变的报销金额比原始申请额度小,减原始申请额度,否则减当前额度
支出申请单
第二行可用额=上一行可用额-申请金额
删除第一行,第一行可用额为最大可用额,所有额度重新计算
每组的第一条改变资金来源后,第二条要是预算额的最大值
支出报销单
同差旅报销单
20240316 headerClassVxe
import { headerIconEditVxe, headerClassVxe } from '@/base/utils'
<vxe-table
:header-cell-class-name="headerIconEditVxe"
<el-table
:header-cell-class-name="headerIconEdit"
<el-table-column
label-class-name="tableHeaderEdit tableHeaderStar"
<vxe-table-column
header-class-name="vxetableHeaderEdit vxetableHeaderStar"
2024.5.15 el与vxe都校验
1.all:写上字红框会消失,单独vxe校验:失去焦点红框消失
2.all:只用el校验文本框不用点两次
3.只用vxe,可以不用写<el-form-item>
2024.3.19数字校验
data() {
const validatePass = (rule, value, callback) => {
if (value === '' || value === null) {
callback(new Error('请输入密码'))
} else if (passwordChina(value)) {
callback(new Error('不能包含汉字'))
} else if (!this.setRulues(value)) {
if (this.complicatedWrod) {
callback(new Error(this.setRuluesMeass()))
} else {
callback()
}
}
callback()
}
return {}
}
rules: {
pwd: [
{ required: true, message: '密码不能为空', trigger: 'blur' },
{ validator: validatePass, trigger: 'blur' }
]
}
20240318选择器
document.querySelector('.continuitys-warp').scrollTop = 0
closePopOver() {
this.$refs.printBtn && this.$refs.printBtn.$el.click()
},
const myField = this.$refs.textarea.$el.children[0]
// 锚点跳转
goAnchor(selector, index) {
this.activeBtn = index
this.$el.querySelector(selector).scrollIntoView()
},
20240402获取响应头里的参数
const zipname = res.responseHeader['content-disposition'].split("''")[1]
20240407加路由
一级
Strmenuname:保障金管理
strurl: /security-fund
Stricon:
Strmenuen:SecurityFund
strviewurl: layout
二级
Strmenuname:验收入库
strurl:high-acceptance-storage
Stricon:asset_assets_warehousing
strmenuen:HighAcceptanceStorage
strviewurl: /second/index
三级
Strmenuname:数据字典对照
strurl: xlyk-dict-match
strmenuen: XlykDictMatch
strviewurl:/asset-data/xlyk-dict/xlyk-dict-match
20240409 el-select 下拉没有数据但是还显示着名称
解决办法:加key
2024.4.19清空表单
this.drawerForm = this.$options.data.call(this).drawerForm
this.formInline = this.$options.data().formInline
2024.4.22输入的字符串转数字
// 将输入的字符串转换为数字
const num = parseFloat(value);
const num = (“123”)*1
2024.4.23自定义过滤器,保留两位小数
// 自定义过滤器,确保金额精确到指定小数位数
Vue.filter('currency', function(value, currency, decimals) {
if (!value) return '0.00';
value = parseFloat(value).toFixed(decimals);
return currency + value;
});
// 使用自定义过滤器
<span>{{ item.amount | currency '¥' 2 }}</span>
computed: {
computedDblamount() {
return parseFloat(this.dblamount.toFixed(2)).toLocaleString()
},
}
2024.4.24发票验真
invoicebaseinfo 保存成功
保存成功!验真结果:税局服务异常,建议15-20分钟后重试!
2024.4.26 重新渲染table
this.$nextTick(() => {
this.$refs.table.doLayout()
this.$refs.table.updateData(newValue)
})
<el-talbe
:row-key="getRowKey"
>
<vxe-table
:row-config="{useKey:true}"
>
<el-table-column
v-if="has['Approval']"
type="checkbox"
width="50"
align="center"
reserve-selection
fixed="left"
/>
return{
getRowKey: row => {
return row.lngborrowapplyid
},
}
2024.4.30重新渲染vxe-table
this.$nextTick(() => {
this.tableKey = +new Date()
// this.$refs.table.refreshColumn()
this.$refs.table.recalculate()
const vxeColumns = this.$refs.table.getColumns()
this.$refs.table.loadColumn(vxeColumns)
this.$refs.grid.loadData(this.copyList)
})
2024.5.6vxe-table多选回显
<vxe-table
ref="table"
@checkbox-all="selectChangeEvent"
@checkbox-change="selectChangeEvent"
>
selectChangeEvent({ records, reserves }) {
this.currentRow = [...reserves, ...records]
}
<el-table
ref="table"
v-loading="listLoading"
:data="tableData"
:row-key="getRowKey"
border
stripe
:height="tableHeight"
:header-cell-style="{'background':'#F5F4F7'}"
@selection-change="handleSelectionChange"
>
<el-table-column
v-if="$route.query.isMult==='many' || multiContractIds.length>0"
type="selection"
:reserve-selection="true"
width="50"
align="center"
fixed="left"
/>
</el-table>
getRowKey: row => {
return row.lngcontractinitid
},
2024.5.8 vxe-table校验
validRules:{
emgMoney: [
校验字段: [{
validator (e) {
if (e.row.行内条件字段属性=="1"&&!e.cellValue) {
return new Error('xxxx不能为空!')
}
}
}
],
},
vxeRules: {
name: [
{ required: true, message: '请输入' },
{ validator: nameValid }
],
},
validRules: {
lngoutitemid: [{
validator(e) {
if (!(e.row.blnissettleplan === 1 && !e.row.dblamount) && !e.cellValue) {
return new Error('必填项')
}
}
}],
data() {
const validateUsername = (rule, value, callback) => {
if (!value) {
callback(new Error('请输入用户名'))
}
if (!validUsername(value)) {
callback(new Error('请输入正确的用户名'))
} else {
callback()
}
}
return{}
}
//validator里有message,rules里不用写message
Rules:{
username: [{ required: true, trigger: 'blur', validator: validateUsername }]}