Files
JY1.0/src/views/TechnologyCenter/ImprotPartDrawing/index.vue
2026-05-21 09:46:02 +08:00

910 lines
30 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<div class="app-container">
<el-card style="height: 850px;padding: 0">
<el-tabs
v-model="PartType"
type="border-card"
@tab-click="pageCurrent=1;pageCurrent1=1;searchTable();searchTable1()">
<el-tab-pane label="零件图纸" name="零件图纸">
<div style="margin-top: 7px; margin-bottom: 7px">
<el-input
v-model="partsName"
size="small"
placeholder="图号"
clearable
style="float: left;width: 200px"/>
<el-button
type="primary"
plain
icon="el-icon-search"
size="small"
style="float: left;margin-left:10px"
@click="pageCurrent=1;searchTable()">查询
</el-button>
<el-button
type="danger"
style="margin-left: 90px;"
size="small"
icon="el-icon-delete"
plain
@click="deletePart">删除
</el-button>
<!-- <el-upload
:action="action"
:on-success="uploadSuccess"
:on-error="uploadFailure"
:show-file-list="showFileList"
:file-list="fileList"
style="float: left;"
class="upload-demo"
multiple>
<el-button
type="primary"
style="margin-left: 10px; width:120px"
size="small"
icon="el-icon-upload2"
plain
@click="batchImportOfDrawings">零件图
</el-button>
</el-upload>
<el-button
type="distribution"
style="margin-left: 10px; width:120px"
size="small"
icon="el-icon-upload2"
plain
@click="openDialog">总图
</el-button> -->
</div>
<div style="margin-top: 10px">
<el-table
v-loading="loading"
:data="tableData"
highlight-current-row
border
stripe
size="small"
style="width: 681px"
height="710px"
@selection-change="handleSelectionChange">
<el-table-column type="selection" align="center" width="50px"/>
<el-table-column :width="setColumnWidth('序号')" type="index" label="序号" align="center"/>
<!--<el-table-column width="170px" label="零件名称" align="center">
<template slot-scope="scope">
{{ scope.row.name }}
</template>
</el-table-column>-->
<el-table-column width="140px" label="图号/型号" align="center" show-overflow-tooltip>
<template slot-scope="scope">
{{ scope.row.name }}
</template>
</el-table-column>
<el-table-column :width="setColumnWidth('文件格式')" label="文件格式" align="center">
<template slot-scope="scope">
{{ scope.row.suffix }}
</template>
</el-table-column>
<el-table-column :width="setColumnWidth('导入时间')" label="导入时间" align="center">
<template slot-scope="scope">
{{ scope.row.导入时间 }}
</template>
</el-table-column>
<el-table-column :width="setColumnWidth('导入人')" label="导入人" align="center">
<template slot-scope="scope">
{{ scope.row.导入人 }}
</template>
</el-table-column>
<el-table-column label="操作" align="center">
<template slot-scope="scope">
<el-tooltip :open-delay="700" effect="dark" content="PLM" placement="top">
<el-button type="text" icon="el-icon-connection" size="mini" @click="handlePLM(scope.row)">PLM</el-button>
</el-tooltip>
<el-tooltip :open-delay="700" effect="dark" content="查看或删除图纸" placement="top">
<el-button type="text" icon="el-icon-picture-outline" size="mini" @click="getNum(scope.row)"/>
</el-tooltip>
</template>
</el-table-column>
</el-table>
</div>
<div class="block" style="margin-top: 10px;">
<el-pagination
:current-page="pageCurrent"
:page-sizes="[10, 20, 30, 40, 100]"
:page-size="pageSize"
:total="total"
layout="total, sizes, prev, pager, next, jumper"
@size-change="handleSizeChanges"
@current-change="handleCurrentChanges"/>
</div>
</el-tab-pane>
<el-tab-pane label="产品图纸" name="产品图纸">
<div style="margin-top: 7px; margin-bottom: 7px">
<el-cascader
ref="cascader"
:options="product"
:show-all-levels="false"
placeholder="产品名称"
clearable
style="float: left"
size="small"
@clear="clearData"
@change="getData"/>
<!-- <el-upload
:action="action2"
:on-success="uploadSuccess2"
:on-error="uploadFailure2"
:show-file-list="showFileList2"
:file-list="fileList2"
class="upload-demo"
multiple>
<el-button
type="primary"
style="margin-left: 290px; width:120px"
size="small"
icon="el-icon-upload2"
plain
@click="batchImportOfDrawings1">产品图
</el-button>
</el-upload> -->
</div>
<div style="margin-top: 10px">
<el-table
v-loading="loading"
:data="tableData1"
highlight-current-row
border
stripe
size="small"
style="width: 611px"
height="710px">
<el-table-column :width="setColumnWidth('序号')" label="序号" type="index" align="center"/>
<el-table-column :width="setColumnWidth('产品名称')" label="产品名称" align="center">
<template slot-scope="scope">
{{ scope.row.name }}
</template>
</el-table-column>
<el-table-column :width="setColumnWidth('文件格式')" label="文件格式" align="center">
<template slot-scope="scope">
{{ scope.row.suffix }}
</template>
</el-table-column>
<el-table-column :width="setColumnWidth('导入时间')" label="导入时间" align="center">
<template slot-scope="scope">
{{ scope.row.导入时间 }}
</template>
</el-table-column>
<el-table-column :width="setColumnWidth('导入人')" label="导入人" align="center">
<template slot-scope="scope">
{{ scope.row.导入人 }}
</template>
</el-table-column>
<el-table-column :width="setColumnWidth('操作')" label="操作" align="center">
<template slot-scope="scope">
<el-tooltip :open-delay="700" effect="dark" content="查看或删除图纸" placement="top">
<el-button type="text" icon="el-icon-picture-outline" size="mini" @click="getNum1(scope.row)"/>
</el-tooltip>
</template>
</el-table-column>
</el-table>
</div>
<div class="block" style="margin-top: 10px;">
<el-pagination
:current-page="pageCurrent1"
:page-sizes="[10, 20, 30, 40, 100]"
:page-size="pageSize1"
:total="total1"
layout="total, sizes, prev, pager, next, jumper"
@size-change="handleSizeChanges1"
@current-change="handleCurrentChanges1"/>
</div>
</el-tab-pane>
</el-tabs>
</el-card>
<el-dialog v-el-drag-dialog :visible.sync="dialogVisible" width="350px">
<div v-for="(file, key) in hadFile" :key="key">
<div class="wrapper">
<div class="content">
<div class="action">
<a v-show="isDeleteShow" class="delete" @click="deleteFileData(file.id)">删除</a>
</div>
<div v-if="file.suffix==='pdf'" class="icon">
<svg-icon icon-class="pdf"/>
</div>
<div v-else-if="file.suffix==='docx'||file.suffix === 'doc'" class="icon">
<svg-icon icon-class="doc"/>
</div>
<div v-else-if="file.suffix==='xlsx' || file.suffix === 'xls'" class="icon">
<svg-icon icon-class="excel"/>
</div>
<div v-else-if="file.suffix==='pptx' || file.suffix === 'ppt'" class="icon">
<svg-icon icon-class="ppt"/>
</div>
<div v-else-if="file.suffix==='jpg' || file.suffix === 'jpeg'|| file.suffix === 'png'" class="icon">
<svg-icon icon-class="pic"/>
</div>
<div v-else class="icon">
<svg-icon icon-class="file"/>
</div>
<a id="appUrl" :href="file.url" target="view_window">
<div class="info">{{ file.name }}</div>
</a>
</div>
</div>
</div>
</el-dialog>
<el-dialog
v-el-drag-dialog
:visible.sync="dialogVisibleMachine"
width="22%">
<span>订单编号</span>
<el-select
v-model="orderValue"
:remote-method="getOrder"
clearable
filterable
size="small"
placeholder="订单编号"
remote
@change="changeOrder">
<el-option
v-for="item in orderArray"
:key="item.value"
:label="item.label"
:value="item.value"/>
</el-select>
<div style="float: right;margin-right: 20px">
<el-upload
:disabled="disabledMachine"
:action="action1"
:on-success="uploadSuccess1"
:on-error="uploadFailure1"
:show-file-list="showFileList1"
:file-list="fileList1"
class="upload-demo"
multiple>
<el-button :disabled="disabledMachine" size="small" type="shengcheng">点击上传</el-button>
</el-upload>
</div>
<div v-for="(file, key) in hadFile1" :key="key">
<div class="wrapper">
<div class="content">
<div class="action">
<a class="delete" @click="deleteFileData1(file.id)">删除</a>
</div>
<div v-if="file.suffix==='pdf'" class="icon">
<svg-icon icon-class="pdf"/>
</div>
<div v-else-if="file.suffix==='docx'||file.suffix === 'doc'" class="icon">
<svg-icon icon-class="doc"/>
</div>
<div v-else-if="file.suffix==='xlsx' || file.suffix === 'xls'" class="icon">
<svg-icon icon-class="excel"/>
</div>
<div v-else-if="file.suffix==='pptx' || file.suffix === 'ppt'" class="icon">
<svg-icon icon-class="ppt"/>
</div>
<div v-else-if="file.suffix==='jpg' || file.suffix === 'jpeg'|| file.suffix === 'png'" class="icon">
<svg-icon icon-class="pic"/>
</div>
<div v-else class="icon">
<svg-icon icon-class="file"/>
</div>
<a id="appUrl1" :href="file.url" target="view_window">
<div class="info">{{ file.name }}</div>
</a>
</div>
</div>
</div>
</el-dialog>
<el-dialog v-el-drag-dialog :visible.sync="dialogVisible1" width="350px">
<div v-for="(file, key) in hadFile2" :key="key">
<div class="wrapper">
<div class="content">
<div class="action">
<a v-show="isDeleteShow1" class="delete" @click="deleteFileData2(file.id)">删除</a>
</div>
<div v-if="file.suffix==='pdf'" class="icon">
<svg-icon icon-class="pdf"/>
</div>
<div v-else-if="file.suffix==='docx'||file.suffix === 'doc'" class="icon">
<svg-icon icon-class="doc"/>
</div>
<div v-else-if="file.suffix==='xlsx' || file.suffix === 'xls'" class="icon">
<svg-icon icon-class="excel"/>
</div>
<div v-else-if="file.suffix==='pptx' || file.suffix === 'ppt'" class="icon">
<svg-icon icon-class="ppt"/>
</div>
<div v-else-if="file.suffix==='jpg' || file.suffix === 'jpeg'|| file.suffix === 'png'" class="icon">
<svg-icon icon-class="pic"/>
</div>
<div v-else class="icon">
<svg-icon icon-class="file"/>
</div>
<a id="appUrl2" :href="file.url" target="view_window">
<div class="info">{{ file.name }}</div>
</a>
</div>
</div>
</div>
</el-dialog>
</div>
</template>
<script>
import { mapGetters } from 'vuex'
import request, { MESDownloadFile, MESUploadFile, MESUploadFileProduct, uploadFileMachine } from '@/utils/request'
export default {
data() {
return {
PartType: '零件图纸',
action: '',
showFileList: false,
hadFile: [],
fileList: [],
multipleSelection_variable: [],
multipleSelection: [],
dialogVisible: false,
close: false, // 是否显示关闭按钮
isDeleteShow: false,
deleteShow: '1',
action1: '',
showFileList1: false,
hadFile1: [],
fileList1: [],
disabledMachine: true,
dialogVisibleMachine: false,
action2: '',
showFileList2: false,
dialogVisible1: false,
isDeleteShow1: false,
hadFile2: [],
fileList2: [],
orderValue: '',
orderArray: [],
machineToolName: '',
machineTool: [],
productValue: '',
productValue1: '',
product: [],
partsName: '',
loading: false, // 数据加载
total: 0, // 分页总数
total1: 0, // 分页总数
tableData: [],
tableData1: [],
pageCurrent: 1, // 分页当前页
pageSize: 100, // 分页每页显示条数
pageCurrent1: 1, // 分页当前页
pageSize1: 100, // 分页每页显示条数
orderName: '', // 排序列名
order: '' // 排序方式
}
},
computed: {
...mapGetters([
'id',
'token'
])
},
created() {
this.fetchData()
this.searchTable()
},
methods: {
fetchData() {
this.getTreeData()
this.getOrder()
},
handleSelectionChange(val) {
this.multipleSelection = val
},
deletePart() {
if (this.multipleSelection.length === 0) {
this.$message.warning('请选择要删除的零件图!')
return
}
this.$confirm('此操作将永久删除图纸, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
const materialGroup = []
this.multipleSelection_variable = this.multipleSelection
this.multipleSelection = []
for (let i = 0; i < this.multipleSelection_variable.length; i++) {
materialGroup[i] = this.multipleSelection_variable[i].uid
}
var param = []
param[0] = ['uid组', materialGroup]
var Data = this.CreateData('12', '机加工MES_零件图PDF表_删除数据', param)
this.ExecDatabase(Data).then(response => {
if (response.data[0].result === '1') {
this.$message.success('删除成功')
this.searchTable()
this.$refs.multipleTable.clearSelection()
} else {
this.$message.success('选入失败')
}
})
}).catch(() => {
this.$message({
type: 'info',
message: '已取消删除'
})
})
},
getOrder(query) {
this.orderArray = []
var param = []
param[0] = ['订单编号', query]
var Data = this.CreateData('11', '订单信息_列表_查询数据_bak', param)
this.ExecDatabase(Data).then(response => {
for (let i = 0; i < response.data.length; i++) {
this.orderArray.push({
label: response.data[i].订单编号,
value: response.data[i].订单流水号
})
}
})
},
getProduct() {
var param = []
var Data = this.CreateData('11', '产品信息_基础表_查询数据', param)
this.ExecDatabase(Data).then(response => {
for (let i = 0; i < response.data.length; i++) {
this.product.push({
label: response.data[i].产品名称,
value: response.data[i].产品名称
})
}
})
},
searchTable() {
let partsName_check
this.partsName ? partsName_check = 1 : partsName_check = 0
var param = []
param[0] = ['零件图号_check', partsName_check]
param[1] = ['零件图号', this.partsName]
var Data = this.CreateData('11', '技术中心_零件图维护_查询', param, this.pageSize, this.pageCurrent)
this.ExecDatabase(Data).then(response => {
this.tableData = response.data.rows
this.total = response.data.total
})
},
getTreeData() {
var param = []
param[0] = ['子节点', 0]
var Data = this.CreateData('11', '产品关系_查询节点', param)
this.ExecDatabase(Data).then(response => {
const data = response.data
this.product = this.tree(data, 0)
})
},
tree(data, pid) {
const result = []
let temp
for (let i = 0; i < data.length; i++) {
if (data[i].父节点 === pid) {
const obj = { label: data[i].节点名称, value: data[i].子节点 }
temp = this.tree(data, data[i].子节点)
if (temp.length > 0) {
obj.children = temp
}
result.push(obj)
}
}
return result
},
clearData() {
this.productValue = ''
this.searchTable()
},
getData(val) {
this.productValue1 = val[val.length - 1]
var param = []
param[0] = ['产品流水号', this.productValue1]
var Data = this.CreateData('11', '产品关系_获取产品名称', param)
this.ExecDatabase(Data).then(response => {
this.productValue = response.data[0].产品名称
}).then(() => {
this.searchTable1()
})
},
searchTable1() {
let productValue_check
this.productValue ? productValue_check = 1 : productValue_check = 0
var param = []
param[0] = ['产品名称_check', productValue_check]
param[1] = ['产品名称', this.productValue]
var Data = this.CreateData('11', '技术中心_产品图维护_查询', param, this.pageSize1, this.pageCurrent1)
this.ExecDatabase(Data).then(response => {
this.tableData1 = response.data.rows
this.total1 = response.data.total
})
},
batchImportOfDrawings() {
this.action = `${MESUploadFile}?&num=1&tableName=机加工MES_零件图PDF表&type=1&UploaderName=${this.id}`
},
batchImportOfDrawings1() {
this.action2 = `${MESUploadFileProduct}?&num=1&tableName=图纸维护_产品图纸&type=1&UploaderName=${this.id}`
},
uploadSuccess(res, file, fileList) {
this.searchTable()
console.log(res, fileList, 1111)
if (res[0].result === '1') {
const index = fileList.indexOf(file)
fileList.splice(index, 1)
} else {
this.str = res[0].result
this.arr = this.str.split('|')
if (this.arr[1] === '无该零件') {
this.$notify.error({
title: '提示',
message: `${this.arr[0]}该零件不存在,请检查上传文件名称是否正确!`,
duration: 0
})
}
if (this.arr[1] === '重复') {
this.$notify.error({
title: '提示',
message: `${this.arr[0]}请勿重复上传!`,
duration: 0
})
}
if (this.arr[1] === '零件图号不正确') {
this.$notify.error({
title: '提示',
message: `${this.arr[0]}和所选图号不符!`,
duration: 0
})
}
}
if (fileList.length === 0) {
this.$message.success('文件上传成功')
}
},
uploadFailure(res, file, fileList) {
fileList.map(file => {
this.$message.error(`${file.name}文件上传失败,请检查上传文件是否正确!`)
})
},
uploadSuccess2(res, file, fileList) {
this.searchTable1()
if (res[0].result === '1') {
const index = fileList.indexOf(file)
fileList.splice(index, 1)
} else {
this.str = res[0].result
this.arr = this.str.split('|')
if (this.arr[1] === '无该产品') {
this.$notify.error({
title: '提示',
message: `${this.arr[0]}该产品不存在,请检查上传文件名称是否正确!`,
duration: 0
})
}
if (this.arr[1] === '重复') {
this.$notify.error({
title: '提示',
message: `${this.arr[0]}请勿重复上传!`,
duration: 0
})
}
if (this.arr[1] === '产品名称不正确') {
this.$notify.error({
title: '提示',
message: `${this.arr[0]}和所选产品不符!`,
duration: 0
})
}
}
if (fileList.length === 0) {
this.$message.success('文件上传成功')
}
},
uploadFailure2(res, file, fileList) {
fileList.map(file => {
this.$message.error(`${file.name}文件上传失败,请检查上传文件是否正确!`)
})
},
// 查看零件图
handlePLM(row) {
const msgId = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
const r = Math.random() * 16 | 0
const v = c === 'x' ? r : (r & 0x3 | 0x8)
return v.toString(16)
})
request({
url: 'http://192.168.1.27:9982/api/GetMaterialDrawingUrl',
method: 'post',
data: {
msgId: msgId,
materialCode: row.物料编码
}
}).then(response => {
if (response.data.Code === '200' && response.data.Data.url) {
window.open(response.data.Data.url, '_blank')
} else {
this.$message.warning('PLM未返回有效链接')
}
}).catch(() => {
this.$message.error('PLM请求发送失败')
})
},
getNum(row) {
this.num = row.num
this.dialogVisible = true
this.getFileList(row.name)
},
async getFileList(value) {
this.hadFile = []
this.deleteShow === '1' ? this.isDeleteShow = true : this.isDeleteShow = false
if (value) {
await request({
url: '',
method: 'post',
data: {
type: '3',
name: `select * from 机加工MES_零件图PDF表 where 是否启用 = 1 and name = '${value}'`
}
}).then(data => {
this.suffix = data.data
if (data.data.length > 0) {
const server = `${MESDownloadFile}`.split('/')
data.data.map(item => {
this.hadFile.push({
url: `http://${server[2]}/webpage/part/${item.uid}.${item.suffix}`,
name: `${item.name}.${item.suffix}`,
suffix: item.suffix,
id: item.uid
})
})
}
})
}
},
// 删除零件图
async deleteFileData(id) {
this.$confirm('此操作将永久删除该行, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
request({
url: '',
method: 'post',
data: {
type: '3',
name: `delete from 机加工MES_零件图PDF表 where uid = N'${id}'`
}
}).then(response => {
if (response.data.length === 0) {
this.$message.success('删除成功')
this.dialogVisible = false
this.getFileList(this.num)
this.searchTable()
} else {
this.$message.error('删除失败')
this.dialogVisible = false
this.getFileList(this.num)
}
})
}).catch(() => {
this.$message({
type: 'info',
message: '已取消删除'
})
})
},
getNum1(row) {
this.num = row.num
this.dialogVisible1 = true
this.getFileList1(row.name)
},
async getFileList1(value) {
this.hadFile2 = []
this.deleteShow === '1' ? this.isDeleteShow1 = true : this.isDeleteShow1 = false
if (value) {
await request({
url: '',
method: 'post',
data: {
type: '3',
name: `select * from 图纸维护_产品图纸 where 是否启用 = 1 and name = '${value}'`
}
}).then(data => {
this.suffix = data.data
if (data.data.length > 0) {
const server = `${MESDownloadFile}`.split('/')
data.data.map(item => {
this.hadFile2.push({
url: `http://${server[2]}/webpage/part/${item.uid}.${item.suffix}`,
name: `${item.name}.${item.suffix}`,
suffix: item.suffix,
id: item.uid
})
})
}
})
}
},
// 删除零件图
async deleteFileData2(id) {
this.$confirm('此操作将永久删除该行, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
request({
url: '',
method: 'post',
data: {
type: '3',
name: `delete from 图纸维护_产品图纸 where uid = N'${id}'`
}
}).then(response => {
if (response.data.length === 0) {
this.$message.success('删除成功')
this.dialogVisible1 = false
this.getFileList1(this.num)
this.searchTable1()
} else {
this.$message.error('删除失败')
this.dialogVisible1 = false
this.getFileList1(this.num)
}
})
}).catch(() => {
this.$message({
type: 'info',
message: '已取消删除'
})
})
},
openDialog() {
this.orderValue = []
this.hadFile1 = []
this.disabledMachine = true
this.dialogVisibleMachine = true
},
changeOrder() {
this.orderValue === '' ? this.disabledMachine = true : this.disabledMachine = false
this.action1 = `${uploadFileMachine}?&MachineNum=${this.orderValue}`
this.getFileData(this.orderValue)
},
uploadSuccess1(res, file, fileList) {
if (res[0].result === '1') {
const index = fileList.indexOf(file)
fileList.splice(index, 1)
} else {
this.$message.error(`${file.name}文件上传失败,请检查上传文件是否正确!`)
}
if (fileList.length === 0) {
this.$message.success('文件上传成功')
this.getFileData(this.orderValue)
}
},
uploadFailure1(a, file, fileList) {
fileList.map(file => {
this.$message.error(`${file.name}文件上传失败,请检查上传文件是否正确!`)
})
},
// 在什么情况下需要查询上传的附件调用this.getFileData()即可根据
getFileData(orderValue) {
this.hadFile1 = []
var param = []
param[0] = ['订单流水号', orderValue]
var Data = this.CreateData('11', 'PDM_机床总图_查询数据', param)
this.ExecDatabase(Data).then(res => {
this.suffix = res.data
if (res.data.length > 0) {
const server = `${MESDownloadFile}`.split('/')
res.data.map(item => {
this.hadFile1.push({
url: `http://${server[2]}/webpage/file/${item.文件标识}.${item.文件后缀}`,
name: `${item.文件名称}.${item.文件后缀}`,
suffix: item.文件后缀,
id: item.文件标识
})
})
}
})
},
deleteFileData1(id) {
var param = []
param[0] = ['文件标识', id]
var Data = this.CreateData('12', 'PDM_机床总图_删除数据', param)
this.ExecDatabase(Data).then(res => {
if (res.data[0].result === '1') {
this.getFileData(this.orderValue)
this.$message.success('删除成功')
} else {
this.$message.success('删除失败')
}
})
},
handleSizeChanges(val) {
this.pageCurrent = 1
this.pageSize = val
this.searchTable()
},
handleCurrentChanges(val) {
this.pageCurrent = val
this.searchTable()
},
handleSizeChanges1(val) {
this.pageCurrent1 = 1
this.pageSize1 = val
this.searchTable()
},
handleCurrentChanges1(val) {
this.pageCurrent1 = val
this.searchTable()
}
}
}
</script>
<style scoped lang="scss">
/deep/ .el-card__body {
padding: 0px !important;
}
</style>
<style scoped>
.wrapper {
width: 90%;
height: 50px;
overflow: hidden;
border: 1px solid #b8c7d9;
/*float: left;*/
margin: 10px;
}
.content {
position: relative;
padding: 8px 8px 0 8px;
}
.action {
position: absolute;
top: 2px;
right: 8px;
}
.delete {
padding: 0 5px;
border-radius: 3px;
color: #0f84b0;
font-size: 12px;
}
.delete:hover {
background: -webkit-linear-gradient(top, #0ba9e3, #0099d3);
color: #fff;
}
a {
text-decoration: none;
}
.icon {
width: 30px;
height: 30px;
display: inline-block;
margin-right: 7px;
margin-top: 2px;
font-size: 26px;
}
.info {
width: 160px;
height: 50px;
position: absolute;
left: 44px;
line-height: 30px;
display: inline-block;
color: #999;
}
</style>