dev
Wayne 2 years ago
parent 3a1c2263b0
commit 57670bb7c7

@ -101,7 +101,8 @@ const handleShowContent = (row) => {
<el-card :body-style="{ padding: '0px' }"> <el-card :body-style="{ padding: '0px' }">
<el-table :data="tableData"> <el-table :data="tableData">
<el-table-column fixed prop="id" label="#" width="50" /> <el-table-column fixed prop="id" label="#" width="50" />
<el-table-column prop="name" label="聯絡人" width="180" /> <el-table-column prop="company" label="公司名稱" width="180" />
<el-table-column prop="name" label="姓名" width="180" />
<el-table-column prop="email" label="E-mail" /> <el-table-column prop="email" label="E-mail" />
<el-table-column prop="tel" label="聯絡電話" /> <el-table-column prop="tel" label="聯絡電話" />
<el-table-column prop="create_time" label="留言時間" /> <el-table-column prop="create_time" label="留言時間" />

@ -7,18 +7,18 @@ const props = defineProps(['data']);
<el-card :body-style="{ padding: '0px' }"> <el-card :body-style="{ padding: '0px' }">
<el-descriptions :column="1" border> <el-descriptions :column="1" border>
<el-descriptions-item min-width="90px" label-align="right"> <el-descriptions-item min-width="90px" label-align="right">
<template #label><div class="cell-item">客戶姓名</div></template> <template #label><div class="cell-item">公司名稱</div></template>
{{data.name}} {{data.company}}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item min-width="90px" label-align="right"> <el-descriptions-item min-width="90px" label-align="right">
<template #label><div class="cell-item">聯絡電話</div></template> <template #label><div class="cell-item">姓名</div></template>
{{data.tel}} {{data.name}}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item min-width="90px" label-align="right"> <el-descriptions-item min-width="90px" label-align="right">
<template #label><div class="cell-item">聯絡地址</div></template> <template #label><div class="cell-item">聯絡電話</div></template>
{{data.address}} {{data.tel}}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item min-width="90px" label-align="right"> <el-descriptions-item min-width="90px" label-align="right">

@ -1,53 +0,0 @@
<script setup>
const gridData = {
id: 1,
name: "Mike Lee",
phone: '0987564231',
email: 'gfdsa33@asd.com',
address: "台北市大安區天龍一路588巷66號",
message: "測試測試測試測試測試測試測試測試測,試測試測試測試測試測試測試測試測試測試測試測試測,試測試測試測試測試測試測試測試測試測試測試測試測,試測試測試測試",
date: '2023/12/7',
}
</script>
<template>
<el-card :body-style="{ padding: '0px' }">
<el-descriptions :column="1" border>
<el-descriptions-item min-width="90px" label-align="right">
<template #label><div class="cell-item">客戶姓名</div></template>
{{gridData.name}}
</el-descriptions-item>
<el-descriptions-item min-width="90px" label-align="right">
<template #label><div class="cell-item">聯絡電話</div></template>
{{gridData.phone}}
</el-descriptions-item>
<el-descriptions-item min-width="90px" label-align="right">
<template #label><div class="cell-item">聯絡地址</div></template>
{{gridData.address}}
</el-descriptions-item>
<el-descriptions-item min-width="90px" label-align="right">
<template #label><div class="cell-item">電子信箱</div></template>
{{gridData.email}}
</el-descriptions-item>
<el-descriptions-item min-width="90px" label-align="right">
<template #label><div class="cell-item">留言內容</div></template>
{{gridData.message}}
</el-descriptions-item>
<el-descriptions-item min-width="90px" label-align="right">
<template #label><div class="cell-item">留言時間</div></template>
{{gridData.date}}
</el-descriptions-item>
</el-descriptions>
</el-card>
</template>
<style scoped>
</style>

@ -20,6 +20,7 @@ class EsgController extends BaseController
$list = Db::name('esg') $list = Db::name('esg')
->where($where) ->where($where)
->where('lang', $param['lang'])
->order('create_time', 'desc') ->order('create_time', 'desc')
->page($page, $pageSize) ->page($page, $pageSize)
->select() ->select()
@ -27,6 +28,7 @@ class EsgController extends BaseController
$total = Db::name('esg') $total = Db::name('esg')
->where($where) ->where($where)
->where('lang', $param['lang'])
->count(); ->count();
foreach($list as $key => $val){ foreach($list as $key => $val){
@ -46,6 +48,7 @@ class EsgController extends BaseController
$data = [ $data = [
'title' => isset($params['title'])?$params['title']:'', 'title' => isset($params['title'])?$params['title']:'',
'content' => isset($params['content'])?$params['content']:'', 'content' => isset($params['content'])?$params['content']:'',
'lang' => isset($params['lang'])?$params['lang']:'tw',
'create_time' => date('Y-m-d H:i:s',time()) 'create_time' => date('Y-m-d H:i:s',time())
]; ];

@ -20,6 +20,7 @@ class NewsController extends BaseController
$list = Db::name('news') $list = Db::name('news')
->where($where) ->where($where)
->where('lang', $param['lang'])
->order('create_time', 'desc') ->order('create_time', 'desc')
->page($page, $pageSize) ->page($page, $pageSize)
->select() ->select()
@ -27,6 +28,7 @@ class NewsController extends BaseController
$total = Db::name('news') $total = Db::name('news')
->where($where) ->where($where)
->where('lang', $param['lang'])
->count(); ->count();
foreach($list as $key => $val){ foreach($list as $key => $val){
@ -46,6 +48,7 @@ class NewsController extends BaseController
$data = [ $data = [
'title' => isset($params['title'])?$params['title']:'', 'title' => isset($params['title'])?$params['title']:'',
'content' => isset($params['content'])?$params['content']:'', 'content' => isset($params['content'])?$params['content']:'',
'lang' => isset($params['lang'])?$params['lang']:'tw',
'create_time' => date('Y-m-d H:i:s',time()) 'create_time' => date('Y-m-d H:i:s',time())
]; ];

@ -34,7 +34,11 @@ class ContactController extends BaseController
'content' => $param['content'], 'content' => $param['content'],
]; ];
$this->sendEmail($data);
try{ try{
Db::name('contact') Db::name('contact')
->insert($data); ->insert($data);
@ -45,4 +49,21 @@ class ContactController extends BaseController
} }
private function sendEmail($data)
{
$to = "info.service@prodio.com.tw";
// $to = "wwayne.hsu@gmail.com";
$subject = "=?UTF-8?B?".base64_encode("【普達網站-聯絡我們】")."?=";
$message = "
公司名稱: $data[company]
姓名: $data[name]
電話: $data[tel]
電子郵件: $data[email]
內容: $data[content]
";
$headers = 'From: prodio' . "\r\n" .
'Reply-To: info.service@prodio.com.tw' . "\r\n" .
'X-Mailer: PHP/' . phpversion();
mail($to, $subject, $message, $headers);
}
} }

@ -6,6 +6,10 @@ use app\appapi\BaseController;
use support\Request; use support\Request;
use think\facade\Db; use think\facade\Db;
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
class IndexController extends BaseController class IndexController extends BaseController
{ {
public function getConfig(Request $request) public function getConfig(Request $request)
@ -33,7 +37,6 @@ class IndexController extends BaseController
$list = Db::name('banner') $list = Db::name('banner')
->where('lang', $param['lang']) ->where('lang', $param['lang'])
->order('id', 'desc')
->order('sort_order', 'asc') ->order('sort_order', 'asc')
->select() ->select()
->toArray(); ->toArray();
@ -78,7 +81,7 @@ class IndexController extends BaseController
foreach ($list as $key => $val) { foreach ($list as $key => $val) {
switch($param['lang']){ switch ($param['lang']) {
case 'tw': case 'tw':
$list[$key]['name'] = $val['name1']; $list[$key]['name'] = $val['name1'];
break; break;
@ -131,4 +134,17 @@ class IndexController extends BaseController
} }
return $tree; return $tree;
} }
public function sendEmail()
{
$to = 'wwayne.hsu@gmail.com';
$subject = 'the subject';
$message = 'hello123';
$headers = 'From: prodiosystem' . "\r\n" .
'X-Mailer: PHP/' . phpversion();
$rtn = mail($to, $subject, $message, $headers);
return $rtn;
}
} }

@ -83,6 +83,7 @@ class SocialController extends BaseController
} }
$result['list'][$key]['imageList'] = json_decode($val['image_list']); $result['list'][$key]['imageList'] = json_decode($val['image_list']);
$result['list'][$key]['create_time'] = date('Y-m-d', strtotime($val['create_time']));
unset($result['list'][$key]['image_list']); unset($result['list'][$key]['image_list']);
} }

@ -29,7 +29,8 @@
"monolog/monolog": "^2.0", "monolog/monolog": "^2.0",
"webman/think-orm": "^1.1", "webman/think-orm": "^1.1",
"firebase/php-jwt": "^6.10", "firebase/php-jwt": "^6.10",
"webman/cors": "^1.0" "webman/cors": "^1.0",
"phpmailer/phpmailer": "^6.9"
}, },
"suggest": { "suggest": {
"ext-event": "For better performance. " "ext-event": "For better performance. "

83
app/composer.lock generated

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "2cb7928be53ae5b455419ac0578105b4", "content-hash": "b00a9f2f0908e7e01092dbb62f405d67",
"packages": [ "packages": [
{ {
"name": "firebase/php-jwt", "name": "firebase/php-jwt",
@ -221,6 +221,87 @@
}, },
"time": "2018-02-13T20:26:39+00:00" "time": "2018-02-13T20:26:39+00:00"
}, },
{
"name": "phpmailer/phpmailer",
"version": "v6.9.1",
"source": {
"type": "git",
"url": "https://github.com/PHPMailer/PHPMailer.git",
"reference": "039de174cd9c17a8389754d3b877a2ed22743e18"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/039de174cd9c17a8389754d3b877a2ed22743e18",
"reference": "039de174cd9c17a8389754d3b877a2ed22743e18",
"shasum": ""
},
"require": {
"ext-ctype": "*",
"ext-filter": "*",
"ext-hash": "*",
"php": ">=5.5.0"
},
"require-dev": {
"dealerdirect/phpcodesniffer-composer-installer": "^1.0",
"doctrine/annotations": "^1.2.6 || ^1.13.3",
"php-parallel-lint/php-console-highlighter": "^1.0.0",
"php-parallel-lint/php-parallel-lint": "^1.3.2",
"phpcompatibility/php-compatibility": "^9.3.5",
"roave/security-advisories": "dev-latest",
"squizlabs/php_codesniffer": "^3.7.2",
"yoast/phpunit-polyfills": "^1.0.4"
},
"suggest": {
"decomplexity/SendOauth2": "Adapter for using XOAUTH2 authentication",
"ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses",
"ext-openssl": "Needed for secure SMTP sending and DKIM signing",
"greew/oauth2-azure-provider": "Needed for Microsoft Azure XOAUTH2 authentication",
"hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication",
"league/oauth2-google": "Needed for Google XOAUTH2 authentication",
"psr/log": "For optional PSR-3 debug logging",
"symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)",
"thenetworg/oauth2-azure": "Needed for Microsoft XOAUTH2 authentication"
},
"type": "library",
"autoload": {
"psr-4": {
"PHPMailer\\PHPMailer\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"LGPL-2.1-only"
],
"authors": [
{
"name": "Marcus Bointon",
"email": "phpmailer@synchromedia.co.uk"
},
{
"name": "Jim Jagielski",
"email": "jimjag@gmail.com"
},
{
"name": "Andy Prevost",
"email": "codeworxtech@users.sourceforge.net"
},
{
"name": "Brent R. Matzelle"
}
],
"description": "PHPMailer is a full-featured email creation and transfer class for PHP",
"support": {
"issues": "https://github.com/PHPMailer/PHPMailer/issues",
"source": "https://github.com/PHPMailer/PHPMailer/tree/v6.9.1"
},
"funding": [
{
"url": "https://github.com/Synchro",
"type": "github"
}
],
"time": "2023-11-25T22:23:28+00:00"
},
{ {
"name": "psr/container", "name": "psr/container",
"version": "2.0.2", "version": "2.0.2",

@ -25,7 +25,10 @@ services:
# networks: # networks:
# - internal # - internal
api: api:
image: krisss/docker-webman:8.2-cli-alpine # image: krisss/docker-webman:8.2-cli-alpine
build:
context: .
dockerfile: ./webman/Dockerfile
container_name: "prodio-api" container_name: "prodio-api"
ports: ports:
- "6065:8787" - "6065:8787"
@ -50,6 +53,13 @@ services:
# container_name: "prodio-redis" # container_name: "prodio-redis"
# networks: # networks:
# - internal # - internal
mail:
image: boky/postfix
container_name: "prodio-mail"
environment:
- ALLOWED_SENDER_DOMAINS=prodio.com.tw
- POSTFIX_always_add_missing_headers=yes
- HOSTNAME=mail.prodio.com.tw # set to the hostname of the server
phpmyadmin: phpmyadmin:
image: phpmyadmin/phpmyadmin image: phpmyadmin/phpmyadmin
container_name: "prodio-myadmin" container_name: "prodio-myadmin"

@ -13,10 +13,13 @@ services:
networks: networks:
- internal - internal
api: api:
image: krisss/docker-webman:8.2-cli-alpine # image: krisss/docker-webman:8.2-cli-alpine
build:
context: .
dockerfile: ./webman/Dockerfile
container_name: "prodio-api" container_name: "prodio-api"
ports: ports:
- "6060:8787" - "6065:8787"
volumes: volumes:
- ./app:/app - ./app:/app
networks: networks:
@ -26,8 +29,8 @@ services:
context: . context: .
dockerfile: ./mysql/Dockerfile dockerfile: ./mysql/Dockerfile
container_name: "prodio-mysql" container_name: "prodio-mysql"
ports: # ports:
- "3306:3306" # - "3306:3306"
networks: networks:
- internal - internal
volumes: volumes:
@ -40,6 +43,16 @@ services:
# container_name: "prodio-redis" # container_name: "prodio-redis"
# networks: # networks:
# - internal # - internal
mail:
image: boky/postfix
container_name: "prodio-mail"
environment:
- ALLOW_EMPTY_SENDER_DOMAINS=true
# - ALLOWED_SENDER_DOMAINS=prodio.com.tw
- POSTFIX_always_add_missing_headers=yes
- HOSTNAME=zltest.com.tw # set to the hostname of the server
networks:
- internal
phpmyadmin: phpmyadmin:
image: phpmyadmin/phpmyadmin image: phpmyadmin/phpmyadmin
container_name: "prodio-myadmin" container_name: "prodio-myadmin"

Binary file not shown.

After

Width:  |  Height:  |  Size: 456 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 625 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 446 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 241 KiB

After

Width:  |  Height:  |  Size: 867 KiB

@ -1,5 +1,5 @@
<script setup> <script setup>
import featureImg from '@/assets/img/feature.jpg'; import featureImg from '@/assets/img/iStock.jpg';
const router = useRouter(); const router = useRouter();

@ -3,7 +3,7 @@ import { ref, onMounted, watch } from "vue";
import { useRoute, useRouter } from "vue-router"; import { useRoute, useRouter } from "vue-router";
// import PageBanner from "@/components/PageBanner.vue"; // import PageBanner from "@/components/PageBanner.vue";
import testimonialImg from '@/assets/img/testimonial.jpg'; import testimonialImg from '@/assets/img/contact.jpg';
const route = useRoute(); const route = useRoute();
const router = useRouter(); const router = useRouter();

@ -2,7 +2,7 @@
import { onMounted } from 'vue'; import { onMounted } from 'vue';
import useStore from '@/store'; import useStore from '@/store';
import prodImg from '@/assets/img/noImage.jpg'; import prodImg from '@/assets/img/noImage.jpg';
import featureImg from '@/assets/img/feature.jpg'; import featureImg from '@/assets/img/iStock.jpg';
const { locale } = useI18n() const { locale } = useI18n()
const store = useStore(); const store = useStore();
@ -87,7 +87,7 @@ onMounted(async () => {
<section class="section products"> <section class="section products">
<div class="container"> <div class="container">
<div class="content mb-4"> <div class="content mb-4">
<div class="secTitle mb-4">{{ $t('productandservice') }} <span>Products</span></div> <div class="secTitle mb-4">{{ $t('productandservice') }} </div>
<div class="secDesc"> <div class="secDesc">
{{ config[locale].products }} {{ config[locale].products }}
</div> </div>

@ -4,8 +4,8 @@ import { useRoute, useRouter } from "vue-router";
import PageBanner from "@/components/PageBanner.vue"; import PageBanner from "@/components/PageBanner.vue";
import featureImg from '@/assets/img/feature.jpg'; import featureImg from '@/assets/img/iStock.jpg';
import bannerImg from '@/assets/img/pageBanner/p1.jpg'; import bannerImg from '@/assets/img/news.jpg';
const { t } = useI18n(); const { t } = useI18n();

@ -0,0 +1,8 @@
FROM krisss/docker-webman:8.2-cli-alpine
RUN apk add msmtp
COPY ./webman/msmtprc /etc/msmtprc
RUN ln -sf /usr/bin/msmtp /usr/bin/sendmail
RUN ln -sf /usr/bin/msmtp /usr/sbin/sendmail

@ -0,0 +1,9 @@
defaults
port 25
tls off
account default
auth off
host mail
domain zltest.com.tw
from prodio@zltest.com.tw
Loading…
Cancel
Save