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'
|
||||
|
||||
services:
|
||||
nginx-php:
|
||||
web:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: ./nginx-php/Dockerfile
|
||||
container_name: "utel-nginx-php"
|
||||
dockerfile: ./nuxt/Dockerfile
|
||||
container_name: "prodio-web"
|
||||
ports:
|
||||
- 6050:80
|
||||
- "6061:3000"
|
||||
volumes:
|
||||
- "./app:/var/www"
|
||||
- "./data/logs:/log"
|
||||
- ./nuxt/app:/app
|
||||
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:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: ./mysql/Dockerfile
|
||||
container_name: "utel-mysql"
|
||||
ports:
|
||||
- "3306:3306"
|
||||
container_name: "prodio-mysql"
|
||||
#ports:
|
||||
# - "3306:3306"
|
||||
networks:
|
||||
- utel-network
|
||||
- prodio-internal
|
||||
volumes:
|
||||
- ./data/mysql:/var/lib/mysql
|
||||
environment:
|
||||
MYSQL_ROOT_PASSWORD: 1qazvfr4
|
||||
MYSQL_ROOT_PASSWORD: admin
|
||||
# redis:
|
||||
# image: redis
|
||||
# container_name: "bdshop-redis"
|
||||
# container_name: "prodio-redis"
|
||||
# networks:
|
||||
# - bdshop-network
|
||||
# - internal
|
||||
phpmyadmin:
|
||||
image: phpmyadmin/phpmyadmin
|
||||
container_name: "utel-myadmin"
|
||||
container_name: "prodio-myadmin"
|
||||
ports:
|
||||
- "6059:80"
|
||||
- "6069:80"
|
||||
networks:
|
||||
- utel-network
|
||||
- prodio-internal
|
||||
environment:
|
||||
PMA_HOST: mysql
|
||||
PMA_PORT: 3306
|
||||
UPLOAD_LIMIT: 100M
|
||||
networks:
|
||||
utel-network:
|
||||
prodio-internal:
|
||||
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