xiongzhu 4 жил өмнө
parent
commit
121c728777

+ 4 - 0
pom.xml

@@ -23,6 +23,10 @@
             <id>Local repository</id>
             <url>file://${basedir}/libs</url>
         </repository>
+        <repository>
+            <id>jitpack.io</id>
+            <url>https://jitpack.io</url>
+        </repository>
     </repositories>
 
     <properties>

+ 106 - 95
src/main/resources/templates/EditViewTemplate.ftl

@@ -1,100 +1,111 @@
 <template>
     <div class="edit-view">
-        <el-form :model="formData" :rules="rules" ref="form" label-width="${labelWidth}" label-position="right"
-                 size="small"
-                 style="max-width: 500px;">
-            <#list model.fields as field>
-                <el-form-item prop="${field.modelName}" label="${field.remark}">
-                    <#if field.showInForm>
-                        <#if field.formType == 'singleLineText'>
-                            <el-input v-model="formData.${field.modelName}"></el-input>
-                        <#elseif field.formType == 'textarea'>
-                            <el-input type="textarea" v-model="formData.${field.modelName}"></el-input>
-                        <#elseif field.formType == 'number'>
-                            <el-input-number type="number" v-model="formData.${field.modelName}"></el-input-number>
-                        <#elseif field.formType == 'date'>
-                            <el-date-picker
-                                    v-model="formData.${field.modelName}"
-                                    type="date"
-                                    value-format="yyyy-MM-dd"
-                                    placeholder="选择日期">
-                            </el-date-picker>
-                        <#elseif field.formType == 'datetime'>
-                            <el-date-picker
-                                    v-model="formData.${field.modelName}"
-                                    type="datetime"
-                                    value-format="yyyy-MM-dd HH:mm:ss"
-                                    placeholder="选择日期时间">
-                            </el-date-picker>
-                        <#elseif field.formType == 'select'>
-                            <el-select v-model="formData.${field.modelName}" clearable filterable placeholder="请选择">
-                                <el-option
-                                        v-for="item in ${field.modelName}Options"
-                                        :key="item.value"
-                                        :label="item.label"
-                                        :value="item.value">
-                                </el-option>
-                            </el-select>
-                        <#elseif field.formType == 'multiSelect'>
-                            <template>
-                                <el-select v-model="formData.${field.modelName}" multiple clearable filterable
-                                           placeholder="请选择">
-                                    <el-option
-                                            v-for="item in ${field.modelName}Options"
-                                            :key="item.value"
-                                            :label="item.label"
-                                            :value="item.value">
-                                    </el-option>
-                                </el-select>
-                            </template>
-                        <#elseif field.formType == 'singleImage'>
-                            <single-upload v-model="formData.${field.modelName}"></single-upload>
-                        <#elseif field.formType == 'multiImage'>
-                            <multi-upload v-model="formData.${field.modelName}"></multi-upload>
-                        <#elseif field.formType == 'fileUpload'>
-                            <el-upload
-                                    class="upload-demo"
-                                    action="../upload/file"
-                                    :on-change="handleChange"
-                                    :file-list="fileList3">
-                                <el-button size="small" type="primary">
-                                    点击上传
-                                </el-button>
-                            </el-upload>
-                        <#elseif field.formType == 'tree'>
-                            <el-tree
-                                    :props="props"
-                                    :load="loadNode"
-                                    lazy
-                                    show-checkbox
-                                    @check-change="handleCheckChange">
-                            </el-tree>
-                        <#elseif field.formType == 'switch'>
-                            <el-switch v-model="formData.${field.modelName}"></el-switch>
-                        <#elseif field.formType == 'richText'>
-                            <rich-text v-model="formData.${field.modelName}"></rich-text>
-                        <#elseif field.formType == 'loginName'>
-                            <el-input v-model="formData.${field.modelName}" disabled></el-input>
-                        <#elseif field.formType == 'currentTime'>
-                            <el-input v-model="formData.${field.modelName}" disabled></el-input>
-                        <#elseif field.formType == 'currentDate'>
-                            <el-input v-model="formData.${field.modelName}" disabled></el-input>
-                        <#else>
-                            <el-input v-model="formData.${field.modelName}"></el-input>
-                        </#if>
-                    </#if>
-                </el-form-item>
-            </#list>
-            <el-form-item class="form-submit">
-                <el-button @click="onSave" :loading="saving" size="default"
-                           type="primary">保存
-                </el-button>
-                <el-button @click="onDelete" :loading="saving" size="default"
-                           type="danger" v-if="formData.id">删除
-                </el-button>
-                <el-button @click="$router.go(-1)" size="default">取消</el-button>
-            </el-form-item>
-        </el-form>
+        <page-title>
+            <el-button @click="$router.go(-1)">取消</el-button>
+            <el-button @click="del" :loading="$store.state.fetchingData" type="danger" v-if="formData.id">
+                删除
+            </el-button>
+            <el-button @click="onSave" :loading="$store.state.fetchingData" type="primary">保存</el-button>
+        </page-title>
+        <div class="edit-view__content-wrapper">
+            <div class="edit-view__content-section">
+                <el-form :model="formData" :rules="rules" ref="form" label-width="${labelWidth}" label-position="right"
+                         size="small"
+                         style="max-width: 500px;">
+                    <#list model.fields as field>
+                        <el-form-item prop="${field.modelName}" label="${field.remark}">
+                            <#if field.showInForm>
+                                <#if field.formType == 'singleLineText'>
+                                    <el-input v-model="formData.${field.modelName}"></el-input>
+                                <#elseif field.formType == 'textarea'>
+                                    <el-input type="textarea" v-model="formData.${field.modelName}"></el-input>
+                                <#elseif field.formType == 'number'>
+                                    <el-input-number type="number" v-model="formData.${field.modelName}"></el-input-number>
+                                <#elseif field.formType == 'date'>
+                                    <el-date-picker
+                                            v-model="formData.${field.modelName}"
+                                            type="date"
+                                            value-format="yyyy-MM-dd"
+                                            placeholder="选择日期">
+                                    </el-date-picker>
+                                <#elseif field.formType == 'datetime'>
+                                    <el-date-picker
+                                            v-model="formData.${field.modelName}"
+                                            type="datetime"
+                                            value-format="yyyy-MM-dd HH:mm:ss"
+                                            placeholder="选择日期时间">
+                                    </el-date-picker>
+                                <#elseif field.formType == 'select'>
+                                    <el-select v-model="formData.${field.modelName}" clearable filterable placeholder="请选择">
+                                        <el-option
+                                                v-for="item in ${field.modelName}Options"
+                                                :key="item.value"
+                                                :label="item.label"
+                                                :value="item.value">
+                                        </el-option>
+                                    </el-select>
+                                <#elseif field.formType == 'multiSelect'>
+                                    <template>
+                                        <el-select v-model="formData.${field.modelName}" multiple clearable filterable
+                                                   placeholder="请选择">
+                                            <el-option
+                                                    v-for="item in ${field.modelName}Options"
+                                                    :key="item.value"
+                                                    :label="item.label"
+                                                    :value="item.value">
+                                            </el-option>
+                                        </el-select>
+                                    </template>
+                                <#elseif field.formType == 'singleImage'>
+                                    <single-upload v-model="formData.${field.modelName}"></single-upload>
+                                <#elseif field.formType == 'multiImage'>
+                                    <multi-upload v-model="formData.${field.modelName}"></multi-upload>
+                                <#elseif field.formType == 'fileUpload'>
+                                    <el-upload
+                                            class="upload-demo"
+                                            action="../upload/file"
+                                            :on-change="handleChange"
+                                            :file-list="fileList3">
+                                        <el-button size="small" type="primary">
+                                            点击上传
+                                        </el-button>
+                                    </el-upload>
+                                <#elseif field.formType == 'tree'>
+                                    <el-tree
+                                            :props="props"
+                                            :load="loadNode"
+                                            lazy
+                                            show-checkbox
+                                            @check-change="handleCheckChange">
+                                    </el-tree>
+                                <#elseif field.formType == 'switch'>
+                                    <el-switch v-model="formData.${field.modelName}"></el-switch>
+                                <#elseif field.formType == 'richText'>
+                                    <rich-text v-model="formData.${field.modelName}"></rich-text>
+                                <#elseif field.formType == 'loginName'>
+                                    <el-input v-model="formData.${field.modelName}" disabled></el-input>
+                                <#elseif field.formType == 'currentTime'>
+                                    <el-input v-model="formData.${field.modelName}" disabled></el-input>
+                                <#elseif field.formType == 'currentDate'>
+                                    <el-input v-model="formData.${field.modelName}" disabled></el-input>
+                                <#else>
+                                    <el-input v-model="formData.${field.modelName}"></el-input>
+                                </#if>
+                            </#if>
+                        </el-form-item>
+                    </#list>
+                    <el-form-item class="form-submit">
+                        <el-button @click="onSave" :loading="saving" size="default"
+                                   type="primary">保存
+                        </el-button>
+                        <el-button @click="onDelete" :loading="saving" size="default"
+                                   type="danger" v-if="formData.id">删除
+                        </el-button>
+                        <el-button @click="$router.go(-1)" size="default">取消</el-button>
+                    </el-form-item>
+                </el-form>
+            </div>
+        </div>
     </div>
 </template>
 <script>

+ 16 - 11
src/main/resources/templates/ListViewTemplate.ftl

@@ -1,18 +1,23 @@
 <template>
     <div  class="list-view">
-        <div class="header-btn-right">
-            <el-button @click="addRow" type="primary" icon="el-icon-plus" :loading="downloading" class="filter-item">新增</el-button>
-            <el-button @click="download" icon="el-icon-upload2" :loading="downloading" class="filter-item"
-            >导出
+        <page-title>
+            <el-button @click="addRow" type="primary" icon="el-icon-plus" :loading="downloading" class="filter-item">
+                新增
             </el-button>
-        </div>
+            <el-button @click="download" icon="el-icon-upload2" :loading="downloading" class="filter-item">
+                导出
+            </el-button>
+        </page-title>
         <div class="filters-container">
-            <div class="filter-left"></div>
-            <div class="filter-right">
-                <el-input placeholder="搜索..." v-model="search" clearable class="filter-item search">
-                    <el-button @click="getData" slot="append" icon="el-icon-search"> </el-button>
-                </el-input>
-            </div>
+            <el-input
+                    placeholder="搜索..."
+                    v-model="search"
+                    clearable
+                    class="filter-item search"
+                    @keyup.enter.native="getData"
+            >
+                <el-button @click="getData" slot="append" icon="el-icon-search"> </el-button>
+            </el-input>
         </div>
         <el-table :data="tableData" row-key="id" ref="table"
                   header-row-class-name="table-header-row"

+ 1 - 0
src/main/vue/package.json

@@ -9,6 +9,7 @@
     "build-theme": "npx et -o src/styles/element_theme"
   },
   "dependencies": {
+    "@download/blockies": "https://github.com/download13/blockies.git",
     "@fortawesome/fontawesome": "^1.1.8",
     "@fortawesome/fontawesome-free-solid": "^5.0.13",
     "@fortawesome/vue-fontawesome": "^0.1.7",

+ 1 - 0
src/main/vue/src/components/PageTitle.vue

@@ -22,6 +22,7 @@ export default {
 <style lang="less" scoped>
 .page-title {
     height: 70px;
+    min-height: 70px;
     background: white;
     &:before {
         content: '';

+ 12 - 9
src/main/vue/src/styles/app.less

@@ -48,7 +48,6 @@ li {
     list-style-type: none;
 }
 
-
 .el-menu-item.is-active {
     background: @menu-bg-active !important;
     border-left: 2px solid @menu-text-color-active;
@@ -192,17 +191,21 @@ li {
     }
 }
 .edit-view {
-    background: white;
     border-radius: 5px;
-    padding: 20px;
     box-sizing: border-box;
     min-height: 100%;
-
-    .form-submit {
-        .el-button {
-            min-width: 120px;
-            border-radius: 2px;
-            font-size: 13px;
+    display: flex;
+    flex-direction: column;
+    .edit-view__content-wrapper {
+        flex-basis: 0;
+        flex-grow: 1;
+        overflow-y: auto;
+        overflow-x: hidden;
+        -webkit-overflow-scrolling: touch;
+        .edit-view__content-section {
+            background: white;
+            margin: 20px;
+            padding: 20px;
         }
     }
 }

+ 95 - 91
src/main/vue/src/views/Api.vue

@@ -1,96 +1,100 @@
 <template>
-    <div>
-        <el-form
-            :model="formData"
-            :rules="rules"
-            ref="form"
-            label-width="80px"
-            label-position="right"
-            style="max-width: 800px;"
-        >
-            <el-form-item prop="url" label="URL">
-                <el-autocomplete
-                    style="width: 100%;"
-                    v-model="formData.url"
-                    :fetch-suggestions="querySearch"
-                    @select="handleSelect"
-                    placeholder="输入或选择"
-                    :clearable="true"
+    <div class="edit-view">
+        <div class="edit-view__content-wrapper">
+            <div class="edit-view__content-section">
+                <el-form
+                    :model="formData"
+                    :rules="rules"
+                    ref="form"
+                    label-width="80px"
+                    label-position="right"
+                    style="max-width: 800px;"
                 >
-                </el-autocomplete>
-            </el-form-item>
-            <el-form-item prop="type" label="方法">
-                <el-select v-model="formData.method">
-                    <el-option label="GET" value="get"></el-option>
-                    <el-option label="POST" value="post"></el-option>
-                </el-select>
-            </el-form-item>
-            <!--<el-form-item prop="data" label="参数">-->
-            <!--<el-row>-->
-            <!--<el-col :span="6">-->
-            <!--<el-input @change="paramChange($event, 0)" placeholder="key" clearable></el-input>-->
-            <!--</el-col>-->
-            <!--<el-col :span="1" style="text-align: center">:</el-col>-->
-            <!--<el-col :span="6">-->
-            <!--<el-input placeholder="value" clearable></el-input>-->
-            <!--</el-col>-->
-            <!--</el-row>-->
-            <!--</el-form-item>-->
-            <!--<el-form-item prop="data" v-if="i !== 0" v-for="(item, i) in params" :key="i">-->
-            <!--<el-row>-->
-            <!--<el-col :span="6">-->
-            <!--<el-input @change="paramChange($event, i)" placeholder="key" clearable></el-input>-->
-            <!--</el-col>-->
-            <!--<el-col :span="1" style="text-align: center">:</el-col>-->
-            <!--<el-col :span="6">-->
-            <!--<el-input @change="paramChange($event, i)" placeholder="value" clearable></el-input>-->
-            <!--</el-col>-->
-            <!--<el-col :span="1">-->
-            <!--<el-button type="text" icon="el-icon-circle-close" style="text-align: center;"></el-button>-->
-            <!--</el-col>-->
-            <!--</el-row>-->
-            <!--</el-form-item>-->
-            <el-form-item prop="data" label="参数">
-                <el-table :data="params" :show-header="false" border>
-                    <el-table-column label="key" prop="key">
-                        <template slot-scope="{ row, column, $index }">
-                            <el-input
-                                v-model="row.key"
-                                @change="paramChange($event, $index)"
-                                placeholder="key"
-                                clearable
-                            ></el-input>
-                        </template>
-                    </el-table-column>
-                    <el-table-column label="value" prop="value">
-                        <template slot-scope="{ row }">
-                            <el-input v-model="row.value" placeholder="value" clearable></el-input>
-                        </template>
-                    </el-table-column>
-                    <el-table-column width="60" align="center">
-                        <template slot-scope="{ row, column, $index }">
-                            <el-button @click="removeParam($index)" type="text"> 删除</el-button>
-                        </template>
-                    </el-table-column>
-                </el-table>
-            </el-form-item>
-            <el-form-item>
-                <el-button @click="sendRequest" :loading="loading" type="primary">发送</el-button>
-            </el-form-item>
-            <el-form-item v-if="showResult" label="Status">
-                <el-tag :type="statusType">{{ statusCode }}</el-tag>
-            </el-form-item>
-            <el-form-item v-if="showResult" label="Response">
-                <el-tabs v-model="activeName" type="border-card" style="min-height: 150px;">
-                    <el-tab-pane label="JSON" name="json">
-                        <json-view :json="jsonResult"></json-view>
-                    </el-tab-pane>
-                    <el-tab-pane label="HTML" name="html">
-                        <div v-html="htmlResult"></div>
-                    </el-tab-pane>
-                </el-tabs>
-            </el-form-item>
-        </el-form>
+                    <el-form-item prop="url" label="URL">
+                        <el-autocomplete
+                            style="width: 100%;"
+                            v-model="formData.url"
+                            :fetch-suggestions="querySearch"
+                            @select="handleSelect"
+                            placeholder="输入或选择"
+                            :clearable="true"
+                        >
+                        </el-autocomplete>
+                    </el-form-item>
+                    <el-form-item prop="type" label="方法">
+                        <el-select v-model="formData.method">
+                            <el-option label="GET" value="get"></el-option>
+                            <el-option label="POST" value="post"></el-option>
+                        </el-select>
+                    </el-form-item>
+                    <!--<el-form-item prop="data" label="参数">-->
+                    <!--<el-row>-->
+                    <!--<el-col :span="6">-->
+                    <!--<el-input @change="paramChange($event, 0)" placeholder="key" clearable></el-input>-->
+                    <!--</el-col>-->
+                    <!--<el-col :span="1" style="text-align: center">:</el-col>-->
+                    <!--<el-col :span="6">-->
+                    <!--<el-input placeholder="value" clearable></el-input>-->
+                    <!--</el-col>-->
+                    <!--</el-row>-->
+                    <!--</el-form-item>-->
+                    <!--<el-form-item prop="data" v-if="i !== 0" v-for="(item, i) in params" :key="i">-->
+                    <!--<el-row>-->
+                    <!--<el-col :span="6">-->
+                    <!--<el-input @change="paramChange($event, i)" placeholder="key" clearable></el-input>-->
+                    <!--</el-col>-->
+                    <!--<el-col :span="1" style="text-align: center">:</el-col>-->
+                    <!--<el-col :span="6">-->
+                    <!--<el-input @change="paramChange($event, i)" placeholder="value" clearable></el-input>-->
+                    <!--</el-col>-->
+                    <!--<el-col :span="1">-->
+                    <!--<el-button type="text" icon="el-icon-circle-close" style="text-align: center;"></el-button>-->
+                    <!--</el-col>-->
+                    <!--</el-row>-->
+                    <!--</el-form-item>-->
+                    <el-form-item prop="data" label="参数">
+                        <el-table :data="params" :show-header="false" border>
+                            <el-table-column label="key" prop="key">
+                                <template slot-scope="{ row, column, $index }">
+                                    <el-input
+                                        v-model="row.key"
+                                        @change="paramChange($event, $index)"
+                                        placeholder="key"
+                                        clearable
+                                    ></el-input>
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="value" prop="value">
+                                <template slot-scope="{ row }">
+                                    <el-input v-model="row.value" placeholder="value" clearable> </el-input>
+                                </template>
+                            </el-table-column>
+                            <el-table-column width="60" align="center">
+                                <template slot-scope="{ row, column, $index }">
+                                    <el-button @click="removeParam($index)" type="text"> 删除</el-button>
+                                </template>
+                            </el-table-column>
+                        </el-table>
+                    </el-form-item>
+                    <el-form-item>
+                        <el-button @click="sendRequest" :loading="loading" type="primary">发送</el-button>
+                    </el-form-item>
+                    <el-form-item v-if="showResult" label="Status">
+                        <el-tag :type="statusType">{{ statusCode }}</el-tag>
+                    </el-form-item>
+                    <el-form-item v-if="showResult" label="Response">
+                        <el-tabs v-model="activeName" type="border-card" style="min-height: 150px;">
+                            <el-tab-pane label="JSON" name="json">
+                                <json-view :json="jsonResult"></json-view>
+                            </el-tab-pane>
+                            <el-tab-pane label="HTML" name="html">
+                                <div v-html="htmlResult"></div>
+                            </el-tab-pane>
+                        </el-tabs>
+                    </el-form-item>
+                </el-form>
+            </div>
+        </div>
     </div>
 </template>
 

+ 11 - 4
src/main/vue/src/views/GenCodeList.vue

@@ -1,9 +1,16 @@
 <template>
-    <div class="edit-view">
+    <div class="list-view">
         <div class="filters-container">
-            <el-input placeholder="输入关键字" v-model="search" clearable class="filter-item"></el-input>
-            <el-button @click="getData" type="primary" icon="el-icon-search" class="filter-item">搜索 </el-button>
             <el-button @click="addRow" type="primary" icon="el-icon-plus" class="filter-item">添加 </el-button>
+            <el-input
+                placeholder="搜索..."
+                v-model="search"
+                clearable
+                class="filter-item search"
+                @keyup.enter.native="getData"
+            >
+                <el-button @click="getData" slot="append" icon="el-icon-search"> </el-button>
+            </el-input>
             <!-- <el-dropdown trigger="click" size="medium"
                          class="table-column-filter">
                 <span>
@@ -18,7 +25,7 @@
                 </el-dropdown-menu>
             </el-dropdown> -->
         </div>
-        <el-table :data="tableData" row-key="id" ref="table">
+        <el-table :data="tableData" row-key="id" ref="table" style="margin-bottom:20px">
             <el-table-column type="index" min-width="50" align="center"> </el-table-column>
             <el-table-column v-if="isColumnShow('tableName')" prop="tableName" label="表名" min-width="100">
             </el-table-column>

+ 1 - 1
src/main/vue/src/views/MenuAuthority.vue

@@ -185,7 +185,7 @@ export default {
 </style>
 <style lang="less">
 .view-menu-authority {
-    padding-bottom: 20px;
+    padding: 20px;
     .menu-tree {
         border-radius: 4px;
         background: white;

+ 15 - 15
src/main/vue/src/views/Menus.vue

@@ -1,5 +1,5 @@
 <template>
-    <div>
+    <div class="menus">
         <el-select v-model="category" placeholder="分类" clearable>
             <el-option v-for="item in categories" :label="item" :key="item" :value="item"></el-option>
         </el-select>
@@ -416,21 +416,16 @@ export default {
 };
 </script>
 <style lang="less" scoped>
+.menus {
+    padding: 20px;
+}
 .menu-tree {
     border-radius: 4px;
     background: white;
     margin-top: 20px;
     padding: 10px;
 }
-</style>
-<style lang="less">
-.menu-tree {
-    .el-tree-node__content {
-        height: 40px;
-        line-height: 40px;
-    }
-}
-.custom-tree-node {
+/deep/ .custom-tree-node {
     flex: 1;
     display: flex;
     align-items: center;
@@ -457,15 +452,20 @@ export default {
             opacity: 1;
         }
     }
+    &:hover {
+        .opt {
+            opacity: 1;
+        }
+    }
 }
-
-.custom-tree-node:hover {
-    .opt {
-        opacity: 1;
+/deep/ .menu-tree {
+    .el-tree-node__content {
+        height: 40px;
+        line-height: 40px;
     }
 }
 
-.available-icons {
+/deep/ .available-icons {
     color: @prim;
     text-decoration: none;
     &:hover {

+ 31 - 20
src/main/vue/src/views/TestClassEdit.vue

@@ -1,25 +1,36 @@
 <template>
     <div class="edit-view">
-        <el-form
-            :model="formData"
-            :rules="rules"
-            ref="form"
-            label-width="61px"
-            label-position="right"
-            size="small"
-            style="max-width: 500px;"
-        >
-            <el-form-item prop="name" label="name">
-                <el-input v-model="formData.name"></el-input>
-            </el-form-item>
-            <el-form-item class="form-submit">
-                <el-button @click="onSave" :loading="saving" size="default" type="primary">保存 </el-button>
-                <el-button @click="onDelete" :loading="saving" size="default" type="danger" v-if="formData.id"
-                    >删除
-                </el-button>
-                <el-button @click="$router.go(-1)" size="default">取消</el-button>
-            </el-form-item>
-        </el-form>
+        <page-title>
+            <el-button @click="$router.go(-1)">取消</el-button>
+            <el-button @click="del" :loading="$store.state.fetchingData" type="danger" v-if="formData.id">
+                删除
+            </el-button>
+            <el-button @click="onSave" :loading="$store.state.fetchingData" type="primary">保存</el-button>
+        </page-title>
+        <div class="edit-view__content-wrapper">
+            <div class="edit-view__content-section">
+                <el-form
+                    :model="formData"
+                    :rules="rules"
+                    ref="form"
+                    label-width="61px"
+                    label-position="right"
+                    size="small"
+                    style="max-width: 500px;"
+                >
+                    <el-form-item prop="name" label="name">
+                        <el-input v-model="formData.name"></el-input>
+                    </el-form-item>
+                    <el-form-item class="form-submit">
+                        <el-button @click="onSave" :loading="saving" size="small" type="primary">保存 </el-button>
+                        <el-button @click="onDelete" :disabled="saving" size="small" type="danger" v-if="formData.id">
+                            删除
+                        </el-button>
+                        <el-button @click="$router.go(-1)" :disabled="disabled" size="small">取消</el-button>
+                    </el-form-item>
+                </el-form>
+            </div>
+        </div>
     </div>
 </template>
 <script>

+ 7 - 1
src/main/vue/src/views/TestClassList.vue

@@ -9,7 +9,13 @@
             </el-button>
         </page-title>
         <div class="filters-container">
-            <el-input placeholder="搜索..." v-model="search" clearable class="filter-item search">
+            <el-input
+                placeholder="搜索..."
+                v-model="search"
+                clearable
+                class="filter-item search"
+                @keyup.enter.native="getData"
+            >
                 <el-button @click="getData" slot="append" icon="el-icon-search"> </el-button>
             </el-input>
         </div>

+ 93 - 55
src/main/vue/src/views/UserEdit.vue

@@ -1,56 +1,77 @@
 <template>
     <div class="edit-view">
-        <el-form
-            :model="formData"
-            :rules="rules"
-            ref="form"
-            label-width="80px"
-            label-position="right"
-            style="max-width: 500px;"
-        >
-            <el-form-item prop="avatar" label="头像">
-                <crop-upload v-model="formData.avatar"></crop-upload>
-            </el-form-item>
-            <el-form-item prop="username" label="用户名">
-                <el-input v-model="formData.username"></el-input>
-                <el-button @click="gen">Random</el-button>
-            </el-form-item>
-            <el-form-item prop="nickname" label="昵称">
-                <el-input v-model="formData.nickname"></el-input>
-            </el-form-item>
-            <el-form-item v-if="formData.id" label="密码">
-                <el-button type="primary" plain @click="resetPassword" size="mini">重置 </el-button>
-            </el-form-item>
-            <el-form-item v-else prop="password" label="密码">
-                <el-input v-model="formData.password"></el-input>
-            </el-form-item>
-            <el-form-item prop="phone" label="手机">
-                <el-input v-model="formData.phone"></el-input>
-            </el-form-item>
-            <el-form-item prop="authorities" label="角色">
-                <el-select
-                    v-model="formData.authorities"
-                    multiple
-                    placeholder="请选择"
-                    value-key="name"
-                    style="width:100%"
+        <page-title>
+            <el-button @click="$router.go(-1)">取消</el-button>
+            <el-button
+                @click="del"
+                :loading="$store.state.fetchingData"
+                type="danger"
+                v-if="formData.id && formData.id !== 1"
+                >删除
+            </el-button>
+            <el-button @click="onSave" :loading="$store.state.fetchingData" type="primary">保存</el-button>
+        </page-title>
+        <div class="edit-view__content-wrapper">
+            <div class="edit-view__content-section">
+                <el-form
+                    :model="formData"
+                    :rules="rules"
+                    ref="form"
+                    label-width="80px"
+                    label-position="right"
+                    style="max-width: 500px;"
                 >
-                    <el-option v-for="item in authorities" :key="item.name" :label="item.description" :value="item">
-                    </el-option>
-                </el-select>
-            </el-form-item>
-            <el-form-item>
-                <el-button @click="onSave" :loading="$store.state.fetchingData" type="primary">保存</el-button>
-                <el-button @click="del" :loading="$store.state.fetchingData" type="danger" v-if="formData.id"
-                    >删除
-                </el-button>
-                <el-button @click="$router.go(-1)">取消</el-button>
-            </el-form-item>
-        </el-form>
+                    <el-form-item prop="avatar" label="头像">
+                        <crop-upload v-model="formData.avatar"></crop-upload>
+                    </el-form-item>
+                    <el-form-item prop="username" label="用户名">
+                        <el-input v-model="formData.username"></el-input>
+                        <div class="gen" @dblclick="gen"></div>
+                    </el-form-item>
+                    <el-form-item prop="nickname" label="昵称">
+                        <el-input v-model="formData.nickname"></el-input>
+                    </el-form-item>
+                    <el-form-item v-if="formData.id" label="密码">
+                        <el-button type="primary" plain @click="resetPassword" size="mini">重置 </el-button>
+                    </el-form-item>
+                    <el-form-item v-else prop="password" label="密码">
+                        <el-input v-model="formData.password"></el-input>
+                    </el-form-item>
+                    <el-form-item prop="phone" label="手机">
+                        <el-input v-model="formData.phone"></el-input>
+                    </el-form-item>
+                    <el-form-item prop="authorities" label="角色">
+                        <el-select
+                            v-model="formData.authorities"
+                            multiple
+                            placeholder="请选择"
+                            value-key="name"
+                            style="width:100%"
+                        >
+                            <el-option
+                                v-for="item in authorities"
+                                :key="item.name"
+                                :label="item.description"
+                                :value="item"
+                            >
+                            </el-option>
+                        </el-select>
+                    </el-form-item>
+                    <el-form-item>
+                        <el-button @click="onSave" :loading="saving" type="primary">保存</el-button>
+                        <el-button @click="del" :disabled="saving" type="danger" v-if="formData.id && formData.id !== 1"
+                            >删除
+                        </el-button>
+                        <el-button @click="$router.go(-1)" :disabled="saving">取消</el-button>
+                    </el-form-item>
+                </el-form>
+            </div>
+        </div>
     </div>
 </template>
 <script>
 import { toSvg } from 'jdenticon';
+import { createIcon } from '@download/blockies';
 import faker from 'faker';
 faker.locale = 'zh_CN';
 console.log(faker);
@@ -101,7 +122,8 @@ export default {
                         trigger: 'blur'
                     }
                 ],
-                authorities: [{ required: true, message: '请选择角色', trigger: 'blur' }]
+                authorities: [{ required: true, message: '请选择角色', trigger: 'blur' }],
+                saving: false
             },
             authorities: []
         };
@@ -117,9 +139,11 @@ export default {
             });
         },
         submit() {
+            this.saving = true;
             this.$http
                 .post(this.formData.id ? '/user/save' : '/user/create', this.formData, { body: 'json' })
                 .then(res => {
+                    this.saving = false;
                     this.$message.success('成功');
                     this.formData = res;
                     this.$router.replace({
@@ -130,6 +154,7 @@ export default {
                 })
                 .catch(e => {
                     console.log(e);
+                    this.saving = false;
                     this.$message.error(e.error);
                 });
         },
@@ -173,16 +198,29 @@ export default {
                 .catch(() => {});
         },
         gen() {
-            console.log(faker.helpers.createCard());
-            let file = new Blob([toSvg('123', 400)], { type: 'image/svg+xml;charset=utf-8' });
-            console.log(file);
-            let form = new FormData();
-            form.append('file', file, 'avatar.svg');
-            this.$http.post('/upload/file', form).then(res => {
-                console.log(res);
+            const icon = createIcon({
+                size: 10,
+                scale: 20
             });
+            this.$http.post('/upload/base64', { base64: icon.toDataURL() }).then(res => {
+                this.formData.avatar = res;
+            });
+            const card = faker.helpers.createCard();
+            this.formData.username = card.username;
+            this.formData.nickname = card.name;
+            this.formData.phone = card.phone;
+            this.$message('ok');
+            console.log(card);
         }
     }
 };
 </script>
-<style lang="less" scoped></style>
+<style lang="less" scoped>
+.gen {
+    position: absolute;
+    top: 0;
+    right: -50px;
+    width: 50px;
+    height: 32px;
+}
+</style>

+ 4 - 0
src/main/vue/yarn.lock

@@ -822,6 +822,10 @@
     lodash "^4.17.13"
     to-fast-properties "^2.0.0"
 
+"@download/blockies@https://github.com/download13/blockies.git":
+  version "1.0.3"
+  resolved "https://github.com/download13/blockies.git#55518d38203582cd4a7b55204b7a26f8032ea07e"
+
 "@fortawesome/fontawesome-common-types@^0.1.7":
   version "0.1.7"
   resolved "https://registry.npm.taobao.org/@fortawesome/fontawesome-common-types/download/@fortawesome/fontawesome-common-types-0.1.7.tgz#4336c4b06d0b5608ff1215464b66fcf9f4795284"

+ 33 - 15
src/test/java/com/izouma/awesomeAdmin/CommonTest.java

@@ -1,8 +1,11 @@
 package com.izouma.awesomeAdmin;
 
+import com.github.atomfrede.jadenticon.Jadenticon;
 import com.izouma.awesomeAdmin.domain.BaseEntity;
 import com.izouma.awesomeAdmin.domain.User;
+import com.izouma.awesomeAdmin.utils.FileUtils;
 import com.izouma.awesomeAdmin.web.BaseController;
+import lombok.SneakyThrows;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.commons.text.CaseUtils;
 import org.junit.Test;
@@ -17,6 +20,8 @@ import org.springframework.web.bind.annotation.RestController;
 import java.awt.*;
 import java.awt.font.FontRenderContext;
 import java.awt.geom.AffineTransform;
+import java.io.File;
+import java.io.FileInputStream;
 import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
@@ -53,7 +58,8 @@ public class CommonTest {
         List<Map<String, String>> entities = new ArrayList<>();
         Reflections classReflections = new Reflections(this.getClass().getPackage().getName());
         Set<Class<? extends BaseController>> controllers = classReflections.getSubTypesOf(BaseController.class);
-        Set<Class<? extends BaseController>> list = ReflectionUtils.getAll(controllers, ReflectionUtils.withAnnotation(RestController.class));
+        Set<Class<? extends BaseController>> list = ReflectionUtils
+                .getAll(controllers, ReflectionUtils.withAnnotation(RestController.class));
         System.out.println(list);
 
         for (Class<? extends BaseController> aClass : list) {
@@ -63,7 +69,8 @@ public class CommonTest {
                 GetMapping getMapping = method.getAnnotation(GetMapping.class);
                 System.out.println(getMapping.value()[0]);
             }
-            for (Method method : ReflectionUtils.getMethods(aClass, ReflectionUtils.withAnnotation(PostMapping.class))) {
+            for (Method method : ReflectionUtils
+                    .getMethods(aClass, ReflectionUtils.withAnnotation(PostMapping.class))) {
                 PostMapping postMapping = method.getAnnotation(PostMapping.class);
                 System.out.println(postMapping.value()[0]);
             }
@@ -79,13 +86,15 @@ public class CommonTest {
     public void testMeasureText() throws IOException, FontFormatException {
         AffineTransform affinetransform = new AffineTransform();
         FontRenderContext frc = new FontRenderContext(affinetransform, true, true);
-        Font font = Font.createFont(Font.TRUETYPE_FONT, this.getClass().getResourceAsStream("/font/SourceHanSansCN-Normal.ttf"));
+        Font font = Font.createFont(Font.TRUETYPE_FONT, this.getClass()
+                .getResourceAsStream("/font/SourceHanSansCN-Normal.ttf"));
         System.out.println((int) (font.deriveFont(14f).getStringBounds("aaa", frc).getWidth()));
     }
 
     @Test
     public void testIdNoRegexp() {
-        boolean b = Pattern.matches("^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0-2]\\d)|3[0-1])\\d{3}$|^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0-2]\\d)|3[0-1])\\d{3}[0-9xX]$", "32100219950830461X");
+        boolean b = Pattern
+                .matches("^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0-2]\\d)|3[0-1])\\d{3}$|^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0-2]\\d)|3[0-1])\\d{3}[0-9xX]$", "32100219950830461X");
         System.out.println(b);
     }
 
@@ -95,23 +104,34 @@ public class CommonTest {
         Set<Class<? extends Enum>> entitySet = reflections.getSubTypesOf(Enum.class);
         StringBuilder idxJs = new StringBuilder();
         for (Class<? extends Enum> entity : entitySet) {
-            idxJs.append("import ").append(entity.getSimpleName()).append(" from \"./").append(entity.getSimpleName()).append("\";\n");
+            idxJs.append("import ").append(entity.getSimpleName()).append(" from \"./").append(entity.getSimpleName())
+                    .append("\";\n");
             StringBuilder str = new StringBuilder("export default {\n");
             for (Enum enumConstant : entity.getEnumConstants()) {
-                str.append("    ").append(enumConstant.name()).append(": \"").append(enumConstant.name()).append("\",\n");
+                str.append("    ").append(enumConstant.name()).append(": \"").append(enumConstant.name())
+                        .append("\",\n");
             }
             str.append("}");
-            Files.write(Paths.get(System.getProperty("user.dir"), "src", "main", "vue", "src", "constants", entity.getSimpleName() + ".js"), str.toString().getBytes(StandardCharsets.UTF_8), CREATE, TRUNCATE_EXISTING);
-            Files.write(Paths.get(System.getProperty("user.dir"), "src", "main", "zmj_mp", "src", "constants", entity.getSimpleName() + ".js"), str.toString().getBytes(StandardCharsets.UTF_8), CREATE, TRUNCATE_EXISTING);
+            Files.write(Paths.get(System.getProperty("user.dir"), "src", "main", "vue", "src", "constants", entity
+                    .getSimpleName() + ".js"), str.toString()
+                    .getBytes(StandardCharsets.UTF_8), CREATE, TRUNCATE_EXISTING);
+            Files.write(Paths.get(System.getProperty("user.dir"), "src", "main", "zmj_mp", "src", "constants", entity
+                    .getSimpleName() + ".js"), str.toString()
+                    .getBytes(StandardCharsets.UTF_8), CREATE, TRUNCATE_EXISTING);
         }
         idxJs.append("export default {\n");
         for (Class<? extends Enum> entity : entitySet) {
-            idxJs.append("    ").append(entity.getSimpleName()).append(": ").append(entity.getSimpleName()).append(",\n");
+            idxJs.append("    ").append(entity.getSimpleName()).append(": ").append(entity.getSimpleName())
+                    .append(",\n");
         }
         idxJs.append("}");
         System.out.println(idxJs.toString());
-        Files.write(Paths.get(System.getProperty("user.dir"), "src", "main", "vue", "src", "constants", "index.js"), idxJs.toString().getBytes(StandardCharsets.UTF_8), CREATE, TRUNCATE_EXISTING);
-        Files.write(Paths.get(System.getProperty("user.dir"), "src", "main", "zmj_mp", "src", "constants", "index.js"), idxJs.toString().getBytes(StandardCharsets.UTF_8), CREATE, TRUNCATE_EXISTING);
+        Files.write(Paths
+                .get(System.getProperty("user.dir"), "src", "main", "vue", "src", "constants", "index.js"), idxJs
+                .toString().getBytes(StandardCharsets.UTF_8), CREATE, TRUNCATE_EXISTING);
+        Files.write(Paths
+                .get(System.getProperty("user.dir"), "src", "main", "zmj_mp", "src", "constants", "index.js"), idxJs
+                .toString().getBytes(StandardCharsets.UTF_8), CREATE, TRUNCATE_EXISTING);
     }
 
     @Test
@@ -126,11 +146,9 @@ public class CommonTest {
         System.out.println(password);
     }
 
+    @SneakyThrows
     @Test
     public void testEnum() {
-        System.out.println(String.class.getName());
-        System.out.println(String.class.getSimpleName());
-        System.out.println(String.class.getCanonicalName());
-        System.out.println(String.class.getTypeName());
+        FileUtils.write(new FileInputStream(Jadenticon.from("sldkjfkl").png("123")), new File("/Users/drew/Desktop/1.png"));
     }
 }