|
@@ -0,0 +1,533 @@
|
|
|
+<template>
|
|
|
+ <div class="app-container">
|
|
|
+ <!-- 搜索模块 -->
|
|
|
+ <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
|
|
|
+ <!-- vue 的页面标识(vueKey) 类似管道节点的脚本编码-->
|
|
|
+ <el-form-item label="脚本编码" prop="vueKey">
|
|
|
+ <el-input
|
|
|
+ v-model="queryParams.vueKey"
|
|
|
+ placeholder="请输入脚本编码"
|
|
|
+ clearable
|
|
|
+ @keyup.enter.native="handleQuery"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ <!-- 页面代码(vueCode),用户上传的代码 -->
|
|
|
+ <el-form-item label="页面代码" prop="vueCode">
|
|
|
+ <el-input
|
|
|
+ v-model="queryParams.vueCode"
|
|
|
+ placeholder="请输入页面代码"
|
|
|
+ clearable
|
|
|
+ @keyup.enter.native="handleQuery"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ <!-- 页面名称(remark),用户自己取的名字 -->
|
|
|
+ <el-form-item label="页面名称" prop="remark">
|
|
|
+ <el-input
|
|
|
+ v-model="queryParams.remark"
|
|
|
+ placeholder="请输入创建者id"
|
|
|
+ clearable
|
|
|
+ @keyup.enter.native="handleQuery"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ <!-- 租户名称(tenantId), 下拉框--当前租户id, 符合的话可以编辑, 不然只能查看 -->
|
|
|
+ <el-form-item label="租户id" prop="tenantId">
|
|
|
+ <el-select
|
|
|
+ v-model="queryParams.tenantId"
|
|
|
+ placeholder="请选择租户"
|
|
|
+ filterable
|
|
|
+ clearable
|
|
|
+ >
|
|
|
+ <el-option
|
|
|
+ v-for="item in TenantAllList"
|
|
|
+ :key="item.tenantId"
|
|
|
+ :label="item.tenantName"
|
|
|
+ :value="item.tenantId"
|
|
|
+ >
|
|
|
+ </el-option>
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item>
|
|
|
+ <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
|
|
|
+ <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ <!-- 按钮模块 -->
|
|
|
+ <el-row :gutter="10" class="mb8">
|
|
|
+ <el-col :span="1.5">
|
|
|
+ <el-button
|
|
|
+ type="primary"
|
|
|
+ plain
|
|
|
+ icon="el-icon-plus"
|
|
|
+ size="mini"
|
|
|
+ @click="handleAdd"
|
|
|
+ v-hasPermi="['system:vuePage:add']"
|
|
|
+ >新增</el-button>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="1.5">
|
|
|
+ <el-button
|
|
|
+ style="display: none;"
|
|
|
+ type="success"
|
|
|
+ plain
|
|
|
+ icon="el-icon-edit"
|
|
|
+ size="mini"
|
|
|
+ :disabled="single"
|
|
|
+ @click="handleUpdate"
|
|
|
+ v-hasPermi="['system:vuePage:edit']"
|
|
|
+ >修改</el-button>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="1.5">
|
|
|
+ <el-button
|
|
|
+ type="danger"
|
|
|
+ plain
|
|
|
+ icon="el-icon-delete"
|
|
|
+ size="mini"
|
|
|
+ :disabled="multiple"
|
|
|
+ @click="handleDelete"
|
|
|
+ v-hasPermi="['system:vuePage:remove']"
|
|
|
+ >删除</el-button>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="1.5">
|
|
|
+ <el-button
|
|
|
+ type="danger"
|
|
|
+ plain
|
|
|
+ icon="el-icon-download"
|
|
|
+ size="mini"
|
|
|
+ @click="downloadVueTemplate"
|
|
|
+ >下载Vue模板</el-button>
|
|
|
+ </el-col>
|
|
|
+ <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
|
|
|
+ </el-row>
|
|
|
+ <!-- 表格模块 -->
|
|
|
+ <el-table v-loading="loading" :data="vuePageList" @selection-change="handleSelectionChange">
|
|
|
+ <el-table-column type="selection" width="55" align="center" />
|
|
|
+ <el-table-column label="脚本编码" align="center" prop="vueKey" :show-overflow-tooltip="true" />
|
|
|
+ <el-table-column label="页面名称" align="center" prop="remark" :show-overflow-tooltip="true" />
|
|
|
+ <el-table-column label="页面代码" align="center" prop="vueCode" :show-overflow-tooltip="true" width="180" />
|
|
|
+ <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
|
|
|
+ <template
|
|
|
+ slot-scope="scope"
|
|
|
+ v-if=" $store.state.user.tenant.tenantId == scope.row.tenantId "
|
|
|
+ >
|
|
|
+ <el-dropdown>
|
|
|
+ <el-button type="warning" plain size="small">
|
|
|
+ 操作<i class="el-icon-arrow-down el-icon--right"></i>
|
|
|
+ </el-button>
|
|
|
+ <el-dropdown-menu slot="dropdown">
|
|
|
+ <el-dropdown-item>
|
|
|
+ <el-button
|
|
|
+ size="mini"
|
|
|
+ type="text"
|
|
|
+ icon="el-icon-edit"
|
|
|
+ @click="handleUpdate(scope.row)"
|
|
|
+ v-hasPermi="['system:VuePage:edit']"
|
|
|
+ >修改</el-button>
|
|
|
+ </el-dropdown-item>
|
|
|
+ <el-dropdown-item>
|
|
|
+ <el-button
|
|
|
+ size="mini"
|
|
|
+ type="text"
|
|
|
+ icon="el-icon-delete"
|
|
|
+ @click="handleDelete(scope.row)"
|
|
|
+ v-hasPermi="['system:VuePage:remove']"
|
|
|
+ >删除</el-button>
|
|
|
+ </el-dropdown-item>
|
|
|
+ <el-dropdown-item>
|
|
|
+ <el-button
|
|
|
+ size="mini"
|
|
|
+ type="text"
|
|
|
+ icon="el-icon-edit"
|
|
|
+ @click="BindingPageScript(scope.row)"
|
|
|
+ v-hasPermi="['system:VuePage:edit']"
|
|
|
+ >页面按钮绑定脚本</el-button>
|
|
|
+ </el-dropdown-item>
|
|
|
+ </el-dropdown-menu>
|
|
|
+ </el-dropdown>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
+ <!-- 分页模块 -->
|
|
|
+ <pagination
|
|
|
+ v-show="total>0"
|
|
|
+ :total="total"
|
|
|
+ :page.sync="queryParams.pageNum"
|
|
|
+ :limit.sync="queryParams.pageSize"
|
|
|
+ @pagination="getList"
|
|
|
+ />
|
|
|
+ <!-- 添加或修改vue页面数据弹框 -->
|
|
|
+ <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
|
|
|
+ <el-form ref="form" :model="form" :rules="rules" label-width="100px">
|
|
|
+ <el-form-item label="脚本编码" prop="vueKey">
|
|
|
+ <el-col :span="20">
|
|
|
+ <el-input
|
|
|
+ v-model="form.vueKey"
|
|
|
+ placeholder="请输入脚本编码"
|
|
|
+ :disabled="true"
|
|
|
+ />
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="4">
|
|
|
+ <!-- 复制 -->
|
|
|
+ <el-button
|
|
|
+ icon="el-icon-document-copy"
|
|
|
+ v-clipboard:copy="form.vueKey"
|
|
|
+ v-clipboard:success="onCopy"
|
|
|
+ v-clipboard:error="onError"
|
|
|
+ ></el-button>
|
|
|
+ </el-col>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="页面名称" prop="remark">
|
|
|
+ <el-input v-model="form.remark" placeholder="请输入页面名称" />
|
|
|
+ </el-form-item>
|
|
|
+ <!-- 页面代码 -->
|
|
|
+ <el-form-item label="页面代码" prop="vueCode">
|
|
|
+ <el-input
|
|
|
+ v-model="form.vueCode"
|
|
|
+ type="textarea"
|
|
|
+ :rows="10"
|
|
|
+ placeholder="请输入页面代码"
|
|
|
+ style="margin-bottom: 10px;"
|
|
|
+ />
|
|
|
+ <el-upload
|
|
|
+ action="#"
|
|
|
+ :before-upload="beforeUpload"
|
|
|
+ :on-success="handleUploadSuccess"
|
|
|
+ :show-file-list="false"
|
|
|
+ accept=".vue"
|
|
|
+ :http-request="customUpload"
|
|
|
+ >
|
|
|
+ <el-button type="primary" size="small">上传文件</el-button>
|
|
|
+ <span slot="tip" class="el-upload__tip" style="margin-left: 10px;">
|
|
|
+ 只能上传 vue文件
|
|
|
+ </span>
|
|
|
+ </el-upload>
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ <div slot="footer" class="dialog-footer">
|
|
|
+ <el-button type="primary" @click="submitForm">确认</el-button>
|
|
|
+ <el-button @click="cancel">取消</el-button>
|
|
|
+ </div>
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <script>
|
|
|
+ import { listVuePage, getVuePage, delVuePage, addVuePage, updateVuePage, uploadVuePage, downloadTemplateVue } from "@/api/businessFlow/vuePage";
|
|
|
+ import { v4 as uuidv4 } from 'uuid'
|
|
|
+ import { getTenantAllList } from '@/api/system/tenant'
|
|
|
+ import { mapState } from "vuex";
|
|
|
+ export default {
|
|
|
+ name: "vuePage",
|
|
|
+ data() {
|
|
|
+ return {
|
|
|
+ // 租户下拉框
|
|
|
+ TenantAllList: [],
|
|
|
+ // 遮罩层
|
|
|
+ loading: true,
|
|
|
+ // 选中数组
|
|
|
+ ids: [],
|
|
|
+ // 选中数组(包含所有数据)
|
|
|
+ selection: [],
|
|
|
+ // 多选框勾选数据
|
|
|
+ tempSelection: [],
|
|
|
+ // 非单个禁用
|
|
|
+ single: true,
|
|
|
+ // 非多个禁用
|
|
|
+ multiple: true,
|
|
|
+ // 显示搜索条件
|
|
|
+ showSearch: true,
|
|
|
+ // 总条数
|
|
|
+ total: 0,
|
|
|
+ // 存放业务脚本的vue页面表格数据
|
|
|
+ vuePageList: [],
|
|
|
+ // 弹出层标题
|
|
|
+ title: "",
|
|
|
+ // 是否显示弹出层
|
|
|
+ open: false,
|
|
|
+ // 上传相关状态
|
|
|
+ uploadLoading: false,
|
|
|
+ // 查询参数
|
|
|
+ queryParams: {
|
|
|
+ pageNum: 1,
|
|
|
+ pageSize: 10,
|
|
|
+ vueCode: null, //页面代码
|
|
|
+ vueKey: null, //脚本编码, 用来和页面id给按钮组合匹配的id
|
|
|
+ tenantId: null, //租户id, 下拉
|
|
|
+ remark: null //页面名称
|
|
|
+ },
|
|
|
+ // 表单参数
|
|
|
+ form: {
|
|
|
+ vueCode: null, //页面代码
|
|
|
+ vueKey: null, //脚本编码, 用来和页面id给按钮组合匹配的id
|
|
|
+ tenantId: null, //租户id, 下拉
|
|
|
+ remark: null //页面名称
|
|
|
+ },
|
|
|
+ // 表单校验
|
|
|
+ rules: {
|
|
|
+ vueCode: [
|
|
|
+ { required: true, message: "请输入页面代码", trigger: 'blur' }
|
|
|
+ ],
|
|
|
+ remark: [
|
|
|
+ { required: true, message: "请输入页面名称", trigger: 'change' }
|
|
|
+ ],
|
|
|
+ },
|
|
|
+ };
|
|
|
+ },
|
|
|
+ computed: {
|
|
|
+ ...mapState({
|
|
|
+ databaseName: (state) => state.user.dataSource.databaseName,
|
|
|
+ databaseType: (state) => state.user.dataSource.databaseType,
|
|
|
+ username: (state) => state.user.dataSource.username,
|
|
|
+ tenantId: (state) => state.user.tenant.tenantId,
|
|
|
+ }),
|
|
|
+ },
|
|
|
+
|
|
|
+ created() {
|
|
|
+ this.getList();
|
|
|
+ this.getTenantAllList()
|
|
|
+
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ // 复制成功
|
|
|
+ onCopy () {
|
|
|
+ this.$modal.msgSuccess("复制成功")
|
|
|
+ },
|
|
|
+ //复制失败
|
|
|
+ onError () {
|
|
|
+ this.$modal.msgError("复制失败")
|
|
|
+ },
|
|
|
+ /** 查询存放业务脚本的vue页面列表 */
|
|
|
+ getList() {
|
|
|
+ this.loading = true;
|
|
|
+ this.tempSelection = JSON.parse(JSON.stringify(this.selection));
|
|
|
+ listVuePage(this.queryParams).then(response => {
|
|
|
+ this.vuePageList = response.rows.map(row =>{
|
|
|
+ return {
|
|
|
+ ...row,
|
|
|
+ vueCode: decodeURIComponent(row?.vueCode)
|
|
|
+ }
|
|
|
+ });
|
|
|
+ this.total = response.total;
|
|
|
+ this.loading = false;
|
|
|
+ });
|
|
|
+ },
|
|
|
+ getTenantAllList () {
|
|
|
+ getTenantAllList().then(response => {
|
|
|
+ this.TenantAllList = response.rows
|
|
|
+ })
|
|
|
+ },
|
|
|
+ // 取消按钮
|
|
|
+ cancel() {
|
|
|
+ this.open = false;
|
|
|
+ this.reset();
|
|
|
+ },
|
|
|
+ // 表单重置
|
|
|
+ reset() {
|
|
|
+ this.form = {
|
|
|
+ id: null,
|
|
|
+ vueCode: null, //页面代码
|
|
|
+ vueKey: null, //脚本编码, 用来和页面id给按钮组合匹配的id
|
|
|
+ tenantId: null, //租户id,vuex中拿到
|
|
|
+ remark: null //页面名称
|
|
|
+ };
|
|
|
+ // 修改这里 ↓
|
|
|
+ if (this.$refs['form']) {
|
|
|
+ this.$refs['form'].resetFields();
|
|
|
+ }
|
|
|
+ },
|
|
|
+ /** 搜索按钮操作 */
|
|
|
+ handleQuery() {
|
|
|
+ this.queryParams.pageNum = 1;
|
|
|
+ this.getList();
|
|
|
+ },
|
|
|
+ /** 重置按钮操作 */
|
|
|
+ resetQuery() {
|
|
|
+ // this.resetForm("queryForm");
|
|
|
+ // this.handleQuery();
|
|
|
+ this.queryParams = {
|
|
|
+ pageNum: 1,
|
|
|
+ pageSize: 10,
|
|
|
+ vueCode: null, //页面代码
|
|
|
+ vueKey: null, //脚本编码, 用来和页面id给按钮组合匹配的id
|
|
|
+ tenantId: null, //租户id, 下拉
|
|
|
+ remark: null //页面名称
|
|
|
+ };
|
|
|
+ this.$nextTick(() => {
|
|
|
+ if (this.$refs.queryForm) {
|
|
|
+ this.$refs.queryForm?.clearValidate();
|
|
|
+ }
|
|
|
+ });
|
|
|
+ this.handleQuery();
|
|
|
+ },
|
|
|
+ // 多选框选中数据
|
|
|
+ handleSelectionChange(selection) {
|
|
|
+ this.ids = selection.map(item => item.id)
|
|
|
+ this.selection = selection;
|
|
|
+ this.single = selection.length!==1
|
|
|
+ this.multiple = !selection.length
|
|
|
+ },
|
|
|
+ /** 新增按钮操作 */
|
|
|
+ handleAdd() {
|
|
|
+ //this.monacoEditor?.dispose()
|
|
|
+ this.reset();
|
|
|
+ this.$nextTick(() => {
|
|
|
+ const newVueKey = uuidv4()
|
|
|
+ this.$set(this.form, 'vueKey', 'vueKey_' + newVueKey)
|
|
|
+ this.open = true
|
|
|
+ this.title = "添加存放业务脚本的vue页面";
|
|
|
+ });
|
|
|
+ this.open = true;
|
|
|
+ this.title = "添加存放业务脚本的vue页面";
|
|
|
+ },
|
|
|
+ /** 修改按钮操作 */
|
|
|
+ handleUpdate(rowData) {
|
|
|
+ this.reset();
|
|
|
+ let row;
|
|
|
+ if (rowData instanceof PointerEvent || rowData instanceof Event) {
|
|
|
+ row = this.selection[0]
|
|
|
+ } else {
|
|
|
+ row = rowData
|
|
|
+ }
|
|
|
+ // console.log('row',rowData)
|
|
|
+ const id = row.id || this.ids
|
|
|
+ // console.log('id',id)
|
|
|
+ getVuePage(id).then(response => {
|
|
|
+ if(response.code == 200){
|
|
|
+ let vueCode = decodeURIComponent(response.data?.vueCode);
|
|
|
+ this.form = response.data;
|
|
|
+ this.form.vueCode = vueCode;
|
|
|
+ this.open = true;
|
|
|
+ this.title = "修改存放业务脚本的vue页面";
|
|
|
+ }else{
|
|
|
+ this.$modal.msgError("获取单条数据失败")
|
|
|
+ }
|
|
|
+ });
|
|
|
+ },
|
|
|
+ /** 提交按钮 */
|
|
|
+ submitForm() {
|
|
|
+ this.form.tenantId = this.tenantId
|
|
|
+ this.$refs["form"].validate(valid => {
|
|
|
+ if (valid) {
|
|
|
+ if (this.form.id != null) {
|
|
|
+ const dataToSubmit = { ...this.form }; // 使用扩展运算符浅拷贝 form 对象
|
|
|
+ if(dataToSubmit.vueCode) dataToSubmit.vueCode = encodeURIComponent(dataToSubmit.vueCode);
|
|
|
+ updateVuePage(dataToSubmit).then(response => {
|
|
|
+ if(response.code == 200){
|
|
|
+ console.log('response',response)
|
|
|
+ this.$modal.msgSuccess("修改成功");
|
|
|
+ this.open = false;
|
|
|
+ }else {
|
|
|
+ this.$modal.msgSuccess("修改失败");
|
|
|
+ }
|
|
|
+ this.getList();
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ const dataToSubmit = { ...this.form }; // 使用扩展运算符浅拷贝 form 对象
|
|
|
+ console.log('dataToSubmit',dataToSubmit.vueCode)
|
|
|
+ delete dataToSubmit.id; // 删除 id
|
|
|
+ // 对vueCode进行编码处理
|
|
|
+ if(dataToSubmit.vueCode) dataToSubmit.vueCode = encodeURIComponent(dataToSubmit.vueCode);
|
|
|
+
|
|
|
+ addVuePage(dataToSubmit).then(response => {
|
|
|
+ console.log('response',response)
|
|
|
+ if(response.code == 200){
|
|
|
+ this.$modal.msgSuccess("新增成功");
|
|
|
+ this.open = false;
|
|
|
+ }else {
|
|
|
+ this.$modal.msgSuccess("新增失败");
|
|
|
+ }
|
|
|
+ this.getList();
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ },
|
|
|
+ /** 删除按钮操作 */
|
|
|
+ handleDelete(row) {
|
|
|
+ const ids = row.id || this.ids;
|
|
|
+ this.$modal.confirm('是否确认删除存放业务脚本的vue页面编号为"' + ids + '"的数据项?').then(function() {
|
|
|
+ return delVuePage(ids);
|
|
|
+ }).then(() => {
|
|
|
+ this.getList();
|
|
|
+ this.$modal.msgSuccess("删除成功");
|
|
|
+ }).catch(() => {});
|
|
|
+ },
|
|
|
+ /** 页面按钮绑定脚本 */
|
|
|
+ BindingPageScript(row){
|
|
|
+ console.log('row',row)
|
|
|
+ if(row.tenantId && row.id){
|
|
|
+ this.$router.push({
|
|
|
+ path: "/htgl/businessFlow/BindingPageScript",
|
|
|
+ query: {
|
|
|
+ mode: row.id
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }else {
|
|
|
+ this.$message.error('文件标识不存在!');
|
|
|
+ }
|
|
|
+ },
|
|
|
+ // 上传前校验
|
|
|
+ beforeUpload(file) {
|
|
|
+ const isVueFile = file.name.endsWith('.vue');
|
|
|
+ if (!isVueFile) this.$message.error('只能上传 Vue 文件!');
|
|
|
+ return isVueFile;
|
|
|
+ },
|
|
|
+ //自定义上传接口
|
|
|
+ customUpload({ file }) {
|
|
|
+ const formData = new FormData();
|
|
|
+ formData.append('file', file); // 根据后端接口字段名调整 key 名
|
|
|
+ uploadVuePage(formData)
|
|
|
+ .then(response => {
|
|
|
+ this.handleUploadSuccess(response, file);
|
|
|
+ })
|
|
|
+ },
|
|
|
+ // 上传成功处理
|
|
|
+ handleUploadSuccess(response, file) {
|
|
|
+ this.uploadLoading = false;
|
|
|
+ if (response.code === 200) {
|
|
|
+ // console.log(response)
|
|
|
+ // 假设接口返回文件内容在response.data.content中
|
|
|
+ this.form.vueCode = response.data;
|
|
|
+ this.$modal.msgSuccess('文件上传成功');
|
|
|
+ }
|
|
|
+ },
|
|
|
+ // 读取本地文件的方法
|
|
|
+ readLocalFile(file) {
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
+ const reader = new FileReader();
|
|
|
+ reader.onload = (event) => {
|
|
|
+ resolve(event.target.result);
|
|
|
+ };
|
|
|
+ reader.onerror = (error) => {
|
|
|
+ reject(error);
|
|
|
+ };
|
|
|
+ reader.readAsText(file);
|
|
|
+ });
|
|
|
+ },
|
|
|
+ downloadVueTemplate(){
|
|
|
+ downloadTemplateVue().then(response => {
|
|
|
+ if (response instanceof Blob) {
|
|
|
+ // 创建一个blob链接
|
|
|
+ const url = window.URL.createObjectURL(new Blob([response]));
|
|
|
+ const link = document.createElement('a');
|
|
|
+ link.href = url;
|
|
|
+ link.setAttribute('download', 'template.vue');
|
|
|
+ document.body.appendChild(link);
|
|
|
+ link.click();
|
|
|
+ document.body.removeChild(link);
|
|
|
+ }
|
|
|
+ })
|
|
|
+ },
|
|
|
+ }
|
|
|
+ };
|
|
|
+ </script>
|
|
|
+ <style lang="scss" scoped>
|
|
|
+ .codeEditBox {
|
|
|
+ width: 100%;
|
|
|
+ height: 200px;
|
|
|
+ }
|
|
|
+ .monaco-container {
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+ }
|
|
|
+ </style>
|
|
|
+
|