2024问题总结

20241225 XlVirtualList解决数据量大,滚动后,再点下拉会出现空白

setTimeout(() => {

document.querySelector('.vxe-table--body').style.marginTop = 0

})

20241224双向数据绑定问题

  1. 加key
  2. 是否已有这个元素
  3. $set
  4. 慢半拍加$nextTick

:key="isPlan?scope.row.dblamount:null"

  1. 有结算计划时只能输入一个字就会失去焦点

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 }]}

相关推荐
AC-PEACE14 分钟前
Vue 中 MVVM、MVC 和 MVP 模式的区别
前端·vue.js·mvc
播播资源17 分钟前
ChatGPT付费创作系统V3.1.3独立版 WEB端+H5端+小程序端 (DeepSeek高级通道+推理输出格式)安装教程
前端·ai·chatgpt·ai作画·小程序·deepseek·deepseek-v3
冷琴199625 分钟前
基于Python+Vue开发的反诈视频宣传管理系统源代码
开发语言·vue.js·python
zhrb1 小时前
打开Firefox自动打开hao360.hjttif.com标签解决方案
前端·firefox
安大桃子1 小时前
Cesium实现深色地图效果
前端·gis·cesium
程楠楠&M1 小时前
uni-app(位置1)
前端·javascript·uni-app·node.js
破z晓1 小时前
uniapp 整合openlayers 编辑图形文件并上传到服务器
前端·javascript·uni-app
码农君莫笑1 小时前
Linux系统上同时打印到物理打印机并生成PDF副本方法研究
linux·前端·chrome·打印·信管通
xlxxy_1 小时前
ABAP数据库表的增改查
开发语言·前端·数据库·sql·oracle·excel
m0_748257461 小时前
创建一个简单的spring boot+vue前后端分离项目
vue.js·spring boot·后端