模板名称
区域设置
:disabled="isDis"
:multiple="true"
v-model="aModel.areaCodeArr"
filterable
clearable
:linline="false"
>
v-for="(o, i)in regionOptions"
:key="i"
:value="o.businessCityId"
:label="o.businessCityName"
/>
模板字段
v-for="oin templateFields"
:key="o.code"
:disabled="isDis || o.isMust"
@on-change="itemArrChange(o.code)"
:label="o.code"
:value="o.isMust">
{{ o.name }}
已选字段
:class="['dragItem', o.code ===dragEnter ?'dragEnter' :'']"
v-for="(o, i)in aModel.itemModelList"
:key="i +1"
:label="o.code"
:disabled="o.isMust">
{{ o.name }}
v-else
class="dragLabel"
draggable="true"
@dragstart="dragstart(o)"
@dragenter="dragenter(o)"
@dragend="dragend(o)">
{{ o.name }}
预览模板
stripe
:loading="tableLoading"
:columns="columns"
:data="tableData"
/>
import sortSvgfrom '@/assets/images/sort.png'
import resetPagefrom '@/mixins/resetPage'
import {save, read }from '@/storage'
import combinTablefrom '@/mixins/combinTable'
import {mapActions }from 'vuex'
import {customerCategorys, templateTypes }from '@/constants/rulesConfig'
export default {
name:'EditTemplate',
mixins: [combinTable, resetPage],
props: {},
data () {
return {
sortSvg,
subLoad:false,
aModel: {
id:'',
areaCode:'',
areaCodeArr: [],
areaName:'',
itemModelList: [],
itemName:'',
itemCode:'',
itemArr: [],
name:'',
typeCode:''
},
templateTypes,
customerCategorys,
btnModel: {
outputBtu: {
btuName:'导出',
postion:'right',
icon:'iconexport',
fontFamily:'business_ui',
type:'icon',
disabled:false
},
settingBtu: {
slot:true,
btuName:'表格设置', // 按钮名称
postion:'right', // 位置区域
icon:'iconconfiguration-form',
fontFamily:'business_ui',
hide:false,
type:'icon' // 按钮等级
}
},
columns: [],
tableData: [],
templateFields: [],
typeLoading:false,
tableLoading:false,
regionOptions: [],
templatetypeList: [],
queryModel: {
typeCode:''
},
records: {},
templateId:'',
templatePageType:'',
isDis:false,
dragItem: {
oldItem: {},
newItem: {},
isActive:undefined
},
dragEnter:''
}
},
activated () {
this.templateId =read('templateId')
this.templatePageType =read('templatePageType')
this.isDis =this.templatePageType ==='SEE'
this.getDefaultConfig()
},
deactivated () {
// this.setDefault()
},
watch: {
'aModel.itemArr': {
handler (list) {
if (this.templateFields.length) {
this.tableLoading =true
// 表头
this.columns = list.map((li, index) => {
let obj =this.templateFields.find(a => a.code === li)
if (obj) {
return {
title: obj.name,
key: obj.code,
tooltip:true,
width: obj.name.length *30,
fixed: (index ===0 ?'left' :'')
}
}else {
return {}
}
})
// 已选数据
this.aModel.itemModelList =this.columns
.map(a => {
return {name: a.title, code: a.key }
})
this.columns &&this.columns.length &&
this.formatTableColumns(this.columns, document.querySelector('.previewTitle').offsetWidth)
let obj = {}
// 填充表格
list.forEach(co => {
Object.defineProperty(obj, co, {
value:'',
writable:false
})
return obj
})
this.tableData =Array.from({length:8 },
(v, i) => {
obj.id = i
return obj
})
this.tableLoading =false
}
},
immediate:true
},
'aModel.name' (name) {
this.aModel.name = name.trim()
}
},
methods: {
...mapActions([
'billTemplateItemList', // 全量模板字段
'getUserAreaInfo',
'updateBillTemplate',
'addBillTemplate',
'getTemplateInfo'
]),
async getDefaultConfig () {
const {
templateId,
templatePageType,
getUserAreaInfo,
getTemplateInfo,
billTemplateItemList
} =this
// 模板字段
this.tableLoading =true
let bType =await billTemplateItemList({typeCode:read('typeCode') })
if (bType.data && bType.data.length) {
// 默认的全量字段
this.templateFields = bType.data
// 必选字段需要保存
let tempItemArr = [...this.aModel.itemArr]
bType.data
.filter(a => {
return a.isMust && !this.aModel.itemArr.some(c => c === a.code)
})
.forEach(a => {
tempItemArr.push(a.code)
})
this.aModel.itemArr = [...tempItemArr]
this.tableLoading =false
}
// 新建、编辑、复制、查看
if (templatePageType !=='ADD') {
if (templateId) {
let info =await getTemplateInfo(templateId)
Object.assign(this.aModel, this.$utils.pick(
info.data,
'id',
'areaCode',
'areaName',
'name',
'itemModelList',
'typeCode'
))
const { itemModelList, areaCode } = info.data
this.aModel.areaCodeArr = areaCode.split(',')
// 模板字段中存在该字段才加入到用户已选数据
this.aModel.itemArr = itemModelList
.filter(t =>this.templateFields.some(s => s.code === t.code))
.map(a => a.code)
// 复制当前模板则去掉id
if (templatePageType ==='COPY') {
this.aModel.name =this.aModel.name +'(1)'
delete this.aModel.id
}
}
}else {
for (let iin this.$data.aModel) {
i !=='itemArr' && (this.$data.aModel[i] =this.$options.data.call(this).aModel[i])
}
}
// 新建需要加typeCode
this.aModel.typeCode =read('typeCode')
// 区域
let res =await getUserAreaInfo()
if (res.data) {
let regionArr =Array.isArray(res.data) ? res.data : []
this.regionOptions = regionArr
this.typeLoading =false
}
},
throttleSave () {
this.$utils.throttle(this.saveForm, 450)
},
async saveForm () {
const {
aModel,
addBillTemplate,
updateBillTemplate,
regionOptions,
$utils
} =this
// 校验
if (!aModel.name) {
this.$message({type:'warning', message:`请填写模板名称` })
return
}
if (!aModel.areaCodeArr || !aModel.areaCodeArr.length) {
this.$message({type:'warning', message:`请选择区域设置` })
return
}
let params = $utils.pick(
aModel,
'id',
'areaCode',
'areaName',
'itemModelList',
'itemName',
'itemCode',
'name',
'typeCode'
)
params.areaCode = aModel.areaCodeArr.join(',')
params.areaName = regionOptions
.filter(r => aModel.areaCodeArr.some(a => a === r.businessCityId))
.map(r => r.businessCityName).join(',')
// 处理成后台需要的数据
for (let iin params.itemModelList) {
params.itemName =`${params.itemName}${i !=='0' ?',' :''}${params.itemModelList[i].name}`
params.itemCode =`${params.itemCode}${i !=='0' ?',' :''}${params.itemModelList[i].code}`
}
this.subLoad =true
try {
let res = params.id
?await updateBillTemplate(params)
:await addBillTemplate(params)
if (res.status ===200) {
// 新建或复制的则存一下id保证刷新后页面变为编辑页面
if (!params.id) {
this.aModel.id = res.data
save('templateId', res.data)
save('templatePageType', 'EDIT')
}
this.$message({type:'success', message:`${params.id ?'修改成功' :'新建成功'}` })
}
this.subLoad =false
}catch (err) {
this.subLoad =false
}
},
dragstart (val) {
this.oldItem = val
this.isActive = val
},
dragend (val) {
if (this.oldItem !==this.newItem) {
let oldIndex =this.aModel.itemModelList.indexOf(this.oldItem)
let newIndex =this.aModel.itemModelList.indexOf(this.newItem)
let newItems = [...this.aModel.itemModelList]
newItems.splice(oldIndex, 1)
newItems.splice(newIndex, 0, this.oldItem)
this.aModel.itemArr = [...newItems].map(a => a.code)
this.$message({type:'warning', message:'点击【保存模板】按钮后顺序才会保存' })
this.isActive = -1
}
this.dragEnter =''
},
// 记录移动过程中信息
dragenter (val) {
this.dragEnter = val.code
this.newItem = val
},
itemArrChange (code) {
this.aModel.itemArr.push(code)
},
setDefault () {
save('templateId', '')
save('templatePageType', 'SEE')
},
findName (dicts, code) {
if (this[dicts]) {
if (code) {
let obj =this[dicts].find(s => s.value === code ?0 :1)
if (obj) {
return obj.label
}
}else return '-'
}else return '-'
},
goBack () {
this.jumpTo('/spm/templateManage/templateList', '对账单模板管理', {}, `/spm/templateManage/editTemplate`)
}
}
}
@deep: ~'>>>';
.sh-header {
position:relative;
border-bottom:1px solid #DCDCDC;
display:flex;
align-items:center;
margin-bottom:20px;
}
.sh-content {
width: ~'calc(100% - 240px)';
}
.leftMenu {
color:#262626;
border:1px solid #DCDCDC;
min-height:500px;
p {
padding:10px;
font-size:14px;
text-align:left;
border-bottom:1px solid #EEEEEE;
}
.menuItem {
padding:10px;
font-size:14px;
cursor:pointer;
border-bottom:1px solid #EEEEEE;
}
.menuItemActive {
color:#3377FF;
}
.items {
display:flex;
flex-direction:column;
@{deep}.sh-checkbox-wrapper {
display:flex;
margin:0;
padding:7px 5px;
}
}
.dragWrapper {
.dragItem {
font-size:12px;
display:flex;
padding:7px 0 0 5px;
align-items:center;
cursor:pointer;
-webkit-touch-callout:none;
-webkit-user-select:none;
-khtml-user-select:none;
-moz-user-select:none;
-ms-user-select:none;
user-select:none;
.sortNum {
color:#ABABAB;
width:18px;
height:100%;
}
.dragLabel {
display:flex;
padding:4px 10px 7px 4px;
align-items:center;
justify-content:space-between;
flex:1;
border-bottom:1px solid #EEE;
}
.sortImage {
opacity:0.4;
width:14px;
height:14px;
float:right;
}
}
.dragItem:hover {
box-shadow:0px 0px 2px rgba(0, 0, 0, 0.2);
border-bottom:1px dashed #EEE;
}
.dragEnter {
box-shadow:0px 0px 5px rgba(0, 0, 0, 0.6);
}
}
}
.previewTitle {
width:100%;
text-align:center;
padding-bottom:14px;
}
.contentLay .sh-article {
padding-top:0;
}
.flip-list-move {
transition:transform 0.3s ease-in;
}
你可能感兴趣的:(2021-10-26 vue 拖拽)
- vue keep-alive标签的运用
keep-alive,想必大家都不会很陌生,在一些选项卡中会使用到。其实,它的作用大概就是把组件的数据给缓存起来。比如果我有一个选项卡,标签一,标签二,标签三。现在,我需要实现,当我在标签一的表单中输入内容后,点击标签二,再回到标签一,表单的内容依然存在。如果按以往的做法,不使用keep-alive,那是不能实现的。然而,我们只需要在选项卡的内容最外层包一个keep-alive标签即可。但这儿有一
- Vue3+Vite+TS+Axios整合详细教程
老马聊技术
VueViteTSvue.js
1.Vite简介Vite是新一代的前端构建工具,在尤雨溪开发Vue3.0的时候诞生。类似于Webpack+Webpack-dev-server。其主要利用浏览器ESM特性导入组织代码,在服务器端按需编译返回,完全跳过了打包这个概念,服务器随起随用。生产中利用Rollup作为打包工具,号称下一代的前端构建工具。vite是一种新型的前端构建工具,能够显著的提升前端开发者的体验。它主要有俩部分组成:一个
- 本地包解决npm error code E404
雅痞yuppie
npm前端node.js
这个错误提示表明npm找不到名为create-vue-admin-cli的包。这是因为你开发的CLI工具还没有发布到npm官方注册表。要解决这个问题,有两种方法:方法一:使用本地开发模式测试1.确保你的CLI已正确链接到全局在你的vue-admin-cli项目根目录下执行:npmlink这会在全局环境中创建一个符号链接,指向你本地的CLI项目。2.使用本地链接的CLI创建项目直接使用命令:vue-
- [Vue warn]: onUnmounted is called when there is no active component instance to be associated with
扬帆起航&d
vue.jsjavascript前端ecmascript前端框架
[Vuewarn]:onUnmountediscalledwhenthereisnoactivecomponentinstancetobeassociatedwith.LifecycleinjectionAPIscanonlybeusedduringexecutionofsetup().Ifyouareusingasyncsetup(),makesuretoregisterlifecyclehoo
- Vue3组件库实战: 打造高复用UI系统
武昌库里写JAVA
面试题汇总与解析课程设计springbootvue.jslayui毕业设计
Vue3组件库实战:打造高复用UI系统介绍什么是Vue3组件库在前端开发中,UI组件库是非常重要的一部分。Vue3组件库是基于Vue.js3.x版本开发的一套可用于构建Web应用的UI组件集合,可以帮助开发者快速搭建页面并保证页面的一致性和美观性。目标关键词:Vue3组件库设计与构建设计原则组件库的设计需要遵循一定的原则,比如易用性、可维护性、扩展性等。在设计阶段需要考虑到不同场景的使用,并且保证
- Ubuntu基础(Python虚拟环境和Vue)
aaiier
ubuntupythonlinux
Python虚拟环境sudoaptinstallpython3python3-venv进入项目目录cdXXX创建虚拟环境python3-mvenvvenv激活虚拟环境sourcevenv/bin/activate退出虚拟环境deactivateVue安装Node.js和npm#安装Node.js和npm(Ubuntu默认仓库可能版本较旧,适合入门)sudoaptinstallnodejsnpm#验
- GoView 强势入驻 GitCode:拖拽低代码,打造高颜值数据大屏
GitCode 代码君
gitcode低代码开源
信息可视化时代,数字大屏日益成为展示核心KPI、运营状态、监控预警的主流形式。然而,用传统方式开发一个定制化数字大屏需要解决多少问题?1.繁复的数据源集成,各种不同的协议和格式……2.让人晕头转向的可视化逻辑,调动艰难的样式、布局、动画,和往往难以统一的风格3.牵一发而动全身的代码结构,就想换个主题色结果开启的全局CSS大冒险……现在,一个开源项目即可搞定上述问题——拖拽式低代码数字可视化平台Go
- vue3面试题(个人笔记)
武昌库里写JAVA
面试题汇总与解析课程设计springbootvue.jsjava学习
vue3比vue2有什么优势?性能更好,打包体积更小,更好的ts支持,更好的代码组织,更好的逻辑抽离,更多的新功能。描述Vue3生命周期CompositionAPI的生命周期:onMounted()onUpdated()onUnmounted()onBeforeMount()onBeforeUpdate()onBeforeUnmount()onErrorCaptured()onRenderTrac
- el-timeline时间线(Plus)左边图标改为自定义图片
顾尘眠
javascript前端vue.js
(目前图片有点小,还需要自己去调整下大概样式,比较懒,就放了个大概样子)时间线左侧正常根据文档内容,是填写的icon,但通过icon属性还有另外一个类型,component,可以搭配h函数写一组img元素,实现将图标改为本地图片{{activity.content}}import{h}from'vue'constactivities=[{content:'Eventstart',timestamp
- vue3 + Element Plus 系统主题切换
顾尘眠
vue.js前端javascript
创建主题管理模块(用于配置颜色变量)新建src/utils/theme.tsimport{ref,watchEffect}from'vue'typeThemeType='light'|'dark'|'system'//主题配置constthemeConfig={light:{'--el-color-primary':'#409eff','--bg-color':'#ffffff','--text-
- Vue.js 过渡 & 动画
lsx202406
开发语言
Vue.js过渡&动画引言在Web开发中,过渡与动画是提升用户体验的关键元素。Vue.js作为一款流行的前端框架,提供了强大的过渡与动画功能,使得开发者能够轻松实现丰富的交互效果。本文将深入探讨Vue.js中的过渡与动画,包括其原理、应用场景以及实现方法。一、Vue.js过渡原理Vue.js过渡是利用CSS3的transition属性实现的。当Vue.js侦测到数据变化时,会自动触发过渡效果。过渡
- Javaweb学习之Vue模板语法(三)
不要数手指啦
vue.js学习前端
目录学习资料前情回顾本期介绍(vue模板语法)文本插值Vue的Attribute绑定使用JavaScript表达式综合实例代码:学习资料Vue.js-渐进式JavaScript框架|Vue.js(vuejs.org)前情回顾项目的创建大家可以看这篇文章Vue学习之项目的创建-CSDN博客本期介绍(vue模板语法)首先,找到我们编写代码的地方找到自己项目的src文件夹,打开之后点击component
- Vue3 tailwindcss
1、安装tailwindcsspnpmi-Dtailwindcsspostcssautoprefixer#yarnadd-Dtailwindcsspostcssautoprefixer#npmi-Dtailwindcsspostcssautoprefixer2、创建TailwindCSS配置文件npxtailwindcssinit-ptailwind.config.js/**@type{impor
- Vue框架之模板语法全面解析
AA-代码批发V哥
Vuevue.js
Vue框架之模板语法全面解析一、模板语法的核心思想二、插值表达式:数据渲染的基础2.1基本用法:渲染文本2.2纯HTML渲染:`v-html`指令2.3一次性插值:`v-once`指令三、指令系统:控制DOM的行为3.1条件渲染:`v-if`与`v-show`3.1.1`v-if`:动态创建/销毁元素3.1.2`v-else`与`v-else-if`:条件分支3.1.3`v-show`:动态显示/
- 封装一个有最小化的dialog组件
嘉琪001
javascript前端css
{{title}}最小化关闭温馨提示:当您开启医学白板并最小化界面时,离会前先关闭白板(观看者无需操作)。{{title}}import{ElMessageBox}from'element-plus'import{defineComponent,ref,watch}from'vue'exportdefaultdefineComponent({name:'CustomDialog',props:{v
- JQ+vue实现图片拼接(无限套娃版)
小周同学:
jsvuejqueryvue.jsjavascriptjquery
css样式/*css初始化*/*{margin:0;padding:0;}/*去掉li的小圆点*/li{list-style:none;}/*去掉a的下划线*/a{text-decoration:none;}/*搜索框去除边框*/input,button,select{border:0;/*设置背景颜色为透明*/background-color:transparent;/*去掉外轮廓*/outli
- vue如何实现Cascader 级联选择器(二级全部选中只展示一级,三级全部选中只展示二级)
小周同学:
vuevue.js
select提交重置级联exportdefault{data(){return{ruleForm:{selectLabel:[],idList:[],},citiesList:[],rules:{selectLabel:[{type:'array',required:true,message:'多选不能为空',trigger:'change'}],},props:{multiple:true,va
- uniapp 如何封装实现任意页面都能使用的全局弹窗
代码简单说
2025开发必备(限时特惠)uni-appvue.jsjavascriptuniapp全局弹窗uniapp弹窗组件
【实战干货】uniapp如何封装实现任意页面都能使用的全局弹窗标签:uniapp弹窗组件全局弹窗Vue动态渲染跨页面弹窗✨前端老司机亲授,uniapp无法在所有页面中直接用自定义弹窗?别急,一招动态挂载vue实例,优雅解决!背景故事:一个被“弹窗”搞崩溃的早晨作为一名前端开发工程师,有一天我在给uniapp项目加IM消息功能,需求是:不论当前用户在哪个页面,只要有消息来,就要立即弹出提示窗口。听起
- 【前端】接口日志追踪
毕业茄
前端
1.问题描述场景:前端提交数据后,接口回调再次添加参数,但页面跳转/刷新导致之前的console.log数据丢失。影响:无法追踪完整的请求流程,调试困难。2.环境信息项目说明浏览器GoogleChrome120+开发者工具ChromeDevTools技术栈前端:Vue/React/其他接口类型RESTfulAPI/GraphQL3.解决方案3.1保留控制台日志(推荐)步骤:打开Chrome开发者工
- uniapp对接unipush 1.0 ios/android
车轮滚滚__
uni-appiosandroid
配置注意需要打包自定义基座之后在手机上运行自定义基座才可以!官方有文档可以根据文档来我这里用的是1.0为什么没有2.0因为2.0要用uinicloud注意每次打包之后cid都会变cid用户的标识iduniapp通过这个id可以把消息推送给指定人前端代码前端要做的很简单直接放到app.vue中onLaunch钩子中即可麻烦的在后端和个推的对接onPushMessage(that){//#ifdefA
- uniapp自定义全局弹窗组件
LuWiHa
uni-appjavascript前端
可以参考一下方法,如果大家有更好的全局弹窗方法欢迎留言//使用方法//在main.js里全局注册importglobalModalfrom'./components/global-popup.vue'Vue.component('global-popup',globalModal)//在需要的页面引用组件this.$refs.globalModal.openPopup({title:'标题',co
- python+springboot+vue的音乐系统
QQ_511008285
pythonspringbootvue.jsdjangoflasknode.jsphp
目录技术栈介绍具体实现截图系统设计研究方法:设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示技术栈介绍Django-SpringBoot-php-Node.js-flask本课题的研究方法和研究步骤基本合理,难度适中,本选题是学生所学专业知识的延续,符合学生专业发展方向,对于提高学生的基本知识和技能以及钻研能力有益。该学生能够在预定时间内完成该课题的设计。
- GitHub Actions自动化部署Vue项目到宝塔服务器
SnowDreamXUE
github自动化vue.js
GitHubActions自动化部署Vue项目到宝塔服务器通过GitHubActions自动化部署Vue项目到宝塔服务器,可实现代码推送后自动构建和部署,极大提升开发效率,减少人工操作错误。整个流程包括服务器环境准备、SSH密钥对生成与配置、GitHub仓库配置以及GitHubActions工作流配置四个关键步骤。这套方案特别适合个人开发者和小型团队,无需依赖复杂的云服务或付费部署工具,即可实现高
- vue基础
知还215
vue.js前端javascript
在vue项目下的src->App.vue中有三个模板1.script是写js代码的地方2.template是写html的地方3.style是写css的地方npmi的作用是加载需要的依赖包
- 极简Vue 3应用:从入门到掌握核心概念
程序猿全栈の董(董翔)
vue.js前端javascript
Vue.js作为一款渐进式JavaScript框架,以其直观的API和灵活的架构受到广泛欢迎。对于初学者而言,Vue官方CLI生成的项目结构可能略显复杂,包含了各种资源文件、样式和示例组件。本文将介绍如何创建一个最简洁的Vue3应用,帮助你专注于核心概念的学习。为什么需要最简Vue应用?VueCLI默认生成的项目包含:assets目录:存放图片、字体等资源components目录:包含多个示例组件
- node.js、npm是什么?服务器脚本语言有哪些?
文章目录1.node和nodejs有区别吗:2.Node.js是什么3.NPM4.安装Node.js和npm5.使用appium之前为什么安装node.js?6.Vue.js一定要安装node.js吗?7.开发环境:1.node和nodejs有区别吗:node和nodejs之间没有区别,node全称就是nodejs。nodejs是一个基于ChromeV8引擎的JavaScript运行环境,一个让J
- 从零开始:手把手教你用 Uniapp 搭建多平台应用
儿歌八万首
uniappuni-app移动端跨平台harmonyOS
这个框架能帮你解决什么问题?想象一下,你需要开发一个移动应用,但是你的老板说:“我们需要同时上线Android、iOS还有华为的鸿蒙系统”。传统的做法是什么?雇三个团队,写三套代码,维护三个项目…想想都头疼对吧?这个框架就是来拯救你的!一套代码,三个平台同时搞定。不用学Java、Swift、ArkTS,只要你会Vue,就能轻松上手。简单来说,这个框架就像是一个"翻译官",你用熟悉的Vue语法写代码
- 前端高频面试题深度解析(JavaScript + Vue + jQuery)
前端高频面试题深度解析(JavaScript+Vue+jQuery)一、JavaScript核心问题解析事件冒泡与捕获机制对比:graphLRA[捕获阶段]-->|Window→父元素|B[目标元素]B-->|子元素→父元素|C[冒泡阶段]阻止方法://阻止冒泡(常用)event.stopPropagation();//阻止捕获+冒泡+默认行为(慎用)event.stopImmediateProp
- 大四学生的前端实习记录
我的第一次实习经历吐槽一下:2022年2月23号在拉钩上投的某所的前端实习生的岗位,一面:24号安排的面试,25号面试完,面试官说回答的很不错。二面:奇葩的一批:发了个数据可视化的页面,让做出来这个静态页面的效果,给了三天,因为我以前做过这个,然后两天就做完了。发过去了。三面:更是奇葩,又让用vue脚手架写二面数据可视化的页面。无语至极,然后我两天之后交了,就不吱声了。当时我们班还有个女生也投的是
- 前端领域的前端设计模式技巧分享
前端视界
前端艺匠馆前端设计模式状态模式ai
前端领域的前端设计模式技巧分享关键词:前端设计模式、组件化开发、状态管理、性能优化、代码复用、可维护性、响应式设计摘要:本文深入探讨前端开发中的设计模式应用技巧,从基础概念到高级实践,全面解析如何通过设计模式提升前端代码质量。文章将详细介绍常见的前端设计模式如观察者模式、单例模式、工厂模式等,并结合React、Vue等现代框架展示实际应用场景。同时,我们还将探讨设计模式在状态管理、性能优化和组件复
- SQL的各种连接查询
xieke90
UNION ALLUNION外连接内连接JOIN
一、内连接 概念:内连接就是使用比较运算符根据每个表共有的列的值匹配两个表中的行。 内连接(join 或者inner join ) SQL语法: select * fron
- java编程思想--复用类
百合不是茶
java继承代理组合final类
复用类看着标题都不知道是什么,再加上java编程思想翻译的比价难懂,所以知道现在才看这本软件界的奇书 一:组合语法:就是将对象的引用放到新类中即可 代码: package com.wj.reuse; /** * * @author Administrator 组
- [开源与生态系统]国产CPU的生态系统
comsci
cpu
计算机要从娃娃抓起...而孩子最喜欢玩游戏.... 要让国产CPU在国内市场形成自己的生态系统和产业链,国家和企业就不能够忘记游戏这个非常关键的环节.... 投入一些资金和资源,人力和政策,让游
- JVM内存区域划分Eden Space、Survivor Space、Tenured Gen,Perm Gen解释
商人shang
jvm内存
jvm区域总体分两类,heap区和非heap区。heap区又分:Eden Space(伊甸园)、Survivor Space(幸存者区)、Tenured Gen(老年代-养老区)。 非heap区又分:Code Cache(代码缓存区)、Perm Gen(永久代)、Jvm Stack(java虚拟机栈)、Local Method Statck(本地方法栈)。 HotSpot虚拟机GC算法采用分代收
- 页面上调用 QQ
oloz
qq
<A href="tencent://message/?uin=707321921&Site=有事Q我&Menu=yes"> <img style="border:0px;" src=http://wpa.qq.com/pa?p=1:707321921:1></a>
- 一些问题
文强chu
问题
1.eclipse 导出 doc 出现“The Javadoc command does not exist.” javadoc command 选择 jdk/bin/javadoc.exe 2.tomcate 配置 web 项目 ..... SQL:3.mysql * 必须得放前面 否则 select&nbs
- 生活没有安全感
小桔子
生活孤独安全感
圈子好小,身边朋友没几个,交心的更是少之又少。在深圳,除了男朋友,没几个亲密的人。不知不觉男朋友成了唯一的依靠,毫不夸张的说,业余生活的全部。现在感情好,也很幸福的。但是说不准难免人心会变嘛,不发生什么大家都乐融融,发生什么很难处理。我想说如果不幸被分手(无论原因如何),生活难免变化很大,在深圳,我没交心的朋友。明
- php 基础语法
aichenglong
php 基本语法
1 .1 php变量必须以$开头 <?php $a=” b”; echo ?> 1 .2 php基本数据库类型 Integer float/double Boolean string 1 .3 复合数据类型 数组array和对象 object 1 .4 特殊数据类型 null 资源类型(resource) $co
- mybatis tools 配置详解
AILIKES
mybatis
MyBatis Generator中文文档 MyBatis Generator中文文档地址: http://generator.sturgeon.mopaas.com/ 该中文文档由于尽可能和原文内容一致,所以有些地方如果不熟悉,看中文版的文档的也会有一定的障碍,所以本章根据该中文文档以及实际应用,使用通俗的语言来讲解详细的配置。 本文使用Markdown进行编辑,但是博客显示效
- 继承与多态的探讨
百合不是茶
JAVA面向对象 继承 对象
继承 extends 多态 继承是面向对象最经常使用的特征之一:继承语法是通过继承发、基类的域和方法 //继承就是从现有的类中生成一个新的类,这个新类拥有现有类的所有extends是使用继承的关键字: 在A类中定义属性和方法; class A{ //定义属性 int age; //定义方法 public void go
- JS的undefined与null的实例
bijian1013
JavaScriptJavaScript
<form name="theform" id="theform"> </form> <script language="javascript"> var a alert(typeof(b)); //这里提示undefined if(theform.datas
- TDD实践(一)
bijian1013
java敏捷TDD
一.TDD概述 TDD:测试驱动开发,它的基本思想就是在开发功能代码之前,先编写测试代码。也就是说在明确要开发某个功能后,首先思考如何对这个功能进行测试,并完成测试代码的编写,然后编写相关的代码满足这些测试用例。然后循环进行添加其他功能,直到完全部功能的开发。
- [Maven学习笔记十]Maven Profile与资源文件过滤器
bit1129
maven
什么是Maven Profile Maven Profile的含义是针对编译打包环境和编译打包目的配置定制,可以在不同的环境上选择相应的配置,例如DB信息,可以根据是为开发环境编译打包,还是为生产环境编译打包,动态的选择正确的DB配置信息 Profile的激活机制 1.Profile可以手工激活,比如在Intellij Idea的Maven Project视图中可以选择一个P
- 【Hive八】Hive用户自定义生成表函数(UDTF)
bit1129
hive
1. 什么是UDTF UDTF,是User Defined Table-Generating Functions,一眼看上去,貌似是用户自定义生成表函数,这个生成表不应该理解为生成了一个HQL Table, 貌似更应该理解为生成了类似关系表的二维行数据集 2. 如何实现UDTF 继承org.apache.hadoop.hive.ql.udf.generic
- tfs restful api 加auth 2.0认计
ronin47
目前思考如何给tfs的ngx-tfs api增加安全性。有如下两点: 一是基于客户端的ip设置。这个比较容易实现。 二是基于OAuth2.0认证,这个需要lua,实现起来相对于一来说,有些难度。 现在重点介绍第二种方法实现思路。 前言:我们使用Nginx的Lua中间件建立了OAuth2认证和授权层。如果你也有此打算,阅读下面的文档,实现自动化并获得收益。SeatGe
- jdk环境变量配置
byalias
javajdk
进行java开发,首先要安装jdk,安装了jdk后还要进行环境变量配置: 1、下载jdk(http://java.sun.com/javase/downloads/index.jsp),我下载的版本是:jdk-7u79-windows-x64.exe 2、安装jdk-7u79-windows-x64.exe 3、配置环境变量:右击"计算机"-->&quo
- 《代码大全》表驱动法-Table Driven Approach-2
bylijinnan
java
package com.ljn.base; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Collections; import java.uti
- SQL 数值四舍五入 小数点后保留2位
chicony
四舍五入
1.round() 函数是四舍五入用,第一个参数是我们要被操作的数据,第二个参数是设置我们四舍五入之后小数点后显示几位。 2.numeric 函数的2个参数,第一个表示数据长度,第二个参数表示小数点后位数。 例如: select cast(round(12.5,2) as numeric(5,2))  
- c++运算符重载
CrazyMizzz
C++
一、加+,减-,乘*,除/ 的运算符重载 Rational operator*(const Rational &x) const{ return Rational(x.a * this->a); } 在这里只写乘法的,加减除的写法类似 二、<<输出,>>输入的运算符重载 &nb
- hive DDL语法汇总
daizj
hive修改列DDL修改表
hive DDL语法汇总 1、对表重命名 hive> ALTER TABLE table_name RENAME TO new_table_name; 2、修改表备注 hive> ALTER TABLE table_name SET TBLPROPERTIES ('comment' = new_comm
- jbox使用说明
dcj3sjt126com
Web
参考网址:http://www.kudystudio.com/jbox/jbox-demo.html jBox v2.3 beta [ 点击下载] 技术交流QQGroup:172543951 100521167 [2011-11-11] jBox v2.3 正式版 - [调整&修复] IE6下有iframe或页面有active、applet控件
- UISegmentedControl 开发笔记
dcj3sjt126com
// typedef NS_ENUM(NSInteger, UISegmentedControlStyle) { // UISegmentedControlStylePlain, // large plain &
- Slick生成表映射文件
ekian
scala
Scala添加SLICK进行数据库操作,需在sbt文件上添加slick-codegen包 "com.typesafe.slick" %% "slick-codegen" % slickVersion 因为我是连接SQL Server数据库,还需添加slick-extensions,jtds包 "com.typesa
- ES-TEST
gengzg
test
package com.MarkNum; import java.io.IOException; import java.util.Date; import java.util.HashMap; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.annotation
- 为何外键不再推荐使用
hugh.wang
mysqlDB
表的关联,是一种逻辑关系,并不需要进行物理上的“硬关联”,而且你所期望的关联,其实只是其数据上存在一定的联系而已,而这种联系实际上是在设计之初就定义好的固有逻辑。 在业务代码中实现的时候,只要按照设计之初的这种固有关联逻辑来处理数据即可,并不需要在数据库层面进行“硬关联”,因为在数据库层面通过使用外键的方式进行“硬关联”,会带来很多额外的资源消耗来进行一致性和完整性校验,即使很多时候我们并不
- 领域驱动设计
julyflame
VODAO设计模式DTOpo
概念: VO(View Object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。 DTO(Data Transfer Object):数据传输对象,这个概念来源于J2EE的设计模式,原来的目的是为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载,但在这里,我泛指用于展示层与服务层之间的数据传输对
- 单例设计模式
hm4123660
javaSingleton单例设计模式懒汉式饿汉式
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。 &nb
- logback
zhb8015
loglogback
一、logback的介绍 Logback是由log4j创始人设计的又一个开源日志组件。logback当前分成三个模块:logback-core,logback- classic和logback-access。logback-core是其它两个模块的基础模块。logback-classic是log4j的一个 改良版本。此外logback-class
- 整合Kafka到Spark Streaming——代码示例和挑战
Stark_Summer
sparkstormzookeeperPARALLELISMprocessing
作者Michael G. Noll是瑞士的一位工程师和研究员,效力于Verisign,是Verisign实验室的大规模数据分析基础设施(基础Hadoop)的技术主管。本文,Michael详细的演示了如何将Kafka整合到Spark Streaming中。 期间, Michael还提到了将Kafka整合到 Spark Streaming中的一些现状,非常值得阅读,虽然有一些信息在Spark 1.2版
- spring-master-slave-commondao
王新春
DAOspringdataSourceslavemaster
互联网的web项目,都有个特点:请求的并发量高,其中请求最耗时的db操作,又是系统优化的重中之重。 为此,往往搭建 db的 一主多从库的 数据库架构。作为web的DAO层,要保证针对主库进行写操作,对多个从库进行读操作。当然在一些请求中,为了避免主从复制的延迟导致的数据不一致性,部分的读操作也要到主库上。(这种需求一般通过业务垂直分开,比如下单业务的代码所部署的机器,读去应该也要从主库读取数