parent
62d4fe8fe9
commit
ed33c2619c
@ -0,0 +1,7 @@
|
|||||||
|
import ajax from "@/utils/request";
|
||||||
|
|
||||||
|
export const getConfig = async () =>
|
||||||
|
ajax(`/config/getConfig`, "GET");
|
||||||
|
|
||||||
|
export const updateConfig = async (params) =>
|
||||||
|
ajax(`/config/updateConfig`, "POST", params);
|
||||||
@ -1,162 +0,0 @@
|
|||||||
<script setup>
|
|
||||||
import { ref, reactive, onMounted, toRefs } from "vue";
|
|
||||||
import { Plus, Edit, Delete, ArrowDown } from "@element-plus/icons-vue";
|
|
||||||
|
|
||||||
import AscForm from "./components/Form.vue";
|
|
||||||
|
|
||||||
import { getAdminUserList, deleteAdminUser } from "@/api/adminuser";
|
|
||||||
|
|
||||||
const state = reactive({
|
|
||||||
page: 1,
|
|
||||||
pageSize: 10,
|
|
||||||
});
|
|
||||||
|
|
||||||
const { page, pageSize } = toRefs(state);
|
|
||||||
const total = ref(0);
|
|
||||||
const loading = ref(false);
|
|
||||||
|
|
||||||
const showFormDraw = ref(false);
|
|
||||||
|
|
||||||
const tableData = ref([]);
|
|
||||||
|
|
||||||
onMounted(() => {
|
|
||||||
getTableData();
|
|
||||||
});
|
|
||||||
|
|
||||||
const getTableData = async () => {
|
|
||||||
loading.value = true;
|
|
||||||
let res = await getAdminUserList(state);
|
|
||||||
if (res.code === 200) {
|
|
||||||
tableData.value = res.data.list;
|
|
||||||
total.value = res.data.total;
|
|
||||||
}
|
|
||||||
loading.value = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleAdd = () => {
|
|
||||||
editid.value = 0;
|
|
||||||
showFormDraw.value = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleEdit = (id) => {
|
|
||||||
editid.value = id;
|
|
||||||
showFormDraw.value = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleDelete = (id) => {
|
|
||||||
ElMessageBox.confirm('確認刪除此紀錄?')
|
|
||||||
.then(async () => {
|
|
||||||
let res = await deleteAdminUser(id);
|
|
||||||
if (res.code === 200) {
|
|
||||||
ElMessage({
|
|
||||||
message: '刪除成功.',
|
|
||||||
type: 'success',
|
|
||||||
});
|
|
||||||
getTableData();
|
|
||||||
|
|
||||||
}else{
|
|
||||||
ElMessage({
|
|
||||||
message: '刪除失敗.',
|
|
||||||
type: 'error',
|
|
||||||
});
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.catch(() => {
|
|
||||||
})
|
|
||||||
};
|
|
||||||
|
|
||||||
// Pagination
|
|
||||||
const handleSizeChange = (val) => {
|
|
||||||
state.pageSize = val;
|
|
||||||
getTableData();
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleCurrentChange = (val) => {
|
|
||||||
state.page = val;
|
|
||||||
getTableData();
|
|
||||||
};
|
|
||||||
|
|
||||||
const handlePrevClick = (val) => {
|
|
||||||
state.page = val;
|
|
||||||
getTableData();
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleNextClick = (val) => {
|
|
||||||
state.page = val;
|
|
||||||
getTableData();
|
|
||||||
};
|
|
||||||
|
|
||||||
// Drawer
|
|
||||||
|
|
||||||
const editid = ref(0);
|
|
||||||
|
|
||||||
const handleCloseFormDraw = (val) => {
|
|
||||||
|
|
||||||
showFormDraw.value = false;
|
|
||||||
if(val){
|
|
||||||
getTableData();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<div class="main">
|
|
||||||
<!-- Breadcrumb: Start -->
|
|
||||||
<div class="breadcrumb-section">
|
|
||||||
<div>
|
|
||||||
<el-breadcrumb separator="/">
|
|
||||||
<el-breadcrumb-item> 經銷商系統 </el-breadcrumb-item>
|
|
||||||
<el-breadcrumb-item>管理員列表</el-breadcrumb-item>
|
|
||||||
</el-breadcrumb>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<el-button type="primary" :icon="Plus" @click="handleAdd">新增管理員</el-button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- Breadcrumb: End -->
|
|
||||||
|
|
||||||
<el-card :body-style="{ padding: '0px' }">
|
|
||||||
<div v-loading="loading">
|
|
||||||
<el-table :data="tableData" style="width: 100%">
|
|
||||||
<el-table-column label="#" prop="id" width="50" />
|
|
||||||
<el-table-column label="管理員名稱" prop="username" />
|
|
||||||
<el-table-column label="上次登入" prop="login_time" />
|
|
||||||
<el-table-column label="登入次數" prop="login_num" />
|
|
||||||
<el-table-column label="操作" width="105" fixed="right">
|
|
||||||
<template #default="scope">
|
|
||||||
<el-dropdown>
|
|
||||||
<el-button type="danger">
|
|
||||||
操作<el-icon class="el-icon--right"><arrow-down /></el-icon>
|
|
||||||
</el-button>
|
|
||||||
<template #dropdown>
|
|
||||||
<el-dropdown-menu>
|
|
||||||
<el-dropdown-item :icon="Edit" @click="handleEdit(scope.row.id)">編輯</el-dropdown-item>
|
|
||||||
<el-dropdown-item v-if="scope.row.is_main !== 1" :icon="Delete" @click="handleDelete(scope.row.id)">刪除</el-dropdown-item>
|
|
||||||
</el-dropdown-menu>
|
|
||||||
</template>
|
|
||||||
</el-dropdown>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
</el-table>
|
|
||||||
<div class="pagination-block">
|
|
||||||
<el-pagination
|
|
||||||
v-model:current-page="page"
|
|
||||||
v-model:page-size="pageSize"
|
|
||||||
:page-sizes="[10, 20, 50, 100]"
|
|
||||||
layout="->,total, sizes, prev, pager, next, jumper"
|
|
||||||
:total="total"
|
|
||||||
@size-change="handleSizeChange"
|
|
||||||
@current-change="handleCurrentChange"
|
|
||||||
@prev-click="handlePrevClick"
|
|
||||||
@next-click="handleNextClick"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</el-card>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<el-drawer ref="drawerRef" v-model="showFormDraw" :destroy-on-close="true" title="新增管理員" direction="rtl" size="50%">
|
|
||||||
<asc-form :editid="editid" @close="handleCloseFormDraw"/>
|
|
||||||
</el-drawer>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
@ -0,0 +1,115 @@
|
|||||||
|
<script setup>
|
||||||
|
import { ref, reactive, onMounted, watch } from "vue";
|
||||||
|
import { useRouter, useRoute } from "vue-router";
|
||||||
|
|
||||||
|
const route = useRoute();
|
||||||
|
const router = useRouter();
|
||||||
|
|
||||||
|
import { getConfig, updateConfig } from "@/api/config";
|
||||||
|
|
||||||
|
const formType = ref("insert");
|
||||||
|
|
||||||
|
const loading = ref(false);
|
||||||
|
const formRef = ref(null);
|
||||||
|
const form = ref({});
|
||||||
|
|
||||||
|
onMounted(async () => {
|
||||||
|
let res = await getConfig();
|
||||||
|
if (res.code === 200) {
|
||||||
|
form.value = res.data;
|
||||||
|
formType.value = "update";
|
||||||
|
}else{
|
||||||
|
ElMessage({
|
||||||
|
message: "取得資料失敗.",
|
||||||
|
type: 'error',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const rules = reactive({
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
const submitForm = (formEl) => {
|
||||||
|
if (!formEl) return
|
||||||
|
formEl.validate(async (valid) => {
|
||||||
|
if (valid) {
|
||||||
|
let res;
|
||||||
|
let message;
|
||||||
|
|
||||||
|
res = await updateConfig(form.value);
|
||||||
|
|
||||||
|
message = "修改成功.";
|
||||||
|
|
||||||
|
if (res.code === 200) {
|
||||||
|
ElMessage({
|
||||||
|
message: message,
|
||||||
|
type: 'success',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ElMessage({
|
||||||
|
message: "操作失敗.",
|
||||||
|
type: 'error',
|
||||||
|
});
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="main">
|
||||||
|
<!-- Breadcrumb: Start -->
|
||||||
|
<div class="breadcrumb-section">
|
||||||
|
<div>
|
||||||
|
<el-breadcrumb separator="/">
|
||||||
|
<el-breadcrumb-item> 站台設定 </el-breadcrumb-item>
|
||||||
|
</el-breadcrumb>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- Breadcrumb: End -->
|
||||||
|
|
||||||
|
<el-card>
|
||||||
|
<el-form
|
||||||
|
ref="formRef"
|
||||||
|
:model="form"
|
||||||
|
status-icon
|
||||||
|
:rules="rules"
|
||||||
|
label-width="120px">
|
||||||
|
<el-form-item label="公司名稱" prop="company_name">
|
||||||
|
<el-input v-model="form.company_name" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="地址" prop="address">
|
||||||
|
<el-input v-model="form.address" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="Email" prop="email">
|
||||||
|
<el-input v-model="form.email" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="電話" prop="tel">
|
||||||
|
<el-input v-model="form.tel" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="傳真" prop="fax">
|
||||||
|
<el-input v-model="form.fax" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="產品與服務" prop="products">
|
||||||
|
<el-input type="textarea" :rows="3" v-model="form.products" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="企業永續發展" prop="development">
|
||||||
|
<el-input type="textarea" :rows="3" v-model="form.development" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<div class="demo-drawer__footer" style="text-align: right;">
|
||||||
|
<el-button type="primary" :loading="loading" @click="submitForm(formRef)">{{
|
||||||
|
loading ? '提交中 ...' : '修改'
|
||||||
|
}}</el-button>
|
||||||
|
</div>
|
||||||
|
</el-card>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style lang="less" scoped>
|
||||||
|
|
||||||
|
</style>
|
||||||
@ -0,0 +1,52 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace app\adminapi\controller;
|
||||||
|
|
||||||
|
use app\adminapi\BaseController;
|
||||||
|
use support\Request;
|
||||||
|
use think\facade\Db;
|
||||||
|
|
||||||
|
class ConfigController extends BaseController
|
||||||
|
{
|
||||||
|
public function getConfig(Request $request)
|
||||||
|
{
|
||||||
|
$param = $request->get();
|
||||||
|
// $where[] = ['lang', $param['lang']];
|
||||||
|
|
||||||
|
$list = Db::name('config')
|
||||||
|
->where('lang',$param['lang'])
|
||||||
|
->select()
|
||||||
|
->toArray();
|
||||||
|
|
||||||
|
$result = [];
|
||||||
|
|
||||||
|
foreach ($list as $key => $val) {
|
||||||
|
$result[$val['code']] = $val['value'];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->Success($result);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function updateConfig(Request $request)
|
||||||
|
{
|
||||||
|
$param = $request->post();
|
||||||
|
|
||||||
|
try{
|
||||||
|
foreach ($param as $key => $val) {
|
||||||
|
if($key != 'lang'){
|
||||||
|
$data = [
|
||||||
|
'value' => $val,
|
||||||
|
];
|
||||||
|
|
||||||
|
Db::name('config')
|
||||||
|
->where('code',$key)
|
||||||
|
->where('lang',$param['lang'])
|
||||||
|
->update($data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $this->Success('更新成功');
|
||||||
|
}catch(\Exception $e){
|
||||||
|
return $this->Error('更新失敗');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,54 @@
|
|||||||
|
<?php
|
||||||
|
namespace app\common;
|
||||||
|
|
||||||
|
use think\facade\Db;
|
||||||
|
|
||||||
|
class GetData{
|
||||||
|
/**
|
||||||
|
* 取得無分頁資料
|
||||||
|
* db:資料表
|
||||||
|
* param:參數
|
||||||
|
* @return array list
|
||||||
|
*/
|
||||||
|
public static function getList(){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 取得分頁資料
|
||||||
|
* db:資料表
|
||||||
|
* param:參數
|
||||||
|
* @return array list
|
||||||
|
* list->totle: 總筆數
|
||||||
|
* list->list: 資料
|
||||||
|
*/
|
||||||
|
public static function getPageList($db,$param){
|
||||||
|
$page = isset($param['page']) ? $param['page'] : 1;
|
||||||
|
$pageSize = isset($param['pageSize']) ? $param['pageSize'] : 10;
|
||||||
|
$search = isset($param['search']) ? $param['search'] : [];
|
||||||
|
|
||||||
|
$where = [
|
||||||
|
];
|
||||||
|
|
||||||
|
$list = Db::name($db)
|
||||||
|
->where($where)
|
||||||
|
->order('id', 'asc')
|
||||||
|
->page($page, $pageSize)
|
||||||
|
->select()
|
||||||
|
->toArray();
|
||||||
|
|
||||||
|
$total = Db::name('activity')
|
||||||
|
->where($where)
|
||||||
|
->count();
|
||||||
|
|
||||||
|
// foreach($list as $key => $val){
|
||||||
|
// }
|
||||||
|
|
||||||
|
$result = [
|
||||||
|
'list' => $list,
|
||||||
|
'total' => $total
|
||||||
|
];
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,47 +1,55 @@
|
|||||||
version: '3.8'
|
version: '3.8'
|
||||||
|
|
||||||
services:
|
services:
|
||||||
nginx-php:
|
web:
|
||||||
build:
|
build:
|
||||||
context: .
|
context: .
|
||||||
dockerfile: ./nginx-php/Dockerfile
|
dockerfile: ./nuxt/Dockerfile
|
||||||
container_name: "utel-nginx-php"
|
container_name: "prodio-web"
|
||||||
ports:
|
ports:
|
||||||
- 6050:80
|
- "6061:3000"
|
||||||
volumes:
|
volumes:
|
||||||
- "./app:/var/www"
|
- ./nuxt/app:/app
|
||||||
- "./data/logs:/log"
|
|
||||||
networks:
|
networks:
|
||||||
- utel-network
|
- prodio-internal
|
||||||
|
api:
|
||||||
|
image: krisss/docker-webman:8.2-cli-alpine
|
||||||
|
container_name: "prodio-api"
|
||||||
|
ports:
|
||||||
|
- "6060:8787"
|
||||||
|
volumes:
|
||||||
|
- ./app:/app
|
||||||
|
networks:
|
||||||
|
- prodio-internal
|
||||||
mysql:
|
mysql:
|
||||||
build:
|
build:
|
||||||
context: .
|
context: .
|
||||||
dockerfile: ./mysql/Dockerfile
|
dockerfile: ./mysql/Dockerfile
|
||||||
container_name: "utel-mysql"
|
container_name: "prodio-mysql"
|
||||||
ports:
|
#ports:
|
||||||
- "3306:3306"
|
# - "3306:3306"
|
||||||
networks:
|
networks:
|
||||||
- utel-network
|
- prodio-internal
|
||||||
volumes:
|
volumes:
|
||||||
- ./data/mysql:/var/lib/mysql
|
- ./data/mysql:/var/lib/mysql
|
||||||
environment:
|
environment:
|
||||||
MYSQL_ROOT_PASSWORD: 1qazvfr4
|
MYSQL_ROOT_PASSWORD: admin
|
||||||
# redis:
|
# redis:
|
||||||
# image: redis
|
# image: redis
|
||||||
# container_name: "bdshop-redis"
|
# container_name: "prodio-redis"
|
||||||
# networks:
|
# networks:
|
||||||
# - bdshop-network
|
# - internal
|
||||||
phpmyadmin:
|
phpmyadmin:
|
||||||
image: phpmyadmin/phpmyadmin
|
image: phpmyadmin/phpmyadmin
|
||||||
container_name: "utel-myadmin"
|
container_name: "prodio-myadmin"
|
||||||
ports:
|
ports:
|
||||||
- "6059:80"
|
- "6069:80"
|
||||||
networks:
|
networks:
|
||||||
- utel-network
|
- prodio-internal
|
||||||
environment:
|
environment:
|
||||||
PMA_HOST: mysql
|
PMA_HOST: mysql
|
||||||
PMA_PORT: 3306
|
PMA_PORT: 3306
|
||||||
UPLOAD_LIMIT: 100M
|
UPLOAD_LIMIT: 100M
|
||||||
networks:
|
networks:
|
||||||
utel-network:
|
prodio-internal:
|
||||||
driver: bridge
|
driver: bridge
|
||||||
|
|||||||
@ -0,0 +1,30 @@
|
|||||||
|
import Cookies from 'js-cookie'
|
||||||
|
|
||||||
|
export const useRequest = (request, method="GET" ,opts={}, headers ={}) => {
|
||||||
|
let locale = Cookies.get('i18n_redirected');
|
||||||
|
const config = useRuntimeConfig()
|
||||||
|
const options = {
|
||||||
|
baseURL: config.public.apiBaseUrl,
|
||||||
|
method: method,
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
// "Authorization": Cookies.get('token'),
|
||||||
|
...headers,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
let data = {
|
||||||
|
...opts,
|
||||||
|
lang: locale
|
||||||
|
}
|
||||||
|
|
||||||
|
if (method === "GET" || method === "DELETE") {
|
||||||
|
options.params = data;
|
||||||
|
}
|
||||||
|
if (method === "POST" || method === "PUT") {
|
||||||
|
options.body = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $fetch(request, options)
|
||||||
|
}
|
||||||
|
|
||||||
Loading…
Reference in new issue