From 727393c1382470ab9af362fa8edeb002e7a93d3d Mon Sep 17 00:00:00 2001
From: Junjie <540245094@qq.com>
Date: 星期二, 02 七月 2024 15:52:28 +0800
Subject: [PATCH] #

---
 zy-asrs-admin/src/views/system/operationRecord/index.vue                  |  227 ++++++++
 zy-asrs-admin/src/views/system/user/edit.vue                              |  305 ++++++++---
 zy-asrs-wms/src/main/java/userLogin.sql                                   |    9 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/CodeBuilder.java          |    6 
 zy-asrs-admin/src/views/system/role/edit.vue                              |  143 +++++
 zy-asrs-admin/src/views/system/role/index.vue                             |  269 ++++++++++
 zy-asrs-admin/src/views/system/operationRecord/edit.vue                   |  217 ++++++++
 zy-asrs-admin/src/views/system/user/index.vue                             |   67 +-
 /dev/null                                                                 |    9 
 zy-asrs-admin/src/views/system/userLogin/index.vue                        |   91 +--
 zy-asrs-admin/src/views/system/userLogin/edit.vue                         |  134 ++++-
 zy-asrs-common/src/main/java/com/zy/asrs/common/sys/entity/UserLogin.java |   25 
 zy-asrs-admin/src/locales/en_US.js                                        |   16 
 13 files changed, 1,310 insertions(+), 208 deletions(-)

diff --git a/zy-asrs-admin/src/locales/en_US.js b/zy-asrs-admin/src/locales/en_US.js
index 24b1ea4..56c5dbc 100644
--- a/zy-asrs-admin/src/locales/en_US.js
+++ b/zy-asrs-admin/src/locales/en_US.js
@@ -132,7 +132,19 @@
     '':'',
     'db.sys_host.name':'Name',
     'db.sys_host.status':'Status',
-    'db.sys_host.create_time':'createTime',
-    'db.sys_host.update_time':'updateTime',
+    'db.sys_host.create_time':'CreateTime',
+    'db.sys_host.update_time':'UpdateTime',
     'db.sys_host.memo':'Memo',
+    '':'',
+    '':'',
+    '':'',
+    '':'',
+    '':'',
+    '':'',
+    'db.sys_role.name':'Name',
+    'db.sys_role.code':'Code',
+    'db.sys_role.status':'Status',
+    'db.sys_role.create_time':'CreateTime',
+    'db.sys_role.update_time':'UpdateTime',
+    'db.sys_role.memo':'Memo',
 };
\ No newline at end of file
diff --git a/zy-asrs-admin/src/views/system/operationRecord/edit.vue b/zy-asrs-admin/src/views/system/operationRecord/edit.vue
new file mode 100644
index 0000000..19d416f
--- /dev/null
+++ b/zy-asrs-admin/src/views/system/operationRecord/edit.vue
@@ -0,0 +1,217 @@
+<script setup>
+import { ref, nextTick } from 'vue';
+import { get, post, postBlob, postForm } from '@/utils/request.js'
+import { formatMessage } from '@/utils/localeUtils.js';
+import { message } from 'ant-design-vue';
+
+const submitButton = ref(null);
+const isSave = ref(true);
+const open = ref(false);
+const initFormData = {}
+let formData = ref(initFormData);
+const treeData = ref(null);
+
+const emit = defineEmits(['tableReload'])
+
+const handleOk = (e) => {
+    nextTick(() => {
+        setTimeout(() => {
+            submitButton.value.$el.click();
+        }, 100);
+    });
+};
+
+const onFinish = values => {
+    // console.log('Success:', values);
+    open.value = false;
+    post(isSave.value ? '/api/operationRecord/save' : '/api/operationRecord/update', formData.value).then((resp) => {
+        let result = resp.data;
+        if (result.code === 200) {
+            message.success(formatMessage('page.update.success', '鏇存柊鎴愬姛'));
+        } else {
+            message.error(result.msg);
+        }
+        emit('tableReload', 'reload')
+    })
+};
+const onFinishFailed = errorInfo => {
+    console.log('Failed:', errorInfo);
+};
+
+const UserQueryList = ref(null); 
+UserQuery();
+function UserQuery() { 
+    postForm('/api/user/query', {}).then(resp => { 
+        let result = resp.data;
+        UserQueryList.value = result.data;
+    })
+}
+
+
+defineExpose({
+    open,
+    formData,
+    initFormData,
+    treeData,
+    isSave,
+})
+
+</script>
+
+<script>
+export default {
+    name: '鎿嶄綔鏃ュ織-edit'
+}
+</script>
+
+<template>
+    <div>
+        <a-modal v-model:open="open"
+            :title="isSave ? formatMessage('page.add', '娣诲姞') : formatMessage('page.edit', '缂栬緫')" @ok="handleOk"
+            style="width: 600px;">
+            <a-form :model="formData" name="formTable" :label-col="{ span: 8 }" :wrapper-col="{ span: 16 }"
+                style="display: flex;justify-content: space-between;flex-wrap: wrap;" autocomplete="off"
+                @finish="onFinish" @finishFailed="onFinishFailed">
+                    <a-form-item 
+                      label="鍚嶇О绌洪棿" 
+                      name="namespace" 
+                      style="width: 250px;" 
+                            >
+                    <a-input 
+                        v-model:value="formData.namespace" 
+                     /> 
+                        </a-form-item>
+                    <a-form-item 
+                      label="鎺ュ彛鍦板潃" 
+                      name="url" 
+                      style="width: 250px;" 
+                            >
+                    <a-input 
+                        v-model:value="formData.url" 
+                     /> 
+                        </a-form-item>
+                    <a-form-item 
+                      label="骞冲彴瀵嗛挜" 
+                      name="appkey" 
+                      style="width: 250px;" 
+                            >
+                    <a-input 
+                        v-model:value="formData.appkey" 
+                     /> 
+                        </a-form-item>
+                    <a-form-item 
+                      label="鏃堕棿鎴�" 
+                      name="timestamp" 
+                      style="width: 250px;" 
+                            >
+                    <a-input 
+                        v-model:value="formData.timestamp" 
+                     /> 
+                        </a-form-item>
+                    <a-form-item 
+                      label="瀹㈡埛绔疘P" 
+                      name="clientIp" 
+                      style="width: 250px;" 
+                            >
+                    <a-input 
+                        v-model:value="formData.clientIp" 
+                     /> 
+                        </a-form-item>
+                    <a-form-item 
+                      label="璇锋眰鍐呭" 
+                      name="request" 
+                      style="width: 250px;" 
+                            >
+                    <a-input 
+                        v-model:value="formData.request" 
+                     /> 
+                        </a-form-item>
+                    <a-form-item 
+                      label="鍝嶅簲鍐呭" 
+                      name="response" 
+                      style="width: 250px;" 
+                            >
+                    <a-input 
+                        v-model:value="formData.response" 
+                     /> 
+                        </a-form-item>
+                    <a-form-item 
+                      label="娑堣�楁椂闂�" 
+                      name="spendTime" 
+                      style="width: 250px;" 
+                            >
+                    <a-input 
+                        v-model:value="formData.spendTime" 
+                     /> 
+                        </a-form-item>
+                    <a-form-item 
+                      label="寮傚父鍐呭" 
+                      name="err" 
+                      style="width: 250px;" 
+                            >
+                    <a-input 
+                        v-model:value="formData.err" 
+                     /> 
+                        </a-form-item>
+                    <a-form-item 
+                      label="缁撴灉" 
+                      name="result" 
+                      style="width: 250px;" 
+                            >
+                    <a-select 
+                        v-model:value="formData.result" 
+                        :options="[
+                                { label: '鎴愬姛', value: 1 },
+                                { label: '澶辫触', value: 0 },
+                            ]"
+                        >
+                    </a-select>
+                        </a-form-item>
+                    <a-form-item 
+                      label="鐢ㄦ埛" 
+                      name="userId" 
+                      style="width: 250px;" 
+                            >
+                    <a-select 
+                        v-model:value="formData.userId" 
+                        placeholder="Select users" 
+                        style="width: 100%" 
+                        show-search 
+                        :options="UserQueryList" 
+                        optionFilterProp="label" 
+                        optionLabelProp="label" 
+                     > 
+                    </a-select>
+                        </a-form-item>
+                    <a-form-item 
+                      label="娣诲姞鏃堕棿" 
+                      name="createTime" 
+                      style="width: 250px;" 
+                            >
+                    <a-date-picker 
+                        v-model:value="formData.createTime" 
+                        show-time 
+                        format="YYYY-MM-DD HH:mm:ss" 
+                        value-format="YYYY-MM-DD HH:mm:ss" 
+                     /> 
+                        </a-form-item>
+                    <a-form-item 
+                      label="澶囨敞" 
+                      name="memo" 
+                      style="width: 250px;" 
+                            >
+                    <a-input 
+                        v-model:value="formData.memo" 
+                     /> 
+                        </a-form-item>
+
+                <a-form-item>
+                    <a-button type="primary" html-type="submit" ref="submitButton"
+                        style="visibility: hidden;">Submit</a-button>
+                </a-form-item>
+            </a-form>
+        </a-modal>
+    </div>
+</template>
+
+<style></style>
diff --git a/zy-asrs-admin/src/views/system/operationRecord/index.vue b/zy-asrs-admin/src/views/system/operationRecord/index.vue
new file mode 100644
index 0000000..e69d0b5
--- /dev/null
+++ b/zy-asrs-admin/src/views/system/operationRecord/index.vue
@@ -0,0 +1,227 @@
+<script setup>
+import { getCurrentInstance, ref, computed, reactive } from 'vue';
+import { useRouter } from "vue-router";
+import { get, post, postBlob } from '@/utils/request.js'
+import { message, Modal } from 'ant-design-vue';
+import { logout } from '@/config.js';
+import EditView from './edit.vue'
+import { formatMessage } from '@/utils/localeUtils.js';
+const context = getCurrentInstance()?.appContext.config.globalProperties;
+
+const router = useRouter();
+
+const TABLE_KEY = 'table-operationRecord';
+let currentPage = 1;
+let pageSize = 10;
+const searchInput = ref("")
+const editChild = ref(null)
+
+let tableData = ref([]);
+getPage();
+
+const columns = [
+        {
+            title: formatMessage('db.sys_operation_record.namespace', '鍚嶇О绌洪棿'),
+            dataIndex: 'namespace',
+            width: 140,
+        },
+        {
+            title: formatMessage('db.sys_operation_record.url', '鎺ュ彛鍦板潃'),
+            dataIndex: 'url',
+            width: 140,
+        },
+        {
+            title: formatMessage('db.sys_operation_record.appkey', '骞冲彴瀵嗛挜'),
+            dataIndex: 'appkey',
+            width: 140,
+        },
+        {
+            title: formatMessage('db.sys_operation_record.timestamp', '鏃堕棿鎴�'),
+            dataIndex: 'timestamp',
+            width: 140,
+        },
+        {
+            title: formatMessage('db.sys_operation_record.client_ip', '瀹㈡埛绔疘P'),
+            dataIndex: 'clientIp',
+            width: 140,
+        },
+        {
+            title: formatMessage('db.sys_operation_record.request', '璇锋眰鍐呭'),
+            dataIndex: 'request',
+            width: 140,
+            ellipsis: true,
+        },
+        {
+            title: formatMessage('db.sys_operation_record.response', '鍝嶅簲鍐呭'),
+            dataIndex: 'response',
+            width: 140,
+            ellipsis: true,
+        },
+        {
+            title: formatMessage('db.sys_operation_record.spend_time', '娑堣�楁椂闂�'),
+            dataIndex: 'spendTime',
+            width: 140,
+        },
+        {
+            title: formatMessage('db.sys_operation_record.err', '寮傚父鍐呭'),
+            dataIndex: 'err',
+            width: 140,
+        },
+        {
+            title: formatMessage('db.sys_operation_record.result', '缁撴灉'),
+            dataIndex: 'result$',
+            width: 140,
+        },
+        {
+            title: formatMessage('db.sys_operation_record.user_id', '鐢ㄦ埛'),
+            dataIndex: 'userId$',
+            width: 140,
+        },
+        {
+            title: formatMessage('db.sys_operation_record.create_time', '娣诲姞鏃堕棿'),
+            dataIndex: 'createTime$',
+            width: 140,
+        },
+        {
+            title: formatMessage('db.sys_operation_record.memo', '澶囨敞'),
+            dataIndex: 'memo',
+            width: 140,
+        },
+
+  {
+    title: formatMessage('common.operation', '鎿嶄綔'),
+    name: 'oper',
+    dataIndex: 'oper',
+    key: 'oper',
+    width: 140,
+  },
+];
+
+const state = reactive({
+  selectedRowKeys: [],
+  loading: false,
+});
+const hasSelected = computed(() => state.selectedRowKeys.length > 0);
+const start = () => {
+  state.loading = true;
+  // ajax request after empty completing
+  setTimeout(() => {
+    state.loading = false;
+    state.selectedRowKeys = [];
+  }, 1000);
+};
+const onSelectChange = selectedRowKeys => {
+  // console.log('selectedRowKeys changed: ', selectedRowKeys);
+  state.selectedRowKeys = selectedRowKeys;
+};
+
+function getPage() {
+  post('/api/operationRecord/page', {
+    current: currentPage,
+    pageSize: pageSize,
+    condition: searchInput.value
+  }).then((resp) => {
+    let result = resp.data;
+    if (result.code == 200) {
+      let data = result.data;
+      tableData.value = data;
+    } else if (result.code === 401) {
+      message.error(result.msg);
+      logout()
+    } else {
+      message.error(result.msg);
+    }
+  })
+}
+
+const handleEdit = (item) => {
+  editChild.value.open = true;
+  editChild.value.formData = item == null ? editChild.value.initFormData : JSON.parse(JSON.stringify(item));
+  editChild.value.isSave = item == null;
+}
+
+const handleDel = (rows) => {
+  Modal.confirm({
+    title: formatMessage('page.delete', '鍒犻櫎'),
+    content: formatMessage('page.delete.confirm', '纭畾鍒犻櫎璇ラ」鍚楋紵'),
+    maskClosable: true,
+    onOk: async () => {
+      const hide = message.loading(formatMessage('common.loading', '璇锋眰涓�'));
+      try {
+        post('/api/operationRecord/remove/' + rows.map((row) => row.id).join(','), {}).then(resp => {
+          let result = resp.data;
+          if (result.code === 200) {
+            message.success(result.msg);
+          } else {
+            message.error(result.msg);
+          }
+          getPage()
+          hide()
+        })
+      } catch (error) {
+        message.error(formatMessage('common.fail', '璇锋眰澶辫触'));
+      }
+    },
+  });
+}
+
+const handleExport = async (intl) => {
+  postBlob('/api/operationRecord/export', {}).then(result => {
+    const blob = new Blob([result.data], { type: 'application/vnd.ms-excel' });
+    window.location.href = window.URL.createObjectURL(blob);
+    return true;
+  })
+};
+
+const onSearch = () => {
+  // console.log('search');
+  getPage()
+}
+
+const onPageChange = (page, size) => {
+  currentPage = page;
+  pageSize = size;
+  getPage();
+}
+
+function handleTableReload(value) {
+  getPage()
+}
+
+</script>
+
+<script>
+export default {
+  name: '鎿嶄綔鏃ュ織'
+}
+</script>
+
+<template>
+  <div>
+    <EditView ref="editChild" @tableReload="handleTableReload" />
+    <div class="table-header">
+      <a-input-search v-model:value="searchInput" :placeholder="formatMessage('page.input', '璇疯緭鍏�')"
+        style="width: 200px;" @search="onSearch" />
+      <div class="table-header-right">
+        <a-button @click="handleEdit(null)" type="primary">{{ formatMessage('page.add', '娣诲姞') }}</a-button>
+        <a-button @click="handleExport">{{ formatMessage('page.export', '瀵煎嚭') }}</a-button>
+      </div>
+    </div>
+    <a-table :row-selection="{ selectedRowKeys: state.selectedRowKeys, onChange: onSelectChange }"
+      :data-source="tableData.records" :defaultExpandAllRows="false" :key="TABLE_KEY" rowKey="id"
+      :pagination="{ total: tableData.total, onChange: onPageChange }"
+      :scroll="{ y: 768, scrollToFirstRowOnChange: true }" :columns="columns">
+      <template #bodyCell="{ column, text, record }">
+        <template v-if="column.dataIndex === 'oper'">
+          <div style="display: flex;justify-content: space-evenly;">
+            <a-button type="link" primary @click="handleEdit(record)">{{ formatMessage('page.edit', '缂栬緫') }}</a-button>
+            <a-button type="link" danger @click="handleDel([record])">{{ formatMessage('page.delete', '鍒犻櫎')
+              }}</a-button>
+          </div>
+        </template>
+      </template>
+    </a-table>
+  </div>
+</template>
+
+<style></style>
diff --git a/zy-asrs-admin/src/views/system/role/edit.vue b/zy-asrs-admin/src/views/system/role/edit.vue
new file mode 100644
index 0000000..c5fbe42
--- /dev/null
+++ b/zy-asrs-admin/src/views/system/role/edit.vue
@@ -0,0 +1,143 @@
+<script setup>
+import { ref, nextTick } from 'vue';
+import { get, post, postBlob, postForm } from '@/utils/request.js'
+import { formatMessage } from '@/utils/localeUtils.js';
+import { message } from 'ant-design-vue';
+
+const submitButton = ref(null);
+const isSave = ref(true);
+const open = ref(false);
+const initFormData = {}
+let formData = ref(initFormData);
+const treeData = ref(null);
+
+const emit = defineEmits(['tableReload'])
+
+const handleOk = (e) => {
+    nextTick(() => {
+        setTimeout(() => {
+            submitButton.value.$el.click();
+        }, 100);
+    });
+};
+
+const onFinish = values => {
+    // console.log('Success:', values);
+    open.value = false;
+    post(isSave.value ? '/api/role/save' : '/api/role/update', formData.value).then((resp) => {
+        let result = resp.data;
+        if (result.code === 200) {
+            message.success(formatMessage('page.update.success', '鏇存柊鎴愬姛'));
+        } else {
+            message.error(result.msg);
+        }
+        emit('tableReload', 'reload')
+    })
+};
+const onFinishFailed = errorInfo => {
+    console.log('Failed:', errorInfo);
+};
+
+
+
+defineExpose({
+    open,
+    formData,
+    initFormData,
+    treeData,
+    isSave,
+})
+
+</script>
+
+<script>
+export default {
+    name: '瑙掕壊绠$悊-edit'
+}
+</script>
+
+<template>
+    <div>
+        <a-modal v-model:open="open"
+            :title="isSave ? formatMessage('page.add', '娣诲姞') : formatMessage('page.edit', '缂栬緫')" @ok="handleOk"
+            style="width: 600px;">
+            <a-form :model="formData" name="formTable" :label-col="{ span: 8 }" :wrapper-col="{ span: 16 }"
+                style="display: flex;justify-content: space-between;flex-wrap: wrap;" autocomplete="off"
+                @finish="onFinish" @finishFailed="onFinishFailed">
+                    <a-form-item 
+                      label="鍚嶇О" 
+                      name="name" 
+                      style="width: 250px;" 
+                            :rules="[{ required: true }]"
+                            >
+                    <a-input 
+                        v-model:value="formData.name" 
+                     /> 
+                        </a-form-item>
+                    <a-form-item 
+                      label="鏍囪瘑" 
+                      name="code" 
+                      style="width: 250px;" 
+                            >
+                    <a-input 
+                        v-model:value="formData.code" 
+                     /> 
+                        </a-form-item>
+                    <a-form-item 
+                      label="鐘舵��" 
+                      name="status" 
+                      style="width: 250px;" 
+                            >
+                    <a-select 
+                        v-model:value="formData.status" 
+                        :options="[
+                                { label: '姝e父', value: 1 },
+                                { label: '绂佺敤', value: 0 },
+                            ]"
+                        >
+                    </a-select>
+                        </a-form-item>
+                    <a-form-item 
+                      label="娣诲姞鏃堕棿" 
+                      name="createTime" 
+                      style="width: 250px;" 
+                            >
+                    <a-date-picker 
+                        v-model:value="formData.createTime" 
+                        show-time 
+                        format="YYYY-MM-DD HH:mm:ss" 
+                        value-format="YYYY-MM-DD HH:mm:ss" 
+                     /> 
+                        </a-form-item>
+                    <a-form-item 
+                      label="淇敼鏃堕棿" 
+                      name="updateTime" 
+                      style="width: 250px;" 
+                            >
+                    <a-date-picker 
+                        v-model:value="formData.updateTime" 
+                        show-time 
+                        format="YYYY-MM-DD HH:mm:ss" 
+                        value-format="YYYY-MM-DD HH:mm:ss" 
+                     /> 
+                        </a-form-item>
+                    <a-form-item 
+                      label="澶囨敞" 
+                      name="memo" 
+                      style="width: 250px;" 
+                            >
+                    <a-input 
+                        v-model:value="formData.memo" 
+                     /> 
+                        </a-form-item>
+
+                <a-form-item>
+                    <a-button type="primary" html-type="submit" ref="submitButton"
+                        style="visibility: hidden;">Submit</a-button>
+                </a-form-item>
+            </a-form>
+        </a-modal>
+    </div>
+</template>
+
+<style></style>
diff --git a/zy-asrs-admin/src/views/system/role/index.vue b/zy-asrs-admin/src/views/system/role/index.vue
new file mode 100644
index 0000000..d567f88
--- /dev/null
+++ b/zy-asrs-admin/src/views/system/role/index.vue
@@ -0,0 +1,269 @@
+<script setup>
+import { getCurrentInstance, ref, computed, reactive } from 'vue';
+import { useRouter } from "vue-router";
+import { get, post, postBlob } from '@/utils/request.js'
+import { message, Modal } from 'ant-design-vue';
+import { globalState, logout } from '@/config.js';
+import EditView from './edit.vue'
+import { formatMessage } from '@/utils/localeUtils.js';
+const context = getCurrentInstance()?.appContext.config.globalProperties;
+
+const router = useRouter();
+
+const TABLE_KEY = 'table-role';
+let currentPage = 1;
+let pageSize = 10;
+const searchInput = ref("")
+const editChild = ref(null)
+const openDrawer = ref(false);
+const currentDrawerData = ref(null);
+
+let treeData = ref([]);
+let checkedKeys = ref([]);
+let halfCheckedKeys = ref([]);
+let expandedKeys = ref([]);
+let selectedKeys = ref([]);
+
+let tableData = ref([]);
+getPage();
+
+const columns = [
+  {
+    title: formatMessage('db.sys_role.name', '鍚嶇О'),
+    dataIndex: 'name',
+    width: 140,
+  },
+  {
+    title: formatMessage('db.sys_role.code', '鏍囪瘑'),
+    dataIndex: 'code',
+    width: 140,
+  },
+  {
+    title: formatMessage('db.sys_role.status', '鐘舵��'),
+    dataIndex: 'status$',
+    width: 140,
+  },
+  {
+    title: formatMessage('db.sys_role.create_time', '娣诲姞鏃堕棿'),
+    dataIndex: 'createTime$',
+    width: 140,
+  },
+  {
+    title: formatMessage('db.sys_role.update_time', '淇敼鏃堕棿'),
+    dataIndex: 'updateTime$',
+    width: 140,
+  },
+  {
+    title: formatMessage('db.sys_role.memo', '澶囨敞'),
+    dataIndex: 'memo',
+    width: 140,
+  },
+
+  {
+    title: formatMessage('common.operation', '鎿嶄綔'),
+    name: 'oper',
+    dataIndex: 'oper',
+    key: 'oper',
+    width: 140,
+  },
+];
+
+const state = reactive({
+  selectedRowKeys: [],
+  loading: false,
+});
+const hasSelected = computed(() => state.selectedRowKeys.length > 0);
+const start = () => {
+  state.loading = true;
+  // ajax request after empty completing
+  setTimeout(() => {
+    state.loading = false;
+    state.selectedRowKeys = [];
+  }, 1000);
+};
+const onSelectChange = selectedRowKeys => {
+  // console.log('selectedRowKeys changed: ', selectedRowKeys);
+  state.selectedRowKeys = selectedRowKeys;
+};
+
+function getPage() {
+  post('/api/role/page', {
+    current: currentPage,
+    pageSize: pageSize,
+    condition: searchInput.value
+  }).then((resp) => {
+    let result = resp.data;
+    if (result.code == 200) {
+      let data = result.data;
+      tableData.value = data;
+    } else if (result.code === 401) {
+      message.error(result.msg);
+      logout()
+    } else {
+      message.error(result.msg);
+    }
+  })
+}
+
+const handleEdit = (item) => {
+  editChild.value.open = true;
+  editChild.value.formData = item == null ? editChild.value.initFormData : JSON.parse(JSON.stringify(item));
+  editChild.value.isSave = item == null;
+}
+
+const handleAssign = (item) => {
+  openDrawer.value = true;
+  currentDrawerData.value = item;
+  loadMenuTree(item)
+}
+
+const handleDel = (rows) => {
+  Modal.confirm({
+    title: formatMessage('page.delete', '鍒犻櫎'),
+    content: formatMessage('page.delete.confirm', '纭畾鍒犻櫎璇ラ」鍚楋紵'),
+    maskClosable: true,
+    onOk: async () => {
+      const hide = message.loading(formatMessage('common.loading', '璇锋眰涓�'));
+      try {
+        post('/api/role/remove/' + rows.map((row) => row.id).join(','), {}).then(resp => {
+          let result = resp.data;
+          if (result.code === 200) {
+            message.success(result.msg);
+          } else {
+            message.error(result.msg);
+          }
+          getPage()
+          hide()
+        })
+      } catch (error) {
+        message.error(formatMessage('common.fail', '璇锋眰澶辫触'));
+      }
+    },
+  });
+}
+
+const handleExport = async (intl) => {
+  postBlob('/api/role/export', {}).then(result => {
+    const blob = new Blob([result.data], { type: 'application/vnd.ms-excel' });
+    window.location.href = window.URL.createObjectURL(blob);
+    return true;
+  })
+};
+
+const onSearch = () => {
+  // console.log('search');
+  getPage()
+}
+
+const onPageChange = (page, size) => {
+  currentPage = page;
+  pageSize = size;
+  getPage();
+}
+
+function handleTableReload(value) {
+  getPage()
+}
+
+const onCloseDrawer = () => {
+  openDrawer.value = false;
+};
+
+const onSubmitDrawer = () => {
+  const hide = message.loading(formatMessage('common.loading', '璇锋眰涓�'));
+  try {
+    post('/api/role/scope/update', {
+      id: currentDrawerData.value.id,
+      menuIds: {
+        checked: checkedKeys.value,
+        halfChecked: halfCheckedKeys.value
+      }
+    }).then(resp => {
+      let result = resp.data;
+      if (result.code === 200) {
+        message.success(result.msg);
+      } else {
+        message.error(result.msg);
+      }
+      hide()
+    })
+  } catch (error) {
+    message.error(formatMessage('common.fail', '璇锋眰澶辫触'));
+  }
+
+}
+
+const loadMenuTree = (param) => {
+  post('/api/menu/tree', {}).then(resp => {
+    let result = resp.data;
+    let data = result.data;
+    treeData.value = data;
+  })
+
+  get('/api/role/scope/list', {
+    roleId: param.id
+  }).then(resp => {
+    let result = resp.data;
+    let data = result.data;
+    checkedKeys.value = data
+  })
+}
+
+const handleTreeChecked = (keys, e) => {
+  halfCheckedKeys.value = e.halfCheckedKeys;
+}
+
+</script>
+
+<script>
+export default {
+  name: '瑙掕壊绠$悊'
+}
+</script>
+
+<template>
+  <div>
+    <EditView ref="editChild" @tableReload="handleTableReload" />
+    <div class="table-header">
+      <a-input-search v-model:value="searchInput" :placeholder="formatMessage('page.input', '璇疯緭鍏�')"
+        style="width: 200px;" @search="onSearch" />
+      <div class="table-header-right">
+        <a-button @click="handleEdit(null)" type="primary">{{ formatMessage('page.add', '娣诲姞') }}</a-button>
+        <a-button @click="handleExport">{{ formatMessage('page.export', '瀵煎嚭') }}</a-button>
+      </div>
+    </div>
+    <a-table :row-selection="{ selectedRowKeys: state.selectedRowKeys, onChange: onSelectChange }"
+      :data-source="tableData.records" :defaultExpandAllRows="false" :key="TABLE_KEY" rowKey="id"
+      :pagination="{ total: tableData.total, onChange: onPageChange }"
+      :scroll="{ y: 768, scrollToFirstRowOnChange: true }" :columns="columns">
+      <template #bodyCell="{ column, text, record }">
+        <template v-if="column.dataIndex === 'oper'">
+          <div style="display: flex;justify-content: space-evenly;">
+            <a-button type="link" primary @click="handleEdit(record)">{{ formatMessage('page.edit', '缂栬緫') }}</a-button>
+            <a-button type="link" primary @click="handleAssign(record)">{{ formatMessage('page.assign.permission',
+              '鍒嗛厤鏉冮檺') }}</a-button>
+            <a-button type="link" danger @click="handleDel([record])">{{ formatMessage('page.delete', '鍒犻櫎')
+              }}</a-button>
+          </div>
+        </template>
+      </template>
+    </a-table>
+
+    <a-drawer :width="500" :title="formatMessage('page.assign.role', '鍒嗛厤鏉冮檺') + ' - ' + currentDrawerData?.name"
+      placement="right" :open="openDrawer" @close="onCloseDrawer">
+      <template #extra>
+        <a-button style="margin-right: 8px" @click="onCloseDrawer">{{ formatMessage('common.cancel', '鍙栨秷') }}</a-button>
+        <a-button type="primary" @click="onSubmitDrawer">{{ formatMessage('common.submit', '鎻愪氦') }}</a-button>
+      </template>
+      <a-tree v-model:expandedKeys="expandedKeys" v-model:selectedKeys="selectedKeys" v-model:checkedKeys="checkedKeys"
+        checkable :tree-data="treeData" :field-names="{ children: 'children', title: 'name', key: 'id' }"
+        @check="handleTreeChecked">
+        <template #title="{ name, key }">
+          <span>{{ name }}</span>
+        </template>
+      </a-tree>
+    </a-drawer>
+  </div>
+</template>
+
+<style></style>
diff --git a/zy-asrs-admin/src/views/system/user/edit.vue b/zy-asrs-admin/src/views/system/user/edit.vue
index 516ef43..57f2e8c 100644
--- a/zy-asrs-admin/src/views/system/user/edit.vue
+++ b/zy-asrs-admin/src/views/system/user/edit.vue
@@ -38,18 +38,18 @@
     console.log('Failed:', errorInfo);
 };
 
-const DeptQueryList = ref(null);
+const DeptQueryList = ref(null); 
 DeptQuery();
-function DeptQuery() {
-    postForm('/api/dept/query', {}).then(resp => {
+function DeptQuery() { 
+    postForm('/api/dept/query', {}).then(resp => { 
         let result = resp.data;
         DeptQueryList.value = result.data;
     })
 }
-const UserQueryList = ref(null);
+const UserQueryList = ref(null); 
 UserQuery();
-function UserQuery() {
-    postForm('/api/user/query', {}).then(resp => {
+function UserQuery() { 
+    postForm('/api/user/query', {}).then(resp => { 
         let result = resp.data;
         UserQueryList.value = result.data;
     })
@@ -80,87 +80,230 @@
             <a-form :model="formData" name="formTable" :label-col="{ span: 8 }" :wrapper-col="{ span: 16 }"
                 style="display: flex;justify-content: space-between;flex-wrap: wrap;" autocomplete="off"
                 @finish="onFinish" @finishFailed="onFinishFailed">
-                <a-form-item label="璐﹀彿" name="username" style="width: 250px;" :rules="[{ required: true }]">
-                    <a-input v-model:value="formData.username" />
-                </a-form-item>
-                <a-form-item label="瀵嗙爜" name="password" style="width: 250px;">
-                    <a-input v-model:value="formData.password" />
-                </a-form-item>
-                <a-form-item label="鏄电О" name="nickname" style="width: 250px;">
-                    <a-input v-model:value="formData.nickname" />
-                </a-form-item>
-                <a-form-item label="澶村儚" name="avatar" style="width: 250px;">
-                    <a-input v-model:value="formData.avatar" />
-                </a-form-item>
-                <a-form-item label="宸ュ彿" name="code" style="width: 250px;">
-                    <a-input v-model:value="formData.code" />
-                </a-form-item>
-                <a-form-item label="鎬у埆" name="sex" style="width: 250px;">
-                    <a-select v-model:value="formData.sex" :options="[
-                        { label: '鏈煡', value: 0 },
-                        { label: '鐢�', value: 1 },
-                        { label: '濂�', value: 2 },
-                    ]">
+                    <a-form-item 
+                      label="璐﹀彿" 
+                      name="username" 
+                      style="width: 250px;" 
+                            :rules="[{ required: true }]"
+                            >
+                    <a-input 
+                        v-model:value="formData.username" 
+                     /> 
+                        </a-form-item>
+                    <a-form-item 
+                      label="瀵嗙爜" 
+                      name="password" 
+                      style="width: 250px;" 
+                            >
+                    <a-input 
+                        v-model:value="formData.password" 
+                     /> 
+                        </a-form-item>
+                    <a-form-item 
+                      label="鏄电О" 
+                      name="nickname" 
+                      style="width: 250px;" 
+                            >
+                    <a-input 
+                        v-model:value="formData.nickname" 
+                     /> 
+                        </a-form-item>
+                    <a-form-item 
+                      label="澶村儚" 
+                      name="avatar" 
+                      style="width: 250px;" 
+                            >
+                    <a-input 
+                        v-model:value="formData.avatar" 
+                     /> 
+                        </a-form-item>
+                    <a-form-item 
+                      label="宸ュ彿" 
+                      name="code" 
+                      style="width: 250px;" 
+                            >
+                    <a-input 
+                        v-model:value="formData.code" 
+                     /> 
+                        </a-form-item>
+                    <a-form-item 
+                      label="鎬у埆" 
+                      name="sex" 
+                      style="width: 250px;" 
+                            >
+                    <a-select 
+                        v-model:value="formData.sex" 
+                        :options="[
+                                { label: '鏈煡', value: 0 },
+                                { label: '鐢�', value: 1 },
+                                { label: '濂�', value: 2 },
+                            ]"
+                        >
                     </a-select>
-                </a-form-item>
-                <a-form-item label="鎵嬫満鍙�" name="phone" style="width: 250px;">
-                    <a-input v-model:value="formData.phone" />
-                </a-form-item>
-                <a-form-item label="閭" name="email" style="width: 250px;">
-                    <a-input v-model:value="formData.email" />
-                </a-form-item>
-                <a-form-item label="閭楠岃瘉" name="emailVerified" style="width: 250px;">
-                    <a-select v-model:value="formData.emailVerified" :options="[
-                        { label: '鍚�', value: 0 },
-                        { label: '鏄�', value: 1 },
-                    ]">
+                        </a-form-item>
+                    <a-form-item 
+                      label="鎵嬫満鍙�" 
+                      name="phone" 
+                      style="width: 250px;" 
+                            >
+                    <a-input 
+                        v-model:value="formData.phone" 
+                     /> 
+                        </a-form-item>
+                    <a-form-item 
+                      label="閭" 
+                      name="email" 
+                      style="width: 250px;" 
+                            >
+                    <a-input 
+                        v-model:value="formData.email" 
+                     /> 
+                        </a-form-item>
+                    <a-form-item 
+                      label="閭楠岃瘉" 
+                      name="emailVerified" 
+                      style="width: 250px;" 
+                            >
+                    <a-select 
+                        v-model:value="formData.emailVerified" 
+                        :options="[
+                                { label: '鍚�', value: 0 },
+                                { label: '鏄�', value: 1 },
+                            ]"
+                        >
                     </a-select>
-                </a-form-item>
-                <a-form-item label="鎵�灞為儴闂�" name="deptId" style="width: 250px;">
-                    <a-select v-model:value="formData.deptId" placeholder="Select users" style="width: 100%" show-search
-                        :options="DeptQueryList" optionFilterProp="label" optionLabelProp="label">
+                        </a-form-item>
+                    <a-form-item 
+                      label="鎵�灞為儴闂�" 
+                      name="deptId" 
+                      style="width: 250px;" 
+                            >
+                    <a-select 
+                        v-model:value="formData.deptId" 
+                        placeholder="Select users" 
+                        style="width: 100%" 
+                        show-search 
+                        :options="DeptQueryList" 
+                        optionFilterProp="label" 
+                        optionLabelProp="label" 
+                     > 
                     </a-select>
-                </a-form-item>
-                <a-form-item label="鐪熷疄濮撳悕" name="realName" style="width: 250px;">
-                    <a-input v-model:value="formData.realName" />
-                </a-form-item>
-                <a-form-item label="韬唤璇佸彿" name="idCard" style="width: 250px;">
-                    <a-input v-model:value="formData.idCard" />
-                </a-form-item>
-                <a-form-item label="鍑虹敓鏃ユ湡" name="birthday" style="width: 250px;">
-                    <a-input v-model:value="formData.birthday" />
-                </a-form-item>
-                <a-form-item label="涓汉绠�浠�" name="introduction" style="width: 250px;">
-                    <a-input v-model:value="formData.introduction" />
-                </a-form-item>
-                <a-form-item label="鐘舵��" name="status" style="width: 250px;">
-                    <a-select v-model:value="formData.status" :options="[
-                        { label: '姝e父', value: 1 },
-                        { label: '绂佺敤', value: 0 },
-                    ]">
+                        </a-form-item>
+                    <a-form-item 
+                      label="鐪熷疄濮撳悕" 
+                      name="realName" 
+                      style="width: 250px;" 
+                            >
+                    <a-input 
+                        v-model:value="formData.realName" 
+                     /> 
+                        </a-form-item>
+                    <a-form-item 
+                      label="韬唤璇佸彿" 
+                      name="idCard" 
+                      style="width: 250px;" 
+                            >
+                    <a-input 
+                        v-model:value="formData.idCard" 
+                     /> 
+                        </a-form-item>
+                    <a-form-item 
+                      label="鍑虹敓鏃ユ湡" 
+                      name="birthday" 
+                      style="width: 250px;" 
+                            >
+                    <a-input 
+                        v-model:value="formData.birthday" 
+                     /> 
+                        </a-form-item>
+                    <a-form-item 
+                      label="涓汉绠�浠�" 
+                      name="introduction" 
+                      style="width: 250px;" 
+                            >
+                    <a-input 
+                        v-model:value="formData.introduction" 
+                     /> 
+                        </a-form-item>
+                    <a-form-item 
+                      label="鐘舵��" 
+                      name="status" 
+                      style="width: 250px;" 
+                            >
+                    <a-select 
+                        v-model:value="formData.status" 
+                        :options="[
+                                { label: '姝e父', value: 1 },
+                                { label: '绂佺敤', value: 0 },
+                            ]"
+                        >
                     </a-select>
-                </a-form-item>
-                <a-form-item label="娣诲姞鏃堕棿" name="createTime" style="width: 250px;">
-                    <a-date-picker v-model:value="formData.createTime" show-time format="YYYY-MM-DD HH:mm:ss"
-                        value-format="YYYY-MM-DD HH:mm:ss" />
-                </a-form-item>
-                <a-form-item label="娣诲姞浜哄憳" name="createBy" style="width: 250px;">
-                    <a-select v-model:value="formData.createBy" placeholder="Select users" style="width: 100%"
-                        show-search :options="UserQueryList" optionFilterProp="label" optionLabelProp="label">
+                        </a-form-item>
+                    <a-form-item 
+                      label="娣诲姞鏃堕棿" 
+                      name="createTime" 
+                      style="width: 250px;" 
+                            >
+                    <a-date-picker 
+                        v-model:value="formData.createTime" 
+                        show-time 
+                        format="YYYY-MM-DD HH:mm:ss" 
+                        value-format="YYYY-MM-DD HH:mm:ss" 
+                     /> 
+                        </a-form-item>
+                    <a-form-item 
+                      label="娣诲姞浜哄憳" 
+                      name="createBy" 
+                      style="width: 250px;" 
+                            >
+                    <a-select 
+                        v-model:value="formData.createBy" 
+                        placeholder="Select users" 
+                        style="width: 100%" 
+                        show-search 
+                        :options="UserQueryList" 
+                        optionFilterProp="label" 
+                        optionLabelProp="label" 
+                     > 
                     </a-select>
-                </a-form-item>
-                <a-form-item label="淇敼鏃堕棿" name="updateTime" style="width: 250px;">
-                    <a-date-picker v-model:value="formData.updateTime" show-time format="YYYY-MM-DD HH:mm:ss"
-                        value-format="YYYY-MM-DD HH:mm:ss" />
-                </a-form-item>
-                <a-form-item label="淇敼浜哄憳" name="updateBy" style="width: 250px;">
-                    <a-select v-model:value="formData.updateBy" placeholder="Select users" style="width: 100%"
-                        show-search :options="UserQueryList" optionFilterProp="label" optionLabelProp="label">
+                        </a-form-item>
+                    <a-form-item 
+                      label="淇敼鏃堕棿" 
+                      name="updateTime" 
+                      style="width: 250px;" 
+                            >
+                    <a-date-picker 
+                        v-model:value="formData.updateTime" 
+                        show-time 
+                        format="YYYY-MM-DD HH:mm:ss" 
+                        value-format="YYYY-MM-DD HH:mm:ss" 
+                     /> 
+                        </a-form-item>
+                    <a-form-item 
+                      label="淇敼浜哄憳" 
+                      name="updateBy" 
+                      style="width: 250px;" 
+                            >
+                    <a-select 
+                        v-model:value="formData.updateBy" 
+                        placeholder="Select users" 
+                        style="width: 100%" 
+                        show-search 
+                        :options="UserQueryList" 
+                        optionFilterProp="label" 
+                        optionLabelProp="label" 
+                     > 
                     </a-select>
-                </a-form-item>
-                <a-form-item label="澶囨敞" name="memo" style="width: 250px;">
-                    <a-input v-model:value="formData.memo" />
-                </a-form-item>
+                        </a-form-item>
+                    <a-form-item 
+                      label="澶囨敞" 
+                      name="memo" 
+                      style="width: 250px;" 
+                            >
+                    <a-input 
+                        v-model:value="formData.memo" 
+                     /> 
+                        </a-form-item>
 
                 <a-form-item>
                     <a-button type="primary" html-type="submit" ref="submitButton"
diff --git a/zy-asrs-admin/src/views/system/user/index.vue b/zy-asrs-admin/src/views/system/user/index.vue
index 37c97b1..d87f625 100644
--- a/zy-asrs-admin/src/views/system/user/index.vue
+++ b/zy-asrs-admin/src/views/system/user/index.vue
@@ -21,111 +21,112 @@
 
 const columns = [
         {
-            title: '璐﹀彿',
+            title: formatMessage('db.sys_user.username', '璐﹀彿'),
             dataIndex: 'username',
             width: 140,
         },
         {
-            title: '瀵嗙爜',
+            title: formatMessage('db.sys_user.password', '瀵嗙爜'),
             dataIndex: 'password',
             width: 140,
         },
         {
-            title: '鏄电О',
+            title: formatMessage('db.sys_user.nickname', '鏄电О'),
             dataIndex: 'nickname',
             width: 140,
         },
         {
-            title: '澶村儚',
+            title: formatMessage('db.sys_user.avatar', '澶村儚'),
             dataIndex: 'avatar',
             width: 140,
         },
         {
-            title: '宸ュ彿',
+            title: formatMessage('db.sys_user.code', '宸ュ彿'),
             dataIndex: 'code',
             width: 140,
         },
         {
-            title: '鎬у埆',
+            title: formatMessage('db.sys_user.sex', '鎬у埆'),
             dataIndex: 'sex$',
             width: 140,
         },
         {
-            title: '鎵嬫満鍙�',
+            title: formatMessage('db.sys_user.phone', '鎵嬫満鍙�'),
             dataIndex: 'phone',
             width: 140,
         },
         {
-            title: '閭',
+            title: formatMessage('db.sys_user.email', '閭'),
             dataIndex: 'email',
             width: 140,
         },
         {
-            title: '閭楠岃瘉',
+            title: formatMessage('db.sys_user.email_verified', '閭楠岃瘉'),
             dataIndex: 'emailVerified$',
             width: 140,
         },
         {
-            title: '鎵�灞為儴闂�',
+            title: formatMessage('db.sys_user.dept_id', '鎵�灞為儴闂�'),
             dataIndex: 'deptId$',
             width: 140,
         },
         {
-            title: '鐪熷疄濮撳悕',
+            title: formatMessage('db.sys_user.real_name', '鐪熷疄濮撳悕'),
             dataIndex: 'realName',
             width: 140,
         },
         {
-            title: '韬唤璇佸彿',
+            title: formatMessage('db.sys_user.id_card', '韬唤璇佸彿'),
             dataIndex: 'idCard',
             width: 140,
         },
         {
-            title: '鍑虹敓鏃ユ湡',
+            title: formatMessage('db.sys_user.birthday', '鍑虹敓鏃ユ湡'),
             dataIndex: 'birthday',
             width: 140,
         },
         {
-            title: '涓汉绠�浠�',
+            title: formatMessage('db.sys_user.introduction', '涓汉绠�浠�'),
             dataIndex: 'introduction',
             width: 140,
         },
         {
-            title: '鐘舵��',
+            title: formatMessage('db.sys_user.status', '鐘舵��'),
             dataIndex: 'status$',
             width: 140,
         },
         {
-            title: '娣诲姞鏃堕棿',
+            title: formatMessage('db.sys_user.create_time', '娣诲姞鏃堕棿'),
             dataIndex: 'createTime$',
             width: 140,
         },
         {
-            title: '娣诲姞浜哄憳',
+            title: formatMessage('db.sys_user.create_by', '娣诲姞浜哄憳'),
             dataIndex: 'createBy$',
             width: 140,
         },
         {
-            title: '淇敼鏃堕棿',
+            title: formatMessage('db.sys_user.update_time', '淇敼鏃堕棿'),
             dataIndex: 'updateTime$',
             width: 140,
         },
         {
-            title: '淇敼浜哄憳',
+            title: formatMessage('db.sys_user.update_by', '淇敼浜哄憳'),
             dataIndex: 'updateBy$',
             width: 140,
         },
         {
-            title: '澶囨敞',
+            title: formatMessage('db.sys_user.memo', '澶囨敞'),
             dataIndex: 'memo',
             width: 140,
         },
 
   {
-    title: '鎿嶄綔',
+    title: formatMessage('common.operation', '鎿嶄綔'),
     name: 'oper',
     dataIndex: 'oper',
     key: 'oper',
+    width: 140,
   },
 ];
 
@@ -178,15 +179,21 @@
     content: formatMessage('page.delete.confirm', '纭畾鍒犻櫎璇ラ」鍚楋紵'),
     maskClosable: true,
     onOk: async () => {
-      post('/api/user/remove/' + rows.map((row) => row.id).join(','), {}).then(resp => {
-        let result = resp.data;
-        if (result.code === 200) {
-          message.success(result.msg);
-        } else {
-          message.error(result.msg);
-        }
-        getPage()
-      })
+      const hide = message.loading(formatMessage('common.loading', '璇锋眰涓�'));
+      try {
+        post('/api/user/remove/' + rows.map((row) => row.id).join(','), {}).then(resp => {
+          let result = resp.data;
+          if (result.code === 200) {
+            message.success(result.msg);
+          } else {
+            message.error(result.msg);
+          }
+          getPage()
+          hide()
+        })
+      } catch (error) {
+        message.error(formatMessage('common.fail', '璇锋眰澶辫触'));
+      }
     },
   });
 }
diff --git a/zy-asrs-admin/src/views/system/userLogin/edit.vue b/zy-asrs-admin/src/views/system/userLogin/edit.vue
index e2bc9a9..22e5082 100644
--- a/zy-asrs-admin/src/views/system/userLogin/edit.vue
+++ b/zy-asrs-admin/src/views/system/userLogin/edit.vue
@@ -1,14 +1,13 @@
 <script setup>
 import { ref, nextTick } from 'vue';
-import { get, post } from '@/utils/request.js'
+import { get, post, postBlob, postForm } from '@/utils/request.js'
 import { formatMessage } from '@/utils/localeUtils.js';
+import { message } from 'ant-design-vue';
 
 const submitButton = ref(null);
 const isSave = ref(true);
 const open = ref(false);
-const initFormData = {
-    name: null
-}
+const initFormData = {}
 let formData = ref(initFormData);
 const treeData = ref(null);
 
@@ -25,14 +24,29 @@
 const onFinish = values => {
     // console.log('Success:', values);
     open.value = false;
-    post(isSave.value ? '/api/userLogin/save' : '/api/userLogin/update', formData.value).then((result) => {
-        console.log(result);
+    post(isSave.value ? '/api/userLogin/save' : '/api/userLogin/update', formData.value).then((resp) => {
+        let result = resp.data;
+        if (result.code === 200) {
+            message.success(formatMessage('page.update.success', '鏇存柊鎴愬姛'));
+        } else {
+            message.error(result.msg);
+        }
         emit('tableReload', 'reload')
     })
 };
 const onFinishFailed = errorInfo => {
     console.log('Failed:', errorInfo);
 };
+
+const UserQueryList = ref(null); 
+UserQuery();
+function UserQuery() { 
+    postForm('/api/user/query', {}).then(resp => { 
+        let result = resp.data;
+        UserQueryList.value = result.data;
+    })
+}
+
 
 defineExpose({
     open,
@@ -46,7 +60,7 @@
 
 <script>
 export default {
-    name: '鑿滃崟绠$悊'
+    name: '鐧诲綍鏃ュ織-edit'
 }
 </script>
 
@@ -58,28 +72,88 @@
             <a-form :model="formData" name="formTable" :label-col="{ span: 8 }" :wrapper-col="{ span: 16 }"
                 style="display: flex;justify-content: space-between;flex-wrap: wrap;" autocomplete="off"
                 @finish="onFinish" @finishFailed="onFinishFailed">
-                <a-form-item label="鐢ㄦ埛" name="userId" style="width: 250px;"
-                    :rules="[{ required: true, message: '鐢ㄦ埛涓嶈兘涓虹┖!' }]">
-                    <a-input v-model:value="formData.userId" />
-                </a-form-item>
-                <a-form-item label="瀵嗛挜" name="token" style="width: 250px;">
-                    <a-input v-model:value="formData.token" />
-                </a-form-item>
-                <a-form-item label="鐧诲綍ip" name="ip" style="width: 250px;">
-                    <a-input v-model:value="formData.ip" />
-                </a-form-item>
-                <a-form-item label="绫诲瀷" name="type" style="width: 250px;"
-                    :rules="[{ required: true, message: '绫诲瀷涓嶈兘涓虹┖!' }]">
-                    <a-select v-model:value="formData.type" :options="[
-                        { label: '鐧诲綍鎴愬姛', value: 0 },
-                        { label: '鐧诲綍澶辫触', value: 1 },
-                        { label: '閫�鍑虹櫥褰�', value: 2 },
-                        { label: '缁token', value: 3 },
-                    ]"></a-select>
-                </a-form-item>
-                <a-form-item label="澶囨敞" name="memo" style="width: 250px;">
-                    <a-input v-model:value="formData.memo" />
-                </a-form-item>
+                    <a-form-item 
+                      label="鐢ㄦ埛" 
+                      name="userId" 
+                      style="width: 250px;" 
+                            :rules="[{ required: true }]"
+                            >
+                    <a-select 
+                        v-model:value="formData.userId" 
+                        placeholder="Select users" 
+                        style="width: 100%" 
+                        show-search 
+                        :options="UserQueryList" 
+                        optionFilterProp="label" 
+                        optionLabelProp="label" 
+                     > 
+                    </a-select>
+                        </a-form-item>
+                    <a-form-item 
+                      label="瀵嗛挜" 
+                      name="token" 
+                      style="width: 250px;" 
+                            >
+                    <a-input 
+                        v-model:value="formData.token" 
+                     /> 
+                        </a-form-item>
+                    <a-form-item 
+                      label="鐧诲綍ip" 
+                      name="ip" 
+                      style="width: 250px;" 
+                            >
+                    <a-input 
+                        v-model:value="formData.ip" 
+                     /> 
+                        </a-form-item>
+                    <a-form-item 
+                      label="绫诲瀷" 
+                      name="type" 
+                      style="width: 250px;" 
+                            >
+                    <a-select 
+                        v-model:value="formData.type" 
+                        :options="[
+                                { label: '鐧诲綍鎴愬姛', value: 0 },
+                                { label: '鐧诲綍澶辫触', value: 1 },
+                                { label: '閫�鍑虹櫥褰�', value: 2 },
+                                { label: '缁token', value: 3 },
+                            ]"
+                        >
+                    </a-select>
+                        </a-form-item>
+                    <a-form-item 
+                      label="娣诲姞鏃堕棿" 
+                      name="createTime" 
+                      style="width: 250px;" 
+                            >
+                    <a-date-picker 
+                        v-model:value="formData.createTime" 
+                        show-time 
+                        format="YYYY-MM-DD HH:mm:ss" 
+                        value-format="YYYY-MM-DD HH:mm:ss" 
+                     /> 
+                        </a-form-item>
+                    <a-form-item 
+                      label="鐧诲綍绯荤粺" 
+                      name="system" 
+                      style="width: 250px;" 
+                            >
+                    <a-input 
+                        v-model:value="formData.system" 
+                     /> 
+                        </a-form-item>
+                    <a-form-item 
+                      label="澶囨敞" 
+                      name="memo" 
+                      style="width: 250px;" 
+                            >
+                    <a-input 
+                        v-model:value="formData.memo" 
+                     /> 
+                        </a-form-item>
+
                 <a-form-item>
                     <a-button type="primary" html-type="submit" ref="submitButton"
                         style="visibility: hidden;">Submit</a-button>
@@ -89,4 +163,4 @@
     </div>
 </template>
 
-<style></style>
\ No newline at end of file
+<style></style>
diff --git a/zy-asrs-admin/src/views/system/userLogin/index.vue b/zy-asrs-admin/src/views/system/userLogin/index.vue
index e151820..e0af397 100644
--- a/zy-asrs-admin/src/views/system/userLogin/index.vue
+++ b/zy-asrs-admin/src/views/system/userLogin/index.vue
@@ -9,6 +9,7 @@
 const context = getCurrentInstance()?.appContext.config.globalProperties;
 
 const router = useRouter();
+
 const TABLE_KEY = 'table-userLogin';
 let currentPage = 1;
 let pageSize = 10;
@@ -20,70 +21,48 @@
 
 const columns = [
   {
-    title: 'ID',
-    name: 'id',
-    dataIndex: 'id',
-    key: 'id',
-  },
-  {
-    title: '鐢ㄦ埛',
-    name: 'userId$',
+    title: formatMessage('db.sys_user_login.user_id', '鐢ㄦ埛'),
     dataIndex: 'userId$',
-    key: 'userId$',
+    width: 140,
   },
   {
-    title: '瀵嗛挜',
-    name: 'token',
+    title: formatMessage('db.sys_user_login.token', '瀵嗛挜'),
     dataIndex: 'token',
-    key: 'token',
+    width: 140,
     ellipsis: true,
   },
   {
-    title: '鐧诲綍ip',
-    name: 'ip',
+    title: formatMessage('db.sys_user_login.ip', '鐧诲綍ip'),
     dataIndex: 'ip',
-    key: 'ip',
+    width: 140,
   },
   {
-    title: '绫诲瀷',
-    name: 'type',
-    dataIndex: 'type',
-    key: 'type',
-    customRender: (column) => {
-      let typeMap = {
-        0: {
-          text: formatMessage('login.success', '鐧诲綍鎴愬姛'),
-        },
-        1: {
-          text: formatMessage('login.fail', '鐧诲綍澶辫触'),
-        },
-        2: {
-          text: formatMessage('login.logout', '閫�鍑虹櫥褰�'),
-        },
-        3: {
-          text: formatMessage('login.retoken', '缁token'),
-        },
-      };
-      return typeMap[column.value].text;
-    }
+    title: formatMessage('db.sys_user_login.type', '绫诲瀷'),
+    dataIndex: 'type$',
+    width: 140,
   },
   {
-    title: '娣诲姞鏃堕棿',
-    name: 'createTime$',
+    title: formatMessage('db.sys_user_login.create_time', '娣诲姞鏃堕棿'),
     dataIndex: 'createTime$',
-    key: 'createTime$',
+    width: 140,
   },
   {
-    title: '澶囨敞',
-    name: 'memo',
+    title: formatMessage('db.sys_user_login.system', '鐧诲綍绯荤粺'),
+    dataIndex: 'system',
+    width: 140,
+  },
+  {
+    title: formatMessage('db.sys_user_login.memo', '澶囨敞'),
     dataIndex: 'memo',
-    key: 'memo',
+    width: 140,
   },
+
   {
-    title: '鎿嶄綔',
+    title: formatMessage('common.operation', '鎿嶄綔'),
     name: 'oper',
     dataIndex: 'oper',
     key: 'oper',
+    width: 140,
   },
 ];
 
@@ -136,15 +115,21 @@
     content: formatMessage('page.delete.confirm', '纭畾鍒犻櫎璇ラ」鍚楋紵'),
     maskClosable: true,
     onOk: async () => {
-      post('/api/userLogin/remove/' + rows.map((row) => row.id).join(','), {}).then(resp => {
-        let result = resp.data;
-        if (result.code === 200) {
-          message.success(result.msg);
-        } else {
-          message.error(result.msg);
-        }
-        getPage()
-      })
+      const hide = message.loading(formatMessage('common.loading', '璇锋眰涓�'));
+      try {
+        post('/api/userLogin/remove/' + rows.map((row) => row.id).join(','), {}).then(resp => {
+          let result = resp.data;
+          if (result.code === 200) {
+            message.success(result.msg);
+          } else {
+            message.error(result.msg);
+          }
+          getPage()
+          hide()
+        })
+      } catch (error) {
+        message.error(formatMessage('common.fail', '璇锋眰澶辫触'));
+      }
     },
   });
 }
@@ -208,4 +193,4 @@
   </div>
 </template>
 
-<style></style>
\ No newline at end of file
+<style></style>
diff --git a/zy-asrs-common/src/main/java/com/zy/asrs/common/sys/entity/UserLogin.java b/zy-asrs-common/src/main/java/com/zy/asrs/common/sys/entity/UserLogin.java
index 08e2205..02543a1 100644
--- a/zy-asrs-common/src/main/java/com/zy/asrs/common/sys/entity/UserLogin.java
+++ b/zy-asrs-common/src/main/java/com/zy/asrs/common/sys/entity/UserLogin.java
@@ -38,6 +38,12 @@
     private Long userId;
 
     /**
+     * 绫诲瀷 0: 鐧诲綍鎴愬姛  1: 鐧诲綍澶辫触  2: 閫�鍑虹櫥褰�  3: 缁token
+     */
+    @ApiModelProperty(value= "绫诲瀷 0: 鐧诲綍鎴愬姛  1: 鐧诲綍澶辫触  2: 閫�鍑虹櫥褰�  3: 缁token")
+    private Integer type;
+
+    /**
      * 鍑瘉鍊�
      */
     private String token;
@@ -68,4 +74,23 @@
         return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
     }
 
+    public String getType$(){
+        if (Cools.isEmpty(this.getType())){
+            return "";
+        }
+        //0: 鐧诲綍鎴愬姛  1: 鐧诲綍澶辫触  2: 閫�鍑虹櫥褰�  3: 缁token
+        switch (this.getType()) {
+            case 0:
+                return "鐧诲綍鎴愬姛";
+            case 1:
+                return "鐧诲綍澶辫触";
+            case 2:
+                return "閫�鍑虹櫥褰�";
+            case 3:
+                return "缁token";
+            default:
+                return String.valueOf(this.getType());
+        }
+    }
+
 }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/CodeBuilder.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/CodeBuilder.java
index a99e90c..711137a 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/CodeBuilder.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/CodeBuilder.java
@@ -15,15 +15,15 @@
         generator.frontendPrefixPath = "zy-asrs-admin/";
 
         generator.sqlOsType = SqlOsType.MYSQL;
-        generator.url="localhost:3306/asrs";
+        generator.url="localhost:3306/wms_dev";
         generator.username="root";
         generator.password="root";
 //        generator.url="47.97.1.152:51433;databasename=jkasrs";
 //        generator.username="sa";
 //        generator.password="Zoneyung@zy56$";
 
-        generator.table="sys_user";
-        generator.tableName="鐢ㄦ埛绠$悊";
+        generator.table="sys_user_login";
+        generator.tableName="鐧诲綍鏃ュ織";
         generator.packagePath="com.zy.asrs.wms.system";
 
         generator.build();
diff --git a/zy-asrs-wms/src/main/java/host.sql b/zy-asrs-wms/src/main/java/host.sql
deleted file mode 100644
index 3272260..0000000
--- a/zy-asrs-wms/src/main/java/host.sql
+++ /dev/null
@@ -1,9 +0,0 @@
--- save host record
--- mysql
-insert into `sys_menu` ( `name`, `parent_id`, `route`, `component`, `type`, `sort`, `host_id`, `status`) values ( '鏈烘瀯绠$悊绠$悊', '0', '/system/host', '/system/host', '0' , '0', '1' , '1');
-
-insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `host_id`, `status`) values ( '鏌ヨ鏈烘瀯绠$悊', '', '1', 'system:host:list', '0', '1', '1');
-insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `host_id`, `status`) values ( '娣诲姞鏈烘瀯绠$悊', '', '1', 'system:host:save', '1', '1', '1');
-insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `host_id`, `status`) values ( '淇敼鏈烘瀯绠$悊', '', '1', 'system:host:update', '2', '1', '1');
-insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `host_id`, `status`) values ( '鍒犻櫎鏈烘瀯绠$悊', '', '1', 'system:host:remove', '3', '1', '1');
-
diff --git a/zy-asrs-wms/src/main/java/user.sql b/zy-asrs-wms/src/main/java/user.sql
deleted file mode 100644
index a704325..0000000
--- a/zy-asrs-wms/src/main/java/user.sql
+++ /dev/null
@@ -1,9 +0,0 @@
--- save user record
--- mysql
-insert into `sys_menu` ( `name`, `parent_id`, `route`, `component`, `type`, `sort`, `host_id`, `status`) values ( '鐢ㄦ埛绠$悊绠$悊', '0', '/system/user', '/system/user', '0' , '0', '1' , '1');
-
-insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `host_id`, `status`) values ( '鏌ヨ鐢ㄦ埛绠$悊', '', '1', 'system:user:list', '0', '1', '1');
-insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `host_id`, `status`) values ( '娣诲姞鐢ㄦ埛绠$悊', '', '1', 'system:user:save', '1', '1', '1');
-insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `host_id`, `status`) values ( '淇敼鐢ㄦ埛绠$悊', '', '1', 'system:user:update', '2', '1', '1');
-insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `host_id`, `status`) values ( '鍒犻櫎鐢ㄦ埛绠$悊', '', '1', 'system:user:remove', '3', '1', '1');
-
diff --git a/zy-asrs-wms/src/main/java/userLogin.sql b/zy-asrs-wms/src/main/java/userLogin.sql
new file mode 100644
index 0000000..2269943
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/userLogin.sql
@@ -0,0 +1,9 @@
+-- save userLogin record
+-- mysql
+insert into `sys_menu` ( `name`, `parent_id`, `route`, `component`, `type`, `sort`, `host_id`, `status`) values ( '鐧诲綍鏃ュ織绠$悊', '0', '/system/userLogin', '/system/userLogin', '0' , '0', '1' , '1');
+
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `host_id`, `status`) values ( '鏌ヨ鐧诲綍鏃ュ織', '', '1', 'system:userLogin:list', '0', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `host_id`, `status`) values ( '娣诲姞鐧诲綍鏃ュ織', '', '1', 'system:userLogin:save', '1', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `host_id`, `status`) values ( '淇敼鐧诲綍鏃ュ織', '', '1', 'system:userLogin:update', '2', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `host_id`, `status`) values ( '鍒犻櫎鐧诲綍鏃ュ織', '', '1', 'system:userLogin:remove', '3', '1', '1');
+

--
Gitblit v1.9.1