¶Ô±ÈÐÂÎļþ |
| | |
| | | import request from "@/utils/request"; |
| | | |
| | | // ä»»èææè®°å½æ¥è¯¢è¡¨æ ¼ |
| | | export function PersonPostAuthorizationRecordPage(query) { |
| | | return request({ |
| | | url: "/personPostAuthorizationRecord/PersonPostAuthorizationRecordPage", |
| | | method: "get", |
| | | params: query |
| | | }); |
| | | } |
| | | // ä»»èææè®°å½å é¤ |
| | | export function deletePersonPostAuthorizationRecord(query) { |
| | | return request({ |
| | | url: "/personPostAuthorizationRecord/deletePersonPostAuthorizationRecord", |
| | | method: "delete", |
| | | params: query |
| | | }); |
| | | } |
| | | // ä»»èææå¯¼åº |
| | | export function exportPersonPostAuthorizationRecord(query) { |
| | | return request({ |
| | | url: "/personPostAuthorizationRecord/exportPersonPostAuthorizationRecord", |
| | | method: "get", |
| | | params: query, |
| | | responseType: "blob" |
| | | }); |
| | | } |
| | | // ä»»èææå¯¼åº |
| | | export function addOrUpdatePersonPostAuthorizationRecord(query) { |
| | | return request({ |
| | | url: "/personPostAuthorizationRecord/addOrUpdatePersonPostAuthorizationRecord", |
| | | method: "post", |
| | | data: query, |
| | | }); |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="add"> |
| | | <el-dialog |
| | | :title="isEdit ?'ç¼è¾éä»¶èµæ':'æ°å¢éä»¶èµæ'" |
| | | :visible.sync="dialogVisible" |
| | | width="50%" |
| | | > |
| | | <el-form |
| | | ref="ruleForm" |
| | | :rules="rules" |
| | | :model="form" |
| | | label-width="130px" |
| | | size="medium" |
| | | > |
| | | <el-form-item label="è¯ä¹¦ç¼å·" prop="certificateNumber"> |
| | | <el-input v-model="form.certificateNumber" placeholder="请è¾å
¥" style="width: 100%"> |
| | | </el-input> |
| | | </el-form-item > |
| | | <el-form-item label="被任è人å" prop="userId"> |
| | | <el-select v-model="form.userId" placeholder="è¯·éæ©"> |
| | | <el-option |
| | | v-for="(item, index) in userList" |
| | | :key="index" |
| | | :label="item.name" |
| | | :value="item.id" |
| | | ></el-option> |
| | | </el-select> |
| | | </el-form-item > |
| | | <el-form-item label="ä»»èå²ä½" prop="post"> |
| | | <el-input v-model="form.post" placeholder="请è¾å
¥"></el-input> |
| | | </el-form-item > |
| | | <el-form-item label="ç论èè¯æç»©" prop="num1"> |
| | | <el-input v-model="form.num1" placeholder="请è¾å
¥"></el-input> |
| | | </el-form-item > |
| | | <el-form-item label="æä½æè½èè¯æç»©" prop="num2"> |
| | | <el-input v-model="form.num2" placeholder="请è¾å
¥"></el-input> |
| | | </el-form-item > |
| | | <el-form-item label="æä½ç±»å" prop="operationType"> |
| | | <el-input v-model="form.operationType" placeholder="è¯·éæ©"></el-input> |
| | | </el-form-item > |
| | | <el-row> |
| | | <el-col :span="20"> |
| | | <el-form-item label="ä¸å²è¯ä¹¦"> |
| | | <el-input v-model="form.systemFileName" size="small" disabled> |
| | | <el-button slot="append" icon="el-icon-delete-solid" |
| | | @click="deleteFile(form.systemFileName)"></el-button> |
| | | </el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="4"> |
| | | <el-upload ref="upload" style="float: left; margin: 0 12px 0 20px;" :action="action" |
| | | :headers="uploadHeader" |
| | | :show-file-list="false" |
| | | :on-success="onSuccess"> |
| | | <el-button class="uploadFile" slot="trigger" size="small" type="primary">ä¸ä¼ </el-button> |
| | | </el-upload> |
| | | </el-col> |
| | | </el-row> |
| | | <el-form-item label="夿³¨"> |
| | | <el-input v-model="form.remarks" placeholder="è¯·éæ©"></el-input> |
| | | </el-form-item > |
| | | </el-form> |
| | | <div slot="footer" class="foot"> |
| | | <el-button @click="dialogVisible = false">å æ¶</el-button> |
| | | <el-button type="primary" :loading="loading" @click="submitForm">ç¡® å®</el-button> |
| | | </div> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | <script> |
| | | import {deleteCNASFile} from "@/api/cnas/personal/personalList"; |
| | | import {selectUserCondition} from "@/api/business/inspectionTask"; |
| | | import {addOrUpdatePersonPostAuthorizationRecord} from "@/api/cnas/personal/personPostAuthorizationRecord"; |
| | | |
| | | export default { |
| | | data() { |
| | | return { |
| | | isEdit: false, |
| | | dialogVisible: false, |
| | | form: { |
| | | id: undefined, |
| | | certificateNumber: undefined, |
| | | userId: undefined, |
| | | post: undefined, |
| | | operationType: undefined, |
| | | fileList: [], |
| | | fileName: undefined, |
| | | systemFileName: undefined, |
| | | remarks: undefined, |
| | | num2:undefined, |
| | | num1:undefined |
| | | }, |
| | | rules: { |
| | | certificateNumber: [{ required: true, message: '请è¾å
¥è¯ä¹¦ç¼å·', trigger: 'blur' }], |
| | | userId: [{ required: true, message: 'è¯·éæ©è¢«ä»»è人å', trigger: 'change' }], |
| | | post: [{ required: true, message: 'ä»»èå²ä½', trigger: 'blur' }], |
| | | operationType: [{ required: true, message: 'æä½ç±»å', trigger: 'blur' }], |
| | | }, |
| | | loading: false, |
| | | userList: [] |
| | | } |
| | | }, |
| | | computed: { |
| | | action() { |
| | | return this.javaApi + '/personBasicInfo/saveCNASFile' |
| | | } |
| | | }, |
| | | methods: { |
| | | onSuccess(response, file, fileList) { |
| | | this.$set(this.form, "systemFileName", response.data) |
| | | }, |
| | | deleteFile(fileName) { |
| | | deleteCNASFile({fileName: fileName}).then(res => { |
| | | this.$message.success('å 餿åï¼') |
| | | this.$set(this.form, "systemFileName", null) |
| | | }) |
| | | }, |
| | | async openDialog(row, type) { |
| | | await this.getUserList() |
| | | this.dialogVisible = true |
| | | if(type) { |
| | | this.isEdit = true |
| | | this.form.id = row.id |
| | | this.form.certificateNumber = row.certificateNumber |
| | | this.form.userId = Number(row.userId) |
| | | this.form.post = row.post |
| | | this.form.operationType = row.operationType |
| | | this.form.systemFileName = row.systemFileName |
| | | this.form.remarks = row.remarks |
| | | this.form.num1 = row.num1 |
| | | this.form.num2 = row.num2 |
| | | } else { |
| | | this.resetForm('ruleForm') |
| | | } |
| | | }, |
| | | closeDialog() { |
| | | this.resetForm('ruleForm') |
| | | this.dialogVisible = false |
| | | }, |
| | | /** |
| | | * @desc è·åç¨æ·ä¿¡æ¯ |
| | | */ |
| | | async getUserList() { |
| | | selectUserCondition().then((res) => { |
| | | this.userList = res.data; |
| | | }) |
| | | }, |
| | | /** |
| | | * @desc æäº¤è¡¨å |
| | | */ |
| | | submitForm() { |
| | | this.$refs.ruleForm.validate((valid) => { |
| | | if(valid) { |
| | | const params = { |
| | | id: this.form.id, |
| | | certificateNumber: this.form.certificateNumber, |
| | | userId: this.form.userId, |
| | | post: this.form.post, |
| | | operationType: this.form.operationType, |
| | | systemFileName: this.form.systemFileName, |
| | | remarks: this.form.remarks, |
| | | num1: this.form.num1, |
| | | num2: this.form.num2 |
| | | } |
| | | this.loading = true |
| | | addOrUpdatePersonPostAuthorizationRecord(params).then(res => { |
| | | this.loading = false |
| | | this.closeDialog() |
| | | this.$emit('refresh') |
| | | }).catch(err => { |
| | | this.loading = false |
| | | }) |
| | | } |
| | | }) |
| | | }, |
| | | /** |
| | | * @desc ä¸ä¼ æä»¶ |
| | | */ |
| | | beforeUpload(file) { |
| | | if (file.size > 1024 * 1024 * 10) { |
| | | this.$message.error('ä¸ä¼ æä»¶ä¸è¶
è¿10M'); |
| | | this.$refs.upload.clearFiles() |
| | | return false; |
| | | } else { |
| | | this.form.fileList = [file] |
| | | this.form.fileName = file.name |
| | | return true; |
| | | } |
| | | }, |
| | | } |
| | | } |
| | | </script> |
| | | <style scoped> |
| | | .foot { |
| | | width: 100%; |
| | | } |
| | | .add >>> .el-dialog__footer { |
| | | padding-right: 20px; |
| | | } |
| | | </style> |
| | |
| | | :departId="departId" |
| | | :isDepartment="isDepartment"></training-record> |
| | | </el-tab-pane> |
| | | <!-- <el-tab-pane label="ä»»èææè®°å½" name="ä»»èææè®°å½">--> |
| | | <!-- <Mandate v-if="activeName === 'ä»»èææè®°å½'" ref="manDateRef" :departId="departId" :isDepartment="isDepartment"></Mandate>--> |
| | | <!-- </el-tab-pane>--> |
| | | <el-tab-pane label="ä»»èææè®°å½" name="ä»»èææè®°å½"> |
| | | <Mandate v-if="activeName === 'ä»»èææè®°å½'" ref="manDateRef" :departId="departId" :isDepartment="isDepartment"></Mandate> |
| | | </el-tab-pane> |
| | | <!-- <el-tab-pane label="人åè½å" name="人åè½å">--> |
| | | <!-- <personnel-capacity v-if="activeName === '人åè½å'" ref="personnelCapacity"--> |
| | | <!-- :departId="departId"--> |
| | |
| | | <template> |
| | | <div class="flex_column"> |
| | | <!-- <TableCard :showForm="isDepartment" title="ä»»èææè®°å½">--> |
| | | <!-- <template v-slot:form>--> |
| | | <!-- <div v-if="isDepartment" class="w100 items_center justify_between">--> |
| | | <!-- <div></div>--> |
| | | <!-- <div>--> |
| | | <!-- <el-button size="small" type="primary" @click="openDialog">æ°å¢</el-button>--> |
| | | <!-- </div>--> |
| | | <!-- </div>--> |
| | | <!-- </template>--> |
| | | <!-- <template v-slot:table>--> |
| | | <!-- <ZTTable--> |
| | | <!-- :column="columnData"--> |
| | | <!-- :height="'calc(100vh - 21em)'"--> |
| | | <!-- :table-data="tableData"--> |
| | | <!-- :table-loading="loading"--> |
| | | <!-- style="margin-top: 18px; padding: 0 15px;"--> |
| | | <!-- ></ZTTable>--> |
| | | <!-- <el-divider></el-divider>--> |
| | | <!-- <div class="pagination">--> |
| | | <!-- <div></div>--> |
| | | <!-- <el-pagination--> |
| | | <!-- :page-size="pagination.pageSize"--> |
| | | <!-- :page-sizes="[10, 20, 30, 40]"--> |
| | | <!-- :total="pagination.total"--> |
| | | <!-- layout="total, sizes, prev, pager, next, jumper"--> |
| | | <!-- @current-change="currentChange"--> |
| | | <!-- @size-change="sizeChange"--> |
| | | <!-- >--> |
| | | <!-- </el-pagination>--> |
| | | <!-- </div>--> |
| | | <!-- </template>--> |
| | | <!-- </TableCard>--> |
| | | <Add ref="mandateModal" @refresh="getTableData"></Add> |
| | | <div class="flex_column"> |
| | | <div> |
| | | <div v-if="isDepartment" style="display: flex;justify-content: space-between;margin-bottom: 10px"> |
| | | <el-button size="small" type="primary" @click="getTableData">å·æ°</el-button> |
| | | <el-button size="small" type="primary" icon="el-icon-plus" @click="openDialog">æ°å¢</el-button> |
| | | </div> |
| | | <lims-table :tableData="tableData" :column="columnData" |
| | | @pagination="page" :height="'calc(100vh - 18em)'" |
| | | :page="pagination" :tableLoading="loading"></lims-table> |
| | | </div> |
| | | <Add ref="mandateModal" @refresh="getTableData"></Add> |
| | | </div> |
| | | </template> |
| | | <script> |
| | | // import Add from "./Add.vue" |
| | | import Add from "../components/mandateAdd.vue" |
| | | import limsTable from "@/components/Table/lims-table.vue"; |
| | | import { |
| | | deletePersonPostAuthorizationRecord, exportPersonPostAuthorizationRecord, |
| | | PersonPostAuthorizationRecordPage |
| | | } from "@/api/cnas/personal/personPostAuthorizationRecord"; |
| | | import {delCustomById} from "@/api/system/customer"; |
| | | |
| | | export default { |
| | | components: { |
| | | // Add |
| | | }, |
| | | components: { |
| | | limsTable, |
| | | Add |
| | | }, |
| | | props: { |
| | | departId: { |
| | | type: Number, |
| | |
| | | default: false |
| | | } |
| | | }, |
| | | data() { |
| | | return { |
| | | // departId: 0, |
| | | columnData: [ |
| | | { |
| | | label: 'åºå·', |
| | | prop: 'id' |
| | | }, { |
| | | label: 'è¯ä¹¦ç¼å·', |
| | | prop: 'certificateNumber' |
| | | }, { |
| | | label: '被任è人å', |
| | | prop: 'userName' |
| | | }, { |
| | | label: 'ä»»èå²ä½', |
| | | prop: 'post' |
| | | }, { |
| | | label: 'ç论èè¯æç»©', |
| | | prop: 'num1' |
| | | },{ |
| | | label: 'æä½æè½èè¯æç»©', |
| | | prop: 'num2' |
| | | },{ |
| | | label: 'æä½æ¶é´', |
| | | prop: 'updateTime' |
| | | }, { |
| | | label: '夿³¨', |
| | | prop: 'remarks', |
| | | width: 300 |
| | | }, { |
| | | label: 'æä½', |
| | | dataType: 'action', |
| | | width: 160, |
| | | fixed: 'right', |
| | | operation: [ |
| | | { |
| | | name: 'ç¼è¾', |
| | | type: 'text', |
| | | clickFun: (row) => { |
| | | this.openDialog(row, true) |
| | | } |
| | | }, { |
| | | name: 'ä¸è½½', |
| | | type: 'text', |
| | | clickFun: (row) => { |
| | | this.handleDown(row) |
| | | } |
| | | }, { |
| | | name: 'å é¤', |
| | | type: 'text', |
| | | color: '#f56c6c', |
| | | clickFun: (row) => { |
| | | this.deleteNotify(row.id) |
| | | } |
| | | } |
| | | ] |
| | | }, |
| | | ], |
| | | tableData: [], |
| | | pagination: { |
| | | current: 1, |
| | | pageSize: 20, |
| | | total: 0 |
| | | }, |
| | | loading: false |
| | | } |
| | | }, |
| | | mounted() { |
| | | this.getTableData() |
| | | console.log(this.departId) |
| | | }, |
| | | methods: { |
| | | openDialog(row, type=false) { |
| | | this.$refs.mandateModal.openDialog(row, type) |
| | | }, |
| | | /** |
| | | * @desc æ¥è¯¢è¡¨æ ¼æ°æ® |
| | | */ |
| | | async getTableData() { |
| | | this.loading = true |
| | | const params = this.isDepartment ? { |
| | | departLimsId: this.departId, |
| | | current: this.pagination.current, |
| | | size: this.pagination.pageSize |
| | | } : { |
| | | userId: this.departId, |
| | | current: this.pagination.current, |
| | | size: this.pagination.pageSize |
| | | } |
| | | const { code, data } = await this.$axios({ |
| | | method: 'get', |
| | | url: getPersonPostAuthorizationRecordPage, |
| | | params: params |
| | | }) |
| | | if(code == 200) { |
| | | this.pagination.total = data.total |
| | | this.tableData = data.records |
| | | this.loading = false |
| | | } |
| | | }, |
| | | /** |
| | | * @desc å½å页æ¹å |
| | | */ |
| | | currentChange(current) { |
| | | this.pagination.current = current |
| | | this.getTableData() |
| | | }, |
| | | /** |
| | | * @desc æ¯é¡µä¸ªæ°æ¹å |
| | | */ |
| | | sizeChange(pageSize) { |
| | | this.pagination.pageSize = pageSize |
| | | this.getTableData() |
| | | }, |
| | | /** |
| | | * @desc å é¤ä»»èè®°å½ |
| | | */ |
| | | deleteNotify(id) { |
| | | this.$confirm('æ¤æä½å°æ°¸ä¹
å é¤è¯¥æä»¶, æ¯å¦ç»§ç»?', 'æç¤º', { |
| | | confirmButtonText: 'ç¡®å®', |
| | | cancelButtonText: 'åæ¶', |
| | | type: 'warning' |
| | | }).then(() => { |
| | | this.delMandate(id) |
| | | }) |
| | | }, |
| | | /** |
| | | * @desc apiå é¤ |
| | | */ |
| | | async delMandate(id) { |
| | | const formData = new FormData() |
| | | formData.append('id', id) |
| | | const { code, data } = await this.$axios({ |
| | | method: 'delete', |
| | | url: deletePersonPostAuthorizationRecord, |
| | | data: formData, |
| | | noQs: true |
| | | }) |
| | | if(code == 200) { |
| | | this.$message({ message: 'å 餿å', type: 'success' }) |
| | | this.getTableData() |
| | | } else { |
| | | this.$message({ message: 'å é¤å¤±è´¥', type: 'error' }) |
| | | } |
| | | }, |
| | | /** |
| | | * @desc è·å设å¤id |
| | | */ |
| | | getDepart(id) { |
| | | this.departId = id |
| | | this.getTableData() |
| | | }, |
| | | handleDown(row){ |
| | | this.$axios.post(this.$api.personPostAuthorizationRecord.exportPersonPostAuthorizationRecord,{id:row.id},{responseType: "blob"}).then(res => { |
| | | if(res.code == 201){ |
| | | this.$message.error(res.message) |
| | | return |
| | | } |
| | | const blob = new Blob([res],{ type: 'application/octet-stream' }); |
| | | //å°Blob å¯¹è±¡è½¬æ¢æå符串 |
| | | let reader = new FileReader(); |
| | | reader.readAsText(blob, 'utf-8'); |
| | | reader.onload = () => { |
| | | try { |
| | | let result = JSON.parse(reader.result); |
| | | if (result.message) { |
| | | this.$message.error(result.message); |
| | | } else { |
| | | const url = URL.createObjectURL(blob); |
| | | const link = document.createElement('a'); |
| | | link.href = url; |
| | | link.download = 'ä»»èææ-'+row.certificateNumber+'-'+row.post + '.docx'; |
| | | link.click(); |
| | | this.$message.success('å¯¼åºæå') |
| | | } |
| | | } catch (err) { |
| | | console.log(err); |
| | | const url = URL.createObjectURL(blob); |
| | | const link = document.createElement('a'); |
| | | link.href = url; |
| | | link.download = 'ä»»èææ-'+row.certificateNumber+'-'+row.post + '.docx'; |
| | | link.click(); |
| | | this.$message.success('å¯¼åºæå') |
| | | data() { |
| | | return { |
| | | columnData: [ |
| | | { |
| | | label: 'åºå·', |
| | | prop: 'id' |
| | | }, { |
| | | label: 'è¯ä¹¦ç¼å·', |
| | | prop: 'certificateNumber' |
| | | }, { |
| | | label: '被任è人å', |
| | | prop: 'userName' |
| | | }, { |
| | | label: 'ä»»èå²ä½', |
| | | prop: 'post' |
| | | }, { |
| | | label: 'ç论èè¯æç»©', |
| | | prop: 'num1', |
| | | width: 120 |
| | | },{ |
| | | label: 'æä½æè½èè¯æç»©', |
| | | prop: 'num2', |
| | | width: 150 |
| | | },{ |
| | | label: 'æä½æ¶é´', |
| | | prop: 'updateTime' |
| | | }, { |
| | | label: '夿³¨', |
| | | prop: 'remarks', |
| | | width: 300 |
| | | }, { |
| | | label: 'æä½', |
| | | dataType: 'action', |
| | | width: 160, |
| | | fixed: 'right', |
| | | operation: [ |
| | | { |
| | | name: 'ç¼è¾', |
| | | type: 'text', |
| | | clickFun: (row) => { |
| | | this.openDialog(row, true) |
| | | } |
| | | }, { |
| | | name: 'ä¸è½½', |
| | | type: 'text', |
| | | clickFun: (row) => { |
| | | this.handleDown(row) |
| | | } |
| | | }, { |
| | | name: 'å é¤', |
| | | type: 'text', |
| | | color: '#f56c6c', |
| | | clickFun: (row) => { |
| | | this.deleteNotify(row.id) |
| | | } |
| | | } |
| | | }) |
| | | } |
| | | ] |
| | | }, |
| | | ], |
| | | tableData: [], |
| | | pagination: { |
| | | current: 1, |
| | | size: 20, |
| | | total: 0 |
| | | }, |
| | | loading: false |
| | | } |
| | | }, |
| | | mounted() { |
| | | this.getTableData() |
| | | }, |
| | | methods: { |
| | | openDialog(row, type=false) { |
| | | this.$refs.mandateModal.openDialog(row, type) |
| | | }, |
| | | // watch: { |
| | | // departId: { |
| | | // handler(newId, oldId) { |
| | | // if (newId) { |
| | | // this.getTableData(); |
| | | // } |
| | | // } |
| | | // } |
| | | // } |
| | | /** |
| | | * @desc æ¥è¯¢è¡¨æ ¼æ°æ® |
| | | */ |
| | | async getTableData() { |
| | | const params = this.isDepartment ? { |
| | | departLimsId: this.departId, |
| | | current: this.pagination.current, |
| | | size: this.pagination.pageSize |
| | | } : { |
| | | userId: this.departId, |
| | | current: this.pagination.current, |
| | | size: this.pagination.pageSize |
| | | } |
| | | this.loading = true |
| | | PersonPostAuthorizationRecordPage(params).then(res => { |
| | | this.loading = false |
| | | this.tableData = res.data.records |
| | | this.pagination.total = res.data.total |
| | | }).catch(err => { |
| | | this.loading = false |
| | | }) |
| | | }, |
| | | page (page) { |
| | | this.pagination.size = page.limit |
| | | this.getTableData() |
| | | }, |
| | | /** |
| | | * @desc å é¤ä»»èè®°å½ |
| | | */ |
| | | deleteNotify(id) { |
| | | this.$confirm('æ¯å¦å é¤å½åæ°æ®?', "è¦å", { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning" |
| | | }).then(() => { |
| | | deletePersonPostAuthorizationRecord({id: id}).then(res => { |
| | | this.$message.success('å 餿å') |
| | | this.getTableData() |
| | | }).catch(e => { |
| | | this.$message.error('å é¤å¤±è´¥') |
| | | }) |
| | | }).catch(() => {}) |
| | | }, |
| | | handleDown(row){ |
| | | exportPersonPostAuthorizationRecord({id:row.id}).then(res => { |
| | | const blob = new Blob([res],{ type: 'application/octet-stream' }); |
| | | this.$download.saveAs(blob, 'ä»»èææ-'+row.certificateNumber+'-'+row.post + '.docx') |
| | | }) |
| | | } |
| | | }, |
| | | watch: { |
| | | departId: { |
| | | handler(newId, oldId) { |
| | | if (newId) { |
| | | this.getTableData(); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | <style scoped> |
| | | .flex_column { |
| | | display: flex; |
| | | flex-direction: column; |
| | | justify-content: space-between; |
| | | } |
| | | .w100 { |
| | | width: 100%; |
| | | } |
| | | .pagination { |
| | | display: flex; |
| | | justify-content: space-between |
| | | } |
| | | .items_center { |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | .justify_between { |
| | | justify-content: space-between |
| | | } |
| | | </style> |