123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437 |
- <!-- vue 页面模板 -->
- <template>
- <div class="user">
- <Space wrap style="margin-bottom: 1em">
- <Button type="primary" icon="ios-search" @click="() => show_edit()">
- 新增
- </Button>
- <Input
- v-model="searchText"
- placeholder="请输入搜索内容"
- icon="ios-search"
- @on-click="() => change(1)"
- @on-enter="() => change(1)"
- >
- </Input>
- </Space>
- <Table highlight-row ref="currentRowTable" :columns="columns" :data="list">
- <template #tool="{ row }">
- <Space wrap>
- <Poptip
- transfer
- confirm
- width="90"
- title="删除该用户?"
- @on-ok="() => del_user(row)"
- >
- <Button size="small" type="error"> 删 除 </Button>
- </Poptip>
- <Button size="small" type="primary" @click="() => show_edit(row)">
- 修 改
- </Button>
- </Space>
- </template>
- <template #photo="{ row }">
- <Image :src="row.photo" fit="cover" width="58px" height="58px">
- <template #error>
- <Icon type="ios-image-outline" size="24" color="#ccc" />
- </template>
- </Image>
- </template>
- </Table>
- <br />
- <Page
- :total="total"
- show-sizer
- v-model="page"
- @on-change="change"
- @on-page-size-change="sizeChange"
- />
- <Drawer
- :mask-closable="false"
- title="用户详情"
- placement="right"
- v-model="show_user_edit"
- >
- <Form
- ref="formInline"
- :model="user"
- :rules="ruleInline"
- :label-width="80"
- >
- <FormItem label="用户名">
- <Input v-model="user.name" placeholder="请输入用户名"></Input>
- </FormItem>
- <FormItem label="头像">
- <div class="img-box" v-if="user.photo && user.photo.url">
- <Image
- :src="user.photo.url"
- fit="cover"
- width="100%"
- height="100%"
- />
- <Icon
- type="ios-trash-outline"
- class="check-icon"
- size="25"
- @click="handleRemove"
- ></Icon>
- </div>
- <Upload
- ref="upload"
- v-else
- :show-upload-list="false"
- :on-success="handle_success"
- :format="['jpg', 'jpeg', 'png']"
- :max-size="5120"
- :on-format-error="handle_format_error"
- :headers="{
- Authorization: token,
- }"
- type="drag"
- :action="base_url + '/admin/leaders/upload'"
- style="display: inline-block; width: 58px"
- >
- <div style="width: 58px; height: 58px; line-height: 58px">
- <Icon type="ios-camera" size="20"></Icon>
- </div>
- </Upload>
- </FormItem>
- <FormItem label="角色">
- <Select
- v-model="user.roleId"
- filterable
- :remote-method="get_role_data"
- :loading="isLoad"
- >
- <Option
- v-for="(option, index) in rules"
- :value="option.roleId"
- :key="index"
- >
- {{ option.name }}
- </Option>
- </Select>
- </FormItem>
- <FormItem label="机构">
- <Select
- v-model="user.organId"
- filterable
- :remote-method="get_regan_data"
- :loading="isLoad"
- >
- <Option
- v-for="(option, index) in organ"
- :value="option.organId"
- :key="index"
- >
- {{ option.name }}
- </Option>
- </Select>
- </FormItem>
- <FormItem label="地域">
- <TreeSelect v-model="user.regionId" :data="region" />
- </FormItem>
- <FormItem label="手机号">
- <Input v-model="user.phone" placeholder="请输入手机号"></Input>
- </FormItem>
- <FormItem label="密码">
- <Input
- v-model="user.newpassword"
- type="password"
- placeholder="请输入密码"
- ></Input>
- </FormItem>
- <FormItem label="简介">
- <Input
- v-model="user.info"
- type="textarea"
- :rows="4"
- placeholder="请输入简介"
- ></Input>
- </FormItem>
- <FormItem label="职位">
- <Input v-model="user.position" placeholder="请输入职位"></Input>
- </FormItem>
- <FormItem label="职级">
- <Input v-model="user.level" placeholder="请输入职级"></Input>
- </FormItem>
- <FormItem label="履历">
- <Input
- v-model="user.resume"
- type="textarea"
- :rows="4"
- placeholder="请输入履历"
- ></Input>
- </FormItem>
- <FormItem>
- <Button type="primary" @click="save_user">保 存</Button>
- </FormItem>
- </Form>
- </Drawer>
- </div>
- </template>
- <script setup>
- import { ref, onMounted } from 'vue';
- import { Image, Message } from 'view-ui-plus';
- import api from '../../api/index.js';
- import { base_url } from '../../config/index';
- const token = localStorage.getItem('neican_token');
- const searchText = ref('');
- const total = ref(0);
- const page = ref(1);
- const pageSize = ref(10);
- const formInline = ref(null);
- const upload = ref(null);
- const list = ref([]);
- const user = ref({
- headSculpture: [],
- photo: {},
- regionId: '',
- });
- const rules = ref([]);
- const organ = ref([]);
- const region = ref([]);
- const show_user_edit = ref(false);
- const isLoad = ref(false);
- const columns = [
- {
- title: '名字',
- key: 'name',
- align: 'center',
- },
- {
- title: '头像',
- slot: 'photo',
- align: 'center',
- },
- {
- title: '手机号',
- key: 'phone',
- align: 'center',
- },
- {
- title: '级别',
- key: 'level',
- align: 'center',
- },
- {
- title: '操作',
- slot: 'tool',
- align: 'center',
- },
- ];
- const ruleInline = {
- name: [
- {
- required: true,
- message: '请输入姓名',
- trigger: 'blur',
- },
- ],
- newpassword: [
- {
- required: true,
- message: '请输入密码',
- trigger: 'blur',
- },
- ],
- phone: [
- {
- required: true,
- message: '请输入手机号',
- trigger: 'blur',
- },
- ],
- };
- onMounted(() => {});
- get_list();
- get_role_data();
- get_regan_data();
- get_region_api();
- function change(p) {
- page.value = p;
- get_list();
- }
- function sizeChange(pageSize) {
- pageSize.value = pageSize;
- get_list();
- }
- function get_list() {
- api
- .custom_list_api({
- page: page.value,
- pageSize: pageSize.value,
- name: searchText.value,
- })
- .then(r => {
- list.value = r.records || [];
- total.value = r.total || 0;
- });
- }
- function show_edit(data) {
- const row = JSON.parse(JSON.stringify(data || {}));
- show_user_edit.value = true;
- if (row.photo)
- row.photo = {
- url: row.photo,
- };
- user.value = row || {
- headSculpture: [],
- photo: {},
- regionId: '',
- };
- }
- function save_user() {
- formInline.value.validate(valid => {
- if (!valid) return;
- const U = user.value;
- if (!U.userId)
- api
- .custom_add({
- name: U.name,
- regionId: U.regionId,
- organId: U.organId,
- phone: U.phone,
- password: U.newpassword,
- info: U.info,
- photo: U.photo.url,
- position: U.position,
- resume: U.resume,
- level: U.level,
- roleId: U.roleId,
- })
- .then(() => {
- Message.info('新增成功');
- show_user_edit.value = false;
- get_list();
- });
- else
- api
- .custom_updata({
- name: U.name,
- regionId: U.regionId,
- organId: U.organId,
- phone: U.phone,
- password: U.newpassword,
- info: U.info,
- photo: U.photo.url,
- position: U.position,
- resume: U.resume,
- level: U.level,
- roleId: U.roleId,
- userId: U.userId,
- })
- .then(() => {
- Message.info('修改成功');
- show_user_edit.value = false;
- get_list();
- });
- });
- }
- function get_role_data(query) {
- isLoad.value = true;
- api
- .user_role_api({
- page: 1,
- pageSize: 100000,
- name: query,
- })
- .then(r => {
- isLoad.value = false;
- rules.value = r.records || [];
- })
- .catch(err => {
- isLoad.value = false;
- });
- }
- function get_regan_data(query) {
- api
- .organ_api({
- page: 1,
- pageSize: 100000,
- name: query,
- })
- .then(r => {
- organ.value = r.records || [];
- });
- }
- function get_region_api() {
- api.region_api().then(r => {
- region.value = tree_change(r || []);
- });
- }
- function tree_change(list) {
- const li = [];
- for (let i = 0; i < list.length; i++) {
- const v = list[i];
- v.title = v.name;
- v.value = v.regionId;
- v.expand = false;
- v.selected = false;
- v.checked = false;
- li.children = tree_change(v.children || []);
- li.push(v);
- }
- return li;
- }
- function handle_success(response, file, fileList) {
- user.value.photo.url = response.data.url || '';
- user.value.photo.file = file || null;
- Message.info('头像上传成功');
- }
- function handle_format_error(file) {
- Message.info('头像上传失败');
- }
- function handleRemove() {
- user.value.photo.url = '';
- user.value.photo.file = null;
- }
- function del_user(row) {
- api.custom_del(row.userId).then(() => {
- Message.info('删除成功');
- get_list();
- });
- }
- </script>
- <style lang="scss">
- .img-box {
- width: 58px;
- height: 58px;
- position: relative;
- .check-icon {
- opacity: 0;
- transition: all 0.5s;
- position: absolute;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -50%);
- z-index: 1;
- &:hover {
- opacity: 1;
- }
- }
- }
- </style>
|