Browse Source

Merge remote-tracking branch 'origin/dev' into dev

wangmh 7 years ago
parent
commit
b06bf09074

+ 2 - 2
gradle/persist-publish.gradle

@@ -20,7 +20,7 @@ task persistJar(type: Jar) {
     baseName "sso-persist"
     from sourceSets.main.output
     exclude "spring", "config"
-    include "**/entity/**", "**/dao/**", "**/core/**"
+    include "**/entity/**", "**/dao/**", "**/core/**", "**/util/**"
 }
 
 task persistSourcesJar(type: Jar) {
@@ -28,7 +28,7 @@ task persistSourcesJar(type: Jar) {
     classifier 'sources'
     from sourceSets.main.allSource
     exclude "spring", "config"
-    include "**/entity/**", "**/dao/**"
+    include "**/entity/**", "**/dao/**", "**/core/**", "**/util/**"
 }
 
 // Create artifact for other project import

+ 2 - 0
sso-manage-console-web/src/components/accounts/common/CommonHome.vue

@@ -41,6 +41,8 @@
             刷新
           </button>
 
+          <slot name="actions"></slot>
+
           <div class="pagination-area">
             <el-pagination
               background

+ 195 - 3
sso-manage-console-web/src/components/accounts/enterprises/EnterpriseAdmin.vue

@@ -54,6 +54,80 @@
         <el-button @click="changeAdminVisible = false">取 消</el-button>
       </span>
     </el-dialog>
+
+    <!-- 更换记录查看对话框 -->
+    <el-dialog
+      title="更换记录"
+      :visible.sync="changeRecordVisible"
+      width="1070px"
+      :show-close="true"
+      :append-to-body="true">
+      <!-- 更换记录列表 -->
+      <div class="change-records-list">
+        <el-table
+          :data="recordsData"
+          stripe
+          style="width: 100%">
+          <el-table-column
+            prop="oldAdminName"
+            label="原管理员"
+            width="110">
+          </el-table-column>
+          <el-table-column
+            prop="oldAdminTel"
+            label="原手机号"
+            width="120">
+          </el-table-column>
+          <el-table-column
+            prop="newAdminName"
+            label="新管理员"
+            width="110">
+          </el-table-column>
+          <el-table-column
+            prop="newAdminTel"
+            label="新手机号"
+            width="120">
+          </el-table-column>
+          <el-table-column
+            prop="sponsorName"
+            label="申请人"
+            width="110">
+          </el-table-column>
+          <el-table-column
+            prop="sponsorTel"
+            label="申请人手机号"
+            width="120">
+          </el-table-column>
+          <el-table-column
+            prop="changeType"
+            label="更换方式"
+            width="120">
+            <template slot-scope="scope">
+              <span v-if="scope.row.changeType === 'ADMIN_OPERATION'">管理员操作</span>
+              <span v-if="scope.row.changeType === 'USER_APPEAL'">人工申诉</span>
+            </template>
+          </el-table-column>
+          <el-table-column
+            prop="launchTime"
+            label="时间"
+            :formatter="formatDate">
+          </el-table-column>
+        </el-table>
+      </div>
+
+      <!-- 对话框尾部 -->
+      <span slot="footer" class="dialog-footer">
+        <el-pagination
+          background
+          layout="prev, pager, next"
+          prev-text="< 上一页"
+          next-text="下一页 >"
+          :page-size="recordsPageParams.size"
+          :total="total"
+          @current-change="handleCurrentPage">
+            </el-pagination>
+      </span>
+    </el-dialog>
   </div>
 </template>
 
@@ -61,6 +135,7 @@
   import axios from '@/assets/js/axios'
   import MessageList from './common/MessageList'
   import * as types from '@/store/mutation-types'
+  import { formatDate } from '@/assets/js/utils'
 
   const keys = [
     {
@@ -77,6 +152,10 @@
     }
   ]
 
+  function showRecordsByPagination (params) {
+    return axios.get('/api/user/space/admin//showRecordsByPagination', { params })
+  }
+
   export default {
     name: 'enterprise-admin',
     components: {
@@ -88,7 +167,15 @@
         items: keys,
         key: 'userUU',
         keyword: '',
-        adminUser: {}
+        adminUser: {},
+        changeRecordVisible: false,
+        recordsPageParams: {
+          page: 1,
+          size: 9,
+          spaceUU: ''
+        },
+        recordsData: [],
+        total: 0
       }
     },
     computed: {
@@ -118,6 +205,7 @@
       }
     },
     methods: {
+      formatDate: formatDate,
       changeAdmin () {
         // 初始化对话框信息
         this.key = 'userUU'
@@ -127,8 +215,15 @@
         this.changeAdminVisible = true
       },
       showRecords () {
-        const routeLocation = {name: 'AppealHome', replace: true}
-        this.$router.push(routeLocation)
+        this.changeRecordVisible = true
+        this.recordsPageParams = {
+          page: 1,
+          size: 9,
+          spaceUU: this.enterprise.spaceUU
+        }
+        this.fetchRecordData()
+        /*const routeLocation = {name: 'AppealHome', replace: true}
+        this.$router.push(routeLocation)*/
       },
       searchAndSelectAdmin () {
         const params = { spaceUU: this.enterprise.spaceUU, key: this.key, keyword: this.keyword }
@@ -168,6 +263,24 @@
         axios.put(`/api/user/space/${spaceUU}/changeAdmin`, {}, { params })
           .then(success)
           .catch(error)
+      },
+      fetchRecordData () {
+        const params = _.defaultsDeep({}, this.recordsPageParams)
+        params.page = params.page - 1
+
+        const success = pageInfo => {
+          this.recordsData = pageInfo.content
+          this.total = pageInfo.totalElements
+          console.log(pageInfo)
+        }
+        const error = error => {
+          console.log(error)
+        }
+        showRecordsByPagination(params).then(success).catch(error)
+      },
+      handleCurrentPage (currentPage) {
+        this.recordsPageParams.page = currentPage
+        this.fetchRecordData()
       }
     }
   }
@@ -246,6 +359,10 @@
 
     color: #4A7DE1;
   }
+  .change-records-list {
+    margin: -22px 0 0 -40px;
+    min-height: 440px;
+  }
 </style>
 
 <style>
@@ -307,4 +424,79 @@
     background-color: #4E8EFC;
     color: #FFFFFF;
   }
+  /* List */
+  .change-records-list .el-table th.is-leaf:first-child {
+    padding-left: 35px;
+  }
+  .change-records-list .el-table--enable-row-transition .el-table__body td:first-child {
+    padding-left: 35px;
+  }
+  .change-records-list .el-table th>.cell {
+    color: #000000;
+    font-size: 13px;
+    font-weight: normal;
+    font-family: "Microsoft YaHei", sans-serif;
+  }
+  .change-records-list .el-table th {
+    padding: 9px 0 8px;
+  }
+  .change-records-list .el-table--enable-row-hover .el-table__body tr:hover>td {
+    background-color: #D0E5F5;
+
+    color: #000000;
+    font-size: 13px;
+    font-family: "Microsoft YaHei", sans-serif;
+  }
+  /* striped row */
+  .change-records-list .el-table--enable-row-hover .el-table__body tr.el-table__row--striped:hover>td {
+    background-color: #D0E5F5;
+
+    color: #000000;
+    font-size: 13px;
+    font-family: "Microsoft YaHei", sans-serif;
+  }
+  .change-records-list .el-table td {
+    padding: 10px 0;
+
+    font-size: 13px;
+    font-family: "Microsoft YaHei", sans-serif;
+  }
+  .change-records-list .el-table--striped .el-table__body tr.el-table__row--striped td {
+    background: #F4F4F4;
+  }
+  .dialog-footer .el-pagination button,
+  .dialog-footer .el-pagination span:not([class*=suffix]) {
+    color: #000000;
+    font-weight: normal;
+  }
+  .dialog-footer .el-pagination button span {
+    height: 26px;
+    background-color: #FFFFFF;
+    border: none;
+    border-radius: 0;
+  }
+  .dialog-footer .el-pagination.is-background .btn-next,
+  .dialog-footer .el-pagination.is-background .btn-prev,
+  .dialog-footer .el-pagination.is-background .el-pager li {
+    font-weight: normal;
+  }
+  .dialog-footer .el-pagination.is-background .btn-next,
+  .dialog-footer .el-pagination.is-background .btn-prev {
+    padding-right: 5px;
+    padding-left: 5px;
+
+    background-color: #FFFFFF;
+    border: 1px solid #CFCFCF;
+    border-radius: 0;
+  }
+  .dialog-footer .el-pagination.is-background .el-pager li {
+    background-color: #FFFFFF;
+    border: 1px solid #CFCFCF;
+    border-radius: 0;
+  }
+  .dialog-footer .el-pagination.is-background .el-pager li.active {
+    background-color: #303743;
+    border-color: #303743;
+    color: #fff;
+  }
 </style>

+ 244 - 1
sso-manage-console-web/src/components/accounts/enterprises/EnterpriseMembers.vue

@@ -51,6 +51,13 @@
             刷新
           </button>
 
+          <button
+            type="button"
+            class="btn btn-default btn-refresh btn-bind"
+            @click="showBindDialog">
+            绑定用户
+          </button>
+
           <div class="pagination-area">
             <el-pagination
               background
@@ -65,6 +72,56 @@
         </el-row>
       </el-footer>
     </el-container>
+
+    <!-- 绑定用户对话框 -->
+    <el-dialog
+      title="绑定用户"
+      :visible.sync="isBindUser"
+      width="450px"
+      :show-close="true"
+      :append-to-body="true">
+      <!-- 对话框内容 -->
+      <el-row type="flex" class="row-bg">
+        <el-select v-model="key" placeholder="请选择">
+          <el-option
+            v-for="item in items"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
+        <div class="input-group search-group" style="width: 242px;margin-left: 5px;">
+          <el-input placeholder="请输入内容" v-model="keyword"></el-input>
+          <span class="input-group-btn">
+            <button class="btn btn-default btn-search" type="button" @click="searchAndSelectAdmin">搜索</button>
+          </span>
+        </div>
+      </el-row>
+      <!-- 用户信息展示 -->
+      <div class="selected-user-info">
+        <div class="row">
+          <div class="message-label">UU号</div>
+          <div class="message-value" v-text="bindUserInfo.userUU">U0516</div>
+        </div>
+        <div class="row">
+          <div class="message-label">姓名</div>
+          <div class="message-value" v-text="bindUserInfo.realName || bindUserInfo.vipName">陈正亮</div>
+        </div>
+        <div class="row">
+          <div class="message-label">手机号</div>
+          <div class="message-value" v-text="bindUserInfo.mobile">13600001122</div>
+        </div>
+        <div class="row">
+          <div class="message-label">邮箱</div>
+          <div class="message-value" v-text="bindUserInfo.email">1891141208@qq.com</div>
+        </div>
+      </div>
+      <!-- 对话框尾部 -->
+      <span slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="bindUserToCurrentEnterprise">确 定</el-button>
+        <el-button @click="isBindUser = false">取 消</el-button>
+      </span>
+    </el-dialog>
   </div>
 </template>
 
@@ -73,6 +130,26 @@
   import axios from '@/assets/js/axios'
   import * as types from '@/store/mutation-types'
 
+  const keys = [
+    {
+      label: 'UU号',
+      value: 'userUU'
+    },
+    {
+      label: '手机号',
+      value: 'mobile'
+    },
+    {
+      label: '邮箱',
+      value: 'email'
+    }
+  ]
+
+  function bindUserToEnterprise (spaceUU, userUu) {
+    const params = { userUu }
+    return axios.put(`/api/user/space/${spaceUU}/addUserToSpace`, {}, { params })
+  }
+
   export default {
     name: 'enterprise-members',
     data () {
@@ -83,7 +160,12 @@
           spaceUU: null
         },
         total: 0,
-        userList: []
+        userList: [],
+        isBindUser: false,
+        items: keys,
+        key: 'userUU',
+        keyword: '',
+        bindUserInfo: {}
       }
     },
     computed: {
@@ -140,6 +222,49 @@
         axios.put(`/api/user/space/${this.enterprise.spaceUU}/unbindUser`, {}, {params}).then(
           success).catch(error)
       },
+      showBindDialog () {
+        this.isBindUser = true
+        this.key = 'userUU'
+        this.keyword = ''
+        this.bindUserInfo = {}
+      },
+      searchAndSelectAdmin () {
+        const params = { spaceUU: this.enterprise.spaceUU, key: this.key, keyword: this.keyword }
+
+        const error = error => {
+          console.log(error)
+        }
+
+        axios.get('/api/user//searchUserFromOthers', { params })
+        .then(userList => {
+          // 展示查询到的用户信息
+          if (userList && userList.length > 0) {
+            this.bindUserInfo = userList[0]
+          } else {
+            this.$message.info('没有找到对应非当前企业的用户信息!')
+          }
+        })
+        .catch(error)
+      },
+      bindUserToCurrentEnterprise () {
+        const spaceUU = this.enterprise.spaceUU
+        const userUU = this.bindUserInfo.userUU
+
+        const success = result => {
+          if (result) {
+            this.fetchData()
+            this.isBindUser = false
+            this.$message.success('绑定成功')
+          }
+        }
+        const error = response => {
+          this.$message.error(response)
+        }
+
+        bindUserToEnterprise(spaceUU, userUU)
+          .then(success)
+          .catch(error)
+      },
       routeToUserDetail (user) {
         const routeLocation = {name: 'UserBasicInfo', params: user, replace: true}
         this.$router.push(routeLocation)
@@ -174,9 +299,79 @@
     font-size: 13px;
     font-family: "Microsoft YaHei", sans-serif;
   }
+  .btn-bind {
+    width: 80px;
+    margin-left: 15px;
+  }
   .pagination-area {
     padding: 17px 0 17px 150px;
   }
+  .selected-user-info {
+    margin-top: 20px;
+    margin-bottom: 50px;
+  }
+  .selected-user-info .row {
+    margin: 15px 0;
+    height: 34px;
+  }
+  .selected-user-info .row div {
+    display: inline-block;
+  }
+  .selected-user-info .row .message-label {
+    padding: 10px;
+    width: 90px;
+    height: 34px;
+    line-height: 14px;
+
+    color: #000000;
+    font-size: 14px;
+    font-weight: normal;
+    font-family: "SimHei", sans-serif;
+  }
+  .selected-user-info .row .message-value {
+    padding: 10px;
+    width: 280px;
+    height: 34px;
+    line-height: 14px;
+    background-color: #F1F1F1;
+
+    color: #646464;
+    font-size: 14px;
+    font-weight: normal;
+    font-family: "Microsoft YaHei", sans-serif;
+  }
+  .input-group {
+    border: 1px solid #D2D2D2;
+  }
+  .input-group-btn::before {
+    content: '';
+    position: absolute;
+    top: 10px;
+    left: 0;
+    width: 1px;
+    height: 13px;
+    background: #D2D2D2;
+    z-index: 5;
+  }
+  .btn-search {
+    width: 58px;
+    height: 30px;
+    border-radius: 0;
+    outline: none;
+    border: none;
+
+    color: #2190E1;
+  }
+  .btn-search:active,
+  .btn-search:hover,
+  .btn-search:visited,
+  .btn-search:focus {
+    outline: none;
+    background: none;
+    box-shadow: none;
+
+    color: #4A7DE1;
+  }
 </style>
 
 <style>
@@ -230,4 +425,52 @@
   .el-table--striped .el-table__body tr.el-table__row--striped td {
     background: #F4F4F4;
   }
+  .el-dialog {
+    border-radius: 5px;
+  }
+  .el-dialog__header {
+    padding: 14px 20px;
+    height: 44px;
+    line-height: 16px;
+    border: 1px none #D2D2D2;
+    border-bottom-style: solid;
+  }
+  .el-dialog__header .el-dialog__title {
+    color: #000000;
+    font-size: 16px;
+    font-weight: normal;
+    font-family: "SimHei", sans-serif;
+  }
+  .el-dialog__body {
+    padding: 22px 0 22px 40px;
+  }
+  .el-select .el-input__inner {
+    border-radius: 0;
+    width: 128px;
+    height: 32px;
+  }
+  .search-group .el-input__inner {
+    width: 186px;
+    height: 30px;
+    border-radius: 0;
+    border: none;
+  }
+  .el-dialog__footer {
+    text-align: center;
+  }
+  .el-dialog__footer .el-button {
+    width: 180px;
+    height: 30px;
+    border-radius: 15px;
+    line-height: 14px;
+    padding: 8px 0;
+
+    background: none;
+
+    color: #656565;
+  }
+  .el-dialog__footer .el-button--primary {
+    background-color: #4E8EFC;
+    color: #FFFFFF;
+  }
 </style>

+ 241 - 88
sso-manage-console-web/src/components/accounts/users/UserHome.vue

@@ -1,91 +1,147 @@
 <template>
-  <common-home
-    :pageSize="pageParams.size"
-    :total="total"
-    :searchKeys="searchKeys"
-    :searchKey="pageParams.key"
-    :searchKeyword="pageParams.keyword"
-    @current-change="handleCurrentChange"
-    @refresh-data="handleRefreshData"
-    @search="handleSearchAction">
-    <div slot="screen-type">
-      <!-- 注册来源 -->
-      <label>注册来源</label>
-      <el-select v-model="pageParams.fromApp" clearable placeholder="不限" @change="handleRefreshData">
-        <el-option
-          v-for="item in fromAppOptions"
-          :key="item.value"
-          :label="item.label"
-          :value="item.value">
-        </el-option>
-      </el-select>
-
-      <!-- 手机认证状态 -->
-      <label>手机认证状态</label>
-      <el-select v-model="pageParams.mobileValidCode" clearable placeholder="不限" @change="handleRefreshData">
-        <el-option
-          v-for="item in mobileValidCodeOptions"
-          :key="item.value"
-          :label="item.label"
-          :value="item.value">
-        </el-option>
-      </el-select>
-    </div>
-
-    <el-table
-      :data="tableData"
-      stripe
-      style="width: 100%">
-      <el-table-column
-        label="操作">
-        <template slot-scope="scope">
-          <el-button @click="handleClick(scope.row)" type="text" size="small">查看</el-button>
-        </template>
-      </el-table-column>
-      <el-table-column
-        prop="vipName"
-        label="用户名称">
-      </el-table-column>
-      <el-table-column
-        prop="userUU"
-        label="个人UU">
-      </el-table-column>
-      <el-table-column
-        prop="mobile"
-        label="手机号"
-        width="170">
-        <template slot-scope="scope">
-          {{ scope.row.mobile }}
-          <span class="valid-code1" v-if="scope.row.mobileValidCode === 2">(已认证)</span>
-          <span class="valid-code0" v-if="scope.row.mobileValidCode !== 2">(未认证)</span>
-        </template>
-      </el-table-column>
-      <el-table-column
-        prop="email"
-        label="邮箱"
-        width="250">
-        <template slot-scope="scope" v-if="scope.row.email">
-          {{ scope.row.email }}
-          <span class="valid-code1" v-if="scope.row.emailValidCode === 2">(已认证)</span>
-          <span class="valid-code0" v-if="scope.row.emailValidCode !== 2">(未认证)</span>
-        </template>
-      </el-table-column>
-      <el-table-column
-        prop="registerDate"
-        label="注册时间"
-        :formatter="formatDate"
-        width="160">
-      </el-table-column>
-      <el-table-column
-        prop="lastLogin"
-        label="上次登录">
-      </el-table-column>
-      <el-table-column
-        prop="fromApp"
-        label="注册来源">
-      </el-table-column>
-    </el-table>
-  </common-home>
+  <div>
+    <common-home
+      :pageSize="pageParams.size"
+      :total="total"
+      :searchKeys="searchKeys"
+      :searchKey="pageParams.key"
+      :searchKeyword="pageParams.keyword"
+      @current-change="handleCurrentChange"
+      @refresh-data="handleRefreshData"
+      @search="handleSearchAction">
+      <div slot="screen-type">
+        <!-- 注册来源 -->
+        <label>注册来源</label>
+        <el-select v-model="pageParams.fromApp" clearable placeholder="不限" @change="handleRefreshData">
+          <el-option
+            v-for="item in fromAppOptions"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
+
+        <!-- 手机认证状态 -->
+        <label>手机认证状态</label>
+        <el-select v-model="pageParams.mobileValidCode" clearable placeholder="不限" @change="handleRefreshData">
+          <el-option
+            v-for="item in mobileValidCodeOptions"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
+      </div>
+
+      <el-table
+        :data="tableData"
+        stripe
+        style="width: 100%">
+        <el-table-column
+          label="操作">
+          <template slot-scope="scope">
+            <el-button @click="handleClick(scope.row)" type="text" size="small">查看</el-button>
+          </template>
+        </el-table-column>
+        <el-table-column
+          prop="vipName"
+          label="用户名称">
+        </el-table-column>
+        <el-table-column
+          prop="userUU"
+          label="个人UU">
+        </el-table-column>
+        <el-table-column
+          prop="mobile"
+          label="手机号"
+          width="170">
+          <template slot-scope="scope">
+            {{ scope.row.mobile }}
+            <span class="valid-code1" v-if="scope.row.mobileValidCode === 2">(已认证)</span>
+            <span class="valid-code0" v-if="scope.row.mobileValidCode !== 2">(未认证)</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          prop="email"
+          label="邮箱"
+          width="250">
+          <template slot-scope="scope" v-if="scope.row.email">
+            {{ scope.row.email }}
+            <span class="valid-code1" v-if="scope.row.emailValidCode === 2">(已认证)</span>
+            <span class="valid-code0" v-if="scope.row.emailValidCode !== 2">(未认证)</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          prop="registerDate"
+          label="注册时间"
+          :formatter="formatDate"
+          width="160">
+        </el-table-column>
+        <el-table-column
+          prop="lastLogin"
+          label="上次登录">
+        </el-table-column>
+        <el-table-column
+          prop="fromApp"
+          label="注册来源">
+        </el-table-column>
+      </el-table>
+
+      <div class="user-actions" slot="actions">
+        <button
+          type="button"
+          class="btn btn-default btn-refresh"
+          @click="isAddNewUser = true; newUserInfo = {}">
+          新增
+        </button>
+      </div>
+    </common-home>
+
+    <!-- 新增用户对话框 -->
+    <el-dialog
+      title="新增用户"
+      :visible.sync="isAddNewUser"
+      width="450px"
+      :show-close="true"
+      :append-to-body="true">
+      <!-- 用户信息展示 -->
+      <div class="new-user-info">
+        <form class="form-horizontal">
+          <div class="form-group">
+            <label class="col-sm-2 control-label">姓名</label>
+            <div class="col-sm-10">
+              <input type="text" class="form-control" title="vipName" v-model="newUserInfo.vipName" required/>
+            </div>
+          </div>
+          <div class="form-group">
+            <label class="col-sm-2 control-label">手机号</label>
+            <div class="col-sm-10">
+              <input type="tel" class="form-control" title="mobile" v-model="newUserInfo.mobile" required/>
+            </div>
+          </div>
+          <div class="form-group">
+            <label class="col-sm-2 control-label">邮箱</label>
+            <div class="col-sm-10">
+              <input type="email" class="form-control" title="email" v-model="newUserInfo.email"/>
+            </div>
+          </div>
+          <div class="form-group">
+            <label class="col-sm-2 control-label">密码</label>
+            <div class="col-sm-10">
+              <!-- 暂时使用文本 -->
+              <input type="text" class="form-control" title="password" v-model="newUserInfo.password" required/>
+            </div>
+          </div>
+        </form>
+      </div>
+      <!-- 对话框尾部 -->
+      <span slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="addNewUser">保 存</el-button>
+        <el-button @click="isAddNewUser = false">取 消</el-button>
+      </span>
+    </el-dialog>
+  </div>
+
 </template>
 
 <script>
@@ -109,6 +165,11 @@
     }
   ]
 
+  function addNewUserInfo (user) {
+    return axios.post('/api/user//addNewUser', user)
+      .then(user => { return user })
+  }
+
   export default {
     name: 'user-home',
     components: {
@@ -127,7 +188,9 @@
         pageContent: [],
         total: 0,
         mobileValidCodeOptions: ValidCode,
-        searchKeys: searchKeys
+        searchKeys: searchKeys,
+        isAddNewUser: false,
+        newUserInfo: {}
       }
     },
     created () {
@@ -179,6 +242,23 @@
         const routeLocation = {name: 'UserBasicInfo', params: row}
         this.$router.push(routeLocation)
       },
+      addNewUser () {
+        const body = _.defaultsDeep({}, this.newUserInfo)
+
+        const error = response => {
+          this.$message.error(response)
+        }
+
+        addNewUserInfo(body)
+          .then(user => {
+            console.log(user)
+            this.$message.success('新增成功')
+            this.isAddNewUser = false
+
+            // 刷新页面数据
+            this.fetchData()
+          }).catch(error)
+      },
       formatDate (row, column, value) {
         if (!value) {
           return ''
@@ -227,4 +307,77 @@
   .el-table td span.valid-code3{
     color: #606266;
   }
+  .user-actions {
+    padding: 17px;
+  }
+  .user-actions button {
+    height: 28px;
+    line-height: 14px;
+    border-radius: 0;
+  }
+  .new-user-info {
+    width: 420px;
+  }
+  .new-user-info .form-horizontal .row {
+    margin: 0;
+  }
+  .new-user-info .form-horizontal .control-label {
+    text-align: left;
+
+    color: #000000;
+  }
+  .new-user-info .form-horizontal .form-control {
+    width: 300px;
+    border-radius: 0;
+    height: 34px;
+    line-height: 14px;
+
+    color: #646464;
+  }
+  .new-user-info .form-horizontal .control-label,
+  .new-user-info .form-horizontal .form-control {
+    font-size: 14px;
+    font-weight: normal;
+    font-family: "Microsoft YaHei", sans-serif;
+  }
+</style>
+
+<style>
+  .el-dialog {
+    border-radius: 5px;
+  }
+  .el-dialog__header {
+    padding: 14px 20px;
+    height: 44px;
+    line-height: 16px;
+    border: 1px none #D2D2D2;
+    border-bottom-style: solid;
+  }
+  .el-dialog__header .el-dialog__title {
+    color: #000000;
+    font-size: 16px;
+    font-weight: normal;
+    font-family: "SimHei", sans-serif;
+  }
+  .el-dialog__body {
+    padding: 22px 0 22px 40px;
+  }
+  .el-dialog__footer {
+    text-align: center;
+  }
+  .el-dialog__footer .el-button {
+    width: 180px;
+    height: 30px;
+    border-radius: 15px;
+    line-height: 14px;
+    padding: 8px 0;
+
+    background: none;
+
+    color: #656565;
+  }
+  .el-dialog__footer .el-button--primary {
+    background-color: #4E8EFC;
+    color: #FFFFFF;
+  }
 </style>

+ 9 - 0
sso-manage-console/src/main/java/com/uas/sso/sso/backend/api/ChangeAdminController.java

@@ -3,6 +3,7 @@ package com.uas.sso.sso.backend.api;
 import com.uas.sso.entity.ChangeAdmin;
 import com.uas.sso.sso.backend.dto.ChangeAdminAudit;
 import com.uas.sso.sso.backend.dto.ChangeAdminCommit;
+import com.uas.sso.sso.backend.entity.AdminChangeRecord;
 import com.uas.sso.sso.backend.service.ChangeAdminService;
 import com.uas.sso.sso.backend.support.ResultBean;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -44,6 +45,14 @@ public class ChangeAdminController {
                 .showUserByPagination(page, validCode, spaceName, businessCode, userName));
     }
 
+    @RequestMapping(method = RequestMethod.GET, path = "//showRecordsByPagination",
+            produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    public ResultBean<Page<AdminChangeRecord>> showRecordsByPagination(Pageable page, Long spaceUU) {
+
+        return new ResultBean<>(changeAdminService
+                .showRecordsByPagination(page, spaceUU));
+    }
+
     @RequestMapping(method = RequestMethod.POST, path = "//submitChange",
             produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
     public ResultBean<ChangeAdmin> submitChangeAdminRequest(

+ 26 - 8
sso-manage-console/src/main/java/com/uas/sso/sso/backend/api/UserManageController.java

@@ -1,13 +1,15 @@
 package com.uas.sso.sso.backend.api;
 
 import com.uas.sso.entity.User;
+import com.uas.sso.sso.backend.dto.AddNewUserInfo;
 import com.uas.sso.sso.backend.dto.UpdateUserInfo;
-import com.uas.sso.sso.backend.service.UserService;
+import com.uas.sso.sso.backend.service.UserBackendService;
 import com.uas.sso.sso.backend.support.ResultBean;
 import java.util.List;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Pageable;
 import org.springframework.http.MediaType;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
@@ -23,11 +25,11 @@ import org.springframework.web.bind.annotation.RestController;
 @RequestMapping(path = "/api/user")
 public class UserManageController {
 
-    private final UserService userService;
+    private final UserBackendService userBackendService;
 
     @Autowired
-    public UserManageController(UserService userService) {
-        this.userService = userService;
+    public UserManageController(UserBackendService userBackendService) {
+        this.userBackendService = userBackendService;
     }
 
     @RequestMapping(method = RequestMethod.GET, path = "//showUserByPagination",
@@ -38,14 +40,15 @@ public class UserManageController {
             @RequestParam(required = false) String key,
             @RequestParam(required = false) String keyword) {
         // Controller中的Pageable类型参数默认根据查询参数 page 和 size 注入并实例化
-        return new ResultBean<>(userService.showUserByPagination(page, fromApp, mobileValidCode, key, keyword));
+        return new ResultBean<>(
+                userBackendService.showUserByPagination(page, fromApp, mobileValidCode, key, keyword));
     }
 
     @RequestMapping(method = RequestMethod.GET, path = "//showEnUserByPagination",
             produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
     public ResultBean<org.springframework.data.domain.Page<User>> showEnUserByPagination(Pageable page, Long spaceUU) {
 
-        return new ResultBean<>(userService.showEnUserByPagination(page, spaceUU));
+        return new ResultBean<>(userBackendService.showEnUserByPagination(page, spaceUU));
     }
 
     @RequestMapping(method = RequestMethod.GET, path = "//searchUserByKeyword",
@@ -53,13 +56,28 @@ public class UserManageController {
     public ResultBean<List<User>> searchUserByKeyword(@RequestParam("spaceUU") Long spaceUu,
             String key, String keyword) {
 
-        return new ResultBean<>(userService.searchUserByKeyword(spaceUu, key, keyword));
+        return new ResultBean<>(userBackendService.searchUserByKeyword(spaceUu, key, keyword));
+    }
+
+    @RequestMapping(method = RequestMethod.GET, path = "//searchUserFromOthers",
+            produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    public ResultBean<List<User>> searchUserFromOthers(@RequestParam("spaceUU") Long spaceUu,
+            String key, String keyword) {
+
+        return new ResultBean<>(userBackendService.searchUserFromOthers(spaceUu, key, keyword));
     }
 
     @RequestMapping(method = RequestMethod.PUT, path = "//modifyUserInfo",
             produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
     public ResultBean<Boolean> modifyUserInfo(@RequestBody UpdateUserInfo userInfo) {
 
-        return new ResultBean<>(userService.modifyUserInfo(userInfo));
+        return new ResultBean<>(userBackendService.modifyUserInfo(userInfo));
+    }
+
+    @RequestMapping(method = RequestMethod.POST, path = "//addNewUser",
+            produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+    public ResultBean<User> addNewUser(@RequestBody @Validated AddNewUserInfo userInfo) {
+
+        return new ResultBean<>(userBackendService.addNewUser(userInfo));
     }
 }

+ 80 - 0
sso-manage-console/src/main/java/com/uas/sso/sso/backend/dto/AddNewUserInfo.java

@@ -0,0 +1,80 @@
+package com.uas.sso.sso.backend.dto;
+
+import com.uas.sso.entity.User;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+
+/**
+ * 新增用户信息DTO.
+ *
+ * @author huxz
+ */
+public class AddNewUserInfo {
+
+    /**
+     * 会员名
+     */
+    @NotNull(message = "个人名称不能为空")
+    private String vipName;
+
+    /**
+     * 手机号
+     */
+    @NotNull(message = "用户手机号不能为空")
+    private String mobile;
+
+    /**
+     * 用户邮箱
+     */
+    private String email;
+
+    /**
+     * 用户密码
+     */
+    @NotNull(message = "用户密码不能为空")
+    private String password;
+
+    public String getVipName() {
+        return vipName;
+    }
+
+    public void setVipName(String vipName) {
+        this.vipName = vipName;
+    }
+
+    public String getMobile() {
+        return mobile;
+    }
+
+    public void setMobile(String mobile) {
+        this.mobile = mobile;
+    }
+
+    public String getEmail() {
+        return email;
+    }
+
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public User fillUserInfo(User user) {
+        if (user == null) {
+            user = new User();
+        }
+
+        user.setVipName(this.vipName);
+        user.setMobile(this.mobile);
+        user.setEmail(this.email);
+        user.setPassword(this.password);
+        return user;
+    }
+}

+ 10 - 0
sso-manage-console/src/main/java/com/uas/sso/sso/backend/service/ChangeAdminService.java

@@ -3,6 +3,7 @@ package com.uas.sso.sso.backend.service;
 import com.uas.sso.entity.ChangeAdmin;
 import com.uas.sso.sso.backend.dto.ChangeAdminAudit;
 import com.uas.sso.sso.backend.dto.ChangeAdminCommit;
+import com.uas.sso.sso.backend.entity.AdminChangeRecord;
 import javax.validation.constraints.NotNull;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
@@ -17,6 +18,15 @@ public interface ChangeAdminService {
     Page<ChangeAdmin> showUserByPagination(Pageable page, Short validCode,
             String spaceName, String businessCode, String userName);
 
+    /**
+     * 分页获取某企业的管理员更换记录.
+     *
+     * @param page  分页参数
+     * @param spaceUU   企业UU
+     * @return  分页数据
+     */
+    Page<AdminChangeRecord> showRecordsByPagination(Pageable page, Long spaceUU);
+
     /**
      * Just for testing
      *

+ 20 - 1
sso-manage-console/src/main/java/com/uas/sso/sso/backend/service/UserService.java → sso-manage-console/src/main/java/com/uas/sso/sso/backend/service/UserBackendService.java

@@ -1,6 +1,7 @@
 package com.uas.sso.sso.backend.service;
 
 import com.uas.sso.entity.User;
+import com.uas.sso.sso.backend.dto.AddNewUserInfo;
 import com.uas.sso.sso.backend.dto.UpdateUserInfo;
 import java.util.List;
 import javax.validation.constraints.NotNull;
@@ -12,7 +13,7 @@ import org.springframework.data.domain.Pageable;
  *
  * @author huxz
  */
-public interface UserService {
+public interface UserBackendService {
 
     /**
      * 分页获取用户信息.
@@ -46,6 +47,16 @@ public interface UserService {
      */
     List<User> searchUserByKeyword(Long spaceUu, String key, String keyword);
 
+    /**
+     * 根据关键字搜索非当前企业的用户信息
+     *
+     * @param spaceUu   企业UU
+     * @param key   搜索字段
+     * @param keyword   搜索关键字
+     * @return  用户列表信息
+     */
+    List<User> searchUserFromOthers(Long spaceUu, String key, String keyword);
+
     /**
      * 管理员收到客户时,后台修改用户的信息.
      *
@@ -53,5 +64,13 @@ public interface UserService {
      * @return  操作状态
      */
     Boolean modifyUserInfo(UpdateUserInfo userInfo);
+
+    /**
+     * 后台新增用户。
+     *
+     * @param userInfo  用户信息
+     * @return  新创建的用户
+     */
+    User addNewUser(AddNewUserInfo userInfo);
 }
 

+ 29 - 1
sso-manage-console/src/main/java/com/uas/sso/sso/backend/service/impl/ChangeAdminServiceImpl.java

@@ -6,8 +6,10 @@ import com.uas.sso.dao.UserspaceDao;
 import com.uas.sso.entity.ChangeAdmin;
 import com.uas.sso.entity.User;
 import com.uas.sso.entity.Userspace;
+import com.uas.sso.sso.backend.dao.AdminChangeRecordDao;
 import com.uas.sso.sso.backend.dto.ChangeAdminAudit;
 import com.uas.sso.sso.backend.dto.ChangeAdminCommit;
+import com.uas.sso.sso.backend.entity.AdminChangeRecord;
 import com.uas.sso.sso.backend.exceptions.ValidationFailedException;
 import com.uas.sso.sso.backend.service.ChangeAdminService;
 import java.util.ArrayList;
@@ -44,12 +46,16 @@ public class ChangeAdminServiceImpl implements ChangeAdminService {
 
     private final UserDao userDao;
 
+    private final AdminChangeRecordDao recordDao;
+
     @Autowired
     public ChangeAdminServiceImpl(ChangeAdminDao changeAdminDao,
-            UserspaceDao userspaceDao, UserDao userDao) {
+            UserspaceDao userspaceDao, UserDao userDao,
+            AdminChangeRecordDao recordDao) {
         this.changeAdminDao = changeAdminDao;
         this.userspaceDao = userspaceDao;
         this.userDao = userDao;
+        this.recordDao = recordDao;
     }
 
     @Override
@@ -94,6 +100,28 @@ public class ChangeAdminServiceImpl implements ChangeAdminService {
         }, page);
     }
 
+    @Override
+    public Page<AdminChangeRecord> showRecordsByPagination(Pageable page, Long spaceUU) {
+
+        return recordDao.findAll(new Specification<AdminChangeRecord>() {
+            @Override
+            public Predicate toPredicate(Root<AdminChangeRecord> root, CriteriaQuery<?> query,
+                    CriteriaBuilder builder) {
+                List<Predicate> predicates = new ArrayList<>();
+
+                // 根据企业UU进行过滤
+                predicates.add(builder.equal(root.get("spaceUU"), spaceUU));
+
+                predicates.removeAll(Collections.singletonList(null));
+
+                Predicate[] array = predicates.toArray(new Predicate[predicates.size()]);
+                Predicate predicate = builder.and(array);
+                query.where(predicate);
+                return null;
+            }
+        }, page);
+    }
+
     @Override
     @Transactional(rollbackFor = RuntimeException.class)
     public ChangeAdmin submitChangeAdminRequest(@NotNull ChangeAdminCommit commit) {

+ 80 - 4
sso-manage-console/src/main/java/com/uas/sso/sso/backend/service/impl/UserServiceImpl.java → sso-manage-console/src/main/java/com/uas/sso/sso/backend/service/impl/UserBackendServiceImpl.java

@@ -1,13 +1,20 @@
 package com.uas.sso.sso.backend.service.impl;
 
 import com.uas.sso.core.Const;
+import com.uas.sso.core.Status;
+import com.uas.sso.dao.AppDao;
 import com.uas.sso.dao.UserDao;
+import com.uas.sso.entity.App;
 import com.uas.sso.entity.User;
+import com.uas.sso.entity.UserRecord;
 import com.uas.sso.entity.Userspace;
 import com.uas.sso.sso.backend.AuthenticationUtils;
+import com.uas.sso.sso.backend.dto.AddNewUserInfo;
 import com.uas.sso.sso.backend.dto.UpdateUserInfo;
 import com.uas.sso.sso.backend.exceptions.ValidationFailedException;
-import com.uas.sso.sso.backend.service.UserService;
+import com.uas.sso.sso.backend.service.UserBackendService;
+import com.uas.sso.util.InfoAsyncUtils;
+import java.sql.Timestamp;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -24,17 +31,20 @@ import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 
 /**
- * An implementations of {@code UserService}.
+ * An implementations of {@code UserBackendService}.
  *
  * @author huxz
  */
 @Service
-public class UserServiceImpl implements UserService {
+public class UserBackendServiceImpl implements UserBackendService {
+
+    private final AppDao appDao;
 
     private final UserDao userDao;
 
     @Autowired
-    public UserServiceImpl(UserDao userDao) {
+    public UserBackendServiceImpl(AppDao appDao, UserDao userDao) {
+        this.appDao = appDao;
         this.userDao = userDao;
     }
 
@@ -133,6 +143,37 @@ public class UserServiceImpl implements UserService {
         });
     }
 
+    @Override
+    public List<User> searchUserFromOthers(Long spaceUu, String key, String keyword) {
+
+        return userDao.findAll(new Specification<User>() {
+            @Override
+            public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query,
+                    CriteriaBuilder builder) {
+                List<Predicate> predicates = new ArrayList<>();
+
+                if (spaceUu != null) {
+                    Predicate predicate = builder.isNotMember(new Userspace(spaceUu), root.get("userSpaces"));
+                    predicates.add(predicate);
+                }
+
+                if (!StringUtils.isEmpty(key) && !StringUtils.isEmpty(keyword)) {
+                    Predicate predicate = builder.equal(root.get(key), keyword);
+                    predicates.add(predicate);
+                }
+
+                // 移除无效条件表达式
+                predicates.removeAll(Collections.singletonList(null));
+
+                Predicate[] array = new Predicate[predicates.size()];
+                predicates.toArray(array);
+                Predicate predicate = builder.and(array);
+                query.where(predicate);
+                return null;
+            }
+        });
+    }
+
     @Override
     public Boolean modifyUserInfo(UpdateUserInfo userInfo) {
 
@@ -162,4 +203,39 @@ public class UserServiceImpl implements UserService {
         return true;
     }
 
+    @Override
+    public User addNewUser(AddNewUserInfo userInfo) {
+        emailHasRegistered(userInfo.getMobile());
+
+        User user = userInfo.fillUserInfo(new User());
+        if (StringUtils.isEmpty(user.getMobileArea())) {
+            user.setMobileArea(Const.CONTINENT);
+        }
+
+        user.setRegisterDate(new Timestamp(System.currentTimeMillis()));
+        Long uu = userDao.findMaxUU();
+        user.setUserUU(uu == null ? 10000 : (uu + 1));
+        user.setSalt(String.valueOf(user.getUserUU()));
+        user.setMobileValidCode((short) Status.AUTHENTICATED.getCode());
+        user.setEmailValidCode((short) Status.NOT_APPLYING.getCode());
+        user.setIdentityValidCode((short) Status.NOT_APPLYING.getCode());
+        user.setPassword(InfoAsyncUtils.encryptePassword(Const.ENCRY_FORMAT, user.getPassword(), user.getSalt()));
+        user.setUserRecord(new UserRecord());
+        user.setFromApp("sso");
+        user  = userDao.save(user);
+
+        List<App> appList = appDao.findAll();
+        List<String> urlsFromApps = InfoAsyncUtils.getUserBackUrlsFromApps(appList);
+
+        InfoAsyncUtils.syncUserInfo(urlsFromApps, user.toView(), "管理新增用户");
+        return user;
+    }
+
+    private void emailHasRegistered(String mobile) {
+        User user = userDao.findByMobile(mobile);
+        if (user != null) {
+            throw new ValidationFailedException("手机号已经注册");
+        }
+    }
+
 }

+ 1 - 1
sso-server/src/main/java/com/uas/sso/core/Const.java

@@ -26,7 +26,7 @@ public class Const {
     /**
      * 用户uu号正则
      */
-    public static String REGEXP_USERUU_NUMBER = "^[0-9]{10}$";
+    public static String REGEXP_USERUU_NUMBER = "^[0-9]{5, 10}$";
 
     /**
      * 中国大陆

+ 120 - 0
sso-server/src/main/java/com/uas/sso/util/InfoAsyncUtils.java

@@ -0,0 +1,120 @@
+package com.uas.sso.util;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.uas.sso.common.encrypt.MD5;
+import com.uas.sso.common.util.HttpUtil;
+import com.uas.sso.core.Const;
+import com.uas.sso.core.ICallable;
+import com.uas.sso.entity.App;
+import com.uas.sso.entity.UserView;
+import com.uas.sso.exception.AccountException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import org.apache.log4j.Logger;
+import org.springframework.util.Assert;
+
+/**
+ * Utils class is designed to sync user information with other apps
+ * and handle user information.
+ *
+ * @author huxz
+ */
+public class InfoAsyncUtils {
+
+    public static final Logger logger = Logger.getLogger(InfoAsyncUtils.class);
+
+    /**
+     * 生成加密密码
+     *
+     * @param format 密码加密格式
+     * @param password 明文密码
+     * @param salt 盐值
+     * @return 密文密码
+     */
+    public static String encryptePassword(String format, String password, String salt) {
+        // 验证加密格式
+        if (StringUtils.isEmpty(format)) {
+            return password;
+        }
+
+        // 验证密码信息,长度超过32认为是已加密过的密文
+        int minPwdLen = 4;
+        int maxPwdLen = 32;
+        if (StringUtils.isEmpty(password) || password.length() < minPwdLen
+                || password.length() >= maxPwdLen) {
+            throw new AccountException("invalid password");
+        }
+
+        // 加密格式: "$password{$salt}"
+        String cipher = format.replace(Const.ENCRY_PARAM_PASSWORD, password);
+        cipher = cipher.replace(Const.ENCRY_PARAM_SALT, salt == null ? "" : salt);
+        return MD5.toMD5(cipher);
+    }
+
+    /**
+     * 获取所有应用的有效用户信息更新接口.
+     *
+     * @param appList 应用列表
+     * @return 用户更新接口链接列表
+     */
+    public static List<String> getUserBackUrlsFromApps(List<App> appList) {
+        if (CollectionUtils.isEmpty(appList)) {
+            return Collections.emptyList();
+        }
+
+        List<String> backUserUrls = new ArrayList<>();
+        for (App app : appList) {
+            if (app != null && StringUtils.isEmpty(app.getUserControl())
+                    && !StringUtils.isEmpty(app.getBackUserUrl())) {
+                backUserUrls.add(app.getUid() + ":" + app.getBackUserUrl());
+            }
+        }
+        return backUserUrls;
+    }
+
+    /**
+     * 同步用户信息到各个应用
+     *
+     * @param backUserUrls  同步接口URL
+     * @param userView  用户信息视图
+     * @param msg   同步信息描述,用户区分同步类型
+     */
+    public static void syncUserInfo(final List<String> backUserUrls, final UserView userView,
+            final String msg) {
+        if (CollectionUtils.isEmpty(backUserUrls)) {
+            logger.warn("用户更新接口URL列表为空列表");
+            return;
+        }
+        Assert.notNull(userView, "用户信息不能为空");
+        Assert.isTrue(!org.springframework.util.StringUtils.isEmpty(msg), "同步信息描述不能为空");
+
+        ExecuteUtils.execute(new ICallable<Void, String>() {
+
+            @Override
+            public Void call(String url) {
+                String[] split = url.split(":");
+                String appId = split[0];
+                try {
+                    url = split[1];
+                    JSONObject formData = JSON.parseObject(JSON.toJSONString(userView));
+
+                    HttpUtil.ResponseWrap res = HttpUtil.doPost(url, formData, 30000);
+                    if (!res.isSuccess()) {
+                        logger.error(String.format("%s:同步用户信息失败, %s, %s, %s", msg, appId,
+                                JSON.toJSONString(userView), res.getContent()));
+                    } else {
+                        logger.info(String.format("%s:同步用户信息成功, %s, %s", msg, appId,
+                                JSON.toJSONString(userView)));
+                    }
+                } catch (Exception e) {
+                    logger.error(String.format("%s:同步用户信息失败, %s, %s, %s", msg, appId,
+                            JSON.toJSONString(userView), e.getMessage()));
+                }
+                return null;
+            }
+        }, backUserUrls);
+    }
+
+}

+ 2 - 2
sso-server/src/main/resources/dev/account.properties

@@ -4,8 +4,8 @@ sso.app=sso
 sso.secretkey=0taQcW073Z7G628g5H
 #sso.cookie.domain=ubtob.com
 sso.cookie.secure=false
-sso.login.url=http://192.168.253.118:3001/
-sso.proxy.uri=http://192.168.253.118:3001/
+sso.login.url=http://192.168.253.12:32323/
+#sso.proxy.uri=http://192.168.253.118:3001/
 
 ### crossdomain verify
 sso.authcookie.secretkey=Z318866alN6gA0piuO