OA系统遇到的问题

news2024/11/21 0:21:36

目录

一、开始时间与结束时间之差

二、弹出层的大小以及位置设置

2.1、高度设置body-style

2.2、位置设置dialogStyle

三、vue2安装引入Ant Design Vue

四、按钮控制盒子的显示与隐藏

五、表单生成器思想

5.1、点击左侧控件库生成中间的控件元素

5.2、点击中间的控件,值会显示在右侧

5.3、修改右侧的值,引起中间元素的值变化

六、前后端图像处理

6.1、当后端返回的图片只是数字时

6.2、后端在线图片地址拼接

一、开始时间与结束时间之差

 时间格式化方法:format

// 工具函数的抽取----时间格式化
export const formatDate=d=> {
  var date = new Date(d);
  var YY = date.getFullYear() + "-";
  var MM =
    (date.getMonth() + 1 < 10
      ? "0" + (date.getMonth() + 1)
      : date.getMonth() + 1) + "-";
  var DD = date.getDate() < 10 ? "0" + date.getDate() : date.getDate();
  var hh =
    (date.getHours() < 10 ? "0" + date.getHours() : date.getHours()) + ":";
  var mm =
    (date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes()) +
    ":";
  var ss =
    date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds();
  return YY + MM + DD + " " + hh + mm + ss;
}

// 调用工具函数--时间格式化

import { formatDate } from "@/uitls/index.js";

 // 自动计算时长
    diffTime() {
this.startTime = formatDate(date);// 开始时间
  this.endTime = formatDate(date);// 结束时间
      const date1 = new Date(this.startTime) //开始时间
      const date2 = new Date(this.endTime) //结束时间
      const date3 = date2.getTime() - date1.getTime() //时间差的毫秒数
      // const days =date3 / (24 * 3600 * 1000); //计算出相差天数
      const hours = Math.floor(date3 / 1000 / 60 / 60) // 计算出小时数
      var num = hours / 24
      num = num.toFixed(2)
      this.durations = num

二、弹出层的大小以及位置设置

这里指的是Ant Design Vue的用法:https://1x.antdv.com/components/modal-cn/

2.1、高度设置body-style

官网里有个属性是body-style,这里可以设置modal的高度

<a-modal :body-style="bodystyle"></a-modal>
//在data里面设置的话,去掉const "="改为":"
const bodystyle = {
  height: '480px',
  overflow: 'hidden',
  overflowY: 'scroll',
}

宽度设置直接在<a-modal width="100%"></a-modal>即可

2.2、位置设置dialogStyle

 <a-modal title="新增" :visible="visible" width="70%" :dialogStyle="dialogStyle">11111</a-modal>
//在data中
dialogStyle:{
top:"50px",
left:"100px"
},

三、vue2安装引入Ant Design Vue

指定版本号

npm install --save ant-design-vue@1.7.8

在main.js文件中

import Antd from 'ant-design-vue';
import 'ant-design-vue/dist/antd.css';
Vue.use(Antd);

如果是vue3引入,直接

npm install --save ant-design-vue

若出错需要卸载 npm uninstall ant-design-vue,在重新安装

四、按钮控制盒子的显示与隐藏

<template>
  <div class="edit">
    <button @click="come" v-show="!visible">添加控件</button>
    <HomeBar v-show="visible"></HomeBar>
  </div>
</template>
<script>
import HomeBar from "../components/HomeBar.vue";
export default {
  components: {
    HomeBar,
  },
  data() {
    return {
      // 引入组件(盒子)的显示与隐藏(一开始处于隐藏状态)
      visible:false,
    }
  },
  methods:{
       come(){     //点击按钮:自己消失,并且盒子出现
          this.visible=!this.visible;
      },
  },
};
</script>

五、表单生成器思想

5.1、点击左侧控件库生成中间的控件元素

(1)左侧的每个控件都有一个唯一的id,点击时将对应的id逆向传值,返给父组件,父组件根据获取的id进行判断?则根据左侧的id会生成中间的模板元素。

<template>
  <div>
    <!-- 控件库 -->
    <div class="kj-box">
      <h1>控件库</h1>
      <div class="big-box">
        <div class="kj-every" @click="clickEvery(v.id)" v-for="(v, id) in ArrayList" :key="id">
          <img :src="v.mbicon" />
          <span>{{ v.kjtype }}</span>
        </div>
      </div>
    </div>
  </div>
</template>
    // 点击每一个控件库
    clickEvery(e) {
      // console.log("e是谁",e);
      this.emptyVisible = false
      this.Newid = e
      let goodID
      // 借助“深拷贝”完成新数据影响旧数据的问题
      this.skbList = JSON.parse(JSON.stringify(this.ArrayList))
      this.skbList.map((item) => {
        if (item.id == this.Newid) {
          goodID = item
        }
      })
      this.goods = goodID
      this.$emit('ArrayRef', this.goods)
      console.log('子组件', this.goods)
    },

父组件那边接收到点击的元素id后

    // 点击每一个控件库
    clickEvery(e) {
      // console.log('e是谁', e)
      this.changeData(e)
    },
    changeData(e) {
      // console.log('点id', this.allIndex, this.Bigform.ArrayListShow[this.allIndex])
      if (
        this.allIndex != -1 &&
        this.Bigform.ArrayListShow[this.allIndex] &&
        this.Bigform.ArrayListShow[this.allIndex].id == 10
      ) {
        if (e.id == 10) {
          return
        }
        this.Bigform.ArrayListShow[this.allIndex].detailList.push(e)
        this.ThreeList=this.Bigform.ArrayListShow[this.allIndex].detailList
      } else {
        this.Bigform.ArrayListShow.push(e)
      }
    },

中间模板生成的思想:

按照对应的下标,这样可以避免统一控件多次生成时,值同时变化的问题;

而明细控件则是在添加时,除了自身不能添加外,其余控件依旧可以添加,相当于在一个空间中再次加入左侧的控件,在中间模板下标==-1(比如点击明细空间之外的父盒子@click.self="detailLost")时,证明明细内容添加完毕!

5.2、点击中间的控件,值会显示在右侧

    // 编辑按钮==》blueX出现
    RightEdit(e, index) {
      // console.log('明细要的e', e.detailList)
      // 点击每一个之前,将必填的状态设置为跟随每一个的状态,提高用户体验感
      this.Bigform.form.other = e.other
      this.kjEdit = true
      if (this.Newid == 7) {
        this.singelShow = true //单选框和多选框对应的盒子
        this.doubleShow = false
        // this.Bigform.form.domains = this.Bigform.ArrayListShow[this.allIndex].domains || []
      } else if (this.Newid == 8) {
        this.doubleShow = true
        this.singelShow = false
        //  this.Bigform.form.domains2 = this.Bigform.ArrayListShow[this.allIndex].domains || []
      } else {
        this.singelShow = false
        this.doubleShow = false
      }
      this.isActive = index //点击对应下标,盒子的蓝色边框出现
      this.allIndex = index //拿到ArrayListShow对应的下标,赋给data中的(全局变量)allIndex
      this.Bigform.ArrayListShow.forEach((item) => {
        item.BoxShow = false
      })
      this.$set(e, 'BoxShow', true) //点击对应下标,蓝色X出现。【等同于e.BoxShow=true/e['BoxShow']=true】
      let count = this.count++
      this.$set(e, 'index', count)
      // console.log("deomain",this.Bigform.ArrayListShow[this.allIndex].domains,this.allIndex);
      this.Newid = e.id
      this.Bigform.form.kjname = e.kjname
      this.Bigform.form.kjtype = e.kjtype
      this.Bigform.form.kjdesc = e.kjdesc
      this.Bigform.form.domains = this.Bigform.ArrayListShow[this.allIndex].domains || []
      this.Bigform.form.domains2 = this.Bigform.ArrayListShow[this.allIndex].domains || []
    },

点击中间的每一个元素,右上方出现蓝色X,点击删除指定元素

   // 删除指定的表单控件元素
    DelEvery(index) {
      this.Bigform.ArrayListShow.splice(index, 1)
    },

5.3、修改右侧的值,引起中间元素的值变化

    // 右侧的控件编辑
    kjnameShow1(e, f) {
      // 将右侧表单的kjname直接赋给左侧渲染过的kjname
      e[this.allIndex].kjname = this.Bigform.form.kjname
      e[this.allIndex].kjdesc = this.Bigform.form.kjdesc
      if (e[this.allIndex].id == 10) {
        // console.log(f,"右到左");
        f[this.DelIndex].kjname = this.Bigform.form.kjname
        f[this.DelIndex].kjdesc = this.Bigform.form.kjdesc
      }
    },

六、前后端图像处理

6.1、当后端返回的图片只是数字时

前端图片库需要提前命名好,根据返回的数字进行拼接,就会前后端图片显示一致

      <div class="eightBox">
        <div
          class="aFBox"
          v-for="(item, index) in FeatureProps"
          :key="item.id"
          v-show="index < maxLength"
        >
          <img :src="getImgUrl(item.icon)" />
          <p>{{ item.name }}</p>
        </div>
      </div>
<script>
    getImgUrl(img) {//拼接图片地址
      // console.log("图片icon",img);
      // console.log("url",`@/assets/img/list0`+img+`.png`);
      return require(`@/assets/img/list0` + img + `.png`);
    },
</script>

6.2、后端在线图片地址拼接

接到的avatar地址如下,则需要拼接在线地址

这种一般有两个接口,下面这就是所有图片前边部分的在线地址

 

<template>
<img :src="`${ImgUrl}${item.avatar}`" @error="defaultBackImg" />
</template>
<script>
import { CopyUser, GetIMg} from "@/request/api";
  async created() {
    let res = await CopyUser();
    this.UserList = res.data.result;
    console.log("列", res);
    let Img = await GetIMg();
    this.ImgUrl = Img.data.message;
    console.log("在线地址", this.ImgUrl);
  },
//如果后台返回的数据为空,则使用默认图片
  defaultBackImg(event) {
      if (event.type == "error") {
        event.target.src = require("@/assets/img/yiji00.png");
      }
    },
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/111932.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flink-状态编程的基本概念

文章目录Flink 中的状态1.1 有状态算子1.2 状态的管理1.3 状态的分类&#x1f48e;&#x1f48e;&#x1f48e;&#x1f48e;&#x1f48e; 更多资源链接&#xff0c;欢迎访问作者gitee仓库&#xff1a;https://gitee.com/fanggaolei/learning-notes-warehouse/tree/master Fli…

springcloud-gateway简介

目录 1. gateway简介 1.1 是什么 1.2 作用 1.3 主要特征 1.4 与zuul的主要区别 1.5 主要组件 1.6 架构图 2. 开发示例 2.1 创建一个gateway模块 2.2 与nacos结合使用 2.2.1 默认规则 2.2.2 通过配置文件配置路由 2.2.3 动态路由 1. gateway简介 1.1 是什么 SpringC…

一文带你深入理解【Java基础】· 网络编程(上)

写在前面 Hello大家好&#xff0c; 我是【麟-小白】&#xff0c;一位软件工程专业的学生&#xff0c;喜好计算机知识。希望大家能够一起学习进步呀&#xff01;本人是一名在读大学生&#xff0c;专业水平有限&#xff0c;如发现错误或不足之处&#xff0c;请多多指正&#xff0…

Kali Linux中安装IDLE的方法

1 IDLE简介 IDLE是Integrated Development and Learning Enviroment即集成开发和学习环境的简称&#xff0c;是Python的集成开发环境。在Kali Linux中&#xff0c;可以通过IDLE进行Python编程。 2 Kali Linux中安装IDLE 2.1 查看Kali Linux中是否安装IDLE 在Kali Linux终端…

WEB1.0起源:全球首个网站info.cern.ch

伯纳斯李&#xff08;图&#xff09;1990年创立第一个网站。 info.cern.ch是世上第一个网站&#xff0c;提供有关万维网的资料。 info.cern.ch这个网站依然运作如常。 英国科学家蒂姆伯纳斯-李 (Tim Berners-Lee) 于 1989 年在 CERN 工作期间发明了万维网 (WWW)。Web 最初的构思…

基于Vue+SpringBoot智慧校园疫情防控系统(PC端、手机端)--附源码

介绍 智慧校园疫情防控系统——PC 手机端 多端并行 项目源码下载&#xff1a;https://download.csdn.net/download/DeepLearning_/87340321 软件架构 手机端信息系统——日常健康信息填报系统&#xff08;前端手机端 文件夹&#xff09;电脑端智疫图 —— 数据可视化界面 &…

一种新的语义分割思路

这两天看到一篇挺有意思的论文&#xff0c;虽然不是语义分割方面的但是挺有意思的&#xff0c;因此在这里跟大家分享一下&#xff0c;这个也是一种语义分割的思路和方法。 Paper&#xff1a;Fully-Convolutional Siamese Networks for Object Tracking. SiamFC是深度学习目标…

【深入浅出 Yarn 架构与实现】4-2 RM 管理 Application Master

上一篇文章对 ResourceManager 整体架构和功能进行了讲述。本篇将对 RM 中管理 Application Master 的部分进行深入的讲解。 下面将会介绍 RM 与 AM 整体通信执行流程&#xff0c;并对 RM 中涉及的对应服务进行具体讲解。 为了更好的学习本篇知识&#xff0c;建议先熟悉以下知识…

股票量化分析工具QTYX使用攻略——实盘交易信号监控(更新2.5.7)

搭建自己的量化系统如果要长期在市场中立于不败之地&#xff01;必须要形成一套自己的交易系统。如何学会搭建自己的量化交易系统&#xff1f;边学习边实战&#xff0c;在实战中学习才是最有效地方式。于是我们分享一个即可以用于学习&#xff0c;也可以用于实战炒股分析的量化…

3天学会撰写软件发明专利——5.专利法律常识

“无意中发现了一个巨牛的人工智能教程&#xff0c;忍不住分享一下给大家。教程不仅是零基础&#xff0c;通俗易懂&#xff0c;而且非常风趣幽默&#xff0c;像看小说一样&#xff01;觉得太牛了&#xff0c;所以分享给大家。点这里可以跳转到教程。”。 1)假冒专利行为及其法…

Activemq的Broker

目录 一、broker是什么 二、启动broker时指定配置文件 三、嵌入式Broker &#xff08;一&#xff09;Pom.xml &#xff08;二&#xff09;Broker实例 &#xff08;三&#xff09;验证 一、broker是什么 相当于一个ActiveMQ服务器实例。说白了&#xff0c;Broker其实就是…

YK-L1刷机

文章目录1.测试是否能够连接到路由器2.刷breed3.Padavan firmware编译4.烧板5.验证杂文1.1内核模块编写&#xff08;使用insmod方式&#xff09;1.2内核模块编写&#xff08;跟随内核一起编译&#xff09;参考资料1.测试是否能够连接到路由器 插上网线和电脑相连&#xff0c;网…

计算机网络基础——一文详解IPv4与子网划分

IPv4地址概述 在因特网中&#xff0c;为了实现计算机之间的相互通信&#xff0c;通常需要为每台计算机分配一个IP地址。在互联网的发展过程中主要有两个版本的互联网协议&#xff0c;分别是IPv4(Internet Protocol version4)和IPv6 (Internet Protocol version 6) IPv4的IP地址…

SpringBoot:模块探究之spring-boot-starters

Spring Boot Starters 是一组方便的依赖描述符&#xff0c;您可以将它们包含在您的应用程序中。您可以获得所需的所有 Spring 和相关技术的一站式服务&#xff0c;而无需搜索示例代码和复制粘贴大量依赖项描述符。 例如&#xff0c;如果想使用 Spring 和 JPA 进行数据库访问&am…

SpringBoot整合Redis实现几种自定义数据序列化存储方式

JDK自带序列化方式 在Java中RedisTemplete提供了统一的API来操作Redis&#xff0c;比如插入一条String类型的数据&#xff0c;我可以用 redisTemplate.opsForValue().set("name", "美羊羊"); SpringDataRedis可以接收任何类型的对象并将其转成Redis可以处…

小布助手,身入大千世界

在2018年—2019年&#xff0c;AI智能助手一度火热&#xff0c;成了科技行业的全新风口。智能音箱与手机中&#xff0c;我们能看到各种各样的智能助手横空出世&#xff0c;一度成为产品标配。但随着时间缓缓冲刷&#xff0c;就像所有科技风口一样&#xff0c;有的AI智能助手随着…

一种非侵入式幂等性的Java实现

今天我们来谈谈什么是幂等性&#xff1f; 引用百度百科的解析如下&#xff1a; 幂等&#xff08;idempotent、idempotence&#xff09;是一个数学与计算机学概念&#xff0c;常见于抽象代数中。 在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同…

3ds Max:标准几何体

三维软件中一般有许多非常复杂的命令&#xff0c;能够完成非常复杂的图形运算&#xff0c;但其实许多绚丽的图形也是由最基本的几何体构成&#xff0c;许多复杂的命令也是基本的运算程序的集合&#xff0c;就像是砖块&#xff0c;构成了复杂的大厦。任何一个几何体&#xff0c;…

【QGIS入门实战精品教程】3.4:QGIS创建、连接、打包GeoPackage数据库及数据入库案例详解

GeoPackage(以下简称gpkg),内部使用SQLite实现的一种单文件、与操作系统无关的地理数据库。在QGIS中可以很方便的实现GeoPackage的创建与连接等操作。 文章目录 一、QGIS创建GeoPackage1. 创建数据库2. 数据入库二、矢量数据打包为GeoPackage1. 加载shp文件2. 使用QGIS打包图…

微信键盘好用吗?

相信大家在手机上已经安装了一款自己比较熟练使用地输入法&#xff0c;最近微信推出了微信键盘&#xff0c;作为一名产品经理&#xff0c;当然不能错过试用它&#xff0c;我在第一时间下载进行了使用&#xff0c; 下面是我使用了几天的感受&#xff0c;与大家分享一下。 一、体…