Преглед изворни кода

update 更新 SysJob 导入导出 补全 SysUser 试图对象

疯狂的狮子li пре 4 година
родитељ
комит
5ca4478540

+ 5 - 5
ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobController.java

@@ -1,6 +1,5 @@
 package com.ruoyi.quartz.controller;
 
-import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.constant.Constants;
 import com.ruoyi.common.core.controller.BaseController;
@@ -9,7 +8,8 @@ import com.ruoyi.common.core.page.TableDataInfo;
 import com.ruoyi.common.enums.BusinessType;
 import com.ruoyi.common.exception.job.TaskException;
 import com.ruoyi.common.utils.SecurityUtils;
-import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.poi.ExcelUtils;
 import com.ruoyi.quartz.domain.SysJob;
 import com.ruoyi.quartz.service.ISysJobService;
 import com.ruoyi.quartz.util.CronUtils;
@@ -18,6 +18,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
+import javax.servlet.http.HttpServletResponse;
 import java.util.List;
 
 /**
@@ -48,11 +49,10 @@ public class SysJobController extends BaseController
     @PreAuthorize("@ss.hasPermi('monitor:job:export')")
     @Log(title = "定时任务", businessType = BusinessType.EXPORT)
     @GetMapping("/export")
-    public AjaxResult export(SysJob sysJob)
+    public void export(SysJob sysJob, HttpServletResponse response)
     {
         List<SysJob> list = jobService.selectJobList(sysJob);
-        ExcelUtil<SysJob> util = new ExcelUtil<SysJob>(SysJob.class);
-        return util.exportExcel(list, "定时任务");
+		ExcelUtils.exportExcel(list, "定时任务", SysJob.class, response);
     }
 
     /**

+ 85 - 85
ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobLogController.java

@@ -1,85 +1,85 @@
-package com.ruoyi.quartz.controller;
-
-import com.ruoyi.common.annotation.Log;
-import com.ruoyi.common.core.controller.BaseController;
-import com.ruoyi.common.core.domain.AjaxResult;
-import com.ruoyi.common.core.page.TableDataInfo;
-import com.ruoyi.common.enums.BusinessType;
-import com.ruoyi.common.utils.poi.ExcelUtil;
-import com.ruoyi.quartz.domain.SysJobLog;
-import com.ruoyi.quartz.service.ISysJobLogService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-
-/**
- * 调度日志操作处理
- * 
- * @author ruoyi
- */
-@RestController
-@RequestMapping("/monitor/jobLog")
-public class SysJobLogController extends BaseController
-{
-    @Autowired
-    private ISysJobLogService jobLogService;
-
-    /**
-     * 查询定时任务调度日志列表
-     */
-    @PreAuthorize("@ss.hasPermi('monitor:job:list')")
-    @GetMapping("/list")
-    public TableDataInfo list(SysJobLog sysJobLog)
-    {
-        return jobLogService.selectPageJobLogList(sysJobLog);
-    }
-
-    /**
-     * 导出定时任务调度日志列表
-     */
-    @PreAuthorize("@ss.hasPermi('monitor:job:export')")
-    @Log(title = "任务调度日志", businessType = BusinessType.EXPORT)
-    @GetMapping("/export")
-    public AjaxResult export(SysJobLog sysJobLog)
-    {
-        List<SysJobLog> list = jobLogService.selectJobLogList(sysJobLog);
-        ExcelUtil<SysJobLog> util = new ExcelUtil<SysJobLog>(SysJobLog.class);
-        return util.exportExcel(list, "调度日志");
-    }
-    
-    /**
-     * 根据调度编号获取详细信息
-     */
-    @PreAuthorize("@ss.hasPermi('monitor:job:query')")
-    @GetMapping(value = "/{configId}")
-    public AjaxResult getInfo(@PathVariable Long jobLogId)
-    {
-        return AjaxResult.success(jobLogService.selectJobLogById(jobLogId));
-    }
-
-
-    /**
-     * 删除定时任务调度日志
-     */
-    @PreAuthorize("@ss.hasPermi('monitor:job:remove')")
-    @Log(title = "定时任务调度日志", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{jobLogIds}")
-    public AjaxResult remove(@PathVariable Long[] jobLogIds)
-    {
-        return toAjax(jobLogService.deleteJobLogByIds(jobLogIds));
-    }
-
-    /**
-     * 清空定时任务调度日志
-     */
-    @PreAuthorize("@ss.hasPermi('monitor:job:remove')")
-    @Log(title = "调度日志", businessType = BusinessType.CLEAN)
-    @DeleteMapping("/clean")
-    public AjaxResult clean()
-    {
-        jobLogService.cleanJobLog();
-        return AjaxResult.success();
-    }
-}
+package com.ruoyi.quartz.controller;
+
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.poi.ExcelUtils;
+import com.ruoyi.quartz.domain.SysJobLog;
+import com.ruoyi.quartz.service.ISysJobLogService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * 调度日志操作处理
+ *
+ * @author ruoyi
+ */
+@RestController
+@RequestMapping("/monitor/jobLog")
+public class SysJobLogController extends BaseController
+{
+    @Autowired
+    private ISysJobLogService jobLogService;
+
+    /**
+     * 查询定时任务调度日志列表
+     */
+    @PreAuthorize("@ss.hasPermi('monitor:job:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(SysJobLog sysJobLog)
+    {
+        return jobLogService.selectPageJobLogList(sysJobLog);
+    }
+
+    /**
+     * 导出定时任务调度日志列表
+     */
+    @PreAuthorize("@ss.hasPermi('monitor:job:export')")
+    @Log(title = "任务调度日志", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public void export(SysJobLog sysJobLog, HttpServletResponse response)
+    {
+        List<SysJobLog> list = jobLogService.selectJobLogList(sysJobLog);
+		ExcelUtils.exportExcel(list, "调度日志", SysJobLog.class, response);
+    }
+
+    /**
+     * 根据调度编号获取详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('monitor:job:query')")
+    @GetMapping(value = "/{configId}")
+    public AjaxResult getInfo(@PathVariable Long jobLogId)
+    {
+        return AjaxResult.success(jobLogService.selectJobLogById(jobLogId));
+    }
+
+
+    /**
+     * 删除定时任务调度日志
+     */
+    @PreAuthorize("@ss.hasPermi('monitor:job:remove')")
+    @Log(title = "定时任务调度日志", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{jobLogIds}")
+    public AjaxResult remove(@PathVariable Long[] jobLogIds)
+    {
+        return toAjax(jobLogService.deleteJobLogByIds(jobLogIds));
+    }
+
+    /**
+     * 清空定时任务调度日志
+     */
+    @PreAuthorize("@ss.hasPermi('monitor:job:remove')")
+    @Log(title = "调度日志", businessType = BusinessType.CLEAN)
+    @DeleteMapping("/clean")
+    public AjaxResult clean()
+    {
+        jobLogService.cleanJobLog();
+        return AjaxResult.success();
+    }
+}

+ 19 - 14
ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/SysJob.java

@@ -1,11 +1,13 @@
 package com.ruoyi.quartz.domain;
 
-import com.ruoyi.common.utils.StringUtils;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
 import com.baomidou.mybatisplus.annotation.*;
 import com.fasterxml.jackson.annotation.JsonFormat;
-import com.ruoyi.common.annotation.Excel;
-import com.ruoyi.common.annotation.Excel.ColumnType;
+import com.ruoyi.common.annotation.ExcelDictFormat;
 import com.ruoyi.common.constant.ScheduleConstants;
+import com.ruoyi.common.convert.ExcelDictConvert;
+import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.quartz.util.CronUtils;
 import lombok.Data;
 import lombok.NoArgsConstructor;
@@ -28,13 +30,14 @@ import java.util.Map;
 @NoArgsConstructor
 @Accessors(chain = true)
 @TableName("sys_job")
+@ExcelIgnoreUnannotated
 public class SysJob implements Serializable {
     private static final long serialVersionUID = 1L;
 
     /**
      * 任务ID
      */
-    @Excel(name = "任务序号", cellType = ColumnType.NUMERIC)
+    @ExcelProperty(value = "任务序号")
     @TableId(value = "job_id", type = IdType.AUTO)
     private Long jobId;
 
@@ -43,13 +46,14 @@ public class SysJob implements Serializable {
      */
     @NotBlank(message = "任务名称不能为空")
     @Size(min = 0, max = 64, message = "任务名称不能超过64个字符")
-    @Excel(name = "任务名称")
+    @ExcelProperty(value = "任务名称")
     private String jobName;
 
     /**
      * 任务组名
      */
-    @Excel(name = "任务组名")
+	@ExcelProperty(value = "任务组名", converter = ExcelDictConvert.class)
+	@ExcelDictFormat(dictType = "sys_job_group")
     private String jobGroup;
 
     /**
@@ -57,7 +61,7 @@ public class SysJob implements Serializable {
      */
     @NotBlank(message = "调用目标字符串不能为空")
     @Size(min = 0, max = 500, message = "调用目标字符串长度不能超过500个字符")
-    @Excel(name = "调用目标字符串")
+    @ExcelProperty(value = "调用目标字符串")
     private String invokeTarget;
 
     /**
@@ -65,25 +69,28 @@ public class SysJob implements Serializable {
      */
     @NotBlank(message = "Cron执行表达式不能为空")
     @Size(min = 0, max = 255, message = "Cron执行表达式不能超过255个字符")
-    @Excel(name = "执行表达式 ")
+    @ExcelProperty(value = "执行表达式")
     private String cronExpression;
 
     /**
      * cron计划策略
      */
-    @Excel(name = "计划策略 ", readConverterExp = "0=默认,1=立即触发执行,2=触发一次执行,3=不触发立即执行")
-    private String misfirePolicy = ScheduleConstants.MISFIRE_DEFAULT;
+    @ExcelProperty(value = "计划策略 ", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=默认,1=立即触发执行,2=触发一次执行,3=不触发立即执行")
+	private String misfirePolicy = ScheduleConstants.MISFIRE_DEFAULT;
 
     /**
      * 是否并发执行(0允许 1禁止)
      */
-    @Excel(name = "并发执行", readConverterExp = "0=允许,1=禁止")
+    @ExcelProperty(value = "并发执行", converter = ExcelDictConvert.class)
+	@ExcelDictFormat(readConverterExp = "0=允许,1=禁止")
     private String concurrent;
 
     /**
      * 任务状态(0正常 1暂停)
      */
-    @Excel(name = "任务状态", readConverterExp = "0=正常,1=暂停")
+    @ExcelProperty(value = "任务状态", converter = ExcelDictConvert.class)
+	@ExcelDictFormat(dictType = "sys_job_status")
     private String status;
 
     /**
@@ -96,7 +103,6 @@ public class SysJob implements Serializable {
      * 创建时间
      */
     @TableField(fill = FieldFill.INSERT)
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date createTime;
 
     /**
@@ -109,7 +115,6 @@ public class SysJob implements Serializable {
      * 更新时间
      */
     @TableField(fill = FieldFill.INSERT_UPDATE)
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date updateTime;
 
     /**

+ 82 - 78
ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/SysJobLog.java

@@ -1,78 +1,82 @@
-package com.ruoyi.quartz.domain;
-
-import com.baomidou.mybatisplus.annotation.*;
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.ruoyi.common.annotation.Excel;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import lombok.experimental.Accessors;
-
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * 定时任务调度日志表 sys_job_log
- * 
- * @author ruoyi
- */
-
-@Data
-@NoArgsConstructor
-@Accessors(chain = true)
-@TableName("sys_job_log")
-public class SysJobLog
-{
-    private static final long serialVersionUID = 1L;
-
-    /** ID */
-    @Excel(name = "日志序号")
-    @TableId(value = "job_log_id", type = IdType.AUTO)
-    private Long jobLogId;
-
-    /** 任务名称 */
-    @Excel(name = "任务名称")
-    private String jobName;
-
-    /** 任务组名 */
-    @Excel(name = "任务组名")
-    private String jobGroup;
-
-    /** 调用目标字符串 */
-    @Excel(name = "调用目标字符串")
-    private String invokeTarget;
-
-    /** 日志信息 */
-    @Excel(name = "日志信息")
-    private String jobMessage;
-
-    /** 执行状态(0正常 1失败) */
-    @Excel(name = "执行状态", readConverterExp = "0=正常,1=失败")
-    private String status;
-
-    /** 异常信息 */
-    @Excel(name = "异常信息")
-    private String exceptionInfo;
-
-    /**
-     * 创建时间
-     */
-    @TableField(fill = FieldFill.INSERT)
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    private Date createTime;
-
-    /**
-     * 请求参数
-     */
-    @TableField(exist = false)
-    private Map<String, Object> params = new HashMap<>();
-
-    /** 开始时间 */
-    @TableField(exist = false)
-    private Date startTime;
-
-    /** 停止时间 */
-    @TableField(exist = false)
-    private Date stopTime;
-
-}
+package com.ruoyi.quartz.domain;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.baomidou.mybatisplus.annotation.*;
+import com.ruoyi.common.annotation.ExcelDictFormat;
+import com.ruoyi.common.convert.ExcelDictConvert;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 定时任务调度日志表 sys_job_log
+ *
+ * @author ruoyi
+ */
+
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("sys_job_log")
+@ExcelIgnoreUnannotated
+public class SysJobLog
+{
+    private static final long serialVersionUID = 1L;
+
+    /** ID */
+    @ExcelProperty(value = "日志序号")
+    @TableId(value = "job_log_id", type = IdType.AUTO)
+    private Long jobLogId;
+
+    /** 任务名称 */
+    @ExcelProperty(value = "任务名称")
+    private String jobName;
+
+    /** 任务组名 */
+    @ExcelProperty(value = "任务组名", converter = ExcelDictConvert.class)
+	@ExcelDictFormat(dictType = "sys_job_group")
+    private String jobGroup;
+
+    /** 调用目标字符串 */
+    @ExcelProperty(value = "调用目标字符串")
+    private String invokeTarget;
+
+    /** 日志信息 */
+    @ExcelProperty(value = "日志信息")
+    private String jobMessage;
+
+    /** 执行状态(0正常 1失败) */
+    @ExcelProperty(value = "执行状态", converter = ExcelDictConvert.class)
+	@ExcelDictFormat(dictType = "sys_common_status")
+    private String status;
+
+    /** 异常信息 */
+    @ExcelProperty(value = "异常信息")
+    private String exceptionInfo;
+
+    /**
+     * 创建时间
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+
+    /**
+     * 请求参数
+     */
+    @TableField(exist = false)
+    private Map<String, Object> params = new HashMap<>();
+
+    /** 开始时间 */
+    @TableField(exist = false)
+    private Date startTime;
+
+    /** 停止时间 */
+    @TableField(exist = false)
+    private Date stopTime;
+
+}

+ 93 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/SysUserExportVo.java

@@ -0,0 +1,93 @@
+package com.ruoyi.system.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.ruoyi.common.annotation.ExcelDictFormat;
+import com.ruoyi.common.convert.ExcelDictConvert;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 用户对象导出VO
+ *
+ * @author Lion Li
+ */
+
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+public class SysUserExportVo implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 用户ID
+	 */
+	@ExcelProperty(value = "用户序号")
+	private Long userId;
+
+	/**
+	 * 用户账号
+	 */
+	@ExcelProperty(value = "登录名称")
+	private String userName;
+
+	/**
+	 * 用户昵称
+	 */
+	@ExcelProperty(value = "用户名称")
+	private String nickName;
+
+	/**
+	 * 用户邮箱
+	 */
+	@ExcelProperty(value = "用户邮箱")
+	private String email;
+
+	/**
+	 * 手机号码
+	 */
+	@ExcelProperty(value = "手机号码")
+	private String phonenumber;
+
+	/**
+	 * 用户性别
+	 */
+	@ExcelProperty(value = "用户性别", converter = ExcelDictConvert.class)
+	@ExcelDictFormat(dictType = "sys_user_sex")
+	private String sex;
+
+	/**
+	 * 帐号状态(0正常 1停用)
+	 */
+	@ExcelProperty(value = "帐号状态", converter = ExcelDictConvert.class)
+	@ExcelDictFormat(dictType = "sys_common_status")
+	private String status;
+
+	/**
+	 * 最后登录IP
+	 */
+	@ExcelProperty(value = "最后登录IP")
+	private String loginIp;
+
+	/**
+	 * 最后登录时间
+	 */
+	@ExcelProperty(value = "最后登录时间")
+	private Date loginDate;
+
+	/**
+	 * 部门名称
+	 */
+	@ExcelProperty(value = "部门名称")
+	private String deptName;
+
+	/**
+	 * 负责人
+	 */
+	@ExcelProperty(value = "部门负责人")
+	private String leader;
+
+}

+ 73 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/SysUserImportVo.java

@@ -0,0 +1,73 @@
+package com.ruoyi.system.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.ruoyi.common.annotation.ExcelDictFormat;
+import com.ruoyi.common.convert.ExcelDictConvert;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * 用户对象导入VO
+ *
+ * @author Lion Li
+ */
+
+@Data
+@NoArgsConstructor
+// @Accessors(chain = true) // 导入不允许使用 会找不到set方法
+public class SysUserImportVo implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 用户ID
+	 */
+	@ExcelProperty(value = "用户序号")
+	private Long userId;
+
+	/**
+	 * 部门ID
+	 */
+	@ExcelProperty(value = "部门编号")
+	private Long deptId;
+
+	/**
+	 * 用户账号
+	 */
+	@ExcelProperty(value = "登录名称")
+	private String userName;
+
+	/**
+	 * 用户昵称
+	 */
+	@ExcelProperty(value = "用户名称")
+	private String nickName;
+
+	/**
+	 * 用户邮箱
+	 */
+	@ExcelProperty(value = "用户邮箱")
+	private String email;
+
+	/**
+	 * 手机号码
+	 */
+	@ExcelProperty(value = "手机号码")
+	private String phonenumber;
+
+	/**
+	 * 用户性别
+	 */
+	@ExcelProperty(value = "用户性别", converter = ExcelDictConvert.class)
+	@ExcelDictFormat(dictType = "sys_user_sex")
+	private String sex;
+
+	/**
+	 * 帐号状态(0正常 1停用)
+	 */
+	@ExcelProperty(value = "帐号状态", converter = ExcelDictConvert.class)
+	@ExcelDictFormat(dictType = "sys_common_status")
+	private String status;
+
+}

+ 0 - 9
ruoyi-ui/src/api/monitor/jobLog.js

@@ -24,12 +24,3 @@ export function cleanJobLog() {
     method: 'delete'
   })
 }
-
-// 导出调度日志
-export function exportJobLog(query) {
-  return request({
-    url: '/monitor/jobLog/export',
-    method: 'get',
-    params: query
-  })
-}

+ 3 - 13
ruoyi-ui/src/views/monitor/job/index.vue

@@ -280,7 +280,8 @@
 </template>
 
 <script>
-import { listJob, getJob, delJob, addJob, updateJob, exportJob, runJob, changeJobStatus } from "@/api/monitor/job";
+import { listJob, getJob, delJob, addJob, updateJob, runJob, changeJobStatus } from "@/api/monitor/job";
+import { downLoadExcel } from "@/utils/download";
 
 export default {
   name: "Job",
@@ -505,18 +506,7 @@ export default {
     },
     /** 导出按钮操作 */
     handleExport() {
-      const queryParams = this.queryParams;
-      this.$confirm("是否确认导出所有定时任务数据项?", "警告", {
-          confirmButtonText: "确定",
-          cancelButtonText: "取消",
-          type: "warning"
-        }).then(() => {
-          this.exportLoading = true;
-          return exportJob(queryParams);
-        }).then(response => {
-          this.download(response.msg);
-          this.exportLoading = false;
-        }).catch(() => {});
+      downLoadExcel('/monitor/job/export', this.queryParams);
     }
   }
 };

+ 5 - 15
ruoyi-ui/src/views/monitor/job/log.vue

@@ -177,8 +177,9 @@
 </template>
 
 <script>
-import { getJob} from "@/api/monitor/job";
-import { listJobLog, delJobLog, exportJobLog, cleanJobLog } from "@/api/monitor/jobLog";
+import { getJob } from "@/api/monitor/job";
+import { listJobLog, delJobLog, cleanJobLog } from "@/api/monitor/jobLog";
+import { downLoadExcel } from "@/utils/download";
 
 export default {
   name: "JobLog",
@@ -310,19 +311,8 @@ export default {
     },
     /** 导出按钮操作 */
     handleExport() {
-      const queryParams = this.queryParams;
-      this.$confirm("是否确认导出所有调度日志数据项?", "警告", {
-          confirmButtonText: "确定",
-          cancelButtonText: "取消",
-          type: "warning"
-        }).then(() => {
-          this.exportLoading = true;
-          return exportJobLog(queryParams);
-        }).then(response => {
-          this.download(response.msg);
-          this.exportLoading = false;
-        }).catch(() => {});
+      downLoadExcel('/monitor/jobLog/export', this.queryParams);
     }
   }
 };
-</script>
+</script>