<!--suppress ALL -->
<template lang="pug">
    d2-container#setting-code
        h2.el-h2 生成规则
        p.el-text-s 表名、字段名以"_"分割,然后用驼峰法进行命名
        p.el-text-s 表名前缀在生成累的时候会去掉,如果不填写前缀,则当作没有前缀,不进行处理
        el-steps(:active="this.steps" simple process-status="success")
            el-step(title="数据库连接")
            el-step(title="输入表名生成路径")
            el-step(title="生成文件")
        el-form.code-form(v-loading="!lists" v-if="this.steps === 0" label-position="right" label-width="120px" :model="formLabelAlign" size="mini")
            el-row.code-form-item(type="flex" justify="center")
                el-col(:span="10")
                    el-form-item(label="数据库类型:")
                        el-select(v-model="formLabelAlign.dbType" placeholder="请选择数据库类型")
                            el-option(label="MySql" value="1")
                            el-option(label="Oracle" value="2")
                            el-option(label="SqlServer" value="3")
                            el-option(label="PostgreSQL" value="3")
                    el-form-item(label="数据库IP:" )
                        el-input(v-model="formLabelAlign.ip")
                    el-form-item(label="数据库端口号:" )
                        el-input(v-model="formLabelAlign.port")
                    el-form-item(label="数据库库名:" )
                        el-input(v-model="formLabelAlign.dbName")
                    el-form-item(label="数据库用户名:" )
                        el-input(v-model="formLabelAlign.username")
                    el-form-item(label="数据库密码:" )
                        el-input(type="password" v-model="formLabelAlign.dbpwd")
                    el-form-item
                        el-button(type="primary" @click="verifyDB('step_0')") 验 证
        el-form.code-form(v-if="this.steps === 1" label-position="right" label-width="180px" :model="formLabelAlign" size="mini")
            el-row.code-form-item(type="flex" justify="center")
                el-col(:span="10")

                    el-form-item(label="请输入要生成的表备注:")
                        el-input(v-model="formLabelAlign.tableRemark")
                    el-form-item(label="请输入要生成的表名:" )
                        el-input(v-model="formLabelAlign.tableName")
                    el-form-item(label="请输入要生成的模块名:" )
                        el-input(v-model="formLabelAlign.modulesName")
                    el-form-item(label="请输入java工程路径 :" )
                        el-input(v-model="formLabelAlign.javaDevPath")
                    el-form-item(label="请输入xml工程路径 :" )
                        el-input(v-model="formLabelAlign.xmlDevPath")
                    el-form-item
                        el-button(type="primary"  @click="verifyDB('step_1')") 验 证
        el-form.code-form(v-if="this.steps === 2" label-position="right" label-width="120px" :model="formLabelAlign" size="mini")
            el-row.code-form-item(type="flex" justify="center")
                el-col(:span="10")
                    //el-form-item
                        el-checkbox(v-model="formLabelAlign.isAddJsp") 是否生成AddJsp
                    el-form-item
                        el-checkbox(v-model="formLabelAlign.isBean") 是否生成Bean
                    el-form-item
                        el-checkbox(v-model="formLabelAlign.isController") 是否生成Controller
                    //el-form-item
                        el-checkbox(v-model="formLabelAlign.isJs") 是否生成Js
                    //el-form-item
                        el-checkbox(v-model="formLabelAlign.isListJsp") 是否生成ListJsp
                    el-form-item
                        el-checkbox(v-model="formLabelAlign.isMapperJava") 是否生成MapperJava
                    el-form-item
                        el-checkbox(v-model="formLabelAlign.isMapperXml") 是否生成MapperXMl
                    el-form-item
                        el-checkbox(v-model="formLabelAlign.isService") 是否生成Service
                    el-form-item
                        el-checkbox(v-model="formLabelAlign.isModel") 是否生成Model
                    el-form-item
        el-button.code-next-btn(type="primary" disabledm @click="generateNext(`step_${steps}`)" plain v-text="steps === 2 ? '完成' :'下一步'")

        el-button.code-next-btn(style="margin-right:10px" v-if="steps > 0" type="primary" disabledm @click="backTo()" v-text="'上一步'")

        el-table( v-if="this.steps > 0 && this.sqlTab.length > 0" :data="sqlTab" style="width: 100%")
            el-table-column(prop="COLUMN_NAME" align="center" label="字段" width="120")

            el-table-column(label="备注" align="center" width="100")
                template(slot-scope="scope")
                    el-input(size="mini"  v-model="scope.row.COLUMN_COMMENT" placeholder=" ")

            el-table-column(prop="DATA_TYPE" align="center" label="类型" width="80")

            el-table-column(align="center" label="非空" width="50")
                template(slot-scope="scope")
                    <!--span {{scope.row.IS_NULLABLE}}-->
                    el-checkbox(v-model="scope.row.IS_NULLABLE")

            el-table-column(align="center" label="长度/大小")
                template(slot-scope="scope")
                    el-row(:gutter="10")
                        el-col(:span="12")
                            el-input(size="mini" v-model="scope.row.MIN_LENGTH" placeholder=" ")
                        el-col(:span="12")
                            el-input(size="mini" v-model="scope.row.MAX_LENGTH" placeholder=" ")

            el-table-column(prop="DATA_TYPE" align="center" label="邮箱/身份证/手机")
                template(slot-scope="scope")
                    el-checkbox(v-model="scope.row.IS_EMAIL")
                    el-checkbox(v-model="scope.row.IS_MOBILE")
                    el-checkbox(v-model="scope.row.IS_IDNO")

            el-table-column(prop="DATA_TYPE" align="center" label="枚举")
                template(slot-scope="scope")
                    el-input(size="mini"  v-model="scope.row.ENUMAT" placeholder="以,分隔的字符串")

            el-table-column(prop="DATA_TYPE" align="center" label="正则")
                template(slot-scope="scope")
                    el-input(size="mini"  v-model="scope.row.REGEX" placeholder="正则表达式")
</template>

<script>
export default {
  data () {
    return {
      steps: 0,
      stepss: { step_0: 0, step_1: 0, step_2: 0 },
      lists: '',
      formRule: {
        ip: [{ required: true, message: '请输入有效IP!', trigger: 'blur' }],
        port: [{ required: true, message: '请输入有效端口号', trigger: 'blur' }],
        dbName: [{ required: true, message: '请输入有效库名', trigger: 'blur' }],
        username: [{ required: true, message: '用户名不能为空', trigger: 'blur' }],
        dbpwd: [{ required: true, message: '库名不能为空', trigger: 'blur' }],
        tableName: [{ required: true, message: '请输入表名', trigger: 'blur' }],
        modulesName: [{ required: true, message: '模块名不能为空', trigger: 'blur' }],
        javaDevPath: [{ required: true, message: 'java工程路径不能为空', trigger: 'blur' }],
        xmlDevPath: [{ required: true, message: 'xml工程路径不能为空', trigger: 'blur' }]
      },
      formLabelAlign: {
        'currentIndex': '1', //
        'dbType': '1', // 数据库类型 默认1
        'ip': '', // 数据库ip
        'port': '', // 端口号
        'dbName': '', // 数据库库名
        'username': '', // 数据库用户名
        'dbpwd': '', // 数据库密码:
        'tableName': '', // 要生成的表名
        'tableRemark': '', // 表备注
        'modulesName': '', // 模块名
        'javaDevPath': '',
        'xmlDevPath': '',
        'isAddJsp': false, // 是否生成App
        'isBean': true, // 是否生成bean
        'isController': true, // 是否生成controller
        'isJs': false, // 是否生成js
        'isListJsp': false, // 是否生成jsp
        'isMapperJava': true, // 是否生成java
        'isMapperXml': true, // 是否生成xml
        'isService': true, // 是否生成service
        'isModel': true // 是否生成model
        // 'jsonString': '' // sqlTab
      },
      sqlTab: []
    }
  },
  created () {
    this.createjavaList()
  },
  methods: {
    // 获取初始化数据
    createjavaList () {
      this.$http({
        url: this.$http.adornUrl('/createjava/list'),
        method: 'get'
      }).then((data) => {
        this.lists = data
        this.formLabelAlign.port = data.defaultPort
        this.formLabelAlign.ip = data.defaultIp
        this.formLabelAlign.dbName = data.defaultDb
        this.formLabelAlign.username = data.defaultUserName
        this.formLabelAlign.dbpwd = data.defaultPassword
        this.formLabelAlign.javaDevPath = data.javaDevPath
        this.formLabelAlign.xmlDevPath = data.xmlDevPath
      })
    },
    // 验证数据库数据
    verifyDB (step) {
      this.formLabelAlign.currentIndex = this.steps + 1
      this.$http({
        url: this.$http.adornUrl('/createjava/viewTable'),
        method: 'post',
        data: this.formLabelAlign
      }).then((data) => {
        this.$message({ message: data.msg, type: 'success' })
        this.stepss[`step_${this.steps}`] = 1
        if (data.data) {
          let _list = data.data
          _list.map(origin => {
            let _add = { 'YES': false, 'NO': true }[origin.IS_NULLABLE]
            origin.IS_EMAIL = false
            origin.IS_MOBILE = false
            origin.IS_IDNO = false
            origin.IS_NULLABLE = _add
          })
          // console.log(_list)
          this.sqlTab = _list
        }
      })
    },
    createFile (json) {
      this.formLabelAlign.jsonString = JSON.stringify(json)
      this.$http({
        url: this.$http.adornUrl('/createjava/createFile'),
        method: 'post',
        data: this.formLabelAlign
      }).then((data) => {
        if (!data.code) {
          this.$message({ message: data.msg, type: 'success' })
          setTimeout(() => {
            this.$router.push('/index')
          }, 1000)
          return
        }
        this.$message.error(data.msg)
      })
    },
    // 进入下一步
    generateNext (pos) {
      if (this.steps === 2) {
        this.createFile(this.sqlTab)
        return
      }
      if (!this.getPass(pos)) return
      this.steps += 1
    },
    // 回到上一步
    backTo () {
      this.steps -= 1
    },
    // 确认是否已验证通过
    getPass (pos) {
      if (this.stepss[pos]) return true
      this.$message.error('验证通过才能进行下一步')
      return false
    }
  }
}
</script>

<style lang="scss" scoped>
    @import '~@/assets/style/public.scss';

    #setting-code {
        .is-success {
            color: #2f74ff;
        }
        .code-form {
            background-color: $el-bg-color-1;
            .code-form-item {
                padding: 40px 0;
            }
        }
        .code-next-btn {
            float: right;
            margin: 15px 0px;
        }
    }
</style>