dev
Wayne 2 years ago
parent 3a1c2263b0
commit 57670bb7c7

@ -101,7 +101,8 @@ const handleShowContent = (row) => {
<el-card :body-style="{ padding: '0px' }">
<el-table :data="tableData">
<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="tel" label="聯絡電話" />
<el-table-column prop="create_time" label="留言時間" />

@ -7,18 +7,18 @@ const props = defineProps(['data']);
<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>
{{data.name}}
<template #label><div class="cell-item">公司名稱</div></template>
{{data.company}}
</el-descriptions-item>
<el-descriptions-item min-width="90px" label-align="right">
<template #label><div class="cell-item">聯絡電話</div></template>
{{data.tel}}
<template #label><div class="cell-item">姓名</div></template>
{{data.name}}
</el-descriptions-item>
<el-descriptions-item min-width="90px" label-align="right">
<template #label><div class="cell-item">聯絡地址</div></template>
{{data.address}}
<template #label><div class="cell-item">聯絡電話</div></template>
{{data.tel}}
</el-descriptions-item>
<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')
->where($where)
->where('lang', $param['lang'])
->order('create_time', 'desc')
->page($page, $pageSize)
->select()
@ -27,6 +28,7 @@ class EsgController extends BaseController
$total = Db::name('esg')
->where($where)
->where('lang', $param['lang'])
->count();
foreach($list as $key => $val){
@ -46,6 +48,7 @@ class EsgController extends BaseController
$data = [
'title' => isset($params['title'])?$params['title']:'',
'content' => isset($params['content'])?$params['content']:'',
'lang' => isset($params['lang'])?$params['lang']:'tw',
'create_time' => date('Y-m-d H:i:s',time())
];

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

@ -34,7 +34,11 @@ class ContactController extends BaseController
'content' => $param['content'],
];
$this->sendEmail($data);
try{
Db::name('contact')
->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 think\facade\Db;
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
class IndexController extends BaseController
{
public function getConfig(Request $request)
@ -33,7 +37,6 @@ class IndexController extends BaseController
$list = Db::name('banner')
->where('lang', $param['lang'])
->order('id', 'desc')
->order('sort_order', 'asc')
->select()
->toArray();
@ -78,7 +81,7 @@ class IndexController extends BaseController
foreach ($list as $key => $val) {
switch($param['lang']){
switch ($param['lang']) {
case 'tw':
$list[$key]['name'] = $val['name1'];
break;
@ -131,4 +134,17 @@ class IndexController extends BaseController
}
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]['create_time'] = date('Y-m-d', strtotime($val['create_time']));
unset($result['list'][$key]['image_list']);
}

@ -29,7 +29,8 @@
"monolog/monolog": "^2.0",
"webman/think-orm": "^1.1",
"firebase/php-jwt": "^6.10",
"webman/cors": "^1.0"
"webman/cors": "^1.0",
"phpmailer/phpmailer": "^6.9"
},
"suggest": {
"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",
"This file is @generated automatically"
],
"content-hash": "2cb7928be53ae5b455419ac0578105b4",
"content-hash": "b00a9f2f0908e7e01092dbb62f405d67",
"packages": [
{
"name": "firebase/php-jwt",
@ -221,6 +221,87 @@
},
"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",
"version": "2.0.2",

@ -25,7 +25,10 @@ services:
# networks:
# - internal
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"
ports:
- "6065:8787"
@ -50,6 +53,13 @@ services:
# container_name: "prodio-redis"
# networks:
# - 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:
image: phpmyadmin/phpmyadmin
container_name: "prodio-myadmin"

@ -13,10 +13,13 @@ services:
networks:
- internal
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"
ports:
- "6060:8787"
- "6065:8787"
volumes:
- ./app:/app
networks:
@ -26,8 +29,8 @@ services:
context: .
dockerfile: ./mysql/Dockerfile
container_name: "prodio-mysql"
ports:
- "3306:3306"
# ports:
# - "3306:3306"
networks:
- internal
volumes:
@ -40,6 +43,16 @@ services:
# container_name: "prodio-redis"
# networks:
# - 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:
image: phpmyadmin/phpmyadmin
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>
import featureImg from '@/assets/img/feature.jpg';
import featureImg from '@/assets/img/iStock.jpg';
const router = useRouter();

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

@ -2,7 +2,7 @@
import { onMounted } from 'vue';
import useStore from '@/store';
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 store = useStore();
@ -87,7 +87,7 @@ onMounted(async () => {
<section class="section products">
<div class="container">
<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">
{{ config[locale].products }}
</div>

@ -4,8 +4,8 @@ import { useRoute, useRouter } from "vue-router";
import PageBanner from "@/components/PageBanner.vue";
import featureImg from '@/assets/img/feature.jpg';
import bannerImg from '@/assets/img/pageBanner/p1.jpg';
import featureImg from '@/assets/img/iStock.jpg';
import bannerImg from '@/assets/img/news.jpg';
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