Day07-员工管理-上传下载

news2024/11/26 21:35:41

1.员工管理-导出excel

在这里插入图片描述
在这里插入图片描述

  • 导出员工接口返回的是二进制
  • axios配置responseType为blob接收二进制流文件为Blob格式
  • 按装file-saver包,实现下载Blob文件
  • npm install add file-saver
  • 导出员工excel的接口 (src/api/employee.js)
export function exportEmployee(){
  return request({
     url:'/sys/user/export',
     //改变接收数据的类型
     responseType:'blob'//使用blob接收二进制文件流
   })
}
  • 拦截器判断是不是blob类型,如果是 直接返回数据,不再进行解构(src/utils/request.js)
//响应拦截器
service.interceptors.response.use((response)=>{
  if(response.data instanceof Blob){
    return response.data
   }
})
  • 点击按钮调用接口,使用file-saver将Blob转化成文件下载
 <el-button size="mini" @click="exportEmployee">excel导出</el-button>
import FileSaver from 'file-saver'
import { exportEmployee } from '@/api/employee'
methods:{
  async exportEmployee(){
     const result = await exportEmployee()//导出所有的员工
     console.log(result)//使用一个npm包 直接将blob文件下载到本地 file-saver
     FileSaver.saveAs(result,'员工信息表.xlsx')
   }
}

2.员工管理-excel组件

在这里插入图片描述
在这里插入图片描述

  • 创建员工导入组件(src/views/employee/components/import-excel.vue)
 <el-dialog width="500px" title="员工导入" :visible="showExcelDialog" @close="$emit('update:showExcelDialog',false)">
     <el-row type="flex" justify="center">
        <div class="upload-excel">
            <input type="file" accept=".xlsx,.xls" ref="excel-upload-input" >
            <div class="drop">
                <i class="el-icon-upload"></i>
                <el-button type="text">下载导入模板</el-button>
                <span>将文件拖到此处或
                    <el-button type="text" >点击上传</el-button>
                </span>
            </div>
        </div>
     </el-row>
     <el-row type="flex" justify=" end">
        <!-- update:props属性名,值 直接修改 .sync修饰符的属性值 -->
        <el-button size="mini" type="primary" @click="$emit('update:showExcelDialog')"></el-button>
     </el-row>createError.js?2d83:16 Uncaught (in promise) Error: Request failed with status code 429
   </el-dialog>
  • 在员工管理页面-导入该组件并注册使用(src/views/employee/index.vue)
import ImportExcel from './components/import-excel.vue'
export default{
data(){
  showExcelDialog:false//控制excel的弹窗显示和隐藏
},
  components:{
    ImportExcel
   }
}
  • 使用该组件,并且应用变量(src/views/employee/index.vue)
<import-excel :show-excel-dialog.sync = "showExcelDialog" />
  • 点击excel导入按钮
<el-button size='mini' @click="showExcelDialog = true">excel导入</el-button>

3、下载导入模板

在这里插入图片描述
在这里插入图片描述

  • 下载模板的api(src/api/employee.js)
// 下载导入模板
export function getExportTemplate(){
	return request({
		url:'/sys/user/import/template',
		responseType:'blob'//二进制文件流 
	})
}
  • 点击按钮进行下载(src/views/employee/components/import-excel.vue)
<el-button type='text' @click="getTemplate">下载导入模板</el-button>
async getTemplate(){
	const data = await getExportTemplate();
	FileSaver.saveAs(data,'员工导入模板.xlsx')
}

4.员工管理-员工导入-上传excel

在这里插入图片描述
在这里插入图片描述

  • 上传excel的api(src/api/employee.js)
export function uploadExcel(data){
	return request({
		url:'/sys/user/import',
		method:'post',
		data //form-data类型  
	})
}
  • 点击上传-弹出文件选择框(src/views/employee/components/import-excel.vue)
<el-button type="text" @click="handleUpload">点击上传</el-button>
handleUpload(){
	this.$refs['excel-upload-input'].click()
}
  • 监听文件改变-上传excel-关闭弹窗(src/views/employee/components/import-excel.vue)
    JavaScript
<input ref="excel-upload-input" class="excel-upload-input" type="file" accept=".xlsx, .xls" @change="uploadChange" />
async uploadChange(event){
	console.log(event.target.files)
	const files = event.target.files //input的文件列表
	if(files.length > 0){
	  //大于0 说明有文件要上传
	  const data = new FormData()
	  //file:file类型
	  data.append('file',files[0])//将文件参数加入到formData中
	  try{
	  	await uploadExcel(data)
	  	//成功
	  	this.$emit('uploadSuccess') //通知父组件 上传成功
	  	this.$emit('update:showExcelDialog',false)//关闭弹层
	  }catch{
	   //捕获失败
	   //this.$refs['excel-upload-input'].value= ''
	   }finally{
	    //不论成功或者失败都执行finally
	    this.$refs['excel-upload-input'].value=''
	    }
	 }
}
  • 不论成功或者失败,再点击上传都会去选择一个新的excel,使用finally等到最后,将内容清空。
  • 父组件需要监听上传成功的事件(src/views/employee/index.vue)
<import-excel :show-excel-dialog.sync="showExcelDialog" @uploadSuccess="getEmployeeList"></import-excel>

5.员工管理-删除员工

在这里插入图片描述
在这里插入图片描述

  • 删除员工的接口-位置(src/api/employee.js)
//删除员工
export function delEmployee(id){
  return request({
   method:'delete',
   url:`/sys/user/${id}`
   })
}
  • 气泡确认位置(src/views/employee/index.vue)
 <template v-slot="{row}">
            <el-button size="mini" type="text">查看</el-button>
            <el-button size="mini" type="text">角色</el-button>
            <el-popconfirm trigger="hover" title="确认删除该行数据吗?" @onConfirm="confirmDel(row.id)">
              <el-button slot="reference" style="margin-left:10px" size="mini" type="text">删除</el-button>
            </el-popconfirm>
          </template>
  • 删除方法
async confirmDel(id){
  await delEmployee(id){
    if(this.list.length === 1 && this.queryParams.page > 1) this.queryParams.page--
    this.getEmployeeList()
    this.$message.success('删除成功')
   }
}

6.员工详情和路由

在这里插入图片描述

  • 创建一个员工详情组件-位置(src/views/employee/detail.vue)
<template>
  <div class="dashboard-container">
    <div class="app-container">
      <div class="edit-form">
        <el-form ref="userForm" label-width="220px">
          <!-- 姓名 部门 -->
          <el-row>
            <el-col :span="12">
              <el-form-item label="姓名" prop="username">
                <el-input size="mini" class="inputW" />
              </el-form-item>
            </el-col>

          </el-row>
          <!-- 工号 入职时间 -->
          <el-row>
            <el-col :span="12">
              <el-form-item label="工号" prop="workNumber">
                <el-input size="mini" class="inputW" />
              </el-form-item>
            </el-col>
          </el-row>
          <!--手机 聘用形式  -->
          <el-row>
            <el-col :span="12">
              <el-form-item label="手机" prop="mobile">
                <el-input
                  size="mini"
                  class="inputW"
                />
              </el-form-item>
            </el-col>
          </el-row>
          <el-row>
            <el-col :span="12">
              <el-form-item label="部门" prop="departmentId">
                <!-- 放置及联部门组件 -->
              </el-form-item>
            </el-col>
          </el-row>
          <el-row>
            <el-col :span="12">
              <el-form-item label="聘用形式" prop="formOfEmployment">
                <el-select size="mini" class="inputW" />
              </el-form-item>
            </el-col>
          </el-row>
          <el-row>
            <el-col :span="12">
              <el-form-item label="入职时间" prop="timeOfEntry">
                <el-date-picker
                  size="mini"
                  type="date"
                  value-format="yyyy-MM-dd"
                  class="inputW"
                />
              </el-form-item>
            </el-col>
          </el-row>
          <el-row>
            <el-col :span="12">
              <el-form-item label="转正时间" prop="correctionTime">
                <el-date-picker
                  size="mini"
                  type="date"
                  class="inputW"
                />
              </el-form-item>
            </el-col>
          </el-row>
          <!-- 员工照片 -->
          <el-row>
            <el-col :span="12">
              <el-form-item label="员工头像">
                <!-- 放置上传图片 -->
              </el-form-item>
            </el-col>
          </el-row>
          <!-- 保存个人信息 -->
          <el-row type="flex">
            <el-col :span="12" style="margin-left:220px">
              <el-button size="mini" type="primary">保存更新</el-button>
            </el-col>
          </el-row>
        </el-form>
      </div>

    </div>
  </div>
</template>

<script>

export default {

}
</script>

<style scoped lang="scss">
    .edit-form {
      background: #fff;
      padding: 20px;
      .inputW {
        width: 380px
      }
    }

</style>
  • 配置员工详情路由信息(src/router/modules/employee.js)
{
        path:'/employee/detail',//员工详情地址
        component:()=>import('@/view/employee/detail.vue'),
        hidden:true,//隐藏在左侧菜单
        meta:{
            title:'员工详情' //显式在导航的文本
        }
    }
  • 点击添加员工跳转到详情页(src/views/employee/index.vue)
<el-button size="mini" type="primary" @click="$router.push('/employee/detail')">添加员工</el-button>

7.员工详情-表单数据校验

  • 姓名-必填-1-4个字符
  • 手机号-必填-格式校验
  • 部门-必填
  • 聘用形式-必填
  • 入职时间-必填
  • 转正时间-必填-不能小于入职时间
  • 定义数据和规则(src/views/employee/detail.vue)
<el-form label-width="220px" ref="userForm" :model="userInfo" :rules="rules" >
                <!-- 姓名 部门 -->
                <el-row>
                    <el-col :span="12">
                        <el-form-item prop="username" label="姓名" >
                            <el-input v-model="userInfo.username" size="mini" class="inputW">

                            </el-input>
                        </el-form-item>
                    </el-col>
                </el-row>
                <!-- 工号 入职时间 -->
                <el-row>
                    <el-col :span="12">
                        <el-form-item prop="workNumber" label="工号" >
                            <!-- 工号是系统生成的  -->
                            <el-input v-model="userInfo.workNumber" disabled size="mini" class="inputW"></el-input>
                        </el-form-item>
                    </el-col>
                </el-row>
                 <!-- 手机 聘用形式 -->
                 <el-row>
                    <el-col :span="12">
                        <el-form-item prop="mobile" label="手机" >
                            <el-input v-model="userInfo.mobile" size="mini" class="inputW"></el-input>
                        </el-form-item>
                    </el-col>
                </el-row>
                <el-row>
                    <el-col :span="12">
                        <el-form-item prop="departmentId" label="部门" >
                            <!-- 级联部门组件 -->
                        </el-form-item>
                    </el-col>
                </el-row>
                <el-row>
                    <el-col :span="12">
                        <el-form-item prop="formOfEmployment" label="聘用形式" >
                           <el-select v-model="userInfo.formOfEmployment" size="mini" class="inputW">
                            <el-option label="正式" :value="1" />
                            <el-option label="非正式" :value="2" />
                        </el-select>
                        </el-form-item>
                    </el-col>
                </el-row>
                <el-row>
                    <el-col :span="12">
                        <el-form-item prop="timeOfEntry" label="入职时间" >
                          <el-date-picker v-model="userInfo.timeOfEntry" size="mini" type="date" value-format="yyyy-MM-dd" class="inputW"></el-date-picker>
                        </el-form-item>
                    </el-col>
                </el-row>
                <el-row>
                    <el-col :span="12">
                        <el-form-item prop="correctionTime" label="转正时间" >
                          <el-date-picker v-model="userInfo.correctionTime" size="mini" type="date"  class="inputW"></el-date-picker>
                        </el-form-item>
                    </el-col>
                </el-row>
                <!-- 员工照片 -->
                <el-row>
                    <el-col :span="12">
                        <el-form-item label="员工头像">
                            <!-- 放上传图片 -->
                        </el-form-item>
                    </el-col>
                </el-row>
                <!-- 保存个人信息 -->
                <el-row type="flex">
                    <el-col :span="12" style="margin-left:220px;">
                       <el-button size="mini" @click="saveData" type="primary">保存更新</el-button>
                    </el-col>
                </el-row>
            </el-form>
 data() {
    return {
        userInfo:{
            username:'',//用户名
            mobile:'',//手机号
            workNumber:'',//工号
            formOfEmployment:null,//聘用形式
            departmentId:null,//部门id
            timeOfEntry:'',//入职时间
            correctionTime:''//转正时间
        },
        rules:{
            username:[
                {
                    required:true,message:'请输入姓名',trigger:'blur'
                },
                {
                    min:1,max:4,message:'姓名为1-4位'
                }
            ],
            mobile:[
                {
                    required:true,
                    message:'请输入手机号',
                    trigger:'blur'
                },
                {
                    pattern:/^1[3-9]\d{9}$/,
                    message:'手机号格式不正确',
                    trigger:'blur'
                }
            ],
            formOfEmployment:[
                {
                    required:true,
                    message:'请选择聘用形式',
                    trigger:'blur'
                }
            ],
            departmentId:[
                {
                    required:true,
                    message:'请选择部门',
                    trigger:'blur'
                }
            ],
            timeOfEntry:[
                {
                    required:true,
                    message:'请选择入职时间',
                    trigger:'blur'
                }
            ],
            correctionTime:[
                {
                    required:true,
                    message:'请选择转正时间',
                    trigger:'blur'
                },
                {
                    validator:(rule,value,callback)=>{
                        if(this.userInfo.timeOfEntry) {
                            if(new Date(this.userInfo.timeOfEntry) > new Date(value)){
                                callback(new Error('转正时间不能小于入职时间'))
                                return
                            }
                        }
                        callback()
                    }
                }
            ]

        }

    }
  },
  methods: {
    saveData(){
        this.$refs.userForm.validate()
    }
  }

8.员工详情-部门级联组件

  • Cascader级联组件的特性
  • options为一个树形结构的数据源
  • props可以设置数据源中的字段例如 label(展示) value(存取)
  • separator为展示的分隔符
    在这里插入图片描述
  • 创建select-tree组件(src/views/employee/components/select-tree.vue)
<template>
  <el-cascader size="mini" :options="treeData" :props="props" separator="-">

  </el-cascader>
</template>
<script>
import { getDepartment } from '@/api/department';
import { transListToTreeData } from '@/utils';
export default {
  data() {
    return {
        treeData:[],//赋值给级联组件的options
        props:{
            label:'name',//要展示的字段
            value:'id' //要存储的字段
        }
    }
  },
  created(){
    this.getDepartment()
  },
  methods: {
    async getDepartment(){
        this.treeData = transListToTreeData(await getDepartment(),0) //将组织架构的数据 转化树形赋值给treeData
    }
  }
}
</script>

<style scoped lang="scss">
    .el-cascader{
        width: 300px;
    }
</style>
  • 使用组件(src/views/employee/detail.vue)
 <el-form-item prop="departmentId" label="部门" >
                            <!-- 级联部门组件 -->
                            <selectTree v-model="userInfo.departmentId" />
                        </el-form-item>
import selectTree from './components/selectTree.vue'
components:{
    selectTree
  }

9.员工详情-级联组件-双向绑定

在这里插入图片描述

  • 接收value属性(src/views/employee/components/select-tree.vue)
 <el-cascader
    :value="value"
    size="mini"
    :options="treeData"
    :props="props"
    separator="-"
    @change="changeValue"
  />
export default{
  props:{
    value:{
      type:Number,
      default:null 
    }
   },
   data() {
    return {
      treeData: [],//赋值给级联组件的options
      props: {
        label: 'name',//要展示的字段
        value: 'id' //要存储的字段
       
      },
    }
  },
    created() {
    this.getDepartment()
  },
  methods: {
    async getDepartment() {
      this.treeData = transListToTreeData(await getDepartment(), 0) //将组织架构的数据 转化树形赋值给treeData
    },
    changeValue(list) {
      //取到数组的最后一项
      if (list.length > 0) {
        this.$emit('input', list[list.length - 1]) //将最后一位的id取出 传出去
      } else {
        this.$emit('input', null)//如果长度为0 说明值为空
      }
    }
  }
}
  • 级联改变触发input事件(src/views/employee/components/select-tree.vue)
changeValue(list){
  //取到数组的最后一项
  if(list.length > 0){
    this.$emit('input',list[list.length -1]) 
  }else{
    this.$emit('input',null) // 如果长度为0 说明值为空 
  }
}

10.保存更新

在这里插入图片描述

  • 保存更新-新增员工接口-位置(src/api/employee.js)
export function addEmployee(data){
  return request({
    url:'/sys/user',
    methods:'post',
    data 
  })
}
  • 点击保存按钮进行新增-代码位置(src/views/employee/detail.vue)
saveData(){
  this.$refs.userForm.validate(isOK=>{
    if(isOK){
	  //校验通过
	  await addEmployee(this.userInfo)
	  this.$message.success('新增成功');
	  this.$router.push('/employee')
	}
  })
}

11.员工详情-编辑员工-查看员工

在这里插入图片描述
在这里插入图片描述

  • 获取员工详情接口(src/api/employee.js)
export function getEmployeeDetail(id){
  return request({
     url:`/sys/user/${id}`
   })
}
  • 点击查看时跳转到详情携带id(src/views/employee/index.vue)
 <el-button size="mini" @click="$router.push(`/employee/detail/${row.id}`)" type="text">查看</el-button>
  • 配置详情的路由支持新增模式和编辑模式(src/router/modules/employee.js)
  • ?标识可有可无,可以传id也可以不传,页面都能正确显式
{
  path:'/employee/detail/:id?',//
  component:()=>import('@/views/employee/detail.vue'),
  hidden:true,
  meta:{
    title:'员工详情'  
  }
}
  • 员工详情判断是否有id,有id就查询详情数据(src/views/employee/detail.vue)
created(){
  //获取路由参数中的id
  this.$route.params.id && this.getEmployeeDetail()
},
methods:{
  async getEmployeeDetail(){
    this.userInfo = await  getEmployeeDetail(this.$route.params.id)
  }
}

12.员工详情-编辑员工-保存

在这里插入图片描述

  • 更新员工的接口(src/api/employee.js)
 //更新员工
 export function updateEmployee(data){
    return request({
        url:`/sys/user/${data.id}`,
        method:'put',
        data
    })
 }
  • 保存时区分保存和新增(src/views/employee/detail.vue)
 saveData(){
        this.$refs.userForm.validate(async isOK=>{
            if(isOK){
                //编辑模式
                if(this.$route.params.id){
                    await updateEmployee(this.userInfo)
                    this.$message.success('更新成功')
                }else{
                      //校验通过
                    await addEmployee(this.userInfo)
                    this.$message.success('新增员工成功')
                }
              
               this.$router.push('/employee')
            }
        })
    },
  • 当编辑模式时,让手机号不可编辑(src/views/employee/detail.vue)
 <el-input
        v-model="userInfo.mobile"
        :disabled="!!$route.params.id"
        size="mini"
        class="inputW"
  />

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

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

相关文章

【区块链 + 智慧政务】涉税行政事业性收费“e 链通”项目 | FISCO BCOS应用案例

国内很多城市目前划转至税务部门征收的非税收入项目已达 17 项&#xff0c;其征管方式为行政主管部门核定后交由税务 部门征收。涉税行政事业性收费受限于传统的管理模式&#xff0c;缴费人、业务主管部门、税务部门、财政部门四方处于 相对孤立的状态&#xff0c;信息的传递靠…

【Diffusion学习】【生成式AI】Diffusion Model 原理剖析 (2/4) (optional)【公式推导】

文章目录 影像生成模型本质上的共同目标【拟合分布】Maximum Likelihood Estimation VAE 影像生成模型本质上的共同目标【拟合分布】 Maximum Likelihood Estimation VAE

图片服务器是什么?常见的图片服务器是哪几种?图片服务器的要求是什么?

什么是图片服务器 图片服务器&#xff0c;顾名思义就是专门用于处理图片的服务器&#xff0c;向外提供图片的上传&#xff0c;下载&#xff0c;图片展示等服务 为什么我们要使用专门的服务器处理图片 图片的数据量比文字展示高得多&#xff0c;图片的上传下载展示一系列操作…

Linux进程——进程优先级与僵尸进程孤儿进程

文章目录 僵尸进程变成僵尸状态的过程 孤儿进程进程优先级如何修改进程优先级为什么优先级有范围 僵尸进程 僵尸状态进程本质上就是死亡状态 在进程死亡之后&#xff0c;不会直接对进程进行释放&#xff0c;而是先会处理一些后事 进程在结束退出的时候&#xff0c;也会有一些…

介绍 Elasticsearch 中的 Learning to Tank - 学习排名

作者&#xff1a;来自 Elastic Aurlien Foucret 从 Elasticsearch 8.13 开始&#xff0c;我们提供了原生集成到 Elasticsearch 中的学习排名 (learning to rank - LTR) 实现。LTR 使用经过训练的机器学习 (ML) 模型为你的搜索引擎构建排名功能。通常&#xff0c;该模型用作第二…

CSA笔记1-基础知识和目录管理命令

[litonglocalhost ~]$ 是终端提示符&#xff0c;类似于Windows下的cmd的命令行 litong 当前系统登录的用户名 分隔符 localhost 当前机器名称&#xff0c;本地主机 ~ 当前用户的家目录 $ 表示当前用户为普通用户若为#则表示当前用户为超级管理员 su root 切换root权限…

我利用ChatGPT开发了一个网盘资源搜索神器APP

首先声明,本文不是买东西,仅分享个人利用ChatGPT开发项目的个人经验分享。 之前已经开发完Web端网盘资源搜索引擎,而在安卓平台使用浏览器访问总是有点不方便,于是考虑开发一个安卓端APP。 可是,自己并没有开发APP经验,那怎么办? 都说AI可以帮你搞定一切,那就用一用…

python项目读取oracle数据库方法(cx_Oracle库实现)

目录 创建一个python项目&#xff0c;并配置运行环境 查看oracle对应数据库版本&#xff08;该标题下内容只是为了查看版本&#xff0c;不用在意&#xff09; 从oracle官网下载对应版本的oracle客户端 解压下载的压缩包&#xff0c;并获取依赖 将依赖文件导入python项目运…

Perl之正则表达式

正则表达式(regular expression)描述了一种字符串匹配的模式&#xff0c;可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。   Perl语言的正则表达式功能非常强大&#xff0c;基本上是常用语言中最强大的&#xff0c;很多语言…

论 Suspense 组件在 Vue 3 中的重要性

大家好,我是CodeQi! 一位热衷于技术分享的码仔。 你是否曾经遇到过在加载大量数据时,界面卡顿或是空白的问题? 如果你正在开发一个复杂的前端项目,那么一定需要处理很多异步数据请求。而异步请求太多就会导致用户看到空白屏幕时间变长,这对用户体验非常不友好。🤔 在…

【C++】C++11的新特性 --- 列表初始化,auto关键字,decltype关键字

人的理想与成就之间有一段距离 只有靠他的热情才能跨越。 -- 纪伯伦 C11特性 1 C 11介绍2 列表初始化3 声明3.1 auto关键字3.2 decltype关键字3.3 nullptr3.4 总结 4 STL中的新容器4.1 array4.2 forward_list4.3 unordered系列 Thanks♪(&#xff65;ω&#xff65;)&#x…

springboot项目 导入 maven坐标 错误 Could not transfer artifact XXX

1.报错原因 当时导入的是 redis坐标 &#xff0c;导入jar 包报错&#xff08;当时是网速太慢了&#xff0c;一直卡着不动 就关了 idea 重新下载&#xff09;结果报错 之前的redis 项目都可以的&#xff0c;网上找了一下 都没解决 2.解决办法 既然说不能传输&#xff0c; 就说…

玩转HarmonyOS NEXT之AppStorage应用全局UI状态存储

概述 AppStorage是应用全局的UI状态存储&#xff0c;是和应用的进程绑定的&#xff0c;由UI框架在应用程序启动时创建&#xff0c;为应用程序UI状态属性提供中央存储。 AppStorage是在应用启动的时候会被创建的单例。它的目的是为了提供应用状态数据的中心存储&#xff0c;这…

【Pytorch】数据集的加载和处理(一)

Pytorch torchvision 包提供了很多常用数据集 数据按照用途一般分为三组&#xff1a;训练&#xff08;train&#xff09;、验证&#xff08;validation&#xff09;和测试&#xff08;test&#xff09;。使用训练数据集来训练模型&#xff0c;使用验证数据集跟踪模型在训练期间…

Andriod Stdio新建Kotlin的Jetpack Compose简单项目

1.选择 No Activity 2.选择kotlin 4.右键选择 在目录MyApplication下 New->Compose->Empty Project 出现下面的画面 Finish 完成

SpringAI简单使用

Ollama 简介 Ollama是一个开源的大型语言模型服务工具&#xff0c;它允许用户在本地机器上构建和运行语言模型&#xff0c;提供了一个简单易用的API来创建、运行和管理模型&#xff0c;同时还提供了丰富的预构建模型库&#xff0c;这些模型可以轻松地应用在多种应用场景中。O…

数据库第6次作业

内容 1、创建视图v_emp_dept_id_1&#xff0c;查询销售部门的员工姓名和家庭住址 2、创建视图v_emp_dept&#xff0c;查询销售部门员工姓名和家庭住址及部门名称。 3、创建视图v_dept_emp_count(dept_name,emp_count,avg_salay)&#xff0c;统计每个部门人数并计算平均工资。 …

【漏洞复现】泛微e-cology9 WorkflowServiceXml SQL注入漏洞

文章目录 前言漏洞描述影响范围 漏洞复现nuclei脚本 安全修复 前言 泛微协同管理应用平台e-cology是一套兼具企业信息门户、知识文档管理、工作流程管理、人力资源管理、客户关系管理、项目管理、财务管理、资产管理、供应链管理、数据中心功能的企业大型协同管理平台。 漏洞…

03MFC画笔/画刷/画椭圆/圆/(延时)文字

文章目录 画实心矩形自定义画布设计及使用连续画线及自定义定义变量扇形画椭圆/圆输出颜色文本定时器与定时事件画实心矩形 自定义画布设计及使用 连续画线及自定义定义变量 扇形 画椭圆/圆 输出颜色文本

【应急响应】Windows应急响应手册(准备阶段、挖矿病毒)

文章目录 前言一、事前准备操作系统基本配置工具准备 二、挖矿病毒确定IOC信息获取异常进程的pid寻找恶意样本确定进程启动时间处理异常进程 前言 本篇文章主要以WIndows系统为例围绕红蓝对抗和攻防角度实施应急响应的技术手段&#xff0c;以多方面、多维度进行展开&#xff0…